ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggNjQ4NWU1OC4uNjRmYTUxNyAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTIgKzEsMTQgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NjAzMjQgb2YgV2luZSB0aGUgTVMgV2luZG93cyBlbXVsYXRvci4gIFRoaXMgaXMgc3RpbGwgYQorVGhpcyBpcyByZWxlYXNlIDk2MDMzMSBvZiBXaW5lIHRoZSBNUyBXaW5kb3dzIGVtdWxhdG9yLiAgVGhpcyBpcyBzdGlsbCBhCiBkZXZlbG9wZXIncyBvbmx5IHJlbGVhc2UuICBUaGVyZSBhcmUgbWFueSBidWdzIGFuZCBtYW55IHVuaW1wbGVtZW50ZWQgQVBJCiBmZWF0dXJlcy4gIE1vc3QgYXBwbGljYXRpb25zIHN0aWxsIGRvIG5vdCB3b3JrLgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk2MDMyNDogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBNYW55IFdpbjMyIGFuZCBXaW5lbGliIGltcHJvdmVtZW50cy4KK1dIQVQnUyBORVcgd2l0aCBXaW5lLTk2MDMzMTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBNYW55IGltcHJvdmVtZW50cyB0byBrZXlib2FyZCBoYW5kbGluZy4KKwktIE5ldyByZWdpc3RyeSBjb2RlIHdpdGggV2luMzIgc3VwcG9ydC4KKwktIFN1cHBvcnQgZm9yIEl0YWxpYW4gbGFuZ3VhZ2UuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTUsMTAgKzE3LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gICAgc3Vuc2l0ZS51bmMuZWR1Oi9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MDMyNC50YXIuZ3oKLSAgICB0c3gtMTEubWl0LmVkdTovcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjAzMjQudGFyLmd6Ci0gICAgZnRwLmluZm9tYWdpYy5jb206L3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjAzMjQudGFyLmd6Ci0gICAgYXJpcy5jb206L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTYwMzI0LnRhci5negorICAgIHN1bnNpdGUudW5jLmVkdTovcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjAzMzEudGFyLmd6CisgICAgdHN4LTExLm1pdC5lZHU6L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTYwMzMxLnRhci5negorICAgIGZ0cC5pbmZvbWFnaWMuY29tOi9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTYwMzMxLnRhci5negorICAgIGFyaXMuY29tOi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MDMzMS50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggNjg3YzQwMi4uODg2ODU0MzkgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSwxMjQgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N1biBNYXIgMzEgMTM6NTQ6NDYgMTk5NiAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CisKKwkqIFt0b29scy9idWlsZC5jXQorCUNoYW5nZWQgQnVpbGRTcGVjMzJGaWxlcygpIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGluc3RlYWQgb2YgQyBjb2RlLgorCVVuaWZpZWQgLXNwZWMxNiBhbmQgLXNwZWMzMiBvcHRpb25zOyBETEwgdHlwZSBpcyBub3cgZGV0ZXJtaW5lZCBieQorCXRoZSAndHlwZScgZGVjbGFyYXRpb24gaW4gdGhlIC5zcGVjIGZpbGUuCisJTmV3IC1zdGRjYWxsIG9wdGlvbiB0byBidWlsZCBhbGwgc3RkY2FsbCBhc3NlbWJseSByZWxheXMuCisKKwkqIFtpZjE2MzIvcmVsYXkuY10gW2lmMTYzMi9yZWxheTMyLmNdIFtpbmNsdWRlL2RsbHMuaF0KKwlTdGFydGVkIHRvIHVuaWZ5IDE2LSBhbmQgMzItYml0IGJ1aWx0aW4gRExMcy4KKworCSogW2xvYWRlci9tb2R1bGUuY10KKwlBZGRlZCBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MzIoKSB0byBtaXJyb3IgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCkuCisKKwkqIFtsb2FkZXIvcGVfaW1hZ2UuY10gW2xvYWRlci9yZXNvdXJjZS5jXQorCUFsbCBtb2R1bGVzIG5vdyBoYXZlIGEgTkUgc2lnbmF0dXJlLCBhbmQgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgYnkKKwl0aGUgTkVfRkZMQUdTX1dJTjMyIGZsYWcuCisKKwkqIFt3aW5kb3dzL2FsaWFzLmNdCisJQWxpYXNlcyBmb3IgYnVpbHQtaW4gd2luZG93IHByb2NlZHVyZXMgYXJlIG5vdyBhbGwgY3JlYXRlZCBhdAorCXN0YXJ0dXAgaW4gQUxJQVNfSW5pdCgpLgorCitGcmkgTWFyIDI5IDE0OjU2OjM5IDE5OTYgIEdyZWcgS3JlaWRlciA8a3JlaWRlckBuYXRsYWIucmVzZWFyY2gucGhpbGlwcy5jb20+CisKKwkqIFtjb250cm9scy9jb21iby5jXQorCUxpbWl0IHJlY3RhbmdsZSB0byBjbGVhciB0byBzaXplIG9mIGl0ZW0gd2hlbiBwYWludGluZyBjb21ibywgbm90CisgCWRlZmF1bHQuICBPbmx5IGRyYXcgaXRlbXMgaW4gbGlzdCB3aGVuIHRoZXJlIGlzIGVub3VnaCByb29tIGZvciB0aGVtLgorCisJKiBbY29udHJvbHMvbGlzdGJveC5jXQorCUdldCB0aGUgbWVhc3VyZSBvZiBldmVyeSBpdGVtIHRoYXQncyBhZGRlZCBhbmQgc3RvcmUgaW4gdGhlIGl0ZW0ncworIAlkYXRhIHN0cnVjdHVyZS4gIFNjcm9sbCBsaXN0Ym94IGlmIG1vdXNlIG5lYXIgZWRnZSBvZiBib3guICBPbmx5CisgCWRyYXcgaXRlbXMgaW4gbGlzdCB3aGVuIHRoZXJlIGlzIGVub3VnaCByb29tLgorCitGcmkgTWFyIDI5IDEyOjAwOjAwIDE5OTYgIEFsZXggS29yb2JrYSA8YWxleEBwaG0zMC5waGFybS5zdW55c2IuZWR1PgorCisJKiBbd2luZG93cy9kZWZ3bmQuY10gW3dpbmRvd3MvZGlhbG9nLmNdIFt3aW5kb3dzL21kaS5jXQorCSAgW3dpbmRvd3Mvbm9uY2xpZW50LmNdIFtjb250cm9scy9tZW51LmNdIAorCVZhcmlvdXMgY2hhbmdlcyBmb3IgYmV0dGVyIGtleWJvYXJkIGhhbmRsaW5nLiAKKworCSogW3dpbmRvd3MvZXZlbnQuY10gW3dpbmRvd3MvbWVzc2FnZS5jXSBbbWlzYy9rZXlib2FyZC5jXQorCVByb3BlciBrZXlib2FyZCBtZXNzYWdlIG9yZGVyaW5nLCB3b3JraW5nIEdldEtleVN0YXRlKCkgKGZpbmFsbHkhKSwgCisJaW1wcm92ZW1lbnRzIGluIFRvQXNjaWkoKS4KKworCSogW3dpbmRvd3Mvd2luLmNdIFt3aW5kb3dzL21lc3NhZ2UuY10KKwlTbWFsbCBpbXByb3ZlbWVudHMgaW4gV0lOX0ZpbmRXaW5Ub1JlcGFpbnQuCisKKwkqIFt3aW5kb3dzL3dpbi5jXSBbd2luZG93cy9wYWludGluZy5jXSBbd2luZG93cy9ub25jbGllbnQuY10KKwlQdXQgdXBkYXRlIHJlZ2lvbiBpbiBXTV9OQ1BBSU5UIHdQYXJhbS4KKworCSogW2xvYWRlci90YXNrLmNdCisJS2lsbCB0YXNrIHRpbWVycyB3aGVuIHRhc2sgaXMgZGVsZXRlZCwgc3dpdGNoIHRpbWVycyB0byB0aGUKKwluZXcgcXVldWUgaW4gU2V0VGFza1F1ZXVlKCkuCisKKwkqIFtsb2FkZXIvc2lnbmFsLmNdIFttaXNjZW11L2Rvc21lbS5jXQorCUFkZGVkIFNJR0FMUk0gc2lnbmFsIGhhbmRsZXIgdG8gaW5jcmVtZW50IEJJT1MgY2xvY2suIAorCisJKiBbd2luZG93cy93aW4uY10gW3dpbmRvd3Mvd2lucG9zLmNdIFt3aW5kb3dzL21kaS5jXQorCUZpeGVkIENoaWxkV2luZG93RnJvbVBvaW50KCksIFdNX1BBUkVOVE5PVElGWSBhbmQgaXRzIGhhbmRsaW5nIGJ5CisJTURJIGNsaWVudC4KKworCSogW3dpbmRvd3Mvd2lucG9zLmNdCisJSW1wcm92ZW1lbnRzIGluIGhhbmRsaW5nIG9mIG93bmVkIHBvcHVwcy4gIkZsb2F0aW5nIiB0b29sYm94ZXMgCisJd29yayBiZXR0ZXIgbm93LiAKKworVGh1IE1hciAyOCAxMjozODoyOSAxOTk2ICBNYXJjdXMgTWVpc3NuZXIgPG1zbWVpc3NuQGNpcC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKworCSogW21pc2MvcmVnaXN0cnkuY10KKwlOZXcgZmlsZSwgcmVnaXN0cnkgcmV3cml0ZSBpbmNsdWRpbmcgd2luMzIgZXh0ZW5zaW9ucworCS0gVW5pY29kZQorCS0gbXVsdGlwbGUgdmFsdXMgcGVyIGtleQorCS0gZGlmZmVyZW50IGRhdGF0eXBlcyBmb3IgdmFsdWVzCisJLSBtdWx0aXBsZSByb290a2V5cworCS0gc2F2aW5nIGFuZCBsb2FkaW5nIGluIGRpZmZlcmVudCByZWdpc3RyaWVzLgorCisJKiBbaW5jbHVkZS93aW5yZWcuaF0KKwlOZXcgZmlsZSwgZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHMgZm9yIHJlZ2lzdHJ5LgorCisJKiBbaW5jbHVkZS93aW5lcnJvci5oXQorCVNvbWUgbmV3IGVycm9yIGRlZmluZXMgYWRkZWQuLi4gdGhlcmUgYXJlIG1vcmUsIHNvbWVvbmUgcGxlYXNlCisgCWNoZWNrIGEgKHJlYWwtKXdpbmRvd3Mgd2luZXJyb3IuaC4KKwkKKwkqIFtpZjE2MzIvc2hlbGwuc3BlY10gW2lmMTYzMi9hZHZhcGkzMi5zcGVjXSBbaWYxNjMyL2tlcm5lbC5zcGVjXQorCVJlZ2lzdHJ5IHNwZWNzIGFkZGVkLgorCisJKiBbaWYxNjMyL3JlbGF5LmNdCisJU3dpdGNoIGludGVybmFsIFNIRUxMLkRMTCB0byBkZWZhdWx0ICd1c2VkJy4KKworCSogW3dpbjMyL3N0cmluZzMyLmNdIFtpbmNsdWRlL3N0cmluZzMyLmhdCisJU29tZSBuZXcgZnVuY3Rpb25zIGFkZGVkLgorCWNoYXIgc2hvdWxkIGJlIHVuc2lnbmVkIGNoYXIgd2hlbiBjb252ZXJ0aW5nIHRvIDE2Yml0IGludHMuCisKKwkqIFttaXNjL3NoZWxsLmNdIFtpbmNsdWRlL3NoZWxsLmhdIFt3aW4zMi9hZHZhcGkuY10KKwlSZW1vdmVkIG9sZCByZWdpc3RyeSBmdW5jdGlvbnMuCisKK1R1ZSBNYXIgMjYgMTU6MDE6NDYgMTk5NiAgRnJhbnMgdmFuIERvcnNzZWxhZXIgPGRvcnNzZWxAcnVsaG0xLmxlaWRlbnVuaXYubmw+CisKKwkqIFtpbmNsdWRlL2JpdG1hcHMvb2NyX2liZWFtXQorCUZpeGVkIHRoZSBwb3NpdGlvbiBvZiB0aGUgaG90c3BvdC4KKworCSogW29iamVjdHMvdGV4dC5jXQorCUZpeGVkIGEgZmV3IGJ1Z3MgaW4gVEVYVF9UYWJiZWRUZXh0T3V0KCkuCisKKwkqIFt3aW5kb3dzL2V2ZW50LmNdCisJRml4ZWQgdGhlIG9yZGVyIG9mIHRoZSBiaXRzIGluIHRoZSBLZXlTdGF0ZVRhYmxlLgorCTB4ODAgaXMgdGhlIHVwL2Rvd24tYml0LiAgMHgwMSBpcyB0aGUgdG9nZ2xlIGJpdC4KKworCSogW2xvYWRlci9yZXNvdXJjZS5jXSBbd2luZG93cy9tZGkuY10gW2NvbnRyb2xzL2VkaXQuY10KKwlGaXhlZCB0aGUgY2FsbHMgdG8gR2V0S2V5U3RhdGUoKS4KKworVHVlIE1hciAyNiAwODo0MzoxNSAxOTk2ICBSb2JlcnQgUG91bGlvdCA8a3J5bm9zQHFiYy5jbGljLm5ldD4KKworCSogW3Jlc291cmNlcy9zeXNyZXNfRnIucmNdIFtyZXNvdXJjZXMvVE9ET10KKwlVcGRhdGVkIEZJTkRfVEVYVCBhbmQgUkVQTEFDRV9URVhUIHRvIHdvcmsgbGlrZSB0aGUgRW5nbGlzaCB2ZXJzaW9uLgorCitNb24gTWFyIDI1IDE3OjM4OjU5IDE5OTYgIFRyaXN0YW4gVGFycmFudCA8dHN0QGRjcy5lZC5hYy51az4KKworCSogW3Jlc291cmNlcy9zeXNyZXNfaXQucmNdCisJQWRkZWQgc3VwcG9ydCBmb3IgSXRhbGlhbiBbSXRdIGxhbmd1YWdlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTdW4gTWFyIDI0IDEzOjEzOjExIDE5OTYgIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgogCiAJKiBbaW5jbHVkZS93aW4uaF0gW3dpbmRvd3MvKi5jXQpkaWZmIC0tZ2l0IGEvTWFrZS5ydWxlcy5pbiBiL01ha2UucnVsZXMuaW4KaW5kZXggM2FlMWQwNS4uYjA3YjEzMSAxMDA2NDQKLS0tIGEvTWFrZS5ydWxlcy5pbgorKysgYi9NYWtlLnJ1bGVzLmluCkBAIC0xNiw3ICsxNiw3IEBACiBMRVggICAgICAgPSBATEVYQAogTEVYTElCICAgID0gQExFWExJQkAKIERJVklOQ0wgICA9IC1JJChUT1BTUkMpL2luY2x1ZGUKLUFMTENGTEFHUyA9ICQoQ0ZMQUdTKSAkKERFRlMpICQoWF9DRkxBR1MpICQoRElWSU5DTCkgJChFWFRSQV9ERUZTKQorQUxMQ0ZMQUdTID0gJChDRkxBR1MpICQoREVGUykgJChESVZJTkNMKSAkKFhfQ0ZMQUdTKSAkKEVYVFJBX0RFRlMpCiBMRENPTUJJTkUgPSBsZCAtcgogUk0gICAgICAgID0gcm0gLWYKIEJVSUxEICAgICA9ICQoVE9QU1JDKS90b29scy9idWlsZApkaWZmIC0tZ2l0IGEvY29udHJvbHMvY29tYm8uYyBiL2NvbnRyb2xzL2NvbWJvLmMKaW5kZXggZjYzN2IwZi4uOGFjNzgwZiAxMDA2NDQKLS0tIGEvY29udHJvbHMvY29tYm8uYworKysgYi9jb250cm9scy9jb21iby5jCkBAIC0yMzUsMjEgKzIzNSwxNyBAQAogCiAgIEdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOwogICByZWN0LnJpZ2h0IC09IChscGhjLT5SZWN0QnV0dG9uLnJpZ2h0IC0gbHBoYy0+UmVjdEJ1dHRvbi5sZWZ0KTsKLSAgRmlsbFJlY3QoaGRjLCAmcmVjdCwgaEJydXNoKTsKIAogICBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCxscGhsLT5JdGVtRm9jdXNlZCk7CiAgIGlmIChscGxzICE9IE5VTEwpIHsgIAogICAgIGhlaWdodCA9IGxwbHMtPm1pcy5pdGVtSGVpZ2h0OwogICAgIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBoZWlnaHQ7Ci0KLSAgICBpZiAobHBobC0+T3duZXJEcmF3bikgewotICAgICAgTGlzdEJveERyYXdJdGVtIChod25kLCBscGhsLCBoZGMsIGxwbHMsICZyZWN0LCBPREFfRFJBV0VOVElSRSwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExpc3RCb3hEcmF3SXRlbSAoaHduZCwgbHBobCwgaGRjLCBscGxzLCAmcmVjdCwgT0RBX0RSQVdFTlRJUkUsIDApOwotICAgIH0KKyAgICBGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworICAgIExpc3RCb3hEcmF3SXRlbSAoaHduZCwgbHBobCwgaGRjLCBscGxzLCAmcmVjdCwgT0RBX0RSQVdFTlRJUkUsIDApOwogICAgIGlmIChHZXRGb2N1cygpID09IGh3bmQpCiAgICAgTGlzdEJveERyYXdJdGVtIChod25kLGxwaGwsIGhkYywgbHBscywgJnJlY3QsIE9EQV9GT0NVUywgT0RTX0ZPQ1VTKTsKICAgfQorICBlbHNlIEZpbGxSZWN0KGhkYywgJnJlY3QsIGhCcnVzaCk7CiAgIFNlbGVjdE9iamVjdChoZGMsaE9sZEZvbnQpOwogICBFbmRQYWludChod25kLCAmcHMpOwogICByZXR1cm4gMDsKQEAgLTc3NCw4ICs3NzAsOSBAQAogCiAgICAgaWYgKGkgPj0gbHBobC0+Rmlyc3RWaXNpYmxlKSB7CiAgICAgICBoZWlnaHQgPSBscGxzLT5taXMuaXRlbUhlaWdodDsKKyAgICAgIC8qIG11c3QgaGF2ZSBlbm91Z2ggcm9vbSB0byBkcmF3IGVudGlyZSBpdGVtICovCisgICAgICBpZiAodG9wID4gKHJlY3QuYm90dG9tLWhlaWdodCsxKSkgYnJlYWs7CiAKLSAgICAgIGlmICh0b3AgPiByZWN0LmJvdHRvbSkgYnJlYWs7CiAgICAgICBscGxzLT5pdGVtUmVjdC50b3AgICAgPSB0b3A7CiAgICAgICBscGxzLT5pdGVtUmVjdC5ib3R0b20gPSB0b3AgKyBoZWlnaHQ7CiAgICAgICBscGxzLT5pdGVtUmVjdC5sZWZ0ICAgPSByZWN0LmxlZnQ7CmRpZmYgLS1naXQgYS9jb250cm9scy9lZGl0LmMgYi9jb250cm9scy9lZGl0LmMKaW5kZXggNDUzN2MwMi4uNmIxMTU0YyAxMDA2NDQKLS0tIGEvY29udHJvbHMvZWRpdC5jCisrKyBiL2NvbnRyb2xzL2VkaXQuYwpAQCAtMjc5OCwxMiArMjc5OCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvKiBGSVhNRTogR2V0S2V5U3RhdGUgYXBwZWFycyB0byBoYXZlIGl0cyBiaXRzIHJldmVyc2VkICovCi0jaWYgQ29ycmVjdEdldEtleVN0YXRlCiAgICAgaWYobW90aW9uS2V5ICYmICgweDgwICYgR2V0S2V5U3RhdGUoVktfU0hJRlQpKSkgewotI2Vsc2UKLSAgICBpZihtb3Rpb25LZXkgJiYgKDB4MDEgJiBHZXRLZXlTdGF0ZShWS19TSElGVCkpKSB7Ci0jZW5kaWYKICAgICAgICAgRURJVF9FeHRlbmRTZWwoaHduZCwgZXMtPlduZENvbCwgZXMtPlduZFJvdyplcy0+dHh0aHQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEVESVRfU2V0QW5jaG9yKGh3bmQsIGVzLT5DdXJyTGluZSwgZXMtPkN1cnJDb2wpOwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbGlzdGJveC5jIGIvY29udHJvbHMvbGlzdGJveC5jCmluZGV4IDZiYmE5MGYuLjIxZjY2YjQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2xpc3Rib3guYworKysgYi9jb250cm9scy9saXN0Ym94LmMKQEAgLTYzLDYgKzYzLDkgQEAKIAogI2RlZmluZSBMSVNUX0hFQVBfU0laRSAweDEwMDAwCiAKKyNkZWZpbmUgTEJNTV9FREdFICAgNCAgICAvKiBkaXN0YW5jZSBpbnNpZGUgYm94IHdoaWNoIGlzIHNhbWUgYXMgbW92aW5nIG1vdXNlCisJCQkgICAgb3V0c2lkZSBib3gsIHRvIHRyaWdnZXIgc2Nyb2xsaW5nIG9mIExCICovCisKIHN0YXRpYyB2b2lkIExpc3RCb3hJbml0aWFsaXplKExQSEVBRExJU1QgbHBobCkKIHsKICAgbHBobC0+bHBGaXJzdCAgICAgICAgPSBOVUxMOwpAQCAtMzI2LDcgKzMyOSw3IEBACiAKICAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXRklYRUQpIHsKICAgICBscGhsLT5TdGRJdGVtSGVpZ2h0ID0gbHBtZWFzdXJlLT5pdGVtSGVpZ2h0OwotICAgIGxwaGwtPm5lZWRNZWFzdXJlID0gRkFMU0U7CisgICAgbHBscy0+bWlzLml0ZW1IZWlnaHQgPSBscG1lYXN1cmUtPml0ZW1IZWlnaHQ7CiAgIH0KIAogICBVU0VSX0hFQVBfRlJFRShoVGVtcCk7CQkJCkBAIC0xMDM2LDcgKzEwMzksNyBAQAogICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMQk1vdXNlTW92ZSAlZCAlZFxuIixTTE9XT1JEKGxQYXJhbSksU0hJV09SRChsUGFyYW0pKTsKICAgaWYgKCh3UGFyYW0gJiBNS19MQlVUVE9OKSAhPSAwKSB7CiAgICAgeSA9IFNISVdPUkQobFBhcmFtKTsKLSAgICBpZiAoeSA8IDApIHsKKyAgICBpZiAoeSA8IExCTU1fRURHRSkgewogICAgICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IDApIHsKIAlscGhsLT5GaXJzdFZpc2libGUtLTsKIAlTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKQEAgLTEwNDUsMTUgKzEwNDgsMTUgQEAKICAgICAgIH0KICAgICB9CiAgICAgR2V0Q2xpZW50UmVjdChod25kLCAmcmVjdCk7Ci0gICAgaWYgKHkgPj0gcmVjdC5ib3R0b20pIHsKKyAgICBpZiAoeSA+PSAocmVjdC5ib3R0b20tTEJNTV9FREdFKSkgewogICAgICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA8IExpc3RNYXhGaXJzdFZpc2libGUobHBobCkpIHsKIAlscGhsLT5GaXJzdFZpc2libGUrKzsKIAlTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKIAlJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKIAlyZXR1cm4gMDsKICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCh5ID4gMCkgJiYgKHkgPCAocmVjdC5ib3R0b20gLSA0KSkpIHsKKyAgICAgIH0KKyAgICBpZiAoKHkgPiAwKSAmJiAoeSA8IChyZWN0LmJvdHRvbSAtIExCTU1fRURHRSkpKSB7CiAgICAgICBpZiAoKHkgPCByZWN0c2VsLnRvcCkgfHwgKHkgPiByZWN0c2VsLmJvdHRvbSkpIHsKICAgICAgICAgaVJldCA9IExpc3RCb3hGaW5kTW91c2UobHBobCwgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pKTsKICAgICAgICAgaWYgKGlSZXQgPT0gbHBobC0+SXRlbUZvY3VzZWQgfHwgaVJldCA9PSAtMSkgIHsKQEAgLTEwODgsNyArMTA5MSw3IEBACiAgIH0KIAogICByZXR1cm4gMDsKLX0KKyAgfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQktleURvd24KQEAgLTEyODEsNyArMTI4NCw3IEBACiAgICAgICBURVhUTUVUUklDIHRtOwogICAgICAgR2V0VGV4dE1ldHJpY3MoIGhkYywgJnRtICk7CiAgICAgICBscGhsLT5TdGRJdGVtSGVpZ2h0ID0gdG0udG1IZWlnaHQ7Ci0gICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMQlNldEZvbnQ6ICBuZXcgZm9udCAlZCB3aXRoIGhlaWdodCAlZCIsCisgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMQlNldEZvbnQ6ICBuZXcgZm9udCAlZCB3aXRoIGhlaWdodCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBscGhsLT5oRm9udCwgbHBobC0+U3RkSXRlbUhlaWdodCk7CiAgICAgICBSZWxlYXNlREMoIDAsIGhkYyApOwogICB9CkBAIC0xMzQ1LDcgKzEzNDgsNyBAQAogICAgIGlmIChpID49IGxwaGwtPkZpcnN0VmlzaWJsZSkgewogICAgICAgaGVpZ2h0ID0gbHBscy0+bWlzLml0ZW1IZWlnaHQ7CiAKLSAgICAgIGlmICh0b3AgPiByZWN0LmJvdHRvbSkgeworICAgICAgaWYgKHRvcCA+IChyZWN0LmJvdHRvbS1oZWlnaHQrMSkpIHsKIAlpZiAobHBobC0+ZHdTdHlsZSAmIExCU19NVUxUSUNPTFVNTikgewogCSAgbHBobC0+SXRlbXNQZXJDb2x1bW4gPSBNQVgobHBobC0+SXRlbXNQZXJDb2x1bW4sIGlwYyk7CiAJICBpcGMgPSAwOwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbWVudS5jIGIvY29udHJvbHMvbWVudS5jCmluZGV4IDA0NTdjMTEuLjMzZTU4YjMgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL21lbnUuYworKysgYi9jb250cm9scy9tZW51LmMKQEAgLTE4LDExICsxOCwxMSBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKKyNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJtZW51LmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAibmVleGUuaCIKICNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAibWVzc2FnZS5oIgogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKQEAgLTIzOSw2ICsyMzksOSBAQAogICAgIGludCBpOwogICAgIExPTkcgbWVudWNoYXI7CiAKKyAgICBpZiAoIUlzTWVudSggaG1lbnUgKSkgaG1lbnUgPSBHZXRTeXN0ZW1NZW51KCBod25kT3duZXIsIEZBTFNFKTsKKyAgICBpZiAoIWhtZW51KSByZXR1cm4gLTE7CisKICAgICBtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICk7CiAgICAgbHBpdGVtID0gKE1FTlVJVEVNICopIFVTRVJfSEVBUF9MSU5fQUREUiggbWVudS0+aEl0ZW1zICk7CiAgICAga2V5ID0gdG91cHBlcihrZXkpOwpAQCAtMTYyNCwxOSArMTYyNyw2MyBAQAogICoKICAqIE1lbnUtYmFyIHRyYWNraW5nIHVwb24gYSBrZXlib2FyZCBldmVudC4gQ2FsbGVkIGZyb20gTkNfSGFuZGxlU3lzQ29tbWFuZCgpLgogICovCi12b2lkIE1FTlVfVHJhY2tLYmRNZW51QmFyKCBIV05EIGh3bmQsIFVJTlQgd1BhcmFtICkKK3ZvaWQgTUVOVV9UcmFja0tiZE1lbnVCYXIoIFdORCogd25kUHRyLCBVSU5UIHdQYXJhbSwgSU5UIHZrZXkpCiB7Ci0gICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotICAgIGlmICghd25kUHRyLT53SURtZW51KSByZXR1cm47CisgICAgVUlOVCB1SXRlbSA9IE5PX1NFTEVDVEVEX0lURU07CisgICBITUVOVSBoVHJhY2tNZW51OyAKKworICAgIC8qIGZpbmQgd2luZG93IHRoYXQgaGFzIGEgbWVudSAKKyAgICAgKi8KKyAKKyAgICBpZiggISh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkgKQorICAgICAgeworCSAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIEdldEFjdGl2ZVdpbmRvdygpICk7CisgICAgICAgICAgaWYoICF3bmRQdHIgKSByZXR1cm47CisgICAgICB9CisgICAgZWxzZQorICAgICAgd2hpbGUoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEICYmIAorICAgICAgICAgICAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUpICkKKyAgICAgICAgICAgaWYoICEod25kUHRyID0gd25kUHRyLT5wYXJlbnQpICkgcmV0dXJuOworICAgICAgICAgIAorICAgIGlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCB8fCAhd25kUHRyLT53SURtZW51ICkKKyAgICAgIGlmKCAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUpICkKKwlyZXR1cm47CisKKyAgICBoVHJhY2tNZW51ID0gKCBJc01lbnUoIHduZFB0ci0+d0lEbWVudSApICk/IHduZFB0ci0+d0lEbWVudToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHduZFB0ci0+aFN5c01lbnU7CisKICAgICBIaWRlQ2FyZXQoMCk7Ci0gICAgU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX0VOVEVSTUVOVUxPT1AsIDAsIDAgKTsKLSAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fSU5JVE1FTlUsIHduZFB0ci0+d0lEbWVudSwgMCApOwotICAgICAgLyogU2VsZWN0IGZpcnN0IHNlbGVjdGFibGUgaXRlbSAqLwotICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZCwgKEhNRU5VKXduZFB0ci0+d0lEbWVudSwgTk9fU0VMRUNURURfSVRFTSApOwotICAgIE1FTlVfU2VsZWN0TmV4dEl0ZW0oIGh3bmQsIChITUVOVSl3bmRQdHItPndJRG1lbnUgKTsKLSAgICBNRU5VX1RyYWNrTWVudSggKEhNRU5VKXduZFB0ci0+d0lEbWVudSwgVFBNX0xFRlRBTElHTiB8IFRQTV9MRUZUQlVUVE9OLAotCQkgICAgMCwgMCwgaHduZCwgTlVMTCApOwotICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9FWElUTUVOVUxPT1AsIDAsIDAgKTsKKyAgICBTZW5kTWVzc2FnZSggd25kUHRyLT5od25kU2VsZiwgV01fRU5URVJNRU5VTE9PUCwgMCwgMCApOworICAgIFNlbmRNZXNzYWdlKCB3bmRQdHItPmh3bmRTZWxmLCBXTV9JTklUTUVOVSwgd25kUHRyLT53SURtZW51LCAwICk7CisKKyAgICAvKiBmaW5kIHN1aXRhYmxlIG1lbnUgZW50cnkgCisgICAgICovCisKKyAgICBpZiggdmtleSA9PSBWS19TUEFDRSApCisgICAgICAgIHVJdGVtID0gU1lTTUVOVV9TRUxFQ1RFRDsKKyAgICBlbHNlIGlmKCB2a2V5ICkKKyAgICAgIHsKKyAgICAgICAgdUl0ZW0gPSBNRU5VX0ZpbmRJdGVtQnlLZXkoIHduZFB0ci0+aHduZFNlbGYsIHduZFB0ci0+d0lEbWVudSwgdmtleSApOworCWlmKCB1SXRlbSA+PSAweEZGRkUgKQorCSAgeworCSAgICBpZiggdUl0ZW0gPT0gMHhGRkZGICkgCisgICAgICAgICAgICAgICAgTWVzc2FnZUJlZXAoMCk7CisJICAgIFNlbmRNZXNzYWdlKCB3bmRQdHItPmh3bmRTZWxmLCBXTV9FWElUTUVOVUxPT1AsIDAsIDAgKTsKKyAgICAgICAgICAgIFNob3dDYXJldCgwKTsKKwkgICAgcmV0dXJuOworCSAgfQorICAgICAgfQorCisgICAgTUVOVV9TZWxlY3RJdGVtKCB3bmRQdHItPmh3bmRTZWxmLCBoVHJhY2tNZW51LCB1SXRlbSApOworICAgIGlmKCB1SXRlbSA9PSBOT19TRUxFQ1RFRF9JVEVNICkKKyAgICAgIE1FTlVfU2VsZWN0TmV4dEl0ZW0oIHduZFB0ci0+aHduZFNlbGYsIGhUcmFja01lbnUgKTsKKyAgICBlbHNlCisgICAgICBQb3N0TWVzc2FnZSggd25kUHRyLT5od25kU2VsZiwgV01fS0VZRE9XTiwgVktfRE9XTiwgMEwgKTsKKworICAgIE1FTlVfVHJhY2tNZW51KCBoVHJhY2tNZW51LCBUUE1fTEVGVEFMSUdOIHwgVFBNX0xFRlRCVVRUT04sCisJCSAgICAwLCAwLCB3bmRQdHItPmh3bmRTZWxmLCBOVUxMICk7CisKKyAgICBTZW5kTWVzc2FnZSggd25kUHRyLT5od25kU2VsZiwgV01fRVhJVE1FTlVMT09QLCAwLCAwICk7CiAgICAgU2hvd0NhcmV0KDApOwogfQogCkBAIC0yMjY1LDE0ICsyMzEyLDEzIEBACiAgICAgICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCJMb2FkTWVudSglMDR4LCUwNHgpXG4iLGluc3RhbmNlLExPV09SRChuYW1lKSk7CiAKICAgICBpZiAoIW5hbWUpIHJldHVybiAwOworICAgIAorICAgIC8qIGNoZWNrIGZvciBXaW4zMiBtb2R1bGUgKi8KKyAgICBpbnN0YW5jZSA9IEdldEV4ZVB0ciggaW5zdGFuY2UgKTsKKyAgICBpZigoKE5FX01PRFVMRSopR2xvYmFsTG9jayhpbnN0YW5jZSkpLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKKyAgICAgICAgcmV0dXJuIFdJTjMyX0xvYWRNZW51QShpbnN0YW5jZSxQVFJfU0VHX1RPX0xJTihuYW1lKSk7CiAKLSAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZSggaW5zdGFuY2UsIG5hbWUsIFJUX01FTlUgKSkpIHsKLQkJLyogY2hlY2sgZm9yIFdpbjMyIG1vZHVsZSAqLwotCQlpbnN0YW5jZSA9ICBHZXRFeGVQdHIoIGluc3RhbmNlICk7Ci0JCWlmKCgoTkVfTU9EVUxFKilHbG9iYWxMb2NrKGluc3RhbmNlKSktPm1hZ2ljID09IFBFX1NJR05BVFVSRSkKLQkJCXJldHVybiBXSU4zMl9Mb2FkTWVudUEoaW5zdGFuY2UsUFRSX1NFR19UT19MSU4obmFtZSkpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UoIGluc3RhbmNlLCBuYW1lLCBSVF9NRU5VICkpKSByZXR1cm4gMDsKICAgICBpZiAoIShoYW5kbGUgPSBMb2FkUmVzb3VyY2UoIGluc3RhbmNlLCBoUnNyYyApKSkgcmV0dXJuIDA7CiAgICAgaE1lbnUgPSBMb2FkTWVudUluZGlyZWN0KCBXSU4xNl9Mb2NrUmVzb3VyY2UoaGFuZGxlKSApOwogICAgIEZyZWVSZXNvdXJjZSggaGFuZGxlICk7CmRpZmYgLS1naXQgYS9jb250cm9scy93aWRnZXRzLmMgYi9jb250cm9scy93aWRnZXRzLmMKaW5kZXggNGFlMzllMy4uZTU0MTgzNSAxMDA2NDQKLS0tIGEvY29udHJvbHMvd2lkZ2V0cy5jCisrKyBiL2NvbnRyb2xzL3dpZGdldHMuYwpAQCAtMTIsMTAgKzEyLDggQEAKICNpbmNsdWRlICJtZGkuaCIKICNpbmNsdWRlICJnZGkuaCIKICNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAic2VsZWN0b3JzLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgotI2luY2x1ZGUgImFsaWFzLmgiCi0jaW5jbHVkZSAicmVsYXkzMi5oIgogCiBzdGF0aWMgV05EQ0xBU1MgV0lER0VUU19CdWlsdGluQ2xhc3Nlc1tdID0KIHsKQEAgLTY3LDIxICs2NSwxMCBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IE5CX0JVSUxUSU5fQ0xBU1NFUzsgaSsrLCBjbGFzcysrKQogICAgIHsKLSAgICAgICAgRFdPUkQgV2luZVByb2MsV2luMTZQcm9jLFdpbjMyUHJvYzsKLQkJV0lOMzJfYnVpbHRpbiAqZGxsOwotICAgICAgICAvKiBjdXJyZW50bHksIHRoZXJlIGlzIG5vIHdheSB0byBnZXQgdGhlICdyZWFsJyBwb2ludGVyIGF0IHJ1biB0aW1lICovCi0gICAgICAgIFdpbmVQcm9jPTA7Ci0gICAgICAgIFdpbjE2UHJvYyA9IChEV09SRClHZXRXbmRQcm9jRW50cnkxNiggKGNoYXIgKiljbGFzcy0+bHBmblduZFByb2MgKTsKLQkJZGxsID0gUkVMQVkzMl9HZXRCdWlsdGluRExMKCJXSU5QUk9DUzMyIik7Ci0gICAgICAgIFdpbjMyUHJvYyA9IChEV09SRClSRUxBWTMyX0dldEVudHJ5UG9pbnQoCi0JCQlkbGwsKGNoYXIgKiljbGFzcy0+bHBmblduZFByb2MsIDApOwotICAgICAgICAvKiBSZWdpc3RlciB0aGUgYWxpYXMgc28gd2UgZG9uJ3QgcGFzcyBXaW4xNiBwb2ludGVycyB0byBXaW4zMiBhcHBzICovCi0gICAgICAgIEFMSUFTX1JlZ2lzdGVyQWxpYXMoV2luZVByb2MsV2luMTZQcm9jLFdpbjMyUHJvYyk7Ci0KICAgICAgICAgc3RyY3B5KCBuYW1lLCAoY2hhciAqKWNsYXNzLT5scHN6Q2xhc3NOYW1lICk7CiAgICAgICAgIGNsYXNzLT5scHN6Q2xhc3NOYW1lID0gTUFLRV9TRUdQVFIobmFtZSk7CiAgICAgICAgIGNsYXNzLT5oQ3Vyc29yID0gTG9hZEN1cnNvciggMCwgSURDX0FSUk9XICk7Ci0gICAgICAgIGNsYXNzLT5scGZuV25kUHJvYyA9IEdldFduZFByb2NFbnRyeTE2KCAoY2hhciAqKWNsYXNzLT5scGZuV25kUHJvYyApOworICAgICAgICBjbGFzcy0+bHBmblduZFByb2MgPSBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoIChjaGFyICopY2xhc3MtPmxwZm5XbmRQcm9jICk7CiAgICAgICAgIGlmICghUmVnaXN0ZXJDbGFzcyggY2xhc3MgKSkgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKZGlmZiAtLWdpdCBhL2lmMTYzMi9NYWtlZmlsZS5pbiBiL2lmMTYzMi9NYWtlZmlsZS5pbgppbmRleCBmODk2ZGE4Li4zMTFmY2FiIDEwMDY0NAotLS0gYS9pZjE2MzIvTWFrZWZpbGUuaW4KKysrIGIvaWYxNjMyL01ha2VmaWxlLmluCkBAIC0yLDEyICsyLDE3IEBACiAKIE1PRFVMRSA9IGlmMTYzMgogCi1ETExTMTYJPSBcCitETExTCT0gXAorCWFkdmFwaTMyLnNwZWMgXAorCWNvbWN0bDMyLnNwZWMgXAorCWNvbWRsZzMyLnNwZWMgXAogCWNvbW1kbGcuc3BlYyBcCiAJY29tcG9iai5zcGVjIFwKIAlkZGVtbC5zcGVjIFwKIAlnZGkuc3BlYyBcCisJZ2RpMzIuc3BlYyBcCiAJa2VybmVsLnNwZWMgXAorCWtlcm5lbDMyLnNwZWMgXAogCWtleWJvYXJkLnNwZWMgXAogCWx6ZXhwYW5kLnNwZWMgXAogCW1tc3lzdGVtLnNwZWMgXApAQCAtMTcsNTEgKzIyLDQ5IEBACiAJb2xlMmRpc3Auc3BlYyBcCiAJb2xlMm5scy5zcGVjIFwKIAlvbGUycHJveC5zcGVjIFwKKwlvbGUzMi5zcGVjIFwKIAlvbGVjbGkuc3BlYyBcCiAJb2xlc3ZyLnNwZWMgXAogCXNoZWxsLnNwZWMgXAorCXNoZWxsMzIuc3BlYyBcCiAJc291bmQuc3BlYyBcCiAJc3RvcmFnZS5zcGVjIFwKIAlzdHJlc3Muc3BlYyBcCiAJc3lzdGVtLnNwZWMgXAogCXRvb2xoZWxwLnNwZWMgXAogCXVzZXIuc3BlYyBcCisJdXNlcjMyLnNwZWMgXAogCXdpbjg3ZW0uc3BlYyBcCiAJd2lucHJvY3Muc3BlYyBcCi0Jd2luc29jay5zcGVjCisJd2lucHJvY3MzMi5zcGVjIFwKKwl3aW5zb2NrLnNwZWMgXAorCXdpbnNwb29sLnNwZWMKIAotRExMUzMyCT0gYWR2YXBpMzIuc3BlYyBjb21jdGwzMi5zcGVjIGNvbWRsZzMyLnNwZWMgZ2RpMzIuc3BlYyBrZXJuZWwzMi5zcGVjIFwKLQlvbGUzMi5zcGVjIHNoZWxsMzIuc3BlYyB1c2VyMzIuc3BlYyB3aW5wcm9jczMyLnNwZWMgd2luc3Bvb2wuc3BlYwotCi1TUEVDMTZfRklMRVMgPSAkKERMTFMxNjouc3BlYz0uUykKLVNQRUMzMl9GSUxFUyA9ICQoRExMUzMyOi5zcGVjPS5jKQorU1BFQ19GSUxFUyA9ICQoRExMUzouc3BlYz0uUykKIAogQ19TUkNTID0gXAotCSQoU1BFQzMyX0ZJTEVTKSBcCiAJY2FsbGJhY2suYyBcCiAJZHVtbXkuYyBcCiAJcmVsYXkuYyBcCiAJcmVsYXkzMi5jCiAKIEFTTV9TUkNTID0gXAotCSQoU1BFQzE2X0ZJTEVTKSBcCisJJChTUEVDX0ZJTEVTKSBcCiAJY2FsbDE2LlMgXAogCWNhbGwzMi5TIFwKLQlleGNlcHQuUworCWV4Y2VwdC5TIFwKKwlzdGRjYWxsLlMKIAogLlNVRkZJWEVTOiAuc3BlYwogCiAuc3BlYy5TOgotCSQoQlVJTEQpIC1zcGVjMTYgJDwgPiAkKi5TCi0KLS5zcGVjLmM6Ci0JJChCVUlMRCkgLXNwZWMzMiAkPCA+ICQqLmMKKwkkKEJVSUxEKSAtc3BlYyAkPCA+ICQqLlMKIAogYWxsOiBjaGVja2J1aWxkICQoTU9EVUxFKS5vCiAKIEBNQUtFX1JVTEVTQAogCi0kKFNQRUMxNl9GSUxFUykgJChTUEVDMzJfRklMRVMpOiAkKEJVSUxEKQorJChTUEVDX0ZJTEVTKTogJChCVUlMRCkKIAogJChCVUlMRCkgY2hlY2tidWlsZDoKIAljZCAkKFRPUFNSQykvdG9vbHM7ICQoU1VCTUFLRSkgYnVpbGQKQEAgLTY5LDI2ICs3MiwxMyBAQAogY2FsbDE2LlM6ICQoVE9QU1JDKS9pbmNsdWRlL2NhbGxiYWNrLmggJChCVUlMRCkKIAkkKEJVSUxEKSAtY2FsbDE2IGBjYXQgJChUT1BTUkMpL2luY2x1ZGUvY2FsbGJhY2suaCB8IGdyZXAgImV4dGVybi4qQ2FsbFRvMTZfIiB8IHNlZCAncy8uKkNhbGxUbzE2X1woLipcKSguKi9cMS8nIHwgc29ydCB8IHVuaXFgID4gY2FsbDE2LlMKIAotY2FsbDMyLlM6ICQoU1BFQzE2X0ZJTEVTKQotCSQoQlVJTEQpIC1jYWxsMzIgYGNhdCAkKFNQRUMxNl9GSUxFUykgfCBncmVwIENhbGxUbzMyXyB8IHNlZCAncy8uKkNhbGxUbzMyX1woLipcKS9cMS8nIHwgc29ydCB8IHVuaXFgID4gY2FsbDMyLlMKK2NhbGwzMi5TOiAkKFNQRUNfRklMRVMpCisJJChCVUlMRCkgLWNhbGwzMiBgY2F0ICQoU1BFQ19GSUxFUykgfCBncmVwIENhbGxUbzMyXyB8IHNlZCAncy8uKkNhbGxUbzMyX1woLipcKS9cMS8nIHwgc29ydCB8IHVuaXFgID4gY2FsbDMyLlMKKworc3RkY2FsbC5TOiAkKFNQRUNfRklMRVMpCisJJChCVUlMRCkgLXN0ZGNhbGwgYGNhdCAkKFNQRUNfRklMRVMpIHwgZ3JlcCBTdGRjYWxsXyB8IHNlZCAncy8uKlN0ZGNhbGxfXChbMC05XSpcKS9cMS8nIHwgc29ydCB8IHVuaXFgID4gc3RkY2FsbC5TCiAKIGNsZWFuOjoKLQlybSAtZiAkKFNQRUMxNl9GSUxFUykgJChTUEVDMzJfRklMRVMpIGNhbGwzMi5TIGNhbGwxNi5TCi0KLSMgS2x1ZGdlOiBkb24ndCB1c2Ugb3B0aW1pc2F0aW9uIGZsYWdzIHRvIGNvbXBpbGUgdGhlc2UgZmlsZXMKLWFkdmFwaTMyLm86IGFkdmFwaTMyLmMKLQkkKENDKSAtYyAtZyAkKERFRlMpICQoRElWSU5DTCkgJChFWFRSQV9ERUZTKSAtbyBhZHZhcGkzMi5vIGFkdmFwaTMyLmMKLWNvbWRsZzMyLm86IGNvbWRsZzMyLmMKLQkkKENDKSAtYyAtZyAkKERFRlMpICQoRElWSU5DTCkgJChFWFRSQV9ERUZTKSAtbyBjb21kbGczMi5vIGNvbWRsZzMyLmMKLWdkaTMyLm86IGdkaTMyLmMKLQkkKENDKSAtYyAtZyAkKERFRlMpICQoRElWSU5DTCkgJChFWFRSQV9ERUZTKSAtbyBnZGkzMi5vIGdkaTMyLmMKLWtlcm5lbDMyLm86IGtlcm5lbDMyLmMKLQkkKENDKSAtYyAtZyAkKERFRlMpICQoRElWSU5DTCkgJChFWFRSQV9ERUZTKSAtbyBrZXJuZWwzMi5vIGtlcm5lbDMyLmMKLXNoZWxsMzIubzogc2hlbGwzMi5jCi0JJChDQykgLWMgLWcgJChERUZTKSAkKERJVklOQ0wpICQoRVhUUkFfREVGUykgLW8gc2hlbGwzMi5vIHNoZWxsMzIuYwotdXNlcjMyLm86IHVzZXIzMi5jCi0JJChDQykgLWMgLWcgJChERUZTKSAkKERJVklOQ0wpICQoRVhUUkFfREVGUykgLW8gdXNlcjMyLm8gdXNlcjMyLmMKLXdpbnByb2NzMzIubzogd2lucHJvY3MzMi5jCi0JJChDQykgLWMgLWcgJChERUZTKSAkKERJVklOQ0wpICQoRVhUUkFfREVGUykgLW8gd2lucHJvY3MzMi5vIHdpbnByb2NzMzIuYworCXJtIC1mICQoU1BFQ19GSUxFUykgY2FsbDMyLlMgY2FsbDE2LlMgc3RkY2FsbC5TCiAKICMjIyBEZXBlbmRlbmNpZXM6CmRpZmYgLS1naXQgYS9pZjE2MzIvYWR2YXBpMzIuc3BlYyBiL2lmMTYzMi9hZHZhcGkzMi5zcGVjCmluZGV4IGI1ZGU3ZDkuLjI4OTE2YzQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9hZHZhcGkzMi5zcGVjCisrKyBiL2lmMTYzMi9hZHZhcGkzMi5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQlhZHZhcGkzMgordHlwZQl3aW4zMgogYmFzZQkxCiAKIDAwMDAgc3R1YiBBYm9ydFN5c3RlbVNodXRkb3duQQpAQCAtMTMwLDM3ICsxMzEsMzcgQEAKIDAxMjYgCXN0ZGNhbGwgUmVnQ2xvc2VLZXkobG9uZykgUmVnQ2xvc2VLZXkKIDAxMjcgc3R1YiBSZWdDb25uZWN0UmVnaXN0cnlBCiAwMTI4IHN0dWIgUmVnQ29ubmVjdFJlZ2lzdHJ5VwotMDEyOSBzdHViIFJlZ0NyZWF0ZUtleUEKLTAxMzAgCXN0ZGNhbGwgUmVnQ3JlYXRlS2V5RXhBKGxvbmcgcHRyIGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIgcHRyIHB0cikgUmVnQ3JlYXRlS2V5RXgKLTAxMzEgc3R1YiBSZWdDcmVhdGVLZXlFeFcKLTAxMzIgc3R1YiBSZWdDcmVhdGVLZXlXCi0wMTMzIHN0dWIgUmVnRGVsZXRlS2V5QQotMDEzNCBzdHViIFJlZ0RlbGV0ZUtleVcKLTAxMzUgc3R1YiBSZWdEZWxldGVWYWx1ZUEKLTAxMzYgc3R1YiBSZWdEZWxldGVWYWx1ZVcKLTAxMzcgc3R1YiBSZWdFbnVtS2V5QQotMDEzOCBzdHViIFJlZ0VudW1LZXlFeEEKLTAxMzkgc3R1YiBSZWdFbnVtS2V5RXhXCi0wMTQwIHN0dWIgUmVnRW51bUtleVcKLTAxNDEgc3R1YiBSZWdFbnVtVmFsdWVBCi0wMTQyIHN0dWIgUmVnRW51bVZhbHVlVwotMDE0MyBzdHViIFJlZ0ZsdXNoS2V5CiswMTI5IAlzdGRjYWxsIFJlZ0NyZWF0ZUtleUEobG9uZyBwdHIgcHRyKSBSZWdDcmVhdGVLZXlBCiswMTMwIAlzdGRjYWxsIFJlZ0NyZWF0ZUtleUV4QShsb25nIHB0ciBsb25nIHB0ciBsb25nIGxvbmcgcHRyIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleUV4QQorMDEzMSAJc3RkY2FsbCBSZWdDcmVhdGVLZXlFeFcobG9uZyBwdHIgbG9uZyBwdHIgbG9uZyBsb25nIHB0ciBwdHIgcHRyKSBSZWdDcmVhdGVLZXlFeFcKKzAxMzIgCXN0ZGNhbGwgUmVnQ3JlYXRlS2V5Vyhsb25nIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleVcKKzAxMzMgCXN0ZGNhbGwgUmVnRGVsZXRlS2V5QShsb25nIHB0cikgUmVnRGVsZXRlS2V5QQorMDEzNCAJc3RkY2FsbCBSZWdEZWxldGVLZXlXKGxvbmcgcHRyKSBSZWdEZWxldGVLZXlXCiswMTM1IAlzdGRjYWxsCVJlZ0RlbGV0ZVZhbHVlQShsb25nIHB0cikgUmVnRGVsZXRlVmFsdWVBCiswMTM2IAlzdGRjYWxsIFJlZ0RlbGV0ZVZhbHVlVyhsb25nIHB0cikgUmVnRGVsZXRlVmFsdWVXCiswMTM3IAlzdGRjYWxsIFJlZ0VudW1LZXlBKGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnRW51bUtleUEKKzAxMzggCXN0ZGNhbGwgUmVnRW51bUtleUV4QShsb25nIGxvbmcgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ0VudW1LZXlFeEEKKzAxMzkgCXN0ZGNhbGwgUmVnRW51bUtleUV4Vyhsb25nIGxvbmcgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ0VudW1LZXlFeFcKKzAxNDAgCXN0ZGNhbGwgUmVnRW51bUtleVcobG9uZyBsb25nIHB0ciBsb25nKSBSZWdFbnVtS2V5VworMDE0MSAJc3RkY2FsbCBSZWdFbnVtVmFsdWVBKGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0cikgUmVnRW51bVZhbHVlQQorMDE0MiAJc3RkY2FsbCBSZWdFbnVtVmFsdWVXKGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0cikgUmVnRW51bVZhbHVlVworMDE0MyAJc3RkY2FsbCBSZWdGbHVzaEtleShsb25nKSBSZWdGbHVzaEtleQogMDE0NCBzdHViIFJlZ0dldEtleVNlY3VyaXR5CiAwMTQ1IHN0dWIgUmVnTG9hZEtleUEKIDAxNDYgc3R1YiBSZWdMb2FkS2V5VwogMDE0NyBzdHViIFJlZ05vdGlmeUNoYW5nZUtleVZhbHVlCi0wMTQ4IHN0dWIgUmVnT3BlbktleUEKLTAxNDkgc3R1YiBSZWdPcGVuS2V5RXhBCi0wMTUwIHN0dWIgUmVnT3BlbktleUV4VwotMDE1MSBzdHViIFJlZ09wZW5LZXlXCi0wMTUyIHN0dWIgUmVnUXVlcnlJbmZvS2V5QQotMDE1MyBzdHViIFJlZ1F1ZXJ5SW5mb0tleVcKKzAxNDggCXN0ZGNhbGwgUmVnT3BlbktleUEobG9uZyBwdHIgcHRyKSBSZWdPcGVuS2V5QQorMDE0OSAJc3RkY2FsbCBSZWdPcGVuS2V5RXhBKGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIpIFJlZ09wZW5LZXlFeEEKKzAxNTAgCXN0ZGNhbGwgUmVnT3BlbktleUV4Vyhsb25nIHB0ciBsb25nIGxvbmcgcHRyKSBSZWdPcGVuS2V5RXhXCiswMTUxIAlzdGRjYWxsIFJlZ09wZW5LZXlXKGxvbmcgcHRyIHB0cikgUmVnT3BlbktleVcKKzAxNTIgCXN0ZGNhbGwgUmVnUXVlcnlJbmZvS2V5QShsb25nIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5SW5mb0tleUEKKzAxNTMgCXN0ZGNhbGwgUmVnUXVlcnlJbmZvS2V5Vyhsb25nIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5SW5mb0tleVcKIDAxNTQgc3R1YiBSZWdRdWVyeU11bHRpcGxlVmFsdWVzQQogMDE1NSBzdHViIFJlZ1F1ZXJ5TXVsdGlwbGVWYWx1ZXNXCi0wMTU2IHN0dWIgUmVnUXVlcnlWYWx1ZUEKLTAxNTcgCXN0ZGNhbGwgUmVnUXVlcnlWYWx1ZUV4QShsb25nIHB0ciBsb25nIGxvbmcgcHRyIHB0cikgUmVnUXVlcnlWYWx1ZUV4Ci0wMTU4IHN0dWIgUmVnUXVlcnlWYWx1ZUV4VwotMDE1OSBzdHViIFJlZ1F1ZXJ5VmFsdWVXCiswMTU2IAlzdGRjYWxsIFJlZ1F1ZXJ5VmFsdWVBKGxvbmcgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWVBCiswMTU3IAlzdGRjYWxsIFJlZ1F1ZXJ5VmFsdWVFeEEobG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlRXhBCiswMTU4IAlzdGRjYWxsIFJlZ1F1ZXJ5VmFsdWVFeFcobG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlRXhXCiswMTU5IAlzdGRjYWxsIFJlZ1F1ZXJ5VmFsdWVXKGxvbmcgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWVXCiAwMTYwIHN0dWIgUmVnUmVtYXBQcmVEZWZLZXkKIDAxNjEgc3R1YiBSZWdSZXBsYWNlS2V5QQogMDE2MiBzdHViIFJlZ1JlcGxhY2VLZXlXCkBAIC0xNjksMTAgKzE3MCwxMCBAQAogMDE2NSBzdHViIFJlZ1NhdmVLZXlBCiAwMTY2IHN0dWIgUmVnU2F2ZUtleVcKIDAxNjcgc3R1YiBSZWdTZXRLZXlTZWN1cml0eQotMDE2OCBzdHViIFJlZ1NldFZhbHVlQQotMDE2OSAJc3RkY2FsbCBSZWdTZXRWYWx1ZUV4QShsb25nIHB0ciBsb25nIGxvbmcgcHRyIGxvbmcpIFJlZ1NldFZhbHVlRXgKLTAxNzAgc3R1YiBSZWdTZXRWYWx1ZUV4VwotMDE3MSBzdHViIFJlZ1NldFZhbHVlVworMDE2OCAJc3RkY2FsbCBSZWdTZXRWYWx1ZUEobG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVBCiswMTY5IAlzdGRjYWxsIFJlZ1NldFZhbHVlRXhBKGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVFeEEKKzAxNzAgCXN0ZGNhbGwgUmVnU2V0VmFsdWVFeFcobG9uZyBwdHIgbG9uZyBsb25nIHB0ciBsb25nKSBSZWdTZXRWYWx1ZUV4VworMDE3MSAJc3RkY2FsbCBSZWdTZXRWYWx1ZVcobG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVXCiAwMTcyIHN0dWIgUmVnVW5Mb2FkS2V5QQogMDE3MyBzdHViIFJlZ1VuTG9hZEtleVcKIDAxNzQgc3R1YiBSZWdpc3RlckV2ZW50U291cmNlQQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2NvbWN0bDMyLnNwZWMgYi9pZjE2MzIvY29tY3RsMzIuc3BlYwppbmRleCA1OTY3ZmVmLi42NjhkN2E5IDEwMDY0NAotLS0gYS9pZjE2MzIvY29tY3RsMzIuc3BlYworKysgYi9pZjE2MzIvY29tY3RsMzIuc3BlYwpAQCAtMSw0ICsxLDUgQEAKIG5hbWUJY29tY3RsMzIKK3R5cGUJd2luMzIKIGJhc2UJMgogCiAwMCBzdHViIE1lbnVIZWxwCmRpZmYgLS1naXQgYS9pZjE2MzIvY29tZGxnMzIuc3BlYyBiL2lmMTYzMi9jb21kbGczMi5zcGVjCmluZGV4IDc2ODFjZTMuLjhjYTU0ODAgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9jb21kbGczMi5zcGVjCisrKyBiL2lmMTYzMi9jb21kbGczMi5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQljb21kbGczMgordHlwZQl3aW4zMgogYmFzZQkxCiAKIDAwMDAgc3R1YiBBcnJvd0J0blduZFByb2MKZGlmZiAtLWdpdCBhL2lmMTYzMi9jb21tZGxnLnNwZWMgYi9pZjE2MzIvY29tbWRsZy5zcGVjCmluZGV4IDNmMmUyNWMuLmM1NzkwNjUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9jb21tZGxnLnNwZWMKKysrIGIvaWYxNjMyL2NvbW1kbGcuc3BlYwpAQCAtMSw0ICsxLDUgQEAKIG5hbWUJY29tbWRsZwordHlwZQl3aW4xNgogaWQJMTQKIAogMSAgIHBhc2NhbDE2IEdldE9wZW5GaWxlTmFtZShwdHIpIEdldE9wZW5GaWxlTmFtZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2NvbXBvYmouc3BlYyBiL2lmMTYzMi9jb21wb2JqLnNwZWMKaW5kZXggYzdjZmZiOC4uMzk4YzY4YyAxMDA2NDQKLS0tIGEvaWYxNjMyL2NvbXBvYmouc3BlYworKysgYi9pZjE2MzIvY29tcG9iai5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQljb21wb2JqCit0eXBlCXdpbjE2CiBpZAkyMgogCiAxIHBhc2NhbCBDb0J1aWxkVmVyc2lvbigpIENvQnVpbGRWZXJzaW9uCmRpZmYgLS1naXQgYS9pZjE2MzIvZGRlbWwuc3BlYyBiL2lmMTYzMi9kZGVtbC5zcGVjCmluZGV4IGQ1ODVlZjUuLjBhMDM3NjEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9kZGVtbC5zcGVjCisrKyBiL2lmMTYzMi9kZGVtbC5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQlkZGVtbAordHlwZQl3aW4xNgogaWQJMjUKIAogMiBzdHViIERkZUluaXRpYWxpemUgIyhwdHIgc2VncHRyIGxvbmcgbG9uZykgRGRlSW5pdGlhbGl6ZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaS5zcGVjIGIvaWYxNjMyL2dkaS5zcGVjCmluZGV4IGEwMWYxYjEuLjA4ZDdkNmEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkuc3BlYworKysgYi9pZjE2MzIvZ2RpLnNwZWMKQEAgLTEsNCArMSw1IEBACiBuYW1lCWdkaQordHlwZQl3aW4xNgogaWQJMwogCiAxICAgcGFzY2FsIFNldEJrQ29sb3Iod29yZCBsb25nKSBTZXRCa0NvbG9yCmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpMzIuc3BlYyBiL2lmMTYzMi9nZGkzMi5zcGVjCmluZGV4IDI5OWY4MzMuLmRhZTljYzEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkzMi5zcGVjCisrKyBiL2lmMTYzMi9nZGkzMi5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQlnZGkzMgordHlwZQl3aW4zMgogYmFzZQkxCiAKIDAwMDAgc3R1YiBBYm9ydERvYwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbC5zcGVjIGIvaWYxNjMyL2tlcm5lbC5zcGVjCmluZGV4IDdkODc0ZWQuLmMyY2FiZTYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXJuZWwuc3BlYworKysgYi9pZjE2MzIva2VybmVsLnNwZWMKQEAgLTEsNCArMSw1IEBACiBuYW1lCWtlcm5lbAordHlwZQl3aW4xNgogaWQJMQogCiAxICAgc3R1YiBGYXRhbEV4aXQKQEAgLTIwOCwxNSArMjA5LDE1IEBACiAyMTYgcGFzY2FsICAgUmVnRW51bUtleShsb25nIGxvbmcgcHRyIGxvbmcpIFJlZ0VudW1LZXkKIDIxNyBwYXNjYWwgICBSZWdPcGVuS2V5KGxvbmcgcHRyIHB0cikgUmVnT3BlbktleQogMjE4IHBhc2NhbCAgIFJlZ0NyZWF0ZUtleShsb25nIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleQotMjE5IHN0dWIgUmVnRGVsZXRlVmFsdWUKKzIxOSBwYXNjYWwgICBSZWdEZWxldGVLZXkobG9uZyBwdHIpIFJlZ0RlbGV0ZUtleQogMjIwIHBhc2NhbCAgIFJlZ0Nsb3NlS2V5KGxvbmcpIFJlZ0Nsb3NlS2V5CiAyMjEgcGFzY2FsICAgUmVnU2V0VmFsdWUobG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWUKLTIyMiBzdHViIFJlZ0RlbGV0ZVZhbHVlCi0yMjMgc3R1YiBSZWdFbnVtVmFsdWUKKzIyMiBwYXNjYWwgICBSZWdEZWxldGVWYWx1ZShsb25nIHB0cikgUmVnRGVsZXRlVmFsdWUKKzIyMyBwYXNjYWwgICBSZWdFbnVtVmFsdWUobG9uZyBsb25nIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdFbnVtVmFsdWUKIDIyNCBwYXNjYWwgICBSZWdRdWVyeVZhbHVlKGxvbmcgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWUKLTIyNSBzdHViIFJlZ1F1ZXJ5VmFsdWVFeAotMjI2IHN0dWIgUmVnU2V0VmFsdWVFeAotMjI3IHN0dWIgUmVnRmx1c2hLZXkKKzIyNSBwYXNjYWwgICBSZWdRdWVyeVZhbHVlRXgobG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyKSBSZWdRdWVyeVZhbHVlRXgKKzIyNiBwYXNjYWwgICBSZWdTZXRWYWx1ZUV4KGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVFeAorMjI3IHBhc2NhbCAgIFJlZ0ZsdXNoS2V5KGxvbmcpIFJlZ0ZsdXNoS2V5CiAjMjI4IEsyMjgKICMyMjkgSzIyOQogMjMwIHN0dWIgR2xvYmFsU21hcnRQYWdlTG9jawpkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMgYi9pZjE2MzIva2VybmVsMzIuc3BlYwppbmRleCAzMzg4NDMwLi5mMjA1Mzc0IDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsMzIuc3BlYworKysgYi9pZjE2MzIva2VybmVsMzIuc3BlYwpAQCAtMSw0ICsxLDUgQEAKIG5hbWUJa2VybmVsMzIKK3R5cGUJd2luMzIKIGJhc2UJMQogCiAwMDAwIHN0dWIgQWRkQXRvbUEKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXlib2FyZC5zcGVjIGIvaWYxNjMyL2tleWJvYXJkLnNwZWMKaW5kZXggNzE0YmQzYy4uNTgyMDM2MyAxMDA2NDQKLS0tIGEvaWYxNjMyL2tleWJvYXJkLnNwZWMKKysrIGIvaWYxNjMyL2tleWJvYXJkLnNwZWMKQEAgLTEsNCArMSw1IEBACiBuYW1lCWtleWJvYXJkCit0eXBlCXdpbjE2CiBpZAk3CiAKICMxCXBhc2NhbAlJbnF1aXJlCmRpZmYgLS1naXQgYS9pZjE2MzIvbHpleHBhbmQuc3BlYyBiL2lmMTYzMi9semV4cGFuZC5zcGVjCmluZGV4IDlmMmUzOGQuLjNlNmIyYzkgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9semV4cGFuZC5zcGVjCisrKyBiL2lmMTYzMi9semV4cGFuZC5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQlsemV4cGFuZAordHlwZQl3aW4xNgogaWQJMjYKIAogMSAgcGFzY2FsICAgTFpDb3B5KHdvcmQgd29yZCkgTFpDb3B5CmRpZmYgLS1naXQgYS9pZjE2MzIvbW1zeXN0ZW0uc3BlYyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCmluZGV4IDE0MTcxZDQuLmNiMjgyMDQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9tbXN5c3RlbS5zcGVjCisrKyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQltbXN5c3RlbQordHlwZQl3aW4xNgogaWQJMTAKIAogIzEgICAgICBwYXNjYWwgIE1NU1lTVEVNX1dFUCh3b3JkIHdvcmQgd29yZCBwdHIpIE1NU1lTVEVNX1dFUApkaWZmIC0tZ2l0IGEvaWYxNjMyL21vdXNlLnNwZWMgYi9pZjE2MzIvbW91c2Uuc3BlYwppbmRleCAwYzA0YThkLi5mZTg1OTlmIDEwMDY0NAotLS0gYS9pZjE2MzIvbW91c2Uuc3BlYworKysgYi9pZjE2MzIvbW91c2Uuc3BlYwpAQCAtMSw0ICsxLDUgQEAKIG5hbWUJbW91c2UKK3R5cGUJd2luMTYKIGlkCTEzCiAKIDEgc3R1YiBJTlFVSVJFCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMi5zcGVjIGIvaWYxNjMyL29sZTIuc3BlYwppbmRleCBjM2NhYTgyLi5mN2M4YWQyIDEwMDY0NAotLS0gYS9pZjE2MzIvb2xlMi5zcGVjCisrKyBiL2lmMTYzMi9vbGUyLnNwZWMKQEAgLTEsNCArMSw1IEBACiBuYW1lCU9MRTIKK3R5cGUJd2luMTYKIGlkCTE1CiAKIDEgcGFzY2FsIE9sZUJ1aWxkVmVyc2lvbigpIE9sZUJ1aWxkVmVyc2lvbgpkaWZmIC0tZ2l0IGEvaWYxNjMyL29sZTJjb252LnNwZWMgYi9pZjE2MzIvb2xlMmNvbnYuc3BlYwppbmRleCBkMjQxNGJkLi4zOTgwOGE4IDEwMDY0NAotLS0gYS9pZjE2MzIvb2xlMmNvbnYuc3BlYworKysgYi9pZjE2MzIvb2xlMmNvbnYuc3BlYwpAQCAtMSw0ICsxLDUgQEAKIG5hbWUJb2xlMmNvbnYKK3R5cGUJd2luMTYKIGlkCTE2CiAKIDEgc3R1YiBHRVRGSUxURVJJTkZPCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMmRpc3Auc3BlYyBiL2lmMTYzMi9vbGUyZGlzcC5zcGVjCmluZGV4IGU4ZjM0YmYuLjEzNjRmNWEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9vbGUyZGlzcC5zcGVjCisrKyBiL2lmMTYzMi9vbGUyZGlzcC5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQlvbGUyZGlzcAordHlwZQl3aW4xNgogaWQJMTcKIAogMSBzdHViIERMTEdFVENMQVNTT0JKRUNUCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMm5scy5zcGVjIGIvaWYxNjMyL29sZTJubHMuc3BlYwppbmRleCA5ZTcwNDQ1Li41N2IxMzZhIDEwMDY0NAotLS0gYS9pZjE2MzIvb2xlMm5scy5zcGVjCisrKyBiL2lmMTYzMi9vbGUybmxzLnNwZWMKQEAgLTEsNCArMSw1IEBACiBuYW1lCW9sZTJubHMKK3R5cGUJd2luMTYKIGlkCTE4CiAKIDEgcGFzY2FsIEdldFVzZXJEZWZhdWx0TENJRCgpICAgICAgR2V0VXNlckRlZmF1bHRMQ0lECmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMnByb3guc3BlYyBiL2lmMTYzMi9vbGUycHJveC5zcGVjCmluZGV4IDFkMzg2OGEuLmUyODIyY2IgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9vbGUycHJveC5zcGVjCisrKyBiL2lmMTYzMi9vbGUycHJveC5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQlvbGUycHJveAordHlwZQl3aW4xNgogaWQJMTkKIAogMSBzdHViIERMTEdFVENMQVNTT0JKRUNUCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMzIuc3BlYyBiL2lmMTYzMi9vbGUzMi5zcGVjCmluZGV4IGY5YzZkZDIuLmNmOTMxMTcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9vbGUzMi5zcGVjCisrKyBiL2lmMTYzMi9vbGUzMi5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQlvbGUzMgordHlwZQl3aW4zMgogYmFzZQkxCiAKIDAgc3R1YiBCaW5kTW9uaWtlcgpkaWZmIC0tZ2l0IGEvaWYxNjMyL29sZWNsaS5zcGVjIGIvaWYxNjMyL29sZWNsaS5zcGVjCmluZGV4IDAzZWY1Y2EuLjkzNzZkNjkgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9vbGVjbGkuc3BlYworKysgYi9pZjE2MzIvb2xlY2xpLnNwZWMKQEAgLTEsNCArMSw1IEBACiBuYW1lCW9sZWNsaQordHlwZQl3aW4xNgogaWQJMjAKIAogIzEgV0VQCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlc3ZyLnNwZWMgYi9pZjE2MzIvb2xlc3ZyLnNwZWMKaW5kZXggY2EzZjFiZC4uYTc5MTE1ZCAxMDA2NDQKLS0tIGEvaWYxNjMyL29sZXN2ci5zcGVjCisrKyBiL2lmMTYzMi9vbGVzdnIuc3BlYwpAQCAtMSw0ICsxLDUgQEAKIG5hbWUJb2xlc3ZyCit0eXBlCXdpbjE2CiBpZAkyMQogCiAjMSBXRVAKZGlmZiAtLWdpdCBhL2lmMTYzMi9yZWxheS5jIGIvaWYxNjMyL3JlbGF5LmMKaW5kZXggYjBmM2Q5Yi4uYzM5NjBiYSAxMDA2NDQKLS0tIGEvaWYxNjMyL3JlbGF5LmMKKysrIGIvaWYxNjMyL3JlbGF5LmMKQEAgLTE5LDQ1ICsxOSw0MSBAQAogZHByaW50Zl9yZWxheQogI2VuZGlmCiAKLSNkZWZpbmUgRExMX0VOVFJZKG5hbWUpIFwKKyNkZWZpbmUgRExMX0VOVFJZKG5hbWUsZmxhZ3MpIFwKICAgeyAjbmFtZSwgbmFtZSMjX0NvZGVfU3RhcnQsIG5hbWUjI19EYXRhX1N0YXJ0LCBcCi0gICAgbmFtZSMjX01vZHVsZV9TdGFydCwgbmFtZSMjX01vZHVsZV9FbmQsIFRSVUUsIDAgfQotI2RlZmluZSBETExfRU5UUllfTk9UVVNFRChuYW1lKSBcCi0gIHsgI25hbWUsIG5hbWUjI19Db2RlX1N0YXJ0LCBuYW1lIyNfRGF0YV9TdGFydCwgXAotICAgIG5hbWUjI19Nb2R1bGVfU3RhcnQsIG5hbWUjI19Nb2R1bGVfRW5kLCBGQUxTRSwgMCB9CisgICAgbmFtZSMjX01vZHVsZV9TdGFydCwgbmFtZSMjX01vZHVsZV9FbmQsIChmbGFncykgfQogCi1zdHJ1Y3QgZGxsX3RhYmxlX3MgZGxsX2J1aWx0aW5fdGFibGVbTl9CVUlMVElOU10gPQorQlVJTFRJTl9ETEwgZGxsX2J1aWx0aW5fdGFibGVbXSA9CiB7Ci0gICAgRExMX0VOVFJZKEtFUk5FTCksCi0gICAgRExMX0VOVFJZKFVTRVIpLAotICAgIERMTF9FTlRSWShHREkpLAotICAgIERMTF9FTlRSWV9OT1RVU0VEKFdJTjg3RU0pLAotICAgIERMTF9FTlRSWV9OT1RVU0VEKFNIRUxMKSwKLSAgICBETExfRU5UUlkoU09VTkQpLAotICAgIERMTF9FTlRSWShLRVlCT0FSRCksCi0gICAgRExMX0VOVFJZKFdJTlNPQ0spLAotICAgIERMTF9FTlRSWShTVFJFU1MpLAotICAgIERMTF9FTlRSWShNTVNZU1RFTSksCi0gICAgRExMX0VOVFJZKFNZU1RFTSksCi0gICAgRExMX0VOVFJZKFRPT0xIRUxQKSwKLSAgICBETExfRU5UUlkoTU9VU0UpLAotICAgIERMTF9FTlRSWV9OT1RVU0VEKENPTU1ETEcpLAotICAgIERMTF9FTlRSWV9OT1RVU0VEKE9MRTIpLAotICAgIERMTF9FTlRSWV9OT1RVU0VEKE9MRTJDT05WKSwKLSAgICBETExfRU5UUllfTk9UVVNFRChPTEUyRElTUCksCi0gICAgRExMX0VOVFJZX05PVFVTRUQoT0xFMk5MUyksCi0gICAgRExMX0VOVFJZX05PVFVTRUQoT0xFMlBST1gpLAotICAgIERMTF9FTlRSWV9OT1RVU0VEKE9MRUNMSSksCi0gICAgRExMX0VOVFJZX05PVFVTRUQoT0xFU1ZSKSwKLSAgICBETExfRU5UUllfTk9UVVNFRChDT01QT0JKKSwKLSAgICBETExfRU5UUllfTk9UVVNFRChTVE9SQUdFKSwKLSAgICBETExfRU5UUlkoV0lOUFJPQ1MpLAotICAgIERMTF9FTlRSWV9OT1RVU0VEKERERU1MKSwKLSAgICBETExfRU5UUlkoTFpFWFBBTkQpCisgICAgRExMX0VOVFJZKCBLRVJORUwsICAgMCksCisgICAgRExMX0VOVFJZKCBVU0VSLCAgICAgMCksCisgICAgRExMX0VOVFJZKCBHREksICAgICAgMCksCisgICAgRExMX0VOVFJZKCBXSU44N0VNLCAgRExMX0ZMQUdfTk9UX1VTRUQpLAorICAgIERMTF9FTlRSWSggU0hFTEwsICAgIDApLAorICAgIERMTF9FTlRSWSggU09VTkQsICAgIDApLAorICAgIERMTF9FTlRSWSggS0VZQk9BUkQsIDApLAorICAgIERMTF9FTlRSWSggV0lOU09DSywgIDApLAorICAgIERMTF9FTlRSWSggU1RSRVNTLCAgIDApLAorICAgIERMTF9FTlRSWSggTU1TWVNURU0sIDApLAorICAgIERMTF9FTlRSWSggU1lTVEVNLCAgIDApLAorICAgIERMTF9FTlRSWSggVE9PTEhFTFAsIDApLAorICAgIERMTF9FTlRSWSggTU9VU0UsICAgIDApLAorICAgIERMTF9FTlRSWSggQ09NTURMRywgIERMTF9GTEFHX05PVF9VU0VEKSwKKyAgICBETExfRU5UUlkoIE9MRTIsICAgICBETExfRkxBR19OT1RfVVNFRCksCisgICAgRExMX0VOVFJZKCBPTEUyQ09OViwgRExMX0ZMQUdfTk9UX1VTRUQpLAorICAgIERMTF9FTlRSWSggT0xFMkRJU1AsIERMTF9GTEFHX05PVF9VU0VEKSwKKyAgICBETExfRU5UUlkoIE9MRTJOTFMsICBETExfRkxBR19OT1RfVVNFRCksCisgICAgRExMX0VOVFJZKCBPTEUyUFJPWCwgRExMX0ZMQUdfTk9UX1VTRUQpLAorICAgIERMTF9FTlRSWSggT0xFQ0xJLCAgIERMTF9GTEFHX05PVF9VU0VEKSwKKyAgICBETExfRU5UUlkoIE9MRVNWUiwgICBETExfRkxBR19OT1RfVVNFRCksCisgICAgRExMX0VOVFJZKCBDT01QT0JKLCAgRExMX0ZMQUdfTk9UX1VTRUQpLAorICAgIERMTF9FTlRSWSggU1RPUkFHRSwgIERMTF9GTEFHX05PVF9VU0VEKSwKKyAgICBETExfRU5UUlkoIFdJTlBST0NTLCAwKSwKKyAgICBETExfRU5UUlkoIERERU1MLCAgICBETExfRkxBR19OT1RfVVNFRCksCisgICAgRExMX0VOVFJZKCBMWkVYUEFORCwgMCksCisgICAgeyBOVUxMLCB9ICAvKiBMYXN0IGVudHJ5ICovCiB9OwogCi0vKiBkb24ndCBmb3JnZXQgdG8gaW5jcmVhc2UgTl9CVUlMVElOUyBpbiBkbGxzLmggaWYgeW91IGFkZCBhIGRsbCAqLwotCiAgIC8qIFNhdmVkIDE2LWJpdCBzdGFjayAqLwogV09SRCBJRjE2MzJfU2F2ZWQxNl9zcyA9IDA7CiBXT1JEIElGMTYzMl9TYXZlZDE2X3NwID0gMDsKQEAgLTExMiw4ICsxMDgsOCBAQAogICAgIGZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OwogICAgIHRhYmxlID0gJmRsbF9idWlsdGluX3RhYmxlW2ZyYW1lLT5kbGxfaWQtMV07CiAgICAgbmFtZSAgPSBNT0RVTEVfR2V0RW50cnlQb2ludE5hbWUoIHRhYmxlLT5oTW9kdWxlLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIgKTsKLSAgICBwcmludGYoICJDYWxsICVzLiVkOiAlKi4qcygiLAotICAgICAgICAgICAgdGFibGUtPm5hbWUsIGZyYW1lLT5vcmRpbmFsX251bWJlciwgKm5hbWUsICpuYW1lLCBuYW1lICsgMSApOworICAgIHByaW50ZiggIkNhbGwgJXMuJWQ6ICUuKnMoIiwKKyAgICAgICAgICAgIHRhYmxlLT5uYW1lLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIsICpuYW1lLCBuYW1lICsgMSApOwogCiAgICAgYXJnczE2ID0gKGNoYXIgKilmcmFtZS0+YXJnczsKICAgICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuKGFyZ3MpOyBpKyspCkBAIC0xODQsOCArMTgwLDggQEAKICAgICBmcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKICAgICB0YWJsZSA9ICZkbGxfYnVpbHRpbl90YWJsZVtmcmFtZS0+ZGxsX2lkLTFdOwogICAgIG5hbWUgID0gTU9EVUxFX0dldEVudHJ5UG9pbnROYW1lKCB0YWJsZS0+aE1vZHVsZSwgZnJhbWUtPm9yZGluYWxfbnVtYmVyICk7Ci0gICAgcHJpbnRmKCAiUmV0ICAlcy4lZDogJSouKnMoKSAiLAotICAgICAgICAgICAgdGFibGUtPm5hbWUsIGZyYW1lLT5vcmRpbmFsX251bWJlciwgKm5hbWUsICpuYW1lLCBuYW1lICsgMSApOworICAgIHByaW50ZiggIlJldCAgJXMuJWQ6ICUuKnMoKSAiLAorICAgICAgICAgICAgdGFibGUtPm5hbWUsIGZyYW1lLT5vcmRpbmFsX251bWJlciwgKm5hbWUsIG5hbWUgKyAxICk7CiAgICAgc3dpdGNoKGZ1bmNfdHlwZSkKICAgICB7CiAgICAgY2FzZSAwOiAvKiBsb25nICovCkBAIC0yMTIsMTkgKzIwOCwzNCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJFTEFZX1VuaW1wbGVtZW50ZWQKKyAqICAgICAgICAgICBSRUxBWV9VbmltcGxlbWVudGVkMTYKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdW5pbXBsZW1lbnRlZCBlbnRyeSBwb2ludHMgKGRlY2xhcmVkCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdW5pbXBsZW1lbnRlZCAxNi1iaXQgZW50cnkgcG9pbnRzIChkZWNsYXJlZAogICogYXMgJ3N0dWInIGluIHRoZSBzcGVjIGZpbGUpLgogICovCi12b2lkIFJFTEFZX1VuaW1wbGVtZW50ZWQodm9pZCkKK3ZvaWQgUkVMQVlfVW5pbXBsZW1lbnRlZDE2KHZvaWQpCiB7CiAgICAgU1RBQ0sxNkZSQU1FICpmcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKICAgICBzdHJ1Y3QgZGxsX3RhYmxlX3MgKnRhYmxlID0gJmRsbF9idWlsdGluX3RhYmxlW2ZyYW1lLT5kbGxfaWQtMV07CiAgICAgY2hhciAqbmFtZSA9IE1PRFVMRV9HZXRFbnRyeVBvaW50TmFtZSggdGFibGUtPmhNb2R1bGUsIGZyYW1lLT5vcmRpbmFsX251bWJlciApOwogCi0gICAgZnByaW50Ziggc3RkZXJyLCAiTm8gaGFuZGxlciBmb3Igcm91dGluZSAlcy4lZCAoJSouKnMpXG4iLAotICAgICAgICAgICAgIHRhYmxlLT5uYW1lLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIsICpuYW1lLCAqbmFtZSwgbmFtZSArIDEgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICJObyBoYW5kbGVyIGZvciByb3V0aW5lICVzLiVkICglLipzKVxuIiwKKyAgICAgICAgICAgICB0YWJsZS0+bmFtZSwgZnJhbWUtPm9yZGluYWxfbnVtYmVyLCAqbmFtZSwgbmFtZSArIDEgKTsKKyAgICBleGl0KDEpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJFTEFZX1VuaW1wbGVtZW50ZWQzMgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB1bmltcGxlbWVudGVkIDMyLWJpdCBlbnRyeSBwb2ludHMgKGRlY2xhcmVkCisgKiBhcyAnc3R1YicgaW4gdGhlIHNwZWMgZmlsZSkuCisgKiAoVGhlIGFyZ3MgYXJlIHRoZSBzYW1lIHRoYW4gZm9yIFJFTEFZX0RlYnVnU3RkY2FsbCkuCisgKi8KK3ZvaWQgUkVMQVlfVW5pbXBsZW1lbnRlZDMyKCBpbnQgbmJfYXJncywgdm9pZCAqZW50cnlfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY19uYW1lICkKK3sKKyAgICBmcHJpbnRmKCBzdGRlcnIsICJObyBoYW5kbGVyIGZvciBXaW4zMiByb3V0aW5lICVzXG4iLCBmdW5jX25hbWUgKTsKICAgICBleGl0KDEpOwogfQogCkBAIC0yNTAsMyArMjYxLDMzIEBACiAgICAgd2hpbGUgKG5iYXJncy0tKSBwcmludGYoICIsMHglMDR4IiwgKnN0YWNrKysgKTsKICAgICBwcmludGYoICIpXG4iICk7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUkVMQVlfRGVidWdTdGRjYWxsCisgKi8KK3ZvaWQgUkVMQVlfRGVidWdTdGRjYWxsKCBpbnQgbmJfYXJncywgdm9pZCAqZW50cnlfcG9pbnQsIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWJwLCBpbnQgcmV0X2FkZHIsIGludCBhcmcxICkKK3sKKyAgICBpbnQgICpwYXJnOworICAgIGlmICghZGVidWdnaW5nX3JlbGF5KSByZXR1cm47CisgICAgcHJpbnRmKCAiQ2FsbCAlcygiLCBmdW5jX25hbWUgKTsKKyAgICBmb3IgKHBhcmcgPSAmYXJnMTsgbmJfYXJnczsgcGFyZysrLCBuYl9hcmdzLS0pCisgICAgeworICAgICAgICBwcmludGYoICIlMDh4IiwgKnBhcmcgKTsKKyAgICAgICAgaWYgKG5iX2FyZ3MgPiAxKSBwcmludGYoICIsIiApOworICAgIH0KKyAgICBwcmludGYoICIpIHJldD0lMDh4XG4iLCByZXRfYWRkciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJFTEFZX0RlYnVnU3RkY2FsbFJldAorICovCit2b2lkIFJFTEFZX0RlYnVnU3RkY2FsbFJldCggaW50IHJldF92YWwsIHZvaWQgKmVudHJ5X3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNfbmFtZSwgaW50IGVicCwgaW50IHJldF9hZGRyICkKK3sKKyAgICBpZiAoIWRlYnVnZ2luZ19yZWxheSkgcmV0dXJuOworICAgIHByaW50ZiggIlJldCAgJXMoKSByZXR2YWw9MHglMDh4IHJldD0lMDh4XG4iLAorICAgICAgICAgICAgZnVuY19uYW1lLCByZXRfdmFsLCByZXRfYWRkciApOworfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5MzIuYyBiL2lmMTYzMi9yZWxheTMyLmMKaW5kZXggNGVjMTEwNC4uNDE4ZjFjYyAxMDA2NDQKLS0tIGEvaWYxNjMyL3JlbGF5MzIuYworKysgYi9pZjE2MzIvcmVsYXkzMi5jCkBAIC0yNCwzNyArMjQsMzcgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLVdJTjMyX2J1aWx0aW4JKldJTjMyX2J1aWx0aW5fbGlzdDsKKyNkZWZpbmUgRExMX0VOVFJZKG5hbWUpIFwKKyAgeyAjbmFtZSwgKFdJTjMyX2Z1bmN0aW9uICopbmFtZSMjX01vZHVsZV9TdGFydCwgXAorICAgIChXSU4zMl9mdW5jdGlvbiAqKW5hbWUjI19Nb2R1bGVfRW5kLCAoaW50ICopbmFtZSMjX0RhdGFfU3RhcnQsIE5VTEwgfQogCi0vKiBGdW5jdGlvbnMgYXJlIGluIGdlbmVyYXRlZCBjb2RlICovCi12b2lkIEFEVkFQSTMyX0luaXQoKTsKLXZvaWQgQ09NQ1RMMzJfSW5pdCgpOwotdm9pZCBDT01ETEczMl9Jbml0KCk7Ci12b2lkIE9MRTMyX0luaXQoKTsKLXZvaWQgR0RJMzJfSW5pdCgpOwotdm9pZCBLRVJORUwzMl9Jbml0KCk7Ci12b2lkIFNIRUxMMzJfSW5pdCgpOwotdm9pZCBVU0VSMzJfSW5pdCgpOwotdm9pZCBXSU5QUk9DUzMyX0luaXQoKTsKLXZvaWQgV0lOU1BPT0xfSW5pdCgpOworc3RhdGljIFdJTjMyX2J1aWx0aW4gV0lOMzJfYnVpbHRpbl9saXN0W10gPQoreworICAgIERMTF9FTlRSWShBRFZBUEkzMiksCisgICAgRExMX0VOVFJZKENPTUNUTDMyKSwKKyAgICBETExfRU5UUlkoQ09NRExHMzIpLAorICAgIERMTF9FTlRSWShPTEUzMiksCisgICAgRExMX0VOVFJZKEdESTMyKSwKKyAgICBETExfRU5UUlkoS0VSTkVMMzIpLAorICAgIERMTF9FTlRSWShTSEVMTDMyKSwKKyAgICBETExfRU5UUlkoVVNFUjMyKSwKKyAgICBETExfRU5UUlkoV0lOUFJPQ1MzMiksCisgICAgRExMX0VOVFJZKFdJTlNQT09MKQorfTsKKworI2RlZmluZSBOQl9ETExTIChzaXplb2YoV0lOMzJfYnVpbHRpbl9saXN0KS9zaXplb2YoV0lOMzJfYnVpbHRpbl9saXN0WzBdKSkKKworc3RhdGljIHZvaWQgUkVMQVkzMl9NYWtlRmFrZU1vZHVsZShXSU4zMl9idWlsdGluKmRsbCk7CiAKIGludCBSRUxBWTMyX0luaXQodm9pZCkKIHsKLSNpZm5kZWYgV0lORUxJQgotCS8qIEFkZCBhIGNhbGwgZm9yIGVhY2ggRExMICovCi0JQURWQVBJMzJfSW5pdCgpOwotCUNPTUNUTDMyX0luaXQoKTsKLQlDT01ETEczMl9Jbml0KCk7Ci0JR0RJMzJfSW5pdCgpOwotCUtFUk5FTDMyX0luaXQoKTsKLQlPTEUzMl9Jbml0KCk7Ci0JU0hFTEwzMl9Jbml0KCk7Ci0JVVNFUjMyX0luaXQoKTsKLQlXSU5QUk9DUzMyX0luaXQoKTsKLQlXSU5TUE9PTF9Jbml0KCk7Ci0jZW5kaWYKLQkvKiBXaHkgc2hvdWxkIGl0IGZhaWwsIGFueXdheXM/ICovCi0JcmV0dXJuIDE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkJfRExMUzsgaSsrKQorICAgICAgICBSRUxBWTMyX01ha2VGYWtlTW9kdWxlKCAmV0lOMzJfYnVpbHRpbl9saXN0W2ldICk7CisKKyAgICAvKiBXaHkgc2hvdWxkIGl0IGZhaWwsIGFueXdheXM/ICovCisgICAgcmV0dXJuIDE7CiB9CiAKIFdJTjMyX2J1aWx0aW4gKlJFTEFZMzJfR2V0QnVpbHRpbkRMTChjaGFyICpuYW1lKQpAQCAtNjIsMTEgKzYyLDExIEBACiAJV0lOMzJfYnVpbHRpbiAqaXQ7CiAJc2l6ZV90IGxlbjsKIAljaGFyICpjcDsKKyAgICAgICAgaW50IGk7CiAKIAlsZW4gPSAoY3A9c3RyY2hyKG5hbWUsJy4nKSkgPyAoY3AtbmFtZSkgOiBzdHJsZW4obmFtZSk7Ci0JZm9yKGl0PVdJTjMyX2J1aWx0aW5fbGlzdDtpdDtpdD1pdC0+bmV4dCkKLQlpZihsc3RybmNtcGkobmFtZSxpdC0+bmFtZSxsZW4pPT0wKQotCQlyZXR1cm4gaXQ7CisJZm9yKGkgPSBOQl9ETExTLCBpdCA9IFdJTjMyX2J1aWx0aW5fbGlzdDsgKGkgPiAwKTsgaS0tLCBpdCsrKQorICAgICAgICAgICAgaWYgKCFsc3RybmNtcGkobmFtZSxpdC0+bmFtZSxsZW4pKSByZXR1cm4gaXQ7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTg1LDMwICs4NSwzMiBAQAogCiB2b2lkICpSRUxBWTMyX0dldEVudHJ5UG9pbnQoV0lOMzJfYnVpbHRpbiAqZGxsLCBjaGFyICppdGVtLCBpbnQgaGludCkKIHsKLQlpbnQgaTsKKwlpbnQgaSwgc2l6ZTsKIAogCWRwcmludGZfbW9kdWxlKHN0ZGRlYiwgIkxvb2tpbmcgZm9yICVzIGluICVzLCBoaW50ICV4XG4iLAogCQlpdGVtID8gaXRlbTogIihubyBuYW1lKSIsIGRsbC0+bmFtZSwgaGludCk7CiAJaWYoIWRsbCkKIAkJcmV0dXJuIDA7CisgICAgICAgIHNpemUgPSAoaW50KShkbGwtPmxhc3RfZnVuYyAtIGRsbC0+ZnVuY3Rpb25zKTsKKwogCS8qIGltcG9ydCBieSBvcmRpbmFsICovCiAJaWYoIWl0ZW0pewotCQlpZihoaW50ICYmIGhpbnQ8ZGxsLT5zaXplKQotCQkJcmV0dXJuIGRsbC0+ZnVuY3Rpb25zW2hpbnQtZGxsLT5iYXNlXS5kZWZpbml0aW9uOworCQlpZihoaW50ICYmIGhpbnQgPCBzaXplKQorCQkJcmV0dXJuIGRsbC0+ZnVuY3Rpb25zW2hpbnQgLSAqZGxsLT5iYXNlXS5kZWZpbml0aW9uOwogCQlyZXR1cm4gMDsKIAl9CiAJLyogaGludCBpcyBjb3JyZWN0ICovCi0JaWYoaGludCAmJiBoaW50PGRsbC0+c2l6ZSAmJiAKKwlpZihoaW50ICYmIGhpbnQgPCBzaXplICYmIAogCQlkbGwtPmZ1bmN0aW9uc1toaW50XS5uYW1lICYmCiAJCXN0cmNtcChpdGVtLGRsbC0+ZnVuY3Rpb25zW2hpbnRdLm5hbWUpPT0wKQogCQlyZXR1cm4gZGxsLT5mdW5jdGlvbnNbaGludF0uZGVmaW5pdGlvbjsKIAkvKiBoaW50IGlzIGluY29ycmVjdCwgc2VhcmNoIGZvciBuYW1lICovCi0JZm9yKGk9MDtpPGRsbC0+c2l6ZTtpKyspCisJZm9yKGk9MDtpIDwgc2l6ZTtpKyspCiAgICAgICAgICAgICBpZiAoZGxsLT5mdW5jdGlvbnNbaV0ubmFtZSAmJiAhc3RyY21wKGl0ZW0sZGxsLT5mdW5jdGlvbnNbaV0ubmFtZSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGRsbC0+ZnVuY3Rpb25zW2ldLmRlZmluaXRpb247CiAKIAkvKiBmdW5jdGlvbiBhdCBoaW50IGhhcyBubyBuYW1lICh1bmltcGxlbWVudGVkKSAqLwotCWlmKGhpbnQgJiYgaGludDxkbGwtPnNpemUgJiYgIWRsbC0+ZnVuY3Rpb25zW2hpbnRdLm5hbWUpCisJaWYoaGludCAmJiBoaW50IDwgc2l6ZSAmJiAhZGxsLT5mdW5jdGlvbnNbaGludF0ubmFtZSkKIAl7CiAJCWRsbC0+ZnVuY3Rpb25zW2hpbnRdLm5hbWU9eHN0cmR1cChpdGVtKTsKIAkJZHByaW50Zl9tb2R1bGUoc3RkZGViLCAiUmV0dXJuaW5nIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gJXMuJWRcbiIsCkBAIC0xMTgsMTEgKzEyMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgUkVMQVkzMl9EZWJ1Z0VudGVyKGNoYXIgKmRsbCxjaGFyICpuYW1lKQotewotCWRwcmludGZfcmVsYXkoc3RkZGViLCAiRW50ZXJpbmcgJXMuJXNcbiIsZGxsLG5hbWUpOwotfQotCiBMT05HIFJFTEFZMzJfQ2FsbFdpbmRvd1Byb2MoIFdORFBST0MgZnVuYywgaW50IGh3bmQsIGludCBtZXNzYWdlLAogICAgICAgICAgICAgIGludCB3UGFyYW0sIGludCBsUGFyYW0gKQogewpAQCAtMjAxLDcgKzE5OCw3IEBACiAJcmV0dXJuIFJFTEFZMzJfQ2FsbFdpbmRvd1Byb2MoZnVuYyxod25kLG1lc3NhZ2Usd1BhcmFtLChpbnQpbFBhcmFtKTsKIH0KIAotdm9pZCBSRUxBWTMyX01ha2VGYWtlTW9kdWxlKFdJTjMyX2J1aWx0aW4qZGxsKQorc3RhdGljIHZvaWQgUkVMQVkzMl9NYWtlRmFrZU1vZHVsZShXSU4zMl9idWlsdGluKmRsbCkKIHsKIAlORV9NT0RVTEUgKnBNb2R1bGU7CiAJc3RydWN0IHdfZmlsZXMgKndwbnQ7CkBAIC0yMjcsMTAgKzIyNCwxMCBAQAogCUZhclNldE93bmVyKCBoTW9kdWxlLCBoTW9kdWxlICk7CiAJcE1vZHVsZSA9IChORV9NT0RVTEUqKUdsb2JhbExvY2soaE1vZHVsZSk7CiAJLyogU2V0IGFsbCB1c2VkIGVudHJpZXMgKi8KLQlwTW9kdWxlLT5tYWdpYz1QRV9TSUdOQVRVUkU7CisJcE1vZHVsZS0+bWFnaWM9TkVfU0lHTkFUVVJFOwogCXBNb2R1bGUtPmNvdW50PTE7CiAJcE1vZHVsZS0+bmV4dD0wOwotCXBNb2R1bGUtPmZsYWdzPTA7CisJcE1vZHVsZS0+ZmxhZ3M9TkVfRkZMQUdTX1dJTjMyOwogCXBNb2R1bGUtPmRncm91cD0wOwogCXBNb2R1bGUtPnNzPTA7CiAJcE1vZHVsZS0+Y3M9MDsKZGlmZiAtLWdpdCBhL2lmMTYzMi9zaGVsbC5zcGVjIGIvaWYxNjMyL3NoZWxsLnNwZWMKaW5kZXggOGYwMWUwMi4uZjdiMmJlYSAxMDA2NDQKLS0tIGEvaWYxNjMyL3NoZWxsLnNwZWMKKysrIGIvaWYxNjMyL3NoZWxsLnNwZWMKQEAgLTEsMTEgKzEsNyBAQAogbmFtZQlzaGVsbAordHlwZQl3aW4xNgogaWQJNQogCi0jCi0jIFdBUk5JTkcgISBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBkb2N1bWVudGVkLCBzbyBJIGRpZG4ndCBsb29rIGZvcgotIyAJCQlwcm9wZXIgcGFyYW1ldGVycy4gSXQncyBqdXN0IHRvIGhhdmUgc3R1YiBmb3IgUFJPR01BTi5FWEUgLi4uCi0jCi0KICAgMSBwYXNjYWwgICBSZWdPcGVuS2V5KGxvbmcgcHRyIHB0cikgUmVnT3BlbktleQogICAyIHBhc2NhbCAgIFJlZ0NyZWF0ZUtleShsb25nIHB0ciBwdHIpIFJlZ0NyZWF0ZUtleQogICAzIHBhc2NhbCAgIFJlZ0Nsb3NlS2V5KGxvbmcpIFJlZ0Nsb3NlS2V5CkBAIC0zMSwxMiArMjcsNSBAQAogCiAjICA4ICAgNyAgMDAwMCAgV0VQIGV4cG9ydGVkLCBzaGFyZWQgZGF0YQogIzEwMCAgIDQgIDA1NTAgIEhFUkVUSEFSQkVUWUdBUlMgZXhwb3J0ZWQsIHNoYXJlZCBkYXRhCi0jIDM4ICAgNSAgMDAwMCAgRklOREVOVklST05NRU5UU1RSSU5HIGV4cG9ydGVkLCBzaGFyZWQgZGF0YQotIyAzNyAgIDUgIDAwYWUgIERPRU5WSVJPTk1FTlRTVUJTVCBleHBvcnRlZCwgc2hhcmVkIGRhdGEKLSMgMjAgICA0ICAxMTBhICBTSEVMTEVYRUNVVEUgZXhwb3J0ZWQsIHNoYXJlZCBkYXRhCiAjMTAxICAgOCAgMDEwZSAgRklOREVYRURMR1BST0MgZXhwb3J0ZWQsIHNoYXJlZCBkYXRhCi0jIDM5ICAxMCAgMDI2ZSAgSU5URVJOQUxFWFRSQUNUSUNPTiBleHBvcnRlZCwgc2hhcmVkIGRhdGEKICMgMzIgICA5ICAwODI5ICBXQ0kgZXhwb3J0ZWQsIHNoYXJlZCBkYXRhCi0jIDM2ICAxMCAgMDhkYyAgRVhUUkFDVEFTU09DSUFURURJQ09OIGV4cG9ydGVkLCBzaGFyZWQgZGF0YQotCi0KZGlmZiAtLWdpdCBhL2lmMTYzMi9zaGVsbDMyLnNwZWMgYi9pZjE2MzIvc2hlbGwzMi5zcGVjCmluZGV4IDFlMTkxZTIuLjFlMGE1NGIgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9zaGVsbDMyLnNwZWMKKysrIGIvaWYxNjMyL3NoZWxsMzIuc3BlYwpAQCAtMSw0ICsxLDUgQEAKIG5hbWUJc2hlbGwzMgordHlwZQl3aW4zMgogYmFzZQkxCiAKIDAwMDAgc3R1YiBDaGVja0VzY2FwZXNBCmRpZmYgLS1naXQgYS9pZjE2MzIvc291bmQuc3BlYyBiL2lmMTYzMi9zb3VuZC5zcGVjCmluZGV4IDIxOTFmZGQuLjIzYjY1NmYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9zb3VuZC5zcGVjCisrKyBiL2lmMTYzMi9zb3VuZC5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQlzb3VuZAordHlwZQl3aW4xNgogaWQJNgogCiAxICBwYXNjYWwxNiBPcGVuU291bmQoKSBPcGVuU291bmQKZGlmZiAtLWdpdCBhL2lmMTYzMi9zdG9yYWdlLnNwZWMgYi9pZjE2MzIvc3RvcmFnZS5zcGVjCmluZGV4IDA4ZWZkYzMuLjJjMDNiMWUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9zdG9yYWdlLnNwZWMKKysrIGIvaWYxNjMyL3N0b3JhZ2Uuc3BlYwpAQCAtMSw0ICsxLDUgQEAKIG5hbWUJc3RvcmFnZQordHlwZQl3aW4xNgogaWQJMjMKICAKIDEgc3R1YiBTdGdDcmVhdGVEb2NGaWxlCmRpZmYgLS1naXQgYS9pZjE2MzIvc3RyZXNzLnNwZWMgYi9pZjE2MzIvc3RyZXNzLnNwZWMKaW5kZXggNzM4ZGUwMC4uNjljODMwOSAxMDA2NDQKLS0tIGEvaWYxNjMyL3N0cmVzcy5zcGVjCisrKyBiL2lmMTYzMi9zdHJlc3Muc3BlYwpAQCAtMSw2ICsxLDcgQEAKICMgc3VtbWFyeTogcmVzb3VyY2UgbW9kaWZpY2F0aW9uIGRsbAogIwogbmFtZQlzdHJlc3MKK3R5cGUJd2luMTYKIGlkCTkKIAogMiAgIHBhc2NhbCBhbGxvY21lbShsb25nKQkJQWxsb2NNZW0KZGlmZiAtLWdpdCBhL2lmMTYzMi9zeXN0ZW0uc3BlYyBiL2lmMTYzMi9zeXN0ZW0uc3BlYwppbmRleCBkZTc4MTZlLi45NzUzNjRjIDEwMDY0NAotLS0gYS9pZjE2MzIvc3lzdGVtLnNwZWMKKysrIGIvaWYxNjMyL3N5c3RlbS5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQlzeXN0ZW0KK3R5cGUJd2luMTYKIGlkCTExCiAKIDEgc3R1YiBJbnF1aXJlU3lzdGVtCmRpZmYgLS1naXQgYS9pZjE2MzIvdG9vbGhlbHAuc3BlYyBiL2lmMTYzMi90b29saGVscC5zcGVjCmluZGV4IDFjNTkwZDQuLjkwODUwNTMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi90b29saGVscC5zcGVjCisrKyBiL2lmMTYzMi90b29saGVscC5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQl0b29saGVscAordHlwZQl3aW4xNgogaWQJMTIKIAogNTAgcGFzY2FsMTYgR2xvYmFsSGFuZGxlVG9TZWwod29yZCkgR2xvYmFsSGFuZGxlVG9TZWwKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyLnNwZWMgYi9pZjE2MzIvdXNlci5zcGVjCmluZGV4IGZjYzBiMWIuLjcyMWZkZTAgMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIuc3BlYwpAQCAtMSw0ICsxLDUgQEAKIG5hbWUJdXNlcgordHlwZQl3aW4xNgogaWQJMgogCiAxICAgcGFzY2FsMTYgTWVzc2FnZUJveCh3b3JkIHB0ciBwdHIgd29yZCkgTWVzc2FnZUJveApkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIzMi5zcGVjIGIvaWYxNjMyL3VzZXIzMi5zcGVjCmluZGV4IDk5MzRjNzcuLjEzZTdhYjcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyMzIuc3BlYworKysgYi9pZjE2MzIvdXNlcjMyLnNwZWMKQEAgLTEsNCArMSw1IEBACiBuYW1lCXVzZXIzMgordHlwZQl3aW4zMgogYmFzZQkxCiAKIDAwMDAgc3R1YiBBY3RpdmF0ZUtleWJvYXJkTGF5b3V0CkBAIC01OTIsNyArNTkzLDcgQEAKIDA1ODEgc3R1YiBXaW5kb3dGcm9tUG9pbnQKIDA1ODIgc3R1YiBrZXliZF9ldmVudAogMDU4MyBzdHViIG1vdXNlX2V2ZW50Ci0wNTg0IAljZGVjbCB3c3ByaW50ZkEocHRyIHB0ciAuLi4pIHZzcHJpbnRmCiswNTg0IHN0ZGNhbGwgd3NwcmludGZBKCkgVVNFUjMyX3dzcHJpbnRmQQogMDU4NSBzdHViIHdzcHJpbnRmVwogMDU4NiBzdHViIHd2c3ByaW50ZkEKIDA1ODcgc3R1YiB3dnNwcmludGZXCmRpZmYgLS1naXQgYS9pZjE2MzIvd2luODdlbS5zcGVjIGIvaWYxNjMyL3dpbjg3ZW0uc3BlYwppbmRleCA3MTc1OWZhLi43Y2VlMTk4IDEwMDY0NAotLS0gYS9pZjE2MzIvd2luODdlbS5zcGVjCisrKyBiL2lmMTYzMi93aW44N2VtLnNwZWMKQEAgLTEsNCArMSw1IEBACiBuYW1lCXdpbjg3ZW0KK3R5cGUJd2luMTYKIGlkCTQKIAogMSByZWdpc3RlciBfZnBNYXRoKCkgV0lOODdfZnBtYXRoCmRpZmYgLS1naXQgYS9pZjE2MzIvd2lucHJvY3Muc3BlYyBiL2lmMTYzMi93aW5wcm9jcy5zcGVjCmluZGV4IGU1NjRmYTUuLjYyMjc0ZTggMTAwNjQ0Ci0tLSBhL2lmMTYzMi93aW5wcm9jcy5zcGVjCisrKyBiL2lmMTYzMi93aW5wcm9jcy5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQl3aW5wcm9jcwordHlwZQl3aW4xNgogaWQJMjQKIAogMSAgcGFzY2FsIEJ1dHRvblduZFByb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgQnV0dG9uV25kUHJvYwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dpbnByb2NzMzIuc3BlYyBiL2lmMTYzMi93aW5wcm9jczMyLnNwZWMKaW5kZXggNmJiN2IwYi4uZDQwZGFmYSAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbnByb2NzMzIuc3BlYworKysgYi9pZjE2MzIvd2lucHJvY3MzMi5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQl3aW5wcm9jczMyCit0eXBlCXdpbjMyCiAKIDEgIHN0ZGNhbGwgQnV0dG9uV25kUHJvYyhsb25nIGxvbmcgbG9uZyBsb25nKSBCdXR0b25XbmRQcm9jMzIKIDIgIHN0ZGNhbGwgU3RhdGljV25kUHJvYyhsb25nIGxvbmcgbG9uZyBsb25nKSBTdGF0aWNXbmRQcm9jMzIKZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5zb2NrLnNwZWMgYi9pZjE2MzIvd2luc29jay5zcGVjCmluZGV4IDgxM2YzNjQuLjUyOTc1MDcxIDEwMDY0NAotLS0gYS9pZjE2MzIvd2luc29jay5zcGVjCisrKyBiL2lmMTYzMi93aW5zb2NrLnNwZWMKQEAgLTQsNiArNCw3IEBACiAjICAgICAgU3VtbWFyeTogTW9kdWxlIGRlZmluaXRpb24gZmlsZSBmb3IgV2luZG93cyBTb2NrZXRzIERMTC4gIAogIyAgCiBuYW1lCXdpbnNvY2sKK3R5cGUJd2luMTYKIGlkCTgKIAogMSAgIHBhc2NhbDE2IGFjY2VwdCh3b3JkIHB0ciBwdHIpIFdJTlNPQ0tfYWNjZXB0CmRpZmYgLS1naXQgYS9pZjE2MzIvd2luc3Bvb2wuc3BlYyBiL2lmMTYzMi93aW5zcG9vbC5zcGVjCmluZGV4IGQzYWMzMTUuLjEyZTE2ZjYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93aW5zcG9vbC5zcGVjCisrKyBiL2lmMTYzMi93aW5zcG9vbC5zcGVjCkBAIC0xLDQgKzEsNSBAQAogbmFtZQl3aW5zcG9vbAordHlwZQl3aW4zMgogYmFzZQkxMDAKIAogMDAxIHN0dWIgQURWQU5DRURTRVRVUERJQUxPRwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hZHZhcGkzMi5oIGIvaW5jbHVkZS9hZHZhcGkzMi5oCmluZGV4IDYzNGMzZjQuLmQ0NTMxYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWR2YXBpMzIuaAorKysgYi9pbmNsdWRlL2FkdmFwaTMyLmgKQEAgLTIsMzAgKzIsNyBAQAogI2RlZmluZSBfX1dJTkVfQURWQVBJMzJfSAogI2luY2x1ZGUgInNoZWxsLmgiCiAjaW5jbHVkZSAia2VybmVsMzIuaCIKLSNkZWZpbmUgUkVHU0FNIGxvbmcKLUJPT0wgV0lOQVBJIEdldFVzZXJOYW1lQSAoY2hhciAqIGxwQnVmZmVyLCBEV09SRCAgKm5TaXplKTsKLVdJTkFQSSBMT05HIFJlZ0NyZWF0ZUtleUV4KEhLRVkga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1YmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvbnR1c2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5Y2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdTQU0gc2FtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1VSSVRZX0FUVFJJQlVURVMgKmF0dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEtFWSAqcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpkaXNwKTsKLVdJTkFQSSBMT05HIFJlZ1NldFZhbHVlRXhBIChIS0VZIGtleSwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgIERXT1JEIGRvbnR1c2UsCi0gICAgICAgICAgICAgICAgRFdPUkQgdHlwZSwKLSAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAotICAgICAgICAgICAgICAgIERXT1JEIGxlbgotICAgICAgICAgICAgICAgICk7Ci1XSU5BUEkgTE9ORyBSZWdRdWVyeVZhbHVlRXhBKEhLRVkga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdWJrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRvbnR1c2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICp0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpsZW4pOwogCitCT09MIFdJTkFQSSBHZXRVc2VyTmFtZUEgKGNoYXIgKiBscEJ1ZmZlciwgRFdPUkQgICpuU2l6ZSk7CiAKICNlbmRpZiAgLyogX19XSU5FX0FEVkFQSTMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWxpYXMuaCBiL2luY2x1ZGUvYWxpYXMuaAppbmRleCAyNmRhYTA0Li5jNmQ5M2UzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FsaWFzLmgKKysrIGIvaW5jbHVkZS9hbGlhcy5oCkBAIC01LDEwICs1LDE2IEBACiAgKgogICovCiAKLXR5cGVkZWYgc3RydWN0IF9GVU5DVElPTkFMSUFTewotCURXT1JECQl3aW5lOwotCURXT1JECQl3aW4xNjsKLQlEV09SRAkJd2luMzI7CisjaWZuZGVmIF9fV0lORV9BTElBU19ICisjZGVmaW5lIF9fV0lORV9BTElBU19ICisKKyNpbmNsdWRlICJ3aW50eXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIERXT1JEICB3aW5lOworICAgIERXT1JEICB3aW4xNjsKKyAgICBEV09SRCAgd2luMzI7CiB9IEZVTkNUSU9OQUxJQVM7CiAKIGV4dGVybiBpbnQgQUxJQVNfVXNlQWxpYXNlczsKQEAgLTE4LDYgKzI0LDggQEAKIAlpbnQgcmVjbm87CiB9IEFMSUFTSEFTSDsKIAotdm9pZCBBTElBU19SZWdpc3RlckFsaWFzKERXT1JELERXT1JELERXT1JEKTsKLUZVTkNUSU9OQUxJQVMqIEFMSUFTX0xvb2t1cEFsaWFzKERXT1JEKTsKK2V4dGVybiBCT09MIEFMSUFTX0luaXQodm9pZCk7CitleHRlcm4gdm9pZCBBTElBU19SZWdpc3RlckFsaWFzKCBEV09SRCBXaW5lLCBEV09SRCBXaW4xNlByb2MsIERXT1JEIFdpbjMyUHJvYyk7CitleHRlcm4gRlVOQ1RJT05BTElBUyogQUxJQVNfTG9va3VwQWxpYXMoRFdPUkQpOwogCisjZW5kaWYgIC8qIF9fV0lORV9BTElBU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2NyX2liZWFtIGIvaW5jbHVkZS9iaXRtYXBzL29jcl9pYmVhbQppbmRleCBlMzcyYTFlLi41Zjc3NTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2JpdG1hcHMvb2NyX2liZWFtCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vY3JfaWJlYW0KQEAgLTEsNiArMSw2IEBACiAvKiBYUE0gKi8KIHN0YXRpYyBjaGFyICogb2NyX2liZWFtW10gPSB7Ci0iMzIgMzIgMiAxIDMgOCIsCisiMzIgMzIgMiAxIDAgOCIsCiAiIAlzIGJsYWNrIGMgYmxhY2siLAogIi4JcyBOb25lCWMgTm9uZSIsCiAiICAgLiAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kbGxzLmggYi9pbmNsdWRlL2RsbHMuaAppbmRleCAwMGI1OTgwLi4yZTViY2JjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RsbHMuaAorKysgYi9pbmNsdWRlL2RsbHMuaApAQCAtMSwzNCArMSwzNSBAQAotLyogJElkOiBkbGxzLmgsdiAxLjIgMTk5My8wNy8wNCAwNDowNDoyMSByb290IEV4cCByb290ICQKLSAqLwogLyoKICAqIENvcHlyaWdodCAgUm9iZXJ0IEouIEFtc3RhZHQsIDE5OTMKICAqLwogCi0jaWZuZGVmIERMTFNfSAotI2RlZmluZSBETExTX0gKKyNpZm5kZWYgX19XSU5FX0RMTFNfSAorI2RlZmluZSBfX1dJTkVfRExMU19ICiAKICNpbmNsdWRlICJ3aW50eXBlcy5oIgogCi0jZGVmaW5lIE1BWF9OQU1FX0xFTkdUSAkJNjQKIAotCi1zdHJ1Y3QgZGxsX3RhYmxlX3MKK3R5cGVkZWYgc3RydWN0IGRsbF90YWJsZV9zCiB7Ci0gICAgY2hhciAqICBuYW1lOyAgICAgICAgICAvKiBETEwgbmFtZSAqLwotICAgIEJZVEUgKiAgY29kZV9zdGFydDsgICAgLyogMzItYml0IGFkZHJlc3Mgb2YgRExMIGNvZGUgKi8KLSAgICBCWVRFICogIGRhdGFfc3RhcnQ7ICAgIC8qIDMyLWJpdCBhZGRyZXNzIG9mIERMTCBkYXRhICovCi0gICAgQllURSAqICBtb2R1bGVfc3RhcnQ7ICAvKiAzMi1iaXQgYWRkcmVzcyBvZiB0aGUgbW9kdWxlIGRhdGEgKi8KLSAgICBCWVRFICogIG1vZHVsZV9lbmQ7Ci0gICAgQk9PTCAgICB1c2VkOyAgICAgICAgICAvKiB1c2UgTVMgcHJvdmlkZWQgaWYgRkFMU0UgKi8KLSAgICBITU9EVUxFIGhNb2R1bGU7ICAgICAgIC8qIG1vZHVsZSBjcmVhdGVkIGZvciB0aGlzIERMTCAqLwotfTsKKyAgICBjaGFyICAgICAgICpuYW1lOyAgICAgICAgICAvKiBETEwgbmFtZSAqLworICAgIGNvbnN0IEJZVEUgKmNvZGVfc3RhcnQ7ICAgIC8qIDMyLWJpdCBhZGRyZXNzIG9mIERMTCBjb2RlICovCisgICAgY29uc3QgQllURSAqZGF0YV9zdGFydDsgICAgLyogMzItYml0IGFkZHJlc3Mgb2YgRExMIGRhdGEgKi8KKyAgICBCWVRFICAgICAgICptb2R1bGVfc3RhcnQ7ICAvKiAzMi1iaXQgYWRkcmVzcyBvZiB0aGUgbW9kdWxlIGRhdGEgKi8KKyAgICBCWVRFICAgICAgICptb2R1bGVfZW5kOworICAgIGludCAgICAgICAgIGZsYWdzOyAgICAgICAgIC8qIGZsYWdzIChzZWUgYmVsb3cpICovCisgICAgSE1PRFVMRSAgICAgaE1vZHVsZTsgICAgICAgLyogbW9kdWxlIGNyZWF0ZWQgZm9yIHRoaXMgRExMICovCit9IEJVSUxUSU5fRExMOworCisvKiBETEwgZmxhZ3MgKi8KKyNkZWZpbmUgRExMX0ZMQUdfTk9UX1VTRUQgICAgMSAgLyogVXNlIG9yaWdpbmFsIFdpbmRvd3MgRExMIGlmIHBvc3NpYmxlICovCisjZGVmaW5lIERMTF9GTEFHX1dJTjMyICAgICAgIDIgIC8qIERMTCBpcyBhIFdpbjMyIERMTCAqLwogCiAjZGVmaW5lIERFQ0xBUkVfRExMKG5hbWUpIFwKLWV4dGVybiBCWVRFIG5hbWUjI19Db2RlX1N0YXJ0W107IFwKLWV4dGVybiBCWVRFIG5hbWUjI19EYXRhX1N0YXJ0W107IFwKK2V4dGVybiBjb25zdCBCWVRFIG5hbWUjI19Db2RlX1N0YXJ0W107IFwKK2V4dGVybiBjb25zdCBCWVRFIG5hbWUjI19EYXRhX1N0YXJ0W107IFwKIGV4dGVybiBCWVRFIG5hbWUjI19Nb2R1bGVfU3RhcnRbXTsgXAogZXh0ZXJuIEJZVEUgbmFtZSMjX01vZHVsZV9FbmRbXTsKIAorLyogMTYtYml0IERMTHMgKi8KIERFQ0xBUkVfRExMKEtFUk5FTCkKIERFQ0xBUkVfRExMKFVTRVIpCiBERUNMQVJFX0RMTChHREkpCkBAIC01Niw4ICs1NywxOSBAQAogREVDTEFSRV9ETEwoRERFTUwpCiBERUNMQVJFX0RMTChMWkVYUEFORCkKIAotI2RlZmluZSBOX0JVSUxUSU5TCTI2CisvKiAzMi1iaXQgRExMcyAqLwogCi1leHRlcm4gc3RydWN0IGRsbF90YWJsZV9zIGRsbF9idWlsdGluX3RhYmxlW107CitERUNMQVJFX0RMTChBRFZBUEkzMikKK0RFQ0xBUkVfRExMKENPTUNUTDMyKQorREVDTEFSRV9ETEwoQ09NRExHMzIpCitERUNMQVJFX0RMTChPTEUzMikKK0RFQ0xBUkVfRExMKEdESTMyKQorREVDTEFSRV9ETEwoS0VSTkVMMzIpCitERUNMQVJFX0RMTChTSEVMTDMyKQorREVDTEFSRV9ETEwoVVNFUjMyKQorREVDTEFSRV9ETEwoV0lOUFJPQ1MzMikKK0RFQ0xBUkVfRExMKFdJTlNQT09MKQogCi0jZW5kaWYgLyogRExMU19IICovCitleHRlcm4gQlVJTFRJTl9ETEwgZGxsX2J1aWx0aW5fdGFibGVbXTsKKworI2VuZGlmIC8qIF9fV0lORV9ETExTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUva2VybmVsMzIuaCBiL2luY2x1ZGUva2VybmVsMzIuaAppbmRleCAxYjBmZWJjLi4yYTA3OGQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2tlcm5lbDMyLmgKKysrIGIvaW5jbHVkZS9rZXJuZWwzMi5oCkBAIC05MiwyMCArOTIsNiBAQAogI2RlZmluZSBTVERfT1VUUFVUX0hBTkRMRSAgICAgICAoKERXT1JEKSAtMTEpCiAjZGVmaW5lIFNURF9FUlJPUl9IQU5ETEUgICAgICAgICgoRFdPUkQpIC0xMikKIAotLyogVGhlIHNlY3VyaXR5IGF0dHJpYnV0ZXMgc3RydWN0dXJlIAotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgRFdPUkQgbkxlbmd0aDsKLSAgICB2b2lkICpscFNlY3VyaXR5RGVzY3JpcHRvcjsKLSAgICBCT09MIGJJbmhlcml0SGFuZGxlOwotfSBTRUNVUklUWV9BVFRSSUJVVEVTLCAqTFBTRUNVUklUWV9BVFRSSUJVVEVTOwotCi10eXBlZGVmIHN0cnVjdAotewotICBpbnQgZHdMb3dEYXRlVGltZTsKLSAgaW50IGR3SGlnaERhdGVUaW1lOwotfSBGSUxFVElNRTsKLQogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgaW50IGR3RmlsZUF0dHJpYnV0ZXM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lbnUuaCBiL2luY2x1ZGUvbWVudS5oCmluZGV4IDQxZjIwNDcuLjMyYzRmZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVudS5oCisrKyBiL2luY2x1ZGUvbWVudS5oCkBAIC0xMiw3ICsxMiw3IEBACiBleHRlcm4gVUlOVCBNRU5VX0dldE1lbnVCYXJIZWlnaHQoIEhXTkQgaHduZCwgVUlOVCBtZW51YmFyV2lkdGgsCiAJCQkJICAgaW50IG9yZ1gsIGludCBvcmdZICk7ICAgICAgICAgLyogbWVudS5jICovCiBleHRlcm4gdm9pZCBNRU5VX1RyYWNrTW91c2VNZW51QmFyKCBIV05EIGh3bmQsIFBPSU5UIHB0ICk7ICAgICAgIC8qIG1lbnUuYyAqLwotZXh0ZXJuIHZvaWQgTUVOVV9UcmFja0tiZE1lbnVCYXIoIEhXTkQgaHduZCwgVUlOVCB3UGFyYW0gKTsgICAgICAvKiBtZW51LmMgKi8KK2V4dGVybiB2b2lkIE1FTlVfVHJhY2tLYmRNZW51QmFyKCBXTkQqLCBVSU5UIHdQYXJhbSwgSU5UIHZrZXkpOyAgLyogbWVudS5jICovCiBleHRlcm4gVUlOVCBNRU5VX0RyYXdNZW51QmFyKCBIREMgaERDLCBMUFJFQ1QgbHByZWN0LAogCQkJICAgICAgSFdORCBod25kLCBCT09MIHN1cHByZXNzX2RyYXcgKTsgICAvKiBtZW51LmMgKi8KIGV4dGVybiBMUkVTVUxUIFBvcHVwTWVudVduZFByb2MoSFdORCBod25kLFVJTlQgbWVzc2FnZSxXUEFSQU0gd1BhcmFtLExQQVJBTSBsUGFyYW0gKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWlzY2VtdS5oIGIvaW5jbHVkZS9taXNjZW11LmgKaW5kZXggYWY2YjA2MS4uMGVlMzVmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9taXNjZW11LmgKKysrIGIvaW5jbHVkZS9taXNjZW11LmgKQEAgLTEyLDcgKzEyLDcgQEAKIAogICAvKiBtaXNjZW11L2Rvc21lbS5jICovCiBleHRlcm4gQk9PTCBET1NNRU1fSW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIERPU01FTV9BbGFybSh2b2lkKTsKK2V4dGVybiB2b2lkIERPU01FTV9UaWNrKHZvaWQpOwogZXh0ZXJuIHZvaWQgRE9TTUVNX0ZpbGxCaW9zU2VnbWVudCh2b2lkKTsKIGV4dGVybiBIQU5ETEUgRE9TTUVNX0Jpb3NTZWc7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW9kdWxlLmggYi9pbmNsdWRlL21vZHVsZS5oCmluZGV4IGMxOWY3NjQuLmJjMjNlMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9tb2R1bGUuaApAQCAtMTA1LDEwICsxMDUsMTIgQEAKIGV4dGVybiBpbnQgTU9EVUxFX09wZW5GaWxlKCBITU9EVUxFIGhNb2R1bGUgKTsKIGV4dGVybiBMUFNUUiBNT0RVTEVfR2V0TW9kdWxlTmFtZSggSE1PRFVMRSBoTW9kdWxlICk7CiBleHRlcm4gdm9pZCBNT0RVTEVfUmVnaXN0ZXJNb2R1bGUoIEhNT0RVTEUgaE1vZHVsZSApOwotZXh0ZXJuIFdPUkQgTU9EVUxFX0dldE9yZGluYWwoIEhNT0RVTEUgaE1vZHVsZSwgY2hhciAqbmFtZSApOworZXh0ZXJuIFdPUkQgTU9EVUxFX0dldE9yZGluYWwoIEhNT0RVTEUgaE1vZHVsZSwgY29uc3QgY2hhciAqbmFtZSApOwogZXh0ZXJuIFNFR1BUUiBNT0RVTEVfR2V0RW50cnlQb2ludCggSE1PRFVMRSBoTW9kdWxlLCBXT1JEIG9yZGluYWwgKTsKIGV4dGVybiBCT09MIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBITU9EVUxFIGhNb2R1bGUsIFdPUkQgb3JkaW5hbCwgV09SRCBvZmZzZXQgKTsKIGV4dGVybiBMUFNUUiBNT0RVTEVfR2V0RW50cnlQb2ludE5hbWUoIEhNT0RVTEUgaE1vZHVsZSwgV09SRCBvcmRpbmFsICk7CitleHRlcm4gRkFSUFJPQyBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoIGNvbnN0IGNoYXIgKm5hbWUgKTsKK2V4dGVybiBGQVJQUk9DIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkzMiggY29uc3QgY2hhciAqbmFtZSApOwogCiBleHRlcm4gQk9PTCBORV9Mb2FkU2VnbWVudCggSE1PRFVMRSBoTW9kdWxlLCBXT1JEIHNlZ251bSApOwogZXh0ZXJuIHZvaWQgTkVfRml4dXBQcm9sb2dzKCBITU9EVUxFIGhNb2R1bGUgKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmVleGUuaCBiL2luY2x1ZGUvbmVleGUuaAppbmRleCBlOGM0NjBjLi4wOTYwNTBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25lZXhlLmgKKysrIGIvaW5jbHVkZS9uZWV4ZS5oCkBAIC0yNiwzOCArMjYsMzggQEAKICAqLwogc3RydWN0IG5lX2hlYWRlcl9zCiB7Ci0gICAgV09SRCAgbmVfbWFnaWM7ICAgICAgICAgICAvKiBORSBzaWduYXR1cmUgJ05FJyAqLwotICAgIEJZVEUgIGxpbmtlcl92ZXJzaW9uOwkvKiBMaW5rZXIgdmVyc2lvbiBudW1iZXIJCSovCi0gICAgQllURSAgbGlua2VyX3JldmlzaW9uOwkvKiBMaW5rZXIgcmV2aXNpb24gbnVtYmVyCQkqLwotICAgIFdPUkQgIGVudHJ5X3RhYl9vZmZzZXQ7CS8qIE9mZnNldCB0byBlbnRyeSB0YWJsZSByZWxhdGl2ZSB0byBORSAqLwotICAgIFdPUkQgIGVudHJ5X3RhYl9sZW5ndGg7CS8qIExlbmd0aCBvZiBlbnRyeSB0YWJsZSBpbiBieXRlcwkqLwotICAgIERXT1JEIHJlc2VydmVkMTsJCS8qIFJlc2VydmVkIGJ5IE1pY3Jvc29mdAkJKi8KLSAgICBXT1JEICBmb3JtYXRfZmxhZ3M7CS8qIEZsYWdzIGFib3V0IHNlZ21lbnRzIGluIHRoaXMgZmlsZQkqLwotICAgIFdPUkQgIGF1dG9fZGF0YV9zZWc7CS8qIEF1dG9tYXRpYyBkYXRhIHNlZ21lbnQgbnVtYmVyCSovCi0gICAgV09SRCAgbG9jYWxfaGVhcF9sZW5ndGg7CS8qIEluaXRpYWwgc2l6ZSBvZiBsb2NhbCBoZWFwCQkqLwotICAgIFdPUkQgIHN0YWNrX2xlbmd0aDsJLyogSW5pdGlhbCBzaXplIG9mIHN0YWNrCQkqLwotICAgIFdPUkQgIGlwOwkJCS8qIEluaXRpYWwgSVAJCQkJKi8KLSAgICBXT1JEICBjczsJCQkvKiBJbml0aWFsIENTCQkJCSovCi0gICAgV09SRCAgc3A7CQkJLyogSW5pdGlhbCBTUAkJCQkqLwotICAgIFdPUkQgIHNzOwkJCS8qIEluaXRpYWwgU1MJCQkJKi8KLSAgICBXT1JEICBuX3NlZ21lbnRfdGFiOwkvKiAjIG9mIGVudHJpZXMgaW4gc2VnbWVudCB0YWJsZQkqLwotICAgIFdPUkQgIG5fbW9kX3JlZl90YWI7CS8qICMgb2YgZW50cmllcyBpbiBtb2R1bGUgcmVmZXJlbmNlIHRhYi4qLwotICAgIFdPUkQgIG5ybmFtZV90YWJfbGVuZ3RoOyAJLyogTGVuZ3RoIG9mIG5vbnJlc2lkZW50LW5hbWUgdGFibGUgICAgICovCi0gICAgV09SRCAgc2VnbWVudF90YWJfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gc2VnbWVudCB0YWJsZQkJKi8KLSAgICBXT1JEICByZXNvdXJjZV90YWJfb2Zmc2V0Oy8qIE9mZnNldCB0byByZXNvdXJjZSB0YWJsZQkJKi8KLSAgICBXT1JEICBybmFtZV90YWJfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gcmVzaWRlbnQtbmFtZSB0YWJsZQkqLwotICAgIFdPUkQgIG1vZHVsZXJlZl90YWJfb2Zmc2V0Oy8qIE9mZnNldCB0byBtb2R1bGUgcmVmZXJlbmNlIHRhYmxlCSovCi0gICAgV09SRCAgaW5hbWVfdGFiX29mZnNldDsJLyogT2Zmc2V0IHRvIGltcG9ydGVkIG5hbWUgdGFibGUJKi8KLSAgICBEV09SRCBucm5hbWVfdGFiX29mZnNldDsJLyogT2Zmc2V0IHRvIG5vbnJlc2lkZW50LW5hbWUgdGFibGUJKi8KLSAgICBXT1JEICBuX21vdl9lbnRyeV9wb2ludHM7CS8qICMgb2YgbW92YWJsZSBlbnRyeSBwb2ludHMJCSovCi0gICAgV09SRCAgYWxpZ25fc2hpZnRfY291bnQ7CS8qIExvZ2ljYWwgc2VjdG9yIGFsaWdubWVudCBzaGlmdCBjb3VudCAqLwotICAgIFdPUkQgIG5fcmVzb3VyY2Vfc2VnOwkvKiAjIG9mIHJlc291cmNlIHNlZ21lbnRzCQkqLwotICAgIEJZVEUgIG9wZXJhdGluZ19zeXN0ZW07CS8qIEZsYWdzIGluZGljYXRpbmcgdGFyZ2V0IE9TCQkqLwotICAgIEJZVEUgIGFkZGl0aW9uYWxfZmxhZ3M7CS8qIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZmxhZ3MJCSovCi0gICAgV09SRCAgZmFzdGxvYWRfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gZmFzdCBsb2FkIGFyZWEJCSovCi0gICAgV09SRCAgZmFzdGxvYWRfbGVuZ3RoOwkvKiBMZW5ndGggb2YgZmFzdCBsb2FkIGFyZWEJCSovCi0gICAgV09SRCAgcmVzZXJ2ZWQyOwkJLyogUmVzZXJ2ZWQgYnkgTWljcm9zb2Z0CQkqLwotICAgIFdPUkQgIGV4cGVjdF92ZXJzaW9uOwkvKiBFeHBlY3RlZCBXaW5kb3dzIHZlcnNpb24gbnVtYmVyCSovCisgICAgV09SRCAgbmVfbWFnaWM7ICAgICAgICAgICAgIC8qIDAwIE5FIHNpZ25hdHVyZSAnTkUnICovCisgICAgQllURSAgbGlua2VyX3ZlcnNpb247CS8qIDAyIExpbmtlciB2ZXJzaW9uIG51bWJlciAqLworICAgIEJZVEUgIGxpbmtlcl9yZXZpc2lvbjsJLyogMDMgTGlua2VyIHJldmlzaW9uIG51bWJlciAqLworICAgIFdPUkQgIGVudHJ5X3RhYl9vZmZzZXQ7CS8qIDA0IE9mZnNldCB0byBlbnRyeSB0YWJsZSByZWxhdGl2ZSB0byBORSAqLworICAgIFdPUkQgIGVudHJ5X3RhYl9sZW5ndGg7CS8qIDA2IExlbmd0aCBvZiBlbnRyeSB0YWJsZSBpbiBieXRlcyAqLworICAgIERXT1JEIHJlc2VydmVkMTsJCS8qIDA4IFJlc2VydmVkIGJ5IE1pY3Jvc29mdCAqLworICAgIFdPUkQgIGZvcm1hdF9mbGFnczsgICAgICAgICAvKiAwYyBGbGFncyBhYm91dCBzZWdtZW50cyBpbiB0aGlzIGZpbGUgKi8KKyAgICBXT1JEICBhdXRvX2RhdGFfc2VnOwkvKiAwZSBBdXRvbWF0aWMgZGF0YSBzZWdtZW50IG51bWJlciAqLworICAgIFdPUkQgIGxvY2FsX2hlYXBfbGVuZ3RoOwkvKiAxMCBJbml0aWFsIHNpemUgb2YgbG9jYWwgaGVhcCAqLworICAgIFdPUkQgIHN0YWNrX2xlbmd0aDsgICAgICAgICAvKiAxMiBJbml0aWFsIHNpemUgb2Ygc3RhY2sgKi8KKyAgICBXT1JEICBpcDsJCQkvKiAxNCBJbml0aWFsIElQICovCisgICAgV09SRCAgY3M7CQkJLyogMTYgSW5pdGlhbCBDUyAqLworICAgIFdPUkQgIHNwOwkJCS8qIDE4IEluaXRpYWwgU1AgKi8KKyAgICBXT1JEICBzczsJCQkvKiAxYSBJbml0aWFsIFNTICovCisgICAgV09SRCAgbl9zZWdtZW50X3RhYjsJLyogMWMgIyBvZiBlbnRyaWVzIGluIHNlZ21lbnQgdGFibGUgKi8KKyAgICBXT1JEICBuX21vZF9yZWZfdGFiOwkvKiAxZSAjIG9mIGVudHJpZXMgaW4gbW9kdWxlIHJlZmVyZW5jZSB0YWIuICovCisgICAgV09SRCAgbnJuYW1lX3RhYl9sZW5ndGg7IAkvKiAyMCBMZW5ndGggb2Ygbm9ucmVzaWRlbnQtbmFtZSB0YWJsZSAgICAgKi8KKyAgICBXT1JEICBzZWdtZW50X3RhYl9vZmZzZXQ7CS8qIDIyIE9mZnNldCB0byBzZWdtZW50IHRhYmxlICovCisgICAgV09SRCAgcmVzb3VyY2VfdGFiX29mZnNldDsgIC8qIDI0IE9mZnNldCB0byByZXNvdXJjZSB0YWJsZSAqLworICAgIFdPUkQgIHJuYW1lX3RhYl9vZmZzZXQ7CS8qIDI2IE9mZnNldCB0byByZXNpZGVudC1uYW1lIHRhYmxlICovCisgICAgV09SRCAgbW9kdWxlcmVmX3RhYl9vZmZzZXQ7IC8qIDI4IE9mZnNldCB0byBtb2R1bGUgcmVmZXJlbmNlIHRhYmxlICovCisgICAgV09SRCAgaW5hbWVfdGFiX29mZnNldDsJLyogMmEgT2Zmc2V0IHRvIGltcG9ydGVkIG5hbWUgdGFibGUgKi8KKyAgICBEV09SRCBucm5hbWVfdGFiX29mZnNldDsJLyogMmMgT2Zmc2V0IHRvIG5vbnJlc2lkZW50LW5hbWUgdGFibGUgKi8KKyAgICBXT1JEICBuX21vdl9lbnRyeV9wb2ludHM7CS8qIDMwICMgb2YgbW92YWJsZSBlbnRyeSBwb2ludHMgKi8KKyAgICBXT1JEICBhbGlnbl9zaGlmdF9jb3VudDsJLyogMzIgTG9naWNhbCBzZWN0b3IgYWxpZ25tZW50IHNoaWZ0IGNvdW50ICovCisgICAgV09SRCAgbl9yZXNvdXJjZV9zZWc7CS8qIDM0ICMgb2YgcmVzb3VyY2Ugc2VnbWVudHMgKi8KKyAgICBCWVRFICBvcGVyYXRpbmdfc3lzdGVtOwkvKiAzNiBGbGFncyBpbmRpY2F0aW5nIHRhcmdldCBPUyAqLworICAgIEJZVEUgIGFkZGl0aW9uYWxfZmxhZ3M7CS8qIDM3IEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZmxhZ3MgKi8KKyAgICBXT1JEICBmYXN0bG9hZF9vZmZzZXQ7CS8qIDM4IE9mZnNldCB0byBmYXN0IGxvYWQgYXJlYSAqLworICAgIFdPUkQgIGZhc3Rsb2FkX2xlbmd0aDsJLyogM2EgTGVuZ3RoIG9mIGZhc3QgbG9hZCBhcmVhICovCisgICAgV09SRCAgcmVzZXJ2ZWQyOwkJLyogM2MgUmVzZXJ2ZWQgYnkgTWljcm9zb2Z0ICovCisgICAgV09SRCAgZXhwZWN0X3ZlcnNpb247CS8qIDNlIEV4cGVjdGVkIFdpbmRvd3MgdmVyc2lvbiBudW1iZXIgKi8KIH07CiAKICNkZWZpbmUgTkVfU0lHTkFUVVJFICAoJ04nIHwgKCdFJyA8PCA4KSkKQEAgLTY4LDkgKzY4LDExIEBACiAgKi8KICNkZWZpbmUgTkVfRkZMQUdTX1NJTkdMRURBVEEJMHgwMDAxCiAjZGVmaW5lIE5FX0ZGTEFHU19NVUxUSVBMRURBVEEJMHgwMDAyCi0jZGVmaW5lIE5FX0ZGTEFHU19CVUlMVElOICAgICAgIDB4MDAxMCAgLyogV2luZSBidWlsdC1pbiBtb2R1bGUgKi8KKyNkZWZpbmUgTkVfRkZMQUdTX1dJTjMyICAgICAgICAgMHgwMDEwCisjZGVmaW5lIE5FX0ZGTEFHU19CVUlMVElOICAgICAgIDB4MDAyMCAgLyogV2luZSBidWlsdC1pbiBtb2R1bGUgKi8KICNkZWZpbmUgTkVfRkZMQUdTX1NFTEZMT0FECTB4MDgwMAogI2RlZmluZSBORV9GRkxBR1NfTElOS0VSUk9SCTB4MjAwMAorI2RlZmluZSBORV9GRkxBR1NfQ0FMTFdFUCAgICAgICAweDQwMDAKICNkZWZpbmUgTkVfRkZMQUdTX0xJQk1PRFVMRQkweDgwMDAKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbm9uY2xpZW50LmggYi9pbmNsdWRlL25vbmNsaWVudC5oCmluZGV4IGQyY2E4YWIuLmM4OTAyMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbm9uY2xpZW50LmgKKysrIGIvaW5jbHVkZS9ub25jbGllbnQuaApAQCAtMTIsOCArMTIsOCBAQAogZXh0ZXJuIHZvaWQgTkNfR2V0SW5zaWRlUmVjdCggSFdORCBod25kLCBSRUNUICpyZWN0ICk7CiBleHRlcm4gdm9pZCBOQ19HZXRNaW5NYXhJbmZvKCBIV05EIGh3bmQsIFBPSU5UICptYXhTaXplLCBQT0lOVCAqbWF4UG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9JTlQgKm1pblRyYWNrLCBQT0lOVCAqbWF4VHJhY2sgKTsKLWV4dGVybiB2b2lkIE5DX0RvTkNQYWludCggSFdORCBod25kLCBCT09MIGFjdGl2ZSwgQk9PTCBzdXBwcmVzc19tZW51cGFpbnQgKTsKLWV4dGVybiBMT05HIE5DX0hhbmRsZU5DUGFpbnQoIEhXTkQgaHduZCApOworZXh0ZXJuIHZvaWQgTkNfRG9OQ1BhaW50KCBIV05EIGh3bmQsIEhSR04gY2xpcCwgQk9PTCBzdXBwcmVzc19tZW51cGFpbnQgKTsKK2V4dGVybiBMT05HIE5DX0hhbmRsZU5DUGFpbnQoIEhXTkQgaHduZCAsIEhSR04gY2xpcCk7CiBleHRlcm4gTE9ORyBOQ19IYW5kbGVOQ0FjdGl2YXRlKCBIV05EIGh3bmQsIFdQQVJBTSB3UGFyYW0gKTsKIGV4dGVybiBMT05HIE5DX0hhbmRsZU5DQ2FsY1NpemUoIEhXTkQgaHduZCwgTkNDQUxDU0laRV9QQVJBTVMgKnBhcmFtcyApOwogZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNIaXRUZXN0KCBIV05EIGh3bmQsIFBPSU5UIHB0ICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wdGlvbnMuaCBiL2luY2x1ZGUvb3B0aW9ucy5oCmluZGV4IDE1MTNhM2EuLmMxYjZmMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvb3B0aW9ucy5oCisrKyBiL2luY2x1ZGUvb3B0aW9ucy5oCkBAIC0xOCw3ICsxOCw4IEBACiAgICAgTEFOR19GaSwgIC8qIEZpbm5pc2ggKi8KICAgICBMQU5HX0RhLCAgLyogRGFuaXNoICovCiAgICAgTEFOR19DeiwgIC8qIEN6ZWNoICovCi0gICAgTEFOR19FbyAgIC8qIEVzcGVyYW50byAqLworICAgIExBTkdfRW8sICAvKiBFc3BlcmFudG8gKi8KKyAgICBMQU5HX0l0ICAgLyogSXRhbGlhbiAqLwogfSBXSU5FX0xBTkdVQUdFOwogCiAvKiBTdXBwb3J0ZWQgbW9kZXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGVfaW1hZ2UuaCBiL2luY2x1ZGUvcGVfaW1hZ2UuaAppbmRleCA5NDRkMmZmLi43OTkzOTJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BlX2ltYWdlLmgKKysrIGIvaW5jbHVkZS9wZV9pbWFnZS5oCkBAIC0yNSwxMyArMjUsMTEgQEAKIHR5cGVkZWYgc3RydWN0IF9XSU4zMl9idWlsdGluewogICAgIGNoYXIgKm5hbWU7CiAgICAgV0lOMzJfZnVuY3Rpb24gKmZ1bmN0aW9uczsKLSAgICBpbnQgc2l6ZTsKLQlpbnQgYmFzZTsKKyAgICBXSU4zMl9mdW5jdGlvbiAqbGFzdF9mdW5jOworICAgIGNvbnN0IGludCAqYmFzZTsKICAgICBzdHJ1Y3QgX1dJTjMyX2J1aWx0aW4gKm5leHQ7CiB9IFdJTjMyX2J1aWx0aW47CiAKLWV4dGVybiBXSU4zMl9idWlsdGluICpXSU4zMl9idWlsdGluX2xpc3Q7Ci0KIHN0cnVjdCB3X2ZpbGVzCiB7CiAgICAgc3RydWN0IHdfZmlsZXMgICogbmV4dDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2VsZWN0b3JzLmggYi9pbmNsdWRlL3NlbGVjdG9ycy5oCmluZGV4IGQwNmYxM2QuLmU4MjZkOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2VsZWN0b3JzLmgKKysrIGIvaW5jbHVkZS9zZWxlY3RvcnMuaApAQCAtMTcsOCArMTcsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHNlZ190eXBlIHR5cGUsIEJPT0wgaXMzMmJpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCByZWFkb25seSApOwogCi1leHRlcm4gdm9pZCBDcmVhdGVTZWxlY3RvcnModm9pZCk7Ci0KLWV4dGVybiBXTkRQUk9DIEdldFduZFByb2NFbnRyeTE2KCBjaGFyICpuYW1lICk7Ci0KICNlbmRpZiAvKiBfX1dJTkVfU0VMRUNUT1JTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2hlbGwuaCBiL2luY2x1ZGUvc2hlbGwuaAppbmRleCA0ODFmMTQ5Li5kMjhjYWJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NoZWxsLmgKKysrIGIvaW5jbHVkZS9zaGVsbC5oCkBAIC03LDExICs3LDEyIEBACiAjZGVmaW5lIF9fV0lORV9TSEVMTF9ICiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2lucmVnLmgiCiAKIGV4dGVybiBJTlQgU2hlbGxBYm91dChIV05EIGhXbmQsIExQQ1NUUiBzekFwcCwgTFBDU1RSIHN6T3RoZXJTdHVmZiwgSElDT04gaEljb24pOwogZXh0ZXJuIHZvaWQgU0hFTExfTG9hZFJlZ2lzdHJ5KCk7CiBleHRlcm4gdm9pZCBTSEVMTF9TYXZlUmVnaXN0cnkoKTsKLWV4dGVybiBCT09MIFNIRUxMX0luaXQoKTsKK2V4dGVybiB2b2lkIFNIRUxMX0luaXQoKTsKIAogI2RlZmluZSBTSEVMTF9FUlJPUl9TVUNDRVNTICAgICAgICAgICAwTAogI2RlZmluZSBTSEVMTF9FUlJPUl9CQUREQiAgICAgICAgICAgICAxTApAQCAtMjMsMjAgKzI0LDYgQEAKICNkZWZpbmUgU0hFTExfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgN0wKICNkZWZpbmUgU0hFTExfRVJST1JfQUNDRVNTX0RFTklFRCAgICAgOEwKIAotI2RlZmluZSBSRUdfU1ogICAgICAgICAgICAgICAgICAxICAgICAgICAgICAvKiBzdHJpbmcgdHlwZSAqLwotCi0jZGVmaW5lIEhLRVlfQ0xBU1NFU19ST09UICAgICAgIDEKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnS0VZU1RSVUNUIHsKLQlIS0VZCQloS2V5OwotCUxQU1RSCQlscFN1YktleTsKLQlEV09SRAkJZHdUeXBlOwotCUxQU1RSCQlscFZhbHVlOwotCXN0cnVjdCB0YWdLRVlTVFJVQ1QgKmxwUHJldktleTsKLQlzdHJ1Y3QgdGFnS0VZU1RSVUNUICpscE5leHRLZXk7Ci0Jc3RydWN0IHRhZ0tFWVNUUlVDVCAqbHBTdWJMdmw7Ci19IEtFWVNUUlVDVCwgKkxQS0VZU1RSVUNUOwotCiB0eXBlZGVmIHN0cnVjdCB7IAkgICAvKiBzdHJ1Y3R1cmUgZm9yIGRyb3BwZWQgZmlsZXMgKi8gCiAJV09SRAkJd1NpemU7CiAJUE9JTlQJCXB0TW91c2VQb3M7ICAgCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0cmluZzMyLmggYi9pbmNsdWRlL3N0cmluZzMyLmgKaW5kZXggYTUwYmIwMS4uZWFhZGVmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdHJpbmczMi5oCisrKyBiL2luY2x1ZGUvc3RyaW5nMzIuaApAQCAtMTAsMTMgKzEwLDE1IEBACiAKICNpbmNsdWRlICJ3aW50eXBlcy5oIgogCi1pbnQgU1RSSU5HMzJfVW5pTGVuKExQV1NUUiBzKTsKLXZvaWQgU1RSSU5HMzJfVW5pVG9BbnNpKExQU1RSIGRlc3QsTFBDV1NUUiBzcmMpOwotdm9pZCBTVFJJTkczMl9BbnNpVG9VbmkoTFBXU1RSIGRlc3QsTFBDU1RSIHNyYyk7Ci1MUFNUUiBTVFJJTkczMl9EdXBVbmlUb0Fuc2koTFBDV1NUUiBzcmMpOwotTFBXU1RSIFNUUklORzMyX0R1cEFuc2lUb1VuaShMUENTVFIgc3JjKTsKLWludCBTVFJJTkczMl9sc3RyY21wblcoTFBDV1NUUiBhLExQQ1dTVFIgYixEV09SRCBsZW4pOwotaW50IFNUUklORzMyX2xzdHJjbXBuaVcoTFBDV1NUUiBhLExQQ1dTVFIgYixEV09SRCBsZW4pOwotRFdPUkQgU1RSSU5HMzJfbHN0cmxlblcoTFBDV1NUUik7CitpbnQJU1RSSU5HMzJfVW5pTGVuKExQQ1dTVFIgcyk7Cit2b2lkCVNUUklORzMyX1VuaVRvQW5zaShMUFNUUiBkZXN0LExQQ1dTVFIgc3JjKTsKK3ZvaWQJU1RSSU5HMzJfQW5zaVRvVW5pKExQV1NUUiBkZXN0LExQQ1NUUiBzcmMpOworTFBTVFIJU1RSSU5HMzJfRHVwVW5pVG9BbnNpKExQQ1dTVFIgc3JjKTsKK0xQV1NUUglTVFJJTkczMl9EdXBBbnNpVG9VbmkoTFBDU1RSIHNyYyk7CitpbnQJU1RSSU5HMzJfbHN0cmNtcG5XKExQQ1dTVFIgYSxMUENXU1RSIGIsRFdPUkQgbGVuKTsKK2ludAlTVFJJTkczMl9sc3RyY21wbmlXKExQQ1dTVFIgYSxMUENXU1RSIGIsRFdPUkQgbGVuKTsKK0RXT1JECVNUUklORzMyX2xzdHJsZW5XKExQQ1dTVFIpOworTFBXU1RSCVNUUklORzMyX3N0cmR1cFcoTFBDV1NUUik7CitpbnQJU1RSSU5HMzJfbHN0cmNtcFcoTFBDV1NUUixMUENXU1RSKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbi5oIGIvaW5jbHVkZS93aW4uaAppbmRleCA0M2IzZmE2Li5hNGVjZjFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbi5oCisrKyBiL2luY2x1ZGUvd2luLmgKQEAgLTgyLDcgKzgyLDcgQEAKIGV4dGVybiBXaW5kb3cgV0lOX0dldFhXaW5kb3coIEhXTkQgaHduZCApOwogZXh0ZXJuIEJPT0wgV0lOX1VubGlua1dpbmRvdyggSFdORCBod25kICk7CiBleHRlcm4gQk9PTCBXSU5fTGlua1dpbmRvdyggSFdORCBod25kLCBIV05EIGh3bmRJbnNlcnRBZnRlciApOwotZXh0ZXJuIEhXTkQgV0lOX0ZpbmRXaW5Ub1JlcGFpbnQoIEhXTkQgaHduZCApOworZXh0ZXJuIEhXTkQgV0lOX0ZpbmRXaW5Ub1JlcGFpbnQoIEhXTkQgaHduZCwgSFFVRVVFIGhRdWV1ZSApOwogZXh0ZXJuIHZvaWQgV0lOX1NlbmRQYXJlbnROb3RpZnkoIEhXTkQgaHduZCwgV09SRCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIGlkQ2hpbGQsIExPTkcgbFZhbHVlICk7CiBleHRlcm4gQk9PTCBXSU5fQ3JlYXRlRGVza3RvcFdpbmRvdyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggZmE5MTgxOC4uYjgyM2FkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTEwODgsNiArMTA4OCwyMCBAQAogI2RlZmluZSBERExfRFJJVkVTCTB4NDAwMAogI2RlZmluZSBERExfRVhDTFVTSVZFCTB4ODAwMAogCisvKiBUaGUgc2VjdXJpdHkgYXR0cmlidXRlcyBzdHJ1Y3R1cmUgCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEV09SRCBuTGVuZ3RoOworICAgIHZvaWQgKmxwU2VjdXJpdHlEZXNjcmlwdG9yOworICAgIEJPT0wgYkluaGVyaXRIYW5kbGU7Cit9IFNFQ1VSSVRZX0FUVFJJQlVURVMsICpMUFNFQ1VSSVRZX0FUVFJJQlVURVM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCBkd0xvd0RhdGVUaW1lOworICBpbnQgZHdIaWdoRGF0ZVRpbWU7Cit9IEZJTEVUSU1FOworCiAvKiBjb21tICovCiAKICNkZWZpbmUgQ0JSXzExMAkweEZGMTAKQEAgLTI4ODUsNyArMjg5OSw3IEBACiBpbnQgICAgICAgIEdldEtCQ29kZVBhZ2Uodm9pZCk7CiBpbnQgICAgICAgIEdldEtlcm5pbmdQYWlycyhIREMsaW50LExQS0VSTklOR1BBSVIpOwogaW50ICAgICAgICBHZXRLZXlOYW1lVGV4dChMT05HLExQU1RSLGludCk7Ci1pbnQgICAgICAgIEdldEtleVN0YXRlKGludCk7CitJTlQgICAgICAgIEdldEtleVN0YXRlKElOVCk7CiB2b2lkICAgICAgIEdldEtleWJvYXJkU3RhdGUoQllURSopOwogaW50ICAgICAgICBHZXRLZXlib2FyZFR5cGUoaW50KTsKIEhXTkQgICAgICAgR2V0TGFzdEFjdGl2ZVBvcHVwKEhXTkQpOwpAQCAtMzE0MywxMyArMzE1Nyw1NSBAQAogQk9PTCAgICAgICBSZWN0VmlzaWJsZShIREMsTFBSRUNUKTsKIEJPT0wgICAgICAgUmVjdGFuZ2xlKEhEQyxJTlQsSU5ULElOVCxJTlQpOwogQk9PTCAgICAgICBSZWRyYXdXaW5kb3coSFdORCxMUFJFQ1QsSFJHTixVSU5UKTsKLUxPTkcgICAgICAgUmVnQ2xvc2VLZXkoSEtFWSk7Ci1MT05HICAgICAgIFJlZ0NyZWF0ZUtleShIS0VZLExQQ1NUUixMUEhLRVkpOwotTE9ORyAgICAgICBSZWdEZWxldGVLZXkoSEtFWSxMUENTVFIpOwotTE9ORyAgICAgICBSZWdFbnVtS2V5KEhLRVksRFdPUkQsTFBTVFIsRFdPUkQpOwotTE9ORyAgICAgICBSZWdPcGVuS2V5KEhLRVksTFBDU1RSLExQSEtFWSk7Ci1MT05HICAgICAgIFJlZ1F1ZXJ5VmFsdWUoSEtFWSxMUENTVFIsTFBTVFIsTFBMT05HKTsKLUxPTkcgICAgICAgUmVnU2V0VmFsdWUoSEtFWSxMUENTVFIsRFdPUkQsTFBDU1RSLERXT1JEKTsKK0RXT1JECSAgIFJlZ09wZW5LZXlFeFcoSEtFWSxMUENXU1RSLERXT1JELFJFR1NBTSxMUEhLRVkpOworRFdPUkQgICAgICBSZWdPcGVuS2V5VyhIS0VZLExQQ1dTVFIsTFBIS0VZKTsKK0RXT1JEICAgICAgUmVnT3BlbktleUV4QShIS0VZLExQQ1NUUixEV09SRCxSRUdTQU0sTFBIS0VZKTsKK0RXT1JEICAgICAgUmVnT3BlbktleUEoSEtFWSxMUENTVFIsTFBIS0VZKTsKK0RXT1JEICAgICAgUmVnT3BlbktleShIS0VZLExQQ1NUUixMUEhLRVkpOworRFdPUkQgICAgICBSZWdDcmVhdGVLZXlFeFcoSEtFWSxMUENXU1RSLERXT1JELExQV1NUUixEV09SRCxSRUdTQU0sCisJCUxQU0VDVVJJVFlfQVRUUklCVVRFUyxMUEhLRVksTFBEV09SRCk7CitEV09SRCAgICAgIFJlZ0NyZWF0ZUtleVcoSEtFWSxMUENXU1RSLExQSEtFWSk7CitEV09SRCAgICAgIFJlZ0NyZWF0ZUtleUV4QShIS0VZLExQQ1NUUixEV09SRCxMUFNUUixEV09SRCxSRUdTQU0sCisJCUxQU0VDVVJJVFlfQVRUUklCVVRFUyxMUEhLRVksTFBEV09SRCk7CitEV09SRCAgICAgIFJlZ0NyZWF0ZUtleUEoSEtFWSxMUENTVFIsTFBIS0VZKTsKK0RXT1JEICAgICAgUmVnQ3JlYXRlS2V5KEhLRVksTFBDU1RSLExQSEtFWSk7CitEV09SRCAgICAgIFJlZ1F1ZXJ5VmFsdWVFeFcoSEtFWSxMUFdTVFIsTFBEV09SRCxMUERXT1JELExQQllURSxMUERXT1JEKTsKK0RXT1JEICAgICAgUmVnUXVlcnlWYWx1ZVcoSEtFWSxMUFdTVFIsTFBXU1RSLExQRFdPUkQpOworRFdPUkQgICAgICBSZWdRdWVyeVZhbHVlRXhBKEhLRVksTFBTVFIsTFBEV09SRCxMUERXT1JELExQQllURSxMUERXT1JEKTsKK0RXT1JEICAgICAgUmVnUXVlcnlWYWx1ZUV4KEhLRVksTFBTVFIsTFBEV09SRCxMUERXT1JELExQQllURSxMUERXT1JEKTsKK0RXT1JEICAgICAgUmVnUXVlcnlWYWx1ZUEoSEtFWSxMUFNUUixMUFNUUixMUERXT1JEKTsKK0RXT1JEICAgICAgUmVnUXVlcnlWYWx1ZShIS0VZLExQU1RSLExQU1RSLExQRFdPUkQpOworRFdPUkQgICAgICBSZWdTZXRWYWx1ZUV4VyhIS0VZLExQV1NUUixEV09SRCxEV09SRCxMUEJZVEUsRFdPUkQpOworRFdPUkQgICAgICBSZWdTZXRWYWx1ZUV4QShIS0VZLExQU1RSLERXT1JELERXT1JELExQQllURSxEV09SRCk7CitEV09SRCAgICAgIFJlZ1NldFZhbHVlRXgoSEtFWSxMUFNUUixEV09SRCxEV09SRCxMUEJZVEUsRFdPUkQpOworRFdPUkQgICAgICBSZWdTZXRWYWx1ZVcoSEtFWSxMUENXU1RSLERXT1JELExQQ1dTVFIsRFdPUkQpOworRFdPUkQgICAgICBSZWdTZXRWYWx1ZUEoSEtFWSxMUENTVFIsRFdPUkQsTFBDU1RSLERXT1JEKTsKK0RXT1JEICAgICAgUmVnU2V0VmFsdWUoSEtFWSxMUENTVFIsRFdPUkQsTFBDU1RSLERXT1JEKTsKK0RXT1JEICAgICAgUmVnRW51bUtleUV4VyhIS0VZLERXT1JELExQV1NUUixMUERXT1JELExQRFdPUkQsTFBXU1RSLExQRFdPUkQsCisJCUZJTEVUSU1FKik7CitEV09SRCAgICAgIFJlZ0VudW1LZXlXKEhLRVksRFdPUkQsTFBXU1RSLERXT1JEKTsKK0RXT1JEICAgICAgUmVnRW51bUtleUV4QShIS0VZLERXT1JELExQU1RSLExQRFdPUkQsTFBEV09SRCxMUFNUUixMUERXT1JELAorCQlGSUxFVElNRSopOworRFdPUkQgICAgICBSZWdFbnVtS2V5QShIS0VZLERXT1JELExQU1RSLERXT1JEKTsKK0RXT1JEICAgICAgUmVnRW51bUtleShIS0VZLERXT1JELExQU1RSLERXT1JEKTsKK0RXT1JEICAgICAgUmVnRW51bVZhbHVlVyhIS0VZLERXT1JELExQV1NUUixMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUEJZVEUsCisJCUxQRFdPUkQpOworRFdPUkQgICAgICBSZWdFbnVtVmFsdWVBKEhLRVksRFdPUkQsTFBTVFIsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBCWVRFLAorCQlMUERXT1JEKTsKK0RXT1JEICAgICAgUmVnRW51bVZhbHVlKEhLRVksRFdPUkQsTFBTVFIsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBCWVRFLAorCQlMUERXT1JEKTsKK0RXT1JEICAgICAgUmVnQ2xvc2VLZXkoSEtFWSk7CitEV09SRCAgICAgIFJlZ0RlbGV0ZUtleVcoSEtFWSxMUFdTVFIpOworRFdPUkQgICAgICBSZWdEZWxldGVLZXlBKEhLRVksTFBDU1RSKTsKK0RXT1JEICAgICAgUmVnRGVsZXRlS2V5KEhLRVksTFBDU1RSKTsKK0RXT1JEICAgICAgUmVnRGVsZXRlVmFsdWVXKEhLRVksTFBXU1RSKTsKK0RXT1JEICAgICAgUmVnRGVsZXRlVmFsdWVBKEhLRVksTFBTVFIpOworRFdPUkQgICAgICBSZWdEZWxldGVWYWx1ZShIS0VZLExQU1RSKTsKK0RXT1JEICAgICAgUmVnRmx1c2hLZXkoSEtFWSk7CitEV09SRCAgICAgIFJlZ1F1ZXJ5SW5mb0tleVcoSEtFWSxMUFdTVFIsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBEV09SRCwKKwkJTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUERXT1JELEZJTEVUSU1FKik7CitEV09SRCAgICAgIFJlZ1F1ZXJ5SW5mb0tleUEoSEtFWSxMUFNUUixMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUERXT1JELAorCQlMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUERXT1JELExQRFdPUkQsRklMRVRJTUUqKTsKIEFUT00gICAgICAgUmVnaXN0ZXJDbGFzcyhMUFdORENMQVNTKTsKIFdPUkQgICAgICAgUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTFBDU1RSKTsKIFdPUkQgICAgICAgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlKFNFR1BUUik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmVycm9yLmggYi9pbmNsdWRlL3dpbmVycm9yLmgKaW5kZXggNjdlOGQ3MS4uY2RjYTdlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5lcnJvci5oCisrKyBiL2luY2x1ZGUvd2luZXJyb3IuaApAQCAtNyw2ICs3LDcgQEAKICAqLwogI2RlZmluZSAgICAgRVJST1JfVU5LTk9XTiAgICAgICAgICAgICAgIDk5OTk5CiAKKyNkZWZpbmUgICAgIEVSUk9SX1NVQ0NFU1MgICAgICAgICAgICAgICAwCiAjZGVmaW5lICAgICBFUlJPUl9GSUxFX05PVF9GT1VORCAgICAgICAgMgogI2RlZmluZSAgICAgRVJST1JfVE9PX01BTllfT1BFTl9GSUxFUyAgIDQKICNkZWZpbmUgICAgIEVSUk9SX0FDQ0VTU19ERU5JRUQgICAgICAgICA1CkBAIC0yMiw2ICsyMyw4IEBACiAjZGVmaW5lICAgICBFUlJPUl9ESVJfTk9UX0VNUFRZICAgICAgICAgMTQ1CiAjZGVmaW5lICAgICBFUlJPUl9CVVNZICAgICAgICAgICAgICAgICAgMTcwCiAjZGVmaW5lICAgICBFUlJPUl9GSUxFTkFNRV9FWENFRF9SQU5HRSAgMjA2CisjZGVmaW5lICAgICBFUlJPUl9NT1JFX0RBVEEJCTIzNAorI2RlZmluZSAgICAgRVJST1JfTk9fTU9SRV9JVEVNUwkJMjU5CiAjZGVmaW5lICAgICBFUlJPUl9JT19ERVZJQ0UgICAgICAgICAgICAgMTExNwogI2RlZmluZSAgICAgRVJST1JfUE9TU0lCTEVfREVBRExPQ0sgICAgIDExMzEKICNkZWZpbmUgICAgIEVSUk9SX0JBRF9ERVZJQ0UgICAgICAgICAgICAxMjAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnJlZy5oIGIvaW5jbHVkZS93aW5yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWM2MGEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS93aW5yZWcuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIAkJCQlTaGVsbCBMaWJyYXJ5IGRlZmluaXRpb25zCisgKi8KKyNpbmNsdWRlICJ3aW50eXBlcy5oIgorCisjaWZuZGVmIF9fV0lORV9XSU5SRUdfSAorI2RlZmluZSBfX1dJTkVfV0lOUkVHX0gKKworI2luY2x1ZGUgIndpbmRvd3MuaCIKKworLyogRklYTUU6IHNob3VsZCBiZSBpbiBzZWN1cml0eS5oIG9yIHdoZXJlZXZlciAqLworI2lmbmRlZiBSRUFEX0NPTlRST0wKKyNkZWZpbmUgUkVBRF9DT05UUk9MCQkweDAwMDIwMDAwCisjZW5kaWYKKyNpZm5kZWYgU1RBTkRBUkRfUklHSFRTX1JFQUQKKyNkZWZpbmUgU1RBTkRBUkRfUklHSFRTX1JFQUQJUkVBRF9DT05UUk9MCisjZW5kaWYKKyNpZm5kZWYgU1RBTkRBUkRfUklHSFRTX1dSSVRFCisjZGVmaW5lIFNUQU5EQVJEX1JJR0hUU19XUklURQlSRUFEX0NPTlRST0wJLyogRklYTUU6IGhtbT8gKi8KKyNlbmRpZgorI2lmbmRlZiBTVEFOREFSRF9SSUdIVFNfQUxMCisjZGVmaW5lIFNUQU5EQVJEX1JJR0hUU19BTEwJMHgwMDFmMDAwMAorI2VuZGlmCisvKiAuLi4gKi8KKworCisjZGVmaW5lIFNIRUxMX0VSUk9SX1NVQ0NFU1MgICAgICAgICAgIDBMCisjZGVmaW5lIFNIRUxMX0VSUk9SX0JBRERCICAgICAgICAgICAgIDFMCisjZGVmaW5lIFNIRUxMX0VSUk9SX0JBREtFWSAgICAgICAgICAgIDJMCisjZGVmaW5lIFNIRUxMX0VSUk9SX0NBTlRPUEVOICAgICAgICAgIDNMCisjZGVmaW5lIFNIRUxMX0VSUk9SX0NBTlRSRUFEICAgICAgICAgIDRMCisjZGVmaW5lIFNIRUxMX0VSUk9SX0NBTlRXUklURSAgICAgICAgIDVMCisjZGVmaW5lIFNIRUxMX0VSUk9SX09VVE9GTUVNT1JZICAgICAgIDZMCisjZGVmaW5lIFNIRUxMX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSIDdMCisjZGVmaW5lIFNIRUxMX0VSUk9SX0FDQ0VTU19ERU5JRUQgICAgIDhMCisKKyNkZWZpbmUgUkVHX05PTkUJCTAJLyogbm8gdHlwZSAqLworI2RlZmluZSBSRUdfU1ogICAgICAgICAgICAgICAgICAxCS8qIHN0cmluZyB0eXBlIChBU0NJSSkgKi8KKyNkZWZpbmUgUkVHX0VYUEFORF9TWgkJMgkvKiBzdHJpbmcsIGluY2x1ZGVzICVFTlZWQVIlIChleHBhbmRlZCBieSBjYWxsZXIpIChBU0NJSSkgKi8KKyNkZWZpbmUgUkVHX0JJTkFSWQkJMwkvKiBiaW5hcnkgZm9ybWF0LCBjYWxsZXJzcGVjaWZpYyAqLworLyogWUVTLCBSRUdfRFdPUkQgPT0gUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4gKi8KKyNkZWZpbmUgUkVHX0RXT1JECQk0CS8qIERXT1JEIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCisjZGVmaW5lIFJFR19EV09SRF9MSVRUTEVfRU5ESUFOCTQJLyogRFdPUkQgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KKyNkZWZpbmUgUkVHX0RXT1JEX0JJR19FTkRJQU4JNQkvKiBEV09SRCBpbiBiaWcgZW5kaWFuIGZvcm1hdCAgKi8KKyNkZWZpbmUgUkVHX0xJTksJCTYJLyogc3ltYm9saWMgbGluayAoVU5JQ09ERSkgKi8KKyNkZWZpbmUgUkVHX01VTFRJX1NaCQk3CS8qIG11bHRpcGxlIHN0cmluZ3MsIGRlbGltaXRlZCBieSBcMCwgdGVybWluYXRlZCBieSBcMFwwIChBU0NJSSkgKi8KKyNkZWZpbmUgUkVHX1JFU09VUkNFX0xJU1QJOAkvKiByZXNvdXJjZSBsaXN0PyBodWg/ICovCisjZGVmaW5lIFJFR19GVUxMX1JFU09VUkNFX0RFU0NSSVBUT1IJOQkvKiBmdWxsIHJlc291cmNlIGRlc2NyaXB0b3I/IGh1aD8gKi8KKworI2RlZmluZSBIS0VZX0NMQVNTRVNfUk9PVAkweDgwMDAwMDAwCisjZGVmaW5lIEhLRVlfQ1VSUkVOVF9VU0VSCTB4ODAwMDAwMDEKKyNkZWZpbmUgSEtFWV9MT0NBTF9NQUNISU5FCTB4ODAwMDAwMDIKKyNkZWZpbmUgSEtFWV9VU0VSUwkJMHg4MDAwMDAwMworI2RlZmluZSBIS0VZX1BFUkZPUk1BTkNFX0RBVEEJMHg4MDAwMDAwNAorI2RlZmluZSBIS0VZX0NVUlJFTlRfQ09ORklHCTB4ODAwMDAwMDUKKyNkZWZpbmUgSEtFWV9EWU5fREFUQQkJMHg4MDAwMDAwNgorCisjZGVmaW5lCVJFR19PUFRJT05fUkVTRVJWRUQJMHgwMDAwMDAwMAorI2RlZmluZQlSRUdfT1BUSU9OX05PTl9WT0xBVElMRQkweDAwMDAwMDAwCisjZGVmaW5lCVJFR19PUFRJT05fVk9MQVRJTEUJMHgwMDAwMDAwMQorI2RlZmluZQlSRUdfT1BUSU9OX0NSRUFURV9MSU5LCTB4MDAwMDAwMDIKKworI2RlZmluZSBSRUdfQ1JFQVRFRF9ORVdfS0VZCTB4MDAwMDAwMDEKKyNkZWZpbmUgUkVHX09QRU5FRF9FWElTVElOR19LRVkJMHgwMDAwMDAwMgorCisjZGVmaW5lIEtFWV9RVUVSWV9WQUxVRSAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgS0VZX1NFVF9WQUxVRSAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBLRVlfQ1JFQVRFX1NVQl9LRVkgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMgIDB4MDAwMDAwMDgKKyNkZWZpbmUgS0VZX05PVElGWSAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBLRVlfQ1JFQVRFX0xJTksgICAgICAgICAweDAwMDAwMDIwCisKKyNkZWZpbmUgS0VZX1JFQUQgICAgICAgICAgICAgICAgKFNUQU5EQVJEX1JJR0hUU19SRUFEfAlcCisJCQkJIEtFWV9RVUVSWV9WQUxVRXwJXAorCQkJCSBLRVlfRU5VTUVSQVRFX1NVQl9LRVlTfFwKKwkJCQkgS0VZX05PVElGWQkJXAorCQkJCSkKKyNkZWZpbmUgS0VZX1dSSVRFICAgICAgICAgICAgICAgKFNUQU5EQVJEX1JJR0hUU19XUklURXwJXAorCQkJCSBLRVlfU0VUX1ZBTFVFfAkJXAorCQkJCSBLRVlfQ1JFQVRFX1NVQl9LRVkJXAorCQkJCSkKKyNkZWZpbmUgS0VZX0VYRUNVVEUgICAgICAgICAgICAgS0VZX1JFQUQKKyNkZWZpbmUgS0VZX0FMTF9BQ0NFU1MgICAgICAgICAgKFNUQU5EQVJEX1JJR0hUU19BTEx8CVwKKwkJCQkgS0VZX1JFQUR8S0VZX1dSSVRFfAlcCisJCQkJIEtFWV9DUkVBVEVfTElOSwlcCisJCQkJKQorLyogb25lIHZhbHVlIG9mIGEga2V5ICovCit0eXBlZGVmIHN0cnVjdCB0YWdLRVlWQUxVRSB7CisJTFBXU1RSCW5hbWU7CS8qIG5hbWUgb2YgdmFsdWUgKFVOSUNPREUpIG9yIE5VTEwgZm9yIHdpbjMxICovCisJRFdPUkQJdHlwZTsJLyogdHlwZSBvZiB2YWx1ZSAqLworCURXT1JECWxlbjsJLyogbGVuZ3RoIG9mIGRhdGEgKi8KKwlMUEJZVEUJZGF0YTsJLyogY29udGVudCwgbWF5IGJlIHN0cmluZ3MsIGJpbmFyaWVzLCBldGMuICovCit9IEtFWVZBTFVFLCpMUEtFWVZBTFVFOworCisvKiBhIHJlZ2lzdHJ5IGtleSAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnS0VZU1RSVUNUIHsKKwlMUFdTVFIJCQlrZXluYW1lOwkvKiBuYW1lIG9mIFRISVMga2V5IChVTklDT0RFKSAqLworCURXT1JECQkJZmxhZ3M7CQkvKiBmbGFncy4gKi8KKwlMUFdTVFIJCQljbGFzczsKKwkvKiB2YWx1ZXMgKi8KKwlEV09SRAkJCW5yb2Z2YWx1ZXM7CS8qIG5yIG9mIHZhbHVlcyBpbiBUSElTIGtleSAqLworCUxQS0VZVkFMVUUJCXZhbHVlczsJCS8qIHZhbHVlcyBpbiBUSElTIGtleSAqLworCS8qIGtleSBtYW5hZ2VtZW50IHBvaW50ZXJzICovCisJc3RydWN0IHRhZ0tFWVNUUlVDVAkqbmV4dDsJCS8qIG5leHQga2V5IG9uIHNhbWUgaGllcmFyY2h5ICovCisJc3RydWN0IHRhZ0tFWVNUUlVDVAkqbmV4dHN1YjsJLyoga2V5cyB0aGF0IGhhbmcgYmVsb3cgVEhJUyBrZXkgKi8KK30gS0VZU1RSVUNULCAqTFBLRVlTVFJVQ1Q7CisKK3ZvaWQgU0hFTExfSW5pdCgpOwordm9pZCBTSEVMTF9TYXZlUmVnaXN0cnkoKTsKK3ZvaWQgU0hFTExfTG9hZFJlZ2lzdHJ5KCk7CisjZW5kaWYgIC8qIF9fV0lORV9XSU5SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW50eXBlcy5oIGIvaW5jbHVkZS93aW50eXBlcy5oCmluZGV4IDUyZTA1NDguLjhmNTM5MjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2ludHlwZXMuaAorKysgYi9pbmNsdWRlL3dpbnR5cGVzLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKIHR5cGVkZWYgSU5UIEhGSUxFOwogdHlwZWRlZiBEV09SRCBISE9PSzsKIHR5cGVkZWYgY2hhciAqTFBTVFI7Cit0eXBlZGVmIEJZVEUgKkxQQllURTsKIHR5cGVkZWYgY29uc3QgY2hhciAqTFBDU1RSOwogdHlwZWRlZiBUQ0hBUiAqTFBUU1RSOwogdHlwZWRlZiBjb25zdCBUQ0hBUiAqTFBDVFNUUjsKQEAgLTY0LDYgKzY1LDggQEAKIHR5cGVkZWYgY29uc3Qgdm9pZCAqTFBDVk9JRDsKIHR5cGVkZWYgV09SRCBDQVRDSEJVRls5XTsKIHR5cGVkZWYgV09SRCAqTFBDQVRDSEJVRjsKK3R5cGVkZWYgRFdPUkQgQUNDRVNTX01BU0s7Cit0eXBlZGVmIEFDQ0VTU19NQVNLIFJFR1NBTTsKIAogI2RlZmluZSBERUNMQVJFX0hBTkRMRShhKSB0eXBlZGVmIEhBTkRMRSBhOwogCmRpZmYgLS1naXQgYS9saWJyYXJ5L21pc2NzdHVicy5jIGIvbGlicmFyeS9taXNjc3R1YnMuYwppbmRleCBiMDZjNmE2Li4wYzNmOGMxIDEwMDY0NAotLS0gYS9saWJyYXJ5L21pc2NzdHVicy5jCisrKyBiL2xpYnJhcnkvbWlzY3N0dWJzLmMKQEAgLTE2OSwxMSArMTY5LDExIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFduZFByb2NFbnRyeTE2IChub3QgYSBXaW5kb3dzIEFQSSBmdW5jdGlvbikKKyAqICAgICAgICAgICBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYgKG5vdCBhIFdpbmRvd3MgQVBJIGZ1bmN0aW9uKQogICoKICAqIFJldHVybiBhbiBlbnRyeSBwb2ludCBmcm9tIHRoZSBXSU5QUk9DUyBkbGwuCiAgKi8KLVdORFBST0MgR2V0V25kUHJvY0VudHJ5MTYoIGNoYXIgKm5hbWUgKQorV05EUFJPQyBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoIGNoYXIgKm5hbWUgKQogewogI2RlZmluZSBNQVBfU1RSX1RPX1BST0Moc3RyLHByb2MpIGlmKCFzdHJjbXAobmFtZSxzdHIpKXJldHVybiBwcm9jCiAgIE1BUF9TVFJfVE9fUFJPQygiQWN0aXZhdGVBcHBQcm9jIixBQ1RJVkFURUFQUF9jYWxsYmFjayk7CkBAIC0yMDIsMyArMjAyLDEzIEBACiAgIGZwcmludGYoc3RkZXJyLCJ3YXJuaW5nOiBObyBtYXBwaW5nIGZvciAlcygpLCBhZGQgb25lIGluIGxpYnJhcnkvbWlzY3N0dWJzLmNcbiIsbmFtZSk7CiAgIHJldHVybiBFcnJvclByb2M7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkzMiAobm90IGEgV2luZG93cyBBUEkgZnVuY3Rpb24pCisgKgorICogUmV0dXJuIGFuIGVudHJ5IHBvaW50IGZyb20gdGhlIFdJTlBST0NTMzIgZGxsLgorICovCitXTkRQUk9DIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkzMiggY2hhciAqbmFtZSApCit7CisgICAgcmV0dXJuIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNiggbmFtZSApOworfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL21haW4uYyBiL2xvYWRlci9tYWluLmMKaW5kZXggMGFjYTI4NS4uMGM0OTAzNyAxMDA2NDQKLS0tIGEvbG9hZGVyL21haW4uYworKysgYi9sb2FkZXIvbWFpbi5jCkBAIC0xMSwxMSArMTEsMTMgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJhbGlhcy5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJjb21tLmgiCiAjaW5jbHVkZSAidXNlci5oIgorI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgIm1lbnUuaCIKICNpbmNsdWRlICJrZXJuZWwzMi5oIgogI2luY2x1ZGUgImF0b20uaCIKQEAgLTk5LDEwICsxMDEsMTMgQEAKICAgICAKICAgICAgIC8qIEdsb2JhbCBhdG9tIHRhYmxlIGluaXRpYWxpc2F0aW9uICovCiAgICAgaWYgKCFBVE9NX0luaXQoKSkgcmV0dXJuIDA7Ci0gICAgCisKICAgICAgIC8qIEdESSBpbml0aWFsaXNhdGlvbiAqLwogICAgIGlmICghR0RJX0luaXQoKSkgcmV0dXJuIDA7CiAKKyAgICAvKiBJbml0aWFsaXNlIHdpbmRvdyBwcm9jZWR1cmVzIGFsaWFzZXMgKi8KKyAgICBpZiAoIUFMSUFTX0luaXQoKSkgcmV0dXJuIDA7CisKICAgICAgIC8qIEluaXRpYWxpemUgc3lzdGVtIGNvbG9ycyBhbmQgbWV0cmljcyovCiAgICAgU1lTTUVUUklDU19Jbml0KCk7CiAgICAgU1lTQ09MT1JfSW5pdCgpOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL21vZHVsZS5jIGIvbG9hZGVyL21vZHVsZS5jCmluZGV4IDdjZWNlNzYuLmZjZTczNGMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tb2R1bGUuYworKysgYi9sb2FkZXIvbW9kdWxlLmMKQEAgLTQ4LDIwICs0OCwxOCBAQAogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKICAgICBTRUdUQUJMRUVOVFJZICpwU2VnVGFibGU7CiAgICAgc3RydWN0IGRsbF90YWJsZV9zICp0YWJsZTsKLSAgICBpbnQgaTsKICAgICBjaGFyIGRsbG5hbWVbMTZdLCAqcDsKIAogICAgIC8qIEZpeCB0aGUgbmFtZSBpbiBjYXNlIHdlIGhhdmUgYSBmdWxsIHBhdGggYW5kIGV4dGVuc2lvbiAqLwogCiAgICAgaWYgKChwID0gc3RycmNociggbmFtZSwgJ1xcJyApKSkgbmFtZSA9IHAgKyAxOwotICAgIHN0cm5jcHkoIGRsbG5hbWUsIG5hbWUsIDE1ICk7Ci0gICAgZGxsbmFtZVsxNV0gPSAnXDAnOworICAgIGxzdHJjcHluKCBkbGxuYW1lLCBuYW1lLCBzaXplb2YoZGxsbmFtZSkgKTsKICAgICBpZiAoKHAgPSBzdHJyY2hyKCBkbGxuYW1lLCAnLicgKSkpICpwID0gJ1wwJzsKIAotICAgIGZvciAoaSA9IDAsIHRhYmxlID0gZGxsX2J1aWx0aW5fdGFibGU7IGkgPCBOX0JVSUxUSU5TOyBpKyssIHRhYmxlKyspCisgICAgZm9yICh0YWJsZSA9IGRsbF9idWlsdGluX3RhYmxlOyB0YWJsZS0+bmFtZTsgdGFibGUrKykKICAgICAgICAgaWYgKCFsc3RyY21waSggdGFibGUtPm5hbWUsIGRsbG5hbWUgKSkgYnJlYWs7Ci0gICAgaWYgKGkgPj0gTl9CVUlMVElOUykgcmV0dXJuIDA7Ci0gICAgaWYgKCF0YWJsZS0+dXNlZCAmJiAhZm9yY2UpIHJldHVybiAwOworICAgIGlmICghdGFibGUtPm5hbWUpIHJldHVybiAwOworICAgIGlmICgodGFibGUtPmZsYWdzICYgRExMX0ZMQUdfTk9UX1VTRUQpICYmICFmb3JjZSkgcmV0dXJuIDA7CiAKICAgICBoTW9kdWxlID0gR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX01PVkVBQkxFLCB0YWJsZS0+bW9kdWxlX3N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5tb2R1bGVfZW5kIC0gdGFibGUtPm1vZHVsZV9zdGFydCwKQEAgLTQ4Niw2ICs0ODQsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qIENsZWFyIGludGVybmFsIFdpbmUgZmxhZ3MgaW4gY2FzZSB0aGV5IGFyZSBzZXQgaW4gdGhlIEVYRSBmaWxlICovCisKKyAgICBwTW9kdWxlLT5mbGFncyAmPSB+KE5FX0ZGTEFHU19CVUlMVElOIHwgTkVfRkZMQUdTX1dJTjMyKTsKKwogICAgIC8qIFN0b3JlIHRoZSBmaWxlbmFtZSBpbmZvcm1hdGlvbiAqLwogCiAgICAgcE1vZHVsZS0+ZmlsZWluZm8gPSAoaW50KXBEYXRhIC0gKGludClwTW9kdWxlOwpAQCAtNjAxLDcgKzYwMyw3IEBACiAgKgogICogTG9va3VwIHRoZSBvcmRpbmFsIGZvciBhIGdpdmVuIG5hbWUuCiAgKi8KLVdPUkQgTU9EVUxFX0dldE9yZGluYWwoIEhNT0RVTEUgaE1vZHVsZSwgY2hhciAqbmFtZSApCitXT1JEIE1PRFVMRV9HZXRPcmRpbmFsKCBITU9EVUxFIGhNb2R1bGUsIGNvbnN0IGNoYXIgKm5hbWUgKQogewogICAgIGNoYXIgYnVmZmVyWzI1Nl0sICpjcG50OwogICAgIEJZVEUgbGVuOwpAQCAtNjMwLDcgKzYzMiw2IEBACiAgICAgY3BudCArPSAqY3BudCArIDEgKyBzaXplb2YoV09SRCk7CiAgICAgd2hpbGUgKCpjcG50KQogICAgIHsKLSAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIiAgQ2hlY2tpbmcgJyUqLipzJ1xuIiwgKmNwbnQsICpjcG50LCBjcG50KzEgKTsKICAgICAgICAgaWYgKCgoQllURSkqY3BudCA9PSBsZW4pICYmICFtZW1jbXAoIGNwbnQrMSwgYnVmZmVyLCBsZW4gKSkKICAgICAgICAgewogICAgICAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIiAgRm91bmQ6IG9yZGluYWw9JWRcbiIsCkBAIC02NDksNyArNjUwLDYgQEAKICAgICBjcG50ICs9ICpjcG50ICsgMSArIHNpemVvZihXT1JEKTsKICAgICB3aGlsZSAoKmNwbnQpCiAgICAgewotICAgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiICBDaGVja2luZyAnJSouKnMnXG4iLCAqY3BudCwgKmNwbnQsIGNwbnQrMSApOwogICAgICAgICBpZiAoKChCWVRFKSpjcG50ID09IGxlbikgJiYgIW1lbWNtcCggY3BudCsxLCBidWZmZXIsIGxlbiApKQogICAgICAgICB7CiAgICAgICAgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiICBGb3VuZDogb3JkaW5hbD0lZFxuIiwKQEAgLTc5NCw2ICs3OTQsNDAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYgIChub3QgYSBXaW5kb3dzIEFQSSBmdW5jdGlvbikKKyAqCisgKiBSZXR1cm4gYW4gZW50cnkgcG9pbnQgZnJvbSB0aGUgV0lOUFJPQ1MgZGxsLgorICovCisjaWZuZGVmIFdJTkVMSUIKK1dORFBST0MgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCBjb25zdCBjaGFyICpuYW1lICkKK3sKKyAgICBXT1JEIG9yZGluYWw7CisgICAgc3RhdGljIEhNT0RVTEUgaE1vZHVsZSA9IDA7CisKKyAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoICJXSU5QUk9DUyIgKTsKKyAgICBvcmRpbmFsID0gTU9EVUxFX0dldE9yZGluYWwoIGhNb2R1bGUsIG5hbWUgKTsKKyAgICByZXR1cm4gTU9EVUxFX0dldEVudHJ5UG9pbnQoIGhNb2R1bGUsIG9yZGluYWwgKTsKK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkzMiAgKG5vdCBhIFdpbmRvd3MgQVBJIGZ1bmN0aW9uKQorICoKKyAqIFJldHVybiBhbiBlbnRyeSBwb2ludCBmcm9tIHRoZSBXSU5QUk9DUzMyIGRsbC4KKyAqLworI2lmbmRlZiBXSU5FTElCCitXTkRQUk9DIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkzMiggY29uc3QgY2hhciAqbmFtZSApCit7CisgICAgc3RhdGljIEhNT0RVTEUgaE1vZHVsZSA9IDA7CisKKyAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoICJXSU5QUk9DUzMyIiApOworICAgIHJldHVybiBQRV9HZXRQcm9jQWRkcmVzcyggaE1vZHVsZSwgbmFtZSApOworfQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0dldE1vZHVsZU5hbWUKICAqLwogTFBTVFIgTU9EVUxFX0dldE1vZHVsZU5hbWUoIEhNT0RVTEUgaE1vZHVsZSApCkBAIC0xMTAzLDEwICsxMTM3LDYgQEAKICAgICAgICAgICAvKiB0aGUgbW9kdWxlLCBldmVuIGlmIGl0IGNvbnRhaW5zIGNpcmN1bGFyIERMTCByZWZlcmVuY2VzICovCiAKICAgICAgICAgcE1vZHVsZS0+Y291bnQgPSAxOwotCi0gICAgICAgICAgLyogQ2xlYXIgYnVpbHQtaW4gZmxhZyBpbiBjYXNlIGl0IHdhcyBzZXQgaW4gdGhlIEVYRSBmaWxlICovCi0KLSAgICAgICAgcE1vZHVsZS0+ZmxhZ3MgJj0gfk5FX0ZGTEFHU19CVUlMVElOOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMTQyMiwyNCArMTQ1Miw2IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0V25kUHJvY0VudHJ5MTYgKG5vdCBhIFdpbmRvd3MgQVBJIGZ1bmN0aW9uKQotICoKLSAqIFJldHVybiBhbiBlbnRyeSBwb2ludCBmcm9tIHRoZSBXSU5QUk9DUyBkbGwuCi0gKi8KLSNpZm5kZWYgV0lORUxJQgotV05EUFJPQyBHZXRXbmRQcm9jRW50cnkxNiggY2hhciAqbmFtZSApCi17Ci0gICAgV09SRCBvcmRpbmFsOwotICAgIHN0YXRpYyBITU9EVUxFIGhNb2R1bGUgPSAwOwotCi0gICAgaWYgKCFoTW9kdWxlKSBoTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlKCAiV0lOUFJPQ1MiICk7Ci0gICAgb3JkaW5hbCA9IE1PRFVMRV9HZXRPcmRpbmFsKCBoTW9kdWxlLCBuYW1lICk7Ci0gICAgcmV0dXJuIE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCBvcmRpbmFsICk7Ci19Ci0jZW5kaWYKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgIE1vZHVsZUZpcnN0ICAgIChUT09MSEVMUC41OSkKICAqLwpkaWZmIC0tZ2l0IGEvbG9hZGVyL25lX2ltYWdlLmMgYi9sb2FkZXIvbmVfaW1hZ2UuYwppbmRleCAxYjhjMGE2Li44YWU5MDA0IDEwMDY0NAotLS0gYS9sb2FkZXIvbmVfaW1hZ2UuYworKysgYi9sb2FkZXIvbmVfaW1hZ2UuYwpAQCAtNTEwLDExICs1MTAsMTEgQEAKICAgICBITU9EVUxFICpwRExMOwogCiAgICAgcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICk7Ci0JaWYgKHBNb2R1bGUtPm1hZ2ljID09IFBFX1NJR05BVFVSRSkKLQl7Ci0JCVBFX0luaXRpYWxpemVETExzKGhNb2R1bGUpOwotCQlyZXR1cm47Ci0JfQorICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKKyAgICB7CisgICAgICAgIFBFX0luaXRpYWxpemVETExzKGhNb2R1bGUpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChwTW9kdWxlLT5kbGxzX3RvX2luaXQpCiAgICAgewogCUhBTkRMRSB0b19pbml0ID0gcE1vZHVsZS0+ZGxsc190b19pbml0OwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCBlOTVhZGUyLi5jZWQ0NWQwIDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKLSNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgpAQCAtNTgxLDEwICs1ODAsMTAgQEAKIAlwTW9kdWxlID0gKE5FX01PRFVMRSopR2xvYmFsTG9jayhoTW9kdWxlKTsKIAogCS8qIFNldCBhbGwgdXNlZCBlbnRyaWVzICovCi0JcE1vZHVsZS0+bWFnaWM9UEVfU0lHTkFUVVJFOworCXBNb2R1bGUtPm1hZ2ljPU5FX1NJR05BVFVSRTsKIAlwTW9kdWxlLT5jb3VudD0xOwogCXBNb2R1bGUtPm5leHQ9MDsKLQlwTW9kdWxlLT5mbGFncz0wOworCXBNb2R1bGUtPmZsYWdzPU5FX0ZGTEFHU19XSU4zMjsKIAlwTW9kdWxlLT5kZ3JvdXA9MTsKIAlwTW9kdWxlLT5zcz0xOwogCXBNb2R1bGUtPmNzPTI7CkBAIC02MTAsNyArNjA5LDcgQEAKIAlwU2VnbWVudC0+bWluc2l6ZT0weDEwMDA7CiAJcFNlZ21lbnQrKzsKIAotCWN0cz0oRFdPUkQpR2V0V25kUHJvY0VudHJ5MTYoIldpbjMyQ2FsbFRvU3RhcnQiKTsKKwljdHM9KERXT1JEKU1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiV2luMzJDYWxsVG9TdGFydCIpOwogI2lmZGVmIFdJTkVMSUIzMgogCXBTZWdtZW50LT5zZWxlY3Rvcj0odm9pZCopY3RzOwogCXBNb2R1bGUtPmlwPTA7CmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IGRlZTkwMjcuLjBkZTM5OTMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC0zNyw3ICszNyw3IEBACiAgKi8KIEhSU1JDIEZpbmRSZXNvdXJjZSggSE1PRFVMRSBoTW9kdWxlLCBTRUdQVFIgbmFtZSwgU0VHUFRSIHR5cGUgKQogewotICAgIFdPUkQgKnBNb2R1bGU7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOyAgLyogSW4gY2FzZSB3ZSB3ZXJlIHBhc3NlZCBhbiBoSW5zdGFuY2UgKi8KICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkZpbmRSZXNvdXJjZTogbW9kdWxlPSUwNHggdHlwZT0iLCBoTW9kdWxlICk7CkBAIC01MiwxNyArNTIsMTQgQEAKICAgICBkcHJpbnRmX3Jlc291cmNlKCBzdGRkZWIsICIgbmFtZT0iICk7CiAgICAgUHJpbnRJZCggbmFtZSApOwogICAgIGRwcmludGZfcmVzb3VyY2UoIHN0ZGRlYiwgIlxuIiApOwotICAgIGlmICghKHBNb2R1bGUgPSAoV09SRCAqKUdsb2JhbExvY2soIGhNb2R1bGUgKSkpIHJldHVybiAwOworICAgIGlmICghKHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7CiAjaWZuZGVmIFdJTkVMSUIKLSAgICBzd2l0Y2goKnBNb2R1bGUpCisgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQogICAgIHsKLSAgICAgIGNhc2UgTkVfU0lHTkFUVVJFOgotICAgICAgICByZXR1cm4gTkVfRmluZFJlc291cmNlKCBoTW9kdWxlLCB0eXBlLCBuYW1lICk7Ci0gICAgICBjYXNlIFBFX1NJR05BVFVSRToKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRG9uJ3Qga25vdyBob3cgdG8gRmluZFJlc291cmNlKCkgZm9yIFdpbjMyIG1vZHVsZVxuIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICByZXR1cm4gTkVfRmluZFJlc291cmNlKCBoTW9kdWxlLCB0eXBlLCBuYW1lICk7CiAjZWxzZQogICAgIHJldHVybiBMSUJSRVNfRmluZFJlc291cmNlKCBoTW9kdWxlLCBuYW1lLCB0eXBlICk7CiAjZW5kaWYKQEAgLTc0LDIzICs3MSwyMCBAQAogICovCiBIR0xPQkFMIExvYWRSZXNvdXJjZSggSE1PRFVMRSBoTW9kdWxlLCBIUlNSQyBoUnNyYyApCiB7Ci0gICAgV09SRCAqcE1vZHVsZTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKICAgICBoTW9kdWxlID0gR2V0RXhlUHRyKCBoTW9kdWxlICk7ICAvKiBJbiBjYXNlIHdlIHdlcmUgcGFzc2VkIGFuIGhJbnN0YW5jZSAqLwogICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiTG9hZFJlc291cmNlOiBtb2R1bGU9JTA0eCByZXM9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIGhSc3JjICk7CiAgICAgaWYgKCFoUnNyYykgcmV0dXJuIDA7Ci0gICAgaWYgKCEocE1vZHVsZSA9IChXT1JEICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEocE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKICNpZm5kZWYgV0lORUxJQgotICAgIHN3aXRjaCgqcE1vZHVsZSkKKyAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCiAgICAgewotICAgICAgY2FzZSBORV9TSUdOQVRVUkU6Ci0gICAgICAgIHJldHVybiBORV9Mb2FkUmVzb3VyY2UoIGhNb2R1bGUsIGhSc3JjICk7Ci0gICAgICBjYXNlIFBFX1NJR05BVFVSRToKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRG9uJ3Qga25vdyBob3cgdG8gTG9hZFJlc291cmNlKCkgZm9yIFdpbjMyIG1vZHVsZVxuIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICByZXR1cm4gTkVfTG9hZFJlc291cmNlKCBoTW9kdWxlLCBoUnNyYyApOwogI2Vsc2UKICAgICByZXR1cm4gTElCUkVTX0xvYWRSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMgKTsKICNlbmRpZgpAQCAtMTA1LDIxICs5OSwxOCBAQAogewogI2lmbmRlZiBXSU5FTElCCiAgICAgSE1PRFVMRSBoTW9kdWxlOwotICAgIFdPUkQgKnBNb2R1bGU7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogCiAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJMb2NrUmVzb3VyY2U6IGhhbmRsZT0lMDR4XG4iLCBoYW5kbGUgKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIChTRUdQVFIpMDsKICAgICBoTW9kdWxlID0gR2V0RXhlUHRyKCBoYW5kbGUgKTsKLSAgICBpZiAoIShwTW9kdWxlID0gKFdPUkQgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKLSAgICBzd2l0Y2goKnBNb2R1bGUpCisgICAgaWYgKCEocE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKKyAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCiAgICAgewotICAgICAgY2FzZSBORV9TSUdOQVRVUkU6Ci0gICAgICAgIHJldHVybiBORV9Mb2NrUmVzb3VyY2UoIGhNb2R1bGUsIGhhbmRsZSApOwotICAgICAgY2FzZSBQRV9TSUdOQVRVUkU6Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIkRvbid0IGtub3cgaG93IHRvIExvY2tSZXNvdXJjZSgpIGZvciBXaW4zMiBtb2R1bGVcbiIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgcmV0dXJuIE5FX0xvY2tSZXNvdXJjZSggaE1vZHVsZSwgaGFuZGxlICk7CiAjZWxzZQogICAgIHJldHVybiBMSUJSRVNfTG9ja1Jlc291cmNlKCBoYW5kbGUgKTsKICNlbmRpZgpAQCAtMTMwLDIxICsxMjEsMTggQEAKIHsKICNpZm5kZWYgV0lORUxJQgogICAgIEhNT0RVTEUgaE1vZHVsZTsKLSAgICBXT1JEICpwTW9kdWxlOworICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAogICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiTG9ja1Jlc291cmNlOiBoYW5kbGU9JTA0eFxuIiwgaGFuZGxlICk7CiAgICAgaWYgKCFoYW5kbGUpIHJldHVybiBOVUxMOwogICAgIGhNb2R1bGUgPSBHZXRFeGVQdHIoIGhhbmRsZSApOwotICAgIGlmICghKHBNb2R1bGUgPSAoV09SRCAqKUdsb2JhbExvY2soIGhNb2R1bGUgKSkpIHJldHVybiAwOwotICAgIHN3aXRjaCgqcE1vZHVsZSkKKyAgICBpZiAoIShwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKSkpIHJldHVybiAwOworICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKICAgICB7Ci0gICAgICBjYXNlIE5FX1NJR05BVFVSRToKLSAgICAgICAgcmV0dXJuIChMUFNUUilQVFJfU0VHX1RPX0xJTiggTkVfTG9ja1Jlc291cmNlKCBoTW9kdWxlLCBoYW5kbGUgKSApOwotICAgICAgY2FzZSBQRV9TSUdOQVRVUkU6Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIkRvbid0IGtub3cgaG93IHRvIExvY2tSZXNvdXJjZSgpIGZvciBXaW4zMiBtb2R1bGVcbiIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgcmV0dXJuIChMUFNUUilQVFJfU0VHX1RPX0xJTiggTkVfTG9ja1Jlc291cmNlKCBoTW9kdWxlLCBoYW5kbGUgKSApOwogI2Vsc2UKICAgICByZXR1cm4gTElCUkVTX0xvY2tSZXNvdXJjZSggaGFuZGxlICk7CiAjZW5kaWYKQEAgLTE1OCwyMSArMTQ2LDE4IEBACiB7CiAjaWZuZGVmIFdJTkVMSUIKICAgICBITU9EVUxFIGhNb2R1bGU7Ci0gICAgV09SRCAqcE1vZHVsZTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKICAgICBkcHJpbnRmX3Jlc291cmNlKHN0ZGRlYiwgIkZyZWVSZXNvdXJjZTogaGFuZGxlPSUwNHhcbiIsIGhhbmRsZSApOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gRkFMU0U7CiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaGFuZGxlICk7Ci0gICAgaWYgKCEocE1vZHVsZSA9IChXT1JEICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7Ci0gICAgc3dpdGNoKCpwTW9kdWxlKQorICAgIGlmICghKHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7CisgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQogICAgIHsKLSAgICAgIGNhc2UgTkVfU0lHTkFUVVJFOgotICAgICAgICByZXR1cm4gTkVfRnJlZVJlc291cmNlKCBoTW9kdWxlLCBoYW5kbGUgKTsKLSAgICAgIGNhc2UgUEVfU0lHTkFUVVJFOgotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJEb24ndCBrbm93IGhvdyB0byBGcmVlUmVzb3VyY2UoKSBmb3IgV2luMzIgbW9kdWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIHJldHVybiBORV9GcmVlUmVzb3VyY2UoIGhNb2R1bGUsIGhhbmRsZSApOwogI2Vsc2UKICAgICByZXR1cm4gTElCUkVTX0ZyZWVSZXNvdXJjZSggaGFuZGxlICk7CiAjZW5kaWYKQEAgLTE4NCwyNSArMTY5LDIyIEBACiAgKi8KIElOVCBBY2Nlc3NSZXNvdXJjZSggSElOU1RBTkNFIGhNb2R1bGUsIEhSU1JDIGhSc3JjICkKIHsKLSAgICBXT1JEICpwTW9kdWxlOworICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKIAogICAgIGhNb2R1bGUgPSBHZXRFeGVQdHIoIGhNb2R1bGUgKTsgIC8qIEluIGNhc2Ugd2Ugd2VyZSBwYXNzZWQgYW4gaEluc3RhbmNlICovCiAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsICJBY2Nlc3NSZXNvdXJjZTogbW9kdWxlPSUwNHggcmVzPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYyApOwogICAgIGlmICghaFJzcmMpIHJldHVybiAwOwotICAgIGlmICghKHBNb2R1bGUgPSAoV09SRCAqKUdsb2JhbExvY2soIGhNb2R1bGUgKSkpIHJldHVybiAwOworICAgIGlmICghKHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7CiAjaWZuZGVmIFdJTkVMSUIKLSAgICBzd2l0Y2goKnBNb2R1bGUpCisgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQogICAgIHsKLSAgICAgIGNhc2UgTkVfU0lHTkFUVVJFOgotICAgICAgICByZXR1cm4gTkVfQWNjZXNzUmVzb3VyY2UoIGhNb2R1bGUsIGhSc3JjICk7Ci0gICAgICBjYXNlIFBFX1NJR05BVFVSRToKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRG9uJ3Qga25vdyBob3cgdG8gQWNjZXNzUmVzb3VyY2UoKSBmb3IgV2luMzIgbW9kdWxlXG4iKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIHJldHVybiBORV9BY2Nlc3NSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMgKTsKICNlbHNlCi0gICAgICAgIHJldHVybiBMSUJSRVNfQWNjZXNzUmVzb3VyY2UoIGhNb2R1bGUsIGhSc3JjICk7CisgICAgcmV0dXJuIExJQlJFU19BY2Nlc3NSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMgKTsKICNlbmRpZgogfQogCkBAIC0yMTIsMjIgKzE5NCwxOSBAQAogICovCiBEV09SRCBTaXplb2ZSZXNvdXJjZSggSE1PRFVMRSBoTW9kdWxlLCBIUlNSQyBoUnNyYyApCiB7Ci0gICAgV09SRCAqcE1vZHVsZTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKICAgICBoTW9kdWxlID0gR2V0RXhlUHRyKCBoTW9kdWxlICk7ICAvKiBJbiBjYXNlIHdlIHdlcmUgcGFzc2VkIGFuIGhJbnN0YW5jZSAqLwogICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiU2l6ZW9mUmVzb3VyY2U6IG1vZHVsZT0lMDR4IHJlcz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgaFJzcmMgKTsKLSAgICBpZiAoIShwTW9kdWxlID0gKFdPUkQgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKSkpIHJldHVybiAwOwogI2lmbmRlZiBXSU5FTElCCi0gICAgc3dpdGNoKCpwTW9kdWxlKQorICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKICAgICB7Ci0gICAgICBjYXNlIE5FX1NJR05BVFVSRToKLSAgICAgICAgcmV0dXJuIE5FX1NpemVvZlJlc291cmNlKCBoTW9kdWxlLCBoUnNyYyApOwotICAgICAgY2FzZSBQRV9TSUdOQVRVUkU6Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIkRvbid0IGtub3cgaG93IHRvIFNpemVPZlJlc291cmNlKCkgZm9yIFdpbjMyIG1vZHVsZVxuIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICByZXR1cm4gTkVfU2l6ZW9mUmVzb3VyY2UoIGhNb2R1bGUsIGhSc3JjICk7CiAjZWxzZQogICAgIHJldHVybiBMSUJSRVNfU2l6ZW9mUmVzb3VyY2UoIGhNb2R1bGUsIGhSc3JjICk7CiAjZW5kaWYKQEAgLTIzOSwyMyArMjE4LDIwIEBACiAgKi8KIEhHTE9CQUwgQWxsb2NSZXNvdXJjZSggSE1PRFVMRSBoTW9kdWxlLCBIUlNSQyBoUnNyYywgRFdPUkQgc2l6ZSApCiB7Ci0gICAgV09SRCAqcE1vZHVsZTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKICAgICBoTW9kdWxlID0gR2V0RXhlUHRyKCBoTW9kdWxlICk7ICAvKiBJbiBjYXNlIHdlIHdlcmUgcGFzc2VkIGFuIGhJbnN0YW5jZSAqLwogICAgIGRwcmludGZfcmVzb3VyY2Uoc3RkZGViLCAiQWxsb2NSZXNvdXJjZTogbW9kdWxlPSUwNHggcmVzPSUwNHggc2l6ZT0lbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBoUnNyYywgc2l6ZSApOwogICAgIGlmICghaFJzcmMpIHJldHVybiAwOwotICAgIGlmICghKHBNb2R1bGUgPSAoV09SRCAqKUdsb2JhbExvY2soIGhNb2R1bGUgKSkpIHJldHVybiAwOworICAgIGlmICghKHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7CiAjaWZuZGVmIFdJTkVMSUIKLSAgICBzd2l0Y2goKnBNb2R1bGUpCisgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQogICAgIHsKLSAgICAgIGNhc2UgTkVfU0lHTkFUVVJFOgotICAgICAgICByZXR1cm4gTkVfQWxsb2NSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMsIHNpemUgKTsKLSAgICAgIGNhc2UgUEVfU0lHTkFUVVJFOgotICAgICAgICByZXR1cm4gMDsKLSAgICAgIGRlZmF1bHQ6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJEb24ndCBrbm93IGhvdyB0byBBbGxvY1Jlc291cmNlKCkgZm9yIFdpbjMyIG1vZHVsZVxuIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICByZXR1cm4gTkVfQWxsb2NSZXNvdXJjZSggaE1vZHVsZSwgaFJzcmMsIHNpemUgKTsKICNlbHNlCiAgICAgcmV0dXJuIExJQlJFU19BbGxvY1Jlc291cmNlKCBoTW9kdWxlLCBoUnNyYywgc2l6ZSApOwogI2VuZGlmCkBAIC0zNTAsOSArMzI2LDkgQEAKIAkgICAgICAgKG1zZy0+bWVzc2FnZSA9PSBXTV9LRVlET1dOIHx8IG1zZy0+bWVzc2FnZSA9PSBXTV9TWVNLRVlET1dOKSkgewogCQlJTlQgbWFzayA9IDA7CiAKLQkJaWYoR2V0S2V5U3RhdGUoVktfU0hJRlQpICYgMHhmKSBtYXNrIHw9IFNISUZUX0FDQ0VMOwotCQlpZihHZXRLZXlTdGF0ZShWS19DT05UUk9MKSAmIDB4ZikgbWFzayB8PSBDT05UUk9MX0FDQ0VMOwotCQlpZihHZXRLZXlTdGF0ZShWS19NRU5VKSAmIDB4ZikgbWFzayB8PSBBTFRfQUNDRUw7CisJCWlmKEdldEtleVN0YXRlKFZLX1NISUZUKSAmIDB4ODAwMCkgbWFzayB8PSBTSElGVF9BQ0NFTDsKKwkJaWYoR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgJiAweDgwMDApIG1hc2sgfD0gQ09OVFJPTF9BQ0NFTDsKKwkJaWYoR2V0S2V5U3RhdGUoVktfTUVOVSkgJiAweDgwMDApIG1hc2sgfD0gQUxUX0FDQ0VMOwogCQlpZihtYXNrID09IChscEFjY2VsVGJsLT50YmxbaV0udHlwZSAmCiAJCQkgICAgKFNISUZUX0FDQ0VMIHwgQ09OVFJPTF9BQ0NFTCB8IEFMVF9BQ0NFTCkpKSB7CiAJCSAgICBTZW5kTWVzc2FnZShoV25kLCBXTV9DT01NQU5ELCBscEFjY2VsVGJsLT50YmxbaV0ud0lEdmFsLApkaWZmIC0tZ2l0IGEvbG9hZGVyL3NpZ25hbC5jIGIvbG9hZGVyL3NpZ25hbC5jCmluZGV4IDk5NTc0MWIuLjhlYmMwYjYgMTAwNjQ0Ci0tLSBhL2xvYWRlci9zaWduYWwuYworKysgYi9sb2FkZXIvc2lnbmFsLmMKQEAgLTcsNiArNyw5IEBACiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHNldGptcC5oPgogCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZWIuaD4KKwogI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX3N2cjRfXykKICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgpAQCAtNDMsNyArNDYsMzMgQEAKICNlbmRpZgogCiAKLSNpZiBkZWZpbmVkKGxpbnV4KSAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJd2luZV90aW1lcgorICoKKyAqIFNJR0FMUk0gaGFuZGxlci4KKyAqLworI2lmZGVmIGxpbnV4CitzdGF0aWMgdm9pZCB3aW5lX3RpbWVyKGludCBzaWduYWwsIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCBjb250ZXh0X3N0cnVjdCkKK3sKKyNlbGlmIGRlZmluZWQoX19zdnI0X18pCitzdGF0aWMgdm9pZCB3aW5lX3RpbWVyKGludCBzaWduYWwsIHZvaWQgKnNpZ2luZm8sIHVjb250ZXh0X3QgKmNvbnRleHQpCit7CisjZWxzZQorc3RhdGljIHZvaWQgd2luZV90aW1lcihpbnQgc2lnbmFsLCBpbnQgY29kZSwgc3RydWN0IHNpZ2NvbnRleHQgKmNvbnRleHQpCit7CisjZW5kaWYKKyAgICAvKiBTaG91bGQgZG8gcmVhbC10aW1lIHRpbWVycyBoZXJlICovCisKKyAgICBET1NNRU1fVGljaygpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJd2luX2ZhdWx0CisgKgorICogU2VnZmF1bHQgaGFuZGxlci4KKyAqLworI2lmZGVmIGxpbnV4CiBzdGF0aWMgdm9pZCB3aW5fZmF1bHQoaW50IHNpZ25hbCwgc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0IGNvbnRleHRfc3RydWN0KQogewogICAgIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCA9ICZjb250ZXh0X3N0cnVjdDsKQEAgLTk5LDYgKzEyOCw3IEBACiAKICNpZmRlZiBsaW51eAogICAgIHNpZ19hY3Quc2FfaGFuZGxlciA9IGZ1bmM7CisgICAgc2lnX2FjdC5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7CiAgICAgLyogUG9pbnQgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG1pbnVzIDQganVzdCBpbiBjYXNlLCBhbmQgbWFrZQogICAgICAgIGl0IGFsaWduZWQgICovCiAgICAgc2lnX2FjdC5zYV9yZXN0b3JlciA9IApAQCAtMTMxLDE0ICsxNjEsMTQgQEAKICAgICB9CiB9CiAKK2V4dGVybiB2b2lkIHN0b3Bfd2FpdChpbnQgYSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQlpbml0X3dpbmVfc2lnbmFscwogICovCiB2b2lkIGluaXRfd2luZV9zaWduYWxzKHZvaWQpCiB7Ci0gICAgZXh0ZXJuIHZvaWQgc3RvcF93YWl0KGludCBhKTsKLQogI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKICAgICBzdHJ1Y3Qgc2lnYWx0c3RhY2sgc3M7CiAgICAgICAgIApAQCAtMTc0LDcgKzIwNCw4IEBACiAgICAgICAgIGV4aXQoMSk7CiAgICAgfQogI2VuZGlmICAvKiBfX3N2cjRfXyAqLwotCisgICAgCisgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR0FMUk0sICh2b2lkICgqKSgpKXdpbmVfdGltZXIgKTsKICAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHU0VHViwgKHZvaWQgKCopKCkpd2luX2ZhdWx0ICk7CiAgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR0lMTCwgICh2b2lkICgqKSgpKXdpbl9mYXVsdCApOwogICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdGUEUsICAodm9pZCAoKikoKSl3aW5fZmF1bHQgKTsKQEAgLTE4Niw2ICsyMTcsMjQgQEAKICNpZmRlZiBDT05GSUdfSVBDCiAgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR1VTUjIsICh2b2lkICgqKSgpKXN0b3Bfd2FpdCApOyAvKiBGb3IgSVBDICovCiAjZW5kaWYKKyAgICBTSUdOQUxfU3RhcnRCSU9TVGltZXIoKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVNJR05BTF9TdGFydFRpbWVyCisgKgorICogU3RhcnQgdGhlIEJJT1MgdGljayB0aW1lci4KKyAqLwordm9pZCBTSUdOQUxfU3RhcnRCSU9TVGltZXIodm9pZCkKK3sKKyAgICBzdHJ1Y3QgaXRpbWVydmFsIHZ0X3RpbWVyOworCisgICAgdnRfdGltZXIuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKyAgICB2dF90aW1lci5pdF9pbnRlcnZhbC50dl91c2VjID0gNTQ5Mjk7CisgICAgdnRfdGltZXIuaXRfdmFsdWUgPSB2dF90aW1lci5pdF9pbnRlcnZhbDsKKworICAgIHNldGl0aW1lcihJVElNRVJfUkVBTCwgJnZ0X3RpbWVyLCBOVUxMKTsKIH0KIAogI2VuZGlmIC8qIGlmbmRlZiBXSU5FTElCICovCmRpZmYgLS1naXQgYS9sb2FkZXIvdGFzay5jIGIvbG9hZGVyL3Rhc2suYwppbmRleCAxYjZjNTU3Li4wZmM0YTY3IDEwMDY0NAotLS0gYS9sb2FkZXIvdGFzay5jCisrKyBiL2xvYWRlci90YXNrLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJxdWV1ZS5oIgotI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgInRvb2xoZWxwLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtMzQsNiArMzMsOSBAQAogICAvKiBNdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gNjRrLCBvciBNQUtFX1NFR1BUUiB3b24ndCB3b3JrICovCiAjZGVmaW5lIFNUQUNLMzJfU0laRSAweDEwMDAwCiAKK2V4dGVybiB2b2lkIFRJTUVSX1N3aXRjaFF1ZXVlKEhRVUVVRSwgSFFVRVVFICk7CitleHRlcm4gdm9pZCBUSU1FUl9OdWtlVGltZXJzKEhXTkQsIEhRVUVVRSApOworCiAvKiAtLS0tLS0gSW50ZXJuYWwgdmFyaWFibGVzIC0tLS0tLSAqLwogCiBzdGF0aWMgSFRBU0sgaEZpcnN0VGFzayA9IDA7CkBAIC02MSw3ICs2Myw3IEBACiAgKi8KIEJPT0wgVEFTS19Jbml0KHZvaWQpCiB7Ci0gICAgVEFTS19SZXNjaGVkdWxlUHJvYyA9IChGQVJQUk9DKUdldFduZFByb2NFbnRyeTE2KCAiVEFTS19SZXNjaGVkdWxlIiApOworICAgIFRBU0tfUmVzY2hlZHVsZVByb2MgPSBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoICJUQVNLX1Jlc2NoZWR1bGUiICk7CiAgICAgaWYgKCEoaERPU0Vudmlyb25tZW50ID0gVEFTS19DcmVhdGVET1NFbnZpcm9ubWVudCgpKSkKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIERPUyBFbnZpcm9ubWVudFxuIiApOwogICAgIHJldHVybiAoaERPU0Vudmlyb25tZW50ICE9IDApOwpAQCAtNTgxLDYgKzU4MywxMCBAQAogCiAgICAgRklMRV9DbG9zZUFsbEZpbGVzKCBwVGFzay0+aFBEQiApOwogCisgICAgLyogTnVrZSB0aW1lcnMgKi8KKworICAgIFRJTUVSX051a2VUaW1lcnMoIDAsIHBUYXNrLT5oUXVldWUgKTsKKwogICAgIC8qIEZyZWUgdGhlIG1lc3NhZ2UgcXVldWUgKi8KIAogICAgIFFVRVVFX0RlbGV0ZU1zZ1F1ZXVlKCBwVGFzay0+aFF1ZXVlICk7CkBAIC05OTksOCArMTAwNSwxMiBAQAogCiAgICAgaWYgKCFoVGFzaykgaFRhc2sgPSBoQ3VycmVudFRhc2s7CiAgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jayggaFRhc2sgKSkpIHJldHVybiAwOworCiAgICAgaFByZXYgPSBwVGFzay0+aFF1ZXVlOwogICAgIHBUYXNrLT5oUXVldWUgPSBoUXVldWU7CisKKyAgICBUSU1FUl9Td2l0Y2hRdWV1ZSggaFByZXYsIGhRdWV1ZSApOworCiAgICAgcmV0dXJuIGhQcmV2OwogfQogCkBAIC0xMTUzLDggKzExNjMsNiBAQAogCiAgICAgaWYgKCEocHRyID0gR2xvYmFsTG9jayggaGFuZGxlICkpKSByZXR1cm4gMDsKICAgICBpZiAoKChORV9NT0RVTEUgKilwdHIpLT5tYWdpYyA9PSBORV9TSUdOQVRVUkUpIHJldHVybiBoYW5kbGU7Ci0JLyogRmFrZSBtb2R1bGVzIGRlc2NyaWJpbmcgUEUgbW9kdWxlcyBoYXZlIGEgUEUgc2lnbmF0dXJlICovCi0gICAgaWYgKCgoTkVfTU9EVUxFICopcHRyKS0+bWFnaWMgPT0gUEVfU0lHTkFUVVJFKSByZXR1cm4gaGFuZGxlOwogCiAgICAgICAvKiBDaGVjayB0aGUgb3duZXIgZm9yIG1vZHVsZSBoYW5kbGUgKi8KIApAQCAtMTE2NSw3ICsxMTczLDYgQEAKICNlbmRpZgogICAgIGlmICghKHB0ciA9IEdsb2JhbExvY2soIG93bmVyICkpKSByZXR1cm4gMDsKICAgICBpZiAoKChORV9NT0RVTEUgKilwdHIpLT5tYWdpYyA9PSBORV9TSUdOQVRVUkUpIHJldHVybiBvd25lcjsKLSAgICBpZiAoKChORV9NT0RVTEUgKilwdHIpLT5tYWdpYyA9PSBQRV9TSUdOQVRVUkUpIHJldHVybiBvd25lcjsKIAogICAgICAgLyogU2VhcmNoIGZvciB0aGlzIGhhbmRsZSBhbmQgaXRzIG93bmVyIGluc2lkZSBhbGwgdGFza3MgKi8KIApkaWZmIC0tZ2l0IGEvbWlzYy9NYWtlZmlsZS5pbiBiL21pc2MvTWFrZWZpbGUuaW4KaW5kZXggNDE5NmMxYy4uMTI2NmIwNSAxMDA2NDQKLS0tIGEvbWlzYy9NYWtlZmlsZS5pbgorKysgYi9taXNjL01ha2VmaWxlLmluCkBAIC0yMSw2ICsyMSw3IEBACiAJb2xlc3ZyLmMgXAogCXBvcnQuYyBcCiAJcmVjdC5jIFwKKwlyZWdpc3RyeS5jIFwKIAlzaGVsbC5jIFwKIAlzb3VuZC5jIFwKIAlzcHkuYyBcCmRpZmYgLS1naXQgYS9taXNjL2NvbW1kbGcuYyBiL21pc2MvY29tbWRsZy5jCmluZGV4IDNkMjQyZjcuLjY2YmVjZWQgMTAwNjQ0Ci0tLSBhL21pc2MvY29tbWRsZy5jCisrKyBiL21pc2MvY29tbWRsZy5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSAibWVzc2FnZS5oIgogI2luY2x1ZGUgImNvbW1kbGcuaCIKICNpbmNsdWRlICJkbGdzLmgiCi0jaW5jbHVkZSAic2VsZWN0b3JzLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKICNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJkcml2ZS5oIgpAQCAtODMsNyArODMsNyBAQAogCiAgICAgaEluc3QgPSBXSU5fR2V0V2luZG93SW5zdGFuY2UoIGxwb2ZuLT5od25kT3duZXIgKTsKICAgICBiUmV0ID0gRGlhbG9nQm94SW5kaXJlY3RQYXJhbSggaEluc3QsIGhEbGdUbXBsLCBscG9mbi0+aHduZE93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiRmlsZU9wZW5EbGdQcm9jIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiRmlsZU9wZW5EbGdQcm9jIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClscG9mbiApOwogCiAgICAgaWYgKCEobHBvZm4tPkZsYWdzICYgT0ZOX0VOQUJMRVRFTVBMQVRFSEFORExFKSkKQEAgLTEyNSw3ICsxMjUsNyBAQAogCiAgICAgaEluc3QgPSBXSU5fR2V0V2luZG93SW5zdGFuY2UoIGxwb2ZuLT5od25kT3duZXIgKTsKICAgICBiUmV0ID0gRGlhbG9nQm94SW5kaXJlY3RQYXJhbSggaEluc3QsIGhEbGdUbXBsLCBscG9mbi0+aHduZE93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiRmlsZVNhdmVEbGdQcm9jIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiRmlsZVNhdmVEbGdQcm9jIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClscG9mbik7IAogICAgIGlmICghKGxwb2ZuLT5GbGFncyAmIE9GTl9FTkFCTEVURU1QTEFURUhBTkRMRSkpCiAgICAgewpAQCAtNjg2LDcgKzY4Niw3IEBACiAgICAgaERsZ1RtcGwgPSBTWVNSRVNfTG9hZFJlc291cmNlKCBTWVNSRVNfRElBTE9HX0NIT09TRV9DT0xPUiApOwogICAgIGhJbnN0ID0gV0lOX0dldFdpbmRvd0luc3RhbmNlKCBscENoQ29sLT5od25kT3duZXIgKTsKICAgICBiUmV0ID0gRGlhbG9nQm94SW5kaXJlY3RQYXJhbSggaEluc3QsIGhEbGdUbXBsLCBscENoQ29sLT5od25kT3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFduZFByb2NFbnRyeTE2KCJDb2xvckRsZ1Byb2MiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiQ29sb3JEbGdQcm9jIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpbHBDaENvbCApOwogICAgIFNZU1JFU19GcmVlUmVzb3VyY2UoIGhEbGdUbXBsICk7CiAgICAgcmV0dXJuIGJSZXQ7CkBAIC03NDEsNyArNzQxLDcgQEAKICAgICBoSW5zdCA9IFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggbHBGaW5kLT5od25kT3duZXIgKTsKICAgICBpZiAoIShwdHIgPSAoU0VHUFRSKVdJTjE2X0dsb2JhbExvY2soIGhEbGdUbXBsICkpKSByZXR1cm4gLTE7CiAgICAgYlJldCA9IENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0oIGhJbnN0LCBwdHIsIGxwRmluZC0+aHduZE93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiRmluZFRleHREbGdQcm9jIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiRmluZFRleHREbGdQcm9jIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClscEZpbmQgKTsKICAgICBHbG9iYWxVbmxvY2soIGhEbGdUbXBsICk7CiAgICAgU1lTUkVTX0ZyZWVSZXNvdXJjZSggaERsZ1RtcGwgKTsKQEAgLTc3MCw3ICs3NzAsNyBAQAogICAgIGhJbnN0ID0gV0lOX0dldFdpbmRvd0luc3RhbmNlKCBscEZpbmQtPmh3bmRPd25lciApOwogICAgIGlmICghKHB0ciA9IChTRUdQVFIpV0lOMTZfR2xvYmFsTG9jayggaERsZ1RtcGwgKSkpIHJldHVybiAtMTsKICAgICBiUmV0ID0gQ3JlYXRlRGlhbG9nSW5kaXJlY3RQYXJhbSggaEluc3QsIHB0ciwgbHBGaW5kLT5od25kT3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFduZFByb2NFbnRyeTE2KCJSZXBsYWNlVGV4dERsZ1Byb2MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCJSZXBsYWNlVGV4dERsZ1Byb2MiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKWxwRmluZCApOwogICAgIEdsb2JhbFVubG9jayggaERsZ1RtcGwgKTsKICAgICBTWVNSRVNfRnJlZVJlc291cmNlKCBoRGxnVG1wbCApOwpAQCAtMTAxNyw4ICsxMDE3LDggQEAKICAgICBoSW5zdCA9IFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggbHBQcmludC0+aHduZE93bmVyICk7CiAgICAgYlJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0oIGhJbnN0LCBoRGxnVG1wbCwgbHBQcmludC0+aHduZE93bmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobHBQcmludC0+RmxhZ3MgJiBQRF9QUklOVFNFVFVQKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiUHJpbnRTZXR1cERsZ1Byb2MiKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiUHJpbnREbGdQcm9jIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCJQcmludFNldHVwRGxnUHJvYyIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoIlByaW50RGxnUHJvYyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpbHBQcmludCApOwogICAgIFNZU1JFU19GcmVlUmVzb3VyY2UoIGhEbGdUbXBsICk7CiAgICAgcmV0dXJuIGJSZXQ7CmRpZmYgLS1naXQgYS9taXNjL2tleWJvYXJkLmMgYi9taXNjL2tleWJvYXJkLmMKaW5kZXggODA1OGE3Yy4uOGY4YzMxYiAxMDA2NDQKLS0tIGEvbWlzYy9rZXlib2FyZC5jCisrKyBiL21pc2Mva2V5Ym9hcmQuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImtleWJvYXJkLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTE5LDE0ICsyMCwyNyBAQAogCiAgICAgCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJUb0FzY2lpICglZCwlZClcbiIsd1ZpcnRLZXksIHdTY2FuQ29kZSk7CiAKLQkvKiBGSVhNRTogdGhpcyBpcyBub3Qgc3VmZmljaWVudCBidXQgYmV0dGVyIHRoYW4gcmV0dXJpbmcgLTEgKi8KKwkvKiBGSVhNRTogY29kZXBhZ2UgaXMgYnJva2VuICovCiAKIAlmb3IgKGkgPSAwIDsgaSAhPSBLZXlUYWJsZVNpemUgOyBpKyspIAotCQlpZiAoS2V5VGFibGVbaV0udmlydHVhbGtleSA9PSB3VmlydEtleSkgIHsKLQkJCSooQllURSopbHBDaGFyKysgPSAqS2V5VGFibGVbaV0ubmFtZTsKLQkJCSooQllURSopbHBDaGFyID0gMDsKKwkJaWYgKEtleVRhYmxlW2ldLnZpcnR1YWxrZXkgPT0gd1ZpcnRLZXkpICAKKwkJIHsKKwkJICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIlx0XHRjaGFyID0gJXNcbiIsIEtleVRhYmxlW2ldLm5hbWUpOworCQkgICBpZiggaXNwcmludChLZXlUYWJsZVtpXS5BU0NJSSkgfHwgaXNzcGFjZShLZXlUYWJsZVtpXS5BU0NJSSkgKQorCQkgICAgIHsKKwkJCSooQllURSopbHBDaGFyID0gS2V5VGFibGVbaV0uQVNDSUk7CisJCQkqKCgoQllURSopbHBDaGFyKSArIDEpID0gMDsKKworCQkJaWYoIGlzYWxwaGEoICooQllURSopbHBDaGFyICkgKQorCQkJICBpZiggKGxwS2V5U3RhdGVbVktfQ0FQSVRBTF08MCAmJiAhbHBLZXlTdGF0ZVtWS19TSElGVF0pIHx8CisJCQkgICAgICAoIWxwS2V5U3RhdGVbVktfQ0FQSVRBTF0gJiYgbHBLZXlTdGF0ZVtWS19TSElGVF08MCkgKQorCQkJICAgICAgKihCWVRFKilscENoYXIgPSB0b3VwcGVyKCAqKEJZVEUqKWxwQ2hhciApOworCQkJICBlbHNlCisJCQkgICAgICAqKEJZVEUqKWxwQ2hhciA9IHRvbG93ZXIoICooQllURSopbHBDaGFyICk7CisKIAkJCXJldHVybiAxOwotCQl9CisJCSAgICAgfQorCQkgfQogCiAJKihCWVRFKilscENoYXIgPSAwOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCAzNGYzYjk1Li5jYWEyNTNmIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtNTcsNiArNTcsNyBAQAogICAgICJEYSIsICAvKiBMQU5HX0RhICovCiAgICAgIkN6IiwgIC8qIExBTkdfQ3ogKi8KICAgICAiRW8iLCAgLyogTEFOR19FbyAqLworICAgICJJdCIsICAvKiBMQU5HX0l0ICovCiAgICAgTlVMTAogfTsKIApAQCAtMTM5LDcgKzE0MCw3IEBACiAgICIgICAgLWZpeGVkbWFwICAgICAgIFVzZSBhIFwic3RhbmRhcmRcIiBjb2xvciBtYXBcbiIgXAogICAiICAgIC1pY29uaWMgICAgICAgICBTdGFydCBhcyBhbiBpY29uXG4iIFwKICAgIiAgICAtaXBjICAgICAgICAgICAgRW5hYmxlIElQQyBmYWNpbGl0aWVzXG4iIFwKLSAgIiAgICAtbGFuZ3VhZ2UgeHggICAgU2V0IHRoZSBsYW5ndWFnZSAob25lIG9mIEVuLEVzLERlLE5vLEZyLEZpLERhLEN6LEVvKVxuIiBcCisgICIgICAgLWxhbmd1YWdlIHh4ICAgIFNldCB0aGUgbGFuZ3VhZ2UgKG9uZSBvZiBFbixFcyxEZSxObyxGcixGaSxEYSxDeixFbyxJdClcbiIgXAogICAiICAgIC1tYW5hZ2VkICAgICAgICBBbGxvdyB0aGUgd2luZG93IG1hbmFnZXIgdG8gbWFuYWdlIGNyZWF0ZWQgd2luZG93c1xuIiBcCiAgICIgICAgLW1vZGUgbW9kZSAgICAgIFN0YXJ0IFdpbmUgaW4gYSBwYXJ0aWN1bGFyIG1vZGUgKHN0YW5kYXJkIG9yIGVuaGFuY2VkKVxuIiBcCiAgICIgICAgLW5hbWUgbmFtZSAgICAgIFNldCB0aGUgYXBwbGljYXRpb24gbmFtZVxuIiBcCkBAIC0yNjUsMzIgKzI2NiwzMiBAQAogICovCiBzdGF0aWMgQk9PTCBNQUlOX1BhcnNlRExMT3B0aW9ucyhjaGFyICpvcHRpb25zKQogewotICBpbnQgbDsKLSAgaW50IGk7Ci0gIGlmIChzdHJsZW4ob3B0aW9ucyk8MykKLSAgICByZXR1cm4gRkFMU0U7Ci0gIGRvCi0gIHsKLSAgICBpZiAoKCpvcHRpb25zIT0nKycpJiYoKm9wdGlvbnMhPSctJykpCi0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKHN0cmNocihvcHRpb25zLCcsJykpCi0gICAgICBsPXN0cmNocihvcHRpb25zLCcsJyktb3B0aW9uczsKLSAgICBlbHNlIGw9c3RybGVuKG9wdGlvbnMpOwotICAgIGZvciAoaT0wO2k8Tl9CVUlMVElOUztpKyspCi0gICAgICAgICBpZiAoIWxzdHJuY21waShvcHRpb25zKzEsZGxsX2J1aWx0aW5fdGFibGVbaV0ubmFtZSxsLTEpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgZGxsX2J1aWx0aW5fdGFibGVbaV0udXNlZCA9ICgqb3B0aW9ucz09JysnKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgIGlmIChpPT1OX0JVSUxUSU5TKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIG9wdGlvbnMrPWw7Ci0gIH0KLSAgd2hpbGUoKCpvcHRpb25zPT0nLCcpJiYoKigrK29wdGlvbnMpKSk7Ci0gIGlmICgqb3B0aW9ucykKLSAgICByZXR1cm4gRkFMU0U7Ci0gIGVsc2UKLSAgICByZXR1cm4gVFJVRTsKKyAgICBpbnQgaSwgbDsKKyAgICBCVUlMVElOX0RMTCAqZGxsOworCisgICAgaWYgKHN0cmxlbihvcHRpb25zKTwzKSByZXR1cm4gRkFMU0U7CisgICAgZG8KKyAgICB7CisgICAgICAgIGlmICgoKm9wdGlvbnMhPScrJykgJiYgKCpvcHRpb25zIT0nLScpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChzdHJjaHIob3B0aW9ucywnLCcpKSBsPXN0cmNocihvcHRpb25zLCcsJyktb3B0aW9uczsKKyAgICAgICAgZWxzZSBsPXN0cmxlbihvcHRpb25zKTsKKyAgICAgICAgZm9yIChkbGwgPSBkbGxfYnVpbHRpbl90YWJsZTsgZGxsLT5uYW1lOyBkbGwrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFsc3RybmNtcGkob3B0aW9ucysxLGRsbC0+bmFtZSxsLTEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgqb3B0aW9ucyA9PSAnKycpIGRsbC0+ZmxhZ3MgJj0gfkRMTF9GTEFHX05PVF9VU0VEOworICAgICAgICAgICAgICAgIGVsc2UgZGxsLT5mbGFncyB8PSBETExfRkxBR19OT1RfVVNFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWRsbC0+bmFtZSkgcmV0dXJuIEZBTFNFOworICAgICAgICBvcHRpb25zKz1sOworICAgIH0KKyAgICB3aGlsZSgoKm9wdGlvbnM9PScsJykmJigqKCsrb3B0aW9ucykpKTsKKyAgICBpZiAoKm9wdGlvbnMpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBUUlVFOwogfQogI2VuZGlmCiAKQEAgLTQzMywxMiArNDM0LDEyIEBACiAgICAgICAgaWYoTUFJTl9QYXJzZURMTE9wdGlvbnMoKGNoYXIqKXZhbHVlLmFkZHIpPT1GQUxTRSkKICAgICAgICB7CiAgICAgICAgICBpbnQgaTsKKyAgICAgICAgIEJVSUxUSU5fRExMICpkbGw7CiAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IFN5bnRheDogLWRsbCAreHh4LC4uLiBvciAtZGxsIC14eHgsLi4uXG4iLGFyZ3ZbMF0pOwogICAgICAgICAgZnByaW50ZihzdGRlcnIsIkV4YW1wbGU6IC1kbGwgLW9sZTIgICAgRG8gbm90IHVzZSBlbXVsYXRlZCBPTEUyLkRMTFxuIik7CiAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQXZhaWxhYmxlIERMTHNcbiIpOwotICAgICAgICAgZm9yKGk9MDtpPE5fQlVJTFRJTlM7aSsrKQotICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiUtOXMlYyIsZGxsX2J1aWx0aW5fdGFibGVbaV0ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgKCgoaSsyKSU4PT0wKT8nXG4nOicgJykpOworICAgICAgICAgZm9yIChkbGwgPSBkbGxfYnVpbHRpbl90YWJsZTsgZGxsLT5uYW1lOyBkbGwrKykKKyAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJS05cyVjIixkbGwtPm5hbWUsICgoKGkrMiklOD09MCk/J1xuJzonICcpKTsKICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcblxuIik7CiAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KZGlmZiAtLWdpdCBhL21pc2Mvb2xlMm5scy5jIGIvbWlzYy9vbGUybmxzLmMKaW5kZXggNTFjZDM1NC4uZmM5MzMwMSAxMDA2NDQKLS0tIGEvbWlzYy9vbGUybmxzLmMKKysrIGIvbWlzYy9vbGUybmxzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBjYXNlIExBTkdfRGE6CiAgICAgY2FzZSBMQU5HX0N6OgogICAgIGNhc2UgTEFOR19FbzoKKyAgICBjYXNlIExBTkdfSXQ6CiAgICAgZGVmYXVsdDoKIAlyZXR1cm4gMDsgIC8qIE5ldXRyYWwgbGFuZ3VhZ2UgKi8KICAgICB9CkBAIC01MjMsNiArNTI0LDEzMCBAQAogLyogTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKSAqLwogICAgIGJyZWFrOyAgLyogTEFORyhFbykgKi8KKyAgICAKKyAgICBjYXNlIExBTkdfSXQ6CitMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpCitMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiSXRhbGlhbm8iKQorTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkl0YWxpYW4iKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsIml0YSIpCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiSXRhbGlhbm8iKQorTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiMzkiKQorTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiSXRhbGlhIikKK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkl0YWx5IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJJdCIpCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiSXRhbGlhIikKK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiMzkiKQorLyogRHVubm8KK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkKK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpCisqLworTE9DVkFMKExPQ0FMRV9TTElTVCwiOyIpCitMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCIwIikKK0xPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQorTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsIi4iKQorLyoKK0xPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKQorKi8KK0xPQ1ZBTChMT0NBTEVfSURJR0lUUywiMiIpCitMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCisvKgorTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSKQorSXMgdGhpcyAiMDEyMzQ1Njc4OSIgPz8KK0xPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUykKKyovCitMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwiTGl0LiIpCisvKgorTE9DVkFMKExPQ0FMRV9TSU5UTFNZTUJPTCkKK0xPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVApCitMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCkKK0xPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HKQorKi8KK0xPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsIjIiKQorLyoKK0xPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKQorKi8KK0xPQ1ZBTChMT0NBTEVfSUNVUlJFTkNZLCIzIikKK0xPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQorTE9DVkFMKExPQ0FMRV9TREFURSwiLiIpCitMT0NWQUwoTE9DQUxFX1NUSU1FLCI6IikKK0xPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwiZGQuTU0ueXl5eSIpCitMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBkLiBNTU1NIHl5eXkiKQorLyoKK0xPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpCisqLworTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpCisvKgorTE9DVkFMKExPQ0FMRV9JTERBVEUpCisqLworTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCisvKgorTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKQorTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkKKyovCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQorLyoKK0xPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKQorTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pCitMT0NWQUwoTE9DQUxFX1MxMTU5KQorTE9DVkFMKExPQ0FMRV9TMjM1OSkKK0xPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSkKK0xPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpCitMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykKK0xPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUikKKyovCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwiTHVuZWRpJyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwiTWFydGVkaSciKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIk1lcmNvbGVkaSciKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIkdpb3ZlZGknIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJWZW5lcmRpJyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwiU2FiYXRvIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJEb21lbmljYSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwiTHUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIk1hIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJNZSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwiR2kiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIlZlIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJTYSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiRG8iKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiR2VubmFpbyIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJGZWJicmFpbyIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCJNYXJ6byIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJBcHJpbGUiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNSwiTWFnZ2lvIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsIkdpdWdubyIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJMdWdsaW8iKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiQWdvc3RvIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksIlNldHRlbWJyZSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwiT3R0b2JyZSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwiTm92ZW1icmUiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsIkRpY2VtYnJlIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiR2VuIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsIkZlYiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCJNYXIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiQXByIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIk1hZyIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCJHaXUiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiTHVnIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIkFnbyIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCJTZXQiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIk90dCIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwiTm92IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJEaWMiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCisvKgorTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOKQorTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOKQorTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04pCitMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTikKK0xPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTKQorTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSkKK0xPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKQorTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkKKyovCisgICAgYnJlYWs7ICAvKiBMQU5HKEl0KSAqLworCiAKIC8qSW5zZXJ0IG90aGVyIGxhbmd1YWdlcyBoZXJlKi8KIApkaWZmIC0tZ2l0IGEvbWlzYy9yZWdpc3RyeS5jIGIvbWlzYy9yZWdpc3RyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZmYzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL3JlZ2lzdHJ5LmMKQEAgLTAsMCArMSwxODg1IEBACisvKgorICogCVJlZ2lzdHJ5IEZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAic3RyaW5nMzIuaCIJCisjaW5jbHVkZSAia2VybmVsMzIuaCIJLyogTFBTRUNVUklUWV9BVFRSSUJVVEVTICovCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJ3aW5yZWcuaCIKKworI2RlZmluZSBTQVZFX0NMQVNTRVNfUk9PVAkiL3RtcC9yZWcuY2xhc3Nlc19yb290IgorI2RlZmluZSBTQVZFX0NVUlJFTlRfVVNFUgkiL3RtcC9yZWcuY3VycmVudF91c2VyIgorI2RlZmluZSBTQVZFX0xPQ0FMX01BQ0hJTkUJIi90bXAvcmVnLmxvY2FsX21hY2hpbmUiCisjZGVmaW5lIFNBVkVfVVNFUlMJCSIvdG1wL3JlZy51c2VycyIKKworc3RhdGljIEtFWVNUUlVDVAkqa2V5X2NsYXNzZXNfcm9vdD1OVUxMOwkvKiB3aW5kb3dzIGdsb2JhbCB2YWx1ZXMgKi8KK3N0YXRpYyBLRVlTVFJVQ1QJKmtleV9jdXJyZW50X3VzZXI9TlVMTDsJLyogdXNlciBzcGVjaWZpYyB2YWx1ZXMgKi8KK3N0YXRpYyBLRVlTVFJVQ1QJKmtleV9sb2NhbF9tYWNoaW5lPU5VTEw7LyogbWFjaGluZSBzcGVjaWZpYyB2YWx1ZXMgKi8KK3N0YXRpYyBLRVlTVFJVQ1QJKmtleV91c2Vycz1OVUxMOwkvKiBhbGwgdXNlcnM/ICovCisKKy8qIGR5bmFtaWMsIG5vdCBzYXZlZCAqLworc3RhdGljIEtFWVNUUlVDVAkqa2V5X3BlcmZvcm1hbmNlX2RhdGE9TlVMTDsKK3N0YXRpYyBLRVlTVFJVQ1QJKmtleV9jdXJyZW50X2NvbmZpZz1OVUxMOworc3RhdGljIEtFWVNUUlVDVAkqa2V5X2R5bl9kYXRhPU5VTEw7CisKKy8qIHdoYXQgdmFsdWV0eXBlcyBkbyB3ZSBuZWVkIHRvIGNvbnZlcnQ/ICovCisjZGVmaW5lIFVOSUNPTlZNQVNLCSgoMTw8UkVHX1NaKXwoMTw8UkVHX01VTFRJX1NaKXwoMTw8UkVHX0VYUEFORF9TWikpCisKKyNkZWZpbmUgc3RyZHVwQTJXKHgpCVNUUklORzMyX0R1cEFuc2lUb1VuaSh4KQorI2RlZmluZSBzdHJkdXBXMkEoeCkJU1RSSU5HMzJfRHVwVW5pVG9BbnNpKHgpCisjZGVmaW5lIHN0cmR1cFcoeCkJU1RSSU5HMzJfc3RyZHVwVyh4KQorI2RlZmluZSBzdHJjbXBXKGEsYikJU1RSSU5HMzJfbHN0cmNtcFcoYSxiKQorI2RlZmluZSBzdHJjbXBuaVcoYSxiKQlTVFJJTkczMl9sc3RyY21wbmlXKGEsYikKKyNkZWZpbmUgc3RyY2hyVyhhLGMpCVNUUklORzMyX2xzdHJjaHJXKGEsYykKKyNkZWZpbmUgc3RybGVuVyhhKQlTVFJJTkczMl9VbmlMZW4oYSkKKyNkZWZpbmUgc3RyY3B5V0EoYSxiKQlTVFJJTkczMl9VbmlUb0Fuc2koYSxiKQorCitzdGF0aWMgc3RydWN0IG9wZW5oYW5kbGUgeworCUxQS0VZU1RSVUNUCWxwa2V5OworCUhLRVkJCWhrZXk7CisJUkVHU0FNCQlhY2Nlc3NtYXNrOworfSAgKm9wZW5oYW5kbGVzPU5VTEw7CitzdGF0aWMgaW50CW5yb2ZvcGVuaGFuZGxlcz0wOworc3RhdGljIGludAljdXJyZW50aGFuZGxlPTE7CisKK3N0YXRpYyB2b2lkCithZGRfaGFuZGxlKEhLRVkgaGtleSxMUEtFWVNUUlVDVCBscGtleSxSRUdTQU0gYWNjZXNzbWFzaykgeworCWludAlpOworCisJZm9yIChpPTA7aTxucm9mb3BlbmhhbmRsZXM7aSsrKSB7CisJCWlmIChvcGVuaGFuZGxlc1tpXS5scGtleT09bHBrZXkpIHsKKwkJCWRwcmludGZfcmVnKHN0ZGRlYiwiYWRkX2hhbmRsZTpUcmllZCB0byBhZGQgJXAgdHdpY2UhXG4iLGxwa2V5KTsKKwkJfQorCQlpZiAob3BlbmhhbmRsZXNbaV0uaGtleT09aGtleSkgeworCQkJZHByaW50Zl9yZWcoc3RkZGViLCJhZGRfaGFuZGxlOlRyaWVkIHRvIGFkZCAlbHggdHdpY2UhXG4iLChMT05HKWhrZXkpOworCQl9CisJfQorCW9wZW5oYW5kbGVzPXhyZWFsbG9jKAlvcGVuaGFuZGxlcywKKwkJCQlzaXplb2Yoc3RydWN0IG9wZW5oYW5kbGUpKihucm9mb3BlbmhhbmRsZXMrMSkKKwkJKTsKKwlvcGVuaGFuZGxlc1tpXS5scGtleQk9IGxwa2V5OworCW9wZW5oYW5kbGVzW2ldLmhrZXkJPSBoa2V5OworCW9wZW5oYW5kbGVzW2ldLmFjY2Vzc21hc2s9IGFjY2Vzc21hc2s7CisJbnJvZm9wZW5oYW5kbGVzKys7Cit9CisKK3N0YXRpYyBMUEtFWVNUUlVDVAorZ2V0X2hhbmRsZShoa2V5KSB7CisJaW50CWk7CisKKwlmb3IgKGk9MDtpPG5yb2ZvcGVuaGFuZGxlcztpKyspCisJCWlmIChvcGVuaGFuZGxlc1tpXS5oa2V5PT1oa2V5KQorCQkJcmV0dXJuIG9wZW5oYW5kbGVzW2ldLmxwa2V5OworCWRwcmludGZfcmVnKHN0ZGRlYiwiZ2V0X2hhbmRsZTpEaWRuJ3QgZmluZCBoYW5kbGUgJWx4P1xuIiwoTE9ORyloa2V5KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZV9oYW5kbGUoSEtFWSBoa2V5KSB7CisJaW50CWk7CisKKwlmb3IgKGk9MDtpPG5yb2ZvcGVuaGFuZGxlcztpKyspCisJCWlmIChvcGVuaGFuZGxlc1tpXS5oa2V5PT1oa2V5KQorCQkJYnJlYWs7CisJaWYgKGk9PW5yb2ZvcGVuaGFuZGxlcykgeworCQlkcHJpbnRmX3JlZyhzdGRkZWIsInJlbW92ZV9oYW5kbGU6RGlkbid0IGZpbmQgaGFuZGxlICVseD9cbiIsaGtleSk7CisJCXJldHVybjsKKwl9CisJbWVtY3B5KAlvcGVuaGFuZGxlcytpLAorCQlvcGVuaGFuZGxlcytpKzEsCisJCXNpemVvZihzdHJ1Y3Qgb3BlbmhhbmRsZSkqKG5yb2ZvcGVuaGFuZGxlcy1pLTEpCisJKTsKKwlvcGVuaGFuZGxlcz14cmVhbGxvYyhvcGVuaGFuZGxlcyxzaXplb2Yoc3RydWN0IG9wZW5oYW5kbGUpKihucm9mb3BlbmhhbmRsZXMtMSkpOworCW5yb2ZvcGVuaGFuZGxlcy0tOworCXJldHVybjsKK30KKworCisvKiBkZWJ1ZyBmdW5jdGlvbiwgY29udmVydHMgYSB1bmljb2RlIGludG8gYSBzdGF0aWMgbWVtb3J5IGFyZWEgCisgKiAoc3ViIGZvciB1c2luZyB0d28gc3RhdGljIHN0cmluZ3MsIGluIGNhc2Ugd2UgbmVlZCB0aGVtIGluIGEgc2luZ2xlIGNhbGwpCisgKi8KK0xQU1RSCitXMkMoTFBDV1NUUiB4LGludCBzdWIpIHsKKwlzdGF0aWMJTFBTVFIJdW5pY29kZWRlYnVnWzJdPXtOVUxMLE5VTEx9OworCWlmICh4PT1OVUxMKQorCQlyZXR1cm4gIjxOVUxMPiI7CisJaWYgKHN1YiE9MCAmJiBzdWIhPTEpCisJCXJldHVybiAiPFcyQzpiYWQgc3ViPiI7CisJaWYgKHVuaWNvZGVkZWJ1Z1tzdWJdKSBmcmVlKHVuaWNvZGVkZWJ1Z1tzdWJdKTsKKwl1bmljb2RlZGVidWdbc3ViXQk9IHN0cmR1cFcyQSh4KTsKKwlyZXR1cm4gdW5pY29kZWRlYnVnW3N1Yl07Cit9CisKK3N0YXRpYyBMUEtFWVNUUlVDVAorbG9va3VwX2hrZXkoSEtFWSBoa2V5KSB7CisJc3dpdGNoIChoa2V5KSB7CisJY2FzZSAweDAwMDAwMDAwOgorCWNhc2UgMHgwMDAwMDAwMToKKwljYXNlIEhLRVlfQ0xBU1NFU19ST09UOgorCQlyZXR1cm4ga2V5X2NsYXNzZXNfcm9vdDsKKwljYXNlIEhLRVlfQ1VSUkVOVF9VU0VSOgorCQlyZXR1cm4ga2V5X2N1cnJlbnRfdXNlcjsKKwljYXNlIEhLRVlfTE9DQUxfTUFDSElORToKKwkJcmV0dXJuIGtleV9sb2NhbF9tYWNoaW5lOworCWNhc2UgSEtFWV9VU0VSUzoKKwkJcmV0dXJuIGtleV91c2VyczsKKwljYXNlIEhLRVlfUEVSRk9STUFOQ0VfREFUQToKKwkJcmV0dXJuIGtleV9wZXJmb3JtYW5jZV9kYXRhOworCWNhc2UgSEtFWV9EWU5fREFUQToKKwkJcmV0dXJuIGtleV9keW5fZGF0YTsKKwljYXNlIEhLRVlfQ1VSUkVOVF9DT05GSUc6CisJCXJldHVybiBrZXlfY3VycmVudF9jb25maWc7CisJZGVmYXVsdDoKKwkJZHByaW50Zl9yZWcoc3RkZGViLCJsb29rdXBfaGtleSglbHgpLCBzcGVjaWFsIGtleSFcbiIsCisJCQkoTE9ORyloa2V5CisJCSk7CisJCXJldHVybiBnZXRfaGFuZGxlKGhrZXkpOworCX0KKwkvKk5PVFJFQUNIRUQqLworfQorCisvKiAKKyAqIHNwbGl0cyB0aGUgdW5pY29kZSBzdHJpbmcgJ3dwJyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuCisgKiB0aGUgYXJyYXkgaXMgYWxsb2NhdGVkIGJ5IHRoaXMgZnVuY3Rpb24uIAorICogdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHdpbGwgYmUgc3RvcmVkIGluICd3cGMnCisgKiBGcmVlIHRoZSBhcnJheSB1c2luZyBGUkVFX0tFWV9QQVRICisgKi8KK3N0YXRpYyB2b2lkCitzcGxpdF9rZXlwYXRoKExQQ1dTVFIgd3AsTFBXU1RSICoqd3B2LGludCAqd3BjKSB7CisJaW50CWksaixsZW47CisJTFBXU1RSCXdzOworCisJd3MJPSBzdHJkdXBXKHdwKTsKKwkqd3BjCT0gMTsKKwlmb3IgKGk9MDt3c1tpXTtpKyspIHsKKwkJaWYgKHdzW2ldPT0nXFwnKSB7CisJCQl3c1tpXT0wOworCQkJKCp3cGMpKys7CisJCX0KKwl9CisJbGVuCT0gaTsKKwkqd3B2CT0gKExQV1NUUiopeG1hbGxvYyhzaXplb2YoTFBXU1RSKSooKndwYysyKSk7CisJKCp3cHYpWzBdPSB3czsKKwlqCT0gMTsKKwlmb3IgKGk9MTtpPGxlbjtpKyspCisJCWlmICh3c1tpLTFdPT0wKQorCQkJKCp3cHYpW2orK109d3MraTsKKwkoKndwdilbal09TlVMTDsKK30KKyNkZWZpbmUgRlJFRV9LRVlfUEFUSAlmcmVlKHdwc1swXSk7ZnJlZSh3cHMpOworCisvKioKKyAqIFNoZWxsIGluaXRpYWxpc2F0aW9uLCBhbGxvY2F0ZXMga2V5cy4gCisgKiBGSVhNRTpzaG91bGQgc2V0IGRlZmF1bHQgdmFsdWVzIHRvbworICovCit2b2lkCitTSEVMTF9Jbml0KCkgeworI2RlZmluZSBBRERfUk9PVF9LRVkoeHgpIFwKKwl4eCA9IChMUEtFWVNUUlVDVCl4bWFsbG9jKHNpemVvZihLRVlTVFJVQ1QpKTtcCisJbWVtc2V0KHh4LCdcMCcsc2l6ZW9mKEtFWVNUUlVDVCkpO1wKKwl4eC0+a2V5bmFtZT0gc3RyZHVwQTJXKCI8c2hvdWxkX25vdF9hcHBlYXJfYW55d2hlcmU+Iik7CisKKwlBRERfUk9PVF9LRVkoa2V5X2NsYXNzZXNfcm9vdCk7CisJQUREX1JPT1RfS0VZKGtleV9jdXJyZW50X3VzZXIpOworCUFERF9ST09UX0tFWShrZXlfbG9jYWxfbWFjaGluZSk7CisJQUREX1JPT1RfS0VZKGtleV91c2Vycyk7CisJQUREX1JPT1RfS0VZKGtleV9wZXJmb3JtYW5jZV9kYXRhKTsKKwlBRERfUk9PVF9LRVkoa2V5X2N1cnJlbnRfY29uZmlnKTsKKwlBRERfUk9PVF9LRVkoa2V5X2R5bl9kYXRhKTsKKyN1bmRlZiBBRERfUk9PVF9LRVkKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBTQVZFIFJlZ2lzdHJ5IEZ1bmN0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUkVHSVNUUllfU0FWRV9WRVJTSU9OCTB4MDAwMDAwMDEKKworLyogUmVnaXN0cnkgc2F2ZWZvcm1hdDoKKyAqIElmIHlvdSBjaGFuZ2UgaXQsIGluY3JlYXNlIGFib3ZlIG51bWJlciBieSAxLCB3aGljaCB3aWxsIGZsdXNoCisgKiBvbGQgcmVnaXN0cnkgZGF0YWJhc2UgZmlsZXMuCisgKiAKKyAqIEdsb2JhbDoKKyAqIAlEV09SRAl2ZXJzaW9uCisgKiAJRFdPUkQJbnJvZmtleXMKKyAqCUtFWQlrZXlzW25yb2ZrZXlzXQorICoKKyAqIEtFWToKKyAqIAlVU1RSSU5HCW5hbWUKKyAqCVVTVFJJTkcgY2xhc3MKKyAqIAlEV09SRAlucm9mdmFsdWVzCisgKglWQUxVRQl2YWxzW25yb2Z2YWx1ZXNdCisgKiAJRFdPUkQJbnJvZnN1YmtleXMKKyAqCUtFWQlrZXlzW25yb2ZzdWJrZXlzXQorICoKKyAqIFZhbHVlOgorICogCVVTVFJJTkcJbmFtZQorICogCURXT1JECXR5cGUKKyAqIAlEV09SRAlsZW4KKyAqIAlCWVRFCWRhdGFbbGVuXQorICoKKyAqIFVTVFJJTkc6CisgKiAJRFdPUkQJbGVuIChsZW49PTAgbWVhbnMgZGF0YT1OVUxMKQorICogCUJZVEUJZGF0YVtsZW5dCisgKiAKKyAqCisgKiBBbGwgX3dyaXRlX1hYWCBhbmQgX3JlYWRfWFhYIGZ1bmN0aW9ucyByZXR1cm4gITAgb24gc3VjZXNzLgorICovCisKKworc3RhdGljIGludCAKK193cml0ZV9EV09SRChGSUxFICpGLERXT1JEIGR3KSB7CisJcmV0dXJuIGZ3cml0ZSgmZHcsc2l6ZW9mKGR3KSwxLEYpOworfQorCitzdGF0aWMgaW50Citfd3JpdGVfVVNUUklORyhGSUxFICpGLExQV1NUUiBzdHIpIHsKKwlpbnQJbGVuOworCisJaWYgKHN0cj09TlVMTCkgeworCQlpZiAoIV93cml0ZV9EV09SRChGLDApKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJbGVuPXN0cmxlblcoc3RyKSoyKzI7CisKKwkJaWYgKCFfd3JpdGVfRFdPUkQoRixsZW4pKQorCQkJcmV0dXJuIDA7CisJCWlmICghZndyaXRlKHN0cixsZW4sMSxGKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50CitfZG9fc2F2ZV9zdWJrZXkoRklMRSAqRixMUEtFWVNUUlVDVCBscGtleSkgeworCUxQS0VZU1RSVUNUCWxweGtleTsKKwlpbnQJCW5yb2ZrZXlzOworCWludAkJaTsKKworCW5yb2ZrZXlzPSAwOworCWxweGtleQk9IGxwa2V5OworCXdoaWxlIChscHhrZXkpIHsKKwkJaWYgKCEobHB4a2V5LT5mbGFncyAmIFJFR19PUFRJT05fVk9MQVRJTEUpKQorCQkJbnJvZmtleXMrKzsKKwkJbHB4a2V5CT0gbHB4a2V5LT5uZXh0OworCX0KKwlpZiAoIV93cml0ZV9EV09SRChGLG5yb2ZrZXlzKSkKKwkJcmV0dXJuIDA7CisKKwlscHhrZXkJPSBscGtleTsKKwl3aGlsZSAobHB4a2V5KSB7CisJCWlmICghKGxweGtleS0+ZmxhZ3MgJiBSRUdfT1BUSU9OX1ZPTEFUSUxFKSkgeworCQkJaWYgKCFfd3JpdGVfVVNUUklORyhGLGxweGtleS0+a2V5bmFtZSkpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoIV93cml0ZV9VU1RSSU5HKEYsbHB4a2V5LT5jbGFzcykpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoIV93cml0ZV9EV09SRChGLGxweGtleS0+bnJvZnZhbHVlcykpCisJCQkJcmV0dXJuIDA7CisJCQlmb3IgKGk9MDtpPGxweGtleS0+bnJvZnZhbHVlcztpKyspIHsKKwkJCQlMUEtFWVZBTFVFCXZhbD1scHhrZXktPnZhbHVlcytpOworCisJCQkJaWYgKCFfd3JpdGVfVVNUUklORyhGLHZhbC0+bmFtZSkpCisJCQkJCXJldHVybiAwOworCQkJCWlmICghX3dyaXRlX0RXT1JEKEYsdmFsLT50eXBlKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJaWYgKCFfd3JpdGVfRFdPUkQoRix2YWwtPmxlbikpCisJCQkJCXJldHVybiAwOworCQkJCWlmICghZndyaXRlKHZhbC0+ZGF0YSx2YWwtPmxlbiwxLEYpKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qIGRlc2NlbmQgcmVjdXJzaXZlbHkgKi8KKwkJCWlmICghX2RvX3NhdmVfc3Via2V5KEYsbHB4a2V5LT5uZXh0c3ViKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlscHhrZXk9bHB4a2V5LT5uZXh0OworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorX2RvX3NhdmVzdWJyZWcoRklMRSAqRixMUEtFWVNUUlVDVCBscGtleSkgeworCWlmICghX3dyaXRlX0RXT1JEKEYsUkVHSVNUUllfU0FWRV9WRVJTSU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIF9kb19zYXZlX3N1YmtleShGLGxwa2V5LT5uZXh0c3ViKTsKK30KKworc3RhdGljIHZvaWQKK19TYXZlU3ViUmVnKExQS0VZU1RSVUNUIGxwa2V5LGNoYXIgKmZuKSB7CisJRklMRQkqRjsKKworCUY9Zm9wZW4oZm4sIndiIik7CisJaWYgKEY9PU5VTEwpIHsKKwkJZnByaW50ZihzdGRkZWIsX19GSUxFX18iOl9TYXZlU3ViUmVnOkNvdWxkbid0IG9wZW4gJXMgZm9yIHdyaXRpbmc6ICVzXG4iLAorCQkJZm4sc3RyZXJyb3IoZXJybm8pCisJCSk7CisJCXJldHVybjsKKwl9CisJaWYgKCFfZG9fc2F2ZXN1YnJlZyhGLGxwa2V5KSkgeworCQlmY2xvc2UoRik7CisJCXVubGluayhmbik7CisJCWZwcmludGYoc3RkZGViLF9fRklMRV9fIjpfU2F2ZVN1YlJlZzpGYWlsZWQgdG8gc2F2ZSBrZXlzLCBwZXJoYXBzIG5vIG1vcmUgZGlza3NwYWNlIGZvciAlcz9cbiIsZm4pOworCQlyZXR1cm47CisJfQorCWZjbG9zZShGKTsKK30KKwordm9pZAorU0hFTExfU2F2ZVJlZ2lzdHJ5KCkgeworCV9TYXZlU3ViUmVnKGtleV9jbGFzc2VzX3Jvb3QsU0FWRV9DTEFTU0VTX1JPT1QpOworCV9TYXZlU3ViUmVnKGtleV9jdXJyZW50X3VzZXIsU0FWRV9DVVJSRU5UX1VTRVIpOworCV9TYXZlU3ViUmVnKGtleV9sb2NhbF9tYWNoaW5lLFNBVkVfTE9DQUxfTUFDSElORSk7CisJX1NhdmVTdWJSZWcoa2V5X3VzZXJzLFNBVkVfVVNFUlMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqIExPQUQgUmVnaXN0cnkgRnVuY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRklYTUU6IAorICogQ3VycmVudGx5IG92ZXJ3cml0ZXMgYW55IG9sZCByZWdpc3RyeSBkYXRhIChsZWFrcyBpdCBhd2F5KQorICogc2hvdWxkIGJldHRlciBiZSBhIG1lcmdlLCBvciA/CisgKi8KKworc3RhdGljIGludAorX3JlYWRfRFdPUkQoRklMRSAqRixEV09SRCAqZHcpIHsKKwlyZXR1cm4gZnJlYWQoZHcsc2l6ZW9mKERXT1JEKSwxLEYpOworfQorCitzdGF0aWMgaW50CitfcmVhZF9VU1RSSU5HKEZJTEUgKkYsTFBXU1RSICpzdHIpIHsKKwlEV09SRAlsZW47CisKKwlpZiAoIV9yZWFkX0RXT1JEKEYsJmxlbikpCisJCXJldHVybiAwOworCWlmIChsZW49PTApIHsKKwkJKnN0cj1OVUxMOworCQlyZXR1cm4gMTsKKwl9CisJKnN0cj14bWFsbG9jKGxlbik7CisJcmV0dXJuIGZyZWFkKCpzdHIsbGVuLDEsRik7Cit9CisKK3N0YXRpYyBpbnQKK19kb19sb2FkX3N1YmtleShGSUxFICpGLExQS0VZU1RSVUNUIGxwa2V5KSB7CisJRFdPUkQJCWhvd211Y2g7CisJTFBLRVlTVFJVQ1QJKmxwbHBrZXksbHB4a2V5OworCWludAkJaTsKKworCWlmICghX3JlYWRfRFdPUkQoRiwmaG93bXVjaCkpCisJCXJldHVybiAwOworCisJLyogbm8gc3Via2V5cz8gKi8KKwlpZiAoaG93bXVjaD09MCkKKwkJcmV0dXJuIDE7CisKKwlscGxwa2V5CT0gJihscGtleS0+bmV4dHN1Yik7CisJd2hpbGUgKGhvd211Y2gtLSkgeworCQkqbHBscGtleT0gKExQS0VZU1RSVUNUKXhtYWxsb2Moc2l6ZW9mKEtFWVNUUlVDVCkpOworCQltZW1zZXQoKmxwbHBrZXksJ1wwJyxzaXplb2YoS0VZU1RSVUNUKSk7CisJCWxweGtleQk9ICpscGxwa2V5OworCQlpZiAoIV9yZWFkX1VTVFJJTkcoRiwmKGxweGtleS0+a2V5bmFtZSkpKQorCQkJcmV0dXJuIDA7CisJCWlmICghX3JlYWRfVVNUUklORyhGLCYobHB4a2V5LT5jbGFzcykpKQorCQkJcmV0dXJuIDA7CisJCWlmICghX3JlYWRfRFdPUkQoRiwmKGxweGtleS0+bnJvZnZhbHVlcykpKQorCQkJcmV0dXJuIDA7CisJCWlmIChscHhrZXktPm5yb2Z2YWx1ZXMpIHsKKwkJCWxweGtleS0+dmFsdWVzID0gKExQS0VZVkFMVUUpeG1hbGxvYygKKwkJCQlscHhrZXktPm5yb2Z2YWx1ZXMqc2l6ZW9mKEtFWVZBTFVFKQorCQkJKTsKKwkJCWZvciAoaT0wO2k8bHB4a2V5LT5ucm9mdmFsdWVzO2krKykgeworCQkJCUxQS0VZVkFMVUUJdmFsPWxweGtleS0+dmFsdWVzK2k7CisKKwkJCQltZW1zZXQodmFsLCdcMCcsc2l6ZW9mKEtFWVZBTFVFKSk7CisJCQkJaWYgKCFfcmVhZF9VU1RSSU5HKEYsJih2YWwtPm5hbWUpKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJaWYgKCFfcmVhZF9EV09SRChGLCYodmFsLT50eXBlKSkpCisJCQkJCXJldHVybiAwOworCQkJCWlmICghX3JlYWRfRFdPUkQoRiwmKHZhbC0+bGVuKSkpCisJCQkJCXJldHVybiAwOworCQkJCXZhbC0+ZGF0YQk9IChMUEJZVEUpeG1hbGxvYyh2YWwtPmxlbik7CisJCQkJaWYgKCFmcmVhZCh2YWwtPmRhdGEsdmFsLT5sZW4sMSxGKSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJaWYgKCFfZG9fbG9hZF9zdWJrZXkoRiwqbHBscGtleSkpCisJCQlyZXR1cm4gMDsKKwkJbHBscGtleQk9ICYobHB4a2V5LT5uZXh0KTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK19kb19sb2Fkc3VicmVnKEZJTEUgKkYsTFBLRVlTVFJVQ1QgbHBrZXkpIHsKKwlEV09SRAl2ZXI7CisKKwlpZiAoIV9yZWFkX0RXT1JEKEYsJnZlcikpCisJCXJldHVybiAwOworCWlmICh2ZXIhPVJFR0lTVFJZX1NBVkVfVkVSU0lPTikgeworCQlkcHJpbnRmX3JlZyhzdGRkZWIsX19GSUxFX18iOl9kb19sb2Fkc3VicmVnOk9sZCBmb3JtYXQgKCVseCkgcmVnaXN0cnkgZm91bmQsIGlnbm9yaW5nIGl0LlxuIix2ZXIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFfZG9fbG9hZF9zdWJrZXkoRixscGtleSkpIHsKKwkJLyogRklYTUU6IG1lbW9yeSBsZWFrIG9uIGZhaWx1cmUgdG8gcmVhZCByZWdpc3RyeSAuLi4gCisJCSAqIEJ1dCB0aGlzIHdvbid0IGhhcHBlbiB2ZXJ5IG9mdGVuLgorCQkgKi8KKwkJbHBrZXktPm5leHRzdWI9TlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorX0xvYWRTdWJSZWcoTFBLRVlTVFJVQ1QgbHBrZXksY2hhciAqZm4pIHsKKwlGSUxFCSpGOworCisJRj1mb3BlbihmbiwicmIiKTsKKwlpZiAoRj09TlVMTCkgeworCQlkcHJpbnRmX3JlZyhzdGRkZWIsX19GSUxFX18iOkNvdWxkbid0IG9wZW4gJXMgZm9yIHJlYWRpbmc6ICVzXG4iLAorCQkJZm4sc3RyZXJyb3IoZXJybm8pCisJCSk7CisJCXJldHVybjsKKwl9CisJaWYgKCFfZG9fbG9hZHN1YnJlZyhGLGxwa2V5KSkgeworCQlmY2xvc2UoRik7CisJCXVubGluayhmbik7CisJfQorCWZjbG9zZShGKTsKK30KKwordm9pZAorU0hFTExfTG9hZFJlZ2lzdHJ5KCkgeworCWlmIChrZXlfY2xhc3Nlc19yb290PT1OVUxMKQorCQlTSEVMTF9Jbml0KCk7CisJX0xvYWRTdWJSZWcoa2V5X2NsYXNzZXNfcm9vdCxTQVZFX0NMQVNTRVNfUk9PVCk7CisJX0xvYWRTdWJSZWcoa2V5X2N1cnJlbnRfdXNlcixTQVZFX0NVUlJFTlRfVVNFUik7CisJX0xvYWRTdWJSZWcoa2V5X2xvY2FsX21hY2hpbmUsU0FWRV9MT0NBTF9NQUNISU5FKTsKKwlfTG9hZFN1YlJlZyhrZXlfdXNlcnMsU0FWRV9VU0VSUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKiogQVBJIEZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBPcGVuIEtleXMuIAorICoKKyAqIEFsbCBmdW5jdGlvbnMgYXJlIHN0dWJzIHRvIFJlZ09wZW5LZXlFeFcgd2hlcmUgYWxsIHRoZQorICogbWFnaWMgaGFwcGVucy4gCisgKgorICogRklYTUU6IHNlY3VyaXR5LG9wdGlvbnMsZGVzaXJlZGFjY2VzcywuLi4KKyAqCisgKiBDYWxscGF0aDoKKyAqIFJlZ09wZW5LZXkgLT4gUmVnT3BlbktleUEgLT4gUmVnT3BlbktleUV4QSBcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ09wZW5LZXlXICAgLT4gUmVnT3BlbktleUV4VyAKKyAqLworCisvKiBSZWdPcGVuS2V5RXhXCQlbQURWQVBJMzIuMTUwXSAqLworV0lOQVBJIERXT1JECitSZWdPcGVuS2V5RXhXKAorCUhLRVkJaGtleSwKKwlMUENXU1RSCWxwc3pTdWJLZXksCisJRFdPUkQJZHdSZXNlcnZlZCwKKwlSRUdTQU0Jc2FtRGVzaXJlZCwKKwlMUEhLRVkJcmV0a2V5CispIHsKKwlMUEtFWVNUUlVDVAlscE5leHRLZXksbHB4a2V5OworCUxQV1NUUgkJKndwczsKKwlpbnQJCXdwYyxpOworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleUV4VyglbHgsJXMsJWxkLCVseCwlcClcbiIsCisJCShMT05HKWhrZXksVzJDKGxwc3pTdWJLZXksMCksZHdSZXNlcnZlZCxzYW1EZXNpcmVkLHJldGtleQorCSk7CisKKwlscE5leHRLZXkJPSBsb29rdXBfaGtleShoa2V5KTsKKwlpZiAoIWxwTmV4dEtleSkKKwkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKKwlpZiAoIWxwc3pTdWJLZXkgfHwgISpscHN6U3ViS2V5KSB7CisJCWFkZF9oYW5kbGUoKytjdXJyZW50aGFuZGxlLGxwTmV4dEtleSxzYW1EZXNpcmVkKTsKKwkJKnJldGtleT1jdXJyZW50aGFuZGxlOworCQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKKwl9CisJc3BsaXRfa2V5cGF0aChscHN6U3ViS2V5LCZ3cHMsJndwYyk7CisJaSAJPSAwOworCWxweGtleQk9IGxwTmV4dEtleTsKKwl3aGlsZSAoaTx3cGMpIHsKKwkJbHB4a2V5PWxwTmV4dEtleS0+bmV4dHN1YjsKKwkJd2hpbGUgKGxweGtleSkgeworCQkJaWYgKCFzdHJjbXBXKHdwc1tpXSxscHhrZXktPmtleW5hbWUpKQorCQkJCWJyZWFrOworCQkJbHB4a2V5PWxweGtleS0+bmV4dDsKKwkJfQorCQlpZiAoIWxweGtleSkgeworCQkJRlJFRV9LRVlfUEFUSDsKKwkJCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7CisJCX0KKwkJaSsrOworCQlscE5leHRLZXkJPSBscHhrZXk7CisJfQorCWFkZF9oYW5kbGUoKytjdXJyZW50aGFuZGxlLGxweGtleSxzYW1EZXNpcmVkKTsKKwkqcmV0a2V5CT0gY3VycmVudGhhbmRsZTsKKwlGUkVFX0tFWV9QQVRIOworCXJldHVybglTSEVMTF9FUlJPUl9TVUNDRVNTOworfQorCisvKiBSZWdPcGVuS2V5VwkJCVtBRFZBUEkzMi4xNTFdICovCitXSU5BUEkgRFdPUkQKK1JlZ09wZW5LZXlXKAorCUhLRVkJaGtleSwKKwlMUENXU1RSCWxwc3pTdWJLZXksCisJTFBIS0VZCXJldGtleQorKSB7CisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdPcGVuS2V5VyglbHgsJXMsJXApXG4iLAorCQkoTE9ORyloa2V5LFcyQyhscHN6U3ViS2V5LDApLHJldGtleQorCSk7CisJcmV0dXJuIFJlZ09wZW5LZXlFeFcoaGtleSxscHN6U3ViS2V5LDAsS0VZX0FMTF9BQ0NFU1MscmV0a2V5KTsKK30KKworCisvKiBSZWdPcGVuS2V5RXhBCQlbQURWQVBJMzIuMTQ5XSAqLworV0lOQVBJIERXT1JECitSZWdPcGVuS2V5RXhBKAorCUhLRVkJaGtleSwKKwlMUENTVFIJbHBzelN1YktleSwKKwlEV09SRAlkd1Jlc2VydmVkLAorCVJFR1NBTQlzYW1EZXNpcmVkLAorCUxQSEtFWQlyZXRrZXkKKykgeworCUxQV1NUUglscHN6U3ViS2V5VzsKKwlEV09SRAlyZXQ7CisKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ09wZW5LZXlFeEEoJWx4LCVzLCVsZCwlbHgsJXApXG4iLAorCQkoTE9ORyloa2V5LGxwc3pTdWJLZXksZHdSZXNlcnZlZCxzYW1EZXNpcmVkLHJldGtleQorCSk7CisJaWYgKGxwc3pTdWJLZXkpCisJCWxwc3pTdWJLZXlXPXN0cmR1cEEyVyhscHN6U3ViS2V5KTsKKwllbHNlCisJCWxwc3pTdWJLZXlXPU5VTEw7CisJcmV0PVJlZ09wZW5LZXlFeFcoaGtleSxscHN6U3ViS2V5Vyxkd1Jlc2VydmVkLHNhbURlc2lyZWQscmV0a2V5KTsKKwlpZiAobHBzelN1YktleVcpCisJCWZyZWUobHBzelN1YktleVcpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlZ09wZW5LZXlBCQkJW0FEVkFQSTMyLjE0OF0gKi8KK1dJTkFQSSBEV09SRAorUmVnT3BlbktleUEoCisJSEtFWQloa2V5LAorCUxQQ1NUUglscHN6U3ViS2V5LAorCUxQSEtFWQlyZXRrZXkKKykgeworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleUEoJWx4LCVzLCVwKVxuIiwKKwkJKExPTkcpaGtleSxscHN6U3ViS2V5LHJldGtleQorCSk7CisJcmV0dXJuCVJlZ09wZW5LZXlFeEEoaGtleSxscHN6U3ViS2V5LDAsS0VZX0FMTF9BQ0NFU1MscmV0a2V5KTsKK30KKworLyogUmVnT3BlbktleQkJCVtTSEVMTC4xXSBbS0VSTkVMLjIxN10gKi8KK1dJTkFQSSBEV09SRAorUmVnT3BlbktleSgKKwlIS0VZCWhrZXksCisJTFBDU1RSCWxwc3pTdWJLZXksCisJTFBIS0VZCXJldGtleQorKSB7CisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdPcGVuS2V5KCVseCwlcywlcClcbiIsCisJCShMT05HKWhrZXksbHBzelN1YktleSxyZXRrZXkKKwkpOworCXJldHVybiBSZWdPcGVuS2V5QShoa2V5LGxwc3pTdWJLZXkscmV0a2V5KTsKK30KKworLyogCisgKiBDcmVhdGUga2V5cworICogCisgKiBBbGwgdGhvc2UgZnVuY3Rpb25zIGNvbnZlcnQgdGhlaXIgcmVzcGVjdGl2ZSAKKyAqIGFyZ3VtZW50cyBhbmQgY2FsbCBSZWdDcmVhdGVLZXlFeFcgYXQgdGhlIGVuZC4KKyAqCisgKiBGSVhNRTogbm8gc2VjdXJpdHksbm8gYWNjZXNzIGF0dHJpYixubyBvcHRpb25oYW5kbGluZyB5ZXQuCisgKgorICogQ2FsbHBhdGg6CisgKiBSZWdDcmVhdGVLZXkgLT4gUmVnQ3JlYXRlS2V5QSAtPiBSZWdDcmVhdGVLZXlFeEEgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnQ3JlYXRlS2V5VyAgIC0+IFJlZ0NyZWF0ZUtleUV4VworICovCisKKy8qIFJlZ0NyZWF0ZUtleUV4VwkJW0FEVkFQSTMyLjEzMV0gKi8KK1dJTkFQSSBEV09SRAorUmVnQ3JlYXRlS2V5RXhXKAorCUhLRVkJaGtleSwKKwlMUENXU1RSCWxwc3pTdWJLZXksCisJRFdPUkQJZHdSZXNlcnZlZCwKKwlMUFdTVFIJbHBzekNsYXNzLAorCURXT1JECWZkd09wdGlvbnMsCisJUkVHU0FNCXNhbURlc2lyZWQsCisJTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjQXR0cmlicywKKwlMUEhLRVkJcmV0a2V5LAorCUxQRFdPUkQJbHBEaXNwb3MKKykgeworCUxQS0VZU1RSVUNUCSpscGxwUHJldktleSxscE5leHRLZXksbHB4a2V5OworCUxQV1NUUgkJKndwczsKKwlpbnQJCXdwYyxpOworCisvKkZJWE1FOiBoYW5kbGUgc2VjdXJpdHkvYWNjZXNzL3doYXRldmVyICovCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdDcmVhdGVLZXlFeFcoJWx4LCVzLCVsZCwlcywlbHgsJWx4LCVwLCVwLCVwKVxuIiwKKwkJKExPTkcpaGtleSwKKwkJVzJDKGxwc3pTdWJLZXksMCksCisJCWR3UmVzZXJ2ZWQsCisJCVcyQyhscHN6Q2xhc3MsMSksCisJCWZkd09wdGlvbnMsCisJCXNhbURlc2lyZWQsCisJCWxwU2VjQXR0cmlicywKKwkJcmV0a2V5LAorCQlscERpc3BvcworCSk7CisKKwlscE5leHRLZXkJPSBsb29rdXBfaGtleShoa2V5KTsKKwlpZiAoIWxwTmV4dEtleSkKKwkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKKwlpZiAoIWxwc3pTdWJLZXkgfHwgISpscHN6U3ViS2V5KSB7CisJCWFkZF9oYW5kbGUoKytjdXJyZW50aGFuZGxlLGxwTmV4dEtleSxzYW1EZXNpcmVkKTsKKwkJKnJldGtleT1jdXJyZW50aGFuZGxlOworCQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKKwl9CisJc3BsaXRfa2V5cGF0aChscHN6U3ViS2V5LCZ3cHMsJndwYyk7CisJaSAJPSAwOworCWxweGtleQk9IGxwTmV4dEtleTsKKwl3aGlsZSAoaTx3cGMpIHsKKwkJbHB4a2V5PWxwTmV4dEtleS0+bmV4dHN1YjsKKwkJd2hpbGUgKGxweGtleSkgeworCQkJaWYgKCFzdHJjbXBXKHdwc1tpXSxscHhrZXktPmtleW5hbWUpKQorCQkJCWJyZWFrOworCQkJbHB4a2V5PWxweGtleS0+bmV4dDsKKwkJfQorCQlpZiAoIWxweGtleSkKKwkJCWJyZWFrOworCQlpKys7CisJCWxwTmV4dEtleQk9IGxweGtleTsKKwl9CisJaWYgKGxweGtleSkgeworCQlhZGRfaGFuZGxlKCsrY3VycmVudGhhbmRsZSxscHhrZXksc2FtRGVzaXJlZCk7CisJCSpyZXRrZXkJCT0gY3VycmVudGhhbmRsZTsKKwkJKmxwRGlzcG9zCT0gUkVHX09QRU5FRF9FWElTVElOR19LRVk7CisJCUZSRUVfS0VZX1BBVEg7CisJCXJldHVybglTSEVMTF9FUlJPUl9TVUNDRVNTOworCX0KKwkvKiBnb29kLiBub3cgdGhlIGhhcmQgcGFydCAqLworCXdoaWxlIChpPHdwYykgeworCQlscGxwUHJldktleQk9ICYobHBOZXh0S2V5LT5uZXh0c3ViKTsKKwkJbHB4a2V5CQk9ICpscGxwUHJldktleTsKKwkJd2hpbGUgKGxweGtleSkgeworCQkJbHBscFByZXZLZXkJPSAmKGxweGtleS0+bmV4dCk7CisJCQlscHhrZXkJCT0gKmxwbHBQcmV2S2V5OworCQl9CisJCSpscGxwUHJldktleT1tYWxsb2Moc2l6ZW9mKEtFWVNUUlVDVCkpOworCQlpZiAoISpscGxwUHJldktleSkgeworCQkJRlJFRV9LRVlfUEFUSDsKKwkJCXJldHVybiBTSEVMTF9FUlJPUl9PVVRPRk1FTU9SWTsKKwkJfQorCQltZW1zZXQoKmxwbHBQcmV2S2V5LCdcMCcsc2l6ZW9mKEtFWVNUUlVDVCkpOworCQkoKmxwbHBQcmV2S2V5KS0+a2V5bmFtZQk9IHN0cmR1cFcod3BzW2ldKTsKKwkJKCpscGxwUHJldktleSktPm5leHQJPSBOVUxMOworCQkoKmxwbHBQcmV2S2V5KS0+bmV4dHN1Ygk9IE5VTEw7CisJCSgqbHBscFByZXZLZXkpLT52YWx1ZXMJPSBOVUxMOworCQkoKmxwbHBQcmV2S2V5KS0+bnJvZnZhbHVlcyA9IDA7CisJCWlmIChscHN6Q2xhc3MpCisJCQkoKmxwbHBQcmV2S2V5KS0+Y2xhc3MgPSBzdHJkdXBXKGxwc3pDbGFzcyk7CisJCWVsc2UKKwkJCSgqbHBscFByZXZLZXkpLT5jbGFzcyA9IE5VTEw7CisJCWxwTmV4dEtleQk9ICpscGxwUHJldktleTsKKwkJaSsrOworCX0KKwlhZGRfaGFuZGxlKCsrY3VycmVudGhhbmRsZSxscE5leHRLZXksc2FtRGVzaXJlZCk7CisKKwkvKkZJWE1FOiBmbGFnIGhhbmRsaW5nIGNvcnJlY3Q/ICovCisJbHBOZXh0S2V5LT5mbGFncz0gZmR3T3B0aW9uczsKKwlpZiAobHBzekNsYXNzKQorCQlscE5leHRLZXktPmNsYXNzID0gc3RyZHVwVyhscHN6Q2xhc3MpOworCWVsc2UKKwkJbHBOZXh0S2V5LT5jbGFzcyA9IE5VTEw7CisJKnJldGtleQkJPSBjdXJyZW50aGFuZGxlOworCSpscERpc3Bvcwk9IFJFR19DUkVBVEVEX05FV19LRVk7CisJRlJFRV9LRVlfUEFUSDsKKwlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKK30KKworLyogUmVnQ3JlYXRlS2V5VwkJW0FEVkFQSTMyLjEzMl0gKi8KK1dJTkFQSSBEV09SRAorUmVnQ3JlYXRlS2V5VygKKwlIS0VZCWhrZXksCisJTFBDV1NUUglscHN6U3ViS2V5LAorCUxQSEtFWQlyZXRrZXkKKykgeworCURXT1JECWp1bmsscmV0OworCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdDcmVhdGVLZXlXKCVseCwlcywlcClcbiIsCisJCShMT05HKWhrZXksVzJDKGxwc3pTdWJLZXksMCkscmV0a2V5CisJKTsKKwlyZXQ9UmVnQ3JlYXRlS2V5RXhXKAorCQloa2V5LAkJLyoga2V5IGhhbmRsZSAqLworCQlscHN6U3ViS2V5LAkvKiBzdWJrZXkgbmFtZSAqLworCQkwLAkJLyogcmVzZXJ2ZWQgPSAwICovCisJCU5VTEwsCQkvKiBscHN6Q2xhc3M/IEZJWE1FOiA/ICovCisJCVJFR19PUFRJT05fTk9OX1ZPTEFUSUxFLAkvKiBvcHRpb25zICovCisJCUtFWV9BTExfQUNDRVNTLAkvKiBkZXNpcmVkIGFjY2VzcyBhdHRyaWJzICovCisJCU5VTEwsCQkvKiBscHNlY3VyaXR5IGF0dHJpYnV0ZXMgKi8KKwkJcmV0a2V5LAkJLyogbHByZXRrZXkgKi8KKwkJJmp1bmsJCS8qIGRpc3Bvc2l0aW9uIHZhbHVlICovCisJKTsKKwlyZXR1cm4JcmV0OworfQorCisvKiBSZWdDcmVhdGVLZXlFeEEJCVtBRFZBUEkzMi4xMzBdICovCitXSU5BUEkgRFdPUkQKK1JlZ0NyZWF0ZUtleUV4QSgKKwlIS0VZCWhrZXksCisJTFBDU1RSCWxwc3pTdWJLZXksCisJRFdPUkQJZHdSZXNlcnZlZCwKKwlMUFNUUglscHN6Q2xhc3MsCisJRFdPUkQJZmR3T3B0aW9ucywKKwlSRUdTQU0Jc2FtRGVzaXJlZCwKKwlMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBTZWNBdHRyaWJzLAorCUxQSEtFWQlyZXRrZXksCisJTFBEV09SRAlscERpc3BvcworKSB7CisJTFBXU1RSCWxwc3pTdWJLZXlXLGxwc3pDbGFzc1c7CisJRFdPUkQJcmV0OworCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdDcmVhdGVLZXlFeEEoJWx4LCVzLCVsZCwlcywlbHgsJWx4LCVwLCVwLCVwKVxuIiwKKwkJKExPTkcpaGtleSwKKwkJbHBzelN1YktleSwKKwkJZHdSZXNlcnZlZCwKKwkJbHBzekNsYXNzLAorCQlmZHdPcHRpb25zLAorCQlzYW1EZXNpcmVkLAorCQlscFNlY0F0dHJpYnMsCisJCXJldGtleSwKKwkJbHBEaXNwb3MKKwkpOworCWlmIChscHN6U3ViS2V5KQorCQlscHN6U3ViS2V5Vz1zdHJkdXBBMlcobHBzelN1YktleSk7CisJZWxzZQorCQlscHN6U3ViS2V5Vz1OVUxMOworCWlmIChscHN6Q2xhc3MpCisJCWxwc3pDbGFzc1c9c3RyZHVwQTJXKGxwc3pDbGFzcyk7CisJZWxzZQorCQlscHN6Q2xhc3NXPU5VTEw7CisJcmV0PVJlZ0NyZWF0ZUtleUV4VygKKwkJaGtleSwKKwkJbHBzelN1YktleVcsCisJCWR3UmVzZXJ2ZWQsCisJCWxwc3pDbGFzc1csCisJCWZkd09wdGlvbnMsCisJCXNhbURlc2lyZWQsCisJCWxwU2VjQXR0cmlicywKKwkJcmV0a2V5LAorCQlscERpc3BvcworCSk7CisJaWYgKGxwc3pTdWJLZXlXKQorCQlmcmVlKGxwc3pTdWJLZXlXKTsKKwlpZiAobHBzekNsYXNzVykKKwkJZnJlZShscHN6Q2xhc3NXKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWdDcmVhdGVLZXlBCQlbQURWQVBJMzIuMTI5XSAqLworV0lOQVBJIERXT1JECitSZWdDcmVhdGVLZXlBKAorCUhLRVkJaGtleSwKKwlMUENTVFIJbHBzelN1YktleSwKKwlMUEhLRVkJcmV0a2V5CispIHsKKwlEV09SRAlqdW5rOworCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdDcmVhdGVLZXlBKCVseCwlcywlcClcbiIsCisJCShMT05HKWhrZXksbHBzelN1YktleSxyZXRrZXkKKwkpOworCXJldHVybglSZWdDcmVhdGVLZXlFeEEoCisJCWhrZXksCQkvKiBrZXkgaGFuZGxlICovCisJCWxwc3pTdWJLZXksCS8qIHN1YmtleSBuYW1lICovCisJCTAsCQkvKiByZXNlcnZlZCA9IDAgKi8KKwkJTlVMTCwJCS8qIGxwc3pDbGFzcz8gRklYTUU6ID8gKi8KKwkJUkVHX09QVElPTl9OT05fVk9MQVRJTEUsLyogb3B0aW9ucyAqLworCQlLRVlfQUxMX0FDQ0VTUywJLyogZGVzaXJlZCBhY2Nlc3MgYXR0cmlicyAqLworCQlOVUxMLAkJLyogbHBzZWN1cml0eSBhdHRyaWJ1dGVzICovCisJCXJldGtleSwJCS8qIGxwcmV0a2V5ICovCisJCSZqdW5rCQkvKiBkaXNwb3NpdGlvbiB2YWx1ZSAqLworCSk7Cit9CisKKy8qIFJlZ0NyZWF0ZUtleQkJCVtTSEVMTC4yXSBbS0VSTkVMLjIxOF0gKi8KK1dJTkFQSSBEV09SRAorUmVnQ3JlYXRlS2V5KAorCUhLRVkJaGtleSwKKwlMUENTVFIJbHBzelN1YktleSwKKwlMUEhLRVkJcmV0a2V5CispIHsKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0NyZWF0ZUtleSglbHgsJXMsJXApXG4iLAorCQkoTE9ORyloa2V5LGxwc3pTdWJLZXkscmV0a2V5CisJKTsKKwlyZXR1cm4gUmVnQ3JlYXRlS2V5QShoa2V5LGxwc3pTdWJLZXkscmV0a2V5KTsKK30KKworLyogCisgKiBRdWVyeSBWYWx1ZSBGdW5jdGlvbnMKKyAqIFdpbjMyIGRpZmZlcnMgYmV0d2VlbiBrZXluYW1lcyBhbmQgdmFsdWVuYW1lcy4gCisgKiBtdWx0aXBsZSB2YWx1ZXMgbWF5IGJlbG9uZyB0byBvbmUga2V5LCB0aGUgc3BlY2lhbCB2YWx1ZQorICogd2l0aCBuYW1lIE5VTEwgaXMgdGhlIGRlZmF1bHQgdmFsdWUgdXNlZCBieSB0aGUgd2luMzEKKyAqIGNvbXBhdCBmdW5jdGlvbnMuCisgKgorICogQ2FsbHBhdGg6CisgKiBSZWdRdWVyeVZhbHVlIC0+IFJlZ1F1ZXJ5VmFsdWVBIC0+IFJlZ1F1ZXJ5VmFsdWVFeEEgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdRdWVyeVZhbHVlVyAgIC0+IFJlZ1F1ZXJ5VmFsdWVFeFcKKyAqLworCisvKiBSZWdRdWVyeVZhbHVlRXhXCQlbQURWQVBJMzIuMTU4XSAqLworV0lOQVBJIERXT1JECitSZWdRdWVyeVZhbHVlRXhXKAorCUhLRVkJaGtleSwKKwlMUFdTVFIJbHBzelZhbHVlTmFtZSwKKwlMUERXT1JECWxwZHdSZXNlcnZlZCwKKwlMUERXT1JECWxwZHdUeXBlLAorCUxQQllURQlscGJEYXRhLAorCUxQRFdPUkQJbHBjYkRhdGEKKykgeworCUxQS0VZU1RSVUNUCWxwa2V5OworCWludAkJaTsKKworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnUXVlcnlWYWx1ZUV4VyglbHgsJXMsJXAsJXAsJXAsJXApXG4iLAorCQloa2V5LFcyQyhscHN6VmFsdWVOYW1lLDApLGxwZHdSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLGxwY2JEYXRhCisJKTsKKworCWxwa2V5CT0gbG9va3VwX2hrZXkoaGtleSk7CisJaWYgKCFscGtleSkKKwkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKKwlpZiAobHBzelZhbHVlTmFtZT09TlVMTCkgeworCQlmb3IgKGk9MDtpPGxwa2V5LT5ucm9mdmFsdWVzO2krKykKKwkJCWlmIChscGtleS0+dmFsdWVzW2ldLm5hbWU9PU5VTEwpCisJCQkJYnJlYWs7CisJfSBlbHNlIHsKKwkJZm9yIChpPTA7aTxscGtleS0+bnJvZnZhbHVlcztpKyspCisJCQlpZiAoIXN0cmNtcFcobHBzelZhbHVlTmFtZSxscGtleS0+dmFsdWVzW2ldLm5hbWUpKQorCQkJCWJyZWFrOworCX0KKwlpZiAoaT09bHBrZXktPm5yb2Z2YWx1ZXMpIHsKKwkJaWYgKGxwc3pWYWx1ZU5hbWU9PU5VTEwpIHsKKwkJCSooV0NIQVIqKWxwYkRhdGEgPSAwOworCQkJKmxwY2JEYXRhCT0gMjsKKwkJCSpscGR3VHlwZQk9IFJFR19TWjsKKwkJCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOworCQl9CisJCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7LypGSVhNRTogY29ycmVjdCByZXR1cm4/ICovCisJfQorCWlmIChscGR3VHlwZSkKKwkJKmxwZHdUeXBlCT0gbHBrZXktPnZhbHVlc1tpXS50eXBlOworCWlmIChscGJEYXRhPT1OVUxMKSB7CisJCWlmIChscGNiRGF0YT09TlVMTCkKKwkJCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOworCQkqbHBjYkRhdGEJPSBscGtleS0+dmFsdWVzW2ldLmxlbjsKKwkJcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7CisJfQorCWlmICgqbHBjYkRhdGE8bHBrZXktPnZhbHVlc1tpXS5sZW4pIHsKKwkJKihXQ0hBUiopbHBiRGF0YQorCQkJPSAwOworCQkqbHBjYkRhdGEJPSBscGtleS0+dmFsdWVzW2ldLmxlbjsKKwkJcmV0dXJuIEVSUk9SX01PUkVfREFUQTsKKwl9CisJbWVtY3B5KGxwYkRhdGEsbHBrZXktPnZhbHVlc1tpXS5kYXRhLGxwa2V5LT52YWx1ZXNbaV0ubGVuKTsKKwkqbHBjYkRhdGEJPSBscGtleS0+dmFsdWVzW2ldLmxlbjsKKwlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKK30KKworLyogUmVnUXVlcnlWYWx1ZVcJCVtBRFZBUEkzMi4xNTldICovCitXSU5BUEkgRFdPUkQKK1JlZ1F1ZXJ5VmFsdWVXKAorCUhLRVkJaGtleSwKKwlMUFdTVFIJbHBzelN1YktleSwKKwlMUFdTVFIJbHBzekRhdGEsCisJTFBEV09SRAlscGNiRGF0YQorKSB7CisJSEtFWQl4aGtleTsKKwlEV09SRAlyZXQsbHBkd1R5cGU7CisKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWVXKCVseCwlcywlcCwlcClcbi0+IiwKKwkJaGtleSxXMkMobHBzelN1YktleSwwKSxscHN6RGF0YSxscGNiRGF0YQorCSk7CisKKwkvKiBvbmx5IG9wZW4gc3Via2V5LCBpZiB3ZSByZWFsbHkgZG8gZGVzY2VuZCAqLworCWlmIChscHN6U3ViS2V5ICYmICpscHN6U3ViS2V5KSB7CisJCXJldAk9IFJlZ09wZW5LZXlXKGhrZXksbHBzelN1YktleSwmeGhrZXkpOworCQlpZiAocmV0IT1FUlJPUl9TVUNDRVNTKQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UKKwkJeGhrZXkJPSBoa2V5OworCisJbHBkd1R5cGUJPSBSRUdfU1o7CisJcmV0CT0gUmVnUXVlcnlWYWx1ZUV4VygKKwkJeGhrZXksCisJCU5VTEwsCQkvKiB2YXJuYW1lIE5VTEwgLT4gY29tcGF0ICovCisJCU5VTEwsCQkvKiBscGR3UmVzZXJ2ZWQsIG11c3QgYmUgTlVMTCAqLworCQkmbHBkd1R5cGUsCisJCShMUEJZVEUpbHBzekRhdGEsCisJCWxwY2JEYXRhCisJKTsKKwlpZiAoeGhrZXkhPWhrZXkpCisJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWdRdWVyeVZhbHVlRXhBCQlbQURWQVBJMzIuMTU3XSAqLworV0lOQVBJIERXT1JECitSZWdRdWVyeVZhbHVlRXhBKAorCUhLRVkJaGtleSwKKwlMUFNUUglscHN6VmFsdWVOYW1lLAorCUxQRFdPUkQJbHBkd1Jlc2VydmVkLAorCUxQRFdPUkQJbHBkd1R5cGUsCisJTFBCWVRFCWxwYkRhdGEsCisJTFBEV09SRAlscGNiRGF0YQorKSB7CisJTFBXU1RSCWxwc3pWYWx1ZU5hbWVXOworCUxQQllURQlidWY7CisJRFdPUkQJcmV0LG15eGxlbjsKKwlEV09SRAkqbXlsZW47CisKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWVFeEEoJWx4LCVzLCVwLCVwLCVwLCVwKVxuLT4iLAorCQloa2V5LGxwc3pWYWx1ZU5hbWUsbHBkd1Jlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGEKKwkpOworCWlmIChscGJEYXRhKSB7CisJCS8qIGRvdWJsZSBidWZmZXIgKi8KKwkJYnVmCT0gKExQQllURSl4bWFsbG9jKCgqbHBjYkRhdGEpKjIpOworCQlteXhsZW4JPSAqbHBjYkRhdGEqMjsKKwkJbXlsZW4JPSAmbXl4bGVuOworCX0gZWxzZSB7CisJCWJ1Zj1OVUxMOworCQlpZiAobHBjYkRhdGEpIHsKKwkJCW15eGxlbgk9ICpscGNiRGF0YSoyOworCQkJbXlsZW4JPSAmbXl4bGVuOworCQl9CisJCQlteWxlbgk9IE5VTEw7CisJfQorCWlmIChscHN6VmFsdWVOYW1lKQorCQlscHN6VmFsdWVOYW1lVz1zdHJkdXBBMlcobHBzelZhbHVlTmFtZSk7CisJZWxzZSAKKwkJbHBzelZhbHVlTmFtZVc9TlVMTDsKKworCXJldD1SZWdRdWVyeVZhbHVlRXhXKAorCQloa2V5LAorCQlscHN6VmFsdWVOYW1lVywKKwkJbHBkd1Jlc2VydmVkLAorCQlscGR3VHlwZSwKKwkJYnVmLAorCQlteWxlbgorCSk7CisKKwlpZiAocmV0PT1FUlJPUl9TVUNDRVNTKSB7CisJCWlmIChidWYpIHsKKwkJCWlmIChVTklDT05WTUFTSyAmICgxPDwoKmxwZHdUeXBlKSkpIHsKKwkJCQkvKiBjb252ZXJ0IFVOSUNPREUgdG8gQVNDSUkgKi8KKwkJCQlzdHJjcHlXQShscGJEYXRhLChMUFdTVFIpYnVmKTsKKwkJCQkqbHBjYkRhdGEJPSBteXhsZW4vMjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG15eGxlbj4qbHBjYkRhdGEpCisJCQkJCXJldAk9IEVSUk9SX01PUkVfREFUQTsKKwkJCQllbHNlCisJCQkJCW1lbWNweShscGJEYXRhLGJ1ZixteXhsZW4pOworCisJCQkJKmxwY2JEYXRhCT0gbXl4bGVuOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChVTklDT05WTUFTSyAmICgxPDwoKmxwZHdUeXBlKSkpICYmIGxwY2JEYXRhKQorCQkJCSpscGNiRGF0YQk9IG15eGxlbi8yOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKChVTklDT05WTUFTSyAmICgxPDwoKmxwZHdUeXBlKSkpICYmIGxwY2JEYXRhKQorCQkJKmxwY2JEYXRhCT0gbXl4bGVuLzI7CisJfQorCWlmIChidWYpCisJCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWdRdWVyeVZhbHVlRXgJCVtLRVJORUwuMjI1XSAqLworV0lOQVBJIERXT1JECitSZWdRdWVyeVZhbHVlRXgoCisJSEtFWQloa2V5LAorCUxQU1RSCWxwc3pWYWx1ZU5hbWUsCisJTFBEV09SRAlscGR3UmVzZXJ2ZWQsCisJTFBEV09SRAlscGR3VHlwZSwKKwlMUEJZVEUJbHBiRGF0YSwKKwlMUERXT1JECWxwY2JEYXRhCispIHsKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWVFeCglbHgsJXMsJXAsJXAsJXAsJXApXG4iLAorCQloa2V5LGxwc3pWYWx1ZU5hbWUsbHBkd1Jlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGEKKwkpOworCXJldHVybiBSZWdRdWVyeVZhbHVlRXhBKAkKKwkJaGtleSwKKwkJbHBzelZhbHVlTmFtZSwKKwkJbHBkd1Jlc2VydmVkLAorCQlscGR3VHlwZSwKKwkJbHBiRGF0YSwKKwkJbHBjYkRhdGEKKwkpOworfQorCisvKiBSZWdRdWVyeVZhbHVlQQkJW0FEVkFQSTMyLjE1Nl0gKi8KK1dJTkFQSSBEV09SRAorUmVnUXVlcnlWYWx1ZUEoCisJSEtFWQloa2V5LAorCUxQU1RSCWxwc3pTdWJLZXksCisJTFBTVFIJbHBzekRhdGEsCisJTFBEV09SRAlscGNiRGF0YQorKSB7CisJSEtFWQl4aGtleTsKKwlEV09SRAlyZXQsbHBkd1R5cGU7CisKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWVBKCVseCwlcywlcCwlcClcbiIsCisJCWhrZXksbHBzelN1YktleSxscHN6RGF0YSxscGNiRGF0YQorCSk7CisKKwkvKiBvbmx5IG9wZW4gc3Via2V5LCBpZiB3ZSByZWFsbHkgZG8gZGVzY2VuZCAqLworCWlmIChscHN6U3ViS2V5ICYmICpscHN6U3ViS2V5KSB7CisJCXJldAk9IFJlZ09wZW5LZXkoaGtleSxscHN6U3ViS2V5LCZ4aGtleSk7CisJCWlmIChyZXQhPUVSUk9SX1NVQ0NFU1MpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZQorCQl4aGtleQk9IGhrZXk7CisKKwlscGR3VHlwZQk9IFJFR19TWjsKKwlyZXQJPSBSZWdRdWVyeVZhbHVlRXhBKAorCQl4aGtleSwKKwkJTlVMTCwJCS8qIGxwc3pWYWx1ZU5hbWUgTlVMTCAtPiBjb21wYXQgKi8KKwkJTlVMTCwJCS8qIGxwZHdSZXNlcnZlZCwgbXVzdCBiZSBOVUxMICovCisJCSZscGR3VHlwZSwKKwkJKExQQllURSlscHN6RGF0YSwKKwkJbHBjYkRhdGEKKwkpOworCWlmICh4aGtleSE9aGtleSkKKwkJUmVnQ2xvc2VLZXkoeGhrZXkpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlZ1F1ZXJ5VmFsdWUJCVtTSEVMTC42XSBbS0VSTkVMLjIyNF0gKi8KK1dJTkFQSSBEV09SRAorUmVnUXVlcnlWYWx1ZSgKKwlIS0VZCWhrZXksCisJTFBTVFIJbHBzelN1YktleSwKKwlMUFNUUglscHN6RGF0YSwKKwlMUERXT1JECWxwY2JEYXRhCispIHsKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5VmFsdWVBKCVseCwlcywlcCwlcClcbiIsCisJCWhrZXksbHBzelN1YktleSxscHN6RGF0YSxscGNiRGF0YQorCSk7CisJcmV0dXJuIFJlZ1F1ZXJ5VmFsdWVBKGhrZXksbHBzelN1YktleSxscHN6RGF0YSxscGNiRGF0YSk7Cit9CisKKy8qCisgKiBTZXR0aW5nIHZhbHVlcyBvZiBSZWdpc3RyeSBrZXlzCisgKgorICogQ2FsbHBhdGg6CisgKiBSZWdTZXRWYWx1ZSAtPiBSZWdTZXRWYWx1ZUEgLT4gUmVnU2V0VmFsdWVFeEEgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NldFZhbHVlVyAgIC0+IFJlZ1NldFZhbHVlRXhXCisgKi8KKworLyogUmVnU2V0VmFsdWVFeFcJCVtBRFZBUEkzMi4xNzBdICovCitXSU5BUEkgRFdPUkQKK1JlZ1NldFZhbHVlRXhXKAorCUhLRVkJaGtleSwKKwlMUFdTVFIJbHBzelZhbHVlTmFtZSwKKwlEV09SRAlkd1Jlc2VydmVkLAorCURXT1JECWR3VHlwZSwKKwlMUEJZVEUJbHBiRGF0YSwKKwlEV09SRAljYkRhdGEKKykgeworCUxQS0VZU1RSVUNUCWxwa2V5OworCWludAkJaTsKKworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnU2V0VmFsdWVFeFcoJWx4LCVzLCVsZCwlbGQsJXAsJWxkKVxuIiwKKwkJaGtleSxXMkMobHBzelZhbHVlTmFtZSwwKSxkd1Jlc2VydmVkLGR3VHlwZSxscGJEYXRhLGNiRGF0YQorCSk7CisJLyogd2Ugbm8gbG9uZ2VyIGNhcmUgYWJvdXQgdGhlIGxwYkRhdGEgZHdUeXBlIGhlcmUuLi4gKi8KKwlscGtleQk9IGxvb2t1cF9oa2V5KGhrZXkpOworCWlmICghbHBrZXkpCisJCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7CisJaWYgKGxwc3pWYWx1ZU5hbWU9PU5VTEwpIHsKKwkJZm9yIChpPTA7aTxscGtleS0+bnJvZnZhbHVlcztpKyspCisJCQlpZiAobHBrZXktPnZhbHVlc1tpXS5uYW1lPT1OVUxMKQorCQkJCWJyZWFrOworCX0gZWxzZSB7CisJCWZvciAoaT0wO2k8bHBrZXktPm5yb2Z2YWx1ZXM7aSsrKQorCQkJaWYgKCFzdHJjbXBXKGxwc3pWYWx1ZU5hbWUsbHBrZXktPnZhbHVlc1tpXS5uYW1lKSkKKwkJCQlicmVhazsKKwl9CisJaWYgKGk9PWxwa2V5LT5ucm9mdmFsdWVzKSB7CisJCWxwa2V5LT52YWx1ZXMgPSAoTFBLRVlWQUxVRSl4cmVhbGxvYygKKwkJCQkJbHBrZXktPnZhbHVlcywKKwkJCQkJKGxwa2V5LT5ucm9mdmFsdWVzKzEpKnNpemVvZihLRVlWQUxVRSkKKwkJCQkpOworCQlscGtleS0+bnJvZnZhbHVlcysrOworCQltZW1zZXQobHBrZXktPnZhbHVlcytpLCdcMCcsc2l6ZW9mKEtFWVZBTFVFKSk7CisJfQorCWlmIChscGtleS0+dmFsdWVzW2ldLm5hbWU9PU5VTEwpCisJCWlmIChscHN6VmFsdWVOYW1lKQorCQkJbHBrZXktPnZhbHVlc1tpXS5uYW1lID0gc3RyZHVwVyhscHN6VmFsdWVOYW1lKTsKKwkJZWxzZQorCQkJbHBrZXktPnZhbHVlc1tpXS5uYW1lID0gTlVMTDsKKwlscGtleS0+dmFsdWVzW2ldLmxlbgk9IGNiRGF0YTsKKwlscGtleS0+dmFsdWVzW2ldLnR5cGUJPSBkd1R5cGU7CisJaWYgKGxwa2V5LT52YWx1ZXNbaV0uZGF0YSAhPU5VTEwpCisJCWZyZWUobHBrZXktPnZhbHVlc1tpXS5kYXRhKTsKKwlscGtleS0+dmFsdWVzW2ldLmRhdGEJPSAoTFBCWVRFKXhtYWxsb2MoY2JEYXRhKTsKKwltZW1jcHkobHBrZXktPnZhbHVlc1tpXS5kYXRhLGxwYkRhdGEsY2JEYXRhKTsKKwlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKK30KKworLyogUmVnU2V0VmFsdWVFeEEJCVtBRFZBUEkzMi4xNjldICovCitXSU5BUEkgRFdPUkQKK1JlZ1NldFZhbHVlRXhBKAorCUhLRVkJaGtleSwKKwlMUFNUUglscHN6VmFsdWVOYW1lLAorCURXT1JECWR3UmVzZXJ2ZWQsCisJRFdPUkQJZHdUeXBlLAorCUxQQllURQlscGJEYXRhLAorCURXT1JECWNiRGF0YQorKSB7CisJTFBCWVRFCWJ1ZjsKKwlMUFdTVFIJbHBzelZhbHVlTmFtZVc7CisJRFdPUkQJcmV0OworCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZUV4QSglbHgsJXMsJWxkLCVsZCwlcCwlbGQpXG4tPiIsCisJCWhrZXksbHBzelZhbHVlTmFtZSxkd1Jlc2VydmVkLGR3VHlwZSxscGJEYXRhLGNiRGF0YQorCSk7CisJaWYgKCgxPDxkd1R5cGUpICYgVU5JQ09OVk1BU0spIHsKKwkJYnVmPShMUEJZVEUpc3RyZHVwQTJXKGxwYkRhdGEpOworCQljYkRhdGE9MipzdHJsZW4obHBiRGF0YSkrMjsKKwl9IGVsc2UKKwkJYnVmPWxwYkRhdGE7CisJaWYgKGxwc3pWYWx1ZU5hbWUpCisJCWxwc3pWYWx1ZU5hbWVXID0gc3RyZHVwQTJXKGxwc3pWYWx1ZU5hbWUpOworCWVsc2UKKwkJbHBzelZhbHVlTmFtZVcgPSBOVUxMOworCXJldD1SZWdTZXRWYWx1ZUV4Vyhoa2V5LGxwc3pWYWx1ZU5hbWVXLGR3UmVzZXJ2ZWQsZHdUeXBlLGJ1ZixjYkRhdGEpOworCWlmIChscHN6VmFsdWVOYW1lVykKKwkJZnJlZShscHN6VmFsdWVOYW1lVyk7CisJaWYgKGJ1ZiE9bHBiRGF0YSkKKwkJZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlZ1NldFZhbHVlRXgJCVtLRVJORUwuMjI2XSAqLworV0lOQVBJIERXT1JECitSZWdTZXRWYWx1ZUV4KAorCUhLRVkJaGtleSwKKwlMUFNUUglscHN6VmFsdWVOYW1lLAorCURXT1JECWR3UmVzZXJ2ZWQsCisJRFdPUkQJZHdUeXBlLAorCUxQQllURQlscGJEYXRhLAorCURXT1JECWNiRGF0YQorKSB7CisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZUV4KCVseCwlcywlbGQsJWxkLCVwLCVsZClcbi0+IiwKKwkJaGtleSxscHN6VmFsdWVOYW1lLGR3UmVzZXJ2ZWQsZHdUeXBlLGxwYkRhdGEsY2JEYXRhCisJKTsKKwlyZXR1cm4gUmVnU2V0VmFsdWVFeEEoaGtleSxscHN6VmFsdWVOYW1lLGR3UmVzZXJ2ZWQsZHdUeXBlLGxwYkRhdGEsY2JEYXRhKTsKK30KKworLyogUmVnU2V0VmFsdWVXCQkJW0FEVkFQSTMyLjE3MV0gKi8KK1dJTkFQSSBEV09SRAorUmVnU2V0VmFsdWVXKAorCUhLRVkJaGtleSwKKwlMUENXU1RSCWxwc3pTdWJLZXksCisJRFdPUkQJZHdUeXBlLAorCUxQQ1dTVFIJbHBzekRhdGEsCisJRFdPUkQJY2JEYXRhCispIHsKKwlIS0VZCXhoa2V5OworCURXT1JECXJldDsKKworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnU2V0VmFsdWVXKCVseCwlcywlbGQsJXMsJWxkKVxuLT4iLAorCQloa2V5LFcyQyhscHN6U3ViS2V5LDApLGR3VHlwZSxXMkMobHBzekRhdGEsMCksY2JEYXRhCisJKTsKKwlpZiAobHBzelN1YktleSAmJiAqbHBzelN1YktleSkgeworCQlyZXQ9UmVnQ3JlYXRlS2V5Vyhoa2V5LGxwc3pTdWJLZXksJnhoa2V5KTsKKwkJaWYgKHJldCE9RVJST1JfU1VDQ0VTUykKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlCisJCXhoa2V5PWhrZXk7CisJaWYgKGR3VHlwZSE9UkVHX1NaKSB7CisJCWZwcmludGYoc3RkZGViLCJSZWdTZXRWYWx1ZVggY2FsbGVkIHdpdGggZHdUeXBlPSVsZCFcbiIsZHdUeXBlKTsKKwkJZHdUeXBlPVJFR19TWjsKKwl9CisJaWYgKGNiRGF0YSE9MipzdHJsZW5XKGxwc3pEYXRhKSsyKSB7CisJCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnU2V0VmFsdWVYIGNhbGxlZCB3aXRoIGxlbj0lbGQgIT0gc3RybGVuKCVzKSsxPSVkIVxuIiwKKwkJCWNiRGF0YSxXMkMobHBzekRhdGEsMCksMipzdHJsZW5XKGxwc3pEYXRhKSsyCisJCSk7CisJCWNiRGF0YT0yKnN0cmxlblcobHBzekRhdGEpKzI7CisJfQorCXJldD1SZWdTZXRWYWx1ZUV4Vyh4aGtleSxOVUxMLDAsZHdUeXBlLChMUEJZVEUpbHBzekRhdGEsY2JEYXRhKTsKKwlpZiAoaGtleSE9eGhrZXkpCisJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKKwlyZXR1cm4gcmV0OworCit9CisvKiBSZWdTZXRWYWx1ZUEJCQlbQURWQVBJMzIuMTY4XSAqLworV0lOQVBJIERXT1JECitSZWdTZXRWYWx1ZUEoCisJSEtFWQloa2V5LAorCUxQQ1NUUglscHN6U3ViS2V5LAorCURXT1JECWR3VHlwZSwKKwlMUENTVFIJbHBzekRhdGEsCisJRFdPUkQJY2JEYXRhCispIHsKKwlEV09SRAlyZXQ7CisJSEtFWQl4aGtleTsKKworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnU2V0VmFsdWVBKCVseCwlcywlbGQsJXMsJWxkKVxuLT4iLAorCQloa2V5LGxwc3pTdWJLZXksZHdUeXBlLGxwc3pEYXRhLGNiRGF0YQorCSk7CisJaWYgKGxwc3pTdWJLZXkgJiYgKmxwc3pTdWJLZXkpIHsKKwkJcmV0PVJlZ0NyZWF0ZUtleShoa2V5LGxwc3pTdWJLZXksJnhoa2V5KTsKKwkJaWYgKHJldCE9RVJST1JfU1VDQ0VTUykKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlCisJCXhoa2V5PWhrZXk7CisKKwlpZiAoZHdUeXBlIT1SRUdfU1opIHsKKwkJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZUEgY2FsbGVkIHdpdGggZHdUeXBlPSVsZCFcbiIsZHdUeXBlKTsKKwkJZHdUeXBlPVJFR19TWjsKKwl9CisJaWYgKGNiRGF0YSE9c3RybGVuKGxwc3pEYXRhKSsxKQorCQljYkRhdGE9c3RybGVuKGxwc3pEYXRhKSsxOworCXJldD1SZWdTZXRWYWx1ZUV4QSh4aGtleSxOVUxMLDAsZHdUeXBlLChMUEJZVEUpbHBzekRhdGEsY2JEYXRhKTsKKwlpZiAoeGhrZXkhPWhrZXkpCisJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWdTZXRWYWx1ZQkJCVtLRVJORUwuMjIxXSBbU0hFTEwuNV0gKi8KK1dJTkFQSSBEV09SRAorUmVnU2V0VmFsdWUoCisJSEtFWQloa2V5LAorCUxQQ1NUUglscHN6U3ViS2V5LAorCURXT1JECWR3VHlwZSwKKwlMUENTVFIJbHBzekRhdGEsCisJRFdPUkQJY2JEYXRhCispIHsKKwlEV09SRAlyZXQ7CisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdTZXRWYWx1ZSglbHgsJXMsJWxkLCVzLCVsZClcbi0+IiwKKwkJaGtleSxscHN6U3ViS2V5LGR3VHlwZSxscHN6RGF0YSxjYkRhdGEKKwkpOworCXJldD1SZWdTZXRWYWx1ZUEoaGtleSxscHN6U3ViS2V5LGR3VHlwZSxscHN6RGF0YSxjYkRhdGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qIAorICogS2V5IEVudW1lcmF0aW9uCisgKgorICogQ2FsbHBhdGg6CisgKiBSZWdFbnVtS2V5IC0+IFJlZ0VudW1LZXlBIC0+IFJlZ0VudW1LZXlFeEEgXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdFbnVtS2V5VyAgIC0+IFJlZ0VudW1LZXlFeFcKKyAqLworCisvKiBSZWdFbnVtS2V5RXhXCQlbQURWQVBJMzIuMTM5XSAqLworV0lOQVBJIERXT1JECitSZWdFbnVtS2V5RXhXKAorCUhLRVkJaGtleSwKKwlEV09SRAlpU3Via2V5LAorCUxQV1NUUglscHN6TmFtZSwKKwlMUERXT1JECWxwY2NoTmFtZSwKKwlMUERXT1JECWxwZHdSZXNlcnZlZCwKKwlMUFdTVFIJbHBzekNsYXNzLAorCUxQRFdPUkQJbHBjY2hDbGFzcywKKwlGSUxFVElNRQkqZnQKKykgeworCUxQS0VZU1RSVUNUCWxwa2V5LGxweGtleTsKKworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRW51bUtleUV4VyglbHgsJWxkLCVwLCVsZCwlcCwlcCwlcCwlcClcbiIsCisJCWhrZXksaVN1YmtleSxscHN6TmFtZSwqbHBjY2hOYW1lLGxwZHdSZXNlcnZlZCxscHN6Q2xhc3MsbHBjY2hDbGFzcyxmdAorCSk7CisJbHBrZXk9bG9va3VwX2hrZXkoaGtleSk7CisJaWYgKCFscGtleSkKKwkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKKwlpZiAoIWxwa2V5LT5uZXh0c3ViKQorCQlyZXR1cm4gRVJST1JfTk9fTU9SRV9JVEVNUzsKKwlscHhrZXk9bHBrZXktPm5leHRzdWI7CisJd2hpbGUgKGlTdWJrZXkgJiYgbHB4a2V5KSB7CisJCWlTdWJrZXktLTsKKwkJbHB4a2V5PWxweGtleS0+bmV4dDsKKwl9CisJaWYgKGlTdWJrZXkgfHwgIWxweGtleSkKKwkJcmV0dXJuIEVSUk9SX05PX01PUkVfSVRFTVM7CisJaWYgKDIqc3RybGVuVyhscHhrZXktPmtleW5hbWUpKzI+KmxwY2NoTmFtZSkKKwkJcmV0dXJuIEVSUk9SX01PUkVfREFUQTsKKwltZW1jcHkobHBzek5hbWUsbHB4a2V5LT5rZXluYW1lLHN0cmxlblcobHB4a2V5LT5rZXluYW1lKSoyKzIpOworCWlmIChscHN6Q2xhc3MpIHsKKwkJLyogd2hhdCBzaG91bGQgd2Ugd3JpdGUgaW50byBpdD8gKi8KKwkJKmxwc3pDbGFzcwkJPSAwOworCQkqbHBjY2hDbGFzcwk9IDI7CisJfQorCXJldHVybiBFUlJPUl9TVUNDRVNTOworCit9CisKKy8qIFJlZ0VudW1LZXlXCQkJW0FEVkFQSTMyLjE0MF0gKi8KK1dJTkFQSSBEV09SRAorUmVnRW51bUtleVcoCisJSEtFWQloa2V5LAorCURXT1JECWlTdWJrZXksCisJTFBXU1RSCWxwc3pOYW1lLAorCURXT1JECWxwY2NoTmFtZQorKSB7CisJRklMRVRJTUUJZnQ7CisKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1LZXlXKCVseCwlbGQsJXAsJWxkKVxuLT4iLAorCQloa2V5LGlTdWJrZXksbHBzek5hbWUsbHBjY2hOYW1lCisJKTsKKwlyZXR1cm4gUmVnRW51bUtleUV4Vyhoa2V5LGlTdWJrZXksbHBzek5hbWUsJmxwY2NoTmFtZSxOVUxMLE5VTEwsTlVMTCwmZnQpOworfQorLyogUmVnRW51bUtleUV4QQkJW0FEVkFQSTMyLjEzOF0gKi8KK1dJTkFQSSBEV09SRAorUmVnRW51bUtleUV4QSgKKwlIS0VZCWhrZXksCisJRFdPUkQJaVN1YmtleSwKKwlMUFNUUglscHN6TmFtZSwKKwlMUERXT1JECWxwY2NoTmFtZSwKKwlMUERXT1JECWxwZHdSZXNlcnZlZCwKKwlMUFNUUglscHN6Q2xhc3MsCisJTFBEV09SRAlscGNjaENsYXNzLAorCUZJTEVUSU1FCSpmdAorKSB7CisJRFdPUkQJcmV0LGxwY2NoTmFtZVcsbHBjY2hDbGFzc1c7CisJTFBXU1RSCWxwc3pOYW1lVyxscHN6Q2xhc3NXOworCisKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1LZXlFeEEoJWx4LCVsZCwlcCwlbGQsJXAsJXAsJXAsJXApXG4tPiIsCisJCWhrZXksaVN1YmtleSxscHN6TmFtZSwqbHBjY2hOYW1lLGxwZHdSZXNlcnZlZCxscHN6Q2xhc3MsbHBjY2hDbGFzcyxmdAorCSk7CisJaWYgKGxwc3pOYW1lKSB7CisJCWxwc3pOYW1lVwk9IChMUFdTVFIpeG1hbGxvYygqbHBjY2hOYW1lKjIpOworCQlscGNjaE5hbWVXCT0gKmxwY2NoTmFtZSoyOworCX0gZWxzZSB7CisJCWxwc3pOYW1lVwk9IE5VTEw7CisJCWxwY2NoTmFtZVcgCT0gMDsKKwl9CisJaWYgKGxwc3pDbGFzcykgeworCQlscHN6Q2xhc3NXCQk9IChMUFdTVFIpeG1hbGxvYygqbHBjY2hDbGFzcyoyKTsKKwkJbHBjY2hDbGFzc1cJPSAqbHBjY2hDbGFzcyoyOworCX0gZWxzZSB7CisJCWxwc3pDbGFzc1cJPTA7CisJCWxwY2NoQ2xhc3NXPTA7CisJfQorCXJldD1SZWdFbnVtS2V5RXhXKAorCQloa2V5LAorCQlpU3Via2V5LAorCQlscHN6TmFtZVcsCisJCSZscGNjaE5hbWVXLAorCQlscGR3UmVzZXJ2ZWQsCisJCWxwc3pDbGFzc1csCisJCSZscGNjaENsYXNzVywKKwkJZnQKKwkpOworCWlmIChyZXQ9PUVSUk9SX1NVQ0NFU1MpIHsKKwkJc3RyY3B5V0EobHBzek5hbWUsbHBzek5hbWVXKTsKKwkJKmxwY2NoTmFtZT1zdHJsZW4obHBzek5hbWUpOworCQlpZiAobHBzekNsYXNzVykgeworCQkJc3RyY3B5V0EobHBzekNsYXNzLGxwc3pDbGFzc1cpOworCQkJKmxwY2NoQ2xhc3M9c3RybGVuKGxwc3pDbGFzcyk7CisJCX0KKwl9CisJaWYgKGxwc3pOYW1lVykKKwkJZnJlZShscHN6TmFtZVcpOworCWlmIChscHN6Q2xhc3NXKQorCQlmcmVlKGxwc3pDbGFzc1cpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlZ0VudW1LZXlBCQkJW0FEVkFQSTMyLjEzN10gKi8KK1dJTkFQSSBEV09SRAorUmVnRW51bUtleUEoCisJSEtFWQloa2V5LAorCURXT1JECWlTdWJrZXksCisJTFBTVFIJbHBzek5hbWUsCisJRFdPUkQJbHBjY2hOYW1lCispIHsKKwlGSUxFVElNRQlmdDsKKworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRW51bUtleUEoJWx4LCVsZCwlcCwlbGQpXG4tPiIsCisJCWhrZXksaVN1YmtleSxscHN6TmFtZSxscGNjaE5hbWUKKwkpOworCXJldHVybglSZWdFbnVtS2V5RXhBKAorCQloa2V5LAorCQlpU3Via2V5LAorCQlscHN6TmFtZSwKKwkJJmxwY2NoTmFtZSwKKwkJTlVMTCwKKwkJTlVMTCwKKwkJTlVMTCwKKwkJJmZ0CisJKTsKK30KKworLyogUmVnRW51bUtleQkJCVtTSEVMTC43XSBbS0VSTkVMLjIxNl0gKi8KK1dJTkFQSSBEV09SRAorUmVnRW51bUtleSgKKwlIS0VZCWhrZXksCisJRFdPUkQJaVN1YmtleSwKKwlMUFNUUglscHN6TmFtZSwKKwlEV09SRAlscGNjaE5hbWUKKykgeworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRW51bUtleSglbHgsJWxkLCVwLCVsZClcbi0+IiwKKwkJaGtleSxpU3Via2V5LGxwc3pOYW1lLGxwY2NoTmFtZQorCSk7CisJcmV0dXJuIFJlZ0VudW1LZXlBKGhrZXksaVN1YmtleSxscHN6TmFtZSxscGNjaE5hbWUpOworfQorCisvKiAKKyAqIEVudW1lcmF0ZSBSZWdpc3RyeSBWYWx1ZXMKKyAqCisgKiBDYWxscGF0aDoKKyAqIFJlZ0VudW1WYWx1ZSAtPiBSZWdFbnVtVmFsdWVBIC0+IFJlZ0VudW1WYWx1ZVcKKyAqLworCisvKiBSZWdFbnVtVmFsdWVXCQlbQURWQVBJMzIuMTQyXSAqLworV0lOQVBJIERXT1JECitSZWdFbnVtVmFsdWVXKAorCUhLRVkJaGtleSwKKwlEV09SRAlpVmFsdWUsCisJTFBXU1RSCWxwc3pWYWx1ZSwKKwlMUERXT1JECWxwY2NoVmFsdWUsCisJTFBEV09SRAlscGRSZXNlcnZlZCwKKwlMUERXT1JECWxwZHdUeXBlLAorCUxQQllURQlscGJEYXRhLAorCUxQRFdPUkQJbHBjYkRhdGEKKykgeworCUxQS0VZU1RSVUNUCWxwa2V5OworCUxQS0VZVkFMVUUJdmFsOworCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtVmFsdWVXKCVsZCwlbGQsJXAsJXAsJXAsJXAsJXAsJXApXG4iLAorCQloa2V5LGlWYWx1ZSxscHN6VmFsdWUsbHBjY2hWYWx1ZSxscGRSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLGxwY2JEYXRhCisJKTsKKwlscGtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOworCWlmICghbHBrZXkpCisJCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7CisJaWYgKGxwa2V5LT5ucm9mdmFsdWVzPGlWYWx1ZSkKKwkJcmV0dXJuIEVSUk9SX05PX01PUkVfSVRFTVM7CisJdmFsCT0gbHBrZXktPnZhbHVlcytpVmFsdWU7CisKKwlpZiAodmFsLT5uYW1lKSB7CisJCWlmIChzdHJsZW5XKHZhbC0+bmFtZSkqMisyPipscGNjaFZhbHVlKSB7CisJCQkqbHBjY2hWYWx1ZSA9IHN0cmxlblcodmFsLT5uYW1lKSoyKzI7CisJCQlyZXR1cm4gRVJST1JfTU9SRV9EQVRBOworCQl9CisJCW1lbWNweShscHN6VmFsdWUsdmFsLT5uYW1lLDIqc3RybGVuVyh2YWwtPm5hbWUpKzIpOworCQkqbHBjY2hWYWx1ZT1zdHJsZW5XKHZhbC0+bmFtZSkqMisyOworCX0gZWxzZSB7CisJCS8qIGhvdyB0byBoYW5kbGUgTlVMTCB2YWx1ZT8gKi8KKwkJKmxwc3pWYWx1ZQk9IDA7CisJCSpscGNjaFZhbHVlCT0gMjsKKwl9CisJKmxwZHdUeXBlPXZhbC0+dHlwZTsKKwlpZiAobHBiRGF0YSkgeworCQlpZiAodmFsLT5sZW4+KmxwY2JEYXRhKQorCQkJcmV0dXJuIEVSUk9SX01PUkVfREFUQTsKKwkJbWVtY3B5KGxwYkRhdGEsdmFsLT5kYXRhLHZhbC0+bGVuKTsKKwkJKmxwY2JEYXRhID0gdmFsLT5sZW47CisJfQorCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOworfQorCisvKiBSZWdFbnVtVmFsdWVBCQlbQURWQVBJMzIuMTQxXSAqLworV0lOQVBJIERXT1JECitSZWdFbnVtVmFsdWVBKAorCUhLRVkJaGtleSwKKwlEV09SRAlpVmFsdWUsCisJTFBTVFIJbHBzelZhbHVlLAorCUxQRFdPUkQJbHBjY2hWYWx1ZSwKKwlMUERXT1JECWxwZFJlc2VydmVkLAorCUxQRFdPUkQJbHBkd1R5cGUsCisJTFBCWVRFCWxwYkRhdGEsCisJTFBEV09SRAlscGNiRGF0YQorKSB7CisJTFBXU1RSCWxwc3pWYWx1ZVc7CisJTFBCWVRFCWxwYkRhdGFXOworCURXT1JECXJldCxscGNiRGF0YVc7CisKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1WYWx1ZUEoJWxkLCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsCisJCWhrZXksaVZhbHVlLGxwc3pWYWx1ZSxscGNjaFZhbHVlLGxwZFJlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGEKKwkpOworCisJbHBzelZhbHVlVyA9IChMUFdTVFIpeG1hbGxvYygqbHBjY2hWYWx1ZSoyKTsKKwlpZiAobHBiRGF0YSkgeworCQlscGJEYXRhVyA9IChMUEJZVEUpeG1hbGxvYygqbHBjYkRhdGEqMik7CisJCWxwY2JEYXRhVyA9ICpscGNiRGF0YSoyOworCX0gZWxzZQorCQlscGJEYXRhVyA9IE5VTEw7CisJcmV0PVJlZ0VudW1WYWx1ZVcoCisJCWhrZXksCisJCWlWYWx1ZSwKKwkJbHBzelZhbHVlVywKKwkJbHBjY2hWYWx1ZSwKKwkJbHBkUmVzZXJ2ZWQsCisJCWxwZHdUeXBlLAorCQlscGJEYXRhVywKKwkJJmxwY2JEYXRhVworCSk7CisKKwlpZiAocmV0PT1FUlJPUl9TVUNDRVNTKSB7CisJCXN0cmNweVdBKGxwc3pWYWx1ZSxscHN6VmFsdWVXKTsKKwkJaWYgKGxwYkRhdGEpIHsKKwkJCWlmICgoMTw8KmxwZHdUeXBlKSAmIFVOSUNPTlZNQVNLKSB7CisJCQkJc3RyY3B5V0EobHBiRGF0YSwoTFBXU1RSKWxwYkRhdGFXKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGxwY2JEYXRhVyA+ICpscGNiRGF0YSkKKwkJCQkJcmV0CT0gRVJST1JfTU9SRV9EQVRBOworCQkJCWVsc2UKKwkJCQkJbWVtY3B5KGxwYkRhdGEsbHBiRGF0YVcsbHBjYkRhdGFXKTsKKwkJCX0KKwkJCSpscGNiRGF0YSA9IGxwY2JEYXRhVzsKKwkJfQorCX0KKwlpZiAobHBiRGF0YVcpCisJCWZyZWUobHBiRGF0YVcpOworCWlmIChscHN6VmFsdWVXKQorCQlmcmVlKGxwc3pWYWx1ZVcpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlZ0VudW1WYWx1ZQkJCVtLRVJORUwuMjIzXSAqLworV0lOQVBJIERXT1JECitSZWdFbnVtVmFsdWUoCisJSEtFWQloa2V5LAorCURXT1JECWlWYWx1ZSwKKwlMUFNUUglscHN6VmFsdWUsCisJTFBEV09SRAlscGNjaFZhbHVlLAorCUxQRFdPUkQJbHBkUmVzZXJ2ZWQsCisJTFBEV09SRAlscGR3VHlwZSwKKwlMUEJZVEUJbHBiRGF0YSwKKwlMUERXT1JECWxwY2JEYXRhCispIHsKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0VudW1WYWx1ZSglbGQsJWxkLCVwLCVwLCVwLCVwLCVwLCVwKVxuIiwKKwkJaGtleSxpVmFsdWUsbHBzelZhbHVlLGxwY2NoVmFsdWUsbHBkUmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSxscGNiRGF0YQorCSk7CisJcmV0dXJuIFJlZ0VudW1WYWx1ZUEoCisJCWhrZXksCisJCWlWYWx1ZSwKKwkJbHBzelZhbHVlLAorCQlscGNjaFZhbHVlLAorCQlscGRSZXNlcnZlZCwKKwkJbHBkd1R5cGUsCisJCWxwYkRhdGEsCisJCWxwY2JEYXRhCisJKTsKK30KKworLyogCisgKiAgQ2xvc2UgcmVnaXN0cnkga2V5CisgKi8KKy8qIFJlZ0Nsb3NlS2V5CQkJW1NIRUxMLjNdIFtLRVJORUwuMjIwXSBbQURWQVBJMzIuMTI2XSAqLworV0lOQVBJIERXT1JECitSZWdDbG9zZUtleShIS0VZIGhrZXkpIHsKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0Nsb3NlS2V5KCVsZClcbiIsaGtleSk7CisJcmVtb3ZlX2hhbmRsZShoa2V5KTsKKwlyZXR1cm4gRVJST1JfU1VDQ0VTUzsKK30KKy8qIAorICogRGVsZXRlIHJlZ2lzdHJ5IGtleQorICoKKyAqIENhbGxwYXRoOgorICogUmVnRGVsZXRlS2V5IC0+IFJlZ0RlbGV0ZUtleUEgLT4gUmVnRGVsZXRlS2V5VworICovCisvKiBSZWdEZWxldGVLZXlXCQlbQURWQVBJMzIuMTM0XSAqLworV0lOQVBJIERXT1JECitSZWdEZWxldGVLZXlXKEhLRVkgaGtleSxMUFdTVFIgbHBzelN1YktleSkgeworCUxQS0VZU1RSVUNUCSpscGxwUHJldktleSxscE5leHRLZXksbHB4a2V5OworCUxQV1NUUgkJKndwczsKKwlpbnQJCXdwYyxpOworCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdEZWxldGVLZXlXKCVsZCwlcylcbiIsCisJCWhrZXksVzJDKGxwc3pTdWJLZXksMCkKKwkpOworCWxwTmV4dEtleQk9IGxvb2t1cF9oa2V5KGhrZXkpOworCWlmICghbHBOZXh0S2V5KQorCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOworCS8qIHdlIG5lZWQgdG8ga25vdyB0aGUgcHJldmlvdXMga2V5IGluIHRoZSBoaWVyLiAqLworCWlmICghbHBzelN1YktleSB8fCAhKmxwc3pTdWJLZXkpCisJCXJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7CisJc3BsaXRfa2V5cGF0aChscHN6U3ViS2V5LCZ3cHMsJndwYyk7CisJaSAJPSAwOworCWxweGtleQk9IGxwTmV4dEtleTsKKwl3aGlsZSAoaTx3cGMtMSkgeworCQlscHhrZXk9bHBOZXh0S2V5LT5uZXh0c3ViOworCQl3aGlsZSAobHB4a2V5KSB7CisJCQlpZiAoIXN0cmNtcFcod3BzW2ldLGxweGtleS0+a2V5bmFtZSkpCisJCQkJYnJlYWs7CisJCQlscHhrZXk9bHB4a2V5LT5uZXh0OworCQl9CisJCWlmICghbHB4a2V5KSB7CisJCQlGUkVFX0tFWV9QQVRIOworCQkJLyogbm90IGZvdW5kIGlzIHN1Y2Nlc3MgKi8KKwkJCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOworCQl9CisJCWkrKzsKKwkJbHBOZXh0S2V5CT0gbHB4a2V5OworCX0KKwlscHhrZXkJPSBscE5leHRLZXktPm5leHRzdWI7CisJbHBscFByZXZLZXkgPSAmKGxwTmV4dEtleS0+bmV4dHN1Yik7CisJd2hpbGUgKGxweGtleSkgeworCQlpZiAoIXN0cmNtcFcod3BzW2ldLGxweGtleS0+a2V5bmFtZSkpCisJCQlicmVhazsKKwkJbHBscFByZXZLZXkJPSAmKGxweGtleS0+bmV4dCk7CisJCWxweGtleQkJPSBscHhrZXktPm5leHQ7CisJfQorCWlmICghbHB4a2V5KQorCQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKKwlpZiAobHB4a2V5LT5uZXh0c3ViKQorCQlyZXR1cm4gU0hFTExfRVJST1JfQ0FOVFdSSVRFOworCSpscGxwUHJldktleQk9IGxweGtleS0+bmV4dDsKKwlmcmVlKGxweGtleS0+a2V5bmFtZSk7CisJaWYgKGxweGtleS0+Y2xhc3MpCisJCWZyZWUobHB4a2V5LT5jbGFzcyk7CisJaWYgKGxweGtleS0+dmFsdWVzKQorCQlmcmVlKGxweGtleS0+dmFsdWVzKTsKKwlmcmVlKGxweGtleSk7CisJRlJFRV9LRVlfUEFUSDsKKwlyZXR1cm4JU0hFTExfRVJST1JfU1VDQ0VTUzsKK30KKworLyogUmVnRGVsZXRlS2V5QQkJW0FEVkFQSTMyLjEzM10gKi8KK1dJTkFQSSBEV09SRAorUmVnRGVsZXRlS2V5QShIS0VZIGhrZXksTFBDU1RSIGxwc3pTdWJLZXkpIHsKKwlMUFdTVFIJbHBzelN1YktleVc7CisJRFdPUkQJcmV0OworCisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdEZWxldGVLZXlBKCVsZCwlcylcbiIsCisJCWhrZXksbHBzelN1YktleQorCSk7CisJbHBzelN1YktleVc9c3RyZHVwQTJXKGxwc3pTdWJLZXkpOworCXJldD1SZWdEZWxldGVLZXlXKGhrZXksbHBzelN1YktleVcpOworCWZyZWUobHBzelN1YktleVcpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlZ0RlbGV0ZUtleQkJCVtTSEVMTC40XSBbS0VSTkVMLjIxOV0gKi8KK1dJTkFQSSBEV09SRAorUmVnRGVsZXRlS2V5KEhLRVkgaGtleSxMUENTVFIgbHBzelN1YktleSkgeworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRGVsZXRlS2V5KCVsZCwlcylcbiIsCisJCWhrZXksbHBzelN1YktleQorCSk7CisJcmV0dXJuIFJlZ0RlbGV0ZUtleUEoaGtleSxscHN6U3ViS2V5KTsKK30KKworLyogCisgKiBEZWxldGUgcmVnaXN0cnkgdmFsdWUKKyAqCisgKiBDYWxscGF0aDoKKyAqIFJlZ0RlbGV0ZVZhbHVlIC0+IFJlZ0RlbGV0ZVZhbHVlQSAtPiBSZWdEZWxldGVWYWx1ZVcKKyAqLworLyogUmVnRGVsZXRlVmFsdWVXCQlbQURWQVBJMzIuMTM2XSAqLworV0lOQVBJIERXT1JECitSZWdEZWxldGVWYWx1ZVcoSEtFWSBoa2V5LExQV1NUUiBscHN6VmFsdWUpIHsKKwlEV09SRAkJaTsKKwlMUEtFWVNUUlVDVAlscGtleTsKKwlMUEtFWVZBTFVFCXZhbDsKKworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRGVsZXRlVmFsdWVXKCVsZCwlcylcbiIsCisJCWhrZXksVzJDKGxwc3pWYWx1ZSwwKQorCSk7CisJbHBrZXk9bG9va3VwX2hrZXkoaGtleSk7CisJaWYgKCFscGtleSkKKwkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKKwlpZiAobHBzelZhbHVlKSB7CisJCWZvciAoaT0wO2k8bHBrZXktPm5yb2Z2YWx1ZXM7aSsrKQorCQkJaWYgKCFzdHJjbXBXKGxwa2V5LT52YWx1ZXNbaV0ubmFtZSxscHN6VmFsdWUpKQorCQkJCWJyZWFrOworCX0gZWxzZSB7CisJCWZvciAoaT0wO2k8bHBrZXktPm5yb2Z2YWx1ZXM7aSsrKQorCQkJaWYgKGxwa2V5LT52YWx1ZXNbaV0ubmFtZT09TlVMTCkKKwkJCQlicmVhazsKKwl9CisJaWYgKGk9PWxwa2V5LT5ucm9mdmFsdWVzKQorCQlyZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOy8qRklYTUU6IGNvcnJlY3QgZXJyb3Jjb2RlPyAqLworCXZhbAk9IGxwa2V5LT52YWx1ZXMraTsKKwlpZiAodmFsLT5uYW1lKSBmcmVlKHZhbC0+bmFtZSk7CisJaWYgKHZhbC0+ZGF0YSkgZnJlZSh2YWwtPmRhdGEpOworCW1lbWNweSgJCisJCWxwa2V5LT52YWx1ZXMraSwKKwkJbHBrZXktPnZhbHVlcytpKzEsCisJCXNpemVvZihLRVlWQUxVRSkqKGxwa2V5LT5ucm9mdmFsdWVzLWktMSkKKwkpOworCWxwa2V5LT52YWx1ZXMJPSAoTFBLRVlWQUxVRSl4cmVhbGxvYygKKwkJCQlscGtleS0+dmFsdWVzLAorCQkJCShscGtleS0+bnJvZnZhbHVlcy0xKSpzaXplb2YoS0VZVkFMVUUpCisJCQkpOworCWxwa2V5LT5ucm9mdmFsdWVzLS07CisJcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7Cit9CisKKy8qIFJlZ0RlbGV0ZVZhbHVlQQkJW0FEVkFQSTMyLjEzNV0gKi8KK1dJTkFQSSBEV09SRAorUmVnRGVsZXRlVmFsdWVBKEhLRVkgaGtleSxMUFNUUiBscHN6VmFsdWUpIHsKKwlMUFdTVFIJbHBzelZhbHVlVzsKKwlEV09SRAlyZXQ7CisKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0RlbGV0ZVZhbHVlQSglbGQsJXMpXG4iLAorCQloa2V5LGxwc3pWYWx1ZQorCSk7CisJaWYgKGxwc3pWYWx1ZSkKKwkJbHBzelZhbHVlVz1zdHJkdXBBMlcobHBzelZhbHVlKTsKKwllbHNlCisJCWxwc3pWYWx1ZVc9TlVMTDsKKwlyZXQ9UmVnRGVsZXRlVmFsdWVXKGhrZXksbHBzelZhbHVlVyk7CisJaWYgKGxwc3pWYWx1ZVcpCisJCWZyZWUobHBzelZhbHVlVyk7CisJcmV0dXJuIHJldDsKK30KKworLyogUmVnRGVsZXRlVmFsdWUJCVtLRVJORUwuMjIyXSAqLworV0lOQVBJIERXT1JECitSZWdEZWxldGVWYWx1ZShIS0VZIGhrZXksTFBTVFIgbHBzelZhbHVlKSB7CisJZHByaW50Zl9yZWcoc3RkZGViLCJSZWdEZWxldGVWYWx1ZSglbGQsJXMpXG4iLAorCQloa2V5LGxwc3pWYWx1ZQorCSk7CisJcmV0dXJuIFJlZ0RlbGV0ZVZhbHVlQShoa2V5LGxwc3pWYWx1ZSk7Cit9CisKKy8qIFJlZ0ZsdXNoS2V5CQkJW0FEVkFQSTMyLjE0M10gW0tFUk5FTC4yMjddICovCitXSU5BUEkgRFdPUkQKK1JlZ0ZsdXNoS2V5KEhLRVkgaGtleSkgeworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnRmx1c2hLZXkoJWxkKSwgU1RVQi5cbiIsaGtleSk7CisJcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7Cit9CisKKy8qIEZJWE1FOiBscGNjaFhYWFggLi4uIGlzIHRoaXMgY291bnRpbmcgaW4gV0NIQVJTIG9yIGluIEJZVEVzID8/ICovCisKKy8qIFJlZ1F1ZXJ5SW5mb0tleVcJCVtBRFZBUEkzMi4xNTNdICovCitXSU5BUEkgRFdPUkQKK1JlZ1F1ZXJ5SW5mb0tleVcoCisJSEtFWQloa2V5LAorCUxQV1NUUglscHN6Q2xhc3MsCisJTFBEV09SRAlscGNjaENsYXNzLAorCUxQRFdPUkQJbHBkd1Jlc2VydmVkLAorCUxQRFdPUkQJbHBjU3ViS2V5cywKKwlMUERXT1JECWxwY2NoTWF4U3Via2V5LAorCUxQRFdPUkQJbHBjY2hNYXhDbGFzcywKKwlMUERXT1JECWxwY1ZhbHVlcywKKwlMUERXT1JECWxwY2NoTWF4VmFsdWVOYW1lLAorCUxQRFdPUkQJbHBjY2JNYXhWYWx1ZURhdGEsCisJTFBEV09SRAlscGNiU2VjdXJpdHlEZXNjcmlwdG9yLAorCUZJTEVUSU1FCSpmdAorKSB7CisJTFBLRVlTVFJVQ1QJbHBrZXksbHB4a2V5OworCWludAkJbnJvZmtleXMsbWF4c3Via2V5LG1heGNsYXNzLG1heHZhbHVlcyxtYXh2bmFtZSxtYXh2ZGF0YTsKKwlpbnQJCWk7CisKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ1F1ZXJ5SW5mb0tleVcoJWx4LC4uLi4uLilcbiIsaGtleSk7CisJbHBrZXk9bG9va3VwX2hrZXkoaGtleSk7CisJaWYgKCFscGtleSkKKwkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKKwlpZiAobHBzekNsYXNzKSB7CisJCWlmIChscGtleS0+Y2xhc3MpIHsKKwkJCWlmIChzdHJsZW5XKGxwa2V5LT5jbGFzcykqMisyPipscGNjaENsYXNzKSB7CisJCQkJKmxwY2NoQ2xhc3M9c3RybGVuVyhscGtleS0+Y2xhc3MpKjI7CisJCQkJcmV0dXJuIEVSUk9SX01PUkVfREFUQTsKKwkJCX0KKwkJCSpscGNjaENsYXNzPXN0cmxlblcobHBrZXktPmNsYXNzKSoyOworCQkJbWVtY3B5KGxwc3pDbGFzcyxscGtleS0+Y2xhc3Msc3RybGVuVyhscGtleS0+Y2xhc3MpKTsKKwkJfSBlbHNlIHsKKwkJCSpscHN6Q2xhc3MJPSAwOworCQkJKmxwY2NoQ2xhc3MJPSAwOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGxwY2NoQ2xhc3MpCisJCQkqbHBjY2hDbGFzcwk9IHN0cmxlblcobHBrZXktPmNsYXNzKSoyOworCX0KKwlscHhrZXk9bHBrZXktPm5leHRzdWI7CisJbnJvZmtleXM9bWF4c3Via2V5PW1heGNsYXNzPW1heHZhbHVlcz1tYXh2bmFtZT1tYXh2ZGF0YT0wOworCXdoaWxlIChscHhrZXkpIHsKKwkJbnJvZmtleXMrKzsKKwkJaWYgKHN0cmxlblcobHB4a2V5LT5rZXluYW1lKT5tYXhzdWJrZXkpCisJCQltYXhzdWJrZXk9c3RybGVuVyhscHhrZXktPmtleW5hbWUpOworCQlpZiAobHB4a2V5LT5jbGFzcyAmJiBzdHJsZW5XKGxweGtleS0+Y2xhc3MpPm1heGNsYXNzKQorCQkJbWF4Y2xhc3M9c3RybGVuVyhscHhrZXktPmNsYXNzKTsKKwkJaWYgKGxweGtleS0+bnJvZnZhbHVlcz5tYXh2YWx1ZXMpCisJCQltYXh2YWx1ZXM9bHB4a2V5LT5ucm9mdmFsdWVzOworCQlmb3IgKGk9MDtpPGxweGtleS0+bnJvZnZhbHVlcztpKyspIHsKKwkJCUxQS0VZVkFMVUUJdmFsPWxweGtleS0+dmFsdWVzK2k7CisKKwkJCWlmICh2YWwtPm5hbWUgJiYgc3RybGVuVyh2YWwtPm5hbWUpPm1heHZuYW1lKQorCQkJCW1heHZuYW1lPXN0cmxlblcodmFsLT5uYW1lKTsKKwkJCWlmICh2YWwtPmxlbj5tYXh2ZGF0YSkKKwkJCQltYXh2ZGF0YT12YWwtPmxlbjsKKwkJfQorCQlscHhrZXk9bHB4a2V5LT5uZXh0OworCX0KKwlpZiAoIW1heGNsYXNzKSBtYXhjbGFzcwk9IDE7CisJaWYgKCFtYXh2bmFtZSkgbWF4dm5hbWUJPSAxOworCWlmIChscGNTdWJLZXlzKQorCQkqbHBjU3ViS2V5cwk9IG5yb2ZrZXlzOworCWlmIChscGNjaE1heFN1YmtleSkKKwkJKmxwY2NoTWF4U3Via2V5CT0gbWF4c3Via2V5KjI7CisJaWYgKGxwY2NoTWF4Q2xhc3MpCisJCSpscGNjaE1heENsYXNzCT0gbWF4Y2xhc3MqMjsKKwlpZiAobHBjVmFsdWVzKQorCQkqbHBjVmFsdWVzCT0gbWF4dmFsdWVzOworCWlmIChscGNjaE1heFZhbHVlTmFtZSkKKwkJKmxwY2NoTWF4VmFsdWVOYW1lPSBtYXh2bmFtZTsKKwlpZiAobHBjY2JNYXhWYWx1ZURhdGEpCisJCSpscGNjYk1heFZhbHVlRGF0YT0gbWF4dmRhdGE7CisJcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7Cit9CisKKy8qIFJlZ1F1ZXJ5SW5mb0tleUEJCVtBRFZBUEkzMi4xNTJdICovCitXSU5BUEkgRFdPUkQKK1JlZ1F1ZXJ5SW5mb0tleUEoCisJSEtFWQloa2V5LAorCUxQU1RSCWxwc3pDbGFzcywKKwlMUERXT1JECWxwY2NoQ2xhc3MsCisJTFBEV09SRAlscGR3UmVzZXJ2ZWQsCisJTFBEV09SRAlscGNTdWJLZXlzLAorCUxQRFdPUkQJbHBjY2hNYXhTdWJrZXksCisJTFBEV09SRAlscGNjaE1heENsYXNzLAorCUxQRFdPUkQJbHBjVmFsdWVzLAorCUxQRFdPUkQJbHBjY2hNYXhWYWx1ZU5hbWUsCisJTFBEV09SRAlscGNjYk1heFZhbHVlRGF0YSwKKwlMUERXT1JECWxwY2JTZWN1cml0eURlc2NyaXB0b3IsCisJRklMRVRJTUUJKmZ0CispIHsKKwlMUFdTVFIJCWxwc3pDbGFzc1c7CisJRFdPUkQJCXJldDsKKworCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnUXVlcnlJbmZvS2V5QSglbHgsLi4uLi4uKVxuIixoa2V5KTsKKwlpZiAobHBzekNsYXNzKSB7CisJCSpscGNjaENsYXNzKj0gMjsKKwkJbHBzekNsYXNzVyAgPSAoTFBXU1RSKXhtYWxsb2MoKmxwY2NoQ2xhc3MpOworCisJfSBlbHNlCisJCWxwc3pDbGFzc1cgID0gTlVMTDsKKwlyZXQ9UmVnUXVlcnlJbmZvS2V5VygKKwkJaGtleSwKKwkJbHBzekNsYXNzVywKKwkJbHBjY2hDbGFzcywKKwkJbHBkd1Jlc2VydmVkLAorCQlscGNTdWJLZXlzLAorCQlscGNjaE1heFN1YmtleSwKKwkJbHBjY2hNYXhDbGFzcywKKwkJbHBjVmFsdWVzLAorCQlscGNjaE1heFZhbHVlTmFtZSwKKwkJbHBjY2JNYXhWYWx1ZURhdGEsCisJCWxwY2JTZWN1cml0eURlc2NyaXB0b3IsCisJCWZ0CisJKTsKKwlpZiAocmV0PT1FUlJPUl9TVUNDRVNTKQorCQlzdHJjcHlXQShscHN6Q2xhc3MsbHBzekNsYXNzVyk7CisJaWYgKGxwY2NoQ2xhc3MpCisJCSpscGNjaENsYXNzLz0yOworCWlmIChscGNjaE1heFN1YmtleSkKKwkJKmxwY2NoTWF4U3Via2V5Lz0yOworCWlmIChscGNjaE1heENsYXNzKQorCQkqbHBjY2hNYXhDbGFzcy89MjsKKwlpZiAobHBjY2hNYXhWYWx1ZU5hbWUpCisJCSpscGNjaE1heFZhbHVlTmFtZS89MjsKKwlpZiAobHBzekNsYXNzVykKKwkJZnJlZShscHN6Q2xhc3NXKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbC5jIGIvbWlzYy9zaGVsbC5jCmluZGV4IDEyYWVhMjEuLmMyMDk1MzEgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGwuYworKysgYi9taXNjL3NoZWxsLmMKQEAgLTgsMTAgKzgsOCBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAibmVleGUuaCIKLSNpbmNsdWRlICJzZWxlY3RvcnMuaCIKLSNpbmNsdWRlICJhbGlhcy5oIgotI2luY2x1ZGUgInJlbGF5MzIuaCIKICNpbmNsdWRlICJyZXNvdXJjZS5oIgogI2luY2x1ZGUgImRsZ3MuaCIKICNpbmNsdWRlICJ3aW4uaCIKQEAgLTE5LDQ1MyArMTcsNiBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCi1MUEtFWVNUUlVDVAlscGhSb290S2V5ID0gTlVMTCxscGhUb3BLZXkgPSBOVUxMOwotCi1zdGF0aWMgY2hhciBSb290S2V5TmFtZVtdPSIuY2xhc3NlcyIsIFRvcEtleU5hbWVbXSA9ICJbdG9wLW51bGxdIjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgU0hFTExfSW5pdCgpCi0gKi8KLUJPT0wgU0hFTExfSW5pdCgpCi17Ci0gICAgSEtFWSBoTmV3S2V5OwotICAgIAotICAgIGhOZXdLZXkgPSBHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFLHNpemVvZihLRVlTVFJVQ1QpKTsKLSAgICBscGhSb290S2V5ID0gKExQS0VZU1RSVUNUKSBHbG9iYWxMb2NrKGhOZXdLZXkpOwotICAgIGlmIChscGhSb290S2V5ID09IE5VTEwpIHsKLSAgICAgICAgcHJpbnRmKCJTSEVMTF9SZWdDaGVja0ZvclJvb3Q6IENvdWxkbid0IGFsbG9jYXRlIHJvb3Qga2V5IVxuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbHBoUm9vdEtleS0+aEtleSA9IChIS0VZKTE7Ci0gICAgbHBoUm9vdEtleS0+bHBTdWJLZXkgPSBSb290S2V5TmFtZTsKLSAgICBscGhSb290S2V5LT5kd1R5cGUgPSAwOwotICAgIGxwaFJvb3RLZXktPmxwVmFsdWUgPSBOVUxMOwotICAgIGxwaFJvb3RLZXktPmxwU3ViTHZsID0gbHBoUm9vdEtleS0+bHBOZXh0S2V5ID0gbHBoUm9vdEtleS0+bHBQcmV2S2V5ID0gTlVMTDsKLSAgICAKLSAgICBoTmV3S2V5ID0gR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSxzaXplb2YoS0VZU1RSVUNUKSk7Ci0gICAgbHBoVG9wS2V5ID0gKExQS0VZU1RSVUNUKSBHbG9iYWxMb2NrKGhOZXdLZXkpOwotICAgIGlmIChscGhUb3BLZXkgPT0gTlVMTCkgewotICAgICAgICBwcmludGYoIlNIRUxMX1JlZ0NoZWNrRm9yUm9vdDogQ291bGRuJ3QgYWxsb2NhdGUgdG9wIGtleSFcbiIpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGxwaFRvcEtleS0+aEtleSA9IDA7Ci0gICAgbHBoVG9wS2V5LT5scFN1YktleSA9IFRvcEtleU5hbWU7Ci0gICAgbHBoVG9wS2V5LT5kd1R5cGUgPSAwOwotICAgIGxwaFRvcEtleS0+bHBWYWx1ZSA9IE5VTEw7Ci0gICAgbHBoVG9wS2V5LT5scFN1Ykx2bCA9IGxwaFJvb3RLZXk7Ci0gICAgbHBoVG9wS2V5LT5scE5leHRLZXkgPSBscGhUb3BLZXktPmxwUHJldktleSA9IE5VTEw7Ci0KLSAgICBkcHJpbnRmX3JlZyhzdGRkZWIsIlNIRUxMX1JlZ0NoZWNrRm9yUm9vdDogUm9vdC9Ub3AgY3JlYXRlZFxuIik7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyogRklYTUU6IHRoZSBsb2FkaW5nIGFuZCBzYXZpbmcgb2YgdGhlIHJlZ2lzdHJ5IGRhdGFiYXNlIGlzIHJhdGhlciBtZXNzeS4KLSAqIGJhZCBpbnB1dCAod2hpbGUgcmVhZGluZykgbWF5IGNyYXNoIHdpbmUuCi0gKi8KLXZvaWQKLV9EdW1wTGV2ZWwoRklMRSAqZixMUEtFWVNUUlVDVCBscFRLZXksaW50IHRhYnMpCi17Ci0JTFBLRVlTVFJVQ1QJbHBLZXk7Ci0KLQlscEtleT1scFRLZXktPmxwU3ViTHZsOwotCXdoaWxlIChscEtleSkgewotCQlpbnQJaTsKLQkJZm9yIChpPTA7aTx0YWJzO2krKykgZnByaW50ZihmLCJcdCIpOwotCQkvKiBpbXBsZW1lbnQgZGlmZmVyZW50IGR3VHlwZXMgLi4uICovCi0JCWlmIChscEtleS0+bHBWYWx1ZSkKLQkJCWZwcmludGYoZiwiJXM9JXNcbiIsbHBLZXktPmxwU3ViS2V5LGxwS2V5LT5scFZhbHVlKTsKLQkJZWxzZQotCQkJZnByaW50ZihmLCIlc1xuIixscEtleS0+bHBTdWJLZXkpOwotCi0JCWlmIChscEtleS0+bHBTdWJMdmwpCi0JCQlfRHVtcExldmVsKGYsbHBLZXksdGFicysxKTsKLQkJbHBLZXk9bHBLZXktPmxwTmV4dEtleTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1fU2F2ZUtleShIS0VZIGhLZXksY2hhciAqd2hlcmUpCi17Ci0JRklMRQkJKmY7Ci0JTFBLRVlTVFJVQ1QJbHBLZXk7Ci0KLQlmPWZvcGVuKHdoZXJlLCJ3Iik7Ci0JaWYgKGY9PU5VTEwpIHsKLQkJcGVycm9yKCJyZWdpc3RyeS1mb3BlbiIpOwotCQlyZXR1cm47Ci0JfQotCXN3aXRjaCAoKERXT1JEKWhLZXkpIHsKLQljYXNlIEhLRVlfQ0xBU1NFU19ST09UOgotCQlscEtleT1scGhSb290S2V5OwotCQlicmVhazsKLQlkZWZhdWx0OnJldHVybjsKLQl9Ci0JX0R1bXBMZXZlbChmLGxwS2V5LDApOwotCWZjbG9zZShmKTsKLX0KLQotdm9pZAotU0hFTExfU2F2ZVJlZ2lzdHJ5KHZvaWQpCi17Ci0JLyogRklYTUU6IAotCSAqIC1pbXBsZW1lbnQgd2luOTUgYWRkaXRpb25hbCBrZXl0eXBlcyBoZXJlCi0JICogKEhLRVlfTE9DQUxfTUFDSElORSxIS0VZX0NVUlJFTlRfVVNFUiBvciB3aGF0ZXZlcikKLQkgKiAtY2hvb3NlIGJldHRlciBmaWxlbmFtZShzKQotCSAqLwotCV9TYXZlS2V5KChIS0VZKUhLRVlfQ0xBU1NFU19ST09ULCIvdG1wL3dpbmVyZWciKTsKLX0KLQotI2RlZmluZSBCVUZTSVpFCTI1Ngotdm9pZAotX0xvYWRMZXZlbChGSUxFICpmLExQS0VZU1RSVUNUIGxwS2V5LGludCB0YWJzZXhwLGNoYXIgKmJ1ZikKLXsKLQlpbnQJCWk7Ci0JY2hhcgkJKnMsKnQ7Ci0JSEtFWQkJaE5ld0tleTsKLQlMUEtFWVNUUlVDVAlscE5ld0tleTsKLQotCXdoaWxlICgxKSB7Ci0JCWlmIChOVUxMPT1mZ2V0cyhidWYsQlVGU0laRSxmKSkgewotCQkJYnVmWzBdPTA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpPTA7YnVmW2ldPT0nXHQnO2krKykgLyplbXB0eSovOwotCQlzPWJ1ZitpOwotCQlpZiAoTlVMTCE9KHQ9c3RyY2hyKHMsJ1xuJykpKSAqdD0nXDAnOwotCQlpZiAoTlVMTCE9KHQ9c3RyY2hyKHMsJ1xyJykpKSAqdD0nXDAnOwotCi0JCWlmIChpPHRhYnNleHApIHJldHVybjsKLQotCQlpZiAoaT50YWJzZXhwKSB7Ci0JCQloTmV3S2V5PUdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsc2l6ZW9mKEtFWVNUUlVDVCkpOwotCQkJbHBOZXdLZXk9bHBLZXktPmxwU3ViTHZsPShMUEtFWVNUUlVDVClHbG9iYWxMb2NrKGhOZXdLZXkpOwotCQkJbHBOZXdLZXktPmhLZXkJCT0gaE5ld0tleTsKLQkJCWxwTmV3S2V5LT5kd1R5cGUJPSAwOwotCQkJbHBOZXdLZXktPmxwU3ViS2V5CT0gTlVMTDsKLQkJCWxwTmV3S2V5LT5scFZhbHVlCT0gTlVMTDsKLQkJCWxwTmV3S2V5LT5scFN1Ykx2bAk9IE5VTEw7Ci0JCQlscE5ld0tleS0+bHBOZXh0S2V5CT0gTlVMTDsKLQkJCWxwTmV3S2V5LT5scFByZXZLZXkJPSBOVUxMOwotCQkJaWYgKE5VTEwhPSh0PXN0cmNocihzLCc9JykpKSB7Ci0JCQkJKnQ9J1wwJzt0Kys7Ci0JCQkJbHBOZXdLZXktPmR3VHlwZQk9IFJFR19TWjsKLQkJCQlscE5ld0tleS0+bHBTdWJLZXkJPSB4c3RyZHVwKHMpOwotCQkJCWxwTmV3S2V5LT5scFZhbHVlCT0geHN0cmR1cCh0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbHBOZXdLZXktPmR3VHlwZQk9IFJFR19TWjsKLQkJCQlscE5ld0tleS0+bHBTdWJLZXkJPSB4c3RyZHVwKHMpOwotCQkJfQotCQkJX0xvYWRMZXZlbChmLGxwTmV3S2V5LHRhYnNleHArMSxidWYpOwotCQl9Ci0JCWZvciAoaT0wO2J1ZltpXT09J1x0JztpKyspIC8qZW1wdHkqLzsKLQkJcz1idWYraTsKLQkJaWYgKGk8dGFic2V4cCkgcmV0dXJuOwotCQlpZiAoYnVmWzBdPT0nXDAnKSBicmVhazsgLyogbWFya3MgZW5kIG9mIGZpbGUgKi8KLQkJLyogd2UgaGF2ZSBhIGJ1ZiBub3cuIGV2ZW4gd2hlbiByZXR1cm5pbmcgZnJvbSBfTG9hZExldmVsICovCi0JCWhOZXdLZXkJCT0gR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSxzaXplb2YoS0VZU1RSVUNUKSk7Ci0JCWxwTmV3S2V5CT0gbHBLZXktPmxwTmV4dEtleT0oTFBLRVlTVFJVQ1QpR2xvYmFsTG9jayhoTmV3S2V5KTsKLQkJbHBOZXdLZXktPmxwUHJldktleQk9IGxwS2V5OwotCQlscE5ld0tleS0+aEtleQkJPSBoTmV3S2V5OwotCQlscE5ld0tleS0+ZHdUeXBlCT0gMDsKLQkJbHBOZXdLZXktPmxwU3ViS2V5CT0gTlVMTDsKLQkJbHBOZXdLZXktPmxwVmFsdWUJPSBOVUxMOwotCQlscE5ld0tleS0+bHBTdWJMdmwJPSBOVUxMOwotCQlscE5ld0tleS0+bHBOZXh0S2V5CT0gTlVMTDsKLQkJaWYgKE5VTEwhPSh0PXN0cmNocihzLCc9JykpKSB7Ci0JCQkqdD0nXDAnO3QrKzsKLQkJCWxwTmV3S2V5LT5kd1R5cGUJPSBSRUdfU1o7Ci0JCQlscE5ld0tleS0+bHBTdWJLZXkJPSB4c3RyZHVwKHMpOwotCQkJbHBOZXdLZXktPmxwVmFsdWUJPSB4c3RyZHVwKHQpOwotCQl9IGVsc2UgewotCQkJbHBOZXdLZXktPmR3VHlwZQk9IFJFR19TWjsKLQkJCWxwTmV3S2V5LT5scFN1YktleQk9IHhzdHJkdXAocyk7Ci0JCX0KLQkJbHBLZXk9bHBOZXdLZXk7Ci0JfQotfQotCi12b2lkCi1fTG9hZEtleShIS0VZIGhLZXksY2hhciAqZnJvbSkgCi17Ci0JRklMRQkJKmY7Ci0JTFBLRVlTVFJVQ1QJbHBLZXk7Ci0JY2hhcgkJYnVmW0JVRlNJWkVdOyAvKiBGSVhNRTogbG9uZyBlbm91Z2g/ICovCi0KLQlmPWZvcGVuKGZyb20sInIiKTsKLQlpZiAoZj09TlVMTCkgewotICAgICAgICAgICAgZHByaW50Zl9yZWcoc3RkZGViLCJmb3Blbi1yZWdpc3RyeS1yZWFkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0JfQotCXN3aXRjaCAoKERXT1JEKWhLZXkpIHsKLQljYXNlIEhLRVlfQ0xBU1NFU19ST09UOgotCQlscEtleT1scGhSb290S2V5OwotCQlicmVhazsKLQlkZWZhdWx0OnJldHVybjsKLQl9Ci0JX0xvYWRMZXZlbChmLGxwS2V5LC0xLGJ1Zik7Ci19Ci0KLXZvaWQKLVNIRUxMX0xvYWRSZWdpc3RyeSh2b2lkKSAKLXsKLQlfTG9hZEtleSgoSEtFWSlIS0VZX0NMQVNTRVNfUk9PVCwiL3RtcC93aW5lcmVnIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlSZWdPcGVuS2V5CQlbU0hFTEwuMV0KLSAqLwotTE9ORyBSZWdPcGVuS2V5KEhLRVkgaEtleSwgTFBDU1RSIGxwU3ViS2V5LCBMUEhLRVkgbHBoS2V5KQotewotCUxQS0VZU1RSVUNUCWxwS2V5LGxwTmV4dEtleTsKLQlMUENTVFIJCXB0cjsKLQljaGFyCQlzdHJbMTI4XTsKLQotCWRwcmludGZfcmVnKHN0ZGRlYiwgIlJlZ09wZW5LZXkoJTA4bFgsICVwPSclcycsICVwKVxuIiwKLQkJCQkgICAgICAgKERXT1JEKWhLZXksIGxwU3ViS2V5LCBscFN1YktleSwgbHBoS2V5KTsKLQlpZiAobHBoS2V5ID09IE5VTEwpIHJldHVybiBTSEVMTF9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICAgICAgc3dpdGNoKChEV09SRCloS2V5KSB7Ci0JY2FzZSAwOiAKLQkgIGxwS2V5ID0gbHBoVG9wS2V5OyBicmVhazsKLSAgICAgICAgY2FzZSBIS0VZX0NMQVNTRVNfUk9PVDogLyogPT0gMSAqLwotICAgICAgICBjYXNlIDB4ODAwMDAwMDA6Ci0gICAgICAgIGNhc2UgMHg4MDAwMDAwMToKLSAgICAgICAgICBscEtleSA9IGxwaFJvb3RLZXk7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLQkgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnT3BlbktleSAvLyBzcGVjaWZpYyBrZXkgPSAlMDhsWCAhXG4iLCAoRFdPUkQpaEtleSk7Ci0JICBscEtleSA9IChMUEtFWVNUUlVDVClHbG9iYWxMb2NrKGhLZXkpOwotICAgICAgICB9Ci0JaWYgKGxwU3ViS2V5ID09IE5VTEwgfHwgISpscFN1YktleSkgIHsgCi0JICAqbHBoS2V5ID0gaEtleTsgCi0JICByZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsgCi0JfQotICAgICAgICB3aGlsZSgqbHBTdWJLZXkpIHsKLSAgICAgICAgICBwdHIgPSBzdHJjaHIobHBTdWJLZXksJ1xcJyk7Ci0gICAgICAgICAgaWYgKCFwdHIpIHB0ciA9IGxwU3ViS2V5ICsgc3RybGVuKGxwU3ViS2V5KTsKLSAgICAgICAgICBzdHJuY3B5KHN0cixscFN1YktleSxwdHItbHBTdWJLZXkpOwotICAgICAgICAgIHN0cltwdHItbHBTdWJLZXldID0gMDsKLSAgICAgICAgICBscFN1YktleSA9IHB0cjsgCi0gICAgICAgICAgaWYgKCpscFN1YktleSkgbHBTdWJLZXkrKzsKLQkgIAotCSAgbHBOZXh0S2V5ID0gbHBLZXktPmxwU3ViTHZsOwotICAgICAgICAgIHdoaWxlKGxwS2V5ICE9IE5VTEwgJiYgc3RyY21wKGxwS2V5LT5scFN1YktleSwgc3RyKSAhPSAwKSB7IAotICAgICAgICAgIAlscEtleSA9IGxwTmV4dEtleTsKLSAgICAgICAgICAJaWYgKGxwS2V5KSBscE5leHRLZXkgPSBscEtleS0+bHBOZXh0S2V5OwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobHBLZXkgPT0gTlVMTCkgewotCSAgICBkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ09wZW5LZXk6IGtleSAlcyBub3QgZm91bmQhXG4iLHN0cik7Ci0JICAgIHJldHVybiBTSEVMTF9FUlJPUl9CQURLRVk7Ci0JICB9CSAgICAKLQl9Ci0gICAgICAgICpscGhLZXkgPSBscEtleS0+aEtleTsKLQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJUmVnQ3JlYXRlS2V5CQlbU0hFTEwuMl0KLSAqLwotTE9ORyBSZWdDcmVhdGVLZXkoSEtFWSBoS2V5LCBMUENTVFIgbHBTdWJLZXksIExQSEtFWSBscGhLZXkpCi17Ci0JSEtFWQkJaE5ld0tleTsKLQlMUEtFWVNUUlVDVAlscE5ld0tleTsKLQlMUEtFWVNUUlVDVAlscEtleTsKLQlMUEtFWVNUUlVDVAlscFByZXZLZXk7Ci0JTFBDU1RSCQlwdHI7Ci0JY2hhcgkJc3RyWzEyOF07Ci0KLQlkcHJpbnRmX3JlZyhzdGRkZWIsICJSZWdDcmVhdGVLZXkoJTA4bFgsICclcycsICVwKVxuIiwJKERXT1JEKWhLZXksIGxwU3ViS2V5LCBscGhLZXkpOwotCWlmIChscGhLZXkgPT0gTlVMTCkgcmV0dXJuIFNIRUxMX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgICAgICBzd2l0Y2goKERXT1JEKWhLZXkpIHsKLQljYXNlIDA6IAotCSAgbHBLZXkgPSBscGhUb3BLZXk7IGJyZWFrOwotICAgICAgICBjYXNlIEhLRVlfQ0xBU1NFU19ST09UOiAvKiA9PSAxICovCi0gICAgICAgIGNhc2UgMHg4MDAwMDAwMDoKLSAgICAgICAgY2FzZSAweDgwMDAwMDAxOgotICAgICAgICAgIGxwS2V5ID0gbHBoUm9vdEtleTsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotCSAgZHByaW50Zl9yZWcoc3RkZGViLCJSZWdDcmVhdGVLZXkgLy8gc3BlY2lmaWMga2V5ID0gJTA4bFggIVxuIiwgKERXT1JEKWhLZXkpOwotCSAgbHBLZXkgPSAoTFBLRVlTVFJVQ1QpR2xvYmFsTG9jayhoS2V5KTsKLSAgICAgICAgfQotCWlmIChscFN1YktleSA9PSBOVUxMIHx8ICEqbHBTdWJLZXkpICB7IAotCSAgKmxwaEtleSA9IGhLZXk7IAotCSAgcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7Ci0JfQotICAgICAgICB3aGlsZSAoKmxwU3ViS2V5KSB7Ci0gICAgICAgICAgZHByaW50Zl9yZWcoc3RkZGViLCAiUmVnQ3JlYXRlS2V5OiBMb29raW5nIGZvciBzdWJrZXkgJXNcbiIsIGxwU3ViS2V5KTsKLSAgICAgICAgICBwdHIgPSBzdHJjaHIobHBTdWJLZXksJ1xcJyk7Ci0gICAgICAgICAgaWYgKCFwdHIpIHB0ciA9IGxwU3ViS2V5ICsgc3RybGVuKGxwU3ViS2V5KTsKLSAgICAgICAgICBzdHJuY3B5KHN0cixscFN1YktleSxwdHItbHBTdWJLZXkpOwotICAgICAgICAgIHN0cltwdHItbHBTdWJLZXldID0gMDsKLSAgICAgICAgICBscFN1YktleSA9IHB0cjsgCi0gICAgICAgICAgaWYgKCpscFN1YktleSkgbHBTdWJLZXkrKzsKLQkgIAotCSAgbHBQcmV2S2V5ID0gbHBLZXk7Ci0JICBscEtleSA9IGxwS2V5LT5scFN1Ykx2bDsKLSAgICAgICAgICB3aGlsZShscEtleSAhPSBOVUxMICYmIHN0cmNtcChscEtleS0+bHBTdWJLZXksIHN0cikgIT0gMCkgeyAKLQkgICAgbHBLZXkgPSBscEtleS0+bHBOZXh0S2V5OyAKLQkgIH0KLSAgICAgICAgICBpZiAobHBLZXkgPT0gTlVMTCkgewotCSAgICBoTmV3S2V5ID0gR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSwgc2l6ZW9mKEtFWVNUUlVDVCkpOwotCSAgICBscE5ld0tleSA9IChMUEtFWVNUUlVDVCkgR2xvYmFsTG9jayhoTmV3S2V5KTsKLQkgICAgaWYgKGxwTmV3S2V5ID09IE5VTEwpIHsKLQkgICAgICBwcmludGYoIlJlZ0NyZWF0ZUtleSAvLyBDYW4ndCBhbGxvYyBuZXcga2V5ICFcbiIpOwotCSAgICAgIHJldHVybiBTSEVMTF9FUlJPUl9PVVRPRk1FTU9SWTsKLQkgICAgfQotCSAgICBscE5ld0tleS0+aEtleSA9IGhOZXdLZXk7Ci0JICAgIGxwTmV3S2V5LT5scFN1YktleSA9IG1hbGxvYyhzdHJsZW4oc3RyKSArIDEpOwotCSAgICBpZiAobHBOZXdLZXktPmxwU3ViS2V5ID09IE5VTEwpIHsKLQkgICAgICBwcmludGYoIlJlZ0NyZWF0ZUtleSAvLyBDYW4ndCBhbGxvYyBrZXkgc3RyaW5nICFcbiIpOwotCSAgICAgIHJldHVybiBTSEVMTF9FUlJPUl9PVVRPRk1FTU9SWTsKLQkgICAgfQotCSAgICBzdHJjcHkobHBOZXdLZXktPmxwU3ViS2V5LCBzdHIpOwotCSAgICBscE5ld0tleS0+bHBOZXh0S2V5ID0gbHBQcmV2S2V5LT5scFN1Ykx2bDsKLQkgICAgbHBOZXdLZXktPmxwUHJldktleSA9IE5VTEw7Ci0gICAgICAgICAgICBscFByZXZLZXktPmxwU3ViTHZsID0gbHBOZXdLZXk7Ci0KLQkgICAgbHBOZXdLZXktPmR3VHlwZSA9IDA7Ci0JICAgIGxwTmV3S2V5LT5scFZhbHVlID0gTlVMTDsKLQkgICAgbHBOZXdLZXktPmxwU3ViTHZsID0gTlVMTDsKLQkgICAgKmxwaEtleSA9IGhOZXdLZXk7Ci0JICAgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnQ3JlYXRlS2V5IC8vIHN1Y2Nlc3NmdWwgJyVzJyBrZXk9JTA4bFggIVxuIiwgc3RyLCAoRFdPUkQpaE5ld0tleSk7Ci0JICAgIGxwS2V5ID0gbHBOZXdLZXk7Ci0JICB9IGVsc2UgewotICAgICAgICAgICAgKmxwaEtleSA9IGxwS2V5LT5oS2V5OwotCSAgICBkcHJpbnRmX3JlZyhzdGRkZWIsIlJlZ0NyZWF0ZUtleSAvLyBmb3VuZCAnJXMnLCBrZXk9JTA4bFhcbiIsIHN0ciwgKERXT1JEKSpscGhLZXkpOwotCSAgfQotCX0KLQlyZXR1cm4gU0hFTExfRVJST1JfU1VDQ0VTUzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJUmVnQ2xvc2VLZXkJCVtTSEVMTC4zXQotICovCi1MT05HIFJlZ0Nsb3NlS2V5KEhLRVkgaEtleSkKLXsKLQlkcHJpbnRmX3JlZyhzdGRuaW1wLCAiRU1QVFkgU1RVQiAhISEgUmVnQ2xvc2VLZXkoJTA4bFgpO1xuIiwgKERXT1JEKWhLZXkpOwotCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlSZWdEZWxldGVLZXkJCVtTSEVMTC40XQotICovCi1MT05HIFJlZ0RlbGV0ZUtleShIS0VZIGhLZXksIExQQ1NUUiBscFN1YktleSkKLXsKLQlkcHJpbnRmX3JlZyhzdGRuaW1wLCAiRU1QVFkgU1RVQiAhISEgUmVnRGVsZXRlS2V5KCUwOGxYLCAnJXMnKTtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAoRFdPUkQpaEtleSwgbHBTdWJLZXkpOwotCXJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlSZWdTZXRWYWx1ZQkJW1NIRUxMLjVdCi0gKi8KLUxPTkcgUmVnU2V0VmFsdWUoSEtFWSBoS2V5LCBMUENTVFIgbHBTdWJLZXksIERXT1JEIGR3VHlwZSwgCi0JCSBMUENTVFIgbHBWYWwsIERXT1JEIGR3SWdub3JlZCkKLXsKLSAgICBIS0VZICAgICAgIAloUmV0S2V5OwotICAgIExQS0VZU1RSVUNUCWxwS2V5OwotICAgIExPTkcgICAgICAgCWR3UmV0OwotICAgIGRwcmludGZfcmVnKHN0ZGRlYiwgIlJlZ1NldFZhbHVlKCUwOGxYLCAnJXMnLCAlMDhsWCwgJyVzJywgJTA4bFgpO1xuIiwKLQkJKERXT1JEKWhLZXksIGxwU3ViS2V5LCBkd1R5cGUsIGxwVmFsLCBkd0lnbm9yZWQpOwotICAgIC8qaWYgKGxwU3ViS2V5ID09IE5VTEwpIHJldHVybiBTSEVMTF9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsqLwotICAgIGlmIChscFZhbCA9PSBOVUxMKSByZXR1cm4gU0hFTExfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7Ci0gICAgaWYgKChkd1JldCA9IFJlZ09wZW5LZXkoaEtleSwgbHBTdWJLZXksICZoUmV0S2V5KSkgIT0gU0hFTExfRVJST1JfU1VDQ0VTUykgewotCWRwcmludGZfcmVnKHN0ZGRlYiwgIlJlZ1NldFZhbHVlIC8vIGtleSBub3QgZm91bmQgLi4uIHNvIGNyZWF0ZSBpdCAhXG4iKTsKLQlpZiAoKGR3UmV0ID0gUmVnQ3JlYXRlS2V5KGhLZXksIGxwU3ViS2V5LCAmaFJldEtleSkpICE9IFNIRUxMX0VSUk9SX1NVQ0NFU1MpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJSZWdTZXRWYWx1ZSAvLyBrZXkgY3JlYXRpb24gZXJyb3IgJTA4bFggIVxuIiwgZHdSZXQpOwotCSAgICByZXR1cm4gZHdSZXQ7Ci0JfQotICAgIH0KLSAgICBscEtleSA9IChMUEtFWVNUUlVDVClHbG9iYWxMb2NrKGhSZXRLZXkpOwotICAgIGlmIChscEtleSA9PSBOVUxMKSByZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOwotICAgIGlmIChscEtleS0+bHBWYWx1ZSAhPSBOVUxMKSBmcmVlKGxwS2V5LT5scFZhbHVlKTsKLSAgICBscEtleS0+bHBWYWx1ZSA9IHhtYWxsb2Moc3RybGVuKGxwVmFsKSArIDEpOwotICAgIHN0cmNweShscEtleS0+bHBWYWx1ZSwgbHBWYWwpOwotICAgIGRwcmludGZfcmVnKHN0ZGRlYiwiUmVnU2V0VmFsdWUgLy8gc3VjY2Vzc2Z1bCBrZXk9JyVzJyB2YWw9JyVzJyAhXG4iLCBscFN1YktleSwgbHBLZXktPmxwVmFsdWUpOwotICAgIHJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlSZWdRdWVyeVZhbHVlCQlbU0hFTEwuNl0KLSAqLwotTE9ORyBSZWdRdWVyeVZhbHVlKEhLRVkgaEtleSwgTFBDU1RSIGxwU3ViS2V5LCBMUFNUUiBscFZhbCwgTFBMT05HIGxwY2IpCi17Ci0JSEtFWQkJaFJldEtleTsKLQlMUEtFWVNUUlVDVAlscEtleTsKLQlMT05HCQlkd1JldDsKLQlpbnQJCQlzaXplOwotCWRwcmludGZfcmVnKHN0ZGRlYiwgIlJlZ1F1ZXJ5VmFsdWUoJTA4bFgsICclcycsICVwLCAlcCk7XG4iLAotICAgICAgICAgICAgICAgICAgICAoRFdPUkQpaEtleSwgbHBTdWJLZXksIGxwVmFsLCBscGNiKTsKLQkvKmlmIChscFN1YktleSA9PSBOVUxMKSByZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7Ki8KLQlpZiAobHBWYWwgPT0gTlVMTCkgcmV0dXJuIFNIRUxMX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotCWlmIChscGNiID09IE5VTEwpIHJldHVybiBTSEVMTF9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICAgICAgaWYgKCEqbHBjYikgcmV0dXJuIFNIRUxMX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotCi0JaWYgKChkd1JldCA9IFJlZ09wZW5LZXkoaEtleSwgbHBTdWJLZXksICZoUmV0S2V5KSkgIT0gU0hFTExfRVJST1JfU1VDQ0VTUykgewotCQlmcHJpbnRmKHN0ZGVyciwgIlJlZ1F1ZXJ5VmFsdWUgLy8ga2V5IG5vdCBmb3VuZCAhXG4iKTsKLQkJcmV0dXJuIGR3UmV0OwotCX0KLQlscEtleSA9IChMUEtFWVNUUlVDVClHbG9iYWxMb2NrKGhSZXRLZXkpOwotCWlmIChscEtleSA9PSBOVUxMKSByZXR1cm4gU0hFTExfRVJST1JfQkFES0VZOwotCWlmIChscEtleS0+bHBWYWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgaWYgKChzaXplID0gc3RybGVuKGxwS2V5LT5scFZhbHVlKSsxKSA+ICpscGNiKXsKLSAgICAgICAgICAgIHN0cm5jcHkobHBWYWwsbHBLZXktPmxwVmFsdWUsKmxwY2ItMSk7Ci0gICAgICAgICAgICBscFZhbFsqbHBjYi0xXSA9IDA7Ci0JICB9IGVsc2UgewotICAgICAgICAgICAgc3RyY3B5KGxwVmFsLGxwS2V5LT5scFZhbHVlKTsKLSAgICAgICAgICAgICpscGNiID0gc2l6ZTsKLSAgICAgICAgICB9Ci0JfSBlbHNlIHsKLQkgICpscFZhbCA9IDA7Ci0JICAqbHBjYiA9IChMT05HKTE7Ci0JfQotCWRwcmludGZfcmVnKHN0ZGRlYiwiUmVnUXVlcnlWYWx1ZSAvLyByZXR1cm4gJyVzJyAhXG4iLCBscFZhbCk7Ci0JcmV0dXJuIFNIRUxMX0VSUk9SX1NVQ0NFU1M7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCVJlZ0VudW1LZXkJCVtTSEVMTC43XQotICovCi1MT05HIFJlZ0VudW1LZXkoSEtFWSBoS2V5LCBEV09SRCBkd1N1YktleSwgTFBTVFIgbHBCdWYsIERXT1JEIGR3U2l6ZSkKLXsKLQlMUEtFWVNUUlVDVAlscEtleTsKLQlMT05HICAgICAgICAgICAgbGVuOwotCi0JZHByaW50Zl9yZWcoc3RkZGViLCAiUmVnRW51bUtleSglMDhsWCwgJWxkKVxuIiwgKERXT1JEKWhLZXksIGR3U3ViS2V5KTsKLQlpZiAobHBCdWYgPT0gTlVMTCkgcmV0dXJuIFNIRUxMX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgICAgICBzd2l0Y2goKERXT1JEKWhLZXkpIHsKLQljYXNlIDA6IAotCSAgbHBLZXkgPSBscGhUb3BLZXk7IGJyZWFrOwotICAgICAgICBjYXNlIEhLRVlfQ0xBU1NFU19ST09UOiAvKiA9PSAxICovCi0gICAgICAgIGNhc2UgMHg4MDAwMDAwMDoKLSAgICAgICAgY2FzZSAweDgwMDAwMDAxOgotICAgICAgICAgIGxwS2V5ID0gbHBoUm9vdEtleTsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotCSAgZHByaW50Zl9yZWcoc3RkZGViLCJSZWdFbnVtS2V5IC8vIHNwZWNpZmljIGtleSA9ICUwOGxYICFcbiIsIChEV09SRCloS2V5KTsKLQkgIGxwS2V5ID0gKExQS0VZU1RSVUNUKUdsb2JhbExvY2soaEtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgbHBLZXkgPSBscEtleS0+bHBTdWJMdmw7Ci0gICAgICAgIHdoaWxlKGxwS2V5ICE9IE5VTEwpewotICAgICAgICAgIGlmICghZHdTdWJLZXkpewotICAgICAgICAgICAgbGVuID0gTUlOKGR3U2l6ZS0xLHN0cmxlbihscEtleS0+bHBTdWJLZXkpKTsKLQkgICAgc3RybmNweShscEJ1ZixscEtleS0+bHBTdWJLZXksbGVuKTsKLQkgICAgbHBCdWZbbGVuXSA9IDA7Ci0gICAgICAgICAgICBkcHJpbnRmX3JlZyhzdGRkZWIsICJSZWdFbnVtS2V5OiBmb3VuZCAlc1xuIixscEJ1Zik7Ci0JICAgIHJldHVybiBTSEVMTF9FUlJPUl9TVUNDRVNTOwotCSAgfQotICAgICAgICAgIGR3U3ViS2V5LS07Ci0gICAgICAgICAgbHBLZXkgPSBscEtleS0+bHBOZXh0S2V5OwotICAgICAgICB9Ci0JZHByaW50Zl9yZWcoc3RkZGViLCAiUmVnRW51bUtleToga2V5IG5vdCBmb3VuZCFcbiIpOwotCXJldHVybiBTSEVMTF9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLX0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJRHJhZ0FjY2VwdEZpbGVzCQlbU0hFTEwuOV0KICAqLwpAQCAtNjgxLDggKzIzMiw2IEBACiB7CiAgICAgSEFORExFIGhhbmRsZTsKICAgICBCT09MIGJSZXQ7Ci0gICAgRFdPUkQgV2luZVByb2MsV2luMTZQcm9jLFdpbjMyUHJvYzsKLSAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkPTA7CiAKICAgICBpZiAoc3pBcHApIHN0cm5jcHkoQXBwTmFtZSwgc3pBcHAsIHNpemVvZihBcHBOYW1lKSk7CiAgICAgZWxzZSAqQXBwTmFtZSA9IDA7CkBAIC02OTMsMjIgKzI0MiwxMSBAQAogICAgIEFwcE1pc2Nbc2l6ZW9mKEFwcE1pc2MpLTFdPTA7CiAKICAgICBpZiAoIWhJY29uKSBoSWNvbiA9IExvYWRJY29uKDAsTUFLRUlOVFJFU09VUkNFKE9JQ19XSU5FSUNPTikpOwotICAgIAotICAgIGlmKCFpbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICAgIFdpbmVQcm9jPShEV09SRClBYm91dERsZ1Byb2M7Ci0gICAgICAgIFdpbjE2UHJvYz0oRFdPUkQpR2V0V25kUHJvY0VudHJ5MTYoIkFib3V0RGxnUHJvYyIpOwotICAgICAgICBXaW4zMlByb2M9KERXT1JEKVJFTEFZMzJfR2V0RW50cnlQb2ludChSRUxBWTMyX0dldEJ1aWx0aW5ETEwoIldJTlBST0NTMzIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFib3V0RGxnUHJvYyIsMCk7Ci0gICAgICAgIEFMSUFTX1JlZ2lzdGVyQWxpYXMoV2luZVByb2MsV2luMTZQcm9jLFdpbjMyUHJvYyk7Ci0gICAgICAgIGluaXRpYWxpemVkPTE7Ci0gICAgfQotCiAgICAgaGFuZGxlID0gU1lTUkVTX0xvYWRSZXNvdXJjZSggU1lTUkVTX0RJQUxPR19TSEVMTF9BQk9VVF9NU0dCT1ggKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIEZBTFNFOwogICAgIGJSZXQgPSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtKCBXSU5fR2V0V2luZG93SW5zdGFuY2UoIGhXbmQgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBoV25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiQWJvdXREbGdQcm9jIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoIkFib3V0RGxnUHJvYyIpLCAKIAkJCQkgICAoTE9ORyloSWNvbiApOwogICAgIFNZU1JFU19GcmVlUmVzb3VyY2UoIGhhbmRsZSApOwogICAgIHJldHVybiBiUmV0OwpkaWZmIC0tZ2l0IGEvbWlzYy94bWFsbG9jLmMgYi9taXNjL3htYWxsb2MuYwppbmRleCAwNzY1ZWRmLi5hMjI4ZjcxIDEwMDY0NAotLS0gYS9taXNjL3htYWxsb2MuYworKysgYi9taXNjL3htYWxsb2MuYwpAQCAtMzUsNyArMzUsNyBAQAogdm9pZCAqeHJlYWxsb2MoIHZvaWQgKnB0ciwgaW50IHNpemUgKQogewogICAgIHZvaWQgKnJlcyA9IHJlYWxsb2MgKHB0ciwgc2l6ZSk7Ci0gICAgaWYgKHJlcyA9PSBOVUxMKQorICAgIGlmICgocmVzID09IE5VTEwpICYmIHNpemUpCiAgICAgewogICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJWaXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQuXG4iKTsKICAgICAgICAgZXhpdCAoMSk7CmRpZmYgLS1naXQgYS9taXNjZW11L2Rvc21lbS5jIGIvbWlzY2VtdS9kb3NtZW0uYwppbmRleCA5MmIwY2RjLi5kM2Q1ZmE5IDEwMDY0NAotLS0gYS9taXNjZW11L2Rvc21lbS5jCisrKyBiL21pc2NlbXUvZG9zbWVtLmMKQEAgLTEzMiwxOCArMTMyLDEzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRE9TTUVNX0FsYXJtCisgKiAgICAgICAgICAgRE9TTUVNX1RpY2sKICAqCi0gKiBJbmNyZW1lbnQgdGhlIEJJT1MgdGljayBjb3VudGVyLgorICogSW5jcmVtZW50IHRoZSBCSU9TIHRpY2sgY291bnRlci4gQ2FsbGVkIGJ5IHRpbWVyIHNpZ25hbCBoYW5kbGVyLgogICovCi12b2lkIERPU01FTV9BbGFybSh2b2lkKQordm9pZCBET1NNRU1fVGljayh2b2lkKQogewotICAgIHBCaW9zRGF0YS0+VGlja3MgPSBJTlQxQV9HZXRUaWNrc1NpbmNlTWlkbmlnaHQoKTsKLSAgICBwcmludGYoICJUaWNrcyA9ICVsZFxuIiwgcEJpb3NEYXRhLT5UaWNrcyApOwotLyoKLSAgICBzaWduYWwoIFNJR0FMUk0sIERPU01FTV9BbGFybSApOwotICAgIGFsYXJtKCAxICk7Ci0qLworICAgIHBCaW9zRGF0YS0+VGlja3MrKzsKIH0KIAogCkBAIC0xNTQsNiArMTQ5LDggQEAKICAqLwogdm9pZCBET1NNRU1fRmlsbEJpb3NTZWdtZW50KHZvaWQpCiB7CisgICAgZXh0ZXJuIHZvaWQgU0lHTkFMX1N0YXJ0QklPU1RpbWVyKHZvaWQpOworCiAgICAgcEJpb3NEYXRhID0gKEJJT1NEQVRBICopR2xvYmFsTG9jayggRE9TTUVNX0Jpb3NTZWcgKTsKIAogICAgICAgLyogQ2xlYXIgYWxsIHVudXNlZCB2YWx1ZXMgKi8KQEAgLTE3OSw4ICsxNzYsNiBAQAogICAgIHBCaW9zRGF0YS0+S2JkQnVmZmVyU3RhcnQgICAgICAgPSAweDFlOwogICAgIHBCaW9zRGF0YS0+S2JkQnVmZmVyRW5kICAgICAgICAgPSAweDNlOwogCi0vKgotICAgIHNpZ25hbCggU0lHQUxSTSwgRE9TTUVNX0FsYXJtICk7Ci0gICAgYWxhcm0oIDEgKTsKLSovCisgICAgU0lHTkFMX1N0YXJ0QklPU1RpbWVyKCk7CiB9CisKZGlmZiAtLWdpdCBhL21pc2NlbXUvaW5zdHIuYyBiL21pc2NlbXUvaW5zdHIuYwppbmRleCAxZTU0OTUxLi4xNGFjNDYxIDEwMDY0NAotLS0gYS9taXNjZW11L2luc3RyLmMKKysrIGIvbWlzY2VtdS9pbnN0ci5jCkBAIC0zMCw3ICszMCw2IEBACiAgICAgewogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJEaXJlY3QgYWNjZXNzIHRvIHNlZ21lbnQgMHg0MCAoY3M6aXA9JTA0eDolMDRseCkuXG4iLAogICAgICAgICAgICAgICAgICBDU19yZWcoY29udGV4dCksIEVJUF9yZWcoY29udGV4dCkgKTsKLSAgICAgICAgRE9TTUVNX0FsYXJtKCk7ICAvKiBJbmNyZW1lbnQgQklPUyBjbG9jayAqLwogICAgICAgICByZXR1cm4gRE9TTUVNX0Jpb3NTZWc7CiAgICAgfQogICAgIHJldHVybiAwOyAgLyogQ2FuJ3QgcmVwbGFjZSBzZWxlY3RvciAqLwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS90aW1lLmMgYi9tdWx0aW1lZGlhL3RpbWUuYwppbmRleCBjOWU3ZjIyLi5mMGUyMWZlIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL3RpbWUuYworKysgYi9tdWx0aW1lZGlhL3RpbWUuYwpAQCAtMTMsMTEgKzEzLDkgQEAKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJkcml2ZXIuaCIKICNpbmNsdWRlICJtbXN5c3RlbS5oIgotI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtMTAzLDcgKzEwMSw3IEBACiAJbW1TeXNUaW1lU01QVEUudS5zbXB0ZS5mcmFtZSA9IDA7CiAJbW1TeXNUaW1lU01QVEUudS5zbXB0ZS5mcHMgPSAwOwogCW1tU3lzVGltZVNNUFRFLnUuc21wdGUuZHVtbXkgPSAwOwotCVNldFRpbWVyKDAsIDEsIDMzLCBHZXRXbmRQcm9jRW50cnkxNigiTU1TeXNUaW1lQ2FsbGJhY2siKSk7CisJU2V0VGltZXIoMCwgMSwgMzMsIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiTU1TeXNUaW1lQ2FsbGJhY2siKSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL29lbWJpdG1hcC5jIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwppbmRleCA2MzIwNGNmLi4zNmJiZTIwIDEwMDY0NAotLS0gYS9vYmplY3RzL29lbWJpdG1hcC5jCisrKyBiL29iamVjdHMvb2VtYml0bWFwLmMKQEAgLTk0LDggKzk0LDEzIEBACiAgICAgeyBvYm1fZG5hcnJvd2QsIFRSVUUgfSwgICAgIC8qIE9CTV9ETkFSUk9XRCAqLwogICAgIHsgb2JtX3VwYXJyb3dkLCBUUlVFIH0sICAgICAvKiBPQk1fVVBBUlJPV0QgKi8KICAgICB7IG9ibV9yZXN0b3JlZCwgVFJVRSB9LCAgICAgLyogT0JNX1JFU1RPUkVEICovCisjaWZkZWYgV0lOXzk1X0xPT0sKKyAgICB7IG9ibV96b29tZF85NSwgVFJVRSB9LCAgICAgLyogT0JNX1pPT01EICovCisgICAgeyBvYm1fcmVkdWNlZF85NSwgVFJVRSB9LCAgIC8qIE9CTV9SRURVQ0VEICovCisjZWxzZQogICAgIHsgb2JtX3pvb21kLCBUUlVFIH0sICAgICAgICAvKiBPQk1fWk9PTUQgKi8KICAgICB7IG9ibV9yZWR1Y2VkLCBUUlVFIH0sICAgICAgLyogT0JNX1JFRFVDRUQgKi8KKyNlbmRpZgogICAgIHsgb2JtX3Jlc3RvcmUsIFRSVUUgfSwgICAgICAvKiBPQk1fUkVTVE9SRSAqLwogI2lmZGVmIFdJTl85NV9MT09LCiAgICAgeyBvYm1fem9vbV85NSwgVFJVRSB9LCAgICAgIC8qIE9CTV9aT09NICovCmRpZmYgLS1naXQgYS9vYmplY3RzL3RleHQuYyBiL29iamVjdHMvdGV4dC5jCmluZGV4IDI5MjlhMDEuLjZhZDVkNGUgMTAwNjQ0Ci0tLSBhL29iamVjdHMvdGV4dC5jCisrKyBiL29iamVjdHMvdGV4dC5jCkBAIC01MjIsMTAgKzUyMiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgZkRpc3BsYXlUZXh0KQogewogICAgIFdPUkQgZGVmV2lkdGg7Ci0gICAgRFdPUkQgZXh0ZW50OwotICAgIGludCBpLCB0YWJQb3MgPSAwOworICAgIERXT1JEIGV4dGVudCA9IDA7CisgICAgaW50IGksIHRhYlBvcyA9IHg7CisgICAgaW50IHN0YXJ0ID0geDsKIAotICAgIGlmIChjVGFiU3RvcHMgPT0gMSkgZGVmV2lkdGggPSAqbHBUYWJQb3M7CisgICAgaWYgKGNUYWJTdG9wcyA9PSAxKQorICAgIHsKKyAgICAgICAgZGVmV2lkdGggPSAqbHBUYWJQb3M7CisgICAgICAgIGNUYWJTdG9wcyA9IDA7CisgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgIFRFWFRNRVRSSUMgdG07CkBAIC01MzgsMTcgKzU0MywxNyBAQAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKICAgICAgICAgICAgIGlmIChscHN0cltpXSA9PSAnXHQnKSBicmVhazsKICAgICAgICAgZXh0ZW50ID0gR2V0VGV4dEV4dGVudCggaGRjLCBscHN0ciwgaSApOwotICAgICAgICB3aGlsZSAoKGNUYWJTdG9wcyA+IDApICYmIChuVGFiT3JnICsgKmxwVGFiUG9zIDwgeCArIExPV09SRChleHRlbnQpKSkKKyAgICAgICAgd2hpbGUgKChjVGFiU3RvcHMgPiAwKSAmJiAoblRhYk9yZyArICpscFRhYlBvcyA8PSB4ICsgTE9XT1JEKGV4dGVudCkpKQogICAgICAgICB7CiAgICAgICAgICAgICBscFRhYlBvcysrOwogICAgICAgICAgICAgY1RhYlN0b3BzLS07CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGxwc3RyW2ldICE9ICdcdCcpCisgICAgICAgIGlmIChpID09IGNvdW50KQogICAgICAgICAgICAgdGFiUG9zID0geCArIExPV09SRChleHRlbnQpOwogICAgICAgICBlbHNlIGlmIChjVGFiU3RvcHMgPiAwKQogICAgICAgICAgICAgdGFiUG9zID0gblRhYk9yZyArICpscFRhYlBvczsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgdGFiUG9zID0gKHggKyBMT1dPUkQoZXh0ZW50KSArIGRlZldpZHRoIC0gMSkgLyBkZWZXaWR0aCAqIGRlZldpZHRoOworICAgICAgICAgICAgdGFiUG9zID0gblRhYk9yZyArICgoeCArIExPV09SRChleHRlbnQpIC0gblRhYk9yZykgLyBkZWZXaWR0aCArIDEpICogZGVmV2lkdGg7CiAgICAgICAgIGlmIChmRGlzcGxheVRleHQpCiAgICAgICAgIHsKICAgICAgICAgICAgIFJFQ1QgcjsKQEAgLTU2MSw3ICs1NjYsNyBAQAogICAgICAgICBjb3VudCAtPSBpKzE7CiAgICAgICAgIGxwc3RyICs9IGkrMTsKICAgICB9Ci0gICAgcmV0dXJuIHRhYlBvczsKKyAgICByZXR1cm4gTUFLRUxPTkcodGFiUG9zIC0gc3RhcnQsIEhJV09SRChleHRlbnQpKTsKIH0KIAogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL0NoYW5nZUxvZyBiL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCmluZGV4IGM1YTIzNDkuLjc2ODhmZTkgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKK1N1biBNYXIgMjQgMTI6Mjg6MjIgMTk5NiAgVWxyaWNoIFNjaG1pZCAgPHVzY2htaWRAbWFpbC5oaC5wcm92aS5kZT4KKworCSogW1N0cmluZ3NfRW4uY10gW1N0cmluZ3NfRGUuY10gKGRlbGV0ZWQpCisJVXNlIHJlc291cmNlcyBmb3Igc3RyaW5ndGFibGVzLgorCisJKiBbWHgucmNdCisJQWRkZWQgYFdTX1RBQlNUT1AnCisKK1dlZCBNYXIgMjAgMTM6MTQ6NTggMTk5NiAgVWxyaWNoIFNjaG1pZCAgPHVzY2htaWRAbWFpbC5oaC5wcm92aS5kZT4KKworCSogW3dpbmV4ZWMuY10gKGRlbGV0ZWQpCisJTW92ZWQgY29kZSB0byBsb2FkZXIvbW9kdWxlcy5jCisKIEZyaSBNYXIgMTUgMjA6NTY6MzEgMTk5NiAgVWxyaWNoIFNjaG1pZCAgPHVzY2htaWRAbWFpbC5oaC5wcm92aS5kZT4KIAogCSogW21haW4uY10KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3Byb2dtYW4vRGUucmMgYi9wcm9ncmFtcy9wcm9nbWFuL0RlLnJjCmluZGV4IDkyODQ1MTcuLjU0MjBmOTAgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vRGUucmMKKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9EZS5yYwpAQCAtNCw5ICs0LDExIEBACiAgKiBDb3B5cmlnaHQgMTk5NiBVbHJpY2ggU2NobWlkCiAgKi8KIAotLyogTWVudSAqLworI2RlZmluZSBMQU5HVUFHRV9JRCAgICAgICAgICAgICAgICAgIERlCisjZGVmaW5lIExBTkdVQUdFX05VTUJFUiAgICAgICAgICAgICAgMgorI2RlZmluZSBMQU5HVUFHRV9NRU5VX0lURU0gICAgICAgICAgICImRGV1dHNjaCIKIAotI2RlZmluZSBNRU5VX1h4ICAgICAgICAgICAgICAgICAgICAgIE1FTlVfRGUKKy8qIE1lbnUgKi8KIAogI2RlZmluZSBNRU5VX0ZJTEUgICAgICAgICAgICAgICAgICAgICImRGF0ZWkiCiAjZGVmaW5lIE1FTlVfRklMRV9ORVcgICAgICAgICAgICAgICAgIiZOZXUuLi4iCkBAIC00OCwzMCArNTAsMjUgQEAKICNkZWZpbmUgRElBTE9HX0JST1dTRSAgICAgICAgICAgICAgICAiJkR1cmNoc3VjaGVuLi4uIgogI2RlZmluZSBESUFMT0dfSEVMUCAgICAgICAgICAgICAgICAgICImSGlsZmUiCiAKLSNkZWZpbmUgRElBTE9HX05FV19YeCAgICAgICAgICAgICAgICBESUFMT0dfTkVXX0RlCiAjZGVmaW5lIERJQUxPR19ORVdfQ0FQVElPTiAgICAgICAgICAgIk5ldWVzIFByb2dyYW1tb2JqZWN0IgogI2RlZmluZSBESUFMT0dfTkVXX05FVyAgICAgICAgICAgICAgICJOZXUiCiAjZGVmaW5lIERJQUxPR19ORVdfR1JPVVAgICAgICAgICAgICAgIlByb2dyYW1tZ3J1cHAmZSIKICNkZWZpbmUgRElBTE9HX05FV19QUk9HUkFNICAgICAgICAgICAiJlByb2dyYW1tIgogCi0jZGVmaW5lIERJQUxPR19NT1ZFX1h4ICAgICAgICAgICAgICAgRElBTE9HX01PVkVfRGUKICNkZWZpbmUgRElBTE9HX01PVkVfQ0FQVElPTiAgICAgICAgICAiUHJvZ3JhbW0gdmVyc2NoaWViZW4iCiAjZGVmaW5lIERJQUxPR19NT1ZFX1BST0dSQU0gICAgICAgICAgIlZlcnNjaGllYmUgUHJvZ3JhbW06IgogI2RlZmluZSBESUFMT0dfTU9WRV9GUk9NX0dST1VQICAgICAgICJWb24gUHJvZ3JhbW1ncnVwcGU6IgogI2RlZmluZSBESUFMT0dfTU9WRV9UT19HUk9VUCAgICAgICAgICImSW4gR3J1cHBlOiIKIAotI2RlZmluZSBESUFMT0dfQ09QWV9YeCAgICAgICAgICAgICAgIERJQUxPR19DT1BZX0RlCiAjZGVmaW5lIERJQUxPR19DT1BZX0NBUFRJT04gICAgICAgICAgIlByb2dyYW1tIGtvcGllcmVuIgogI2RlZmluZSBESUFMT0dfQ09QWV9QUk9HUkFNICAgICAgICAgICJLb3BpZXJlIFByb2dyYW1tOiIKICNkZWZpbmUgRElBTE9HX0NPUFlfRlJPTV9HUk9VUCAgICAgICBESUFMT0dfTU9WRV9GUk9NX0dST1VQCiAjZGVmaW5lIERJQUxPR19DT1BZX1RPX0dST1VQICAgICAgICAgRElBTE9HX01PVkVfVE9fR1JPVVAKIAotI2RlZmluZSBESUFMT0dfR1JPVVBfWHggICAgICAgICAgICAgIERJQUxPR19HUk9VUF9EZQogI2RlZmluZSBESUFMT0dfR1JPVVBfQ0FQVElPTiAgICAgICAgICJQcm9ncmFtbWdydXBwZW5laWdlbnNjaGFmdGVuIgogI2RlZmluZSBESUFMT0dfR1JPVVBfREVTQ1JJUFRJT04gICAgICImQmVzY2hyZWlidW5nOiIKICNkZWZpbmUgRElBTE9HX0dST1VQX0ZJTEUgICAgICAgICAgICAiJkdydXBwZW5kYXRlaToiCiAKLSNkZWZpbmUgRElBTE9HX1BST0dSQU1fWHggICAgICAgICAgICBESUFMT0dfUFJPR1JBTV9EZQogI2RlZmluZSBESUFMT0dfUFJPR1JBTV9DQVBUSU9OICAgICAgICJQcm9ncmFtbWVpZ2Vuc2NoYWZ0ZW4iCiAjZGVmaW5lIERJQUxPR19QUk9HUkFNX0RFU0NSSVBUSU9OICAgRElBTE9HX0dST1VQX0RFU0NSSVBUSU9OCiAjZGVmaW5lIERJQUxPR19QUk9HUkFNX0NPTU1BTkRfTElORSAgIkJlZmVobHMmemVpbGU6IgpAQCAtODAsMTQgKzc3LDQ1IEBACiAjZGVmaW5lIERJQUxPR19QUk9HUkFNX1NZTUJPTCAgICAgICAgIkFscyBTeSZtYm9sIgogI2RlZmluZSBESUFMT0dfUFJPR1JBTV9PVEhFUl9TWU1CT0wgICJBbmRlcmVzICZTeW1ib2wuLi4iCiAKLSNkZWZpbmUgRElBTE9HX1NZTUJPTF9YeCAgICAgICAgICAgICBESUFMT0dfU1lNQk9MX0RlCiAjZGVmaW5lIERJQUxPR19TWU1CT0xfQ0FQVElPTiAgICAgICAgIlN5bWJvbCBhdXN35GhsZW4iCiAjZGVmaW5lIERJQUxPR19TWU1CT0xfRklMRSAgICAgICAgICAgIkRhdGVpJm5hbWU6IgogI2RlZmluZSBESUFMT0dfU1lNQk9MX0NVUlJFTlQgICAgICAgICImQWt0dWVsbGVzIFN5bWJvbDoiCiAKLSNkZWZpbmUgRElBTE9HX0VYRUNVVEVfWHggICAgICAgICAgICBESUFMT0dfRVhFQ1VURV9EZQogI2RlZmluZSBESUFMT0dfRVhFQ1VURV9DQVBUSU9OICAgICAgICJQcm9ncmFtbSBBdXNm/GhyZW4iCiAjZGVmaW5lIERJQUxPR19FWEVDVVRFX0NPTU1BTkRfTElORSAgRElBTE9HX1BST0dSQU1fQ09NTUFORF9MSU5FCiAjZGVmaW5lIERJQUxPR19FWEVDVVRFX1NZTUJPTCAgICAgICAgRElBTE9HX1BST0dSQU1fU1lNQk9MCiAKKy8qIFN0cmluZ3MgKi8KKworI2RlZmluZSBTVFJJTkdfUFJPR1JBTV9NQU5BR0VSICAgICAgICAgICAgIlByb2dyYW1tLU1hbmFnZXIiCisjZGVmaW5lIFNUUklOR19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAiRkVITEVSIgorI2RlZmluZSBTVFJJTkdfV0FSTklORyAgICAgICAgICAgICAgICAgICAgIkFDSFRVTkciCisjZGVmaW5lIFNUUklOR19JTkZPICAgICAgICAgICAgICAgICAgICAgICAiSW5mb3JtYXRpb24iCisjZGVmaW5lIFNUUklOR19ERUxFVEUgICAgICAgICAgICAgICAgICAgICAiTPZzY2hlbiIKKyNkZWZpbmUgU1RSSU5HX0RFTEVURV9HUk9VUF9zICAgICAgICAgICAgICJM9nNjaGUgUHJvZ3JhbW1ncnVwcGUgYCVzJyA/IgorI2RlZmluZSBTVFJJTkdfREVMRVRFX1BST0dSQU1fcyAgICAgICAgICAgIkz2c2NoZSBQcm9ncmFtbSBgJXMnID8iCisjZGVmaW5lIFNUUklOR19OT1RfSU1QTEVNRU5URUQgICAgICAgICAgICAiTmljaHQgaW1wbGVtZW50aWVydCIKKyNkZWZpbmUgU1RSSU5HX0ZJTEVfUkVBRF9FUlJPUl9zICAgICAgICAgICJGZWhsZXIgYmVpbSBMZXNlbiB2b24gYCVzJyIKKyNkZWZpbmUgU1RSSU5HX0ZJTEVfV1JJVEVfRVJST1JfcyAgICAgICAgICJGZWhsZXIgYmVpbSBTY2hyZWliZW4gdm9uIGAlcyciCisKKyNkZWZpbmUgU1RSSU5HX0dSUEZJTEVfUkVBRF9FUlJPUl9zICAgICAgICJcCitEaWUgUHJvZ3JhbW1ncnVwcGVuZGF0ZWkgYCVzJyBrYW5uIG5pY2h0IGdl9mZmbmV0IHdlcmRlbi5cblwKK1NvbGwgd2VpdGVyaGluIHZlcnN1Y2h0IHdlcmRlbiwgZGllc2UgRGF0ZWkgenUgbGFkZW4/IgorCisjZGVmaW5lIFNUUklOR19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAiWnUgd2VuaWcgSGF1cHRzcGVpY2hlciIKKyNkZWZpbmUgU1RSSU5HX1dJTkhFTFBfRVJST1IgICAgICAgICAgICAgICJLZWluZSBIaWxmZSB2ZXJm/GdiYXIiCisjZGVmaW5lIFNUUklOR19VTktOT1dOX0ZFQVRVUkVfcyAgICAgICAgICAiVW5iZWthbm50ZSBFaWdlbnNjaGFmdCBpbiAlcyIKKyNkZWZpbmUgU1RSSU5HX0ZJTEVfTk9UX09WRVJXUklUVEVOX3MgICAgICJEYXRlaSBgJXMnIGV4aXN0aWVydC4gU2llIHdpcmQgbmljaHQg/GJlcnNjaHJpZWJlbi4iCisjZGVmaW5lIFNUUklOR19TQVZFX0dST1VQX0FTX3MgICAgICAgICAgICAiXAorRGllIFByb2dyYW1tZ3J1cHBlIHdpcmQgYWxzIGAlcycgZ2VzaWNoZXJ0IHVtIFwKK2RhcyDcYmVyc2NocmVpYmVuIGRlciBPcmlnaW5hbGRhdGVpIHp1IHZlcmhpbmRlcm4uIgorCisjZGVmaW5lIFNUUklOR19OT19IT1RfS0VZICAgICAgICAgICAgICAgICAiS2VpbmUiCisKKyNkZWZpbmUgU1RSSU5HX0FMTF9GSUxFUyAgICAgICAgICAgICAgICAgICJBbGxlIERhdGVpZW4gKCouKikiCisjZGVmaW5lIFNUUklOR19QUk9HUkFNUyAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbW1lIgorI2RlZmluZSBTVFJJTkdfTElCUkFSSUVTX0RMTCAgICAgICAgICAgICAgIkJpYmxpb3RoZWtlbiAoKi5kbGwpIgorI2RlZmluZSBTVFJJTkdfU1lNQk9MX0ZJTEVTICAgICAgICAgICAgICAgIlN5bWJvbGRhdGFlaWVuIgorI2RlZmluZSBTVFJJTkdfU1lNQk9MU19JQ08gICAgICAgICAgICAgICAgIlN5bWJvbGUgKCouaWNvKSIKKwogI2luY2x1ZGUgIlh4LnJjIgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9Fbi5yYyBiL3Byb2dyYW1zL3Byb2dtYW4vRW4ucmMKaW5kZXggOTdmYjE0Yi4uYzhmZTc5MiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcHJvZ21hbi9Fbi5yYworKysgYi9wcm9ncmFtcy9wcm9nbWFuL0VuLnJjCkBAIC00LDkgKzQsMTEgQEAKICAqIENvcHlyaWdodCAxOTk2IFVscmljaCBTY2htaWQKICAqLwogCi0vKiBNZW51ICovCisjZGVmaW5lIExBTkdVQUdFX0lEICAgICAgICAgICAgICAgICAgRW4KKyNkZWZpbmUgTEFOR1VBR0VfTlVNQkVSICAgICAgICAgICAgICAwCisjZGVmaW5lIExBTkdVQUdFX01FTlVfSVRFTSAgICAgICAgICAgIiZFbmdsaXNoIgogCi0jZGVmaW5lIE1FTlVfWHggICAgICAgICAgICAgICAgICAgICAgTUVOVV9FbgorLyogTWVudSAqLwogCiAjZGVmaW5lIE1FTlVfRklMRSAgICAgICAgICAgICAgICAgICAgIiZGaWxlIgogI2RlZmluZSBNRU5VX0ZJTEVfTkVXICAgICAgICAgICAgICAgICImTmV3Li4uIgpAQCAtNDgsMzAgKzUwLDI1IEBACiAjZGVmaW5lIERJQUxPR19CUk9XU0UgICAgICAgICAgICAgICAgIiZCcm93c2UiCiAjZGVmaW5lIERJQUxPR19IRUxQICAgICAgICAgICAgICAgICAgIiZIZWxwIgogCi0jZGVmaW5lIERJQUxPR19ORVdfWHggICAgICAgICAgICAgICAgRElBTE9HX05FV19FbgogI2RlZmluZSBESUFMT0dfTkVXX0NBUFRJT04gICAgICAgICAgICJOZXcgUHJvZ3JhbSBPYmplY3QiCiAjZGVmaW5lIERJQUxPR19ORVdfTkVXICAgICAgICAgICAgICAgIk5ldyIKICNkZWZpbmUgRElBTE9HX05FV19HUk9VUCAgICAgICAgICAgICAiUHJvZ3JhbSAmZ3JvdXAiCiAjZGVmaW5lIERJQUxPR19ORVdfUFJPR1JBTSAgICAgICAgICAgIiZQcm9ncmFtIgogCi0jZGVmaW5lIERJQUxPR19NT1ZFX1h4ICAgICAgICAgICAgICAgRElBTE9HX01PVkVfRW4KICNkZWZpbmUgRElBTE9HX01PVkVfQ0FQVElPTiAgICAgICAgICAiTW92ZSBQcm9ncmFtIgogI2RlZmluZSBESUFMT0dfTU9WRV9QUk9HUkFNICAgICAgICAgICJNb3ZlIHByb2dyYW06IgogI2RlZmluZSBESUFMT0dfTU9WRV9GUk9NX0dST1VQICAgICAgICJGcm9tIGdyb3VwOiIKICNkZWZpbmUgRElBTE9HX01PVkVfVE9fR1JPVVAgICAgICAgICAiJlRvIGdyb3VwOiIKIAotI2RlZmluZSBESUFMT0dfQ09QWV9YeCAgICAgICAgICAgICAgIERJQUxPR19DT1BZX0VuCiAjZGVmaW5lIERJQUxPR19DT1BZX0NBUFRJT04gICAgICAgICAgIkNvcHkgUHJvZ3JhbSIKICNkZWZpbmUgRElBTE9HX0NPUFlfUFJPR1JBTSAgICAgICAgICAiQ29weSBwcm9ncmFtOiIKICNkZWZpbmUgRElBTE9HX0NPUFlfRlJPTV9HUk9VUCAgICAgICBESUFMT0dfTU9WRV9GUk9NX0dST1VQCiAjZGVmaW5lIERJQUxPR19DT1BZX1RPX0dST1VQICAgICAgICAgRElBTE9HX01PVkVfVE9fR1JPVVAKIAotI2RlZmluZSBESUFMT0dfR1JPVVBfWHggICAgICAgICAgICAgIERJQUxPR19HUk9VUF9FbgogI2RlZmluZSBESUFMT0dfR1JPVVBfQ0FQVElPTiAgICAgICAgICJQcm9ncmFtIEdyb3VwIEF0dHJpYnV0ZXMiCiAjZGVmaW5lIERJQUxPR19HUk9VUF9ERVNDUklQVElPTiAgICAgIiZEZXNjcmlwdGlvbjoiCiAjZGVmaW5lIERJQUxPR19HUk9VUF9GSUxFICAgICAgICAgICAgIiZHcm91cCBmaWxlOiIKIAotI2RlZmluZSBESUFMT0dfUFJPR1JBTV9YeCAgICAgICAgICAgIERJQUxPR19QUk9HUkFNX0VuCiAjZGVmaW5lIERJQUxPR19QUk9HUkFNX0NBUFRJT04gICAgICAgIlByb2dyYW0gQXR0cmlidXRlcyIKICNkZWZpbmUgRElBTE9HX1BST0dSQU1fREVTQ1JJUFRJT04gICBESUFMT0dfR1JPVVBfREVTQ1JJUFRJT04KICNkZWZpbmUgRElBTE9HX1BST0dSQU1fQ09NTUFORF9MSU5FICAiJkNvbW1hbmQgbGluZToiCkBAIC04MCwxNCArNzcsNDMgQEAKICNkZWZpbmUgRElBTE9HX1BST0dSQU1fU1lNQk9MICAgICAgICAiQXMgJlN5bWJvbCIKICNkZWZpbmUgRElBTE9HX1BST0dSQU1fT1RIRVJfU1lNQk9MICAiJk90aGVyIFN5bWJvbC4uLiIKIAotI2RlZmluZSBESUFMT0dfU1lNQk9MX1h4ICAgICAgICAgICAgIERJQUxPR19TWU1CT0xfRW4KICNkZWZpbmUgRElBTE9HX1NZTUJPTF9DQVBUSU9OICAgICAgICAiU2VsZWN0IFN5bWJvbCIKICNkZWZpbmUgRElBTE9HX1NZTUJPTF9GSUxFICAgICAgICAgICAiJkZpbGVuYW1lOiIKICNkZWZpbmUgRElBTE9HX1NZTUJPTF9DVVJSRU5UICAgICAgICAiJkN1cnJlbnQgU3ltYm9sOiIKIAotI2RlZmluZSBESUFMT0dfRVhFQ1VURV9YeCAgICAgICAgICAgIERJQUxPR19FWEVDVVRFX0VuCiAjZGVmaW5lIERJQUxPR19FWEVDVVRFX0NBUFRJT04gICAgICAgIkV4ZWN1dGUgUHJvZ3JhbSIKICNkZWZpbmUgRElBTE9HX0VYRUNVVEVfQ09NTUFORF9MSU5FICBESUFMT0dfUFJPR1JBTV9DT01NQU5EX0xJTkUKICNkZWZpbmUgRElBTE9HX0VYRUNVVEVfU1lNQk9MICAgICAgICBESUFMT0dfUFJPR1JBTV9TWU1CT0wKIAorLyogU3RyaW5ncyAqLworCisjZGVmaW5lIFNUUklOR19QUk9HUkFNX01BTkFHRVIgICAgICAgICAgICAiUHJvZ3JhbSBNYW5hZ2VyIgorI2RlZmluZSBTVFJJTkdfRVJST1IgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SIgorI2RlZmluZSBTVFJJTkdfV0FSTklORyAgICAgICAgICAgICAgICAgICAgIldBUk5JTkciCisjZGVmaW5lIFNUUklOR19JTkZPICAgICAgICAgICAgICAgICAgICAgICAiSW5mb3JtYXRpb24iCisjZGVmaW5lIFNUUklOR19ERUxFVEUgICAgICAgICAgICAgICAgICAgICAiRGVsZXRlIgorI2RlZmluZSBTVFJJTkdfREVMRVRFX0dST1VQX3MgICAgICAgICAgICAgIkRlbGV0ZSBncm91cCBgJXMnID8iCisjZGVmaW5lIFNUUklOR19ERUxFVEVfUFJPR1JBTV9zICAgICAgICAgICAiRGVsZXRlIHByb2dyYW0gYCVzJyA/IgorI2RlZmluZSBTVFJJTkdfTk9UX0lNUExFTUVOVEVEICAgICAgICAgICAgIk5vdCBpbXBsZW1lbnRlZCIKKyNkZWZpbmUgU1RSSU5HX0ZJTEVfUkVBRF9FUlJPUl9zICAgICAgICAgICJFcnJvciByZWFkaW5nIGAlcyciCisjZGVmaW5lIFNUUklOR19GSUxFX1dSSVRFX0VSUk9SX3MgICAgICAgICAiRXJyb3Igd3JpdGVpbmcgYCVzJyIKKworI2RlZmluZSBTVFJJTkdfR1JQRklMRV9SRUFEX0VSUk9SX3MgICAgICAgIlwKK1RoZSBncm91cCBmaWxlIGAlcycgY2Fubm90IGJlIG9wZW5lZC5cblwKK1Nob3VsZCBpdCBiZSB0cmllZCBmdXJ0aGVyIG9uPyIKKworI2RlZmluZSBTVFJJTkdfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgIk91dCBvZiBtZW1vcnkiCisjZGVmaW5lIFNUUklOR19XSU5IRUxQX0VSUk9SICAgICAgICAgICAgICAiSGVscCBub3QgYXZhaWxhYmxlIgorI2RlZmluZSBTVFJJTkdfVU5LTk9XTl9GRUFUVVJFX3MgICAgICAgICAgIlVua25vd24gZmVhdHVyZSBpbiAlcyIKKyNkZWZpbmUgU1RSSU5HX0ZJTEVfTk9UX09WRVJXUklUVEVOX3MgICAgICJGaWxlIGAlcycgZXhpc3RzLiBOb3Qgb3ZlcndyaXR0ZW4uIgorI2RlZmluZSBTVFJJTkdfU0FWRV9HUk9VUF9BU19zICAgICAgICAgICAgIlNhdmUgZ3JvdXAgYXMgYCVzJyB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIG9yaWdpbmFsIGZpbGVzIgorCisjZGVmaW5lIFNUUklOR19OT19IT1RfS0VZICAgICAgICAgICAgICAgICAiTm9uZSIKKworI2RlZmluZSBTVFJJTkdfQUxMX0ZJTEVTICAgICAgICAgICAgICAgICAgIkFsbCBmaWxlcyAoKi4qKSIKKyNkZWZpbmUgU1RSSU5HX1BST0dSQU1TICAgICAgICAgICAgICAgICAgICJQcm9ncmFtcyIKKyNkZWZpbmUgU1RSSU5HX0xJQlJBUklFU19ETEwgICAgICAgICAgICAgICJMaWJyYXJpZXMgKCouZGxsKSIKKyNkZWZpbmUgU1RSSU5HX1NZTUJPTF9GSUxFUyAgICAgICAgICAgICAgICJTeW1ib2wgZmlsZXMiCisjZGVmaW5lIFNUUklOR19TWU1CT0xTX0lDTyAgICAgICAgICAgICAgICAiU3ltYm9scyAoKi5pY28pIgorCiAjaW5jbHVkZSAiWHgucmMiCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgppbmRleCAyNDFjNTY2Li5lZThhOTAwIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KQEAgLTE4LDggKzE4LDcgQEAKIAlhY2NlbC5vIFwKIAlzdHJpbmcubyBcCiAJJChMQU5HVUFHRVM6JT0lLm8pIFwKLQkkKExJQ0VOU0VMQU5HOiU9TGljZW5zZV8lLm8pIFwKLQkkKExBTkdVQUdFUzolPVN0cmluZ3NfJS5vKSAKKwkkKExJQ0VOU0VMQU5HOiU9TGljZW5zZV8lLm8pCiAKIENfU1JDUyA9ICQoTU9TVE9CSlM6Lm89LmMpICQoU1RSSU5HT0JKUzoubz0uYykKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9SRUFETUUgYi9wcm9ncmFtcy9wcm9nbWFuL1JFQURNRQppbmRleCBiMTQ1YzI4Li44Y2Q0YzM0IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL1JFQURNRQorKysgYi9wcm9ncmFtcy9wcm9nbWFuL1JFQURNRQpAQCAtMTIsNSArMTIsMyBAQAogYHdpbmUuY29uZicgc29tZXRoaW5nIGxpa2U6CiBbcHJvZ21hbl0KIHByb2dtYW4uaW5pPS9teS93aW5lL3BhdGgvcHJvZ21hbi5pbmkKLQotSXQncyBwb3NzaWJsZSB0byBzdGFydCBib3RoIFdpbmRvd3MgYW5kIFVOSVggcHJvZ3JhbXMuCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL1N0cmluZ3NfRGUuYyBiL3Byb2dyYW1zL3Byb2dtYW4vU3RyaW5nc19EZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNkMzY5Li4wMDAwMDAwCi0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vU3RyaW5nc19EZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlICJwcm9nbWFuLmgiCi0KLUxQQ1NUUiBTdHJpbmdUYWJsZURlW05VTUJFUl9PRl9TVFJJTkdTXSA9Ci17Ci0gICJQcm9ncmFtbS1NYW5hZ2VyIiwKLSAgIkZFSExFUiIsCi0gICJJbmZvcm1hdGlvbiIsCi0gICJM9nNjaGVuIiwKLSAgIkz2c2NoZSBQcm9ncmFtbWdydXBwZSBgJXMnID8iLAotICAiTPZzY2hlIFByb2dyYW1tIGAlcycgPyIsCi0gICJOaWNodCBpbXBsZW1lbnRpZXJ0IiwKLSAgIkZlaGxlciBiZWltIExlc2VuIHZvbiBgJXMnIiwKLSAgIkZlaGxlciBiZWltIFNjaHJlaWJlbiB2b24gYCVzJyIsCi0KLSAgIkRpZSBQcm9ncmFtbWdydXBwZW5kYXRlaSBgJXMnIGthbm4gbmljaHQgZ2X2ZmZuZXQgd2VyZGVuLlxuIgotICAiU29sbCB3ZWl0ZXJoaW4gdmVyc3VjaHQgd2VyZGVuLCBkaWVzZSBEYXRlaSB6dSBsYWRlbj8iLAotCi0gICJadSB3ZW5pZyBIYXVwdHNwZWljaGVyIiwKLSAgIktlaW5lIEhpbGZlIHZlcmb8Z2JhciIsCi0gICJVbmJla2FubnRlIEVpZ2Vuc2NoYWZ0IGRlciBgLmdycCcgRGF0ZWkiLAotICAiRGF0ZWkgYCVzJyBleGlzdGllcnQuIFNpZSB3aXJkIG5pY2h0IPxiZXJzY2hyaWViZW4uIiwKLSAgIkRpZSBQcm9ncmFtbWdydXBwZSB3aXJkIGFscyBgJXMnIGdlc2ljaGVydCB1bSBkYXMg3GJlcnNjaHJlaWJlbiBkZXIgT3JpZ2luYWxkYXRlaSB6dSB2ZXJoaW5kZXJuLiIsCi0gICJLZWluZSIsCi0KLSAgIkFsbGUgRGF0ZWllbiAoKi4qKVwwIiAgICIqLipcMCIKLSAgIlByb2dyYW1tZVwwIiAgICAgICAgICAgICIqLmV4ZTsqLnBpZjsqLmNvbTsqLmJhdFwwIiwKLQotICAiQWxsZSBEYXRlaWVuICgqLiopXDAiICAgIiouKlwwIgotICAiQmlibGlvdGhla2VuICgqLmRsbClcMCIgIiouZGxsXDAiCi0gICJQcm9ncmFtbWVcMCIgICAgICAgICAgICAiKi5leGVcMCIKLSAgIlN5bWJvbGRhdGVpZW5cMCIgICAgICAgICIqLmljbzsqLmV4ZTsqLmRsbFwwIgotICAiU3ltYm9sZSAoKi5pY28pXDAiICAgICAgIiouaWNvXDAiCi19OwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9TdHJpbmdzX0VuLmMgYi9wcm9ncmFtcy9wcm9nbWFuL1N0cmluZ3NfRW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzZjE5ZC4uMDAwMDAwMAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL1N0cmluZ3NfRW4uYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSAicHJvZ21hbi5oIgotCi1MUENTVFIgU3RyaW5nVGFibGVFbltOVU1CRVJfT0ZfU1RSSU5HU10gPQotewotICAiUHJvZ3JhbSBNYW5hZ2VyIiwKLSAgIkVSUk9SIiwKLSAgIkluZm9ybWF0aW9uIiwKLSAgIkRlbGV0ZSIsCi0gICJEZWxldGUgZ3JvdXAgYCVzJyA/IiwKLSAgIkRlbGV0ZSBwcm9ncmFtIGAlcycgPyIsCi0gICJOb3QgaW1wbGVtZW50ZWQiLAotICAiRXJyb3IgcmVhZGluZyBgJXMnIiwKLSAgIkVycm9yIHdyaXRlaW5nIGAlcyciLAotCi0gICJUaGUgZ3JvdXAgZmlsZSBgJXMnIGNhbm5vdCBiZSBvcGVuZWQuXG4iCi0gICJTaG91bGQgaXQgYmUgdHJpZWQgZnVydGhlciBvbj8iLAotCi0gICJPdXQgb2YgbWVtb3J5IiwKLSAgIkhlbHAgbm90IGF2YWlsYWJsZSIsCi0gICJVbmtub3duIGZlYXR1cmUgaW4gYC5ncnAnIGZpbGUiLAotICAiRmlsZSBgJXMnIGV4aXN0cy4gTm90IG92ZXJ3cml0dGVuLiIsCi0gICJTYXZlIGdyb3VwIGFzIGAlcycgdG8gcHJldmVudCBvdmVyd3JpdGluZyBvcmlnaW5hbCBmaWxlcyIsCi0gICJOb25lIiwKLQotICAiQWxsIGZpbGVzICgqLiopXDAiICAgIiouKlwwIgotICAiUHJvZ3JhbXNcMCIgICAgICAgICAgIiouZXhlOyoucGlmOyouY29tOyouYmF0XDAiLAotCi0gICJBbGwgZmlsZXMgKCouKilcMCIgICAiKi4qXDAiCi0gICJMaWJyYXJpZXMgKCouZGxsKVwwIiAiKi5kbGxcMCIKLSAgIlByb2dyYW1zXDAiICAgICAgICAgICIqLmV4ZVwwIgotICAiU3ltYm9sIGZpbGVzXDAiICAgICAgIiouaWNvOyouZXhlOyouZGxsXDAiCi0gICJTeW1ib2xzICgqLmljbylcMCIgICAiKi5pY29cMCIKLX07CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL1h4LnJjIGIvcHJvZ3JhbXMvcHJvZ21hbi9YeC5yYwppbmRleCA0NGQ3OTkxLi5lMDhiMDllIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL1h4LnJjCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vWHgucmMKQEAgLTYsOSArNiwxMiBAQAogCiAjaW5jbHVkZSAicHJvZ21hbi5oIgogCisjZGVmaW5lIENPTkNBVChhLCBiKSBDT05DQVQxKGEsIGIpCisjZGVmaW5lIENPTkNBVDEoYSwgYikgYSMjYgorCiAvKiBNZW51ICovCiAKLU1FTlVfWHggTUVOVQorQ09OQ0FUKE1FTlVfLCBMQU5HVUFHRV9JRCkgTUVOVQogewogIFBPUFVQIE1FTlVfRklMRSB7CiAgICBNRU5VSVRFTSBNRU5VX0ZJTEVfTkVXLCAgICAgICAgICAgICAgUE1fTkVXIApAQCAtMzMsOCArMzYsOCBAQAogICAgTUVOVUlURU0gTUVOVV9XSU5ET1dTX0FSUkFOR0UsICAgICAgIFBNX0FSUkFOR0UKICB9CiAgUE9QVVAgTUVOVV9MQU5HVUFHRSB7Ci0gICBNRU5VSVRFTSAiJkVuZ2xpc2giLCAgICAgICAgICAgICAgICAgUE1fRW4KLSAgIE1FTlVJVEVNICImRGV1dHNjaCIsICAgICAgICAgICAgICAgICBQTV9EZQorICAgLyogRHVtbXkgaXRlbSwgd2lsbCBiZSByZW1vdmVkICovCisgICBNRU5VSVRFTSBTRVBBUkFUT1IKICB9CiAgUE9QVVAgTUVOVV9IRUxQIHsKICAgIE1FTlVJVEVNIE1FTlVfSEVMUF9DT05URU5UUywgICAgICAgICBQTV9DT05URU5UUwpAQCAtNTQsNyArNTcsNyBAQAogCiAvKiBEaWFsb2cgYE5ldycgKi8KIAotRElBTE9HX05FV19YeCBESUFMT0cgMCwgMCwgMTcwLCA2NQorQ09OQ0FUKERJQUxPR19ORVdfLCBMQU5HVUFHRV9JRCkgRElBTE9HIDAsIDAsIDE3MCwgNjUKIFNUWUxFIERTX01PREFMRlJBTUUKIENBUFRJT04gRElBTE9HX05FV19DQVBUSU9OCiB7CkBAIC02MiwxNCArNjUsMTQgQEAKIExURVhUICAgICAgICAgRElBTE9HX05FV19HUk9VUCwgICBQTV9ORVdfR1JPVVAsICAgIDIwLCAxOCwgIDgwLCAxNQogUkFESU9CVVRUT04gICAiIiwgICAgICAgICAgICAgICAgIFBNX05FV19QUk9HUkFNLCAgMTAsIDM1LCAgMTAsIDE1CiBMVEVYVCAgICAgICAgIERJQUxPR19ORVdfUFJPR1JBTSwgUE1fTkVXX1BST0dSQU0sICAyMCwgMzgsICA4MCwgMTUKLURFRlBVU0hCVVRUT04gRElBTE9HX09LLCAgICAgICAgICBJRE9LLCAgICAgICAgICAgMTA1LCAgNSwgIDYwLCAxNQotUFVTSEJVVFRPTiAgICBESUFMT0dfQ0FOQ0VMLCAgICAgIElEQ0FOQ0VMLCAgICAgICAxMDUsIDI1LCAgNjAsIDE1Ci1QVVNIQlVUVE9OICAgIERJQUxPR19IRUxQLCAgICAgICAgUE1fSEVMUCwgICAgICAgIDEwNSwgNDUsICA2MCwgMTUKK0RFRlBVU0hCVVRUT04gRElBTE9HX09LLCAgICAgICAgICBJRE9LLCAgICAgICAgICAgMTA1LCAgNSwgIDYwLCAxNSwgV1NfVEFCU1RPUAorUFVTSEJVVFRPTiAgICBESUFMT0dfQ0FOQ0VMLCAgICAgIElEQ0FOQ0VMLCAgICAgICAxMDUsIDI1LCAgNjAsIDE1LCBXU19UQUJTVE9QCitQVVNIQlVUVE9OICAgIERJQUxPR19IRUxQLCAgICAgICAgUE1fSEVMUCwgICAgICAgIDEwNSwgNDUsICA2MCwgMTUsIFdTX1RBQlNUT1AKIH0KIAogLyogRGlhbG9nIGBNb3ZlJyAqLwogCi1ESUFMT0dfTU9WRV9YeCBESUFMT0cgMCwgMCwgMjUwLCA2NQorQ09OQ0FUKERJQUxPR19NT1ZFXywgTEFOR1VBR0VfSUQpIERJQUxPRyAwLCAwLCAyNTAsIDY1CiBTVFlMRSBEU19NT0RBTEZSQU1FCiBDQVBUSU9OIERJQUxPR19NT1ZFX0NBUFRJT04KIHsKQEAgLTc4LDE1ICs4MSwxNSBAQAogTFRFWFQgICAgICAgICBESUFMT0dfTU9WRV9GUk9NX0dST1VQLCBJRElHTk9SRSwgICAgICAgICAgICA1LCAxMywgIDkwLCAxNQogTFRFWFQgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICBQTV9GUk9NX0dST1VQLCAgICAgIDk1LCAxMywgIDkwLCAxNQogTFRFWFQgICAgICAgICBESUFMT0dfTU9WRV9UT19HUk9VUCwgICBQTV9UT19HUk9VUF9UWFQsICAgICA1LCAyOCwgMTQwLCAxNQotQ09NQk9CT1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9UT19HUk9VUCwgICAgICAgICA1LCAzOCwgMTQwLCA1MCwgQ0JTX0RST1BET1dOTElTVAotREVGUFVTSEJVVFRPTiBESUFMT0dfT0ssICAgICAgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgMTg1LCAgNSwgIDYwLCAxNQotUFVTSEJVVFRPTiAgICBESUFMT0dfQ0FOQ0VMLCAgICAgICAgICBJRENBTkNFTCwgICAgICAgICAgMTg1LCAyNSwgIDYwLCAxNQotUFVTSEJVVFRPTiAgICBESUFMT0dfSEVMUCwgICAgICAgICAgICBQTV9IRUxQLCAgICAgICAgICAgMTg1LCA0NSwgIDYwLCAxNQorQ09NQk9CT1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9UT19HUk9VUCwgICAgICAgICA1LCAzOCwgMTQwLCA1MCwgV1NfVEFCU1RPUCB8IENCU19EUk9QRE9XTkxJU1QKK0RFRlBVU0hCVVRUT04gRElBTE9HX09LLCAgICAgICAgICAgICAgSURPSywgICAgICAgICAgICAgIDE4NSwgIDUsICA2MCwgMTUsIFdTX1RBQlNUT1AKK1BVU0hCVVRUT04gICAgRElBTE9HX0NBTkNFTCwgICAgICAgICAgSURDQU5DRUwsICAgICAgICAgIDE4NSwgMjUsICA2MCwgMTUsIFdTX1RBQlNUT1AKK1BVU0hCVVRUT04gICAgRElBTE9HX0hFTFAsICAgICAgICAgICAgUE1fSEVMUCwgICAgICAgICAgIDE4NSwgNDUsICA2MCwgMTUsIFdTX1RBQlNUT1AKIH0KIAogLyogRGlhbG9nIGBDb3B5JyAqLwogCi1ESUFMT0dfQ09QWV9YeCBESUFMT0cgMCwgMCwgMjUwLCA2NQorQ09OQ0FUKERJQUxPR19DT1BZXywgTEFOR1VBR0VfSUQpIERJQUxPRyAwLCAwLCAyNTAsIDY1CiBTVFlMRSBEU19NT0RBTEZSQU1FCiBDQVBUSU9OIERJQUxPR19DT1BZX0NBUFRJT04KIHsKQEAgLTk1LDgwICs5OCwxMjAgQEAKIExURVhUICAgICAgICAgRElBTE9HX0NPUFlfRlJPTV9HUk9VUCwgSURJR05PUkUsICAgICAgICAgICAgNSwgMTMsICA5MCwgMTUKIExURVhUICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgUE1fRlJPTV9HUk9VUCwgICAgICA5NSwgMTMsICA5MCwgMTUKIExURVhUICAgICAgICAgRElBTE9HX0NPUFlfVE9fR1JPVVAsICAgUE1fVE9fR1JPVVBfVFhULCAgICAgNSwgMjgsIDE0MCwgMTUKLUNPTUJPQk9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fVE9fR1JPVVAsICAgICAgICAgNSwgMzgsIDE0MCwgNTAsIENCU19EUk9QRE9XTkxJU1QKLURFRlBVU0hCVVRUT04gRElBTE9HX09LLCAgICAgICAgICAgICAgSURPSywgICAgICAgICAgICAgIDE4NSwgIDUsICA2MCwgMTUKLVBVU0hCVVRUT04gICAgRElBTE9HX0NBTkNFTCwgICAgICAgICAgSURDQU5DRUwsICAgICAgICAgIDE4NSwgMjUsICA2MCwgMTUKLVBVU0hCVVRUT04gICAgRElBTE9HX0hFTFAsICAgICAgICAgICAgUE1fSEVMUCwgICAgICAgICAgIDE4NSwgNDUsICA2MCwgMTUKK0NPTUJPQk9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fVE9fR1JPVVAsICAgICAgICAgNSwgMzgsIDE0MCwgNTAsIFdTX1RBQlNUT1AgfCBDQlNfRFJPUERPV05MSVNUCitERUZQVVNIQlVUVE9OIERJQUxPR19PSywgICAgICAgICAgICAgIElET0ssICAgICAgICAgICAgICAxODUsICA1LCAgNjAsIDE1LCBXU19UQUJTVE9QCitQVVNIQlVUVE9OICAgIERJQUxPR19DQU5DRUwsICAgICAgICAgIElEQ0FOQ0VMLCAgICAgICAgICAxODUsIDI1LCAgNjAsIDE1LCBXU19UQUJTVE9QCitQVVNIQlVUVE9OICAgIERJQUxPR19IRUxQLCAgICAgICAgICAgIFBNX0hFTFAsICAgICAgICAgICAxODUsIDQ1LCAgNjAsIDE1LCBXU19UQUJTVE9QCiB9CiAKIC8qIERpYWxvZyBgR3JvdXAgYXR0cmlidXRlcycgKi8KIAotRElBTE9HX0dST1VQX1h4IERJQUxPRyAwLCAwLCAyMzAsIDY1CitDT05DQVQoRElBTE9HX0dST1VQXywgTEFOR1VBR0VfSUQpIERJQUxPRyAwLCAwLCAyMzAsIDY1CiBTVFlMRSBEU19NT0RBTEZSQU1FCiBDQVBUSU9OIERJQUxPR19HUk9VUF9DQVBUSU9OCiB7CiBMVEVYVCAgICAgRElBTE9HX0dST1VQX0RFU0NSSVBUSU9OLCBQTV9ERVNDUklQVElPTl9UWFQsICAgMDUsIDE4LCAgNTAsIDEwCi1FRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9ERVNDUklQVElPTiwgICAgICAgNjAsIDE4LCAgOTAsIDE1CitFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9ERVNDUklQVElPTiwgICAgICAgNjAsIDE4LCAgOTAsIDE1LCBXU19UQUJTVE9QCiBMVEVYVCAgICAgRElBTE9HX0dST1VQX0ZJTEUsICAgICAgICBQTV9GSUxFX1RYVCwgICAgICAgICAgMDUsIDM4LCAgNTAsIDEwCi1FRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9GSUxFLCAgICAgICAgICAgICAgNjAsIDM4LCAgOTAsIDE1Ci1ERUZQVVNIQlVUVE9OIERJQUxPR19PSywgICAgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgICAxNTUsICA1LCAgNjAsIDE1Ci1QVVNIQlVUVE9OICAgIERJQUxPR19DQU5DRUwsICAgICAgICBJRENBTkNFTCwgICAgICAgICAgICAxNTUsIDI1LCAgNjAsIDE1Ci1QVVNIQlVUVE9OICAgIERJQUxPR19IRUxQLCAgICAgICAgICBQTV9IRUxQLCAgICAgICAgICAgICAxNTUsIDQ1LCAgNjAsIDE1CitFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9GSUxFLCAgICAgICAgICAgICAgNjAsIDM4LCAgOTAsIDE1LCBXU19UQUJTVE9QCitERUZQVVNIQlVUVE9OIERJQUxPR19PSywgICAgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgICAxNTUsICA1LCAgNjAsIDE1LCBXU19UQUJTVE9QCitQVVNIQlVUVE9OICAgIERJQUxPR19DQU5DRUwsICAgICAgICBJRENBTkNFTCwgICAgICAgICAgICAxNTUsIDI1LCAgNjAsIDE1LCBXU19UQUJTVE9QCitQVVNIQlVUVE9OICAgIERJQUxPR19IRUxQLCAgICAgICAgICBQTV9IRUxQLCAgICAgICAgICAgICAxNTUsIDQ1LCAgNjAsIDE1LCBXU19UQUJTVE9QCiB9CiAKIC8qIERpYWxvZyBgUHJvZ3JhbSBhdHRyaWJ1dGVzJyAqLwogCi1ESUFMT0dfUFJPR1JBTV9YeCBESUFMT0cgMCwgMCwgMjUwLCAxMDUKK0NPTkNBVChESUFMT0dfUFJPR1JBTV8sIExBTkdVQUdFX0lEKSBESUFMT0cgMCwgMCwgMjUwLCAxMDUKIFNUWUxFIERTX01PREFMRlJBTUUKIENBUFRJT04gRElBTE9HX1BST0dSQU1fQ0FQVElPTgogewogTFRFWFQgICAgICAgICBESUFMT0dfUFJPR1JBTV9ERVNDUklQVElPTiwgIFBNX0RFU0NSSVBUSU9OX1RYVCwgICAwNSwgMTAsICA2MCwgMTAKLUVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9ERVNDUklQVElPTiwgICAgICAgODAsIDEwLCAgOTAsIDE1CitFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fREVTQ1JJUFRJT04sICAgICAgIDgwLCAxMCwgIDkwLCAxNSwgV1NfVEFCU1RPUAogTFRFWFQgICAgICAgICBESUFMT0dfUFJPR1JBTV9DT01NQU5EX0xJTkUsIFBNX0NPTU1BTkRfTElORV9UWFQsICAwNSwgMjUsICA2MCwgMTAKLUVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9DT01NQU5EX0xJTkUsICAgICAgODAsIDI1LCAgOTAsIDE1CitFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fQ09NTUFORF9MSU5FLCAgICAgIDgwLCAyNSwgIDkwLCAxNSwgV1NfVEFCU1RPUAogTFRFWFQgICAgICAgICBESUFMT0dfUFJPR1JBTV9ESVJFQ1RPUlksICAgIFBNX0RJUkVDVE9SWV9UWFQsICAgICAwNSwgNDAsICA2MCwgMTAKLUVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9ESVJFQ1RPUlksICAgICAgICAgODAsIDQwLCAgOTAsIDE1CitFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fRElSRUNUT1JZLCAgICAgICAgIDgwLCA0MCwgIDkwLCAxNSwgV1NfVEFCU1RPUAogTFRFWFQgICAgICAgICBESUFMT0dfUFJPR1JBTV9IT1RfS0VZLCAgICAgIFBNX0hPVF9LRVlfVFhULCAgICAgICAwNSwgNTUsICA2MCwgMTAKLUVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9IT1RfS0VZLCAgICAgICAgICAgODAsIDU1LCAgOTAsIDE1CitFRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fSE9UX0tFWSwgICAgICAgICAgIDgwLCA1NSwgIDkwLCAxNSwgV1NfVEFCU1RPUAogSUNPTiAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX0lDT04sICAgICAgICAgICAgICAyMCwgNzAKLUNIRUNLQk9YICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICBQTV9TWU1CT0wsICAgICAgICAgICAgODAsIDc1LCAgMTAsIDEwCitDSEVDS0JPWCAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fU1lNQk9MLCAgICAgICAgICAgIDgwLCA3NSwgIDEwLCAxMCwgV1NfVEFCU1RPUAogTFRFWFQgICAgICAgICBESUFMT0dfUFJPR1JBTV9TWU1CT0wsICAgICAgIElESUdOT1JFLCAgICAgICAgICAgICA5NSwgNzUsICA3NSwgMTAKLURFRlBVU0hCVVRUT04gRElBTE9HX09LLCAgICAgICAgICAgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgICAxODUsICA1LCAgNjAsIDE1Ci1QVVNIQlVUVE9OICAgIERJQUxPR19DQU5DRUwsICAgICAgICAgICAgICAgSURDQU5DRUwsICAgICAgICAgICAgMTg1LCAyNSwgIDYwLCAxNQotUFVTSEJVVFRPTiAgICBESUFMT0dfQlJPV1NFLCAgICAgICAgICAgICAgIFBNX0JST1dTRSwgICAgICAgICAgIDE4NSwgNDUsICA2MCwgMTUKLVBVU0hCVVRUT04gICAgRElBTE9HX1BST0dSQU1fT1RIRVJfU1lNQk9MLCBQTV9PVEhFUl9TWU1CT0wsICAgICAxODUsIDY1LCAgNjAsIDE1Ci1QVVNIQlVUVE9OICAgIERJQUxPR19IRUxQLCAgICAgICAgICAgICAgICAgUE1fSEVMUCwgICAgICAgICAgICAgMTg1LCA4NSwgIDYwLCAxNQorREVGUFVTSEJVVFRPTiBESUFMT0dfT0ssICAgICAgICAgICAgICAgICAgIElET0ssICAgICAgICAgICAgICAgIDE4NSwgIDUsICA2MCwgMTUsIFdTX1RBQlNUT1AKK1BVU0hCVVRUT04gICAgRElBTE9HX0NBTkNFTCwgICAgICAgICAgICAgICBJRENBTkNFTCwgICAgICAgICAgICAxODUsIDI1LCAgNjAsIDE1LCBXU19UQUJTVE9QCitQVVNIQlVUVE9OICAgIERJQUxPR19CUk9XU0UsICAgICAgICAgICAgICAgUE1fQlJPV1NFLCAgICAgICAgICAgMTg1LCA0NSwgIDYwLCAxNSwgV1NfVEFCU1RPUAorUFVTSEJVVFRPTiAgICBESUFMT0dfUFJPR1JBTV9PVEhFUl9TWU1CT0wsIFBNX09USEVSX1NZTUJPTCwgICAgIDE4NSwgNjUsICA2MCwgMTUsIFdTX1RBQlNUT1AKK1BVU0hCVVRUT04gICAgRElBTE9HX0hFTFAsICAgICAgICAgICAgICAgICBQTV9IRUxQLCAgICAgICAgICAgICAxODUsIDg1LCAgNjAsIDE1LCBXU19UQUJTVE9QCiB9CiAKIC8qIERpYWxvZyBgU3ltYm9sJyAqLwogCi1ESUFMT0dfU1lNQk9MX1h4IERJQUxPRyAwLCAwLCAyMDAsIDg1CitDT05DQVQoRElBTE9HX1NZTUJPTF8sIExBTkdVQUdFX0lEKSBESUFMT0cgMCwgMCwgMjAwLCA4NQogU1RZTEUgRFNfTU9EQUxGUkFNRQogQ0FQVElPTiBESUFMT0dfU1lNQk9MX0NBUFRJT04KIHsKIExURVhUICAgICBESUFMT0dfU1lNQk9MX0ZJTEUsICAgIFBNX0lDT05fRklMRV9UWFQsICAgIDUsIDE1LCAgNDAsIDEwCi1FRElUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICBQTV9JQ09OX0ZJTEUsICAgICAgIDQ1LCAxNSwgIDg1LCAxNQorRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgUE1fSUNPTl9GSUxFLCAgICAgICA0NSwgMTUsICA4NSwgMTUsIFdTX1RBQlNUT1AKIExURVhUICAgICBESUFMT0dfU1lNQk9MX0NVUlJFTlQsIFBNX1NZTUJPTF9MSVNUX1RYVCwgIDUsIDMwLCAxMjUsIDEwCiBDT01CT0JPWCAgICAgICAgICAgICAgICAgICAgICAgICBQTV9TWU1CT0xfTElTVCwgICAgICA1LCA0MCwgMTI1LCA1MCwKLSAgIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfT1dORVJEUkFXRklYRUQKLURFRlBVU0hCVVRUT04gRElBTE9HX09LLCAgICAgICAgIElET0ssICAgICAgICAgICAgICAxMzUsICA1LCAgNjAsIDE1Ci1QVVNIQlVUVE9OICAgIERJQUxPR19DQU5DRUwsICAgICBJRENBTkNFTCwgICAgICAgICAgMTM1LCAyNSwgIDYwLCAxNQotUFVTSEJVVFRPTiAgICBESUFMT0dfQlJPV1NFICwgICAgUE1fQlJPV1NFLCAgICAgICAgIDEzNSwgNDUsICA2MCwgMTUKLVBVU0hCVVRUT04gICAgRElBTE9HX0hFTFAsICAgICAgIFBNX0hFTFAsICAgICAgICAgICAxMzUsIDY1LCAgNjAsIDE1CisgICBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgV1NfVEFCU1RPUAorREVGUFVTSEJVVFRPTiBESUFMT0dfT0ssICAgICAgICAgSURPSywgICAgICAgICAgICAgIDEzNSwgIDUsICA2MCwgMTUsIFdTX1RBQlNUT1AKK1BVU0hCVVRUT04gICAgRElBTE9HX0NBTkNFTCwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAxMzUsIDI1LCAgNjAsIDE1LCBXU19UQUJTVE9QCitQVVNIQlVUVE9OICAgIERJQUxPR19CUk9XU0UgLCAgICBQTV9CUk9XU0UsICAgICAgICAgMTM1LCA0NSwgIDYwLCAxNSwgV1NfVEFCU1RPUAorUFVTSEJVVFRPTiAgICBESUFMT0dfSEVMUCwgICAgICAgUE1fSEVMUCwgICAgICAgICAgIDEzNSwgNjUsICA2MCwgMTUsIFdTX1RBQlNUT1AKIH0KIAogLyogRGlhbG9nIGBFeGVjdXRlJyAqLwogCi1ESUFMT0dfRVhFQ1VURV9YeCBESUFMT0cgMCwgMCwgMjAwLCA4NQorQ09OQ0FUKERJQUxPR19FWEVDVVRFXywgTEFOR1VBR0VfSUQpIERJQUxPRyAwLCAwLCAyMDAsIDg1CiBTVFlMRSBEU19NT0RBTEZSQU1FCiBDQVBUSU9OIERJQUxPR19FWEVDVVRFX0NBUFRJT04KIHsKIExURVhUICAgICBESUFMT0dfRVhFQ1VURV9DT01NQU5EX0xJTkUsIElESUdOT1JFLCAgIDA1LCAxNSwgMTIwLCAxMAotRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1fQ09NTUFORCwgMDUsIDI1LCAxMjAsIDE1Ci1DSEVDS0JPWCAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICBQTV9TWU1CT0wsICAwNSwgNDUsICAxMCwgMTAKK0VESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNX0NPTU1BTkQsIDA1LCAyNSwgMTIwLCAxNSwgV1NfVEFCU1RPUAorQ0hFQ0tCT1ggICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgUE1fU1lNQk9MLCAgMDUsIDQ1LCAgMTAsIDEwLCBXU19UQUJTVE9QCiBMVEVYVCAgICAgICAgIERJQUxPR19FWEVDVVRFX1NZTUJPTCwgICBJRElHTk9SRSwgICAyMCwgNDUsIDEyMCwgMTAKLURFRlBVU0hCVVRUT04gRElBTE9HX09LLCAgICAgICAgICAgICAgIElET0ssICAgICAgMTM1LCAgNSwgIDYwLCAxNQotUFVTSEJVVFRPTiAgICBESUFMT0dfQ0FOQ0VMLCAgICAgICAgICAgSURDQU5DRUwsICAxMzUsIDI1LCAgNjAsIDE1Ci1QVVNIQlVUVE9OICAgIERJQUxPR19CUk9XU0UgLCAgICAgICAgICBQTV9CUk9XU0UsIDEzNSwgNDUsICA2MCwgMTUKLVBVU0hCVVRUT04gICAgRElBTE9HX0hFTFAsICAgICAgICAgICAgIFBNX0hFTFAsICAgMTM1LCA2NSwgIDYwLCAxNQorREVGUFVTSEJVVFRPTiBESUFMT0dfT0ssICAgICAgICAgICAgICAgSURPSywgICAgICAxMzUsICA1LCAgNjAsIDE1LCBXU19UQUJTVE9QCitQVVNIQlVUVE9OICAgIERJQUxPR19DQU5DRUwsICAgICAgICAgICBJRENBTkNFTCwgIDEzNSwgMjUsICA2MCwgMTUsIFdTX1RBQlNUT1AKK1BVU0hCVVRUT04gICAgRElBTE9HX0JST1dTRSAsICAgICAgICAgIFBNX0JST1dTRSwgMTM1LCA0NSwgIDYwLCAxNSwgV1NfVEFCU1RPUAorUFVTSEJVVFRPTiAgICBESUFMT0dfSEVMUCwgICAgICAgICAgICAgUE1fSEVMUCwgICAxMzUsIDY1LCAgNjAsIDE1LCBXU19UQUJTVE9QCit9CisKKy8qIFN0cmluZ3MgKi8KKworI2RlZmluZSBBRERTVFJJTkcoc3RyKSBBRERTVFJJTkcxKExBTkdVQUdFX05VTUJFUiwgSURTXyAjIyBzdHIpIFNUUklOR18gIyMgc3RyCisjZGVmaW5lIEFERFNUUklORzEobGFuZ251bSwgaWRzKSBBRERTVFJJTkcyKGxhbmdudW0sIGlkcykKKyNkZWZpbmUgQUREU1RSSU5HMihsYW5nbnVtLCBpZHMpIDB4ICMjIGxhbmdudW0gIyMgaWRzCisKKyNkZWZpbmUgU1RSSU5HSUZZKHN0cikgU1RSSU5HSUZZMShzdHIpCisjZGVmaW5lIFNUUklOR0lGWTEoc3RyKSAjc3RyCisKKyNkZWZpbmUgU1RSSU5HX0xBTkdVQUdFX0lEICAgICAgICBTVFJJTkdJRlkoTEFOR1VBR0VfSUQpCisjZGVmaW5lIFNUUklOR19MQU5HVUFHRV9NRU5VX0lURU0gTEFOR1VBR0VfTUVOVV9JVEVNCisKK1NUUklOR1RBQkxFCit7CitBRERTVFJJTkcoTEFOR1VBR0VfSUQpCitBRERTVFJJTkcoTEFOR1VBR0VfTUVOVV9JVEVNKQorQUREU1RSSU5HKFBST0dSQU1fTUFOQUdFUikKK0FERFNUUklORyhFUlJPUikKK0FERFNUUklORyhXQVJOSU5HKQorQUREU1RSSU5HKElORk8pCitBRERTVFJJTkcoREVMRVRFKQorQUREU1RSSU5HKERFTEVURV9HUk9VUF9zKQorQUREU1RSSU5HKERFTEVURV9QUk9HUkFNX3MpCitBRERTVFJJTkcoTk9UX0lNUExFTUVOVEVEKQorQUREU1RSSU5HKEZJTEVfUkVBRF9FUlJPUl9zKQorQUREU1RSSU5HKEZJTEVfV1JJVEVfRVJST1JfcykKK0FERFNUUklORyhHUlBGSUxFX1JFQURfRVJST1JfcykKK0FERFNUUklORyhPVVRfT0ZfTUVNT1JZKQorQUREU1RSSU5HKFdJTkhFTFBfRVJST1IpCitBRERTVFJJTkcoVU5LTk9XTl9GRUFUVVJFX3MpCitBRERTVFJJTkcoRklMRV9OT1RfT1ZFUldSSVRURU5fcykKK0FERFNUUklORyhTQVZFX0dST1VQX0FTX3MpCitBRERTVFJJTkcoTk9fSE9UX0tFWSkKK0FERFNUUklORyhBTExfRklMRVMpCitBRERTVFJJTkcoUFJPR1JBTVMpCitBRERTVFJJTkcoTElCUkFSSUVTX0RMTCkKK0FERFNUUklORyhTWU1CT0xfRklMRVMpCitBRERTVFJJTkcoU1lNQk9MU19JQ08pCiB9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL2RpYWxvZy5jIGIvcHJvZ3JhbXMvcHJvZ21hbi9kaWFsb2cuYwppbmRleCBjMTljYTgzLi5mMzVkNDI1IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL2RpYWxvZy5jCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vZGlhbG9nLmMKQEAgLTgsNyArOCw4IEBACiAjaW5jbHVkZSA8Y29tbWRsZy5oPgogI2luY2x1ZGUgInByb2dtYW4uaCIKIAotc3RhdGljIEJPT0wgRElBTE9HX0Jyb3dzZShIV05ELCBMUENTVFIsIExQU1RSLCBJTlQpOworc3RhdGljIEJPT0wgICAgRElBTE9HX0Jyb3dzZVByb2dyYW1zKEhXTkQsIExQU1RSLCBJTlQpOworc3RhdGljIEJPT0wgICAgRElBTE9HX0Jyb3dzZVN5bWJvbHMoSFdORCwgTFBTVFIsIElOVCk7CiBzdGF0aWMgTFJFU1VMVCBESUFMT0dfTkVXX0RsZ1Byb2MoSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0pOwogc3RhdGljIExSRVNVTFQgRElBTE9HX0NPUFlfTU9WRV9EbGdQcm9jKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKIHN0YXRpYyBMUkVTVUxUIERJQUxPR19HUk9VUF9EbGdQcm9jKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKQEAgLTE1NywxMyArMTU4LDEwIEBACiAgKiAgICAgICAgICAgRElBTE9HX0RlbGV0ZQogICovCiAKLUJPT0wgRElBTE9HX0RlbGV0ZShMUENTVFIgbHBzekZvcm1hdF9zLCBMUENTVFIgbHBzek5hbWUpCitCT09MIERJQUxPR19EZWxldGUoVUlOVCBpZHNfdGV4dF9zLCBMUENTVFIgbHBzek5hbWUpCiB7Ci0gIENIQVIgbXNnWzEwMDBdOwotICBpZiAoc2l6ZW9mKG1zZykgPD0gbHN0cmxlbihscHN6Rm9ybWF0X3MpICsgbHN0cmxlbihscHN6TmFtZSkpIHJldHVybiBGQUxTRTsKLSAgd3NwcmludGYobXNnLCAoTFBTVFIpbHBzekZvcm1hdF9zLCBscHN6TmFtZSk7Ci0gIHJldHVybiAoSURZRVMgPT0gTWVzc2FnZUJveChHbG9iYWxzLmhNYWluV25kLCBtc2csIFNUUklOR19ERUxFVEUsCi0JCQkgICAgICBNQl9ZRVNOTyB8IE1CX0RFRkJVVFRPTjIpKTsKKyAgcmV0dXJuIChJRFlFUyA9PSBNQUlOX01lc3NhZ2VCb3hJRFNfcyhpZHNfdGV4dF9zLCBscHN6TmFtZSwgSURTX0RFTEVURSwKKwkJCQkJTUJfWUVTTk8gfCBNQl9ERUZCVVRUT04yKSk7CiB9CiAKIApAQCAtMjg0LDYgKzI4Miw3IEBACiAKIHN0YXRpYyBMUkVTVUxUIERJQUxPR19QUk9HUkFNX0RsZ1Byb2MoSFdORCBoRGxnLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKKyAgQ0hBUiBidWZmZXJbTUFYX1NUUklOR19MRU5dOwogICBzd2l0Y2ggKG1zZykKICAgICB7CiAgICAgY2FzZSBXTV9JTklURElBTE9HOgpAQCAtMjkxLDcgKzI5MCwxMCBAQAogICAgICAgU2V0RGxnSXRlbVRleHQoaERsZywgUE1fQ09NTUFORF9MSU5FLCBQcm9ncmFtQXR0cmlidXRlcy5scHN6Q21kTGluZSk7CiAgICAgICBTZXREbGdJdGVtVGV4dChoRGxnLCBQTV9ESVJFQ1RPUlksIFByb2dyYW1BdHRyaWJ1dGVzLmxwc3pXb3JrRGlyKTsKICAgICAgIGlmICghKlByb2dyYW1BdHRyaWJ1dGVzLmxwbkhvdEtleSkKLQlTZXREbGdJdGVtVGV4dChoRGxnLCBQTV9IT1RfS0VZLCAoTFBTVFIpU1RSSU5HX05PX0hPVF9LRVkpOworCXsKKwkgIExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIElEU19OT19IT1RfS0VZLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKwkgIFNldERsZ0l0ZW1UZXh0KGhEbGcsIFBNX0hPVF9LRVksIGJ1ZmZlcik7CisJfQogCiAgICAgICBDaGVja0RsZ0J1dHRvbihoRGxnLCBQTV9TWU1CT0wsCiAJCSAgICAgKCpQcm9ncmFtQXR0cmlidXRlcy5scG5DbWRTaG93ID09IFNXX1NIT1dNSU5JTUlaRUQpKTsKQEAgLTMwOSw4ICszMTEsNyBAQAogCWNhc2UgUE1fQlJPV1NFOgogCSAgewogCSAgICBDSEFSIGZpbGVuYW1lW01BWF9QQVRITkFNRV9MRU5dOwotCSAgICBpZiAoRElBTE9HX0Jyb3dzZShoRGxnLCBTVFJJTkdfQlJPV1NFX0VYRV9GSUxURVIsCi0JCQkgICAgICBmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSkpCisJICAgIGlmIChESUFMT0dfQnJvd3NlUHJvZ3JhbXMoaERsZywgZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSkpKQogCSAgICAgIFNldERsZ0l0ZW1UZXh0KGhEbGcsIFBNX0NPTU1BTkRfTElORSwgZmlsZW5hbWUpOwogCSAgICByZXR1cm4gVFJVRTsKIAkgIH0KQEAgLTQzMiwxNCArNDMzLDEzIEBACiAJY2FzZSBQTV9CUk9XU0U6CiAJICB7CiAJICAgIENIQVIgZmlsZW5hbWVbTUFYX1BBVEhOQU1FX0xFTl07Ci0JICAgIGlmIChESUFMT0dfQnJvd3NlKGhEbGcsIFNUUklOR19CUk9XU0VfSUNPX0ZJTFRFUiwKLQkJCSAgICAgIGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpKSkKKwkgICAgaWYgKERJQUxPR19Ccm93c2VTeW1ib2xzKGhEbGcsIGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpKSkKIAkgICAgICBTZXREbGdJdGVtVGV4dChoRGxnLCBQTV9JQ09OX0ZJTEUsIGZpbGVuYW1lKTsKIAkgICAgcmV0dXJuIFRSVUU7CiAJICB9CiAKIAljYXNlIFBNX0hFTFA6Ci0JICBNQUlOX05vdEltcGxlbWVudGVkRXJyb3IoKTsKKwkgIE1BSU5fTWVzc2FnZUJveElEUyhJRFNfTk9UX0lNUExFTUVOVEVELCBJRFNfRVJST1IsIE1CX09LKTsKIAkgIHJldHVybiBUUlVFOwogCiAJY2FzZSBJRE9LOgpAQCAtNTAwLDE0ICs1MDAsMTMgQEAKIAljYXNlIFBNX0JST1dTRToKIAkgIHsKIAkgICAgQ0hBUiBmaWxlbmFtZVtNQVhfUEFUSE5BTUVfTEVOXTsKLQkgICAgaWYgKERJQUxPR19Ccm93c2UoaERsZywgU1RSSU5HX0JST1dTRV9FWEVfRklMVEVSLAotCQkJICAgICAgZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSkpKQorCSAgICBpZiAoRElBTE9HX0Jyb3dzZVByb2dyYW1zKGhEbGcsIGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpKSkKIAkgICAgICBTZXREbGdJdGVtVGV4dChoRGxnLCBQTV9DT01NQU5ELCBmaWxlbmFtZSk7CiAJICAgIHJldHVybiBUUlVFOwogCSAgfQogCiAJY2FzZSBQTV9IRUxQOgotCSAgTUFJTl9Ob3RJbXBsZW1lbnRlZEVycm9yKCk7CisJICBNQUlOX01lc3NhZ2VCb3hJRFMoSURTX05PVF9JTVBMRU1FTlRFRCwgSURTX0VSUk9SLCBNQl9PSyk7CiAJICByZXR1cm4gVFJVRTsKIAogCWNhc2UgSURPSzoKQEAgLTUzNiwxNSArNTM1LDE2IEBACiAgKiAgICAgICAgICAgRElBTE9HX0Jyb3dzZQogICovCiAKLS8qIEZJWE1FIGlzIHRoaXMgY29ycmVjdCA/ICovCi1zdGF0aWMgQk9PTCBESUFMT0dfQnJvd3NlKEhXTkQgaERsZywgTFBDU1RSIGxwY3N0ckZpbHRlciwKK3N0YXRpYyBCT09MIERJQUxPR19Ccm93c2UoSFdORCBoRGxnLCBMUENTVFIgbHBzenpGaWx0ZXIsCiAJCQkgIExQU1RSIGxwc3RyRmlsZSwgSU5UIG5NYXhGaWxlKQogewogICBPUEVORklMRU5BTUUgb3BlbmZpbGVuYW1lOworCisgIC8qIEZJWE1FIGlzIHRoaXMgY29ycmVjdCA/ICovCiAgIG9wZW5maWxlbmFtZS5sU3RydWN0U2l6ZSAgICAgICA9IDA7CiAgIG9wZW5maWxlbmFtZS5od25kT3duZXIgICAgICAgICA9IGhEbGc7CiAgIG9wZW5maWxlbmFtZS5oSW5zdGFuY2UgICAgICAgICA9IEdsb2JhbHMuaEluc3RhbmNlOwotICBvcGVuZmlsZW5hbWUubHBzdHJGaWx0ZXIgICAgICAgPSAoTFBTVFIpbHBjc3RyRmlsdGVyOworICBvcGVuZmlsZW5hbWUubHBzdHJGaWx0ZXIgICAgICAgPSAoTFBTVFIpbHBzenpGaWx0ZXI7CiAgIG9wZW5maWxlbmFtZS5scHN0ckN1c3RvbUZpbHRlciA9IDA7CiAgIG9wZW5maWxlbmFtZS5uTWF4Q3VzdEZpbHRlciAgICA9IDA7CiAgIG9wZW5maWxlbmFtZS5uRmlsdGVySW5kZXggICAgICA9IDA7CkBAIC01NjQsNiArNTY0LDU1IEBACiAgIHJldHVybiBHZXRPcGVuRmlsZU5hbWUoJm9wZW5maWxlbmFtZSk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgICAgICBESUFMT0dfQWRkRmlsdGVySXRlbQorICovCisKK3N0YXRpYyBWT0lEIERJQUxPR19BZGRGaWx0ZXJJdGVtKExQU1RSICpwLCBVSU5UIGlkcywgTFBDU1RSIGZpbHRlcikKK3sKKyAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgaWRzLCAqcCwgTUFYX1NUUklOR19MRU4pOworICAqcCArPSBzdHJsZW4oKnApICsgMTsKKyAgbHN0cmNweSgqcCwgKFNFR1BUUikgZmlsdGVyKTsKKyAgKnAgKz0gc3RybGVuKCpwKSArIDE7CisgICoqcCA9ICdcMCc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgICAgICBESUFMT0dfQnJvd3NlUHJvZ3JhbXMKKyAqLworCitzdGF0aWMgQk9PTCBESUFMT0dfQnJvd3NlUHJvZ3JhbXMoSFdORCBoRGxnLCBMUFNUUiBscHN6RmlsZSwgSU5UIG5NYXhGaWxlKQoreworICBDSEFSICBzenpGaWx0ZXJbMiAqIE1BWF9TVFJJTkdfTEVOICsgMTAwXTsKKyAgTFBTVFIgcCA9IHN6ekZpbHRlcjsKKworICBESUFMT0dfQWRkRmlsdGVySXRlbSgmcCwgSURTX1BST0dSQU1TLCAgIiouZXhlOyoucGlmOyouY29tOyouYmF0Iik7CisgIERJQUxPR19BZGRGaWx0ZXJJdGVtKCZwLCBJRFNfQUxMX0ZJTEVTLCAiKi4qIik7CisKKyAgcmV0dXJuKERJQUxPR19Ccm93c2UoaERsZywgc3p6RmlsdGVyLCBscHN6RmlsZSwgbk1heEZpbGUpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICAgICAgIERJQUxPR19Ccm93c2VTeW1ib2xzCisgKi8KKworc3RhdGljIEJPT0wgRElBTE9HX0Jyb3dzZVN5bWJvbHMoSFdORCBoRGxnLCBMUFNUUiBscHN6RmlsZSwgSU5UIG5NYXhGaWxlKQoreworICBDSEFSICBzenpGaWx0ZXJbNSAqIE1BWF9TVFJJTkdfTEVOICsgMTAwXTsKKyAgTFBTVFIgcCA9IHN6ekZpbHRlcjsKKworICBESUFMT0dfQWRkRmlsdGVySXRlbSgmcCwgSURTX1NZTUJPTF9GSUxFUywgICIqLmljbzsqLmV4ZTsqLmRsbCIpOworICBESUFMT0dfQWRkRmlsdGVySXRlbSgmcCwgSURTX1BST0dSQU1TLCAgICAgICIqLmV4ZSIpOworICBESUFMT0dfQWRkRmlsdGVySXRlbSgmcCwgSURTX0xJQlJBUklFU19ETEwsICIqLmRsbCIpOworICBESUFMT0dfQWRkRmlsdGVySXRlbSgmcCwgSURTX1NZTUJPTFNfSUNPLCAgICIqLmljbyIpOworICBESUFMT0dfQWRkRmlsdGVySXRlbSgmcCwgSURTX0FMTF9GSUxFUywgICAgICIqLioiKTsKKworICByZXR1cm4oRElBTE9HX0Jyb3dzZShoRGxnLCBzenpGaWx0ZXIsIGxwc3pGaWxlLCBuTWF4RmlsZSkpOworfQorCiAvKiBMb2NhbCBWYXJpYWJsZXM6ICAgICovCiAvKiBjLWZpbGUtc3R5bGU6ICJHTlUiICovCiAvKiBFbmQ6ICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL2dyb3VwLmMgYi9wcm9ncmFtcy9wcm9nbWFuL2dyb3VwLmMKaW5kZXggMDY0NmY4Zi4uYTEzM2I1NSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcHJvZ21hbi9ncm91cC5jCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vZ3JvdXAuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAgIEhMT0NBTCBoR3JwRmlsZSA9IExvY2FsQWxsb2MoTE1FTV9GSVhFRCwgMSArIGxzdHJsZW4obHBzekdycEZpbGUpKTsKICAgaWYgKCFoR3JvdXAgfHwgIWhOYW1lIHx8ICFoR3JwRmlsZSkKICAgICB7Ci0gICAgICBNZXNzYWdlQm94KEdsb2JhbHMuaE1haW5XbmQsICJvdXQgb2YgbWVtb3J5IiwgbHBzek5hbWUsIE1CX09LKTsKKyAgICAgIE1BSU5fTWVzc2FnZUJveElEUyhJRFNfT1VUX09GX01FTU9SWSwgSURTX0VSUk9SLCBNQl9PSyk7CiAgICAgICBpZiAoaEdyb3VwKSAgIExvY2FsRnJlZShoR3JvdXApOwogICAgICAgaWYgKGhOYW1lKSAgICBMb2NhbEZyZWUoaE5hbWUpOwogICAgICAgaWYgKGhHcnBGaWxlKSBMb2NhbEZyZWUoaEdycEZpbGUpOwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9ncnBmaWxlLmMgYi9wcm9ncmFtcy9wcm9nbWFuL2dycGZpbGUuYwppbmRleCA1MGU5OWVjLi4xZTI5MmEwIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL2dycGZpbGUuYworKysgYi9wcm9ncmFtcy9wcm9nbWFuL2dycGZpbGUuYwpAQCAtNjMsMTQgKzYzLDE1IEBACiAgIC8qIFJlYWQgdGhlIHdob2xlIGZpbGUgaW50byBhIGJ1ZmZlciAqLwogICBpZiAoIUdSUEZJTEVfUmVhZEZpbGVUb0J1ZmZlcihscHN6UGF0aCwgJmhCdWZmZXIsICZzaXplKSkKICAgICB7Ci0gICAgICBNQUlOX0dycEZpbGVSZWFkRXJyb3IobHBzelBhdGgpOworICAgICAgTUFJTl9NZXNzYWdlQm94SURTX3MoSURTX0dSUEZJTEVfUkVBRF9FUlJPUl9zLCBscHN6UGF0aCwgSURTX0VSUk9SLCBNQl9ZRVNOTyk7CiAgICAgICByZXR1cm4oMCk7CiAgICAgfQogCiAgIC8qIEludGVycHJldCBidWZmZXIgKi8KICAgaEdyb3VwID0gR1JQRklMRV9TY2FuR3JvdXAoTG9jYWxMb2NrKGhCdWZmZXIpLCBzaXplLAogCQkJICAgICBscHN6UGF0aCwgYkZpbGVOYW1lTW9kaWZpZWQpOwotICBpZiAoIWhHcm91cCkgTUFJTl9HcnBGaWxlUmVhZEVycm9yKGxwc3pQYXRoKTsKKyAgaWYgKCFoR3JvdXApCisgICAgTUFJTl9NZXNzYWdlQm94SURTX3MoSURTX0dSUEZJTEVfUkVBRF9FUlJPUl9zLCBscHN6UGF0aCwgSURTX0VSUk9SLCBNQl9ZRVNOTyk7CiAKICAgTG9jYWxGcmVlKGhCdWZmZXIpOwogCkBAIC0yMjUsOCArMjI2LDggQEAKICAgc3dpdGNoIChpY29udHlwZSkKICAgICB7CiAgICAgZGVmYXVsdDoKLSAgICAgIE1lc3NhZ2VCb3goR2xvYmFscy5oTWFpblduZCwgU1RSSU5HX1VOS05PV05fRkVBVFVSRV9JTl9HUlBGSUxFLAotCQkgbHBzekdycEZpbGUsIE1CX09LKTsKKyAgICAgIE1BSU5fTWVzc2FnZUJveElEU19zKElEU19VTktOT1dOX0ZFQVRVUkVfcywgbHBzekdycEZpbGUsCisJCQkgICBJRFNfV0FSTklORywgTUJfT0spOwogICAgIGNhc2UgMHgwNDhjOgogICAgICAgaWNvblhPUnNpemUgICAgID0gR0VUX1VTSE9SVChwcm9ncmFtX3B0ciwgIDgpOwogICAgICAgaWNvbkFORHNpemUgICAgID0gR0VUX1VTSE9SVChwcm9ncmFtX3B0ciwgMTApIC8gODsKQEAgLTMwNSw5ICszMDYsOCBAQAogCQkgIG5DbWRTaG93ID0gR0VUX1VTSE9SVChwdHIsIDYpOwogCQkgIGJyZWFrOwogCQlkZWZhdWx0OgotCQkgIE1lc3NhZ2VCb3goR2xvYmFscy5oTWFpblduZCwKLQkJCSAgICAgU1RSSU5HX1VOS05PV05fRkVBVFVSRV9JTl9HUlBGSUxFLAotCQkJICAgICBscHN6R3JwRmlsZSwgTUJfT0spOworCQkgIE1BSU5fTWVzc2FnZUJveElEU19zKElEU19VTktOT1dOX0ZFQVRVUkVfcywKKwkJCQkgICAgICAgbHBzekdycEZpbGUsIElEU19XQVJOSU5HLCBNQl9PSyk7CiAJCX0KIAkgICAgfQogCSAgaWYgKCFza2lwKSBicmVhazsKQEAgLTM0NCwyNiArMzQ0LDIwIEBACiAgIGlmICghZ3JvdXAtPmJPdmVyd3JpdGVGaWxlT2sgJiYKICAgICAgIE9wZW5GaWxlKHN6UGF0aCwgJmR1bW15LCBPRl9FWElTVCkgIT0gSEZJTEVfRVJST1IpCiAgICAgewotICAgICAgQ0hBUiBtc2dbTUFYX1BBVEhOQU1FX0xFTiArIDEwMDBdOwotCiAgICAgICAvKiBPcmlnaW5hbCBmaWxlIGV4aXN0cywgdHJ5IGAuZ3InIGV4dGVuc2lvbiAqLwogICAgICAgR1JQRklMRV9Nb2RpZnlGaWxlTmFtZShzelBhdGgsIExvY2FsTG9jayhncm91cC0+aEdycEZpbGUpLAogCQkJICAgICBNQVhfUEFUSE5BTUVfTEVOLCBUUlVFKTsKICAgICAgIGlmIChPcGVuRmlsZShzelBhdGgsICZkdW1teSwgT0ZfRVhJU1QpICE9IEhGSUxFX0VSUk9SKQogCXsKIAkgIC8qIEZpbGUgZXhpc3RzLiBEbyBub3Qgb3ZlcndyaXRlICovCi0JICBpZiAoc2l6ZW9mKG1zZykgPD0gbHN0cmxlbihTVFJJTkdfRklMRV9OT1RfT1ZFUldSSVRURU5fcykgKyBsc3RybGVuKHN6UGF0aCkpCi0JICAgIHJldHVybiBGQUxTRTsKLQkgIHdzcHJpbnRmKG1zZywgKExQU1RSKVNUUklOR19GSUxFX05PVF9PVkVSV1JJVFRFTl9zLCBzelBhdGgpOwotCSAgTWVzc2FnZUJveChHbG9iYWxzLmhNYWluV25kLCBtc2csIFNUUklOR19FUlJPUiwgTUJfT0spOworCSAgTUFJTl9NZXNzYWdlQm94SURTX3MoSURTX0ZJTEVfTk9UX09WRVJXUklUVEVOX3MsIHN6UGF0aCwKKwkJCSAgICAgICBJRFNfSU5GTywgTUJfT0spOwogCSAgcmV0dXJuIEZBTFNFOwogCX0KICAgICAgIC8qIEluZm9ybSBhYm91dCB0aGUgbW9kaWZpZWQgZmlsZSBuYW1lICovCi0gICAgICBpZiAoc2l6ZW9mKG1zZykgPD0gbHN0cmxlbihTVFJJTkdfU0FWRV9HUk9VUF9BU19zKSArIGxzdHJsZW4oc3pQYXRoKSkKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB3c3ByaW50Zihtc2csIChMUFNUUilTVFJJTkdfU0FWRV9HUk9VUF9BU19zLCBzelBhdGgpOwotICAgICAgaWYgKElEQ0FOQ0VMID09IE1lc3NhZ2VCb3goR2xvYmFscy5oTWFpblduZCwgbXNnLCBTVFJJTkdfSU5GTywKLQkJCQkgTUJfT0tDQU5DRUwgfCBNQl9JQ09OSU5GT1JNQVRJT04pKQorICAgICAgaWYgKElEQ0FOQ0VMID09CisJICBNQUlOX01lc3NhZ2VCb3hJRFNfcyhJRFNfU0FWRV9HUk9VUF9BU19zLCBzelBhdGgsIElEU19JTkZPLAorCQkJICAgICAgIE1CX09LQ0FOQ0VMIHwgTUJfSUNPTklORk9STUFUSU9OKSkKIAlyZXR1cm4gRkFMU0U7CiAgICAgfQogCkBAIC0zOTUsNyArMzg5LDggQEAKICAgICB9CiAgIGVsc2UgcmV0ID0gRkFMU0U7CiAKLSAgaWYgKCFyZXQpIE1BSU5fRmlsZVdyaXRlRXJyb3Ioc3pQYXRoKTsKKyAgaWYgKCFyZXQpCisgICAgTUFJTl9NZXNzYWdlQm94SURTX3MoSURTX0ZJTEVfV1JJVEVfRVJST1Jfcywgc3pQYXRoLCBJRFNfRVJST1IsIE1CX09LKTsKIAogICByZXR1cm4ocmV0KTsKIH0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3Byb2dtYW4vbWFpbi5jIGIvcHJvZ3JhbXMvcHJvZ21hbi9tYWluLmMKaW5kZXggNGQzY2QxMy4uZTk5MDZmZiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcHJvZ21hbi9tYWluLmMKKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9tYWluLmMKQEAgLTM0LDYgKzM0LDEzIEBACiB7CiAgIE1TRyAgICAgIG1zZzsKIAorI2lmIGRlZmluZWQoV0lORUxJQikgJiYgIWRlZmluZWQoSEFWRV9XSU5FX0NPTlNUUlVDVE9SKQorICAvKiBSZWdpc3RlciByZXNvdXJjZXMgKi8KKyAgTElCV0lORV9SZWdpc3Rlcl9hY2NlbCgpOworICBMSUJXSU5FX1JlZ2lzdGVyX0RlKCk7CisgIExJQldJTkVfUmVnaXN0ZXJfRW4oKTsKKyNlbmRpZgorCiAjaWZuZGVmIFdJTkVMSUIKICAgR2xvYmFscy5scHN6SW5pRmlsZSAgICAgICAgID0gInByb2dtYW4uaW5pIjsKICAgR2xvYmFscy5scHN6SWNvRmlsZSAgICAgICAgID0gInByb2dtYW4uaWNvIjsKQEAgLTU2LDI4ICs2MywxNSBAQAogI2VuZGlmCiAKICAgLyogU2VsZWN0IExhbmd1YWdlICovCi0gIEdsb2JhbHMubHBzekxhbmd1YWdlID0gIkVuIjsKICNpZmRlZiBXSU5FTElCCi0gIGlmIChPcHRpb25zLmxhbmd1YWdlID09IExBTkdfQ3opIEdsb2JhbHMubHBzekxhbmd1YWdlID0gIkN6IjsgCi0gIGlmIChPcHRpb25zLmxhbmd1YWdlID09IExBTkdfRGEpIEdsb2JhbHMubHBzekxhbmd1YWdlID0gIkRhIjsgCi0gIGlmIChPcHRpb25zLmxhbmd1YWdlID09IExBTkdfRGUpIEdsb2JhbHMubHBzekxhbmd1YWdlID0gIkRlIjsgCi0gIGlmIChPcHRpb25zLmxhbmd1YWdlID09IExBTkdfRXMpIEdsb2JhbHMubHBzekxhbmd1YWdlID0gIkVzIjsgCi0gIGlmIChPcHRpb25zLmxhbmd1YWdlID09IExBTkdfRmkpIEdsb2JhbHMubHBzekxhbmd1YWdlID0gIkZpIjsgCi0gIGlmIChPcHRpb25zLmxhbmd1YWdlID09IExBTkdfRnIpIEdsb2JhbHMubHBzekxhbmd1YWdlID0gIkZyIjsgCi0gIGlmIChPcHRpb25zLmxhbmd1YWdlID09IExBTkdfTm8pIEdsb2JhbHMubHBzekxhbmd1YWdlID0gIk5vIjsgCi0jaWZuZGVmIEhBVkVfV0lORV9DT05TVFJVQ1RPUgotICAvKiBSZWdpc3RlciByZXNvdXJjZXMgKi8KLSAgTElCV0lORV9SZWdpc3Rlcl9hY2NlbCgpOwotICBMSUJXSU5FX1JlZ2lzdGVyX0RlKCk7Ci0gIExJQldJTkVfUmVnaXN0ZXJfRW4oKTsKLSNlbmRpZgorICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IGxhbmdOYW1lc1tPcHRpb25zLmxhbmd1YWdlXTsKKyNlbHNlCisgIEdsb2JhbHMubHBzekxhbmd1YWdlID0gIkVuIjsKICNlbmRpZgogCiAgIEdsb2JhbHMuaEluc3RhbmNlICAgICAgICAgICA9IGhJbnN0YW5jZTsKICAgR2xvYmFscy5oR3JvdXBzICAgICAgICAgICAgID0gMDsKLQotICAvKiBGSVhNRSBzaG91bGQgdXNlIE1ESSAqLwotICBHbG9iYWxzLmhBY3RpdmVHcm91cCA9IDA7CisgIEdsb2JhbHMuaEFjdGl2ZUdyb3VwICAgICAgICA9IDA7CiAKICAgLyogUmVhZCBPcHRpb25zIGZyb20gYHByb2dtYW4uaW5pJyAqLwogICBHbG9iYWxzLmJBdXRvQXJyYW5nZSA9CkBAIC0xMDgsNyArMTAyLDcgQEAKICAgR2xvYmFscy5oQWNjZWwgPSBMb2FkQWNjZWxlcmF0b3JzKEdsb2JhbHMuaEluc3RhbmNlLCBTVFJJTkdfQUNDRUwpOwogCiAgIC8qIFNldHVwIG1lbnUsIHN0cmluZ3RhYmxlIGFuZCByZXNvdXJjZW5hbWVzICovCi0gIFNUUklOR19TZWxlY3RMYW5ndWFnZShHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CisgIFNUUklOR19TZWxlY3RMYW5ndWFnZUJ5TmFtZShHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CiAKICAgTUFJTl9DcmVhdGVNRElXaW5kb3coKTsKIApAQCAtMTQ2LDcgKzE0MCw4IEBACiAgICAgewogICAgICAgaW50IG51bSwgc2tpcCwgcmV0OwogICAgICAgcmV0ID0gc3NjYW5mKHB0ciwgIiVkJW4iLCAmbnVtLCAmc2tpcCk7Ci0gICAgICBpZiAocmV0ID09IDApIE1BSU5fRmlsZVJlYWRFcnJvcihHbG9iYWxzLmxwc3pJbmlGaWxlKTsKKyAgICAgIGlmIChyZXQgPT0gMCkKKwlNQUlOX01lc3NhZ2VCb3hJRFNfcyhJRFNfRklMRV9SRUFEX0VSUk9SX3MsIEdsb2JhbHMubHBzekluaUZpbGUsIElEU19FUlJPUiwgTUJfT0spOwogICAgICAgaWYgKHJldCAhPSAxKSBicmVhazsKIAogICAgICAgc3ByaW50ZihrZXksICJHcm91cCVkIiwgbnVtKTsKQEAgLTI1OSwxMiArMjU0LDEyIEBACiAgICAgY2FzZSBQTV9ERUxFVEU6CiAgICAgICBpZiAoaEFjdGl2ZVByb2dyYW0pCiAJewotCWlmIChESUFMT0dfRGVsZXRlKFNUUklOR19ERUxFVEVfUFJPR1JBTV9zLCBQUk9HUkFNX1Byb2dyYW1OYW1lKGhBY3RpdmVQcm9ncmFtKSkpCisJaWYgKERJQUxPR19EZWxldGUoSURTX0RFTEVURV9QUk9HUkFNX3MsIFBST0dSQU1fUHJvZ3JhbU5hbWUoaEFjdGl2ZVByb2dyYW0pKSkKIAkgIFBST0dSQU1fRGVsZXRlUHJvZ3JhbShoQWN0aXZlUHJvZ3JhbSwgVFJVRSk7CiAJfQogICAgICAgZWxzZSBpZiAoaEFjdGl2ZUdyb3VwKQogCXsKLQlpZiAoRElBTE9HX0RlbGV0ZShTVFJJTkdfREVMRVRFX0dST1VQX3MsIEdST1VQX0dyb3VwTmFtZShoQWN0aXZlR3JvdXApKSkKKwlpZiAoRElBTE9HX0RlbGV0ZShJRFNfREVMRVRFX0dST1VQX3MsIEdST1VQX0dyb3VwTmFtZShoQWN0aXZlR3JvdXApKSkKIAkgIEdST1VQX0RlbGV0ZUdyb3VwKGhBY3RpdmVHcm91cCk7CiAJfQogICAgICAgYnJlYWs7CkBAIC0zMjYsMjQgKzMyMSwxNSBAQAogCVNlbmRNZXNzYWdlKEdsb2JhbHMuaE1ESVduZCwgV01fTURJSUNPTkFSUkFOR0UsIDAsIDApOwogICAgICAgYnJlYWs7CiAKLSAgICAgIC8qIE1lbnUgTGFuZ3VhZ2UgKi8KLSAgICBjYXNlIFBNX0RhOiBTVFJJTkdfU2VsZWN0TGFuZ3VhZ2UoIkRhIik7IGJyZWFrOwotICAgIGNhc2UgUE1fRGU6IFNUUklOR19TZWxlY3RMYW5ndWFnZSgiRGUiKTsgYnJlYWs7Ci0gICAgY2FzZSBQTV9FbjogU1RSSU5HX1NlbGVjdExhbmd1YWdlKCJFbiIpOyBicmVhazsKLSAgICBjYXNlIFBNX0VzOiBTVFJJTkdfU2VsZWN0TGFuZ3VhZ2UoIkVzIik7IGJyZWFrOwotICAgIGNhc2UgUE1fRmk6IFNUUklOR19TZWxlY3RMYW5ndWFnZSgiRmkiKTsgYnJlYWs7Ci0gICAgY2FzZSBQTV9GcjogU1RSSU5HX1NlbGVjdExhbmd1YWdlKCJGciIpOyBicmVhazsKLSAgICBjYXNlIFBNX05vOiBTVFJJTkdfU2VsZWN0TGFuZ3VhZ2UoIk5vIik7IGJyZWFrOwotCiAgICAgICAvKiBNZW51IEhlbHAgKi8KICAgICBjYXNlIFBNX0NPTlRFTlRTOgogICAgICAgaWYgKCFXaW5IZWxwKEdsb2JhbHMuaE1haW5XbmQsICJwcm9nbWFuLmhscCIsIEhFTFBfSU5ERVgsIDApKQotCU1BSU5fV2luSGVscEVycm9yKCk7CisJTUFJTl9NZXNzYWdlQm94SURTKElEU19XSU5IRUxQX0VSUk9SLCBJRFNfRVJST1IsIE1CX09LKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBQTV9IRUxQT05IRUxQOgogICAgICAgaWYgKCFXaW5IZWxwKEdsb2JhbHMuaE1haW5XbmQsICJwcm9nbWFuLmhscCIsIEhFTFBfSEVMUE9OSEVMUCwgMCkpCi0JTUFJTl9XaW5IZWxwRXJyb3IoKTsKKwlNQUlOX01lc3NhZ2VCb3hJRFMoSURTX1dJTkhFTFBfRVJST1IsIElEU19FUlJPUiwgTUJfT0spOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFBNX1RVVE9SSUFMOgpAQCAtMzY4LDcgKzM1NCwxMCBAQAogI2VuZGlmCiAKICAgICBkZWZhdWx0OgotICAgICAgTUFJTl9Ob3RJbXBsZW1lbnRlZEVycm9yKCk7CisgICAgICBpZiAod1BhcmFtID49IFBNX0ZJUlNUX0xBTkdVQUdFICYmIHdQYXJhbSA8PSBQTV9MQVNUX0xBTkdVQUdFKQorCVNUUklOR19TZWxlY3RMYW5ndWFnZUJ5TnVtYmVyKHdQYXJhbSAtIFBNX0ZJUlNUX0xBTkdVQUdFKTsKKyAgICAgIGVsc2UKKwlNQUlOX01lc3NhZ2VCb3hJRFMoSURTX05PVF9JTVBMRU1FTlRFRCwgSURTX0VSUk9SLCBNQl9PSyk7CiAgICAgICBicmVhazsKICAgICB9CiB9CkBAIC00NjQsNiArNDUzLDM4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqICAgICAgICAgICBNQUlOX01lc3NhZ2VCb3hJRFMKKyAqLworSU5UIE1BSU5fTWVzc2FnZUJveElEUyhVSU5UIGlkc190ZXh0LCBVSU5UIGlkc190aXRsZSwgV09SRCB0eXBlKQoreworICBDSEFSIHRleHRbTUFYX1NUUklOR19MRU5dOworICBDSEFSIHRpdGxlW01BWF9TVFJJTkdfTEVOXTsKKworICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBpZHNfdGV4dCwgdGV4dCwgc2l6ZW9mKHRleHQpKTsKKyAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgaWRzX3RpdGxlLCB0aXRsZSwgc2l6ZW9mKHRpdGxlKSk7CisKKyAgcmV0dXJuKE1lc3NhZ2VCb3goR2xvYmFscy5oTWFpblduZCwgdGV4dCwgdGl0bGUsIHR5cGUpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICAgICAgIE1BSU5fTWVzc2FnZUJveElEU19zCisgKi8KK0lOVCBNQUlOX01lc3NhZ2VCb3hJRFNfcyhVSU5UIGlkc190ZXh0LCBMUENTVFIgc3RyLCBVSU5UIGlkc190aXRsZSwgV09SRCB0eXBlKQoreworICBDSEFSIHRleHRbTUFYX1NUUklOR19MRU5dOworICBDSEFSIHRpdGxlW01BWF9TVFJJTkdfTEVOXTsKKyAgQ0hBUiBuZXd0ZXh0W01BWF9TVFJJTkdfTEVOICsgTUFYX1BBVEhOQU1FX0xFTl07CisKKyAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgaWRzX3RleHQsIHRleHQsIHNpemVvZih0ZXh0KSk7CisgIExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIGlkc190aXRsZSwgdGl0bGUsIHNpemVvZih0aXRsZSkpOworICB3c3ByaW50ZihuZXd0ZXh0LCB0ZXh0LCBzdHIpOworCisgIHJldHVybihNZXNzYWdlQm94KEdsb2JhbHMuaE1haW5XbmQsIG5ld3RleHQsIHRpdGxlLCB0eXBlKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqICAgICAgICAgICBNQUlOX1JlcGxhY2VTdHJpbmcKICAqLwogCkBAIC00NzcsNzkgKzQ5OCw3IEBACiAgICAgICBMb2NhbEZyZWUoKmhhbmRsZSk7CiAgICAgICAqaGFuZGxlID0gbmV3aGFuZGxlOwogICAgIH0KLSAgZWxzZSBNQUlOX091dE9mTWVtb3J5RXJyb3IoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICAgICAgIE1BSU5fTm90SW1wbGVtZW50ZWRFcnJvcgotICovCi0KLVZPSUQgTUFJTl9Ob3RJbXBsZW1lbnRlZEVycm9yKCkKLXsKLSAgTWVzc2FnZUJveChHbG9iYWxzLmhNYWluV25kLAotCSAgICAgU1RSSU5HX05PVF9JTVBMRU1FTlRFRCwgU1RSSU5HX0VSUk9SLCBNQl9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgICAgICBNQUlOX091dE9mTWVtb3J5RXJyb3IKLSAqLwotCi1WT0lEIE1BSU5fT3V0T2ZNZW1vcnlFcnJvcigpCi17Ci0gIE1lc3NhZ2VCb3goR2xvYmFscy5oTWFpblduZCwKLQkgICAgIFNUUklOR19PVVRfT0ZfTUVNT1JZLCBTVFJJTkdfRVJST1IsIE1CX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICAgICAgIE1BSU5fV2luSGVscEVycm9yCi0gKi8KLQotVk9JRCBNQUlOX1dpbkhlbHBFcnJvcigpCi17Ci0gIE1lc3NhZ2VCb3goR2xvYmFscy5oTWFpblduZCwKLQkgICAgIFNUUklOR19XSU5IRUxQX0VSUk9SLCBTVFJJTkdfRVJST1IsIE1CX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICAgICAgIE1BSU5fRmlsZVJlYWRFcnJvcgotICovCi0KLVZPSUQgTUFJTl9GaWxlUmVhZEVycm9yKExQQ1NUUiBscHN6UGF0aCkKLXsKLSAgQ0hBUiBtc2dbTUFYX1BBVEhOQU1FX0xFTiArIDEwMDBdOwotICBpZiAoc2l6ZW9mKG1zZykgPD0gc3RybGVuKFNUUklOR19GSUxFX1JFQURfRVJST1JfcykgKyBzdHJsZW4obHBzelBhdGgpKSByZXR1cm47Ci0gIHdzcHJpbnRmKG1zZywgKExQU1RSKVNUUklOR19GSUxFX1JFQURfRVJST1JfcywgbHBzelBhdGgpOwotICBNZXNzYWdlQm94KEdsb2JhbHMuaE1haW5XbmQsIG1zZywgU1RSSU5HX0VSUk9SLCBNQl9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgICAgICBNQUlOX0ZpbGVXcml0ZUVycm9yCi0gKi8KLQotVk9JRCBNQUlOX0ZpbGVXcml0ZUVycm9yKExQQ1NUUiBscHN6UGF0aCkKLXsKLSAgQ0hBUiBtc2dbTUFYX1BBVEhOQU1FX0xFTiArIDEwMDBdOwotICBpZiAoc2l6ZW9mKG1zZykgPD0gc3RybGVuKFNUUklOR19GSUxFX1dSSVRFX0VSUk9SX3MpICsgc3RybGVuKGxwc3pQYXRoKSkgcmV0dXJuOwotICB3c3ByaW50Zihtc2csIChMUFNUUilTVFJJTkdfRklMRV9XUklURV9FUlJPUl9zLCBscHN6UGF0aCk7Ci0gIE1lc3NhZ2VCb3goR2xvYmFscy5oTWFpblduZCwgbXNnLCBTVFJJTkdfRVJST1IsIE1CX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgICAgICAgIE1BSU5fR3JwRmlsZVJlYWRFcnJvcgotICovCi0KLVZPSUQgTUFJTl9HcnBGaWxlUmVhZEVycm9yKExQQ1NUUiBscHN6UGF0aCkKLXsKLSAgQ0hBUiBtc2dbTUFYX1BBVEhOQU1FX0xFTiArIDEwMDBdOwotICBpZiAoc2l6ZW9mKG1zZykgPD0gc3RybGVuKFNUUklOR19HUlBGSUxFX1JFQURfRVJST1JfcykgKyBzdHJsZW4obHBzelBhdGgpKSByZXR1cm47Ci0gIHdzcHJpbnRmKG1zZywgKExQU1RSKVNUUklOR19HUlBGSUxFX1JFQURfRVJST1JfcywgbHBzelBhdGgpOwotICBNZXNzYWdlQm94KEdsb2JhbHMuaE1haW5XbmQsIG1zZywgU1RSSU5HX0VSUk9SLCBNQl9ZRVNOTyk7CisgIGVsc2UgTUFJTl9NZXNzYWdlQm94SURTKElEU19PVVRfT0ZfTUVNT1JZLCBJRFNfRVJST1IsIE1CX09LKTsKIH0KIAogLyogTG9jYWwgVmFyaWFibGVzOiAgICAqLwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9wcm9nbWFuLmggYi9wcm9ncmFtcy9wcm9nbWFuL3Byb2dtYW4uaAppbmRleCA4NzU1OThiLi5jMmRlYTFmIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL3Byb2dtYW4uaAorKysgYi9wcm9ncmFtcy9wcm9nbWFuL3Byb2dtYW4uaApAQCAtNywxMiArNywxNCBAQAogI2lmbmRlZiBQUk9HTUFOX0gKICNkZWZpbmUgUFJPR01BTl9ICiAKKyNkZWZpbmUgTUFYX1NUUklOR19MRU4gICAgICAyNTUKKyNkZWZpbmUgTUFYX1BBVEhOQU1FX0xFTiAgICAxMDI0CisjZGVmaW5lIE1BWF9MQU5HVUFHRV9OVU1CRVIgKFBNX0xBU1RfTEFOR1VBR0UgLSBQTV9GSVJTVF9MQU5HVUFHRSkKKwogI2lmbmRlZiBSQ19JTlZPS0VECiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKLSNkZWZpbmUgTUFYX1BBVEhOQU1FX0xFTiAxMDI0Ci0KIC8qIEZhbGxiYWNrIGljb24gKi8KICNpZmRlZiBXSU5FTElCCiAjZGVmaW5lIERFRkFVTFRJQ09OIE9JQ19XSU5FSUNPTgpAQCAtMTEzLDYgKzExNSw3IEBACiAgIEhNRU5VICAgaEZpbGVNZW51OwogICBITUVOVSAgIGhPcHRpb25NZW51OwogICBITUVOVSAgIGhXaW5kb3dzTWVudTsKKyAgSE1FTlUgICBoTGFuZ3VhZ2VNZW51OwogICBMUENTVFIgIGxwc3pJbmlGaWxlOwogICBMUENTVFIgIGxwc3pJY29GaWxlOwogICBCT09MICAgIGJBdXRvQXJyYW5nZTsKQEAgLTEyMCwyMCArMTIzLDE1IEBACiAgIEJPT0wgICAgYk1pbk9uUnVuOwogICBITE9DQUwgIGhHcm91cHM7CiAgIExQQ1NUUiAgbHBzekxhbmd1YWdlOwotICBMUENTVFIgKlN0cmluZ1RhYmxlOwotICAvKiBGSVhNRSBzaG91bGQgdXNlIE1ESSAqLworICBVSU5UICAgIHdTdHJpbmdUYWJsZU9mZnNldDsKICAgSExPQ0FMICBoQWN0aXZlR3JvdXA7CiB9IEdMT0JBTFM7CiAKIGV4dGVybiBHTE9CQUxTIEdsb2JhbHM7CiAKK0lOVCAgTUFJTl9NZXNzYWdlQm94SURTKFVJTlQgaWRzX3RleHQsIFVJTlQgaWRzX3RpdGxlLCBXT1JEIHR5cGUpOworSU5UICBNQUlOX01lc3NhZ2VCb3hJRFNfcyhVSU5UIGlkc190ZXh0X3MsIExQQ1NUUiBzdHIsIFVJTlQgaWRzX3RpdGxlLCBXT1JEIHR5cGUpOwogVk9JRCBNQUlOX1JlcGxhY2VTdHJpbmcoSExPQ0FMICpoYW5kbGUsIExQU1RSIHJlcGxhY2VzdHJpbmcpOwotVk9JRCBNQUlOX05vdEltcGxlbWVudGVkRXJyb3Iodm9pZCk7Ci1WT0lEIE1BSU5fRmlsZVJlYWRFcnJvcihMUENTVFIgbHBzelBhdGgpOwotVk9JRCBNQUlOX0ZpbGVXcml0ZUVycm9yKExQQ1NUUiBscHN6UGF0aCk7Ci1WT0lEIE1BSU5fR3JwRmlsZVJlYWRFcnJvcihMUENTVFIgbHBzelBhdGgpOwotVk9JRCBNQUlOX091dE9mTWVtb3J5RXJyb3Iodm9pZCk7Ci1WT0lEIE1BSU5fV2luSGVscEVycm9yKHZvaWQpOwogCiBITE9DQUwgR1JQRklMRV9SZWFkR3JvdXBGaWxlKGNvbnN0IGNoYXIqIHBhdGgpOwogQk9PTCAgIEdSUEZJTEVfV3JpdGVHcm91cEZpbGUoSExPQ0FMIGhHcm91cCk7CkBAIC0xNzMsNyArMTcxLDcgQEAKIAogSU5UICAgIERJQUxPR19OZXcoSU5UIG5EZWZhdWx0KTsKIEhMT0NBTCBESUFMT0dfQ29weU1vdmUoTFBDU1RSIGxwc3pQcm9ncmFtTmFtZSwgTFBDU1RSIGxwc3pHcm91cE5hbWUsIEJPT0wgYk1vdmUpOwotQk9PTCAgIERJQUxPR19EZWxldGUoTFBDU1RSIGxwc3pGb3JtYXQsIExQQ1NUUiBscHN6TmFtZSk7CitCT09MICAgRElBTE9HX0RlbGV0ZShVSU5UIGlkc19mb3JtYXRfcywgTFBDU1RSIGxwc3pOYW1lKTsKIEJPT0wgICBESUFMT0dfR3JvdXBBdHRyaWJ1dGVzKExQU1RSIGxwc3pUaXRsZSwgTFBTVFIgbHBzelBhdGgsIElOVCBuU2l6ZSk7CiBCT09MICAgRElBTE9HX1Byb2dyYW1BdHRyaWJ1dGVzKExQU1RSIGxwc3pUaXRsZSwgTFBTVFIgbHBzekNtZExpbmUsCiAJCQkJTFBTVFIgbHBzeldvcmtEaXIsIExQU1RSIGxwc3pJY29uRmlsZSwKQEAgLTE4Myw3ICsxODEsOCBAQAogCQkgICAgIElOVCAqbHBuSWNvbkluZGV4LCBJTlQgblNpemUpOwogVk9JRCAgIERJQUxPR19FeGVjdXRlKHZvaWQpOwogCi1WT0lEIFNUUklOR19TZWxlY3RMYW5ndWFnZShMUENTVFIgbGFuZyk7CitWT0lEIFNUUklOR19TZWxlY3RMYW5ndWFnZUJ5TmFtZShMUENTVFIpOworVk9JRCBTVFJJTkdfU2VsZWN0TGFuZ3VhZ2VCeU51bWJlcihVSU5UKTsKIAogLyogQ2xhc3MgbmFtZXMgKi8KIGV4dGVybiBDSEFSIFNUUklOR19NQUlOX1dJTl9DTEFTU19OQU1FW107CkBAIC0yMDQsNDkgKzIwMywzOSBAQAogZXh0ZXJuIENIQVIgU1RSSU5HX1NZTUJPTF9YeFtdOwogZXh0ZXJuIENIQVIgU1RSSU5HX0VYRUNVVEVfWHhbXTsKIAotLyogU3RyaW5ncyAqLwotI2RlZmluZSBTVFJJTkdfUFJPR1JBTV9NQU5BR0VSICAgICAgICAgICAgR2xvYmFscy5TdHJpbmdUYWJsZVsgMF0KLSNkZWZpbmUgU1RSSU5HX0VSUk9SICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbHMuU3RyaW5nVGFibGVbIDFdCi0jZGVmaW5lIFNUUklOR19JTkZPICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxzLlN0cmluZ1RhYmxlWyAyXQotI2RlZmluZSBTVFJJTkdfREVMRVRFICAgICAgICAgICAgICAgICAgICAgR2xvYmFscy5TdHJpbmdUYWJsZVsgM10KLSNkZWZpbmUgU1RSSU5HX0RFTEVURV9HUk9VUF9zICAgICAgICAgICAgIEdsb2JhbHMuU3RyaW5nVGFibGVbIDRdCi0jZGVmaW5lIFNUUklOR19ERUxFVEVfUFJPR1JBTV9zICAgICAgICAgICBHbG9iYWxzLlN0cmluZ1RhYmxlWyA1XQotI2RlZmluZSBTVFJJTkdfTk9UX0lNUExFTUVOVEVEICAgICAgICAgICAgR2xvYmFscy5TdHJpbmdUYWJsZVsgNl0KLSNkZWZpbmUgU1RSSU5HX0ZJTEVfUkVBRF9FUlJPUl9zICAgICAgICAgIEdsb2JhbHMuU3RyaW5nVGFibGVbIDddCi0jZGVmaW5lIFNUUklOR19GSUxFX1dSSVRFX0VSUk9SX3MgICAgICAgICBHbG9iYWxzLlN0cmluZ1RhYmxlWyA4XQotI2RlZmluZSBTVFJJTkdfR1JQRklMRV9SRUFEX0VSUk9SX3MgICAgICAgR2xvYmFscy5TdHJpbmdUYWJsZVsgOV0KLSNkZWZpbmUgU1RSSU5HX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgIEdsb2JhbHMuU3RyaW5nVGFibGVbMTBdCi0jZGVmaW5lIFNUUklOR19XSU5IRUxQX0VSUk9SICAgICAgICAgICAgICBHbG9iYWxzLlN0cmluZ1RhYmxlWzExXQotI2RlZmluZSBTVFJJTkdfVU5LTk9XTl9GRUFUVVJFX0lOX0dSUEZJTEUgR2xvYmFscy5TdHJpbmdUYWJsZVsxMl0KLSNkZWZpbmUgU1RSSU5HX0ZJTEVfTk9UX09WRVJXUklUVEVOX3MgICAgIEdsb2JhbHMuU3RyaW5nVGFibGVbMTNdCi0jZGVmaW5lIFNUUklOR19TQVZFX0dST1VQX0FTX3MgICAgICAgICAgICBHbG9iYWxzLlN0cmluZ1RhYmxlWzE0XQotI2RlZmluZSBTVFJJTkdfTk9fSE9UX0tFWSAgICAgICAgICAgICAgICAgR2xvYmFscy5TdHJpbmdUYWJsZVsxNV0KLSNkZWZpbmUgU1RSSU5HX0JST1dTRV9FWEVfRklMVEVSICAgICAgICAgIEdsb2JhbHMuU3RyaW5nVGFibGVbMTZdCi0jZGVmaW5lIFNUUklOR19CUk9XU0VfSUNPX0ZJTFRFUiAgICAgICAgICBHbG9iYWxzLlN0cmluZ1RhYmxlWzE3XQotI2RlZmluZSBOVU1CRVJfT0ZfU1RSSU5HUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBTVFJJTkdJRChpZCkgKDB4IyNpZCArIEdsb2JhbHMud1N0cmluZ1RhYmxlT2Zmc2V0KQogCi1leHRlcm4gTFBDU1RSIFN0cmluZ1RhYmxlQ3pbXTsKLWV4dGVybiBMUENTVFIgU3RyaW5nVGFibGVEYVtdOwotZXh0ZXJuIExQQ1NUUiBTdHJpbmdUYWJsZURlW107Ci1leHRlcm4gTFBDU1RSIFN0cmluZ1RhYmxlRW5bXTsKLWV4dGVybiBMUENTVFIgU3RyaW5nVGFibGVFc1tdOwotZXh0ZXJuIExQQ1NUUiBTdHJpbmdUYWJsZUZpW107Ci1leHRlcm4gTFBDU1RSIFN0cmluZ1RhYmxlRnJbXTsKLWV4dGVybiBMUENTVFIgU3RyaW5nVGFibGVOb1tdOworI2Vsc2UgLyogUkNfSU5WT0tFRCAqLwogCi0jaWYgZGVmaW5lZChXSU5FTElCKSAmJiAhZGVmaW5lZChIQVZFX1dJTkVfQ09OU1RSVUNUT1IpCi0gIFZPSUQgTElCV0lORV9SZWdpc3Rlcl9hY2NlbCh2b2lkKTsKLSAgVk9JRCBMSUJXSU5FX1JlZ2lzdGVyX0N6KHZvaWQpOwotICBWT0lEIExJQldJTkVfUmVnaXN0ZXJfRGEodm9pZCk7Ci0gIFZPSUQgTElCV0lORV9SZWdpc3Rlcl9EZSh2b2lkKTsKLSAgVk9JRCBMSUJXSU5FX1JlZ2lzdGVyX0VzKHZvaWQpOwotICBWT0lEIExJQldJTkVfUmVnaXN0ZXJfRW4odm9pZCk7Ci0gIFZPSUQgTElCV0lORV9SZWdpc3Rlcl9GaSh2b2lkKTsKLSAgVk9JRCBMSUJXSU5FX1JlZ2lzdGVyX0ZyKHZvaWQpOwotICBWT0lEIExJQldJTkVfUmVnaXN0ZXJfTm8odm9pZCk7CisjZGVmaW5lIFNUUklOR0lEKGlkKSBpZAorCiAjZW5kaWYKIAotI2VuZGlmIC8qICFSQ19JTlZPS0VEICovCisvKiBTdHJpbmd0YWJsZSBpbmRleCAqLworI2RlZmluZSBJRFNfTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgU1RSSU5HSUQoMDApCisjZGVmaW5lIElEU19MQU5HVUFHRV9NRU5VX0lURU0gICAgICAgICBTVFJJTkdJRCgwMSkKKyNkZWZpbmUgSURTX1BST0dSQU1fTUFOQUdFUiAgICAgICAgICAgIFNUUklOR0lEKDAyKQorI2RlZmluZSBJRFNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgU1RSSU5HSUQoMDMpCisjZGVmaW5lIElEU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgwNCkKKyNkZWZpbmUgSURTX0lORk8gICAgICAgICAgICAgICAgICAgICAgIFNUUklOR0lEKDA1KQorI2RlZmluZSBJRFNfREVMRVRFICAgICAgICAgICAgICAgICAgICAgU1RSSU5HSUQoMDYpCisjZGVmaW5lIElEU19ERUxFVEVfR1JPVVBfcyAgICAgICAgICAgICBTVFJJTkdJRCgwNykKKyNkZWZpbmUgSURTX0RFTEVURV9QUk9HUkFNX3MgICAgICAgICAgIFNUUklOR0lEKDA4KQorI2RlZmluZSBJRFNfTk9UX0lNUExFTUVOVEVEICAgICAgICAgICAgU1RSSU5HSUQoMDkpCisjZGVmaW5lIElEU19GSUxFX1JFQURfRVJST1JfcyAgICAgICAgICBTVFJJTkdJRCgwYSkKKyNkZWZpbmUgSURTX0ZJTEVfV1JJVEVfRVJST1JfcyAgICAgICAgIFNUUklOR0lEKDBiKQorI2RlZmluZSBJRFNfR1JQRklMRV9SRUFEX0VSUk9SX3MgICAgICAgU1RSSU5HSUQoMGMpCisjZGVmaW5lIElEU19PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICBTVFJJTkdJRCgwZCkKKyNkZWZpbmUgSURTX1dJTkhFTFBfRVJST1IgICAgICAgICAgICAgIFNUUklOR0lEKDBlKQorI2RlZmluZSBJRFNfVU5LTk9XTl9GRUFUVVJFX3MgICAgICAgICAgU1RSSU5HSUQoMGYpCisjZGVmaW5lIElEU19GSUxFX05PVF9PVkVSV1JJVFRFTl9zICAgICBTVFJJTkdJRCgxMCkKKyNkZWZpbmUgSURTX1NBVkVfR1JPVVBfQVNfcyAgICAgICAgICAgIFNUUklOR0lEKDExKQorI2RlZmluZSBJRFNfTk9fSE9UX0tFWSAgICAgICAgICAgICAgICAgU1RSSU5HSUQoMTIpCisjZGVmaW5lIElEU19BTExfRklMRVMgICAgICAgICAgICAgICAgICBTVFJJTkdJRCgxMykKKyNkZWZpbmUgSURTX1BST0dSQU1TICAgICAgICAgICAgICAgICAgIFNUUklOR0lEKDE0KQorI2RlZmluZSBJRFNfTElCUkFSSUVTX0RMTCAgICAgICAgICAgICAgU1RSSU5HSUQoMTUpCisjZGVmaW5lIElEU19TWU1CT0xfRklMRVMgICAgICAgICAgICAgICBTVFJJTkdJRCgxNikKKyNkZWZpbmUgSURTX1NZTUJPTFNfSUNPICAgICAgICAgICAgICAgIFNUUklOR0lEKDE3KQogCiAvKiBNZW51ICovCiAKQEAgLTI2OCwxNCArMjU3LDggQEAKICNkZWZpbmUgUE1fQVJSQU5HRSAgICAgICAgICAzMDIKICNkZWZpbmUgUE1fRklSU1RfQ0hJTEQgICAgICAzMDMwCiAKLSNkZWZpbmUgUE1fRW4gICAgICAgICAgICAgICA0MDAKLSNkZWZpbmUgUE1fRXMgICAgICAgICAgICAgICA0MDEKLSNkZWZpbmUgUE1fRGUgICAgICAgICAgICAgICA0MDIKLSNkZWZpbmUgUE1fTm8gICAgICAgICAgICAgICA0MDMKLSNkZWZpbmUgUE1fRnIgICAgICAgICAgICAgICA0MDQKLSNkZWZpbmUgUE1fRmkgICAgICAgICAgICAgICA0MDUKLSNkZWZpbmUgUE1fRGEgICAgICAgICAgICAgICA0MDYKLSNkZWZpbmUgUE1fQ3ogICAgICAgICAgICAgICA0MDcKKyNkZWZpbmUgUE1fRklSU1RfTEFOR1VBR0UgICA0MDAKKyNkZWZpbmUgUE1fTEFTVF9MQU5HVUFHRSAgICA0OTkKIAogI2RlZmluZSBQTV9DT05URU5UUyAgICAgICAgIDUwMQogI2RlZmluZSBQTV9TRUFSQ0ggICAgICAgICAgIDUwMgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9wcm9ncmFtLmMgYi9wcm9ncmFtcy9wcm9nbWFuL3Byb2dyYW0uYwppbmRleCBkOWU0YjRhLi5iMmVjZGZiIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL3Byb2dyYW0uYworKysgYi9wcm9ncmFtcy9wcm9nbWFuL3Byb2dyYW0uYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAgIEhMT0NBTCBoV29ya0RpciAgPSBMb2NhbEFsbG9jKExNRU1fRklYRUQsIDEgKyBsc3RybGVuKGxwc3pXb3JrRGlyKSk7CiAgIGlmICghaFByb2dyYW0gfHwgIWhOYW1lIHx8ICFoQ21kTGluZSB8fCAhaEljb25GaWxlIHx8ICFoV29ya0RpcikKICAgICB7Ci0gICAgICBNQUlOX091dE9mTWVtb3J5RXJyb3IoKTsKKyAgICAgIE1BSU5fTWVzc2FnZUJveElEUyhJRFNfT1VUX09GX01FTU9SWSwgSURTX0VSUk9SLCBNQl9PSyk7CiAgICAgICBpZiAoaFByb2dyYW0pICBMb2NhbEZyZWUoaFByb2dyYW0pOwogICAgICAgaWYgKGhOYW1lKSAgICAgTG9jYWxGcmVlKGhOYW1lKTsKICAgICAgIGlmIChoQ21kTGluZSkgIExvY2FsRnJlZShoQ21kTGluZSk7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL3N0cmluZy5jIGIvcHJvZ3JhbXMvcHJvZ21hbi9zdHJpbmcuYwppbmRleCBiZTdhZTE1Li5mMzM5NDFiIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL3N0cmluZy5jCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vc3RyaW5nLmMKQEAgLTIwLDcgKzIwLDcgQEAKIC8qIFJlc291cmNlIG5hbWVzICovCiAvKiBYeCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggRW4sIC4uLiAqLwogQ0hBUiBTVFJJTkdfQUNDRUxbXSAgICAgID0gIkFDQ0VMIjsKLUNIQVIgU1RSSU5HX01BSU5fWHhbXSAgICA9ICJNRU5VX1h4IjsKK0NIQVIgU1RSSU5HX01FTlVfWHhbXSAgICA9ICJNRU5VX1h4IjsKIENIQVIgU1RSSU5HX05FV19YeFtdICAgICA9ICJESUFMT0dfTkVXX1h4IjsKIENIQVIgU1RSSU5HX09QRU5fWHhbXSAgICA9ICJESUFMT0dfT1BFTl9YeCI7CiBDSEFSIFNUUklOR19NT1ZFX1h4W10gICAgPSAiRElBTE9HX01PVkVfWHgiOwpAQCAtMzEsMjIgKzMxLDYwIEBACiBDSEFSIFNUUklOR19TWU1CT0xfWHhbXSAgPSAiRElBTE9HX1NZTUJPTF9YeCI7CiBDSEFSIFNUUklOR19FWEVDVVRFX1h4W10gPSAiRElBTE9HX0VYRUNVVEVfWHgiOwogCi1zdGF0aWMgTFBDU1RSIFN0cmluZ1RhYmxlRW5bXTsKLXN0YXRpYyBMUENTVFIgU3RyaW5nVGFibGVEZVtdOwotCi1WT0lEIFNUUklOR19TZWxlY3RMYW5ndWFnZShMUENTVFIgbGFuZykKK3N0YXRpYyBCT09MIFNUUklOR19Mb2FkU3RyaW5nT3RoZXJMYW5ndWFnZShVSU5UIG51bSwgVUlOVCBpZHMsIExQU1RSIHN0ciwgVUlOVCBsZW4pCiB7CisgIGlkcyAtPSBHbG9iYWxzLndTdHJpbmdUYWJsZU9mZnNldDsKKyAgaWRzICs9IG51bSAqIDB4MTAwOworICByZXR1cm4oTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgaWRzLCBzdHIsIGxlbikpOworfTsKKworVk9JRCBTVFJJTkdfU2VsZWN0TGFuZ3VhZ2VCeU5hbWUoTFBDU1RSIGxhbmcpCit7CisgIElOVCBpOworICBDSEFSIG5ld2xhbmdbM107CisKKyAgZm9yIChpID0gMDsgaSA8PSBNQVhfTEFOR1VBR0VfTlVNQkVSOyBpKyspCisgICAgaWYgKFNUUklOR19Mb2FkU3RyaW5nT3RoZXJMYW5ndWFnZShpLCBJRFNfTEFOR1VBR0VfSUQsIG5ld2xhbmcsIHNpemVvZihuZXdsYW5nKSkgJiYKKwkhbHN0cmNtcChsYW5nLCBuZXdsYW5nKSkKKyAgICAgIHsKKwlTVFJJTkdfU2VsZWN0TGFuZ3VhZ2VCeU51bWJlcihpKTsKKwlyZXR1cm47CisgICAgICB9CisKKyAgLyogRmFsbGJhY2sgKi8KKyAgZm9yIChpID0gMDsgaSA8PSBNQVhfTEFOR1VBR0VfTlVNQkVSOyBpKyspCisgICAgaWYgKFNUUklOR19Mb2FkU3RyaW5nT3RoZXJMYW5ndWFnZShpLCBJRFNfTEFOR1VBR0VfSUQsIG5ld2xhbmcsIHNpemVvZihuZXdsYW5nKSkpCisgICAgICB7CisJU1RSSU5HX1NlbGVjdExhbmd1YWdlQnlOdW1iZXIoaSk7CisJcmV0dXJuOworICAgICAgfQorCisgIE1lc3NhZ2VCb3goR2xvYmFscy5oTWFpblduZCwgIk5vIGxhbmd1YWdlIGZvdW5kIiwgIkZBVEFMIEVSUk9SIiwgTUJfT0spOworICBQb3N0UXVpdE1lc3NhZ2UoMSk7Cit9CisKK1ZPSUQgU1RSSU5HX1NlbGVjdExhbmd1YWdlQnlOdW1iZXIoVUlOVCBudW0pCit7CisgIElOVCAgICBpOworICBDSEFSICAgbGFuZ1szXTsKKyAgQ0hBUiAgIGNhcHRpb25bTUFYX1NUUklOR19MRU5dOworICBDSEFSICAgaXRlbVtNQVhfU1RSSU5HX0xFTl07CiAgIEhNRU5VICBoTWFpbk1lbnU7CiAgIEhMT0NBTCBoR3JvdXA7CiAKLSAgLyogQ2hhbmdlIHN0cmluZyB0YWJsZSAqLwotICBHbG9iYWxzLlN0cmluZ1RhYmxlID0gU3RyaW5nVGFibGVFbjsKLSAgaWYgKCFsc3RyY21wKGxhbmcsICJEZSIpKSBHbG9iYWxzLlN0cmluZ1RhYmxlID0gU3RyaW5nVGFibGVEZTsKKyAgLyogU2VsZWN0IHN0cmluZyB0YWJsZSAqLworICBHbG9iYWxzLndTdHJpbmdUYWJsZU9mZnNldCA9IG51bSAqIDB4MTAwOwogCi0gIFNldFdpbmRvd1RleHQoR2xvYmFscy5oTWFpblduZCwgU1RSSU5HX1BST0dSQU1fTUFOQUdFUik7CisgIC8qIEdldCBMYW5ndWFnZSBpZCAqLworICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfTEFOR1VBR0VfSUQsIGxhbmcsIHNpemVvZihsYW5nKSk7CisgIEdsb2JhbHMubHBzekxhbmd1YWdlID0gbGFuZzsKKworICAvKiBTZXQgZnJhbWUgY2FwdGlvbiAqLworICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfUFJPR1JBTV9NQU5BR0VSLCBjYXB0aW9uLCBzaXplb2YoY2FwdGlvbikpOworICBTZXRXaW5kb3dUZXh0KEdsb2JhbHMuaE1haW5XbmQsIGNhcHRpb24pOwogCiAgIC8qIENoYW5nZSBSZXNvdXJjZSBuYW1lcyAqLwotICBsc3RyY3B5bihTVFJJTkdfTUFJTl9YeCAgICArIHNpemVvZihTVFJJTkdfTUFJTl9YeCkgICAgLSAzLCBsYW5nLCAzKTsKKyAgbHN0cmNweW4oU1RSSU5HX01FTlVfWHggICAgKyBzaXplb2YoU1RSSU5HX01FTlVfWHgpICAgIC0gMywgbGFuZywgMyk7CiAgIGxzdHJjcHluKFNUUklOR19ORVdfWHggICAgICsgc2l6ZW9mKFNUUklOR19ORVdfWHgpICAgICAtIDMsIGxhbmcsIDMpOwogICBsc3RyY3B5bihTVFJJTkdfT1BFTl9YeCAgICArIHNpemVvZihTVFJJTkdfT1BFTl9YeCkgICAgLSAzLCBsYW5nLCAzKTsKICAgbHN0cmNweW4oU1RSSU5HX01PVkVfWHggICAgKyBzaXplb2YoU1RSSU5HX01PVkVfWHgpICAgIC0gMywgbGFuZywgMyk7CkBAIC01OCwzNyArOTYsMzUgQEAKICAgbHN0cmNweW4oU1RSSU5HX0VYRUNVVEVfWHggKyBzaXplb2YoU1RSSU5HX0VYRUNVVEVfWHgpIC0gMywgbGFuZywgMyk7CiAKICAgLyogQ3JlYXRlIG1lbnUgKi8KLSAgaE1haW5NZW51ID0gTG9hZE1lbnUoR2xvYmFscy5oSW5zdGFuY2UsIFNUUklOR19NQUlOX1h4KTsKLSAgaWYgKGhNYWluTWVudSkKLSAgewotICAgIEdsb2JhbHMuaEZpbGVNZW51ICAgID0gR2V0U3ViTWVudShoTWFpbk1lbnUsIDApOwotICAgIEdsb2JhbHMuaE9wdGlvbk1lbnUgID0gR2V0U3ViTWVudShoTWFpbk1lbnUsIDEpOwotICAgIEdsb2JhbHMuaFdpbmRvd3NNZW51ID0gR2V0U3ViTWVudShoTWFpbk1lbnUsIDIpOworICBoTWFpbk1lbnUgPSBMb2FkTWVudShHbG9iYWxzLmhJbnN0YW5jZSwgU1RSSU5HX01FTlVfWHgpOworICBHbG9iYWxzLmhGaWxlTWVudSAgICAgPSBHZXRTdWJNZW51KGhNYWluTWVudSwgMCk7CisgIEdsb2JhbHMuaE9wdGlvbk1lbnUgICA9IEdldFN1Yk1lbnUoaE1haW5NZW51LCAxKTsKKyAgR2xvYmFscy5oV2luZG93c01lbnUgID0gR2V0U3ViTWVudShoTWFpbk1lbnUsIDIpOworICBHbG9iYWxzLmhMYW5ndWFnZU1lbnUgPSBHZXRTdWJNZW51KGhNYWluTWVudSwgMyk7CiAKLSAgICBpZiAoR2xvYmFscy5oTURJV25kKQotICAgICAgU2VuZE1lc3NhZ2UoR2xvYmFscy5oTURJV25kLCBXTV9NRElTRVRNRU5VLAotCQkgIChXUEFSQU0pIGhNYWluTWVudSwKLQkJICAoTFBBUkFNKSBHbG9iYWxzLmhXaW5kb3dzTWVudSk7Ci0gICAgZWxzZSBTZXRNZW51KEdsb2JhbHMuaE1haW5XbmQsIGhNYWluTWVudSk7CisgIC8qIFJlbW92ZSBkdW1teSBpdGVtICovCisgIFJlbW92ZU1lbnUoR2xvYmFscy5oTGFuZ3VhZ2VNZW51LCAwLCBNRl9CWVBPU0lUSU9OKTsKKyAgLyogQWRkIGxhbmd1YWdlIGl0ZW1zICovCisgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgaSsrKQorICAgIGlmIChTVFJJTkdfTG9hZFN0cmluZ090aGVyTGFuZ3VhZ2UoaSwgSURTX0xBTkdVQUdFX01FTlVfSVRFTSwgaXRlbSwgc2l6ZW9mKGl0ZW0pKSkKKyAgICAgIEFwcGVuZE1lbnUoR2xvYmFscy5oTGFuZ3VhZ2VNZW51LCBNRl9TVFJJTkcgfCBNRl9CWUNPTU1BTkQsCisJCSBQTV9GSVJTVF9MQU5HVUFHRSArIGksIGl0ZW0pOwogCi0gICAgLyogRGVzdHJveSBvbGQgbWVudSAqLwotICAgIGlmIChHbG9iYWxzLmhNYWluTWVudSkgRGVzdHJveU1lbnUoR2xvYmFscy5oTWFpbk1lbnUpOwotICAgIEdsb2JhbHMuaE1haW5NZW51ID0gaE1haW5NZW51OwotICB9Ci0gIC8qIFVuc3VwcG9ydGVkIGxhbmd1YWdlICovCi0gIGVsc2UgaWYobHN0cmNtcChsYW5nLCAiRW4iKSkgU1RSSU5HX1NlbGVjdExhbmd1YWdlKCJFbiIpOwotICBlbHNlCi0gIHsKLSAgICBNZXNzYWdlQm94KEdsb2JhbHMuaE1haW5XbmQsICJObyBsYW5ndWFnZSBmb3VuZCIsICJGQVRBTCBFUlJPUiIsIE1CX09LKTsKLSAgICBQb3N0UXVpdE1lc3NhZ2UoMSk7Ci0gIH0KKyAgaWYgKEdsb2JhbHMuaE1ESVduZCkKKyAgICBTZW5kTWVzc2FnZShHbG9iYWxzLmhNRElXbmQsIFdNX01ESVNFVE1FTlUsCisJCShXUEFSQU0pIGhNYWluTWVudSwKKwkJKExQQVJBTSkgR2xvYmFscy5oV2luZG93c01lbnUpOworICBlbHNlIFNldE1lbnUoR2xvYmFscy5oTWFpblduZCwgaE1haW5NZW51KTsKIAotICAvKiBoYXZlIHRvIGJlIGxhc3QgYmVjYXVzZSBvZgotICAgKiB0aGUgcG9zc2libGUgcmVjdXJzaW9uICovCi0gIEdsb2JhbHMubHBzekxhbmd1YWdlID0gbGFuZzsKKyAgLyogRGVzdHJveSBvbGQgbWVudSAqLworICBpZiAoR2xvYmFscy5oTWFpbk1lbnUpIERlc3Ryb3lNZW51KEdsb2JhbHMuaE1haW5NZW51KTsKKyAgR2xvYmFscy5oTWFpbk1lbnUgPSBoTWFpbk1lbnU7CisKICNpZmRlZiBXSU5FTElCCi0gIGlmICghbHN0cmNtcChsYW5nLCAiRGUiKSkgT3B0aW9ucy5sYW5ndWFnZSA9IExBTkdfRGU7Ci0gIGlmICghbHN0cmNtcChsYW5nLCAiRW4iKSkgT3B0aW9ucy5sYW5ndWFnZSA9IExBTkdfRW47CisgIC8qIFVwZGF0ZSBzeXN0ZW0gbWVudXMgKi8KKyAgZm9yIChpID0gMDsgbGFuZ05hbWVzW2ldICYmIGxzdHJjbXAobGFuZywgbGFuZ05hbWVzW2ldKTspIGkrKzsKKyAgaWYgKGxhbmdOYW1lc1tpXSkgT3B0aW9ucy5sYW5ndWFnZSA9IGk7CisKICAgR2V0U3lzdGVtTWVudShHbG9iYWxzLmhNYWluV25kLCBUUlVFKTsKICAgZm9yIChoR3JvdXAgPSBHUk9VUF9GaXJzdEdyb3VwKCk7IGhHcm91cDsKICAgICAgICBoR3JvdXAgPSBHUk9VUF9OZXh0R3JvdXAoaEdyb3VwKSkKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9NYWtlZmlsZS5pbiBiL3Jlc291cmNlcy9NYWtlZmlsZS5pbgppbmRleCA3Y2I3ODcxLi5kYzUzZGUwIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvTWFrZWZpbGUuaW4KKysrIGIvcmVzb3VyY2VzL01ha2VmaWxlLmluCkBAIC0yLDcgKzIsNyBAQAogCiBNT0RVTEUgPSByZXNvdXJjZXMKIAotTEFOR1VBR0VTID0gRW4gRXMgRGUgTm8gRnIgRmkgRGEgQ3ogRW8KK0xBTkdVQUdFUyA9IEVuIEVzIERlIE5vIEZyIEZpIERhIEN6IEVvIEl0CiAKIFNZU1JFU19TUkNTID0gJChMQU5HVUFHRVM6JT1zeXNyZXNfJS5jKQogCmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvVE9ETyBiL3Jlc291cmNlcy9UT0RPCmluZGV4IDI4ZTRkZjkuLmRiNzcxY2MgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9UT0RPCisrKyBiL3Jlc291cmNlcy9UT0RPCkBAIC0xNSwzICsxNSw2IEBACiAKIEZyYW5zIHZhbiBEb3Jzc2VsYWVyCiBkb3Jzc2VsQHJ1bGhtMS5MZWlkZW5Vbml2Lm5sCisKKworUm9iZXJ0IFBvdWxpb3QgKGtyeW5vc0BxYmMuY2xpYy5uZXQpOiBDaGFuZ2VzIHRvIHN5c3Jlc19Gci5yYyBoYXZlIGJlZW4gbWFkZS4KZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXMuYyBiL3Jlc291cmNlcy9zeXNyZXMuYwppbmRleCBhZTFjYmQwLi44MzJkMDI2IDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzLmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlcy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAic3lzcmVzX0RhLmgiCiAjaW5jbHVkZSAic3lzcmVzX0N6LmgiCiAjaW5jbHVkZSAic3lzcmVzX0VvLmgiCisjaW5jbHVkZSAic3lzcmVzX0l0LmgiCiAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqIGNvbnN0ICogU1lTUkVTX1Jlc291cmNlc1tdID0KQEAgLTMwLDcgKzMxLDggQEAKICAgICBzeXNyZXNfRmlfVGFibGUsICAvKiBMQU5HX0ZpICovCiAgICAgc3lzcmVzX0RhX1RhYmxlLCAgLyogTEFOR19EYSAqLwogICAgIHN5c3Jlc19Del9UYWJsZSwgIC8qIExBTkdfQ3ogKi8KLSAgICBzeXNyZXNfRW9fVGFibGUgICAvKiBMQU5HX0VvICovCisgICAgc3lzcmVzX0VvX1RhYmxlLCAgLyogTEFOR19FbyAqLworICAgIHN5c3Jlc19JdF9UYWJsZSAgIC8qIExBTkdfSXQgKi8KIH07CiAKIApkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Gci5yYyBiL3Jlc291cmNlcy9zeXNyZXNfRnIucmMKaW5kZXggNzIzZWEyZC4uM2EyNDFiZCAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19Gci5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0ZyLnJjCkBAIC0xNjUsMzcgKzE2NSwzOCBAQAogIFBVU0hCVVRUT04gIkFubnVsZXIiLCAyLCA3NiwgMTgyLCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogfQogCi0KLUZJTkRfVEVYVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgODQKK0ZJTkRfVEVYVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDIzNiwgNjIKIFNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBDQVBUSU9OICJSZWNoZXJjaGVyIgogRk9OVCA4LCAiSGVsdiIKIHsKLSBMVEVYVCAiJlJlY2hlcmNoZXI6IiwgMTA4OCwgNiwgNiwgNDAsIDkKLSBMVEVYVCAiIiwgMTA4OSwgNjAsIDYsIDE1MCwgOQotIENIRUNLQk9YICJNJm90IHNldWxlbWVudCIsIDEwNDAsIDIwLCAzMCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLSBDSEVDS0JPWCAiUmVzcGVjdCBkZXMgJm1hanVzY3VsZXMvbWludXNjdWxlcyIsIDEwNDEsIDIwLCA1MCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLSBHUk9VUEJPWCAiRGlyZWN0aW9uIiwgMTA3MiwgOTAsIDQwLCA4MCwgNDAsIEJTX0dST1VQQk9YCi0gUkFESU9CVVRUT04gIiZIYXV0IiwgMTA1NiwgMTAwLCA1MCwgNTAsIDEyCi0gUkFESU9CVVRUT04gIiZCYXMiLCAxMDU3LCAxNTAsIDUwLCA1MCwgMTIKLSBERUZQVVNIQlVUVE9OICImUG91cnN1aXZyZSIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gUFVTSEJVVFRPTiAiQW5udWxlciIsIDIsIDIwNiwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgIiZSZWNoZXJjaGVyOiIsIC0xLCA0LCA4LCA0MiwgOAorIEVESVRURVhUIDExNTIsIDQ3LCA3LCAxMjgsIDEyLCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICJNJm90IHNldWxlbWVudCIsIDEwNDAsIDQsIDI2LCAxMDAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiUmVzcGVjdCBkZXMgJm1hanVzY3VsZXMvbWludXNjdWxlcyIsIDEwNDEsIDQsIDQyLCA2NCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AKKyBHUk9VUEJPWCAiRGlyZWN0aW9uIiwgMTA3MiwgMTA3LCAyNiwgNjgsIDI4CisgQ09OVFJPTCAiJkhhdXQiLCAxMDU2LCAiQlVUVE9OIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAxMTEsIDM4LCAyMCwgMTIKKyBDT05UUk9MICImQmFzIiwgMTA1NywgIkJVVFRPTiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AsIDEzOCwgMzgsIDMwLCAxMgorIERFRlBVU0hCVVRUT04gIiZQb3Vyc3VpdnJlIiwgMSwgMTgyLCA1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFubnVsZXIiLCAyLCAxODIsIDIzLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZBaWRlIiwgMTAzOCwgMTgyLCA0NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKIH0KIAogCi1SRVBMQUNFX1RFWFQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNjQsIDExNAorUkVQTEFDRV9URVhUIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjMwLCA5NAogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIlJlbXBsYWNlciIKIEZPTlQgOCwgIkhlbHYiCiB7Ci0gTFRFWFQgIiZSZWNoZXJjaGVyOiIsIDEwODgsIDYsIDYsIDQwLCA5Ci0gTFRFWFQgIiIsIDEwODksIDYwLCA2LCAxNTAsIDkKLSBMVEVYVCAiUiZlbXBsYWNlciBwYXI6IiwgMTA5MCwgNiwgMjYsIDQwLCA5Ci0gTFRFWFQgIiIsIDEwOTEsIDYwLCAyNiwgMTUwLCA5Ci0gQ0hFQ0tCT1ggIk0mb3Qgc2V1bGVtZW50IiwgMTA0MCwgMjAsIDQwLCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAotIENIRUNLQk9YICJSZXNwZWN0IGRlcyAmbWFqdXNjdWxlcy9taW51c2N1bGVzIiwgMTA0MSwgMjAsIDYwLCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAotIERFRlBVU0hCVVRUT04gIiZQb3Vyc3VpdnJlIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLSBQVVNIQlVUVE9OICJSZW1wbGEmY2VyIiwgMTAyNCwgMjA2LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLSBQVVNIQlVUVE9OICJSZW1wbGFjZXIgJnRvdXQiLCAxMDI1LCAyMDYsIDQ0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAotIFBVU0hCVVRUT04gIiZGZXJtZXIiLCAyLCAyMDYsIDY0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICImUmVjaGVyY2hlcjoiLCAtMSwgNCwgOSwgNDgsIDgKKyBFRElUVEVYVCAxMTUyLCA1NCwgNywgMTE0LCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiUiZlbXBsYWNlciBwYXI6IiwgLTEsIDQsIDI2LCA0OCwgOAorIEVESVRURVhUIDExNTMsIDU0LCAyNCwgMTE0LCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiTSZvdCBzZXVsZW1lbnQiLCAxMDQwLCA1LCA0NiwgMTA0LCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIlJlc3BlY3QgZGVzICZtYWp1c2N1bGVzL21pbnVzY3VsZXMiLCAxMDQxLCA1LCA2MiwgNTksIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiJlBvdXJzdWl2cmUiLCAxLCAxNzQsIDQsIDUwLCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIlJlbXBsYSZjZXIiLCAxMDI0LCAxNzQsIDIxLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIlJlbXBsYWNlciAmdG91dCIsIDEwMjUsIDE3NCwgMzgsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkZlcm1lciIsIDIsIDE3NCwgNTUsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkFpZGUiLCAxMDM4LCAxNzQsIDc1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogfQpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19JdC5yYyBiL3Jlc291cmNlcy9zeXNyZXNfSXQucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhMDEzNgotLS0gL2Rldi9udWxsCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfSXQucmMKQEAgLTAsMCArMSwyMDIgQEAKK1NZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCit7CisgTUVOVUlURU0gIiZSaXByaXN0aW5hIiwgNjE3MjgKKyBNRU5VSVRFTSAiJk11b3ZpIiwgNjE0NTYKKyBNRU5VSVRFTSAiJkRpbWVuc2lvbmUiLCA2MTQ0MAorIE1FTlVJVEVNICJNaSZuaW1penphIiwgNjE0NzIKKyBNRU5VSVRFTSAiTWEmc3NpbWl6emEiLCA2MTQ4OAorIE1FTlVJVEVNIFNFUEFSQVRPUgorIE1FTlVJVEVNICImQ2hpdWRpXHRBbHQtRjQiLCA2MTUzNgorIE1FTlVJVEVNIFNFUEFSQVRPUgorIE1FTlVJVEVNICJDJmFtYmlhIGEgLi4uXHRDdHJsLUVzYyIsIDYxNzQ0CisgTUVOVUlURU0gU0VQQVJBVE9SCisgTUVOVUlURU0gIiZJbmZvIHN1IFdJTkUgLi4uIiwgNjE3NjEKK30KKworTVNHQk9YIERJQUxPRyAxMDAsIDgwLCAyMTYsIDE2OAorU1RZTEUgRFNfU1lTTU9EQUwgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0JFR0lOCisgICAgICAgIElDT04gIiIsIDEwODgsIDgsIDIwLCAxNiwgMTYsIFdTX0NISUxEIHwgV1NfVklTSUJMRQorICAgICAgICBMVEVYVCAiIiwgMTAwLCAzMiwgNCwgMTc2LCA0OCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKKyAgICAgICAgUFVTSEJVVFRPTiAiJk9rIiwgMSwgMTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJkFubnVsbGEiLCAyLCA2NCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImQWJiYW5kb25hIiwgMywgMTEyLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZSaXByb3ZhIiwgNCwgMTYwLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZJZ25vcmEiLCA1LCAyMDgsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJlNpIiwgNiwgMjU2LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZObyIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorRU5ECisKK1NIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA1MCwgNDQsIDIyMywgMjAwCitTVFlMRSBEU19MT0NBTEVESVQgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIkluZm9ybWF6aW9uaSBzdSAlcyIKK0ZPTlQgMTAsICJTaXN0ZW1hIgoreworIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgOTEsIDE4MCwgNDAsIDE0CisgQ09OVFJPTCAiIiwgLTEsICJTVEFUSUMiLCBTU19CTEFDS0ZSQU1FIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfRElTQUJMRUQsIDQsIDM1LCAyMTUsIDE0MAorIExURVhUICJUZXh0IiwgMTAwLCAxMSwgNDAsIDIwMCwgMTMwLCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCisgSUNPTiAiIiwgMTA4OCwgMTk1LCAxMCwgMTgsIDIwCit9CisKKworT1BFTl9GSUxFIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjc1LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJBcHJpIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiRmlsZSAmTm9tZToiLCAxMDkwLCA2LCA2LCA3NiwgOQorIEVESVRURVhUIDExNTIsIDYsIDE2LCA5MCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgRVNfT0VNQ09OVkVSVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKKyBMSVNUQk9YIDExMjAsIDYsIDMyLCA5MCwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJkRpcmVjdG9yaWVzOiIsIC0xLCAxMTAsIDYsIDkyLCA5CisgTFRFWFQgIiIsIDEwODgsIDExMCwgMTgsIDkyLCA5LCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCisgTElTVEJPWCAxMTIxLCAxMTAsIDMyLCA5MiwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiRmlsZXMgZGkgJlRpcG86IiwgMTA4OSwgNiwgMTA0LCA5MCwgOQorIENPTUJPQk9YIDExMzYsIDYsIDExNCwgOTAsIDM2LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJlVuaXRhJzoiLCAxMDkxLCAxMTAsIDEwNCwgOTIsIDkKKyBDT01CT0JPWCAxMTM3LCAxMTAsIDExNCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiQXByaSIsIDEsIDIwOCwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQW5udWxsYSIsIDIsIDIwOCwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkFpdXRvIiwgMTAzOCwgMjA4LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiU29sbyAmTGV0dHVyYSIsIDEwNDAsIDIwOCwgNjgsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworU0FWRV9GSUxFIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjc1LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJTYWx2YSBjb24gbm9tZSAuLi4iCitGT05UIDgsICJIZWx2IgoreworIExURVhUICJGaWxlICZOb21lOiIsIDEwOTAsIDYsIDYsIDc2LCA5CisgRURJVFRFWFQgMTE1MiwgNiwgMTYsIDkwLCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBFU19PRU1DT05WRVJUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAorIExJU1RCT1ggMTEyMCwgNiwgMzIsIDkwLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImRGlyZWN0b3JpZXM6IiwgLTEsIDExMCwgNiwgOTIsIDkKKyBMVEVYVCAiIiwgMTA4OCwgMTEwLCAxOCwgOTIsIDksIFNTX05PUFJFRklYIHwgV1NfR1JPVVAKKyBMSVNUQk9YIDExMjEsIDExMCwgMzIsIDkyLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICJGaWxlcyBkaSAmVGlwbzoiLCAxMDg5LCA2LCAxMDQsIDkwLCA5CisgQ09NQk9CT1ggMTEzNiwgNiwgMTE0LCA5MCwgMzYsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImVW5pdGEnOiIsIDEwOTEsIDExMCwgMTA0LCA5MiwgOQorIENPTUJPQk9YIDExMzcsIDExMCwgMTE0LCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBERUZQVVNIQlVUVE9OICJTYXZlIEFzIiwgMSwgMjA4LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJDYW5jZWwiLCAyLCAyMDgsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZIZWxwIiwgMTAzOCwgMjA4LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiJlJlYWQgT25seSIsIDEwNDAsIDIwOCwgNjgsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworUFJJTlQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNjQsIDEzNAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIlN0YW1wYSIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIlN0YW1wYW50ZToiLCAxMDg4LCA2LCA2LCA0MCwgOQorIExURVhUICIiLCAxMDg5LCA2MCwgNiwgMTUwLCA5CisgR1JPVVBCT1ggIlBhZ2luZSBkYSBzdGFtcGFyZSIsIDEwNzIsIDYsIDMwLCAxNjAsIDY1LCBCU19HUk9VUEJPWAorIFJBRElPQlVUVE9OICImVHV0dGUiLCAxMDU2LCAxNiwgNDUsIDYwLCAxMgorIFJBRElPQlVUVE9OICJTJmVsZXppb25lIiwgMTA1NywgMTYsIDYwLCA2MCwgMTIKKyBSQURJT0JVVFRPTiAiJlBhZ2luZSIsIDEwNTgsIDE2LCA3NSwgNjAsIDEyCisgREVGUFVTSEJVVFRPTiAiU3RhbXBhIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbm51bGxhIiwgMiwgMjA2LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImQ29uZmlndXJhIiwgMTAyNCwgMjA2LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJkRhOiIsIDEwOTAsIDYwLCA4MCwgMzAsIDkKKyBMVEVYVCAiJkE6IiwgMTA5MSwgMTIwLCA4MCwgMzAsIDkKKyBMVEVYVCAiJlF1YWxpdGEnIGRpIFN0YW1wYToiLCAxMDkyLCA2LCAxMDAsIDc2LCA5CisgQ09NQk9CT1ggMTEzNiwgODAsIDEwMCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIlN0YW1wYSBzdSBGaSZsZSIsIDEwNDAsIDIwLCAxMDAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIkNvbmRlbnNhdG8iLCAxMDQxLCAxNjAsIDEwMCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCitQUklOVF9TRVRVUCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiQ29uZmlndXJhemlvbmUgU3RhbXBhbnRlIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBHUk9VUEJPWCAiU3RhbXBhbnRlIiwgMTA3MiwgNiwgMTAsIDE4MCwgNjUsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIlN0YW1wYW50ZSAmUHJlZmVyaXRhIiwgMTA1NiwgMTYsIDIwLCA4MCwgMTIKKyBMVEVYVCAiW25vbmVdIiwgMTA4OCwgMzUsIDM1LCAxMjAsIDkKKyBSQURJT0JVVFRPTiAiU3RhbXBhbnRlICZTcGVjaWZpY2EiLCAxMDU3LCAxNiwgNTAsIDgwLCAxMgorIENPTUJPQk9YIDExMzYsIDM1LCA2NSwgMTQ5LCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIk9rIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbm51bGxhIiwgMiwgMjA2LCAyNCwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImSW5zdGFsbGEiLCAxMDI0LCAyMDYsIDQ2LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIEdST1VQQk9YICJPcmllbnRhbWVudG8iLCAxMDczLCA2LCA4NSwgMTAwLCA1MCwgQlNfR1JPVVBCT1gKKyBSQURJT0JVVFRPTiAiJlZlcnRpY2FsZSIsIDEwNTgsIDUwLCAxMDAsIDQwLCAxMgorIFJBRElPQlVUVE9OICImT3JpenpvbnRhbGUiLCAxMDU5LCA1MCwgMTE1LCA0MCwgMTIKKyBJQ09OICJMQU5EU0NBUCIsIDEwOTcsIDEwLCA5NSwgMzIsIDMyCisgSUNPTiAiUE9SVFJBSVQiLCAxMDk4LCAxMCwgOTUsIDMyLCAzMgorIEdST1VQQk9YICJDYXJ0YSIsIDEwNzQsIDEyMCwgODUsIDE4MCwgNTAsIEJTX0dST1VQQk9YCisgTFRFWFQgIiZEaW1lbnNpb25lIiwgMTA4OSwgMTMwLCA5NSwgMzAsIDkKKyBMVEVYVCAiJlNvcmdlbnRlIiwgMTA5MCwgMTMwLCAxMTAsIDMwLCA5CisgQ09NQk9CT1ggMTEzNywgMTU1LCA5NSwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgQ09NQk9CT1ggMTEzOCwgMTU1LCAxMTAsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorfQorCisKK0NIT09TRV9GT05UIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJGb250IgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiRm9udDoiLCAxMDg4LCA2LCA2LCA0MCwgOQorIExURVhUICIiLCAxMDg5LCA2MCwgNiwgMTUwLCA5CisgREVGUFVTSEJVVFRPTiAiT2siLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFubnVsbGEiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK0NIT09TRV9DT0xPUiBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMjAwCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiQ29sb3JlIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiQ29sb3JpIGRpICZCYXNlOiIsIDEwODgsIDYsIDYsIDQwLCA5CisgTFRFWFQgIkNvbG9yaSAmVXRlbnRlOiIsIDEwODksIDYsIDEyNiwgNDAsIDkKKyBMVEVYVCAiQ29sb3JlfFNvbCZpZG8iLCAxMDkwLCAxMDAsIDE0NiwgNDAsIDkKKyBMVEVYVCAiJlRpbnRhOiIsIDEwOTEsIDE1MCwgMTI2LCA0MCwgOQorIExURVhUICImU2F0OiIsIDEwOTIsIDE1MCwgMTQ2LCA0MCwgOQorIExURVhUICImTHVtOiIsIDEwOTMsIDE1MCwgMTY2LCA0MCwgOQorIExURVhUICImUm9zc286IiwgMTA5NCwgMTUwLCAxMjYsIDQwLCA5CisgTFRFWFQgIiZWZXJkZToiLCAxMDk1LCAxNTAsIDE0NiwgNDAsIDkKKyBMVEVYVCAiQmwmdToiLCAxMDk2LCAxNTAsIDE2NiwgNDAsIDkKKyBERUZQVVNIQlVUVE9OICJPayIsIDEsIDYsIDE4MiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkFnZ2l1Z25pIGFpIENvbG9yaSBVdGVudGUiLCAxMDI0LCAxMjAsIDE4MiwgMTAwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkNhbmNlbGxhIENvbG9yaSBVdGVudGUiLCAxMDI1LCA2LCAxNjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQW5udWxsYSIsIDIsIDc2LCAxODIsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworRklORF9URVhUIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjM2LCA2MgorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIlRyb3ZhIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiVHJvJnZhIGNvc2E6IiwgLTEsIDQsIDgsIDQyLCA4CisgRURJVFRFWFQgMTE1MiwgNDcsIDcsIDEyOCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIiZQYXJvbGEgSW50ZXJhIiwgMTA0MCwgNCwgMjYsIDEwMCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICImTWFpdXNjb2xlL01pbnVzY29sZSIsIDEwNDEsIDQsIDQyLCA2NCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AKKyBHUk9VUEJPWCAiRGlyZXppb25lIiwgMTA3MiwgMTA3LCAyNiwgNjgsIDI4CisgQ09OVFJPTCAiJlN1IiwgMTA1NiwgIkJVVFRPTiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMTExLCAzOCwgMjAsIDEyCisgQ09OVFJPTCAiJkdpdSciLCAxMDU3LCAiQlVUVE9OIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUCwgMTM4LCAzOCwgMzAsIDEyCisgREVGUFVTSEJVVFRPTiAiJlRyb3ZhIFByb3NzaW1vIiwgMSwgMTgyLCA1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFubnVsbGEiLCAyLCAxODIsIDIzLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZBaXV0byIsIDEwMzgsIDE4MiwgNDUsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworUkVQTEFDRV9URVhUIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjMwLCA5NAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIkNhbWJpYSIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIlRybyZ2YSBjb3NhOiIsIC0xLCA0LCA5LCA0OCwgOAorIEVESVRURVhUIDExNTIsIDU0LCA3LCAxMTQsIDEyLCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICJDYSZtYmlhIGNvbjoiLCAtMSwgNCwgMjYsIDQ4LCA4CisgRURJVFRFWFQgMTE1MywgNTQsIDI0LCAxMTQsIDEyLCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICImUGFyb2xhIEludGVyYSIsIDEwNDAsIDUsIDQ2LCAxMDQsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiJk1haXVzY29sZS9NaW51c2NvbGUiLCAxMDQxLCA1LCA2MiwgNTksIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiJlRyb3ZhIFByb3NzaW1vIiwgMSwgMTc0LCA0LCA1MCwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImQ2FtYmlhIiwgMTAyNCwgMTc0LCAyMSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJDYW1iaWEgJlR1dHRvIiwgMTAyNSwgMTc0LCAzOCwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBbm51bGxhIiwgMiwgMTc0LCA1NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImQWl1dG8iLCAxMDM4LCAxNzQsIDc1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQtc3BlYy50eHQgYi90b29scy9idWlsZC1zcGVjLnR4dAppbmRleCAxNDFhMDY2Li44ODg4N2MxIDEwMDY0NAotLS0gYS90b29scy9idWlsZC1zcGVjLnR4dAorKysgYi90b29scy9idWlsZC1zcGVjLnR4dApAQCAtMSw0ICsxLDUgQEAKIG5hbWUJTkFNRQordHlwZSAgICB3aW4xNnx3aW4zMgogaWQJSURfTlVNQkVSCiAKIE9SRElOQUwgVkFSVFlQRSBFWFBPUlROQU1FIChEQVRBIFtEQVRBIFtEQVRBIFsuLi5dXV0pCkBAIC0xNiw5ICsxNywxMCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEdlbmVyYWw6CiAKLSAgICAibmFtZSIgYW5kICJpZCIgZmllbGRzIGFyZSBtYW5kYXRvcnkuICBTcGVjaWZpYyBvcmRpbmFsIGRlY2xhcmF0aW9ucwotYXJlIG9wdGlvbmFsLCBidXQgdGhlIGRlZmF1bHQgaGFuZGxlciB3aWxsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UuICBMaW5lcwotd2hvc2UgZmlyc3QgY2hhcmFjdGVyIGlzIGEgJyMnIHdpbGwgYmUgaWdub3JlZCBhcyBjb21tZW50cy4KKyAgICAibmFtZSIsICJ0eXBlIiBhbmQgImlkIiBmaWVsZHMgYXJlIG1hbmRhdG9yeS4gIFNwZWNpZmljIG9yZGluYWwKK2RlY2xhcmF0aW9ucyBhcmUgb3B0aW9uYWwsIGJ1dCB0aGUgZGVmYXVsdCBoYW5kbGVyIHdpbGwgcHJpbnQgYW4gZXJyb3IKK21lc3NhZ2UuICBMaW5lcyB3aG9zZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSAnIycgd2lsbCBiZSBpZ25vcmVkIGFzCitjb21tZW50cy4KIAogVmFyaWFibGUgb3JkaW5hbHM6CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IDkzOGY5OWYuLjA0ZjdhNjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgIndpbmUuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIiAgLyogZm9yIEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEICovCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAibmVleGUuaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC0zMSwxMiArMzIsMTkgQEAKICNkZWZpbmUgVFlQRV9SRVRVUk4gICAgICA4CiAjZGVmaW5lIFRZUEVfU1RVQiAgICAgICAgOQogI2RlZmluZSBUWVBFX1NURENBTEwgICAgMTAKLSNkZWZpbmUgVFlQRV9DREVDTAkxMQogCiAjZGVmaW5lIE1BWF9PUkRJTkFMUwkxMjk5CiAKICAgLyogQ2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBmb3Igc3R1YiBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgU1RVQl9DQUxMQkFDSyAgIlJFTEFZX1VuaW1wbGVtZW50ZWQiCisjZGVmaW5lIFNUVUJfQ0FMTEJBQ0sgXAorICAoKFNwZWNUeXBlID09IFNQRUNfV0lOMTYpID8gIlJFTEFZX1VuaW1wbGVtZW50ZWQxNiI6ICJSRUxBWV9VbmltcGxlbWVudGVkMzIiKQorCitlbnVtIFNQRUNfVFlQRQoreworICAgIFNQRUNfSU5WQUxJRCwKKyAgICBTUEVDX1dJTjE2LAorICAgIFNQRUNfV0lOMzIKK307CiAKIHR5cGVkZWYgc3RydWN0IG9yZGluYWxfZGVmaW5pdGlvbl9zCiB7CkBAIC02Nyw4ICs3NSw4IEBACiAKIHN0YXRpYyBPUkRERUYgT3JkaW5hbERlZmluaXRpb25zW01BWF9PUkRJTkFMU107CiAKLWNoYXIgTG93ZXJETExOYW1lWzgwXTsKLWNoYXIgVXBwZXJETExOYW1lWzgwXTsKK3N0YXRpYyBlbnVtIFNQRUNfVFlQRSBTcGVjVHlwZSA9IFNQRUNfSU5WQUxJRDsKK2NoYXIgRExMTmFtZVs4MF07CiBpbnQgTGltaXQgPSAwOwogaW50IERMTElkOwogaW50IEJhc2UgPSAwOwpAQCAtMTMyLDE2ICsxNDAsNiBAQAogICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgY2hhciAqc3RybG93ZXIoY2hhciAqcykKLXsKLSAgICBjaGFyICpwOwotICAgIAotICAgIGZvcihwID0gczsgKnAgIT0gJ1wwJzsgcCsrKQotCSpwID0gdG9sb3dlcigqcCk7Ci0KLSAgICByZXR1cm4gczsKLX0KLQogc3RhdGljIGNoYXIgKnN0cnVwcGVyKGNoYXIgKnMpCiB7CiAgICAgY2hhciAqcDsKQEAgLTMyNiw4ICszMjQsNiBAQAogICAgICAgICAgICAgZmRwLT5hcmdfdHlwZXNbaV0gPSAnbCc7CiAJZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgInB0ciIpKQogICAgICAgICAgICAgZmRwLT5hcmdfdHlwZXNbaV0gPSAncCc7Ci0JZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgIi4uLiIpKQotICAgICAgICAgICAgZmRwLT5hcmdfdHlwZXNbaV0gPSAnLic7CiAJZWxzZQogCXsKIAkgICAgZnByaW50ZihzdGRlcnIsICIlZDogVW5rbm93biB2YXJpYWJsZSB0eXBlICclcydcbiIsIExpbmUsIHRva2VuKTsKQEAgLTQ1MSw4ICs0NDcsNiBAQAogICAgICAgICByZXR1cm4gUGFyc2VFeHBvcnRGdW5jdGlvbihvcmRpbmFsLCBUWVBFX1JFR0lTVEVSKTsKICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJzdGRjYWxsIikgPT0gMCkKICAgICAgICAgcmV0dXJuIFBhcnNlRXhwb3J0RnVuY3Rpb24ob3JkaW5hbCwgVFlQRV9TVERDQUxMKTsKLSAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJjZGVjbCIpID09IDApCi0gICAgICAgIHJldHVybiBQYXJzZUV4cG9ydEZ1bmN0aW9uKG9yZGluYWwsIFRZUEVfQ0RFQ0wpOwogICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgImVxdWF0ZSIpID09IDApCiAJcmV0dXJuIFBhcnNlRXF1YXRlKG9yZGluYWwpOwogICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgInJldHVybiIpID09IDApCkBAIC00NzYsMTIgKzQ3MCwyMCBAQAogICAgIHsKIAlpZiAoc3RyY21wKHRva2VuLCAibmFtZSIpID09IDApCiAJewotCSAgICBzdHJjcHkoTG93ZXJETExOYW1lLCBHZXRUb2tlbigpKTsKLQkgICAgc3RybG93ZXIoTG93ZXJETExOYW1lKTsKLQotCSAgICBzdHJjcHkoVXBwZXJETExOYW1lLCBMb3dlckRMTE5hbWUpOwotCSAgICBzdHJ1cHBlcihVcHBlckRMTE5hbWUpOworCSAgICBzdHJjcHkoRExMTmFtZSwgR2V0VG9rZW4oKSk7CisJICAgIHN0cnVwcGVyKERMTE5hbWUpOwogCX0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAidHlwZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRva2VuID0gR2V0VG9rZW4oKTsKKyAgICAgICAgICAgIGlmICghc3RyY21wKHRva2VuLCAid2luMTYiICkpIFNwZWNUeXBlID0gU1BFQ19XSU4xNjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sICJ3aW4zMiIgKSkgU3BlY1R5cGUgPSBTUEVDX1dJTjMyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQ6IFR5cGUgbXVzdCBiZSAnd2luMTYnIG9yICd3aW4zMidcbiIsIExpbmUpOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAllbHNlIGlmIChzdHJjbXAodG9rZW4sICJpZCIpID09IDApCiAJewogCSAgICB0b2tlbiA9IEdldFRva2VuKCk7CkBAIC02MTEsOCArNjEzLDggQEAKICAgICBwTW9kdWxlLT5maWxlaW5mbyA9IChpbnQpcEZpbGVJbmZvIC0gKGludClwTW9kdWxlOwogICAgIG1lbXNldCggcEZpbGVJbmZvLCAwLCBzaXplb2YoKnBGaWxlSW5mbykgLSBzaXplb2YocEZpbGVJbmZvLT5zelBhdGhOYW1lKSApOwogICAgIHBGaWxlSW5mby0+Y0J5dGVzID0gc2l6ZW9mKCpwRmlsZUluZm8pIC0gc2l6ZW9mKHBGaWxlSW5mby0+c3pQYXRoTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuKFVwcGVyRExMTmFtZSkgKyA0OwotICAgIHNwcmludGYoIHBGaWxlSW5mby0+c3pQYXRoTmFtZSwgIiVzLkRMTCIsIFVwcGVyRExMTmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4oRExMTmFtZSkgKyA0OworICAgIHNwcmludGYoIHBGaWxlSW5mby0+c3pQYXRoTmFtZSwgIiVzLkRMTCIsIERMTE5hbWUgKTsKICAgICBwc3RyID0gKGNoYXIgKilwRmlsZUluZm8gKyBwRmlsZUluZm8tPmNCeXRlcyArIDE7CiAgICAgICAgIAogICAgICAgLyogU2VnbWVudCB0YWJsZSAqLwpAQCAtNjUyLDggKzY1NCw4IEBACiAKICAgICBwTW9kdWxlLT5uYW1lX3RhYmxlID0gKGludClwc3RyIC0gKGludClwTW9kdWxlOwogICAgIC8qIEZpcnN0IGVudHJ5IGlzIG1vZHVsZSBuYW1lICovCi0gICAgKnBzdHIgPSBzdHJsZW4oVXBwZXJETExOYW1lICk7Ci0gICAgc3RyY3B5KCBwc3RyICsgMSwgVXBwZXJETExOYW1lICk7CisgICAgKnBzdHIgPSBzdHJsZW4oRExMTmFtZSApOworICAgIHN0cmNweSggcHN0ciArIDEsIERMTE5hbWUgKTsKICAgICBwc3RyICs9ICpwc3RyICsgMTsKICAgICAqKFdPUkQgKilwc3RyID0gMDsKICAgICBwc3RyICs9IHNpemVvZihXT1JEKTsKQEAgLTcyNyw4ICs3MjksOCBAQAogICAgICAgLyogRHVtcCB0aGUgbW9kdWxlIGNvbnRlbnQgKi8KIAogICAgIHByaW50ZiggIlx0LmRhdGFcbiIgKTsKLSAgICBwcmludGYoICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfTW9kdWxlX1N0YXJ0XG4iLCBVcHBlckRMTE5hbWUgKTsKLSAgICBwcmludGYoIFBSRUZJWCAiJXNfTW9kdWxlX1N0YXJ0OlxuIiwgVXBwZXJETExOYW1lICk7CisgICAgcHJpbnRmKCAiXHQuZ2xvYmwgIiBQUkVGSVggIiVzX01vZHVsZV9TdGFydFxuIiwgRExMTmFtZSApOworICAgIHByaW50ZiggUFJFRklYICIlc19Nb2R1bGVfU3RhcnQ6XG4iLCBETExOYW1lICk7CiAgICAgc2l6ZSA9IChpbnQpcHN0ciAtIChpbnQpcE1vZHVsZTsKICAgICBmb3IgKGkgPSAwLCBwc3RyID0gYnVmZmVyOyBpIDwgc2l6ZTsgaSsrLCBwc3RyKyspCiAgICAgewpAQCAtNzM2LDE5NCArNzM4LDExMyBAQAogICAgICAgICBwcmludGYoICIlZCVjIiwgKnBzdHIsICgoaSAmIDcpICE9IDcpID8gJywnIDogJ1xuJyApOwogICAgIH0KICAgICBpZiAoaSAmIDcpIHByaW50ZiggIjBcbiIgKTsKLSAgICBwcmludGYoICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfTW9kdWxlX0VuZFxuIiwgVXBwZXJETExOYW1lICk7Ci0gICAgcHJpbnRmKCBQUkVGSVggIiVzX01vZHVsZV9FbmQ6XG4iLCBVcHBlckRMTE5hbWUgKTsKKyAgICBwcmludGYoICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfTW9kdWxlX0VuZFxuIiwgRExMTmFtZSApOworICAgIHByaW50ZiggUFJFRklYICIlc19Nb2R1bGVfRW5kOlxuIiwgRExMTmFtZSApOwogfQogCiAKLXN0YXRpYyB2b2lkIEJ1aWxkU3BlYzMyRmlsZXMoIGNoYXIgKnNwZWNuYW1lICkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEJ1aWxkU3BlYzMyRmlsZXMKKyAqCisgKiBCdWlsZCBhIFdpbjMyIGFzc2VtYmx5IGZpbGUgZnJvbSBhIHNwZWMgZmlsZS4KKyAqLworc3RhdGljIHZvaWQgQnVpbGRTcGVjMzJGaWxlcyh2b2lkKQogewogICAgIE9SRERFRiAqb2RwOwogICAgIE9SREZVTkNERUYgKmZkcDsKICAgICBPUkRSRVRERUYgKnJkcDsKICAgICBpbnQgaTsKLSAgICBpbnQgdmFyYXJnczsKIAotICAgIFNwZWNGcCA9IGZvcGVuKCBzcGVjbmFtZSwgInIiKTsKLSAgICBpZiAoU3BlY0ZwID09IE5VTEwpCi0gICAgewotCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gc3BlY2lmaWNhdGlvbiBmaWxlLCAnJXMnXG4iLCBzcGVjbmFtZSk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBQYXJzZVRvcExldmVsKCk7Ci0KLSAgICBwcmludGYoICIvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LCBkbyBub3QgZWRpdCEgKi9cbiIgKTsKLSAgICBwcmludGYoICIjaW5jbHVkZSA8c3lzL3R5cGVzLmg+XG4iKTsKLSAgICBwcmludGYoICIjaW5jbHVkZSA8c3RkYXJnLmg+XG4iKTsKLSAgICBwcmludGYoICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiXG4iKTsKLSAgICBwcmludGYoICIjaW5jbHVkZSBcImRsbHMuaFwiXG4iKTsKLSAgICBwcmludGYoICIjaW5jbHVkZSBcInBlX2ltYWdlLmhcIlxuIik7Ci0gICAgcHJpbnRmKCAiI2luY2x1ZGUgXCJ3aW5lcnJvci5oXCJcbiIpOwotICAgIHByaW50ZiggIiNpbmNsdWRlIFwicmVsYXkzMi5oXCJcbiIpOwotICAgIHByaW50ZiggIiNpbmNsdWRlIFwic3RkZGVidWcuaFwiXG4iKTsKLSAgICBwcmludGYoICIjaW5jbHVkZSBcImRlYnVnLmhcIlxuIik7CisgICAgcHJpbnRmKCAiLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseTsgZG8gbm90IGVkaXQhICovXG4iICk7CisgICAgcHJpbnRmKCAiXHQudGV4dFxuIiApOworICAgIHByaW50ZiggIlx0Lmdsb2JsICIgUFJFRklYICIlc19Db2RlX1N0YXJ0XG4iLCBETExOYW1lICk7CisgICAgcHJpbnRmKCBQUkVGSVggIiVzX0NvZGVfU3RhcnQ6XG5cbiIsIERMTE5hbWUgKTsKIAogICAgIG9kcCA9IE9yZGluYWxEZWZpbml0aW9uczsKICAgICBmb3IgKGkgPSAwOyBpIDw9IExpbWl0OyBpKyssIG9kcCsrKQogICAgIHsKLSAgICAgICAgaW50IGFyZ25vLGFyZ2M7CiAgICAgICAgIGZkcCA9IG9kcC0+YWRkaXRpb25hbF9kYXRhOwogICAgICAgICByZHAgPSBvZHAtPmFkZGl0aW9uYWxfZGF0YTsKIAogICAgICAgICBzd2l0Y2ggKG9kcC0+dHlwZSkKICAgICAgICAgewogICAgICAgICBjYXNlIFRZUEVfSU5WQUxJRDoKLSAgICAgICAgY2FzZSBUWVBFX1NUVUI6Ci0gICAgICAgICAgICBwcmludGYoICJpbnQgJXNfJWQoKVxue1xuXHQiLCBVcHBlckRMTE5hbWUsIGkpOwotICAgICAgICAgICAgcHJpbnRmKCAiUkVMQVkzMl9VbmltcGxlbWVudGVkKFwiJXNcIiwlZCk7XG4iLCBVcHBlckRMTE5hbWUsIGkpOwotICAgICAgICAgICAgcHJpbnRmKCAiXHQvKk5PVFJFQUNIRUQqL1xuXHRyZXR1cm4gMDtcbn1cblxuIik7CisgICAgICAgICAgICBwcmludGYoICIvKiAlcy4lZCAqL1xuIiwgRExMTmFtZSwgaSApOworICAgICAgICAgICAgcHJpbnRmKCAiXHQuYWxpZ24gNFxuIiApOworICAgICAgICAgICAgcHJpbnRmKCAiJXNfJWQ6XG4iLCBETExOYW1lLCBpICk7CisgICAgICAgICAgICBwcmludGYoICJcdHB1c2hsICUlZWJwXG4iICk7CisgICAgICAgICAgICBwcmludGYoICJcdHB1c2hsICQlc18lZF9OYW1lXG4iLCBETExOYW1lLCBpICk7CisgICAgICAgICAgICBwcmludGYoICJcdHB1c2hsICQiIFBSRUZJWCAiJXNcbiIsIFNUVUJfQ0FMTEJBQ0sgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0am1wICIgUFJFRklYICJTdGRjYWxsXzBcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiVzXyVkX05hbWU6XG4iLCBETExOYW1lLCBpICk7CisgICAgICAgICAgICBwcmludGYoICJcdC5hc2NpaSBcIiVzXyVkXFwwXCJcbiIsIERMTE5hbWUsIGkgKTsKICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgVFlQRV9TVERDQUxMOgotICAgICAgICBjYXNlIFRZUEVfQ0RFQ0w6Ci0JICAgIHZhcmFyZ3M9MDsKLSAgICAgICAgICAgIGFyZ2M9c3RybGVuKGZkcC0+YXJnX3R5cGVzKTsKLSNpZiAwCi0JICAgIGlmKG9kcC0+dHlwZSA9PSBUWVBFX1NURENBTEwpCi0JICAgIHsKLQkJLyogT3V0cHV0IGEgZnVuY3Rpb24gcHJvdG90eXBlIHdpdGggc3RkY2FsbCBhdHRyaWJ1dGUgKi8KLQkJcHJpbnRmKCAidm9pZCAlc18lZCgiLCBVcHBlckRMTE5hbWUsIGkpOwotCQlmb3IoYXJnbm89MDthcmdubzxhcmdjO2FyZ25vKyspCi0JCXsKLQkJICAgIHN3aXRjaChmZHAtPmFyZ190eXBlc1thcmdub10pCi0JCSAgICB7Ci0JCSAgICBjYXNlICdwJzogcHJpbnRmKCAidm9pZCAqIik7YnJlYWs7Ci0JCSAgICBjYXNlICdsJzogcHJpbnRmKCAiaW50ICIpO2JyZWFrOwotCQkgICAgY2FzZSAnLic6IHByaW50ZiggIi4uLiAiKTt2YXJhcmdzPWFyZ25vO2JyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJCWZwcmludGYoc3RkZXJyLCAiTm90IHN1cHBvcnRlZCBhcmd1bWVudCB0eXBlICVjXG4iLAotCQkJCWZkcC0+YXJnX3R5cGVzW2FyZ25vXSk7Ci0JCQlleGl0KDEpOwotCQkgICAgfQotCQkgICAgaWYoZmRwLT5hcmdfdHlwZXNbYXJnbm9dIT0nLicpIHB1dGNoYXIoICdhJythcmdubyApOwotCQkgICAgaWYgKGFyZ25vIT1hcmdjLTEpIHB1dGNoYXIoICcsJyApOwotCQl9Ci0JCXByaW50ZiggIikgX19hdHRyaWJ1dGUoKHN0ZGNhbGwpKTtcbiIgKTsKLQkgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBwcmludGYoICJ2b2lkICVzXyVkKCIsIFVwcGVyRExMTmFtZSwgaSk7Ci0gICAgICAgICAgICBmb3IoYXJnbm89MDthcmdubzxhcmdjO2FyZ25vKyspCi0gICAgICAgICAgICB7Ci0JICAgICAgaWYob2RwLT50eXBlID09IFRZUEVfU1REQ0FMTCkgewotICAgICAgICAgICAgICAgIHN3aXRjaChmZHAtPmFyZ190eXBlc1thcmdub10pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgJ3AnOiBwcmludGYoICJ2b2lkICoiKTticmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdsJzogcHJpbnRmKCAiaW50ICIpO2JyZWFrOwotCQlkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdCBzdXBwb3J0ZWQgYXJndW1lbnQgdHlwZSAlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHAtPmFyZ190eXBlc1thcmdub10pOwotICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgICAgIH0KLQkgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN3aXRjaChmZHAtPmFyZ190eXBlc1thcmdub10pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgJ3AnOiBwcmludGYoICJ2b2lkICoiKTticmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdsJzogcHJpbnRmKCAiaW50ICIpO2JyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJy4nOiBwcmludGYoICIuLi4gIik7dmFyYXJncz1hcmdubzticmVhazsKLQkJZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJOb3Qgc3VwcG9ydGVkIGFyZ3VtZW50IHR5cGUgJWNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5hcmdfdHlwZXNbYXJnbm9dKTsKLSAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgfQotICAgICAgICAgICAgICBpZihmZHAtPmFyZ190eXBlc1thcmdub10hPScuJykgcHV0Y2hhciggJ2EnK2FyZ25vICk7Ci0gICAgICAgICAgICAgIGlmIChhcmdubyE9YXJnYy0xKSBwdXRjaGFyKCAnLCcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50ZiggIikiICk7Ci0gICAgICAgICAgICBwcmludGYoICJcbntcbiIgKTsKLQkgICAgaWYgKHZhcmFyZ3MpIHByaW50ZiggIlx0dmFfbGlzdCB2YWxpc3Q7XG5cblx0dmFfc3RhcnQodmFsaXN0LCAlYyk7IiwKLQkgICAgCQkJICdhJyt2YXJhcmdzLTEgKTsKLSAgICAgICAgICAgIHByaW50ZiggIlx0ZHByaW50Zl9yZWxheShzdGRkZWIsXCJDYWxsICUlcy4lJXMoIik7Ci0gICAgICAgICAgICBmb3IgKGFyZ25vPTA7YXJnbm88YXJnYzthcmdubysrKQotICAgICAgICAgICAgICBpZihmZHAtPmFyZ190eXBlc1thcmdub10hPScuJykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1dGNoYXIoICclJyApOwotICAgICAgICAgICAgICAgIHB1dGNoYXIoIChmZHAtPmFyZ190eXBlc1thcmdub10gPT0gJ3AnKSA/ICdwJyA6ICd4JyApOwotICAgICAgICAgICAgICAgIGlmIChhcmdubyA8IGFyZ2MtMSkgcHV0Y2hhciggJywnICk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50ZiggIilcXG5cIiwgXCIlc1wiLCBcIiVzXCIiLCBVcHBlckRMTE5hbWUsIG9kcC0+ZXhwb3J0X25hbWUpOwotICAgICAgICAgICAgZm9yKGFyZ25vPTA7YXJnbm88YXJnYzthcmdubysrKSAKLQkgICAgICAgIGlmKGZkcC0+YXJnX3R5cGVzW2FyZ25vXSE9Jy4nKSBwcmludGYoICIsJWMiLCAnYScrYXJnbm8pOwotICAgICAgICAgICAgcHJpbnRmKCAiKTtcblx0JXMoIiwgZmRwLT5pbnRlcm5hbF9uYW1lICk7Ci0gICAgICAgICAgICBmb3IoYXJnbm89MDthcmdubzxhcmdjO2FyZ25vKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZkcC0+YXJnX3R5cGVzW2FyZ25vXT09Jy4nKSBwcmludGYoInZhbGlzdCIpOwotCQllbHNlIHB1dGNoYXIoJ2EnK2FyZ25vKTsKLSAgICAgICAgICAgICAgICBpZiAoYXJnbm8hPWFyZ2MtMSkgcHV0Y2hhcignLCcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRmKCAiKTtcbiIpOwotCSAgICBpZihvZHAtPnR5cGUgPT0gVFlQRV9TVERDQUxMKSB7Ci0JICAgIAlwcmludGYoICJcdF9fYXNtX18gX192b2xhdGlsZV9fIChcIm1vdmwgJSVlYnAsJSVlc3BcIik7XG4iKTsKLQkgICAgCXByaW50ZiggIlx0X19hc21fXyBfX3ZvbGF0aWxlX18gKFwicG9wbCAlJWVicFwiKTtcbiIpOwotCSAgICAJcHJpbnRmKCAiXHRfX2FzbV9fIF9fdm9sYXRpbGVfXyAoXCJhZGRsICQlZCwlJWVzcFwiKTtcbiIsIGFyZ2MqNCs0KTsKLQkgICAgCXByaW50ZiggIlx0X19hc21fXyBfX3ZvbGF0aWxlX18gKFwiam1wIC0lZCglJWVzcClcIik7XG4iLCBhcmdjKjQrNCk7Ci0JICAgIH0KLQkgICAgcHJpbnRmKCAifVxuXG4iKTsKKyAgICAgICAgY2FzZSBUWVBFX1NUVUI6CisgICAgICAgICAgICBwcmludGYoICIvKiAlcy4lZCAoJXMpICovXG4iLAorICAgICAgICAgICAgICAgICAgICAgRExMTmFtZSwgaSwgb2RwLT5leHBvcnRfbmFtZSk7CisgICAgICAgICAgICBwcmludGYoICJcdC5hbGlnbiA0XG4iICk7CisgICAgICAgICAgICBwcmludGYoICIlc18lZDpcbiIsIERMTE5hbWUsIGkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0cHVzaGwgJSVlYnBcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0cHVzaGwgJCVzXyVkX05hbWVcbiIsIERMTE5hbWUsIGkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0cHVzaGwgJCIgUFJFRklYICIlc1xuIiwgZmRwLT5pbnRlcm5hbF9uYW1lICk7CisgICAgICAgICAgICBwcmludGYoICJcdGptcCAiIFBSRUZJWCAiU3RkY2FsbF8lZFxuIiwgc3RybGVuKGZkcC0+YXJnX3R5cGVzKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJXNfJWRfTmFtZTpcbiIsIERMTE5hbWUsIGkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0LmFzY2lpIFwiJXNcXDBcIlxuIiwgb2RwLT5leHBvcnRfbmFtZSApOwogICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgY2FzZSBUWVBFX1JFVFVSTjoKLSAgICAgICAgICAgIHByaW50ZiggInZvaWQgJXNfJWQoKVxue1xuXHQiLCBVcHBlckRMTE5hbWUsIGkpOwotICAgICAgICAgICAgcHJpbnRmKCAiUkVMQVkzMl9EZWJ1Z0VudGVyKFwiJXNcIixcIiVzXCIpO1xuXHQiLAotICAgICAgICAgICAgICAgICAgIFVwcGVyRExMTmFtZSwgb2RwLT5leHBvcnRfbmFtZSk7Ci0gICAgICAgICAgICBwcmludGYoICJXSU4zMl9MYXN0RXJyb3I9RVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQ7XG4iKTsKLSAgICAgICAgICAgIHByaW50ZiggIlx0X19hc21fXyBfX3ZvbGF0aWxlX18gKFwibW92bCAkJWQsJSVlYXhcIik7XG4iLCAKLSAgICAgICAgICAgICAgICAgICByZHAtPnJldF92YWx1ZSk7Ci0gICAgICAgICAgICBwcmludGYoICJcdF9fYXNtX18gX192b2xhdGlsZV9fIChcIm1vdmwgJSVlYnAsJSVlc3A7cG9wbCAlJWVicDsiCi0gICAgICAgICAgICAgICAgICAgICJyZXQgJCVkXCIpO1xufVxuXG4iLCByZHAtPmFyZ19zaXplKTsKKyAgICAgICAgICAgIHByaW50ZiggIi8qICVzLiVkICglcykgKi9cbiIsCisgICAgICAgICAgICAgICAgICAgICBETExOYW1lLCBpLCBvZHAtPmV4cG9ydF9uYW1lKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0LmFsaWduIDRcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiVzXyVkOlxuIiwgRExMTmFtZSwgaSApOworICAgICAgICAgICAgcHJpbnRmKCAiXHRtb3ZsICQlZCwlJWVheFxuIiwgRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0bW92bCAlJWVheCwiIFBSRUZJWCAiV0lOMzJfTGFzdEVycm9yXG4iICk7CisgICAgICAgICAgICBwcmludGYoICJcdG1vdmwgJCVkLCUlZWF4XG4iLCByZHAtPnJldF92YWx1ZSApOworICAgICAgICAgICAgaWYgKHJkcC0+YXJnX3NpemUpIHByaW50ZiggIlx0cmV0ICQlZFxuIiwgcmRwLT5hcmdfc2l6ZSApOworICAgICAgICAgICAgZWxzZSBwcmludGYoICJcdHJldFxuIiApOworICAgICAgICAgICAgcHJpbnRmKCAiJXNfJWRfTmFtZTpcbiIsIERMTE5hbWUsIGkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0LmFzY2lpIFwiJXNcXDBcIlxuIiwgb2RwLT5leHBvcnRfbmFtZSApOwogICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJidWlsZDogZnVuY3Rpb24gdHlwZSAlZCBub3QgYXZhaWxhYmxlIGZvciBXaW4zMlxuIiwKICAgICAgICAgICAgICAgICAgICAgb2RwLT50eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpbnRmKCAic3RhdGljIFdJTjMyX2Z1bmN0aW9uIGZ1bmN0aW9uc1slZCsxXT17XG4iLCBMaW1pdCk7Ci0KLSAgICBvZHAgPSBPcmRpbmFsRGVmaW5pdGlvbnM7Ci0gICAgZm9yIChpID0gMDsgaSA8PSBMaW1pdDsgaSsrLCBvZHArKykKLSAgICB7Ci0gICAgICAgIGZkcCA9IG9kcC0+YWRkaXRpb25hbF9kYXRhOwotICAgICAgICByZHAgPSBvZHAtPmFkZGl0aW9uYWxfZGF0YTsKLQotICAgICAgICBzd2l0Y2ggKG9kcC0+dHlwZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIFRZUEVfSU5WQUxJRDoKLSAgICAgICAgICAgIHByaW50ZiggInswLCVzXyVkfSxcbiIsVXBwZXJETExOYW1lLCBpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRZUEVfUkVUVVJOOgotICAgICAgICBjYXNlIFRZUEVfU1REQ0FMTDoKLSAgICAgICAgY2FzZSBUWVBFX0NERUNMOgotICAgICAgICBjYXNlIFRZUEVfU1RVQjoKLSAgICAgICAgICAgIHByaW50ZiggIntcIiVzXCIsJXNfJWR9LFxuIiwgb2RwLT5leHBvcnRfbmFtZSwgVXBwZXJETExOYW1lLCBpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJidWlsZDogaW1wbGVtZW50YXRpb24gZXJyb3I6IG1pc3NpbmcgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIG9kcC0+dHlwZSk7CiAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICB9CiAgICAgfQotICAgIHByaW50ZigifTtcblxuIik7CiAKLSAgICBwcmludGYoICJzdGF0aWMgV0lOMzJfYnVpbHRpbiBkbGw9e1wiJXNcIixmdW5jdGlvbnMsJWQsJWQsMH07XG4iLAotICAgICAgICAgICAgVXBwZXJETExOYW1lLCBMaW1pdCsxLCBCYXNlKTsKKyAgICBwcmludGYoICJcbi8qIEZ1bmN0aW9uIHRhYmxlICovXG4iICk7CisgICAgcHJpbnRmKCAiXHQuZ2xvYmwgIiBQUkVGSVggIiVzX01vZHVsZV9TdGFydFxuIiwgRExMTmFtZSApOworICAgIHByaW50ZiggUFJFRklYICIlc19Nb2R1bGVfU3RhcnQ6XG4iLCBETExOYW1lICk7CiAKLSAgICBwcmludGYoICJ2b2lkICVzX0luaXQodm9pZClcbntcbiIsVXBwZXJETExOYW1lKTsKLSAgICBwcmludGYoICJcdGRsbC5uZXh0PVdJTjMyX2J1aWx0aW5fbGlzdDtcbiIpOwotICAgIHByaW50ZiggIlx0V0lOMzJfYnVpbHRpbl9saXN0PSZkbGw7XG5cdFJFTEFZMzJfTWFrZUZha2VNb2R1bGUoJmRsbCk7XG59Iik7CisgICAgb2RwID0gT3JkaW5hbERlZmluaXRpb25zOworICAgIGZvciAoaSA9IDA7IGkgPD0gTGltaXQ7IGkrKywgb2RwKyspCisgICAgeworICAgICAgICBpZiAob2RwLT50eXBlID09IFRZUEVfSU5WQUxJRCkKKyAgICAgICAgICAgIHByaW50ZiggIlx0LmxvbmcgMCwlc18lZFxuIiwgRExMTmFtZSwgaSApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoICJcdC5sb25nICVzXyVkX05hbWUsJXNfJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIERMTE5hbWUsIGksIERMTE5hbWUsIGkgKTsKKyAgICB9CisKKyAgICBwcmludGYoICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfTW9kdWxlX0VuZFxuIiwgRExMTmFtZSApOworICAgIHByaW50ZiggUFJFRklYICIlc19Nb2R1bGVfRW5kOlxuIiwgRExMTmFtZSApOworICAgIHByaW50ZiggIlx0LmxvbmcgMCwwXG4iICk7CisKKyAgICBwcmludGYoICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfRGF0YV9TdGFydFxuIiwgRExMTmFtZSApOworICAgIHByaW50ZiggUFJFRklYICIlc19EYXRhX1N0YXJ0OlxuIiwgRExMTmFtZSApOworICAgIHByaW50ZiggIlx0LmxvbmcgJWRcbiIsIEJhc2UgKTsKIH0KIAogCi1zdGF0aWMgdm9pZCBCdWlsZFNwZWMxNkZpbGVzKCBjaGFyICpzcGVjbmFtZSApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBCdWlsZFNwZWMxNkZpbGVzCisgKgorICogQnVpbGQgYSBXaW4xNiBhc3NlbWJseSBmaWxlIGZyb20gYSBzcGVjIGZpbGUuCisgKi8KK3N0YXRpYyB2b2lkIEJ1aWxkU3BlYzE2RmlsZXModm9pZCkKIHsKICAgICBPUkRERUYgKm9kcDsKICAgICBPUkRGVU5DREVGICpmZHA7CkBAIC05MzEsMTkgKzg1MiwxMCBAQAogICAgIGludCBpOwogICAgIGludCBjb2RlX29mZnNldCwgZGF0YV9vZmZzZXQ7CiAKLSAgICBTcGVjRnAgPSBmb3Blbiggc3BlY25hbWUsICJyIik7Ci0gICAgaWYgKFNwZWNGcCA9PSBOVUxMKQotICAgIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHNwZWNpZmljYXRpb24gZmlsZSwgJyVzJ1xuIiwgc3BlY25hbWUpOwotCWV4aXQoMSk7Ci0gICAgfQotCi0gICAgUGFyc2VUb3BMZXZlbCgpOwotCiAgICAgcHJpbnRmKCAiLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseTsgZG8gbm90IGVkaXQhICovXG4iICk7CiAgICAgcHJpbnRmKCAiXHQuZGF0YVxuIiApOwotICAgIHByaW50ZiggIlx0Lmdsb2JsICIgUFJFRklYICIlc19EYXRhX1N0YXJ0XG4iLCBVcHBlckRMTE5hbWUgKTsKLSAgICBwcmludGYoIFBSRUZJWCAiJXNfRGF0YV9TdGFydDpcbiIsIFVwcGVyRExMTmFtZSApOworICAgIHByaW50ZiggIlx0Lmdsb2JsICIgUFJFRklYICIlc19EYXRhX1N0YXJ0XG4iLCBETExOYW1lICk7CisgICAgcHJpbnRmKCBQUkVGSVggIiVzX0RhdGFfU3RhcnQ6XG4iLCBETExOYW1lICk7CiAjaWZkZWYgX19zdnI0X18KICAgICBwcmludGYoICJcdC40Ynl0ZSAwLDAsMCwwLDAsMCwwLDBcbiIgKTsKICNlbHNlCkBAIC05NTEsOCArODYzLDggQEAKICNlbmRpZgogICAgIGRhdGFfb2Zmc2V0ID0gMTY7CiAgICAgcHJpbnRmKCAiXHQudGV4dFxuIiApOwotICAgIHByaW50ZiggIlx0Lmdsb2JsICIgUFJFRklYICIlc19Db2RlX1N0YXJ0XG4iLCBVcHBlckRMTE5hbWUgKTsKLSAgICBwcmludGYoIFBSRUZJWCAiJXNfQ29kZV9TdGFydDpcbiIsIFVwcGVyRExMTmFtZSApOworICAgIHByaW50ZiggIlx0Lmdsb2JsICIgUFJFRklYICIlc19Db2RlX1N0YXJ0XG4iLCBETExOYW1lICk7CisgICAgcHJpbnRmKCBQUkVGSVggIiVzX0NvZGVfU3RhcnQ6XG4iLCBETExOYW1lICk7CiAgICAgY29kZV9vZmZzZXQgPSAwOwogCiAgICAgb2RwID0gT3JkaW5hbERlZmluaXRpb25zOwpAQCAtOTcyLDEzICs4ODQsMTMgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgY2FzZSBUWVBFX0JZVEU6Ci0gICAgICAgICAgICBwcmludGYoICIvKiAlcy4lZCAqL1xuIiwgVXBwZXJETExOYW1lLCBpKTsKKyAgICAgICAgICAgIHByaW50ZiggIi8qICVzLiVkICovXG4iLCBETExOYW1lLCBpKTsKICAgICAgICAgICAgIG9kcC0+b2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBPdXRwdXRWYXJpYWJsZUNvZGUoICIuYnl0ZSIsIG9kcCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgIGNhc2UgVFlQRV9XT1JEOgotICAgICAgICAgICAgcHJpbnRmKCAiLyogJXMuJWQgKi9cbiIsIFVwcGVyRExMTmFtZSwgaSk7CisgICAgICAgICAgICBwcmludGYoICIvKiAlcy4lZCAqL1xuIiwgRExMTmFtZSwgaSk7CiAgICAgICAgICAgICBvZHAtPm9mZnNldCA9IGRhdGFfb2Zmc2V0OwogI2lmZGVmIF9fc3ZyNF9fCiAgICAgICAgICAgICBkYXRhX29mZnNldCArPSAyICogT3V0cHV0VmFyaWFibGVDb2RlKCAiLjRieXRlIiwgb2RwKTsKQEAgLTk4OCwxMyArOTAwLDEzIEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgIGNhc2UgVFlQRV9MT05HOgotICAgICAgICAgICAgcHJpbnRmKCAiLyogJXMuJWQgKi9cbiIsIFVwcGVyRExMTmFtZSwgaSk7CisgICAgICAgICAgICBwcmludGYoICIvKiAlcy4lZCAqL1xuIiwgRExMTmFtZSwgaSk7CiAgICAgICAgICAgICBvZHAtPm9mZnNldCA9IGRhdGFfb2Zmc2V0OwogICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gNCAqIE91dHB1dFZhcmlhYmxlQ29kZSggIi5sb25nIiwgb2RwKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgY2FzZSBUWVBFX1JFVFVSTjoKLSAgICAgICAgICAgIHByaW50ZiggIi8qICVzLiVkICovXG4iLCBVcHBlckRMTE5hbWUsIGkpOworICAgICAgICAgICAgcHJpbnRmKCAiLyogJXMuJWQgKi9cbiIsIERMTE5hbWUsIGkpOwogICAgICAgICAgICAgcHJpbnRmKCAiXHRtb3Z3ICQlZCwlJWF4XG4iLCByZHAtPnJldF92YWx1ZSAmIDB4ZmZmZiApOwogICAgICAgICAgICAgcHJpbnRmKCAiXHRtb3Z3ICQlZCwlJWR4XG4iLCAocmRwLT5yZXRfdmFsdWUgPj4gMTYpICYgMHhmZmZmKTsKICAgICAgICAgICAgIHByaW50ZiggIlx0LmJ5dGUgMHg2NlxuIik7CkBAIC0xMDExLDcgKzkyMyw3IEBACiAgICAgICAgICAgY2FzZSBUWVBFX1BBU0NBTDoKICAgICAgICAgICBjYXNlIFRZUEVfUEFTQ0FMXzE2OgogICAgICAgICAgIGNhc2UgVFlQRV9TVFVCOgotICAgICAgICAgICAgcHJpbnRmKCAiLyogJXMuJWQgKi9cbiIsIFVwcGVyRExMTmFtZSwgaSk7CisgICAgICAgICAgICBwcmludGYoICIvKiAlcy4lZCAqL1xuIiwgRExMTmFtZSwgaSk7CiAgICAgICAgICAgICBwcmludGYoICJcdHB1c2h3ICUlYnBcbiIgKTsKICAgICAgICAgICAgIHByaW50ZiggIlx0cHVzaGwgJDB4JTA4eFxuIiwgKERMTElkIDw8IDE2KSB8IGkpOwogICAgICAgICAgICAgcHJpbnRmKCAiXHRwdXNobCAkIiBQUkVGSVggIiVzXG4iLCBmZHAtPmludGVybmFsX25hbWUgKTsKQEAgLTEwMzAsOCArOTQyLDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogCQkKICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiYnVpbGQ6IFVua25vd24gZnVuY3Rpb24gdHlwZTsgcGxlYXNlIHJlcG9ydC5cbiIpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiYnVpbGQ6IGZ1bmN0aW9uIHR5cGUgJWQgbm90IGF2YWlsYWJsZSBmb3IgV2luMTZcbiIsCisgICAgICAgICAgICAgICAgICAgIG9kcC0+dHlwZSk7CisgICAgICAgICAgICBleGl0KDEpOwogCX0KICAgICB9CiAKQEAgLTEwNDYsNiArOTU5LDM2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgQnVpbGRTcGVjRmlsZXMKKyAqCisgKiBCdWlsZCBhbiBhc3NlbWJseSBmaWxlIGZyb20gYSBzcGVjIGZpbGUuCisgKi8KK3N0YXRpYyB2b2lkIEJ1aWxkU3BlY0ZpbGVzKCBjaGFyICpzcGVjbmFtZSApCit7CisgICAgU3BlY0ZwID0gZm9wZW4oIHNwZWNuYW1lLCAiciIpOworICAgIGlmIChTcGVjRnAgPT0gTlVMTCkKKyAgICB7CisJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBzcGVjaWZpY2F0aW9uIGZpbGUsICclcydcbiIsIHNwZWNuYW1lKTsKKwlleGl0KDEpOworICAgIH0KKworICAgIFBhcnNlVG9wTGV2ZWwoKTsKKyAgICBzd2l0Y2goU3BlY1R5cGUpCisgICAgeworICAgIGNhc2UgU1BFQ19JTlZBTElEOgorICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlczogTWlzc2luZyAndHlwZScgZGVjbGFyYXRpb25cbiIsIHNwZWNuYW1lICk7CisgICAgICAgIGV4aXQoMSk7CisgICAgY2FzZSBTUEVDX1dJTjE2OgorICAgICAgICBCdWlsZFNwZWMxNkZpbGVzKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1BFQ19XSU4zMjoKKyAgICAgICAgQnVpbGRTcGVjMzJGaWxlcygpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgQnVpbGRDYWxsMzJMYXJnZVN0YWNrCiAgKgogICogQnVpbGQgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gc3dpdGNoIHRvIHRoZSBvcmlnaW5hbCAzMi1iaXQgc3RhY2sKQEAgLTE3MTgsMTEgKzE2NjEsMTAyIEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgQnVpbGRTdGRjYWxsRnVuYworICoKKyAqIEJ1aWxkIGEgc3RkY2FsbCBjYWxsLWJhY2sgZnVuY3Rpb24uICdhcmdzJyBpcyB0aGUgbnVtYmVyIG9mIGR3b3JkIGFyZ3VtZW50cy4KKyAqCisgKiBTdGFjayBsYXlvdXQ6CisgKiAgIC4uLiAgICAgLi4uCisgKiAoZWJwKzEyKSAgYXJnMgorICogKGVicCs4KSAgIGFyZzEKKyAqIChlYnArNCkgICByZXQgYWRkcgorICogKGVicCkgICAgIGVicAorICogKGVicC00KSAgIGZ1bmMgbmFtZQorICogKGVicC04KSAgIGVudHJ5IHBvaW50CisgKi8KK3N0YXRpYyB2b2lkIEJ1aWxkU3RkY2FsbEZ1bmMoIGludCBhcmdzICkKK3sKKyAgICAvKiBGdW5jdGlvbiBoZWFkZXIgKi8KKworICAgIHByaW50ZiggIi8qKioqKioqKioqXG4iICk7CisgICAgcHJpbnRmKCAiICogIiBQUkVGSVggIlN0ZGNhbGxfJWRcbiIsIGFyZ3MgKTsKKyAgICBwcmludGYoICIgKioqKioqKioqKi9cbiIgKTsKKyAgICBwcmludGYoICJcdC5hbGlnbiA0XG4iICk7CisgICAgcHJpbnRmKCAiXHQuZ2xvYmwgIiBQUkVGSVggIlN0ZGNhbGxfJWRcblxuIiwgYXJncyApOworICAgIHByaW50ZiggUFJFRklYICJTdGRjYWxsXyVkOlxuIiwgYXJncyApOworCisgICAgLyogRW50cnkgY29kZSAqLworCisgICAgcHJpbnRmKCAiXHRsZWFsIDgoJSVlc3ApLCUlZWJwXG4iICk7CisKKyNpZiAwCisgICAgLyogU3dpdGNoIHRvIHRoZSBpbnRlcm5hbCBzdGFjayAqLworCisgICAgcHJpbnRmKCAiXHRwdXNobCAiIFBSRUZJWCAiSUYxNjMyX1NhdmVkMzJfZXNwXG4iICk7CisgICAgcHJpbnRmKCAiXHRtb3ZsICUlZXNwLCAiIFBSRUZJWCAiSUYxNjMyX1NhdmVkMzJfZXNwXG4iICk7CisgICAgcHJpbnRmKCAiXHRtb3ZsICIgUFJFRklYICJJRjE2MzJfT3JpZ2luYWwzMl9lc3AsICUlZXNwXG4iICk7CisjZW5kaWYKKworICAgIC8qIFByaW50IHRoZSBkZWJ1Z2dpbmcgaW5mbyAqLworCisgICAgaWYgKGRlYnVnZ2luZykKKyAgICB7CisgICAgICAgIHByaW50ZiggIlx0cHVzaGwgJCVkXG4iLCBhcmdzICk7CisgICAgICAgIHByaW50ZiggIlx0Y2FsbCAiIFBSRUZJWCAiUkVMQVlfRGVidWdTdGRjYWxsXG4iICk7CisgICAgICAgIHByaW50ZiggIlx0YWRkICQ0LCAlJWVzcFxuIiApOworICAgIH0KKworICAgIC8qIFRyYW5zZmVyIHRoZSBhcmd1bWVudHMgKi8KKworICAgIGlmIChhcmdzKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IGFyZ3M7IGkgPiAwOyBpLS0pIHByaW50ZiggIlx0cHVzaGwgJWQoJSVlYnApXG4iLCA0ICogaSArIDQgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUHVzaCB0aGUgYWRkcmVzcyBvZiB0aGUgYXJndW1lbnRzLiBUaGUgY2FsbGVkIGZ1bmN0aW9uIHdpbGwgKi8KKyAgICAgICAgLyogaWdub3JlIHRoaXMgaWYgaXQgcmVhbGx5IHRha2VzIG5vIGFyZ3VtZW50cy4gKi8KKyAgICAgICAgcHJpbnRmKCAiXHRsZWFsIDgoJSVlYnApLCUlZWF4XG4iICk7CisgICAgICAgIHByaW50ZiggIlx0cHVzaGwgJSVlYXhcbiIgKTsKKyAgICB9CisKKyAgICAvKiBDYWxsIHRoZSBmdW5jdGlvbiAqLworCisgICAgcHJpbnRmKCAiXHRjYWxsIC04KCUlZWJwKVxuIiApOworCisgICAgLyogUHJpbnQgdGhlIGRlYnVnZ2luZyBpbmZvICovCisKKyAgICBpZiAoZGVidWdnaW5nKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiXHRhZGQgJCVkLCUlZXNwXG4iLCBhcmdzID8gKGFyZ3MgKiA0KSA6IDQgKTsKKyAgICAgICAgcHJpbnRmKCAiXHRwdXNobCAlJWVheFxuIiApOworICAgICAgICBwcmludGYoICJcdGNhbGwgIiBQUkVGSVggIlJFTEFZX0RlYnVnU3RkY2FsbFJldFxuIiApOworICAgICAgICBwcmludGYoICJcdHBvcGwgJSVlYXhcbiIgKTsKKyAgICB9CisKKyAgICAvKiBTd2l0Y2ggYmFjayB0byB0aGUgbm9ybWFsIHN0YWNrICovCisKKyNpZiAwCisgICAgcHJpbnRmKCAiXHRtb3ZsIC0xMiglJWVicCksIiBQUkVGSVggIklGMTYzMl9TYXZlZDMyX2VzcFxuIiApOworI2VuZGlmCisgICAgcHJpbnRmKCAiXHRtb3ZsICUlZWJwLCUlZXNwXG4iICk7CisgICAgcHJpbnRmKCAiXHRwb3BsICUlZWJwXG4iICk7CisKKyAgICAvKiBSZXR1cm4sIHJlbW92aW5nIGFyZ3VtZW50cyAqLworCisgICAgaWYgKGFyZ3MpIHByaW50ZiggIlx0cmV0ICQlZFxuIiwgYXJncyAqIDQgKTsKKyAgICBlbHNlIHByaW50ZiggIlx0cmV0XG4iICk7Cit9CisKKwogc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBidWlsZCAtc3BlYyBTUEVDTkFNRVNcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICAgICBidWlsZCAtY2FsbDMyIEZVTkNUSU9OX1BST0ZJTEVTXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgYnVpbGQgLWNhbGwxNiBGVU5DVElPTl9QUk9GSUxFU1xuIiApOworICAgICAgICAgICAgICAgICAgICAiICAgICAgIGJ1aWxkIC1jYWxsMTYgRlVOQ1RJT05fUFJPRklMRVNcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICBidWlsZCAtc3RkY2FsbCBGVU5DVElPTl9QUk9GSUxFU1xuIiApOwogICAgIGV4aXQoMSk7CiB9CiAKQEAgLTE3MzMsMTMgKzE3NjcsOSBAQAogCiAgICAgaWYgKGFyZ2MgPD0gMikgdXNhZ2UoKTsKIAotICAgIGlmICghc3RyY21wKCBhcmd2WzFdLCAiLXNwZWMxNiIgKSkKKyAgICBpZiAoIXN0cmNtcCggYXJndlsxXSwgIi1zcGVjIiApKQogICAgIHsKLSAgICAgICAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgQnVpbGRTcGVjMTZGaWxlcyggYXJndltpXSApOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKCBhcmd2WzFdLCAiLXNwZWMzMiIgKSkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIEJ1aWxkU3BlYzMyRmlsZXMoIGFyZ3ZbaV0gKTsKKyAgICAgICAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgQnVpbGRTcGVjRmlsZXMoIGFyZ3ZbaV0gKTsKICAgICB9CiAgICAgZWxzZSBpZiAoIXN0cmNtcCggYXJndlsxXSwgIi1jYWxsMzIiICkpICAvKiAzMi1iaXQgY2FsbGJhY2tzICovCiAgICAgewpAQCAtMTc4OCw2ICsxODE4LDE3IEBACiAgICAgICAgIHByaW50ZiggIlx0Lmdsb2JsICIgUFJFRklYICJDQUxMMTZfRW5kXG4iICk7CiAgICAgICAgIHByaW50ZiggUFJFRklYICJDQUxMMTZfRW5kOlxuIiApOwogICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKCBhcmd2WzFdLCAiLXN0ZGNhbGwiICkpICAvKiBzdGRjYWxsIGNhbGxiYWNrcyAqLworICAgIHsKKyAgICAgICAgLyogRmlsZSBoZWFkZXIgKi8KKworICAgICAgICBwcmludGYoICIvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LiBEbyBub3QgZWRpdCEgKi9cblxuIiApOworICAgICAgICBwcmludGYoICJcdC50ZXh0XG4iICk7CisKKyAgICAgICAgLyogQnVpbGQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworCisgICAgICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIEJ1aWxkU3RkY2FsbEZ1bmMoIGF0b2koYXJndltpXSkgKTsKKyAgICB9CiAgICAgZWxzZSB1c2FnZSgpOwogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS93aW4zMi9hZHZhcGkuYyBiL3dpbjMyL2FkdmFwaS5jCmluZGV4IGU2MGM3ODQuLmM2ZmMxMzcgMTAwNjQ0Ci0tLSBhL3dpbjMyL2FkdmFwaS5jCisrKyBiL3dpbjMyL2FkdmFwaS5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0VXNlck5hbWVBICAgKEFEVkFQSTMyLjY3KQorICogICAgICAgICAgIEdldFVzZXJOYW1lQSAgIFtBRFZBUEkzMi42N10KICAqLwogCiBCT09MIFdJTkFQSSBHZXRVc2VyTmFtZUEoTFBTVFIgbHBzek5hbWUsIExQRFdPUkQgbHBTaXplKQpAQCAtMzEsNTEgKzMxLDMgQEAKICAgc3RyY3B5KGxwc3pOYW1lLCBuYW1lKTsKICAgcmV0dXJuIDE7CiB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlZ0NyZWF0ZUtleUV4ICAgKEFEVkFQSTMyLjEzMCkKLSAqLwotTE9ORyBSZWdDcmVhdGVLZXkoSEtFWSxMUENUU1RSLExQSEtFWSk7Ci1XSU5BUEkgTE9ORyBSZWdDcmVhdGVLZXlFeChIS0VZIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdWJrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb250dXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleWNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHU0FNIHNhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNVUklUWV9BVFRSSUJVVEVTICphdHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhLRVkgKnJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqZGlzcCkKLXsKLQkvKiBhaHVtICovCi0JcmV0dXJuIFJlZ0NyZWF0ZUtleShrZXksIHN1YmtleSwgcmVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgUmVnU2V0VmFsdWVFeCAgIChBRFZBUEkzMi4xNjkpCi0gKi8KLQotV0lOQVBJIExPTkcgUmVnU2V0VmFsdWVFeCAoSEtFWSBrZXksCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICBEV09SRCBkb250dXNlLAotICAgICAgICAgICAgICAgIERXT1JEIHR5cGUsCi0gICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICBEV09SRCBsZW4KLSAgICAgICAgICAgICAgICApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlZ1F1ZXJ5VmFsdWVFeCAgIChBRFZBUEkzMi4xNTcpCi0gKi8KLQotV0lOQVBJIExPTkcgUmVnUXVlcnlWYWx1ZUV4KEhLRVkga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdWJrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRvbnR1c2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICp0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpsZW4pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3dpbjMyL2V4Y2VwdC5jIGIvd2luMzIvZXhjZXB0LmMKaW5kZXggNDUxODhjZS4uZTc4OWNmOCAxMDA2NDQKLS0tIGEvd2luMzIvZXhjZXB0LmMKKysrIGIvd2luMzIvZXhjZXB0LmMKQEAgLTM5LDExICszOSwxOCBAQAogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJleGNlcHQuaCIKKyNpbmNsdWRlICJyZWxheTMyLmgiCiAKIFdJTkFQSSBEV09SRCBLRVJORUwzMl81MzcoUEVYQ0VQVElPTl9QT0lOVEVSUyBwdHJzKTsKIAotTFBUT1BfTEVWRUxfRVhDRVBUSU9OX0ZJTFRFUiAgICAgICBwVG9wRXhjSGFuZGxlcj0KLSAgICAgICAgICAgKExQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIpIEtFUk5FTDMyXzUzNzsKK0xQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIgcFRvcEV4Y0hhbmRsZXIgPSBOVUxMOworCit2b2lkIEVYQ19Jbml0KHZvaWQpCit7CisgICAgV0lOMzJfYnVpbHRpbiAqZGxsID0gUkVMQVkzMl9HZXRCdWlsdGluRExMKCJLRVJORUwzMiIpOworICAgIHBUb3BFeGNIYW5kbGVyID0gKExQVE9QX0xFVkVMX0VYQ0VQVElPTl9GSUxURVIpUkVMQVkzMl9HZXRFbnRyeVBvaW50KCBkbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyIiwgNTM3ICk7Cit9CiAKIC8qCiAgKiAgICAgICBFWENfUnRsVW53aW5kCmRpZmYgLS1naXQgYS93aW4zMi9pbml0LmMgYi93aW4zMi9pbml0LmMKaW5kZXggZmE5MjNiMi4uNmRlNGMyMCAxMDA2NDQKLS0tIGEvd2luMzIvaW5pdC5jCisrKyBiL3dpbjMyL2luaXQuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAia2VybmVsMzIuaCIKICNpbmNsdWRlICJoYW5kbGUzMi5oIgorI2luY2x1ZGUgImV4Y2VwdC5oIgogI2luY2x1ZGUgInBlX2ltYWdlLmgiCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCkBAIC0xMTEsNiArMTEyLDExIEBACiAgKi8KIGludCBLRVJOMzJfSW5pdCh2b2lkKQogeworI2lmbmRlZiBXSU5FTElCCisgICAgLyogSW5pdGlhbGl6ZSBleGNlcHRpb24gaGFuZGxpbmcgKi8KKyAgICBFWENfSW5pdCgpOworI2VuZGlmCisKICAgICAvKiBDcmVhdGUgdGhlIHN0YW5kYXJkIHN5c3RlbSBoYW5kbGVzCiAgICAgICovCiAgICAgaWYoQ3JlYXRlU3RkSGFuZGxlcygpICE9IDApCmRpZmYgLS1naXQgYS93aW4zMi9zdHJpbmczMi5jIGIvd2luMzIvc3RyaW5nMzIuYwppbmRleCBlMDkwNDJhLi42NmUyNDNlIDEwMDY0NAotLS0gYS93aW4zMi9zdHJpbmczMi5jCisrKyBiL3dpbjMyL3N0cmluZzMyLmMKQEAgLTE0LDcgKzE0LDggQEAKICNpbmNsdWRlICJzdHJpbmczMi5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKIAotaW50IFNUUklORzMyX1VuaUxlbihMUFdTVFIgcykKK2ludAorU1RSSU5HMzJfVW5pTGVuKExQQ1dTVFIgcykKIHsKIAlpbnQgaTsKIAlmb3IoaT0wOypzO3MrKykKQEAgLTM4LDExICszOSwxOCBAQAogCSpkZXN0ID0gKnNyYzsKIH0KIAotdm9pZCBTVFJJTkczMl9BbnNpVG9VbmkoTFBXU1RSIGRlc3QsTFBDU1RSIHNyYykKLXsKLQl3aGlsZSgqc3JjKQotCQkqZGVzdCsrPSpzcmMrKzsKLQkqZGVzdCA9ICpzcmM7CisvKiBGSVhNRTogd2UgbmVlZCB0byB1c2UgdW5zaWduZWQgY2hhciBoZXJlLCBmb3IgaWYgCisgKiAgICAgICAgd2UgZ290IGNoYXJzIHdpdGggdGhlIDd0aCBiaXQgc2V0LCB3ZSB3aWxsIGdldAorICoJICBuZWdhdGl2ZSBpbnRlZ2VycyAtPiB3cm9uZyB1bmljb2RlIHZhbHVlcworICovCit2b2lkIAorU1RSSU5HMzJfQW5zaVRvVW5pKExQV1NUUiBkZXN0LExQQ1NUUiBzcmMpIHsKKwl1bnNpZ25lZCBjaGFyCSp1c3JjOworCisJdXNyYz0odW5zaWduZWQgY2hhciopc3JjOworCXdoaWxlKCp1c3JjKQorCQkqZGVzdCsrPSp1c3JjKys7CisJKmRlc3QgPSAqdXNyYzsKIH0KIAogTFBTVFIgU1RSSU5HMzJfRHVwVW5pVG9BbnNpKExQQ1dTVFIgc3JjKQpAQCAtOTIsMyArMTAwLDM5IEBACiAJfQogCXJldHVybiAwOwogfQorCitpbnQKK1NUUklORzMyX2xzdHJjbXBXKExQQ1dTVFIgYSxMUENXU1RSIGIpIHsKKwlXQ0hBUglkaWZmOworCisJd2hpbGUoKmEgJiYgKmIpIHsKKwkJZGlmZj0qYS0qYjsKKwkJaWYgKGRpZmYpIHJldHVybiBkaWZmOworCQlhKys7CisJCWIrKzsKKwl9CisJaWYgKCphKSByZXR1cm4gKmE7CisJaWYgKCpiKSByZXR1cm4gLSpiOworCXJldHVybiAwOworfQorCitMUFdTVFIKK1NUUklORzMyX2xzdHJjaHJXKExQQ1dTVFIgYSxXQ0hBUiBjKSB7CisJd2hpbGUoKmEpIHsKKwkJaWYgKCphPT1jKQorCQkJcmV0dXJuIGE7CisJCWErKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK0xQV1NUUgorU1RSSU5HMzJfc3RyZHVwVyhMUENXU1RSIGEpIHsKKwlMUFdTVFIJYjsKKwlpbnQJbGVuOworCisJbGVuPXNpemVvZihXQ0hBUikqKFNUUklORzMyX1VuaUxlbihhKSsxKTsKKwliPShMUFdTVFIpeG1hbGxvYyhsZW4pOworCW1lbWNweShiLGEsbGVuKTsKKwlyZXR1cm4gYjsKK30KZGlmZiAtLWdpdCBhL3dpbjMyL3VzZXIzMi5jIGIvd2luMzIvdXNlcjMyLmMKaW5kZXggNDJhNDU4Mi4uYjlhOWRiNSAxMDA2NDQKLS0tIGEvd2luMzIvdXNlcjMyLmMKKysrIGIvd2luMzIvdXNlcjMyLmMKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgInJlbGF5MzIuaCIKQEAgLTUyNywzICs1MjgsOCBAQAogCWlmKGh3bmQpcmV0dXJuIERJQUxPR19Eb0RpYWxvZ0JveChod25kLGhXbmRQYXJlbnQpOwogCXJldHVybiAtMTsKIH0KKworaW50IFVTRVIzMl93c3ByaW50ZkEoIGludCAqYXJncyApCit7CisgICAgcmV0dXJuIHZzcHJpbnRmKCAoY2hhciAqKWFyZ3NbMF0sIChjaGFyICopYXJnc1sxXSwgKHZhX2xpc3QpJmFyZ3NbMl0gKTsKK30KZGlmZiAtLWdpdCBhL3dpbmRvd3MvYWxpYXMuYyBiL3dpbmRvd3MvYWxpYXMuYwppbmRleCBkZjg3MzE5Li41NzE2MDk0IDEwMDY0NAotLS0gYS93aW5kb3dzL2FsaWFzLmMKKysrIGIvd2luZG93cy9hbGlhcy5jCkBAIC03LDYgKzcsNyBAQAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImFsaWFzLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCiAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC0yMiw2ICsyMywyMiBAQAogCiBpbnQgQUxJQVNfVXNlQWxpYXNlczsKIAorLyogQWxpYXNlZCB3aW5kb3cgcHJvY2VkdXJlcyAqLworZXh0ZXJuIExSRVNVTFQgQnV0dG9uV25kUHJvYyggSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0gKTsKK2V4dGVybiBMUkVTVUxUIFN0YXRpY1duZFByb2MoIEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNICk7CitleHRlcm4gTFJFU1VMVCBTY3JvbGxCYXJXbmRQcm9jKCBIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSApOworZXh0ZXJuIExSRVNVTFQgTGlzdEJveFduZFByb2MoIEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNICk7CitleHRlcm4gTFJFU1VMVCBDb21ib0JveFduZFByb2MoIEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNICk7CitleHRlcm4gTFJFU1VMVCBDb21ib0xCb3hXbmRQcm9jKCBIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSApOworZXh0ZXJuIExSRVNVTFQgRWRpdFduZFByb2MoIEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNICk7CitleHRlcm4gTFJFU1VMVCBQb3B1cE1lbnVXbmRQcm9jKCBIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSApOworZXh0ZXJuIExSRVNVTFQgRGVza3RvcFduZFByb2MoIEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNICk7CitleHRlcm4gTFJFU1VMVCBEZWZEbGdQcm9jKCBIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSApOworZXh0ZXJuIExSRVNVTFQgTURJQ2xpZW50V25kUHJvYyggSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0gKTsKK2V4dGVybiBMUkVTVUxUIEFib3V0RGxnUHJvYyggSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0gKTsKK2V4dGVybiBMUkVTVUxUIENBUkVUX0NhbGxiYWNrKCBIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSApOworZXh0ZXJuIExSRVNVTFQgU3lzdGVtTWVzc2FnZUJveFByb2MoIEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNICk7CisKIC8qIGNsb3NlZCBoYXNoaW5nICovCiBzdGF0aWMgaW50IEFMSUFTX0xvY2F0ZUhhc2goRFdPUkQgdmFsdWUpCiB7CkBAIC00MSw2ICs1OCw0OCBAQAogCXJldHVybiBoYXNoOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEFMSUFTX1JlZ2lzdGVyV25kUHJvY0FsaWFzCisgKi8KK3N0YXRpYyB2b2lkIEFMSUFTX1JlZ2lzdGVyV25kUHJvY0FsaWFzKCBEV09SRCBXaW5lLCBjb25zdCBjaGFyICpuYW1lICkKK3sKKyAgICBGQVJQUk9DIFdpbjE2UHJvYywgV2luMzJQcm9jOworCisgICAgV2luMTZQcm9jID0gTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCBuYW1lICk7CisgICAgV2luMzJQcm9jID0gTU9EVUxFX0dldFduZFByb2NFbnRyeTMyKCBuYW1lICk7CisgICAgQUxJQVNfUmVnaXN0ZXJBbGlhcyggV2luZSwgKERXT1JEKVdpbjE2UHJvYywgKERXT1JEKVdpbjMyUHJvYyApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEFMSUFTX0luaXQKKyAqCisgKiBDcmVhdGUgYWxpYXNlcyBmb3IgdGhlIHN0YW5kYXJkIHdpbmRvdyBwcm9jZWR1cmVzLgorICovCitCT09MIEFMSUFTX0luaXQodm9pZCkKK3sKKyAgICBBTElBU19SZWdpc3RlclduZFByb2NBbGlhcyggKERXT1JEKUJ1dHRvblduZFByb2MsICJCdXR0b25XbmRQcm9jIiApOworICAgIEFMSUFTX1JlZ2lzdGVyV25kUHJvY0FsaWFzKCAoRFdPUkQpU3RhdGljV25kUHJvYywgIlN0YXRpY1duZFByb2MiICk7CisgICAgQUxJQVNfUmVnaXN0ZXJXbmRQcm9jQWxpYXMoIChEV09SRClTY3JvbGxCYXJXbmRQcm9jLCAiU2Nyb2xsQmFyV25kUHJvYyIgKTsKKyAgICBBTElBU19SZWdpc3RlclduZFByb2NBbGlhcyggKERXT1JEKUxpc3RCb3hXbmRQcm9jLCAiTGlzdEJveFduZFByb2MiICk7CisgICAgQUxJQVNfUmVnaXN0ZXJXbmRQcm9jQWxpYXMoIChEV09SRClDb21ib0JveFduZFByb2MsICJDb21ib0JveFduZFByb2MiICk7CisgICAgQUxJQVNfUmVnaXN0ZXJXbmRQcm9jQWxpYXMoIChEV09SRClDb21ib0xCb3hXbmRQcm9jLCAiQ29tYm9MQm94V25kUHJvYyIgKTsKKyAgICBBTElBU19SZWdpc3RlclduZFByb2NBbGlhcyggKERXT1JEKUVkaXRXbmRQcm9jLCAiRWRpdFduZFByb2MiICk7CisgICAgQUxJQVNfUmVnaXN0ZXJXbmRQcm9jQWxpYXMoIChEV09SRClQb3B1cE1lbnVXbmRQcm9jLCAiUG9wdXBNZW51V25kUHJvYyIgKTsKKyAgICBBTElBU19SZWdpc3RlclduZFByb2NBbGlhcyggKERXT1JEKURlc2t0b3BXbmRQcm9jLCAiRGVza3RvcFduZFByb2MiICk7CisgICAgQUxJQVNfUmVnaXN0ZXJXbmRQcm9jQWxpYXMoIChEV09SRClEZWZEbGdQcm9jLCAiRGVmRGxnUHJvYyIgKTsKKyAgICBBTElBU19SZWdpc3RlclduZFByb2NBbGlhcyggKERXT1JEKU1ESUNsaWVudFduZFByb2MsICJNRElDbGllbnRXbmRQcm9jIiApOworICAgIEFMSUFTX1JlZ2lzdGVyV25kUHJvY0FsaWFzKCAoRFdPUkQpQWJvdXREbGdQcm9jLCAiQWJvdXREbGdQcm9jIiApOworICAgIEFMSUFTX1JlZ2lzdGVyV25kUHJvY0FsaWFzKCAoRFdPUkQpQ0FSRVRfQ2FsbGJhY2ssICJDQVJFVF9DYWxsYmFjayIgKTsKKyAgICBBTElBU19SZWdpc3RlclduZFByb2NBbGlhcyggKERXT1JEKVN5c3RlbU1lc3NhZ2VCb3hQcm9jLCAiU3lzdGVtTWVzc2FnZUJveFByb2MiICk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQUxJQVNfUmVnaXN0ZXJBbGlhcworICovCiB2b2lkIEFMSUFTX1JlZ2lzdGVyQWxpYXMoRFdPUkQgV2luZSxEV09SRCBXaW4xNiwgRFdPUkQgV2luMzIpCiB7CiAgICAgaW50IHdoYXNoID0gMCwgdzE2aGFzaCA9IDAsIHczMmhhc2ggPSAwLCByZWNubz0wOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9jYXJldC5jIGIvd2luZG93cy9jYXJldC5jCmluZGV4IGI3NTNkODYuLjI5NGZhYzUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvY2FyZXQuYworKysgYi93aW5kb3dzL2NhcmV0LmMKQEAgLTYsOSArNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJzZWxlY3RvcnMuaCIKLSNpbmNsdWRlICJhbGlhcy5oIgotI2luY2x1ZGUgInJlbGF5MzIuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19DQVJFVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC04OCw3ICs4Niw3IEBACiB7CiAgICAgaWYgKENhcmV0LnRpbWVyaWQpIEtpbGxTeXN0ZW1UaW1lcigoSFdORCkwLCBDYXJldC50aW1lcmlkKTsKICAgICBDYXJldC50aW1lcmlkID0gU2V0U3lzdGVtVGltZXIoKEhXTkQpMCwgMCwgQ2FyZXQudGltZW91dCwKLQkJCShGQVJQUk9DKUdldFduZFByb2NFbnRyeTE2KCJDQVJFVF9DYWxsYmFjayIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCJDQVJFVF9DYWxsYmFjayIpKTsKIH0KIAogCkBAIC0xMDEsNyArOTksNyBAQAogICAgIHsKIAlLaWxsU3lzdGVtVGltZXIoKEhXTkQpMCwgQ2FyZXQudGltZXJpZCk7CiAJQ2FyZXQudGltZXJpZCA9IFNldFN5c3RlbVRpbWVyKChIV05EKTAsIDAsIENhcmV0LnRpbWVvdXQsCi0JCQkoRkFSUFJPQylHZXRXbmRQcm9jRW50cnkxNigiQ0FSRVRfQ2FsbGJhY2siKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiQ0FSRVRfQ2FsbGJhY2siKSk7CiAgICAgfQogfQogCkBAIC0xMjAsMjcgKzExOCw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgIENBUkVUX0luaXRpYWxpemUKLSAqLwotc3RhdGljIHZvaWQgQ0FSRVRfSW5pdGlhbGl6ZSgpCi17Ci0gICAgRFdPUkQgV2luZVByb2MsV2luMTZQcm9jLFdpbjMyUHJvYzsKLSAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkPTA7Ci0KLSAgICBpZighaW5pdGlhbGl6ZWQpCi0gICAgewotCVdpbmVQcm9jID0gKERXT1JEKUNBUkVUX0NhbGxiYWNrOwotCVdpbjE2UHJvYyA9IChEV09SRClHZXRXbmRQcm9jRW50cnkxNigiQ0FSRVRfQ2FsbGJhY2siKTsKLQlXaW4zMlByb2MgPSAoRFdPUkQpUkVMQVkzMl9HZXRFbnRyeVBvaW50KAotCQkJCVJFTEFZMzJfR2V0QnVpbHRpbkRMTCgiV0lOUFJPQ1MzMiIpLAotCQkJCSJDQVJFVF9DYWxsYmFjayIsIDApOwotCUFMSUFTX1JlZ2lzdGVyQWxpYXMoV2luZVByb2MsIFdpbjE2UHJvYywgV2luMzJQcm9jKTsKLQlpbml0aWFsaXplZD0xOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgQ3JlYXRlQ2FyZXQgICAgICAgICAgKFVTRVIuMTYzKQogICovCiBCT09MIENyZWF0ZUNhcmV0KEhXTkQgaHduZCwgSEJJVE1BUCBiaXRtYXAsIElOVCB3aWR0aCwgSU5UIGhlaWdodCkKQEAgLTE3Niw5ICsxNTMsNiBAQAogICAgIENhcmV0LnkgPSAwOwogCiAgICAgQ2FyZXQudGltZW91dCA9IEdldFByb2ZpbGVJbnQoICJ3aW5kb3dzIiwgIkN1cnNvckJsaW5rUmF0ZSIsIDc1MCApOwotCi0gICAgQ0FSRVRfSW5pdGlhbGl6ZSgpOwotCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAgICAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IDUzMGM1ZTUuLmQwODFmMjIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtMjEsNyArMjEsMTEgQEAKICAgLyogTGFzdCBDT0xPUiBpZCAqLwogI2RlZmluZSBDT0xPUl9NQVggICBDT0xPUl9CVE5ISUdITElHSFQKIAotc3RhdGljIHNob3J0IGlNZW51S2V5ID0gMDsKKyAgLyogYml0cyBpbiB0aGUgZHdLZXlEYXRhICovCisjZGVmaW5lIEtFWURBVEFfQUxUIAkJMHgyMDAwCisjZGVmaW5lIEtFWURBVEFfUFJFVlNUQVRFCTB4NDAwMAorCitzdGF0aWMgc2hvcnQgaUYxMEtleSA9IDA7CiBzdGF0aWMgc2hvcnQgaU1lbnVTeXNLZXkgPSAwOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTczLDcgKzc3LDcgQEAKIAogICAgIGNhc2UgV01fUEFJTlRJQ09OOiAKICAgICBjYXNlIFdNX05DUEFJTlQ6Ci0JcmV0dXJuIE5DX0hhbmRsZU5DUGFpbnQoIGh3bmQgKTsKKwlyZXR1cm4gTkNfSGFuZGxlTkNQYWludCggaHduZCwgKEhSR04pd1BhcmFtICk7CiAKICAgICBjYXNlIFdNX05DSElUVEVTVDoKICAgICAgICAgewpAQCAtMjQ2LDcgKzI1MCw3IEBACiAKICAgICBjYXNlIFdNX1NFVFRFWFQ6CiAJREVGV05EX1NldFRleHQoIGh3bmQsIChMUFNUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pICk7Ci0JTkNfSGFuZGxlTkNQYWludCggaHduZCApOyAgLyogUmVwYWludCBjYXB0aW9uICovCisJTkNfSGFuZGxlTkNQYWludCggaHduZCAsIChIUkdOKTEgKTsgIC8qIFJlcGFpbnQgY2FwdGlvbiAqLwogCXJldHVybiAwOwogCiAgICAgY2FzZSBXTV9TRVRDVVJTT1I6CkBAIC0yNTcsNDcgKzI2MSw3NyBAQAogCXJldHVybiBOQ19IYW5kbGVTZXRDdXJzb3IoIGh3bmQsIHdQYXJhbSwgbFBhcmFtICk7CiAKICAgICBjYXNlIFdNX1NZU0NPTU1BTkQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFBPSU5UIHB0ID0geyBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkgfTsKLSAgICAgICAgICAgIHJldHVybiBOQ19IYW5kbGVTeXNDb21tYW5kKCBod25kLCB3UGFyYW0sIHB0ICk7Ci0gICAgICAgIH0KLQorCXsKKyAgICAgICAgICBQT0lOVCBwdCA9IHsgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pIH07CisgICAgICAgICAgcmV0dXJuIE5DX0hhbmRsZVN5c0NvbW1hbmQoIGh3bmQsIHdQYXJhbSwgcHQgKTsKKwl9CiAgICAgY2FzZSBXTV9LRVlET1dOOgogCi0JaWYod1BhcmFtID09IFZLX0YxMCkgaU1lbnVLZXkgPSBWS19GMTA7CisJaWYod1BhcmFtID09IFZLX0YxMCkgaUYxMEtleSA9IFZLX0YxMDsKIAlicmVhazsKIAogICAgIGNhc2UgV01fU1lTS0VZRE9XTjoKLQkvKiB0aGlzIGJyZWFrcyBjdXJyZW50IHBzZXVkbyBhY2NlbGVyYXRvcnMgYnV0Ci0JICAgY3JlYXRlcyBhIGJhc2lzIGZvciBpbXBsZW1lbnRpbmcgcmVhbCBvbmVzICovCiAKLQlpZih3UGFyYW0gPT0gVktfRjEwKSAKLQkgICB7Ci0JICAgIGlNZW51S2V5ID0gVktfRjEwOwotCSAgICBicmVhazsKLQkgICB9Ci0JCi0JaWYgKHdQYXJhbSA9PSBWS19NRU5VKQotCSAgIHsgIAotCSAgICBpTWVudVN5c0tleSA9IChpTWVudVN5c0tleSk/IDA6IDE7Ci0JICAgIGlNZW51S2V5ICAgID0gMDsKLQl9CisJaWYoIEhJV09SRChsUGFyYW0pICYgS0VZREFUQV9BTFQgKQorCSAgeworCSAgICAvKiBpZiggSElXT1JEKGxQYXJhbSkgJiB+S0VZREFUQV9QUkVWU1RBVEUgKSAqLworCSAgICAgIGlmKCB3UGFyYW0gPT0gVktfTUVOVSAmJiAhaU1lbnVTeXNLZXkgKQorCQlpTWVudVN5c0tleSA9IDE7CisJICAgICAgZWxzZQorCQlpTWVudVN5c0tleSA9IDA7CisJICAgIAorCSAgICBpRjEwS2V5ID0gMDsKKworCSAgfSAKKwllbHNlIGlmKCB3UGFyYW0gPT0gVktfRjEwICkKKwkgICAgICAgICBpRjEwS2V5ID0gMTsKKwkgICAgIGVsc2UKKwkgICAgICAgICBpZiggd1BhcmFtID09IFZLX0VTQ0FQRSAmJiBHZXRLZXlTdGF0ZShWS19TSElGVCkgPCAwICkKKwkJICAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fU1lTQ09NTUFORCwgKFdQQVJBTSlTQ19LRVlNRU5VLCAKKyAJCQkJCQkgICAgICAgKExQQVJBTSlWS19TUEFDRSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIFdNX0tFWVVQOgogICAgIGNhc2UgV01fU1lTS0VZVVA6CiAKLQlpZiggKHdQYXJhbSA9PSBWS19NRU5VICYmIGlNZW51U3lzS2V5KSB8fCAKLQkgICAgKHdQYXJhbSA9PSBWS19GMTAgJiYgaU1lbnVLZXkpICkKKwkvKiBQcmVzcyBhbmQgcmVsZWFzZSBGMTAgb3IgQUxUICovCiAKLQkgICAgICAvKiBTZW5kIHRvIFdTX09WRVJMQVBQRUQgcGFyZW50LiBUT0RPOiBIYW5kbGUgTURJICovCisJaWYoICggd1BhcmFtID09IFZLX01FTlUgJiYgaU1lbnVTeXNLZXkgKSAKKwkgICAgICB8fCAoIHdQYXJhbSA9PSBWS19GMTAgJiYgaUYxMEtleSApICkKKwogCSAgICAgIFNlbmRNZXNzYWdlKCBXSU5fR2V0VG9wUGFyZW50KGh3bmQpLCBXTV9TWVNDT01NQU5ELAogCQkJICAgU0NfS0VZTUVOVSwgMEwgKTsKIAotCWlNZW51U3lzS2V5ID0gMDsKLQlpTWVudUtleSA9IDA7CisJaU1lbnVTeXNLZXkgPSBpRjEwS2V5ID0gMDsKICAgICAgICAgYnJlYWs7CiAKKyAgICBjYXNlIFdNX1NZU0NIQVI6CisKKwlpTWVudVN5c0tleSA9IDA7CisKKwlpZiggd1BhcmFtID09IFZLX1JFVFVSTiAmJiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpICkKKwkgIHsKKwkgICAgUG9zdE1lc3NhZ2UoaHduZCwgV01fU1lTQ09NTUFORCwgKFdQQVJBTSlTQ19SRVNUT1JFLCAwTCApOyAKKwkgICAgYnJlYWs7CisJICB9ICAKKworCWlmKCAoSElXT1JEKGxQYXJhbSkgJiBLRVlEQVRBX0FMVCkgJiYgd1BhcmFtICkKKwkgIHsKKwkgICAgaWYoIHdQYXJhbSA9PSBWS19UQUIgfHwgd1BhcmFtID09IFZLX0VTQ0FQRSApCisJICAgICAgYnJlYWs7CisKKwkgICAgaWYoIHdQYXJhbSA9PSBWS19TUEFDRSAmJiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpICkKKwkgICAgICBTZW5kTWVzc2FnZSggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisJICAgIGVsc2UKKwkgICAgICBTZW5kTWVzc2FnZShod25kLCBXTV9TWVNDT01NQU5ELCAoV1BBUkFNKVNDX0tFWU1FTlUsIChMUEFSQU0pKERXT1JEKXdQYXJhbSApOworCSAgfSAKKwllbHNlCisJICAvKiBjaGVjayBmb3IgQ3RybC1Fc2MgKi8KKwkgIGlmKCB3UGFyYW0gIT0gVktfRVNDQVBFICkgICAKKwkgICAgICBNZXNzYWdlQmVlcCgwKTsKKwkgIAorCWJyZWFrOworCiAgICAgY2FzZSBXTV9TSE9XV0lORE9XOgogCWlmKCAhbFBhcmFtICkgcmV0dXJuIDA7IC8qIHNlbnQgZnJvbSBTaG93V2luZG93ICovCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCmluZGV4IDc5M2NmZmIuLmEzZmMzM2QgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGlhbG9nLmMKKysrIGIvd2luZG93cy9kaWFsb2cuYwpAQCAtNjU1LDYgKzY1NSw5IEBACiAjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworCisJZGVmYXVsdDogCisJICAgIFRyYW5zbGF0ZU1lc3NhZ2UoIG1zZyApOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOyAgLyogY2FzZSBXTV9LRVlET1dOICovCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZXZlbnQuYyBiL3dpbmRvd3MvZXZlbnQuYwppbmRleCBlYmE2MzNmLi4xOWZhMTBhIDEwMDY0NAotLS0gYS93aW5kb3dzL2V2ZW50LmMKKysrIGIvd2luZG93cy9ldmVudC5jCkBAIC01NCw4ICs1NCwxMiBAQAogQk9PTCBBc3luY01vdXNlQnV0dG9uc1N0YXRlc1tOQl9CVVRUT05TXSA9IHsgRkFMU0UsIEZBTFNFLCBGQUxTRSB9OwogQllURSBLZXlTdGF0ZVRhYmxlWzI1Nl07CiBCWVRFIEFzeW5jS2V5U3RhdGVUYWJsZVsyNTZdOwotc3RhdGljIFdPUkQgQUxUS2V5U3RhdGU7Ci1zdGF0aWMgSFdORCBjYXB0dXJlV25kID0gMDsKKworCisgICAgICAgV1BBUkFNICAgbGFzdEV2ZW50Q2hhciA9IDA7IC8qIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGNoYW5nZWQgb25jZQorCQkJCSAgICAqIFRvQXNjaWkgc3RhcnRzIHdvcmtpbmcgKi8KKworc3RhdGljIEhXTkQgCWNhcHR1cmVXbmQgPSAwOwogc3RhdGljIEJPT0wJSW5wdXRFbmFibGVkID0gVFJVRTsKIAogLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCkBAIC0xMTQsNyArMTE4LDggQEAKIAl1bnNpZ25lZCBsb25nIGNvdW50IDogMTY7CiAJdW5zaWduZWQgbG9uZyBjb2RlIDogODsKIAl1bnNpZ25lZCBsb25nIGV4dGVuZGVkIDogMTsKLQl1bnNpZ25lZCBsb25nIDogNDsKKwl1bnNpZ25lZCBsb25nIDogMjsKKwl1bnNpZ25lZCBsb25nIHJlc2VydmVkIDogMjsKIAl1bnNpZ25lZCBsb25nIGNvbnRleHQgOiAxOwogCXVuc2lnbmVkIGxvbmcgcHJldmlvdXMgOiAxOwogCXVuc2lnbmVkIGxvbmcgdHJhbnNpdGlvbiA6IDE7CkBAIC0zMDMsMTAgKzMwOCwxMSBAQAogICAgIEtFWUxQIGtleWxwOwogICAgIEJPT0wgZXh0ZW5kZWQgPSBGQUxTRTsKIAotICAgIGludCBjb3VudCA9IFhMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgMSwgJmtleXN5bSwgJmNzKTsKLSAgICBTdHJbY291bnRdID0gJ1wwJzsKLSAgICBkcHJpbnRmX2tleShzdGRkZWIsIldNX0tFWT8/PyA6IGtleXN5bT0lbFgsIGNvdW50PSV1IC8gJVggLyAnJXMnXG4iLCAKLQkgICBrZXlzeW0sIGNvdW50LCBTdHJbMF0sIFN0cik7CisgICAgaW50IGFzY2lpX2NoYXJzID0gWExvb2t1cFN0cmluZyhldmVudCwgU3RyLCAxLCAma2V5c3ltLCAmY3MpOworCisgICAgU3RyW2FzY2lpX2NoYXJzXSA9ICdcMCc7CisgICAgZHByaW50Zl9rZXkoc3RkZGViLCJXTV9LRVk/Pz8gOiBrZXlzeW09JWxYLCBhc2NpaSBjaGFycz0ldSAvICVYIC8gJyVzJ1xuIiwgCisJICAga2V5c3ltLCBhc2NpaV9jaGFycywgU3RyWzBdLCBTdHIpOwogCiAgICAgLyogQ3RybC1BbHQtUmV0dXJuIGVudGVycyB0aGUgZGVidWdnZXIgKi8KICAgICBpZiAoKGtleXN5bSA9PSBYS19SZXR1cm4pICYmIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgJiYKQEAgLTM0Myw2MCArMzQ5LDU5IEBACiAgICAgfQogICAgIGVsc2UgaWYgKGtleV90eXBlID09IDApICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hhcmFjdGVyIGtleSAqLwogICAgIHsKLQlpZiAoaXNhbG51bShrZXkpKQotCSAgICB2a2V5ID0gdG91cHBlcihrZXkpOyAgICAgICAgICAgICAgICAgLyogY29udmVydCBsb3dlciB0byB1cHBlcmNhc2UgKi8KLQllbHNlCi0JICAgIHZrZXkgPSAweGJlOworCWlmICggaXNhbG51bShrZXkpICkKKwkgICAgIHZrZXkgPSB0b3VwcGVyKGtleSk7ICAgICAgICAgICAgICAgICAgLyogY29udmVydCBsb3dlciB0byB1cHBlcmNhc2UgKi8KKyAgICAgICAgZWxzZSAgCisJICAgICB2a2V5ID0gMHhiZTsKICAgICB9CiAKICAgICBpZiAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICAgewotCWlmICh2a2V5ID09IFZLX01FTlUpIEFMVEtleVN0YXRlID0gVFJVRTsKLQlpZiAoIShLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHgwZikpCi0JICAgIEtleVN0YXRlVGFibGVbdmtleV0gXj0gMHg4MDsKLQlLZXlTdGF0ZVRhYmxlW3ZrZXldIHw9IDB4MDE7CisgICAgICAgIGlmICghKEtleVN0YXRlVGFibGVbdmtleV0gJiAweDgwKSkKKyAgICAgICAgICAgIEtleVN0YXRlVGFibGVbdmtleV0gXj0gMHgwMTsKKwlLZXlTdGF0ZVRhYmxlW3ZrZXldIHw9IDB4ODA7CiAJa2V5bHAubHAxLmNvdW50ID0gMTsKIAlrZXlscC5scDEuY29kZSA9IExPQllURShldmVudC0+a2V5Y29kZSkgLSA4OwogCWtleWxwLmxwMS5leHRlbmRlZCA9IChleHRlbmRlZCA/IDEgOiAwKTsKLQlrZXlscC5scDEuY29udGV4dCA9IChldmVudC0+c3RhdGUgJiBNb2QxTWFzayA/IDEgOiAwKTsKKwlrZXlscC5scDEucmVzZXJ2ZWQgPSAoYXNjaWlfY2hhcnMgPyAxIDogMCk7CisJa2V5bHAubHAxLmNvbnRleHQgPSAoIChldmVudC0+c3RhdGUgJiBNb2QxTWFzaykgfHwgCisJCQkgICAgICAgKEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwKSkgPyAxIDogMDsKIAlrZXlscC5scDEucHJldmlvdXMgPSAoS2V5RG93biA/IDAgOiAxKTsKIAlrZXlscC5scDEudHJhbnNpdGlvbiA9IDA7CiAJZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICB3UGFyYW09JVgsIGxQYXJhbT0lbFhcbiIsIAogCQkgICAgdmtleSwga2V5bHAubHAyICk7CiAJZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICBLZXlTdGF0ZT0lWFxuIiwgS2V5U3RhdGVUYWJsZVt2a2V5XSk7Ci0JaGFyZHdhcmVfZXZlbnQoIEFMVEtleVN0YXRlID8gV01fU1lTS0VZRE9XTiA6IFdNX0tFWURPV04sIAorCWhhcmR3YXJlX2V2ZW50KCBLZXlTdGF0ZVRhYmxlW1ZLX01FTlVdICYgMHg4MCA/IFdNX1NZU0tFWURPV04gOiBXTV9LRVlET1dOLCAKIAkJICAgICAgICB2a2V5LCBrZXlscC5scDIsCiAJCSAgICAgICAgZXZlbnQtPnhfcm9vdCAtIGRlc2t0b3BYLCBldmVudC0+eV9yb290IC0gZGVza3RvcFksCiAJCSAgICAgICAgZXZlbnQtPnRpbWUsIDAgKTsKIAlLZXlEb3duID0gVFJVRTsKIAotCS8qIFRoZSBrZXkgdHJhbnNsYXRpb24gb3VnaHQgdG8gdGFrZSBwbGFjZSBpbiBUcmFuc2xhdGVNZXNzYWdlKCkuCi0JICogSG93ZXZlciwgdGhlcmUgaXMgbm8gd2F5IG9mIHBhc3NpbmcgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIAotCSAqIGluIGEgV2luZG93cyBtZXNzYWdlLCBzbyBUcmFuc2xhdGVNZXNzYWdlIGRvZXMgbm90IGN1cnJlbnRseQotCSAqIGRvIGFueXRoaW5nIGFuZCB0aGUgdHJhbnNsYXRpb24gaXMgZG9uZSBoZXJlLgorCS8qIEN1cnJlbnRseSB3ZSB1c2UgcmVzZXJ2ZWQgZmllbGQgaW4gdGhlIHNjYW4tY29kZSBieXRlIHRvCisJICogbWFrZSBpdCBwb3NzaWJsZSBmb3IgVHJhbnNsYXRlTWVzc2FnZSB0byByZWNvZ25pemUgY2hhcmFjdGVyIGtleXMKKwkgKiBhbmQgZ2V0IHRoZW0gZnJvbSBsYXN0RXZlbnRDaGFyIGdsb2JhbCB2YXJpYWJsZS4KKwkgKgorCSAqIFRvQXNjaWkgc2hvdWxkIGhhbmRsZSBpdC4KIAkgKi8KLQlpZiAoY291bnQgPT0gMSkgICAgICAgICAgICAgICAgLyoga2V5IGhhcyBhbiBBU0NJSSByZXByZXNlbnRhdGlvbiAqLwotCXsKLQkgICAgZHByaW50Zl9rZXkoc3RkZGViLCJXTV9DSEFSIDogICB3UGFyYW09JVhcbiIsIChXT1JEKVN0clswXSApOwotCSAgICBQb3N0TWVzc2FnZSggR2V0Rm9jdXMoKSwgV01fQ0hBUiwgKFdPUkQpKHVuc2lnbmVkIGNoYXIpKFN0clswXSksIAotCQkJa2V5bHAubHAyICk7Ci0JfQorCisJaWYoIGFzY2lpX2NoYXJzICkgbGFzdEV2ZW50Q2hhciA9IFN0clswXTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQlpZiAodmtleSA9PSBWS19NRU5VKSBBTFRLZXlTdGF0ZSA9IEZBTFNFOwotCUtleVN0YXRlVGFibGVbdmtleV0gJj0gMHhmMDsKKwlVSU5UIHN5c0tleSA9IEtleVN0YXRlVGFibGVbVktfTUVOVV07CisKKwlLZXlTdGF0ZVRhYmxlW3ZrZXldICY9IH4weDgwOyAKIAlrZXlscC5scDEuY291bnQgPSAxOwogCWtleWxwLmxwMS5jb2RlID0gTE9CWVRFKGV2ZW50LT5rZXljb2RlKSAtIDg7CiAJa2V5bHAubHAxLmV4dGVuZGVkID0gKGV4dGVuZGVkID8gMSA6IDApOworCWtleWxwLmxwMS5yZXNlcnZlZCA9IDA7CiAJa2V5bHAubHAxLmNvbnRleHQgPSAoZXZlbnQtPnN0YXRlICYgTW9kMU1hc2sgPyAxIDogMCk7CiAJa2V5bHAubHAxLnByZXZpb3VzID0gMTsKIAlrZXlscC5scDEudHJhbnNpdGlvbiA9IDE7CiAJZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICB3UGFyYW09JVgsIGxQYXJhbT0lbFhcbiIsIAogCQkgICAgdmtleSwga2V5bHAubHAyICk7CiAJZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICBLZXlTdGF0ZT0lWFxuIiwgS2V5U3RhdGVUYWJsZVt2a2V5XSk7Ci0JaGFyZHdhcmVfZXZlbnQoICgoQUxUS2V5U3RhdGUgfHwgdmtleSA9PSBWS19NRU5VKSA/IAotCQkJIFdNX1NZU0tFWVVQIDogV01fS0VZVVApLCAKKwloYXJkd2FyZV9ldmVudCggc3lzS2V5ICYgMHg4MCA/IFdNX1NZU0tFWVVQIDogV01fS0VZVVAsIAogCQkgICAgICAgIHZrZXksIGtleWxwLmxwMiwKIAkJICAgICAgICBldmVudC0+eF9yb290IC0gZGVza3RvcFgsIGV2ZW50LT55X3Jvb3QgLSBkZXNrdG9wWSwKIAkJICAgICAgICBldmVudC0+dGltZSwgMCApOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9rZXlib2FyZC5jIGIvd2luZG93cy9rZXlib2FyZC5jCmluZGV4IDBjMWFlM2UuLmJkZjgwMzAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mva2V5Ym9hcmQuYworKysgYi93aW5kb3dzL2tleWJvYXJkLmMKQEAgLTE1LDggKzE1LDEwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCUdldEtleVN0YXRlCQkJW1VTRVIuMTA2XQogICovCi1pbnQgR2V0S2V5U3RhdGUoaW50IGtleWNvZGUpCitJTlQgR2V0S2V5U3RhdGUoSU5UIGtleWNvZGUpCiB7CisgICAgSU5UIHJldHZhbDsKKwogICAgIHN3aXRjaChrZXljb2RlKSB7CiAgICAgIGNhc2UgVktfTEJVVFRPTjoKIAlyZXR1cm4gTW91c2VCdXR0b25zU3RhdGVzWzBdOwpAQCAtMjUsOCArMjcsMTEgQEAKICAgICAgY2FzZSBWS19SQlVUVE9OOgogCXJldHVybiBNb3VzZUJ1dHRvbnNTdGF0ZXNbMl07CiAgICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIEtleVN0YXRlVGFibGVba2V5Y29kZV07CisJcmV0dmFsID0gKCAoSU5UKShLZXlTdGF0ZVRhYmxlW2tleWNvZGVdICYgMHg4MCkgPDwgOCApIHwKKwkJICAgKElOVCkoS2V5U3RhdGVUYWJsZVtrZXljb2RlXSAmIDB4MDEpOwogICAgIH0KKworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS93aW5kb3dzL21kaS5jIGIvd2luZG93cy9tZGkuYwppbmRleCBmM2Y4MDAwLi5hMjJkMWRlIDEwMDY0NAotLS0gYS93aW5kb3dzL21kaS5jCisrKyBiL3dpbmRvd3MvbWRpLmMKQEAgLTE3NCw3ICsxNzQsMTAgQEAKICAgICAgICAgICAgIGlmICghd1RvIHx8ICFwV25kTGFzdCkgcmV0dXJuIDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoKHBXbmQtPmR3U3R5bGUgJiBXU19WSVNJQkxFKSAmJgorCisJLyogd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIG93bmVkIHBvcHVwcyAqLworICAgICAgICBpZiAoICFwV25kLT5vd25lciAmJgorCSAgICAgKHBXbmQtPmR3U3R5bGUgJiBXU19WSVNJQkxFKSAmJgogICAgICAgICAgICAgIShwV25kLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpKSAgLyogZm91bmQgb25lICovCiAgICAgICAgIHsKICAgICAgICAgICAgIHBXbmRMYXN0ID0gcFduZDsKQEAgLTc4Miw3ICs3ODUsNyBAQAogIAogIGhTeXNQb3B1cCA9IEdldFN5c3RlbU1lbnUoaENoaWxkLEZBTFNFKTsKIAotIGRwcmludGZfbWRpKHN0ZGRlYiwiZ290IHBvcHVwICUwNHhcbiBpbiBzeXNtZW51ICUwNHgiLGhTeXNQb3B1cCxjaGlsZC0+aFN5c01lbnUpOworIGRwcmludGZfbWRpKHN0ZGRlYiwiXHRcdGdvdCBwb3B1cCAlMDR4XG4gaW4gc3lzbWVudSAlMDR4IixoU3lzUG9wdXAsY2hpbGQtPmhTeXNNZW51KTsKICAKICBpZiggIUluc2VydE1lbnUoZnJhbWUtPndJRG1lbnUsMCxNRl9CWVBPU0lUSU9OIHwgTUZfQklUTUFQIHwgTUZfUE9QVVAsCiAgICAgICAgICAgICAgICAgIGhTeXNQb3B1cCwgKFNFR1BUUikoRFdPUkQpY2ktPm9ibUNsb3NlKSApCkBAIC03OTUsNiArNzk4LDEwIEBACiAgICAgICByZXR1cm4gMDsKICAgIH0KIAorIC8qIEZJWE1FOiBhZGQgYSBjYWxsIHRvIGZ1bmN0aW9uIHRoYXQgc2V0cyBzeXNtZW51IGl0ZW1zIGFjY29yZGluZworICAqICAgICAgICB0byB0aGUgd2luZG93IHN0YXRlLiBXU19NQVhJTUlaRSAtPiBubyBTQ19TSVpFLCBldGMuLi4KKyAgKi8KKwogIEVuYWJsZU1lbnVJdGVtKGhTeXNQb3B1cCwgU0NfU0laRSwgTUZfQllDT01NQU5EIHwgTUZfR1JBWUVEKTsKICBFbmFibGVNZW51SXRlbShoU3lzUG9wdXAsIFNDX01PVkUsIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7CiAgRW5hYmxlTWVudUl0ZW0oaFN5c1BvcHVwLCBTQ19NQVhJTUlaRSwgTUZfQllDT01NQU5EIHwgTUZfR1JBWUVEKTsKQEAgLTgyMyw2ICs4MzAsMTAgQEAKIAogIGNoaWxkLT5kd1N0eWxlIHw9IFdTX1NZU01FTlU7CiAKKyAgLyogRklYTUU6IGFkZCBhIGNhbGwgdG8gZnVuY3Rpb24gdGhhdCBzZXRzIHN5c21lbnUgaXRlbXMgYWNjb3JkaW5nCisgICogICAgICAgIHRvIHRoZSB3aW5kb3cgc3RhdGUuIFdTX01BWElNSVpFIC0+IG5vIFNDX1NJWkUsIGV0Yy4uLgorICAqLworCiAgUmVtb3ZlTWVudShmcmFtZVduZC0+d0lEbWVudSwwLE1GX0JZUE9TSVRJT04pOwogIERlbGV0ZU1lbnUoZnJhbWVXbmQtPndJRG1lbnUsbkl0ZW1zLTEsTUZfQllQT1NJVElPTik7CiAKQEAgLTEwNTcsOSArMTA2OCwyNSBAQAogCWJyZWFrOwogCQogICAgICAgY2FzZSBXTV9QQVJFTlROT1RJRlk6Ci0JaWYgKHdQYXJhbSA9PSBXTV9MQlVUVE9ORE9XTiAmJiAoY2ktPmh3bmRIaXRUZXN0ICE9IGNpLT5od25kQWN0aXZlQ2hpbGQpICkKLQkgICAgIFNldFdpbmRvd1BvcyhjaS0+aHduZEhpdFRlc3QsIDAsMCwwLDAsMCwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgKTsKLQlicmVhazsKKyAgICAgICAgaWYoIHdQYXJhbSA9PSBXTV9MQlVUVE9ORE9XTiApCisgICAgICAgICAgeworICAgICAgICAgICAgTFBQT0lOVCAgbHBwdCA9IChMUFBPSU5UKSh2b2lkKikoJmxQYXJhbSk7CisgICAgICAgICAgICBIV05EICAgICBjaGlsZCA9IENoaWxkV2luZG93RnJvbVBvaW50KGh3bmQsICpscHB0KTsKKworCSAgICBkcHJpbnRmX21kaShzdGRkZWIsIk1ESUNsaWVudDogbm90aWZpY2F0aW9uIGZyb20gJTA0eCAoJWksJWkpXG4iLGNoaWxkLGxwcHQtPngsbHBwdC0+eSk7CisKKyAgICAgICAgICAgIGlmKCBjaGlsZCAmJiBjaGlsZCAhPSBod25kICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdORCogICAgd25kID0gV0lOX0ZpbmRXbmRQdHIoIGNoaWxkICk7CisKKyAgICAgICAgICAgICAgICAvKiBpZiB3ZSBnb3Qgb3duZWQgcG9wdXAgKi8KKyAgICAgICAgICAgICAgICBpZiggd25kLT5vd25lciApIGNoaWxkID0gd25kLT5vd25lci0+aHduZFNlbGY7CisKKyAgICAgICAgICAgICAgICBpZiggY2hpbGQgIT0gY2ktPmh3bmRBY3RpdmVDaGlsZCApCisgICAgICAgICAgICAgICAgICAgIFNldFdpbmRvd1BvcyhjaGlsZCwgMCwwLDAsMCwwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKIAogICAgICAgY2FzZSBXTV9TSVpFOgogCWlmKCBjaS0+ZmxhZ0NoaWxkTWF4aW1pemVkICkKQEAgLTExNzgsMTAgKzEyMDUsNiBAQAogCiAgICAgc3dpdGNoIChtZXNzYWdlKQogICAgIHsKLSAgICAgIGNhc2UgV01fTkNISVRURVNUOgotCWNpLT5od25kSGl0VGVzdCA9IGh3bmQ7Ci0JYnJlYWs7Ci0JCiAgICAgICBjYXNlIFdNX1NFVFRFWFQ6CiAJRGVmV2luZG93UHJvYyhod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CiAJTURJX01lbnVNb2RpZnlJdGVtKGNsaWVudFduZCxod25kKTsKQEAgLTEyOTEsNiArMTMxNCwxMiBAQAogCWJyZWFrOwogCiAgICAgICBjYXNlIFdNX01FTlVDSEFSOgorCisJLyogTURJIGNoaWxkcmVuIGRvbid0IGhhdmUgbWVudXMgKi8KKwlQb3N0TWVzc2FnZSggY2xpZW50V25kLT5wYXJlbnQtPmh3bmRTZWxmLCBXTV9TWVNDT01NQU5ELCAKKwkJCQkgICAgICAgICAgKFdQQVJBTSlTQ19LRVlNRU5VLCAoTFBBUkFNKXdQYXJhbSk7CisJcmV0dXJuIDB4MDAwMTAwMDBMOworCiAgICAgICBjYXNlIFdNX05FWFRNRU5VOgogCSAgIC8qIHNldCBjdXJyZW50IG1lbnUgdG8gY2hpbGQgc3lzdGVtIG1lbnUgKi8KIApAQCAtMTMyMSwxOCArMTM1MCwyMSBAQAogICAKICAgaWYoIHduZC0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEICkgcmV0dXJuIDA7CiAgICAKLSAgaWYoIEdldEtleVN0YXRlKFZLX0NPTlRST0wpICYmICFHZXRLZXlTdGF0ZShWS19NRU5VKSApCisgIGlmICgoR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgJiAweDgwMDApICYmICEoR2V0S2V5U3RhdGUoVktfTUVOVSkgJiAweDgwMDApKQogICAgIHN3aXRjaCggbXNnLT53UGFyYW0gKQogICAgICAgewogCWNhc2UgVktfRjY6CiAJY2FzZSBWS19TRVBBUkFUT1I6Ci0JICAgICB3UGFyYW0gPSAoR2V0S2V5U3RhdGUoVktfU0hJRlQpKT8gU0NfTkVYVFdJTkRPVzogU0NfUFJFVldJTkRPVzsKKwkgICAgIHdQYXJhbSA9ICggR2V0S2V5U3RhdGUoVktfU0hJRlQpICYgMHg4MDAwICk/IFNDX05FWFRXSU5ET1c6IFNDX1BSRVZXSU5ET1c7CiAJICAgICBicmVhazsKIAljYXNlIFZLX1JCVVRUT046CiAJICAgICB3UGFyYW0gPSBTQ19DTE9TRTsgCisJICAgICBicmVhazsKIAlkZWZhdWx0OgogCSAgICAgcmV0dXJuIDA7CiAgICAgICB9CisgIGVsc2UKKyAgICAgIHJldHVybiAwOwogCiAgIGRwcmludGZfbWRpKHN0ZGRlYiwiVHJhbnNsYXRlTURJU3lzQWNjZWw6IHdQYXJhbSA9ICUwNHhcbiIsIHdQYXJhbSk7CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggNDE1ZjM5Yy4uNmE4OGZjNiAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTI2LDEwICsyNiwxMyBAQAogCiAjZGVmaW5lIEhXTkRfQlJPQURDQVNUICAoKEhXTkQpMHhmZmZmKQogCitleHRlcm4gQllURSogCUtleVN0YXRlVGFibGU7CQkJCSAvKiBldmVudC5jICovCitleHRlcm4gV1BBUkFNCWxhc3RFdmVudENoYXI7CQkJCSAvKiBldmVudC5jICovCisKIGV4dGVybiBCT09MIFRJTUVSX0NoZWNrVGltZXIoIExPTkcgKm5leHQsIE1TRyAqbXNnLAogCQkJICAgICAgSFdORCBod25kLCBCT09MIHJlbW92ZSApOyAgLyogdGltZXIuYyAqLwogCi1EV09SRCBNU0dfV2luZVN0YXJ0VGlja3M7ICAvKiBUaWNrcyBhdCBXaW5lIHN0YXJ0dXAgKi8KK0RXT1JEIE1TR19XaW5lU3RhcnRUaWNrczsgIAkJCQkgLyogVGlja3MgYXQgV2luZSBzdGFydHVwICovCiAKIHN0YXRpYyBXT1JEIGRvdWJsZUNsaWNrU3BlZWQgPSA0NTI7CiAKQEAgLTE4MCw4ICsxODMsMTEgQEAKICAgICB7CiAJICAvKiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBhY3RpdmUgd2luZG93IGluc3RlYWQsICAqLwogCSAgLyogdHJhbnNsYXRpbmcgbWVzc2FnZXMgdG8gdGhlaXIgV01fU1lTIGVxdWl2YWxlbnQgKi8KKwogCW1zZy0+aHduZCA9IEdldEFjdGl2ZVdpbmRvdygpOwotCW1zZy0+bWVzc2FnZSArPSBXTV9TWVNLRVlET1dOIC0gV01fS0VZRE9XTjsKKworCWlmKCBtc2ctPm1lc3NhZ2UgPCBXTV9TWVNLRVlET1dOICkKKwkgICAgbXNnLT5tZXNzYWdlICs9IFdNX1NZU0tFWURPV04gLSBXTV9LRVlET1dOOwogICAgIH0KICAgICByZXR1cm4gIUhPT0tfQ2FsbEhvb2tzKCBXSF9LRVlCT0FSRCwgcmVtb3ZlID8gSENfQUNUSU9OIDogSENfTk9SRU1PVkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT53UGFyYW0sIG1zZy0+bFBhcmFtICk7CkBAIC0zODMsNiArMzg5LDcgQEAKIHsKICAgICBpbnQgcG9zLCBtYXNrOwogICAgIE1FU1NBR0VRVUVVRSAqbXNnUXVldWU7CisgICAgSFFVRVVFCSAgaFF1ZXVlOwogICAgIExPTkcgbmV4dEV4cDsgIC8qIE5leHQgdGltZXIgZXhwaXJhdGlvbiB0aW1lICovCiAKICNpZmRlZiBDT05GSUdfSVBDCkBAIC00MDMsNyArNDEwLDggQEAKIAogICAgIHdoaWxlKDEpCiAgICAgeyAgICAKLSAgICAgICAgbXNnUXVldWUgPSAoTUVTU0FHRVFVRVVFICopR2xvYmFsTG9jayggR2V0VGFza1F1ZXVlKDApICk7CisJaFF1ZXVlICAgPSBHZXRUYXNrUXVldWUoMCk7CisgICAgICAgIG1zZ1F1ZXVlID0gKE1FU1NBR0VRVUVVRSAqKUdsb2JhbExvY2soIGhRdWV1ZSApOwogICAgICAgICBpZiAoIW1zZ1F1ZXVlKSByZXR1cm4gRkFMU0U7CiAKIAkgIC8qIEZpcnN0IGhhbmRsZSBhIG1lc3NhZ2UgcHV0IGJ5IFNlbmRNZXNzYWdlKCkgKi8KQEAgLTQ2MSwxMSArNDY5LDI0IEBACiAJICAvKiBOb3cgZmluZCBhIFdNX1BBSU5UIG1lc3NhZ2UgKi8KIAlpZiAoKG1zZ1F1ZXVlLT5zdGF0dXMgJiBRU19QQUlOVCkgJiYgKG1hc2sgJiBRU19QQUlOVCkpCiAJewotCSAgICBtc2ctPmh3bmQgPSBXSU5fRmluZFdpblRvUmVwYWludCggaHduZCApOworCSAgICBtc2ctPmh3bmQgPSBXSU5fRmluZFdpblRvUmVwYWludCggaHduZCAsIGhRdWV1ZSApOwogCSAgICBtc2ctPm1lc3NhZ2UgPSBXTV9QQUlOVDsKIAkgICAgbXNnLT53UGFyYW0gPSAwOwogCSAgICBtc2ctPmxQYXJhbSA9IDA7Ci0JICAgIGlmIChtc2ctPmh3bmQgIT0gMCkgYnJlYWs7CisgICAgICAgICAgICBpZiggbXNnLT5od25kICYmCisgICAgICAgICAgICAgICghaHduZCB8fCBtc2ctPmh3bmQgPT0gaHduZCB8fCBJc0NoaWxkKGh3bmQsbXNnLT5od25kKSkgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV05EKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihtc2ctPmh3bmQpOworCisJICAgICAgICAvKiBGSVhNRTogV01fUEFJTlRJQ09OIHNob3VsZCBiZSBzZW50IHNvbWV0aW1lcyAqLworCisgICAgICAgICAgICAgICAgaWYoIHduZFB0ci0+ZmxhZ3MgJiBXSU5fSU5URVJOQUxfUEFJTlQgJiYgIXduZFB0ci0+aHJnblVwZGF0ZSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5mbGFncyAmPSB+V0lOX0lOVEVSTkFMX1BBSU5UOworICAgICAgICAgICAgICAgICAgICBRVUVVRV9EZWNQYWludENvdW50KCBoUXVldWUgKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQogCX0KIAogCSAgLyogRmluYWxseSBoYW5kbGUgV01fVElNRVIgbWVzc2FnZXMgKi8KQEAgLTU0NywxMCArNTY4LDE0IEBACiAgKi8KIEJPT0wgR2V0TWVzc2FnZSggU0VHUFRSIG1zZywgSFdORCBod25kLCBVSU5UIGZpcnN0LCBVSU5UIGxhc3QgKSAKIHsKLSAgICBNU0dfUGVla01lc3NhZ2UoIChNU0cgKilQVFJfU0VHX1RPX0xJTihtc2cpLAorICAgIE1TRyogbHBtc2cgPSAoTVNHICopUFRSX1NFR19UT19MSU4obXNnKTsKKyAgICBNU0dfUGVla01lc3NhZ2UoIGxwbXNnLAogICAgICAgICAgICAgICAgICAgICAgaHduZCwgZmlyc3QsIGxhc3QsIFBNX1JFTU9WRSwgRkFMU0UgKTsKKworICAgIGRwcmludGZfbXNnKHN0ZGRlYiwibWVzc2FnZSAlMDR4LCBod25kICUwNHgsIGZpbHRlciglMDR4IC0gJTA0eClcbiIsIGxwbXNnLT5tZXNzYWdlLAorCQkgICAgIAkJCQkgICAgICAgICAgICAgICAgIGh3bmQsIGZpcnN0LCBsYXN0ICk7CiAgICAgSE9PS19DYWxsSG9va3MoIFdIX0dFVE1FU1NBR0UsIEhDX0FDVElPTiwgMCwgKExQQVJBTSltc2cgKTsKLSAgICByZXR1cm4gKCgoTVNHICopUFRSX1NFR19UT19MSU4obXNnKSktPm1lc3NhZ2UgIT0gV01fUVVJVCk7CisgICAgcmV0dXJuIChscG1zZy0+bWVzc2FnZSAhPSBXTV9RVUlUKTsKIH0KIAogCkBAIC02OTcsMTYgKzcyMiwzNSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUcmFuc2xhdGVNZXNzYWdlICAgKFVTRVIuMTEzKQorICoKKyAqIFRoaXMgc2hvdWxkIGNhbGwgVG9Bc2NpaSBidXQgaXQgaXMgY3VycmVudGx5IGJyb2tlbgogICovCisKKyNkZWZpbmUgQVNDSUlfQ0hBUl9IQUNLIDB4MDgwMAorCiBCT09MIFRyYW5zbGF0ZU1lc3NhZ2UoIExQTVNHIG1zZyApCiB7Ci0gICAgaW50IG1lc3NhZ2UgPSBtc2ctPm1lc3NhZ2U7CisgICAgVUlOVCBtZXNzYWdlID0gbXNnLT5tZXNzYWdlOworICAgIC8qIEJZVEUgd3BhcmFtWzJdOyAqLwogICAgIAogICAgIGlmICgobWVzc2FnZSA9PSBXTV9LRVlET1dOKSB8fCAobWVzc2FnZSA9PSBXTV9LRVlVUCkgfHwKIAkobWVzc2FnZSA9PSBXTV9TWVNLRVlET1dOKSB8fCAobWVzc2FnZSA9PSBXTV9TWVNLRVlVUCkpCiAgICAgewotCWRwcmludGZfbXNnKHN0ZGRlYiwgIlRyYW5zbGF0aW5nIGtleSBtZXNzYWdlXG4iICk7Ci0JcmV0dXJuIFRSVUU7CisJZHByaW50Zl9tc2coc3RkZGViLCAiVHJhbnNsYXRpbmcga2V5ICUwNHgsIHNjYW5jb2RlICUwNHhcbiIsIG1zZy0+d1BhcmFtLCAKKwkJCQkJCQkgICAgICBISVdPUkQobXNnLT5sUGFyYW0pICk7CisKKwlpZiggSElXT1JEKG1zZy0+bFBhcmFtKSAmIEFTQ0lJX0NIQVJfSEFDSyApCisKKwkvKiAgaWYoIFRvQXNjaWkoIG1zZy0+d1BhcmFtLCBISVdPUkQobXNnLT5sUGFyYW0pLCAoTFBTVFIpJktleVN0YXRlVGFibGUsCisJCQkJICAgICAgd3BhcmFtLCAwICkgKSAKKyAgICAgICAgICovCisJICAgICAgeworICAgICAJCW1lc3NhZ2UgKz0gMiAtIChtZXNzYWdlICYgMHgwMDAxKTsgCisKKwkgICAgICAgIFBvc3RNZXNzYWdlKCBtc2ctPmh3bmQsIG1lc3NhZ2UsIGxhc3RFdmVudENoYXIsIG1zZy0+bFBhcmFtICk7CisKKwkgICAgICAgIHJldHVybiBUUlVFOworCSAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9tc2dib3guYyBiL3dpbmRvd3MvbXNnYm94LmMKaW5kZXggMzNlYmUyYy4uYzgyMTVmZCAxMDA2NDQKLS0tIGEvd2luZG93cy9tc2dib3guYworKysgYi93aW5kb3dzL21zZ2JveC5jCkBAIC03LDkgKzcsNyBAQAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImRsZ3MuaCIKLSNpbmNsdWRlICJzZWxlY3RvcnMuaCIKLSNpbmNsdWRlICJhbGlhcy5oIgotI2luY2x1ZGUgInJlbGF5MzIuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJyZXNvdXJjZS5oIgogI2luY2x1ZGUgInRhc2suaCIKQEAgLTE4NSwyNyArMTgzLDE2IEBACiAgICAgTVNHQk9YIG1ib3g7CiAgICAgaW50IHJldDsKICAgICBEV09SRCBXaW5lUHJvYyxXaW4xNlByb2MsV2luMzJQcm9jOwotICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwogCiAgICAgbWJveC50aXRsZSA9IHRpdGxlOwogICAgIG1ib3gudGV4dCAgPSB0ZXh0OwogICAgIG1ib3gudHlwZSAgPSB0eXBlOwogCi0gICAgaWYgKCFpbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICAgIFdpbmVQcm9jPShEV09SRClTeXN0ZW1NZXNzYWdlQm94UHJvYzsKLSAgICAgICAgV2luMTZQcm9jPShEV09SRClHZXRXbmRQcm9jRW50cnkxNigiU3lzdGVtTWVzc2FnZUJveFByb2MiKTsKLSAgICAgICAgV2luMzJQcm9jPShEV09SRClSRUxBWTMyX0dldEVudHJ5UG9pbnQoUkVMQVkzMl9HZXRCdWlsdGluRExMKCJXSU5QUk9DUzMyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTeXN0ZW1NZXNzYWdlQm94UHJvYyIsMCk7Ci0gICAgICAgIEFMSUFTX1JlZ2lzdGVyQWxpYXMoV2luZVByb2MsV2luMTZQcm9jLFdpbjMyUHJvYyk7Ci0gICAgICAgIGluaXRpYWxpemVkPTE7Ci0gICAgfQotCiAgICAgaGFuZGxlID0gU1lTUkVTX0xvYWRSZXNvdXJjZSggU1lTUkVTX0RJQUxPR19NU0dCT1ggKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7CiAgICAgcmV0ID0gRGlhbG9nQm94SW5kaXJlY3RQYXJhbSggV0lOX0dldFdpbmRvd0luc3RhbmNlKGhXbmQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgaFduZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiU3lzdGVtTWVzc2FnZUJveFByb2MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfR2V0V25kUHJvY0VudHJ5MTYoIlN5c3RlbU1lc3NhZ2VCb3hQcm9jIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExPTkcpJm1ib3ggKTsKICAgICBTWVNSRVNfRnJlZVJlc291cmNlKCBoYW5kbGUgKTsKICAgICByZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvd2luZG93cy9ub25jbGllbnQuYyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKaW5kZXggNzBiODEyNS4uYzk0Y2E5YyAxMDA2NDQKLS0tIGEvd2luZG93cy9ub25jbGllbnQuYworKysgYi93aW5kb3dzL25vbmNsaWVudC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAic2Nyb2xsLmgiCiAjaW5jbHVkZSAibm9uY2xpZW50LmgiCiAjaW5jbHVkZSAiZ3JhcGhpY3MuaCIKKyNpbmNsdWRlICJxdWV1ZS5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgpAQCAtNjE4LDE4ICs2MTksMjIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE5DX0RvTkNQYWludAogICoKLSAqIFBhaW50IHRoZSBub24tY2xpZW50IGFyZWEuCisgKiBQYWludCB0aGUgbm9uLWNsaWVudCBhcmVhLiBjbGlwIGlzIGN1cnJlbnRseSB1bnVzZWQuCiAgKi8KLXZvaWQgTkNfRG9OQ1BhaW50KCBIV05EIGh3bmQsIEJPT0wgYWN0aXZlLCBCT09MIHN1cHByZXNzX21lbnVwYWludCApCit2b2lkIE5DX0RvTkNQYWludCggSFdORCBod25kLCBIUkdOIGNsaXAsIEJPT0wgc3VwcHJlc3NfbWVudXBhaW50ICkKIHsKLSAgICBIREMgaGRjOwotICAgIFJFQ1QgcmVjdDsKKyAgICBIREMgCWhkYzsKKyAgICBSRUNUIAlyZWN0OworICAgIEJPT0wJYWN0aXZlOwogCiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCi0gICAgZHByaW50Zl9ub25jbGllbnQoc3RkZGViLCAiTkNfRG9OQ1BhaW50OiAlMDR4ICVkXG4iLCBod25kLCBhY3RpdmUgKTsKICAgICBpZiAoIXduZFB0ciB8fCAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpKSByZXR1cm47IC8qIE5vdGhpbmcgdG8gZG8gKi8KIAorICAgIGFjdGl2ZSAgPSB3bmRQdHItPmZsYWdzICYgV0lOX05DQUNUSVZBVEVEOworCisgICAgZHByaW50Zl9ub25jbGllbnQoc3RkZGViLCAiTkNfRG9OQ1BhaW50OiAlMDR4ICVkXG4iLCBod25kLCBhY3RpdmUgKTsKKwogICAgIGlmICghKGhkYyA9IEdldERDRXgoIGh3bmQsIDAsIERDWF9VU0VTVFlMRSB8IERDWF9XSU5ET1cgKSkpIHJldHVybjsKIAogICAgIC8qCkBAIC02NDYsNiArNjUxLDEzIEBACiAgICAgICAgICAgICBEcmF3SWNvbihoZGMsIDAsIDAsIGhJY29uKTsKICAgICAgICAgfQogICAgICAgICBSZWxlYXNlREMoaHduZCwgaGRjKTsKKyAgICAgICAgd25kUHRyLT5mbGFncyAmPSB+V0lOX0lOVEVSTkFMX1BBSU5UOworICAgICAgICBpZiggd25kUHRyLT5ocmduVXBkYXRlICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBEZWxldGVPYmplY3QoIHduZFB0ci0+aHJnblVwZGF0ZSApOworICAgICAgICAgICAgUVVFVUVfRGVjUGFpbnRDb3VudCggd25kUHRyLT5obWVtVGFza1EgKTsKKyAgICAgICAgICAgIHduZFB0ci0+aHJnblVwZGF0ZSA9IDA7CisgICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC03MjQsMTEgKzczNiw5IEBACiAgKgogICogSGFuZGxlIGEgV01fTkNQQUlOVCBtZXNzYWdlLiBDYWxsZWQgZnJvbSBEZWZXaW5kb3dQcm9jKCkuCiAgKi8KLUxPTkcgTkNfSGFuZGxlTkNQYWludCggSFdORCBod25kICkKK0xPTkcgTkNfSGFuZGxlTkNQYWludCggSFdORCBod25kICwgSFJHTiBjbGlwKQogewotICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7Ci0KLSAgICBOQ19Eb05DUGFpbnQoIGh3bmQsIHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkNBQ1RJVkFURUQsIEZBTFNFICk7CisgICAgTkNfRG9OQ1BhaW50KCBod25kLCBjbGlwLCBGQUxTRSApOwogICAgIHJldHVybiAwOwogfQogCkBAIC03NDUsNyArNzU1LDcgQEAKICAgICBpZiAod1BhcmFtICE9IDApIHduZFB0ci0+ZmxhZ3MgfD0gV0lOX05DQUNUSVZBVEVEOwogICAgIGVsc2Ugd25kUHRyLT5mbGFncyAmPSB+V0lOX05DQUNUSVZBVEVEOwogCi0gICAgTkNfRG9OQ1BhaW50KCBod25kLCAod1BhcmFtICE9IDApLCBGQUxTRSApOworICAgIE5DX0RvTkNQYWludCggaHduZCwgKEhSR04pMSwgRkFMU0UgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTI5Nyw3ICsxMzA3LDcgQEAKICAgICBkcHJpbnRmX25vbmNsaWVudChzdGRkZWIsICJIYW5kbGluZyBXTV9TWVNDT01NQU5EICV4ICVkLCVkXG4iLCAKIAkJICAgICAgd1BhcmFtLCBwdC54LCBwdC55ICk7CiAKLSAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpCisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEICYmIHdQYXJhbSAhPSBTQ19LRVlNRU5VICkKICAgICAgICAgU2NyZWVuVG9DbGllbnQoIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgJnB0ICk7CiAKICAgICBzd2l0Y2ggKHdQYXJhbSAmIDB4ZmZmMCkKQEAgLTEzMzYsNyArMTM0Niw3IEBACiAJYnJlYWs7CiAKICAgICBjYXNlIFNDX0tFWU1FTlU6Ci0JTUVOVV9UcmFja0tiZE1lbnVCYXIoIGh3bmQsIHdQYXJhbSApOworCU1FTlVfVHJhY2tLYmRNZW51QmFyKCB3bmRQdHIgLCB3UGFyYW0gLCBwdC54ICk7CiAJYnJlYWs7CiAJCiAgICAgY2FzZSBTQ19BUlJBTkdFOgpkaWZmIC0tZ2l0IGEvd2luZG93cy9wYWludGluZy5jIGIvd2luZG93cy9wYWludGluZy5jCmluZGV4IGJkMTU1NGMuLmU4Y2UxYmIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcGFpbnRpbmcuYworKysgYi93aW5kb3dzL3BhaW50aW5nLmMKQEAgLTE3LDYgKzE3LDY0IEBACiAgIC8qIExhc3QgQ1RMQ09MT1IgaWQgKi8KICNkZWZpbmUgQ1RMQ09MT1JfTUFYICAgQ1RMQ09MT1JfU1RBVElDCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdJTl9VcGRhdGVOQ0FyZWEKKyAqCisgKi8KK3ZvaWQgV0lOX1VwZGF0ZU5DQXJlYShXTkQqIHduZCwgQk9PTCBiVXBkYXRlKQoreworICAgIFJFQ1QgcmVjdCA9IHduZC0+cmVjdENsaWVudDsKKyAgICBIUkdOIGhDbGlwID0gMTsKKworICAgIGRwcmludGZfbm9uY2xpZW50KHN0ZGRlYiwiTkNVcGRhdGU6IGh3bmQgJTA0eCwgaHJnblVwZGF0ZSAlMDR4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCB3bmQtPmhyZ25VcGRhdGUgKTsKKworICAgIC8qIGRlc2t0b3Agd2luZG93cyBkb2Vzbid0IGhhdmUgbm9uY2xpZW50IGFyZWEgKi8KKyAgICBpZih3bmQgPT0gV0lOX0dldERlc2t0b3AoKSkgCisgICAgeworICAgICAgICB3bmQtPmZsYWdzICY9IH5XSU5fTkVFRFNfTkNQQUlOVDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCB3bmQtPmhyZ25VcGRhdGUgPiAxICkKKyAgICB7CisgICAgICAgIE1hcFdpbmRvd1BvaW50cyh3bmQtPnBhcmVudC0+aHduZFNlbGYsIDAsIChQT0lOVCopJnJlY3QsIDIpOworCisgICAgICAgIGhDbGlwID0gQ3JlYXRlUmVjdFJnbiggMCwgMCwgMCwgMCApOworICAgICAgICBpZiAoIUNvbWJpbmVSZ24oaENsaXAsIHduZC0+aHJnblVwZGF0ZSwgMCwgUkdOX0NPUFkpICkKKyAgICAgICAgeworICAgICAgICAgICAgRGVsZXRlT2JqZWN0KGhDbGlwKTsKKyAgICAgICAgICAgIGhDbGlwID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiVXBkYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBIUkdOIGhyZ24gPSBDcmVhdGVSZWN0UmduSW5kaXJlY3QoJnJlY3QpOworICAgICAgICAgICAgaWYgKGhyZ24gJiYgKENvbWJpbmVSZ24od25kLT5ocmduVXBkYXRlLCB3bmQtPmhyZ25VcGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmduLCBSR05fQU5EKSA9PSBOVUxMUkVHSU9OKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWxldGVPYmplY3Qod25kLT5ocmduVXBkYXRlKTsKKyAgICAgICAgICAgICAgICB3bmQtPmhyZ25VcGRhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVsZXRlT2JqZWN0KCBocmduICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3bmQtPmZsYWdzICY9IH5XSU5fTkVFRFNfTkNQQUlOVDsKKworICAgIGlmICgod25kLT5od25kU2VsZiA9PSBHZXRBY3RpdmVXaW5kb3coKSkgJiYKKyAgICAgICAgISh3bmQtPmZsYWdzICYgV0lOX05DQUNUSVZBVEVEKSkKKyAgICB7CisgICAgICAgIHduZC0+ZmxhZ3MgfD0gV0lOX05DQUNUSVZBVEVEOworICAgICAgICBpZiggaENsaXAgPiAxKSBEZWxldGVPYmplY3QoaENsaXApOworICAgICAgICBoQ2xpcCA9IDE7CisgICAgfQorCisgICAgaWYgKGhDbGlwKSBTZW5kTWVzc2FnZSggd25kLT5od25kU2VsZiwgV01fTkNQQUlOVCwgaENsaXAsIDBMICk7CisKKyAgICBpZiAoaENsaXAgPiAxKSBEZWxldGVPYmplY3QoIGhDbGlwICk7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQmVnaW5QYWludCAgICAoVVNFUi4zOSkKQEAgLTI3LDI2ICs4NSwyMiBAQAogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgaWYgKCF3bmRQdHIpIHJldHVybiAwOwogCi0gICAgaHJnblVwZGF0ZSA9IHduZFB0ci0+aHJnblVwZGF0ZTsgIC8qIFNhdmUgdXBkYXRlIHJlZ2lvbiAqLwotICAgIGlmICghaHJnblVwZGF0ZSkgICAgLyogQ3JlYXRlIGFuIGVtcHR5IHJlZ2lvbiAqLwotCWlmICghKGhyZ25VcGRhdGUgPSBDcmVhdGVSZWN0UmduKCAwLCAwLCAwLCAwICkpKSByZXR1cm4gMDsKKyAgICB3bmRQdHItPmZsYWdzICY9IH5XSU5fTkVFRFNfQkVHSU5QQUlOVDsKIAotICAgIGlmICh3bmRQdHItPmhyZ25VcGRhdGUgfHwgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fSU5URVJOQUxfUEFJTlQpKQotCVFVRVVFX0RlY1BhaW50Q291bnQoIHduZFB0ci0+aG1lbVRhc2tRICk7CisgICAgaWYgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkVFRFNfTkNQQUlOVCkgV0lOX1VwZGF0ZU5DQXJlYSggd25kUHRyLCBUUlVFICk7CisKKyAgICBpZiAoKChocmduVXBkYXRlID0gd25kUHRyLT5ocmduVXBkYXRlKSAhPSAwKSB8fAorICAgICAgICAod25kUHRyLT5mbGFncyAmIFdJTl9JTlRFUk5BTF9QQUlOVCkpCisgICAgICAgIFFVRVVFX0RlY1BhaW50Q291bnQoIHduZFB0ci0+aG1lbVRhc2tRICk7CiAKICAgICB3bmRQdHItPmhyZ25VcGRhdGUgPSAwOwotICAgIHduZFB0ci0+ZmxhZ3MgJj0gfihXSU5fTkVFRFNfQkVHSU5QQUlOVCB8IFdJTl9JTlRFUk5BTF9QQUlOVCk7CisgICAgd25kUHRyLT5mbGFncyAmPSB+V0lOX0lOVEVSTkFMX1BBSU5UOwogCiAgICAgSGlkZUNhcmV0KCBod25kICk7CiAKLSAgICBpZiAod25kUHRyLT5mbGFncyAmIFdJTl9ORUVEU19OQ1BBSU5UKQotICAgIHsKLSAgICAgICAgd25kUHRyLT5mbGFncyAmPSB+V0lOX05FRURTX05DUEFJTlQ7Ci0gICAgICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ1BBSU5ULCAwLCAwICk7Ci0gICAgfQotCiAgICAgbHBzLT5oZGMgPSBHZXREQ0V4KCBod25kLCBocmduVXBkYXRlLCBEQ1hfSU5URVJTRUNUUkdOIHwgRENYX1VTRVNUWUxFICk7Ci0gICAgRGVsZXRlT2JqZWN0KCBocmduVXBkYXRlICk7CisgICAgaWYoaHJnblVwZGF0ZSA+IDEpIERlbGV0ZU9iamVjdCggaHJnblVwZGF0ZSApOworCiAgICAgaWYgKCFscHMtPmhkYykKICAgICB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR2V0RENFeCgpIGZhaWxlZCBpbiBCZWdpblBhaW50KCksIGh3bmQ9JTA0eFxuIiwgaHduZCk7CkBAIC0yMzMsMTAgKzI4Nyw4IEBACiAgICAgZWxzZSBpZiAoZmxhZ3MgJiBSRFdfRVJBU0VOT1cpCiAgICAgewogICAgICAgICBpZiAod25kUHRyLT5mbGFncyAmIFdJTl9ORUVEU19OQ1BBSU5UKQotICAgICAgICB7Ci0gICAgICAgICAgICB3bmRQdHItPmZsYWdzICY9IH5XSU5fTkVFRFNfTkNQQUlOVDsKLSAgICAgICAgICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ1BBSU5ULCAwLCAwICk7Ci0gICAgICAgIH0KKwkgICAgV0lOX1VwZGF0ZU5DQXJlYSggd25kUHRyLCBGQUxTRSk7CisKICAgICAgICAgaWYgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTkVFRFNfRVJBU0VCS0dORCkKICAgICAgICAgewogICAgICAgICAgICAgSERDIGhkYyA9IEdldERDRXgoIGh3bmQsIHduZFB0ci0+aHJnblVwZGF0ZSwKZGlmZiAtLWdpdCBhL3dpbmRvd3MvdGltZXIuYyBiL3dpbmRvd3MvdGltZXIuYwppbmRleCBjYTFhNjIwLi45ZjhjYzRhIDEwMDY0NAotLS0gYS93aW5kb3dzL3RpbWVyLmMKKysrIGIvd2luZG93cy90aW1lci5jCkBAIC0xNCw2ICsxNCw3IEBACiB0eXBlZGVmIHN0cnVjdCB0YWdUSU1FUgogewogICAgIEhXTkQgICAgICAgICAgICAgaHduZDsKKyAgICBIUVVFVUUJICAgICBocTsKICAgICBXT1JEICAgICAgICAgICAgIG1zZzsgIC8qIFdNX1RJTUVSIG9yIFdNX1NZU1RJTUVSICovCiAgICAgV09SRCAgICAgICAgICAgICBpZDsKICAgICBXT1JEICAgICAgICAgICAgIHRpbWVvdXQ7CkBAIC03NCw2ICs3NSw1OCBAQAogICAgIHBUaW1lci0+bmV4dCA9IE5VTEw7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRJTUVSX1N3aXRjaFF1ZXVlCisgKi8KK3ZvaWQgVElNRVJfU3dpdGNoUXVldWUoSFFVRVVFIG9sZCwgSFFVRVVFIG5ldykKK3sKKyBUSU1FUiogICAgICAgICBwVCA9IHBOZXh0VGltZXI7CisKKyB3aGlsZShwVCkKKyAgeworICAgaWYoIHBULT5ocSA9PSBvbGQgKSBwVC0+aHEgPSBuZXc7CisgICBwVCA9IHBULT5uZXh0OworICB9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVElNRVJfTnVrZVRpbWVycworICoKKyAqIFRyYXNoIGFsbCB0aW1lcnMgdGhhdCBhcmUgYm91bmQgdG8gdGhlIGh3bmQgb3IgaHEKKyAqLwordm9pZCBUSU1FUl9OdWtlVGltZXJzKEhXTkQgaHduZCwgSFFVRVVFIGhxKQoreworIEhRVUVVRQkJaFFUb1VwZGF0ZSA9ICggaHduZCApID8gR2V0VGFza1F1ZXVlKCBHZXRXaW5kb3dUYXNrKCBod25kICkgKQorCQkJCSAgICAgIDogaHE7CisgVElNRVIqICAgICAgICAgcFQgPSBwTmV4dFRpbWVyOworIFRJTUVSKiAgICAgICAgIHBUbmV4dDsKKworIGlmKCAhcFQgKSByZXR1cm47CisKKyB3aGlsZSggKGh3bmQgJiYgcFQtPmh3bmQgPT0gaHduZCkgfHwKKyAgICAgICAgKGhxICYmIHBULT5ocSA9PSBocSkgKQorICAgICAgeworCSBRVUVVRV9EZWNUaW1lckNvdW50KCBoUVRvVXBkYXRlICk7CisgICAgICAgICBpZiggIShwVCA9IHBOZXh0VGltZXIgPSBwTmV4dFRpbWVyLT5uZXh0KSApCisgICAgICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgLyogcFQgcG9pbnRzIHRvIHRoZSAiZ29vZCIgdGltZXIgKi8KKworIHdoaWxlKCAocFRuZXh0ID0gcFQtPm5leHQpICkKKyAgICB7CisgICAgICB3aGlsZSggKGh3bmQgJiYgcFRuZXh0LT5od25kID09IGh3bmQpIHx8CisgICAgICAgICAgICAgKGhxICYmIHBUbmV4dC0+aHEgPT0gaHEpICkKKwkgICB7CisJICAgICAgUVVFVUVfRGVjVGltZXJDb3VudCggaFFUb1VwZGF0ZSApOworICAgICAgICAgICAgICBpZiggIShwVC0+bmV4dCA9IHBUbmV4dC0+bmV4dCkgKQorICAgICAgICAgICAgICAgICAgcmV0dXJuOworCSAgIH0KKworICAgICAgcFQgPSBwVC0+bmV4dDsKKyAgICB9Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFRJTUVSX1Jlc3RhcnRUaW1lcnMKQEAgLTE2NSw2ICsyMTgsOCBAQAogICAgICAgLyogQWRkIHRoZSB0aW1lciAqLwogCiAgICAgcFRpbWVyLT5od25kICAgID0gaHduZDsKKyAgICBwVGltZXItPmhxCSAgICA9IChod25kKSA/IEdldFRhc2tRdWV1ZSggR2V0V2luZG93VGFzayggaHduZCApICkKKwkJCSAgICAgOiBHZXRUYXNrUXVldWUoIDAgKTsKICAgICBwVGltZXItPm1zZyAgICAgPSBzeXMgPyBXTV9TWVNUSU1FUiA6IFdNX1RJTUVSOwogICAgIHBUaW1lci0+aWQgICAgICA9IGlkOwogICAgIHBUaW1lci0+dGltZW91dCA9IHRpbWVvdXQ7CkBAIC0xNzMsNyArMjI4LDcgQEAKICAgICBkcHJpbnRmX3RpbWVyKHN0ZGRlYiwgIlRpbWVyIGFkZGVkOiAlcCwgJTA0eCwgJTA0eCwgJTA0eCwgJTA4bHhcbiIsIAogCQkgIHBUaW1lciwgcFRpbWVyLT5od25kLCBwVGltZXItPm1zZywgcFRpbWVyLT5pZCwgKERXT1JEKXBUaW1lci0+cHJvYyk7CiAgICAgVElNRVJfSW5zZXJ0VGltZXIoIHBUaW1lciApOwotICAgIFFVRVVFX0luY1RpbWVyQ291bnQoIEdldFRhc2tRdWV1ZSgwKSApOworICAgIFFVRVVFX0luY1RpbWVyQ291bnQoIHBUaW1lci0+aHEgKTsKICAgICBpZiAoIWlkKQogCXJldHVybiBUUlVFOwogICAgIGVsc2UKQEAgLTE4OCw2ICsyNDMsNyBAQAogewogICAgIGludCBpOwogICAgIFRJTUVSICogcFRpbWVyOworICAgIEhRVUVVRSAgaHE7CiAgICAgCiAgICAgICAvKiBGaW5kIHRoZSB0aW1lciAqLwogICAgIApAQCAtMjAxLDEzICsyNTcsMTUgQEAKIAogICAgICAgLyogRGVsZXRlIHRoZSB0aW1lciAqLwogCisgICAgaHEgPSBwVGltZXItPmhxOworCiAgICAgcFRpbWVyLT5od25kICAgID0gMDsKICAgICBwVGltZXItPm1zZyAgICAgPSAwOwogICAgIHBUaW1lci0+aWQgICAgICA9IDA7CiAgICAgcFRpbWVyLT50aW1lb3V0ID0gMDsKICAgICBwVGltZXItPnByb2MgICAgPSAwOwogICAgIFRJTUVSX1JlbW92ZVRpbWVyKCBwVGltZXIgKTsKLSAgICBRVUVVRV9EZWNUaW1lckNvdW50KCBHZXRUYXNrUXVldWUoMCkgKTsKKyAgICBRVUVVRV9EZWNUaW1lckNvdW50KCBocSApOwogICAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCA4NTExYTczLi41YzBiMmFiIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTIxNywzMCArMjE3LDQzIEBACiAgKgogICogRmluZCBhIHdpbmRvdyB0aGF0IG5lZWRzIHJlcGFpbnQuCiAgKi8KLUhXTkQgV0lOX0ZpbmRXaW5Ub1JlcGFpbnQoIEhXTkQgaHduZCApCitIV05EIFdJTl9GaW5kV2luVG9SZXBhaW50KCBIV05EIGh3bmQsIEhRVUVVRSBoUXVldWUgKQogewotICAgIFdORCAqIHduZFB0cjsKKyAgICBIV05EIGh3bmRSZXQ7CisgICAgV05EICpwV25kID0gcFduZERlc2t0b3A7CiAKLSAgICAgIC8qIE5vdGU6IHRoZSBkZXNrdG9wIHdpbmRvdyBuZXZlciBnZXRzIFdNX1BBSU5UIG1lc3NhZ2VzICovCi0gICAgd25kUHRyID0gaHduZCA/IFdJTl9GaW5kV25kUHRyKCBod25kICkgOiBwV25kRGVza3RvcC0+Y2hpbGQ7Ci0gICAgZm9yICggOyB3bmRQdHI7IHduZFB0ciA9IHduZFB0ci0+bmV4dCkKKyAgICAvKiBOb3RlOiB0aGUgZGVza3RvcCB3aW5kb3cgbmV2ZXIgZ2V0cyBXTV9QQUlOVCBtZXNzYWdlcyAqLworICAgIHBXbmQgPSBod25kID8gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSA6IHBXbmREZXNrdG9wLT5jaGlsZDsKKworICAgIGZvciAoIDsgcFduZCA7IHBXbmQgPSBwV25kLT5uZXh0ICkKICAgICB7Ci0JZHByaW50Zl93aW4oIHN0ZGRlYiwgIldJTl9GaW5kV2luVG9SZXBhaW50OiAlMDR4LCBzdHlsZSAlMDhseFxuIiwKLQkJICAgICB3bmRQdHItPmh3bmRTZWxmLCB3bmRQdHItPmR3U3R5bGUgKTsKLSAgICAgICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgV1NfVklTSUJMRSkgfHwgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTk9fUkVEUkFXKSkKKyAgICAgICAgaWYgKCEocFduZC0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpIHx8IChwV25kLT5mbGFncyAmIFdJTl9OT19SRURSQVcpKQorICAgICAgICB7CisgICAgICAgICAgICBkcHJpbnRmX3dpbiggc3RkZGViLCAiRmluZFdpblRvUmVwYWludDogc2tpcHBpbmcgd2luZG93ICUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFduZC0+aHduZFNlbGYgKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFKSAmJiAoV0lOX0NMQVNTX0lORk8od25kUHRyKS5oSWNvbikpCi0gICAgICAgICAgICBjb250aW51ZTsKLQlpZiAod25kUHRyLT5ocmduVXBkYXRlIHx8ICh3bmRQdHItPmZsYWdzICYgV0lOX0lOVEVSTkFMX1BBSU5UKSkKLQkgICAgcmV0dXJuIHduZFB0ci0+aHduZFNlbGY7Ci0JaWYgKHduZFB0ci0+Y2hpbGQpCi0JewotCSAgICBIV05EIGNoaWxkOwotCSAgICBpZiAoKGNoaWxkID0gV0lOX0ZpbmRXaW5Ub1JlcGFpbnQoIHduZFB0ci0+Y2hpbGQtPmh3bmRTZWxmICkpKQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQorICAgICAgICB9CisgICAgICAgIGlmICgocFduZC0+aG1lbVRhc2tRID09IGhRdWV1ZSkgJiYKKyAgICAgICAgICAgIChwV25kLT5ocmduVXBkYXRlIHx8IChwV25kLT5mbGFncyAmIFdJTl9JTlRFUk5BTF9QQUlOVCkpKSBicmVhazsKKyAgICAgICAgCisgICAgICAgIGlmIChwV25kLT5jaGlsZCApCisgICAgICAgICAgICBpZiAoKGh3bmRSZXQgPSBXSU5fRmluZFdpblRvUmVwYWludCggcFduZC0+Y2hpbGQtPmh3bmRTZWxmLCBoUXVldWUgKSkgKQorICAgICAgICAgICAgICAgIHJldHVybiBod25kUmV0OwogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICAKKyAgICBpZiAoIXBXbmQpIHJldHVybiAwOworICAgIAorICAgIGh3bmRSZXQgPSBwV25kLT5od25kU2VsZjsKKworICAgIC8qIGxvb2sgYW1vbmcgc2libGluZ3MgaWYgd2UgZ290IGEgdHJhbnNwYXJlbnQgd2luZG93ICovCisgICAgd2hpbGUgKHBXbmQgJiYgKChwV25kLT5kd0V4U3R5bGUgJiBXU19FWF9UUkFOU1BBUkVOVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIShwV25kLT5ocmduVXBkYXRlIHx8IChwV25kLT5mbGFncyAmIFdJTl9JTlRFUk5BTF9QQUlOVCkpKSkKKyAgICB7CisgICAgICAgIHBXbmQgPSBwV25kLT5uZXh0OworICAgIH0KKyAgICBpZiAocFduZCkgaHduZFJldCA9IHBXbmQtPmh3bmRTZWxmOworICAgIGRwcmludGZfd2luKHN0ZGRlYiwiRmluZFdpblRvUmVwYWludDogZm91bmQgJTA0eFxuIixod25kUmV0KTsKKyAgICByZXR1cm4gaHduZFJldDsKIH0KIAogCkBAIC0yNTIsMTkgKzI2NSwzNSBAQAogICovCiB2b2lkIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBIV05EIGh3bmQsIFdPUkQgZXZlbnQsIFdPUkQgaWRDaGlsZCwgTE9ORyBsVmFsdWUgKQogewotICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLSAgICAKLSAgICB3aGlsZSAod25kUHRyICYmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkpCisgICAgTFBQT0lOVCAgbHBwdCA9IChMUFBPSU5UKSh2b2lkKikoJmxWYWx1ZSk7CisgICAgV05EICAgICAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICBCT09MICAgICBiTW91c2UgPSAoKGV2ZW50IDw9IFdNX01PVVNFTEFTVCkgJiYgKGV2ZW50ID49IFdNX01PVVNFRklSU1QpKTsKKworICAgIC8qIGlmIGxWYWx1ZSBjb250YWlucyBjdXJzb3IgY29vcmRpbmF0ZXMgdGhleSBoYXZlIHRvIGJlCisgICAgICogbWFwcGVkIHRvIHRoZSBjbGllbnQgYXJlYSBvZiBwYXJlbnQgd2luZG93ICovCisKKyAgICBpZiAoYk1vdXNlKSBNYXBXaW5kb3dQb2ludHMoMCwgaHduZCwgbHBwdCwgMik7CisjaWZuZGVmIFdJTkVMSUIzMgorICAgIGVsc2UgbFZhbHVlID0gTUFLRUxPTkcoIExPV09SRChsVmFsdWUpLCBpZENoaWxkICk7CisjZW5kaWYKKworICAgIHdoaWxlICh3bmRQdHIpCiAgICAgewotICAgICAgICBpZiAod25kUHRyLT5kd0V4U3R5bGUgJiBXU19FWF9OT1BBUkVOVE5PVElGWSkgYnJlYWs7CisgICAgICAgIGlmICgod25kUHRyLT5kd0V4U3R5bGUgJiBXU19FWF9OT1BBUkVOVE5PVElGWSkgfHwKKwkgICAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSkgYnJlYWs7CisKKyAgICAgICAgaWYgKGJNb3VzZSkKKyAgICAgICAgeworCSAgICBscHB0LT54ICs9IHduZFB0ci0+cmVjdENsaWVudC5sZWZ0OworCSAgICBscHB0LT55ICs9IHduZFB0ci0+cmVjdENsaWVudC50b3A7CisgICAgICAgIH0KKwogICAgICAgICB3bmRQdHIgPSB3bmRQdHItPnBhcmVudDsKICNpZmRlZiBXSU5FTElCMzIKIAlTZW5kTWVzc2FnZSggd25kUHRyLT5od25kU2VsZiwgV01fUEFSRU5UTk9USUZZLCAKLQkJICAgICBNQUtFV1BBUkFNKGV2ZW50LGlkQ2hpbGQpLAotCQkgICAgIChMUEFSQU0pbFZhbHVlICk7CisJCSAgICAgTUFLRVdQQVJBTSggZXZlbnQsIGlkQ2hpbGQgKSwgbFZhbHVlICk7CiAjZWxzZQotCVNlbmRNZXNzYWdlKCB3bmRQdHItPmh3bmRTZWxmLCBXTV9QQVJFTlROT1RJRlksIGV2ZW50LAotCQkgICAgIE1BS0VMUEFSQU0oTE9XT1JEKGxWYWx1ZSksIGlkQ2hpbGQpICk7CisJU2VuZE1lc3NhZ2UoIHduZFB0ci0+aHduZFNlbGYsIFdNX1BBUkVOVE5PVElGWSwgZXZlbnQsIChMUEFSQU0pbFZhbHVlKTsKICNlbmRpZgogICAgIH0KIH0KQEAgLTEyNjgsNyArMTI5Nyw3IEBACiAgICAgICAgIHBXbmRDaGlsZCA9IHduZFB0ci0+Y2hpbGQ7ICAvKiAuLnNpZGUgZWZmZWN0cyBhZnRlciB3bmRlbnVtcHJjICAqLwogICAgICAgICBpZiAoIUNhbGxFbnVtV2luZG93c1Byb2MoIHduZGVudW1wcmMsIHduZFB0ci0+aHduZFNlbGYsIGxQYXJhbSApKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChJc1dpbmRvdyhwV25kQ2hpbGQtPmh3bmRTZWxmKSkgLyp0byBwcmV2ZW50IHRvbyBlYXJseSB0ZXJtaW5hdGlvbiovCisgICAgICAgIGlmIChwV25kQ2hpbGQgJiYgSXNXaW5kb3cocFduZENoaWxkLT5od25kU2VsZikpCiAgICAgICAgICAgICBpZiAoIVdJTl9FbnVtQ2hpbGRXaW4ocFduZENoaWxkLCB3bmRlbnVtcHJjLCBsUGFyYW0pKSByZXR1cm4gMDsKICAgICAgICAgd25kUHRyID0gcFduZE5leHQ7CiAgICAgfSAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucG9zLmMgYi93aW5kb3dzL3dpbnBvcy5jCmluZGV4IDI5ZjNkNzAuLjUyNGYyODUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucG9zLmMKKysrIGIvd2luZG93cy93aW5wb3MuYwpAQCAtNiw3ICs2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgotI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJldmVudC5oIgpAQCAtMjM4LDcgKzIzOCw3IEBACiAKICAgICAgICAgLyogUmVzdGFydCB0aGUgc2VhcmNoIGZyb20gdGhlIG5leHQgc2libGluZyAqLwogICAgICAgICB3bmRQdHIgPSAoKnBwV25kKS0+bmV4dDsKLSAgICAgICAgKnBwV25kID0gd25kUHRyLT5wYXJlbnQ7CisgICAgICAgICpwcFduZCA9ICgqcHBXbmQpLT5wYXJlbnQ7CiAgICAgfQogfQogCkBAIC0yNTksMjIgKzI1OSwyOSBAQAogICovCiBIV05EIENoaWxkV2luZG93RnJvbVBvaW50KCBIV05EIGh3bmRQYXJlbnQsIFBPSU5UIHB0ICkKIHsKKyAgICAvKiBwdCBpcyBpbiB0aGUgY2xpZW50IGNvb3JkaW5hdGVzICovCisKKyAgICBXTkQqIHduZCA9IFdJTl9GaW5kV25kUHRyKGh3bmRQYXJlbnQpOwogICAgIFJFQ1QgcmVjdDsKLSAgICBIV05EIGh3bmQ7Ci0gICAgCi0gICAgR2V0V2luZG93UmVjdCggaHduZFBhcmVudCwgJnJlY3QgKTsKKworICAgIGlmKCAhd25kICkgcmV0dXJuIDA7CisKKyAgICAvKiBnZXQgY2xpZW50IHJlY3QgZmFzdCAqLworICAgIHJlY3QudG9wID0gcmVjdC5sZWZ0ID0gMDsKKyAgICByZWN0LnJpZ2h0ID0gd25kLT5yZWN0Q2xpZW50LnJpZ2h0IC0gd25kLT5yZWN0Q2xpZW50LmxlZnQ7CisgICAgcmVjdC5ib3R0b20gPSB3bmQtPnJlY3RDbGllbnQuYm90dG9tIC0gd25kLT5yZWN0Q2xpZW50LnRvcDsKKwogICAgIGlmICghUHRJblJlY3QoICZyZWN0LCBwdCApKSByZXR1cm4gMDsKLSAgICBod25kID0gR2V0VG9wV2luZG93KCBod25kUGFyZW50ICk7Ci0gICAgd2hpbGUgKGh3bmQpCisKKyAgICB3bmQgPSB3bmQtPmNoaWxkOworICAgIHdoaWxlICggd25kICkKICAgICB7Ci0JR2V0V2luZG93UmVjdCggaHduZCwgJnJlY3QgKTsKLQlpZiAoUHRJblJlY3QoICZyZWN0LCBwdCApKSByZXR1cm4gaHduZDsKLQlod25kID0gR2V0V2luZG93KCBod25kLCBHV19IV05ETkVYVCApOworICAgICAgICBpZiAoUHRJblJlY3QoICZ3bmQtPnJlY3RXaW5kb3csIHB0ICkpIHJldHVybiB3bmQtPmh3bmRTZWxmOworICAgICAgICB3bmQgPSB3bmQtPm5leHQ7CiAgICAgfQogICAgIHJldHVybiBod25kUGFyZW50OwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIE1hcFdpbmRvd1BvaW50cyAgIChVU0VSLjI1OCkKICAqLwpAQCAtNjUyLDEwICs2NTksMTUgQEAKICAgICBXTkQgICAgICAgICAgICAgICAgICAgKnduZFB0ciAgICAgICAgICA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwogICAgIFdORCAgICAgICAgICAgICAgICAgICAqd25kVGVtcCAgICAgICAgID0gV0lOX0ZpbmRXbmRQdHIoaHduZEFjdGl2ZSk7CiAgICAgQ0JUQUNUSVZBVEVTVFJVQ1QgICAgICBjYnRTdHJ1Y3QgICAgICAgPSB7IGZNb3VzZSAsIGh3bmRBY3RpdmUgfTsKLSAgICBGQVJQUk9DICAgICAgICAgICAgICAgIGVudW1DYWxsYmFjayAgICA9IChGQVJQUk9DKUdldFduZFByb2NFbnRyeTE2KCJBY3RpdmF0ZUFwcFByb2MiKTsKKyAgICBGQVJQUk9DICAgICAgICAgICAgICAgIGVudW1DYWxsYmFjayAgICA9IE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiQWN0aXZhdGVBcHBQcm9jIik7CiAgICAgQUNUSVZBVEVTVFJVQ1QgICAgICAgICBhY3RTdHJ1Y3Q7CiAgICAgV09SRCAgICAgICAgICAgICAgICAgICB3SWNvbml6ZWQ9MCx3UmV0PSAwOwotICAgIEhBTkRMRSAgICAgICAgICAgICAgICAgaEFjdGl2ZVEgPSAwOworCisgICAgLyogRklYTUU6IFdoZW4gcHJvcGVyIHN1cHBvcnQgZm9yIGNvb3BlcmF0aXZlIG11bHRpdGFza2luZyBpcyBpbiBwbGFjZSAKKyAgICAgKiAgICAgICAgaEFjdGl2ZVEgd2lsbCBiZSBnbG9iYWwgCisgICAgICovCisKKyAgICBIQU5ETEUgICAgICAgICAgICAgICAgIGhBY3RpdmVRID0gMDsgICAKIAogICAgIC8qIHBhcmFub2lkIGNoZWNrcyAqLwogICAgIGlmKCAhaFduZCB8fCBoV25kID09IEdldERlc2t0b3BXaW5kb3coKSB8fCBoV25kID09IGh3bmRBY3RpdmUgKQpAQCAtODA1LDE2ICs4MTcsMjQgQEAKIAogICAgIGlmKCAhd25kUHRyICkgcmV0dXJuIEZBTFNFOwogCi0gICAgLyogbWlub3JzIGFyZSBub3QgYWxsb3dlZCAqLworICAgIC8qIGNoaWxkIHdpbmRvd3MgZ2V0IFdNX0NISUxEQUNUSVZBVEUgbWVzc2FnZSAqLwogICAgIGlmKCAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpICYmICEoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX1BPUFVQKSkKIAlyZXR1cm4gU2VuZE1lc3NhZ2UoaFduZCwgV01fQ0hJTERBQ1RJVkFURSwgMCwgMEwpOwogCisgICAgICAgIC8qIG93bmVkIHBvcHVwcyBpbXBseSBvd25lciBhY3RpdmF0aW9uICovCisgICAgaWYoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX1BPUFVQICYmIHduZFB0ci0+b3duZXIgKQorICAgICAgeworICAgICAgICB3bmRQdHIgPSB3bmRQdHItPm93bmVyOworICAgICAgICBpZiggIXduZFB0ciApIHJldHVybiBGQUxTRTsKKwloV25kID0gd25kUHRyLT5od25kU2VsZjsKKyAgICAgIH0KKwogICAgIGlmKCBoV25kID09IGh3bmRBY3RpdmUgKSByZXR1cm4gRkFMU0U7CiAKICAgICBpZiggIVdJTlBPU19TZXRBY3RpdmVXaW5kb3coaFduZCAsbW91c2VNc2cgLFRSVUUpICkKIAlyZXR1cm4gRkFMU0U7CiAKLSAgICAvKiBzd2l0Y2ggZGVza3RvcCBxdWV1ZSB0byBjdXJyZW50IGFjdGl2ZSBoZXJlICovCisgICAgLyogc3dpdGNoIGRlc2t0b3AgcXVldWUgdG8gY3VycmVudCBhY3RpdmUgKi8KICAgICBpZiggd25kUHRyLT5wYXJlbnQgPT0gV0lOX0dldERlc2t0b3AoKSkKICAgICAgICAgV0lOX0dldERlc2t0b3AoKS0+aG1lbVRhc2tRID0gd25kUHRyLT5obWVtVGFza1E7CiAKQEAgLTk0Nyw2ICs5NjcsNzkgQEAKICAgICB9CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdJTlBPU19SZW9yZGVyT3duZWRQb3B1cHMKKyAqCisgKiBmaXggWiBvcmRlciB0YWtpbmcgaW50byBhY2NvdW50IG93bmVkIHBvcHVwcyAtCisgKiBiYXNpY2FsbHkgd2UgbmVlZCB0byBtYWludGFpbiB0aGVtIGFib3ZlIG93bmVyIHdpbmRvdworICovCitIV05EIFdJTlBPU19SZW9yZGVyT3duZWRQb3B1cHMoSFdORCBod25kSW5zZXJ0QWZ0ZXIsIFdORCogd25kUHRyLCBXT1JEIGZsYWdzKQoreworIFdORCogCXcgPSBXSU5fR2V0RGVza3RvcCgpOworCisgdyA9IHctPmNoaWxkOworCisgLyogaWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBvd25lZCBwb3B1cC4uLiAKKyAgKi8KKyBpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfUE9QVVAgJiYgd25kUHRyLT5vd25lciAmJiBod25kSW5zZXJ0QWZ0ZXIgIT0gSFdORF9UT1AgKQorICAgeworICAgICBCT09MIGJGb3VuZCA9IEZBTFNFOworICAgICBIV05EIGh3bmRMb2NhbFByZXYgPSBIV05EX1RPUDsKKyAgICAgSFdORCBod25kTmV3QWZ0ZXIgPSAwOworCisgICAgIHdoaWxlKCB3ICkKKyAgICAgICB7CisgICAgICAgICBpZiggIWJGb3VuZCAmJiBod25kSW5zZXJ0QWZ0ZXIgPT0gaHduZExvY2FsUHJldiApCisgICAgICAgICAgICAgaHduZEluc2VydEFmdGVyID0gSFdORF9UT1A7CisKKyAgICAgICAgIGlmKCB3LT5kd1N0eWxlICYgV1NfUE9QVVAgJiYgdy0+b3duZXIgPT0gd25kUHRyLT5vd25lciApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICBiRm91bmQgPSBUUlVFOworCisgICAgICAgICAgICAgaWYoIGh3bmRJbnNlcnRBZnRlciA9PSBIV05EX1RPUCApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGh3bmRJbnNlcnRBZnRlciA9IGh3bmRMb2NhbFByZXY7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGh3bmROZXdBZnRlciA9IGh3bmRMb2NhbFByZXY7CisgICAgICAgICAgIH0KKworICAgICAgICAgaWYoIHcgPT0gd25kUHRyLT5vd25lciApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAvKiBiYXNpY2FsbHkgSFdORF9CT1RUT00gKi8KKyAgICAgICAgICAgICBod25kSW5zZXJ0QWZ0ZXIgPSBod25kTG9jYWxQcmV2OworCisgICAgICAgICAgICAgaWYoIGJGb3VuZCApCisgICAgICAgICAgICAgICAgIGh3bmRJbnNlcnRBZnRlciA9IGh3bmROZXdBZnRlcjsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIGlmKCB3ICE9IHduZFB0ciApCisgICAgICAgICAgICAgICBod25kTG9jYWxQcmV2ID0gdy0+aHduZFNlbGY7CisKKyAgICAgICAgICAgdyA9IHctPm5leHQ7CisgICAgICAgIH0KKyAgIH0KKyBlbHNlIAorICAgLyogb3Igb3ZlcmxhcHBlZCB0b3AtbGV2ZWwgd2luZG93Li4uIAorICAgICovCisgICBpZiggISh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkgKQorICAgICAgd2hpbGUoIHcgKQorICAgICAgICB7CisgICAgICAgICAgaWYoIHcgPT0gd25kUHRyICkgYnJlYWs7CisKKyAgICAgICAgICBpZiggdy0+ZHdTdHlsZSAmIFdTX1BPUFVQICYmIHctPm93bmVyID09IHduZFB0ciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFNldFdpbmRvd1Bvcyh3LT5od25kU2VsZiwgaHduZEluc2VydEFmdGVyLCAwLCAwLCAwLCAwLCBTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9TRU5EQ0hBTkdJTkcgfCBTV1BfREVGRVJFUkFTRSk7CisgICAgICAgICAgICAgIGh3bmRJbnNlcnRBZnRlciA9IHctPmh3bmRTZWxmOworICAgICAgICAgICAgfQorICAgICAgICAgIHcgPSB3LT5uZXh0OworICAgICAgICB9CisKKyAgcmV0dXJuIGh3bmRJbnNlcnRBZnRlcjsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXSU5QT1NfU2V0WFdpbmRvd1BvcwpAQCAtMTA3OSw2ICsxMTcyLDEyIEBACiAKICAgICBpZiAoISh3aW5wb3MuZmxhZ3MgJiBTV1BfTk9aT1JERVIpKQogICAgIHsKKwkvKiByZW9yZGVyIG93bmVkIHBvcHVwcyBpZiBod25kIGlzIHRvcC1sZXZlbCB3aW5kb3cgCisgICAgICAgICAqLworCWlmKCB3bmRQdHItPnBhcmVudCA9PSBXSU5fR2V0RGVza3RvcCgpICkKKwkgICAgaHduZEluc2VydEFmdGVyID0gV0lOUE9TX1Jlb3JkZXJPd25lZFBvcHVwcyggaHduZEluc2VydEFmdGVyLAorCQkJCQkJCSB3bmRQdHIsIGZsYWdzICk7CisKICAgICAgICAgaWYgKHduZFB0ci0+d2luZG93KQogICAgICAgICB7CiAgICAgICAgICAgICBXSU5fVW5saW5rV2luZG93KCB3aW5wb3MuaHduZCApOwpAQCAtMTA5OCw5ICsxMTk3LDE0IEBACiAKICAgICBpZiAod25kUHRyLT53aW5kb3cpCiAgICAgeworICAgICAgICBIV05EIGJvZ3VzSW5zZXJ0QWZ0ZXIgPSB3aW5wb3MuaHduZEluc2VydEFmdGVyOworCisgICAgICAgIHdpbnBvcy5od25kSW5zZXJ0QWZ0ZXIgPSBod25kSW5zZXJ0QWZ0ZXI7CiAgICAgICAgIFdJTlBPU19TZXRYV2luZG93UG9zKCAmd2lucG9zICk7CisKICAgICAgICAgd25kUHRyLT5yZWN0V2luZG93ID0gbmV3V2luZG93UmVjdDsKICAgICAgICAgd25kUHRyLT5yZWN0Q2xpZW50ID0gbmV3Q2xpZW50UmVjdDsKKyAgICAgICAgd2lucG9zLmh3bmRJbnNlcnRBZnRlciA9IGJvZ3VzSW5zZXJ0QWZ0ZXI7CiAgICAgfQogICAgIGVsc2UKICAgICB7CmRpZmYgLS1naXQgYS93aW5lLm1hbiBiL3dpbmUubWFuCmluZGV4IDJmM2Y2YzUuLmMwOGY1NjQgMTAwNjQ0Ci0tLSBhL3dpbmUubWFuCisrKyBiL3dpbmUubWFuCkBAIC0xMDQsNyArMTA0LDcgQEAKIC5JIC1sYW5ndWFnZSB4eAogU2V0IHRoZSBsYW5ndWFnZSB0bwogLkkgeHgKLShvbmUgb2YgRW4sIEVzLCBEZSwgTm8sIEZyLCBGaSwgRGEsIEN6LCBFbykKKyhvbmUgb2YgRW4sIEVzLCBEZSwgTm8sIEZyLCBGaSwgRGEsIEN6LCBFbywgSXQpCiAuVFAKIC5JIC1tYW5hZ2VkCiBDcmVhdGUgZWFjaCB0b3AtbGV2ZWwgd2luZG93IGFzIGEgcHJvcGVybHkgbWFuYWdlZCBYIHdpbmRvdwo=