ZGlmZiAtLWdpdCBhL01pc2MvTkVXUyBiL01pc2MvTkVXUwppbmRleCBjYWFhNjkzLi42ZTdlZDNhIDEwMDY0NAotLS0gYS9NaXNjL05FV1MKKysrIGIvTWlzYy9ORVdTCkBAIC0xNDIsNiArMTQyLDggQEAKIEV4dGVuc2lvbiBNb2R1bGVzCiAtLS0tLS0tLS0tLS0tLS0tLQogCistIElzc3VlICMyMjM4MTogVXBkYXRlIHpsaWIgdG8gMS4yLjguCisKIC0gSXNzdWUgIzIyMTc2OiBVcGRhdGUgdGhlIGN0eXBlcyBtb2R1bGUncyBsaWJmZmkgdG8gdjMuMS4gIFRoaXMgcmVsZWFzZQogICBhZGRzIHN1cHBvcnQgZm9yIHRoZSBMaW51eCBBQXJjaDY0IGFuZCBQT1dFUlBDIEVMRiBBQkl2MiBsaXR0bGUgZW5kaWFuCiAgIGFyY2hpdGVjdHVyZXMuCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvQ2hhbmdlTG9nIGIvTW9kdWxlcy96bGliL0NoYW5nZUxvZwppbmRleCA3ZjY4NjlkLi5mMjJhYWJhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWIvQ2hhbmdlTG9nCisrKyBiL01vZHVsZXMvemxpYi9DaGFuZ2VMb2cKQEAgLTEsNiArMSw2MjMgQEAKIAogICAgICAgICAgICAgICAgIENoYW5nZUxvZyBmaWxlIGZvciB6bGliCiAKK0NoYW5nZXMgaW4gMS4yLjggKDI4IEFwciAyMDEzKQorLSBVcGRhdGUgY29udHJpYi9taW5pemlwL2lvd2luMzIuYyBmb3IgV2luZG93cyBSVCBbVm9sbGFudF0KKy0gRG8gbm90IGZvcmNlIFpfQ09OU1QgZm9yIEMrKworLSBDbGVhbiB1cCBjb250cmliL3ZzdHVkaW8gW1Jvp10KKy0gQ29ycmVjdCBzcGVsbGluZyBlcnJvciBpbiB6bGliLmgKKy0gRml4IG1peGVkIGxpbmUgZW5kaW5ncyBpbiBjb250cmliL3ZzdHVkaW8KKworQ2hhbmdlcyBpbiAxLjIuNy4zICgxMyBBcHIgMjAxMykKKy0gRml4IHZlcnNpb24gbnVtYmVycyBhbmQgRExMIG5hbWVzIGluIGNvbnRyaWIvdnN0dWRpby8qL3psaWIucmMKKworQ2hhbmdlcyBpbiAxLjIuNy4yICgxMyBBcHIgMjAxMykKKy0gQ2hhbmdlIGNoZWNrIGZvciBhIGZvdXItYnl0ZSB0eXBlIGJhY2sgdG8gaGV4YWRlY2ltYWwKKy0gRml4IHR5cG8gaW4gd2luMzIvTWFrZWZpbGUubXNjCistIEFkZCBjYXN0cyBpbiBnendyaXRlLmMgZm9yIHBvaW50ZXIgZGlmZmVyZW5jZXMKKworQ2hhbmdlcyBpbiAxLjIuNy4xICgyNCBNYXIgMjAxMykKKy0gUmVwbGFjZSB1c2Ugb2YgdW5zYWZlIHN0cmluZyBmdW5jdGlvbnMgd2l0aCBzbnByaW50ZiBpZiBhdmFpbGFibGUKKy0gQXZvaWQgaW5jbHVkaW5nIHN0ZGRlZi5oIG9uIFdpbmRvd3MgZm9yIFpfU09MTyBjb21waWxlIFtOaWVzc2lua10KKy0gRml4IGd6Z2V0YyB1bmRlZmluZSB3aGVuIFpfUFJFRklYIHNldCBbVHVya10KKy0gRWxpbWluYXRlIHVzZSBvZiBta3RlbXAgaW4gTWFrZWZpbGUgKG5vdCBhbHdheXMgYXZhaWxhYmxlKQorLSBGaXggYnVnIGluICdGJyBtb2RlIGZvciBnem9wZW4oKQorLSBBZGQgaW5mbGF0ZUdldERpY3Rpb25hcnkoKSBmdW5jdGlvbgorLSBDb3JyZWN0IGNvbW1lbnQgaW4gZGVmbGF0ZS5oCistIFVzZSBfc25wcmludGYgZm9yIHNucHJpbnRmIGluIE1pY3Jvc29mdCBDCistIE9uIERhcndpbiwgb25seSB1c2UgL3Vzci9iaW4vbGlidG9vbCBpZiBsaWJ0b29sIGlzIG5vdCBBcHBsZQorLSBEZWxldGUgIi0tdmVyc2lvbiIgZmlsZSBpZiBjcmVhdGVkIGJ5ICJhciAtLXZlcnNpb24iIFtSaWNoYXJkIEcuXQorLSBGaXggY29uZmlndXJlIGNoZWNrIGZvciB2ZXJhY2l0eSBvZiBjb21waWxlciBlcnJvciByZXR1cm4gY29kZXMKKy0gRml4IENNYWtlIGNvbXBpbGF0aW9uIG9mIHN0YXRpYyBsaWIgZm9yIE1TVkMyMDEwIHg2NAorLSBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGluIGluZmJhY2s5LmMKKy0gRml4IGFyZ3VtZW50IGNoZWNrcyBpbiBnemxvZ19jb21wcmVzcygpIGFuZCBnemxvZ193cml0ZSgpCistIENsZWFuIHVwIHRoZSB1c2FnZSBvZiB6X2NvbnN0IGFuZCByZXNwZWN0IGNvbnN0IHVzYWdlIHdpdGhpbiB6bGliCistIENsZWFuIHVwIGV4YW1wbGVzL2d6bG9nLltjaF0gY29tcGFyaXNvbnMgb2YgZGlmZmVyZW50IHR5cGVzCistIEF2b2lkIHNoaWZ0IGVxdWFsIHRvIGJpdHMgaW4gdHlwZSAoY2F1c2VkIGVuZGxlc3MgbG9vcCkKKy0gRml4IHVuaW50aWFsaXplZCB2YWx1ZSBidWcgaW4gZ3pwdXRjKCkgaW50cm9kdWNlZCBieSBjb25zdCBwYXRjaGVzCistIEZpeCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciBpbiBleGFtcGxlcy96cmFuLmMgW05vcl0KKy0gRml4IGJ1ZyB3aGVyZSBnem9wZW4oKSwgZ3pjbG9zZSgpIHdvdWxkIHdyaXRlIGFuIGVtcHR5IGZpbGUKKy0gRml4IGJ1ZyBpbiBnemNsb3NlKCkgd2hlbiBnendyaXRlKCkgcnVucyBvdXQgb2YgbWVtb3J5CistIENoZWNrIGZvciBpbnB1dCBidWZmZXIgbWFsbG9jIGZhaWx1cmUgaW4gZXhhbXBsZXMvZ3phcHBlbmQuYworLSBBZGQgbm90ZSB0byBjb250cmliL2JsYXN0IHRvIHVzZSBiaW5hcnkgbW9kZSBpbiBzdGRpbworLSBGaXggY29tcGFyaXNvbnMgb2YgZGlmZmVyZW50bHkgc2lnbmVkIGludGVnZXJzIGluIGNvbnRyaWIvYmxhc3QKKy0gQ2hlY2sgZm9yIGludmFsaWQgY29kZSBsZW5ndGggY29kZXMgaW4gY29udHJpYi9wdWZmCistIEZpeCBzZXJpb3VzIGJ1dCB2ZXJ5IHJhcmUgZGVjb21wcmVzc2lvbiBidWcgaW4gaW5mdHJlZXMuYworLSBVcGRhdGUgaW5mbGF0ZUJhY2soKSBjb21tZW50cywgc2luY2UgaW5mbGF0ZSgpIGNhbiBiZSBmYXN0ZXIKKy0gVXNlIHVuZGVyc2NvcmVkIEkvTyBmdW5jdGlvbiBuYW1lcyBmb3IgV0lOQVBJX0ZBTUlMWQorLSBBZGQgX3RyX2ZsdXNoX2JpdHMgdG8gdGhlIGV4dGVybmFsIHN5bWJvbHMgcHJlZml4ZWQgYnkgLS16cHJlZml4CistIEFkZCBjb250cmliL3ZzdHVkaW8vdmMxMCBwcmUtYnVpbGQgc3RlcCBmb3Igc3RhdGljIG9ubHkKKy0gUXVvdGUgLS12ZXJzaW9uLXNjcmlwdCBhcmd1bWVudCBpbiBDTWFrZUxpc3RzLnR4dAorLSBEb24ndCBzcGVjaWZ5IC0tdmVyc2lvbi1zY3JpcHQgb24gQXBwbGUgcGxhdGZvcm1zIGluIENNYWtlTGlzdHMudHh0CistIEZpeCBjYXN0aW5nIGVycm9yIGluIGNvbnRyaWIvdGVzdHpsaWIvdGVzdHpsaWIuYworLSBGaXggdHlwZXMgaW4gY29udHJpYi9taW5pemlwIHRvIG1hdGNoIHJlc3VsdCBvZiBnZXRfY3JjX3RhYmxlKCkKKy0gU2ltcGxpZnkgY29udHJpYi92c3R1ZGlvL3ZjMTAgd2l0aCAnZCcgc3VmZml4CistIEFkZCBUT1Agc3VwcG9ydCB0byB3aW4zMi9NYWtlZmlsZS5tc2MKKy0gU3Vwb3J0IGk2ODYgYW5kIGFtZDY0IGFzc2VtYmxlciBidWlsZHMgaW4gQ01ha2VMaXN0cy50eHQKKy0gRml4IHR5cG9zIGluIHRoZSB1c2Ugb2YgX0xBUkdFRklMRTY0X1NPVVJDRSBpbiB6Y29uZi5oCistIEFkZCB2YzExIGFuZCB2YzEyIGJ1aWxkIGZpbGVzIHRvIGNvbnRyaWIvdnN0dWRpbworLSBBZGQgZ3p2cHJpbnRmKCkgYXMgYW4gdW5kb2N1bWVudGVkIGZ1bmN0aW9uIGluIHpsaWIKKy0gRml4IGNvbmZpZ3VyZSBmb3IgU3VuIHNoZWxsCistIFJlbW92ZSBydW50aW1lIGNoZWNrIGluIGNvbmZpZ3VyZSBmb3IgZm91ci1ieXRlIGludGVnZXIgdHlwZQorLSBBZGQgY2FzdHMgYW5kIGNvbnN0cyB0byBlYXNlIHVzZXIgY29udmVyc2lvbiB0byBDKysKKy0gQWRkIG1hbiBwYWdlcyBmb3IgbWluaXppcCBhbmQgbWluaXVuemlwCistIEluIE1ha2VmaWxlIHVuaW5zdGFsbCwgZG9uJ3Qgcm0gaWYgcHJlY2VkaW5nIGNkIGZhaWxzCistIERvIG5vdCByZXR1cm4gWl9CVUZfRVJST1IgaWYgZGVmbGF0ZVBhcmFtKCkgaGFzIG5vdGhpbmcgdG8gd3JpdGUKKworQ2hhbmdlcyBpbiAxLjIuNyAoMiBNYXkgMjAxMikKKy0gUmVwbGFjZSB1c2Ugb2YgbWVtbW92ZSgpIHdpdGggYSBzaW1wbGUgY29weSBmb3IgcG9ydGFiaWxpdHkKKy0gVGVzdCBmb3IgZXhpc3RlbmNlIG9mIHN0cmVycm9yCistIFJlc3RvcmUgZ3pnZXRjXyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIDEuMi42CistIEZpeCBidWlsZCB3aXRoIG5vbi1HTlUgbWFrZSBvbiBTb2xhcmlzCistIFJlcXVpcmUgZ2NjIDQuMCBvciBsYXRlciBvbiBNYWMgT1MgWCB0byB1c2UgdGhlIGhpZGRlbiBhdHRyaWJ1dGUKKy0gSW5jbHVkZSB1bmlzdGQuaCBmb3IgV2F0Y29tIEMKKy0gVXNlIF9fV0FUQ09NQ19fIGluc3RlYWQgb2YgX19XQVRDT01fXworLSBEbyBub3QgdXNlIHRoZSB2aXNpYmlsaXR5IGF0dHJpYnV0ZSBpZiBOT19WSVogZGVmaW5lZAorLSBJbXByb3ZlIHRoZSBkZXRlY3Rpb24gb2Ygbm8gaGlkZGVuIHZpc2liaWxpdHkgYXR0cmlidXRlCistIEF2b2lkIHVzaW5nIF9faW50NjQgZm9yIGdjYyBvciBzb2xvIGNvbXBpbGF0aW9uCistIENhc3QgdG8gY2hhciAqIGluIGd6cHJpbnRmIHRvIGF2b2lkIHdhcm5pbmdzIFtaaW5zZXJdCistIEZpeCBtYWtlX3Ztcy5jb20gZm9yIFZBWCBbWmluc2VyXQorLSBEb24ndCB1c2UgbGlicmFyeSBvciBidWlsdC1pbiBieXRlIHN3YXBzCistIFNpbXBsaWZ5IHRlc3QgYW5kIHVzZSBvZiBnY2MgaGlkZGVuIGF0dHJpYnV0ZQorLSBGaXggYnVnIGluIGd6Y2xvc2VfdygpIHdoZW4gZ3p3cml0ZSgpIGZhaWxzIHRvIGFsbG9jYXRlIG1lbW9yeQorLSBBZGQgIngiIChPX0VYQ0wpIGFuZCAiZSIgKE9fQ0xPRVhFQykgbW9kZXMgc3VwcG9ydCB0byBnem9wZW4oKQorLSBGaXggYnVnIGluIHRlc3QvbWluaWd6aXAuYyBmb3IgY29uZmlndXJlIC0tc29sbworLSBGaXggY29udHJpYi92c3R1ZGlvIHByb2plY3QgbGluayBlcnJvcnMgW01vaGFuYXRoYXNdCistIEFkZCBhYmlsaXR5IHRvIGNob29zZSB0aGUgYnVpbGRlciBpbiBtYWtlX3Ztcy5jb20gW1NjaHdlZGFdCistIEFkZCBERVNURElSIHN1cHBvcnQgdG8gbWluZ3czMiB3aW4zMi9NYWtlZmlsZS5nY2MKKy0gRml4IGNvbW1lbnRzIGluIHdpbjMyL01ha2VmaWxlLmdjYyBmb3IgcHJvcGVyIHVzYWdlCistIEFsbG93IG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgaW5zdGFsbCBsb2NhdGlvbnMgZm9yIGNtYWtlCistIEdlbmVyYXRlIGFuZCBpbnN0YWxsIHRoZSBwa2ctY29uZmlnIGZpbGUgd2l0aCBjbWFrZQorLSBCdWlsZCBib3RoIGEgc3RhdGljIGFuZCBhIHNoYXJlZCB2ZXJzaW9uIG9mIHpsaWIgd2l0aCBjbWFrZQorLSBJbmNsdWRlIHZlcnNpb24gc3ltYm9scyBmb3IgY21ha2UgYnVpbGRzCistIElmIHVzaW5nIGNtYWtlIHdpdGggTVNWQywgYWRkIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHRvIHRoZSBpbmNsdWRlcworLSBSZW1vdmUgdW5uZWVkZWQgRVhUUkFfQ0ZMQUdTIGZyb20gd2luMzIvTWFrZWZpbGUuZ2NjIFtUcnV0YV0KKy0gTW92ZSBvYnNvbGV0ZSBlbXggbWFrZWZpbGUgdG8gb2xkIFtUcnV0YV0KKy0gQWxsb3cgdGhlIHVzZSBvZiAtV3VuZGVmIHdoZW4gY29tcGlsaW5nIG9yIHVzaW5nIHpsaWIKKy0gQXZvaWQgdGhlIHVzZSBvZiB0aGUgLXUgb3B0aW9uIHdpdGggbWt0ZW1wCistIEltcHJvdmUgaW5mbGF0ZSgpIGRvY3VtZW50YXRpb24gb24gdGhlIHVzZSBvZiBaX0ZJTklTSAorLSBSZWNvZ25pemUgY2xhbmcgYXMgZ2NjCistIEFkZCBnem9wZW5fdygpIGluIFdpbmRvd3MgZm9yIHdpZGUgY2hhcmFjdGVyIHBhdGggbmFtZXMKKy0gUmVuYW1lIHpjb25mLmggaW4gQ01ha2VMaXN0cy50eHQgdG8gbW92ZSBpdCBvdXQgb2YgdGhlIHdheQorLSBBZGQgc291cmNlIGRpcmVjdG9yeSBpbiBDTWFrZUxpc3RzLnR4dCBmb3IgYnVpbGRpbmcgZXhhbXBsZXMKKy0gTG9vayBpbiBidWlsZCBkaXJlY3RvcnkgZm9yIHpsaWIucGMgaW4gQ01ha2VMaXN0cy50eHQKKy0gUmVtb3ZlIGd6ZmxhZ3MgZnJvbSB6bGlidmMuZGVmIGluIHZjOSBhbmQgdmMxMAorLSBGaXggY29udHJpYi9taW5pemlwIGNvbXBpbGF0aW9uIGluIHRoZSBNaW5HVyBlbnZpcm9ubWVudAorLSBVcGRhdGUgLi9jb25maWd1cmUgZm9yIFNvbGFyaXMsIHN1cHBvcnQgLS02NCBbTW9vbmV5XQorLSBSZW1vdmUgLVIuIGZyb20gU29sYXJpcyBzaGFyZWQgYnVpbGQgKHBvc3NpYmxlIHNlY3VyaXR5IGlzc3VlKQorLSBBdm9pZCByYWNlIGNvbmRpdGlvbiBmb3IgcGFyYWxsZWwgbWFrZSAoLWopIHJ1bm5pbmcgZXhhbXBsZQorLSBGaXggdHlwZSBtaXNtYXRjaCBiZXR3ZWVuIGdldF9jcmNfdGFibGUoKSBhbmQgY3JjX3RhYmxlCistIEZpeCBwYXJzaW5nIG9mIHZlcnNpb24gd2l0aCAiLSIgaW4gQ01ha2VMaXN0cy50eHQgW1NuaWRlciwgWmllZ2xlcl0KKy0gRml4IHRoZSBwYXRoIHRvIHpsaWIubWFwIGluIENNYWtlTGlzdHMudHh0CistIEZvcmNlIHRoZSBuYXRpdmUgbGlidG9vbCBpbiBNYWMgT1MgWCB0byBhdm9pZCBHTlUgbGlidG9vbCBbQmVlYmVdCistIEFkZCBpbnN0cnVjdGlvbnMgdG8gd2luMzIvTWFrZWZpbGUuZ2NjIGZvciBzaGFyZWQgaW5zdGFsbCBbVG9ycmldCisKK0NoYW5nZXMgaW4gMS4yLjYuMSAoMTIgRmViIDIwMTIpCistIEF2b2lkIHRoZSB1c2Ugb2YgdGhlIE9iamVjdGl2ZS1DIHJlc2VydmVkIG5hbWUgImlkIgorLSBJbmNsdWRlIGlvLmggaW4gZ3pndXRzLmggZm9yIE1pY3Jvc29mdCBjb21waWxlcnMKKy0gRml4IHByb2JsZW0gd2l0aCAuL2NvbmZpZ3VyZSAtLXByZWZpeCBhbmQgZ3pnZXRjIG1hY3JvCistIEluY2x1ZGUgZ3pfaGVhZGVyIGRlZmluaXRpb24gd2hlbiBjb21waWxpbmcgemxpYiBzb2xvCistIFB1dCBnemZsYWdzKCkgZnVuY3Rpb25hbGl0eSBiYWNrIGluIHp1dGlsLmMKKy0gQXZvaWQgbGlicmFyeSBoZWFkZXIgaW5jbHVkZSBpbiBjcmMzMi5jIGZvciBaX1NPTE8KKy0gVXNlIG5hbWUgaW4gR0NDX0NMQVNTSUMgYXMgQyBjb21waWxlciBmb3IgY292ZXJhZ2UgdGVzdGluZywgaWYgc2V0CistIE1pbm9yIGNsZWFudXAgaW4gY29udHJpYi9taW5pemlwL3ppcC5jIFtWb2xsYW50XQorLSBVcGRhdGUgbWFrZV92bXMuY29tIFtaaW5zZXJdCistIFJlbW92ZSB1bm5lY2Vzc2FyeSBnemdldGNfIGZ1bmN0aW9uCistIFVzZSBvcHRpbWl6ZWQgYnl0ZSBzd2FwIG9wZXJhdGlvbnMgZm9yIE1pY3Jvc29mdCBhbmQgR05VIFtTbnlkZXJdCistIEZpeCBtaW5vciB0eXBvIGluIHpsaWIuaCBjb21tZW50cyBbUnplc25pb3dpZWNraV0KKworQ2hhbmdlcyBpbiAxLjIuNiAoMjkgSmFuIDIwMTIpCistIFVwZGF0ZSB0aGUgUGFzY2FsIGludGVyZmFjZSBpbiBjb250cmliL3Bhc2NhbAorLSBGaXggZnVuY3Rpb24gbnVtYmVycyBmb3IgZ3pnZXRjXyBpbiB6bGlidmMuZGVmIGZpbGVzCistIEZpeCBjb25maWd1cmUuYWMgZm9yIGNvbnRyaWIvbWluaXppcCBbU2NoaWZmZXJdCistIEZpeCBsYXJnZS1lbnRyeSBkZXRlY3Rpb24gaW4gbWluaXppcCBvbiA2NC1iaXQgc3lzdGVtcyBbU2NoaWZmZXJdCistIEhhdmUgLi9jb25maWd1cmUgdXNlIHRoZSBjb21waWxlciByZXR1cm4gY29kZSBmb3IgZXJyb3IgaW5kaWNhdGlvbgorLSBGaXggQ01ha2VMaXN0cy50eHQgZm9yIGNyb3NzIGNvbXBpbGF0aW9uIFtNY0NsdXJlXQorLSBGaXggY29udHJpYi9taW5pemlwL3ppcC5jIGZvciA2NC1iaXQgYXJjaGl0ZWN0dXJlcyBbRGFsc25lc10KKy0gRml4IGNvbXBpbGF0aW9uIG9mIGNvbnRyaWIvbWluaXppcCBvbiBGcmVlQlNEIFtNYXJxdWV6XQorLSBDb3JyZWN0IHN1Z2dlc3RlZCB1c2FnZXMgaW4gd2luMzIvTWFrZWZpbGUubXNjIFtTaGFjaGFyLCBIb3J2YXRoXQorLSBJbmNsdWRlIGlvLmggZm9yIFR1cmJvIEMgLyBCb3JsYW5kIEMgb24gYWxsIHBsYXRmb3JtcyBbVHJ1dGFdCistIE1ha2UgdmVyc2lvbiBleHBsaWNpdCBpbiBjb250cmliL21pbml6aXAvY29uZmlndXJlLmFjIFtCb3NtYW5zXQorLSBBdm9pZCB3YXJuaW5nIGZvciBubyBlbmNyeXB0aW9uIGluIGNvbnRyaWIvbWluaXppcC96aXAuYyBbVm9sbGFudF0KKy0gTWlub3IgY2xlYW51cCB1cCBjb250cmliL21pbml6aXAvdW56aXAuYyBbVm9sbGFudF0KKy0gRml4IGJ1ZyB3aGVuIGNvbXBpbGluZyBtaW5pemlwIHdpdGggQysrIFtWb2xsYW50XQorLSBQcm90ZWN0IGZvciBsb25nIG5hbWUgYW5kIGV4dHJhIGZpZWxkcyBpbiBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCistIEF2b2lkIHNvbWUgd2FybmluZ3MgaW4gY29udHJpYi9taW5pemlwIFtWb2xsYW50XQorLSBBZGQgLUkuLi8uLiAtTC4uLy4uIHRvIENGTEFHUyBmb3IgbWluaXppcCBhbmQgbWluaXVuemlwCistIEFkZCBtaXNzaW5nIGxpYnMgdG8gbWluaXppcCBsaW5rZXIgY29tbWFuZAorLSBBZGQgc3VwcG9ydCBmb3IgVlBBVEggYnVpbGRzIGluIGNvbnRyaWIvbWluaXppcAorLSBBZGQgYW4gLS1lbmFibGUtZGVtb3Mgb3B0aW9uIHRvIGNvbnRyaWIvbWluaXppcC9jb25maWd1cmUKKy0gQWRkIHRoZSBnZW5lcmF0aW9uIG9mIGNvbmZpZ3VyZS5sb2cgYnkgLi9jb25maWd1cmUKKy0gRXhpdCB3aGVuIHJlcXVpcmVkIHBhcmFtZXRlcnMgbm90IHByb3ZpZGVkIHRvIHdpbjMyL01ha2VmaWxlLmdjYworLSBIYXZlIGd6cHV0YyByZXR1cm4gdGhlIGNoYXJhY3RlciB3cml0dGVuIGluc3RlYWQgb2YgdGhlIGFyZ3VtZW50CistIFVzZSB0aGUgLW0gb3B0aW9uIG9uIGxkY29uZmlnIGZvciBCU0Qgc3lzdGVtcyBbVG9iaWFzXQorLSBDb3JyZWN0IGluIHpsaWIubWFwIHdoZW4gZGVmbGF0ZVJlc2V0S2VlcCB3YXMgYWRkZWQKKworQ2hhbmdlcyBpbiAxLjIuNS4zICgxNSBKYW4gMjAxMikKKy0gUmVzdG9yZSBnemdldGMgZnVuY3Rpb24gZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5CistIERvIG5vdCB1c2UgX2xzZWVraTY0IHVuZGVyIEJvcmxhbmQgQysrIFtUcnV0YV0KKy0gVXBkYXRlIHdpbjMyL01ha2VmaWxlLm1zYyB0byBidWlsZCB0ZXN0LyouYyBbVHJ1dGFdCistIFJlbW92ZSBvbGQvdmlzdWFsYzYgZ2l2ZW4gQ01ha2VmaWxlIGFuZCBvdGhlciBhbHRlcm5hdGl2ZXMKKy0gVXBkYXRlIEFTNDAwIGJ1aWxkIGZpbGVzIGFuZCBkb2N1bWVudGF0aW9uIFtNb25uZXJhdF0KKy0gVXBkYXRlIHdpbjMyL01ha2VmaWxlLmdjYyB0byBidWlsZCB0ZXN0LyouYyBbVHJ1dGFdCistIFBlcm1pdCBzdHJvbmdlciBmbHVzaGVzIGFmdGVyIFpfQkxPQ0sgZmx1c2hlcworLSBBdm9pZCBleHRyYW5lb3VzIGVtcHR5IGJsb2NrcyB3aGVuIGRvaW5nIGVtcHR5IGZsdXNoZXMKKy0gUGVybWl0IFpfTlVMTCBhcmd1bWVudHMgdG8gZGVmbGF0ZVBlbmRpbmcKKy0gQWxsb3cgZGVmbGF0ZVByaW1lKCkgdG8gaW5zZXJ0IGJpdHMgaW4gdGhlIG1pZGRsZSBvZiBhIHN0cmVhbQorLSBSZW1vdmUgc2Vjb25kIGVtcHR5IHN0YXRpYyBibG9jayBmb3IgWl9QQVJUSUFMX0ZMVVNICistIFdyaXRlIG91dCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBiaXRzIHdoZW4gdXNpbmcgWl9CTE9DSworLSBJbnNlcnQgdGhlIGZpcnN0IHR3byBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIGFmdGVyIGEgZmx1c2gKKworQ2hhbmdlcyBpbiAxLjIuNS4yICgxNyBEZWMgMjAxMSkKKy0gZml4IGxkIGVycm9yOiB1bmFibGUgdG8gZmluZCB2ZXJzaW9uIGRlcGVuZGVuY3kgJ1pMSUJfMS4yLjUnCistIHVzZSByZWxhdGl2ZSBzeW1saW5rcyBmb3Igc2hhcmVkIGxpYnMKKy0gQXZvaWQgc2VhcmNoaW5nIHBhc3Qgd2luZG93IGZvciBaX1JMRSBzdHJhdGVneQorLSBBc3N1cmUgdGhhdCBoaWdoLXdhdGVyIG1hcmsgaW5pdGlhbGl6YXRpb24gaXMgYWx3YXlzIGFwcGxpZWQgaW4gZGVmbGF0ZQorLSBBZGQgYXNzZXJ0aW9ucyB0byBmaWxsX3dpbmRvdygpIGluIGRlZmxhdGUuYyB0byBtYXRjaCBjb21tZW50cworLSBVcGRhdGUgcHl0aG9uIGxpbmsgaW4gUkVBRE1FCistIENvcnJlY3Qgc3BlbGxpbmcgZXJyb3IgaW4gZ3pyZWFkLmMKKy0gRml4IGJ1ZyBpbiBnemdldHMoKSBmb3IgYSBjb25jYXRlbmF0ZWQgZW1wdHkgZ3ppcCBzdHJlYW0KKy0gQ29ycmVjdCBlcnJvciBpbiBjb21tZW50IGZvciBnel9tYWtlKCkKKy0gQ2hhbmdlIGd6cmVhZCgpIGFuZCByZWxhdGVkIHRvIGlnbm9yZSBqdW5rIGFmdGVyIGd6aXAgc3RyZWFtcworLSBBbGxvdyBnenJlYWQoKSBhbmQgcmVsYXRlZCB0byBjb250aW51ZSBhZnRlciBnemNsZWFyZXJyKCkKKy0gQWxsb3cgZ3pyZXdpbmQoKSBhbmQgZ3pzZWVrKCkgYWZ0ZXIgYSBwcmVtYXR1cmUgZW5kLW9mLWZpbGUKKy0gU2ltcGxpZnkgZ3pzZWVrKCkgbm93IHRoYXQgcmF3IGFmdGVyIGd6aXAgaXMgaWdub3JlZAorLSBDaGFuZ2UgZ3pnZXRjKCkgdG8gYSBtYWNybyBmb3Igc3BlZWQgKH40MCUgc3BlZWR1cCBpbiB0ZXN0aW5nKQorLSBGaXggZ3pjbG9zZSgpIHRvIHJldHVybiB0aGUgYWN0dWFsIGVycm9yIGxhc3QgZW5jb3VudGVyZWQKKy0gQWx3YXlzIGFkZCBsYXJnZSBmaWxlIHN1cHBvcnQgZm9yIHdpbmRvd3MKKy0gSW5jbHVkZSB6Y29uZi5oIGZvciB3aW5kb3dzIGxhcmdlIGZpbGUgc3VwcG9ydAorLSBJbmNsdWRlIHpjb25mLmguY21ha2VpbiBmb3Igd2luZG93cyBsYXJnZSBmaWxlIHN1cHBvcnQKKy0gVXBkYXRlIHpjb25mLmguY21ha2VpbiBvbiBtYWtlIGRpc3RjbGVhbgorLSBNZXJnZSB2ZXN0aWdpYWwgdnNucHJpbnRmIGRldGVybWluYXRpb24gZnJvbSB6dXRpbC5oIHRvIGd6Z3V0cy5oCistIENsYXJpZnkgaG93IGd6b3BlbigpIGFwcGVuZHMgaW4gemxpYi5oIGNvbW1lbnRzCistIENvcnJlY3QgZG9jdW1lbnRhdGlvbiBvZiBnemRpcmVjdCgpIHNpbmNlIGp1bmsgYXQgZW5kIG5vdyBpZ25vcmVkCistIEFkZCBhIHRyYW5zcGFyZW50IHdyaXRlIG1vZGUgdG8gZ3pvcGVuKCkgd2hlbiAnVCcgaXMgaW4gdGhlIG1vZGUKKy0gVXBkYXRlIHB5dGhvbiBsaW5rIGluIHpsaWIgbWFuIHBhZ2UKKy0gR2V0IGluZmZpeGVkLmggYW5kIE1BS0VGSVhFRCByZXN1bHQgdG8gbWF0Y2gKKy0gQWRkIGEgLi9jb25maWcgLS1zb2xvIG9wdGlvbiB0byBtYWtlIHpsaWIgc3Vic2V0IHdpdGggbm8gbGliYXJ5IHVzZQorLSBBZGQgdW5kb2N1bWVudGVkIGluZmxhdGVSZXNldEtlZXAoKSBmdW5jdGlvbiBmb3IgQ0FCIGZpbGUgZGVjb2RpbmcKKy0gQWRkIC0tY292ZXIgb3B0aW9uIHRvIC4vY29uZmlndXJlIGZvciBnY2MgY292ZXJhZ2UgdGVzdGluZworLSBBZGQgI2RlZmluZSBaTElCX0NPTlNUIG9wdGlvbiB0byB1c2UgY29uc3QgaW4gdGhlIHpfc3RyZWFtIGludGVyZmFjZQorLSBBZGQgY29tbWVudCB0byBnemRvcGVuKCkgaW4gemxpYi5oIHRvIHVzZSBkdXAoKSB3aGVuIHVzaW5nIGZpbGVubygpCistIE5vdGUgYmVoYXZpb3Igb2YgdW5jb21wcmVzcygpIHRvIHByb3ZpZGUgYXMgbXVjaCBkYXRhIGFzIGl0IGNhbgorLSBBZGQgZmlsZXMgaW4gY29udHJpYi9taW5pemlwIHRvIGFpZCBpbiBidWlsZGluZyBsaWJtaW5pemlwCistIFNwbGl0IG9mZiBBUiBvcHRpb25zIGluIE1ha2VmaWxlLmluIGFuZCBjb25maWd1cmUKKy0gQ2hhbmdlIE9OIG1hY3JvIHRvIFpfQVJHIHRvIGF2b2lkIGFwcGxpY2F0aW9uIGNvbmZsaWN0cworLSBGYWNpbGl0YXRlIGNvbXBpbGF0aW9uIHdpdGggQm9ybGFuZCBDKysgZm9yIHByYWdtYXMgYW5kIHZzbnByaW50ZgorLSBJbmNsdWRlIGlvLmggZm9yIFR1cmJvIEMgLyBCb3JsYW5kIEMrKworLSBNb3ZlIGV4YW1wbGUuYyBhbmQgbWluaWd6aXAuYyB0byB0ZXN0LworLSBTaW1wbGlmeSBpbmNvbXBsZXRlIGNvZGUgdGFibGUgZmlsbGluZyBpbiBpbmZsYXRlX3RhYmxlKCkKKy0gUmVtb3ZlIGNvZGUgZnJvbSBpbmZsYXRlLmMgYW5kIGluZmJhY2suYyB0aGF0IGlzIGltcG9zc2libGUgdG8gZXhlY3V0ZQorLSBUZXN0IHRoZSBpbmZsYXRlIGNvZGUgd2l0aCBmdWxsIGNvdmVyYWdlCistIEFsbG93IGRlZmxhdGVTZXREaWN0aW9uYXJ5LCBpbmZsYXRlU2V0RGljdGlvbmFyeSBhdCBhbnkgdGltZSAoaW4gcmF3KQorLSBBZGQgZGVmbGF0ZVJlc2V0S2VlcCBhbmQgZml4IGluZmxhdGVSZXNldEtlZXAgdG8gcmV0YWluIGRpY3Rpb25hcnkKKy0gRml4IGd6d3JpdGUuYyB0byBhY2NvbW1vZGF0ZSByZWR1Y2VkIG1lbW9yeSB6bGliIGNvbXBpbGF0aW9uCistIEhhdmUgaW5mbGF0ZSgpIHdpdGggWl9GSU5JU0ggYXZvaWQgdGhlIGFsbG9jYXRpb24gb2YgYSB3aW5kb3cKKy0gRG8gbm90IHNldCBzdHJtLT5hZGxlciB3aGVuIGRvaW5nIHJhdyBpbmZsYXRlCistIEZpeCBnemVvZigpIHRvIGJlaGF2ZSBqdXN0IGxpa2UgZmVvZigpIHdoZW4gcmVhZCBpcyBub3QgcGFzdCBlbmQgb2YgZmlsZQorLSBGaXggYnVnIGluIGd6cmVhZC5jIHdoZW4gZW5kLW9mLWZpbGUgaXMgcmVhY2hlZAorLSBBdm9pZCB1c2Ugb2YgWl9CVUZfRVJST1IgaW4gZ3oqIGZ1bmN0aW9ucyBleGNlcHQgZm9yIHByZW1hdHVyZSBFT0YKKy0gRG9jdW1lbnQgZ3pyZWFkKCkgY2FwYWJpbGl0eSB0byByZWFkIGNvbmN1cnJlbnRseSB3cml0dGVuIGZpbGVzCistIFJlbW92ZSBoYXJkLWNvZGluZyBvZiByZXNvdXJjZSBjb21waWxlciBpbiBDTWFrZUxpc3RzLnR4dCBbQmxhbW1vXQorCitDaGFuZ2VzIGluIDEuMi41LjEgKDEwIFNlcCAyMDExKQorLSBVcGRhdGUgRkFRIGVudHJ5IG9uIHNoYXJlZCBidWlsZHMgKCMxMykKKy0gQXZvaWQgc3ltYm9saWMgYXJndW1lbnQgdG8gY2htb2QgaW4gTWFrZWZpbGUuaW4KKy0gRml4IGJ1ZyBhbmQgYWRkIGNvbnN0cyBpbiBjb250cmliL3B1ZmYgW09iZXJodW1lcl0KKy0gVXBkYXRlIGNvbnRyaWIvcHVmZi96ZXJvcy5yYXcgdGVzdCBmaWxlIHRvIGhhdmUgYWxsIGJsb2NrIHR5cGVzCistIEFkZCBmdWxsIGNvdmVyYWdlIHRlc3QgZm9yIHB1ZmYgaW4gY29udHJpYi9wdWZmL01ha2VmaWxlCistIEZpeCBzdGF0aWMtb25seS1idWlsZCBpbnN0YWxsIGluIE1ha2VmaWxlLmluCistIEZpeCBidWcgaW4gdW56R2V0Q3VycmVudEZpbGVJbmZvKCkgaW4gY29udHJpYi9taW5pemlwIFtLdW5vXQorLSBBZGQgbGliei5hIGRlcGVuZGVuY3kgdG8gc2hhcmVkIGluIE1ha2VmaWxlLmluIGZvciBwYXJhbGxlbCBidWlsZHMKKy0gU3BlbGwgb3V0ICJudW1iZXIiIChpbnN0ZWFkIG9mICJuYiIpIGluIHpsaWIuaCBmb3IgdG90YWxfaW4sIHRvdGFsX291dAorLSBSZXBsYWNlICQoLi4uKSB3aXRoIGAuLi5gIGluIGNvbmZpZ3VyZSBmb3Igbm9uLWJhc2ggc2ggW0Jvd2xlcl0KKy0gQWRkIGRhcndpbiogdG8gRGFyd2luKiBhbmQgc29sYXJpcyogdG8gU3VuT1NcIDUqIGluIGNvbmZpZ3VyZSBbR3JvZmZlbl0KKy0gQWRkIHNvbGFyaXMqIHRvIExpbnV4KiBpbiBjb25maWd1cmUgdG8gYWxsb3cgZ2NjIHVzZSBbR3JvZmZlbl0KKy0gQWRkICpic2QqIHRvIExpbnV4KiBjYXNlIGluIGNvbmZpZ3VyZSBbQmFyLUxldl0KKy0gQWRkIGluZmZhc3Qub2JqIHRvIGRlcGVuZGVuY2llcyBpbiB3aW4zMi9NYWtlZmlsZS5tc2MKKy0gQ29ycmVjdCBzcGVsbGluZyBlcnJvciBpbiBkZWZsYXRlLmggW0tvaGxlcl0KKy0gQ2hhbmdlIGxpYnpkbGwuYSBhZ2FpbiB0byBsaWJ6LmRsbC5hICghKSBpbiB3aW4zMi9NYWtlZmlsZS5nY2MKKy0gQWRkIHRlc3QgdG8gY29uZmlndXJlIGZvciBHTlUgQyBsb29raW5nIGZvciBnY2MgaW4gb3V0cHV0IG9mICRjYyAtdgorLSBBZGQgemxpYi5wYyBnZW5lcmF0aW9uIHRvIHdpbjMyL01ha2VmaWxlLmdjYyBbV2VpZ2VsdF0KKy0gRml4IGJ1ZyBpbiB6bGliLmggZm9yIF9GSUxFX09GRlNFVF9CSVRTIHNldCBhbmQgX0xBUkdFRklMRTY0X1NPVVJDRSBub3QKKy0gQWRkIGNvbW1lbnQgaW4gemxpYi5oIHRoYXQgYWRsZXIzMl9jb21iaW5lIHdpdGggbGVuMiA8IDAgbWFrZXMgbm8gc2Vuc2UKKy0gTWFrZSBOT19ESVZJREUgb3B0aW9uIGluIGFkbGVyMzIuYyBtdWNoIGZhc3RlciAodGhhbmtzIHRvIEpvaG4gUmVpc2VyKQorLSBNYWtlIHN0cm9uZ2VyIHRlc3QgaW4gemNvbmYuaCB0byBpbmNsdWRlIHVuaXN0ZC5oIGZvciBMRlMKKy0gQXBwbHkgRGFyd2luIHBhdGNoZXMgZm9yIDY0LWJpdCBmaWxlIG9mZnNldHMgdG8gY29udHJpYi9taW5pemlwIFtTbGFja10KKy0gRml4IHpsaWIuaCBMRlMgc3VwcG9ydCB3aGVuIFpfUFJFRklYIHVzZWQKKy0gQWRkIHVwZGF0ZWQgYXM0MDAgc3VwcG9ydCAocmVtb3ZlZCBmcm9tIG9sZCkgW01vbm5lcmF0XQorLSBBdm9pZCBkZWZsYXRlIHNlbnNpdGl2aXR5IHRvIHZvbGF0aWxlIGlucHV0IGRhdGEKKy0gQXZvaWQgZGl2aXNpb24gaW4gYWRsZXIzMl9jb21iaW5lIGZvciBOT19ESVZJREUKKy0gQ2xhcmlmeSB0aGUgdXNlIG9mIFpfRklOSVNIIHdpdGggZGVmbGF0ZUJvdW5kKCkgYW1vdW50IG9mIHNwYWNlCistIFNldCBiaW5hcnkgZm9yIG91dHB1dCBmaWxlIGluIHB1ZmYuYworLSBVc2UgdTQgdHlwZSBmb3IgY3JjX3RhYmxlIHRvIGF2b2lkIGNvbnZlcnNpb24gd2FybmluZ3MKKy0gQXBwbHkgY2FzdHMgaW4gemxpYi5oIHRvIGF2b2lkIGNvbnZlcnNpb24gd2FybmluZ3MKKy0gQWRkIE9GIHRvIHByb3RvdHlwZXMgZm9yIGFkbGVyMzJfY29tYmluZV8gYW5kIGNyYzMyX2NvbWJpbmVfIFtNaWxsZXJdCistIEltcHJvdmUgaW5mbGF0ZVN5bmMoKSBkb2N1bWVudGF0aW9uIHRvIG5vdGUgaW5kZXRlcm1pbmFuY3kKKy0gQWRkIGRlZmxhdGVQZW5kaW5nKCkgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBhbW91bnQgb2YgcGVuZGluZyBvdXRwdXQKKy0gQ29ycmVjdCB0aGUgc3BlbGxpbmcgb2YgInNwZWNpZmljYXRpb24iIGluIEZBUSBbUmFuZGVycy1QZWhyc29uXQorLSBBZGQgYSBjaGVjayBpbiBjb25maWd1cmUgZm9yIHN0ZGFyZy5oLCB1c2UgZm9yIGd6cHJpbnRmKCkKKy0gQ2hlY2sgdGhhdCBwb2ludGVycyBmaXQgaW4gaW50cyB3aGVuIGd6cHJpbnQoKSBjb21waWxlZCBvbGQgc3R5bGUKKy0gQWRkIGR1bW15IG5hbWUgYmVmb3JlICQoU0hBUkVETElCVikgaW4gTWFrZWZpbGUgW0Jhci1MZXYsIEJvd2xlcl0KKy0gRGVsZXRlIGxpbmUgaW4gY29uZmlndXJlIHRoYXQgYWRkcyAtTC4gbGliei5hIHRvIExERkxBR1MgW1dlaWdlbHRdCistIEFkZCBkZWJ1ZyByZWNvcmRzIGluIGFzc21lYmxlciBjb2RlIFtMb25kZXJdCistIFVwZGF0ZSBSRkMgcmVmZXJlbmNlcyB0byB1c2UgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvLi4uIFtMaV0KKy0gQWRkIC0tYXJjaHMgb3B0aW9uLCB1c2Ugb2YgbGlidG9vbCB0byBjb25maWd1cmUgZm9yIE1hYyBPUyBYIFtCb3JzdGVsXQorCitDaGFuZ2VzIGluIDEuMi41ICgxOSBBcHIgMjAxMCkKKy0gRGlzYWJsZSB2aXNpYmlsaXR5IGF0dHJpYnV0ZSBpbiB3aW4zMi9NYWtlZmlsZS5nY2MgW0Jhci1MZXZdCistIERlZmF1bHQgdG8gbGliZGlyIGFzIHNoYXJlZGxpYmRpciBpbiBjb25maWd1cmUgW05pZWRlcl0KKy0gVXBkYXRlIGNvcHlyaWdodCBkYXRlcyBvbiBtb2RpZmllZCBzb3VyY2UgZmlsZXMKKy0gVXBkYXRlIHRyZWVzLmMgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBtb2RpZmllZCB0cmVlcy5oCistIEV4aXQgY29uZmlndXJlIGZvciBNaW5HVywgc3VnZ2VzdGluZyB3aW4zMi9NYWtlZmlsZS5nY2MKKy0gQ2hlY2sgZm9yIE5VTEwgcGF0aCBpbiBnel9vcGVuIFtIb211cmx1XQorCitDaGFuZ2VzIGluIDEuMi40LjUgKDE4IEFwciAyMDEwKQorLSBTZXQgc2hhcmVkbGliZGlyIGluIGNvbmZpZ3VyZSBbVG9yb2tdCistIFNldCBMREZMQUdTIGluIE1ha2VmaWxlLmluIFtCYXItTGV2XQorLSBBdm9pZCBta2RpciBvYmpzIHJhY2UgY29uZGl0aW9uIGluIE1ha2VmaWxlLmluIFtCb3dsZXJdCistIEFkZCBaTElCX0lOVEVSTkFMIGluIGZyb250IG9mIGludGVybmFsIGludGVyLW1vZHVsZSBmdW5jdGlvbnMgYW5kIGFycmF5cworLSBEZWZpbmUgWkxJQl9JTlRFUk5BTCB0byBoaWRlIGludGVybmFsIGZ1bmN0aW9ucyBhbmQgYXJyYXlzIGZvciBHTlUgQworLSBEb24ndCB1c2UgaGlkZGVuIGF0dHJpYnV0ZSB3aGVuIGl0IGlzIGEgd2FybmluZyBnZW5lcmF0b3IgKGUuZy4gU29sYXJpcykKKworQ2hhbmdlcyBpbiAxLjIuNC40ICgxOCBBcHIgMjAxMCkKKy0gRml4IENST1NTX1BSRUZJWCBleGVjdXRhYmxlIHRlc3RpbmcsIENIT1NUIGV4dHJhY3QsIG1pbmd3KiBbVG9yb2tdCistIFVuZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgaW4gemNvbmYuaCBpZiBpdCBpcyB6ZXJvLCBidXQgbm90IGlmIGVtcHR5CistIFRyeSB0byB1c2UgYmFzaCBvciBrc2ggcmVnYXJkbGVzcyBvZiBmdW5jdGlvbmFsaXR5IG9mIC9iaW4vc2gKKy0gRml4IGNvbmZpZ3VyZSBpbmNvbXBhdGliaWxpdHkgd2l0aCBOZXRCU0Qgc2gKKy0gUmVtb3ZlIGF0dGVtcHQgdG8gcnVuIHVuZGVyIGJhc2ggb3Iga3NoIHNpbmNlIGhhdmUgYmV0dGVyIE5ldEJTRCBmaXgKKy0gRml4IHdpbjMyL01ha2VmaWxlLmdjYyBmb3IgTWluR1cgW0Jhci1MZXZdCistIEFkZCBkaWFnbm9zdGljIG1lc3NhZ2VzIHdoZW4gdXNpbmcgQ1JPU1NfUFJFRklYIGluIGNvbmZpZ3VyZQorLSBBZGRlZCAtLXNoYXJlZGxpYmRpciBvcHRpb24gdG8gY29uZmlndXJlIFtXZWlnZWx0XQorLSBVc2UgaGlkZGVuIHZpc2liaWxpdHkgYXR0cmlidXRlIHdoZW4gYXZhaWxhYmxlIFtGcnlzaW5nZXJdCisKK0NoYW5nZXMgaW4gMS4yLjQuMyAoMTAgQXByIDIwMTApCistIE9ubHkgdXNlIENST1NTX1BSRUZJWCBpbiBjb25maWd1cmUgZm9yIGFyIGFuZCByYW5saWIgaWYgdGhleSBleGlzdAorLSBVc2UgQ1JPU1NfUFJFRklYIGZvciBubSBbQmFyLUxldl0KKy0gQXNzdW1lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgZGVmaW5lZCBpcyBlcXVpdmFsZW50IHRvIHRydWUKKy0gQXZvaWQgdXNlIG9mIHVuZGVmaW5lZCBzeW1ib2xzIGluICNpZiB3aXRoICYmIGFuZCB8fAorLSBNYWtlICo2NCBwcm90b3R5cGVzIGluIGd6Z3V0cy5oIGNvbnNpc3RlbnQgd2l0aCBmdW5jdGlvbnMKKy0gQWRkIC1zaGFyZWQgbG9hZCBvcHRpb24gZm9yIE1pbkdXIGluIGNvbmZpZ3VyZSBbQm93bGVyXQorLSBNb3ZlIHpfb2ZmNjRfdCB0byBwdWJsaWMgaW50ZXJmYWNlLCB1c2UgaW5zdGVhZCBvZiBvZmY2NF90CistIFJlbW92ZSAhIGZyb20gc2hlbGwgdGVzdCBpbiBjb25maWd1cmUgKG5vdCBwb3J0YWJsZSB0byBTb2xhcmlzKQorLSBDaGFuZ2UgKzAgbWFjcm8gdGVzdHMgdG8gLTAgZm9yIHBvc3NpYmx5IGluY3JlYXNlZCBwb3J0YWJpbGl0eQorCitDaGFuZ2VzIGluIDEuMi40LjIgKDkgQXByIDIwMTApCistIEFkZCBjb25zaXN0ZW50IGNhcnJpYWdlIHJldHVybnMgdG8gcmVhZG1lLnR4dCdzIGluIG1hc214ODYgYW5kIG1hc214NjQKKy0gUmVhbGx5IHByb3ZpZGUgcHJvdG90eXBlcyBmb3IgKjY0IGZ1bmN0aW9ucyB3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgTEZTCistIE9ubHkgZGVmaW5lIHVubGluaygpIGluIG1pbmlnemlwLmMgaWYgdW5pc3RkLmggbm90IGluY2x1ZGVkCistIFVwZGF0ZSBSRUFETUUgdG8gcG9pbnQgdG8gY29udHJpYi92c3R1ZGlvIHByb2plY3QgZmlsZXMKKy0gTW92ZSBwcm9qZWN0cy92YzYgdG8gb2xkLyBhbmQgcmVtb3ZlIHByb2plY3RzLworLSBJbmNsdWRlIHN0ZGxpYi5oIGluIG1pbmlnemlwLmMgZm9yIHNldG1vZGUoKSBkZWZpbml0aW9uIHVuZGVyIFdpbkNFCistIENsZWFuIHVwIGFzc2VtYmxlciBidWlsZHMgaW4gd2luMzIvTWFrZWZpbGUubXNjIFtSb3dlXQorLSBJbmNsdWRlIHN5cy90eXBlcy5oIGZvciBNaWNyb3NvZnQgZm9yIG9mZl90IGRlZmluaXRpb24KKy0gRml4IG1lbW9yeSBsZWFrIG9uIGVycm9yIGluIGd6X29wZW4oKQorLSBTeW1ib2xpemUgbm0gYXMgJE5NIGluIGNvbmZpZ3VyZSBbV2VpZ2VsdF0KKy0gVXNlIFRFU1RfTERTSEFSRUQgaW5zdGVhZCBvZiBMRFNIQVJFRCB0byBsaW5rIHRlc3QgcHJvZ3JhbXMgW1dlaWdlbHRdCistIEFkZCArMCB0byBfRklMRV9PRkZTRVRfQklUUyBhbmQgX0xGUzY0X0xBUkdFRklMRSBpbiBjYXNlIG5vdCBkZWZpbmVkCistIEZpeCBidWcgaW4gZ3plb2YoKSB0byB0YWtlIGludG8gYWNjb3VudCB1bnVzZWQgaW5wdXQgZGF0YQorLSBBdm9pZCBpbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3R1cmVzIHdpdGggdmFyaWFibGVzIGluIHB1ZmYuYworLSBVcGRhdGVkIHdpbjMyL1JFQURNRS1XSU4zMi50eHQgW1Jvd2VdCisKK0NoYW5nZXMgaW4gMS4yLjQuMSAoMjggTWFyIDIwMTApCistIFJlbW92ZSB0aGUgdXNlIG9mIFthLXpdIGNvbnN0cnVjdHMgZm9yIHNlZCBpbiBjb25maWd1cmUgW2dlbnRvbyAzMTAyMjVdCistIFJlbW92ZSAkKFNIQVJFRExJQikgZnJvbSBMSUJTIGluIE1ha2VmaWxlLmluIFtDcmVlY2hdCistIFJlc3RvcmUgImZvciBkZWJ1Z2dpbmciIGNvbW1lbnQgb24gc3ByaW50ZigpIGluIGd6bGliLmMKKy0gUmVtb3ZlIGZkb3BlbiBmb3IgTVZTIGZyb20gZ3pndXRzLmgKKy0gUHV0IG5ldyBSRUFETUUtV0lOMzIudHh0IGluIHdpbjMyIFtSb3dlXQorLSBBZGQgY2hlY2sgZm9yIHNoZWxsIHRvIGNvbmZpZ3VyZSBhbmQgaW52b2tlIGFub3RoZXIgc2hlbGwgaWYgbmVlZGVkCistIEZpeCBiaWcgZmF0IHN0aW5raW5nIGJ1ZyBpbiBnenNlZWsoKSBvbiB1bmNvbXByZXNzZWQgZmlsZXMKKy0gUmVtb3ZlIHZlc3RpZ2lhbCBGX09QRU42NCBkZWZpbmUgaW4genV0aWwuaAorLSBTZXQgYW5kIGNoZWNrIHRoZSB2YWx1ZSBvZiBfTEFSR0VGSUxFX1NPVVJDRSBhbmQgX0xBUkdFRklMRTY0X1NPVVJDRQorLSBBdm9pZCBlcnJvcnMgb24gbm9uLUxGUyBzeXN0ZW1zIHdoZW4gYXBwbGljYXRpb25zIGRlZmluZSBMRlMgbWFjcm9zCistIFNldCBFWEUgdG8gIi5leGUiIGluIGNvbmZpZ3VyZSBmb3IgTUlOR1cgW0thaGxlXQorLSBNYXRjaCBjcmMzMigpIGluIGNyYzMyLmMgZXhhY3RseSB0byB0aGUgcHJvdG90eXBlIGluIHpsaWIuaCBbU2hlcnJpbGxdCistIEFkZCBwcmVmaXggZm9yIGNyb3NzLWNvbXBpbGF0aW9uIGluIHdpbjMyL21ha2VmaWxlLmdjYyBbQmFyLUxldl0KKy0gQWRkIERMTCBpbnN0YWxsIGluIHdpbjMyL21ha2VmaWxlLmdjYyBbQmFyLUxldl0KKy0gQWxsb3cgTGludXgqIG9yIGxpbnV4KiBmcm9tIHVuYW1lIGluIGNvbmZpZ3VyZSBbQmFyLUxldl0KKy0gQWxsb3cgbGRjb25maWcgdG8gYmUgcmVkZWZpbmVkIGluIGNvbmZpZ3VyZSBhbmQgTWFrZWZpbGUuaW4gW0Jhci1MZXZdCistIEFkZCBjcm9zcy1jb21waWxhdGlvbiBwcmVmaXhlcyB0byBjb25maWd1cmUgW0Jhci1MZXZdCistIE1hdGNoIHR5cGUgZXhhY3RseSBpbiBnel9sb2FkKCkgaW52b2NhdGlvbiBpbiBnenJlYWQuYworLSBNYXRjaCB0eXBlIGV4YWN0bHkgb2YgemNhbGxvYygpIGluIHp1dGlsLmMgdG8gemxpYi5oIGFsbG9jX2Z1bmMKKy0gUHJvdmlkZSBwcm90b3R5cGVzIGZvciAqNjQgZnVuY3Rpb25zIHdoZW4gYnVpbGRpbmcgemxpYiB3aXRob3V0IExGUworLSBEb24ndCB1c2UgLWxjIHdoZW4gbGlua2luZyBzaGFyZWQgbGlicmFyeSBvbiBNaW5HVworLSBSZW1vdmUgZXJybm8uaCBjaGVjayBpbiBjb25maWd1cmUgYW5kIHZlc3RpZ2lhbCBlcnJubyBjb2RlIGluIHp1dGlsLmgKKworQ2hhbmdlcyBpbiAxLjIuNCAoMTQgTWFyIDIwMTApCistIEZpeCBWRVIzIGV4dHJhY3Rpb24gaW4gY29uZmlndXJlIGZvciBubyBmb3VydGggc3VidmVyc2lvbgorLSBVcGRhdGUgemxpYi4zLCBhZGQgZG9jcyB0byBNYWtlZmlsZS5pbiB0byBtYWtlIC5wZGYgb3V0IG9mIGl0CistIEFkZCB6bGliLjMucGRmIHRvIGRpc3RyaWJ1dGlvbgorLSBEb24ndCBzZXQgZXJyb3IgY29kZSBpbiBnemVycm9yKCkgaWYgcGFzc2VkIHBvaW50ZXIgaXMgTlVMTAorLSBBcHBseSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZml4ZXMgdG8gQ01ha2VMaXN0cy50eHQgW0xvd21hbl0KKy0gTW92ZSAjY21ha2VkZWZpbmUncyB0byBhIG5ldyB6Y29uZi5pbi5jbWFrZWluCistIFJlc3RvcmUgemNvbmYuaCBmb3IgYnVpbGRzIHRoYXQgZG9uJ3QgdXNlIGNvbmZpZ3VyZSBvciBjbWFrZQorLSBBZGQgZGlzdGNsZWFuIHRvIGR1bW15IE1ha2VmaWxlIGZvciBjb252ZW5pZW5jZQorLSBVcGRhdGUgYW5kIGltcHJvdmUgSU5ERVgsIFJFQURNRSwgYW5kIEZBUQorLSBVcGRhdGUgQ01ha2VMaXN0cy50eHQgZm9yIHRoZSByZXR1cm4gb2YgemNvbmYuaCBbTG93bWFuXQorLSBVcGRhdGUgY29udHJpYi92c3R1ZGlvL3ZjOSBhbmQgdmMxMCBbVm9sbGFudF0KKy0gQ2hhbmdlIGxpYnouZGxsLmEgYmFjayB0byBsaWJ6ZGxsLmEgaW4gd2luMzIvTWFrZWZpbGUuZ2NjCistIEFwcGx5IGxpY2Vuc2UgYW5kIHJlYWRtZSBjaGFuZ2VzIHRvIGNvbnRyaWIvYXNtNjg2IFtSYWl0ZXJdCistIENoZWNrIGZpbGUgbmFtZSBsZW5ndGhzIGFuZCBhZGQgLWMgb3B0aW9uIGluIG1pbmlnemlwLmMgW0xpXQorLSBVcGRhdGUgY29udHJpYi9hbWQ2NCBhbmQgY29udHJpYi9tYXNteDg2LyBbVm9sbGFudF0KKy0gQXZvaWQgdXNlIG9mICJlb2YiIHBhcmFtZXRlciBpbiB0cmVlcy5jIHRvIG5vdCBzaGFkb3cgbGlicmFyeSB2YXJpYWJsZQorLSBVcGRhdGUgbWFrZV92bXMuY29tIGZvciByZW1vdmFsIG9mIHpsaWJkZWZzLmggW1ppbnNlcl0KKy0gVXBkYXRlIGFzc2VtYmxlciBjb2RlIGFuZCB2c3R1ZGlvIHByb2plY3RzIGluIGNvbnRyaWIgW1ZvbGxhbnRdCistIFJlbW92ZSBvdXRkYXRlZCBhc3NlbWJsZXIgY29kZSBjb250cmliL21hc202ODYgYW5kIGNvbnRyaWIvYXNtNTg2CistIFJlbW92ZSBvbGQgdmM3IGFuZCB2YzggZnJvbSBjb250cmliL3ZzdHVkaW8KKy0gVXBkYXRlIHdpbjMyL01ha2VmaWxlLm1zYywgYWRkIFpMSUJfVkVSX1NVQlJFVklTSU9OIFtSb3dlXQorLSBGaXggbWVtb3J5IGxlYWtzIGluIGd6Y2xvc2VfcigpIGFuZCBnemNsb3NlX3coKSwgZmlsZSBsZWFrIGluIGd6X29wZW4oKQorLSBBZGQgY29udHJpYi9nY2NfZ3ZtYXQ2NCBmb3IgbG9uZ2VzdF9tYXRjaCBhbmQgaW5mbGF0ZV9mYXN0IFtWb2xsYW50XQorLSBSZW1vdmUgKjY0IGZ1bmN0aW9ucyBmcm9tIHdpbjMyL3psaWIuZGVmICh0aGV5J3JlIG5vdCA2NC1iaXQgeWV0KQorLSBGaXggYnVnIGluIHZvaWQtcmV0dXJuaW5nIHZzcHJpbnRmKCkgY2FzZSBpbiBnendyaXRlLmMKKy0gRml4IG5hbWUgY2hhbmdlIGZyb20gaW5mbGF0ZS5oIGluIGNvbnRyaWIvaW5mbGF0ZTg2L2luZmZhczg2LmMKKy0gQ2hlY2sgaWYgdGVtcG9yYXJ5IGZpbGUgZXhpc3RzIGJlZm9yZSByZW1vdmluZyBpbiBtYWtlX3Ztcy5jb20gW1ppbnNlcl0KKy0gRml4IG1ha2UgaW5zdGFsbCBhbmQgdW5pbnN0YWxsIGZvciAtLXN0YXRpYyBvcHRpb24KKy0gRml4IHVzYWdlIG9mIF9NU0NfVkVSIGluIGd6Z3V0cy5oIGFuZCB6dXRpbC5oIFtUcnV0YV0KKy0gVXBkYXRlIHJlYWRtZS50eHQgaW4gY29udHJpYi9tYXNteDY0IGFuZCBtYXNteDg2IHRvIGFzc2VtYmxlCisKK0NoYW5nZXMgaW4gMS4yLjMuOSAoMjEgRmViIDIwMTApCistIEV4cHVuZ2UgZ3ppby5jCistIE1vdmUgYXM0MDAgYnVpbGQgaW5mb3JtYXRpb24gdG8gb2xkCistIEZpeCB1cGRhdGVzIGluIGNvbnRyaWIvbWluaXppcCBhbmQgY29udHJpYi92c3R1ZGlvCistIEFkZCBjb25zdCB0byB2c25wcmludGYgdGVzdCBpbiBjb25maWd1cmUgdG8gYXZvaWQgd2FybmluZ3MgW1dlaWdlbHRdCistIERlbGV0ZSB6Y29uZi5oIChtYWRlIGJ5IGNvbmZpZ3VyZSkgW1dlaWdlbHRdCistIENoYW5nZSB6Y29uZi5pbi5oIHRvIHpjb25mLmguaW4gcGVyIGNvbnZlbnRpb24gW1dlaWdlbHRdCistIENoZWNrIGZvciBOVUxMIGJ1ZiBpbiBnemdldHMoKQorLSBSZXR1cm4gZW1wdHkgc3RyaW5nIGZvciBnemdldHMoKSB3aXRoIGxlbiA9PSAxIChsaWtlIGZnZXRzKCkpCistIEZpeCBkZXNjcmlwdGlvbiBvZiBnemdldHMoKSBpbiB6bGliLmggZm9yIGVuZC1vZi1maWxlLCBOVUxMIHJldHVybgorLSBVcGRhdGUgbWluaXppcCB0byAxLjEgW1ZvbGxhbnRdCistIEF2b2lkIE1TVkMgbG9zcyBvZiBkYXRhIHdhcm5pbmdzIGluIGd6cmVhZC5jLCBnendyaXRlLmMKKy0gTm90ZSBpbiB6bGliLmggdGhhdCBnemVycm9yKCkgc2hvdWxkIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggZnJvbSBFT0YKKy0gUmVtb3ZlIHVzZSBvZiBzbnByaW50ZigpIGZyb20gZ3psaWIuYworLSBGaXggYnVnIGluIGd6c2VlaygpCistIFVwZGF0ZSBjb250cmliL3ZzdHVkaW8sIGFkZGluZyB2YzkgYW5kIHZjMTAgW0t1bm8sIFZvbGxhbnRdCistIEZpeCB6Y29uZi5oIGdlbmVyYXRpb24gaW4gQ01ha2VMaXN0cy50eHQgW0xvd21hbl0KKy0gSW1wcm92ZSBjb21tZW50cyBpbiB6Y29uZi5oIHdoZXJlIG1vZGlmaWVkIGJ5IGNvbmZpZ3VyZQorCitDaGFuZ2VzIGluIDEuMi4zLjggKDEzIEZlYiAyMDEwKQorLSBDbGVhbiB1cCB0ZXh0IGZpbGVzICh0YWJzLCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBldGMuKSBbT2Jlcmh1bWVyXQorLSBVc2Ugel9vZmY2NF90IGluIGd6X3plcm8oKSBhbmQgZ3pfc2tpcCgpIHRvIG1hdGNoIHN0YXRlLT5za2lwCistIEF2b2lkIGNvbXBhcmlzb24gcHJvYmxlbSB3aGVuIHNpemVvZihpbnQpID09IHNpemVvZih6X29mZjY0X3QpCistIFJldmVydCB0byBNYWtlZmlsZS5pbiBmcm9tIDEuMi4zLjYgKGxpdmUgd2l0aCB0aGUgY2x1dHRlcikKKy0gRml4IG1pc3NpbmcgZXJyb3IgcmV0dXJuIGluIGd6Zmx1c2goKSwgYWRkIHpsaWIuaCBub3RlCistIEFkZCAqNjQgZnVuY3Rpb25zIHRvIHpsaWIubWFwIFtMZXZpbl0KKy0gRml4IHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29uIGluIGd6X2NvbXAoKQorLSBVc2UgU0ZMQUdTIHdoZW4gdGVzdGluZyBzaGFyZWQgbGlua2luZyBpbiBjb25maWd1cmUKKy0gQWRkIC0tNjQgb3B0aW9uIHRvIC4vY29uZmlndXJlIHRvIHVzZSAtbTY0IHdpdGggZ2NjCistIEZpeCAuL2NvbmZpZ3VyZSAtLWhlbHAgdG8gY29ycmVjdGx5IG5hbWUgb3B0aW9ucworLSBIYXZlIG1ha2UgZmFpbCBpZiBhIHRlc3QgZmFpbHMgW0xldmluXQorLSBBdm9pZCBidWZmZXIgb3ZlcnJ1biBpbiBjb250cmliL21hc214NjQvZ3ZtYXQ2NC5hc20gW1NpbXBzb25dCistIFJlbW92ZSBhc3NlbWJsZXIgb2JqZWN0IGZpbGVzIGZyb20gY29udHJpYgorCitDaGFuZ2VzIGluIDEuMi4zLjcgKDI0IEphbiAyMDEwKQorLSBBbHdheXMgZ3pvcGVuKCkgd2l0aCBPX0xBUkdFRklMRSBpZiBhdmFpbGFibGUKKy0gRml4IGd6ZGlyZWN0KCkgdG8gd29yayBpbW1lZGlhdGVseSBhZnRlciBnem9wZW4oKSBvciBnemRvcGVuKCkKKy0gTWFrZSBnemRpcmVjdCgpIG1vcmUgcHJlY2lzZSB3aGVuIHRoZSBzdGF0ZSBjaGFuZ2VzIHdoaWxlIHJlYWRpbmcKKy0gSW1wcm92ZSB6bGliLmggZG9jdW1lbnRhdGlvbiBpbiBtYW55IHBsYWNlcworLSBDYXRjaCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGluIGd6X29wZW4oKQorLSBDb21wbGV0ZSBjbG9zZSBvcGVyYXRpb24gaWYgc2VlayBmb3J3YXJkIGluIGd6Y2xvc2VfdygpIGZhaWxzCistIFJldHVybiBaX0VSUk5PIGZyb20gZ3pjbG9zZV9yKCkgaWYgY2xvc2UoKSBmYWlscworLSBSZXR1cm4gWl9TVFJFQU1fRVJST1IgaW5zdGVhZCBvZiBFT0YgZm9yIGd6Y2xvc2UoKSBiZWluZyBwYXNzZWQgTlVMTAorLSBSZXR1cm4gemVybyBmb3IgZ3p3cml0ZSgpIGVycm9ycyB0byBtYXRjaCB6bGliLmggZGVzY3JpcHRpb24KKy0gUmV0dXJuIC0xIG9uIGd6cHV0cygpIGVycm9yIHRvIG1hdGNoIHpsaWIuaCBkZXNjcmlwdGlvbgorLSBBZGQgemNvbmYuaW4uaCB0byBhbGxvdyByZWNvdmVyeSBmcm9tIGNvbmZpZ3VyZSBtb2RpZmljYXRpb24gW1dlaWdlbHRdCistIEZpeCBzdGF0aWMgbGlicmFyeSBwZXJtaXNzaW9ucyBpbiBNYWtlZmlsZS5pbiBbV2VpZ2VsdF0KKy0gQXZvaWQgd2FybmluZ3MgaW4gY29uZmlndXJlIHRlc3RzIHRoYXQgaGlkZSBmdW5jdGlvbmFsaXR5IFtXZWlnZWx0XQorLSBBZGQgKkJTRCBhbmQgRHJhZ29uRmx5IHRvIExpbnV4IGNhc2UgaW4gY29uZmlndXJlIFtnZW50b28gMTIzNTcxXQorLSBDaGFuZ2UgbGliemRsbC5hIHRvIGxpYnouZGxsLmEgaW4gd2luMzIvTWFrZWZpbGUuZ2NjIFtnZW50b28gMjg4MjEyXQorLSBBdm9pZCBhY2Nlc3Mgb2YgdW5pbml0aWFsaXplZCBkYXRhIGZvciBmaXJzdCBpbmZsYXRlUmVzZXQyIGNhbGwgW0dvbWVzXQorLSBLZWVwIG9iamVjdCBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcyB0byByZWR1Y2UgdGhlIGNsdXR0ZXIgc29tZXdoYXQKKy0gUmVtb3ZlIGRlZmF1bHQgTWFrZWZpbGUgYW5kIHpsaWJkZWZzLmgsIGFkZCBkdW1teSBNYWtlZmlsZQorLSBBZGQgbmV3IGV4dGVybmFsIGZ1bmN0aW9ucyB0byBaX1BSRUZJWCwgcmVtb3ZlIGR1cGxpY2F0ZXMsIHpfel8gLT4gel8KKy0gUmVtb3ZlIHpsaWJkZWZzLmggY29tcGxldGVseSAtLSBtb2RpZnkgemNvbmYuaCBpbnN0ZWFkCisKK0NoYW5nZXMgaW4gMS4yLjMuNiAoMTcgSmFuIDIwMTApCistIEF2b2lkIHZvaWQgKiBhcml0aG1ldGljIGluIGd6cmVhZC5jIGFuZCBnendyaXRlLmMKKy0gTWFrZSBjb21waWxlcnMgaGFwcGllciB3aXRoIGNvbnN0IGNoYXIgKiBmb3IgZ3pfZXJyb3IgbWVzc2FnZQorLSBBdm9pZCB1bnVzZWQgcGFyYW1ldGVyIHdhcm5pbmcgaW4gaW5mbGF0ZS5jCistIEF2b2lkIHNpZ25lZC11bnNpZ25lZCBjb21wYXJpc29uIHdhcm5pbmcgaW4gaW5mbGF0ZS5jCistIEluZGVudCAjcHJhZ21hJ3MgZm9yIHRyYWRpdGlvbmFsIEMKKy0gRml4IHVzYWdlIG9mIHN0cndpbmVycm9yKCkgaW4gZ2xpYi5jLCBjaGFuZ2UgdG8gZ3pfc3Ryd2luZXJyb3IoKQorLSBDb3JyZWN0IGVtYWlsIGFkZHJlc3MgaW4gY29uZmlndXJlIGZvciBzeXN0ZW0gb3B0aW9ucworLSBVcGRhdGUgbWFrZV92bXMuY29tIGFuZCBhZGQgbWFrZV92bXMuY29tIHRvIGNvbnRyaWIvbWluaXppcCBbWmluc2VyXQorLSBVcGRhdGUgemxpYi5tYXAgW0Jyb3duXQorLSBGaXggTWFrZWZpbGUuaW4gZm9yIFNvbGFyaXMgMTAgbWFrZSBvZiBleGFtcGxlNjQgYW5kIG1pbml6aXA2NCBbVG9yb2tdCistIEFwcGx5IHZhcmlvdXMgZml4ZXMgdG8gQ01ha2VMaXN0cy50eHQgW0xvd21hbl0KKy0gQWRkIGNoZWNrcyBvbiBsZW4gaW4gZ3pyZWFkKCkgYW5kIGd6d3JpdGUoKQorLSBBZGQgZXJyb3IgbWVzc2FnZSBmb3Igbm8gbW9yZSByb29tIGZvciBnenVuZ2V0YygpCistIFJlbW92ZSB6bGliIHZlcnNpb24gY2hlY2sgaW4gZ3p3cml0ZSgpCistIERlZmVyIGNvbXByZXNzaW9uIG9mIGd6cHJpbnRmKCkgcmVzdWx0IHVudGlsIG5lZWQgdG8KKy0gVXNlIHNucHJpbnRmKCkgaW4gZ3pkb3BlbigpIGlmIGF2YWlsYWJsZQorLSBSZW1vdmUgVVNFX01NQVAgY29uZmlndXJhdGlvbiBkZXRlcm1pbmF0aW9uIChvbmx5IHVzZWQgYnkgbWluaWd6aXApCistIFJlbW92ZSBleGFtcGxlcy9waWd6LmMgKGF2YWlsYWJsZSBzZXBhcmF0ZWx5KQorLSBVcGRhdGUgZXhhbXBsZXMvZ3VuLmMgdG8gMS42CisKK0NoYW5nZXMgaW4gMS4yLjMuNSAoOCBKYW4gMjAxMCkKKy0gQWRkIHNwYWNlIGFmdGVyICNpZiBpbiB6dXRpbC5oIGZvciBzb21lIGNvbXBpbGVycworLSBGaXggcmVsYXRpdmVseSBoYXJtbGVzcyBidWcgaW4gZGVmbGF0ZV9mYXN0KCkgW0V4YXJldnNreV0KKy0gRml4IHNhbWUgcHJvYmxlbSBpbiBkZWZsYXRlX3Nsb3coKQorLSBBZGQgJChTSEFSRURMSUJWKSB0byBMSUJTIGluIE1ha2VmaWxlLmluIFtCcm93bl0KKy0gQWRkIGRlZmxhdGVfcmxlKCkgZm9yIGZhc3RlciBaX1JMRSBzdHJhdGVneSBydW4tbGVuZ3RoIGVuY29kaW5nCistIEFkZCBkZWZsYXRlX2h1ZmYoKSBmb3IgZmFzdGVyIFpfSFVGRk1BTl9PTkxZIGVuY29kaW5nCistIENoYW5nZSBuYW1lIG9mICJ3cml0ZSIgdmFyaWFibGUgaW4gaW5mZmFzdC5jIHRvIGF2b2lkIGxpYnJhcnkgY29sbGlzaW9ucworLSBGaXggcHJlbWF0dXJlIEVPRiBmcm9tIGd6cmVhZCgpIGluIGd6aW8uYyBbQnJvd25dCistIFVzZSB6bGliIGhlYWRlciB3aW5kb3cgc2l6ZSBpZiB3aW5kb3dCaXRzIGlzIDAgaW4gaW5mbGF0ZUluaXQyKCkKKy0gUmVtb3ZlIGNvbXByZXNzQm91bmQoKSBjYWxsIGluIGRlZmxhdGUuYyB0byBhdm9pZCBsaW5raW5nIGNvbXByZXNzLm8KKy0gUmVwbGFjZSB1c2Ugb2YgZXJybm8gaW4gZ3oqIHdpdGggZnVuY3Rpb25zLCBzdXBwb3J0IFdpbkNFIFtBbHZlc10KKy0gUHJvdmlkZSBhbHRlcm5hdGl2ZSB0byBwZXJyb3IoKSBpbiBtaW5pZ3ppcC5jIGZvciBXaW5DRSBbQWx2ZXNdCistIERvbid0IHVzZSBfdnNucHJpbnRmIG9uIGxhdGVyIHZlcnNpb25zIG9mIE1TVkMgW0xvd21hbl0KKy0gQWRkIENNYWtlIGJ1aWxkIHNjcmlwdCBhbmQgaW5wdXQgZmlsZSBbTG93bWFuXQorLSBVcGRhdGUgY29udHJpYi9taW5pemlwIHRvIDEuMSBbU3ZlbnNzb24sIFZvbGxhbnRdCistIE1vdmVkIG5pbnRlbmRvZHMgZGlyZWN0b3J5IGZyb20gY29udHJpYiB0byAuCistIFJlcGxhY2UgZ3ppby5jIHdpdGggYSBuZXcgc2V0IG9mIHJvdXRpbmVzIHdpdGggdGhlIHNhbWUgZnVuY3Rpb25hbGl0eQorLSBBZGQgZ3pidWZmZXIoKSwgZ3pvZmZzZXQoKSwgZ3pjbG9zZV9yKCksIGd6Y2xvc2VfdygpIGFzIHBhcnQgb2YgYWJvdmUKKy0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCB0byAxLjFiCistIENoYW5nZSBnemVvZigpIHRvIHJldHVybiAwIG9uIGVycm9yIGluc3RlYWQgb2YgLTEgdG8gYWdyZWUgd2l0aCB6bGliLmgKKworQ2hhbmdlcyBpbiAxLjIuMy40ICgyMSBEZWMgMjAwOSkKKy0gVXNlIG9sZCBzY2hvb2wgLlNVRkZJWEVTIGluIE1ha2VmaWxlLmluIGZvciBGcmVlQlNEIGNvbXBhdGliaWxpdHkKKy0gVXBkYXRlIGNvbW1lbnRzIGluIGNvbmZpZ3VyZSBhbmQgTWFrZWZpbGUuaW4gZm9yIGRlZmF1bHQgLS1zaGFyZWQKKy0gRml4IHRlc3QgLXoncyBpbiBjb25maWd1cmUgW01hcnF1ZXNzXQorLSBCdWlsZCBleGFtcGxlc2ggYW5kIG1pbmlnemlwc2ggd2hlbiBub3QgdGVzdGluZworLSBDaGFuZ2UgTlVMTCdzIHRvIFpfTlVMTCdzIGluIGRlZmxhdGUuYyBhbmQgaW4gY29tbWVudHMgaW4gemxpYi5oCistIEltcG9ydCBMREZMQUdTIGZyb20gdGhlIGVudmlyb25tZW50IGluIGNvbmZpZ3VyZQorLSBGaXggY29uZmlndXJlIHRvIHBvcHVsYXRlIFNGTEFHUyB3aXRoIGRpc2NvdmVyZWQgQ0ZMQUdTIG9wdGlvbnMKKy0gQWRhcHQgbWFrZV92bXMuY29tIHRvIHRoZSBuZXcgTWFrZWZpbGUuaW4gW1ppbnNlcl0KKy0gQWRkIHpsaWIyYW5zaSBzY3JpcHQgZm9yIEMrKyBjb21waWxhdGlvbiBbTWFycXVlc3NdCistIEFkZCBfRklMRV9PRkZTRVRfQklUUz02NCB0ZXN0IHRvIG1ha2UgdGVzdCAod2hlbiBhcHBsaWNhYmxlKQorLSBBZGQgQU1ENjQgYXNzZW1ibGVyIGNvZGUgZm9yIGxvbmdlc3QgbWF0Y2ggdG8gY29udHJpYiBbVGV0ZXJpbl0KKy0gSW5jbHVkZSBvcHRpb25zIGZyb20gJFNGTEFHUyB3aGVuIGRvaW5nICRMRFNIQVJFRAorLSBTaW1wbGlmeSA2NC1iaXQgZmlsZSBzdXBwb3J0IGJ5IGludHJvZHVjaW5nIHpfb2ZmNjRfdCB0eXBlCistIE1ha2Ugc2hhcmVkIG9iamVjdCBmaWxlcyBpbiBvYmpzIGRpcmVjdG9yeSB0byB3b3JrIGFyb3VuZCBvbGQgU3VuIGNjCistIFVzZSBvbmx5IHRocmVlLXBhcnQgdmVyc2lvbiBudW1iZXIgZm9yIERhcndpbiBzaGFyZWQgY29tcGlsZXMKKy0gQWRkIHJjIG9wdGlvbiB0byBhciBpbiBNYWtlZmlsZS5pbiBmb3Igd2hlbiAuL2NvbmZpZ3VyZSBub3QgcnVuCistIEFkZCAtV0ksLXJwYXRoLC4gdG8gTERGTEFHUyBmb3IgT1NGIDEgVjQqCistIFNldCBMRF9MSUJSQVJZTjMyX1BBVEggZm9yIFNHSSBJUklYIHNoYXJlZCBjb21waWxlCistIFByb3RlY3QgYWdhaW5zdCBfRklMRV9PRkZTRVRfQklUUyBiZWluZyBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIHpsaWIKKy0gUmVuYW1lIE1ha2VmaWxlLmluIHRhcmdldHMgYWxsc3RhdGljIHRvIHN0YXRpYyBhbmQgYWxsc2hhcmVkIHRvIHNoYXJlZAorLSBGaXggc3RhdGljIGFuZCBzaGFyZWQgTWFrZWZpbGUuaW4gdGFyZ2V0cyB0byBiZSBpbmRlcGVuZGVudAorLSBDb3JyZWN0IGVycm9yIHJldHVybiBidWcgaW4gZ3pfb3BlbigpIGJ5IHNldHRpbmcgc3RhdGUgW0Jyb3duXQorLSBQdXQgc3BhY2VzIGJlZm9yZSA7OydzIGluIGNvbmZpZ3VyZSBmb3IgYmV0dGVyIHNoIGNvbXBhdGliaWxpdHkKKy0gQWRkIHBpZ3ouYyAocGFyYWxsZWwgaW1wbGVtZW50YXRpb24gb2YgZ3ppcCkgdG8gZXhhbXBsZXMvCistIENvcnJlY3QgY29uc3RhbnQgaW4gY3JjMzIuYyB0byBVTCBbTGV2ZW50aGFsXQorLSBSZWplY3QgbmVnYXRpdmUgbGVuZ3RocyBpbiBjcmMzMl9jb21iaW5lKCkKKy0gQWRkIGluZmxhdGVSZXNldDIoKSBmdW5jdGlvbiB0byB3b3JrIGxpa2UgaW5mbGF0ZUVuZCgpL2luZmxhdGVJbml0MigpCistIEluY2x1ZGUgc3lzL3R5cGVzLmggZm9yIF9MQVJHRUZJTEU2NF9TT1VSQ0UgW0Jyb3duXQorLSBDb3JyZWN0IHR5cG8gaW4gZG9jL2FsZ29yaXRobS50eHQgW0phbmlrXQorLSBGaXggYnVnIGluIGFkbGVyMzJfY29tYmluZSgpIFtaaHVdCistIENhdGNoIG1pc3NpbmctZW5kLW9mLWJsb2NrLWNvZGUgZXJyb3IgaW4gYWxsIGluZmxhdGVzIGFuZCBpbiBwdWZmCisgICAgQXNzdXJlcyB0aGF0IHJhbmRvbSBpbnB1dCB0byBpbmZsYXRlIGV2ZW50dWFsbHkgcmVzdWx0cyBpbiBhbiBlcnJvcgorLSBBZGRlZCBlbm91Z2guYyAoY2FsY3VsYXRpb24gb2YgRU5PVUdIIGZvciBpbmZ0cmVlcy5oKSB0byBleGFtcGxlcy8KKy0gVXBkYXRlIEVOT1VHSCBhbmQgaXRzIHVzYWdlIHRvIHJlZmxlY3QgZGlzY292ZXJlZCBib3VuZHMKKy0gRml4IGd6ZXJyb3IoKSBlcnJvciByZXBvcnQgb24gZW1wdHkgaW5wdXQgZmlsZSBbQnJvd25dCistIEFkZCB1c2ggY2FzdHMgaW4gdHJlZXMuYyB0byBhdm9pZCBwZWRhbnRpYyBydW50aW1lIGVycm9ycworLSBGaXggdHlwbyBpbiB6bGliLmggdW5jb21wcmVzcygpIGRlc2NyaXB0aW9uIFtSZWlzc10KKy0gQ29ycmVjdCBpbmZsYXRlKCkgY29tbWVudHMgd2l0aCByZWdhcmQgdG8gYXV0b21hdGljIGhlYWRlciBkZXRlY3Rpb24KKy0gUmVtb3ZlIGRlcHJlY2F0aW9uIGNvbW1lbnQgb24gWl9QQVJUSUFMX0ZMVVNIIChpdCBzdGF5cykKKy0gUHV0IG5ldyB2ZXJzaW9uIG9mIGd6bG9nICgyLjApIGluIGV4YW1wbGVzIHdpdGggaW50ZXJydXB0aW9uIHJlY292ZXJ5CistIEFkZCBwdWZmIGNvbXBpbGUgb3B0aW9uIHRvIHBlcm1pdCBpbnZhbGlkIGRpc3RhbmNlLXRvby1mYXIgc3RyZWFtcworLSBBZGQgcHVmZiBURVNUIGNvbW1hbmQgb3B0aW9ucywgYWJpbGl0eSB0byByZWFkIHBpcGVkIGlucHV0CistIFByb3RvdHlwZSB0aGUgKjY0IGZ1bmN0aW9ucyBpbiB6bGliLmggd2hlbiBfRklMRV9PRkZTRVRfQklUUyA9PSA2NCwgYnV0CisgIF9MQVJHRUZJTEU2NF9TT1VSQ0Ugbm90IGRlZmluZWQKKy0gRml4IFpfRlVMTF9GTFVTSCB0byB0cnVseSBlcmFzZSB0aGUgcGFzdCBieSByZXNldHRpbmcgcy0+c3Ryc3RhcnQKKy0gRml4IGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkgdG8gdXNlIGFsbCAzMksgZm9yIG91dHB1dCBjb25zaXN0ZW5jeQorLSBSZW1vdmUgZXh0cmFuZW91cyAjZGVmaW5lIE1JTl9MT09LQUhFQUQgaW4gZGVmbGF0ZS5jIChpbiBkZWZsYXRlLmgpCistIENsZWFyIGJ5dGVzIGFmdGVyIGRlZmxhdGUgbG9va2FoZWFkIHRvIGF2b2lkIHVzZSBvZiB1bmluaXRpYWxpemVkIGRhdGEKKy0gQ2hhbmdlIGEgbGltaXQgaW4gaW5mdHJlZXMuYyB0byBiZSBtb3JlIHRyYW5zcGFyZW50IHRvIENvdmVyaXR5IFByZXZlbnQKKy0gVXBkYXRlIHdpbjMyL3psaWIuZGVmIHdpdGggZXhwb3J0ZWQgc3ltYm9scyBmcm9tIHpsaWIuaAorLSBDb3JyZWN0IHNwZWxsaW5nIGVycm9ycyBpbiB6bGliLmggW1dpbGxlbSwgU29icmFkb10KKy0gQWxsb3cgWl9CTE9DSyBmb3IgZGVmbGF0ZSgpIHRvIGZvcmNlIGEgbmV3IGJsb2NrCistIEFsbG93IG5lZ2F0aXZlIGJpdHMgaW4gaW5mbGF0ZVByaW1lKCkgdG8gZGVsZXRlIGV4aXN0aW5nIGJpdCBidWZmZXIKKy0gQWRkIFpfVFJFRVMgZmx1c2ggb3B0aW9uIHRvIGluZmxhdGUoKSB0byByZXR1cm4gYXQgZW5kIG9mIHRyZWVzCistIEFkZCBpbmZsYXRlTWFyaygpIHRvIHJldHVybiBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uIGZvciByYW5kb20gYWNjZXNzCistIEFkZCBNYWtlZmlsZSBmb3IgTmludGVuZG9EUyB0byBjb250cmliIFtDb3N0YV0KKy0gQWRkIC13IGluIGNvbmZpZ3VyZSBjb21waWxlIHRlc3RzIHRvIGF2b2lkIHNwdXJpb3VzIHdhcm5pbmdzIFtCZXVjbGVyXQorLSBGaXggdHlwb3MgaW4gemxpYi5oIGNvbW1lbnRzIGZvciBkZWZsYXRlU2V0RGljdGlvbmFyeSgpCistIEZpeCBFT0YgZGV0ZWN0aW9uIGluIHRyYW5zcGFyZW50IGd6cmVhZCgpIFtNYWllcl0KKworQ2hhbmdlcyBpbiAxLjIuMy4zICgyIE9jdG9iZXIgMjAwNikKKy0gTWFrZSAtLXNoYXJlZCB0aGUgZGVmYXVsdCBmb3IgY29uZmlndXJlLCBhZGQgYSAtLXN0YXRpYyBvcHRpb24KKy0gQWRkIGNvbXBpbGUgb3B0aW9uIHRvIHBlcm1pdCBpbnZhbGlkIGRpc3RhbmNlLXRvby1mYXIgc3RyZWFtcworLSBBZGQgaW5mbGF0ZVVuZGVybWluZSgpIGZ1bmN0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBhYm92ZQorLSBSZW1vdmUgdXNlIG9mICJ0aGlzIiB2YXJpYWJsZSBuYW1lIGZvciBDKysgY29tcGF0aWJpbGl0eSBbTWFycXVlc3NdCistIEFkZCB0ZXN0aW5nIG9mIHNoYXJlZCBsaWJyYXJ5IGluIG1ha2UgdGVzdCwgaWYgc2hhcmVkIGxpYnJhcnkgYnVpbHQKKy0gVXNlIGZ0ZWxsbygpIGFuZCBmc2Vla28oKSBpZiBhdmFpbGFibGUgaW5zdGVhZCBvZiBmdGVsbCgpIGFuZCBmc2VlaygpCistIFByb3ZpZGUgdHdvIHZlcnNpb25zIG9mIGFsbCBmdW5jdGlvbnMgdGhhdCB1c2UgdGhlIHpfb2ZmX3QgdHlwZSBmb3IKKyAgYmluYXJ5IGNvbXBhdGliaWxpdHkgLS0gYSBub3JtYWwgdmVyc2lvbiBhbmQgYSA2NC1iaXQgb2Zmc2V0IHZlcnNpb24sCisgIHBlciB0aGUgTGFyZ2UgRmlsZSBTdXBwb3J0IEV4dGVuc2lvbiB3aGVuIF9MQVJHRUZJTEU2NF9TT1VSQ0UgaXMKKyAgZGVmaW5lZDsgdXNlIHRoZSA2NC1iaXQgdmVyc2lvbnMgYnkgZGVmYXVsdCB3aGVuIF9GSUxFX09GRlNFVF9CSVRTCisgIGlzIGRlZmluZWQgdG8gYmUgNjQKKy0gQWRkIGEgLS11bmFtZT0gb3B0aW9uIHRvIGNvbmZpZ3VyZSB0byBwZXJoYXBzIGhlbHAgd2l0aCBjcm9zcy1jb21waWxpbmcKKworQ2hhbmdlcyBpbiAxLjIuMy4yICgzIFNlcHRlbWJlciAyMDA2KQorLSBUdXJuIG9mZiBzaWxseSBCb3JsYW5kIHdhcm5pbmdzIFtIYXldCistIFVzZSBvZmY2NF90IGFuZCBkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSB3aGVuIHByZXNlbnQKKy0gRml4IG1pc3NpbmcgZGVwZW5kZW5jeSBvbiBpbmZmaXhlZC5oIGluIE1ha2VmaWxlLmluCistIFJpZyBjb25maWd1cmUgLS1zaGFyZWQgdG8gYnVpbGQgYm90aCBzaGFyZWQgYW5kIHN0YXRpYyBbVGVyZWRlc2FpLCBUcnV0YV0KKy0gUmVtb3ZlIHpjb25mLmluLmggYW5kIGluc3RlYWQgY3JlYXRlIGEgbmV3IHpsaWJkZWZzLmggZmlsZQorLSBGaXggY29udHJpYi9taW5pemlwL3VuemlwLmMgbm9uLWVuY3J5cHRlZCBhZnRlciBlbmNyeXB0ZWQgW1ZvbGxhbnRdCistIEFkZCB0cmVlYnVpbGQueG1sIChzZWUgaHR0cDovL3RyZWVidWlsZC5tZXR1eC5kZS8pIFtXZWlnZWx0XQorCitDaGFuZ2VzIGluIDEuMi4zLjEgKDE2IEF1Z3VzdCAyMDA2KQorLSBBZGQgd2F0Y29tIGRpcmVjdG9yeSB3aXRoIE9wZW5XYXRjb20gbWFrZSBmaWxlcyBbRGFuaWVsXQorLSBSZW1vdmUgI3VuZGVmIG9mIEZBUiBpbiB6Y29uZi5pbi5oIGZvciBNVlMgW0ZlZHRrZV0KKy0gVXBkYXRlIG1ha2Vfdm1zLmNvbSBbWmluc2VyXQorLSBVc2UgLWZQSUMgZm9yIHNoYXJlZCBidWlsZCBpbiBjb25maWd1cmUgW1RlcmVkZXNhaSwgTmljaG9sc29uXQorLSBVc2Ugb25seSBtYWpvciB2ZXJzaW9uIG51bWJlciBmb3IgbGliei5zbyBvbiBJUklYIGFuZCBPU0YxIFtSZWluaG9sZHRzZW5dCistIFVzZSBmZG9wZW4oKSAobm90IF9mZG9wZW4oKSkgZm9yIEludGVyaXggaW4genV0aWwuaCBbQopja10KKy0gQWRkIHNvbWUgRkFRIGVudHJpZXMgYWJvdXQgdGhlIGNvbnRyaWIgZGlyZWN0b3J5CistIFVwZGF0ZSB0aGUgTVZTIHF1ZXN0aW9uIGluIHRoZSBGQVEKKy0gQXZvaWQgZXh0cmFuZW91cyByZWFkcyBhZnRlciBFT0YgaW4gZ3ppby5jIFtCcm93bl0KKy0gQ29ycmVjdCBzcGVsbGluZyBvZiAic3VjY2Vzc2Z1bGx5IiBpbiBnemlvLmMgW1JhbmRlcnMtUGVocnNvbl0KKy0gQWRkIGNvbW1lbnRzIHRvIHpsaWIuaCBhYm91dCBnemVycm9yKCkgdXNhZ2UgW0Jyb3duXQorLSBTZXQgZXh0cmEgZmxhZ3MgaW4gZ3ppcCBoZWFkZXIgaW4gZ3pvcGVuKCkgbGlrZSBkZWZsYXRlKCkgZG9lcworLSBNYWtlIGNvbmZpZ3VyZSBvcHRpb25zIG1vcmUgY29tcGF0aWJsZSB3aXRoIGRvdWJsZS1kYXNoIGNvbnZlbnRpb25zCisgIFtXZWlnZWx0XQorLSBDbGVhbiB1cCBjb21waWxhdGlvbiB1bmRlciBTb2xhcmlzIFN1blN0dWRpbyBjYyBbUm93ZSwgUmVpbmhvbGR0c2VuXQorLSBGaXggdW5pbnN0YWxsIHRhcmdldCBpbiBNYWtlZmlsZS5pbiBbVHJ1dGFdCistIEFkZCBwa2djb25maWcgc3VwcG9ydCBbV2VpZ2VsdF0KKy0gVXNlICQoREVTVERJUikgbWFjcm8gaW4gTWFrZWZpbGUuaW4gW1JlaW5ob2xkdHNlbiwgV2VpZ2VsdF0KKy0gUmVwbGFjZSBzZXRfZGF0YV90eXBlKCkgd2l0aCBhIG1vcmUgYWNjdXJhdGUgZGV0ZWN0X2RhdGFfdHlwZSgpIGluCisgIHRyZWVzLmMsIGFjY29yZGluZyB0byB0aGUgdHh0dnNiaW4udHh0IGRvY3VtZW50IFtUcnV0YV0KKy0gU3dhcCB0aGUgb3JkZXIgb2YgI2luY2x1ZGUgPHN0ZGlvLmg+IGFuZCAjaW5jbHVkZSAiemxpYi5oIiBpbgorICBnemlvLmMsIGV4YW1wbGUuYyBhbmQgbWluaWd6aXAuYyBbVHJ1dGFdCistIFNodXQgdXAgYW5ub3lpbmcgVlMyMDA1IHdhcm5pbmdzIGFib3V0IHN0YW5kYXJkIEMgZGVwcmVjYXRpb24gW1Jvd2UsCisgIFRydXRhXSAod2hlcmU/KQorLSBGaXggdGFyZ2V0ICJjbGVhbiIgZnJvbSB3aW4zMi9NYWtlZmlsZS5ib3IgW1RydXRhXQorLSBDcmVhdGUgLnBkYiBhbmQgLm1hbmlmZXN0IGZpbGVzIGluIHdpbjMyL21ha2VmaWxlLm1zYyBbWmllZ2xlciwgUm93ZV0KKy0gVXBkYXRlIHpsaWIgd3d3IGhvbWUgYWRkcmVzcyBpbiB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCistIFVwZGF0ZSBjb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtIGZvciBWUzIwMDUgW1ZvbGxhbnQsIFZhbiBXYXNzZW5ob3ZlXQorLSBFbmFibGUgYnJvd3NlIGluZm8gaW4gdGhlICJEZWJ1ZyIgYW5kICJBU00gRGVidWciIGNvbmZpZ3VyYXRpb25zIGluCisgIHRoZSBWaXN1YWwgQysrIDYgcHJvamVjdCwgYW5kIHNldCAobm9uLUFTTSkgIkRlYnVnIiBhcyBkZWZhdWx0IFtUcnV0YV0KKy0gQWRkIHBrZ2NvbmZpZyBzdXBwb3J0IFtXZWlnZWx0XQorLSBBZGQgWkxJQl9WRVJfTUFKT1IsIFpMSUJfVkVSX01JTk9SIGFuZCBaTElCX1ZFUl9SRVZJU0lPTiBpbiB6bGliLmgsCisgIGZvciB1c2UgaW4gd2luMzIvemxpYjEucmMgW1BvbHVzaGluLCBSb3dlLCBUcnV0YV0KKy0gQWRkIGEgZG9jdW1lbnQgdGhhdCBleHBsYWlucyB0aGUgbmV3IHRleHQgZGV0ZWN0aW9uIHNjaGVtZSB0bworICBkb2MvdHh0dnNiaW4udHh0IFtUcnV0YV0KKy0gQWRkIHJmYzE5NTAudHh0LCByZmMxOTUxLnR4dCBhbmQgcmZjMTk1Mi50eHQgdG8gZG9jLyBbVHJ1dGFdCistIE1vdmUgYWxnb3JpdGhtLnR4dCBpbnRvIGRvYy8gW1RydXRhXQorLSBTeW5jaHJvbml6ZSBGQVEgd2l0aCB3ZWJzaXRlCistIEZpeCBjb21wcmVzc0JvdW5kKCksIHdhcyBsb3cgZm9yIHNvbWUgcGF0aG9sb2dpY2FsIGNhc2VzIFtGZWFybmxleV0KKy0gVGFrZSBpbnRvIGFjY291bnQgd3JhcHBlciB2YXJpYXRpb25zIGluIGRlZmxhdGVCb3VuZCgpCistIFNldCBleGFtcGxlcy96cGlwZS5jIGlucHV0IGFuZCBvdXRwdXQgdG8gYmluYXJ5IG1vZGUgZm9yIFdpbmRvd3MKKy0gVXBkYXRlIGV4YW1wbGVzL3psaWJfaG93Lmh0bWwgd2l0aCBuZXcgenBpcGUuYyAoYWxzbyB3ZWIgc2l0ZSkKKy0gRml4IHNvbWUgd2FybmluZ3MgaW4gZXhhbXBsZXMvZ3psb2cuYyBhbmQgZXhhbXBsZXMvenJhbi5jIChpdCBzZWVtcworICB0aGF0IGdjYyBiZWNhbWUgcGlja2llciBpbiA0LjApCistIEFkZCB6bGliLm1hcCBmb3IgTGludXg6ICJBbGwgc3ltYm9scyBmcm9tIHpsaWItMS4xLjQgcmVtYWluCisgIHVuLXZlcnNpb25lZCwgdGhlIHBhdGNoIGFkZHMgdmVyc2lvbmluZyBvbmx5IGZvciBzeW1ib2xzIGludHJvZHVjZWQgaW4KKyAgemxpYi0xLjIuMCBvciBsYXRlci4gIEl0IGFsc28gZGVjbGFyZXMgYXMgbG9jYWwgdGhvc2Ugc3ltYm9scyB3aGljaCBhcmUKKyAgbm90IGRlc2lnbmVkIHRvIGJlIGV4cG9ydGVkLiIgW0xldmluXQorLSBVcGRhdGUgWl9QUkVGSVggbGlzdCBpbiB6Y29uZi5pbi5oLCBhZGQgLS16cHJlZml4IG9wdGlvbiB0byBjb25maWd1cmUKKy0gRG8gbm90IGluaXRpYWxpemUgZ2xvYmFsIHN0YXRpYyBieSBkZWZhdWx0IGluIHRyZWVzLmMsIGFkZCBhIHJlc3BvbnNlCisgIE5PX0lOSVRfR0xPQkFMX1BPSU5URVJTIHRvIGluaXRpYWxpemUgdGhlbSBpZiBuZWVkZWQgW01hcnF1ZXNzXQorLSBEb24ndCB1c2Ugc3RyZXJyb3IoKSBpbiBnemlvLmMgdW5kZXIgV2luQ0UgW1lha2ltb3ZdCistIERvbid0IHVzZSBlcnJuby5oIGluIHp1dGlsLmggdW5kZXIgV2luQ0UgW1lha2ltb3ZdCistIE1vdmUgYXJndW1lbnRzIGZvciBBUiB0byBpdHMgdXNhZ2UgdG8gYWxsb3cgcmVwbGFjaW5nIGFyIFtNYXJvdF0KKy0gQWRkIEhBVkVfVklTSUJJTElUWV9QUkFHTUEgaW4gemNvbmYuaW4uaCBmb3IgTW96aWxsYSBbUmFuZGVycy1QZWhyc29uXQorLSBJbXByb3ZlIGluZmxhdGVJbml0KCkgYW5kIGluZmxhdGVJbml0MigpIGRvY3VtZW50YXRpb24KKy0gRml4IHN0cnVjdHVyZSBzaXplIGNvbW1lbnQgaW4gaW5mbGF0ZS5oCistIENoYW5nZSBjb25maWd1cmUgaGVscCBvcHRpb24gZnJvbSAtLWgqIHRvIC0taGVscCBbU2FudG9zXQorCiBDaGFuZ2VzIGluIDEuMi4zICgxOCBKdWx5IDIwMDUpCiAtIEFwcGx5IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgZml4ZXMgdG8gY29udHJpYi9pbmZiYWNrOSBhcyB3ZWxsCiAtIENsZWFuIHVwIHNvbWUgdGV4dCBmaWxlcyAoY2FycmlhZ2UgcmV0dXJucywgdHJhaWxpbmcgc3BhY2UpCkBAIC0xMyw3ICs2MzAsNyBAQAogICBjb21waWxlCiAtIEZpeCBzb21lIHNwZWxsaW5nIGVycm9ycyBpbiBjb21tZW50cyBbQmV0dHNdCiAtIENvcnJlY3QgaW5mbGF0ZUluaXQyKCkgZXJyb3IgcmV0dXJuIGRvY3VtZW50YXRpb24gaW4gemxpYi5oCi0tIEFkZGVkIHpyYW4uYyBleGFtcGxlIG9mIGNvbXByZXNzZWQgZGF0YSByYW5kb20gYWNjZXNzIHRvIGV4YW1wbGVzCistIEFkZCB6cmFuLmMgZXhhbXBsZSBvZiBjb21wcmVzc2VkIGRhdGEgcmFuZG9tIGFjY2VzcyB0byBleGFtcGxlcwogICBkaXJlY3RvcnksIHNob3dzIHVzZSBvZiBpbmZsYXRlUHJpbWUoKQogLSBGaXggY2FzdCBmb3IgYXNzaWdubWVudHMgdG8gc3RybS0+c3RhdGUgaW4gaW5mbGF0ZS5jIGFuZCBpbmZiYWNrLmMKIC0gRml4IHpsaWJDb21waWxlRmxhZ3MoKSBpbiB6dXRpbC5jIHRvIHVzZSAxTCBmb3IgbG9uZyBzaGlmdHMgW09iZXJodW1lcl0KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9GQVEgYi9Nb2R1bGVzL3psaWIvRkFRCmluZGV4IDQ0MWQ5MTAuLjk5YjdjZjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi9GQVEKKysrIGIvTW9kdWxlcy96bGliL0ZBUQpAQCAtMyw4ICszLDggQEAKIAogCiBJZiB5b3VyIHF1ZXN0aW9uIGlzIG5vdCB0aGVyZSwgcGxlYXNlIGNoZWNrIHRoZSB6bGliIGhvbWUgcGFnZQotaHR0cDovL3d3dy56bGliLm9yZyB3aGljaCBtYXkgaGF2ZSBtb3JlIHJlY2VudCBpbmZvcm1hdGlvbi4KLVRoZSBsYXN0ZXN0IHpsaWIgRkFRIGlzIGF0IGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCitodHRwOi8vemxpYi5uZXQvIHdoaWNoIG1heSBoYXZlIG1vcmUgcmVjZW50IGluZm9ybWF0aW9uLgorVGhlIGxhc3Rlc3QgemxpYiBGQVEgaXMgYXQgaHR0cDovL3psaWIubmV0L3psaWJfZmFxLmh0bWwKIAogCiAgMS4gSXMgemxpYiBZMkstY29tcGxpYW50PwpAQCAtMTMsNTQgKzEzLDUxIEBACiAKICAyLiBXaGVyZSBjYW4gSSBnZXQgYSBXaW5kb3dzIERMTCB2ZXJzaW9uPwogCi0gICAgVGhlIHpsaWIgc291cmNlcyBjYW4gYmUgY29tcGlsZWQgd2l0aG91dCBjaGFuZ2UgdG8gcHJvZHVjZSBhIERMTC4KLSAgICBTZWUgdGhlIGZpbGUgd2luMzIvRExMX0ZBUS50eHQgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLgotICAgIFBvaW50ZXJzIHRvIHRoZSBwcmVjb21waWxlZCBETEwgYXJlIGZvdW5kIGluIHRoZSB6bGliIHdlYiBzaXRlIGF0Ci0gICAgaHR0cDovL3d3dy56bGliLm9yZy4KKyAgICBUaGUgemxpYiBzb3VyY2VzIGNhbiBiZSBjb21waWxlZCB3aXRob3V0IGNoYW5nZSB0byBwcm9kdWNlIGEgRExMLiAgU2VlIHRoZQorICAgIGZpbGUgd2luMzIvRExMX0ZBUS50eHQgaW4gdGhlIHpsaWIgZGlzdHJpYnV0aW9uLiAgUG9pbnRlcnMgdG8gdGhlCisgICAgcHJlY29tcGlsZWQgRExMIGFyZSBmb3VuZCBpbiB0aGUgemxpYiB3ZWIgc2l0ZSBhdCBodHRwOi8vemxpYi5uZXQvIC4KIAogIDMuIFdoZXJlIGNhbiBJIGdldCBhIFZpc3VhbCBCYXNpYyBpbnRlcmZhY2UgdG8gemxpYj8KIAogICAgIFNlZQotICAgICAgICAqIGh0dHA6Ly93d3cuZG9nbWEubmV0L21hcmtuL2FydGljbGVzL3psaWJ0b29sL3psaWJ0b29sLmh0bQotICAgICAgICAqIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBpbiB0aGUgemxpYiBkaXN0cmlidXRpb24KKyAgICAgICAgKiBodHRwOi8vbWFya25lbHNvbi51cy8xOTk3LzAxLzAxL3psaWItZW5naW5lLwogICAgICAgICAqIHdpbjMyL0RMTF9GQVEudHh0IGluIHRoZSB6bGliIGRpc3RyaWJ1dGlvbgogCiAgNC4gY29tcHJlc3MoKSByZXR1cm5zIFpfQlVGX0VSUk9SLgogCi0gICAgTWFrZSBzdXJlIHRoYXQgYmVmb3JlIHRoZSBjYWxsIG9mIGNvbXByZXNzLCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkCi0gICAgYnVmZmVyIGlzIGVxdWFsIHRvIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlciBhbmQgbm90Ci0gICAgemVyby4gRm9yIFZpc3VhbCBCYXNpYywgY2hlY2sgdGhhdCB0aGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlCisgICAgTWFrZSBzdXJlIHRoYXQgYmVmb3JlIHRoZSBjYWxsIG9mIGNvbXByZXNzKCksIHRoZSBsZW5ndGggb2YgdGhlIGNvbXByZXNzZWQKKyAgICBidWZmZXIgaXMgZXF1YWwgdG8gdGhlIGF2YWlsYWJsZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlciBhbmQgbm90CisgICAgemVyby4gIEZvciBWaXN1YWwgQmFzaWMsIGNoZWNrIHRoYXQgdGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGJ5IHJlZmVyZW5jZQogICAgICgiYXMgYW55IiksIG5vdCBieSB2YWx1ZSAoImFzIGxvbmciKS4KIAogIDUuIGRlZmxhdGUoKSBvciBpbmZsYXRlKCkgcmV0dXJucyBaX0JVRl9FUlJPUi4KIAotICAgIEJlZm9yZSBtYWtpbmcgdGhlIGNhbGwsIG1ha2Ugc3VyZSB0aGF0IGF2YWlsX2luIGFuZCBhdmFpbF9vdXQgYXJlIG5vdAotICAgIHplcm8uIFdoZW4gc2V0dGluZyB0aGUgcGFyYW1ldGVyIGZsdXNoIGVxdWFsIHRvIFpfRklOSVNILCBhbHNvIG1ha2Ugc3VyZQotICAgIHRoYXQgYXZhaWxfb3V0IGlzIGJpZyBlbm91Z2ggdG8gYWxsb3cgcHJvY2Vzc2luZyBhbGwgcGVuZGluZyBpbnB1dC4KLSAgICBOb3RlIHRoYXQgYSBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwtLWFub3RoZXIgY2FsbCB0byBkZWZsYXRlKCkgb3IKLSAgICBpbmZsYXRlKCkgY2FuIGJlIG1hZGUgd2l0aCBtb3JlIGlucHV0IG9yIG91dHB1dCBzcGFjZS4gQSBaX0JVRl9FUlJPUgotICAgIG1heSBpbiBmYWN0IGJlIHVuYXZvaWRhYmxlIGRlcGVuZGluZyBvbiBob3cgdGhlIGZ1bmN0aW9ucyBhcmUgdXNlZCwgc2luY2UKLSAgICBpdCBpcyBub3QgcG9zc2libGUgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBtb3JlIG91dHB1dCBwZW5kaW5nCi0gICAgd2hlbiBzdHJtLmF2YWlsX291dCByZXR1cm5zIHdpdGggemVyby4KKyAgICBCZWZvcmUgbWFraW5nIHRoZSBjYWxsLCBtYWtlIHN1cmUgdGhhdCBhdmFpbF9pbiBhbmQgYXZhaWxfb3V0IGFyZSBub3QgemVyby4KKyAgICBXaGVuIHNldHRpbmcgdGhlIHBhcmFtZXRlciBmbHVzaCBlcXVhbCB0byBaX0ZJTklTSCwgYWxzbyBtYWtlIHN1cmUgdGhhdAorICAgIGF2YWlsX291dCBpcyBiaWcgZW5vdWdoIHRvIGFsbG93IHByb2Nlc3NpbmcgYWxsIHBlbmRpbmcgaW5wdXQuICBOb3RlIHRoYXQgYQorICAgIFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbC0tYW5vdGhlciBjYWxsIHRvIGRlZmxhdGUoKSBvciBpbmZsYXRlKCkgY2FuIGJlCisgICAgbWFkZSB3aXRoIG1vcmUgaW5wdXQgb3Igb3V0cHV0IHNwYWNlLiAgQSBaX0JVRl9FUlJPUiBtYXkgaW4gZmFjdCBiZQorICAgIHVuYXZvaWRhYmxlIGRlcGVuZGluZyBvbiBob3cgdGhlIGZ1bmN0aW9ucyBhcmUgdXNlZCwgc2luY2UgaXQgaXMgbm90CisgICAgcG9zc2libGUgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBtb3JlIG91dHB1dCBwZW5kaW5nIHdoZW4KKyAgICBzdHJtLmF2YWlsX291dCByZXR1cm5zIHdpdGggemVyby4gIFNlZSBodHRwOi8vemxpYi5uZXQvemxpYl9ob3cuaHRtbCBmb3IgYQorICAgIGhlYXZpbHkgYW5ub3RhdGVkIGV4YW1wbGUuCiAKICA2LiBXaGVyZSdzIHRoZSB6bGliIGRvY3VtZW50YXRpb24gKG1hbiBwYWdlcywgZXRjLik/CiAKLSAgICBJdCdzIGluIHpsaWIuaCBmb3IgdGhlIG1vbWVudCwgYW5kIEZyYW5jaXMgUy4gTGluIGhhcyBjb252ZXJ0ZWQgaXQgdG8gYQotICAgIHdlYiBwYWdlIHpsaWIuaHRtbC4gVm9sdW50ZWVycyB0byB0cmFuc2Zvcm0gdGhpcyB0byBVbml4LXN0eWxlIG1hbiBwYWdlcywKLSAgICBwbGVhc2UgY29udGFjdCB1cyAoemxpYkBnemlwLm9yZykuIEV4YW1wbGVzIG9mIHpsaWIgdXNhZ2UgYXJlIGluIHRoZSBmaWxlcwotICAgIGV4YW1wbGUuYyBhbmQgbWluaWd6aXAuYy4KKyAgICBJdCdzIGluIHpsaWIuaCAuICBFeGFtcGxlcyBvZiB6bGliIHVzYWdlIGFyZSBpbiB0aGUgZmlsZXMgdGVzdC9leGFtcGxlLmMKKyAgICBhbmQgdGVzdC9taW5pZ3ppcC5jLCB3aXRoIG1vcmUgaW4gZXhhbXBsZXMvIC4KIAogIDcuIFdoeSBkb24ndCB5b3UgdXNlIEdOVSBhdXRvY29uZiBvciBsaWJ0b29sIG9yIC4uLj8KIAotICAgIEJlY2F1c2Ugd2Ugd291bGQgbGlrZSB0byBrZWVwIHpsaWIgYXMgYSB2ZXJ5IHNtYWxsIGFuZCBzaW1wbGUKLSAgICBwYWNrYWdlLiB6bGliIGlzIHJhdGhlciBwb3J0YWJsZSBhbmQgZG9lc24ndCBuZWVkIG11Y2ggY29uZmlndXJhdGlvbi4KKyAgICBCZWNhdXNlIHdlIHdvdWxkIGxpa2UgdG8ga2VlcCB6bGliIGFzIGEgdmVyeSBzbWFsbCBhbmQgc2ltcGxlIHBhY2thZ2UuCisgICAgemxpYiBpcyByYXRoZXIgcG9ydGFibGUgYW5kIGRvZXNuJ3QgbmVlZCBtdWNoIGNvbmZpZ3VyYXRpb24uCiAKICA4LiBJIGZvdW5kIGEgYnVnIGluIHpsaWIuCiAKLSAgICBNb3N0IG9mIHRoZSB0aW1lLCBzdWNoIHByb2JsZW1zIGFyZSBkdWUgdG8gYW4gaW5jb3JyZWN0IHVzYWdlIG9mCi0gICAgemxpYi4gUGxlYXNlIHRyeSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gd2l0aCBhIHNtYWxsIHByb2dyYW0gYW5kIHNlbmQKLSAgICB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgdG8gdXMgYXQgemxpYkBnemlwLm9yZyAuIERvIG5vdCBzZW5kCi0gICAgbXVsdGktbWVnYWJ5dGUgZGF0YSBmaWxlcyB3aXRob3V0IHByaW9yIGFncmVlbWVudC4KKyAgICBNb3N0IG9mIHRoZSB0aW1lLCBzdWNoIHByb2JsZW1zIGFyZSBkdWUgdG8gYW4gaW5jb3JyZWN0IHVzYWdlIG9mIHpsaWIuCisgICAgUGxlYXNlIHRyeSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gd2l0aCBhIHNtYWxsIHByb2dyYW0gYW5kIHNlbmQgdGhlCisgICAgY29ycmVzcG9uZGluZyBzb3VyY2UgdG8gdXMgYXQgemxpYkBnemlwLm9yZyAuICBEbyBub3Qgc2VuZCBtdWx0aS1tZWdhYnl0ZQorICAgIGRhdGEgZmlsZXMgd2l0aG91dCBwcmlvciBhZ3JlZW1lbnQuCiAKICA5LiBXaHkgZG8gSSBnZXQgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gZ3pwdXRjIj8KIApAQCAtODIsMTMgKzc5LDE1IEBACiAKIDEyLiBDYW4gemxpYiBoYW5kbGUgLlogZmlsZXM/CiAKLSAgICBObywgc29ycnkuIFlvdSBoYXZlIHRvIHNwYXduIGFuIHVuY29tcHJlc3Mgb3IgZ3VuemlwIHN1YnByb2Nlc3MsIG9yIGFkYXB0CisgICAgTm8sIHNvcnJ5LiAgWW91IGhhdmUgdG8gc3Bhd24gYW4gdW5jb21wcmVzcyBvciBndW56aXAgc3VicHJvY2Vzcywgb3IgYWRhcHQKICAgICB0aGUgY29kZSBvZiB1bmNvbXByZXNzIG9uIHlvdXIgb3duLgogCiAxMy4gSG93IGNhbiBJIG1ha2UgYSBVbml4IHNoYXJlZCBsaWJyYXJ5PwogCi0gICAgbWFrZSBjbGVhbgotICAgIC4vY29uZmlndXJlIC1zCisgICAgQnkgZGVmYXVsdCBhIHNoYXJlZCAoYW5kIGEgc3RhdGljKSBsaWJyYXJ5IGlzIGJ1aWx0IGZvciBVbml4LiAgU286CisKKyAgICBtYWtlIGRpc3RjbGVhbgorICAgIC4vY29uZmlndXJlCiAgICAgbWFrZQogCiAxNC4gSG93IGRvIEkgaW5zdGFsbCBhIHNoYXJlZCB6bGliIGxpYnJhcnkgb24gVW5peD8KQEAgLTk5LDggKzk4LDEwIEBACiAKICAgICBIb3dldmVyLCBtYW55IGZsYXZvcnMgb2YgVW5peCBjb21lIHdpdGggYSBzaGFyZWQgemxpYiBhbHJlYWR5IGluc3RhbGxlZC4KICAgICBCZWZvcmUgZ29pbmcgdG8gdGhlIHRyb3VibGUgb2YgY29tcGlsaW5nIGEgc2hhcmVkIHZlcnNpb24gb2YgemxpYiBhbmQKLSAgICB0cnlpbmcgdG8gaW5zdGFsbCBpdCwgeW91IG1heSB3YW50IHRvIGNoZWNrIGlmIGl0J3MgYWxyZWFkeSB0aGVyZSEgSWYgeW91Ci0gICAgY2FuICNpbmNsdWRlIDx6bGliLmg+LCBpdCdzIHRoZXJlLiBUaGUgLWx6IG9wdGlvbiB3aWxsIHByb2JhYmx5IGxpbmsgdG8gaXQuCisgICAgdHJ5aW5nIHRvIGluc3RhbGwgaXQsIHlvdSBtYXkgd2FudCB0byBjaGVjayBpZiBpdCdzIGFscmVhZHkgdGhlcmUhICBJZiB5b3UKKyAgICBjYW4gI2luY2x1ZGUgPHpsaWIuaD4sIGl0J3MgdGhlcmUuICBUaGUgLWx6IG9wdGlvbiB3aWxsIHByb2JhYmx5IGxpbmsgdG8KKyAgICBpdC4gIFlvdSBjYW4gY2hlY2sgdGhlIHZlcnNpb24gYXQgdGhlIHRvcCBvZiB6bGliLmggb3Igd2l0aCB0aGUKKyAgICBaTElCX1ZFUlNJT04gc3ltYm9sIGRlZmluZWQgaW4gemxpYi5oIC4KIAogMTUuIEkgaGF2ZSBhIHF1ZXN0aW9uIGFib3V0IE90dG9QREYuCiAKQEAgLTEwOSw4ICsxMTAsOCBAQAogCiAxNi4gQ2FuIHpsaWIgZGVjb2RlIEZsYXRlIGRhdGEgaW4gYW4gQWRvYmUgUERGIGZpbGU/CiAKLSAgICBZZXMuIFNlZSBodHRwOi8vd3d3LmZhc3Rpby5jb20vIChDbGliUERGKSwgb3IgaHR0cDovL3d3dy5wZGZsaWIuY29tLyAuCi0gICAgVG8gbW9kaWZ5IFBERiBmb3Jtcywgc2VlIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYWNyb2Zvcm10b29sLyAuCisgICAgWWVzLiBTZWUgaHR0cDovL3d3dy5wZGZsaWIuY29tLyAuIFRvIG1vZGlmeSBQREYgZm9ybXMsIHNlZQorICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYWNyb2Zvcm10b29sLyAuCiAKIDE3LiBXaHkgYW0gSSBnZXR0aW5nIHRoaXMgInJlZ2lzdGVyX2ZyYW1lX2luZm8gbm90IGZvdW5kIiBlcnJvciBvbiBTb2xhcmlzPwogCkBAIC0xMjEsNjcgKzEyMiw2NyBAQAogICAgICAgICBzeW1ib2wgX19yZWdpc3Rlcl9mcmFtZV9pbmZvOiByZWZlcmVuY2VkIHN5bWJvbCBub3QgZm91bmQKIAogICAgIFRoZSBzeW1ib2wgX19yZWdpc3Rlcl9mcmFtZV9pbmZvIGlzIG5vdCBwYXJ0IG9mIHpsaWIsIGl0IGlzIGdlbmVyYXRlZCBieQotICAgIHRoZSBDIGNvbXBpbGVyIChjYyBvciBnY2MpLiBZb3UgbXVzdCByZWNvbXBpbGUgYXBwbGljYXRpb25zIHVzaW5nIHpsaWIKLSAgICB3aGljaCBoYXZlIHRoaXMgcHJvYmxlbS4gVGhpcyBwcm9ibGVtIGlzIHNwZWNpZmljIHRvIFNvbGFyaXMuIFNlZQorICAgIHRoZSBDIGNvbXBpbGVyIChjYyBvciBnY2MpLiAgWW91IG11c3QgcmVjb21waWxlIGFwcGxpY2F0aW9ucyB1c2luZyB6bGliCisgICAgd2hpY2ggaGF2ZSB0aGlzIHByb2JsZW0uICBUaGlzIHByb2JsZW0gaXMgc3BlY2lmaWMgdG8gU29sYXJpcy4gIFNlZQogICAgIGh0dHA6Ly93d3cuc3VuZnJlZXdhcmUuY29tIGZvciBTb2xhcmlzIHZlcnNpb25zIG9mIHpsaWIgYW5kIGFwcGxpY2F0aW9ucwogICAgIHVzaW5nIHpsaWIuCiAKIDE4LiBXaHkgZG9lcyBnemlwIGdpdmUgYW4gZXJyb3Igb24gYSBmaWxlIEkgbWFrZSB3aXRoIGNvbXByZXNzL2RlZmxhdGU/CiAKICAgICBUaGUgY29tcHJlc3MgYW5kIGRlZmxhdGUgZnVuY3Rpb25zIHByb2R1Y2UgZGF0YSBpbiB0aGUgemxpYiBmb3JtYXQsIHdoaWNoCi0gICAgaXMgZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZ3ppcCBmb3JtYXQuIFRoZSBneiogZnVuY3Rpb25zIGluCi0gICAgemxpYiBvbiB0aGUgb3RoZXIgaGFuZCB1c2UgdGhlIGd6aXAgZm9ybWF0LiBCb3RoIHRoZSB6bGliIGFuZCBnemlwCi0gICAgZm9ybWF0cyB1c2UgdGhlIHNhbWUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCBpbnRlcm5hbGx5LCBidXQgaGF2ZSBkaWZmZXJlbnQKLSAgICBoZWFkZXJzIGFuZCB0cmFpbGVycyBhcm91bmQgdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAgICBpcyBkaWZmZXJlbnQgYW5kIGluY29tcGF0aWJsZSB3aXRoIHRoZSBnemlwIGZvcm1hdC4gIFRoZSBneiogZnVuY3Rpb25zIGluCisgICAgemxpYiBvbiB0aGUgb3RoZXIgaGFuZCB1c2UgdGhlIGd6aXAgZm9ybWF0LiAgQm90aCB0aGUgemxpYiBhbmQgZ3ppcCBmb3JtYXRzCisgICAgdXNlIHRoZSBzYW1lIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgaW50ZXJuYWxseSwgYnV0IGhhdmUgZGlmZmVyZW50IGhlYWRlcnMKKyAgICBhbmQgdHJhaWxlcnMgYXJvdW5kIHRoZSBjb21wcmVzc2VkIGRhdGEuCiAKIDE5LiBPaywgc28gd2h5IGFyZSB0aGVyZSB0d28gZGlmZmVyZW50IGZvcm1hdHM/CiAKLSAgICBUaGUgZ3ppcCBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIHJldGFpbiB0aGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGFib3V0Ci0gICAgYSBzaW5nbGUgZmlsZSwgc3VjaCBhcyB0aGUgbmFtZSBhbmQgbGFzdCBtb2RpZmljYXRpb24gZGF0ZS4gVGhlIHpsaWIKLSAgICBmb3JtYXQgb24gdGhlIG90aGVyIGhhbmQgd2FzIGRlc2lnbmVkIGZvciBpbi1tZW1vcnkgYW5kIGNvbW11bmljYXRpb24KLSAgICBjaGFubmVsIGFwcGxpY2F0aW9ucywgYW5kIGhhcyBhIG11Y2ggbW9yZSBjb21wYWN0IGhlYWRlciBhbmQgdHJhaWxlciBhbmQKLSAgICB1c2VzIGEgZmFzdGVyIGludGVncml0eSBjaGVjayB0aGFuIGd6aXAuCisgICAgVGhlIGd6aXAgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byByZXRhaW4gdGhlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBhYm91dCBhCisgICAgc2luZ2xlIGZpbGUsIHN1Y2ggYXMgdGhlIG5hbWUgYW5kIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUuICBUaGUgemxpYiBmb3JtYXQKKyAgICBvbiB0aGUgb3RoZXIgaGFuZCB3YXMgZGVzaWduZWQgZm9yIGluLW1lbW9yeSBhbmQgY29tbXVuaWNhdGlvbiBjaGFubmVsCisgICAgYXBwbGljYXRpb25zLCBhbmQgaGFzIGEgbXVjaCBtb3JlIGNvbXBhY3QgaGVhZGVyIGFuZCB0cmFpbGVyIGFuZCB1c2VzIGEKKyAgICBmYXN0ZXIgaW50ZWdyaXR5IGNoZWNrIHRoYW4gZ3ppcC4KIAogMjAuIFdlbGwgdGhhdCdzIG5pY2UsIGJ1dCBob3cgZG8gSSBtYWtlIGEgZ3ppcCBmaWxlIGluIG1lbW9yeT8KIAogICAgIFlvdSBjYW4gcmVxdWVzdCB0aGF0IGRlZmxhdGUgd3JpdGUgdGhlIGd6aXAgZm9ybWF0IGluc3RlYWQgb2YgdGhlIHpsaWIKLSAgICBmb3JtYXQgdXNpbmcgZGVmbGF0ZUluaXQyKCkuIFlvdSBjYW4gYWxzbyByZXF1ZXN0IHRoYXQgaW5mbGF0ZSBkZWNvZGUKLSAgICB0aGUgZ3ppcCBmb3JtYXQgdXNpbmcgaW5mbGF0ZUluaXQyKCkuIFJlYWQgemxpYi5oIGZvciBtb3JlIGRldGFpbHMuCisgICAgZm9ybWF0IHVzaW5nIGRlZmxhdGVJbml0MigpLiAgWW91IGNhbiBhbHNvIHJlcXVlc3QgdGhhdCBpbmZsYXRlIGRlY29kZSB0aGUKKyAgICBnemlwIGZvcm1hdCB1c2luZyBpbmZsYXRlSW5pdDIoKS4gIFJlYWQgemxpYi5oIGZvciBtb3JlIGRldGFpbHMuCiAKIDIxLiBJcyB6bGliIHRocmVhZC1zYWZlPwogCi0gICAgWWVzLiBIb3dldmVyIGFueSBsaWJyYXJ5IHJvdXRpbmVzIHRoYXQgemxpYiB1c2VzIGFuZCBhbnkgYXBwbGljYXRpb24tCi0gICAgcHJvdmlkZWQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgbXVzdCBhbHNvIGJlIHRocmVhZC1zYWZlLiB6bGliJ3MgZ3oqCisgICAgWWVzLiAgSG93ZXZlciBhbnkgbGlicmFyeSByb3V0aW5lcyB0aGF0IHpsaWIgdXNlcyBhbmQgYW55IGFwcGxpY2F0aW9uLQorICAgIHByb3ZpZGVkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIG11c3QgYWxzbyBiZSB0aHJlYWQtc2FmZS4gIHpsaWIncyBneioKICAgICBmdW5jdGlvbnMgdXNlIHN0ZGlvIGxpYnJhcnkgcm91dGluZXMsIGFuZCBtb3N0IG9mIHpsaWIncyBmdW5jdGlvbnMgdXNlIHRoZQotICAgIGxpYnJhcnkgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgYnkgZGVmYXVsdC4gemxpYidzIEluaXQgZnVuY3Rpb25zIGFsbG93Ci0gICAgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBwcm92aWRlIGN1c3RvbSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4KKyAgICBsaWJyYXJ5IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGJ5IGRlZmF1bHQuICB6bGliJ3MgKkluaXQqIGZ1bmN0aW9ucworICAgIGFsbG93IGZvciB0aGUgYXBwbGljYXRpb24gdG8gcHJvdmlkZSBjdXN0b20gbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCiAKICAgICBPZiBjb3Vyc2UsIHlvdSBzaG91bGQgb25seSBvcGVyYXRlIG9uIGFueSBnaXZlbiB6bGliIG9yIGd6aXAgc3RyZWFtIGZyb20gYQogICAgIHNpbmdsZSB0aHJlYWQgYXQgYSB0aW1lLgogCiAyMi4gQ2FuIEkgdXNlIHpsaWIgaW4gbXkgY29tbWVyY2lhbCBhcHBsaWNhdGlvbj8KIAotICAgIFllcy4gUGxlYXNlIHJlYWQgdGhlIGxpY2Vuc2UgaW4gemxpYi5oLgorICAgIFllcy4gIFBsZWFzZSByZWFkIHRoZSBsaWNlbnNlIGluIHpsaWIuaC4KIAogMjMuIElzIHpsaWIgdW5kZXIgdGhlIEdOVSBsaWNlbnNlPwogCi0gICAgTm8uIFBsZWFzZSByZWFkIHRoZSBsaWNlbnNlIGluIHpsaWIuaC4KKyAgICBOby4gIFBsZWFzZSByZWFkIHRoZSBsaWNlbnNlIGluIHpsaWIuaC4KIAogMjQuIFRoZSBsaWNlbnNlIHNheXMgdGhhdCBhbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlICJwbGFpbmx5IG1hcmtlZCIuIFNvCiAgICAgd2hhdCBleGFjdGx5IGRvIEkgbmVlZCB0byBkbyB0byBtZWV0IHRoYXQgcmVxdWlyZW1lbnQ/CiAKLSAgICBZb3UgbmVlZCB0byBjaGFuZ2UgdGhlIFpMSUJfVkVSU0lPTiBhbmQgWkxJQl9WRVJOVU0gI2RlZmluZXMgaW4gemxpYi5oLiBJbgorICAgIFlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgWkxJQl9WRVJTSU9OIGFuZCBaTElCX1ZFUk5VTSAjZGVmaW5lcyBpbiB6bGliLmguICBJbgogICAgIHBhcnRpY3VsYXIsIHRoZSBmaW5hbCB2ZXJzaW9uIG51bWJlciBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvICJmIiwgYW5kIGFuCi0gICAgaWRlbnRpZmljYXRpb24gc3RyaW5nIHNob3VsZCBiZSBhcHBlbmRlZCB0byBaTElCX1ZFUlNJT04uIFZlcnNpb24gbnVtYmVycworICAgIGlkZW50aWZpY2F0aW9uIHN0cmluZyBzaG91bGQgYmUgYXBwZW5kZWQgdG8gWkxJQl9WRVJTSU9OLiAgVmVyc2lvbiBudW1iZXJzCiAgICAgeC54LnguZiBhcmUgcmVzZXJ2ZWQgZm9yIG1vZGlmaWNhdGlvbnMgdG8gemxpYiBieSBvdGhlcnMgdGhhbiB0aGUgemxpYgotICAgIG1haW50YWluZXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgemxpYiB5b3UgYXJlIGFsdGVyaW5nCisgICAgbWFpbnRhaW5lcnMuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgemxpYiB5b3UgYXJlIGFsdGVyaW5nCiAgICAgaXMgIjEuMi4zLjQiLCB0aGVuIGluIHpsaWIuaCB5b3Ugc2hvdWxkIGNoYW5nZSBaTElCX1ZFUk5VTSB0byAweDEyM2YsIGFuZAotICAgIFpMSUJfVkVSU0lPTiB0byBzb21ldGhpbmcgbGlrZSAiMS4yLjMuZi16YWNoYXJ5LW1vZHMtdjMiLiBZb3UgY2FuIGFsc28KKyAgICBaTElCX1ZFUlNJT04gdG8gc29tZXRoaW5nIGxpa2UgIjEuMi4zLmYtemFjaGFyeS1tb2RzLXYzIi4gIFlvdSBjYW4gYWxzbwogICAgIHVwZGF0ZSB0aGUgdmVyc2lvbiBzdHJpbmdzIGluIGRlZmxhdGUuYyBhbmQgaW5mdHJlZXMuYy4KIAogICAgIEZvciBhbHRlcmVkIHNvdXJjZSBkaXN0cmlidXRpb25zLCB5b3Ugc2hvdWxkIGFsc28gbm90ZSB0aGUgb3JpZ2luIGFuZAogICAgIG5hdHVyZSBvZiB0aGUgY2hhbmdlcyBpbiB6bGliLmgsIGFzIHdlbGwgYXMgaW4gQ2hhbmdlTG9nIGFuZCBSRUFETUUsIGFsb25nCi0gICAgd2l0aCB0aGUgZGF0ZXMgb2YgdGhlIGFsdGVyYXRpb25zLiBUaGUgb3JpZ2luIHNob3VsZCBpbmNsdWRlIGF0IGxlYXN0IHlvdXIKKyAgICB3aXRoIHRoZSBkYXRlcyBvZiB0aGUgYWx0ZXJhdGlvbnMuICBUaGUgb3JpZ2luIHNob3VsZCBpbmNsdWRlIGF0IGxlYXN0IHlvdXIKICAgICBuYW1lIChvciB5b3VyIGNvbXBhbnkncyBuYW1lKSwgYW5kIGFuIGVtYWlsIGFkZHJlc3MgdG8gY29udGFjdCBmb3IgaGVscCBvcgogICAgIGlzc3VlcyB3aXRoIHRoZSBsaWJyYXJ5LgogCkBAIC0xOTcsMTA1ICsxOTgsMTEyIEBACiAKIDI2LiBXaWxsIHpsaWIgd29yayBvbiBhIDY0LWJpdCBtYWNoaW5lPwogCi0gICAgSXQgc2hvdWxkLiBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gNjQtYml0IG1hY2hpbmVzLCBhbmQgaGFzIG5vIGRlcGVuZGVuY2UKLSAgICBvbiBhbnkgZGF0YSB0eXBlcyBiZWluZyBsaW1pdGVkIHRvIDMyLWJpdHMgaW4gbGVuZ3RoLiBJZiB5b3UgaGF2ZSBhbnkKKyAgICBZZXMuICBJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gNjQtYml0IG1hY2hpbmVzLCBhbmQgaGFzIG5vIGRlcGVuZGVuY2Ugb24gYW55CisgICAgZGF0YSB0eXBlcyBiZWluZyBsaW1pdGVkIHRvIDMyLWJpdHMgaW4gbGVuZ3RoLiAgSWYgeW91IGhhdmUgYW55CiAgICAgZGlmZmljdWx0aWVzLCBwbGVhc2UgcHJvdmlkZSBhIGNvbXBsZXRlIHByb2JsZW0gcmVwb3J0IHRvIHpsaWJAZ3ppcC5vcmcKIAogMjcuIFdpbGwgemxpYiBkZWNvbXByZXNzIGRhdGEgZnJvbSB0aGUgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeT8KIAotICAgIE5vLiBUaGUgUEtXYXJlIERDTCB1c2VzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgY29tcHJlc3NlZCBkYXRhIGZvcm1hdAotICAgIHRoYW4gZG9lcyBQS1pJUCBhbmQgemxpYi4gSG93ZXZlciwgeW91IGNhbiBsb29rIGluIHpsaWIncyBjb250cmliL2JsYXN0CisgICAgTm8uICBUaGUgUEtXYXJlIERDTCB1c2VzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgY29tcHJlc3NlZCBkYXRhIGZvcm1hdCB0aGFuCisgICAgZG9lcyBQS1pJUCBhbmQgemxpYi4gIEhvd2V2ZXIsIHlvdSBjYW4gbG9vayBpbiB6bGliJ3MgY29udHJpYi9ibGFzdAogICAgIGRpcmVjdG9yeSBmb3IgYSBwb3NzaWJsZSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0uCiAKIDI4LiBDYW4gSSBhY2Nlc3MgZGF0YSByYW5kb21seSBpbiBhIGNvbXByZXNzZWQgc3RyZWFtPwogCi0gICAgTm8sIG5vdCB3aXRob3V0IHNvbWUgcHJlcGFyYXRpb24uIElmIHdoZW4gY29tcHJlc3NpbmcgeW91IHBlcmlvZGljYWxseQotICAgIHVzZSBaX0ZVTExfRkxVU0gsIGNhcmVmdWxseSB3cml0ZSBhbGwgdGhlIHBlbmRpbmcgZGF0YSBhdCB0aG9zZSBwb2ludHMsCi0gICAgYW5kIGtlZXAgYW4gaW5kZXggb2YgdGhvc2UgbG9jYXRpb25zLCB0aGVuIHlvdSBjYW4gc3RhcnQgZGVjb21wcmVzc2lvbgotICAgIGF0IHRob3NlIHBvaW50cy4gWW91IGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBub3QgdXNlIFpfRlVMTF9GTFVTSCB0b28KLSAgICBvZnRlbiwgc2luY2UgaXQgY2FuIHNpZ25pZmljYW50bHkgZGVncmFkZSBjb21wcmVzc2lvbi4KKyAgICBObywgbm90IHdpdGhvdXQgc29tZSBwcmVwYXJhdGlvbi4gIElmIHdoZW4gY29tcHJlc3NpbmcgeW91IHBlcmlvZGljYWxseSB1c2UKKyAgICBaX0ZVTExfRkxVU0gsIGNhcmVmdWxseSB3cml0ZSBhbGwgdGhlIHBlbmRpbmcgZGF0YSBhdCB0aG9zZSBwb2ludHMsIGFuZAorICAgIGtlZXAgYW4gaW5kZXggb2YgdGhvc2UgbG9jYXRpb25zLCB0aGVuIHlvdSBjYW4gc3RhcnQgZGVjb21wcmVzc2lvbiBhdCB0aG9zZQorICAgIHBvaW50cy4gIFlvdSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gbm90IHVzZSBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuLCBzaW5jZSBpdAorICAgIGNhbiBzaWduaWZpY2FudGx5IGRlZ3JhZGUgY29tcHJlc3Npb24uICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNjYW4gYQorICAgIGRlZmxhdGUgc3RyZWFtIG9uY2UgdG8gZ2VuZXJhdGUgYW4gaW5kZXgsIGFuZCB0aGVuIHVzZSB0aGF0IGluZGV4IGZvcgorICAgIHJhbmRvbSBhY2Nlc3MuICBTZWUgZXhhbXBsZXMvenJhbi5jIC4KIAogMjkuIERvZXMgemxpYiB3b3JrIG9uIE1WUywgT1MvMzkwLCBDSUNTLCBldGMuPwogCi0gICAgV2UgZG9uJ3Qga25vdyBmb3Igc3VyZS4gV2UgaGF2ZSBoZWFyZCBvY2Nhc2lvbmFsIHJlcG9ydHMgb2Ygc3VjY2VzcyBvbgotICAgIHRoZXNlIHN5c3RlbXMuIElmIHlvdSBkbyB1c2UgaXQgb24gb25lIG9mIHRoZXNlLCBwbGVhc2UgcHJvdmlkZSB1cyB3aXRoCi0gICAgYSByZXBvcnQsIGluc3RydWN0aW9ucywgYW5kIHBhdGNoZXMgdGhhdCB3ZSBjYW4gcmVmZXJlbmNlIHdoZW4gd2UgZ2V0Ci0gICAgdGhlc2UgcXVlc3Rpb25zLiBUaGFua3MuCisgICAgSXQgaGFzIGluIHRoZSBwYXN0LCBidXQgd2UgaGF2ZSBub3QgaGVhcmQgb2YgYW55IHJlY2VudCBldmlkZW5jZS4gIFRoZXJlCisgICAgd2VyZSB3b3JraW5nIHBvcnRzIG9mIHpsaWIgMS4xLjQgdG8gTVZTLCBidXQgdGhvc2UgbGlua3Mgbm8gbG9uZ2VyIHdvcmsuCisgICAgSWYgeW91IGtub3cgb2YgcmVjZW50LCBzdWNjZXNzZnVsIGFwcGxpY2F0aW9ucyBvZiB6bGliIG9uIHRoZXNlIG9wZXJhdGluZworICAgIHN5c3RlbXMsIHBsZWFzZSBsZXQgdXMga25vdy4gIFRoYW5rcy4KIAotMzAuIElzIHRoZXJlIHNvbWUgc2ltcGxlciwgZWFzaWVyIHRvIHJlYWQgdmVyc2lvbiBvZiBpbmZsYXRlIEkgY2FuIGxvb2sgYXQKLSAgICB0byB1bmRlcnN0YW5kIHRoZSBkZWZsYXRlIGZvcm1hdD8KKzMwLiBJcyB0aGVyZSBzb21lIHNpbXBsZXIsIGVhc2llciB0byByZWFkIHZlcnNpb24gb2YgaW5mbGF0ZSBJIGNhbiBsb29rIGF0IHRvCisgICAgdW5kZXJzdGFuZCB0aGUgZGVmbGF0ZSBmb3JtYXQ/CiAKLSAgICBGaXJzdCBvZmYsIHlvdSBzaG91bGQgcmVhZCBSRkMgMTk1MS4gU2Vjb25kLCB5ZXMuIExvb2sgaW4gemxpYidzCisgICAgRmlyc3Qgb2ZmLCB5b3Ugc2hvdWxkIHJlYWQgUkZDIDE5NTEuICBTZWNvbmQsIHllcy4gIExvb2sgaW4gemxpYidzCiAgICAgY29udHJpYi9wdWZmIGRpcmVjdG9yeS4KIAogMzEuIERvZXMgemxpYiBpbmZyaW5nZSBvbiBhbnkgcGF0ZW50cz8KIAotICAgIEFzIGZhciBhcyB3ZSBrbm93LCBuby4gSW4gZmFjdCwgdGhhdCB3YXMgb3JpZ2luYWxseSB0aGUgd2hvbGUgcG9pbnQgYmVoaW5kCi0gICAgemxpYi4gTG9vayBoZXJlIGZvciBzb21lIG1vcmUgaW5mb3JtYXRpb246CisgICAgQXMgZmFyIGFzIHdlIGtub3csIG5vLiAgSW4gZmFjdCwgdGhhdCB3YXMgb3JpZ2luYWxseSB0aGUgd2hvbGUgcG9pbnQgYmVoaW5kCisgICAgemxpYi4gIExvb2sgaGVyZSBmb3Igc29tZSBtb3JlIGluZm9ybWF0aW9uOgogCiAgICAgaHR0cDovL3d3dy5nemlwLm9yZy8jZmFxMTEKIAogMzIuIENhbiB6bGliIHdvcmsgd2l0aCBncmVhdGVyIHRoYW4gNCBHQiBvZiBkYXRhPwogCi0gICAgWWVzLiBpbmZsYXRlKCkgYW5kIGRlZmxhdGUoKSB3aWxsIHByb2Nlc3MgYW55IGFtb3VudCBvZiBkYXRhIGNvcnJlY3RseS4KKyAgICBZZXMuICBpbmZsYXRlKCkgYW5kIGRlZmxhdGUoKSB3aWxsIHByb2Nlc3MgYW55IGFtb3VudCBvZiBkYXRhIGNvcnJlY3RseS4KICAgICBFYWNoIGNhbGwgb2YgaW5mbGF0ZSgpIG9yIGRlZmxhdGUoKSBpcyBsaW1pdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgY2h1bmtzCiAgICAgb2YgdGhlIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gYmUgc3RvcmVkIGluIHRoZSBjb21waWxlcidzICJ1bnNpZ25lZCBpbnQiCi0gICAgdHlwZSwgYnV0IHRoZXJlIGlzIG5vIGxpbWl0IHRvIHRoZSBudW1iZXIgb2YgY2h1bmtzLiBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUKLSAgICBzdHJtLnRvdGFsX2luIGFuZCBzdHJtX3RvdGFsX291dCBjb3VudGVycyBtYXkgYmUgbGltaXRlZCB0byA0IEdCLiBUaGVzZQorICAgIHR5cGUsIGJ1dCB0aGVyZSBpcyBubyBsaW1pdCB0byB0aGUgbnVtYmVyIG9mIGNodW5rcy4gIE5vdGUgaG93ZXZlciB0aGF0IHRoZQorICAgIHN0cm0udG90YWxfaW4gYW5kIHN0cm1fdG90YWxfb3V0IGNvdW50ZXJzIG1heSBiZSBsaW1pdGVkIHRvIDQgR0IuICBUaGVzZQogICAgIGNvdW50ZXJzIGFyZSBwcm92aWRlZCBhcyBhIGNvbnZlbmllbmNlIGFuZCBhcmUgbm90IHVzZWQgaW50ZXJuYWxseSBieQotICAgIGluZmxhdGUoKSBvciBkZWZsYXRlKCkuIFRoZSBhcHBsaWNhdGlvbiBjYW4gZWFzaWx5IHNldCB1cCBpdHMgb3duIGNvdW50ZXJzCisgICAgaW5mbGF0ZSgpIG9yIGRlZmxhdGUoKS4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gZWFzaWx5IHNldCB1cCBpdHMgb3duIGNvdW50ZXJzCiAgICAgdXBkYXRlZCBhZnRlciBlYWNoIGNhbGwgb2YgaW5mbGF0ZSgpIG9yIGRlZmxhdGUoKSB0byBjb3VudCBiZXlvbmQgNCBHQi4KICAgICBjb21wcmVzcygpIGFuZCB1bmNvbXByZXNzKCkgbWF5IGJlIGxpbWl0ZWQgdG8gNCBHQiwgc2luY2UgdGhleSBvcGVyYXRlIGluIGEKLSAgICBzaW5nbGUgY2FsbC4gZ3pzZWVrKCkgYW5kIGd6dGVsbCgpIG1heSBiZSBsaW1pdGVkIHRvIDQgR0IgZGVwZW5kaW5nIG9uIGhvdwotICAgIHpsaWIgaXMgY29tcGlsZWQuIFNlZSB0aGUgemxpYkNvbXBpbGVGbGFncygpIGZ1bmN0aW9uIGluIHpsaWIuaC4KKyAgICBzaW5nbGUgY2FsbC4gIGd6c2VlaygpIGFuZCBnenRlbGwoKSBtYXkgYmUgbGltaXRlZCB0byA0IEdCIGRlcGVuZGluZyBvbiBob3cKKyAgICB6bGliIGlzIGNvbXBpbGVkLiAgU2VlIHRoZSB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gaW4gemxpYi5oLgogCi0gICAgVGhlIHdvcmQgIm1heSIgYXBwZWFycyBzZXZlcmFsIHRpbWVzIGFib3ZlIHNpbmNlIHRoZXJlIGlzIGEgNCBHQiBsaW1pdAotICAgIG9ubHkgaWYgdGhlIGNvbXBpbGVyJ3MgImxvbmciIHR5cGUgaXMgMzIgYml0cy4gSWYgdGhlIGNvbXBpbGVyJ3MgImxvbmciCi0gICAgdHlwZSBpcyA2NCBiaXRzLCB0aGVuIHRoZSBsaW1pdCBpcyAxNiBleGFieXRlcy4KKyAgICBUaGUgd29yZCAibWF5IiBhcHBlYXJzIHNldmVyYWwgdGltZXMgYWJvdmUgc2luY2UgdGhlcmUgaXMgYSA0IEdCIGxpbWl0IG9ubHkKKyAgICBpZiB0aGUgY29tcGlsZXIncyAibG9uZyIgdHlwZSBpcyAzMiBiaXRzLiAgSWYgdGhlIGNvbXBpbGVyJ3MgImxvbmciIHR5cGUgaXMKKyAgICA2NCBiaXRzLCB0aGVuIHRoZSBsaW1pdCBpcyAxNiBleGFieXRlcy4KIAogMzMuIERvZXMgemxpYiBoYXZlIGFueSBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXM/CiAKLSAgICBUaGUgb25seSBvbmUgdGhhdCB3ZSBhcmUgYXdhcmUgb2YgaXMgcG90ZW50aWFsbHkgaW4gZ3pwcmludGYoKS4gSWYgemxpYgotICAgIGlzIGNvbXBpbGVkIHRvIHVzZSBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSwgdGhlbiB0aGVyZSBpcyBubyBwcm90ZWN0aW9uCi0gICAgYWdhaW5zdCBhIGJ1ZmZlciBvdmVyZmxvdyBvZiBhIDRLIHN0cmluZyBzcGFjZSwgb3RoZXIgdGhhbiB0aGUgY2FsbGVyIG9mCi0gICAgZ3pwcmludGYoKSBhc3N1cmluZyB0aGF0IHRoZSBvdXRwdXQgd2lsbCBub3QgZXhjZWVkIDRLLiBPbiB0aGUgb3RoZXIKLSAgICBoYW5kLCBpZiB6bGliIGlzIGNvbXBpbGVkIHRvIHVzZSBzbnByaW50ZigpIG9yIHZzbnByaW50ZigpLCB3aGljaCBzaG91bGQKLSAgICBub3JtYWxseSBiZSB0aGUgY2FzZSwgdGhlbiB0aGVyZSBpcyBubyB2dWxuZXJhYmlsaXR5LiBUaGUgLi9jb25maWd1cmUKLSAgICBzY3JpcHQgd2lsbCBkaXNwbGF5IHdhcm5pbmdzIGlmIGFuIGluc2VjdXJlIHZhcmlhdGlvbiBvZiBzcHJpbnRmKCkgd2lsbAotICAgIGJlIHVzZWQgYnkgZ3pwcmludGYoKS4gQWxzbyB0aGUgemxpYkNvbXBpbGVGbGFncygpIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCi0gICAgaW5mb3JtYXRpb24gb24gd2hhdCB2YXJpYW50IG9mIHNwcmludGYoKSBpcyB1c2VkIGJ5IGd6cHJpbnRmKCkuCisgICAgVGhlIG9ubHkgb25lIHRoYXQgd2UgYXJlIGF3YXJlIG9mIGlzIHBvdGVudGlhbGx5IGluIGd6cHJpbnRmKCkuICBJZiB6bGliIGlzCisgICAgY29tcGlsZWQgdG8gdXNlIHNwcmludGYoKSBvciB2c3ByaW50ZigpLCB0aGVuIHRoZXJlIGlzIG5vIHByb3RlY3Rpb24KKyAgICBhZ2FpbnN0IGEgYnVmZmVyIG92ZXJmbG93IG9mIGFuIDhLIHN0cmluZyBzcGFjZSAob3Igb3RoZXIgdmFsdWUgYXMgc2V0IGJ5CisgICAgZ3pidWZmZXIoKSksIG90aGVyIHRoYW4gdGhlIGNhbGxlciBvZiBnenByaW50ZigpIGFzc3VyaW5nIHRoYXQgdGhlIG91dHB1dAorICAgIHdpbGwgbm90IGV4Y2VlZCA4Sy4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB6bGliIGlzIGNvbXBpbGVkIHRvIHVzZQorICAgIHNucHJpbnRmKCkgb3IgdnNucHJpbnRmKCksIHdoaWNoIHNob3VsZCBub3JtYWxseSBiZSB0aGUgY2FzZSwgdGhlbiB0aGVyZSBpcworICAgIG5vIHZ1bG5lcmFiaWxpdHkuICBUaGUgLi9jb25maWd1cmUgc2NyaXB0IHdpbGwgZGlzcGxheSB3YXJuaW5ncyBpZiBhbgorICAgIGluc2VjdXJlIHZhcmlhdGlvbiBvZiBzcHJpbnRmKCkgd2lsbCBiZSB1c2VkIGJ5IGd6cHJpbnRmKCkuICBBbHNvIHRoZQorICAgIHpsaWJDb21waWxlRmxhZ3MoKSBmdW5jdGlvbiB3aWxsIHJldHVybiBpbmZvcm1hdGlvbiBvbiB3aGF0IHZhcmlhbnQgb2YKKyAgICBzcHJpbnRmKCkgaXMgdXNlZCBieSBnenByaW50ZigpLgogCiAgICAgSWYgeW91IGRvbid0IGhhdmUgc25wcmludGYoKSBvciB2c25wcmludGYoKSBhbmQgd291bGQgbGlrZSBvbmUsIHlvdSBjYW4KICAgICBmaW5kIGEgcG9ydGFibGUgaW1wbGVtZW50YXRpb24gaGVyZToKIAogICAgICAgICBodHRwOi8vd3d3Lmlqcy5zaS9zb2Z0d2FyZS9zbnByaW50Zi8KIAotICAgIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHpsaWIuIFZlcnNpb25zCi0gICAgMS4xLjMgYW5kIGJlZm9yZSB3ZXJlIHN1YmplY3QgdG8gYSBkb3VibGUtZnJlZSB2dWxuZXJhYmlsaXR5LgorICAgIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHpsaWIuICBWZXJzaW9ucworICAgIDEuMS4zIGFuZCBiZWZvcmUgd2VyZSBzdWJqZWN0IHRvIGEgZG91YmxlLWZyZWUgdnVsbmVyYWJpbGl0eSwgYW5kIHZlcnNpb25zCisgICAgMS4yLjEgYW5kIDEuMi4yIHdlcmUgc3ViamVjdCB0byBhbiBhY2Nlc3MgZXhjZXB0aW9uIHdoZW4gZGVjb21wcmVzc2luZworICAgIGludmFsaWQgY29tcHJlc3NlZCBkYXRhLgogCiAzNC4gSXMgdGhlcmUgYSBKYXZhIHZlcnNpb24gb2YgemxpYj8KIAogICAgIFByb2JhYmx5IHdoYXQgeW91IHdhbnQgaXMgdG8gdXNlIHpsaWIgaW4gSmF2YS4gemxpYiBpcyBhbHJlYWR5IGluY2x1ZGVkCiAgICAgYXMgcGFydCBvZiB0aGUgSmF2YSBTREsgaW4gdGhlIGphdmEudXRpbC56aXAgcGFja2FnZS4gSWYgeW91IHJlYWxseSB3YW50CiAgICAgYSB2ZXJzaW9uIG9mIHpsaWIgd3JpdHRlbiBpbiB0aGUgSmF2YSBsYW5ndWFnZSwgbG9vayBvbiB0aGUgemxpYiBob21lCi0gICAgcGFnZSBmb3IgbGlua3M6IGh0dHA6Ly93d3cuemxpYi5vcmcvCisgICAgcGFnZSBmb3IgbGlua3M6IGh0dHA6Ly96bGliLm5ldC8gLgogCiAzNS4gSSBnZXQgdGhpcyBvciB0aGF0IGNvbXBpbGVyIG9yIHNvdXJjZS1jb2RlIHNjYW5uZXIgd2FybmluZyB3aGVuIEkgY3JhbmsgaXQKICAgICB1cCB0byBtYXhpbWFsbHktcGVkYW50aWMuIENhbid0IHlvdSBndXlzIHdyaXRlIHByb3BlciBjb2RlPwogCiAgICAgTWFueSB5ZWFycyBhZ28sIHdlIGdhdmUgdXAgYXR0ZW1wdGluZyB0byBhdm9pZCB3YXJuaW5ncyBvbiBldmVyeSBjb21waWxlcgotICAgIGluIHRoZSB1bml2ZXJzZS4gSXQganVzdCBnb3QgdG8gYmUgYSB3YXN0ZSBvZiB0aW1lLCBhbmQgc29tZSBjb21waWxlcnMKLSAgICB3ZXJlIGRvd25yaWdodCBzaWxseS4gU28gbm93LCB3ZSBzaW1wbHkgbWFrZSBzdXJlIHRoYXQgdGhlIGNvZGUgYWx3YXlzCi0gICAgd29ya3MuCisgICAgaW4gdGhlIHVuaXZlcnNlLiAgSXQganVzdCBnb3QgdG8gYmUgYSB3YXN0ZSBvZiB0aW1lLCBhbmQgc29tZSBjb21waWxlcnMKKyAgICB3ZXJlIGRvd25yaWdodCBzaWxseSBhcyB3ZWxsIGFzIGNvbnRyYWRpY3RlZCBlYWNoIG90aGVyLiAgU28gbm93LCB3ZSBzaW1wbHkKKyAgICBtYWtlIHN1cmUgdGhhdCB0aGUgY29kZSBhbHdheXMgd29ya3MuCiAKIDM2LiBWYWxncmluZCAob3Igc29tZSBzaW1pbGFyIG1lbW9yeSBhY2Nlc3MgY2hlY2tlcikgc2F5cyB0aGF0IGRlZmxhdGUgaXMKICAgICBwZXJmb3JtaW5nIGEgY29uZGl0aW9uYWwganVtcCB0aGF0IGRlcGVuZHMgb24gYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4KICAgICBJc24ndCB0aGF0IGEgYnVnPwogCi0gICAgTm8uICBUaGF0IGlzIGludGVudGlvbmFsIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhbmQgdGhlIG91dHB1dCBvZgotICAgIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkLiAgVGhpcyBvbmx5IHN0YXJ0ZWQgc2hvd2luZyB1cCByZWNlbnRseSBzaW5jZQotICAgIHpsaWIgMS4yLnggdXNlcyBtYWxsb2MoKSBieSBkZWZhdWx0IGZvciBhbGxvY2F0aW9ucywgd2hlcmVhcyBlYXJsaWVyCi0gICAgdmVyc2lvbnMgdXNlZCBjYWxsb2MoKSwgd2hpY2ggemVyb3Mgb3V0IHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgorICAgIE5vLiAgVGhhdCBpcyBpbnRlbnRpb25hbCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYW5kIHRoZSBvdXRwdXQgb2YgZGVmbGF0ZQorICAgIGlzIG5vdCBhZmZlY3RlZC4gIFRoaXMgb25seSBzdGFydGVkIHNob3dpbmcgdXAgcmVjZW50bHkgc2luY2UgemxpYiAxLjIueAorICAgIHVzZXMgbWFsbG9jKCkgYnkgZGVmYXVsdCBmb3IgYWxsb2NhdGlvbnMsIHdoZXJlYXMgZWFybGllciB2ZXJzaW9ucyB1c2VkCisgICAgY2FsbG9jKCksIHdoaWNoIHplcm9zIG91dCB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gIEV2ZW4gdGhvdWdoIHRoZSBjb2RlIHdhcworICAgIGNvcnJlY3QsIHZlcnNpb25zIDEuMi40IGFuZCBsYXRlciB3YXMgY2hhbmdlZCB0byBub3Qgc3RpbXVsYXRlIHRoZXNlCisgICAgY2hlY2tlcnMuCiAKIDM3LiBXaWxsIHpsaWIgcmVhZCB0aGUgKGluc2VydCBhbnkgYW5jaWVudCBvciBhcmNhbmUgZm9ybWF0IGhlcmUpIGNvbXByZXNzZWQKICAgICBkYXRhIGZvcm1hdD8KQEAgLTMwNSwyMCArMzEzLDIxIEBACiAKIDM4LiBIb3cgY2FuIEkgZW5jcnlwdC9kZWNyeXB0IHppcCBmaWxlcyB3aXRoIHpsaWI/CiAKLSAgICB6bGliIGRvZXNuJ3Qgc3VwcG9ydCBlbmNyeXB0aW9uLiBUaGUgb3JpZ2luYWwgUEtaSVAgZW5jcnlwdGlvbiBpcyB2ZXJ5IHdlYWsKLSAgICBhbmQgY2FuIGJlIGJyb2tlbiB3aXRoIGZyZWVseSBhdmFpbGFibGUgcHJvZ3JhbXMuIFRvIGdldCBzdHJvbmcgZW5jcnlwdGlvbiwKLSAgICB1c2UgR251UEcsIGh0dHA6Ly93d3cuZ251cGcub3JnLyAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgemxpYiBjb21wcmVzc2lvbi4KLSAgICBGb3IgUEtaSVAgY29tcGF0aWJsZSAiZW5jcnlwdGlvbiIsIGxvb2sgYXQgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvCisgICAgemxpYiBkb2Vzbid0IHN1cHBvcnQgZW5jcnlwdGlvbi4gIFRoZSBvcmlnaW5hbCBQS1pJUCBlbmNyeXB0aW9uIGlzIHZlcnkKKyAgICB3ZWFrIGFuZCBjYW4gYmUgYnJva2VuIHdpdGggZnJlZWx5IGF2YWlsYWJsZSBwcm9ncmFtcy4gIFRvIGdldCBzdHJvbmcKKyAgICBlbmNyeXB0aW9uLCB1c2UgR251UEcsIGh0dHA6Ly93d3cuZ251cGcub3JnLyAsIHdoaWNoIGFscmVhZHkgaW5jbHVkZXMgemxpYgorICAgIGNvbXByZXNzaW9uLiAgRm9yIFBLWklQIGNvbXBhdGlibGUgImVuY3J5cHRpb24iLCBsb29rIGF0CisgICAgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvCiAKIDM5LiBXaGF0J3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgImd6aXAiIGFuZCAiZGVmbGF0ZSIgSFRUUCAxLjEgZW5jb2RpbmdzPwogCi0gICAgImd6aXAiIGlzIHRoZSBnemlwIGZvcm1hdCwgYW5kICJkZWZsYXRlIiBpcyB0aGUgemxpYiBmb3JtYXQuIFRoZXkgc2hvdWxkCi0gICAgcHJvYmFibHkgaGF2ZSBjYWxsZWQgdGhlIHNlY29uZCBvbmUgInpsaWIiIGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW9uCi0gICAgd2l0aCB0aGUgcmF3IGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdC4gV2hpbGUgdGhlIEhUVFAgMS4xIFJGQyAyNjE2CisgICAgImd6aXAiIGlzIHRoZSBnemlwIGZvcm1hdCwgYW5kICJkZWZsYXRlIiBpcyB0aGUgemxpYiBmb3JtYXQuICBUaGV5IHNob3VsZAorICAgIHByb2JhYmx5IGhhdmUgY2FsbGVkIHRoZSBzZWNvbmQgb25lICJ6bGliIiBpbnN0ZWFkIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoCisgICAgdGhlIHJhdyBkZWZsYXRlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQuICBXaGlsZSB0aGUgSFRUUCAxLjEgUkZDIDI2MTYKICAgICBjb3JyZWN0bHkgcG9pbnRzIHRvIHRoZSB6bGliIHNwZWNpZmljYXRpb24gaW4gUkZDIDE5NTAgZm9yIHRoZSAiZGVmbGF0ZSIKICAgICB0cmFuc2ZlciBlbmNvZGluZywgdGhlcmUgaGF2ZSBiZWVuIHJlcG9ydHMgb2Ygc2VydmVycyBhbmQgYnJvd3NlcnMgdGhhdAogICAgIGluY29ycmVjdGx5IHByb2R1Y2Ugb3IgZXhwZWN0IHJhdyBkZWZsYXRlIGRhdGEgcGVyIHRoZSBkZWZsYXRlCi0gICAgc3BlY2ZpY2lhdGlvbiBpbiBSRkMgMTk1MSwgbW9zdCBub3RhYmx5IE1pY3Jvc29mdC4gU28gZXZlbiB0aG91Z2ggdGhlCisgICAgc3BlY2lmaWNhdGlvbiBpbiBSRkMgMTk1MSwgbW9zdCBub3RhYmx5IE1pY3Jvc29mdC4gIFNvIGV2ZW4gdGhvdWdoIHRoZQogICAgICJkZWZsYXRlIiB0cmFuc2ZlciBlbmNvZGluZyB1c2luZyB0aGUgemxpYiBmb3JtYXQgd291bGQgYmUgdGhlIG1vcmUKICAgICBlZmZpY2llbnQgYXBwcm9hY2ggKGFuZCBpbiBmYWN0IGV4YWN0bHkgd2hhdCB0aGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkCiAgICAgZm9yKSwgdXNpbmcgdGhlICJnemlwIiB0cmFuc2ZlciBlbmNvZGluZyBpcyBwcm9iYWJseSBtb3JlIHJlbGlhYmxlIGR1ZSB0bwpAQCAtMzI4LDEyICszMzcsMzIgQEAKIAogNDAuIERvZXMgemxpYiBzdXBwb3J0IHRoZSBuZXcgIkRlZmxhdGU2NCIgZm9ybWF0IGludHJvZHVjZWQgYnkgUEtXYXJlPwogCi0gICAgTm8uIFBLV2FyZSBoYXMgYXBwYXJlbnRseSBkZWNpZGVkIHRvIGtlZXAgdGhhdCBmb3JtYXQgcHJvcHJpZXRhcnksIHNpbmNlCi0gICAgdGhleSBoYXZlIG5vdCBkb2N1bWVudGVkIGl0IGFzIHRoZXkgaGF2ZSBwcmV2aW91cyBjb21wcmVzc2lvbiBmb3JtYXRzLgotICAgIEluIGFueSBjYXNlLCB0aGUgY29tcHJlc3Npb24gaW1wcm92ZW1lbnRzIGFyZSBzbyBtb2Rlc3QgY29tcGFyZWQgdG8gb3RoZXIKLSAgICBtb3JlIG1vZGVybiBhcHByb2FjaGVzLCB0aGF0IGl0J3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQgdG8gaW1wbGVtZW50LgorICAgIE5vLiAgUEtXYXJlIGhhcyBhcHBhcmVudGx5IGRlY2lkZWQgdG8ga2VlcCB0aGF0IGZvcm1hdCBwcm9wcmlldGFyeSwgc2luY2UKKyAgICB0aGV5IGhhdmUgbm90IGRvY3VtZW50ZWQgaXQgYXMgdGhleSBoYXZlIHByZXZpb3VzIGNvbXByZXNzaW9uIGZvcm1hdHMuICBJbgorICAgIGFueSBjYXNlLCB0aGUgY29tcHJlc3Npb24gaW1wcm92ZW1lbnRzIGFyZSBzbyBtb2Rlc3QgY29tcGFyZWQgdG8gb3RoZXIgbW9yZQorICAgIG1vZGVybiBhcHByb2FjaGVzLCB0aGF0IGl0J3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQgdG8gaW1wbGVtZW50LgogCi00MS4gQ2FuIHlvdSBwbGVhc2Ugc2lnbiB0aGVzZSBsZW5ndGh5IGxlZ2FsIGRvY3VtZW50cyBhbmQgZmF4IHRoZW0gYmFjayB0byB1cworNDEuIEknbSBoYXZpbmcgYSBwcm9ibGVtIHdpdGggdGhlIHppcCBmdW5jdGlvbnMgaW4gemxpYiwgY2FuIHlvdSBoZWxwPworCisgICAgVGhlcmUgYXJlIG5vIHppcCBmdW5jdGlvbnMgaW4gemxpYi4gIFlvdSBhcmUgcHJvYmFibHkgdXNpbmcgbWluaXppcCBieQorICAgIEdpbGVzIFZvbGxhbnQsIHdoaWNoIGlzIGZvdW5kIGluIHRoZSBjb250cmliIGRpcmVjdG9yeSBvZiB6bGliLiAgSXQgaXMgbm90CisgICAgcGFydCBvZiB6bGliLiAgSW4gZmFjdCBub25lIG9mIHRoZSBzdHVmZiBpbiBjb250cmliIGlzIHBhcnQgb2YgemxpYi4gIFRoZQorICAgIGZpbGVzIGluIHRoZXJlIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB6bGliIGF1dGhvcnMuICBZb3UgbmVlZCB0byBjb250YWN0CisgICAgdGhlIGF1dGhvcnMgb2YgdGhlIHJlc3BlY3RpdmUgY29udHJpYnV0aW9uIGZvciBoZWxwLgorCis0Mi4gVGhlIG1hdGNoLmFzbSBjb2RlIGluIGNvbnRyaWIgaXMgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICAgIFNpbmNlIGl0J3MgcGFydCBvZiB6bGliLCBkb2Vzbid0IHRoYXQgbWVhbiB0aGF0IGFsbCBvZiB6bGliIGZhbGxzIHVuZGVyIHRoZQorICAgIEdOVSBHUEw/CisKKyAgICBOby4gIFRoZSBmaWxlcyBpbiBjb250cmliIGFyZSBub3QgcGFydCBvZiB6bGliLiAgVGhleSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5CisgICAgb3RoZXIgYXV0aG9ycyBhbmQgYXJlIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgdG8gdGhlIHVzZXIgd2l0aGluIHRoZSB6bGliCisgICAgZGlzdHJpYnV0aW9uLiAgRWFjaCBpdGVtIGluIGNvbnRyaWIgaGFzIGl0cyBvd24gbGljZW5zZS4KKworNDMuIElzIHpsaWIgc3ViamVjdCB0byBleHBvcnQgY29udHJvbHM/ICBXaGF0IGlzIGl0cyBFQ0NOPworCisgICAgemxpYiBpcyBub3Qgc3ViamVjdCB0byBleHBvcnQgY29udHJvbHMsIGFuZCBzbyBpcyBjbGFzc2lmaWVkIGFzIEVBUjk5LgorCis0NC4gQ2FuIHlvdSBwbGVhc2Ugc2lnbiB0aGVzZSBsZW5ndGh5IGxlZ2FsIGRvY3VtZW50cyBhbmQgZmF4IHRoZW0gYmFjayB0byB1cwogICAgIHNvIHRoYXQgd2UgY2FuIHVzZSB5b3VyIHNvZnR3YXJlIGluIG91ciBwcm9kdWN0PwogCiAgICAgTm8uIEdvIGF3YXkuIFNob28uCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvSU5ERVggYi9Nb2R1bGVzL3psaWIvSU5ERVgKaW5kZXggMDU4N2U1OS4uMmJhMDY0MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL0lOREVYCisrKyBiL01vZHVsZXMvemxpYi9JTkRFWApAQCAtMSwyMyArMSwzNyBAQAorQ01ha2VMaXN0cy50eHQgIGNtYWtlIGJ1aWxkIGZpbGUKIENoYW5nZUxvZyAgICAgICBoaXN0b3J5IG9mIGNoYW5nZXMKIEZBUSAgICAgICAgICAgICBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBhYm91dCB6bGliCiBJTkRFWCAgICAgICAgICAgdGhpcyBmaWxlCi1NYWtlZmlsZSAgICAgICAgbWFrZWZpbGUgZm9yIFVuaXggKGdlbmVyYXRlZCBieSBjb25maWd1cmUpCi1NYWtlZmlsZS5pbiAgICAgbWFrZWZpbGUgZm9yIFVuaXggKHRlbXBsYXRlIGZvciBjb25maWd1cmUpCitNYWtlZmlsZSAgICAgICAgZHVtbXkgTWFrZWZpbGUgdGhhdCB0ZWxscyB5b3UgdG8gLi9jb25maWd1cmUKK01ha2VmaWxlLmluICAgICB0ZW1wbGF0ZSBmb3IgVW5peCBNYWtlZmlsZQogUkVBRE1FICAgICAgICAgIGd1ZXNzIHdoYXQKLWFsZ29yaXRobS50eHQgICBkZXNjcmlwdGlvbiBvZiB0aGUgKGRlKWNvbXByZXNzaW9uIGFsZ29yaXRobQogY29uZmlndXJlICAgICAgIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIFVuaXgKLXpjb25mLmluLmggICAgICB0ZW1wbGF0ZSBmb3IgemNvbmYuaCAodXNlZCBieSBjb25maWd1cmUpCittYWtlX3Ztcy5jb20gICAgbWFrZWZpbGUgZm9yIFZNUwordGVzdC9leGFtcGxlLmMgIHpsaWIgdXNhZ2VzIGV4YW1wbGVzIGZvciBidWlsZCB0ZXN0aW5nCit0ZXN0L21pbmlnemlwLmMgbWluaW1hbCBnemlwLWxpa2UgZnVuY3Rpb25hbGl0eSBmb3IgYnVpbGQgdGVzdGluZwordGVzdC9pbmZjb3Zlci5jIGluZiouYyBjb2RlIGNvdmVyYWdlIGZvciBidWlsZCBjb3ZlcmFnZSB0ZXN0aW5nCit0cmVlYnVpbGQueG1sICAgWE1MIGRlc2NyaXB0aW9uIG9mIHNvdXJjZSBmaWxlIGRlcGVuZGVuY2llcworemNvbmYuaC5jbWFrZWluIHpjb25mLmggdGVtcGxhdGUgZm9yIGNtYWtlCit6Y29uZi5oLmluICAgICAgemNvbmYuaCB0ZW1wbGF0ZSBmb3IgY29uZmlndXJlCit6bGliLjMgICAgICAgICAgTWFuIHBhZ2UgZm9yIHpsaWIKK3psaWIuMy5wZGYgICAgICBNYW4gcGFnZSBpbiBQREYgZm9ybWF0Cit6bGliLm1hcCAgICAgICAgTGludXggc3ltYm9sIGluZm9ybWF0aW9uCit6bGliLnBjLmluICAgICAgVGVtcGxhdGUgZm9yIHBrZy1jb25maWcgZGVzY3JpcHRvcgoremxpYi5wYy5jbWFrZWluIHpsaWIucGMgdGVtcGxhdGUgZm9yIGNtYWtlCit6bGliMmFuc2kgICAgICAgcGVybCBzY3JpcHQgdG8gY29udmVydCBzb3VyY2UgZmlsZXMgZm9yIEMrKyBjb21waWxhdGlvbgogCiBhbWlnYS8gICAgICAgICAgbWFrZWZpbGVzIGZvciBBbWlnYSBTQVMgQwotYXM0MDAvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgSUJNIEFTLzQwMAorYXM0MDAvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgQVMvNDAwCitkb2MvICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgZm9ybWF0cyBhbmQgYWxnb3JpdGhtcwogbXNkb3MvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgTVNET1MKK25pbnRlbmRvZHMvICAgICBtYWtlZmlsZSBmb3IgTmludGVuZG8gRFMKIG9sZC8gICAgICAgICAgICBtYWtlZmlsZXMgZm9yIHZhcmlvdXMgYXJjaGl0ZWN0dXJlcyBhbmQgemxpYiBkb2N1bWVudGF0aW9uCiAgICAgICAgICAgICAgICAgZmlsZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiB1cGRhdGVkIGZvciB6bGliIDEuMi54Ci1wcm9qZWN0cy8gICAgICAgcHJvamVjdHMgZm9yIHZhcmlvdXMgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudHMKIHFueC8gICAgICAgICAgICBtYWtlZmlsZXMgZm9yIFFOWAord2F0Y29tLyAgICAgICAgIG1ha2VmaWxlcyBmb3IgT3BlbldhdGNvbQogd2luMzIvICAgICAgICAgIG1ha2VmaWxlcyBmb3IgV2luZG93cwogCi0gICAgICAgICAgICAgICAgemxpYiBwdWJsaWMgaGVhZGVyIGZpbGVzIChtdXN0IGJlIGtlcHQpOgorICAgICAgICAgICAgICAgIHpsaWIgcHVibGljIGhlYWRlciBmaWxlcyAocmVxdWlyZWQgZm9yIGxpYnJhcnkgdXNlKToKIHpjb25mLmgKIHpsaWIuaAogCkBAIC0yOCw3ICs0MiwxMSBAQAogY3JjMzIuaAogZGVmbGF0ZS5jCiBkZWZsYXRlLmgKLWd6aW8uYworZ3pjbG9zZS5jCitnemd1dHMuaAorZ3psaWIuYworZ3pyZWFkLmMKK2d6d3JpdGUuYwogaW5mYmFjay5jCiBpbmZmYXN0LmMKIGluZmZhc3QuaApAQCAtNDMsOSArNjEsOCBAQAogenV0aWwuYwogenV0aWwuaAogCi0gICAgICAgICAgICAgICAgc291cmNlIGZpbGVzIGZvciBzYW1wbGUgcHJvZ3JhbXM6Ci1leGFtcGxlLmMKLW1pbmlnemlwLmMKKyAgICAgICAgICAgICAgICBzb3VyY2UgZmlsZXMgZm9yIHNhbXBsZSBwcm9ncmFtcworU2VlIGV4YW1wbGVzL1JFQURNRS5leGFtcGxlcwogCi0gICAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQgY29udHJpYnV0aW9uIGJ5IHRoaXJkIHBhcnRpZXMKKyAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZCBjb250cmlidXRpb25zIGJ5IHRoaXJkIHBhcnRpZXMKIFNlZSBjb250cmliL1JFQURNRS5jb250cmliCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvTWFrZWZpbGUgYi9Nb2R1bGVzL3psaWIvTWFrZWZpbGUKaW5kZXggMmZkNmU0NS4uNmJiYTg2YyAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL01ha2VmaWxlCisrKyBiL01vZHVsZXMvemxpYi9NYWtlZmlsZQpAQCAtMSwxNTQgKzEsNSBAQAotIyBNYWtlZmlsZSBmb3IgemxpYgotIyBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgotIyBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCithbGw6CisJLUBlY2hvICJQbGVhc2UgdXNlIC4vY29uZmlndXJlIGZpcnN0LiAgVGhhbmsgeW91LiIKIAotIyBUbyBjb21waWxlIGFuZCB0ZXN0LCB0eXBlOgotIyAgICAuL2NvbmZpZ3VyZTsgbWFrZSB0ZXN0Ci0jIFRoZSBjYWxsIG9mIGNvbmZpZ3VyZSBpcyBvcHRpb25hbCBpZiB5b3UgZG9uJ3QgaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cwotIyBJZiB5b3Ugd2lzaCB0byBidWlsZCB6bGliIGFzIGEgc2hhcmVkIGxpYnJhcnksIHVzZTogLi9jb25maWd1cmUgLXMKLQotIyBUbyB1c2UgdGhlIGFzbSBjb2RlLCB0eXBlOgotIyAgICBjcCBjb250cmliL2FzbT84Ni9tYXRjaC5TIC4vbWF0Y2guUwotIyAgICBtYWtlIExPQz0tREFTTVYgT0JKQT1tYXRjaC5vCi0KLSMgVG8gaW5zdGFsbCAvdXNyL2xvY2FsL2xpYi9saWJ6LiogYW5kIC91c3IvbG9jYWwvaW5jbHVkZS96bGliLmgsIHR5cGU6Ci0jICAgIG1ha2UgaW5zdGFsbAotIyBUbyBpbnN0YWxsIGluICRIT01FIGluc3RlYWQgb2YgL3Vzci9sb2NhbCwgdXNlOgotIyAgICBtYWtlIGluc3RhbGwgcHJlZml4PSRIT01FCi0KLUNDPWNjCi0KLUNGTEFHUz0tTwotI0NGTEFHUz0tTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NwotI0NGTEFHUz0tZyAtRERFQlVHCi0jQ0ZMQUdTPS1PMyAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1XY29udmVyc2lvbiBcCi0jICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCi0KLUxERkxBR1M9bGliei5hCi1MRFNIQVJFRD0kKENDKQotQ1BQPSQoQ0MpIC1FCi0KLUxJQlM9bGliei5hCi1TSEFSRURMSUI9bGliei5zbwotU0hBUkVETElCVj1saWJ6LnNvLjEuMi4zCi1TSEFSRURMSUJNPWxpYnouc28uMQotCi1BUj1hciByYwotUkFOTElCPXJhbmxpYgotVEFSPXRhcgotU0hFTEw9L2Jpbi9zaAotRVhFPQotCi1wcmVmaXggPSAvdXNyL2xvY2FsCi1leGVjX3ByZWZpeCA9ICR7cHJlZml4fQotbGliZGlyID0gJHtleGVjX3ByZWZpeH0vbGliCi1pbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKLW1hbmRpciA9ICR7cHJlZml4fS9zaGFyZS9tYW4KLW1hbjNkaXIgPSAke21hbmRpcn0vbWFuMwotCi1PQkpTID0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemlvLm8gdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIFwKLSAgICAgICB6dXRpbC5vIGluZmxhdGUubyBpbmZiYWNrLm8gaW5mdHJlZXMubyBpbmZmYXN0Lm8KLQotT0JKQSA9Ci0jIHRvIHVzZSB0aGUgYXNtIGNvZGU6IG1ha2UgT0JKQT1tYXRjaC5vCi0KLVRFU1RfT0JKUyA9IGV4YW1wbGUubyBtaW5pZ3ppcC5vCi0KLWFsbDogZXhhbXBsZSQoRVhFKSBtaW5pZ3ppcCQoRVhFKQotCi1jaGVjazogdGVzdAotdGVzdDogYWxsCi0JQExEX0xJQlJBUllfUEFUSD0uOiQoTERfTElCUkFSWV9QQVRIKSA7IGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg7IFwKLQllY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcCB8IC4vbWluaWd6aXAgLWQgfHwgXAotCSAgZWNobyAnCQkqKiogbWluaWd6aXAgdGVzdCBGQUlMRUQgKioqJyA7IFwKLQlpZiAuL2V4YW1wbGU7IHRoZW4gXAotCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IE9LICoqKic7IFwKLQllbHNlIFwKLQkgIGVjaG8gJwkJKioqIHpsaWIgdGVzdCBGQUlMRUQgKioqJzsgXAotCWZpCi0KLWxpYnouYTogJChPQkpTKSAkKE9CSkEpCi0JJChBUikgJEAgJChPQkpTKSAkKE9CSkEpCi0JLUAgKCQoUkFOTElCKSAkQCB8fCB0cnVlKSA+L2Rldi9udWxsIDI+JjEKLQotbWF0Y2gubzogbWF0Y2guUwotCSQoQ1BQKSBtYXRjaC5TID4gX21hdGNoLnMKLQkkKENDKSAtYyBfbWF0Y2gucwotCW12IF9tYXRjaC5vIG1hdGNoLm8KLQlybSAtZiBfbWF0Y2gucwotCi0kKFNIQVJFRExJQlYpOiAkKE9CSlMpCi0JJChMRFNIQVJFRCkgLW8gJEAgJChPQkpTKQotCXJtIC1mICQoU0hBUkVETElCKSAkKFNIQVJFRExJQk0pCi0JbG4gLXMgJEAgJChTSEFSRURMSUIpCi0JbG4gLXMgJEAgJChTSEFSRURMSUJNKQotCi1leGFtcGxlJChFWEUpOiBleGFtcGxlLm8gJChMSUJTKQotCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChMREZMQUdTKQotCi1taW5pZ3ppcCQoRVhFKTogbWluaWd6aXAubyAkKExJQlMpCi0JJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwLm8gJChMREZMQUdTKQotCi1pbnN0YWxsOiAkKExJQlMpCi0JLUBpZiBbICEgLWQgJChleGVjX3ByZWZpeCkgXTsgdGhlbiBta2RpciAtcCAkKGV4ZWNfcHJlZml4KTsgZmkKLQktQGlmIFsgISAtZCAkKGluY2x1ZGVkaXIpICBdOyB0aGVuIG1rZGlyIC1wICQoaW5jbHVkZWRpcik7IGZpCi0JLUBpZiBbICEgLWQgJChsaWJkaXIpICAgICAgXTsgdGhlbiBta2RpciAtcCAkKGxpYmRpcik7IGZpCi0JLUBpZiBbICEgLWQgJChtYW4zZGlyKSAgICAgXTsgdGhlbiBta2RpciAtcCAkKG1hbjNkaXIpOyBmaQotCWNwIHpsaWIuaCB6Y29uZi5oICQoaW5jbHVkZWRpcikKLQljaG1vZCA2NDQgJChpbmNsdWRlZGlyKS96bGliLmggJChpbmNsdWRlZGlyKS96Y29uZi5oCi0JY3AgJChMSUJTKSAkKGxpYmRpcikKLQljZCAkKGxpYmRpcik7IGNobW9kIDc1NSAkKExJQlMpCi0JLUAoY2QgJChsaWJkaXIpOyAkKFJBTkxJQikgbGliei5hIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQotCWNkICQobGliZGlyKTsgaWYgdGVzdCAtZiAkKFNIQVJFRExJQlYpOyB0aGVuIFwKLQkgIHJtIC1mICQoU0hBUkVETElCKSAkKFNIQVJFRExJQk0pOyBcCi0JICBsbiAtcyAkKFNIQVJFRExJQlYpICQoU0hBUkVETElCKTsgXAotCSAgbG4gLXMgJChTSEFSRURMSUJWKSAkKFNIQVJFRExJQk0pOyBcCi0JICAobGRjb25maWcgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAotCWZpCi0JY3AgemxpYi4zICQobWFuM2RpcikKLQljaG1vZCA2NDQgJChtYW4zZGlyKS96bGliLjMKLSMgVGhlIHJhbmxpYiBpbiBpbnN0YWxsIGlzIG5lZWRlZCBvbiBOZVhUU1RFUCB3aGljaCBjaGVja3MgZmlsZSB0aW1lcwotIyBsZGNvbmZpZyBpcyBmb3IgTGludXgKLQotdW5pbnN0YWxsOgotCWNkICQoaW5jbHVkZWRpcik7IFwKLQljZCAkKGxpYmRpcik7IHJtIC1mIGxpYnouYTsgXAotCWlmIHRlc3QgLWYgJChTSEFSRURMSUJWKTsgdGhlbiBcCi0JICBybSAtZiAkKFNIQVJFRExJQlYpICQoU0hBUkVETElCKSAkKFNIQVJFRExJQk0pOyBcCi0JZmkKLQljZCAkKG1hbjNkaXIpOyBybSAtZiB6bGliLjMKLQotbW9zdGx5Y2xlYW46IGNsZWFuCi1jbGVhbjoKLQlybSAtZiAqLm8gKn4gZXhhbXBsZSQoRVhFKSBtaW5pZ3ppcCQoRVhFKSBcCi0JICAgbGliei4qIGZvby5neiBzb19sb2NhdGlvbnMgXAotCSAgIF9tYXRjaC5zIG1ha2V0cmVlIGNvbnRyaWIvaW5mYmFjazkvKi5vCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotZGlzdGNsZWFuOiBjbGVhbgotCWNwIC1wIE1ha2VmaWxlLmluIE1ha2VmaWxlCi0JY3AgLXAgemNvbmYuaW4uaCB6Y29uZi5oCi0Jcm0gLWYgLkRTX1N0b3JlCi0KLXRhZ3M6Ci0JZXRhZ3MgKi5bY2hdCi0KLWRlcGVuZDoKLQltYWtlZGVwZW5kIC0tICQoQ0ZMQUdTKSAtLSAqLltjaF0KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBtYWtlIGRlcGVuZCBkZXBlbmRzIG9uIGl0LgotCi1hZGxlcjMyLm86IHpsaWIuaCB6Y29uZi5oCi1jb21wcmVzcy5vOiB6bGliLmggemNvbmYuaAotY3JjMzIubzogY3JjMzIuaCB6bGliLmggemNvbmYuaAotZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotZXhhbXBsZS5vOiB6bGliLmggemNvbmYuaAotZ3ppby5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1pbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZsYXRlLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZiYWNrLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLW1pbmlnemlwLm86IHpsaWIuaCB6Y29uZi5oCi10cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCi11bmNvbXByLm86IHpsaWIuaCB6Y29uZi5oCi16dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitkaXN0Y2xlYW46CisJbWFrZSAtZiBNYWtlZmlsZS5pbiBkaXN0Y2xlYW4KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9NYWtlZmlsZS5pbiBiL01vZHVsZXMvemxpYi9NYWtlZmlsZS5pbgppbmRleCAyZmQ2ZTQ1Li5jNjFhYTMwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWIvTWFrZWZpbGUuaW4KKysrIGIvTW9kdWxlcy96bGliL01ha2VmaWxlLmluCkBAIC0xLDExICsxLDExIEBACiAjIE1ha2VmaWxlIGZvciB6bGliCi0jIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisjIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHksIE1hcmsgQWRsZXIKICMgRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogCiAjIFRvIGNvbXBpbGUgYW5kIHRlc3QsIHR5cGU6CiAjICAgIC4vY29uZmlndXJlOyBtYWtlIHRlc3QKLSMgVGhlIGNhbGwgb2YgY29uZmlndXJlIGlzIG9wdGlvbmFsIGlmIHlvdSBkb24ndCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzCi0jIElmIHlvdSB3aXNoIHRvIGJ1aWxkIHpsaWIgYXMgYSBzaGFyZWQgbGlicmFyeSwgdXNlOiAuL2NvbmZpZ3VyZSAtcworIyBOb3JtYWxseSBjb25maWd1cmUgYnVpbGRzIGJvdGggYSBzdGF0aWMgYW5kIGEgc2hhcmVkIGxpYnJhcnkuCisjIElmIHlvdSB3YW50IHRvIGJ1aWxkIGp1c3QgYSBzdGF0aWMgbGlicmFyeSwgdXNlOiAuL2NvbmZpZ3VyZSAtLXN0YXRpYwogCiAjIFRvIHVzZSB0aGUgYXNtIGNvZGUsIHR5cGU6CiAjICAgIGNwIGNvbnRyaWIvYXNtPzg2L21hdGNoLlMgLi9tYXRjaC5TCkBAIC0yNCwxNyArMjQsMjMgQEAKICNDRkxBR1M9LU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKICMgICAgICAgICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMKIAotTERGTEFHUz1saWJ6LmEKK1NGTEFHUz0tTworTERGTEFHUz0KK1RFU1RfTERGTEFHUz0tTC4gbGliei5hCiBMRFNIQVJFRD0kKENDKQogQ1BQPSQoQ0MpIC1FCiAKLUxJQlM9bGliei5hCitTVEFUSUNMSUI9bGliei5hCiBTSEFSRURMSUI9bGliei5zbwotU0hBUkVETElCVj1saWJ6LnNvLjEuMi4zCitTSEFSRURMSUJWPWxpYnouc28uMS4yLjgKIFNIQVJFRExJQk09bGliei5zby4xCitMSUJTPSQoU1RBVElDTElCKSAkKFNIQVJFRExJQlYpCiAKLUFSPWFyIHJjCitBUj1hcgorQVJGTEFHUz1yYwogUkFOTElCPXJhbmxpYgorTERDT05GSUc9bGRjb25maWcKK0xEU0hBUkVETElCQz0tbGMKIFRBUj10YXIKIFNIRUxMPS9iaW4vc2gKIEVYRT0KQEAgLTQyLDMzICs0OCw4NCBAQAogcHJlZml4ID0gL3Vzci9sb2NhbAogZXhlY19wcmVmaXggPSAke3ByZWZpeH0KIGxpYmRpciA9ICR7ZXhlY19wcmVmaXh9L2xpYgorc2hhcmVkbGliZGlyID0gJHtsaWJkaXJ9CiBpbmNsdWRlZGlyID0gJHtwcmVmaXh9L2luY2x1ZGUKIG1hbmRpciA9ICR7cHJlZml4fS9zaGFyZS9tYW4KIG1hbjNkaXIgPSAke21hbmRpcn0vbWFuMworcGtnY29uZmlnZGlyID0gJHtsaWJkaXJ9L3BrZ2NvbmZpZwogCi1PQkpTID0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemlvLm8gdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIFwKLSAgICAgICB6dXRpbC5vIGluZmxhdGUubyBpbmZiYWNrLm8gaW5mdHJlZXMubyBpbmZmYXN0Lm8KK09CSlogPSBhZGxlcjMyLm8gY3JjMzIubyBkZWZsYXRlLm8gaW5mYmFjay5vIGluZmZhc3QubyBpbmZsYXRlLm8gaW5mdHJlZXMubyB0cmVlcy5vIHp1dGlsLm8KK09CSkcgPSBjb21wcmVzcy5vIHVuY29tcHIubyBnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBnendyaXRlLm8KK09CSkMgPSAkKE9CSlopICQoT0JKRykKIAorUElDX09CSlogPSBhZGxlcjMyLmxvIGNyYzMyLmxvIGRlZmxhdGUubG8gaW5mYmFjay5sbyBpbmZmYXN0LmxvIGluZmxhdGUubG8gaW5mdHJlZXMubG8gdHJlZXMubG8genV0aWwubG8KK1BJQ19PQkpHID0gY29tcHJlc3MubG8gdW5jb21wci5sbyBnemNsb3NlLmxvIGd6bGliLmxvIGd6cmVhZC5sbyBnendyaXRlLmxvCitQSUNfT0JKQyA9ICQoUElDX09CSlopICQoUElDX09CSkcpCisKKyMgdG8gdXNlIHRoZSBhc20gY29kZTogbWFrZSBPQkpBPW1hdGNoLm8sIFBJQ19PQkpBPW1hdGNoLmxvCiBPQkpBID0KLSMgdG8gdXNlIHRoZSBhc20gY29kZTogbWFrZSBPQkpBPW1hdGNoLm8KK1BJQ19PQkpBID0KIAotVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KK09CSlMgPSAkKE9CSkMpICQoT0JKQSkKIAotYWxsOiBleGFtcGxlJChFWEUpIG1pbmlnemlwJChFWEUpCitQSUNfT0JKUyA9ICQoUElDX09CSkMpICQoUElDX09CSkEpCisKK2FsbDogc3RhdGljIHNoYXJlZAorCitzdGF0aWM6IGV4YW1wbGUkKEVYRSkgbWluaWd6aXAkKEVYRSkKKworc2hhcmVkOiBleGFtcGxlc2gkKEVYRSkgbWluaWd6aXBzaCQoRVhFKQorCithbGw2NDogZXhhbXBsZTY0JChFWEUpIG1pbmlnemlwNjQkKEVYRSkKIAogY2hlY2s6IHRlc3QKLXRlc3Q6IGFsbAotCUBMRF9MSUJSQVJZX1BBVEg9LjokKExEX0xJQlJBUllfUEFUSCkgOyBleHBvcnQgTERfTElCUkFSWV9QQVRIOyBcCi0JZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXAgfCAuL21pbmlnemlwIC1kIHx8IFwKLQkgIGVjaG8gJwkJKioqIG1pbmlnemlwIHRlc3QgRkFJTEVEICoqKicgOyBcCi0JaWYgLi9leGFtcGxlOyB0aGVuIFwKKwordGVzdDogYWxsIHRlc3RzdGF0aWMgdGVzdHNoYXJlZAorCit0ZXN0c3RhdGljOiBzdGF0aWMKKwlAVE1QU1Q9dG1wc3RfJCQ7IFwKKwlpZiBlY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcCB8IC4vbWluaWd6aXAgLWQgJiYgLi9leGFtcGxlICQkVE1QU1QgOyB0aGVuIFwKIAkgIGVjaG8gJwkJKioqIHpsaWIgdGVzdCBPSyAqKionOyBcCiAJZWxzZSBcCi0JICBlY2hvICcJCSoqKiB6bGliIHRlc3QgRkFJTEVEICoqKic7IFwKLQlmaQorCSAgZWNobyAnCQkqKiogemxpYiB0ZXN0IEZBSUxFRCAqKionOyBmYWxzZTsgXAorCWZpOyBcCisJcm0gLWYgJCRUTVBTVAogCi1saWJ6LmE6ICQoT0JKUykgJChPQkpBKQotCSQoQVIpICRAICQoT0JKUykgJChPQkpBKQordGVzdHNoYXJlZDogc2hhcmVkCisJQExEX0xJQlJBUllfUEFUSD1gcHdkYDokKExEX0xJQlJBUllfUEFUSCkgOyBleHBvcnQgTERfTElCUkFSWV9QQVRIOyBcCisJTERfTElCUkFSWU4zMl9QQVRIPWBwd2RgOiQoTERfTElCUkFSWU4zMl9QQVRIKSA7IGV4cG9ydCBMRF9MSUJSQVJZTjMyX1BBVEg7IFwKKwlEWUxEX0xJQlJBUllfUEFUSD1gcHdkYDokKERZTERfTElCUkFSWV9QQVRIKSA7IGV4cG9ydCBEWUxEX0xJQlJBUllfUEFUSDsgXAorCVNITElCX1BBVEg9YHB3ZGA6JChTSExJQl9QQVRIKSA7IGV4cG9ydCBTSExJQl9QQVRIOyBcCisJVE1QU0g9dG1wc2hfJCQ7IFwKKwlpZiBlY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcHNoIHwgLi9taW5pZ3ppcHNoIC1kICYmIC4vZXhhbXBsZXNoICQkVE1QU0g7IHRoZW4gXAorCSAgZWNobyAnCQkqKiogemxpYiBzaGFyZWQgdGVzdCBPSyAqKionOyBcCisJZWxzZSBcCisJICBlY2hvICcJCSoqKiB6bGliIHNoYXJlZCB0ZXN0IEZBSUxFRCAqKionOyBmYWxzZTsgXAorCWZpOyBcCisJcm0gLWYgJCRUTVBTSAorCit0ZXN0NjQ6IGFsbDY0CisJQFRNUDY0PXRtcDY0XyQkOyBcCisJaWYgZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXA2NCB8IC4vbWluaWd6aXA2NCAtZCAmJiAuL2V4YW1wbGU2NCAkJFRNUDY0OyB0aGVuIFwKKwkgIGVjaG8gJwkJKioqIHpsaWIgNjQtYml0IHRlc3QgT0sgKioqJzsgXAorCWVsc2UgXAorCSAgZWNobyAnCQkqKiogemxpYiA2NC1iaXQgdGVzdCBGQUlMRUQgKioqJzsgZmFsc2U7IFwKKwlmaTsgXAorCXJtIC1mICQkVE1QNjQKKworaW5mY292ZXIubzogdGVzdC9pbmZjb3Zlci5jIHpsaWIuaCB6Y29uZi5oCisJJChDQykgJChDRkxBR1MpIC1JLiAtYyAtbyAkQCB0ZXN0L2luZmNvdmVyLmMKKworaW5mY292ZXI6IGluZmNvdmVyLm8gbGliei5hCisJJChDQykgJChDRkxBR1MpIC1vICRAIGluZmNvdmVyLm8gbGliei5hCisKK2NvdmVyOiBpbmZjb3ZlcgorCXJtIC1mICouZ2NkYQorCS4vaW5mY292ZXIKKwlnY292IGluZiouYworCitsaWJ6LmE6ICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKIAktQCAoJChSQU5MSUIpICRAIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQogCiBtYXRjaC5vOiBtYXRjaC5TCkBAIC03Nyw1OCArMTM0LDEzMCBAQAogCW12IF9tYXRjaC5vIG1hdGNoLm8KIAlybSAtZiBfbWF0Y2gucwogCi0kKFNIQVJFRExJQlYpOiAkKE9CSlMpCi0JJChMRFNIQVJFRCkgLW8gJEAgJChPQkpTKQorbWF0Y2gubG86IG1hdGNoLlMKKwkkKENQUCkgbWF0Y2guUyA+IF9tYXRjaC5zCisJJChDQykgLWMgLWZQSUMgX21hdGNoLnMKKwltdiBfbWF0Y2gubyBtYXRjaC5sbworCXJtIC1mIF9tYXRjaC5zCisKK2V4YW1wbGUubzogdGVzdC9leGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKwkkKENDKSAkKENGTEFHUykgLUkuIC1jIC1vICRAIHRlc3QvZXhhbXBsZS5jCisKK21pbmlnemlwLm86IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLWMgLW8gJEAgdGVzdC9taW5pZ3ppcC5jCisKK2V4YW1wbGU2NC5vOiB0ZXN0L2V4YW1wbGUuYyB6bGliLmggemNvbmYuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLURfRklMRV9PRkZTRVRfQklUUz02NCAtYyAtbyAkQCB0ZXN0L2V4YW1wbGUuYworCittaW5pZ3ppcDY0Lm86IHRlc3QvbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAorCSQoQ0MpICQoQ0ZMQUdTKSAtSS4gLURfRklMRV9PRkZTRVRfQklUUz02NCAtYyAtbyAkQCB0ZXN0L21pbmlnemlwLmMKKworLlNVRkZJWEVTOiAubG8KKworLmMubG86CisJLUBta2RpciBvYmpzIDI+L2Rldi9udWxsIHx8IHRlc3QgLWQgb2JqcworCSQoQ0MpICQoU0ZMQUdTKSAtRFBJQyAtYyAtbyBvYmpzLyQqLm8gJDwKKwktQG12IG9ianMvJCoubyAkQAorCitwbGFjZWJvICQoU0hBUkVETElCVik6ICQoUElDX09CSlMpIGxpYnouYQorCSQoTERTSEFSRUQpICQoU0ZMQUdTKSAtbyAkQCAkKFBJQ19PQkpTKSAkKExEU0hBUkVETElCQykgJChMREZMQUdTKQogCXJtIC1mICQoU0hBUkVETElCKSAkKFNIQVJFRExJQk0pCiAJbG4gLXMgJEAgJChTSEFSRURMSUIpCiAJbG4gLXMgJEAgJChTSEFSRURMSUJNKQorCS1Acm1kaXIgb2JqcwogCi1leGFtcGxlJChFWEUpOiBleGFtcGxlLm8gJChMSUJTKQotCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChMREZMQUdTKQorZXhhbXBsZSQoRVhFKTogZXhhbXBsZS5vICQoU1RBVElDTElCKQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChURVNUX0xERkxBR1MpCiAKLW1pbmlnemlwJChFWEUpOiBtaW5pZ3ppcC5vICQoTElCUykKLQkkKENDKSAkKENGTEFHUykgLW8gJEAgbWluaWd6aXAubyAkKExERkxBR1MpCittaW5pZ3ppcCQoRVhFKTogbWluaWd6aXAubyAkKFNUQVRJQ0xJQikKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgbWluaWd6aXAubyAkKFRFU1RfTERGTEFHUykKIAotaW5zdGFsbDogJChMSUJTKQotCS1AaWYgWyAhIC1kICQoZXhlY19wcmVmaXgpIF07IHRoZW4gbWtkaXIgLXAgJChleGVjX3ByZWZpeCk7IGZpCi0JLUBpZiBbICEgLWQgJChpbmNsdWRlZGlyKSAgXTsgdGhlbiBta2RpciAtcCAkKGluY2x1ZGVkaXIpOyBmaQotCS1AaWYgWyAhIC1kICQobGliZGlyKSAgICAgIF07IHRoZW4gbWtkaXIgLXAgJChsaWJkaXIpOyBmaQotCS1AaWYgWyAhIC1kICQobWFuM2RpcikgICAgIF07IHRoZW4gbWtkaXIgLXAgJChtYW4zZGlyKTsgZmkKLQljcCB6bGliLmggemNvbmYuaCAkKGluY2x1ZGVkaXIpCi0JY2htb2QgNjQ0ICQoaW5jbHVkZWRpcikvemxpYi5oICQoaW5jbHVkZWRpcikvemNvbmYuaAotCWNwICQoTElCUykgJChsaWJkaXIpCi0JY2QgJChsaWJkaXIpOyBjaG1vZCA3NTUgJChMSUJTKQotCS1AKGNkICQobGliZGlyKTsgJChSQU5MSUIpIGxpYnouYSB8fCB0cnVlKSA+L2Rldi9udWxsIDI+JjEKLQljZCAkKGxpYmRpcik7IGlmIHRlc3QgLWYgJChTSEFSRURMSUJWKTsgdGhlbiBcCi0JICBybSAtZiAkKFNIQVJFRExJQikgJChTSEFSRURMSUJNKTsgXAotCSAgbG4gLXMgJChTSEFSRURMSUJWKSAkKFNIQVJFRExJQik7IFwKLQkgIGxuIC1zICQoU0hBUkVETElCVikgJChTSEFSRURMSUJNKTsgXAotCSAgKGxkY29uZmlnIHx8IHRydWUpICA+L2Rldi9udWxsIDI+JjE7IFwKK2V4YW1wbGVzaCQoRVhFKTogZXhhbXBsZS5vICQoU0hBUkVETElCVikKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgZXhhbXBsZS5vIC1MLiAkKFNIQVJFRExJQlYpCisKK21pbmlnemlwc2gkKEVYRSk6IG1pbmlnemlwLm8gJChTSEFSRURMSUJWKQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBtaW5pZ3ppcC5vIC1MLiAkKFNIQVJFRExJQlYpCisKK2V4YW1wbGU2NCQoRVhFKTogZXhhbXBsZTY0Lm8gJChTVEFUSUNMSUIpCisJJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGU2NC5vICQoVEVTVF9MREZMQUdTKQorCittaW5pZ3ppcDY0JChFWEUpOiBtaW5pZ3ppcDY0Lm8gJChTVEFUSUNMSUIpCisJJChDQykgJChDRkxBR1MpIC1vICRAIG1pbmlnemlwNjQubyAkKFRFU1RfTERGTEFHUykKKworaW5zdGFsbC1saWJzOiAkKExJQlMpCisJLUBpZiBbICEgLWQgJChERVNURElSKSQoZXhlY19wcmVmaXgpICBdOyB0aGVuIG1rZGlyIC1wICQoREVTVERJUikkKGV4ZWNfcHJlZml4KTsgZmkKKwktQGlmIFsgISAtZCAkKERFU1RESVIpJChsaWJkaXIpICAgICAgIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQobGliZGlyKTsgZmkKKwktQGlmIFsgISAtZCAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQoc2hhcmVkbGliZGlyKTsgZmkKKwktQGlmIFsgISAtZCAkKERFU1RESVIpJChtYW4zZGlyKSAgICAgIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQobWFuM2Rpcik7IGZpCisJLUBpZiBbICEgLWQgJChERVNURElSKSQocGtnY29uZmlnZGlyKSBdOyB0aGVuIG1rZGlyIC1wICQoREVTVERJUikkKHBrZ2NvbmZpZ2Rpcik7IGZpCisJY3AgJChTVEFUSUNMSUIpICQoREVTVERJUikkKGxpYmRpcikKKwljaG1vZCA2NDQgJChERVNURElSKSQobGliZGlyKS8kKFNUQVRJQ0xJQikKKwktQCgkKFJBTkxJQikgJChERVNURElSKSQobGliZGlyKS9saWJ6LmEgfHwgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxCisJLUBpZiB0ZXN0IC1uICIkKFNIQVJFRExJQlYpIjsgdGhlbiBcCisJICBjcCAkKFNIQVJFRExJQlYpICQoREVTVERJUikkKHNoYXJlZGxpYmRpcik7IFwKKwkgIGVjaG8gImNwICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKSI7IFwKKwkgIGNobW9kIDc1NSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCVik7IFwKKwkgIGVjaG8gImNobW9kIDc1NSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCVikiOyBcCisJICBybSAtZiAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCKSAkKERFU1RESVIpJChzaGFyZWRsaWJkaXIpLyQoU0hBUkVETElCTSk7IFwKKwkgIGxuIC1zICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKS8kKFNIQVJFRExJQik7IFwKKwkgIGxuIC1zICQoU0hBUkVETElCVikgJChERVNURElSKSQoc2hhcmVkbGliZGlyKS8kKFNIQVJFRExJQk0pOyBcCisJICAoJChMRENPTkZJRykgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAogCWZpCi0JY3AgemxpYi4zICQobWFuM2RpcikKLQljaG1vZCA2NDQgJChtYW4zZGlyKS96bGliLjMKKwljcCB6bGliLjMgJChERVNURElSKSQobWFuM2RpcikKKwljaG1vZCA2NDQgJChERVNURElSKSQobWFuM2RpcikvemxpYi4zCisJY3AgemxpYi5wYyAkKERFU1RESVIpJChwa2djb25maWdkaXIpCisJY2htb2QgNjQ0ICQoREVTVERJUikkKHBrZ2NvbmZpZ2RpcikvemxpYi5wYwogIyBUaGUgcmFubGliIGluIGluc3RhbGwgaXMgbmVlZGVkIG9uIE5lWFRTVEVQIHdoaWNoIGNoZWNrcyBmaWxlIHRpbWVzCiAjIGxkY29uZmlnIGlzIGZvciBMaW51eAogCitpbnN0YWxsOiBpbnN0YWxsLWxpYnMKKwktQGlmIFsgISAtZCAkKERFU1RESVIpJChpbmNsdWRlZGlyKSAgIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQoaW5jbHVkZWRpcik7IGZpCisJY3AgemxpYi5oIHpjb25mLmggJChERVNURElSKSQoaW5jbHVkZWRpcikKKwljaG1vZCA2NDQgJChERVNURElSKSQoaW5jbHVkZWRpcikvemxpYi5oICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3pjb25mLmgKKwogdW5pbnN0YWxsOgotCWNkICQoaW5jbHVkZWRpcik7IFwKLQljZCAkKGxpYmRpcik7IHJtIC1mIGxpYnouYTsgXAotCWlmIHRlc3QgLWYgJChTSEFSRURMSUJWKTsgdGhlbiBcCisJY2QgJChERVNURElSKSQoaW5jbHVkZWRpcikgJiYgcm0gLWYgemxpYi5oIHpjb25mLmgKKwljZCAkKERFU1RESVIpJChsaWJkaXIpICYmIHJtIC1mIGxpYnouYTsgXAorCWlmIHRlc3QgLW4gIiQoU0hBUkVETElCVikiIC1hIC1mICQoU0hBUkVETElCVik7IHRoZW4gXAogCSAgcm0gLWYgJChTSEFSRURMSUJWKSAkKFNIQVJFRExJQikgJChTSEFSRURMSUJNKTsgXAogCWZpCi0JY2QgJChtYW4zZGlyKTsgcm0gLWYgemxpYi4zCisJY2QgJChERVNURElSKSQobWFuM2RpcikgJiYgcm0gLWYgemxpYi4zCisJY2QgJChERVNURElSKSQocGtnY29uZmlnZGlyKSAmJiBybSAtZiB6bGliLnBjCisKK2RvY3M6IHpsaWIuMy5wZGYKKworemxpYi4zLnBkZjogemxpYi4zCisJZ3JvZmYgLW1hbmRvYyAtZiBIIC1UIHBzIHpsaWIuMyB8IHBzMnBkZiAtIHpsaWIuMy5wZGYKKworemNvbmYuaC5jbWFrZWluOiB6Y29uZi5oLmluCisJLUAgVEVNUEZJTEU9emNvbmZoXyQkOyBcCisJZWNobyAiLyNkZWZpbmUgWkNPTkZfSC8gYVxcXFxcbiNjbWFrZWRlZmluZSBaX1BSRUZJWFxcXFxcbiNjbWFrZWRlZmluZSBaX0hBVkVfVU5JU1REX0hcbiIgPj4gJCRURU1QRklMRSAmJlwKKwlzZWQgLWYgJCRURU1QRklMRSB6Y29uZi5oLmluID4gemNvbmYuaC5jbWFrZWluICYmXAorCXRvdWNoIC1yIHpjb25mLmguaW4gemNvbmYuaC5jbWFrZWluICYmXAorCXJtICQkVEVNUEZJTEUKKworemNvbmY6IHpjb25mLmguaW4KKwljcCAtcCB6Y29uZi5oLmluIHpjb25mLmgKIAogbW9zdGx5Y2xlYW46IGNsZWFuCiBjbGVhbjoKLQlybSAtZiAqLm8gKn4gZXhhbXBsZSQoRVhFKSBtaW5pZ3ppcCQoRVhFKSBcCisJcm0gLWYgKi5vICoubG8gKn4gXAorCSAgIGV4YW1wbGUkKEVYRSkgbWluaWd6aXAkKEVYRSkgZXhhbXBsZXNoJChFWEUpIG1pbmlnemlwc2gkKEVYRSkgXAorCSAgIGV4YW1wbGU2NCQoRVhFKSBtaW5pZ3ppcDY0JChFWEUpIFwKKwkgICBpbmZjb3ZlciBcCiAJICAgbGliei4qIGZvby5neiBzb19sb2NhdGlvbnMgXAogCSAgIF9tYXRjaC5zIG1ha2V0cmVlIGNvbnRyaWIvaW5mYmFjazkvKi5vCisJcm0gLXJmIG9ianMKKwlybSAtZiAqLmdjZGEgKi5nY25vICouZ2NvdgorCXJtIC1mIGNvbnRyaWIvaW5mYmFjazkvKi5nY2RhIGNvbnRyaWIvaW5mYmFjazkvKi5nY25vIGNvbnRyaWIvaW5mYmFjazkvKi5nY292CiAKIG1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotZGlzdGNsZWFuOiBjbGVhbgotCWNwIC1wIE1ha2VmaWxlLmluIE1ha2VmaWxlCi0JY3AgLXAgemNvbmYuaW4uaCB6Y29uZi5oCi0Jcm0gLWYgLkRTX1N0b3JlCitkaXN0Y2xlYW46IGNsZWFuIHpjb25mIHpjb25mLmguY21ha2VpbiBkb2NzCisJcm0gLWYgTWFrZWZpbGUgemxpYi5wYyBjb25maWd1cmUubG9nCisJLUBybSAtZiAuRFNfU3RvcmUKKwktQHByaW50ZiAnYWxsOlxuXHQtQGVjaG8gIlBsZWFzZSB1c2UgLi9jb25maWd1cmUgZmlyc3QuICBUaGFuayB5b3UuIlxuJyA+IE1ha2VmaWxlCisJLUBwcmludGYgJ1xuZGlzdGNsZWFuOlxuXHRtYWtlIC1mIE1ha2VmaWxlLmluIGRpc3RjbGVhblxuJyA+PiBNYWtlZmlsZQorCS1AdG91Y2ggLXIgTWFrZWZpbGUuaW4gTWFrZWZpbGUKIAogdGFnczoKIAlldGFncyAqLltjaF0KQEAgLTEzOCwxNyArMjY3LDIyIEBACiAKICMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KIAotYWRsZXIzMi5vOiB6bGliLmggemNvbmYuaAotY29tcHJlc3MubzogemxpYi5oIHpjb25mLmgKLWNyYzMyLm86IGNyYzMyLmggemxpYi5oIHpjb25mLmgKK2FkbGVyMzIubyB6dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitnemNsb3NlLm8gZ3psaWIubyBnenJlYWQubyBnendyaXRlLm86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitjb21wcmVzcy5vIGV4YW1wbGUubyBtaW5pZ3ppcC5vIHVuY29tcHIubzogemxpYi5oIHpjb25mLmgKK2NyYzMyLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggY3JjMzIuaAogZGVmbGF0ZS5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotZXhhbXBsZS5vOiB6bGliLmggemNvbmYuaAotZ3ppby5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitpbmZiYWNrLm8gaW5mbGF0ZS5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCiBpbmZmYXN0Lm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZsYXRlLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCi1pbmZiYWNrLm86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZsYXRlLmggaW5mZmFzdC5oCiBpbmZ0cmVlcy5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmgKLW1pbmlnemlwLm86IHpsaWIuaCB6Y29uZi5oCiB0cmVlcy5vOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaCB0cmVlcy5oCi11bmNvbXByLm86IHpsaWIuaCB6Y29uZi5oCi16dXRpbC5vOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisKK2FkbGVyMzIubG8genV0aWwubG86IHp1dGlsLmggemxpYi5oIHpjb25mLmgKK2d6Y2xvc2UubG8gZ3psaWIubG8gZ3pyZWFkLmxvIGd6d3JpdGUubG86IHpsaWIuaCB6Y29uZi5oIGd6Z3V0cy5oCitjb21wcmVzcy5sbyBleGFtcGxlLmxvIG1pbmlnemlwLmxvIHVuY29tcHIubG86IHpsaWIuaCB6Y29uZi5oCitjcmMzMi5sbzogenV0aWwuaCB6bGliLmggemNvbmYuaCBjcmMzMi5oCitkZWZsYXRlLmxvOiBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAoraW5mYmFjay5sbyBpbmZsYXRlLmxvOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaCBpbmZmaXhlZC5oCitpbmZmYXN0LmxvOiB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZnRyZWVzLmggaW5mbGF0ZS5oIGluZmZhc3QuaAoraW5mdHJlZXMubG86IHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAordHJlZXMubG86IGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIHRyZWVzLmgKZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9SRUFETUUgYi9Nb2R1bGVzL3psaWIvUkVBRE1FCmluZGV4IDc1OGNjNTAuLjVjYTlkMTIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi9SRUFETUUKKysrIGIvTW9kdWxlcy96bGliL1JFQURNRQpAQCAtMSw1NiArMSw1MiBAQAogWkxJQiBEQVRBIENPTVBSRVNTSU9OIExJQlJBUlkKIAotemxpYiAxLjIuMyBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuICBBbGwgdGhlIGNvZGUgaXMKK3psaWIgMS4yLjggaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgQWxsIHRoZSBjb2RlIGlzCiB0aHJlYWQgc2FmZS4gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MKIChSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcwotaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTk1MC50eHQgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUgZm9ybWF0KQotYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuIFRoZXNlIGRvY3VtZW50cyBhcmUgYWxzbyBhdmFpbGFibGUgaW4gb3RoZXIKLWZvcm1hdHMgZnJvbSBmdHA6Ly9mdHAudXUubmV0L2dyYXBoaWNzL3BuZy9kb2N1bWVudHMvemxpYi96ZG9jLWluZGV4Lmh0bWwKK2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTAgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MSAoZGVmbGF0ZSBmb3JtYXQpIGFuZAorcmZjMTk1MiAoZ3ppcCBmb3JtYXQpLgogCiBBbGwgZnVuY3Rpb25zIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlIHpsaWIuaAotKHZvbHVudGVlciB0byB3cml0ZSBtYW4gcGFnZXMgd2VsY29tZSwgY29udGFjdCB6bGliQGd6aXAub3JnKS4gQSB1c2FnZSBleGFtcGxlCi1vZiB0aGUgbGlicmFyeSBpcyBnaXZlbiBpbiB0aGUgZmlsZSBleGFtcGxlLmMgd2hpY2ggYWxzbyB0ZXN0cyB0aGF0IHRoZSBsaWJyYXJ5Ci1pcyB3b3JraW5nIGNvcnJlY3RseS4gQW5vdGhlciBleGFtcGxlIGlzIGdpdmVuIGluIHRoZSBmaWxlIG1pbmlnemlwLmMuIFRoZQotY29tcHJlc3Npb24gbGlicmFyeSBpdHNlbGYgaXMgY29tcG9zZWQgb2YgYWxsIHNvdXJjZSBmaWxlcyBleGNlcHQgZXhhbXBsZS5jIGFuZAotbWluaWd6aXAuYy4KKyh2b2x1bnRlZXIgdG8gd3JpdGUgbWFuIHBhZ2VzIHdlbGNvbWUsIGNvbnRhY3QgemxpYkBnemlwLm9yZykuICBBIHVzYWdlIGV4YW1wbGUKK29mIHRoZSBsaWJyYXJ5IGlzIGdpdmVuIGluIHRoZSBmaWxlIHRlc3QvZXhhbXBsZS5jIHdoaWNoIGFsc28gdGVzdHMgdGhhdAordGhlIGxpYnJhcnkgaXMgd29ya2luZyBjb3JyZWN0bHkuICBBbm90aGVyIGV4YW1wbGUgaXMgZ2l2ZW4gaW4gdGhlIGZpbGUKK3Rlc3QvbWluaWd6aXAuYy4gIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGl0c2VsZiBpcyBjb21wb3NlZCBvZiBhbGwgc291cmNlCitmaWxlcyBpbiB0aGUgcm9vdCBkaXJlY3RvcnkuCiAKIFRvIGNvbXBpbGUgYWxsIGZpbGVzIGFuZCBydW4gdGhlIHRlc3QgcHJvZ3JhbSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgZ2l2ZW4gYXQKLXRoZSB0b3Agb2YgTWFrZWZpbGUuIEluIHNob3J0ICJtYWtlIHRlc3Q7IG1ha2UgaW5zdGFsbCIgc2hvdWxkIHdvcmsgZm9yIG1vc3QKLW1hY2hpbmVzLiBGb3IgVW5peDogIi4vY29uZmlndXJlOyBtYWtlIHRlc3Q7IG1ha2UgaW5zdGFsbCIuIEZvciBNU0RPUywgdXNlIG9uZQotb2YgdGhlIHNwZWNpYWwgbWFrZWZpbGVzIHN1Y2ggYXMgTWFrZWZpbGUubXNjLiBGb3IgVk1TLCB1c2UgbWFrZV92bXMuY29tLgordGhlIHRvcCBvZiBNYWtlZmlsZS5pbi4gIEluIHNob3J0ICIuL2NvbmZpZ3VyZTsgbWFrZSB0ZXN0IiwgYW5kIGlmIHRoYXQgZ29lcword2VsbCwgIm1ha2UgaW5zdGFsbCIgc2hvdWxkIHdvcmsgZm9yIG1vc3QgZmxhdm9ycyBvZiBVbml4LiAgRm9yIFdpbmRvd3MsIHVzZQorb25lIG9mIHRoZSBzcGVjaWFsIG1ha2VmaWxlcyBpbiB3aW4zMi8gb3IgY29udHJpYi92c3R1ZGlvLyAuICBGb3IgVk1TLCB1c2UKK21ha2Vfdm1zLmNvbS4KIAogUXVlc3Rpb25zIGFib3V0IHpsaWIgc2hvdWxkIGJlIHNlbnQgdG8gPHpsaWJAZ3ppcC5vcmc+LCBvciB0byBHaWxsZXMgVm9sbGFudAotPGluZm9Ad2luaW1hZ2UuY29tPiBmb3IgdGhlIFdpbmRvd3MgRExMIHZlcnNpb24uIFRoZSB6bGliIGhvbWUgcGFnZSBpcwotaHR0cDovL3d3dy56bGliLm9yZyBvciBodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvIEJlZm9yZSByZXBvcnRpbmcgYSBwcm9ibGVtLAotcGxlYXNlIGNoZWNrIHRoaXMgc2l0ZSB0byB2ZXJpZnkgdGhhdCB5b3UgaGF2ZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgemxpYjsKLW90aGVyd2lzZSBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBwcm9ibGVtIHN0aWxsIGV4aXN0cyBvcgotbm90LgorPGluZm9Ad2luaW1hZ2UuY29tPiBmb3IgdGhlIFdpbmRvd3MgRExMIHZlcnNpb24uICBUaGUgemxpYiBob21lIHBhZ2UgaXMKK2h0dHA6Ly96bGliLm5ldC8gLiAgQmVmb3JlIHJlcG9ydGluZyBhIHByb2JsZW0sIHBsZWFzZSBjaGVjayB0aGlzIHNpdGUgdG8KK3ZlcmlmeSB0aGF0IHlvdSBoYXZlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB6bGliOyBvdGhlcndpc2UgZ2V0IHRoZSBsYXRlc3QKK3ZlcnNpb24gYW5kIGNoZWNrIHdoZXRoZXIgdGhlIHByb2JsZW0gc3RpbGwgZXhpc3RzIG9yIG5vdC4KIAotUExFQVNFIHJlYWQgdGhlIHpsaWIgRkFRIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sIGJlZm9yZSBhc2tpbmcKLWZvciBoZWxwLgorUExFQVNFIHJlYWQgdGhlIHpsaWIgRkFRIGh0dHA6Ly96bGliLm5ldC96bGliX2ZhcS5odG1sIGJlZm9yZSBhc2tpbmcgZm9yIGhlbHAuCiAKLU1hcmsgTmVsc29uIDxtYXJrbkBpZWVlLm9yZz4gd3JvdGUgYW4gYXJ0aWNsZSBhYm91dCB6bGliIGZvciB0aGUgSmFuLiAxOTk3Ci1pc3N1ZSBvZiAgRHIuIERvYmIncyBKb3VybmFsOyBhIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGluCi1odHRwOi8vZG9nbWEubmV0L21hcmtuL2FydGljbGVzL3psaWJ0b29sL3psaWJ0b29sLmh0bQorTWFyayBOZWxzb24gPG1hcmtuQGllZWUub3JnPiB3cm90ZSBhbiBhcnRpY2xlIGFib3V0IHpsaWIgZm9yIHRoZSBKYW4uICAxOTk3Citpc3N1ZSBvZiBEci4gIERvYmIncyBKb3VybmFsOyBhIGNvcHkgb2YgdGhlIGFydGljbGUgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vbWFya25lbHNvbi51cy8xOTk3LzAxLzAxL3psaWItZW5naW5lLyAuCiAKLVRoZSBjaGFuZ2VzIG1hZGUgaW4gdmVyc2lvbiAxLjIuMyBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSBDaGFuZ2VMb2cuCitUaGUgY2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMS4yLjggYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgQ2hhbmdlTG9nLgogCi1VbnN1cHBvcnRlZCB0aGlyZCBwYXJ0eSBjb250cmlidXRpb25zIGFyZSBwcm92aWRlZCBpbiBkaXJlY3RvcnkgImNvbnRyaWIiLgorVW5zdXBwb3J0ZWQgdGhpcmQgcGFydHkgY29udHJpYnV0aW9ucyBhcmUgcHJvdmlkZWQgaW4gZGlyZWN0b3J5IGNvbnRyaWIvIC4KIAotQSBKYXZhIGltcGxlbWVudGF0aW9uIG9mIHpsaWIgaXMgYXZhaWxhYmxlIGluIHRoZSBKYXZhIERldmVsb3BtZW50IEtpdAotaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpL2phdmEvdXRpbC96aXAvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKLVNlZSB0aGUgemxpYiBob21lIHBhZ2UgaHR0cDovL3d3dy56bGliLm9yZyBmb3IgZGV0YWlscy4KK3psaWIgaXMgYXZhaWxhYmxlIGluIEphdmEgdXNpbmcgdGhlIGphdmEudXRpbC56aXAgcGFja2FnZSwgZG9jdW1lbnRlZCBhdAoraHR0cDovL2phdmEuc3VuLmNvbS9kZXZlbG9wZXIvdGVjaG5pY2FsQXJ0aWNsZXMvUHJvZ3JhbW1pbmcvY29tcHJlc3Npb24vIC4KIAotQSBQZXJsIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgUGF1bCBNYXJxdWVzcyA8cG1xc0BjcGFuLm9yZz4gaXMgaW4gdGhlCi1DUEFOIChDb21wcmVoZW5zaXZlIFBlcmwgQXJjaGl2ZSBOZXR3b3JrKSBzaXRlcwotaHR0cDovL3d3dy5jcGFuLm9yZy9tb2R1bGVzL2J5LW1vZHVsZS9Db21wcmVzcy8KK0EgUGVybCBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IFBhdWwgTWFycXVlc3MgPHBtcXNAY3Bhbi5vcmc+IGlzIGF2YWlsYWJsZQorYXQgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMsIGluY2x1ZGluZworaHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+cG1xcy9JTy1Db21wcmVzcy1abGliLyAuCiAKIEEgUHl0aG9uIGludGVyZmFjZSB0byB6bGliIHdyaXR0ZW4gYnkgQS5NLiBLdWNobGluZyA8YW1rQGFtay5jYT4gaXMKIGF2YWlsYWJsZSBpbiBQeXRob24gMS41IGFuZCBsYXRlciB2ZXJzaW9ucywgc2VlCi1odHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2xpYi9tb2R1bGUtemxpYi5odG1sCitodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvemxpYi5odG1sIC4KIAotQSB6bGliIGJpbmRpbmcgZm9yIFRDTCB3cml0dGVuIGJ5IEFuZHJlYXMgS3VwcmllcyA8YS5rdXByaWVzQHdlc3RlbmQuY29tPiBpcwotYXZhaWxsYWJsZSBhdCBodHRwOi8vd3d3Lm9jaGUuZGUvfmFrdXByaWVzL3NvZnQvdHJmL3RyZl96aXAuaHRtbAoremxpYiBpcyBidWlsdCBpbnRvIHRjbDogaHR0cDovL3dpa2kudGNsLnRrLzQ2MTAgLgogCiBBbiBleHBlcmltZW50YWwgcGFja2FnZSB0byByZWFkIGFuZCB3cml0ZSBmaWxlcyBpbiAuemlwIGZvcm1hdCwgd3JpdHRlbiBvbiB0b3AKIG9mIHpsaWIgYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPiwgaXMgYXZhaWxhYmxlIGluIHRoZQpAQCAtNzQsMjUgKzcwLDIxIEBACiAtIHpsaWIgZG9lc24ndCB3b3JrIG9uIEhQLVVYIDkuMDUgd2l0aCBzb21lIHZlcnNpb25zIG9mIC9iaW4vY2MuIEl0IHdvcmtzIHdpdGgKICAgb3RoZXIgY29tcGlsZXJzLiBVc2UgIm1ha2UgdGVzdCIgdG8gY2hlY2sgeW91ciBjb21waWxlci4KIAotLSBnemRvcGVuIGlzIG5vdCBzdXBwb3J0ZWQgb24gUklTQ09TLCBCRU9TIGFuZCBieSBzb21lIE1hYyBjb21waWxlcnMuCistIGd6ZG9wZW4gaXMgbm90IHN1cHBvcnRlZCBvbiBSSVNDT1Mgb3IgQkVPUy4KIAogLSBGb3IgUGFsbU9zLCBzZWUgaHR0cDovL3BhbG16bGliLnNvdXJjZWZvcmdlLm5ldC8KIAotLSBXaGVuIGJ1aWxkaW5nIGEgc2hhcmVkLCBpLmUuIGR5bmFtaWMgbGlicmFyeSBvbiBNYWMgT1MgWCwgdGhlIGxpYnJhcnkgbXVzdCBiZQotICBpbnN0YWxsZWQgYmVmb3JlIHRlc3RpbmcgKGRvICJtYWtlIGluc3RhbGwiIGJlZm9yZSAibWFrZSB0ZXN0IiksIHNpbmNlIHRoZQotICBsaWJyYXJ5IGxvY2F0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgbGlicmFyeS4KLQogCiBBY2tub3dsZWRnbWVudHM6CiAKLSAgVGhlIGRlZmxhdGUgZm9ybWF0IHVzZWQgYnkgemxpYiB3YXMgZGVmaW5lZCBieSBQaGlsIEthdHouIFRoZSBkZWZsYXRlCi0gIGFuZCB6bGliIHNwZWNpZmljYXRpb25zIHdlcmUgd3JpdHRlbiBieSBMLiBQZXRlciBEZXV0c2NoLiBUaGFua3MgdG8gYWxsIHRoZQotICBwZW9wbGUgd2hvIHJlcG9ydGVkIHByb2JsZW1zIGFuZCBzdWdnZXN0ZWQgdmFyaW91cyBpbXByb3ZlbWVudHMgaW4gemxpYjsKLSAgdGhleSBhcmUgdG9vIG51bWVyb3VzIHRvIGNpdGUgaGVyZS4KKyAgVGhlIGRlZmxhdGUgZm9ybWF0IHVzZWQgYnkgemxpYiB3YXMgZGVmaW5lZCBieSBQaGlsIEthdHouICBUaGUgZGVmbGF0ZSBhbmQKKyAgemxpYiBzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgTC4gIFBldGVyIERldXRzY2guICBUaGFua3MgdG8gYWxsIHRoZQorICBwZW9wbGUgd2hvIHJlcG9ydGVkIHByb2JsZW1zIGFuZCBzdWdnZXN0ZWQgdmFyaW91cyBpbXByb3ZlbWVudHMgaW4gemxpYjsgdGhleQorICBhcmUgdG9vIG51bWVyb3VzIHRvIGNpdGUgaGVyZS4KIAogQ29weXJpZ2h0IG5vdGljZToKIAotIChDKSAxOTk1LTIwMDQgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgorIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgogCiAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiAgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKQEAgLTExMywxMyArMTA1LDExIEBACiAgIEplYW4tbG91cCBHYWlsbHkgICAgICAgIE1hcmsgQWRsZXIKICAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQogCi1JZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCB3ZSB3b3VsZCBhcHByZWNpYXRlICpub3QqCi1yZWNlaXZpbmcgbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgdG8gc2lnbi4gVGhlIHNvdXJjZXMgYXJlIHByb3ZpZGVkCi1mb3IgZnJlZSBidXQgd2l0aG91dCB3YXJyYW50eSBvZiBhbnkga2luZC4gIFRoZSBsaWJyYXJ5IGhhcyBiZWVuCi1lbnRpcmVseSB3cml0dGVuIGJ5IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXI7IGl0IGRvZXMgbm90Ci1pbmNsdWRlIHRoaXJkLXBhcnR5IGNvZGUuCitJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCB3ZSB3b3VsZCBhcHByZWNpYXRlICpub3QqIHJlY2VpdmluZworbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgdG8gc2lnbi4gIFRoZSBzb3VyY2VzIGFyZSBwcm92aWRlZCBmb3IgZnJlZSBidXQgd2l0aG91dAord2FycmFudHkgb2YgYW55IGtpbmQuICBUaGUgbGlicmFyeSBoYXMgYmVlbiBlbnRpcmVseSB3cml0dGVuIGJ5IEplYW4tbG91cAorR2FpbGx5IGFuZCBNYXJrIEFkbGVyOyBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoaXJkLXBhcnR5IGNvZGUuCiAKLUlmIHlvdSByZWRpc3RyaWJ1dGUgbW9kaWZpZWQgc291cmNlcywgd2Ugd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBpbmNsdWRlCi1pbiB0aGUgZmlsZSBDaGFuZ2VMb2cgaGlzdG9yeSBpbmZvcm1hdGlvbiBkb2N1bWVudGluZyB5b3VyIGNoYW5nZXMuIFBsZWFzZQotcmVhZCB0aGUgRkFRIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBkaXN0cmlidXRpb24gb2YgbW9kaWZpZWQgc291cmNlCi12ZXJzaW9ucy4KK0lmIHlvdSByZWRpc3RyaWJ1dGUgbW9kaWZpZWQgc291cmNlcywgd2Ugd291bGQgYXBwcmVjaWF0ZSB0aGF0IHlvdSBpbmNsdWRlIGluCit0aGUgZmlsZSBDaGFuZ2VMb2cgaGlzdG9yeSBpbmZvcm1hdGlvbiBkb2N1bWVudGluZyB5b3VyIGNoYW5nZXMuICBQbGVhc2UgcmVhZAordGhlIEZBUSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mIG1vZGlmaWVkIHNvdXJjZSB2ZXJzaW9ucy4KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9hZGxlcjMyLmMgYi9Nb2R1bGVzL3psaWIvYWRsZXIzMi5jCmluZGV4IDAwN2JhMjYuLmE4NjhmMDcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi9hZGxlcjMyLmMKKysrIGIvTW9kdWxlcy96bGliL2FkbGVyMzIuYwpAQCAtMSwxNCArMSwxNyBAQAogLyogYWRsZXIzMi5jIC0tIGNvbXB1dGUgdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIGEgZGF0YSBzdHJlYW0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDExIE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCiAvKiBAKCMpICRJZCQgKi8KIAotI2RlZmluZSBaTElCX0lOVEVSTkFMCi0jaW5jbHVkZSAiemxpYi5oIgorI2luY2x1ZGUgInp1dGlsLmgiCiAKLSNkZWZpbmUgQkFTRSA2NTUyMVVMICAgIC8qIGxhcmdlc3QgcHJpbWUgc21hbGxlciB0aGFuIDY1NTM2ICovCisjZGVmaW5lIGxvY2FsIHN0YXRpYworCitsb2NhbCB1TG9uZyBhZGxlcjMyX2NvbWJpbmVfIE9GKCh1TG9uZyBhZGxlcjEsIHVMb25nIGFkbGVyMiwgel9vZmY2NF90IGxlbjIpKTsKKworI2RlZmluZSBCQVNFIDY1NTIxICAgICAgLyogbGFyZ2VzdCBwcmltZSBzbWFsbGVyIHRoYW4gNjU1MzYgKi8KICNkZWZpbmUgTk1BWCA1NTUyCiAvKiBOTUFYIGlzIHRoZSBsYXJnZXN0IG4gc3VjaCB0aGF0IDI1NW4obisxKS8yICsgKG4rMSkoQkFTRS0xKSA8PSAyXjMyLTEgKi8KIApAQCAtMTgsMzkgKzIxLDQ0IEBACiAjZGVmaW5lIERPOChidWYsaSkgIERPNChidWYsaSk7IERPNChidWYsaSs0KTsKICNkZWZpbmUgRE8xNihidWYpICAgRE84KGJ1ZiwwKTsgRE84KGJ1Ziw4KTsKIAotLyogdXNlIE5PX0RJVklERSBpZiB5b3VyIHByb2Nlc3NvciBkb2VzIG5vdCBkbyBkaXZpc2lvbiBpbiBoYXJkd2FyZSAqLworLyogdXNlIE5PX0RJVklERSBpZiB5b3VyIHByb2Nlc3NvciBkb2VzIG5vdCBkbyBkaXZpc2lvbiBpbiBoYXJkd2FyZSAtLQorICAgdHJ5IGl0IGJvdGggd2F5cyB0byBzZWUgd2hpY2ggaXMgZmFzdGVyICovCiAjaWZkZWYgTk9fRElWSURFCi0jICBkZWZpbmUgTU9EKGEpIFwKKy8qIG5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgQkFTRSBpcyA2NTUyMSwgd2hlcmUgNjU1MzYgJSA2NTUyMSA9PSAxNQorICAgKHRoYW5rIHlvdSB0byBKb2huIFJlaXNlciBmb3IgcG9pbnRpbmcgdGhpcyBvdXQpICovCisjICBkZWZpbmUgQ0hPUChhKSBcCiAgICAgZG8geyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDE2KSkgYSAtPSAoQkFTRSA8PCAxNik7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTUpKSBhIC09IChCQVNFIDw8IDE1KTsgXAotICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxNCkpIGEgLT0gKEJBU0UgPDwgMTQpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDEzKSkgYSAtPSAoQkFTRSA8PCAxMyk7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMTIpKSBhIC09IChCQVNFIDw8IDEyKTsgXAotICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxMSkpIGEgLT0gKEJBU0UgPDwgMTEpOyBcCi0gICAgICAgIGlmIChhID49IChCQVNFIDw8IDEwKSkgYSAtPSAoQkFTRSA8PCAxMCk7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgOSkpIGEgLT0gKEJBU0UgPDwgOSk7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgOCkpIGEgLT0gKEJBU0UgPDwgOCk7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgNykpIGEgLT0gKEJBU0UgPDwgNyk7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgNikpIGEgLT0gKEJBU0UgPDwgNik7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgNSkpIGEgLT0gKEJBU0UgPDwgNSk7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgNCkpIGEgLT0gKEJBU0UgPDwgNCk7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMykpIGEgLT0gKEJBU0UgPDwgMyk7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMikpIGEgLT0gKEJBU0UgPDwgMik7IFwKLSAgICAgICAgaWYgKGEgPj0gKEJBU0UgPDwgMSkpIGEgLT0gKEJBU0UgPDwgMSk7IFwKKyAgICAgICAgdW5zaWduZWQgbG9uZyB0bXAgPSBhID4+IDE2OyBcCisgICAgICAgIGEgJj0gMHhmZmZmVUw7IFwKKyAgICAgICAgYSArPSAodG1wIDw8IDQpIC0gdG1wOyBcCisgICAgfSB3aGlsZSAoMCkKKyMgIGRlZmluZSBNT0QyOChhKSBcCisgICAgZG8geyBcCisgICAgICAgIENIT1AoYSk7IFwKICAgICAgICAgaWYgKGEgPj0gQkFTRSkgYSAtPSBCQVNFOyBcCiAgICAgfSB3aGlsZSAoMCkKLSMgIGRlZmluZSBNT0Q0KGEpIFwKKyMgIGRlZmluZSBNT0QoYSkgXAogICAgIGRvIHsgXAotICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCA0KSkgYSAtPSAoQkFTRSA8PCA0KTsgXAotICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAzKSkgYSAtPSAoQkFTRSA8PCAzKTsgXAotICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAyKSkgYSAtPSAoQkFTRSA8PCAyKTsgXAotICAgICAgICBpZiAoYSA+PSAoQkFTRSA8PCAxKSkgYSAtPSAoQkFTRSA8PCAxKTsgXAorICAgICAgICBDSE9QKGEpOyBcCisgICAgICAgIE1PRDI4KGEpOyBcCisgICAgfSB3aGlsZSAoMCkKKyMgIGRlZmluZSBNT0Q2MyhhKSBcCisgICAgZG8geyAvKiB0aGlzIGFzc3VtZXMgYSBpcyBub3QgbmVnYXRpdmUgKi8gXAorICAgICAgICB6X29mZjY0X3QgdG1wID0gYSA+PiAzMjsgXAorICAgICAgICBhICY9IDB4ZmZmZmZmZmZMOyBcCisgICAgICAgIGEgKz0gKHRtcCA8PCA4KSAtICh0bXAgPDwgNSkgKyB0bXA7IFwKKyAgICAgICAgdG1wID0gYSA+PiAxNjsgXAorICAgICAgICBhICY9IDB4ZmZmZkw7IFwKKyAgICAgICAgYSArPSAodG1wIDw8IDQpIC0gdG1wOyBcCisgICAgICAgIHRtcCA9IGEgPj4gMTY7IFwKKyAgICAgICAgYSAmPSAweGZmZmZMOyBcCisgICAgICAgIGEgKz0gKHRtcCA8PCA0KSAtIHRtcDsgXAogICAgICAgICBpZiAoYSA+PSBCQVNFKSBhIC09IEJBU0U7IFwKICAgICB9IHdoaWxlICgwKQogI2Vsc2UKICMgIGRlZmluZSBNT0QoYSkgYSAlPSBCQVNFCi0jICBkZWZpbmUgTU9ENChhKSBhICU9IEJBU0UKKyMgIGRlZmluZSBNT0QyOChhKSBhICU9IEJBU0UKKyMgIGRlZmluZSBNT0Q2MyhhKSBhICU9IEJBU0UKICNlbmRpZgogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCkBAIC04OSw3ICs5Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGFkbGVyID49IEJBU0UpCiAgICAgICAgICAgICBhZGxlciAtPSBCQVNFOwotICAgICAgICBNT0Q0KHN1bTIpOyAgICAgICAgICAgICAvKiBvbmx5IGFkZGVkIHNvIG1hbnkgQkFTRSdzICovCisgICAgICAgIE1PRDI4KHN1bTIpOyAgICAgICAgICAgIC8qIG9ubHkgYWRkZWQgc28gbWFueSBCQVNFJ3MgKi8KICAgICAgICAgcmV0dXJuIGFkbGVyIHwgKHN1bTIgPDwgMTYpOwogICAgIH0KIApAQCAtMTI1LDI1ICsxMzMsNDcgQEAKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUoYWRsZXIxLCBhZGxlcjIsIGxlbjIpCitsb2NhbCB1TG9uZyBhZGxlcjMyX2NvbWJpbmVfKGFkbGVyMSwgYWRsZXIyLCBsZW4yKQogICAgIHVMb25nIGFkbGVyMTsKICAgICB1TG9uZyBhZGxlcjI7Ci0gICAgel9vZmZfdCBsZW4yOworICAgIHpfb2ZmNjRfdCBsZW4yOwogewogICAgIHVuc2lnbmVkIGxvbmcgc3VtMTsKICAgICB1bnNpZ25lZCBsb25nIHN1bTI7CiAgICAgdW5zaWduZWQgcmVtOwogCisgICAgLyogZm9yIG5lZ2F0aXZlIGxlbiwgcmV0dXJuIGludmFsaWQgYWRsZXIzMiBhcyBhIGNsdWUgZm9yIGRlYnVnZ2luZyAqLworICAgIGlmIChsZW4yIDwgMCkKKyAgICAgICAgcmV0dXJuIDB4ZmZmZmZmZmZVTDsKKwogICAgIC8qIHRoZSBkZXJpdmF0aW9uIG9mIHRoaXMgZm9ybXVsYSBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyICovCi0gICAgcmVtID0gKHVuc2lnbmVkKShsZW4yICUgQkFTRSk7CisgICAgTU9ENjMobGVuMik7ICAgICAgICAgICAgICAgIC8qIGFzc3VtZXMgbGVuMiA+PSAwICovCisgICAgcmVtID0gKHVuc2lnbmVkKWxlbjI7CiAgICAgc3VtMSA9IGFkbGVyMSAmIDB4ZmZmZjsKICAgICBzdW0yID0gcmVtICogc3VtMTsKICAgICBNT0Qoc3VtMik7CiAgICAgc3VtMSArPSAoYWRsZXIyICYgMHhmZmZmKSArIEJBU0UgLSAxOwogICAgIHN1bTIgKz0gKChhZGxlcjEgPj4gMTYpICYgMHhmZmZmKSArICgoYWRsZXIyID4+IDE2KSAmIDB4ZmZmZikgKyBCQVNFIC0gcmVtOwotICAgIGlmIChzdW0xID4gQkFTRSkgc3VtMSAtPSBCQVNFOwotICAgIGlmIChzdW0xID4gQkFTRSkgc3VtMSAtPSBCQVNFOwotICAgIGlmIChzdW0yID4gKEJBU0UgPDwgMSkpIHN1bTIgLT0gKEJBU0UgPDwgMSk7Ci0gICAgaWYgKHN1bTIgPiBCQVNFKSBzdW0yIC09IEJBU0U7CisgICAgaWYgKHN1bTEgPj0gQkFTRSkgc3VtMSAtPSBCQVNFOworICAgIGlmIChzdW0xID49IEJBU0UpIHN1bTEgLT0gQkFTRTsKKyAgICBpZiAoc3VtMiA+PSAoQkFTRSA8PCAxKSkgc3VtMiAtPSAoQkFTRSA8PCAxKTsKKyAgICBpZiAoc3VtMiA+PSBCQVNFKSBzdW0yIC09IEJBU0U7CiAgICAgcmV0dXJuIHN1bTEgfCAoc3VtMiA8PCAxNik7CiB9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lKGFkbGVyMSwgYWRsZXIyLCBsZW4yKQorICAgIHVMb25nIGFkbGVyMTsKKyAgICB1TG9uZyBhZGxlcjI7CisgICAgel9vZmZfdCBsZW4yOworeworICAgIHJldHVybiBhZGxlcjMyX2NvbWJpbmVfKGFkbGVyMSwgYWRsZXIyLCBsZW4yKTsKK30KKwordUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NChhZGxlcjEsIGFkbGVyMiwgbGVuMikKKyAgICB1TG9uZyBhZGxlcjE7CisgICAgdUxvbmcgYWRsZXIyOworICAgIHpfb2ZmNjRfdCBsZW4yOworeworICAgIHJldHVybiBhZGxlcjMyX2NvbWJpbmVfKGFkbGVyMSwgYWRsZXIyLCBsZW4yKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9hbGdvcml0aG0udHh0IGIvTW9kdWxlcy96bGliL2FsZ29yaXRobS50eHQKaW5kZXggYjAyMmRkZS4uYzk3ZjQ5NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL2FsZ29yaXRobS50eHQKKysrIGIvTW9kdWxlcy96bGliL2FsZ29yaXRobS50eHQKQEAgLTEyMSw3ICsxMjEsNyBAQAoga2J5dGVzLiAgWW91IGNhbiBpbWFnaW5lIHRoYXQgZmlsbGluZyBpbiBhIDJeMTUgZW50cnkgdGFibGUgZm9yIGEgMTUtYml0IGNvZGUKIHdvdWxkIHRha2UgdG9vIGxvbmcgaWYgeW91J3JlIG9ubHkgZGVjb2Rpbmcgc2V2ZXJhbCB0aG91c2FuZCBzeW1ib2xzLiAgQXQgdGhlCiBvdGhlciBleHRyZW1lLCB5b3UgY291bGQgbWFrZSBhIG5ldyB0YWJsZSBmb3IgZXZlcnkgYml0IGluIHRoZSBjb2RlLiAgSW4gZmFjdCwKLXRoYXQncyBlc3NlbnRpYWxseSBhIEh1ZmZtYW4gdHJlZS4gIEJ1dCB0aGVuIHlvdSBzcGVuZCB0d28gbXVjaCB0aW1lCit0aGF0J3MgZXNzZW50aWFsbHkgYSBIdWZmbWFuIHRyZWUuICBCdXQgdGhlbiB5b3Ugc3BlbmQgdG9vIG11Y2ggdGltZQogdHJhdmVyc2luZyB0aGUgdHJlZSB3aGlsZSBkZWNvZGluZywgZXZlbiBmb3Igc2hvcnQgc3ltYm9scy4KIAogU28gdGhlIG51bWJlciBvZiBiaXRzIGZvciB0aGUgZmlyc3QgbG9va3VwIHRhYmxlIGlzIGEgdHJhZGUgb2YgdGhlIHRpbWUgdG8KQEAgLTIwNiw0ICsyMDYsNCBAQAogcHAuIDMzNy0zNDMuCiAKIGBgREVGTEFURSBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24nJyBhdmFpbGFibGUgaW4KLWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTEudHh0CitodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUxCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvY29tcHJlc3MuYyBiL01vZHVsZXMvemxpYi9jb21wcmVzcy5jCmluZGV4IGRmMDRmMDEuLjZlOTc2MjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi9jb21wcmVzcy5jCisrKyBiL01vZHVsZXMvemxpYi9jb21wcmVzcy5jCkBAIC0xLDUgKzEsNSBAQAogLyogY29tcHJlc3MuYyAtLSBjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTI5LDcgKzI5LDcgQEAKICAgICB6X3N0cmVhbSBzdHJlYW07CiAgICAgaW50IGVycjsKIAotICAgIHN0cmVhbS5uZXh0X2luID0gKEJ5dGVmKilzb3VyY2U7CisgICAgc3RyZWFtLm5leHRfaW4gPSAoel9jb25zdCBCeXRlZiAqKXNvdXJjZTsKICAgICBzdHJlYW0uYXZhaWxfaW4gPSAodUludClzb3VyY2VMZW47CiAjaWZkZWYgTUFYU0VHXzY0SwogICAgIC8qIENoZWNrIGZvciBzb3VyY2UgPiA2NEsgb24gMTYtYml0IG1hY2hpbmU6ICovCkBAIC03NSw1ICs3NSw2IEBACiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgKHNvdXJjZUxlbikKICAgICB1TG9uZyBzb3VyY2VMZW47CiB7Ci0gICAgcmV0dXJuIHNvdXJjZUxlbiArIChzb3VyY2VMZW4gPj4gMTIpICsgKHNvdXJjZUxlbiA+PiAxNCkgKyAxMTsKKyAgICByZXR1cm4gc291cmNlTGVuICsgKHNvdXJjZUxlbiA+PiAxMikgKyAoc291cmNlTGVuID4+IDE0KSArCisgICAgICAgICAgIChzb3VyY2VMZW4gPj4gMjUpICsgMTM7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvY29uZmlndXJlIGIvTW9kdWxlcy96bGliL2NvbmZpZ3VyZQppbmRleCBkN2ZmZGMzLi5iNzdhOGE4IDEwMDc1NQotLS0gYS9Nb2R1bGVzL3psaWIvY29uZmlndXJlCisrKyBiL01vZHVsZXMvemxpYi9jb25maWd1cmUKQEAgLTEsMTA4ICsxLDIzOSBAQAogIyEvYmluL3NoCi0jIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIHpsaWIuIFRoaXMgc2NyaXB0IGlzIG5lZWRlZCBvbmx5IGlmCi0jIHlvdSB3aXNoIHRvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkgYW5kIHlvdXIgc3lzdGVtIHN1cHBvcnRzIHRoZW0sCi0jIG9mIGlmIHlvdSBuZWVkIHNwZWNpYWwgY29tcGlsZXIsIGZsYWdzIG9yIGluc3RhbGwgZGlyZWN0b3J5LgotIyBPdGhlcndpc2UsIHlvdSBjYW4ganVzdCB1c2UgZGlyZWN0bHkgIm1ha2UgdGVzdDsgbWFrZSBpbnN0YWxsIgorIyBjb25maWd1cmUgc2NyaXB0IGZvciB6bGliLgogIwotIyBUbyBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSwgdXNlICJjb25maWd1cmUgLS1zaGFyZWQiOyBieSBkZWZhdWx0IGEgc3RhdGljCi0jIGxpYnJhcnkgaXMgY3JlYXRlZC4gSWYgdGhlIHByaW1pdGl2ZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHByb3ZpZGVkIGhlcmUKLSMgZG9lcyBub3Qgd29yaywgdXNlIGZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L2xpYnRvb2wtKi50YXIuZ3oKKyMgTm9ybWFsbHkgY29uZmlndXJlIGJ1aWxkcyBib3RoIGEgc3RhdGljIGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgorIyBJZiB5b3Ugd2FudCB0byBidWlsZCBqdXN0IGEgc3RhdGljIGxpYnJhcnksIHVzZTogLi9jb25maWd1cmUgLS1zdGF0aWMKICMKICMgVG8gaW1wb3NlIHNwZWNpZmljIGNvbXBpbGVyIG9yIGZsYWdzIG9yIGluc3RhbGwgZGlyZWN0b3J5LCB1c2UgZm9yIGV4YW1wbGU6CiAjICAgIHByZWZpeD0kSE9NRSBDQz1jYyBDRkxBR1M9Ii1PNCIgLi9jb25maWd1cmUKICMgb3IgZm9yIGNzaC90Y3NoIHVzZXJzOgogIyAgICAoc2V0ZW52IHByZWZpeCAkSE9NRTsgc2V0ZW52IENDIGNjOyBzZXRlbnYgQ0ZMQUdTICItTzQiOyAuL2NvbmZpZ3VyZSkKLSMgTERTSEFSRUQgaXMgdGhlIGNvbW1hbmQgdG8gYmUgdXNlZCB0byBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeQogCiAjIEluY29ycmVjdCBzZXR0aW5ncyBvZiBDQyBvciBDRkxBR1MgbWF5IHByZXZlbnQgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KICMgSWYgeW91IGhhdmUgcHJvYmxlbXMsIHRyeSB3aXRob3V0IGRlZmluaW5nIENDIGFuZCBDRkxBR1MgYmVmb3JlIHJlcG9ydGluZwogIyBhbiBlcnJvci4KIAotTElCUz1saWJ6LmEKLUxERkxBR1M9Ii1MLiAke0xJQlN9IgorIyBzdGFydCBvZmYgY29uZmlndXJlLmxvZworZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLSA+PiBjb25maWd1cmUubG9nCitlY2hvICQwICQqID4+IGNvbmZpZ3VyZS5sb2cKK2RhdGUgPj4gY29uZmlndXJlLmxvZworCisjIHNldCBjb21tYW5kIHByZWZpeCBmb3IgY3Jvc3MtY29tcGlsYXRpb24KK2lmIFsgLW4gIiR7Q0hPU1R9IiBdOyB0aGVuCisgICAgdW5hbWU9ImBlY2hvICIke0NIT1NUfSIgfCBzZWQgLWUgJ3MvXlteLV0qLVwoW14tXSpcKSQvXDEvJyAtZSAncy9eW14tXSotW14tXSotXChbXi1dKlwpJC9cMS8nIC1lICdzL15bXi1dKi1bXi1dKi1cKFteLV0qXCktLiokL1wxLydgIgorICAgIENST1NTX1BSRUZJWD0iJHtDSE9TVH0tIgorZmkKKworIyBkZXN0aW5hdGlvbiBuYW1lIGZvciBzdGF0aWMgbGlicmFyeQorU1RBVElDTElCPWxpYnouYQorCisjIGV4dHJhY3QgemxpYiB2ZXJzaW9uIG51bWJlcnMgZnJvbSB6bGliLmgKIFZFUj1gc2VkIC1uIC1lICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIDwgemxpYi5oYAorVkVSMz1gc2VkIC1uIC1lICcvVkVSU0lPTiAiL3MvLioiXChbMC05XSpcXC5bMC05XSpcXC5bMC05XSpcKS4qL1wxL3AnIDwgemxpYi5oYAogVkVSMj1gc2VkIC1uIC1lICcvVkVSU0lPTiAiL3MvLioiXChbMC05XSpcXC5bMC05XSpcKVxcLi4qL1wxL3AnIDwgemxpYi5oYAogVkVSMT1gc2VkIC1uIC1lICcvVkVSU0lPTiAiL3MvLioiXChbMC05XSpcKVxcLi4qL1wxL3AnIDwgemxpYi5oYAotQVI9JHtBUi0iYXIgcmMifQotUkFOTElCPSR7UkFOTElCLSJyYW5saWIifQorCisjIGVzdGFibGlzaCBjb21tYW5kcyBmb3IgbGlicmFyeSBidWlsZGluZworaWYgIiR7Q1JPU1NfUFJFRklYfWFyIiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCB0ZXN0ICQ/IC1sdCAxMjY7IHRoZW4KKyAgICBBUj0ke0FSLSIke0NST1NTX1BSRUZJWH1hciJ9CisgICAgdGVzdCAtbiAiJHtDUk9TU19QUkVGSVh9IiAmJiBlY2hvIFVzaW5nICR7QVJ9IHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKK2Vsc2UKKyAgICBBUj0ke0FSLSJhciJ9CisgICAgdGVzdCAtbiAiJHtDUk9TU19QUkVGSVh9IiAmJiBlY2hvIFVzaW5nICR7QVJ9IHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKK2ZpCitBUkZMQUdTPSR7QVJGTEFHUy0icmMifQoraWYgIiR7Q1JPU1NfUFJFRklYfXJhbmxpYiIgLS12ZXJzaW9uID4vZGV2L251bGwgMj4vZGV2L251bGwgfHwgdGVzdCAkPyAtbHQgMTI2OyB0aGVuCisgICAgUkFOTElCPSR7UkFOTElCLSIke0NST1NTX1BSRUZJWH1yYW5saWIifQorICAgIHRlc3QgLW4gIiR7Q1JPU1NfUFJFRklYfSIgJiYgZWNobyBVc2luZyAke1JBTkxJQn0gfCB0ZWUgLWEgY29uZmlndXJlLmxvZworZWxzZQorICAgIFJBTkxJQj0ke1JBTkxJQi0icmFubGliIn0KK2ZpCitpZiAiJHtDUk9TU19QUkVGSVh9bm0iIC0tdmVyc2lvbiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIHx8IHRlc3QgJD8gLWx0IDEyNjsgdGhlbgorICAgIE5NPSR7Tk0tIiR7Q1JPU1NfUFJFRklYfW5tIn0KKyAgICB0ZXN0IC1uICIke0NST1NTX1BSRUZJWH0iICYmIGVjaG8gVXNpbmcgJHtOTX0gfCB0ZWUgLWEgY29uZmlndXJlLmxvZworZWxzZQorICAgIE5NPSR7Tk0tIm5tIn0KK2ZpCisKKyMgc2V0IGRlZmF1bHRzIGJlZm9yZSBwcm9jZXNzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zCitMRENPTkZJRz0ke0xEQ09ORklHLSJsZGNvbmZpZyJ9CitMRFNIQVJFRExJQkM9IiR7TERTSEFSRURMSUJDLS1sY30iCitBUkNIUz0KIHByZWZpeD0ke3ByZWZpeC0vdXNyL2xvY2FsfQogZXhlY19wcmVmaXg9JHtleGVjX3ByZWZpeC0nJHtwcmVmaXh9J30KIGxpYmRpcj0ke2xpYmRpci0nJHtleGVjX3ByZWZpeH0vbGliJ30KK3NoYXJlZGxpYmRpcj0ke3NoYXJlZGxpYmRpci0nJHtsaWJkaXJ9J30KIGluY2x1ZGVkaXI9JHtpbmNsdWRlZGlyLScke3ByZWZpeH0vaW5jbHVkZSd9CiBtYW5kaXI9JHttYW5kaXItJyR7cHJlZml4fS9zaGFyZS9tYW4nfQogc2hhcmVkX2V4dD0nLnNvJwotc2hhcmVkPTAKK3NoYXJlZD0xCitzb2xvPTAKK2NvdmVyPTAKK3pwcmVmaXg9MAoremNvbnN0PTAKK2J1aWxkNjQ9MAogZ2NjPTAKIG9sZF9jYz0iJENDIgogb2xkX2NmbGFncz0iJENGTEFHUyIKK09CSkM9JyQoT0JKWikgJChPQkpHKScKK1BJQ19PQkpDPSckKFBJQ19PQkpaKSAkKFBJQ19PQkpHKScKIAorIyBsZWF2ZSB0aGlzIHNjcmlwdCwgb3B0aW9uYWxseSBpbiBhIGJhZCB3YXkKK2xlYXZlKCkKK3sKKyAgaWYgdGVzdCAiJCoiICE9ICIwIjsgdGhlbgorICAgIGVjaG8gIioqICQwIGFib3J0aW5nLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICBmaQorICBybSAtZiAkdGVzdC5bY29dICR0ZXN0ICR0ZXN0JHNoYXJlZF9leHQgJHRlc3QuZ2NubyAuLy0tdmVyc2lvbgorICBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tID4+IGNvbmZpZ3VyZS5sb2cKKyAgZWNobyA+PiBjb25maWd1cmUubG9nCisgIGVjaG8gPj4gY29uZmlndXJlLmxvZworICBleGl0ICQxCit9CisKKyMgcHJvY2VzcyBjb21tYW5kIGxpbmUgb3B0aW9ucwogd2hpbGUgdGVzdCAkIyAtZ2UgMQogZG8KIGNhc2UgIiQxIiBpbgotICAgIC1oKiB8IC0taCopCi0gICAgICBlY2hvICd1c2FnZTonCi0gICAgICBlY2hvICcgIGNvbmZpZ3VyZSBbLS1zaGFyZWRdIFstLXByZWZpeD1QUkVGSVhdICBbLS1leGVjX3ByZWZpeD1FWFBSRUZJWF0nCi0gICAgICBlY2hvICcgICAgIFstLWxpYmRpcj1MSUJESVJdIFstLWluY2x1ZGVkaXI9SU5DTFVERURJUl0nCi0gICAgICAgIGV4aXQgMDs7Ci0gICAgLXAqPSogfCAtLXAqPSopIHByZWZpeD1gZWNobyAkMSB8IHNlZCAncy9bLWEtel9dKj0vLydgOyBzaGlmdDs7Ci0gICAgLWUqPSogfCAtLWUqPSopIGV4ZWNfcHJlZml4PWBlY2hvICQxIHwgc2VkICdzL1stYS16X10qPS8vJ2A7IHNoaWZ0OzsKLSAgICAtbCo9KiB8IC0tbGliZGlyPSopIGxpYmRpcj1gZWNobyAkMSB8IHNlZCAncy9bLWEtel9dKj0vLydgOyBzaGlmdDs7Ci0gICAgLWkqPSogfCAtLWluY2x1ZGVkaXI9KikgaW5jbHVkZWRpcj1gZWNobyAkMSB8IHNlZCAncy9bLWEtel9dKj0vLydgO3NoaWZ0OzsKLSAgICAtcCogfCAtLXAqKSBwcmVmaXg9IiQyIjsgc2hpZnQ7IHNoaWZ0OzsKLSAgICAtZSogfCAtLWUqKSBleGVjX3ByZWZpeD0iJDIiOyBzaGlmdDsgc2hpZnQ7OwotICAgIC1sKiB8IC0tbCopIGxpYmRpcj0iJDIiOyBzaGlmdDsgc2hpZnQ7OwotICAgIC1pKiB8IC0taSopIGluY2x1ZGVkaXI9IiQyIjsgc2hpZnQ7IHNoaWZ0OzsKLSAgICAtcyogfCAtLXMqKSBzaGFyZWQ9MTsgc2hpZnQ7OwotICAgICopIGVjaG8gInVua25vd24gb3B0aW9uOiAkMSI7IGVjaG8gIiQwIC0taGVscCBmb3IgaGVscCI7IGV4aXQgMTs7CisgICAgLWgqIHwgLS1oZWxwKQorICAgICAgZWNobyAndXNhZ2U6JyB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICcgIGNvbmZpZ3VyZSBbLS1jb25zdF0gWy0tenByZWZpeF0gWy0tcHJlZml4PVBSRUZJWF0gIFstLWVwcmVmaXg9RVhQUkVGSVhdJyB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICcgICAgWy0tc3RhdGljXSBbLS02NF0gWy0tbGliZGlyPUxJQkRJUl0gWy0tc2hhcmVkbGliZGlyPUxJQkRJUl0nIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gJyAgICBbLS1pbmNsdWRlZGlyPUlOQ0xVREVESVJdIFstLWFyY2hzPSItYXJjaCBpMzg2IC1hcmNoIHg4Nl82NCJdJyB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICAgIGV4aXQgMCA7OworICAgIC1wKj0qIHwgLS1wcmVmaXg9KikgcHJlZml4PWBlY2hvICQxIHwgc2VkICdzLy4qPS8vJ2A7IHNoaWZ0IDs7CisgICAgLWUqPSogfCAtLWVwcmVmaXg9KikgZXhlY19wcmVmaXg9YGVjaG8gJDEgfCBzZWQgJ3MvLio9Ly8nYDsgc2hpZnQgOzsKKyAgICAtbCo9KiB8IC0tbGliZGlyPSopIGxpYmRpcj1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgOyBzaGlmdCA7OworICAgIC0tc2hhcmVkbGliZGlyPSopIHNoYXJlZGxpYmRpcj1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgOyBzaGlmdCA7OworICAgIC1pKj0qIHwgLS1pbmNsdWRlZGlyPSopIGluY2x1ZGVkaXI9YGVjaG8gJDEgfCBzZWQgJ3MvLio9Ly8nYDtzaGlmdCA7OworICAgIC11Kj0qIHwgLS11bmFtZT0qKSB1bmFtZT1gZWNobyAkMSB8IHNlZCAncy8uKj0vLydgO3NoaWZ0IDs7CisgICAgLXAqIHwgLS1wcmVmaXgpIHByZWZpeD0iJDIiOyBzaGlmdDsgc2hpZnQgOzsKKyAgICAtZSogfCAtLWVwcmVmaXgpIGV4ZWNfcHJlZml4PSIkMiI7IHNoaWZ0OyBzaGlmdCA7OworICAgIC1sKiB8IC0tbGliZGlyKSBsaWJkaXI9IiQyIjsgc2hpZnQ7IHNoaWZ0IDs7CisgICAgLWkqIHwgLS1pbmNsdWRlZGlyKSBpbmNsdWRlZGlyPSIkMiI7IHNoaWZ0OyBzaGlmdCA7OworICAgIC1zKiB8IC0tc2hhcmVkIHwgLS1lbmFibGUtc2hhcmVkKSBzaGFyZWQ9MTsgc2hpZnQgOzsKKyAgICAtdCB8IC0tc3RhdGljKSBzaGFyZWQ9MDsgc2hpZnQgOzsKKyAgICAtLXNvbG8pIHNvbG89MTsgc2hpZnQgOzsKKyAgICAtLWNvdmVyKSBjb3Zlcj0xOyBzaGlmdCA7OworICAgIC16KiB8IC0tenByZWZpeCkgenByZWZpeD0xOyBzaGlmdCA7OworICAgIC02KiB8IC0tNjQpIGJ1aWxkNjQ9MTsgc2hpZnQgOzsKKyAgICAtYSo9KiB8IC0tYXJjaHM9KikgQVJDSFM9YGVjaG8gJDEgfCBzZWQgJ3MvLio9Ly8nYDsgc2hpZnQgOzsKKyAgICAtLXN5c2NvbmZkaXI9KikgZWNobyAiaWdub3JlZCBvcHRpb246IC0tc3lzY29uZmRpciIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZzsgc2hpZnQgOzsKKyAgICAtLWxvY2Fsc3RhdGVkaXI9KikgZWNobyAiaWdub3JlZCBvcHRpb246IC0tbG9jYWxzdGF0ZWRpciIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZzsgc2hpZnQgOzsKKyAgICAtYyogfCAtLWNvbnN0KSB6Y29uc3Q9MTsgc2hpZnQgOzsKKyAgICAqKQorICAgICAgZWNobyAidW5rbm93biBvcHRpb246ICQxIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICIkMCAtLWhlbHAgZm9yIGhlbHAiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGxlYXZlIDE7OwogICAgIGVzYWMKIGRvbmUKIAorIyB0ZW1wb3JhcnkgZmlsZSBuYW1lCiB0ZXN0PXp0ZXN0JCQKKworIyBwdXQgYXJndW1lbnRzIGluIGxvZywgYWxzbyBwdXQgdGVzdCBmaWxlIGluIGxvZyBpZiB1c2VkIGluIGFyZ3VtZW50cworc2hvdygpCit7CisgIGNhc2UgIiQqIiBpbgorICAgICokdGVzdC5jKikKKyAgICAgIGVjaG8gPT09ICR0ZXN0LmMgPT09ID4+IGNvbmZpZ3VyZS5sb2cKKyAgICAgIGNhdCAkdGVzdC5jID4+IGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gPT09ID4+IGNvbmZpZ3VyZS5sb2c7OworICBlc2FjCisgIGVjaG8gJCogPj4gY29uZmlndXJlLmxvZworfQorCisjIGNoZWNrIGZvciBnY2MgdnMuIGNjIGFuZCBzZXQgY29tcGlsZSBhbmQgbGluayBmbGFncyBiYXNlZCBvbiB0aGUgc3lzdGVtIGlkZW50aWZpZWQgYnkgdW5hbWUKIGNhdCA+ICR0ZXN0LmMgPDxFT0YKIGV4dGVybiBpbnQgZ2V0Y2hhcigpOwogaW50IGhlbGxvKCkge3JldHVybiBnZXRjaGFyKCk7fQogRU9GCiAKLXRlc3QgLXogIiRDQyIgJiYgZWNobyBDaGVja2luZyBmb3IgZ2NjLi4uCi1jYz0ke0NDLWdjY30KK3Rlc3QgLXogIiRDQyIgJiYgZWNobyBDaGVja2luZyBmb3IgJHtDUk9TU19QUkVGSVh9Z2NjLi4uIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKK2NjPSR7Q0MtJHtDUk9TU19QUkVGSVh9Z2NjfQogY2ZsYWdzPSR7Q0ZMQUdTLSItTzMifQogIyB0byBmb3JjZSB0aGUgYXNtIHZlcnNpb24gdXNlOiBDRkxBR1M9Ii1PMyAtREFTTVYiIC4vY29uZmlndXJlCiBjYXNlICIkY2MiIGluCi0gICpnY2MqKSBnY2M9MTs7CisgICpnY2MqKSBnY2M9MSA7OworICAqY2xhbmcqKSBnY2M9MSA7OworZXNhYworY2FzZSBgJGNjIC12IDI+JjFgIGluCisgICpnY2MqKSBnY2M9MSA7OwogZXNhYwogCi1pZiB0ZXN0ICIkZ2NjIiAtZXEgMSAmJiAoJGNjIC1jICRjZmxhZ3MgJHRlc3QuYykgMj4vZGV2L251bGw7IHRoZW4KK3Nob3cgJGNjIC1jICR0ZXN0LmMKK2lmIHRlc3QgIiRnY2MiIC1lcSAxICYmICgkY2MgLWMgJHRlc3QuYykgPj4gY29uZmlndXJlLmxvZyAyPiYxOyB0aGVuCisgIGVjaG8gLi4uIHVzaW5nIGdjYyA+PiBjb25maWd1cmUubG9nCiAgIENDPSIkY2MiCi0gIFNGTEFHUz0ke0NGTEFHUy0iLWZQSUMgLU8zIn0KLSAgQ0ZMQUdTPSIkY2ZsYWdzIgotICBjYXNlIGAodW5hbWUgLXMgfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAgaW4KLSAgTGludXggfCBsaW51eCB8IEdOVSB8IEdOVS8qKSBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ6LnNvLjEifTs7Ci0gIENZR1dJTiogfCBDeWd3aW4qIHwgY3lnd2luKiB8IE9TLzIqICkKLSAgICAgICAgICAgICBFWEU9Jy5leGUnOzsKKyAgQ0ZMQUdTPSIke0NGTEFHUy0tTzN9ICR7QVJDSFN9IgorICBTRkxBR1M9IiR7Q0ZMQUdTLS1PM30gLWZQSUMiCisgIExERkxBR1M9IiR7TERGTEFHU30gJHtBUkNIU30iCisgIGlmIHRlc3QgJGJ1aWxkNjQgLWVxIDE7IHRoZW4KKyAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtbTY0IgorICAgIFNGTEFHUz0iJHtTRkxBR1N9IC1tNjQiCisgIGZpCisgIGlmIHRlc3QgIiR7WkxJQkdDQ1dBUk59IiA9ICJZRVMiOyB0aGVuCisgICAgaWYgdGVzdCAiJHpjb25zdCIgLWVxIDE7IHRoZW4KKyAgICAgIENGTEFHUz0iJHtDRkxBR1N9IC1XYWxsIC1XZXh0cmEgLVdjYXN0LXF1YWwgLXBlZGFudGljIC1EWkxJQl9DT05TVCIKKyAgICBlbHNlCisgICAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyIKKyAgICBmaQorICBmaQorICBpZiB0ZXN0IC16ICIkdW5hbWUiOyB0aGVuCisgICAgdW5hbWU9YCh1bmFtZSAtcyB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYAorICBmaQorICBjYXNlICIkdW5hbWUiIGluCisgIExpbnV4KiB8IGxpbnV4KiB8IEdOVSB8IEdOVS8qIHwgc29sYXJpcyopCisgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYnouc28uMSwtLXZlcnNpb24tc2NyaXB0LHpsaWIubWFwIn0gOzsKKyAgKkJTRCB8ICpic2QqIHwgRHJhZ29uRmx5KQorICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ6LnNvLjEsLS12ZXJzaW9uLXNjcmlwdCx6bGliLm1hcCJ9CisgICAgICAgIExEQ09ORklHPSJsZGNvbmZpZyAtbSIgOzsKKyAgQ1lHV0lOKiB8IEN5Z3dpbiogfCBjeWd3aW4qIHwgT1MvMiopCisgICAgICAgIEVYRT0nLmV4ZScgOzsKKyAgTUlOR1cqIHwgbWluZ3cqKQorIyB0ZW1wb3JhcnkgYnlwYXNzCisgICAgICAgIHJtIC1mICR0ZXN0Lltjb10gJHRlc3QgJHRlc3Qkc2hhcmVkX2V4dAorICAgICAgICBlY2hvICJQbGVhc2UgdXNlIHdpbjMyL01ha2VmaWxlLmdjYyBpbnN0ZWFkLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgICAgICBsZWF2ZSAxCisgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIn0KKyAgICAgICAgTERTSEFSRURMSUJDPSIiCisgICAgICAgIEVYRT0nLmV4ZScgOzsKICAgUU5YKikgICMgVGhpcyBpcyBmb3IgUU5YNi4gSSBzdXBwb3NlIHRoYXQgdGhlIFFOWCBydWxlIGJlbG93IGlzIGZvciBRTlgyLFFOWDQKICAgICAgICAgICMgKGFsYWluLmJvbm5lZm95QGljYnQuY29tKQotICAgICAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCAtV2wsLWhsaWJ6LnNvLjEifTs7CisgICAgICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkIC1XbCwtaGxpYnouc28uMSJ9IDs7CiAgIEhQLVVYKikKICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtIiRjYyAtc2hhcmVkICRTRkxBR1MifQogICAgICAgICAgY2FzZSBgKHVuYW1lIC1tIHx8IGVjaG8gdW5rbm93bikgMj4vZGV2L251bGxgIGluCiAgICAgICAgICBpYTY0KQogICAgICAgICAgICAgICAgICBzaGFyZWRfZXh0PScuc28nCi0gICAgICAgICAgICAgICAgIFNIQVJFRExJQj0nbGliei5zbyc7OworICAgICAgICAgICAgICAgICBTSEFSRURMSUI9J2xpYnouc28nIDs7CiAgICAgICAgICAqKQogICAgICAgICAgICAgICAgICBzaGFyZWRfZXh0PScuc2wnCi0gICAgICAgICAgICAgICAgIFNIQVJFRExJQj0nbGliei5zbCc7OwotICAgICAgICAgZXNhYzs7Ci0gIERhcndpbiopICAgc2hhcmVkX2V4dD0nLmR5bGliJworICAgICAgICAgICAgICAgICBTSEFSRURMSUI9J2xpYnouc2wnIDs7CisgICAgICAgICBlc2FjIDs7CisgIERhcndpbiogfCBkYXJ3aW4qKQorICAgICAgICAgICAgIHNoYXJlZF9leHQ9Jy5keWxpYicKICAgICAgICAgICAgICBTSEFSRURMSUI9bGlieiRzaGFyZWRfZXh0CiAgICAgICAgICAgICAgU0hBUkVETElCVj1saWJ6LiRWRVIkc2hhcmVkX2V4dAogICAgICAgICAgICAgIFNIQVJFRExJQk09bGliei4kVkVSMSRzaGFyZWRfZXh0Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1keW5hbWljbGliIC1pbnN0YWxsX25hbWUgJGxpYmRpci8kU0hBUkVETElCTSAtY29tcGF0aWJpbGl0eV92ZXJzaW9uICRWRVIxIC1jdXJyZW50X3ZlcnNpb24gJFZFUiJ9OzsKLSAgKikgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1zaGFyZWQifTs7CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iJGNjIC1keW5hbWljbGliIC1pbnN0YWxsX25hbWUgJGxpYmRpci8kU0hBUkVETElCTSAtY29tcGF0aWJpbGl0eV92ZXJzaW9uICRWRVIxIC1jdXJyZW50X3ZlcnNpb24gJFZFUjMifQorICAgICAgICAgICAgIGlmIGxpYnRvb2wgLVYgMj4mMSB8IGdyZXAgQXBwbGUgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICAgICAgICAgQVI9ImxpYnRvb2wiCisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICBBUj0iL3Vzci9iaW4vbGlidG9vbCIKKyAgICAgICAgICAgICBmaQorICAgICAgICAgICAgIEFSRkxBR1M9Ii1vIiA7OworICAqKSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSIkY2MgLXNoYXJlZCJ9IDs7CiAgIGVzYWMKIGVsc2UKICAgIyBmaW5kIHN5c3RlbSBuYW1lIGFuZCBjb3JyZXNwb25kaW5nIGNjIG9wdGlvbnMKICAgQ0M9JHtDQy1jY30KLSAgY2FzZSBgKHVuYW1lIC1zciB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgorICBnY2M9MAorICBlY2hvIC4uLiB1c2luZyAkQ0MgPj4gY29uZmlndXJlLmxvZworICBpZiB0ZXN0IC16ICIkdW5hbWUiOyB0aGVuCisgICAgdW5hbWU9YCh1bmFtZSAtc3IgfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAKKyAgZmkKKyAgY2FzZSAiJHVuYW1lIiBpbgogICBIUC1VWCopICAgIFNGTEFHUz0ke0NGTEFHUy0iLU8gK3oifQogICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQogIyAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImxkIC1iICt2bm9jb21wYXR3YXJuaW5ncyJ9CkBAIC0xMTAsMzUwICsyNDEsNTkxIEBACiAgICAgICAgICBjYXNlIGAodW5hbWUgLW0gfHwgZWNobyB1bmtub3duKSAyPi9kZXYvbnVsbGAgaW4KICAgICAgICAgIGlhNjQpCiAgICAgICAgICAgICAgc2hhcmVkX2V4dD0nLnNvJwotICAgICAgICAgICAgIFNIQVJFRExJQj0nbGliei5zbyc7OworICAgICAgICAgICAgIFNIQVJFRExJQj0nbGliei5zbycgOzsKICAgICAgICAgICopCiAgICAgICAgICAgICAgc2hhcmVkX2V4dD0nLnNsJwotICAgICAgICAgICAgIFNIQVJFRExJQj0nbGliei5zbCc7OwotICAgICAgICAgZXNhYzs7CisgICAgICAgICAgICAgU0hBUkVETElCPSdsaWJ6LnNsJyA7OworICAgICAgICAgZXNhYyA7OwogICBJUklYKikgICAgIFNGTEFHUz0ke0NGTEFHUy0iLWFuc2kgLU8yIC1ycGF0aCAuIn0KICAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1hbnNpIC1PMiJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCJ9OzsKKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYnouc28uMSJ9IDs7CiAgIE9TRjFcIFY0KikgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9CiAgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCAgLVdsLC1zb25hbWUsbGliei5zbyAtV2wsLW1zeW0gLVdsLC1ycGF0aCwkKGxpYmRpcikgLVdsLC1zZXRfdmVyc2lvbiwke1ZFUn06MS4wIn07OworICAgICAgICAgICAgIExERkxBR1M9IiR7TERGTEFHU30gLVdsLC1ycGF0aCwuIgorICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQgIC1XbCwtc29uYW1lLGxpYnouc28gLVdsLC1tc3ltIC1XbCwtcnBhdGgsJChsaWJkaXIpIC1XbCwtc2V0X3ZlcnNpb24sJHtWRVJ9OjEuMCJ9IDs7CiAgIE9TRjEqKSAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9CiAgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyAtc3RkMSJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCJ9OzsKKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYnouc28uMSJ9IDs7CiAgIFFOWCopICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItNCAtTyJ9CiAgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItNCAtTyJ9CiAgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MifQogICAgICAgICAgICAgIFJBTkxJQj0ke1JBTkxJQi0idHJ1ZSJ9Ci0gICAgICAgICAgICAgQVI9ImNjIC1BIjs7CisgICAgICAgICAgICAgQVI9ImNjIgorICAgICAgICAgICAgIEFSRkxBR1M9Ii1BIiA7OwogICBTQ09fU1ZcIDMuMiopIFNGTEFHUz0ke0NGTEFHUy0iLU8zIC1keSAtS1BJQyAifQogICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8zIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtZHkgLUtQSUMgLUcifTs7Ci0gIFN1bk9TXCA1KikgU0ZMQUdTPSR7Q0ZMQUdTLSItZmFzdCAteGNnODkgLUtQSUMgLVIuIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1mYXN0IC14Y2c4OSJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLUcifTs7CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLWR5IC1LUElDIC1HIn0gOzsKKyAgU3VuT1NcIDUqIHwgc29sYXJpcyopCisgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyAtaCBsaWJ6JHNoYXJlZF9leHQuJFZFUjEifQorICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItZmFzdCAtS1BJQyJ9CisgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1mYXN0In0KKyAgICAgICAgIGlmIHRlc3QgJGJ1aWxkNjQgLWVxIDE7IHRoZW4KKyAgICAgICAgICAgICAjIG9sZCB2ZXJzaW9ucyBvZiBTdW5QUk8vV29ya3Nob3AvU3R1ZGlvIGRvbid0IHN1cHBvcnQgLW02NCwKKyAgICAgICAgICAgICAjIGJ1dCBuZXdlciBvbmVzIGRvLiAgQ2hlY2sgZm9yIGl0LgorICAgICAgICAgICAgIGZsYWc2ND1gJENDIC1mbGFncyB8IGVncmVwIC0tICdeLW02NCdgCisgICAgICAgICAgICAgaWYgdGVzdCB4IiRmbGFnNjQiICE9IHgiIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgQ0ZMQUdTPSIke0NGTEFHU30gLW02NCIKKyAgICAgICAgICAgICAgICAgU0ZMQUdTPSIke1NGTEFHU30gLW02NCIKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIGNhc2UgYCh1bmFtZSAtbSB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgorICAgICAgICAgICAgICAgICAgIGk4NiopCisgICAgICAgICAgICAgICAgICAgICBTRkxBR1M9IiRTRkxBR1MgLXhhcmNoPWFtZDY0IgorICAgICAgICAgICAgICAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC14YXJjaD1hbWQ2NCIgOzsKKyAgICAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgICAgICAgU0ZMQUdTPSIkU0ZMQUdTIC14YXJjaD12OSIKKyAgICAgICAgICAgICAgICAgICAgIENGTEFHUz0iJENGTEFHUyAteGFyY2g9djkiIDs7CisgICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICBmaQorICAgICAgICAgZmkKKyAgICAgICAgIDs7CiAgIFN1bk9TXCA0KikgU0ZMQUdTPSR7Q0ZMQUdTLSItTzIgLVBJQyJ9CiAgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTzIifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImxkIn07OwotICBTdW5TdHVkaW9cIDkqKSBTRkxBR1M9JHtDRkxBR1MtIi1EVVNFX01NQVAgLWZhc3QgLXhjb2RlPXBpYzMyIC14dGFyZ2V0PXVsdHJhMyAteGFyY2g9djliIn0KLSAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1EVVNFX01NQVAgLWZhc3QgLXh0YXJnZXQ9dWx0cmEzIC14YXJjaD12OWIifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC14YXJjaD12OWIifTs7CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0ibGQifSA7OworICBTdW5TdHVkaW9cIDkqKSBTRkxBR1M9JHtDRkxBR1MtIi1mYXN0IC14Y29kZT1waWMzMiAteHRhcmdldD11bHRyYTMgLXhhcmNoPXY5YiJ9CisgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItZmFzdCAteHRhcmdldD11bHRyYTMgLXhhcmNoPXY5YiJ9CisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXhhcmNoPXY5YiJ9IDs7CiAgIFVOSVhfU3lzdGVtX1ZcIDQuMi4wKQogICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtQSUMgLU8ifQogICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn07OworICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn0gOzsKICAgVU5JWF9TVlwgNC4yTVApCiAgICAgICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItS2NvbmZvcm1fcGljIC1PIn0KICAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KLSAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9OzsKKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9IDs7CiAgIE9wZW5VTklYXCA1KQogICAgICAgICAgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtQSUMgLU8ifQogICAgICAgICAgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn07OworICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1HIn0gOzsKICAgQUlYKikgICMgQ291cnRlc3kgb2YgZGJha2tlckBhcnJheWFzb2x1dGlvbnMuY29tCiAgICAgICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyAtcW1heG1lbT04MTkyIn0KICAgICAgICAgICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIC1xbWF4bWVtPTgxOTIifQotICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtInhsYyAtRyJ9OzsKLSAgIyBzZW5kIHdvcmtpbmcgb3B0aW9ucyBmb3Igb3RoZXIgc3lzdGVtcyB0byBzdXBwb3J0QGd6aXAub3JnCisgICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0ieGxjIC1HIn0gOzsKKyAgIyBzZW5kIHdvcmtpbmcgb3B0aW9ucyBmb3Igb3RoZXIgc3lzdGVtcyB0byB6bGliQGd6aXAub3JnCiAgICopICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CiAgICAgICAgICAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9Ci0gICAgICAgICAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0iY2MgLXNoYXJlZCJ9OzsKKyAgICAgICAgICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtc2hhcmVkIn0gOzsKICAgZXNhYwogZmkKIAorIyBkZXN0aW5hdGlvbiBuYW1lcyBmb3Igc2hhcmVkIGxpYnJhcnkgaWYgbm90IGRlZmluZWQgYWJvdmUKIFNIQVJFRExJQj0ke1NIQVJFRExJQi0ibGlieiRzaGFyZWRfZXh0In0KIFNIQVJFRExJQlY9JHtTSEFSRURMSUJWLSJsaWJ6JHNoYXJlZF9leHQuJFZFUiJ9CiBTSEFSRURMSUJNPSR7U0hBUkVETElCTS0ibGlieiRzaGFyZWRfZXh0LiRWRVIxIn0KIAorZWNobyA+PiBjb25maWd1cmUubG9nCisKKyMgZGVmaW5lIGZ1bmN0aW9ucyBmb3IgdGVzdGluZyBjb21waWxlciBhbmQgbGlicmFyeSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGxvZ2dpbmcgdGhlIHJlc3VsdHMKKworY2F0ID4gJHRlc3QuYyA8PEVPRgorI2Vycm9yIGVycm9yCitFT0YKK2lmICgkQ0MgLWMgJENGTEFHUyAkdGVzdC5jKSAyPi9kZXYvbnVsbDsgdGhlbgorICB0cnkoKQorICB7CisgICAgc2hvdyAkKgorICAgIHRlc3QgImAoICQqICkgMj4mMSB8IHRlZSAtYSBjb25maWd1cmUubG9nYCIgPSAiIgorICB9CisgIGVjaG8gLSB1c2luZyBhbnkgb3V0cHV0IGZyb20gY29tcGlsZXIgdG8gaW5kaWNhdGUgYW4gZXJyb3IgPj4gY29uZmlndXJlLmxvZworZWxzZQordHJ5KCkKK3sKKyAgc2hvdyAkKgorICAoICQqICkgPj4gY29uZmlndXJlLmxvZyAyPiYxCisgIHJldD0kPworICBpZiB0ZXN0ICRyZXQgLW5lIDA7IHRoZW4KKyAgICBlY2hvICIoZXhpdCBjb2RlICIkcmV0IikiID4+IGNvbmZpZ3VyZS5sb2cKKyAgZmkKKyAgcmV0dXJuICRyZXQKK30KK2ZpCisKK3RyeWJvdGgoKQoreworICBzaG93ICQqCisgIGdvdD1gKCAkKiApIDI+JjFgCisgIHJldD0kPworICBwcmludGYgJXMgIiRnb3QiID4+IGNvbmZpZ3VyZS5sb2cKKyAgaWYgdGVzdCAkcmV0IC1uZSAwOyB0aGVuCisgICAgcmV0dXJuICRyZXQKKyAgZmkKKyAgdGVzdCAiJGdvdCIgPSAiIgorfQorCitjYXQgPiAkdGVzdC5jIDw8IEVPRgoraW50IGZvbygpIHsgcmV0dXJuIDA7IH0KK0VPRgorZWNobyAiQ2hlY2tpbmcgZm9yIG9ic2Vzc2l2ZS1jb21wdWxzaXZlIGNvbXBpbGVyIG9wdGlvbnMuLi4iID4+IGNvbmZpZ3VyZS5sb2cKK2lmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiQ29tcGlsZXIgZXJyb3IgcmVwb3J0aW5nIGlzIHRvbyBoYXJzaCBmb3IgJDAgKHBlcmhhcHMgcmVtb3ZlIC1XZXJyb3IpLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICBsZWF2ZSAxCitmaQorCitlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKworIyBzZWUgaWYgc2hhcmVkIGxpYnJhcnkgYnVpbGQgc3VwcG9ydGVkCitjYXQgPiAkdGVzdC5jIDw8RU9GCitleHRlcm4gaW50IGdldGNoYXIoKTsKK2ludCBoZWxsbygpIHtyZXR1cm4gZ2V0Y2hhcigpO30KK0VPRgogaWYgdGVzdCAkc2hhcmVkIC1lcSAxOyB0aGVuCi0gIGVjaG8gQ2hlY2tpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuLi4KKyAgZWNobyBDaGVja2luZyBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4uLiB8IHRlZSAtYSBjb25maWd1cmUubG9nCiAgICMgd2UgbXVzdCB0ZXN0IGluIHR3byBzdGVwcyAoY2MgdGhlbiBsZCksIHJlcXVpcmVkIGF0IGxlYXN0IG9uIFN1bk9TIDQueAotICBpZiB0ZXN0ICJgKCRDQyAtYyAkU0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiICYmCi0gICAgIHRlc3QgImAoJExEU0hBUkVEIC1vICR0ZXN0JHNoYXJlZF9leHQgJHRlc3QubykgMj4mMWAiID0gIiI7IHRoZW4KLSAgICBDRkxBR1M9IiRTRkxBR1MiCi0gICAgTElCUz0iJFNIQVJFRExJQlYiCi0gICAgZWNobyBCdWlsZGluZyBzaGFyZWQgbGlicmFyeSAkU0hBUkVETElCViB3aXRoICRDQy4KKyAgaWYgdHJ5ICRDQyAtdyAtYyAkU0ZMQUdTICR0ZXN0LmMgJiYKKyAgICAgdHJ5ICRMRFNIQVJFRCAkU0ZMQUdTIC1vICR0ZXN0JHNoYXJlZF9leHQgJHRlc3QubzsgdGhlbgorICAgIGVjaG8gQnVpbGRpbmcgc2hhcmVkIGxpYnJhcnkgJFNIQVJFRExJQlYgd2l0aCAkQ0MuIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKICAgZWxpZiB0ZXN0IC16ICIkb2xkX2NjIiAtYSAteiAiJG9sZF9jZmxhZ3MiOyB0aGVuCi0gICAgZWNobyBObyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgorICAgIGVjaG8gTm8gc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZwogICAgIHNoYXJlZD0wOwogICBlbHNlCi0gICAgZWNobyAnTm8gc2hhcmVkIGxpYnJhcnkgc3VwcG9ydDsgdHJ5IHdpdGhvdXQgZGVmaW5pbmcgQ0MgYW5kIENGTEFHUycKKyAgICBlY2hvICdObyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0OyB0cnkgd2l0aG91dCBkZWZpbmluZyBDQyBhbmQgQ0ZMQUdTJyB8IHRlZSAtYSBjb25maWd1cmUubG9nCiAgICAgc2hhcmVkPTA7CiAgIGZpCiBmaQogaWYgdGVzdCAkc2hhcmVkIC1lcSAwOyB0aGVuCiAgIExEU0hBUkVEPSIkQ0MiCi0gIGVjaG8gQnVpbGRpbmcgc3RhdGljIGxpYnJhcnkgJExJQlMgdmVyc2lvbiAkVkVSIHdpdGggJENDLgorICBBTEw9InN0YXRpYyIKKyAgVEVTVD0iYWxsIHRlc3RzdGF0aWMiCisgIFNIQVJFRExJQj0iIgorICBTSEFSRURMSUJWPSIiCisgIFNIQVJFRExJQk09IiIKKyAgZWNobyBCdWlsZGluZyBzdGF0aWMgbGlicmFyeSAkU1RBVElDTElCIHZlcnNpb24gJFZFUiB3aXRoICRDQy4gfCB0ZWUgLWEgY29uZmlndXJlLmxvZwogZWxzZQotICBMREZMQUdTPSItTC4gJHtTSEFSRURMSUJWfSIKKyAgQUxMPSJzdGF0aWMgc2hhcmVkIgorICBURVNUPSJhbGwgdGVzdHN0YXRpYyB0ZXN0c2hhcmVkIgogZmkKIAorIyBjaGVjayBmb3IgdW5kZXJzY29yZXMgaW4gZXh0ZXJuYWwgbmFtZXMgZm9yIHVzZSBieSBhc3NlbWJsZXIgY29kZQorQ1BQPSR7Q1BQLSIkQ0MgLUUifQorY2FzZSAkQ0ZMQUdTIGluCisgICpBU01WKikKKyAgICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKyAgICBzaG93ICIkTk0gJHRlc3QubyB8IGdyZXAgX2hlbGxvIgorICAgIGlmIHRlc3QgImAkTk0gJHRlc3QubyB8IGdyZXAgX2hlbGxvIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2dgIiA9ICIiOyB0aGVuCisgICAgICBDUFA9IiRDUFAgLUROT19VTkRFUkxJTkUiCisgICAgICBlY2hvIENoZWNraW5nIGZvciB1bmRlcmxpbmUgaW4gZXh0ZXJuYWwgbmFtZXMuLi4gTm8uIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICBlbHNlCisgICAgICBlY2hvIENoZWNraW5nIGZvciB1bmRlcmxpbmUgaW4gZXh0ZXJuYWwgbmFtZXMuLi4gWWVzLiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgZmkgOzsKK2VzYWMKKworZWNobyA+PiBjb25maWd1cmUubG9nCisKKyMgY2hlY2sgZm9yIGxhcmdlIGZpbGUgc3VwcG9ydCwgYW5kIGlmIG5vbmUsIGNoZWNrIGZvciBmc2Vla28oKQorY2F0ID4gJHRlc3QuYyA8PEVPRgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorb2ZmNjRfdCBkdW1teSA9IDA7CitFT0YKK2lmIHRyeSAkQ0MgLWMgJENGTEFHUyAtRF9MQVJHRUZJTEU2NF9TT1VSQ0U9MSAkdGVzdC5jOyB0aGVuCisgIENGTEFHUz0iJHtDRkxBR1N9IC1EX0xBUkdFRklMRTY0X1NPVVJDRT0xIgorICBTRkxBR1M9IiR7U0ZMQUdTfSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0U9MSIKKyAgQUxMPSIke0FMTH0gYWxsNjQiCisgIFRFU1Q9IiR7VEVTVH0gdGVzdDY0IgorICBlY2hvICJDaGVja2luZyBmb3Igb2ZmNjRfdC4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgIGVjaG8gIkNoZWNraW5nIGZvciBmc2Vla28uLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworZWxzZQorICBlY2hvICJDaGVja2luZyBmb3Igb2ZmNjRfdC4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgZWNobyA+PiBjb25maWd1cmUubG9nCisgIGNhdCA+ICR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzdGRpby5oPgoraW50IG1haW4odm9pZCkgeworICBmc2Vla28oTlVMTCwgMCwgMCk7CisgIHJldHVybiAwOworfQorRU9GCisgIGlmIHRyeSAkQ0MgJENGTEFHUyAtbyAkdGVzdCAkdGVzdC5jOyB0aGVuCisgICAgZWNobyAiQ2hlY2tpbmcgZm9yIGZzZWVrby4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgIGVsc2UKKyAgICBDRkxBR1M9IiR7Q0ZMQUdTfSAtRE5PX0ZTRUVLTyIKKyAgICBTRkxBR1M9IiR7U0ZMQUdTfSAtRE5PX0ZTRUVLTyIKKyAgICBlY2hvICJDaGVja2luZyBmb3IgZnNlZWtvLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICBmaQorZmkKKworZWNobyA+PiBjb25maWd1cmUubG9nCisKKyMgY2hlY2sgZm9yIHN0cmVycm9yKCkgZm9yIHVzZSBieSBneiogZnVuY3Rpb25zCitjYXQgPiAkdGVzdC5jIDw8RU9GCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KK2ludCBtYWluKCkgeyByZXR1cm4gc3RybGVuKHN0cmVycm9yKGVycm5vKSk7IH0KK0VPRgoraWYgdHJ5ICRDQyAkQ0ZMQUdTIC1vICR0ZXN0ICR0ZXN0LmM7IHRoZW4KKyAgZWNobyAiQ2hlY2tpbmcgZm9yIHN0cmVycm9yLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKK2Vsc2UKKyAgQ0ZMQUdTPSIke0NGTEFHU30gLUROT19TVFJFUlJPUiIKKyAgU0ZMQUdTPSIke1NGTEFHU30gLUROT19TVFJFUlJPUiIKKyAgZWNobyAiQ2hlY2tpbmcgZm9yIHN0cmVycm9yLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworZmkKKworIyBjb3B5IGNsZWFuIHpjb25mLmggZm9yIHN1YnNlcXVlbnQgZWRpdHMKK2NwIC1wIHpjb25mLmguaW4gemNvbmYuaAorCitlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKworIyBjaGVjayBmb3IgdW5pc3RkLmggYW5kIHNhdmUgcmVzdWx0IGluIHpjb25mLmgKIGNhdCA+ICR0ZXN0LmMgPDxFT0YKICNpbmNsdWRlIDx1bmlzdGQuaD4KIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQogRU9GCi1pZiB0ZXN0ICJgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCi0gIHNlZCA8IHpjb25mLmluLmggIi9IQVZFX1VOSVNURF9IL3MlMCUxJSIgPiB6Y29uZi5oCi0gIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBZZXMuIgoraWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgc2VkIDwgemNvbmYuaCAiL14jaWZkZWYgSEFWRV9VTklTVERfSC4qIG1heSBiZS9zL2RlZiBIQVZFX1VOSVNURF9IXCguKlwpIG1heSBiZS8gMVwxIHdhcy8iID4gemNvbmYudGVtcC5oCisgIG12IHpjb25mLnRlbXAuaCB6Y29uZi5oCisgIGVjaG8gIkNoZWNraW5nIGZvciB1bmlzdGQuaC4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCiBlbHNlCi0gIGNwIC1wIHpjb25mLmluLmggemNvbmYuaAotICBlY2hvICJDaGVja2luZyBmb3IgdW5pc3RkLmguLi4gTm8uIgorICBlY2hvICJDaGVja2luZyBmb3IgdW5pc3RkLmguLi4gTm8uIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCiBmaQogCitlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKworIyBjaGVjayBmb3Igc3RkYXJnLmggYW5kIHNhdmUgcmVzdWx0IGluIHpjb25mLmgKK2NhdCA+ICR0ZXN0LmMgPDxFT0YKKyNpbmNsdWRlIDxzdGRhcmcuaD4KK2ludCBtYWluKCkgeyByZXR1cm4gMDsgfQorRU9GCitpZiB0cnkgJENDIC1jICRDRkxBR1MgJHRlc3QuYzsgdGhlbgorICBzZWQgPCB6Y29uZi5oICIvXiNpZmRlZiBIQVZFX1NUREFSR19ILiogbWF5IGJlL3MvZGVmIEhBVkVfU1REQVJHX0hcKC4qXCkgbWF5IGJlLyAxXDEgd2FzLyIgPiB6Y29uZi50ZW1wLmgKKyAgbXYgemNvbmYudGVtcC5oIHpjb25mLmgKKyAgZWNobyAiQ2hlY2tpbmcgZm9yIHN0ZGFyZy5oLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKK2Vsc2UKKyAgZWNobyAiQ2hlY2tpbmcgZm9yIHN0ZGFyZy5oLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworZmkKKworIyBpZiB0aGUgel8gcHJlZml4IHdhcyByZXF1ZXN0ZWQsIHNhdmUgdGhhdCBpbiB6Y29uZi5oCitpZiB0ZXN0ICR6cHJlZml4IC1lcSAxOyB0aGVuCisgIHNlZCA8IHpjb25mLmggIi8jaWZkZWYgWl9QUkVGSVguKiBtYXkgYmUvcy9kZWYgWl9QUkVGSVhcKC4qXCkgbWF5IGJlLyAxXDEgd2FzLyIgPiB6Y29uZi50ZW1wLmgKKyAgbXYgemNvbmYudGVtcC5oIHpjb25mLmgKKyAgZWNobyA+PiBjb25maWd1cmUubG9nCisgIGVjaG8gIlVzaW5nIHpfIHByZWZpeCBvbiBhbGwgc3ltYm9scy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKK2ZpCisKKyMgaWYgLS1zb2xvIGNvbXBpbGF0aW9uIHdhcyByZXF1ZXN0ZWQsIHNhdmUgdGhhdCBpbiB6Y29uZi5oIGFuZCByZW1vdmUgZ3ogc3R1ZmYgZnJvbSBvYmplY3QgbGlzdHMKK2lmIHRlc3QgJHNvbG8gLWVxIDE7IHRoZW4KKyAgc2VkICcvI2RlZmluZSBaQ09ORl9IL2FcCisjZGVmaW5lIFpfU09MTworCisnIDwgemNvbmYuaCA+IHpjb25mLnRlbXAuaAorICBtdiB6Y29uZi50ZW1wLmggemNvbmYuaAorT0JKQz0nJChPQkpaKScKK1BJQ19PQkpDPSckKFBJQ19PQkpaKScKK2ZpCisKKyMgaWYgY29kZSBjb3ZlcmFnZSB0ZXN0aW5nIHdhcyByZXF1ZXN0ZWQsIHVzZSBvbGRlciBnY2MgaWYgZGVmaW5lZCwgZS5nLiAiZ2NjLTQuMiIgb24gTWFjIE9TIFgKK2lmIHRlc3QgJGNvdmVyIC1lcSAxOyB0aGVuCisgIENGTEFHUz0iJHtDRkxBR1N9IC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIKKyAgaWYgdGVzdCAtbiAiJEdDQ19DTEFTU0lDIjsgdGhlbgorICAgIENDPSRHQ0NfQ0xBU1NJQworICBmaQorZmkKKworZWNobyA+PiBjb25maWd1cmUubG9nCisKKyMgY29uZHVjdCBhIHNlcmllcyBvZiB0ZXN0cyB0byByZXNvbHZlIGVpZ2h0IHBvc3NpYmxlIGNhc2VzIG9mIHVzaW5nICJ2cyIgb3IgInMiIHByaW50ZiBmdW5jdGlvbnMKKyMgKHVzaW5nIHN0ZGFyZyBvciBub3QpLCB3aXRoIG9yIHdpdGhvdXQgIm4iIChwcm92aW5nIHNpemUgb2YgYnVmZmVyKSwgYW5kIHdpdGggb3Igd2l0aG91dCBhCisjIHJldHVybiB2YWx1ZS4gIFRoZSBtb3N0IHNlY3VyZSByZXN1bHQgaXMgdnNucHJpbnRmKCkgd2l0aCBhIHJldHVybiB2YWx1ZS4gIHNucHJpbnRmKCkgd2l0aCBhCisjIHJldHVybiB2YWx1ZSBpcyBzZWN1cmUgYXMgd2VsbCwgYnV0IHRoZW4gZ3pwcmludGYoKSB3aWxsIGJlIGxpbWl0ZWQgdG8gMjAgYXJndW1lbnRzLgogY2F0ID4gJHRlc3QuYyA8PEVPRgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSAiemNvbmYuaCIKLQogaW50IG1haW4oKQogewogI2lmbmRlZiBTVERDCiAgIGNob2tlIG1lCiAjZW5kaWYKLQogICByZXR1cm4gMDsKIH0KIEVPRgoraWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgZWNobyAiQ2hlY2tpbmcgd2hldGhlciB0byB1c2UgdnNbbl1wcmludGYoKSBvciBzW25dcHJpbnRmKCkuLi4gdXNpbmcgdnNbbl1wcmludGYoKS4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKIAotaWYgdGVzdCAiYCgkQ0MgLWMgJENGTEFHUyAkdGVzdC5jKSAyPiYxYCIgPSAiIjsgdGhlbgotICBlY2hvICJDaGVja2luZyB3aGV0aGVyIHRvIHVzZSB2c1tuXXByaW50ZigpIG9yIHNbbl1wcmludGYoKS4uLiB1c2luZyB2c1tuXXByaW50ZigpIgotCisgIGVjaG8gPj4gY29uZmlndXJlLmxvZwogICBjYXQgPiAkdGVzdC5jIDw8RU9GCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KLQotaW50IG15dGVzdChjaGFyICpmbXQsIC4uLikKK2ludCBteXRlc3QoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAgIGNoYXIgYnVmWzIwXTsKICAgdmFfbGlzdCBhcDsKLQogICB2YV9zdGFydChhcCwgZm10KTsKICAgdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXApOwogICB2YV9lbmQoYXApOwogICByZXR1cm4gMDsKIH0KLQogaW50IG1haW4oKQogewogICByZXR1cm4gKG15dGVzdCgiSGVsbG8lZFxuIiwgMSkpOwogfQogRU9GCisgIGlmIHRyeSAkQ0MgJENGTEFHUyAtbyAkdGVzdCAkdGVzdC5jOyB0aGVuCisgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHZzbnByaW50ZigpIGluIHN0ZGlvLmguLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwogCi0gIGlmIHRlc3QgImAoJENDICRDRkxBR1MgLW8gJHRlc3QgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KLSAgICBlY2hvICJDaGVja2luZyBmb3IgdnNucHJpbnRmKCkgaW4gc3RkaW8uaC4uLiBZZXMuIgotCisgICAgZWNobyA+PiBjb25maWd1cmUubG9nCiAgICAgY2F0ID4kdGVzdC5jIDw8RU9GCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KLQotaW50IG15dGVzdChjaGFyICpmbXQsIC4uLikKK2ludCBteXRlc3QoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAgIGludCBuOwogICBjaGFyIGJ1ZlsyMF07CiAgIHZhX2xpc3QgYXA7Ci0KICAgdmFfc3RhcnQoYXAsIGZtdCk7CiAgIG4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcCk7CiAgIHZhX2VuZChhcCk7CiAgIHJldHVybiBuOwogfQotCiBpbnQgbWFpbigpCiB7CiAgIHJldHVybiAobXl0ZXN0KCJIZWxsbyVkXG4iLCAxKSk7CiB9CiBFT0YKIAotICAgIGlmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNucHJpbnRmKCkuLi4gWWVzLiIKKyAgICBpZiB0cnkgJENDIC1jICRDRkxBR1MgJHRlc3QuYzsgdGhlbgorICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiB2c25wcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCiAgICAgZWxzZQogICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFTX3ZzbnByaW50Zl92b2lkIgotICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiB2c25wcmludGYoKS4uLiBOby4iCi0gICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgdnNucHJpbnRmKCkgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuIHpsaWIiCi0gICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiCi0gICAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iCisgICAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVNfdnNucHJpbnRmX3ZvaWQiCisgICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzbnByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHZzbnByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwogICAgIGZpCiAgIGVsc2UKICAgICBDRkxBR1M9IiRDRkxBR1MgLUROT192c25wcmludGYiCi0gICAgZWNobyAiQ2hlY2tpbmcgZm9yIHZzbnByaW50ZigpIGluIHN0ZGlvLmguLi4gTm8uIgotICAgIGVjaG8gIiAgV0FSTklORzogdnNucHJpbnRmKCkgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gdnNwcmludGYoKS4gemxpYiIKLSAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIGJ1ZmZlci1vdmVyZmxvdyBzZWN1cml0eSIKLSAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iCisgICAgU0ZMQUdTPSIkU0ZMQUdTIC1ETk9fdnNucHJpbnRmIgorICAgIGVjaG8gIkNoZWNraW5nIGZvciB2c25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGVjaG8gIiAgV0FSTklORzogdnNucHJpbnRmKCkgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gdnNwcmludGYoKS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgYnVmZmVyLW92ZXJmbG93IHNlY3VyaXR5IiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCiAKKyAgICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKICAgICBjYXQgPiR0ZXN0LmMgPDxFT0YKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi1pbnQgbXl0ZXN0KGNoYXIgKmZtdCwgLi4uKQoraW50IG15dGVzdChjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKICAgaW50IG47CiAgIGNoYXIgYnVmWzIwXTsKICAgdmFfbGlzdCBhcDsKLQogICB2YV9zdGFydChhcCwgZm10KTsKICAgbiA9IHZzcHJpbnRmKGJ1ZiwgZm10LCBhcCk7CiAgIHZhX2VuZChhcCk7CiAgIHJldHVybiBuOwogfQotCiBpbnQgbWFpbigpCiB7CiAgIHJldHVybiAobXl0ZXN0KCJIZWxsbyVkXG4iLCAxKSk7CiB9CiBFT0YKIAotICAgIGlmIHRlc3QgImAoJENDIC1jICRDRkxBR1MgJHRlc3QuYykgMj4mMWAiID0gIiI7IHRoZW4KLSAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2YgdnNwcmludGYoKS4uLiBZZXMuIgorICAgIGlmIHRyeSAkQ0MgLWMgJENGTEFHUyAkdGVzdC5jOyB0aGVuCisgICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzcHJpbnRmKCkuLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwogICAgIGVsc2UKICAgICAgIENGTEFHUz0iJENGTEFHUyAtREhBU192c3ByaW50Zl92b2lkIgotICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiB2c3ByaW50ZigpLi4uIE5vLiIKLSAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSB2c3ByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIgotICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IgotICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIgorICAgICAgU0ZMQUdTPSIkU0ZMQUdTIC1ESEFTX3ZzcHJpbnRmX3ZvaWQiCisgICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHZzcHJpbnRmKCkuLi4gTm8uIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgdnNwcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKICAgICBmaQogICBmaQogZWxzZQotICBlY2hvICJDaGVja2luZyB3aGV0aGVyIHRvIHVzZSB2c1tuXXByaW50ZigpIG9yIHNbbl1wcmludGYoKS4uLiB1c2luZyBzW25dcHJpbnRmKCkiCisgIGVjaG8gIkNoZWNraW5nIHdoZXRoZXIgdG8gdXNlIHZzW25dcHJpbnRmKCkgb3Igc1tuXXByaW50ZigpLi4uIHVzaW5nIHNbbl1wcmludGYoKS4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKIAorICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKICAgY2F0ID4kdGVzdC5jIDw8RU9GCiAjaW5jbHVkZSA8c3RkaW8uaD4KLQogaW50IG15dGVzdCgpCiB7CiAgIGNoYXIgYnVmWzIwXTsKLQogICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMiLCAiZm9vIik7CiAgIHJldHVybiAwOwogfQotCiBpbnQgbWFpbigpCiB7CiAgIHJldHVybiAobXl0ZXN0KCkpOwogfQogRU9GCiAKLSAgaWYgdGVzdCAiYCgkQ0MgJENGTEFHUyAtbyAkdGVzdCAkdGVzdC5jKSAyPiYxYCIgPSAiIjsgdGhlbgotICAgIGVjaG8gIkNoZWNraW5nIGZvciBzbnByaW50ZigpIGluIHN0ZGlvLmguLi4gWWVzLiIKKyAgaWYgdHJ5ICRDQyAkQ0ZMQUdTIC1vICR0ZXN0ICR0ZXN0LmM7IHRoZW4KKyAgICBlY2hvICJDaGVja2luZyBmb3Igc25wcmludGYoKSBpbiBzdGRpby5oLi4uIFllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKIAorICAgIGVjaG8gPj4gY29uZmlndXJlLmxvZwogICAgIGNhdCA+JHRlc3QuYyA8PEVPRgogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KIGludCBteXRlc3QoKQogewogICBjaGFyIGJ1ZlsyMF07Ci0KICAgcmV0dXJuIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyIsICJmb28iKTsKIH0KLQogaW50IG1haW4oKQogewogICByZXR1cm4gKG15dGVzdCgpKTsKIH0KIEVPRgogCi0gICAgaWYgdGVzdCAiYCgkQ0MgLWMgJENGTEFHUyAkdGVzdC5jKSAyPiYxYCIgPSAiIjsgdGhlbgotICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiBzbnByaW50ZigpLi4uIFllcy4iCisgICAgaWYgdHJ5ICRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmM7IHRoZW4KKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCiAgICAgZWxzZQogICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ESEFTX3NucHJpbnRmX3ZvaWQiCi0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHNucHJpbnRmKCkuLi4gTm8uIgotICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHNucHJpbnRmKCkgZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuIHpsaWIiCi0gICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiCi0gICAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iCisgICAgICBTRkxBR1M9IiRTRkxBR1MgLURIQVNfc25wcmludGZfdm9pZCIKKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYoKS4uLiBOby4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gIiAgV0FSTklORzogYXBwYXJlbnRseSBzbnByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2VjdXJpdHkiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwogICAgIGZpCiAgIGVsc2UKICAgICBDRkxBR1M9IiRDRkxBR1MgLUROT19zbnByaW50ZiIKLSAgICBlY2hvICJDaGVja2luZyBmb3Igc25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIKLSAgICBlY2hvICIgIFdBUk5JTkc6IHNucHJpbnRmKCkgbm90IGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gc3ByaW50ZigpLiB6bGliIgotICAgIGVjaG8gIiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJlIG9wZW4gdG8gcG9zc2libGUgYnVmZmVyLW92ZXJmbG93IHNlY3VyaXR5IgotICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIKKyAgICBTRkxBR1M9IiRTRkxBR1MgLUROT19zbnByaW50ZiIKKyAgICBlY2hvICJDaGVja2luZyBmb3Igc25wcmludGYoKSBpbiBzdGRpby5oLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGVjaG8gIiAgV0FSTklORzogc25wcmludGYoKSBub3QgZm91bmQsIGZhbGxpbmcgYmFjayB0byBzcHJpbnRmKCkuIHpsaWIiIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKKyAgICBlY2hvICIgIGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIGJ1ZmZlci1vdmVyZmxvdyBzZWN1cml0eSIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgIGVjaG8gIiAgdnVsbmVyYWJpbGl0aWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwogCisgICAgZWNobyA+PiBjb25maWd1cmUubG9nCiAgICAgY2F0ID4kdGVzdC5jIDw8RU9GCiAjaW5jbHVkZSA8c3RkaW8uaD4KLQogaW50IG15dGVzdCgpCiB7CiAgIGNoYXIgYnVmWzIwXTsKLQogICByZXR1cm4gc3ByaW50ZihidWYsICIlcyIsICJmb28iKTsKIH0KLQogaW50IG1haW4oKQogewogICByZXR1cm4gKG15dGVzdCgpKTsKIH0KIEVPRgogCi0gICAgaWYgdGVzdCAiYCgkQ0MgLWMgJENGTEFHUyAkdGVzdC5jKSAyPiYxYCIgPSAiIjsgdGhlbgotICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiBzcHJpbnRmKCkuLi4gWWVzLiIKKyAgICBpZiB0cnkgJENDIC1jICRDRkxBR1MgJHRlc3QuYzsgdGhlbgorICAgICAgZWNobyAiQ2hlY2tpbmcgZm9yIHJldHVybiB2YWx1ZSBvZiBzcHJpbnRmKCkuLi4gWWVzLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZwogICAgIGVsc2UKICAgICAgIENGTEFHUz0iJENGTEFHUyAtREhBU19zcHJpbnRmX3ZvaWQiCi0gICAgICBlY2hvICJDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHNwcmludGYoKS4uLiBOby4iCi0gICAgICBlY2hvICIgIFdBUk5JTkc6IGFwcGFyZW50bHkgc3ByaW50ZigpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiB6bGliIgotICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IgotICAgICAgZWNobyAiICB2dWxuZXJhYmlsaXRpZXMuIgorICAgICAgU0ZMQUdTPSIkU0ZMQUdTIC1ESEFTX3NwcmludGZfdm9pZCIKKyAgICAgIGVjaG8gIkNoZWNraW5nIGZvciByZXR1cm4gdmFsdWUgb2Ygc3ByaW50ZigpLi4uIE5vLiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgICAgZWNobyAiICBXQVJOSU5HOiBhcHBhcmVudGx5IHNwcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYiIgfCB0ZWUgLWEgY29uZmlndXJlLmxvZworICAgICAgZWNobyAiICBjYW4gYnVpbGQgYnV0IHdpbGwgYmUgb3BlbiB0byBwb3NzaWJsZSBzdHJpbmctZm9ybWF0IHNlY3VyaXR5IiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgICAgICBlY2hvICIgIHZ1bG5lcmFiaWxpdGllcy4iIHwgdGVlIC1hIGNvbmZpZ3VyZS5sb2cKICAgICBmaQogICBmaQogZmkKIAotY2F0ID4kdGVzdC5jIDw8RU9GCi0jaW5jbHVkZSA8ZXJybm8uaD4KLWludCBtYWluKCkgeyByZXR1cm4gMDsgfQotRU9GCi1pZiB0ZXN0ICJgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCi0gIGVjaG8gIkNoZWNraW5nIGZvciBlcnJuby5oLi4uIFllcy4iCi1lbHNlCi0gIGVjaG8gIkNoZWNraW5nIGZvciBlcnJuby5oLi4uIE5vLiIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ETk9fRVJSTk9fSCIKLWZpCi0KLWNhdCA+ICR0ZXN0LmMgPDxFT0YKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci1jYWRkcl90IGhlbGxvKCkgewotICByZXR1cm4gbW1hcCgoY2FkZHJfdCkwLCAob2ZmX3QpMCwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCAwLCAob2ZmX3QpMCk7CisjIHNlZSBpZiB3ZSBjYW4gaGlkZSB6bGliIGludGVybmFsIHN5bWJvbHMgdGhhdCBhcmUgbGlua2VkIGJldHdlZW4gc2VwYXJhdGUgc291cmNlIGZpbGVzCitpZiB0ZXN0ICIkZ2NjIiAtZXEgMTsgdGhlbgorICBlY2hvID4+IGNvbmZpZ3VyZS5sb2cKKyAgY2F0ID4gJHRlc3QuYyA8PEVPRgorI2RlZmluZSBaTElCX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkgKCJoaWRkZW4iKSkpCitpbnQgWkxJQl9JTlRFUk5BTCBmb287CitpbnQgbWFpbigpCit7CisgIHJldHVybiAwOwogfQogRU9GCi1pZiB0ZXN0ICJgKCRDQyAtYyAkQ0ZMQUdTICR0ZXN0LmMpIDI+JjFgIiA9ICIiOyB0aGVuCi0gIENGTEFHUz0iJENGTEFHUyAtRFVTRV9NTUFQIgotICBlY2hvIENoZWNraW5nIGZvciBtbWFwIHN1cHBvcnQuLi4gWWVzLgotZWxzZQotICBlY2hvIENoZWNraW5nIGZvciBtbWFwIHN1cHBvcnQuLi4gTm8uCisgIGlmIHRyeWJvdGggJENDIC1jICRDRkxBR1MgJHRlc3QuYzsgdGhlbgorICAgIENGTEFHUz0iJENGTEFHUyAtREhBVkVfSElEREVOIgorICAgIFNGTEFHUz0iJFNGTEFHUyAtREhBVkVfSElEREVOIgorICAgIGVjaG8gIkNoZWNraW5nIGZvciBhdHRyaWJ1dGUodmlzaWJpbGl0eSkgc3VwcG9ydC4uLiBZZXMuIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgIGVsc2UKKyAgICBlY2hvICJDaGVja2luZyBmb3IgYXR0cmlidXRlKHZpc2liaWxpdHkpIHN1cHBvcnQuLi4gTm8uIiB8IHRlZSAtYSBjb25maWd1cmUubG9nCisgIGZpCiBmaQogCi1DUFA9JHtDUFAtIiRDQyAtRSJ9Ci1jYXNlICRDRkxBR1MgaW4KLSAgKkFTTVYqKQotICAgIGlmIHRlc3QgImBubSAkdGVzdC5vIHwgZ3JlcCBfaGVsbG9gIiA9ICIiOyB0aGVuCi0gICAgICBDUFA9IiRDUFAgLUROT19VTkRFUkxJTkUiCi0gICAgICBlY2hvIENoZWNraW5nIGZvciB1bmRlcmxpbmUgaW4gZXh0ZXJuYWwgbmFtZXMuLi4gTm8uCi0gICAgZWxzZQotICAgICAgZWNobyBDaGVja2luZyBmb3IgdW5kZXJsaW5lIGluIGV4dGVybmFsIG5hbWVzLi4uIFllcy4KLSAgICBmaTs7Ci1lc2FjCisjIHNob3cgdGhlIHJlc3VsdHMgaW4gdGhlIGxvZworZWNobyA+PiBjb25maWd1cmUubG9nCitlY2hvIEFMTCA9ICRBTEwgPj4gY29uZmlndXJlLmxvZworZWNobyBBUiA9ICRBUiA+PiBjb25maWd1cmUubG9nCitlY2hvIEFSRkxBR1MgPSAkQVJGTEFHUyA+PiBjb25maWd1cmUubG9nCitlY2hvIENDID0gJENDID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gQ0ZMQUdTID0gJENGTEFHUyA+PiBjb25maWd1cmUubG9nCitlY2hvIENQUCA9ICRDUFAgPj4gY29uZmlndXJlLmxvZworZWNobyBFWEUgPSAkRVhFID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gTERDT05GSUcgPSAkTERDT05GSUcgPj4gY29uZmlndXJlLmxvZworZWNobyBMREZMQUdTID0gJExERkxBR1MgPj4gY29uZmlndXJlLmxvZworZWNobyBMRFNIQVJFRCA9ICRMRFNIQVJFRCA+PiBjb25maWd1cmUubG9nCitlY2hvIExEU0hBUkVETElCQyA9ICRMRFNIQVJFRExJQkMgPj4gY29uZmlndXJlLmxvZworZWNobyBPQkpDID0gJE9CSkMgPj4gY29uZmlndXJlLmxvZworZWNobyBQSUNfT0JKQyA9ICRQSUNfT0JKQyA+PiBjb25maWd1cmUubG9nCitlY2hvIFJBTkxJQiA9ICRSQU5MSUIgPj4gY29uZmlndXJlLmxvZworZWNobyBTRkxBR1MgPSAkU0ZMQUdTID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gU0hBUkVETElCID0gJFNIQVJFRExJQiA+PiBjb25maWd1cmUubG9nCitlY2hvIFNIQVJFRExJQk0gPSAkU0hBUkVETElCTSA+PiBjb25maWd1cmUubG9nCitlY2hvIFNIQVJFRExJQlYgPSAkU0hBUkVETElCViA+PiBjb25maWd1cmUubG9nCitlY2hvIFNUQVRJQ0xJQiA9ICRTVEFUSUNMSUIgPj4gY29uZmlndXJlLmxvZworZWNobyBURVNUID0gJFRFU1QgPj4gY29uZmlndXJlLmxvZworZWNobyBWRVIgPSAkVkVSID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gWl9VNCA9ICRaX1U0ID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gZXhlY19wcmVmaXggPSAkZXhlY19wcmVmaXggPj4gY29uZmlndXJlLmxvZworZWNobyBpbmNsdWRlZGlyID0gJGluY2x1ZGVkaXIgPj4gY29uZmlndXJlLmxvZworZWNobyBsaWJkaXIgPSAkbGliZGlyID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gbWFuZGlyID0gJG1hbmRpciA+PiBjb25maWd1cmUubG9nCitlY2hvIHByZWZpeCA9ICRwcmVmaXggPj4gY29uZmlndXJlLmxvZworZWNobyBzaGFyZWRsaWJkaXIgPSAkc2hhcmVkbGliZGlyID4+IGNvbmZpZ3VyZS5sb2cKK2VjaG8gdW5hbWUgPSAkdW5hbWUgPj4gY29uZmlndXJlLmxvZwogCi1ybSAtZiAkdGVzdC5bY29dICR0ZXN0ICR0ZXN0JHNoYXJlZF9leHQKLQotIyB1ZHBhdGUgTWFrZWZpbGUKKyMgdWRwYXRlIE1ha2VmaWxlIHdpdGggdGhlIGNvbmZpZ3VyZSByZXN1bHRzCiBzZWQgPCBNYWtlZmlsZS5pbiAiCiAvXkNDICo9L3MjPS4qIz0kQ0MjCiAvXkNGTEFHUyAqPS9zIz0uKiM9JENGTEFHUyMKLS9eQ1BQICo9L3MjPS4qIz0kQ1BQIworL15TRkxBR1MgKj0vcyM9LiojPSRTRkxBR1MjCisvXkxERkxBR1MgKj0vcyM9LiojPSRMREZMQUdTIwogL15MRFNIQVJFRCAqPS9zIz0uKiM9JExEU0hBUkVEIwotL15MSUJTICo9L3MjPS4qIz0kTElCUyMKKy9eQ1BQICo9L3MjPS4qIz0kQ1BQIworL15TVEFUSUNMSUIgKj0vcyM9LiojPSRTVEFUSUNMSUIjCiAvXlNIQVJFRExJQiAqPS9zIz0uKiM9JFNIQVJFRExJQiMKIC9eU0hBUkVETElCViAqPS9zIz0uKiM9JFNIQVJFRExJQlYjCiAvXlNIQVJFRExJQk0gKj0vcyM9LiojPSRTSEFSRURMSUJNIwogL15BUiAqPS9zIz0uKiM9JEFSIworL15BUkZMQUdTICo9L3MjPS4qIz0kQVJGTEFHUyMKKy9eUkFOTElCICo9L3MjPS4qIz0kUkFOTElCIworL15MRENPTkZJRyAqPS9zIz0uKiM9JExEQ09ORklHIworL15MRFNIQVJFRExJQkMgKj0vcyM9LiojPSRMRFNIQVJFRExJQkMjCisvXkVYRSAqPS9zIz0uKiM9JEVYRSMKKy9ecHJlZml4ICo9L3MjPS4qIz0kcHJlZml4IworL15leGVjX3ByZWZpeCAqPS9zIz0uKiM9JGV4ZWNfcHJlZml4IworL15saWJkaXIgKj0vcyM9LiojPSRsaWJkaXIjCisvXnNoYXJlZGxpYmRpciAqPS9zIz0uKiM9JHNoYXJlZGxpYmRpciMKKy9eaW5jbHVkZWRpciAqPS9zIz0uKiM9JGluY2x1ZGVkaXIjCisvXm1hbmRpciAqPS9zIz0uKiM9JG1hbmRpciMKKy9eT0JKQyAqPS9zIz0uKiM9ICRPQkpDIworL15QSUNfT0JKQyAqPS9zIz0uKiM9ICRQSUNfT0JKQyMKKy9eYWxsOiAqL3MjOi4qIzogJEFMTCMKKy9edGVzdDogKi9zIzouKiM6ICRURVNUIworIiA+IE1ha2VmaWxlCisKKyMgY3JlYXRlIHpsaWIucGMgd2l0aCB0aGUgY29uZmlndXJlIHJlc3VsdHMKK3NlZCA8IHpsaWIucGMuaW4gIgorL15DQyAqPS9zIz0uKiM9JENDIworL15DRkxBR1MgKj0vcyM9LiojPSRDRkxBR1MjCisvXkNQUCAqPS9zIz0uKiM9JENQUCMKKy9eTERTSEFSRUQgKj0vcyM9LiojPSRMRFNIQVJFRCMKKy9eU1RBVElDTElCICo9L3MjPS4qIz0kU1RBVElDTElCIworL15TSEFSRURMSUIgKj0vcyM9LiojPSRTSEFSRURMSUIjCisvXlNIQVJFRExJQlYgKj0vcyM9LiojPSRTSEFSRURMSUJWIworL15TSEFSRURMSUJNICo9L3MjPS4qIz0kU0hBUkVETElCTSMKKy9eQVIgKj0vcyM9LiojPSRBUiMKKy9eQVJGTEFHUyAqPS9zIz0uKiM9JEFSRkxBR1MjCiAvXlJBTkxJQiAqPS9zIz0uKiM9JFJBTkxJQiMKIC9eRVhFICo9L3MjPS4qIz0kRVhFIwogL15wcmVmaXggKj0vcyM9LiojPSRwcmVmaXgjCiAvXmV4ZWNfcHJlZml4ICo9L3MjPS4qIz0kZXhlY19wcmVmaXgjCiAvXmxpYmRpciAqPS9zIz0uKiM9JGxpYmRpciMKKy9ec2hhcmVkbGliZGlyICo9L3MjPS4qIz0kc2hhcmVkbGliZGlyIwogL15pbmNsdWRlZGlyICo9L3MjPS4qIz0kaW5jbHVkZWRpciMKIC9ebWFuZGlyICo9L3MjPS4qIz0kbWFuZGlyIwogL15MREZMQUdTICo9L3MjPS4qIz0kTERGTEFHUyMKLSIgPiBNYWtlZmlsZQorIiB8IHNlZCAtZSAiCitzL1xAVkVSU0lPTlxALyRWRVIvZzsKKyIgPiB6bGliLnBjCisKKyMgZG9uZQorbGVhdmUgMApkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGliL2NyYzMyLmMgYi9Nb2R1bGVzL3psaWIvY3JjMzIuYwppbmRleCBmNjU4YTllLi45NzlhNzE5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWIvY3JjMzIuYworKysgYi9Nb2R1bGVzL3psaWIvY3JjMzIuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIGNyYzMyLmMgLS0gY29tcHV0ZSB0aGUgQ1JDLTMyIG9mIGEgZGF0YSBzdHJlYW0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA2LCAyMDEwLCAyMDExLCAyMDEyIE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqCiAgKiBUaGFua3MgdG8gUm9kbmV5IEJyb3duIDxyYnJvd242NEBjc2MuY29tLmF1PiBmb3IgaGlzIGNvbnRyaWJ1dGlvbiBvZiBmYXN0ZXIKQEAgLTE3LDYgKzE3LDggQEAKICAgb2YgdGhlIGNyYyB0YWJsZXMuICBUaGVyZWZvcmUsIGlmIHlvdSAjZGVmaW5lIERZTkFNSUNfQ1JDX1RBQkxFLCB5b3Ugc2hvdWxkCiAgIGZpcnN0IGNhbGwgZ2V0X2NyY190YWJsZSgpIHRvIGluaXRpYWxpemUgdGhlIHRhYmxlcyBiZWZvcmUgYWxsb3dpbmcgbW9yZSB0aGFuCiAgIG9uZSB0aHJlYWQgdG8gdXNlIGNyYzMyKCkuCisKKyAgRFlOQU1JQ19DUkNfVEFCTEUgYW5kIE1BS0VDUkNIIGNhbiBiZSAjZGVmaW5lZCB0byB3cml0ZSBvdXQgY3JjMzIuaC4KICAqLwogCiAjaWZkZWYgTUFLRUNSQ0gKQEAgLTMwLDMxICszMiwxMSBAQAogCiAjZGVmaW5lIGxvY2FsIHN0YXRpYwogCi0vKiBGaW5kIGEgZm91ci1ieXRlIGludGVnZXIgdHlwZSBmb3IgY3JjMzJfbGl0dGxlKCkgYW5kIGNyYzMyX2JpZygpLiAqLwotI2lmbmRlZiBOT0JZRk9VUgotIyAgaWZkZWYgU1REQyAgICAgICAgICAgLyogbmVlZCBBTlNJIEMgbGltaXRzLmggdG8gZGV0ZXJtaW5lIHNpemVzICovCi0jICAgIGluY2x1ZGUgPGxpbWl0cy5oPgotIyAgICBkZWZpbmUgQllGT1VSCi0jICAgIGlmIChVSU5UX01BWCA9PSAweGZmZmZmZmZmVUwpCi0gICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdTQ7Ci0jICAgIGVsc2UKLSMgICAgICBpZiAoVUxPTkdfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSAgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB1NDsKLSMgICAgICBlbHNlCi0jICAgICAgICBpZiAoVVNIUlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSAgICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1NDsKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgdW5kZWYgQllGT1VSICAgICAvKiBjYW4ndCBmaW5kIGEgZm91ci1ieXRlIGludGVnZXIgdHlwZSEgKi8KLSMgICAgICAgIGVuZGlmCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmIC8qIFNUREMgKi8KLSNlbmRpZiAvKiAhTk9CWUZPVVIgKi8KLQogLyogRGVmaW5pdGlvbnMgZm9yIGRvaW5nIHRoZSBjcmMgZm91ciBkYXRhIGJ5dGVzIGF0IGEgdGltZS4gKi8KKyNpZiAhZGVmaW5lZChOT0JZRk9VUikgJiYgZGVmaW5lZChaX1U0KQorIyAgZGVmaW5lIEJZRk9VUgorI2VuZGlmCiAjaWZkZWYgQllGT1VSCi0jICBkZWZpbmUgUkVWKHcpICgoKHcpPj4yNCkrKCgodyk+PjgpJjB4ZmYwMCkrIFwKLSAgICAgICAgICAgICAgICAoKCh3KSYweGZmMDApPDw4KSsoKCh3KSYweGZmKTw8MjQpKQogICAgbG9jYWwgdW5zaWduZWQgbG9uZyBjcmMzMl9saXR0bGUgT0YoKHVuc2lnbmVkIGxvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOwogICAgbG9jYWwgdW5zaWduZWQgbG9uZyBjcmMzMl9iaWcgT0YoKHVuc2lnbmVkIGxvbmcsCkBAIC02OCwxNCArNTAsMTYgQEAKIGxvY2FsIHVuc2lnbmVkIGxvbmcgZ2YyX21hdHJpeF90aW1lcyBPRigodW5zaWduZWQgbG9uZyAqbWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHZlYykpOwogbG9jYWwgdm9pZCBnZjJfbWF0cml4X3NxdWFyZSBPRigodW5zaWduZWQgbG9uZyAqc3F1YXJlLCB1bnNpZ25lZCBsb25nICptYXQpKTsKK2xvY2FsIHVMb25nIGNyYzMyX2NvbWJpbmVfIE9GKCh1TG9uZyBjcmMxLCB1TG9uZyBjcmMyLCB6X29mZjY0X3QgbGVuMikpOworCiAKICNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQogCiBsb2NhbCB2b2xhdGlsZSBpbnQgY3JjX3RhYmxlX2VtcHR5ID0gMTsKLWxvY2FsIHVuc2lnbmVkIGxvbmcgRkFSIGNyY190YWJsZVtUQkxTXVsyNTZdOworbG9jYWwgel9jcmNfdCBGQVIgY3JjX3RhYmxlW1RCTFNdWzI1Nl07CiBsb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlIE9GKCh2b2lkKSk7CiAjaWZkZWYgTUFLRUNSQ0gKLSAgIGxvY2FsIHZvaWQgd3JpdGVfdGFibGUgT0YoKEZJTEUgKiwgY29uc3QgdW5zaWduZWQgbG9uZyBGQVIgKikpOworICAgbG9jYWwgdm9pZCB3cml0ZV90YWJsZSBPRigoRklMRSAqLCBjb25zdCB6X2NyY190IEZBUiAqKSk7CiAjZW5kaWYgLyogTUFLRUNSQ0ggKi8KIC8qCiAgIEdlbmVyYXRlIHRhYmxlcyBmb3IgYSBieXRlLXdpc2UgMzItYml0IENSQyBjYWxjdWxhdGlvbiBvbiB0aGUgcG9seW5vbWlhbDoKQEAgLTEwNSw5ICs4OSw5IEBACiAqLwogbG9jYWwgdm9pZCBtYWtlX2NyY190YWJsZSgpCiB7Ci0gICAgdW5zaWduZWQgbG9uZyBjOworICAgIHpfY3JjX3QgYzsKICAgICBpbnQgbiwgazsKLSAgICB1bnNpZ25lZCBsb25nIHBvbHk7ICAgICAgICAgICAgICAgICAvKiBwb2x5bm9taWFsIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuICovCisgICAgel9jcmNfdCBwb2x5OyAgICAgICAgICAgICAgICAgICAgICAgLyogcG9seW5vbWlhbCBleGNsdXNpdmUtb3IgcGF0dGVybiAqLwogICAgIC8qIHRlcm1zIG9mIHBvbHlub21pYWwgZGVmaW5pbmcgdGhpcyBjcmMgKGV4Y2VwdCB4XjMyKTogKi8KICAgICBzdGF0aWMgdm9sYXRpbGUgaW50IGZpcnN0ID0gMTsgICAgICAvKiBmbGFnIHRvIGxpbWl0IGNvbmN1cnJlbnQgbWFraW5nICovCiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcFtdID0gezAsMSwyLDQsNSw3LDgsMTAsMTEsMTIsMTYsMjIsMjMsMjZ9OwpAQCAtMTE5LDEzICsxMDMsMTMgQEAKICAgICAgICAgZmlyc3QgPSAwOwogCiAgICAgICAgIC8qIG1ha2UgZXhjbHVzaXZlLW9yIHBhdHRlcm4gZnJvbSBwb2x5bm9taWFsICgweGVkYjg4MzIwVUwpICovCi0gICAgICAgIHBvbHkgPSAwVUw7Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCBzaXplb2YocCkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOyBuKyspCi0gICAgICAgICAgICBwb2x5IHw9IDFVTCA8PCAoMzEgLSBwW25dKTsKKyAgICAgICAgcG9seSA9IDA7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCAoaW50KShzaXplb2YocCkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsgbisrKQorICAgICAgICAgICAgcG9seSB8PSAoel9jcmNfdCkxIDw8ICgzMSAtIHBbbl0pOwogCiAgICAgICAgIC8qIGdlbmVyYXRlIGEgY3JjIGZvciBldmVyeSA4LWJpdCB2YWx1ZSAqLwogICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspIHsKLSAgICAgICAgICAgIGMgPSAodW5zaWduZWQgbG9uZyluOworICAgICAgICAgICAgYyA9ICh6X2NyY190KW47CiAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKQogICAgICAgICAgICAgICAgIGMgPSBjICYgMSA/IHBvbHkgXiAoYyA+PiAxKSA6IGMgPj4gMTsKICAgICAgICAgICAgIGNyY190YWJsZVswXVtuXSA9IGM7CkBAIC0xMzYsMTEgKzEyMCwxMSBAQAogICAgICAgICAgICBhbmQgdGhlbiB0aGUgYnl0ZSByZXZlcnNhbCBvZiB0aG9zZSBhcyB3ZWxsIGFzIHRoZSBmaXJzdCB0YWJsZSAqLwogICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspIHsKICAgICAgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bbl07Ci0gICAgICAgICAgICBjcmNfdGFibGVbNF1bbl0gPSBSRVYoYyk7CisgICAgICAgICAgICBjcmNfdGFibGVbNF1bbl0gPSBaU1dBUDMyKGMpOwogICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IDQ7IGsrKykgewogICAgICAgICAgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bYyAmIDB4ZmZdIF4gKGMgPj4gOCk7CiAgICAgICAgICAgICAgICAgY3JjX3RhYmxlW2tdW25dID0gYzsKLSAgICAgICAgICAgICAgICBjcmNfdGFibGVbayArIDRdW25dID0gUkVWKGMpOworICAgICAgICAgICAgICAgIGNyY190YWJsZVtrICsgNF1bbl0gPSBaU1dBUDMyKGMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAjZW5kaWYgLyogQllGT1VSICovCkBAIC0xNjIsNyArMTQ2LDcgQEAKICAgICAgICAgaWYgKG91dCA9PSBOVUxMKSByZXR1cm47CiAgICAgICAgIGZwcmludGYob3V0LCAiLyogY3JjMzIuaCAtLSB0YWJsZXMgZm9yIHJhcGlkIENSQyBjYWxjdWxhdGlvblxuIik7CiAgICAgICAgIGZwcmludGYob3V0LCAiICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY3JjMzIuY1xuICovXG5cbiIpOwotICAgICAgICBmcHJpbnRmKG91dCwgImxvY2FsIGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICIpOworICAgICAgICBmcHJpbnRmKG91dCwgImxvY2FsIGNvbnN0IHpfY3JjX3QgRkFSICIpOwogICAgICAgICBmcHJpbnRmKG91dCwgImNyY190YWJsZVtUQkxTXVsyNTZdID1cbntcbiAge1xuIik7CiAgICAgICAgIHdyaXRlX3RhYmxlKG91dCwgY3JjX3RhYmxlWzBdKTsKICMgIGlmZGVmIEJZRk9VUgpAQCAtMTgyLDEyICsxNjYsMTMgQEAKICNpZmRlZiBNQUtFQ1JDSAogbG9jYWwgdm9pZCB3cml0ZV90YWJsZShvdXQsIHRhYmxlKQogICAgIEZJTEUgKm91dDsKLSAgICBjb25zdCB1bnNpZ25lZCBsb25nIEZBUiAqdGFibGU7CisgICAgY29uc3Qgel9jcmNfdCBGQVIgKnRhYmxlOwogewogICAgIGludCBuOwogCiAgICAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKQotICAgICAgICBmcHJpbnRmKG91dCwgIiVzMHglMDhseFVMJXMiLCBuICUgNSA/ICIiIDogIiAgICAiLCB0YWJsZVtuXSwKKyAgICAgICAgZnByaW50ZihvdXQsICIlczB4JTA4bHhVTCVzIiwgbiAlIDUgPyAiIiA6ICIgICAgIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykodGFibGVbbl0pLAogICAgICAgICAgICAgICAgIG4gPT0gMjU1ID8gIlxuIiA6IChuICUgNSA9PSA0ID8gIixcbiIgOiAiLCAiKSk7CiB9CiAjZW5kaWYgLyogTUFLRUNSQ0ggKi8KQEAgLTIwMiwxMyArMTg3LDEzIEBACiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IGFzbSB2ZXJzaW9ucyBvZiBjcmMzMigpCiAgKi8KLWNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlKCkKK2NvbnN0IHpfY3JjX3QgRkFSICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlKCkKIHsKICNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQogICAgIGlmIChjcmNfdGFibGVfZW1wdHkpCiAgICAgICAgIG1ha2VfY3JjX3RhYmxlKCk7CiAjZW5kaWYgLyogRFlOQU1JQ19DUkNfVEFCTEUgKi8KLSAgICByZXR1cm4gKGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSICopY3JjX3RhYmxlOworICAgIHJldHVybiAoY29uc3Qgel9jcmNfdCBGQVIgKiljcmNfdGFibGU7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTIxOSw3ICsyMDQsNyBAQAogdW5zaWduZWQgbG9uZyBaRVhQT1JUIGNyYzMyKGNyYywgYnVmLCBsZW4pCiAgICAgdW5zaWduZWQgbG9uZyBjcmM7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKLSAgICB1bnNpZ25lZCBsZW47CisgICAgdUludCBsZW47CiB7CiAgICAgaWYgKGJ1ZiA9PSBaX05VTEwpIHJldHVybiAwVUw7CiAKQEAgLTIzMCw3ICsyMTUsNyBAQAogCiAjaWZkZWYgQllGT1VSCiAgICAgaWYgKHNpemVvZih2b2lkICopID09IHNpemVvZihwdHJkaWZmX3QpKSB7Ci0gICAgICAgIHU0IGVuZGlhbjsKKyAgICAgICAgel9jcmNfdCBlbmRpYW47CiAKICAgICAgICAgZW5kaWFuID0gMTsKICAgICAgICAgaWYgKCooKHVuc2lnbmVkIGNoYXIgKikoJmVuZGlhbikpKQpAQCAtMjY0LDE3ICsyNDksMTcgQEAKICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmOwogICAgIHVuc2lnbmVkIGxlbjsKIHsKLSAgICByZWdpc3RlciB1NCBjOwotICAgIHJlZ2lzdGVyIGNvbnN0IHU0IEZBUiAqYnVmNDsKKyAgICByZWdpc3RlciB6X2NyY190IGM7CisgICAgcmVnaXN0ZXIgY29uc3Qgel9jcmNfdCBGQVIgKmJ1ZjQ7CiAKLSAgICBjID0gKHU0KWNyYzsKKyAgICBjID0gKHpfY3JjX3QpY3JjOwogICAgIGMgPSB+YzsKICAgICB3aGlsZSAobGVuICYmICgocHRyZGlmZl90KWJ1ZiAmIDMpKSB7CiAgICAgICAgIGMgPSBjcmNfdGFibGVbMF1bKGMgXiAqYnVmKyspICYgMHhmZl0gXiAoYyA+PiA4KTsKICAgICAgICAgbGVuLS07CiAgICAgfQogCi0gICAgYnVmNCA9IChjb25zdCB1NCBGQVIgKikoY29uc3Qgdm9pZCBGQVIgKilidWY7CisgICAgYnVmNCA9IChjb25zdCB6X2NyY190IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKICAgICB3aGlsZSAobGVuID49IDMyKSB7CiAgICAgICAgIERPTElUMzI7CiAgICAgICAgIGxlbiAtPSAzMjsKQEAgLTMwNCwxNyArMjg5LDE3IEBACiAgICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZjsKICAgICB1bnNpZ25lZCBsZW47CiB7Ci0gICAgcmVnaXN0ZXIgdTQgYzsKLSAgICByZWdpc3RlciBjb25zdCB1NCBGQVIgKmJ1ZjQ7CisgICAgcmVnaXN0ZXIgel9jcmNfdCBjOworICAgIHJlZ2lzdGVyIGNvbnN0IHpfY3JjX3QgRkFSICpidWY0OwogCi0gICAgYyA9IFJFVigodTQpY3JjKTsKKyAgICBjID0gWlNXQVAzMigoel9jcmNfdCljcmMpOwogICAgIGMgPSB+YzsKICAgICB3aGlsZSAobGVuICYmICgocHRyZGlmZl90KWJ1ZiAmIDMpKSB7CiAgICAgICAgIGMgPSBjcmNfdGFibGVbNF1bKGMgPj4gMjQpIF4gKmJ1ZisrXSBeIChjIDw8IDgpOwogICAgICAgICBsZW4tLTsKICAgICB9CiAKLSAgICBidWY0ID0gKGNvbnN0IHU0IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKKyAgICBidWY0ID0gKGNvbnN0IHpfY3JjX3QgRkFSICopKGNvbnN0IHZvaWQgRkFSICopYnVmOwogICAgIGJ1ZjQtLTsKICAgICB3aGlsZSAobGVuID49IDMyKSB7CiAgICAgICAgIERPQklHMzI7CkBAIC0zMzEsNyArMzE2LDcgQEAKICAgICAgICAgYyA9IGNyY190YWJsZVs0XVsoYyA+PiAyNCkgXiAqYnVmKytdIF4gKGMgPDwgOCk7CiAgICAgfSB3aGlsZSAoLS1sZW4pOwogICAgIGMgPSB+YzsKLSAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpKFJFVihjKSk7CisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKShaU1dBUDMyKGMpKTsKIH0KIAogI2VuZGlmIC8qIEJZRk9VUiAqLwpAQCAtMzY3LDIyICszNTIsMjIgQEAKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lKGNyYzEsIGNyYzIsIGxlbjIpCitsb2NhbCB1TG9uZyBjcmMzMl9jb21iaW5lXyhjcmMxLCBjcmMyLCBsZW4yKQogICAgIHVMb25nIGNyYzE7CiAgICAgdUxvbmcgY3JjMjsKLSAgICB6X29mZl90IGxlbjI7CisgICAgel9vZmY2NF90IGxlbjI7CiB7CiAgICAgaW50IG47CiAgICAgdW5zaWduZWQgbG9uZyByb3c7CiAgICAgdW5zaWduZWQgbG9uZyBldmVuW0dGMl9ESU1dOyAgICAvKiBldmVuLXBvd2VyLW9mLXR3byB6ZXJvcyBvcGVyYXRvciAqLwogICAgIHVuc2lnbmVkIGxvbmcgb2RkW0dGMl9ESU1dOyAgICAgLyogb2RkLXBvd2VyLW9mLXR3byB6ZXJvcyBvcGVyYXRvciAqLwogCi0gICAgLyogZGVnZW5lcmF0ZSBjYXNlICovCi0gICAgaWYgKGxlbjIgPT0gMCkKKyAgICAvKiBkZWdlbmVyYXRlIGNhc2UgKGFsc28gZGlzYWxsb3cgbmVnYXRpdmUgbGVuZ3RocykgKi8KKyAgICBpZiAobGVuMiA8PSAwKQogICAgICAgICByZXR1cm4gY3JjMTsKIAogICAgIC8qIHB1dCBvcGVyYXRvciBmb3Igb25lIHplcm8gYml0IGluIG9kZCAqLwotICAgIG9kZFswXSA9IDB4ZWRiODgzMjBMOyAgICAgICAgICAgLyogQ1JDLTMyIHBvbHlub21pYWwgKi8KKyAgICBvZGRbMF0gPSAweGVkYjg4MzIwVUw7ICAgICAgICAgIC8qIENSQy0zMiBwb2x5bm9taWFsICovCiAgICAgcm93ID0gMTsKICAgICBmb3IgKG4gPSAxOyBuIDwgR0YyX0RJTTsgbisrKSB7CiAgICAgICAgIG9kZFtuXSA9IHJvdzsKQEAgLTQyMSwzICs0MDYsMjAgQEAKICAgICBjcmMxIF49IGNyYzI7CiAgICAgcmV0dXJuIGNyYzE7CiB9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZShjcmMxLCBjcmMyLCBsZW4yKQorICAgIHVMb25nIGNyYzE7CisgICAgdUxvbmcgY3JjMjsKKyAgICB6X29mZl90IGxlbjI7Cit7CisgICAgcmV0dXJuIGNyYzMyX2NvbWJpbmVfKGNyYzEsIGNyYzIsIGxlbjIpOworfQorCit1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmU2NChjcmMxLCBjcmMyLCBsZW4yKQorICAgIHVMb25nIGNyYzE7CisgICAgdUxvbmcgY3JjMjsKKyAgICB6X29mZjY0X3QgbGVuMjsKK3sKKyAgICByZXR1cm4gY3JjMzJfY29tYmluZV8oY3JjMSwgY3JjMiwgbGVuMik7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvY3JjMzIuaCBiL01vZHVsZXMvemxpYi9jcmMzMi5oCmluZGV4IDgwNTNiNjEuLjllMGM3NzggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi9jcmMzMi5oCisrKyBiL01vZHVsZXMvemxpYi9jcmMzMi5oCkBAIC0yLDcgKzIsNyBAQAogICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY3JjMzIuYwogICovCiAKLWxvY2FsIGNvbnN0IHVuc2lnbmVkIGxvbmcgRkFSIGNyY190YWJsZVtUQkxTXVsyNTZdID0KK2xvY2FsIGNvbnN0IHpfY3JjX3QgRkFSIGNyY190YWJsZVtUQkxTXVsyNTZdID0KIHsKICAgewogICAgIDB4MDAwMDAwMDBVTCwgMHg3NzA3MzA5NlVMLCAweGVlMGU2MTJjVUwsIDB4OTkwOTUxYmFVTCwgMHgwNzZkYzQxOVVMLApkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGliL2RlZmxhdGUuYyBiL01vZHVsZXMvemxpYi9kZWZsYXRlLmMKaW5kZXggNGM2ZGYwMC4uNjk2OTU3NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL2RlZmxhdGUuYworKysgYi9Nb2R1bGVzL3psaWIvZGVmbGF0ZS5jCkBAIC0xLDUgKzEsNSBAQAogLyogZGVmbGF0ZS5jIC0tIGNvbXByZXNzIGRhdGEgdXNpbmcgdGhlIGRlZmxhdGlvbiBhbGdvcml0aG0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKi8KIApAQCAtMzcsNyArMzcsNyBAQAogICogIFJFRkVSRU5DRVMKICAqCiAgKiAgICAgIERldXRzY2gsIEwuUC4sIkRFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KLSAqICAgICAgQXZhaWxhYmxlIGluIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTEudHh0CisgKiAgICAgIEF2YWlsYWJsZSBpbiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUxCiAgKgogICogICAgICBBIGRlc2NyaXB0aW9uIG9mIHRoZSBSYWJpbiBhbmQgS2FycCBhbGdvcml0aG0gaXMgZ2l2ZW4gaW4gdGhlIGJvb2sKICAqICAgICAgICAgIkFsZ29yaXRobXMiIGJ5IFIuIFNlZGdld2ljaywgQWRkaXNvbi1XZXNsZXksIHAyNTIuCkBAIC01Miw3ICs1Miw3IEBACiAjaW5jbHVkZSAiZGVmbGF0ZS5oIgogCiBjb25zdCBjaGFyIGRlZmxhdGVfY29weXJpZ2h0W10gPQotICAgIiBkZWZsYXRlIDEuMi4zIENvcHlyaWdodCAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseSAiOworICAgIiBkZWZsYXRlIDEuMi44IENvcHlyaWdodCAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlciAiOwogLyoKICAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQogICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90CkBAIC03OSwxOSArNzksMTggQEAKICNpZm5kZWYgRkFTVEVTVAogbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zbG93ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOwogI2VuZGlmCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3JsZSAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Citsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2h1ZmYgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7CiBsb2NhbCB2b2lkIGxtX2luaXQgICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7CiBsb2NhbCB2b2lkIHB1dFNob3J0TVNCICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB1SW50IGIpKTsKIGxvY2FsIHZvaWQgZmx1c2hfcGVuZGluZyAgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CiBsb2NhbCBpbnQgcmVhZF9idWYgICAgICAgIE9GKCh6X3N0cmVhbXAgc3RybSwgQnl0ZWYgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkpOwotI2lmbmRlZiBGQVNURVNUCiAjaWZkZWYgQVNNVgogICAgICAgdm9pZCBtYXRjaF9pbml0IE9GKCh2b2lkKSk7IC8qIGFzbSBjb2RlIGluaXRpYWxpemF0aW9uICovCiAgICAgICB1SW50IGxvbmdlc3RfbWF0Y2ggIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIGN1cl9tYXRjaCkpOwogI2Vsc2UKIGxvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaCAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7CiAjZW5kaWYKLSNlbmRpZgotbG9jYWwgdUludCBsb25nZXN0X21hdGNoX2Zhc3QgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7CiAKICNpZmRlZiBERUJVRwogbG9jYWwgIHZvaWQgY2hlY2tfbWF0Y2ggT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsCkBAIC0xMTAsMTEgKzEwOSw2IEBACiAjZW5kaWYKIC8qIE1hdGNoZXMgb2YgbGVuZ3RoIDMgYXJlIGRpc2NhcmRlZCBpZiB0aGVpciBkaXN0YW5jZSBleGNlZWRzIFRPT19GQVIgKi8KIAotI2RlZmluZSBNSU5fTE9PS0FIRUFEIChNQVhfTUFUQ0grTUlOX01BVENIKzEpCi0vKiBNaW5pbXVtIGFtb3VudCBvZiBsb29rYWhlYWQsIGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgotICogU2VlIGRlZmxhdGUuYyBmb3IgY29tbWVudHMgYWJvdXQgdGhlIE1JTl9NQVRDSCsxLgotICovCi0KIC8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvbgogICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvCiAgKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmUKQEAgLTE2MSw5ICsxNTUsMTIgQEAKIHN0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3Mge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCiAjZW5kaWYKIAorLyogcmFuayBaX0JMT0NLIGJldHdlZW4gWl9OT19GTFVTSCBhbmQgWl9QQVJUSUFMX0ZMVVNIICovCisjZGVmaW5lIFJBTksoZikgKCgoZikgPDwgMSkgLSAoKGYpID4gNCA/IDkgOiAwKSkKKwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBVcGRhdGUgYSBoYXNoIHZhbHVlIHdpdGggdGhlIGdpdmVuIGlucHV0IGJ5dGUKLSAqIElOICBhc3NlcnRpb246IGFsbCBjYWxscyB0byBVUERBVEVfSEFTSCBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gVVBEQVRFX0hBU0ggYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQogICogICAgaW5wdXQgY2hhcmFjdGVycywgc28gdGhhdCBhIHJ1bm5pbmcgaGFzaCBrZXkgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlCiAgKiAgICBwcmV2aW91cyBrZXkgaW5zdGVhZCBvZiBjb21wbGV0ZSByZWNhbGN1bGF0aW9uIGVhY2ggdGltZS4KICAqLwpAQCAtMTc2LDcgKzE3Myw3IEBACiAgKiB0aGUgcHJldmlvdXMgbGVuZ3RoIG9mIHRoZSBoYXNoIGNoYWluLgogICogSWYgdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggLURGQVNURVNULCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgZm9yY2VkCiAgKiB0byAxLCBhbmQgbm8gaGFzaCBjaGFpbnMgYXJlIG1haW50YWluZWQuCi0gKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCiAgKiAgICBpbnB1dCBjaGFyYWN0ZXJzIGFuZCB0aGUgZmlyc3QgTUlOX01BVENIIGJ5dGVzIG9mIHN0ciBhcmUgdmFsaWQKICAqICAgIChleGNlcHQgZm9yIHRoZSBsYXN0IE1JTl9NQVRDSC0xIGJ5dGVzIG9mIHRoZSBpbnB1dCBmaWxlKS4KICAqLwpAQCAtMjQxLDEwICsyMzgsMTkgQEAKIAogICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKICAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyNpZmRlZiBaX1NPTE8KKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKICAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKICAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworI2VuZGlmCiAgICAgfQotICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApIHN0cm0tPnpmcmVlID0gemNmcmVlOworICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisjaWZkZWYgWl9TT0xPCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgICAgIHN0cm0tPnpmcmVlID0gemNmcmVlOworI2VuZGlmCiAKICNpZmRlZiBGQVNURVNUCiAgICAgaWYgKGxldmVsICE9IDApIGxldmVsID0gMTsKQEAgLTI4OCw2ICsyOTQsOCBAQAogICAgIHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0Moc3RybSwgcy0+d19zaXplLCBzaXplb2YoUG9zKSk7CiAgICAgcy0+aGVhZCAgID0gKFBvc2YgKikgIFpBTExPQyhzdHJtLCBzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKIAorICAgIHMtPmhpZ2hfd2F0ZXIgPSAwOyAgICAgIC8qIG5vdGhpbmcgd3JpdHRlbiB0byBzLT53aW5kb3cgeWV0ICovCisKICAgICBzLT5saXRfYnVmc2l6ZSA9IDEgPDwgKG1lbUxldmVsICsgNik7IC8qIDE2SyBlbGVtZW50cyBieSBkZWZhdWx0ICovCiAKICAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKHN0cm0sIHMtPmxpdF9idWZzaXplLCBzaXplb2YodXNoKSsyKTsKQEAgLTI5Nyw3ICszMDUsNyBAQAogICAgIGlmIChzLT53aW5kb3cgPT0gWl9OVUxMIHx8IHMtPnByZXYgPT0gWl9OVUxMIHx8IHMtPmhlYWQgPT0gWl9OVUxMIHx8CiAgICAgICAgIHMtPnBlbmRpbmdfYnVmID09IFpfTlVMTCkgewogICAgICAgICBzLT5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7Ci0gICAgICAgIHN0cm0tPm1zZyA9IChjaGFyKilFUlJfTVNHKFpfTUVNX0VSUk9SKTsKKyAgICAgICAgc3RybS0+bXNnID0gRVJSX01TRyhaX01FTV9FUlJPUik7CiAgICAgICAgIGRlZmxhdGVFbmQgKHN0cm0pOwogICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CiAgICAgfQpAQCAtMzE4LDQzICszMjYsNzAgQEAKICAgICB1SW50ICBkaWN0TGVuZ3RoOwogewogICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgdUludCBsZW5ndGggPSBkaWN0TGVuZ3RoOwotICAgIHVJbnQgbjsKLSAgICBJUG9zIGhhc2hfaGVhZCA9IDA7CisgICAgdUludCBzdHIsIG47CisgICAgaW50IHdyYXA7CisgICAgdW5zaWduZWQgYXZhaWw7CisgICAgel9jb25zdCB1bnNpZ25lZCBjaGFyICpuZXh0OwogCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBkaWN0aW9uYXJ5ID09IFpfTlVMTCB8fAotICAgICAgICBzdHJtLT5zdGF0ZS0+d3JhcCA9PSAyIHx8Ci0gICAgICAgIChzdHJtLT5zdGF0ZS0+d3JhcCA9PSAxICYmIHN0cm0tPnN0YXRlLT5zdGF0dXMgIT0gSU5JVF9TVEFURSkpCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBkaWN0aW9uYXJ5ID09IFpfTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKyAgICB3cmFwID0gcy0+d3JhcDsKKyAgICBpZiAod3JhcCA9PSAyIHx8ICh3cmFwID09IDEgJiYgcy0+c3RhdHVzICE9IElOSVRfU1RBVEUpIHx8IHMtPmxvb2thaGVhZCkKICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogCi0gICAgcyA9IHN0cm0tPnN0YXRlOwotICAgIGlmIChzLT53cmFwKQorICAgIC8qIHdoZW4gdXNpbmcgemxpYiB3cmFwcGVycywgY29tcHV0ZSBBZGxlci0zMiBmb3IgcHJvdmlkZWQgZGljdGlvbmFyeSAqLworICAgIGlmICh3cmFwID09IDEpCiAgICAgICAgIHN0cm0tPmFkbGVyID0gYWRsZXIzMihzdHJtLT5hZGxlciwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7CisgICAgcy0+d3JhcCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBhdm9pZCBjb21wdXRpbmcgQWRsZXItMzIgaW4gcmVhZF9idWYgKi8KIAotICAgIGlmIChsZW5ndGggPCBNSU5fTUFUQ0gpIHJldHVybiBaX09LOwotICAgIGlmIChsZW5ndGggPiBNQVhfRElTVChzKSkgewotICAgICAgICBsZW5ndGggPSBNQVhfRElTVChzKTsKLSAgICAgICAgZGljdGlvbmFyeSArPSBkaWN0TGVuZ3RoIC0gbGVuZ3RoOyAvKiB1c2UgdGhlIHRhaWwgb2YgdGhlIGRpY3Rpb25hcnkgKi8KKyAgICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi8KKyAgICBpZiAoZGljdExlbmd0aCA+PSBzLT53X3NpemUpIHsKKyAgICAgICAgaWYgKHdyYXAgPT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovCisgICAgICAgICAgICBDTEVBUl9IQVNIKHMpOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQgPSAwOworICAgICAgICAgICAgcy0+YmxvY2tfc3RhcnQgPSAwTDsKKyAgICAgICAgICAgIHMtPmluc2VydCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZGljdGlvbmFyeSArPSBkaWN0TGVuZ3RoIC0gcy0+d19zaXplOyAgLyogdXNlIHRoZSB0YWlsICovCisgICAgICAgIGRpY3RMZW5ndGggPSBzLT53X3NpemU7CiAgICAgfQotICAgIHptZW1jcHkocy0+d2luZG93LCBkaWN0aW9uYXJ5LCBsZW5ndGgpOwotICAgIHMtPnN0cnN0YXJ0ID0gbGVuZ3RoOwotICAgIHMtPmJsb2NrX3N0YXJ0ID0gKGxvbmcpbGVuZ3RoOwogCi0gICAgLyogSW5zZXJ0IGFsbCBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIChleGNlcHQgZm9yIHRoZSBsYXN0IHR3byBieXRlcykuCi0gICAgICogcy0+bG9va2FoZWFkIHN0YXlzIG51bGwsIHNvIHMtPmluc19oIHdpbGwgYmUgcmVjb21wdXRlZCBhdCB0aGUgbmV4dAotICAgICAqIGNhbGwgb2YgZmlsbF93aW5kb3cuCi0gICAgICovCi0gICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbMF07Ci0gICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1sxXSk7Ci0gICAgZm9yIChuID0gMDsgbiA8PSBsZW5ndGggLSBNSU5fTUFUQ0g7IG4rKykgewotICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIG4sIGhhc2hfaGVhZCk7CisgICAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi8KKyAgICBhdmFpbCA9IHN0cm0tPmF2YWlsX2luOworICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOworICAgIHN0cm0tPmF2YWlsX2luID0gZGljdExlbmd0aDsKKyAgICBzdHJtLT5uZXh0X2luID0gKHpfY29uc3QgQnl0ZWYgKilkaWN0aW9uYXJ5OworICAgIGZpbGxfd2luZG93KHMpOworICAgIHdoaWxlIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgIHN0ciA9IHMtPnN0cnN0YXJ0OworICAgICAgICBuID0gcy0+bG9va2FoZWFkIC0gKE1JTl9NQVRDSC0xKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOworI2lmbmRlZiBGQVNURVNUCisgICAgICAgICAgICBzLT5wcmV2W3N0ciAmIHMtPndfbWFza10gPSBzLT5oZWFkW3MtPmluc19oXTsKKyNlbmRpZgorICAgICAgICAgICAgcy0+aGVhZFtzLT5pbnNfaF0gPSAoUG9zKXN0cjsKKyAgICAgICAgICAgIHN0cisrOworICAgICAgICB9IHdoaWxlICgtLW4pOworICAgICAgICBzLT5zdHJzdGFydCA9IHN0cjsKKyAgICAgICAgcy0+bG9va2FoZWFkID0gTUlOX01BVENILTE7CisgICAgICAgIGZpbGxfd2luZG93KHMpOwogICAgIH0KLSAgICBpZiAoaGFzaF9oZWFkKSBoYXNoX2hlYWQgPSAwOyAgLyogdG8gbWFrZSBjb21waWxlciBoYXBweSAqLworICAgIHMtPnN0cnN0YXJ0ICs9IHMtPmxvb2thaGVhZDsKKyAgICBzLT5ibG9ja19zdGFydCA9IChsb25nKXMtPnN0cnN0YXJ0OworICAgIHMtPmluc2VydCA9IHMtPmxvb2thaGVhZDsKKyAgICBzLT5sb29rYWhlYWQgPSAwOworICAgIHMtPm1hdGNoX2xlbmd0aCA9IHMtPnByZXZfbGVuZ3RoID0gTUlOX01BVENILTE7CisgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKKyAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsKKyAgICBzdHJtLT5hdmFpbF9pbiA9IGF2YWlsOworICAgIHMtPndyYXAgPSB3cmFwOwogICAgIHJldHVybiBaX09LOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlUmVzZXQgKHN0cm0pCitpbnQgWkVYUE9SVCBkZWZsYXRlUmVzZXRLZWVwIChzdHJtKQogICAgIHpfc3RyZWFtcCBzdHJtOwogewogICAgIGRlZmxhdGVfc3RhdGUgKnM7CkBAIC0zODQsMTIgKzQxOSwyMyBAQAogICAgIHMtPmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIOwogCiAgICAgX3RyX2luaXQocyk7Ci0gICAgbG1faW5pdChzKTsKIAogICAgIHJldHVybiBaX09LOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgWkVYUE9SVCBkZWZsYXRlUmVzZXQgKHN0cm0pCisgICAgel9zdHJlYW1wIHN0cm07Cit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7CisgICAgaWYgKHJldCA9PSBaX09LKQorICAgICAgICBsbV9pbml0KHN0cm0tPnN0YXRlKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiBpbnQgWkVYUE9SVCBkZWZsYXRlU2V0SGVhZGVyIChzdHJtLCBoZWFkKQogICAgIHpfc3RyZWFtcCBzdHJtOwogICAgIGd6X2hlYWRlcnAgaGVhZDsKQEAgLTQwMSwxNCArNDQ3LDQyIEBACiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCBaRVhQT1JUIGRlZmxhdGVQZW5kaW5nIChzdHJtLCBwZW5kaW5nLCBiaXRzKQorICAgIHVuc2lnbmVkICpwZW5kaW5nOworICAgIGludCAqYml0czsKKyAgICB6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgaWYgKHBlbmRpbmcgIT0gWl9OVUxMKQorICAgICAgICAqcGVuZGluZyA9IHN0cm0tPnN0YXRlLT5wZW5kaW5nOworICAgIGlmIChiaXRzICE9IFpfTlVMTCkKKyAgICAgICAgKmJpdHMgPSBzdHJtLT5zdGF0ZS0+YmlfdmFsaWQ7CisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIGludCBaRVhQT1JUIGRlZmxhdGVQcmltZSAoc3RybSwgYml0cywgdmFsdWUpCiAgICAgel9zdHJlYW1wIHN0cm07CiAgICAgaW50IGJpdHM7CiAgICAgaW50IHZhbHVlOwogeworICAgIGRlZmxhdGVfc3RhdGUgKnM7CisgICAgaW50IHB1dDsKKwogICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdHJtLT5zdGF0ZS0+YmlfdmFsaWQgPSBiaXRzOwotICAgIHN0cm0tPnN0YXRlLT5iaV9idWYgPSAodXNoKSh2YWx1ZSAmICgoMSA8PCBiaXRzKSAtIDEpKTsKKyAgICBzID0gc3RybS0+c3RhdGU7CisgICAgaWYgKChCeXRlZiAqKShzLT5kX2J1ZikgPCBzLT5wZW5kaW5nX291dCArICgoQnVmX3NpemUgKyA3KSA+PiAzKSkKKyAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOworICAgIGRvIHsKKyAgICAgICAgcHV0ID0gQnVmX3NpemUgLSBzLT5iaV92YWxpZDsKKyAgICAgICAgaWYgKHB1dCA+IGJpdHMpCisgICAgICAgICAgICBwdXQgPSBiaXRzOworICAgICAgICBzLT5iaV9idWYgfD0gKHVzaCkoKHZhbHVlICYgKCgxIDw8IHB1dCkgLSAxKSkgPDwgcy0+YmlfdmFsaWQpOworICAgICAgICBzLT5iaV92YWxpZCArPSBwdXQ7CisgICAgICAgIF90cl9mbHVzaF9iaXRzKHMpOworICAgICAgICB2YWx1ZSA+Pj0gcHV0OworICAgICAgICBiaXRzIC09IHB1dDsKKyAgICB9IHdoaWxlIChiaXRzKTsKICAgICByZXR1cm4gWl9PSzsKIH0KIApAQCAtNDM1LDkgKzUwOSwxMiBAQAogICAgIH0KICAgICBmdW5jID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYzsKIAotICAgIGlmIChmdW5jICE9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLmZ1bmMgJiYgc3RybS0+dG90YWxfaW4gIT0gMCkgeworICAgIGlmICgoc3RyYXRlZ3kgIT0gcy0+c3RyYXRlZ3kgfHwgZnVuYyAhPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5mdW5jKSAmJgorICAgICAgICBzdHJtLT50b3RhbF9pbiAhPSAwKSB7CiAgICAgICAgIC8qIEZsdXNoIHRoZSBsYXN0IGJ1ZmZlcjogKi8KLSAgICAgICAgZXJyID0gZGVmbGF0ZShzdHJtLCBaX1BBUlRJQUxfRkxVU0gpOworICAgICAgICBlcnIgPSBkZWZsYXRlKHN0cm0sIFpfQkxPQ0spOworICAgICAgICBpZiAoZXJyID09IFpfQlVGX0VSUk9SICYmIHMtPnBlbmRpbmcgPT0gMCkKKyAgICAgICAgICAgIGVyciA9IFpfT0s7CiAgICAgfQogICAgIGlmIChzLT5sZXZlbCAhPSBsZXZlbCkgewogICAgICAgICBzLT5sZXZlbCA9IGxldmVsOwpAQCAtNDgxLDMzICs1NTgsNjYgQEAKICAqIHJlc3VsdGluZyBmcm9tIHVzaW5nIGZpeGVkIGJsb2NrcyBpbnN0ZWFkIG9mIHN0b3JlZCBibG9ja3MsIHdoaWNoIGRlZmxhdGUKICAqIGNhbiBlbWl0IG9uIGNvbXByZXNzZWQgZGF0YSBmb3Igc29tZSBjb21iaW5hdGlvbnMgb2YgdGhlIHBhcmFtZXRlcnMuCiAgKgotICogVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3JlIHNvcGhpc3RpY2F0ZWQgdG8gcHJvdmlkZSBjbG9zZXIgdXBwZXIgYm91bmRzCi0gKiBmb3IgZXZlcnkgY29tYmluYXRpb24gb2Ygd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwsIGFzIHdlbGwgYXMgd3JhcC4KLSAqIEJ1dCBldmVuIHRoZSBjb25zZXJ2YXRpdmUgdXBwZXIgYm91bmQgb2YgYWJvdXQgMTQlIGV4cGFuc2lvbiBkb2VzIG5vdAotICogc2VlbSBvbmVyb3VzIGZvciBvdXRwdXQgYnVmZmVyIGFsbG9jYXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vcmUgc29waGlzdGljYXRlZCB0byBwcm92aWRlIGNsb3NlciB1cHBlciBib3VuZHMgZm9yCisgKiBldmVyeSBjb21iaW5hdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC4gIEJ1dCBldmVuIHRoZSBjb25zZXJ2YXRpdmUKKyAqIHVwcGVyIGJvdW5kIG9mIGFib3V0IDE0JSBleHBhbnNpb24gZG9lcyBub3Qgc2VlbSBvbmVyb3VzIGZvciBvdXRwdXQgYnVmZmVyCisgKiBhbGxvY2F0aW9uLgogICovCiB1TG9uZyBaRVhQT1JUIGRlZmxhdGVCb3VuZChzdHJtLCBzb3VyY2VMZW4pCiAgICAgel9zdHJlYW1wIHN0cm07CiAgICAgdUxvbmcgc291cmNlTGVuOwogewogICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgdUxvbmcgZGVzdExlbjsKKyAgICB1TG9uZyBjb21wbGVuLCB3cmFwbGVuOworICAgIEJ5dGVmICpzdHI7CiAKLSAgICAvKiBjb25zZXJ2YXRpdmUgdXBwZXIgYm91bmQgKi8KLSAgICBkZXN0TGVuID0gc291cmNlTGVuICsKLSAgICAgICAgICAgICAgKChzb3VyY2VMZW4gKyA3KSA+PiAzKSArICgoc291cmNlTGVuICsgNjMpID4+IDYpICsgMTE7CisgICAgLyogY29uc2VydmF0aXZlIHVwcGVyIGJvdW5kIGZvciBjb21wcmVzc2VkIGRhdGEgKi8KKyAgICBjb21wbGVuID0gc291cmNlTGVuICsKKyAgICAgICAgICAgICAgKChzb3VyY2VMZW4gKyA3KSA+PiAzKSArICgoc291cmNlTGVuICsgNjMpID4+IDYpICsgNTsKIAotICAgIC8qIGlmIGNhbid0IGdldCBwYXJhbWV0ZXJzLCByZXR1cm4gY29uc2VydmF0aXZlIGJvdW5kICovCisgICAgLyogaWYgY2FuJ3QgZ2V0IHBhcmFtZXRlcnMsIHJldHVybiBjb25zZXJ2YXRpdmUgYm91bmQgcGx1cyB6bGliIHdyYXBwZXIgKi8KICAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKQotICAgICAgICByZXR1cm4gZGVzdExlbjsKKyAgICAgICAgcmV0dXJuIGNvbXBsZW4gKyA2OworCisgICAgLyogY29tcHV0ZSB3cmFwcGVyIGxlbmd0aCAqLworICAgIHMgPSBzdHJtLT5zdGF0ZTsKKyAgICBzd2l0Y2ggKHMtPndyYXApIHsKKyAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmF3IGRlZmxhdGUgKi8KKyAgICAgICAgd3JhcGxlbiA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB6bGliIHdyYXBwZXIgKi8KKyAgICAgICAgd3JhcGxlbiA9IDYgKyAocy0+c3Ryc3RhcnQgPyA0IDogMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnemlwIHdyYXBwZXIgKi8KKyAgICAgICAgd3JhcGxlbiA9IDE4OworICAgICAgICBpZiAocy0+Z3poZWFkICE9IFpfTlVMTCkgeyAgICAgICAgICAvKiB1c2VyLXN1cHBsaWVkIGd6aXAgaGVhZGVyICovCisgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgd3JhcGxlbiArPSAyICsgcy0+Z3poZWFkLT5leHRyYV9sZW47CisgICAgICAgICAgICBzdHIgPSBzLT5nemhlYWQtPm5hbWU7CisgICAgICAgICAgICBpZiAoc3RyICE9IFpfTlVMTCkKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHdyYXBsZW4rKzsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICgqc3RyKyspOworICAgICAgICAgICAgc3RyID0gcy0+Z3poZWFkLT5jb21tZW50OworICAgICAgICAgICAgaWYgKHN0ciAhPSBaX05VTEwpCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB3cmFwbGVuKys7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoKnN0cisrKTsKKyAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMpCisgICAgICAgICAgICAgICAgd3JhcGxlbiArPSAyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgY29tcGlsZXIgaGFwcGluZXNzICovCisgICAgICAgIHdyYXBsZW4gPSA2OworICAgIH0KIAogICAgIC8qIGlmIG5vdCBkZWZhdWx0IHBhcmFtZXRlcnMsIHJldHVybiBjb25zZXJ2YXRpdmUgYm91bmQgKi8KLSAgICBzID0gc3RybS0+c3RhdGU7CiAgICAgaWYgKHMtPndfYml0cyAhPSAxNSB8fCBzLT5oYXNoX2JpdHMgIT0gOCArIDcpCi0gICAgICAgIHJldHVybiBkZXN0TGVuOworICAgICAgICByZXR1cm4gY29tcGxlbiArIHdyYXBsZW47CiAKICAgICAvKiBkZWZhdWx0IHNldHRpbmdzOiByZXR1cm4gdGlnaHQgYm91bmQgZm9yIHRoYXQgY2FzZSAqLwotICAgIHJldHVybiBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbik7CisgICAgcmV0dXJuIHNvdXJjZUxlbiArIChzb3VyY2VMZW4gPj4gMTIpICsgKHNvdXJjZUxlbiA+PiAxNCkgKworICAgICAgICAgICAoc291cmNlTGVuID4+IDI1KSArIDEzIC0gNiArIHdyYXBsZW47CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTUzMiwxOSArNjQyLDIyIEBACiBsb2NhbCB2b2lkIGZsdXNoX3BlbmRpbmcoc3RybSkKICAgICB6X3N0cmVhbXAgc3RybTsKIHsKLSAgICB1bnNpZ25lZCBsZW4gPSBzdHJtLT5zdGF0ZS0+cGVuZGluZzsKKyAgICB1bnNpZ25lZCBsZW47CisgICAgZGVmbGF0ZV9zdGF0ZSAqcyA9IHN0cm0tPnN0YXRlOwogCisgICAgX3RyX2ZsdXNoX2JpdHMocyk7CisgICAgbGVuID0gcy0+cGVuZGluZzsKICAgICBpZiAobGVuID4gc3RybS0+YXZhaWxfb3V0KSBsZW4gPSBzdHJtLT5hdmFpbF9vdXQ7CiAgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47CiAKLSAgICB6bWVtY3B5KHN0cm0tPm5leHRfb3V0LCBzdHJtLT5zdGF0ZS0+cGVuZGluZ19vdXQsIGxlbik7CisgICAgem1lbWNweShzdHJtLT5uZXh0X291dCwgcy0+cGVuZGluZ19vdXQsIGxlbik7CiAgICAgc3RybS0+bmV4dF9vdXQgICs9IGxlbjsKLSAgICBzdHJtLT5zdGF0ZS0+cGVuZGluZ19vdXQgICs9IGxlbjsKKyAgICBzLT5wZW5kaW5nX291dCAgKz0gbGVuOwogICAgIHN0cm0tPnRvdGFsX291dCArPSBsZW47CiAgICAgc3RybS0+YXZhaWxfb3V0ICAtPSBsZW47Ci0gICAgc3RybS0+c3RhdGUtPnBlbmRpbmcgLT0gbGVuOwotICAgIGlmIChzdHJtLT5zdGF0ZS0+cGVuZGluZyA9PSAwKSB7Ci0gICAgICAgIHN0cm0tPnN0YXRlLT5wZW5kaW5nX291dCA9IHN0cm0tPnN0YXRlLT5wZW5kaW5nX2J1ZjsKKyAgICBzLT5wZW5kaW5nIC09IGxlbjsKKyAgICBpZiAocy0+cGVuZGluZyA9PSAwKSB7CisgICAgICAgIHMtPnBlbmRpbmdfb3V0ID0gcy0+cGVuZGluZ19idWY7CiAgICAgfQogfQogCkBAIC01NTcsNyArNjcwLDcgQEAKICAgICBkZWZsYXRlX3N0YXRlICpzOwogCiAgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fAotICAgICAgICBmbHVzaCA+IFpfRklOSVNIIHx8IGZsdXNoIDwgMCkgeworICAgICAgICBmbHVzaCA+IFpfQkxPQ0sgfHwgZmx1c2ggPCAwKSB7CiAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICB9CiAgICAgcyA9IHN0cm0tPnN0YXRlOwpAQCAtNTgxLDcgKzY5NCw3IEBACiAgICAgICAgICAgICBwdXRfYnl0ZShzLCAzMSk7CiAgICAgICAgICAgICBwdXRfYnl0ZShzLCAxMzkpOwogICAgICAgICAgICAgcHV0X2J5dGUocywgOCk7Ci0gICAgICAgICAgICBpZiAocy0+Z3poZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChzLT5nemhlYWQgPT0gWl9OVUxMKSB7CiAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7CiAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7CiAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgMCk7CkBAIC02MDgsNyArNzIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy0+bGV2ZWwgPCAyID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTsKICAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5nemhlYWQtPm9zICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+ZXh0cmEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmV4dHJhICE9IFpfTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5nemhlYWQtPmV4dHJhX2xlbiAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAocy0+Z3poZWFkLT5leHRyYV9sZW4gPj4gOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICB9CkBAIC02NTAsNyArNzYzLDcgQEAKICAgICB9CiAjaWZkZWYgR1pJUAogICAgIGlmIChzLT5zdGF0dXMgPT0gRVhUUkFfU1RBVEUpIHsKLSAgICAgICAgaWYgKHMtPmd6aGVhZC0+ZXh0cmEgIT0gTlVMTCkgeworICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBaX05VTEwpIHsKICAgICAgICAgICAgIHVJbnQgYmVnID0gcy0+cGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi8KIAogICAgICAgICAgICAgd2hpbGUgKHMtPmd6aW5kZXggPCAocy0+Z3poZWFkLT5leHRyYV9sZW4gJiAweGZmZmYpKSB7CkBAIC02NzgsNyArNzkxLDcgQEAKICAgICAgICAgICAgIHMtPnN0YXR1cyA9IE5BTUVfU1RBVEU7CiAgICAgfQogICAgIGlmIChzLT5zdGF0dXMgPT0gTkFNRV9TVEFURSkgewotICAgICAgICBpZiAocy0+Z3poZWFkLT5uYW1lICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHMtPmd6aGVhZC0+bmFtZSAhPSBaX05VTEwpIHsKICAgICAgICAgICAgIHVJbnQgYmVnID0gcy0+cGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi8KICAgICAgICAgICAgIGludCB2YWw7CiAKQEAgLTcwOSw3ICs4MjIsNyBAQAogICAgICAgICAgICAgcy0+c3RhdHVzID0gQ09NTUVOVF9TVEFURTsKICAgICB9CiAgICAgaWYgKHMtPnN0YXR1cyA9PSBDT01NRU5UX1NUQVRFKSB7Ci0gICAgICAgIGlmIChzLT5nemhlYWQtPmNvbW1lbnQgIT0gTlVMTCkgeworICAgICAgICBpZiAocy0+Z3poZWFkLT5jb21tZW50ICE9IFpfTlVMTCkgewogICAgICAgICAgICAgdUludCBiZWcgPSBzLT5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLwogICAgICAgICAgICAgaW50IHZhbDsKIApAQCAtNzcxLDcgKzg4NCw3IEBACiAgICAgICogZmx1c2hlcy4gRm9yIHJlcGVhdGVkIGFuZCB1c2VsZXNzIGNhbGxzIHdpdGggWl9GSU5JU0gsIHdlIGtlZXAKICAgICAgKiByZXR1cm5pbmcgWl9TVFJFQU1fRU5EIGluc3RlYWQgb2YgWl9CVUZfRVJST1IuCiAgICAgICovCi0gICAgfSBlbHNlIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwICYmIGZsdXNoIDw9IG9sZF9mbHVzaCAmJgorICAgIH0gZWxzZSBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBSQU5LKGZsdXNoKSA8PSBSQU5LKG9sZF9mbHVzaCkgJiYKICAgICAgICAgICAgICAgIGZsdXNoICE9IFpfRklOSVNIKSB7CiAgICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOwogICAgIH0KQEAgLTc4Nyw3ICs5MDAsOSBAQAogICAgICAgICAoZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBzLT5zdGF0dXMgIT0gRklOSVNIX1NUQVRFKSkgewogICAgICAgICBibG9ja19zdGF0ZSBic3RhdGU7CiAKLSAgICAgICAgYnN0YXRlID0gKCooY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYykpKHMsIGZsdXNoKTsKKyAgICAgICAgYnN0YXRlID0gcy0+c3RyYXRlZ3kgPT0gWl9IVUZGTUFOX09OTFkgPyBkZWZsYXRlX2h1ZmYocywgZmx1c2gpIDoKKyAgICAgICAgICAgICAgICAgICAgKHMtPnN0cmF0ZWd5ID09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICgqKGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLmZ1bmMpKShzLCBmbHVzaCkpOwogCiAgICAgICAgIGlmIChic3RhdGUgPT0gZmluaXNoX3N0YXJ0ZWQgfHwgYnN0YXRlID09IGZpbmlzaF9kb25lKSB7CiAgICAgICAgICAgICBzLT5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7CkBAIC04MDgsMTMgKzkyMywxOCBAQAogICAgICAgICBpZiAoYnN0YXRlID09IGJsb2NrX2RvbmUpIHsKICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX1BBUlRJQUxfRkxVU0gpIHsKICAgICAgICAgICAgICAgICBfdHJfYWxpZ24ocyk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmx1c2ggIT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi8KICAgICAgICAgICAgICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIChjaGFyKikwLCAwTCwgMCk7CiAgICAgICAgICAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWQKICAgICAgICAgICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLgogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX0ZVTExfRkxVU0gpIHsKICAgICAgICAgICAgICAgICAgICAgQ0xFQVJfSEFTSChzKTsgICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zdGFydCA9IDBMOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5zZXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CkBAIC05MDksMTIgKzEwMjksMTIgQEAKIAogICAgIHNzID0gc291cmNlLT5zdGF0ZTsKIAotICAgIHptZW1jcHkoZGVzdCwgc291cmNlLCBzaXplb2Yoel9zdHJlYW0pKTsKKyAgICB6bWVtY3B5KCh2b2lkcGYpZGVzdCwgKHZvaWRwZilzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOwogCiAgICAgZHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0MoZGVzdCwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKICAgICBpZiAoZHMgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CiAgICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKSBkczsKLSAgICB6bWVtY3B5KGRzLCBzcywgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICB6bWVtY3B5KCh2b2lkcGYpZHMsICh2b2lkcGYpc3MsIHNpemVvZihkZWZsYXRlX3N0YXRlKSk7CiAgICAgZHMtPnN0cm0gPSBkZXN0OwogCiAgICAgZHMtPndpbmRvdyA9IChCeXRlZiAqKSBaQUxMT0MoZGVzdCwgZHMtPndfc2l6ZSwgMipzaXplb2YoQnl0ZSkpOwpAQCAtOTMwLDggKzEwNTAsOCBAQAogICAgIH0KICAgICAvKiBmb2xsb3dpbmcgem1lbWNweSBkbyBub3Qgd29yayBmb3IgMTYtYml0IE1TRE9TICovCiAgICAgem1lbWNweShkcy0+d2luZG93LCBzcy0+d2luZG93LCBkcy0+d19zaXplICogMiAqIHNpemVvZihCeXRlKSk7Ci0gICAgem1lbWNweShkcy0+cHJldiwgc3MtPnByZXYsIGRzLT53X3NpemUgKiBzaXplb2YoUG9zKSk7Ci0gICAgem1lbWNweShkcy0+aGVhZCwgc3MtPmhlYWQsIGRzLT5oYXNoX3NpemUgKiBzaXplb2YoUG9zKSk7CisgICAgem1lbWNweSgodm9pZHBmKWRzLT5wcmV2LCAodm9pZHBmKXNzLT5wcmV2LCBkcy0+d19zaXplICogc2l6ZW9mKFBvcykpOworICAgIHptZW1jcHkoKHZvaWRwZilkcy0+aGVhZCwgKHZvaWRwZilzcy0+aGVhZCwgZHMtPmhhc2hfc2l6ZSAqIHNpemVvZihQb3MpKTsKICAgICB6bWVtY3B5KGRzLT5wZW5kaW5nX2J1Ziwgc3MtPnBlbmRpbmdfYnVmLCAodUludClkcy0+cGVuZGluZ19idWZfc2l6ZSk7CiAKICAgICBkcy0+cGVuZGluZ19vdXQgPSBkcy0+cGVuZGluZ19idWYgKyAoc3MtPnBlbmRpbmdfb3V0IC0gc3MtPnBlbmRpbmdfYnVmKTsKQEAgLTk2NSwxNSArMTA4NSwxNSBAQAogCiAgICAgc3RybS0+YXZhaWxfaW4gIC09IGxlbjsKIAorICAgIHptZW1jcHkoYnVmLCBzdHJtLT5uZXh0X2luLCBsZW4pOwogICAgIGlmIChzdHJtLT5zdGF0ZS0+d3JhcCA9PSAxKSB7Ci0gICAgICAgIHN0cm0tPmFkbGVyID0gYWRsZXIzMihzdHJtLT5hZGxlciwgc3RybS0+bmV4dF9pbiwgbGVuKTsKKyAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKHN0cm0tPmFkbGVyLCBidWYsIGxlbik7CiAgICAgfQogI2lmZGVmIEdaSVAKICAgICBlbHNlIGlmIChzdHJtLT5zdGF0ZS0+d3JhcCA9PSAyKSB7Ci0gICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHN0cm0tPm5leHRfaW4sIGxlbik7CisgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIGJ1ZiwgbGVuKTsKICAgICB9CiAjZW5kaWYKLSAgICB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTsKICAgICBzdHJtLT5uZXh0X2luICArPSBsZW47CiAgICAgc3RybS0+dG90YWxfaW4gKz0gbGVuOwogCkBAIC0xMDAwLDYgKzExMjAsNyBAQAogICAgIHMtPnN0cnN0YXJ0ID0gMDsKICAgICBzLT5ibG9ja19zdGFydCA9IDBMOwogICAgIHMtPmxvb2thaGVhZCA9IDA7CisgICAgcy0+aW5zZXJ0ID0gMDsKICAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSC0xOwogICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CiAgICAgcy0+aW5zX2ggPSAwOwpAQCAtMTE2NywxMiArMTI4OCwxMyBAQAogICAgIHJldHVybiBzLT5sb29rYWhlYWQ7CiB9CiAjZW5kaWYgLyogQVNNViAqLwotI2VuZGlmIC8qIEZBU1RFU1QgKi8KKworI2Vsc2UgLyogRkFTVEVTVCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE9wdGltaXplZCB2ZXJzaW9uIGZvciBsZXZlbCA9PSAxIG9yIHN0cmF0ZWd5ID09IFpfUkxFIG9ubHkKKyAqIE9wdGltaXplZCB2ZXJzaW9uIGZvciBGQVNURVNUIG9ubHkKICAqLwotbG9jYWwgdUludCBsb25nZXN0X21hdGNoX2Zhc3QocywgY3VyX21hdGNoKQorbG9jYWwgdUludCBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkKICAgICBkZWZsYXRlX3N0YXRlICpzOwogICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLwogewpAQCAtMTIyNSw2ICsxMzQ3LDggQEAKICAgICByZXR1cm4gKHVJbnQpbGVuIDw9IHMtPmxvb2thaGVhZCA/ICh1SW50KWxlbiA6IHMtPmxvb2thaGVhZDsKIH0KIAorI2VuZGlmIC8qIEZBU1RFU1QgKi8KKwogI2lmZGVmIERFQlVHCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIENoZWNrIHRoYXQgdGhlIG1hdGNoIGF0IG1hdGNoX3N0YXJ0IGlzIGluZGVlZCBhIG1hdGNoLgpAQCAtMTI3MSw2ICsxMzk1LDggQEAKICAgICB1bnNpZ25lZCBtb3JlOyAgICAvKiBBbW91bnQgb2YgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3cuICovCiAgICAgdUludCB3c2l6ZSA9IHMtPndfc2l6ZTsKIAorICAgIEFzc2VydChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFELCAiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkIik7CisKICAgICBkbyB7CiAgICAgICAgIG1vcmUgPSAodW5zaWduZWQpKHMtPndpbmRvd19zaXplIC0odWxnKXMtPmxvb2thaGVhZCAtKHVsZylzLT5zdHJzdGFydCk7CiAKQEAgLTEzMDMsNyArMTQyOSw2IEBACiAgICAgICAgICAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2YKICAgICAgICAgICAgICAgIHpsaWIsIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBwYXRob2xvZ2ljYWwgY2FzZS4pCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICUlJSBhdm9pZCB0aGlzIHdoZW4gWl9STEUgKi8KICAgICAgICAgICAgIG4gPSBzLT5oYXNoX3NpemU7CiAgICAgICAgICAgICBwID0gJnMtPmhlYWRbbl07CiAgICAgICAgICAgICBkbyB7CkBAIC0xMzI0LDcgKzE0NDksNyBAQAogI2VuZGlmCiAgICAgICAgICAgICBtb3JlICs9IHdzaXplOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9pbiA9PSAwKSByZXR1cm47CisgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9pbiA9PSAwKSBicmVhazsKIAogICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzoKICAgICAgICAgICogICAgc3Ryc3RhcnQgPD0gV1NJWkUrTUFYX0RJU1QtMSAmJiBsb29rYWhlYWQgPD0gTUlOX0xPT0tBSEVBRCAtIDEgJiYKQEAgLTEzNDMsMzkgKzE0NjgsODggQEAKICAgICAgICAgcy0+bG9va2FoZWFkICs9IG47CiAKICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovCi0gICAgICAgIGlmIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7Ci0gICAgICAgICAgICBzLT5pbnNfaCA9IHMtPndpbmRvd1tzLT5zdHJzdGFydF07Ci0gICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0KzFdKTsKKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCArIHMtPmluc2VydCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIHVJbnQgc3RyID0gcy0+c3Ryc3RhcnQgLSBzLT5pbnNlcnQ7CisgICAgICAgICAgICBzLT5pbnNfaCA9IHMtPndpbmRvd1tzdHJdOworICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7CiAjaWYgTUlOX01BVENIICE9IDMKICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCiAjZW5kaWYKKyAgICAgICAgICAgIHdoaWxlIChzLT5pbnNlcnQpIHsKKyAgICAgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7CisjaWZuZGVmIEZBU1RFU1QKKyAgICAgICAgICAgICAgICBzLT5wcmV2W3N0ciAmIHMtPndfbWFza10gPSBzLT5oZWFkW3MtPmluc19oXTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHMtPmhlYWRbcy0+aW5zX2hdID0gKFBvcylzdHI7CisgICAgICAgICAgICAgICAgc3RyKys7CisgICAgICAgICAgICAgICAgcy0+aW5zZXJ0LS07CisgICAgICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCArIHMtPmluc2VydCA8IE1JTl9NQVRDSCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLyogSWYgdGhlIHdob2xlIGlucHV0IGhhcyBsZXNzIHRoYW4gTUlOX01BVENIIGJ5dGVzLCBpbnNfaCBpcyBnYXJiYWdlLAogICAgICAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuCiAgICAgICAgICAqLwogCiAgICAgfSB3aGlsZSAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLT5zdHJtLT5hdmFpbF9pbiAhPSAwKTsKKworICAgIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuCisgICAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mCisgICAgICogdGhlIHVzZSBvZiB1bmluaXRpYWxpemVkIChvciB1bmluaXRpYWxpc2VkIGFzIEp1bGlhbiB3cml0ZXMpIGJ5dGVzIGJ5CisgICAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHQKKyAgICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2gKKyAgICAgKiByb3V0aW5lcyBhbGxvdyBzY2FubmluZyB0byBzdHJzdGFydCArIE1BWF9NQVRDSCwgaWdub3JpbmcgbG9va2FoZWFkLgorICAgICAqLworICAgIGlmIChzLT5oaWdoX3dhdGVyIDwgcy0+d2luZG93X3NpemUpIHsKKyAgICAgICAgdWxnIGN1cnIgPSBzLT5zdHJzdGFydCArICh1bGcpKHMtPmxvb2thaGVhZCk7CisgICAgICAgIHVsZyBpbml0OworCisgICAgICAgIGlmIChzLT5oaWdoX3dhdGVyIDwgY3VycikgeworICAgICAgICAgICAgLyogUHJldmlvdXMgaGlnaCB3YXRlciBtYXJrIGJlbG93IGN1cnJlbnQgZGF0YSAtLSB6ZXJvIFdJTl9JTklUCisgICAgICAgICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gY3VycjsKKyAgICAgICAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpCisgICAgICAgICAgICAgICAgaW5pdCA9IFdJTl9JTklUOworICAgICAgICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgY3VyciwgKHVuc2lnbmVkKWluaXQpOworICAgICAgICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkgeworICAgICAgICAgICAgLyogSGlnaCB3YXRlciBtYXJrIGF0IG9yIGFib3ZlIGN1cnJlbnQgZGF0YSwgYnV0IGJlbG93IGN1cnJlbnQgZGF0YQorICAgICAgICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXAKKyAgICAgICAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyOworICAgICAgICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpCisgICAgICAgICAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjsKKyAgICAgICAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIHMtPmhpZ2hfd2F0ZXIsICh1bnNpZ25lZClpbml0KTsKKyAgICAgICAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCwKKyAgICAgICAgICAgIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoIik7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRmx1c2ggdGhlIGN1cnJlbnQgYmxvY2ssIHdpdGggZ2l2ZW4gZW5kLW9mLWZpbGUgZmxhZy4KICAqIElOIGFzc2VydGlvbjogc3Ryc3RhcnQgaXMgc2V0IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWF0Y2guCiAgKi8KLSNkZWZpbmUgRkxVU0hfQkxPQ0tfT05MWShzLCBlb2YpIHsgXAorI2RlZmluZSBGTFVTSF9CTE9DS19PTkxZKHMsIGxhc3QpIHsgXAogICAgX3RyX2ZsdXNoX2Jsb2NrKHMsIChzLT5ibG9ja19zdGFydCA+PSAwTCA/IFwKICAgICAgICAgICAgICAgICAgICAoY2hhcmYgKikmcy0+d2luZG93Wyh1bnNpZ25lZClzLT5ibG9ja19zdGFydF0gOiBcCiAgICAgICAgICAgICAgICAgICAgKGNoYXJmICopWl9OVUxMKSwgXAogICAgICAgICAgICAgICAgICh1bGcpKChsb25nKXMtPnN0cnN0YXJ0IC0gcy0+YmxvY2tfc3RhcnQpLCBcCi0gICAgICAgICAgICAgICAgKGVvZikpOyBcCisgICAgICAgICAgICAgICAgKGxhc3QpKTsgXAogICAgcy0+YmxvY2tfc3RhcnQgPSBzLT5zdHJzdGFydDsgXAogICAgZmx1c2hfcGVuZGluZyhzLT5zdHJtKTsgXAogICAgVHJhY2V2KChzdGRlcnIsIltGTFVTSF0iKSk7IFwKIH0KIAogLyogU2FtZSBidXQgZm9yY2UgcHJlbWF0dXJlIGV4aXQgaWYgbmVjZXNzYXJ5LiAqLwotI2RlZmluZSBGTFVTSF9CTE9DSyhzLCBlb2YpIHsgXAotICAgRkxVU0hfQkxPQ0tfT05MWShzLCBlb2YpOyBcCi0gICBpZiAocy0+c3RybS0+YXZhaWxfb3V0ID09IDApIHJldHVybiAoZW9mKSA/IGZpbmlzaF9zdGFydGVkIDogbmVlZF9tb3JlOyBcCisjZGVmaW5lIEZMVVNIX0JMT0NLKHMsIGxhc3QpIHsgXAorICAgRkxVU0hfQkxPQ0tfT05MWShzLCBsYXN0KTsgXAorICAgaWYgKHMtPnN0cm0tPmF2YWlsX291dCA9PSAwKSByZXR1cm4gKGxhc3QpID8gZmluaXNoX3N0YXJ0ZWQgOiBuZWVkX21vcmU7IFwKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xNDM0LDggKzE2MDgsMTQgQEAKICAgICAgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOwogICAgICAgICB9CiAgICAgfQotICAgIEZMVVNIX0JMT0NLKHMsIGZsdXNoID09IFpfRklOSVNIKTsKLSAgICByZXR1cm4gZmx1c2ggPT0gWl9GSU5JU0ggPyBmaW5pc2hfZG9uZSA6IGJsb2NrX2RvbmU7CisgICAgcy0+aW5zZXJ0ID0gMDsKKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpIHsKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMSk7CisgICAgICAgIHJldHVybiBmaW5pc2hfZG9uZTsKKyAgICB9CisgICAgaWYgKChsb25nKXMtPnN0cnN0YXJ0ID4gcy0+YmxvY2tfc3RhcnQpCisgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOworICAgIHJldHVybiBibG9ja19kb25lOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE0NDksNyArMTYyOSw3IEBACiAgICAgZGVmbGF0ZV9zdGF0ZSAqczsKICAgICBpbnQgZmx1c2g7CiB7Ci0gICAgSVBvcyBoYXNoX2hlYWQgPSBOSUw7IC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi8KKyAgICBJUG9zIGhhc2hfaGVhZDsgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqLwogICAgIGludCBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KIAogICAgIGZvciAoOzspIHsKQEAgLTE0NjksNiArMTY0OSw3IEBACiAgICAgICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGUKICAgICAgICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46CiAgICAgICAgICAqLworICAgICAgICBoYXNoX2hlYWQgPSBOSUw7CiAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CiAgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOwogICAgICAgICB9CkBAIC0xNDgxLDE5ICsxNjYyLDggQEAKICAgICAgICAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaAogICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLgogICAgICAgICAgICAgICovCi0jaWZkZWYgRkFTVEVTVAotICAgICAgICAgICAgaWYgKChzLT5zdHJhdGVneSAhPSBaX0hVRkZNQU5fT05MWSAmJiBzLT5zdHJhdGVneSAhPSBaX1JMRSkgfHwKLSAgICAgICAgICAgICAgICAocy0+c3RyYXRlZ3kgPT0gWl9STEUgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPT0gMSkpIHsKLSAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoX2Zhc3QgKHMsIGhhc2hfaGVhZCk7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZICYmIHMtPnN0cmF0ZWd5ICE9IFpfUkxFKSB7Ci0gICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3RyYXRlZ3kgPT0gWl9STEUgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPT0gMSkgewotICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2hfZmFzdCAocywgaGFzaF9oZWFkKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIG9yIGxvbmdlc3RfbWF0Y2hfZmFzdCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KKyAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2ggKHMsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqLwogICAgICAgICB9CiAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CiAgICAgICAgICAgICBjaGVja19tYXRjaChzLCBzLT5zdHJzdGFydCwgcy0+bWF0Y2hfc3RhcnQsIHMtPm1hdGNoX2xlbmd0aCk7CkBAIC0xNTQxLDggKzE3MTEsMTQgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoYmZsdXNoKSBGTFVTSF9CTE9DSyhzLCAwKTsKICAgICB9Ci0gICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOwotICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKKyAgICBzLT5pbnNlcnQgPSBzLT5zdHJzdGFydCA8IE1JTl9NQVRDSC0xID8gcy0+c3Ryc3RhcnQgOiBNSU5fTUFUQ0gtMTsKKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpIHsKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMSk7CisgICAgICAgIHJldHVybiBmaW5pc2hfZG9uZTsKKyAgICB9CisgICAgaWYgKHMtPmxhc3RfbGl0KQorICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICByZXR1cm4gYmxvY2tfZG9uZTsKIH0KIAogI2lmbmRlZiBGQVNURVNUCkBAIC0xNTU1LDcgKzE3MzEsNyBAQAogICAgIGRlZmxhdGVfc3RhdGUgKnM7CiAgICAgaW50IGZsdXNoOwogewotICAgIElQb3MgaGFzaF9oZWFkID0gTklMOyAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi8KKyAgICBJUG9zIGhhc2hfaGVhZDsgICAgICAgICAgLyogaGVhZCBvZiBoYXNoIGNoYWluICovCiAgICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLwogCiAgICAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovCkBAIC0xNTc2LDYgKzE3NTIsNyBAQAogICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCiAgICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgogICAgICAgICAgKi8KKyAgICAgICAgaGFzaF9oZWFkID0gTklMOwogICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgewogICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKICAgICAgICAgfQpAQCAtMTU5MSwxMiArMTc2OCw4IEBACiAgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKICAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZICYmIHMtPnN0cmF0ZWd5ICE9IFpfUkxFKSB7Ci0gICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3RyYXRlZ3kgPT0gWl9STEUgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPT0gMSkgewotICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2hfZmFzdCAocywgaGFzaF9oZWFkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBvciBsb25nZXN0X21hdGNoX2Zhc3QoKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoIChzLCBoYXNoX2hlYWQpOworICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KIAogICAgICAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA8PSA1ICYmIChzLT5zdHJhdGVneSA9PSBaX0ZJTFRFUkVECiAjaWYgVE9PX0ZBUiA8PSAzMjc2NwpAQCAtMTY2OSwxMiArMTg0MiwxNyBAQAogICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKICAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKICAgICB9Ci0gICAgRkxVU0hfQkxPQ0socywgZmx1c2ggPT0gWl9GSU5JU0gpOwotICAgIHJldHVybiBmbHVzaCA9PSBaX0ZJTklTSCA/IGZpbmlzaF9kb25lIDogYmxvY2tfZG9uZTsKKyAgICBzLT5pbnNlcnQgPSBzLT5zdHJzdGFydCA8IE1JTl9NQVRDSC0xID8gcy0+c3Ryc3RhcnQgOiBNSU5fTUFUQ0gtMTsKKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpIHsKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMSk7CisgICAgICAgIHJldHVybiBmaW5pc2hfZG9uZTsKKyAgICB9CisgICAgaWYgKHMtPmxhc3RfbGl0KQorICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKKyAgICByZXR1cm4gYmxvY2tfZG9uZTsKIH0KICNlbmRpZiAvKiBGQVNURVNUICovCiAKLSNpZiAwCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZQogICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mCkBAIC0xNjg0LDQzICsxODYyLDUyIEBACiAgICAgZGVmbGF0ZV9zdGF0ZSAqczsKICAgICBpbnQgZmx1c2g7CiB7Ci0gICAgaW50IGJmbHVzaDsgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KLSAgICB1SW50IHJ1bjsgICAgICAgICAgIC8qIGxlbmd0aCBvZiBydW4gKi8KLSAgICB1SW50IG1heDsgICAgICAgICAgIC8qIG1heGltdW0gbGVuZ3RoIG9mIHJ1biAqLwotICAgIHVJbnQgcHJldjsgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi8KLSAgICBCeXRlZiAqc2NhbjsgICAgICAgIC8qIHNjYW4gZm9yIGVuZCBvZiBydW4gKi8KKyAgICBpbnQgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KKyAgICB1SW50IHByZXY7ICAgICAgICAgICAgICAvKiBieXRlIGF0IGRpc3RhbmNlIG9uZSB0byBtYXRjaCAqLworICAgIEJ5dGVmICpzY2FuLCAqc3RyZW5kOyAgIC8qIHNjYW4gZ29lcyB1cCB0byBzdHJlbmQgZm9yIGxlbmd0aCBvZiBydW4gKi8KIAogICAgIGZvciAoOzspIHsKICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0CiAgICAgICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCi0gICAgICAgICAqIGZvciB0aGUgbG9uZ2VzdCBlbmNvZGFibGUgcnVuLgorICAgICAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuCiAgICAgICAgICAqLwotICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUFYX01BVENIKSB7CisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPD0gTUFYX01BVENIKSB7CiAgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKLSAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNQVhfTUFUQ0ggJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgeworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8PSBNQVhfTUFUQ0ggJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgewogICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLwogICAgICAgICB9CiAKICAgICAgICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi8KLSAgICAgICAgcnVuID0gMDsKLSAgICAgICAgaWYgKHMtPnN0cnN0YXJ0ID4gMCkgeyAgICAgIC8qIGlmIHRoZXJlIGlzIGEgcHJldmlvdXMgYnl0ZSwgdGhhdCBpcyAqLwotICAgICAgICAgICAgbWF4ID0gcy0+bG9va2FoZWFkIDwgTUFYX01BVENIID8gcy0+bG9va2FoZWFkIDogTUFYX01BVENIOworICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLT5zdHJzdGFydCA+IDApIHsKICAgICAgICAgICAgIHNjYW4gPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCAtIDE7Ci0gICAgICAgICAgICBwcmV2ID0gKnNjYW4rKzsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoKnNjYW4rKyAhPSBwcmV2KQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gd2hpbGUgKCsrcnVuIDwgbWF4KTsKKyAgICAgICAgICAgIHByZXYgPSAqc2NhbjsKKyAgICAgICAgICAgIGlmIChwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbikgeworICAgICAgICAgICAgICAgIHN0cmVuZCA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgTUFYX01BVENIOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKGludCkoc3RyZW5kIC0gc2Nhbik7CisgICAgICAgICAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA+IHMtPmxvb2thaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gcy0+bG9va2FoZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqLwotICAgICAgICBpZiAocnVuID49IE1JTl9NQVRDSCkgewotICAgICAgICAgICAgY2hlY2tfbWF0Y2gocywgcy0+c3Ryc3RhcnQsIHMtPnN0cnN0YXJ0IC0gMSwgcnVuKTsKLSAgICAgICAgICAgIF90cl90YWxseV9kaXN0KHMsIDEsIHJ1biAtIE1JTl9NQVRDSCwgYmZsdXNoKTsKLSAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBydW47Ci0gICAgICAgICAgICBzLT5zdHJzdGFydCArPSBydW47CisgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBjaGVja19tYXRjaChzLCBzLT5zdHJzdGFydCwgcy0+c3Ryc3RhcnQgLSAxLCBzLT5tYXRjaF9sZW5ndGgpOworCisgICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLT5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7CisKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5tYXRjaF9sZW5ndGg7CisgICAgICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5tYXRjaF9sZW5ndGg7CisgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLwogICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKQEAgLTE3MzAsNyArMTkxNyw1MSBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOwogICAgIH0KLSAgICBGTFVTSF9CTE9DSyhzLCBmbHVzaCA9PSBaX0ZJTklTSCk7Ci0gICAgcmV0dXJuIGZsdXNoID09IFpfRklOSVNIID8gZmluaXNoX2RvbmUgOiBibG9ja19kb25lOworICAgIHMtPmluc2VydCA9IDA7CisgICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7CisgICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOworICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7CisgICAgfQorICAgIGlmIChzLT5sYXN0X2xpdCkKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgcmV0dXJuIGJsb2NrX2RvbmU7CiB9Ci0jZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGb3IgWl9IVUZGTUFOX09OTFksIGRvIG5vdCBsb29rIGZvciBtYXRjaGVzLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4KKyAqIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIEh1ZmZtYW4uKQorICovCitsb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2h1ZmYocywgZmx1c2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBpbnQgZmx1c2g7Cit7CisgICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSBsaXRlcmFsIHRvIHdyaXRlLiAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIHsKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfTk9fRkxVU0gpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLworICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOworICAgICAgICBfdHJfdGFsbHlfbGl0IChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdLCBiZmx1c2gpOworICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7CisgICAgfQorICAgIHMtPmluc2VydCA9IDA7CisgICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7CisgICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOworICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7CisgICAgfQorICAgIGlmIChzLT5sYXN0X2xpdCkKKyAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7CisgICAgcmV0dXJuIGJsb2NrX2RvbmU7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvZGVmbGF0ZS5oIGIvTW9kdWxlcy96bGliL2RlZmxhdGUuaAppbmRleCAwNWE1YWIzLi5jZTAyOTllIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWIvZGVmbGF0ZS5oCisrKyBiL01vZHVsZXMvemxpYi9kZWZsYXRlLmgKQEAgLTEsNSArMSw1IEBACiAvKiBkZWZsYXRlLmggLS0gaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IEplYW4tbG91cCBHYWlsbHkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCkBAIC00OCw2ICs0OCw5IEBACiAjZGVmaW5lIE1BWF9CSVRTIDE1CiAvKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi8KIAorI2RlZmluZSBCdWZfc2l6ZSAxNgorLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqLworCiAjZGVmaW5lIElOSVRfU1RBVEUgICAgNDIKICNkZWZpbmUgRVhUUkFfU1RBVEUgICA2OQogI2RlZmluZSBOQU1FX1NUQVRFICAgIDczCkBAIC0xMDEsNyArMTA0LDcgQEAKICAgICBpbnQgICB3cmFwOyAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovCiAgICAgZ3pfaGVhZGVycCAgZ3poZWFkOyAgLyogZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gdG8gd3JpdGUgKi8KICAgICB1SW50ICAgZ3ppbmRleDsgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqLwotICAgIEJ5dGUgIG1ldGhvZDsgICAgICAgIC8qIFNUT1JFRCAoZm9yIHppcCBvbmx5KSBvciBERUZMQVRFRCAqLworICAgIEJ5dGUgIG1ldGhvZDsgICAgICAgIC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovCiAgICAgaW50ICAgbGFzdF9mbHVzaDsgICAgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqLwogCiAgICAgICAgICAgICAgICAgLyogdXNlZCBieSBkZWZsYXRlLmM6ICovCkBAIC0xODgsNyArMTkxLDcgQEAKICAgICBpbnQgbmljZV9tYXRjaDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqLwogCiAgICAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqLwotICAgIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHJlc3MgY29tcGlsZXIgd2FybmluZyAqLworICAgIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi8KICAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovCiAgICAgc3RydWN0IGN0X2RhdGFfcyBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovCiAgICAgc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovCkBAIC0yNDQsNyArMjQ3LDcgQEAKICAgICB1bGcgb3B0X2xlbjsgICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi8KICAgICB1bGcgc3RhdGljX2xlbjsgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqLwogICAgIHVJbnQgbWF0Y2hlczsgICAgICAgLyogbnVtYmVyIG9mIHN0cmluZyBtYXRjaGVzIGluIGN1cnJlbnQgYmxvY2sgKi8KLSAgICBpbnQgbGFzdF9lb2JfbGVuOyAgIC8qIGJpdCBsZW5ndGggb2YgRU9CIGNvZGUgZm9yIGxhc3QgYmxvY2sgKi8KKyAgICB1SW50IGluc2VydDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi8KIAogI2lmZGVmIERFQlVHCiAgICAgdWxnIGNvbXByZXNzZWRfbGVuOyAvKiB0b3RhbCBiaXQgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZmlsZSBtb2QgMl4zMiAqLwpAQCAtMjYwLDYgKzI2MywxMyBAQAogICAgICAqIGFyZSBhbHdheXMgemVyby4KICAgICAgKi8KIAorICAgIHVsZyBoaWdoX3dhdGVyOworICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZQorICAgICAqIHRoaXMgYXJlIHNldCB0byB6ZXJvIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayB3YXJuaW5ncyB3aGVuCisgICAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW4KKyAgICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLgorICAgICAqLworCiB9IEZBUiBkZWZsYXRlX3N0YXRlOwogCiAvKiBPdXRwdXQgYSBieXRlIG9uIHRoZSBzdHJlYW0uCkBAIC0yNzgsMTQgKzI4OCwxOSBAQAogICogZGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIE1BWF9ESVNUIGluc3RlYWQgb2YgV1NJWkUuCiAgKi8KIAorI2RlZmluZSBXSU5fSU5JVCBNQVhfTUFUQ0gKKy8qIE51bWJlciBvZiBieXRlcyBhZnRlciBlbmQgb2YgZGF0YSBpbiB3aW5kb3cgdG8gaW5pdGlhbGl6ZSBpbiBvcmRlciB0byBhdm9pZAorICAgbWVtb3J5IGNoZWNrZXIgZXJyb3JzIGZyb20gbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyAqLworCiAgICAgICAgIC8qIGluIHRyZWVzLmMgKi8KLXZvaWQgX3RyX2luaXQgICAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwotaW50ICBfdHJfdGFsbHkgICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB1bnNpZ25lZCBkaXN0LCB1bnNpZ25lZCBsYykpOwotdm9pZCBfdHJfZmx1c2hfYmxvY2sgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjaGFyZiAqYnVmLCB1bGcgc3RvcmVkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVvZikpOwotdm9pZCBfdHJfYWxpZ24gICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci12b2lkIF90cl9zdG9yZWRfYmxvY2sgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsIHVsZyBzdG9yZWRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW9mKSk7Cit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2luaXQgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKK2ludCBaTElCX0lOVEVSTkFMIF90cl90YWxseSBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdW5zaWduZWQgZGlzdCwgdW5zaWduZWQgbGMpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfZmx1c2hfYmxvY2sgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB1bGcgc3RvcmVkX2xlbiwgaW50IGxhc3QpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfZmx1c2hfYml0cyBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwordm9pZCBaTElCX0lOVEVSTkFMIF90cl9hbGlnbiBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwordm9pZCBaTElCX0lOVEVSTkFMIF90cl9zdG9yZWRfYmxvY2sgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB1bGcgc3RvcmVkX2xlbiwgaW50IGxhc3QpKTsKIAogI2RlZmluZSBkX2NvZGUoZGlzdCkgXAogICAgKChkaXN0KSA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NisoKGRpc3QpPj43KV0pCkBAIC0yOTgsMTEgKzMxMywxMSBAQAogLyogSW5saW5lIHZlcnNpb25zIG9mIF90cl90YWxseSBmb3Igc3BlZWQ6ICovCiAKICNpZiBkZWZpbmVkKEdFTl9UUkVFU19IKSB8fCAhZGVmaW5lZChTVERDKQotICBleHRlcm4gdWNoIF9sZW5ndGhfY29kZVtdOwotICBleHRlcm4gdWNoIF9kaXN0X2NvZGVbXTsKKyAgZXh0ZXJuIHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtdOworICBleHRlcm4gdWNoIFpMSUJfSU5URVJOQUwgX2Rpc3RfY29kZVtdOwogI2Vsc2UKLSAgZXh0ZXJuIGNvbnN0IHVjaCBfbGVuZ3RoX2NvZGVbXTsKLSAgZXh0ZXJuIGNvbnN0IHVjaCBfZGlzdF9jb2RlW107CisgIGV4dGVybiBjb25zdCB1Y2ggWkxJQl9JTlRFUk5BTCBfbGVuZ3RoX2NvZGVbXTsKKyAgZXh0ZXJuIGNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9kaXN0X2NvZGVbXTsKICNlbmRpZgogCiAjIGRlZmluZSBfdHJfdGFsbHlfbGl0KHMsIGMsIGZsdXNoKSBcCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvZXhhbXBsZS5jIGIvTW9kdWxlcy96bGliL2V4YW1wbGUuYwppbmRleCA2YzhhMGVlLi4xMzhhNjk5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWIvZXhhbXBsZS5jCisrKyBiL01vZHVsZXMvemxpYi9leGFtcGxlLmMKQEAgLTEsMTIgKzEsMTIgQEAKIC8qIGV4YW1wbGUuYyAtLSB1c2FnZSBleGFtcGxlIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiwgMjAxMSBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKIC8qIEAoIykgJElkJCAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ6bGliLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KIAogI2lmZGVmIFNUREMKICMgIGluY2x1ZGUgPHN0cmluZy5oPgpAQCAtMjYsNyArMjYsNyBAQAogICAgIH0gXAogfQogCi1jb25zdCBjaGFyIGhlbGxvW10gPSAiaGVsbG8sIGhlbGxvISI7Cit6X2NvbnN0IGNoYXIgaGVsbG9bXSA9ICJoZWxsbywgaGVsbG8hIjsKIC8qICJoZWxsbyB3b3JsZCIgd291bGQgYmUgbW9yZSBzdGFuZGFyZCwgYnV0IHRoZSByZXBlYXRlZCAiaGVsbG8iCiAgKiBzdHJlc3NlcyB0aGUgY29tcHJlc3Npb24gY29kZSBiZXR0ZXIsIHNvcnJ5Li4uCiAgKi8KQEAgLTM0LDEwICszNCw2IEBACiBjb25zdCBjaGFyIGRpY3Rpb25hcnlbXSA9ICJoZWxsbyI7CiB1TG9uZyBkaWN0SWQ7IC8qIEFkbGVyMzIgdmFsdWUgb2YgdGhlIGRpY3Rpb25hcnkgKi8KIAotdm9pZCB0ZXN0X2NvbXByZXNzICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7Ci12b2lkIHRlc3RfZ3ppbyAgICAgICAgICBPRigoY29uc3QgY2hhciAqZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwogdm9pZCB0ZXN0X2RlZmxhdGUgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbikpOwogdm9pZCB0ZXN0X2luZmxhdGUgICAgICAgT0YoKEJ5dGUgKmNvbXByLCB1TG9uZyBjb21wckxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlICp1bmNvbXByLCB1TG9uZyB1bmNvbXByTGVuKSk7CkBAIC01Myw2ICs0OSwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKIGludCAgbWFpbiAgICAgICAgICAgICAgIE9GKChpbnQgYXJnYywgY2hhciAqYXJndltdKSk7CiAKKworI2lmZGVmIFpfU09MTworCit2b2lkICpteWFsbG9jIE9GKCh2b2lkICosIHVuc2lnbmVkLCB1bnNpZ25lZCkpOwordm9pZCBteWZyZWUgT0YoKHZvaWQgKiwgdm9pZCAqKSk7CisKK3ZvaWQgKm15YWxsb2MocSwgbiwgbSkKKyAgICB2b2lkICpxOworICAgIHVuc2lnbmVkIG4sIG07Cit7CisgICAgcSA9IFpfTlVMTDsKKyAgICByZXR1cm4gY2FsbG9jKG4sIG0pOworfQorCit2b2lkIG15ZnJlZSh2b2lkICpxLCB2b2lkICpwKQoreworICAgIHEgPSBaX05VTEw7CisgICAgZnJlZShwKTsKK30KKworc3RhdGljIGFsbG9jX2Z1bmMgemFsbG9jID0gbXlhbGxvYzsKK3N0YXRpYyBmcmVlX2Z1bmMgemZyZWUgPSBteWZyZWU7CisKKyNlbHNlIC8qICFaX1NPTE8gKi8KKworc3RhdGljIGFsbG9jX2Z1bmMgemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKK3N0YXRpYyBmcmVlX2Z1bmMgemZyZWUgPSAoZnJlZV9mdW5jKTA7CisKK3ZvaWQgdGVzdF9jb21wcmVzcyAgICAgIE9GKChCeXRlICpjb21wciwgdUxvbmcgY29tcHJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZSAqdW5jb21wciwgdUxvbmcgdW5jb21wckxlbikpOwordm9pZCB0ZXN0X2d6aW8gICAgICAgICAgT0YoKGNvbnN0IGNoYXIgKmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUgKnVuY29tcHIsIHVMb25nIHVuY29tcHJMZW4pKTsKKwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBUZXN0IGNvbXByZXNzKCkgYW5kIHVuY29tcHJlc3MoKQogICovCkBAIC0xNjMsNiArMTkyLDggQEAKICNlbmRpZgogfQogCisjZW5kaWYgLyogWl9TT0xPICovCisKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogVGVzdCBkZWZsYXRlKCkgd2l0aCBzbWFsbCBidWZmZXJzCiAgKi8KQEAgLTE3NCwxNCArMjA1LDE0IEBACiAgICAgaW50IGVycjsKICAgICB1TG9uZyBsZW4gPSAodUxvbmcpc3RybGVuKGhlbGxvKSsxOwogCi0gICAgY19zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBjX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBjX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7CisgICAgY19zdHJlYW0uemZyZWUgPSB6ZnJlZTsKICAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CiAKICAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7CiAgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7CiAKLSAgICBjX3N0cmVhbS5uZXh0X2luICA9IChCeXRlZiopaGVsbG87CisgICAgY19zdHJlYW0ubmV4dF9pbiAgPSAoel9jb25zdCB1bnNpZ25lZCBjaGFyICopaGVsbG87CiAgICAgY19zdHJlYW0ubmV4dF9vdXQgPSBjb21wcjsKIAogICAgIHdoaWxlIChjX3N0cmVhbS50b3RhbF9pbiAhPSBsZW4gJiYgY19zdHJlYW0udG90YWxfb3V0IDwgY29tcHJMZW4pIHsKQEAgLTIxMyw4ICsyNDQsOCBAQAogCiAgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOwogCi0gICAgZF9zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBkX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBkX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7CisgICAgZF9zdHJlYW0uemZyZWUgPSB6ZnJlZTsKICAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CiAKICAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOwpAQCAtMjUyLDggKzI4Myw4IEBACiAgICAgel9zdHJlYW0gY19zdHJlYW07IC8qIGNvbXByZXNzaW9uIHN0cmVhbSAqLwogICAgIGludCBlcnI7CiAKLSAgICBjX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIGNfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIGNfc3RyZWFtLnphbGxvYyA9IHphbGxvYzsKKyAgICBjX3N0cmVhbS56ZnJlZSA9IHpmcmVlOwogICAgIGNfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKIAogICAgIGVyciA9IGRlZmxhdGVJbml0KCZjX3N0cmVhbSwgWl9CRVNUX1NQRUVEKTsKQEAgLTMwOSw4ICszNDAsOCBAQAogCiAgICAgc3RyY3B5KChjaGFyKil1bmNvbXByLCAiZ2FyYmFnZSIpOwogCi0gICAgZF9zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBkX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBkX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7CisgICAgZF9zdHJlYW0uemZyZWUgPSB6ZnJlZTsKICAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CiAKICAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOwpAQCAtMzQ5LDE0ICszODAsMTQgQEAKICAgICBpbnQgZXJyOwogICAgIHVJbnQgbGVuID0gKHVJbnQpc3RybGVuKGhlbGxvKSsxOwogCi0gICAgY19zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBjX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBjX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7CisgICAgY19zdHJlYW0uemZyZWUgPSB6ZnJlZTsKICAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CiAKICAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7CiAgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7CiAKLSAgICBjX3N0cmVhbS5uZXh0X2luICA9IChCeXRlZiopaGVsbG87CisgICAgY19zdHJlYW0ubmV4dF9pbiAgPSAoel9jb25zdCB1bnNpZ25lZCBjaGFyICopaGVsbG87CiAgICAgY19zdHJlYW0ubmV4dF9vdXQgPSBjb21wcjsKICAgICBjX3N0cmVhbS5hdmFpbF9pbiA9IDM7CiAgICAgY19zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmNvbXByTGVuOwpAQCAtMzg4LDggKzQxOSw4IEBACiAKICAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7CiAKLSAgICBkX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIGRfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIGRfc3RyZWFtLnphbGxvYyA9IHphbGxvYzsKKyAgICBkX3N0cmVhbS56ZnJlZSA9IHpmcmVlOwogICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKIAogICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7CkBAIC00MzAsMjIgKzQ2MSwyMiBAQAogICAgIHpfc3RyZWFtIGNfc3RyZWFtOyAvKiBjb21wcmVzc2lvbiBzdHJlYW0gKi8KICAgICBpbnQgZXJyOwogCi0gICAgY19zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBjX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICBjX3N0cmVhbS56YWxsb2MgPSB6YWxsb2M7CisgICAgY19zdHJlYW0uemZyZWUgPSB6ZnJlZTsKICAgICBjX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CiAKICAgICBlcnIgPSBkZWZsYXRlSW5pdCgmY19zdHJlYW0sIFpfQkVTVF9DT01QUkVTU0lPTik7CiAgICAgQ0hFQ0tfRVJSKGVyciwgImRlZmxhdGVJbml0Iik7CiAKICAgICBlcnIgPSBkZWZsYXRlU2V0RGljdGlvbmFyeSgmY19zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEJ5dGVmKilkaWN0aW9uYXJ5LCBzaXplb2YoZGljdGlvbmFyeSkpOworICAgICAgICAgICAgICAgIChjb25zdCBCeXRlZiopZGljdGlvbmFyeSwgKGludClzaXplb2YoZGljdGlvbmFyeSkpOwogICAgIENIRUNLX0VSUihlcnIsICJkZWZsYXRlU2V0RGljdGlvbmFyeSIpOwogCiAgICAgZGljdElkID0gY19zdHJlYW0uYWRsZXI7CiAgICAgY19zdHJlYW0ubmV4dF9vdXQgPSBjb21wcjsKICAgICBjX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCljb21wckxlbjsKIAotICAgIGNfc3RyZWFtLm5leHRfaW4gPSAoQnl0ZWYqKWhlbGxvOworICAgIGNfc3RyZWFtLm5leHRfaW4gPSAoel9jb25zdCB1bnNpZ25lZCBjaGFyICopaGVsbG87CiAgICAgY19zdHJlYW0uYXZhaWxfaW4gPSAodUludClzdHJsZW4oaGVsbG8pKzE7CiAKICAgICBlcnIgPSBkZWZsYXRlKCZjX3N0cmVhbSwgWl9GSU5JU0gpOwpAQCAtNDY5LDggKzUwMCw4IEBACiAKICAgICBzdHJjcHkoKGNoYXIqKXVuY29tcHIsICJnYXJiYWdlIik7CiAKLSAgICBkX3N0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIGRfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOworICAgIGRfc3RyZWFtLnphbGxvYyA9IHphbGxvYzsKKyAgICBkX3N0cmVhbS56ZnJlZSA9IHpmcmVlOwogICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKIAogICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7CkBAIC00OTEsNyArNTIyLDcgQEAKICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJyID0gaW5mbGF0ZVNldERpY3Rpb25hcnkoJmRfc3RyZWFtLCAoY29uc3QgQnl0ZWYqKWRpY3Rpb25hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGljdGlvbmFyeSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzaXplb2YoZGljdGlvbmFyeSkpOwogICAgICAgICB9CiAgICAgICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlIHdpdGggZGljdCIpOwogICAgIH0KQEAgLTU0MCwxMCArNTcxLDE1IEBACiAgICAgICAgIHByaW50Zigib3V0IG9mIG1lbW9yeVxuIik7CiAgICAgICAgIGV4aXQoMSk7CiAgICAgfQorCisjaWZkZWYgWl9TT0xPCisgICAgYXJnYyA9IHN0cmxlbihhcmd2WzBdKTsKKyNlbHNlCiAgICAgdGVzdF9jb21wcmVzcyhjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwogCiAgICAgdGVzdF9nemlvKChhcmdjID4gMSA/IGFyZ3ZbMV0gOiBURVNURklMRSksCiAgICAgICAgICAgICAgIHVuY29tcHIsIHVuY29tcHJMZW4pOworI2VuZGlmCiAKICAgICB0ZXN0X2RlZmxhdGUoY29tcHIsIGNvbXByTGVuKTsKICAgICB0ZXN0X2luZmxhdGUoY29tcHIsIGNvbXByTGVuLCB1bmNvbXByLCB1bmNvbXByTGVuKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9nemNsb3NlLmMgYi9Nb2R1bGVzL3psaWIvZ3pjbG9zZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWI5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL3psaWIvZ3pjbG9zZS5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIGd6Y2xvc2UuYyAtLSB6bGliIGd6Y2xvc2UoKSBmdW5jdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDEwIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaW5jbHVkZSAiZ3pndXRzLmgiCisKKy8qIGd6Y2xvc2UoKSBpcyBpbiBhIHNlcGFyYXRlIGZpbGUgc28gdGhhdCBpdCBpcyBsaW5rZWQgaW4gb25seSBpZiBpdCBpcyB1c2VkLgorICAgVGhhdCB3YXkgdGhlIG90aGVyIGd6Y2xvc2UgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluc3RlYWQgdG8gYXZvaWQgbGlua2luZyBpbgorICAgdW5uZWVkZWQgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiByb3V0aW5lcy4gKi8KK2ludCBaRVhQT1JUIGd6Y2xvc2UoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyNpZm5kZWYgTk9fR1pDT01QUkVTUworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIHJldHVybiBzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEID8gZ3pjbG9zZV9yKGZpbGUpIDogZ3pjbG9zZV93KGZpbGUpOworI2Vsc2UKKyAgICByZXR1cm4gZ3pjbG9zZV9yKGZpbGUpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvZ3pndXRzLmggYi9Nb2R1bGVzL3psaWIvZ3pndXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3NjU5ZAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvemxpYi9nemd1dHMuaApAQCAtMCwwICsxLDIwOSBAQAorLyogZ3pndXRzLmggLS0gemxpYiBpbnRlcm5hbCBoZWFkZXIgZGVmaW5pdGlvbnMgZm9yIGd6KiBvcGVyYXRpb25zCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMTAsIDIwMTEsIDIwMTIsIDIwMTMgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpZmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFCisjICBpZm5kZWYgX0xBUkdFRklMRV9TT1VSQ0UKKyMgICAgZGVmaW5lIF9MQVJHRUZJTEVfU09VUkNFIDEKKyMgIGVuZGlmCisjICBpZmRlZiBfRklMRV9PRkZTRVRfQklUUworIyAgICB1bmRlZiBfRklMRV9PRkZTRVRfQklUUworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9ISURERU4KKyMgIGRlZmluZSBaTElCX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkgKCJoaWRkZW4iKSkpCisjZWxzZQorIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ6bGliLmgiCisjaWZkZWYgU1REQworIyAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgIGluY2x1ZGUgPGxpbWl0cy5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2lmZGVmIF9XSU4zMgorIyAgaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19UVVJCT0NfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfV0lOMzIpCisjICBpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNpZmRlZiBXSU5BUElfRkFNSUxZCisjICBkZWZpbmUgb3BlbiBfb3BlbgorIyAgZGVmaW5lIHJlYWQgX3JlYWQKKyMgIGRlZmluZSB3cml0ZSBfd3JpdGUKKyMgIGRlZmluZSBjbG9zZSBfY2xvc2UKKyNlbmRpZgorCisjaWZkZWYgTk9fREVGTEFURSAgICAgICAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBkZWZpbml0aW9uICovCisjICBkZWZpbmUgTk9fR1pDT01QUkVTUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUREM5OSkgfHwgKGRlZmluZWQoX19UVVJCT0NfXykgJiYgX19UVVJCT0NfXyA+PSAweDU1MCkKKyMgIGlmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgICBkZWZpbmUgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19DWUdXSU5fXykKKyMgIGlmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgICBkZWZpbmUgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoTVNET1MpICYmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAoQk9STEFOREMgPiAweDQxMCkKKyMgIGlmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgICBkZWZpbmUgSEFWRV9WU05QUklOVEYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgorIyAgaWZkZWYgTVNET1MKKy8qIHZzbnByaW50ZiBtYXkgZXhpc3Qgb24gc29tZSBNUy1ET1MgY29tcGlsZXJzIChESkdQUD8pLAorICAgYnV0IGZvciBub3cgd2UganVzdCBhc3N1bWUgaXQgZG9lc24ndC4gKi8KKyMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9fVFVSQk9DX18KKyMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgorIyAgZW5kaWYKKyMgIGlmZGVmIFdJTjMyCisvKiBJbiBXaW4zMiwgdnNucHJpbnRmIGlzIGF2YWlsYWJsZSBhcyB0aGUgIm5vbi1BTlNJIiBfdnNucHJpbnRmLiAqLworIyAgICBpZiAhZGVmaW5lZCh2c25wcmludGYpICYmICFkZWZpbmVkKE5PX3ZzbnByaW50ZikKKyMgICAgICBpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgKCBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE1MDAgKQorIyAgICAgICAgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorIyAgaWZkZWYgX19TQVNDCisjICAgIGRlZmluZSBOT192c25wcmludGYKKyMgIGVuZGlmCisjICBpZmRlZiBWTVMKKyMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9fT1M0MDBfXworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorIyAgaWZkZWYgX19NVlNfXworIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBlbmRpZgorI2VuZGlmCisKKy8qIHVubGlrZSBzbnByaW50ZiAod2hpY2ggaXMgcmVxdWlyZWQgaW4gQzk5LCB5ZXQgc3RpbGwgbm90IHN1cHBvcnRlZCBieQorICAgTWljcm9zb2Z0IG1vcmUgdGhhbiBhIGRlY2FkZSBsYXRlciEpLCBfc25wcmludGYgZG9lcyBub3QgZ3VhcmFudGVlIG51bGwKKyAgIHRlcm1pbmF0aW9uIG9mIHRoZSByZXN1bHQgLS0gaG93ZXZlciB0aGlzIGlzIG9ubHkgdXNlZCBpbiBnemxpYi5jIHdoZXJlCisgICB0aGUgcmVzdWx0IGlzIGFzc3VyZWQgdG8gZml0IGluIHRoZSBzcGFjZSBwcm92aWRlZCAqLworI2lmZGVmIF9NU0NfVkVSCisjICBkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworI2lmbmRlZiBsb2NhbAorIyAgZGVmaW5lIGxvY2FsIHN0YXRpYworI2VuZGlmCisvKiBjb21waWxlIHdpdGggLURsb2NhbCBpZiB5b3VyIGRlYnVnZ2VyIGNhbid0IGZpbmQgc3RhdGljIHN5bWJvbHMgKi8KKworLyogZ3oqIGZ1bmN0aW9ucyBhbHdheXMgdXNlIGxpYnJhcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMgKi8KKyNpZm5kZWYgU1REQworICBleHRlcm4gdm9pZHAgIG1hbGxvYyBPRigodUludCBzaXplKSk7CisgIGV4dGVybiB2b2lkICAgZnJlZSAgIE9GKCh2b2lkcGYgcHRyKSk7CisjZW5kaWYKKworLyogZ2V0IGVycm5vIGFuZCBzdHJlcnJvciBkZWZpbml0aW9uICovCisjaWYgZGVmaW5lZCBVTkRFUl9DRQorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgZGVmaW5lIHpzdHJlcnJvcigpIGd6X3N0cndpbmVycm9yKChEV09SRClHZXRMYXN0RXJyb3IoKSkKKyNlbHNlCisjICBpZm5kZWYgTk9fU1RSRVJST1IKKyMgICAgaW5jbHVkZSA8ZXJybm8uaD4KKyMgICAgZGVmaW5lIHpzdHJlcnJvcigpIHN0cmVycm9yKGVycm5vKQorIyAgZWxzZQorIyAgICBkZWZpbmUgenN0cmVycm9yKCkgInN0ZGlvIGVycm9yIChjb25zdWx0IGVycm5vKSIKKyMgIGVuZGlmCisjZW5kaWYKKworLyogcHJvdmlkZSBwcm90b3R5cGVzIGZvciB0aGVzZSB3aGVuIGJ1aWxkaW5nIHpsaWIgd2l0aG91dCBMRlMgKi8KKyNpZiAhZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSB8fCBfTEZTNjRfTEFSR0VGSUxFLTAgPT0gMAorICAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisgICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnenNlZWs2NCBPRigoZ3pGaWxlLCB6X29mZjY0X3QsIGludCkpOworICAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQgT0YoKGd6RmlsZSkpOworICAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pvZmZzZXQ2NCBPRigoZ3pGaWxlKSk7CisjZW5kaWYKKworLyogZGVmYXVsdCBtZW1MZXZlbCAqLworI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAorI2Vsc2UKKyMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCisjZW5kaWYKKworLyogZGVmYXVsdCBpL28gYnVmZmVyIHNpemUgLS0gZG91YmxlIHRoaXMgZm9yIG91dHB1dCB3aGVuIHJlYWRpbmcgKHRoaXMgYW5kCisgICB0d2ljZSB0aGlzIG11c3QgYmUgYWJsZSB0byBmaXQgaW4gYW4gdW5zaWduZWQgdHlwZSkgKi8KKyNkZWZpbmUgR1pCVUZTSVpFIDgxOTIKKworLyogZ3ppcCBtb2RlcywgYWxzbyBwcm92aWRlIGEgbGl0dGxlIGludGVncml0eSBjaGVjayBvbiB0aGUgcGFzc2VkIHN0cnVjdHVyZSAqLworI2RlZmluZSBHWl9OT05FIDAKKyNkZWZpbmUgR1pfUkVBRCA3MjQ3CisjZGVmaW5lIEdaX1dSSVRFIDMxMTUzCisjZGVmaW5lIEdaX0FQUEVORCAxICAgICAvKiBtb2RlIHNldCB0byBHWl9XUklURSBhZnRlciB0aGUgZmlsZSBpcyBvcGVuZWQgKi8KKworLyogdmFsdWVzIGZvciBnel9zdGF0ZSBob3cgKi8KKyNkZWZpbmUgTE9PSyAwICAgICAgLyogbG9vayBmb3IgYSBnemlwIGhlYWRlciAqLworI2RlZmluZSBDT1BZIDEgICAgICAvKiBjb3B5IGlucHV0IGRpcmVjdGx5ICovCisjZGVmaW5lIEdaSVAgMiAgICAgIC8qIGRlY29tcHJlc3MgYSBnemlwIHN0cmVhbSAqLworCisvKiBpbnRlcm5hbCBnemlwIGZpbGUgc3RhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgLyogZXhwb3NlZCBjb250ZW50cyBmb3IgZ3pnZXRjKCkgbWFjcm8gKi8KKyAgICBzdHJ1Y3QgZ3pGaWxlX3MgeDsgICAgICAvKiAieCIgZm9yIGV4cG9zZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4LmhhdmU6IG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgeC5uZXh0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeC5uZXh0OiBuZXh0IG91dHB1dCBkYXRhIHRvIGRlbGl2ZXIgb3Igd3JpdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4LnBvczogY3VycmVudCBwb3NpdGlvbiBpbiB1bmNvbXByZXNzZWQgZGF0YSAqLworICAgICAgICAvKiB1c2VkIGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgKi8KKyAgICBpbnQgbW9kZTsgICAgICAgICAgICAgICAvKiBzZWUgZ3ppcCBtb2RlcyBhYm92ZSAqLworICAgIGludCBmZDsgICAgICAgICAgICAgICAgIC8qIGZpbGUgZGVzY3JpcHRvciAqLworICAgIGNoYXIgKnBhdGg7ICAgICAgICAgICAgIC8qIHBhdGggb3IgZmQgZm9yIGVycm9yIG1lc3NhZ2VzICovCisgICAgdW5zaWduZWQgc2l6ZTsgICAgICAgICAgLyogYnVmZmVyIHNpemUsIHplcm8gaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KKyAgICB1bnNpZ25lZCB3YW50OyAgICAgICAgICAvKiByZXF1ZXN0ZWQgYnVmZmVyIHNpemUsIGRlZmF1bHQgaXMgR1pCVUZTSVpFICovCisgICAgdW5zaWduZWQgY2hhciAqaW47ICAgICAgLyogaW5wdXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgY2hhciAqb3V0OyAgICAgLyogb3V0cHV0IGJ1ZmZlciAoZG91YmxlLXNpemVkIHdoZW4gcmVhZGluZykgKi8KKyAgICBpbnQgZGlyZWN0OyAgICAgICAgICAgICAvKiAwIGlmIHByb2Nlc3NpbmcgZ3ppcCwgMSBpZiB0cmFuc3BhcmVudCAqLworICAgICAgICAvKiBqdXN0IGZvciByZWFkaW5nICovCisgICAgaW50IGhvdzsgICAgICAgICAgICAgICAgLyogMDogZ2V0IGhlYWRlciwgMTogY29weSwgMjogZGVjb21wcmVzcyAqLworICAgIHpfb2ZmNjRfdCBzdGFydDsgICAgICAgIC8qIHdoZXJlIHRoZSBnemlwIGRhdGEgc3RhcnRlZCwgZm9yIHJld2luZGluZyAqLworICAgIGludCBlb2Y7ICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgZW5kIG9mIGlucHV0IGZpbGUgcmVhY2hlZCAqLworICAgIGludCBwYXN0OyAgICAgICAgICAgICAgIC8qIHRydWUgaWYgcmVhZCByZXF1ZXN0ZWQgcGFzdCBlbmQgKi8KKyAgICAgICAgLyoganVzdCBmb3Igd3JpdGluZyAqLworICAgIGludCBsZXZlbDsgICAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICovCisgICAgaW50IHN0cmF0ZWd5OyAgICAgICAgICAgLyogY29tcHJlc3Npb24gc3RyYXRlZ3kgKi8KKyAgICAgICAgLyogc2VlayByZXF1ZXN0ICovCisgICAgel9vZmY2NF90IHNraXA7ICAgICAgICAgLyogYW1vdW50IHRvIHNraXAgKGFscmVhZHkgcmV3b3VuZCBpZiBiYWNrd2FyZHMpICovCisgICAgaW50IHNlZWs7ICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBzZWVrIHJlcXVlc3QgcGVuZGluZyAqLworICAgICAgICAvKiBlcnJvciBpbmZvcm1hdGlvbiAqLworICAgIGludCBlcnI7ICAgICAgICAgICAgICAgIC8qIGVycm9yIGNvZGUgKi8KKyAgICBjaGFyICptc2c7ICAgICAgICAgICAgICAvKiBlcnJvciBtZXNzYWdlICovCisgICAgICAgIC8qIHpsaWIgaW5mbGF0ZSBvciBkZWZsYXRlIHN0cmVhbSAqLworICAgIHpfc3RyZWFtIHN0cm07ICAgICAgICAgIC8qIHN0cmVhbSBzdHJ1Y3R1cmUgaW4tcGxhY2UgKG5vdCBhIHBvaW50ZXIpICovCit9IGd6X3N0YXRlOwordHlwZWRlZiBnel9zdGF0ZSBGQVIgKmd6X3N0YXRlcDsKKworLyogc2hhcmVkIGZ1bmN0aW9ucyAqLwordm9pZCBaTElCX0lOVEVSTkFMIGd6X2Vycm9yIE9GKChnel9zdGF0ZXAsIGludCwgY29uc3QgY2hhciAqKSk7CisjaWYgZGVmaW5lZCBVTkRFUl9DRQorY2hhciBaTElCX0lOVEVSTkFMICpnel9zdHJ3aW5lcnJvciBPRigoRFdPUkQgZXJyb3IpKTsKKyNlbmRpZgorCisvKiBHVF9PRkYoeCksIHdoZXJlIHggaXMgYW4gdW5zaWduZWQgdmFsdWUsIGlzIHRydWUgaWYgeCA+IG1heGltdW0gel9vZmY2NF90CisgICB2YWx1ZSAtLSBuZWVkZWQgd2hlbiBjb21wYXJpbmcgdW5zaWduZWQgdG8gel9vZmY2NF90LCB3aGljaCBpcyBzaWduZWQKKyAgIChwb3NzaWJsZSB6X29mZjY0X3QgdHlwZXMgb2ZmX3QsIG9mZjY0X3QsIGFuZCBsb25nIGFyZSBhbGwgc2lnbmVkKSAqLworI2lmZGVmIElOVF9NQVgKKyMgIGRlZmluZSBHVF9PRkYoeCkgKHNpemVvZihpbnQpID09IHNpemVvZih6X29mZjY0X3QpICYmICh4KSA+IElOVF9NQVgpCisjZWxzZQordW5zaWduZWQgWkxJQl9JTlRFUk5BTCBnel9pbnRtYXggT0YoKHZvaWQpKTsKKyMgIGRlZmluZSBHVF9PRkYoeCkgKHNpemVvZihpbnQpID09IHNpemVvZih6X29mZjY0X3QpICYmICh4KSA+IGd6X2ludG1heCgpKQorI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvZ3ppby5jIGIvTW9kdWxlcy96bGliL2d6aW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5MGY0OS4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL3psaWIvZ3ppby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyNiArMCwwIEBACi0vKiBnemlvLmMgLS0gSU8gb24gLmd6IGZpbGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICoKLSAqIENvbXBpbGUgdGhpcyBmaWxlIHdpdGggLUROT19HWkNPTVBSRVNTIHRvIGF2b2lkIHRoZSBjb21wcmVzc2lvbiBjb2RlLgotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0KLSNpZmRlZiBOT19ERUZMQVRFICAgICAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGRlZmluaXRpb24gKi8KLSMgIGRlZmluZSBOT19HWkNPTVBSRVNTCi0jZW5kaWYKLQotI2lmbmRlZiBOT19EVU1NWV9ERUNMCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGUge2ludCBkdW1teTt9OyAvKiBmb3IgYnVnZ3kgY29tcGlsZXJzICovCi0jZW5kaWYKLQotI2lmbmRlZiBaX0JVRlNJWkUKLSMgIGlmZGVmIE1BWFNFR182NEsKLSMgICAgZGVmaW5lIFpfQlVGU0laRSA0MDk2IC8qIG1pbmltaXplIG1lbW9yeSB1c2FnZSBmb3IgMTYtYml0IERPUyAqLwotIyAgZWxzZQotIyAgICBkZWZpbmUgWl9CVUZTSVpFIDE2Mzg0Ci0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIFpfUFJJTlRGX0JVRlNJWkUKLSMgIGRlZmluZSBaX1BSSU5URl9CVUZTSVpFIDQwOTYKLSNlbmRpZgotCi0jaWZkZWYgX19NVlNfXwotIyAgcHJhZ21hIG1hcCAoZmRvcGVuICwgIlwxNzRcMTc0RkRPUEVOIikKLSAgIEZJTEUgKmZkb3BlbihpbnQsIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotI2lmbmRlZiBTVERDCi1leHRlcm4gdm9pZHAgIG1hbGxvYyBPRigodUludCBzaXplKSk7Ci1leHRlcm4gdm9pZCAgIGZyZWUgICBPRigodm9pZHBmIHB0cikpOwotI2VuZGlmCi0KLSNkZWZpbmUgQUxMT0Moc2l6ZSkgbWFsbG9jKHNpemUpCi0jZGVmaW5lIFRSWUZSRUUocCkge2lmIChwKSBmcmVlKHApO30KLQotc3RhdGljIGludCBjb25zdCBnel9tYWdpY1syXSA9IHsweDFmLCAweDhifTsgLyogZ3ppcCBtYWdpYyBoZWFkZXIgKi8KLQotLyogZ3ppcCBmbGFnIGJ5dGUgKi8KLSNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEgLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IGFzY2lpIHRleHQgKi8KLSNkZWZpbmUgSEVBRF9DUkMgICAgIDB4MDIgLyogYml0IDEgc2V0OiBoZWFkZXIgQ1JDIHByZXNlbnQgKi8KLSNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQgLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCi0jZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4IC8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KLSNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAgLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLwotI2RlZmluZSBSRVNFUlZFRCAgICAgMHhFMCAvKiBiaXRzIDUuLjc6IHJlc2VydmVkICovCi0KLXR5cGVkZWYgc3RydWN0IGd6X3N0cmVhbSB7Ci0gICAgel9zdHJlYW0gc3RyZWFtOwotICAgIGludCAgICAgIHpfZXJyOyAgIC8qIGVycm9yIGNvZGUgZm9yIGxhc3Qgc3RyZWFtIG9wZXJhdGlvbiAqLwotICAgIGludCAgICAgIHpfZW9mOyAgIC8qIHNldCBpZiBlbmQgb2YgaW5wdXQgZmlsZSAqLwotICAgIEZJTEUgICAgICpmaWxlOyAgIC8qIC5neiBmaWxlICovCi0gICAgQnl0ZSAgICAgKmluYnVmOyAgLyogaW5wdXQgYnVmZmVyICovCi0gICAgQnl0ZSAgICAgKm91dGJ1ZjsgLyogb3V0cHV0IGJ1ZmZlciAqLwotICAgIHVMb25nICAgIGNyYzsgICAgIC8qIGNyYzMyIG9mIHVuY29tcHJlc3NlZCBkYXRhICovCi0gICAgY2hhciAgICAgKm1zZzsgICAgLyogZXJyb3IgbWVzc2FnZSAqLwotICAgIGNoYXIgICAgICpwYXRoOyAgIC8qIHBhdGggbmFtZSBmb3IgZGVidWdnaW5nIG9ubHkgKi8KLSAgICBpbnQgICAgICB0cmFuc3BhcmVudDsgLyogMSBpZiBpbnB1dCBmaWxlIGlzIG5vdCBhIC5neiBmaWxlICovCi0gICAgY2hhciAgICAgbW9kZTsgICAgLyogJ3cnIG9yICdyJyAqLwotICAgIHpfb2ZmX3QgIHN0YXJ0OyAgIC8qIHN0YXJ0IG9mIGNvbXByZXNzZWQgZGF0YSBpbiBmaWxlIChoZWFkZXIgc2tpcHBlZCkgKi8KLSAgICB6X29mZl90ICBpbjsgICAgICAvKiBieXRlcyBpbnRvIGRlZmxhdGUgb3IgaW5mbGF0ZSAqLwotICAgIHpfb2ZmX3QgIG91dDsgICAgIC8qIGJ5dGVzIG91dCBvZiBkZWZsYXRlIG9yIGluZmxhdGUgKi8KLSAgICBpbnQgICAgICBiYWNrOyAgICAvKiBvbmUgY2hhcmFjdGVyIHB1c2gtYmFjayAqLwotICAgIGludCAgICAgIGxhc3Q7ICAgIC8qIHRydWUgaWYgcHVzaC1iYWNrIGlzIGxhc3QgY2hhcmFjdGVyICovCi19IGd6X3N0cmVhbTsKLQotCi1sb2NhbCBnekZpbGUgZ3pfb3BlbiAgICAgIE9GKChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlLCBpbnQgIGZkKSk7Ci1sb2NhbCBpbnQgZG9fZmx1c2ggICAgICAgIE9GKChnekZpbGUgZmlsZSwgaW50IGZsdXNoKSk7Ci1sb2NhbCBpbnQgICAgZ2V0X2J5dGUgICAgIE9GKChnel9zdHJlYW0gKnMpKTsKLWxvY2FsIHZvaWQgICBjaGVja19oZWFkZXIgT0YoKGd6X3N0cmVhbSAqcykpOwotbG9jYWwgaW50ICAgIGRlc3Ryb3kgICAgICBPRigoZ3pfc3RyZWFtICpzKSk7Ci1sb2NhbCB2b2lkICAgcHV0TG9uZyAgICAgIE9GKChGSUxFICpmaWxlLCB1TG9uZyB4KSk7Ci1sb2NhbCB1TG9uZyAgZ2V0TG9uZyAgICAgIE9GKChnel9zdHJlYW0gKnMpKTsKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuIFRoZSBtb2RlIHBhcmFtZXRlcgotICAgaXMgYXMgaW4gZm9wZW4gKCJyYiIgb3IgIndiIikuIFRoZSBmaWxlIGlzIGdpdmVuIGVpdGhlciBieSBmaWxlIGRlc2NyaXB0b3IKLSAgIG9yIHBhdGggbmFtZSAoaWYgZmQgPT0gLTEpLgotICAgICBnel9vcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIG9yIGlmIHRoZXJlIHdhcwotICAgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlOyBlcnJubwotICAgY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlCi0gICB6bGliIGVycm9yIGlzIFpfTUVNX0VSUk9SKS4KLSovCi1sb2NhbCBnekZpbGUgZ3pfb3BlbiAocGF0aCwgbW9kZSwgZmQpCi0gICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICBjb25zdCBjaGFyICptb2RlOwotICAgIGludCAgZmQ7Ci17Ci0gICAgaW50IGVycjsKLSAgICBpbnQgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047IC8qIGNvbXByZXNzaW9uIGxldmVsICovCi0gICAgaW50IHN0cmF0ZWd5ID0gWl9ERUZBVUxUX1NUUkFURUdZOyAvKiBjb21wcmVzc2lvbiBzdHJhdGVneSAqLwotICAgIGNoYXIgKnAgPSAoY2hhciopbW9kZTsKLSAgICBnel9zdHJlYW0gKnM7Ci0gICAgY2hhciBmbW9kZVs4MF07IC8qIGNvcHkgb2YgbW9kZSwgd2l0aG91dCB0aGUgY29tcHJlc3Npb24gbGV2ZWwgKi8KLSAgICBjaGFyICptID0gZm1vZGU7Ci0KLSAgICBpZiAoIXBhdGggfHwgIW1vZGUpIHJldHVybiBaX05VTEw7Ci0KLSAgICBzID0gKGd6X3N0cmVhbSAqKUFMTE9DKHNpemVvZihnel9zdHJlYW0pKTsKLSAgICBpZiAoIXMpIHJldHVybiBaX05VTEw7Ci0KLSAgICBzLT5zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKLSAgICBzLT5zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7Ci0gICAgcy0+c3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKLSAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmID0gWl9OVUxMOwotICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IHMtPm91dGJ1ZiA9IFpfTlVMTDsKLSAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSBzLT5zdHJlYW0uYXZhaWxfb3V0ID0gMDsKLSAgICBzLT5maWxlID0gTlVMTDsKLSAgICBzLT56X2VyciA9IFpfT0s7Ci0gICAgcy0+el9lb2YgPSAwOwotICAgIHMtPmluID0gMDsKLSAgICBzLT5vdXQgPSAwOwotICAgIHMtPmJhY2sgPSBFT0Y7Ci0gICAgcy0+Y3JjID0gY3JjMzIoMEwsIFpfTlVMTCwgMCk7Ci0gICAgcy0+bXNnID0gTlVMTDsKLSAgICBzLT50cmFuc3BhcmVudCA9IDA7Ci0KLSAgICBzLT5wYXRoID0gKGNoYXIqKUFMTE9DKHN0cmxlbihwYXRoKSsxKTsKLSAgICBpZiAocy0+cGF0aCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKLSAgICB9Ci0gICAgc3RyY3B5KHMtPnBhdGgsIHBhdGgpOyAvKiBkbyB0aGlzIGVhcmx5IGZvciBkZWJ1Z2dpbmcgKi8KLQotICAgIHMtPm1vZGUgPSAnXDAnOwotICAgIGRvIHsKLSAgICAgICAgaWYgKCpwID09ICdyJykgcy0+bW9kZSA9ICdyJzsKLSAgICAgICAgaWYgKCpwID09ICd3JyB8fCAqcCA9PSAnYScpIHMtPm1vZGUgPSAndyc7Ci0gICAgICAgIGlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKSB7Ci0gICAgICAgICAgICBsZXZlbCA9ICpwIC0gJzAnOwotICAgICAgICB9IGVsc2UgaWYgKCpwID09ICdmJykgewotICAgICAgICAgIHN0cmF0ZWd5ID0gWl9GSUxURVJFRDsKLSAgICAgICAgfSBlbHNlIGlmICgqcCA9PSAnaCcpIHsKLSAgICAgICAgICBzdHJhdGVneSA9IFpfSFVGRk1BTl9PTkxZOwotICAgICAgICB9IGVsc2UgaWYgKCpwID09ICdSJykgewotICAgICAgICAgIHN0cmF0ZWd5ID0gWl9STEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqbSsrID0gKnA7IC8qIGNvcHkgdGhlIG1vZGUgKi8KLSAgICAgICAgfQotICAgIH0gd2hpbGUgKCpwKysgJiYgbSAhPSBmbW9kZSArIHNpemVvZihmbW9kZSkpOwotICAgIGlmIChzLT5tb2RlID09ICdcMCcpIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKLQotICAgIGlmIChzLT5tb2RlID09ICd3JykgewotI2lmZGVmIE5PX0daQ09NUFJFU1MKLSAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7Ci0jZWxzZQotICAgICAgICBlcnIgPSBkZWZsYXRlSW5pdDIoJihzLT5zdHJlYW0pLCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfREVGTEFURUQsIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIHN0cmF0ZWd5KTsKLSAgICAgICAgLyogd2luZG93Qml0cyBpcyBwYXNzZWQgPCAwIHRvIHN1cHByZXNzIHpsaWIgaGVhZGVyICovCi0KLSAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKGVyciAhPSBaX09LIHx8IHMtPm91dGJ1ZiA9PSBaX05VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHMtPnN0cmVhbS5uZXh0X2luICA9IHMtPmluYnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7Ci0KLSAgICAgICAgZXJyID0gaW5mbGF0ZUluaXQyKCYocy0+c3RyZWFtKSwgLU1BWF9XQklUUyk7Ci0gICAgICAgIC8qIHdpbmRvd0JpdHMgaXMgcGFzc2VkIDwgMCB0byB0ZWxsIHRoYXQgdGhlcmUgaXMgbm8gemxpYiBoZWFkZXIuCi0gICAgICAgICAqIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgaW5mbGF0ZSAqcmVxdWlyZXMqIGFuIGV4dHJhICJkdW1teSIgYnl0ZQotICAgICAgICAgKiBhZnRlciB0aGUgY29tcHJlc3NlZCBzdHJlYW0gaW4gb3JkZXIgdG8gY29tcGxldGUgZGVjb21wcmVzc2lvbiBhbmQKLSAgICAgICAgICogcmV0dXJuIFpfU1RSRUFNX0VORC4gSGVyZSB0aGUgZ3ppcCBDUkMzMiBlbnN1cmVzIHRoYXQgNCBieXRlcyBhcmUKLSAgICAgICAgICogcHJlc2VudCBhZnRlciB0aGUgY29tcHJlc3NlZCBzdHJlYW0uCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZXJyICE9IFpfT0sgfHwgcy0+aW5idWYgPT0gWl9OVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVzdHJveShzKSwgKGd6RmlsZSlaX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IFpfQlVGU0laRTsKLQotICAgIGVycm5vID0gMDsKLSAgICBzLT5maWxlID0gZmQgPCAwID8gRl9PUEVOKHBhdGgsIGZtb2RlKSA6IChGSUxFKilmZG9wZW4oZmQsIGZtb2RlKTsKLQotICAgIGlmIChzLT5maWxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOwotICAgIH0KLSAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKLSAgICAgICAgLyogV3JpdGUgYSB2ZXJ5IHNpbXBsZSAuZ3ogaGVhZGVyOgotICAgICAgICAgKi8KLSAgICAgICAgZnByaW50ZihzLT5maWxlLCAiJWMlYyVjJWMlYyVjJWMlYyVjJWMiLCBnel9tYWdpY1swXSwgZ3pfbWFnaWNbMV0sCi0gICAgICAgICAgICAgWl9ERUZMQVRFRCwgMCAvKmZsYWdzKi8sIDAsMCwwLDAgLyp0aW1lKi8sIDAgLyp4ZmxhZ3MqLywgT1NfQ09ERSk7Ci0gICAgICAgIHMtPnN0YXJ0ID0gMTBMOwotICAgICAgICAvKiBXZSB1c2UgMTBMIGluc3RlYWQgb2YgZnRlbGwocy0+ZmlsZSkgdG8gYmVjYXVzZSBmdGVsbCBjYXVzZXMgYW4KLSAgICAgICAgICogZmZsdXNoIG9uIHNvbWUgc3lzdGVtcy4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGRvZXNuJ3QgdXNlCi0gICAgICAgICAqIHN0YXJ0IGFueXdheSBpbiB3cml0ZSBtb2RlLCBzbyB0aGlzIGluaXRpYWxpemF0aW9uIGlzIG5vdAotICAgICAgICAgKiBuZWNlc3NhcnkuCi0gICAgICAgICAqLwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoZWNrX2hlYWRlcihzKTsgLyogc2tpcCB0aGUgLmd6IGhlYWRlciAqLwotICAgICAgICBzLT5zdGFydCA9IGZ0ZWxsKHMtPmZpbGUpIC0gcy0+c3RyZWFtLmF2YWlsX2luOwotICAgIH0KLQotICAgIHJldHVybiAoZ3pGaWxlKXM7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgotKi8KLWd6RmlsZSBaRVhQT1JUIGd6b3BlbiAocGF0aCwgbW9kZSkKLSAgICBjb25zdCBjaGFyICpwYXRoOwotICAgIGNvbnN0IGNoYXIgKm1vZGU7Ci17Ci0gICAgcmV0dXJuIGd6X29wZW4gKHBhdGgsIG1vZGUsIC0xKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIEFzc29jaWF0ZSBhIGd6RmlsZSB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IgZmQuIGZkIGlzIG5vdCBkdXAnZWQgaGVyZQotICAgdG8gbWltaWMgdGhlIGJlaGF2aW8odSlyIG9mIGZkb3Blbi4KLSovCi1nekZpbGUgWkVYUE9SVCBnemRvcGVuIChmZCwgbW9kZSkKLSAgICBpbnQgZmQ7Ci0gICAgY29uc3QgY2hhciAqbW9kZTsKLXsKLSAgICBjaGFyIG5hbWVbNDZdOyAgICAgIC8qIGFsbG93IGZvciB1cCB0byAxMjgtYml0IGludGVnZXJzICovCi0KLSAgICBpZiAoZmQgPCAwKSByZXR1cm4gKGd6RmlsZSlaX05VTEw7Ci0gICAgc3ByaW50ZihuYW1lLCAiPGZkOiVkPiIsIGZkKTsgLyogZm9yIGRlYnVnZ2luZyAqLwotCi0gICAgcmV0dXJuIGd6X29wZW4gKG5hbWUsIG1vZGUsIGZkKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBVcGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBzdHJhdGVneQotICovCi1pbnQgWkVYUE9SVCBnenNldHBhcmFtcyAoZmlsZSwgbGV2ZWwsIHN0cmF0ZWd5KQotICAgIGd6RmlsZSBmaWxlOwotICAgIGludCBsZXZlbDsKLSAgICBpbnQgc3RyYXRlZ3k7Ci17Ci0gICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKLQotICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAndycpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIC8qIE1ha2Ugcm9vbSB0byBhbGxvdyBmbHVzaGluZyAqLwotICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKLQotICAgICAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBzLT5vdXRidWY7Ci0gICAgICAgIGlmIChmd3JpdGUocy0+b3V0YnVmLCAxLCBaX0JVRlNJWkUsIHMtPmZpbGUpICE9IFpfQlVGU0laRSkgewotICAgICAgICAgICAgcy0+el9lcnIgPSBaX0VSUk5POwotICAgICAgICB9Ci0gICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgPSBaX0JVRlNJWkU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRlZmxhdGVQYXJhbXMgKCYocy0+c3RyZWFtKSwgbGV2ZWwsIHN0cmF0ZWd5KTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIFJlYWQgYSBieXRlIGZyb20gYSBnel9zdHJlYW07IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbi4gUmV0dXJuIEVPRgotICAgZm9yIGVuZCBvZiBmaWxlLgotICAgSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHMgaGFzIGJlZW4gc3VjZXNzZnVsbHkgb3BlbmVkIGZvciByZWFkaW5nLgotKi8KLWxvY2FsIGludCBnZXRfYnl0ZShzKQotICAgIGd6X3N0cmVhbSAqczsKLXsKLSAgICBpZiAocy0+el9lb2YpIHJldHVybiBFT0Y7Ci0gICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICAgIGVycm5vID0gMDsKLSAgICAgICAgcy0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpZnJlYWQocy0+aW5idWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSk7Ci0gICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfaW4gPT0gMCkgewotICAgICAgICAgICAgcy0+el9lb2YgPSAxOwotICAgICAgICAgICAgaWYgKGZlcnJvcihzLT5maWxlKSkgcy0+el9lcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgcmV0dXJuIEVPRjsKLSAgICAgICAgfQotICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOwotICAgIH0KLSAgICBzLT5zdHJlYW0uYXZhaWxfaW4tLTsKLSAgICByZXR1cm4gKihzLT5zdHJlYW0ubmV4dF9pbikrKzsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICBDaGVjayB0aGUgZ3ppcCBoZWFkZXIgb2YgYSBnel9zdHJlYW0gb3BlbmVkIGZvciByZWFkaW5nLiBTZXQgdGhlIHN0cmVhbQotICAgIG1vZGUgdG8gdHJhbnNwYXJlbnQgaWYgdGhlIGd6aXAgbWFnaWMgaGVhZGVyIGlzIG5vdCBwcmVzZW50OyBzZXQgcy0+ZXJyCi0gICAgdG8gWl9EQVRBX0VSUk9SIGlmIHRoZSBtYWdpYyBoZWFkZXIgaXMgcHJlc2VudCBidXQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlcgotICAgIGlzIGluY29ycmVjdC4KLSAgICBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gcyBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgc3VjZXNzZnVsbHk7Ci0gICAgICAgcy0+c3RyZWFtLmF2YWlsX2luIGlzIHplcm8gZm9yIHRoZSBmaXJzdCB0aW1lLCBidXQgbWF5IGJlIG5vbi16ZXJvCi0gICAgICAgZm9yIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMuCi0qLwotbG9jYWwgdm9pZCBjaGVja19oZWFkZXIocykKLSAgICBnel9zdHJlYW0gKnM7Ci17Ci0gICAgaW50IG1ldGhvZDsgLyogbWV0aG9kIGJ5dGUgKi8KLSAgICBpbnQgZmxhZ3M7ICAvKiBmbGFncyBieXRlICovCi0gICAgdUludCBsZW47Ci0gICAgaW50IGM7Ci0KLSAgICAvKiBBc3N1cmUgdHdvIGJ5dGVzIGluIHRoZSBidWZmZXIgc28gd2UgY2FuIHBlZWsgYWhlYWQgLS0gaGFuZGxlIGNhc2UKLSAgICAgICB3aGVyZSBmaXJzdCBieXRlIG9mIGhlYWRlciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYWZ0ZXIgdGhlIGxhc3QKLSAgICAgICBnemlwIHNlZ21lbnQgKi8KLSAgICBsZW4gPSBzLT5zdHJlYW0uYXZhaWxfaW47Ci0gICAgaWYgKGxlbiA8IDIpIHsKLSAgICAgICAgaWYgKGxlbikgcy0+aW5idWZbMF0gPSBzLT5zdHJlYW0ubmV4dF9pblswXTsKLSAgICAgICAgZXJybm8gPSAwOwotICAgICAgICBsZW4gPSAodUludClmcmVhZChzLT5pbmJ1ZiArIGxlbiwgMSwgWl9CVUZTSVpFID4+IGxlbiwgcy0+ZmlsZSk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCAmJiBmZXJyb3Iocy0+ZmlsZSkpIHMtPnpfZXJyID0gWl9FUlJOTzsKLSAgICAgICAgcy0+c3RyZWFtLmF2YWlsX2luICs9IGxlbjsKLSAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKLSAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA8IDIpIHsKLSAgICAgICAgICAgIHMtPnRyYW5zcGFyZW50ID0gcy0+c3RyZWFtLmF2YWlsX2luOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUGVlayBhaGVhZCB0byBjaGVjayB0aGUgZ3ppcCBtYWdpYyBoZWFkZXIgKi8KLSAgICBpZiAocy0+c3RyZWFtLm5leHRfaW5bMF0gIT0gZ3pfbWFnaWNbMF0gfHwKLSAgICAgICAgcy0+c3RyZWFtLm5leHRfaW5bMV0gIT0gZ3pfbWFnaWNbMV0pIHsKLSAgICAgICAgcy0+dHJhbnNwYXJlbnQgPSAxOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHMtPnN0cmVhbS5hdmFpbF9pbiAtPSAyOwotICAgIHMtPnN0cmVhbS5uZXh0X2luICs9IDI7Ci0KLSAgICAvKiBDaGVjayB0aGUgcmVzdCBvZiB0aGUgZ3ppcCBoZWFkZXIgKi8KLSAgICBtZXRob2QgPSBnZXRfYnl0ZShzKTsKLSAgICBmbGFncyA9IGdldF9ieXRlKHMpOwotICAgIGlmIChtZXRob2QgIT0gWl9ERUZMQVRFRCB8fCAoZmxhZ3MgJiBSRVNFUlZFRCkgIT0gMCkgewotICAgICAgICBzLT56X2VyciA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIERpc2NhcmQgdGltZSwgeGZsYWdzIGFuZCBPUyBjb2RlOiAqLwotICAgIGZvciAobGVuID0gMDsgbGVuIDwgNjsgbGVuKyspICh2b2lkKWdldF9ieXRlKHMpOwotCi0gICAgaWYgKChmbGFncyAmIEVYVFJBX0ZJRUxEKSAhPSAwKSB7IC8qIHNraXAgdGhlIGV4dHJhIGZpZWxkICovCi0gICAgICAgIGxlbiAgPSAgKHVJbnQpZ2V0X2J5dGUocyk7Ci0gICAgICAgIGxlbiArPSAoKHVJbnQpZ2V0X2J5dGUocykpPDw4OwotICAgICAgICAvKiBsZW4gaXMgZ2FyYmFnZSBpZiBFT0YgYnV0IHRoZSBsb29wIGJlbG93IHdpbGwgcXVpdCBhbnl3YXkgKi8KLSAgICAgICAgd2hpbGUgKGxlbi0tICE9IDAgJiYgZ2V0X2J5dGUocykgIT0gRU9GKSA7Ci0gICAgfQotICAgIGlmICgoZmxhZ3MgJiBPUklHX05BTUUpICE9IDApIHsgLyogc2tpcCB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lICovCi0gICAgICAgIHdoaWxlICgoYyA9IGdldF9ieXRlKHMpKSAhPSAwICYmIGMgIT0gRU9GKSA7Ci0gICAgfQotICAgIGlmICgoZmxhZ3MgJiBDT01NRU5UKSAhPSAwKSB7ICAgLyogc2tpcCB0aGUgLmd6IGZpbGUgY29tbWVudCAqLwotICAgICAgICB3aGlsZSAoKGMgPSBnZXRfYnl0ZShzKSkgIT0gMCAmJiBjICE9IEVPRikgOwotICAgIH0KLSAgICBpZiAoKGZsYWdzICYgSEVBRF9DUkMpICE9IDApIHsgIC8qIHNraXAgdGhlIGhlYWRlciBjcmMgKi8KLSAgICAgICAgZm9yIChsZW4gPSAwOyBsZW4gPCAyOyBsZW4rKykgKHZvaWQpZ2V0X2J5dGUocyk7Ci0gICAgfQotICAgIHMtPnpfZXJyID0gcy0+el9lb2YgPyBaX0RBVEFfRVJST1IgOiBaX09LOwotfQotCi0gLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDbGVhbnVwIHRoZW4gZnJlZSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBSZXR1cm4gYSB6bGliIGVycm9yIGNvZGUuCi0gICBUcnkgZnJlZWluZyBpbiB0aGUgcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9ucy4KLSAqLwotbG9jYWwgaW50IGRlc3Ryb3kgKHMpCi0gICAgZ3pfc3RyZWFtICpzOwotewotICAgIGludCBlcnIgPSBaX09LOwotCi0gICAgaWYgKCFzKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICBUUllGUkVFKHMtPm1zZyk7Ci0KLSAgICBpZiAocy0+c3RyZWFtLnN0YXRlICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7Ci0jaWZkZWYgTk9fR1pDT01QUkVTUwotICAgICAgICAgICAgZXJyID0gWl9TVFJFQU1fRVJST1I7Ci0jZWxzZQotICAgICAgICAgICAgZXJyID0gZGVmbGF0ZUVuZCgmKHMtPnN0cmVhbSkpOwotI2VuZGlmCi0gICAgICAgIH0gZWxzZSBpZiAocy0+bW9kZSA9PSAncicpIHsKLSAgICAgICAgICAgIGVyciA9IGluZmxhdGVFbmQoJihzLT5zdHJlYW0pKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocy0+ZmlsZSAhPSBOVUxMICYmIGZjbG9zZShzLT5maWxlKSkgewotI2lmZGVmIEVTUElQRQotICAgICAgICBpZiAoZXJybm8gIT0gRVNQSVBFKSAvKiBmY2xvc2UgaXMgYnJva2VuIGZvciBwaXBlcyBpbiBIUC9VWCAqLwotI2VuZGlmCi0gICAgICAgICAgICBlcnIgPSBaX0VSUk5POwotICAgIH0KLSAgICBpZiAocy0+el9lcnIgPCAwKSBlcnIgPSBzLT56X2VycjsKLQotICAgIFRSWUZSRUUocy0+aW5idWYpOwotICAgIFRSWUZSRUUocy0+b3V0YnVmKTsKLSAgICBUUllGUkVFKHMtPnBhdGgpOwotICAgIFRSWUZSRUUocyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgIGd6cmVhZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCAoMCBmb3IgZW5kIG9mIGZpbGUpLgotKi8KLWludCBaRVhQT1JUIGd6cmVhZCAoZmlsZSwgYnVmLCBsZW4pCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgdm9pZHAgYnVmOwotICAgIHVuc2lnbmVkIGxlbjsKLXsKLSAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOwotICAgIEJ5dGVmICpzdGFydCA9IChCeXRlZiopYnVmOyAvKiBzdGFydGluZyBwb2ludCBmb3IgY3JjIGNvbXB1dGF0aW9uICovCi0gICAgQnl0ZSAgKm5leHRfb3V0OyAvKiA9PSBzdHJlYW0ubmV4dF9vdXQgYnV0IG5vdCBmb3JjZWQgZmFyIChmb3IgTVNET1MpICovCi0KLSAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICBpZiAocy0+el9lcnIgPT0gWl9EQVRBX0VSUk9SIHx8IHMtPnpfZXJyID09IFpfRVJSTk8pIHJldHVybiAtMTsKLSAgICBpZiAocy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EKSByZXR1cm4gMDsgIC8qIEVPRiAqLwotCi0gICAgbmV4dF9vdXQgPSAoQnl0ZSopYnVmOwotICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IChCeXRlZiopYnVmOwotICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgPSBsZW47Ci0KLSAgICBpZiAocy0+c3RyZWFtLmF2YWlsX291dCAmJiBzLT5iYWNrICE9IEVPRikgewotICAgICAgICAqbmV4dF9vdXQrKyA9IHMtPmJhY2s7Ci0gICAgICAgIHMtPnN0cmVhbS5uZXh0X291dCsrOwotICAgICAgICBzLT5zdHJlYW0uYXZhaWxfb3V0LS07Ci0gICAgICAgIHMtPmJhY2sgPSBFT0Y7Ci0gICAgICAgIHMtPm91dCsrOwotICAgICAgICBzdGFydCsrOwotICAgICAgICBpZiAocy0+bGFzdCkgewotICAgICAgICAgICAgcy0+el9lcnIgPSBaX1NUUkVBTV9FTkQ7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlIChzLT5zdHJlYW0uYXZhaWxfb3V0ICE9IDApIHsKLQotICAgICAgICBpZiAocy0+dHJhbnNwYXJlbnQpIHsKLSAgICAgICAgICAgIC8qIENvcHkgZmlyc3QgdGhlIGxvb2thaGVhZCBieXRlczogKi8KLSAgICAgICAgICAgIHVJbnQgbiA9IHMtPnN0cmVhbS5hdmFpbF9pbjsKLSAgICAgICAgICAgIGlmIChuID4gcy0+c3RyZWFtLmF2YWlsX291dCkgbiA9IHMtPnN0cmVhbS5hdmFpbF9vdXQ7Ci0gICAgICAgICAgICBpZiAobiA+IDApIHsKLSAgICAgICAgICAgICAgICB6bWVtY3B5KHMtPnN0cmVhbS5uZXh0X291dCwgcy0+c3RyZWFtLm5leHRfaW4sIG4pOwotICAgICAgICAgICAgICAgIG5leHRfb3V0ICs9IG47Ci0gICAgICAgICAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gbmV4dF9vdXQ7Ci0gICAgICAgICAgICAgICAgcy0+c3RyZWFtLm5leHRfaW4gICArPSBuOwotICAgICAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgLT0gbjsKLSAgICAgICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gIC09IG47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX291dCA+IDApIHsKLSAgICAgICAgICAgICAgICBzLT5zdHJlYW0uYXZhaWxfb3V0IC09Ci0gICAgICAgICAgICAgICAgICAgICh1SW50KWZyZWFkKG5leHRfb3V0LCAxLCBzLT5zdHJlYW0uYXZhaWxfb3V0LCBzLT5maWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlbiAtPSBzLT5zdHJlYW0uYXZhaWxfb3V0OwotICAgICAgICAgICAgcy0+aW4gICs9IGxlbjsKLSAgICAgICAgICAgIHMtPm91dCArPSBsZW47Ci0gICAgICAgICAgICBpZiAobGVuID09IDApIHMtPnpfZW9mID0gMTsKLSAgICAgICAgICAgIHJldHVybiAoaW50KWxlbjsKLSAgICAgICAgfQotICAgICAgICBpZiAocy0+c3RyZWFtLmF2YWlsX2luID09IDAgJiYgIXMtPnpfZW9mKSB7Ci0KLSAgICAgICAgICAgIGVycm5vID0gMDsKLSAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KWZyZWFkKHMtPmluYnVmLCAxLCBaX0JVRlNJWkUsIHMtPmZpbGUpOwotICAgICAgICAgICAgaWYgKHMtPnN0cmVhbS5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcy0+el9lb2YgPSAxOwotICAgICAgICAgICAgICAgIGlmIChmZXJyb3Iocy0+ZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcy0+el9lcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOwotICAgICAgICB9Ci0gICAgICAgIHMtPmluICs9IHMtPnN0cmVhbS5hdmFpbF9pbjsKLSAgICAgICAgcy0+b3V0ICs9IHMtPnN0cmVhbS5hdmFpbF9vdXQ7Ci0gICAgICAgIHMtPnpfZXJyID0gaW5mbGF0ZSgmKHMtPnN0cmVhbSksIFpfTk9fRkxVU0gpOwotICAgICAgICBzLT5pbiAtPSBzLT5zdHJlYW0uYXZhaWxfaW47Ci0gICAgICAgIHMtPm91dCAtPSBzLT5zdHJlYW0uYXZhaWxfb3V0OwotCi0gICAgICAgIGlmIChzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQpIHsKLSAgICAgICAgICAgIC8qIENoZWNrIENSQyBhbmQgb3JpZ2luYWwgc2l6ZSAqLwotICAgICAgICAgICAgcy0+Y3JjID0gY3JjMzIocy0+Y3JjLCBzdGFydCwgKHVJbnQpKHMtPnN0cmVhbS5uZXh0X291dCAtIHN0YXJ0KSk7Ci0gICAgICAgICAgICBzdGFydCA9IHMtPnN0cmVhbS5uZXh0X291dDsKLQotICAgICAgICAgICAgaWYgKGdldExvbmcocykgIT0gcy0+Y3JjKSB7Ci0gICAgICAgICAgICAgICAgcy0+el9lcnIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICh2b2lkKWdldExvbmcocyk7Ci0gICAgICAgICAgICAgICAgLyogVGhlIHVuY29tcHJlc3NlZCBsZW5ndGggcmV0dXJuZWQgYnkgYWJvdmUgZ2V0bG9uZygpIG1heSBiZQotICAgICAgICAgICAgICAgICAqIGRpZmZlcmVudCBmcm9tIHMtPm91dCBpbiBjYXNlIG9mIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMuCi0gICAgICAgICAgICAgICAgICogQ2hlY2sgZm9yIHN1Y2ggZmlsZXM6Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgY2hlY2tfaGVhZGVyKHMpOwotICAgICAgICAgICAgICAgIGlmIChzLT56X2VyciA9PSBaX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZmxhdGVSZXNldCgmKHMtPnN0cmVhbSkpOwotICAgICAgICAgICAgICAgICAgICBzLT5jcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMtPnpfZXJyICE9IFpfT0sgfHwgcy0+el9lb2YpIGJyZWFrOwotICAgIH0KLSAgICBzLT5jcmMgPSBjcmMzMihzLT5jcmMsIHN0YXJ0LCAodUludCkocy0+c3RyZWFtLm5leHRfb3V0IC0gc3RhcnQpKTsKLQotICAgIGlmIChsZW4gPT0gcy0+c3RyZWFtLmF2YWlsX291dCAmJgotICAgICAgICAocy0+el9lcnIgPT0gWl9EQVRBX0VSUk9SIHx8IHMtPnpfZXJyID09IFpfRVJSTk8pKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgcmV0dXJuIChpbnQpKGxlbiAtIHMtPnN0cmVhbS5hdmFpbF9vdXQpOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiBnemdldGMgcmV0dXJucyB0aGlzIGJ5dGUKLSAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCi0qLwotaW50IFpFWFBPUlQgZ3pnZXRjKGZpbGUpCi0gICAgZ3pGaWxlIGZpbGU7Ci17Ci0gICAgdW5zaWduZWQgY2hhciBjOwotCi0gICAgcmV0dXJuIGd6cmVhZChmaWxlLCAmYywgMSkgPT0gMSA/IGMgOiAtMTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgIFB1c2ggb25lIGJ5dGUgYmFjayBvbnRvIHRoZSBzdHJlYW0uCi0qLwotaW50IFpFWFBPUlQgZ3p1bmdldGMoYywgZmlsZSkKLSAgICBpbnQgYzsKLSAgICBnekZpbGUgZmlsZTsKLXsKLSAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOwotCi0gICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICdyJyB8fCBjID09IEVPRiB8fCBzLT5iYWNrICE9IEVPRikgcmV0dXJuIEVPRjsKLSAgICBzLT5iYWNrID0gYzsKLSAgICBzLT5vdXQtLTsKLSAgICBzLT5sYXN0ID0gKHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCk7Ci0gICAgaWYgKHMtPmxhc3QpIHMtPnpfZXJyID0gWl9PSzsKLSAgICBzLT56X2VvZiA9IDA7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUKLSAgIHJlYWQsIG9yIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbgotICAgZW5kLW9mLWZpbGUgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgVGhlIHN0cmluZyBpcyB0aGVuIHRlcm1pbmF0ZWQKLSAgIHdpdGggYSBudWxsIGNoYXJhY3Rlci4KLSAgICAgIGd6Z2V0cyByZXR1cm5zIGJ1Ziwgb3IgWl9OVUxMIGluIGNhc2Ugb2YgZXJyb3IuCi0KLSAgICAgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIG5vdCBvcHRpbWl6ZWQgYXQgYWxsLgotKi8KLWNoYXIgKiBaRVhQT1JUIGd6Z2V0cyhmaWxlLCBidWYsIGxlbikKLSAgICBnekZpbGUgZmlsZTsKLSAgICBjaGFyICpidWY7Ci0gICAgaW50IGxlbjsKLXsKLSAgICBjaGFyICpiID0gYnVmOwotICAgIGlmIChidWYgPT0gWl9OVUxMIHx8IGxlbiA8PSAwKSByZXR1cm4gWl9OVUxMOwotCi0gICAgd2hpbGUgKC0tbGVuID4gMCAmJiBnenJlYWQoZmlsZSwgYnVmLCAxKSA9PSAxICYmICpidWYrKyAhPSAnXG4nKSA7Ci0gICAgKmJ1ZiA9ICdcMCc7Ci0gICAgcmV0dXJuIGIgPT0gYnVmICYmIGxlbiA+IDAgPyBaX05VTEwgOiBiOwotfQotCi0KLSNpZm5kZWYgTk9fR1pDT01QUkVTUwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBnendyaXRlIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgotKi8KLWludCBaRVhQT1JUIGd6d3JpdGUgKGZpbGUsIGJ1ZiwgbGVuKQotICAgIGd6RmlsZSBmaWxlOwotICAgIHZvaWRwYyBidWY7Ci0gICAgdW5zaWduZWQgbGVuOwotewotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3cnKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopYnVmOwotICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKLQotICAgIHdoaWxlIChzLT5zdHJlYW0uYXZhaWxfaW4gIT0gMCkgewotCi0gICAgICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKLQotICAgICAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmOwotICAgICAgICAgICAgaWYgKGZ3cml0ZShzLT5vdXRidWYsIDEsIFpfQlVGU0laRSwgcy0+ZmlsZSkgIT0gWl9CVUZTSVpFKSB7Ci0gICAgICAgICAgICAgICAgcy0+el9lcnIgPSBaX0VSUk5POwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IFpfQlVGU0laRTsKLSAgICAgICAgfQotICAgICAgICBzLT5pbiArPSBzLT5zdHJlYW0uYXZhaWxfaW47Ci0gICAgICAgIHMtPm91dCArPSBzLT5zdHJlYW0uYXZhaWxfb3V0OwotICAgICAgICBzLT56X2VyciA9IGRlZmxhdGUoJihzLT5zdHJlYW0pLCBaX05PX0ZMVVNIKTsKLSAgICAgICAgcy0+aW4gLT0gcy0+c3RyZWFtLmF2YWlsX2luOwotICAgICAgICBzLT5vdXQgLT0gcy0+c3RyZWFtLmF2YWlsX291dDsKLSAgICAgICAgaWYgKHMtPnpfZXJyICE9IFpfT0spIGJyZWFrOwotICAgIH0KLSAgICBzLT5jcmMgPSBjcmMzMihzLT5jcmMsIChjb25zdCBCeXRlZiAqKWJ1ZiwgbGVuKTsKLQotICAgIHJldHVybiAoaW50KShsZW4gLSBzLT5zdHJlYW0uYXZhaWxfaW4pOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCi0gICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiBnenByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKLSAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgotKi8KLSNpZmRlZiBTVERDCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLWludCBaRVhQT1JUVkEgZ3pwcmludGYgKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC8qIGFyZ3MgKi8gLi4uKQotewotICAgIGNoYXIgYnVmW1pfUFJJTlRGX0JVRlNJWkVdOwotICAgIHZhX2xpc3QgdmE7Ci0gICAgaW50IGxlbjsKLQotICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKLSAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKLSNpZmRlZiBOT192c25wcmludGYKLSMgIGlmZGVmIEhBU192c3ByaW50Zl92b2lkCi0gICAgKHZvaWQpdnNwcmludGYoYnVmLCBmb3JtYXQsIHZhKTsKLSAgICB2YV9lbmQodmEpOwotICAgIGZvciAobGVuID0gMDsgbGVuIDwgc2l6ZW9mKGJ1Zik7IGxlbisrKQotICAgICAgICBpZiAoYnVmW2xlbl0gPT0gMCkgYnJlYWs7Ci0jICBlbHNlCi0gICAgbGVuID0gdnNwcmludGYoYnVmLCBmb3JtYXQsIHZhKTsKLSAgICB2YV9lbmQodmEpOwotIyAgZW5kaWYKLSNlbHNlCi0jICBpZmRlZiBIQVNfdnNucHJpbnRmX3ZvaWQKLSAgICAodm9pZCl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCB2YSk7Ci0gICAgdmFfZW5kKHZhKTsKLSAgICBsZW4gPSBzdHJsZW4oYnVmKTsKLSMgIGVsc2UKLSAgICBsZW4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCB2YSk7Ci0gICAgdmFfZW5kKHZhKTsKLSMgIGVuZGlmCi0jZW5kaWYKLSAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IChpbnQpc2l6ZW9mKGJ1ZikgfHwgYnVmW3NpemVvZihidWYpIC0gMV0gIT0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGd6d3JpdGUoZmlsZSwgYnVmLCAodW5zaWduZWQpbGVuKTsKLX0KLSNlbHNlIC8qIG5vdCBBTlNJIEMgKi8KLQotaW50IFpFWFBPUlRWQSBnenByaW50ZiAoZmlsZSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsCi0gICAgICAgICAgICAgICAgICAgICAgIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCkKLSAgICBnekZpbGUgZmlsZTsKLSAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgaW50IGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwKLSAgICAgICAgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwOwotewotICAgIGNoYXIgYnVmW1pfUFJJTlRGX0JVRlNJWkVdOwotICAgIGludCBsZW47Ci0KLSAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDA7Ci0jaWZkZWYgTk9fc25wcmludGYKLSMgIGlmZGVmIEhBU19zcHJpbnRmX3ZvaWQKLSAgICBzcHJpbnRmKGJ1ZiwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCi0gICAgICAgICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOwotICAgIGZvciAobGVuID0gMDsgbGVuIDwgc2l6ZW9mKGJ1Zik7IGxlbisrKQotICAgICAgICBpZiAoYnVmW2xlbl0gPT0gMCkgYnJlYWs7Ci0jICBlbHNlCi0gICAgbGVuID0gc3ByaW50ZihidWYsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAotICAgICAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7Ci0jICBlbmRpZgotI2Vsc2UKLSMgIGlmZGVmIEhBU19zbnByaW50Zl92b2lkCi0gICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCi0gICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKLSAgICBsZW4gPSBzdHJsZW4oYnVmKTsKLSMgIGVsc2UKLSAgICBsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKLSAgICAgICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKLSMgIGVuZGlmCi0jZW5kaWYKLSAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IHNpemVvZihidWYpIHx8IGJ1ZltzaXplb2YoYnVmKSAtIDFdICE9IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBnendyaXRlKGZpbGUsIGJ1ZiwgbGVuKTsKLX0KLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgotICAgZ3pwdXRjIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCi0qLwotaW50IFpFWFBPUlQgZ3pwdXRjKGZpbGUsIGMpCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgaW50IGM7Ci17Ci0gICAgdW5zaWduZWQgY2hhciBjYyA9ICh1bnNpZ25lZCBjaGFyKSBjOyAvKiByZXF1aXJlZCBmb3IgYmlnIGVuZGlhbiBzeXN0ZW1zICovCi0KLSAgICByZXR1cm4gZ3p3cml0ZShmaWxlLCAmY2MsIDEpID09IDEgPyAoaW50KWNjIDogLTE7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSwgZXhjbHVkaW5nCi0gICB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCi0gICAgICBnenB1dHMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KLSovCi1pbnQgWkVYUE9SVCBnenB1dHMoZmlsZSwgcykKLSAgICBnekZpbGUgZmlsZTsKLSAgICBjb25zdCBjaGFyICpzOwotewotICAgIHJldHVybiBnendyaXRlKGZpbGUsIChjaGFyKilzLCAodW5zaWduZWQpc3RybGVuKHMpKTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCi0gICBmbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLgotKi8KLWxvY2FsIGludCBkb19mbHVzaCAoZmlsZSwgZmx1c2gpCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgaW50IGZsdXNoOwotewotICAgIHVJbnQgbGVuOwotICAgIGludCBkb25lID0gMDsKLSAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOwotCi0gICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICd3JykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgcy0+c3RyZWFtLmF2YWlsX2luID0gMDsgLyogc2hvdWxkIGJlIHplcm8gYWxyZWFkeSBhbnl3YXkgKi8KLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgbGVuID0gWl9CVUZTSVpFIC0gcy0+c3RyZWFtLmF2YWlsX291dDsKLQotICAgICAgICBpZiAobGVuICE9IDApIHsKLSAgICAgICAgICAgIGlmICgodUludClmd3JpdGUocy0+b3V0YnVmLCAxLCBsZW4sIHMtPmZpbGUpICE9IGxlbikgewotICAgICAgICAgICAgICAgIHMtPnpfZXJyID0gWl9FUlJOTzsKLSAgICAgICAgICAgICAgICByZXR1cm4gWl9FUlJOTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPnN0cmVhbS5uZXh0X291dCA9IHMtPm91dGJ1ZjsKLSAgICAgICAgICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgPSBaX0JVRlNJWkU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRvbmUpIGJyZWFrOwotICAgICAgICBzLT5vdXQgKz0gcy0+c3RyZWFtLmF2YWlsX291dDsKLSAgICAgICAgcy0+el9lcnIgPSBkZWZsYXRlKCYocy0+c3RyZWFtKSwgZmx1c2gpOwotICAgICAgICBzLT5vdXQgLT0gcy0+c3RyZWFtLmF2YWlsX291dDsKLQotICAgICAgICAvKiBJZ25vcmUgdGhlIHNlY29uZCBvZiB0d28gY29uc2VjdXRpdmUgZmx1c2hlczogKi8KLSAgICAgICAgaWYgKGxlbiA9PSAwICYmIHMtPnpfZXJyID09IFpfQlVGX0VSUk9SKSBzLT56X2VyciA9IFpfT0s7Ci0KLSAgICAgICAgLyogZGVmbGF0ZSBoYXMgZmluaXNoZWQgZmx1c2hpbmcgb25seSB3aGVuIGl0IGhhc24ndCB1c2VkIHVwCi0gICAgICAgICAqIGFsbCB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyOgotICAgICAgICAgKi8KLSAgICAgICAgZG9uZSA9IChzLT5zdHJlYW0uYXZhaWxfb3V0ICE9IDAgfHwgcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EKTsKLQotICAgICAgICBpZiAocy0+el9lcnIgIT0gWl9PSyAmJiBzLT56X2VyciAhPSBaX1NUUkVBTV9FTkQpIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gIHMtPnpfZXJyID09IFpfU1RSRUFNX0VORCA/IFpfT0sgOiBzLT56X2VycjsKLX0KLQotaW50IFpFWFBPUlQgZ3pmbHVzaCAoZmlsZSwgZmx1c2gpCi0gICAgIGd6RmlsZSBmaWxlOwotICAgICBpbnQgZmx1c2g7Ci17Ci0gICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKLSAgICBpbnQgZXJyID0gZG9fZmx1c2ggKGZpbGUsIGZsdXNoKTsKLQotICAgIGlmIChlcnIpIHJldHVybiBlcnI7Ci0gICAgZmZsdXNoKHMtPmZpbGUpOwotICAgIHJldHVybiAgcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EID8gWl9PSyA6IHMtPnpfZXJyOwotfQotI2VuZGlmIC8qIE5PX0daQ09NUFJFU1MgKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICBTZXRzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlIGdpdmVuCi0gICBjb21wcmVzc2VkIGZpbGUuIFRoZSBvZmZzZXQgcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKLSAgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAgICBTRUVLX0VORCBpcyBub3QgaW1wbGVtZW50ZWQsIHJldHVybnMgZXJyb3IuCi0gICAgICBJbiB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGd6c2VlayBjYW4gYmUgZXh0cmVtZWx5IHNsb3cuCi0qLwotel9vZmZfdCBaRVhQT1JUIGd6c2VlayAoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpCi0gICAgZ3pGaWxlIGZpbGU7Ci0gICAgel9vZmZfdCBvZmZzZXQ7Ci0gICAgaW50IHdoZW5jZTsKLXsKLSAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOwotCi0gICAgaWYgKHMgPT0gTlVMTCB8fCB3aGVuY2UgPT0gU0VFS19FTkQgfHwKLSAgICAgICAgcy0+el9lcnIgPT0gWl9FUlJOTyB8fCBzLT56X2VyciA9PSBaX0RBVEFfRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIC0xTDsKLSAgICB9Ci0KLSAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKLSNpZmRlZiBOT19HWkNPTVBSRVNTCi0gICAgICAgIHJldHVybiAtMUw7Ci0jZWxzZQotICAgICAgICBpZiAod2hlbmNlID09IFNFRUtfU0VUKSB7Ci0gICAgICAgICAgICBvZmZzZXQgLT0gcy0+aW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9mZnNldCA8IDApIHJldHVybiAtMUw7Ci0KLSAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgb2Zmc2V0IGlzIHRoZSBudW1iZXIgb2YgemVybyBieXRlcyB0byB3cml0ZS4gKi8KLSAgICAgICAgaWYgKHMtPmluYnVmID09IFpfTlVMTCkgewotICAgICAgICAgICAgcy0+aW5idWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsgLyogZm9yIHNlZWtpbmcgKi8KLSAgICAgICAgICAgIGlmIChzLT5pbmJ1ZiA9PSBaX05VTEwpIHJldHVybiAtMUw7Ci0gICAgICAgICAgICB6bWVtemVybyhzLT5pbmJ1ZiwgWl9CVUZTSVpFKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAob2Zmc2V0ID4gMCkgIHsKLSAgICAgICAgICAgIHVJbnQgc2l6ZSA9IFpfQlVGU0laRTsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPCBaX0JVRlNJWkUpIHNpemUgPSAodUludClvZmZzZXQ7Ci0KLSAgICAgICAgICAgIHNpemUgPSBnendyaXRlKGZpbGUsIHMtPmluYnVmLCBzaXplKTsKLSAgICAgICAgICAgIGlmIChzaXplID09IDApIHJldHVybiAtMUw7Ci0KLSAgICAgICAgICAgIG9mZnNldCAtPSBzaXplOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzLT5pbjsKLSNlbmRpZgotICAgIH0KLSAgICAvKiBSZXN0IG9mIGZ1bmN0aW9uIGlzIGZvciByZWFkaW5nIG9ubHkgKi8KLQotICAgIC8qIGNvbXB1dGUgYWJzb2x1dGUgcG9zaXRpb24gKi8KLSAgICBpZiAod2hlbmNlID09IFNFRUtfQ1VSKSB7Ci0gICAgICAgIG9mZnNldCArPSBzLT5vdXQ7Ci0gICAgfQotICAgIGlmIChvZmZzZXQgPCAwKSByZXR1cm4gLTFMOwotCi0gICAgaWYgKHMtPnRyYW5zcGFyZW50KSB7Ci0gICAgICAgIC8qIG1hcCB0byBmc2VlayAqLwotICAgICAgICBzLT5iYWNrID0gRU9GOwotICAgICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSAwOwotICAgICAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOwotICAgICAgICBpZiAoZnNlZWsocy0+ZmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKSByZXR1cm4gLTFMOwotCi0gICAgICAgIHMtPmluID0gcy0+b3V0ID0gb2Zmc2V0OwotICAgICAgICByZXR1cm4gb2Zmc2V0OwotICAgIH0KLQotICAgIC8qIEZvciBhIG5lZ2F0aXZlIHNlZWssIHJld2luZCBhbmQgdXNlIHBvc2l0aXZlIHNlZWsgKi8KLSAgICBpZiAob2Zmc2V0ID49IHMtPm91dCkgewotICAgICAgICBvZmZzZXQgLT0gcy0+b3V0OwotICAgIH0gZWxzZSBpZiAoZ3pyZXdpbmQoZmlsZSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMUw7Ci0gICAgfQotICAgIC8qIG9mZnNldCBpcyBub3cgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLiAqLwotCi0gICAgaWYgKG9mZnNldCAhPSAwICYmIHMtPm91dGJ1ZiA9PSBaX05VTEwpIHsKLSAgICAgICAgcy0+b3V0YnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7Ci0gICAgICAgIGlmIChzLT5vdXRidWYgPT0gWl9OVUxMKSByZXR1cm4gLTFMOwotICAgIH0KLSAgICBpZiAob2Zmc2V0ICYmIHMtPmJhY2sgIT0gRU9GKSB7Ci0gICAgICAgIHMtPmJhY2sgPSBFT0Y7Ci0gICAgICAgIHMtPm91dCsrOwotICAgICAgICBvZmZzZXQtLTsKLSAgICAgICAgaWYgKHMtPmxhc3QpIHMtPnpfZXJyID0gWl9TVFJFQU1fRU5EOwotICAgIH0KLSAgICB3aGlsZSAob2Zmc2V0ID4gMCkgIHsKLSAgICAgICAgaW50IHNpemUgPSBaX0JVRlNJWkU7Ci0gICAgICAgIGlmIChvZmZzZXQgPCBaX0JVRlNJWkUpIHNpemUgPSAoaW50KW9mZnNldDsKLQotICAgICAgICBzaXplID0gZ3pyZWFkKGZpbGUsIHMtPm91dGJ1ZiwgKHVJbnQpc2l6ZSk7Ci0gICAgICAgIGlmIChzaXplIDw9IDApIHJldHVybiAtMUw7Ci0gICAgICAgIG9mZnNldCAtPSBzaXplOwotICAgIH0KLSAgICByZXR1cm4gcy0+b3V0OwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmV3aW5kcyBpbnB1dCBmaWxlLgotKi8KLWludCBaRVhQT1JUIGd6cmV3aW5kIChmaWxlKQotICAgIGd6RmlsZSBmaWxlOwotewotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSByZXR1cm4gLTE7Ci0KLSAgICBzLT56X2VyciA9IFpfT0s7Ci0gICAgcy0+el9lb2YgPSAwOwotICAgIHMtPmJhY2sgPSBFT0Y7Ci0gICAgcy0+c3RyZWFtLmF2YWlsX2luID0gMDsKLSAgICBzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOwotICAgIHMtPmNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotICAgIGlmICghcy0+dHJhbnNwYXJlbnQpICh2b2lkKWluZmxhdGVSZXNldCgmcy0+c3RyZWFtKTsKLSAgICBzLT5pbiA9IDA7Ci0gICAgcy0+b3V0ID0gMDsKLSAgICByZXR1cm4gZnNlZWsocy0+ZmlsZSwgcy0+c3RhcnQsIFNFRUtfU0VUKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKLSAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgotKi8KLXpfb2ZmX3QgWkVYUE9SVCBnenRlbGwgKGZpbGUpCi0gICAgZ3pGaWxlIGZpbGU7Ci17Ci0gICAgcmV0dXJuIGd6c2VlayhmaWxlLCAwTCwgU0VFS19DVVIpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KLSAgIGlucHV0IHN0cmVhbSwgb3RoZXJ3aXNlIHplcm8uCi0qLwotaW50IFpFWFBPUlQgZ3plb2YgKGZpbGUpCi0gICAgZ3pGaWxlIGZpbGU7Ci17Ci0gICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKLQotICAgIC8qIFdpdGggY29uY2F0ZW5hdGVkIGNvbXByZXNzZWQgZmlsZXMgdGhhdCBjYW4gaGF2ZSBlbWJlZGRlZAotICAgICAqIGNyYyB0cmFpbGVycywgel9lb2YgaXMgbm8gbG9uZ2VyIHRoZSBvbmx5L2Jlc3QgaW5kaWNhdG9yIG9mIEVPRgotICAgICAqIG9uIGEgZ3pfc3RyZWFtLiBIYW5kbGUgZW5kLW9mLXN0cmVhbSBlcnJvciBleHBsaWNpdGx5IGhlcmUuCi0gICAgICovCi0gICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICdyJykgcmV0dXJuIDA7Ci0gICAgaWYgKHMtPnpfZW9mKSByZXR1cm4gMTsKLSAgICByZXR1cm4gcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmV0dXJucyAxIGlmIHJlYWRpbmcgYW5kIGRvaW5nIHNvIHRyYW5zcGFyZW50bHksIG90aGVyd2lzZSB6ZXJvLgotKi8KLWludCBaRVhQT1JUIGd6ZGlyZWN0IChmaWxlKQotICAgIGd6RmlsZSBmaWxlOwotewotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSByZXR1cm4gMDsKLSAgICByZXR1cm4gcy0+dHJhbnNwYXJlbnQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgT3V0cHV0cyBhIGxvbmcgaW4gTFNCIG9yZGVyIHRvIHRoZSBnaXZlbiBmaWxlCi0qLwotbG9jYWwgdm9pZCBwdXRMb25nIChmaWxlLCB4KQotICAgIEZJTEUgKmZpbGU7Ci0gICAgdUxvbmcgeDsKLXsKLSAgICBpbnQgbjsKLSAgICBmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7Ci0gICAgICAgIGZwdXRjKChpbnQpKHggJiAweGZmKSwgZmlsZSk7Ci0gICAgICAgIHggPj49IDg7Ci0gICAgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIFJlYWRzIGEgbG9uZyBpbiBMU0Igb3JkZXIgZnJvbSB0aGUgZ2l2ZW4gZ3pfc3RyZWFtLiBTZXRzIHpfZXJyIGluIGNhc2UKLSAgIG9mIGVycm9yLgotKi8KLWxvY2FsIHVMb25nIGdldExvbmcgKHMpCi0gICAgZ3pfc3RyZWFtICpzOwotewotICAgIHVMb25nIHggPSAodUxvbmcpZ2V0X2J5dGUocyk7Ci0gICAgaW50IGM7Ci0KLSAgICB4ICs9ICgodUxvbmcpZ2V0X2J5dGUocykpPDw4OwotICAgIHggKz0gKCh1TG9uZylnZXRfYnl0ZShzKSk8PDE2OwotICAgIGMgPSBnZXRfYnl0ZShzKTsKLSAgICBpZiAoYyA9PSBFT0YpIHMtPnpfZXJyID0gWl9EQVRBX0VSUk9SOwotICAgIHggKz0gKCh1TG9uZyljKTw8MjQ7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCi0gICBhbmQgZGVhbGxvY2F0ZXMgYWxsIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCi0qLwotaW50IFpFWFBPUlQgZ3pjbG9zZSAoZmlsZSkKLSAgICBnekZpbGUgZmlsZTsKLXsKLSAgICBnel9zdHJlYW0gKnMgPSAoZ3pfc3RyZWFtKilmaWxlOwotCi0gICAgaWYgKHMgPT0gTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7Ci0jaWZkZWYgTk9fR1pDT01QUkVTUwotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0jZWxzZQotICAgICAgICBpZiAoZG9fZmx1c2ggKGZpbGUsIFpfRklOSVNIKSAhPSBaX09LKQotICAgICAgICAgICAgcmV0dXJuIGRlc3Ryb3koKGd6X3N0cmVhbSopZmlsZSk7Ci0KLSAgICAgICAgcHV0TG9uZyAocy0+ZmlsZSwgcy0+Y3JjKTsKLSAgICAgICAgcHV0TG9uZyAocy0+ZmlsZSwgKHVMb25nKShzLT5pbiAmIDB4ZmZmZmZmZmYpKTsKLSNlbmRpZgotICAgIH0KLSAgICByZXR1cm4gZGVzdHJveSgoZ3pfc3RyZWFtKilmaWxlKTsKLX0KLQotI2lmZGVmIFNUREMKLSMgIGRlZmluZSB6c3RyZXJyb3IoZXJybnVtKSBzdHJlcnJvcihlcnJudW0pCi0jZWxzZQotIyAgZGVmaW5lIHpzdHJlcnJvcihlcnJudW0pICIiCi0jZW5kaWYKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgotICAgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksCi0gICBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubwotICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgotKi8KLWNvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IgKGZpbGUsIGVycm51bSkKLSAgICBnekZpbGUgZmlsZTsKLSAgICBpbnQgKmVycm51bTsKLXsKLSAgICBjaGFyICptOwotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMKSB7Ci0gICAgICAgICplcnJudW0gPSBaX1NUUkVBTV9FUlJPUjsKLSAgICAgICAgcmV0dXJuIChjb25zdCBjaGFyKilFUlJfTVNHKFpfU1RSRUFNX0VSUk9SKTsKLSAgICB9Ci0gICAgKmVycm51bSA9IHMtPnpfZXJyOwotICAgIGlmICgqZXJybnVtID09IFpfT0spIHJldHVybiAoY29uc3QgY2hhciopIiI7Ci0KLSAgICBtID0gKGNoYXIqKSgqZXJybnVtID09IFpfRVJSTk8gPyB6c3RyZXJyb3IoZXJybm8pIDogcy0+c3RyZWFtLm1zZyk7Ci0KLSAgICBpZiAobSA9PSBOVUxMIHx8ICptID09ICdcMCcpIG0gPSAoY2hhciopRVJSX01TRyhzLT56X2Vycik7Ci0KLSAgICBUUllGUkVFKHMtPm1zZyk7Ci0gICAgcy0+bXNnID0gKGNoYXIqKUFMTE9DKHN0cmxlbihzLT5wYXRoKSArIHN0cmxlbihtKSArIDMpOwotICAgIGlmIChzLT5tc2cgPT0gWl9OVUxMKSByZXR1cm4gKGNvbnN0IGNoYXIqKUVSUl9NU0coWl9NRU1fRVJST1IpOwotICAgIHN0cmNweShzLT5tc2csIHMtPnBhdGgpOwotICAgIHN0cmNhdChzLT5tc2csICI6ICIpOwotICAgIHN0cmNhdChzLT5tc2csIG0pOwotICAgIHJldHVybiAoY29uc3QgY2hhciopcy0+bXNnOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgQ2xlYXIgdGhlIGVycm9yIGFuZCBlbmQtb2YtZmlsZSBmbGFncywgYW5kIGRvIHRoZSBzYW1lIGZvciB0aGUgcmVhbCBmaWxlLgotKi8KLXZvaWQgWkVYUE9SVCBnemNsZWFyZXJyIChmaWxlKQotICAgIGd6RmlsZSBmaWxlOwotewotICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0KLSAgICBpZiAocyA9PSBOVUxMKSByZXR1cm47Ci0gICAgaWYgKHMtPnpfZXJyICE9IFpfU1RSRUFNX0VORCkgcy0+el9lcnIgPSBaX09LOwotICAgIHMtPnpfZW9mID0gMDsKLSAgICBjbGVhcmVycihzLT5maWxlKTsKLX0KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9nemxpYi5jIGIvTW9kdWxlcy96bGliL2d6bGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlMjAyZQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvemxpYi9nemxpYi5jCkBAIC0wLDAgKzEsNjM0IEBACisvKiBnemxpYi5jIC0tIHpsaWIgZnVuY3Rpb25zIGNvbW1vbiB0byByZWFkaW5nIGFuZCB3cml0aW5nIGd6aXAgZmlsZXMKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgImd6Z3V0cy5oIgorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKKyMgIGRlZmluZSBMU0VFSyBfbHNlZWtpNjQKKyNlbHNlCisjaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKKyMgIGRlZmluZSBMU0VFSyBsc2VlazY0CisjZWxzZQorIyAgZGVmaW5lIExTRUVLIGxzZWVrCisjZW5kaWYKKyNlbmRpZgorCisvKiBMb2NhbCBmdW5jdGlvbnMgKi8KK2xvY2FsIHZvaWQgZ3pfcmVzZXQgT0YoKGd6X3N0YXRlcCkpOworbG9jYWwgZ3pGaWxlIGd6X29wZW4gT0YoKGNvbnN0IHZvaWQgKiwgaW50LCBjb25zdCBjaGFyICopKTsKKworI2lmIGRlZmluZWQgVU5ERVJfQ0UKKworLyogTWFwIHRoZSBXaW5kb3dzIGVycm9yIG51bWJlciBpbiBFUlJPUiB0byBhIGxvY2FsZS1kZXBlbmRlbnQgZXJyb3IgbWVzc2FnZQorICAgc3RyaW5nIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LiAgVHlwaWNhbGx5LCB0aGUgdmFsdWVzIGZvciBFUlJPUiBjb21lCisgICBmcm9tIEdldExhc3RFcnJvci4KKworICAgVGhlIHN0cmluZyBwb2ludGVkIHRvIHNoYWxsIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgYXBwbGljYXRpb24sIGJ1dCBtYXkgYmUKKyAgIG92ZXJ3cml0dGVuIGJ5IGEgc3Vic2VxdWVudCBjYWxsIHRvIGd6X3N0cndpbmVycm9yCisKKyAgIFRoZSBnel9zdHJ3aW5lcnJvciBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgc2V0dGluZyBvZgorICAgR2V0TGFzdEVycm9yLiAqLworY2hhciBaTElCX0lOVEVSTkFMICpnel9zdHJ3aW5lcnJvciAoZXJyb3IpCisgICAgIERXT1JEIGVycm9yOworeworICAgIHN0YXRpYyBjaGFyIGJ1ZlsxMDI0XTsKKworICAgIHdjaGFyX3QgKm1zZ2J1ZjsKKyAgICBEV09SRCBsYXN0ZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgRFdPUkQgY2hhcnMgPSBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNCisgICAgICAgIHwgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSLAorICAgICAgICBOVUxMLAorICAgICAgICBlcnJvciwKKyAgICAgICAgMCwgLyogRGVmYXVsdCBsYW5ndWFnZSAqLworICAgICAgICAoTFBWT0lEKSZtc2didWYsCisgICAgICAgIDAsCisgICAgICAgIE5VTEwpOworICAgIGlmIChjaGFycyAhPSAwKSB7CisgICAgICAgIC8qIElmIHRoZXJlIGlzIGFuIFxyXG4gYXBwZW5kZWQsIHphcCBpdC4gICovCisgICAgICAgIGlmIChjaGFycyA+PSAyCisgICAgICAgICAgICAmJiBtc2didWZbY2hhcnMgLSAyXSA9PSAnXHInICYmIG1zZ2J1ZltjaGFycyAtIDFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGNoYXJzIC09IDI7CisgICAgICAgICAgICBtc2didWZbY2hhcnNdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjaGFycyA+IHNpemVvZiAoYnVmKSAtIDEpIHsKKyAgICAgICAgICAgIGNoYXJzID0gc2l6ZW9mIChidWYpIC0gMTsKKyAgICAgICAgICAgIG1zZ2J1ZltjaGFyc10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgd2NzdG9tYnMoYnVmLCBtc2didWYsIGNoYXJzICsgMSk7CisgICAgICAgIExvY2FsRnJlZShtc2didWYpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3ByaW50ZihidWYsICJ1bmtub3duIHdpbjMyIGVycm9yICglbGQpIiwgZXJyb3IpOworICAgIH0KKworICAgIFNldExhc3RFcnJvcihsYXN0ZXJyKTsKKyAgICByZXR1cm4gYnVmOworfQorCisjZW5kaWYgLyogVU5ERVJfQ0UgKi8KKworLyogUmVzZXQgZ3ppcCBmaWxlIHN0YXRlICovCitsb2NhbCB2b2lkIGd6X3Jlc2V0KHN0YXRlKQorICAgIGd6X3N0YXRlcCBzdGF0ZTsKK3sKKyAgICBzdGF0ZS0+eC5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG5vIG91dHB1dCBkYXRhIGF2YWlsYWJsZSAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEKSB7ICAgLyogZm9yIHJlYWRpbmcgLi4uICovCisgICAgICAgIHN0YXRlLT5lb2YgPSAwOyAgICAgICAgICAgICAvKiBub3QgYXQgZW5kIG9mIGZpbGUgKi8KKyAgICAgICAgc3RhdGUtPnBhc3QgPSAwOyAgICAgICAgICAgIC8qIGhhdmUgbm90IHJlYWQgcGFzdCBlbmQgeWV0ICovCisgICAgICAgIHN0YXRlLT5ob3cgPSBMT09LOyAgICAgICAgICAvKiBsb29rIGZvciBnemlwIGhlYWRlciAqLworICAgIH0KKyAgICBzdGF0ZS0+c2VlayA9IDA7ICAgICAgICAgICAgICAgIC8qIG5vIHNlZWsgcmVxdWVzdCBwZW5kaW5nICovCisgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfT0ssIE5VTEwpOyAgICAvKiBjbGVhciBlcnJvciAqLworICAgIHN0YXRlLT54LnBvcyA9IDA7ICAgICAgICAgICAgICAgLyogbm8gdW5jb21wcmVzc2VkIGRhdGEgeWV0ICovCisgICAgc3RhdGUtPnN0cm0uYXZhaWxfaW4gPSAwOyAgICAgICAvKiBubyBpbnB1dCBkYXRhIHlldCAqLworfQorCisvKiBPcGVuIGEgZ3ppcCBmaWxlIGVpdGhlciBieSBuYW1lIG9yIGZpbGUgZGVzY3JpcHRvci4gKi8KK2xvY2FsIGd6RmlsZSBnel9vcGVuKHBhdGgsIGZkLCBtb2RlKQorICAgIGNvbnN0IHZvaWQgKnBhdGg7CisgICAgaW50IGZkOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHNpemVfdCBsZW47CisgICAgaW50IG9mbGFnOworI2lmZGVmIE9fQ0xPRVhFQworICAgIGludCBjbG9leGVjID0gMDsKKyNlbmRpZgorI2lmZGVmIE9fRVhDTAorICAgIGludCBleGNsdXNpdmUgPSAwOworI2VuZGlmCisKKyAgICAvKiBjaGVjayBpbnB1dCAqLworICAgIGlmIChwYXRoID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogYWxsb2NhdGUgZ3pGaWxlIHN0cnVjdHVyZSB0byByZXR1cm4gKi8KKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApbWFsbG9jKHNpemVvZihnel9zdGF0ZSkpOworICAgIGlmIChzdGF0ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdGF0ZS0+c2l6ZSA9IDA7ICAgICAgICAgICAgLyogbm8gYnVmZmVycyBhbGxvY2F0ZWQgeWV0ICovCisgICAgc3RhdGUtPndhbnQgPSBHWkJVRlNJWkU7ICAgIC8qIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSAqLworICAgIHN0YXRlLT5tc2cgPSBOVUxMOyAgICAgICAgICAvKiBubyBlcnJvciBtZXNzYWdlIHlldCAqLworCisgICAgLyogaW50ZXJwcmV0IG1vZGUgKi8KKyAgICBzdGF0ZS0+bW9kZSA9IEdaX05PTkU7CisgICAgc3RhdGUtPmxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOworICAgIHN0YXRlLT5zdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWTsKKyAgICBzdGF0ZS0+ZGlyZWN0ID0gMDsKKyAgICB3aGlsZSAoKm1vZGUpIHsKKyAgICAgICAgaWYgKCptb2RlID49ICcwJyAmJiAqbW9kZSA8PSAnOScpCisgICAgICAgICAgICBzdGF0ZS0+bGV2ZWwgPSAqbW9kZSAtICcwJzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3dpdGNoICgqbW9kZSkgeworICAgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBHWl9SRUFEOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmbmRlZiBOT19HWkNPTVBSRVNTCisgICAgICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEdaX1dSSVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnYSc6CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBHWl9BUFBFTkQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgJysnOiAgICAgICAvKiBjYW4ndCByZWFkIGFuZCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lICovCisgICAgICAgICAgICAgICAgZnJlZShzdGF0ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBjYXNlICdiJzogICAgICAgLyogaWdub3JlIC0tIHdpbGwgcmVxdWVzdCBiaW5hcnkgYW55d2F5ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgT19DTE9FWEVDCisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgICBjbG9leGVjID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIE9fRVhDTAorICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICAgICAgZXhjbHVzaXZlID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgc3RhdGUtPnN0cmF0ZWd5ID0gWl9GSUxURVJFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICAgIHN0YXRlLT5zdHJhdGVneSA9IFpfSFVGRk1BTl9PTkxZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgICAgICAgc3RhdGUtPnN0cmF0ZWd5ID0gWl9STEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICBzdGF0ZS0+c3RyYXRlZ3kgPSBaX0ZJWEVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnVCc6CisgICAgICAgICAgICAgICAgc3RhdGUtPmRpcmVjdCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgLyogY291bGQgY29uc2lkZXIgYXMgYW4gZXJyb3IsIGJ1dCBqdXN0IGlnbm9yZSAqLworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgbW9kZSsrOworICAgIH0KKworICAgIC8qIG11c3QgcHJvdmlkZSBhbiAiciIsICJ3Iiwgb3IgImEiICovCisgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX05PTkUpIHsKKyAgICAgICAgZnJlZShzdGF0ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGNhbid0IGZvcmNlIHRyYW5zcGFyZW50IHJlYWQgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgeworICAgICAgICBpZiAoc3RhdGUtPmRpcmVjdCkgeworICAgICAgICAgICAgZnJlZShzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+ZGlyZWN0ID0gMTsgICAgICAvKiBmb3IgZW1wdHkgZmlsZSAqLworICAgIH0KKworICAgIC8qIHNhdmUgdGhlIHBhdGggbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KKyNpZmRlZiBfV0lOMzIKKyAgICBpZiAoZmQgPT0gLTIpIHsKKyAgICAgICAgbGVuID0gd2NzdG9tYnMoTlVMTCwgcGF0aCwgMCk7CisgICAgICAgIGlmIChsZW4gPT0gKHNpemVfdCktMSkKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBsZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilwYXRoKTsKKyAgICBzdGF0ZS0+cGF0aCA9IChjaGFyICopbWFsbG9jKGxlbiArIDEpOworICAgIGlmIChzdGF0ZS0+cGF0aCA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUoc3RhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWZkZWYgX1dJTjMyCisgICAgaWYgKGZkID09IC0yKQorICAgICAgICBpZiAobGVuKQorICAgICAgICAgICAgd2NzdG9tYnMoc3RhdGUtPnBhdGgsIHBhdGgsIGxlbiArIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqKHN0YXRlLT5wYXRoKSA9IDA7CisgICAgZWxzZQorI2VuZGlmCisjaWYgIWRlZmluZWQoTk9fc25wcmludGYpICYmICFkZWZpbmVkKE5PX3ZzbnByaW50ZikKKyAgICAgICAgc25wcmludGYoc3RhdGUtPnBhdGgsIGxlbiArIDEsICIlcyIsIChjb25zdCBjaGFyICopcGF0aCk7CisjZWxzZQorICAgICAgICBzdHJjcHkoc3RhdGUtPnBhdGgsIHBhdGgpOworI2VuZGlmCisKKyAgICAvKiBjb21wdXRlIHRoZSBmbGFncyBmb3Igb3BlbigpICovCisgICAgb2ZsYWcgPQorI2lmZGVmIE9fTEFSR0VGSUxFCisgICAgICAgIE9fTEFSR0VGSUxFIHwKKyNlbmRpZgorI2lmZGVmIE9fQklOQVJZCisgICAgICAgIE9fQklOQVJZIHwKKyNlbmRpZgorI2lmZGVmIE9fQ0xPRVhFQworICAgICAgICAoY2xvZXhlYyA/IE9fQ0xPRVhFQyA6IDApIHwKKyNlbmRpZgorICAgICAgICAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCA/CisgICAgICAgICBPX1JET05MWSA6CisgICAgICAgICAoT19XUk9OTFkgfCBPX0NSRUFUIHwKKyNpZmRlZiBPX0VYQ0wKKyAgICAgICAgICAoZXhjbHVzaXZlID8gT19FWENMIDogMCkgfAorI2VuZGlmCisgICAgICAgICAgKHN0YXRlLT5tb2RlID09IEdaX1dSSVRFID8KKyAgICAgICAgICAgT19UUlVOQyA6CisgICAgICAgICAgIE9fQVBQRU5EKSkpOworCisgICAgLyogb3BlbiB0aGUgZmlsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmbGFncyAob3IganVzdCB1c2UgZmQpICovCisgICAgc3RhdGUtPmZkID0gZmQgPiAtMSA/IGZkIDogKAorI2lmZGVmIF9XSU4zMgorICAgICAgICBmZCA9PSAtMiA/IF93b3BlbihwYXRoLCBvZmxhZywgMDY2NikgOgorI2VuZGlmCisgICAgICAgIG9wZW4oKGNvbnN0IGNoYXIgKilwYXRoLCBvZmxhZywgMDY2NikpOworICAgIGlmIChzdGF0ZS0+ZmQgPT0gLTEpIHsKKyAgICAgICAgZnJlZShzdGF0ZS0+cGF0aCk7CisgICAgICAgIGZyZWUoc3RhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX0FQUEVORCkKKyAgICAgICAgc3RhdGUtPm1vZGUgPSBHWl9XUklURTsgICAgICAgICAvKiBzaW1wbGlmeSBsYXRlciBjaGVja3MgKi8KKworICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gZm9yIHJld2luZGluZyAob25seSBpZiByZWFkaW5nKSAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEKSB7CisgICAgICAgIHN0YXRlLT5zdGFydCA9IExTRUVLKHN0YXRlLT5mZCwgMCwgU0VFS19DVVIpOworICAgICAgICBpZiAoc3RhdGUtPnN0YXJ0ID09IC0xKSBzdGF0ZS0+c3RhcnQgPSAwOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgc3RyZWFtICovCisgICAgZ3pfcmVzZXQoc3RhdGUpOworCisgICAgLyogcmV0dXJuIHN0cmVhbSAqLworICAgIHJldHVybiAoZ3pGaWxlKXN0YXRlOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitnekZpbGUgWkVYUE9SVCBnem9wZW4ocGF0aCwgbW9kZSkKKyAgICBjb25zdCBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgLTEsIG1vZGUpOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitnekZpbGUgWkVYUE9SVCBnem9wZW42NChwYXRoLCBtb2RlKQorICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgY29uc3QgY2hhciAqbW9kZTsKK3sKKyAgICByZXR1cm4gZ3pfb3BlbihwYXRoLCAtMSwgbW9kZSk7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2d6RmlsZSBaRVhQT1JUIGd6ZG9wZW4oZmQsIG1vZGUpCisgICAgaW50IGZkOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgY2hhciAqcGF0aDsgICAgICAgICAvKiBpZGVudGlmaWVyIGZvciBlcnJvciBtZXNzYWdlcyAqLworICAgIGd6RmlsZSBnejsKKworICAgIGlmIChmZCA9PSAtMSB8fCAocGF0aCA9IChjaGFyICopbWFsbG9jKDcgKyAzICogc2l6ZW9mKGludCkpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyNpZiAhZGVmaW5lZChOT19zbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQorICAgIHNucHJpbnRmKHBhdGgsIDcgKyAzICogc2l6ZW9mKGludCksICI8ZmQ6JWQ+IiwgZmQpOyAvKiBmb3IgZGVidWdnaW5nICovCisjZWxzZQorICAgIHNwcmludGYocGF0aCwgIjxmZDolZD4iLCBmZCk7ICAgLyogZm9yIGRlYnVnZ2luZyAqLworI2VuZGlmCisgICAgZ3ogPSBnel9vcGVuKHBhdGgsIGZkLCBtb2RlKTsKKyAgICBmcmVlKHBhdGgpOworICAgIHJldHVybiBnejsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworI2lmZGVmIF9XSU4zMgorZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuX3cocGF0aCwgbW9kZSkKKyAgICBjb25zdCB3Y2hhcl90ICpwYXRoOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgLTIsIG1vZGUpOworfQorI2VuZGlmCisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6YnVmZmVyKGZpbGUsIHNpemUpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgdW5zaWduZWQgc2l6ZTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IGFscmVhZHkgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBjaGVjayBhbmQgc2V0IHJlcXVlc3RlZCBzaXplICovCisgICAgaWYgKHNpemUgPCAyKQorICAgICAgICBzaXplID0gMjsgICAgICAgICAgICAgICAvKiBuZWVkIHR3byBieXRlcyB0byBjaGVjayBtYWdpYyBoZWFkZXIgKi8KKyAgICBzdGF0ZS0+d2FudCA9IHNpemU7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6cmV3aW5kKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKKyAgICAgICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGJhY2sgdXAgYW5kIHN0YXJ0IG92ZXIgKi8KKyAgICBpZiAoTFNFRUsoc3RhdGUtPmZkLCBzdGF0ZS0+c3RhcnQsIFNFRUtfU0VUKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGd6X3Jlc2V0KHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworel9vZmY2NF90IFpFWFBPUlQgZ3pzZWVrNjQoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgel9vZmY2NF90IG9mZnNldDsKKyAgICBpbnQgd2hlbmNlOworeworICAgIHVuc2lnbmVkIG47CisgICAgel9vZmY2NF90IHJldDsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY2FuIG9ubHkgc2VlayBmcm9tIHN0YXJ0IG9yIHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICBpZiAod2hlbmNlICE9IFNFRUtfU0VUICYmIHdoZW5jZSAhPSBTRUVLX0NVUikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogbm9ybWFsaXplIG9mZnNldCB0byBhIFNFRUtfQ1VSIHNwZWNpZmljYXRpb24gKi8KKyAgICBpZiAod2hlbmNlID09IFNFRUtfU0VUKQorICAgICAgICBvZmZzZXQgLT0gc3RhdGUtPngucG9zOworICAgIGVsc2UgaWYgKHN0YXRlLT5zZWVrKQorICAgICAgICBvZmZzZXQgKz0gc3RhdGUtPnNraXA7CisgICAgc3RhdGUtPnNlZWsgPSAwOworCisgICAgLyogaWYgd2l0aGluIHJhdyBhcmVhIHdoaWxlIHJlYWRpbmcsIGp1c3QgZ28gdGhlcmUgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCAmJiBzdGF0ZS0+aG93ID09IENPUFkgJiYKKyAgICAgICAgICAgIHN0YXRlLT54LnBvcyArIG9mZnNldCA+PSAwKSB7CisgICAgICAgIHJldCA9IExTRUVLKHN0YXRlLT5mZCwgb2Zmc2V0IC0gc3RhdGUtPnguaGF2ZSwgU0VFS19DVVIpOworICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzdGF0ZS0+eC5oYXZlID0gMDsKKyAgICAgICAgc3RhdGUtPmVvZiA9IDA7CisgICAgICAgIHN0YXRlLT5wYXN0ID0gMDsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7CisgICAgICAgIHN0YXRlLT5zdHJtLmF2YWlsX2luID0gMDsKKyAgICAgICAgc3RhdGUtPngucG9zICs9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHN0YXRlLT54LnBvczsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgc2tpcCBhbW91bnQsIHJld2luZGluZyBpZiBuZWVkZWQgZm9yIGJhY2sgc2VlayB3aGVuIHJlYWRpbmcgKi8KKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCkgICAgICAgICAvKiB3cml0aW5nIC0tIGNhbid0IGdvIGJhY2t3YXJkcyAqLworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBvZmZzZXQgKz0gc3RhdGUtPngucG9zOworICAgICAgICBpZiAob2Zmc2V0IDwgMCkgICAgICAgICAgICAgICAgICAgICAvKiBiZWZvcmUgc3RhcnQgb2YgZmlsZSEgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGd6cmV3aW5kKGZpbGUpID09IC0xKSAgICAgICAgICAgLyogcmV3aW5kLCB0aGVuIHNraXAgdG8gb2Zmc2V0ICovCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogaWYgcmVhZGluZywgc2tpcCB3aGF0J3MgaW4gb3V0cHV0IGJ1ZmZlciAob25lIGxlc3MgZ3pnZXRjKCkgY2hlY2spICovCisgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQpIHsKKyAgICAgICAgbiA9IEdUX09GRihzdGF0ZS0+eC5oYXZlKSB8fCAoel9vZmY2NF90KXN0YXRlLT54LmhhdmUgPiBvZmZzZXQgPworICAgICAgICAgICAgKHVuc2lnbmVkKW9mZnNldCA6IHN0YXRlLT54LmhhdmU7CisgICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKKyAgICAgICAgc3RhdGUtPngubmV4dCArPSBuOworICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKKyAgICAgICAgb2Zmc2V0IC09IG47CisgICAgfQorCisgICAgLyogcmVxdWVzdCBza2lwIChpZiBub3QgemVybykgKi8KKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMTsKKyAgICAgICAgc3RhdGUtPnNraXAgPSBvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiBzdGF0ZS0+eC5wb3MgKyBvZmZzZXQ7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3pfb2ZmX3QgWkVYUE9SVCBnenNlZWsoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgel9vZmZfdCBvZmZzZXQ7CisgICAgaW50IHdoZW5jZTsKK3sKKyAgICB6X29mZjY0X3QgcmV0OworCisgICAgcmV0ID0gZ3pzZWVrNjQoZmlsZSwgKHpfb2ZmNjRfdClvZmZzZXQsIHdoZW5jZSk7CisgICAgcmV0dXJuIHJldCA9PSAoel9vZmZfdClyZXQgPyAoel9vZmZfdClyZXQgOiAtMTsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIHJldHVybiBwb3NpdGlvbiAqLworICAgIHJldHVybiBzdGF0ZS0+eC5wb3MgKyAoc3RhdGUtPnNlZWsgPyBzdGF0ZS0+c2tpcCA6IDApOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCit6X29mZl90IFpFWFBPUlQgZ3p0ZWxsKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgel9vZmY2NF90IHJldDsKKworICAgIHJldCA9IGd6dGVsbDY0KGZpbGUpOworICAgIHJldHVybiByZXQgPT0gKHpfb2ZmX3QpcmV0ID8gKHpfb2ZmX3QpcmV0IDogLTE7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3pfb2ZmNjRfdCBaRVhQT1JUIGd6b2Zmc2V0NjQoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICB6X29mZjY0X3Qgb2Zmc2V0OworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgYW5kIGNoZWNrIGludGVncml0eSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCAmJiBzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY29tcHV0ZSBhbmQgcmV0dXJuIGVmZmVjdGl2ZSBvZmZzZXQgaW4gZmlsZSAqLworICAgIG9mZnNldCA9IExTRUVLKHN0YXRlLT5mZCwgMCwgU0VFS19DVVIpOworICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgICAgICAgICAgICAgLyogcmVhZGluZyAqLworICAgICAgICBvZmZzZXQgLT0gc3RhdGUtPnN0cm0uYXZhaWxfaW47ICAgICAvKiBkb24ndCBjb3VudCBidWZmZXJlZCBpbnB1dCAqLworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3pfb2ZmX3QgWkVYUE9SVCBnem9mZnNldChmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIHpfb2ZmNjRfdCByZXQ7CisKKyAgICByZXQgPSBnem9mZnNldDY0KGZpbGUpOworICAgIHJldHVybiByZXQgPT0gKHpfb2ZmX3QpcmV0ID8gKHpfb2ZmX3QpcmV0IDogLTE7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6ZW9mKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSBhbmQgY2hlY2sgaW50ZWdyaXR5ICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogcmV0dXJuIGVuZC1vZi1maWxlIHN0YXRlICovCisgICAgcmV0dXJuIHN0YXRlLT5tb2RlID09IEdaX1JFQUQgPyBzdGF0ZS0+cGFzdCA6IDA7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2NvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IoZmlsZSwgZXJybnVtKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCAqZXJybnVtOworeworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgYW5kIGNoZWNrIGludGVncml0eSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEICYmIHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIHJldHVybiBlcnJvciBpbmZvcm1hdGlvbiAqLworICAgIGlmIChlcnJudW0gIT0gTlVMTCkKKyAgICAgICAgKmVycm51bSA9IHN0YXRlLT5lcnI7CisgICAgcmV0dXJuIHN0YXRlLT5lcnIgPT0gWl9NRU1fRVJST1IgPyAib3V0IG9mIG1lbW9yeSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLT5tc2cgPT0gTlVMTCA/ICIiIDogc3RhdGUtPm1zZyk7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK3ZvaWQgWkVYUE9SVCBnemNsZWFyZXJyKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSBhbmQgY2hlY2sgaW50ZWdyaXR5ICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEICYmIHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBjbGVhciBlcnJvciBhbmQgZW5kLW9mLWZpbGUgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgeworICAgICAgICBzdGF0ZS0+ZW9mID0gMDsKKyAgICAgICAgc3RhdGUtPnBhc3QgPSAwOworICAgIH0KKyAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7Cit9CisKKy8qIENyZWF0ZSBhbiBlcnJvciBtZXNzYWdlIGluIGFsbG9jYXRlZCBtZW1vcnkgYW5kIHNldCBzdGF0ZS0+ZXJyIGFuZAorICAgc3RhdGUtPm1zZyBhY2NvcmRpbmdseS4gIEZyZWUgYW55IHByZXZpb3VzIGVycm9yIG1lc3NhZ2UgYWxyZWFkeSB0aGVyZS4gIERvCisgICBub3QgdHJ5IHRvIGZyZWUgb3IgYWxsb2NhdGUgc3BhY2UgaWYgdGhlIGVycm9yIGlzIFpfTUVNX0VSUk9SIChvdXQgb2YKKyAgIG1lbW9yeSkuICBTaW1wbHkgc2F2ZSB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhIHN0YXRpYyBzdHJpbmcuICBJZiB0aGVyZSBpcyBhbgorICAgYWxsb2NhdGlvbiBmYWlsdXJlIGNvbnN0cnVjdGluZyB0aGUgZXJyb3IgbWVzc2FnZSwgdGhlbiBjb252ZXJ0IHRoZSBlcnJvciB0bworICAgb3V0IG9mIG1lbW9yeS4gKi8KK3ZvaWQgWkxJQl9JTlRFUk5BTCBnel9lcnJvcihzdGF0ZSwgZXJyLCBtc2cpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIGludCBlcnI7CisgICAgY29uc3QgY2hhciAqbXNnOworeworICAgIC8qIGZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVzc2FnZSBhbmQgY2xlYXIgKi8KKyAgICBpZiAoc3RhdGUtPm1zZyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdGF0ZS0+ZXJyICE9IFpfTUVNX0VSUk9SKQorICAgICAgICAgICAgZnJlZShzdGF0ZS0+bXNnKTsKKyAgICAgICAgc3RhdGUtPm1zZyA9IE5VTEw7CisgICAgfQorCisgICAgLyogaWYgZmF0YWwsIHNldCBzdGF0ZS0+eC5oYXZlIHRvIDAgc28gdGhhdCB0aGUgZ3pnZXRjKCkgbWFjcm8gZmFpbHMgKi8KKyAgICBpZiAoZXJyICE9IFpfT0sgJiYgZXJyICE9IFpfQlVGX0VSUk9SKQorICAgICAgICBzdGF0ZS0+eC5oYXZlID0gMDsKKworICAgIC8qIHNldCBlcnJvciBjb2RlLCBhbmQgaWYgbm8gbWVzc2FnZSwgdGhlbiBkb25lICovCisgICAgc3RhdGUtPmVyciA9IGVycjsKKyAgICBpZiAobXNnID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIGZvciBhbiBvdXQgb2YgbWVtb3J5IGVycm9yLCByZXR1cm4gbGl0ZXJhbCBzdHJpbmcgd2hlbiByZXF1ZXN0ZWQgKi8KKyAgICBpZiAoZXJyID09IFpfTUVNX0VSUk9SKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBjb25zdHJ1Y3QgZXJyb3IgbWVzc2FnZSB3aXRoIHBhdGggKi8KKyAgICBpZiAoKHN0YXRlLT5tc2cgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oc3RhdGUtPnBhdGgpICsgc3RybGVuKG1zZykgKyAzKSkgPT0KKyAgICAgICAgICAgIE5VTEwpIHsKKyAgICAgICAgc3RhdGUtPmVyciA9IFpfTUVNX0VSUk9SOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmICFkZWZpbmVkKE5PX3NucHJpbnRmKSAmJiAhZGVmaW5lZChOT192c25wcmludGYpCisgICAgc25wcmludGYoc3RhdGUtPm1zZywgc3RybGVuKHN0YXRlLT5wYXRoKSArIHN0cmxlbihtc2cpICsgMywKKyAgICAgICAgICAgICAiJXMlcyVzIiwgc3RhdGUtPnBhdGgsICI6ICIsIG1zZyk7CisjZWxzZQorICAgIHN0cmNweShzdGF0ZS0+bXNnLCBzdGF0ZS0+cGF0aCk7CisgICAgc3RyY2F0KHN0YXRlLT5tc2csICI6ICIpOworICAgIHN0cmNhdChzdGF0ZS0+bXNnLCBtc2cpOworI2VuZGlmCisgICAgcmV0dXJuOworfQorCisjaWZuZGVmIElOVF9NQVgKKy8qIHBvcnRhYmx5IHJldHVybiBtYXhpbXVtIHZhbHVlIGZvciBhbiBpbnQgKHdoZW4gbGltaXRzLmggcHJlc3VtZWQgbm90CisgICBhdmFpbGFibGUpIC0tIHdlIG5lZWQgdG8gZG8gdGhpcyB0byBjb3ZlciBjYXNlcyB3aGVyZSAyJ3MgY29tcGxlbWVudCBub3QKKyAgIHVzZWQsIHNpbmNlIEMgc3RhbmRhcmQgcGVybWl0cyAxJ3MgY29tcGxlbWVudCBhbmQgc2lnbi1iaXQgcmVwcmVzZW50YXRpb25zLAorICAgb3RoZXJ3aXNlIHdlIGNvdWxkIGp1c3QgdXNlICgodW5zaWduZWQpLTEpID4+IDEgKi8KK3Vuc2lnbmVkIFpMSUJfSU5URVJOQUwgZ3pfaW50bWF4KCkKK3sKKyAgICB1bnNpZ25lZCBwLCBxOworCisgICAgcCA9IDE7CisgICAgZG8geworICAgICAgICBxID0gcDsKKyAgICAgICAgcCA8PD0gMTsKKyAgICAgICAgcCsrOworICAgIH0gd2hpbGUgKHAgPiBxKTsKKyAgICByZXR1cm4gcSA+PiAxOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvZ3pyZWFkLmMgYi9Nb2R1bGVzL3psaWIvZ3pyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0NTM4ZQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvemxpYi9nenJlYWQuYwpAQCAtMCwwICsxLDU5NCBAQAorLyogZ3pyZWFkLmMgLS0gemxpYiBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgZ3ppcCBmaWxlcworICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaW5jbHVkZSAiZ3pndXRzLmgiCisKKy8qIExvY2FsIGZ1bmN0aW9ucyAqLworbG9jYWwgaW50IGd6X2xvYWQgT0YoKGd6X3N0YXRlcCwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQgKikpOworbG9jYWwgaW50IGd6X2F2YWlsIE9GKChnel9zdGF0ZXApKTsKK2xvY2FsIGludCBnel9sb29rIE9GKChnel9zdGF0ZXApKTsKK2xvY2FsIGludCBnel9kZWNvbXAgT0YoKGd6X3N0YXRlcCkpOworbG9jYWwgaW50IGd6X2ZldGNoIE9GKChnel9zdGF0ZXApKTsKK2xvY2FsIGludCBnel9za2lwIE9GKChnel9zdGF0ZXAsIHpfb2ZmNjRfdCkpOworCisvKiBVc2UgcmVhZCgpIHRvIGxvYWQgYSBidWZmZXIgLS0gcmV0dXJuIC0xIG9uIGVycm9yLCBvdGhlcndpc2UgMC4gIFJlYWQgZnJvbQorICAgc3RhdGUtPmZkLCBhbmQgdXBkYXRlIHN0YXRlLT5lb2YsIHN0YXRlLT5lcnIsIGFuZCBzdGF0ZS0+bXNnIGFzIGFwcHJvcHJpYXRlLgorICAgVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBsb29wIG9uIHJlYWQoKSwgc2luY2UgcmVhZCgpIGlzIG5vdCBndWFyYW50ZWVkIHRvCisgICByZWFkIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgZGVzY3JpcHRvci4gKi8KK2xvY2FsIGludCBnel9sb2FkKHN0YXRlLCBidWYsIGxlbiwgaGF2ZSkKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgIHVuc2lnbmVkIGxlbjsKKyAgICB1bnNpZ25lZCAqaGF2ZTsKK3sKKyAgICBpbnQgcmV0OworCisgICAgKmhhdmUgPSAwOworICAgIGRvIHsKKyAgICAgICAgcmV0ID0gcmVhZChzdGF0ZS0+ZmQsIGJ1ZiArICpoYXZlLCBsZW4gLSAqaGF2ZSk7CisgICAgICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAqaGF2ZSArPSByZXQ7CisgICAgfSB3aGlsZSAoKmhhdmUgPCBsZW4pOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0VSUk5PLCB6c3RyZXJyb3IoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJldCA9PSAwKQorICAgICAgICBzdGF0ZS0+ZW9mID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworLyogTG9hZCB1cCBpbnB1dCBidWZmZXIgYW5kIHNldCBlb2YgZmxhZyBpZiBsYXN0IGRhdGEgbG9hZGVkIC0tIHJldHVybiAtMSBvbgorICAgZXJyb3IsIDAgb3RoZXJ3aXNlLiAgTm90ZSB0aGF0IHRoZSBlb2YgZmxhZyBpcyBzZXQgd2hlbiB0aGUgZW5kIG9mIHRoZSBpbnB1dAorICAgZmlsZSBpcyByZWFjaGVkLCBldmVuIHRob3VnaCB0aGVyZSBtYXkgYmUgdW51c2VkIGRhdGEgaW4gdGhlIGJ1ZmZlci4gIE9uY2UKKyAgIHRoYXQgZGF0YSBoYXMgYmVlbiB1c2VkLCBubyBtb3JlIGF0dGVtcHRzIHdpbGwgYmUgbWFkZSB0byByZWFkIHRoZSBmaWxlLgorICAgSWYgc3RybS0+YXZhaWxfaW4gIT0gMCwgdGhlbiB0aGUgY3VycmVudCBkYXRhIGlzIG1vdmVkIHRvIHRoZSBiZWdpbm5pbmcgb2YKKyAgIHRoZSBpbnB1dCBidWZmZXIsIGFuZCB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1ZmZlciBpcyBsb2FkZWQgd2l0aCB0aGUKKyAgIGF2YWlsYWJsZSBkYXRhIGZyb20gdGhlIGlucHV0IGZpbGUuICovCitsb2NhbCBpbnQgZ3pfYXZhaWwoc3RhdGUpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworeworICAgIHVuc2lnbmVkIGdvdDsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgaWYgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHN0YXRlLT5lb2YgPT0gMCkgeworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4pIHsgICAgICAgLyogY29weSB3aGF0J3MgdGhlcmUgdG8gdGhlIHN0YXJ0ICovCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwID0gc3RhdGUtPmluOworICAgICAgICAgICAgdW5zaWduZWQgY29uc3QgY2hhciAqcSA9IHN0cm0tPm5leHRfaW47CisgICAgICAgICAgICB1bnNpZ25lZCBuID0gc3RybS0+YXZhaWxfaW47CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgKnArKyA9ICpxKys7CisgICAgICAgICAgICB9IHdoaWxlICgtLW4pOworICAgICAgICB9CisgICAgICAgIGlmIChnel9sb2FkKHN0YXRlLCBzdGF0ZS0+aW4gKyBzdHJtLT5hdmFpbF9pbiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnNpemUgLSBzdHJtLT5hdmFpbF9pbiwgJmdvdCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHN0cm0tPmF2YWlsX2luICs9IGdvdDsKKyAgICAgICAgc3RybS0+bmV4dF9pbiA9IHN0YXRlLT5pbjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIExvb2sgZm9yIGd6aXAgaGVhZGVyLCBzZXQgdXAgZm9yIGluZmxhdGUgb3IgY29weS4gIHN0YXRlLT54LmhhdmUgbXVzdCBiZSAwLgorICAgSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBpbiwgYWxsb2NhdGUgcmVxdWlyZWQgbWVtb3J5LiAgc3RhdGUtPmhvdyB3aWxsIGJlCisgICBsZWZ0IHVuY2hhbmdlZCBpZiB0aGVyZSBpcyBubyBtb3JlIGlucHV0IGRhdGEgYXZhaWxhYmxlLCB3aWxsIGJlIHNldCB0byBDT1BZCisgICBpZiB0aGVyZSBpcyBubyBnemlwIGhlYWRlciBhbmQgZGlyZWN0IGNvcHlpbmcgd2lsbCBiZSBwZXJmb3JtZWQsIG9yIGl0IHdpbGwKKyAgIGJlIHNldCB0byBHWklQIGZvciBkZWNvbXByZXNzaW9uLiAgSWYgZGlyZWN0IGNvcHlpbmcsIHRoZW4gbGVmdG92ZXIgaW5wdXQKKyAgIGRhdGEgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgYmUgY29waWVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiAgSW4gdGhhdAorICAgY2FzZSwgYWxsIGZ1cnRoZXIgZmlsZSByZWFkcyB3aWxsIGJlIGRpcmVjdGx5IHRvIGVpdGhlciB0aGUgb3V0cHV0IGJ1ZmZlciBvcgorICAgYSB1c2VyIGJ1ZmZlci4gIElmIGRlY29tcHJlc3NpbmcsIHRoZSBpbmZsYXRlIHN0YXRlIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICBnel9sb29rKCkgd2lsbCByZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC0xIG9uIGZhaWx1cmUuICovCitsb2NhbCBpbnQgZ3pfbG9vayhzdGF0ZSkKKyAgICBnel9zdGF0ZXAgc3RhdGU7Cit7CisgICAgel9zdHJlYW1wIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGFsbG9jYXRlIHJlYWQgYnVmZmVycyBhbmQgaW5mbGF0ZSBtZW1vcnkgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUgPT0gMCkgeworICAgICAgICAvKiBhbGxvY2F0ZSBidWZmZXJzICovCisgICAgICAgIHN0YXRlLT5pbiA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKHN0YXRlLT53YW50KTsKKyAgICAgICAgc3RhdGUtPm91dCA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKHN0YXRlLT53YW50IDw8IDEpOworICAgICAgICBpZiAoc3RhdGUtPmluID09IE5VTEwgfHwgc3RhdGUtPm91dCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUtPm91dCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGZyZWUoc3RhdGUtPm91dCk7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmluICE9IE5VTEwpCisgICAgICAgICAgICAgICAgZnJlZShzdGF0ZS0+aW4pOworICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfTUVNX0VSUk9SLCAib3V0IG9mIG1lbW9yeSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zaXplID0gc3RhdGUtPndhbnQ7CisKKyAgICAgICAgLyogYWxsb2NhdGUgaW5mbGF0ZSBtZW1vcnkgKi8KKyAgICAgICAgc3RhdGUtPnN0cm0uemFsbG9jID0gWl9OVUxMOworICAgICAgICBzdGF0ZS0+c3RybS56ZnJlZSA9IFpfTlVMTDsKKyAgICAgICAgc3RhdGUtPnN0cm0ub3BhcXVlID0gWl9OVUxMOworICAgICAgICBzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IDA7CisgICAgICAgIHN0YXRlLT5zdHJtLm5leHRfaW4gPSBaX05VTEw7CisgICAgICAgIGlmIChpbmZsYXRlSW5pdDIoJihzdGF0ZS0+c3RybSksIDE1ICsgMTYpICE9IFpfT0spIHsgICAgLyogZ3VuemlwICovCisgICAgICAgICAgICBmcmVlKHN0YXRlLT5vdXQpOworICAgICAgICAgICAgZnJlZShzdGF0ZS0+aW4pOworICAgICAgICAgICAgc3RhdGUtPnNpemUgPSAwOworICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfTUVNX0VSUk9SLCAib3V0IG9mIG1lbW9yeSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IGF0IGxlYXN0IHRoZSBtYWdpYyBieXRlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgaWYgKHN0cm0tPmF2YWlsX2luIDwgMikgeworICAgICAgICBpZiAoZ3pfYXZhaWwoc3RhdGUpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGxvb2sgZm9yIGd6aXAgbWFnaWMgYnl0ZXMgLS0gaWYgdGhlcmUsIGRvIGd6aXAgZGVjb2RpbmcgKG5vdGU6IHRoZXJlIGlzCisgICAgICAgYSBsb2dpY2FsIGRpbGVtbWEgaGVyZSB3aGVuIGNvbnNpZGVyaW5nIHRoZSBjYXNlIG9mIGEgcGFydGlhbGx5IHdyaXR0ZW4KKyAgICAgICBnemlwIGZpbGUsIHRvIHdpdCwgaWYgYSBzaW5nbGUgMzEgYnl0ZSBpcyB3cml0dGVuLCB0aGVuIHdlIGNhbm5vdCB0ZWxsCisgICAgICAgd2hldGhlciB0aGlzIGlzIGEgc2luZ2xlLWJ5dGUgZmlsZSwgb3IganVzdCBhIHBhcnRpYWxseSB3cml0dGVuIGd6aXAKKyAgICAgICBmaWxlIC0tIGZvciBoZXJlIHdlIGFzc3VtZSB0aGF0IGlmIGEgZ3ppcCBmaWxlIGlzIGJlaW5nIHdyaXR0ZW4sIHRoZW4KKyAgICAgICB0aGUgaGVhZGVyIHdpbGwgYmUgd3JpdHRlbiBpbiBhIHNpbmdsZSBvcGVyYXRpb24sIHNvIHRoYXQgcmVhZGluZyBhCisgICAgICAgc2luZ2xlIGJ5dGUgaXMgc3VmZmljaWVudCBpbmRpY2F0aW9uIHRoYXQgaXQgaXMgbm90IGEgZ3ppcCBmaWxlKSAqLworICAgIGlmIChzdHJtLT5hdmFpbF9pbiA+IDEgJiYKKyAgICAgICAgICAgIHN0cm0tPm5leHRfaW5bMF0gPT0gMzEgJiYgc3RybS0+bmV4dF9pblsxXSA9PSAxMzkpIHsKKyAgICAgICAgaW5mbGF0ZVJlc2V0KHN0cm0pOworICAgICAgICBzdGF0ZS0+aG93ID0gR1pJUDsKKyAgICAgICAgc3RhdGUtPmRpcmVjdCA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIG5vIGd6aXAgaGVhZGVyIC0tIGlmIHdlIHdlcmUgZGVjb2RpbmcgZ3ppcCBiZWZvcmUsIHRoZW4gdGhpcyBpcyB0cmFpbGluZworICAgICAgIGdhcmJhZ2UuICBJZ25vcmUgdGhlIHRyYWlsaW5nIGdhcmJhZ2UgYW5kIGZpbmlzaC4gKi8KKyAgICBpZiAoc3RhdGUtPmRpcmVjdCA9PSAwKSB7CisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gMDsKKyAgICAgICAgc3RhdGUtPmVvZiA9IDE7CisgICAgICAgIHN0YXRlLT54LmhhdmUgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBkb2luZyByYXcgaS9vLCBjb3B5IGFueSBsZWZ0b3ZlciBpbnB1dCB0byBvdXRwdXQgLS0gdGhpcyBhc3N1bWVzIHRoYXQKKyAgICAgICB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiB0aGUgaW5wdXQgYnVmZmVyLCB3aGljaCBhbHNvIGFzc3VyZXMKKyAgICAgICBzcGFjZSBmb3IgZ3p1bmdldGMoKSAqLworICAgIHN0YXRlLT54Lm5leHQgPSBzdGF0ZS0+b3V0OworICAgIGlmIChzdHJtLT5hdmFpbF9pbikgeworICAgICAgICBtZW1jcHkoc3RhdGUtPngubmV4dCwgc3RybS0+bmV4dF9pbiwgc3RybS0+YXZhaWxfaW4pOworICAgICAgICBzdGF0ZS0+eC5oYXZlID0gc3RybS0+YXZhaWxfaW47CisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gMDsKKyAgICB9CisgICAgc3RhdGUtPmhvdyA9IENPUFk7CisgICAgc3RhdGUtPmRpcmVjdCA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIERlY29tcHJlc3MgZnJvbSBpbnB1dCB0byB0aGUgcHJvdmlkZWQgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBpbiB0aGUgc3RhdGUuCisgICBPbiByZXR1cm4sIHN0YXRlLT54LmhhdmUgYW5kIHN0YXRlLT54Lm5leHQgcG9pbnQgdG8gdGhlIGp1c3QgZGVjb21wcmVzc2VkCisgICBkYXRhLiAgSWYgdGhlIGd6aXAgc3RyZWFtIGNvbXBsZXRlcywgc3RhdGUtPmhvdyBpcyByZXNldCB0byBMT09LIHRvIGxvb2sgZm9yCisgICB0aGUgbmV4dCBnemlwIHN0cmVhbSBvciByYXcgZGF0YSwgb25jZSBzdGF0ZS0+eC5oYXZlIGlzIGRlcGxldGVkLiAgUmV0dXJucyAwCisgICBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLiAqLworbG9jYWwgaW50IGd6X2RlY29tcChzdGF0ZSkKKyAgICBnel9zdGF0ZXAgc3RhdGU7Cit7CisgICAgaW50IHJldCA9IFpfT0s7CisgICAgdW5zaWduZWQgaGFkOworICAgIHpfc3RyZWFtcCBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBmaWxsIG91dHB1dCBidWZmZXIgdXAgdG8gZW5kIG9mIGRlZmxhdGUgc3RyZWFtICovCisgICAgaGFkID0gc3RybS0+YXZhaWxfb3V0OworICAgIGRvIHsKKyAgICAgICAgLyogZ2V0IG1vcmUgaW5wdXQgZm9yIGluZmxhdGUoKSAqLworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBnel9hdmFpbChzdGF0ZSkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9CVUZfRVJST1IsICJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRlY29tcHJlc3MgYW5kIGhhbmRsZSBlcnJvcnMgKi8KKyAgICAgICAgcmV0ID0gaW5mbGF0ZShzdHJtLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FUlJPUiB8fCByZXQgPT0gWl9ORUVEX0RJQ1QpIHsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX1NUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBlcnJvcjogaW5mbGF0ZSBzdHJlYW0gY29ycnVwdCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gWl9NRU1fRVJST1IpIHsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IFpfREFUQV9FUlJPUikgeyAgICAgICAgICAgICAgLyogZGVmbGF0ZSBzdHJlYW0gaW52YWxpZCAqLworICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfREFUQV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9PSBOVUxMID8gImNvbXByZXNzZWQgZGF0YSBlcnJvciIgOiBzdHJtLT5tc2cpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfSB3aGlsZSAoc3RybS0+YXZhaWxfb3V0ICYmIHJldCAhPSBaX1NUUkVBTV9FTkQpOworCisgICAgLyogdXBkYXRlIGF2YWlsYWJsZSBvdXRwdXQgKi8KKyAgICBzdGF0ZS0+eC5oYXZlID0gaGFkIC0gc3RybS0+YXZhaWxfb3V0OworICAgIHN0YXRlLT54Lm5leHQgPSBzdHJtLT5uZXh0X291dCAtIHN0YXRlLT54LmhhdmU7CisKKyAgICAvKiBpZiB0aGUgZ3ppcCBzdHJlYW0gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgbG9vayBmb3IgYW5vdGhlciAqLworICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorICAgICAgICBzdGF0ZS0+aG93ID0gTE9PSzsKKworICAgIC8qIGdvb2QgZGVjb21wcmVzc2lvbiAqLworICAgIHJldHVybiAwOworfQorCisvKiBGZXRjaCBkYXRhIGFuZCBwdXQgaXQgaW4gdGhlIG91dHB1dCBidWZmZXIuICBBc3N1bWVzIHN0YXRlLT54LmhhdmUgaXMgMC4KKyAgIERhdGEgaXMgZWl0aGVyIGNvcGllZCBmcm9tIHRoZSBpbnB1dCBmaWxlIG9yIGRlY29tcHJlc3NlZCBmcm9tIHRoZSBpbnB1dAorICAgZmlsZSBkZXBlbmRpbmcgb24gc3RhdGUtPmhvdy4gIElmIHN0YXRlLT5ob3cgaXMgTE9PSywgdGhlbiBhIGd6aXAgaGVhZGVyIGlzCisgICBsb29rZWQgZm9yIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGNvcHkgb3IgZGVjb21wcmVzcy4gIFJldHVybnMgLTEgb24gZXJyb3IsCisgICBvdGhlcndpc2UgMC4gIGd6X2ZldGNoKCkgd2lsbCBsZWF2ZSBzdGF0ZS0+aG93IGFzIENPUFkgb3IgR1pJUCB1bmxlc3MgdGhlCisgICBlbmQgb2YgdGhlIGlucHV0IGZpbGUgaGFzIGJlZW4gcmVhY2hlZCBhbmQgYWxsIGRhdGEgaGFzIGJlZW4gcHJvY2Vzc2VkLiAgKi8KK2xvY2FsIGludCBnel9mZXRjaChzdGF0ZSkKKyAgICBnel9zdGF0ZXAgc3RhdGU7Cit7CisgICAgel9zdHJlYW1wIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIGRvIHsKKyAgICAgICAgc3dpdGNoKHN0YXRlLT5ob3cpIHsKKyAgICAgICAgY2FzZSBMT09LOiAgICAgIC8qIC0+IExPT0ssIENPUFkgKG9ubHkgaWYgbmV2ZXIgR1pJUCksIG9yIEdaSVAgKi8KKyAgICAgICAgICAgIGlmIChnel9sb29rKHN0YXRlKSA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhvdyA9PSBMT09LKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ09QWTogICAgICAvKiAtPiBDT1BZICovCisgICAgICAgICAgICBpZiAoZ3pfbG9hZChzdGF0ZSwgc3RhdGUtPm91dCwgc3RhdGUtPnNpemUgPDwgMSwgJihzdGF0ZS0+eC5oYXZlKSkKKyAgICAgICAgICAgICAgICAgICAgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc3RhdGUtPngubmV4dCA9IHN0YXRlLT5vdXQ7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBHWklQOiAgICAgIC8qIC0+IEdaSVAgb3IgTE9PSyAoaWYgZW5kIG9mIGd6aXAgc3RyZWFtKSAqLworICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gc3RhdGUtPnNpemUgPDwgMTsKKyAgICAgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gc3RhdGUtPm91dDsKKyAgICAgICAgICAgIGlmIChnel9kZWNvbXAoc3RhdGUpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHN0YXRlLT54LmhhdmUgPT0gMCAmJiAoIXN0YXRlLT5lb2YgfHwgc3RybS0+YXZhaWxfaW4pKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogU2tpcCBsZW4gdW5jb21wcmVzc2VkIGJ5dGVzIG9mIG91dHB1dC4gIFJldHVybiAtMSBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLiAqLworbG9jYWwgaW50IGd6X3NraXAoc3RhdGUsIGxlbikKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9vZmY2NF90IGxlbjsKK3sKKyAgICB1bnNpZ25lZCBuOworCisgICAgLyogc2tpcCBvdmVyIGxlbiBieXRlcyBvciByZWFjaCBlbmQtb2YtZmlsZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0ICovCisgICAgd2hpbGUgKGxlbikKKyAgICAgICAgLyogc2tpcCBvdmVyIHdoYXRldmVyIGlzIGluIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgaWYgKHN0YXRlLT54LmhhdmUpIHsKKyAgICAgICAgICAgIG4gPSBHVF9PRkYoc3RhdGUtPnguaGF2ZSkgfHwgKHpfb2ZmNjRfdClzdGF0ZS0+eC5oYXZlID4gbGVuID8KKyAgICAgICAgICAgICAgICAodW5zaWduZWQpbGVuIDogc3RhdGUtPnguaGF2ZTsKKyAgICAgICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKKyAgICAgICAgICAgIHN0YXRlLT54Lm5leHQgKz0gbjsKKyAgICAgICAgICAgIHN0YXRlLT54LnBvcyArPSBuOworICAgICAgICAgICAgbGVuIC09IG47CisgICAgICAgIH0KKworICAgICAgICAvKiBvdXRwdXQgYnVmZmVyIGVtcHR5IC0tIHJldHVybiBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCAqLworICAgICAgICBlbHNlIGlmIChzdGF0ZS0+ZW9mICYmIHN0YXRlLT5zdHJtLmF2YWlsX2luID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBuZWVkIG1vcmUgZGF0YSB0byBza2lwIC0tIGxvYWQgdXAgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIGdldCBtb3JlIG91dHB1dCwgbG9va2luZyBmb3IgaGVhZGVyIGlmIHJlcXVpcmVkICovCisgICAgICAgICAgICBpZiAoZ3pfZmV0Y2goc3RhdGUpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVCBnenJlYWQoZmlsZSwgYnVmLCBsZW4pCisgICAgZ3pGaWxlIGZpbGU7CisgICAgdm9pZHAgYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICB1bnNpZ25lZCBnb3QsIG47CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHpfc3RyZWFtcCBzdHJtOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHJlYWRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyAoc2VyaW91cykgZXJyb3IgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCB8fAorICAgICAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogc2luY2UgYW4gaW50IGlzIHJldHVybmVkLCBtYWtlIHN1cmUgbGVuIGZpdHMgaW4gb25lLCBvdGhlcndpc2UgcmV0dXJuCisgICAgICAgd2l0aCBhbiBlcnJvciAodGhpcyBhdm9pZHMgdGhlIGZsYXcgaW4gdGhlIGludGVyZmFjZSkgKi8KKyAgICBpZiAoKGludClsZW4gPCAwKSB7CisgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0RBVEFfRVJST1IsICJyZXF1ZXN0ZWQgbGVuZ3RoIGRvZXMgbm90IGZpdCBpbiBpbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGlmIGxlbiBpcyB6ZXJvLCBhdm9pZCB1bm5lY2Vzc2FyeSBvcGVyYXRpb25zICovCisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHByb2Nlc3MgYSBza2lwIHJlcXVlc3QgKi8KKyAgICBpZiAoc3RhdGUtPnNlZWspIHsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBpZiAoZ3pfc2tpcChzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGdldCBsZW4gYnl0ZXMgdG8gYnVmLCBvciBsZXNzIHRoYW4gbGVuIGlmIGF0IHRoZSBlbmQgKi8KKyAgICBnb3QgPSAwOworICAgIGRvIHsKKyAgICAgICAgLyogZmlyc3QganVzdCB0cnkgY29weWluZyBkYXRhIGZyb20gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgaWYgKHN0YXRlLT54LmhhdmUpIHsKKyAgICAgICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlID4gbGVuID8gbGVuIDogc3RhdGUtPnguaGF2ZTsKKyAgICAgICAgICAgIG1lbWNweShidWYsIHN0YXRlLT54Lm5leHQsIG4pOworICAgICAgICAgICAgc3RhdGUtPngubmV4dCArPSBuOworICAgICAgICAgICAgc3RhdGUtPnguaGF2ZSAtPSBuOworICAgICAgICB9CisKKyAgICAgICAgLyogb3V0cHV0IGJ1ZmZlciBlbXB0eSAtLSByZXR1cm4gaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgKi8KKyAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmVvZiAmJiBzdHJtLT5hdmFpbF9pbiA9PSAwKSB7CisgICAgICAgICAgICBzdGF0ZS0+cGFzdCA9IDE7ICAgICAgICAvKiB0cmllZCB0byByZWFkIHBhc3QgZW5kICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5lZWQgb3V0cHV0IGRhdGEgLS0gZm9yIHNtYWxsIGxlbiBvciBuZXcgc3RyZWFtIGxvYWQgdXAgb3VyIG91dHB1dAorICAgICAgICAgICBidWZmZXIgKi8KKyAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhvdyA9PSBMT09LIHx8IGxlbiA8IChzdGF0ZS0+c2l6ZSA8PCAxKSkgeworICAgICAgICAgICAgLyogZ2V0IG1vcmUgb3V0cHV0LCBsb29raW5nIGZvciBoZWFkZXIgaWYgcmVxdWlyZWQgKi8KKyAgICAgICAgICAgIGlmIChnel9mZXRjaChzdGF0ZSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgY29udGludWU7ICAgICAgIC8qIG5vIHByb2dyZXNzIHlldCAtLSBnbyBiYWNrIHRvIGNvcHkgYWJvdmUgKi8KKyAgICAgICAgICAgIC8qIHRoZSBjb3B5IGFib3ZlIGFzc3VyZXMgdGhhdCB3ZSB3aWxsIGxlYXZlIHdpdGggc3BhY2UgaW4gdGhlCisgICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVyLCBhbGxvd2luZyBhdCBsZWFzdCBvbmUgZ3p1bmdldGMoKSB0byBzdWNjZWVkICovCisgICAgICAgIH0KKworICAgICAgICAvKiBsYXJnZSBsZW4gLS0gcmVhZCBkaXJlY3RseSBpbnRvIHVzZXIgYnVmZmVyICovCisgICAgICAgIGVsc2UgaWYgKHN0YXRlLT5ob3cgPT0gQ09QWSkgeyAgICAgIC8qIHJlYWQgZGlyZWN0bHkgKi8KKyAgICAgICAgICAgIGlmIChnel9sb2FkKHN0YXRlLCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgbGVuLCAmbikgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogbGFyZ2UgbGVuIC0tIGRlY29tcHJlc3MgZGlyZWN0bHkgaW50byB1c2VyIGJ1ZmZlciAqLworICAgICAgICBlbHNlIHsgIC8qIHN0YXRlLT5ob3cgPT0gR1pJUCAqLworICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVuOworICAgICAgICAgICAgc3RybS0+bmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKKyAgICAgICAgICAgIGlmIChnel9kZWNvbXAoc3RhdGUpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlOworICAgICAgICAgICAgc3RhdGUtPnguaGF2ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiB1cGRhdGUgcHJvZ3Jlc3MgKi8KKyAgICAgICAgbGVuIC09IG47CisgICAgICAgIGJ1ZiA9IChjaGFyICopYnVmICsgbjsKKyAgICAgICAgZ290ICs9IG47CisgICAgICAgIHN0YXRlLT54LnBvcyArPSBuOworICAgIH0gd2hpbGUgKGxlbik7CisKKyAgICAvKiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byB1c2VyIGJ1ZmZlciAod2lsbCBmaXQgaW4gaW50KSAqLworICAgIHJldHVybiAoaW50KWdvdDsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworI2lmZGVmIFpfUFJFRklYX1NFVAorIyAgdW5kZWYgel9nemdldGMKKyNlbHNlCisjICB1bmRlZiBnemdldGMKKyNlbmRpZgoraW50IFpFWFBPUlQgZ3pnZXRjKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxXTsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gKHNlcmlvdXMpIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKKyAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogdHJ5IG91dHB1dCBidWZmZXIgKG5vIG5lZWQgdG8gY2hlY2sgZm9yIHNraXAgcmVxdWVzdCkgKi8KKyAgICBpZiAoc3RhdGUtPnguaGF2ZSkgeworICAgICAgICBzdGF0ZS0+eC5oYXZlLS07CisgICAgICAgIHN0YXRlLT54LnBvcysrOworICAgICAgICByZXR1cm4gKihzdGF0ZS0+eC5uZXh0KSsrOworICAgIH0KKworICAgIC8qIG5vdGhpbmcgdGhlcmUgLS0gdHJ5IGd6cmVhZCgpICovCisgICAgcmV0ID0gZ3pyZWFkKGZpbGUsIGJ1ZiwgMSk7CisgICAgcmV0dXJuIHJldCA8IDEgPyAtMSA6IGJ1ZlswXTsKK30KKworaW50IFpFWFBPUlQgZ3pnZXRjXyhmaWxlKQorZ3pGaWxlIGZpbGU7Cit7CisgICAgcmV0dXJuIGd6Z2V0YyhmaWxlKTsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3p1bmdldGMoYywgZmlsZSkKKyAgICBpbnQgYzsKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gKHNlcmlvdXMpIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKKyAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogcHJvY2VzcyBhIHNraXAgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel9za2lwKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogY2FuJ3QgcHVzaCBFT0YgKi8KKyAgICBpZiAoYyA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGlmIG91dHB1dCBidWZmZXIgZW1wdHksIHB1dCBieXRlIGF0IGVuZCAoYWxsb3dzIG1vcmUgcHVzaGluZykgKi8KKyAgICBpZiAoc3RhdGUtPnguaGF2ZSA9PSAwKSB7CisgICAgICAgIHN0YXRlLT54LmhhdmUgPSAxOworICAgICAgICBzdGF0ZS0+eC5uZXh0ID0gc3RhdGUtPm91dCArIChzdGF0ZS0+c2l6ZSA8PCAxKSAtIDE7CisgICAgICAgIHN0YXRlLT54Lm5leHRbMF0gPSBjOworICAgICAgICBzdGF0ZS0+eC5wb3MtLTsKKyAgICAgICAgc3RhdGUtPnBhc3QgPSAwOworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICAvKiBpZiBubyByb29tLCBnaXZlIHVwIChtdXN0IGhhdmUgYWxyZWFkeSBkb25lIGEgZ3p1bmdldGMoKSkgKi8KKyAgICBpZiAoc3RhdGUtPnguaGF2ZSA9PSAoc3RhdGUtPnNpemUgPDwgMSkpIHsKKyAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfREFUQV9FUlJPUiwgIm91dCBvZiByb29tIHRvIHB1c2ggY2hhcmFjdGVycyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogc2xpZGUgb3V0cHV0IGRhdGEgaWYgbmVlZGVkIGFuZCBpbnNlcnQgYnl0ZSBiZWZvcmUgZXhpc3RpbmcgZGF0YSAqLworICAgIGlmIChzdGF0ZS0+eC5uZXh0ID09IHN0YXRlLT5vdXQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqc3JjID0gc3RhdGUtPm91dCArIHN0YXRlLT54LmhhdmU7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBzdGF0ZS0+b3V0ICsgKHN0YXRlLT5zaXplIDw8IDEpOworICAgICAgICB3aGlsZSAoc3JjID4gc3RhdGUtPm91dCkKKyAgICAgICAgICAgICotLWRlc3QgPSAqLS1zcmM7CisgICAgICAgIHN0YXRlLT54Lm5leHQgPSBkZXN0OworICAgIH0KKyAgICBzdGF0ZS0+eC5oYXZlKys7CisgICAgc3RhdGUtPngubmV4dC0tOworICAgIHN0YXRlLT54Lm5leHRbMF0gPSBjOworICAgIHN0YXRlLT54LnBvcy0tOworICAgIHN0YXRlLT5wYXN0ID0gMDsKKyAgICByZXR1cm4gYzsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworY2hhciAqIFpFWFBPUlQgZ3pnZXRzKGZpbGUsIGJ1ZiwgbGVuKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworeworICAgIHVuc2lnbmVkIGxlZnQsIG47CisgICAgY2hhciAqc3RyOworICAgIHVuc2lnbmVkIGNoYXIgKmVvbDsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBjaGVjayBwYXJhbWV0ZXJzIGFuZCBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCB8fCBsZW4gPCAxKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIChzZXJpb3VzKSBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEIHx8CisgICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogcHJvY2VzcyBhIHNraXAgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel9za2lwKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBjb3B5IG91dHB1dCBieXRlcyB1cCB0byBuZXcgbGluZSBvciBsZW4gLSAxLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QgLS0KKyAgICAgICBhcHBlbmQgYSB0ZXJtaW5hdGluZyB6ZXJvIHRvIHRoZSBzdHJpbmcgKHdlIGRvbid0IGNoZWNrIGZvciBhIHplcm8gaW4KKyAgICAgICB0aGUgY29udGVudHMsIGxldCB0aGUgdXNlciB3b3JyeSBhYm91dCB0aGF0KSAqLworICAgIHN0ciA9IGJ1ZjsKKyAgICBsZWZ0ID0gKHVuc2lnbmVkKWxlbiAtIDE7CisgICAgaWYgKGxlZnQpIGRvIHsKKyAgICAgICAgLyogYXNzdXJlIHRoYXQgc29tZXRoaW5nIGlzIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlID09IDAgJiYgZ3pfZmV0Y2goc3RhdGUpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGVycm9yICovCisgICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlID09IDApIHsgICAgICAgLyogZW5kIG9mIGZpbGUgKi8KKyAgICAgICAgICAgIHN0YXRlLT5wYXN0ID0gMTsgICAgICAgICAgICAvKiByZWFkIHBhc3QgZW5kICovCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHdoYXQgd2UgaGF2ZSAqLworICAgICAgICB9CisKKyAgICAgICAgLyogbG9vayBmb3IgZW5kLW9mLWxpbmUgaW4gY3VycmVudCBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlID4gbGVmdCA/IGxlZnQgOiBzdGF0ZS0+eC5oYXZlOworICAgICAgICBlb2wgPSAodW5zaWduZWQgY2hhciAqKW1lbWNocihzdGF0ZS0+eC5uZXh0LCAnXG4nLCBuKTsKKyAgICAgICAgaWYgKGVvbCAhPSBOVUxMKQorICAgICAgICAgICAgbiA9ICh1bnNpZ25lZCkoZW9sIC0gc3RhdGUtPngubmV4dCkgKyAxOworCisgICAgICAgIC8qIGNvcHkgdGhyb3VnaCBlbmQtb2YtbGluZSwgb3IgcmVtYWluZGVyIGlmIG5vdCBmb3VuZCAqLworICAgICAgICBtZW1jcHkoYnVmLCBzdGF0ZS0+eC5uZXh0LCBuKTsKKyAgICAgICAgc3RhdGUtPnguaGF2ZSAtPSBuOworICAgICAgICBzdGF0ZS0+eC5uZXh0ICs9IG47CisgICAgICAgIHN0YXRlLT54LnBvcyArPSBuOworICAgICAgICBsZWZ0IC09IG47CisgICAgICAgIGJ1ZiArPSBuOworICAgIH0gd2hpbGUgKGxlZnQgJiYgZW9sID09IE5VTEwpOworCisgICAgLyogcmV0dXJuIHRlcm1pbmF0ZWQgc3RyaW5nLCBvciBpZiBub3RoaW5nLCBlbmQgb2YgZmlsZSAqLworICAgIGlmIChidWYgPT0gc3RyKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWZbMF0gPSAwOworICAgIHJldHVybiBzdHI7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6ZGlyZWN0KGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RhdGVwIHN0YXRlOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogaWYgdGhlIHN0YXRlIGlzIG5vdCBrbm93biwgYnV0IHdlIGNhbiBmaW5kIG91dCwgdGhlbiBkbyBzbyAodGhpcyBpcworICAgICAgIG1haW5seSBmb3IgcmlnaHQgYWZ0ZXIgYSBnem9wZW4oKSBvciBnemRvcGVuKCkpICovCisgICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQgJiYgc3RhdGUtPmhvdyA9PSBMT09LICYmIHN0YXRlLT54LmhhdmUgPT0gMCkKKyAgICAgICAgKHZvaWQpZ3pfbG9vayhzdGF0ZSk7CisKKyAgICAvKiByZXR1cm4gMSBpZiB0cmFuc3BhcmVudCwgMCBpZiBwcm9jZXNzaW5nIGEgZ3ppcCBzdHJlYW0gKi8KKyAgICByZXR1cm4gc3RhdGUtPmRpcmVjdDsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3pjbG9zZV9yKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgaW50IHJldCwgZXJyOworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHJlYWRpbmcgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogZnJlZSBtZW1vcnkgYW5kIGNsb3NlIGZpbGUgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUpIHsKKyAgICAgICAgaW5mbGF0ZUVuZCgmKHN0YXRlLT5zdHJtKSk7CisgICAgICAgIGZyZWUoc3RhdGUtPm91dCk7CisgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICB9CisgICAgZXJyID0gc3RhdGUtPmVyciA9PSBaX0JVRl9FUlJPUiA/IFpfQlVGX0VSUk9SIDogWl9PSzsKKyAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7CisgICAgZnJlZShzdGF0ZS0+cGF0aCk7CisgICAgcmV0ID0gY2xvc2Uoc3RhdGUtPmZkKTsKKyAgICBmcmVlKHN0YXRlKTsKKyAgICByZXR1cm4gcmV0ID8gWl9FUlJOTyA6IGVycjsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9nendyaXRlLmMgYi9Nb2R1bGVzL3psaWIvZ3p3cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzY3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL3psaWIvZ3p3cml0ZS5jCkBAIC0wLDAgKzEsNTc3IEBACisvKiBnendyaXRlLmMgLS0gemxpYiBmdW5jdGlvbnMgZm9yIHdyaXRpbmcgZ3ppcCBmaWxlcworICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaW5jbHVkZSAiZ3pndXRzLmgiCisKKy8qIExvY2FsIGZ1bmN0aW9ucyAqLworbG9jYWwgaW50IGd6X2luaXQgT0YoKGd6X3N0YXRlcCkpOworbG9jYWwgaW50IGd6X2NvbXAgT0YoKGd6X3N0YXRlcCwgaW50KSk7Citsb2NhbCBpbnQgZ3pfemVybyBPRigoZ3pfc3RhdGVwLCB6X29mZjY0X3QpKTsKKworLyogSW5pdGlhbGl6ZSBzdGF0ZSBmb3Igd3JpdGluZyBhIGd6aXAgZmlsZS4gIE1hcmsgaW5pdGlhbGl6YXRpb24gYnkgc2V0dGluZworICAgc3RhdGUtPnNpemUgdG8gbm9uLXplcm8uICBSZXR1cm4gLTEgb24gZmFpbHVyZSBvciAwIG9uIHN1Y2Nlc3MuICovCitsb2NhbCBpbnQgZ3pfaW5pdChzdGF0ZSkKKyAgICBnel9zdGF0ZXAgc3RhdGU7Cit7CisgICAgaW50IHJldDsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogYWxsb2NhdGUgaW5wdXQgYnVmZmVyICovCisgICAgc3RhdGUtPmluID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2Moc3RhdGUtPndhbnQpOworICAgIGlmIChzdGF0ZS0+aW4gPT0gTlVMTCkgeworICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9NRU1fRVJST1IsICJvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBvbmx5IG5lZWQgb3V0cHV0IGJ1ZmZlciBhbmQgZGVmbGF0ZSBzdGF0ZSBpZiBjb21wcmVzc2luZyAqLworICAgIGlmICghc3RhdGUtPmRpcmVjdCkgeworICAgICAgICAvKiBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIHN0YXRlLT5vdXQgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyhzdGF0ZS0+d2FudCk7CisgICAgICAgIGlmIChzdGF0ZS0+b3V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFsbG9jYXRlIGRlZmxhdGUgbWVtb3J5LCBzZXQgdXAgZm9yIGd6aXAgY29tcHJlc3Npb24gKi8KKyAgICAgICAgc3RybS0+emFsbG9jID0gWl9OVUxMOworICAgICAgICBzdHJtLT56ZnJlZSA9IFpfTlVMTDsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gWl9OVUxMOworICAgICAgICByZXQgPSBkZWZsYXRlSW5pdDIoc3RybSwgc3RhdGUtPmxldmVsLCBaX0RFRkxBVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1dCSVRTICsgMTYsIERFRl9NRU1fTEVWRUwsIHN0YXRlLT5zdHJhdGVneSk7CisgICAgICAgIGlmIChyZXQgIT0gWl9PSykgeworICAgICAgICAgICAgZnJlZShzdGF0ZS0+b3V0KTsKKyAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG1hcmsgc3RhdGUgYXMgaW5pdGlhbGl6ZWQgKi8KKyAgICBzdGF0ZS0+c2l6ZSA9IHN0YXRlLT53YW50OworCisgICAgLyogaW5pdGlhbGl6ZSB3cml0ZSBidWZmZXIgaWYgY29tcHJlc3NpbmcgKi8KKyAgICBpZiAoIXN0YXRlLT5kaXJlY3QpIHsKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gc3RhdGUtPnNpemU7CisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gc3RhdGUtPm91dDsKKyAgICAgICAgc3RhdGUtPngubmV4dCA9IHN0cm0tPm5leHRfb3V0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogQ29tcHJlc3Mgd2hhdGV2ZXIgaXMgYXQgYXZhaWxfaW4gYW5kIG5leHRfaW4gYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAgIFJldHVybiAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmlsZSwgb3RoZXJ3aXNlIDAuCisgICBmbHVzaCBpcyBhc3N1bWVkIHRvIGJlIGEgdmFsaWQgZGVmbGF0ZSgpIGZsdXNoIHZhbHVlLiAgSWYgZmx1c2ggaXMgWl9GSU5JU0gsCisgICB0aGVuIHRoZSBkZWZsYXRlKCkgc3RhdGUgaXMgcmVzZXQgdG8gc3RhcnQgYSBuZXcgZ3ppcCBzdHJlYW0uICBJZiBnei0+ZGlyZWN0CisgICBpcyB0cnVlLCB0aGVuIHNpbXBseSB3cml0ZSB0byB0aGUgb3V0cHV0IGZpbGUgd2l0aG91dCBjb21wcmVzc2luZywgYW5kCisgICBpZ25vcmUgZmx1c2guICovCitsb2NhbCBpbnQgZ3pfY29tcChzdGF0ZSwgZmx1c2gpCisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIGludCBmbHVzaDsKK3sKKyAgICBpbnQgcmV0LCBnb3Q7CisgICAgdW5zaWduZWQgaGF2ZTsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiB3cml0ZSBkaXJlY3RseSBpZiByZXF1ZXN0ZWQgKi8KKyAgICBpZiAoc3RhdGUtPmRpcmVjdCkgeworICAgICAgICBnb3QgPSB3cml0ZShzdGF0ZS0+ZmQsIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKKyAgICAgICAgaWYgKGdvdCA8IDAgfHwgKHVuc2lnbmVkKWdvdCAhPSBzdHJtLT5hdmFpbF9pbikgeworICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfRVJSTk8sIHpzdHJlcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIHJ1biBkZWZsYXRlKCkgb24gcHJvdmlkZWQgaW5wdXQgdW50aWwgaXQgcHJvZHVjZXMgbm8gbW9yZSBvdXRwdXQgKi8KKyAgICByZXQgPSBaX09LOworICAgIGRvIHsKKyAgICAgICAgLyogd3JpdGUgb3V0IGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIGlmIGZ1bGwsIG9yIGlmIGZsdXNoaW5nLCBidXQgaWYKKyAgICAgICAgICAgZG9pbmcgWl9GSU5JU0ggdGhlbiBkb24ndCB3cml0ZSB1bnRpbCB3ZSBnZXQgdG8gWl9TVFJFQU1fRU5EICovCisgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCB8fCAoZmx1c2ggIT0gWl9OT19GTFVTSCAmJgorICAgICAgICAgICAgKGZsdXNoICE9IFpfRklOSVNIIHx8IHJldCA9PSBaX1NUUkVBTV9FTkQpKSkgeworICAgICAgICAgICAgaGF2ZSA9ICh1bnNpZ25lZCkoc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+eC5uZXh0KTsKKyAgICAgICAgICAgIGlmIChoYXZlICYmICgoZ290ID0gd3JpdGUoc3RhdGUtPmZkLCBzdGF0ZS0+eC5uZXh0LCBoYXZlKSkgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWdvdCAhPSBoYXZlKSkgeworICAgICAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0VSUk5PLCB6c3RyZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gc3RhdGUtPnNpemU7CisgICAgICAgICAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBzdGF0ZS0+b3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPngubmV4dCA9IHN0cm0tPm5leHRfb3V0OworICAgICAgICB9CisKKyAgICAgICAgLyogY29tcHJlc3MgKi8KKyAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX291dDsKKyAgICAgICAgcmV0ID0gZGVmbGF0ZShzdHJtLCBmbHVzaCk7CisgICAgICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRVJST1IpIHsKKyAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX1NUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3I6IGRlZmxhdGUgc3RyZWFtIGNvcnJ1cHQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBoYXZlIC09IHN0cm0tPmF2YWlsX291dDsKKyAgICB9IHdoaWxlIChoYXZlKTsKKworICAgIC8qIGlmIHRoYXQgY29tcGxldGVkIGEgZGVmbGF0ZSBzdHJlYW0sIGFsbG93IGFub3RoZXIgdG8gc3RhcnQgKi8KKyAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpCisgICAgICAgIGRlZmxhdGVSZXNldChzdHJtKTsKKworICAgIC8qIGFsbCBkb25lLCBubyBlcnJvcnMgKi8KKyAgICByZXR1cm4gMDsKK30KKworLyogQ29tcHJlc3MgbGVuIHplcm9zIHRvIG91dHB1dC4gIFJldHVybiAtMSBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLiAqLworbG9jYWwgaW50IGd6X3plcm8oc3RhdGUsIGxlbikKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9vZmY2NF90IGxlbjsKK3sKKyAgICBpbnQgZmlyc3Q7CisgICAgdW5zaWduZWQgbjsKKyAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOworCisgICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLworICAgIGlmIChzdHJtLT5hdmFpbF9pbiAmJiBnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogY29tcHJlc3MgbGVuIHplcm9zIChsZW4gZ3VhcmFudGVlZCA+IDApICovCisgICAgZmlyc3QgPSAxOworICAgIHdoaWxlIChsZW4pIHsKKyAgICAgICAgbiA9IEdUX09GRihzdGF0ZS0+c2l6ZSkgfHwgKHpfb2ZmNjRfdClzdGF0ZS0+c2l6ZSA+IGxlbiA/CisgICAgICAgICAgICAodW5zaWduZWQpbGVuIDogc3RhdGUtPnNpemU7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgbWVtc2V0KHN0YXRlLT5pbiwgMCwgbik7CisgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBuOworICAgICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOworICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKKyAgICAgICAgaWYgKGd6X2NvbXAoc3RhdGUsIFpfTk9fRkxVU0gpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBsZW4gLT0gbjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6d3JpdGUoZmlsZSwgYnVmLCBsZW4pCisgICAgZ3pGaWxlIGZpbGU7CisgICAgdm9pZHBjIGJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgdW5zaWduZWQgcHV0ID0gbGVuOworICAgIGd6X3N0YXRlcCBzdGF0ZTsKKyAgICB6X3N0cmVhbXAgc3RybTsKKworICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogc2luY2UgYW4gaW50IGlzIHJldHVybmVkLCBtYWtlIHN1cmUgbGVuIGZpdHMgaW4gb25lLCBvdGhlcndpc2UgcmV0dXJuCisgICAgICAgd2l0aCBhbiBlcnJvciAodGhpcyBhdm9pZHMgdGhlIGZsYXcgaW4gdGhlIGludGVyZmFjZSkgKi8KKyAgICBpZiAoKGludClsZW4gPCAwKSB7CisgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0RBVEFfRVJST1IsICJyZXF1ZXN0ZWQgbGVuZ3RoIGRvZXMgbm90IGZpdCBpbiBpbnQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogaWYgbGVuIGlzIHplcm8sIGF2b2lkIHVubmVjZXNzYXJ5IG9wZXJhdGlvbnMgKi8KKyAgICBpZiAobGVuID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KKyAgICBpZiAoc3RhdGUtPnNlZWspIHsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogZm9yIHNtYWxsIGxlbiwgY29weSB0byBpbnB1dCBidWZmZXIsIG90aGVyd2lzZSBjb21wcmVzcyBkaXJlY3RseSAqLworICAgIGlmIChsZW4gPCBzdGF0ZS0+c2l6ZSkgeworICAgICAgICAvKiBjb3B5IHRvIGlucHV0IGJ1ZmZlciwgY29tcHJlc3Mgd2hlbiBmdWxsICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGhhdmUsIGNvcHk7CisKKyAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwKQorICAgICAgICAgICAgICAgIHN0cm0tPm5leHRfaW4gPSBzdGF0ZS0+aW47CisgICAgICAgICAgICBoYXZlID0gKHVuc2lnbmVkKSgoc3RybS0+bmV4dF9pbiArIHN0cm0tPmF2YWlsX2luKSAtIHN0YXRlLT5pbik7CisgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPnNpemUgLSBoYXZlOworICAgICAgICAgICAgaWYgKGNvcHkgPiBsZW4pCisgICAgICAgICAgICAgICAgY29weSA9IGxlbjsKKyAgICAgICAgICAgIG1lbWNweShzdGF0ZS0+aW4gKyBoYXZlLCBidWYsIGNvcHkpOworICAgICAgICAgICAgc3RybS0+YXZhaWxfaW4gKz0gY29weTsKKyAgICAgICAgICAgIHN0YXRlLT54LnBvcyArPSBjb3B5OworICAgICAgICAgICAgYnVmID0gKGNvbnN0IGNoYXIgKilidWYgKyBjb3B5OworICAgICAgICAgICAgbGVuIC09IGNvcHk7CisgICAgICAgICAgICBpZiAobGVuICYmIGd6X2NvbXAoc3RhdGUsIFpfTk9fRkxVU0gpID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IHdoaWxlIChsZW4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAvKiBkaXJlY3RseSBjb21wcmVzcyB1c2VyIGJ1ZmZlciB0byBmaWxlICovCisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gbGVuOworICAgICAgICBzdHJtLT5uZXh0X2luID0gKHpfY29uc3QgQnl0ZWYgKilidWY7CisgICAgICAgIHN0YXRlLT54LnBvcyArPSBsZW47CisgICAgICAgIGlmIChnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGlucHV0IHdhcyBhbGwgYnVmZmVyZWQgb3IgY29tcHJlc3NlZCAocHV0IHdpbGwgZml0IGluIGludCkgKi8KKyAgICByZXR1cm4gKGludClwdXQ7Cit9CisKKy8qIC0tIHNlZSB6bGliLmggLS0gKi8KK2ludCBaRVhQT1JUIGd6cHV0YyhmaWxlLCBjKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCBjOworeworICAgIHVuc2lnbmVkIGhhdmU7CisgICAgdW5zaWduZWQgY2hhciBidWZbMV07CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHpfc3RyZWFtcCBzdHJtOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KKyAgICBpZiAoc3RhdGUtPnNlZWspIHsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHRyeSB3cml0aW5nIHRvIGlucHV0IGJ1ZmZlciBmb3Igc3BlZWQgKHN0YXRlLT5zaXplID09IDAgaWYgYnVmZmVyIG5vdAorICAgICAgIGluaXRpYWxpemVkKSAqLworICAgIGlmIChzdGF0ZS0+c2l6ZSkgeworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCkKKyAgICAgICAgICAgIHN0cm0tPm5leHRfaW4gPSBzdGF0ZS0+aW47CisgICAgICAgIGhhdmUgPSAodW5zaWduZWQpKChzdHJtLT5uZXh0X2luICsgc3RybS0+YXZhaWxfaW4pIC0gc3RhdGUtPmluKTsKKyAgICAgICAgaWYgKGhhdmUgPCBzdGF0ZS0+c2l6ZSkgeworICAgICAgICAgICAgc3RhdGUtPmluW2hhdmVdID0gYzsKKyAgICAgICAgICAgIHN0cm0tPmF2YWlsX2luKys7CisgICAgICAgICAgICBzdGF0ZS0+eC5wb3MrKzsKKyAgICAgICAgICAgIHJldHVybiBjICYgMHhmZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG5vIHJvb20gaW4gYnVmZmVyIG9yIG5vdCBpbml0aWFsaXplZCwgdXNlIGd6X3dyaXRlKCkgKi8KKyAgICBidWZbMF0gPSBjOworICAgIGlmIChnendyaXRlKGZpbGUsIGJ1ZiwgMSkgIT0gMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBjICYgMHhmZjsKK30KKworLyogLS0gc2VlIHpsaWIuaCAtLSAqLworaW50IFpFWFBPUlQgZ3pwdXRzKGZpbGUsIHN0cikKKyAgICBnekZpbGUgZmlsZTsKKyAgICBjb25zdCBjaGFyICpzdHI7Cit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBsZW47CisKKyAgICAvKiB3cml0ZSBzdHJpbmcgKi8KKyAgICBsZW4gPSAodW5zaWduZWQpc3RybGVuKHN0cik7CisgICAgcmV0ID0gZ3p3cml0ZShmaWxlLCBzdHIsIGxlbik7CisgICAgcmV0dXJuIHJldCA9PSAwICYmIGxlbiAhPSAwID8gLTEgOiByZXQ7Cit9CisKKyNpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVFZBIGd6dnByaW50ZihnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQoreworICAgIGludCBzaXplLCBsZW47CisgICAgZ3pfc3RhdGVwIHN0YXRlOworICAgIHpfc3RyZWFtcCBzdHJtOworCisgICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKKyAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBidWZmZXIgc3BhY2UgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUgPT0gMCAmJiBnel9pbml0KHN0YXRlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCisgICAgaWYgKHN0YXRlLT5zZWVrKSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMDsKKyAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGNvbnN1bWUgd2hhdGV2ZXIncyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogZG8gdGhlIHByaW50ZigpIGludG8gdGhlIGlucHV0IGJ1ZmZlciwgcHV0IGxlbmd0aCBpbiBsZW4gKi8KKyAgICBzaXplID0gKGludCkoc3RhdGUtPnNpemUpOworICAgIHN0YXRlLT5pbltzaXplIC0gMV0gPSAwOworI2lmZGVmIE5PX3ZzbnByaW50ZgorIyAgaWZkZWYgSEFTX3ZzcHJpbnRmX3ZvaWQKKyAgICAodm9pZCl2c3ByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBmb3JtYXQsIHZhKTsKKyAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IHNpemU7IGxlbisrKQorICAgICAgICBpZiAoc3RhdGUtPmluW2xlbl0gPT0gMCkgYnJlYWs7CisjICBlbHNlCisgICAgbGVuID0gdnNwcmludGYoKGNoYXIgKikoc3RhdGUtPmluKSwgZm9ybWF0LCB2YSk7CisjICBlbmRpZgorI2Vsc2UKKyMgIGlmZGVmIEhBU192c25wcmludGZfdm9pZAorICAgICh2b2lkKXZzbnByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBzaXplLCBmb3JtYXQsIHZhKTsKKyAgICBsZW4gPSBzdHJsZW4oKGNoYXIgKikoc3RhdGUtPmluKSk7CisjICBlbHNlCisgICAgbGVuID0gdnNucHJpbnRmKChjaGFyICopKHN0YXRlLT5pbiksIHNpemUsIGZvcm1hdCwgdmEpOworIyAgZW5kaWYKKyNlbmRpZgorCisgICAgLyogY2hlY2sgdGhhdCBwcmludGYoKSByZXN1bHRzIGZpdCBpbiBidWZmZXIgKi8KKyAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IChpbnQpc2l6ZSB8fCBzdGF0ZS0+aW5bc2l6ZSAtIDFdICE9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogdXBkYXRlIGJ1ZmZlciBhbmQgcG9zaXRpb24sIGRlZmVyIGNvbXByZXNzaW9uIHVudGlsIG5lZWRlZCAqLworICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKWxlbjsKKyAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOworICAgIHN0YXRlLT54LnBvcyArPSBsZW47CisgICAgcmV0dXJuIGxlbjsKK30KKworaW50IFpFWFBPUlRWQSBnenByaW50ZihnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCB2YTsKKyAgICBpbnQgcmV0OworCisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgcmV0ID0gZ3p2cHJpbnRmKGZpbGUsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2Vsc2UgLyogIVNUREMgJiYgIVpfSEFWRV9TVERBUkdfSCAqLworCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVFZBIGd6cHJpbnRmIChmaWxlLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwKKyAgICAgICAgICAgICAgICAgICAgICAgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKQorICAgIGd6RmlsZSBmaWxlOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKyAgICBpbnQgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLAorICAgICAgICBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjA7Cit7CisgICAgaW50IHNpemUsIGxlbjsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9zdHJlYW1wIHN0cm07CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGNoZWNrIHRoYXQgY2FuIHJlYWxseSBwYXNzIHBvaW50ZXIgaW4gaW50cyAqLworICAgIGlmIChzaXplb2YoaW50KSAhPSBzaXplb2Yodm9pZCAqKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLworICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBidWZmZXIgc3BhY2UgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUgPT0gMCAmJiBnel9pbml0KHN0YXRlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCisgICAgaWYgKHN0YXRlLT5zZWVrKSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMDsKKyAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGNvbnN1bWUgd2hhdGV2ZXIncyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogZG8gdGhlIHByaW50ZigpIGludG8gdGhlIGlucHV0IGJ1ZmZlciwgcHV0IGxlbmd0aCBpbiBsZW4gKi8KKyAgICBzaXplID0gKGludCkoc3RhdGUtPnNpemUpOworICAgIHN0YXRlLT5pbltzaXplIC0gMV0gPSAwOworI2lmZGVmIE5PX3NucHJpbnRmCisjICBpZmRlZiBIQVNfc3ByaW50Zl92b2lkCisgICAgc3ByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKKyAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisgICAgZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplOyBsZW4rKykKKyAgICAgICAgaWYgKHN0YXRlLT5pbltsZW5dID09IDApIGJyZWFrOworIyAgZWxzZQorICAgIGxlbiA9IHNwcmludGYoKGNoYXIgKikoc3RhdGUtPmluKSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCisgICAgICAgICAgICAgICAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOworIyAgZW5kaWYKKyNlbHNlCisjICBpZmRlZiBIQVNfc25wcmludGZfdm9pZAorICAgIHNucHJpbnRmKChjaGFyICopKHN0YXRlLT5pbiksIHNpemUsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorICAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7CisgICAgbGVuID0gc3RybGVuKChjaGFyICopKHN0YXRlLT5pbikpOworIyAgZWxzZQorICAgIGxlbiA9IHNucHJpbnRmKChjaGFyICopKHN0YXRlLT5pbiksIHNpemUsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwKKyAgICAgICAgICAgICAgICAgICBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LAorICAgICAgICAgICAgICAgICAgIGExOSwgYTIwKTsKKyMgIGVuZGlmCisjZW5kaWYKKworICAgIC8qIGNoZWNrIHRoYXQgcHJpbnRmKCkgcmVzdWx0cyBmaXQgaW4gYnVmZmVyICovCisgICAgaWYgKGxlbiA8PSAwIHx8IGxlbiA+PSAoaW50KXNpemUgfHwgc3RhdGUtPmluW3NpemUgLSAxXSAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHVwZGF0ZSBidWZmZXIgYW5kIHBvc2l0aW9uLCBkZWZlciBjb21wcmVzc2lvbiB1bnRpbCBuZWVkZWQgKi8KKyAgICBzdHJtLT5hdmFpbF9pbiA9ICh1bnNpZ25lZClsZW47CisgICAgc3RybS0+bmV4dF9pbiA9IHN0YXRlLT5pbjsKKyAgICBzdGF0ZS0+eC5wb3MgKz0gbGVuOworICAgIHJldHVybiBsZW47Cit9CisKKyNlbmRpZgorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVCBnemZsdXNoKGZpbGUsIGZsdXNoKQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCBmbHVzaDsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSB3cml0aW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gZXJyb3IgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUgfHwgc3RhdGUtPmVyciAhPSBaX09LKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiBjaGVjayBmbHVzaCBwYXJhbWV0ZXIgKi8KKyAgICBpZiAoZmx1c2ggPCAwIHx8IGZsdXNoID4gWl9GSU5JU0gpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KKyAgICBpZiAoc3RhdGUtPnNlZWspIHsKKyAgICAgICAgc3RhdGUtPnNlZWsgPSAwOworICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNvbXByZXNzIHJlbWFpbmluZyBkYXRhIHdpdGggcmVxdWVzdGVkIGZsdXNoICovCisgICAgZ3pfY29tcChzdGF0ZSwgZmx1c2gpOworICAgIHJldHVybiBzdGF0ZS0+ZXJyOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVCBnenNldHBhcmFtcyhmaWxlLCBsZXZlbCwgc3RyYXRlZ3kpCisgICAgZ3pGaWxlIGZpbGU7CisgICAgaW50IGxldmVsOworICAgIGludCBzdHJhdGVneTsKK3sKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisgICAgel9zdHJlYW1wIHN0cm07CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworICAgIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgd3JpdGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFIHx8IHN0YXRlLT5lcnIgIT0gWl9PSykKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogaWYgbm8gY2hhbmdlIGlzIHJlcXVlc3RlZCwgdGhlbiBkbyBub3RoaW5nICovCisgICAgaWYgKGxldmVsID09IHN0YXRlLT5sZXZlbCAmJiBzdHJhdGVneSA9PSBzdGF0ZS0+c3RyYXRlZ3kpCisgICAgICAgIHJldHVybiBaX09LOworCisgICAgLyogY2hlY2sgZm9yIHNlZWsgcmVxdWVzdCAqLworICAgIGlmIChzdGF0ZS0+c2VlaykgeworICAgICAgICBzdGF0ZS0+c2VlayA9IDA7CisgICAgICAgIGlmIChnel96ZXJvKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogY2hhbmdlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgZm9yIHN1YnNlcXVlbnQgaW5wdXQgKi8KKyAgICBpZiAoc3RhdGUtPnNpemUpIHsKKyAgICAgICAgLyogZmx1c2ggcHJldmlvdXMgaW5wdXQgd2l0aCBwcmV2aW91cyBwYXJhbWV0ZXJzIGJlZm9yZSBjaGFuZ2luZyAqLworICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9QQVJUSUFMX0ZMVVNIKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZS0+ZXJyOworICAgICAgICBkZWZsYXRlUGFyYW1zKHN0cm0sIGxldmVsLCBzdHJhdGVneSk7CisgICAgfQorICAgIHN0YXRlLT5sZXZlbCA9IGxldmVsOworICAgIHN0YXRlLT5zdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIHJldHVybiBaX09LOworfQorCisvKiAtLSBzZWUgemxpYi5oIC0tICovCitpbnQgWkVYUE9SVCBnemNsb3NlX3coZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICBpbnQgcmV0ID0gWl9PSzsKKyAgICBnel9zdGF0ZXAgc3RhdGU7CisKKyAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSdyZSB3cml0aW5nICovCisgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCisgICAgaWYgKHN0YXRlLT5zZWVrKSB7CisgICAgICAgIHN0YXRlLT5zZWVrID0gMDsKKyAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKKyAgICAgICAgICAgIHJldCA9IHN0YXRlLT5lcnI7CisgICAgfQorCisgICAgLyogZmx1c2gsIGZyZWUgbWVtb3J5LCBhbmQgY2xvc2UgZmlsZSAqLworICAgIGlmIChnel9jb21wKHN0YXRlLCBaX0ZJTklTSCkgPT0gLTEpCisgICAgICAgIHJldCA9IHN0YXRlLT5lcnI7CisgICAgaWYgKHN0YXRlLT5zaXplKSB7CisgICAgICAgIGlmICghc3RhdGUtPmRpcmVjdCkgeworICAgICAgICAgICAgKHZvaWQpZGVmbGF0ZUVuZCgmKHN0YXRlLT5zdHJtKSk7CisgICAgICAgICAgICBmcmVlKHN0YXRlLT5vdXQpOworICAgICAgICB9CisgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKKyAgICB9CisgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfT0ssIE5VTEwpOworICAgIGZyZWUoc3RhdGUtPnBhdGgpOworICAgIGlmIChjbG9zZShzdGF0ZS0+ZmQpID09IC0xKQorICAgICAgICByZXQgPSBaX0VSUk5POworICAgIGZyZWUoc3RhdGUpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvaW5mYmFjay5jIGIvTW9kdWxlcy96bGliL2luZmJhY2suYwppbmRleCA0NTVkYmM5Li5mMzgzM2MyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWIvaW5mYmFjay5jCisrKyBiL01vZHVsZXMvemxpYi9pbmZiYWNrLmMKQEAgLTEsNSArMSw1IEBACiAvKiBpbmZiYWNrLmMgLS0gaW5mbGF0ZSB1c2luZyBhIGNhbGwtYmFjayBpbnRlcmZhY2UKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDExIE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCkBAIC00MiwxMCArNDIsMTkgQEAKICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovCiAgICAgaWYgKHN0cm0tPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwKSB7CisjaWZkZWYgWl9TT0xPCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCiAgICAgICAgIHN0cm0tPnphbGxvYyA9IHpjYWxsb2M7CiAgICAgICAgIHN0cm0tPm9wYXF1ZSA9ICh2b2lkcGYpMDsKKyNlbmRpZgogICAgIH0KLSAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSBzdHJtLT56ZnJlZSA9IHpjZnJlZTsKKyAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQorI2lmZGVmIFpfU09MTworICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgIHN0cm0tPnpmcmVlID0gemNmcmVlOworI2VuZGlmCiAgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopWkFMTE9DKHN0cm0sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSkpOwogICAgIGlmIChzdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKQEAgLTU1LDcgKzY0LDcgQEAKICAgICBzdGF0ZS0+d2JpdHMgPSB3aW5kb3dCaXRzOwogICAgIHN0YXRlLT53c2l6ZSA9IDFVIDw8IHdpbmRvd0JpdHM7CiAgICAgc3RhdGUtPndpbmRvdyA9IHdpbmRvdzsKLSAgICBzdGF0ZS0+d3JpdGUgPSAwOworICAgIHN0YXRlLT53bmV4dCA9IDA7CiAgICAgc3RhdGUtPndoYXZlID0gMDsKICAgICByZXR1cm4gWl9PSzsKIH0KQEAgLTI0NiwxNCArMjU1LDE0IEBACiB2b2lkIEZBUiAqb3V0X2Rlc2M7CiB7CiAgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqbmV4dDsgICAgLyogbmV4dCBpbnB1dCAqLworICAgIHpfY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKm5leHQ7ICAgIC8qIG5leHQgaW5wdXQgKi8KICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqcHV0OyAgICAgLyogbmV4dCBvdXRwdXQgKi8KICAgICB1bnNpZ25lZCBoYXZlLCBsZWZ0OyAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi8KICAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogYml0IGJ1ZmZlciAqLwogICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KICAgICB1bnNpZ25lZCBjb3B5OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovCiAgICAgdW5zaWduZWQgY2hhciBGQVIgKmZyb207ICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqLwotICAgIGNvZGUgdGhpczsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovCisgICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KICAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCiAgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KICAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KQEAgLTM4OSwxOSArMzk4LDE4IEBACiAgICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CiAgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgewogICAgICAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKICAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsIDwgMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUrK10gPSB0aGlzLnZhbDsKKyAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPCAxNikgeworICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9IGhlcmUudmFsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsID09IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZXJlLnZhbCA9PSAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFMoaGVyZS5iaXRzICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKQEAgLTQxMSwxNiArNDE5LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMik7CiAgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygyKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZhbCA9PSAxNykgewotICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzICsgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoZXJlLnZhbCA9PSAxNykgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFMoaGVyZS5iaXRzICsgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzICsgNyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFMoaGVyZS5iaXRzICsgNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAxMSArIEJJVFMoNyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyg3KTsKQEAgLTQzOCw3ICs0NDYsMTYgQEAKICAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KICAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBCQUQpIGJyZWFrOwogCi0gICAgICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAqLworICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVuZC1vZi1ibG9jayBjb2RlIChiZXR0ZXIgaGF2ZSBvbmUpICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPmxlbnNbMjU2XSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0cworICAgICAgICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaAorICAgICAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqLwogICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CiAgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7CiAgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CkBAIC00NzQsMjggKzQ5MSwyOCBAQAogCiAgICAgICAgICAgICAvKiBnZXQgYSBsaXRlcmFsLCBsZW5ndGgsIG9yIGVuZC1vZi1ibG9jayBjb2RlICovCiAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRoaXMub3AgJiYgKHRoaXMub3AgJiAweGYwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IHRoaXM7CisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmJiAoaGVyZS5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gaGVyZTsKICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtsYXN0LnZhbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOwotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCl0aGlzLnZhbDsKKyAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhlcmUudmFsOwogCiAgICAgICAgICAgICAvKiBwcm9jZXNzIGxpdGVyYWwgKi8KLSAgICAgICAgICAgIGlmICh0aGlzLm9wID09IDApIHsKLSAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIHRoaXMudmFsID49IDB4MjAgJiYgdGhpcy52YWwgPCAweDdmID8KKyAgICAgICAgICAgIGlmIChoZXJlLm9wID09IDApIHsKKyAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID8KICAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgdGhpcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCBoZXJlLnZhbCkpOwogICAgICAgICAgICAgICAgIFJPT00oKTsKICAgICAgICAgICAgICAgICAqcHV0KysgPSAodW5zaWduZWQgY2hhcikoc3RhdGUtPmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgbGVmdC0tOwpAQCAtNTA0LDIxICs1MjEsMjEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogcHJvY2VzcyBlbmQgb2YgYmxvY2sgKi8KLSAgICAgICAgICAgIGlmICh0aGlzLm9wICYgMzIpIHsKKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYgMzIpIHsKICAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOwogICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlICovCi0gICAgICAgICAgICBpZiAodGhpcy5vcCAmIDY0KSB7CisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDY0KSB7CiAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogbGVuZ3RoIGNvZGUgLS0gZ2V0IGV4dHJhIGJpdHMsIGlmIGFueSAqLwotICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OwogICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKQEAgLTUyOCwzMCArNTQ1LDMwIEBACiAKICAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSBjb2RlICovCiAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5kaXN0Y29kZVtCSVRTKHN0YXRlLT5kaXN0Yml0cyldOwotICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgaGVyZSA9IHN0YXRlLT5kaXN0Y29kZVtCSVRTKHN0YXRlLT5kaXN0Yml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CiAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgodGhpcy5vcCAmIDB4ZjApID09IDApIHsKLSAgICAgICAgICAgICAgICBsYXN0ID0gdGhpczsKKyAgICAgICAgICAgIGlmICgoaGVyZS5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gaGVyZTsKICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+ZGlzdGNvZGVbbGFzdC52YWwgKworICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmRpc3Rjb2RlW2xhc3QudmFsICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgdGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKICAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICBpZiAodGhpcy5vcCAmIDY0KSB7CisgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgewogICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CiAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ID0gKHVuc2lnbmVkKXRoaXMudmFsOworICAgICAgICAgICAgc3RhdGUtPm9mZnNldCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKIAogICAgICAgICAgICAgLyogZ2V0IGRpc3RhbmNlIGV4dHJhIGJpdHMsIGlmIGFueSAqLwotICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OwogICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKICAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9pbmZmYXN0LmMgYi9Nb2R1bGVzL3psaWIvaW5mZmFzdC5jCmluZGV4IGJiZWU5MmUuLmJkYTU5Y2UgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi9pbmZmYXN0LmMKKysrIGIvTW9kdWxlcy96bGliL2luZmZhc3QuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBNYXJrIEFkbGVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwOCwgMjAxMCwgMjAxMyBNYXJrIEFkbGVyCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKi8KIApAQCAtNjQsMTMgKzY0LDEzIEBACiAgICAgICByZXF1aXJlcyBzdHJtLT5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yCiAgICAgICBvdXRwdXQgc3BhY2UuCiAgKi8KLXZvaWQgaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KQordm9pZCBaTElCX0lOVEVSTkFMIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkKIHpfc3RyZWFtcCBzdHJtOwogdW5zaWduZWQgc3RhcnQ7ICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLwogewogICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0gICAgdW5zaWduZWQgY2hhciBGQVIgKmluOyAgICAgIC8qIGxvY2FsIHN0cm0tPm5leHRfaW4gKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqbGFzdDsgICAgLyogd2hpbGUgaW4gPCBsYXN0LCBlbm91Z2ggaW5wdXQgYXZhaWxhYmxlICovCisgICAgel9jb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgICAgLyogbG9jYWwgc3RybS0+bmV4dF9pbiAqLworICAgIHpfY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmxhc3Q7ICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqLwogICAgIHVuc2lnbmVkIGNoYXIgRkFSICpvdXQ7ICAgICAvKiBsb2NhbCBzdHJtLT5uZXh0X291dCAqLwogICAgIHVuc2lnbmVkIGNoYXIgRkFSICpiZWc7ICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0tPm5leHRfb3V0ICovCiAgICAgdW5zaWduZWQgY2hhciBGQVIgKmVuZDsgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqLwpAQCAtNzksNyArNzksNyBAQAogI2VuZGlmCiAgICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLwogICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCi0gICAgdW5zaWduZWQgd3JpdGU7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLworICAgIHVuc2lnbmVkIHduZXh0OyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi8KICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovCiAgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGxvY2FsIHN0cm0tPmhvbGQgKi8KICAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS0+Yml0cyAqLwpAQCAtODcsNyArODcsNyBAQAogICAgIGNvZGUgY29uc3QgRkFSICpkY29kZTsgICAgICAvKiBsb2NhbCBzdHJtLT5kaXN0Y29kZSAqLwogICAgIHVuc2lnbmVkIGxtYXNrOyAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi8KICAgICB1bnNpZ25lZCBkbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi8KLSAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovCisgICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqLwogICAgIHVuc2lnbmVkIG9wOyAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi8KICAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi8KQEAgLTEwNiw3ICsxMDYsNyBAQAogI2VuZGlmCiAgICAgd3NpemUgPSBzdGF0ZS0+d3NpemU7CiAgICAgd2hhdmUgPSBzdGF0ZS0+d2hhdmU7Ci0gICAgd3JpdGUgPSBzdGF0ZS0+d3JpdGU7CisgICAgd25leHQgPSBzdGF0ZS0+d25leHQ7CiAgICAgd2luZG93ID0gc3RhdGUtPndpbmRvdzsKICAgICBob2xkID0gc3RhdGUtPmhvbGQ7CiAgICAgYml0cyA9IHN0YXRlLT5iaXRzOwpAQCAtMTI0LDIwICsxMjQsMjAgQEAKICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CiAgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgIH0KLSAgICAgICAgdGhpcyA9IGxjb2RlW2hvbGQgJiBsbWFza107CisgICAgICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdOwogICAgICAgZG9sZW46Ci0gICAgICAgIG9wID0gKHVuc2lnbmVkKSh0aGlzLmJpdHMpOworICAgICAgICBvcCA9ICh1bnNpZ25lZCkoaGVyZS5iaXRzKTsKICAgICAgICAgaG9sZCA+Pj0gb3A7CiAgICAgICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgIG9wID0gKHVuc2lnbmVkKSh0aGlzLm9wKTsKKyAgICAgICAgb3AgPSAodW5zaWduZWQpKGhlcmUub3ApOwogICAgICAgICBpZiAob3AgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqLwotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCB0aGlzLnZhbCA+PSAweDIwICYmIHRoaXMudmFsIDwgMHg3ZiA/CisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID8KICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKLSAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIHRoaXMudmFsKSk7Ci0gICAgICAgICAgICBQVVAob3V0KSA9ICh1bnNpZ25lZCBjaGFyKSh0aGlzLnZhbCk7CisgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCBoZXJlLnZhbCkpOworICAgICAgICAgICAgUFVQKG91dCkgPSAodW5zaWduZWQgY2hhcikoaGVyZS52YWwpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqLwotICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKSh0aGlzLnZhbCk7CisgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKGhlcmUudmFsKTsKICAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovCiAgICAgICAgICAgICBpZiAob3ApIHsKICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CkBAIC0xNTUsMTQgKzE1NSwxNCBAQAogICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CiAgICAgICAgICAgICAgICAgYml0cyArPSA4OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcyA9IGRjb2RlW2hvbGQgJiBkbWFza107CisgICAgICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKICAgICAgICAgICBkb2Rpc3Q6Ci0gICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkodGhpcy5iaXRzKTsKKyAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLmJpdHMpOwogICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CiAgICAgICAgICAgICBiaXRzIC09IG9wOwotICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKHRoaXMub3ApOworICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKGhlcmUub3ApOwogICAgICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqLwotICAgICAgICAgICAgICAgIGRpc3QgPSAodW5zaWduZWQpKHRoaXMudmFsKTsKKyAgICAgICAgICAgICAgICBkaXN0ID0gKHVuc2lnbmVkKShoZXJlLnZhbCk7CiAgICAgICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqLwogICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKICAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKQEAgLTE4NywxMiArMTg3LDM0IEBACiAgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqLwogICAgICAgICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi8KICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPnNhbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGZyb20gPSB3aW5kb3cgLSBPRkY7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZSA9PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovCisgICAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA9PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwpAQCAtMjAyLDE3ICsyMjQsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3cml0ZSA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd3JpdGUgLSBvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wIC09IHdyaXRlOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wIC09IHduZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gd2luZG93IC0gT0ZGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZSA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IHdyaXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwpAQCAtMjIyLDcgKzI0NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdyaXRlIC0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKQEAgLTI1OSw3ICsyODEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovCi0gICAgICAgICAgICAgICAgdGhpcyA9IGRjb2RlW3RoaXMudmFsICsgKGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpKV07CisgICAgICAgICAgICAgICAgaGVyZSA9IGRjb2RlW2hlcmUudmFsICsgKGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpKV07CiAgICAgICAgICAgICAgICAgZ290byBkb2Rpc3Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTI2OSw3ICsyOTEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi8KLSAgICAgICAgICAgIHRoaXMgPSBsY29kZVt0aGlzLnZhbCArIChob2xkICYgKCgxVSA8PCBvcCkgLSAxKSldOworICAgICAgICAgICAgaGVyZSA9IGxjb2RlW2hlcmUudmFsICsgKGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpKV07CiAgICAgICAgICAgICBnb3RvIGRvbGVuOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi8KQEAgLTMwNSw3ICszMjcsNyBAQAogICAgaW5mbGF0ZV9mYXN0KCkgc3BlZWR1cHMgdGhhdCB0dXJuZWQgb3V0IHNsb3dlciAob24gYSBQb3dlclBDIEczIDc1MENYZSk6CiAgICAtIFVzaW5nIGJpdCBmaWVsZHMgZm9yIGNvZGUgc3RydWN0dXJlCiAgICAtIERpZmZlcmVudCBvcCBkZWZpbml0aW9uIHRvIGF2b2lkICYgZm9yIGV4dHJhIGJpdHMgKGRvICYgZm9yIHRhYmxlIGJpdHMpCi0gICAtIFRocmVlIHNlcGFyYXRlIGRlY29kaW5nIGRvLWxvb3BzIGZvciBkaXJlY3QsIHdpbmRvdywgYW5kIHdyaXRlID09IDAKKyAgIC0gVGhyZWUgc2VwYXJhdGUgZGVjb2RpbmcgZG8tbG9vcHMgZm9yIGRpcmVjdCwgd2luZG93LCBhbmQgd25leHQgPT0gMAogICAgLSBTcGVjaWFsIGNhc2UgZm9yIGRpc3RhbmNlID4gMSBjb3BpZXMgdG8gZG8gb3ZlcmxhcHBlZCBsb2FkIGFuZCBzdG9yZSBjb3B5CiAgICAtIEV4cGxpY2l0IGJyYW5jaCBwcmVkaWN0aW9ucyAoYmFzZWQgb24gbWVhc3VyZWQgYnJhbmNoIHByb2JhYmlsaXRpZXMpCiAgICAtIERlZmVycmluZyBtYXRjaCBjb3B5IGFuZCBpbnRlcnNwZXJzZWQgaXQgd2l0aCBkZWNvZGluZyBzdWJzZXF1ZW50IGNvZGVzCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvaW5mZmFzdC5oIGIvTW9kdWxlcy96bGliL2luZmZhc3QuaAppbmRleCAxZTg4ZDJkLi5lNWMxYWE0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWIvaW5mZmFzdC5oCisrKyBiL01vZHVsZXMvemxpYi9pbmZmYXN0LmgKQEAgLTEsNSArMSw1IEBACiAvKiBpbmZmYXN0LmggLS0gaGVhZGVyIHRvIHVzZSBpbmZmYXN0LmMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzLCAyMDEwIE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCkBAIC04LDQgKzgsNCBAQAogICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgogICovCiAKLXZvaWQgaW5mbGF0ZV9mYXN0IE9GKCh6X3N0cmVhbXAgc3RybSwgdW5zaWduZWQgc3RhcnQpKTsKK3ZvaWQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX2Zhc3QgT0YoKHpfc3RyZWFtcCBzdHJtLCB1bnNpZ25lZCBzdGFydCkpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGliL2luZmZpeGVkLmggYi9Nb2R1bGVzL3psaWIvaW5mZml4ZWQuaAppbmRleCA3NWVkNGI1Li5kNjI4MzI3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWIvaW5mZml4ZWQuaAorKysgYi9Nb2R1bGVzL3psaWIvaW5mZml4ZWQuaApAQCAtMiw5ICsyLDkgQEAKICAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQoKS4KICAgICAgKi8KIAotICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0Ci0gICAgICAgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kCi0gICAgICAgaXMgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuCisgICAgICAgSXQgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBsaWJyYXJ5IGFuZCBpcworICAgICAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KICAgICAgKi8KIAogICAgIHN0YXRpYyBjb25zdCBjb2RlIGxlbmZpeFs1MTJdID0gewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGliL2luZmxhdGUuYyBiL01vZHVsZXMvemxpYi9pbmZsYXRlLmMKaW5kZXggNzkyZmRlZS4uODcwZjg5YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL2luZmxhdGUuYworKysgYi9Nb2R1bGVzL3psaWIvaW5mbGF0ZS5jCkBAIC0xLDUgKzEsNSBAQAogLyogaW5mbGF0ZS5jIC0tIHpsaWIgZGVjb21wcmVzc2lvbgotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTIgTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTQ1LDcgKzQ1LDcgQEAKICAqIC0gUmVhcnJhbmdlIHdpbmRvdyBjb3BpZXMgaW4gaW5mbGF0ZV9mYXN0KCkgZm9yIHNwZWVkIGFuZCBzaW1wbGlmaWNhdGlvbgogICogLSBVbnJvbGwgbGFzdCBjb3B5IGZvciB3aW5kb3cgbWF0Y2ggaW4gaW5mbGF0ZV9mYXN0KCkKICAqIC0gVXNlIGxvY2FsIGNvcGllcyBvZiB3aW5kb3cgdmFyaWFibGVzIGluIGluZmxhdGVfZmFzdCgpIGZvciBzcGVlZAotICogLSBQdWxsIG91dCBjb21tb24gd3JpdGUgPT0gMCBjYXNlIGZvciBzcGVlZCBpbiBpbmZsYXRlX2Zhc3QoKQorICogLSBQdWxsIG91dCBjb21tb24gd25leHQgPT0gMCBjYXNlIGZvciBzcGVlZCBpbiBpbmZsYXRlX2Zhc3QoKQogICogLSBNYWtlIG9wIGFuZCBsZW4gaW4gaW5mbGF0ZV9mYXN0KCkgdW5zaWduZWQgZm9yIGNvbnNpc3RlbmN5CiAgKiAtIEFkZCBGQVIgdG8gbGNvZGUgYW5kIGRjb2RlIGRlY2xhcmF0aW9ucyBpbiBpbmZsYXRlX2Zhc3QoKQogICogLSBTaW1wbGlmaWVkIGJhZCBkaXN0YW5jZSBjaGVjayBpbiBpbmZsYXRlX2Zhc3QoKQpAQCAtOTMsMTQgKzkzLDE1IEBACiAKIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIGxvY2FsIHZvaWQgZml4ZWR0YWJsZXMgT0YoKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGUpKTsKLWxvY2FsIGludCB1cGRhdGV3aW5kb3cgT0YoKHpfc3RyZWFtcCBzdHJtLCB1bnNpZ25lZCBvdXQpKTsKK2xvY2FsIGludCB1cGRhdGV3aW5kb3cgT0YoKHpfc3RyZWFtcCBzdHJtLCBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29weSkpOwogI2lmZGVmIEJVSUxERklYRUQKICAgIHZvaWQgbWFrZWZpeGVkIE9GKCh2b2lkKSk7CiAjZW5kaWYKLWxvY2FsIHVuc2lnbmVkIHN5bmNzZWFyY2ggT0YoKHVuc2lnbmVkIEZBUiAqaGF2ZSwgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZiwKK2xvY2FsIHVuc2lnbmVkIHN5bmNzZWFyY2ggT0YoKHVuc2lnbmVkIEZBUiAqaGF2ZSwgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikpOwogCi1pbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQoc3RybSkKK2ludCBaRVhQT1JUIGluZmxhdGVSZXNldEtlZXAoc3RybSkKIHpfc3RyZWFtcCBzdHJtOwogewogICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CkBAIC0xMDksMjIgKzExMCwxMjMgQEAKICAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKICAgICBzdHJtLT50b3RhbF9pbiA9IHN0cm0tPnRvdGFsX291dCA9IHN0YXRlLT50b3RhbCA9IDA7CiAgICAgc3RybS0+bXNnID0gWl9OVUxMOwotICAgIHN0cm0tPmFkbGVyID0gMTsgICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi8KKyAgICBpZiAoc3RhdGUtPndyYXApICAgICAgICAvKiB0byBzdXBwb3J0IGlsbC1jb25jZWl2ZWQgSmF2YSB0ZXN0IHN1aXRlICovCisgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPndyYXAgJiAxOwogICAgIHN0YXRlLT5tb2RlID0gSEVBRDsKICAgICBzdGF0ZS0+bGFzdCA9IDA7CiAgICAgc3RhdGUtPmhhdmVkaWN0ID0gMDsKICAgICBzdGF0ZS0+ZG1heCA9IDMyNzY4VTsKICAgICBzdGF0ZS0+aGVhZCA9IFpfTlVMTDsKLSAgICBzdGF0ZS0+d3NpemUgPSAwOwotICAgIHN0YXRlLT53aGF2ZSA9IDA7Ci0gICAgc3RhdGUtPndyaXRlID0gMDsKICAgICBzdGF0ZS0+aG9sZCA9IDA7CiAgICAgc3RhdGUtPmJpdHMgPSAwOwogICAgIHN0YXRlLT5sZW5jb2RlID0gc3RhdGUtPmRpc3Rjb2RlID0gc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgc3RhdGUtPnNhbmUgPSAxOworICAgIHN0YXRlLT5iYWNrID0gLTE7CiAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiByZXNldFxuIikpOwogICAgIHJldHVybiBaX09LOwogfQogCitpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQoc3RybSkKK3pfc3RyZWFtcCBzdHJtOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgc3RhdGUtPndzaXplID0gMDsKKyAgICBzdGF0ZS0+d2hhdmUgPSAwOworICAgIHN0YXRlLT53bmV4dCA9IDA7CisgICAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykKK3pfc3RyZWFtcCBzdHJtOworaW50IHdpbmRvd0JpdHM7Cit7CisgICAgaW50IHdyYXA7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKKworICAgIC8qIGdldCB0aGUgc3RhdGUgKi8KKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisKKyAgICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovCisgICAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7CisgICAgICAgIHdyYXAgPSAwOworICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxOworI2lmZGVmIEdVTlpJUAorICAgICAgICBpZiAod2luZG93Qml0cyA8IDQ4KQorICAgICAgICAgICAgd2luZG93Qml0cyAmPSAxNTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqLworICAgIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgaWYgKHN0YXRlLT53aW5kb3cgIT0gWl9OVUxMICYmIHN0YXRlLT53Yml0cyAhPSAodW5zaWduZWQpd2luZG93Qml0cykgeworICAgICAgICBaRlJFRShzdHJtLCBzdGF0ZS0+d2luZG93KTsKKyAgICAgICAgc3RhdGUtPndpbmRvdyA9IFpfTlVMTDsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJlc2V0IHRoZSByZXN0IG9mIGl0ICovCisgICAgc3RhdGUtPndyYXAgPSB3cmFwOworICAgIHN0YXRlLT53Yml0cyA9ICh1bnNpZ25lZCl3aW5kb3dCaXRzOworICAgIHJldHVybiBpbmZsYXRlUmVzZXQoc3RybSk7Cit9CisKK2ludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8oc3RybSwgd2luZG93Qml0cywgdmVyc2lvbiwgc3RyZWFtX3NpemUpCit6X3N0cmVhbXAgc3RybTsKK2ludCB3aW5kb3dCaXRzOworY29uc3QgY2hhciAqdmVyc2lvbjsKK2ludCBzdHJlYW1fc2l6ZTsKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAodmVyc2lvbiA9PSBaX05VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKKyAgICAgICAgc3RyZWFtX3NpemUgIT0gKGludCkoc2l6ZW9mKHpfc3RyZWFtKSkpCisgICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7CisgICAgaWYgKHN0cm0gPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+bXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICBpZiAoc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTApIHsKKyNpZmRlZiBaX1NPTE8KKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICAgICAgc3RybS0+emFsbG9jID0gemNhbGxvYzsKKyAgICAgICAgc3RybS0+b3BhcXVlID0gKHZvaWRwZikwOworI2VuZGlmCisgICAgfQorICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApCisjaWZkZWYgWl9TT0xPCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisgICAgICAgIHN0cm0tPnpmcmVlID0gemNmcmVlOworI2VuZGlmCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopCisgICAgICAgICAgICBaQUxMT0Moc3RybSwgMSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7CisgICAgaWYgKHN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOworICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7CisgICAgc3RybS0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKXN0YXRlOworICAgIHN0YXRlLT53aW5kb3cgPSBaX05VTEw7CisgICAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTsKKyAgICBpZiAocmV0ICE9IFpfT0spIHsKKyAgICAgICAgWkZSRUUoc3RybSwgc3RhdGUpOworICAgICAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfKHN0cm0sIHZlcnNpb24sIHN0cmVhbV9zaXplKQorel9zdHJlYW1wIHN0cm07Citjb25zdCBjaGFyICp2ZXJzaW9uOworaW50IHN0cmVhbV9zaXplOworeworICAgIHJldHVybiBpbmZsYXRlSW5pdDJfKHN0cm0sIERFRl9XQklUUywgdmVyc2lvbiwgc3RyZWFtX3NpemUpOworfQorCiBpbnQgWkVYUE9SVCBpbmZsYXRlUHJpbWUoc3RybSwgYml0cywgdmFsdWUpCiB6X3N0cmVhbXAgc3RybTsKIGludCBiaXRzOwpAQCAtMTM0LDYgKzIzNiwxMSBAQAogCiAgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOworICAgIGlmIChiaXRzIDwgMCkgeworICAgICAgICBzdGF0ZS0+aG9sZCA9IDA7CisgICAgICAgIHN0YXRlLT5iaXRzID0gMDsKKyAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgfQogICAgIGlmIChiaXRzID4gMTYgfHwgc3RhdGUtPmJpdHMgKyBiaXRzID4gMzIpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICB2YWx1ZSAmPSAoMUwgPDwgYml0cykgLSAxOwogICAgIHN0YXRlLT5ob2xkICs9IHZhbHVlIDw8IHN0YXRlLT5iaXRzOwpAQCAtMTQxLDU3ICsyNDgsNiBAQAogICAgIHJldHVybiBaX09LOwogfQogCi1pbnQgWkVYUE9SVCBpbmZsYXRlSW5pdDJfKHN0cm0sIHdpbmRvd0JpdHMsIHZlcnNpb24sIHN0cmVhbV9zaXplKQotel9zdHJlYW1wIHN0cm07Ci1pbnQgd2luZG93Qml0czsKLWNvbnN0IGNoYXIgKnZlcnNpb247Ci1pbnQgc3RyZWFtX3NpemU7Ci17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IFpMSUJfVkVSU0lPTlswXSB8fAotICAgICAgICBzdHJlYW1fc2l6ZSAhPSAoaW50KShzaXplb2Yoel9zdHJlYW0pKSkKLSAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKLSAgICBpZiAoc3RybSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdHJtLT5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqLwotICAgIGlmIChzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCkgewotICAgICAgICBzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOwotICAgICAgICBzdHJtLT5vcGFxdWUgPSAodm9pZHBmKTA7Ci0gICAgfQotICAgIGlmIChzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTApIHN0cm0tPnpmcmVlID0gemNmcmVlOwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKQotICAgICAgICAgICAgWkFMTE9DKHN0cm0sIDEsIHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSkpOwotICAgIGlmIChzdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGFsbG9jYXRlZFxuIikpOwotICAgIHN0cm0tPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKilzdGF0ZTsKLSAgICBpZiAod2luZG93Qml0cyA8IDApIHsKLSAgICAgICAgc3RhdGUtPndyYXAgPSAwOwotICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzdGF0ZS0+d3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTsKLSNpZmRlZiBHVU5aSVAKLSAgICAgICAgaWYgKHdpbmRvd0JpdHMgPCA0OCkgd2luZG93Qml0cyAmPSAxNTsKLSNlbmRpZgotICAgIH0KLSAgICBpZiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSB7Ci0gICAgICAgIFpGUkVFKHN0cm0sIHN0YXRlKTsKLSAgICAgICAgc3RybS0+c3RhdGUgPSBaX05VTEw7Ci0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICB9Ci0gICAgc3RhdGUtPndiaXRzID0gKHVuc2lnbmVkKXdpbmRvd0JpdHM7Ci0gICAgc3RhdGUtPndpbmRvdyA9IFpfTlVMTDsKLSAgICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pOwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8oc3RybSwgdmVyc2lvbiwgc3RyZWFtX3NpemUpCi16X3N0cmVhbXAgc3RybTsKLWNvbnN0IGNoYXIgKnZlcnNpb247Ci1pbnQgc3RyZWFtX3NpemU7Ci17Ci0gICAgcmV0dXJuIGluZmxhdGVJbml0Ml8oc3RybSwgREVGX1dCSVRTLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7Ci19Ci0KIC8qCiAgICBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvCiAgICBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguCkBAIC0yODYsOCArMzQyLDggQEAKICAgICBsb3cgPSAwOwogICAgIGZvciAoOzspIHsKICAgICAgICAgaWYgKChsb3cgJSA3KSA9PSAwKSBwcmludGYoIlxuICAgICAgICAiKTsKLSAgICAgICAgcHJpbnRmKCJ7JXUsJXUsJWR9Iiwgc3RhdGUubGVuY29kZVtsb3ddLm9wLCBzdGF0ZS5sZW5jb2RlW2xvd10uYml0cywKLSAgICAgICAgICAgICAgIHN0YXRlLmxlbmNvZGVbbG93XS52YWwpOworICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCAobG93ICYgMTI3KSA9PSA5OSA/IDY0IDogc3RhdGUubGVuY29kZVtsb3ddLm9wLAorICAgICAgICAgICAgICAgc3RhdGUubGVuY29kZVtsb3ddLmJpdHMsIHN0YXRlLmxlbmNvZGVbbG93XS52YWwpOwogICAgICAgICBpZiAoKytsb3cgPT0gc2l6ZSkgYnJlYWs7CiAgICAgICAgIHB1dGNoYXIoJywnKTsKICAgICB9CkBAIC0zMjAsMTIgKzM3NiwxMyBAQAogICAgb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLgogICAgVGhlIGFkdmFudGFnZSBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZSBwcm9jZXNzb3IncyBkYXRhIGNhY2hlcy4KICAqLwotbG9jYWwgaW50IHVwZGF0ZXdpbmRvdyhzdHJtLCBvdXQpCitsb2NhbCBpbnQgdXBkYXRld2luZG93KHN0cm0sIGVuZCwgY29weSkKIHpfc3RyZWFtcCBzdHJtOwotdW5zaWduZWQgb3V0OworY29uc3QgQnl0ZWYgKmVuZDsKK3Vuc2lnbmVkIGNvcHk7CiB7CiAgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLSAgICB1bnNpZ25lZCBjb3B5LCBkaXN0OworICAgIHVuc2lnbmVkIGRpc3Q7CiAKICAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKIApAQCAtMzQwLDMwICszOTcsMjkgQEAKICAgICAvKiBpZiB3aW5kb3cgbm90IGluIHVzZSB5ZXQsIGluaXRpYWxpemUgKi8KICAgICBpZiAoc3RhdGUtPndzaXplID09IDApIHsKICAgICAgICAgc3RhdGUtPndzaXplID0gMVUgPDwgc3RhdGUtPndiaXRzOwotICAgICAgICBzdGF0ZS0+d3JpdGUgPSAwOworICAgICAgICBzdGF0ZS0+d25leHQgPSAwOwogICAgICAgICBzdGF0ZS0+d2hhdmUgPSAwOwogICAgIH0KIAogICAgIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqLwotICAgIGNvcHkgPSBvdXQgLSBzdHJtLT5hdmFpbF9vdXQ7CiAgICAgaWYgKGNvcHkgPj0gc3RhdGUtPndzaXplKSB7Ci0gICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+d3NpemUsIHN0YXRlLT53c2l6ZSk7Ci0gICAgICAgIHN0YXRlLT53cml0ZSA9IDA7CisgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgZW5kIC0gc3RhdGUtPndzaXplLCBzdGF0ZS0+d3NpemUpOworICAgICAgICBzdGF0ZS0+d25leHQgPSAwOwogICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBkaXN0ID0gc3RhdGUtPndzaXplIC0gc3RhdGUtPndyaXRlOworICAgICAgICBkaXN0ID0gc3RhdGUtPndzaXplIC0gc3RhdGUtPnduZXh0OwogICAgICAgICBpZiAoZGlzdCA+IGNvcHkpIGRpc3QgPSBjb3B5OwotICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d3JpdGUsIHN0cm0tPm5leHRfb3V0IC0gY29weSwgZGlzdCk7CisgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7CiAgICAgICAgIGNvcHkgLT0gZGlzdDsKICAgICAgICAgaWYgKGNvcHkpIHsKLSAgICAgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgc3RybS0+bmV4dF9vdXQgLSBjb3B5LCBjb3B5KTsKLSAgICAgICAgICAgIHN0YXRlLT53cml0ZSA9IGNvcHk7CisgICAgICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpOworICAgICAgICAgICAgc3RhdGUtPnduZXh0ID0gY29weTsKICAgICAgICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN0YXRlLT53cml0ZSArPSBkaXN0OwotICAgICAgICAgICAgaWYgKHN0YXRlLT53cml0ZSA9PSBzdGF0ZS0+d3NpemUpIHN0YXRlLT53cml0ZSA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+d25leHQgKz0gZGlzdDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d25leHQgPT0gc3RhdGUtPndzaXplKSBzdGF0ZS0+d25leHQgPSAwOwogICAgICAgICAgICAgaWYgKHN0YXRlLT53aGF2ZSA8IHN0YXRlLT53c2l6ZSkgc3RhdGUtPndoYXZlICs9IGRpc3Q7CiAgICAgICAgIH0KICAgICB9CkBAIC00NjQsMTEgKzUyMCw2IEBACiAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKICAgICB9IHdoaWxlICgwKQogCi0vKiBSZXZlcnNlIHRoZSBieXRlcyBpbiBhIDMyLWJpdCB2YWx1ZSAqLwotI2RlZmluZSBSRVZFUlNFKHEpIFwKLSAgICAoKCgocSkgPj4gMjQpICYgMHhmZikgKyAoKChxKSA+PiA4KSAmIDB4ZmYwMCkgKyBcCi0gICAgICgoKHEpICYgMHhmZjAwKSA8PCA4KSArICgoKHEpICYgMHhmZikgPDwgMjQpKQotCiAvKgogICAgaW5mbGF0ZSgpIHVzZXMgYSBzdGF0ZSBtYWNoaW5lIHRvIHByb2Nlc3MgYXMgbXVjaCBpbnB1dCBkYXRhIGFuZCBnZW5lcmF0ZSBhcwogICAgbXVjaCBvdXRwdXQgZGF0YSBhcyBwb3NzaWJsZSBiZWZvcmUgcmV0dXJuaW5nLiAgVGhlIHN0YXRlIG1hY2hpbmUgaXMKQEAgLTU1Niw3ICs2MDcsNyBAQAogaW50IGZsdXNoOwogewogICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0gICAgdW5zaWduZWQgY2hhciBGQVIgKm5leHQ7ICAgIC8qIG5leHQgaW5wdXQgKi8KKyAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpuZXh0OyAgICAvKiBuZXh0IGlucHV0ICovCiAgICAgdW5zaWduZWQgY2hhciBGQVIgKnB1dDsgICAgIC8qIG5leHQgb3V0cHV0ICovCiAgICAgdW5zaWduZWQgaGF2ZSwgbGVmdDsgICAgICAgIC8qIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCiAgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGJpdCBidWZmZXIgKi8KQEAgLTU2NCw3ICs2MTUsNyBAQAogICAgIHVuc2lnbmVkIGluLCBvdXQ7ICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCiAgICAgdW5zaWduZWQgY29weTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqLwogICAgIHVuc2lnbmVkIGNoYXIgRkFSICpmcm9tOyAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi8KLSAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqLworICAgIGNvZGUgaGVyZTsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovCiAgICAgY29kZSBsYXN0OyAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YWJsZSBlbnRyeSAqLwogICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovCiAgICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCkBAIC02MTksNyArNjcwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIERST1BCSVRTKDQpOwogICAgICAgICAgICAgbGVuID0gQklUUyg0KSArIDg7Ci0gICAgICAgICAgICBpZiAobGVuID4gc3RhdGUtPndiaXRzKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUtPndiaXRzID09IDApCisgICAgICAgICAgICAgICAgc3RhdGUtPndiaXRzID0gbGVuOworICAgICAgICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUtPndiaXRzKSB7CiAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCB3aW5kb3cgc2l6ZSI7CiAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03NjAsNyArODEzLDcgQEAKICNlbmRpZgogICAgICAgICBjYXNlIERJQ1RJRDoKICAgICAgICAgICAgIE5FRURCSVRTKDMyKTsKLSAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gUkVWRVJTRShob2xkKTsKKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gWlNXQVAzMihob2xkKTsKICAgICAgICAgICAgIElOSVRCSVRTKCk7CiAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJQ1Q7CiAgICAgICAgIGNhc2UgRElDVDoKQEAgLTc3MSw3ICs4MjQsNyBAQAogICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwogICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwogICAgICAgICBjYXNlIFRZUEU6Ci0gICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9CTE9DSykgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9CTE9DSyB8fCBmbHVzaCA9PSBaX1RSRUVTKSBnb3RvIGluZl9sZWF2ZTsKICAgICAgICAgY2FzZSBUWVBFRE86CiAgICAgICAgICAgICBpZiAoc3RhdGUtPmxhc3QpIHsKICAgICAgICAgICAgICAgICBCWVRFQklUUygpOwpAQCAtNzkxLDcgKzg0NCwxMSBAQAogICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKICAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOyAgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi8KKyAgICAgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9UUkVFUykgeworICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqLwogICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xuIiwKQEAgLTgxNiw2ICs4NzMsOSBAQAogICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XG4iLAogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoKSk7CiAgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT1BZXzsKKyAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX1RSRUVTKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBDT1BZXzoKICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQ09QWTsKICAgICAgICAgY2FzZSBDT1BZOgogICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CkBAIC04NjEsNyArOTIxLDcgQEAKICAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IDE5KQogICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9IDA7CiAgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvbnN0IGNvZGUgRkFSICopKHN0YXRlLT5uZXh0KTsKICAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gNzsKICAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLT5sZW5zLCAxOSwgJihzdGF0ZS0+bmV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7CkBAIC04NzYsMTkgKzkzNiwxOCBAQAogICAgICAgICBjYXNlIENPREVMRU5TOgogICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbCA8IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gdGhpcy52YWw7CisgICAgICAgICAgICAgICAgaWYgKGhlcmUudmFsIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUrK10gPSBoZXJlLnZhbDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbCA9PSAxNikgewotICAgICAgICAgICAgICAgICAgICAgICAgTkVFREJJVFModGhpcy5iaXRzICsgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CkBAIC04OTgsMTYgKzk1NywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YWwgPT0gMTcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVyZS52YWwgPT0gMTcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOwogICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7CkBAIC05MjUsOSArOTg0LDE4IEBACiAgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovCiAgICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gQkFEKSBicmVhazsKIAotICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgKi8KKyAgICAgICAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqLworICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5zWzI1Nl0gPT0gMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHMKKyAgICAgICAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmgKKyAgICAgICAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi8KICAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOwotICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29uc3QgY29kZSBGQVIgKikoc3RhdGUtPm5leHQpOwogICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA5OwogICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgc3RhdGUtPm5sZW4sICYoc3RhdGUtPm5leHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOwpAQCAtOTM2LDcgKzEwMDQsNyBAQAogICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmRpc3Rjb2RlID0gKGNvZGUgY29uc3QgRkFSICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5kaXN0Y29kZSA9IChjb25zdCBjb2RlIEZBUiAqKShzdGF0ZS0+bmV4dCk7CiAgICAgICAgICAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA2OwogICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMgKyBzdGF0ZS0+bmxlbiwgc3RhdGUtPm5kaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPm5leHQpLCAmKHN0YXRlLT5kaXN0Yml0cyksIHN0YXRlLT53b3JrKTsKQEAgLTk0Niw4OCArMTAxNCwxMDIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZXMgb2tcbiIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOXzsKKyAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX1RSRUVTKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBMRU5fOgogICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47CiAgICAgICAgIGNhc2UgTEVOOgogICAgICAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkgewogICAgICAgICAgICAgICAgIFJFU1RPUkUoKTsKICAgICAgICAgICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgb3V0KTsKICAgICAgICAgICAgICAgICBMT0FEKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5tb2RlID09IFRZUEUpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrID0gLTE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+YmFjayA9IDA7CiAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRoaXMub3AgJiYgKHRoaXMub3AgJiAweGYwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IHRoaXM7CisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmJiAoaGVyZS5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gaGVyZTsKICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtsYXN0LnZhbCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmJhY2sgKz0gbGFzdC5iaXRzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpdGhpcy52YWw7Ci0gICAgICAgICAgICBpZiAoKGludCkodGhpcy5vcCkgPT0gMCkgewotICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgdGhpcy52YWwgPj0gMHgyMCAmJiB0aGlzLnZhbCA8IDB4N2YgPworICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKKyAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IGhlcmUuYml0czsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpaGVyZS52YWw7CisgICAgICAgICAgICBpZiAoKGludCkoaGVyZS5vcCkgPT0gMCkgeworICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgPwogICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCB0aGlzLnZhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcbiIsIGhlcmUudmFsKSk7CiAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMSVQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5vcCAmIDMyKSB7CisgICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDMyKSB7CiAgICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcbiIpKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayA9IC0xOwogICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGlzLm9wICYgNjQpIHsKKyAgICAgICAgICAgIGlmIChoZXJlLm9wICYgNjQpIHsKICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwogICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OwogICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5FWFQ7CiAgICAgICAgIGNhc2UgTEVORVhUOgogICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSkgewogICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CiAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CiAgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBzdGF0ZS0+ZXh0cmE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgc3RhdGUtPmxlbmd0aCkpOworICAgICAgICAgICAgc3RhdGUtPndhcyA9IHN0YXRlLT5sZW5ndGg7CiAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJU1Q7CiAgICAgICAgIGNhc2UgRElTVDoKICAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmRpc3Rjb2RlW0JJVFMoc3RhdGUtPmRpc3RiaXRzKV07Ci0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmRpc3Rjb2RlW0JJVFMoc3RhdGUtPmRpc3RiaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCh0aGlzLm9wICYgMHhmMCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOworICAgICAgICAgICAgaWYgKChoZXJlLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSBoZXJlOwogICAgICAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5kaXN0Y29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+ZGlzdGNvZGVbbGFzdC52YWwgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyB0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyBoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOworICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IGxhc3QuYml0czsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7Ci0gICAgICAgICAgICBpZiAodGhpcy5vcCAmIDY0KSB7CisgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOworICAgICAgICAgICAgc3RhdGUtPmJhY2sgKz0gaGVyZS5iaXRzOworICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgewogICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CiAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ID0gKHVuc2lnbmVkKXRoaXMudmFsOwotICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPm9mZnNldCA9ICh1bnNpZ25lZCloZXJlLnZhbDsKKyAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAxNTsKICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElTVEVYVDsKICAgICAgICAgY2FzZSBESVNURVhUOgogICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSkgewogICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CiAgICAgICAgICAgICAgICAgc3RhdGUtPm9mZnNldCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CiAgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBzdGF0ZS0+ZXh0cmE7CiAgICAgICAgICAgICB9CiAjaWZkZWYgSU5GTEFURV9TVFJJQ1QKICAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gc3RhdGUtPmRtYXgpIHsKQEAgLTEwMzYsMTEgKzExMTgsNiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IHN0YXRlLT53aGF2ZSArIG91dCAtIGxlZnQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBzdGF0ZS0+b2Zmc2V0KSk7CiAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE1BVENIOwogICAgICAgICBjYXNlIE1BVENIOgpAQCAtMTA0OCwxMiArMTEyNSwzMiBAQAogICAgICAgICAgICAgY29weSA9IG91dCAtIGxlZnQ7CiAgICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovCiAgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5vZmZzZXQgLSBjb3B5OwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPndyaXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUtPndyaXRlOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPndoYXZlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+c2FuZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUgorICAgICAgICAgICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZS5jIHRvbyBmYXJcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d2hhdmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7CisgICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcHV0KysgPSAwOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmxlbmd0aCA9PSAwKSBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS0+d25leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d25leHQ7CiAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53c2l6ZSAtIGNvcHkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53cml0ZSAtIGNvcHkpOworICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUtPndpbmRvdyArIChzdGF0ZS0+d25leHQgLSBjb3B5KTsKICAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqLwpAQCAtMTA4OCw3ICsxMTg1LDcgQEAKICNpZmRlZiBHVU5aSVAKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5mbGFncyA/IGhvbGQgOgogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICBSRVZFUlNFKGhvbGQpKSAhPSBzdGF0ZS0+Y2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgIFpTV0FQMzIoaG9sZCkpICE9IHN0YXRlLT5jaGVjaykgewogICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgZGF0YSBjaGVjayI7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExMzIsOCArMTIyOSw5IEBACiAgICAgICovCiAgIGluZl9sZWF2ZToKICAgICBSRVNUT1JFKCk7Ci0gICAgaWYgKHN0YXRlLT53c2l6ZSB8fCAoc3RhdGUtPm1vZGUgPCBDSEVDSyAmJiBvdXQgIT0gc3RybS0+YXZhaWxfb3V0KSkKLSAgICAgICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBvdXQpKSB7CisgICAgaWYgKHN0YXRlLT53c2l6ZSB8fCAob3V0ICE9IHN0cm0tPmF2YWlsX291dCAmJiBzdGF0ZS0+bW9kZSA8IEJBRCAmJgorICAgICAgICAgICAgKHN0YXRlLT5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT0gWl9GSU5JU0gpKSkKKyAgICAgICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLT5uZXh0X291dCwgb3V0IC0gc3RybS0+YXZhaWxfb3V0KSkgewogICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBNRU07CiAgICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CiAgICAgICAgIH0KQEAgLTExNDYsNyArMTI0NCw4IEBACiAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KICAgICAgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHN0cm0tPm5leHRfb3V0IC0gb3V0LCBvdXQpOwogICAgIHN0cm0tPmRhdGFfdHlwZSA9IHN0YXRlLT5iaXRzICsgKHN0YXRlLT5sYXN0ID8gNjQgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLT5tb2RlID09IFRZUEUgPyAxMjggOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gVFlQRSA/IDEyOCA6IDApICsKKyAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gTEVOXyB8fCBzdGF0ZS0+bW9kZSA9PSBDT1BZXyA/IDI1NiA6IDApOwogICAgIGlmICgoKGluID09IDAgJiYgb3V0ID09IDApIHx8IGZsdXNoID09IFpfRklOSVNIKSAmJiByZXQgPT0gWl9PSykKICAgICAgICAgcmV0ID0gWl9CVUZfRVJST1I7CiAgICAgcmV0dXJuIHJldDsKQEAgLTExNjYsMTMgKzEyNjUsMzcgQEAKICAgICByZXR1cm4gWl9PSzsKIH0KIAoraW50IFpFWFBPUlQgaW5mbGF0ZUdldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkKK3pfc3RyZWFtcCBzdHJtOworQnl0ZWYgKmRpY3Rpb25hcnk7Cit1SW50ICpkaWN0TGVuZ3RoOworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICAvKiBjaGVjayBzdGF0ZSAqLworICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKworICAgIC8qIGNvcHkgZGljdGlvbmFyeSAqLworICAgIGlmIChzdGF0ZS0+d2hhdmUgJiYgZGljdGlvbmFyeSAhPSBaX05VTEwpIHsKKyAgICAgICAgem1lbWNweShkaWN0aW9uYXJ5LCBzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LAorICAgICAgICAgICAgICAgIHN0YXRlLT53aGF2ZSAtIHN0YXRlLT53bmV4dCk7CisgICAgICAgIHptZW1jcHkoZGljdGlvbmFyeSArIHN0YXRlLT53aGF2ZSAtIHN0YXRlLT53bmV4dCwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+d2luZG93LCBzdGF0ZS0+d25leHQpOworICAgIH0KKyAgICBpZiAoZGljdExlbmd0aCAhPSBaX05VTEwpCisgICAgICAgICpkaWN0TGVuZ3RoID0gc3RhdGUtPndoYXZlOworICAgIHJldHVybiBaX09LOworfQorCiBpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQogel9zdHJlYW1wIHN0cm07CiBjb25zdCBCeXRlZiAqZGljdGlvbmFyeTsKIHVJbnQgZGljdExlbmd0aDsKIHsKICAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHVuc2lnbmVkIGxvbmcgaWQ7CisgICAgdW5zaWduZWQgbG9uZyBkaWN0aWQ7CisgICAgaW50IHJldDsKIAogICAgIC8qIGNoZWNrIHN0YXRlICovCiAgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwpAQCAtMTE4MCwyOSArMTMwMywyMSBAQAogICAgIGlmIChzdGF0ZS0+d3JhcCAhPSAwICYmIHN0YXRlLT5tb2RlICE9IERJQ1QpCiAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKIAotICAgIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWQgKi8KKyAgICAvKiBjaGVjayBmb3IgY29ycmVjdCBkaWN0aW9uYXJ5IGlkZW50aWZpZXIgKi8KICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gRElDVCkgewotICAgICAgICBpZCA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7Ci0gICAgICAgIGlkID0gYWRsZXIzMihpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCk7Ci0gICAgICAgIGlmIChpZCAhPSBzdGF0ZS0+Y2hlY2spCisgICAgICAgIGRpY3RpZCA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7CisgICAgICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsKKyAgICAgICAgaWYgKGRpY3RpZCAhPSBzdGF0ZS0+Y2hlY2spCiAgICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwogICAgIH0KIAotICAgIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgKi8KLSAgICBpZiAodXBkYXRld2luZG93KHN0cm0sIHN0cm0tPmF2YWlsX291dCkpIHsKKyAgICAvKiBjb3B5IGRpY3Rpb25hcnkgdG8gd2luZG93IHVzaW5nIHVwZGF0ZXdpbmRvdygpLCB3aGljaCB3aWxsIGFtZW5kIHRoZQorICAgICAgIGV4aXN0aW5nIGRpY3Rpb25hcnkgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICByZXQgPSB1cGRhdGV3aW5kb3coc3RybSwgZGljdGlvbmFyeSArIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpOworICAgIGlmIChyZXQpIHsKICAgICAgICAgc3RhdGUtPm1vZGUgPSBNRU07CiAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKICAgICB9Ci0gICAgaWYgKGRpY3RMZW5ndGggPiBzdGF0ZS0+d3NpemUpIHsKLSAgICAgICAgem1lbWNweShzdGF0ZS0+d2luZG93LCBkaWN0aW9uYXJ5ICsgZGljdExlbmd0aCAtIHN0YXRlLT53c2l6ZSwKLSAgICAgICAgICAgICAgICBzdGF0ZS0+d3NpemUpOwotICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB6bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d3NpemUgLSBkaWN0TGVuZ3RoLCBkaWN0aW9uYXJ5LAotICAgICAgICAgICAgICAgIGRpY3RMZW5ndGgpOwotICAgICAgICBzdGF0ZS0+d2hhdmUgPSBkaWN0TGVuZ3RoOwotICAgIH0KICAgICBzdGF0ZS0+aGF2ZWRpY3QgPSAxOwogICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxuIikpOwogICAgIHJldHVybiBaX09LOwpAQCAtMTIzOCw3ICsxMzUzLDcgQEAKICAqLwogbG9jYWwgdW5zaWduZWQgc3luY3NlYXJjaChoYXZlLCBidWYsIGxlbikKIHVuc2lnbmVkIEZBUiAqaGF2ZTsKLXVuc2lnbmVkIGNoYXIgRkFSICpidWY7Citjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmOwogdW5zaWduZWQgbGVuOwogewogICAgIHVuc2lnbmVkIGdvdDsKQEAgLTEzNTAsOCArMTQ2NSw4IEBACiAgICAgfQogCiAgICAgLyogY29weSBzdGF0ZSAqLwotICAgIHptZW1jcHkoZGVzdCwgc291cmNlLCBzaXplb2Yoel9zdHJlYW0pKTsKLSAgICB6bWVtY3B5KGNvcHksIHN0YXRlLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKKyAgICB6bWVtY3B5KCh2b2lkcGYpZGVzdCwgKHZvaWRwZilzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOworICAgIHptZW1jcHkoKHZvaWRwZiljb3B5LCAodm9pZHBmKXN0YXRlLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKICAgICBpZiAoc3RhdGUtPmxlbmNvZGUgPj0gc3RhdGUtPmNvZGVzICYmCiAgICAgICAgIHN0YXRlLT5sZW5jb2RlIDw9IHN0YXRlLT5jb2RlcyArIEVOT1VHSCAtIDEpIHsKICAgICAgICAgY29weS0+bGVuY29kZSA9IGNvcHktPmNvZGVzICsgKHN0YXRlLT5sZW5jb2RlIC0gc3RhdGUtPmNvZGVzKTsKQEAgLTEzNjYsMyArMTQ4MSwzMiBAQAogICAgIGRlc3QtPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKiljb3B5OwogICAgIHJldHVybiBaX09LOwogfQorCitpbnQgWkVYUE9SVCBpbmZsYXRlVW5kZXJtaW5lKHN0cm0sIHN1YnZlcnQpCit6X3N0cmVhbXAgc3RybTsKK2ludCBzdWJ2ZXJ0OworeworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7CisgICAgc3RhdGUtPnNhbmUgPSAhc3VidmVydDsKKyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlIKKyAgICByZXR1cm4gWl9PSzsKKyNlbHNlCisgICAgc3RhdGUtPnNhbmUgPSAxOworICAgIHJldHVybiBaX0RBVEFfRVJST1I7CisjZW5kaWYKK30KKworbG9uZyBaRVhQT1JUIGluZmxhdGVNYXJrKHN0cm0pCit6X3N0cmVhbXAgc3RybTsKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOworCisgICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIC0xTCA8PCAxNjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKKyAgICByZXR1cm4gKChsb25nKShzdGF0ZS0+YmFjaykgPDwgMTYpICsKKyAgICAgICAgKHN0YXRlLT5tb2RlID09IENPUFkgPyBzdGF0ZS0+bGVuZ3RoIDoKKyAgICAgICAgICAgIChzdGF0ZS0+bW9kZSA9PSBNQVRDSCA/IHN0YXRlLT53YXMgLSBzdGF0ZS0+bGVuZ3RoIDogMCkpOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGliL2luZmxhdGUuaCBiL01vZHVsZXMvemxpYi9pbmZsYXRlLmgKaW5kZXggMDdiZDNlNy4uOTVmNDk4NiAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL2luZmxhdGUuaAorKysgYi9Nb2R1bGVzL3psaWIvaW5mbGF0ZS5oCkBAIC0xLDUgKzEsNSBAQAogLyogaW5mbGF0ZS5oIC0tIGludGVybmFsIGluZmxhdGUgc3RhdGUgZGVmaW5pdGlvbgotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDQgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDkgTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTMyLDExICszMiwxMyBAQAogICAgICAgICBUWVBFLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovCiAgICAgICAgIFRZUEVETywgICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi8KICAgICAgICAgU1RPUkVELCAgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi8KKyAgICAgICAgQ09QWV8sICAgICAgLyogaS9vOiBzYW1lIGFzIENPUFkgYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi8KICAgICAgICAgQ09QWSwgICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi8KICAgICAgICAgVEFCTEUsICAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovCiAgICAgICAgIExFTkxFTlMsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLwogICAgICAgICBDT0RFTEVOUywgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgICAgIExFTiwgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgY29kZSAqLworICAgICAgICAgICAgTEVOXywgICAgICAgLyogaTogc2FtZSBhcyBMRU4gYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi8KKyAgICAgICAgICAgIExFTiwgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi8KICAgICAgICAgICAgIExFTkVYVCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovCiAgICAgICAgICAgICBESVNULCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBjb2RlICovCiAgICAgICAgICAgICBESVNURVhULCAgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovCkBAIC01MywxOSArNTUsMjEgQEAKIC8qCiAgICAgU3RhdGUgdHJhbnNpdGlvbnMgYmV0d2VlbiBhYm92ZSBtb2RlcyAtCiAKLSAgICAobW9zdCBtb2RlcyBjYW4gZ28gdG8gdGhlIEJBRCBvciBNRU0gbW9kZSAtLSBub3Qgc2hvd24gZm9yIGNsYXJpdHkpCisgICAgKG1vc3QgbW9kZXMgY2FuIGdvIHRvIEJBRCBvciBNRU0gb24gZXJyb3IgLS0gbm90IHNob3duIGZvciBjbGFyaXR5KQogCiAgICAgUHJvY2VzcyBoZWFkZXI6Ci0gICAgICAgIEhFQUQgLT4gKGd6aXApIG9yICh6bGliKQotICAgICAgICAoZ3ppcCkgLT4gRkxBR1MgLT4gVElNRSAtPiBPUyAtPiBFWExFTiAtPiBFWFRSQSAtPiBOQU1FCi0gICAgICAgIE5BTUUgLT4gQ09NTUVOVCAtPiBIQ1JDIC0+IFRZUEUKKyAgICAgICAgSEVBRCAtPiAoZ3ppcCkgb3IgKHpsaWIpIG9yIChyYXcpCisgICAgICAgIChnemlwKSAtPiBGTEFHUyAtPiBUSU1FIC0+IE9TIC0+IEVYTEVOIC0+IEVYVFJBIC0+IE5BTUUgLT4gQ09NTUVOVCAtPgorICAgICAgICAgICAgICAgICAgSENSQyAtPiBUWVBFCiAgICAgICAgICh6bGliKSAtPiBESUNUSUQgb3IgVFlQRQogICAgICAgICBESUNUSUQgLT4gRElDVCAtPiBUWVBFCisgICAgICAgIChyYXcpIC0+IFRZUEVETwogICAgIFJlYWQgZGVmbGF0ZSBibG9ja3M6Ci0gICAgICAgICAgICBUWVBFIC0+IFNUT1JFRCBvciBUQUJMRSBvciBMRU4gb3IgQ0hFQ0sKLSAgICAgICAgICAgIFNUT1JFRCAtPiBDT1BZIC0+IFRZUEUKLSAgICAgICAgICAgIFRBQkxFIC0+IExFTkxFTlMgLT4gQ09ERUxFTlMgLT4gTEVOCi0gICAgUmVhZCBkZWZsYXRlIGNvZGVzOgorICAgICAgICAgICAgVFlQRSAtPiBUWVBFRE8gLT4gU1RPUkVEIG9yIFRBQkxFIG9yIExFTl8gb3IgQ0hFQ0sKKyAgICAgICAgICAgIFNUT1JFRCAtPiBDT1BZXyAtPiBDT1BZIC0+IFRZUEUKKyAgICAgICAgICAgIFRBQkxFIC0+IExFTkxFTlMgLT4gQ09ERUxFTlMgLT4gTEVOXworICAgICAgICAgICAgTEVOXyAtPiBMRU4KKyAgICBSZWFkIGRlZmxhdGUgY29kZXMgaW4gZml4ZWQgb3IgZHluYW1pYyBibG9jazoKICAgICAgICAgICAgICAgICBMRU4gLT4gTEVORVhUIG9yIExJVCBvciBUWVBFCiAgICAgICAgICAgICAgICAgTEVORVhUIC0+IERJU1QgLT4gRElTVEVYVCAtPiBNQVRDSCAtPiBMRU4KICAgICAgICAgICAgICAgICBMSVQgLT4gTEVOCkBAIC03Myw3ICs3Nyw3IEBACiAgICAgICAgIENIRUNLIC0+IExFTkdUSCAtPiBET05FCiAgKi8KIAotLyogc3RhdGUgbWFpbnRhaW5lZCBiZXR3ZWVuIGluZmxhdGUoKSBjYWxscy4gIEFwcHJveGltYXRlbHkgN0sgYnl0ZXMuICovCisvKiBzdGF0ZSBtYWludGFpbmVkIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzLiAgQXBwcm94aW1hdGVseSAxMEsgYnl0ZXMuICovCiBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSB7CiAgICAgaW5mbGF0ZV9tb2RlIG1vZGU7ICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCiAgICAgaW50IGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovCkBAIC04OCw3ICs5Miw3IEBACiAgICAgdW5zaWduZWQgd2JpdHM7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovCiAgICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLwogICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCi0gICAgdW5zaWduZWQgd3JpdGU7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLworICAgIHVuc2lnbmVkIHduZXh0OyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi8KICAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi8KICAgICAgICAgLyogYml0IGFjY3VtdWxhdG9yICovCiAgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLwpAQCAtMTEyLDQgKzExNiw3IEBACiAgICAgdW5zaWduZWQgc2hvcnQgbGVuc1szMjBdOyAgIC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi8KICAgICB1bnNpZ25lZCBzaG9ydCB3b3JrWzI4OF07ICAgLyogd29yayBhcmVhIGZvciBjb2RlIHRhYmxlIGJ1aWxkaW5nICovCiAgICAgY29kZSBjb2Rlc1tFTk9VR0hdOyAgICAgICAgIC8qIHNwYWNlIGZvciBjb2RlIHRhYmxlcyAqLworICAgIGludCBzYW5lOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovCisgICAgaW50IGJhY2s7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi8KKyAgICB1bnNpZ25lZCB3YXM7ICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi8KIH07CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvaW5mdHJlZXMuYyBiL01vZHVsZXMvemxpYi9pbmZ0cmVlcy5jCmluZGV4IDhhOWMxM2YuLjQ0ZDg5Y2YgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi9pbmZ0cmVlcy5jCisrKyBiL01vZHVsZXMvemxpYi9pbmZ0cmVlcy5jCkBAIC0xLDUgKzEsNSBAQAogLyogaW5mdHJlZXMuYyAtLSBnZW5lcmF0ZSBIdWZmbWFuIHRyZWVzIGZvciBlZmZpY2llbnQgZGVjb2RpbmcKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCkBAIC05LDcgKzksNyBAQAogI2RlZmluZSBNQVhCSVRTIDE1CiAKIGNvbnN0IGNoYXIgaW5mbGF0ZV9jb3B5cmlnaHRbXSA9Ci0gICAiIGluZmxhdGUgMS4yLjMgQ29weXJpZ2h0IDE5OTUtMjAwNSBNYXJrIEFkbGVyICI7CisgICAiIGluZmxhdGUgMS4yLjggQ29weXJpZ2h0IDE5OTUtMjAxMyBNYXJrIEFkbGVyICI7CiAvKgogICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCiAgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKQEAgLTI5LDcgKzI5LDcgQEAKICAgIHRhYmxlIGluZGV4IGJpdHMuICBJdCB3aWxsIGRpZmZlciBpZiB0aGUgcmVxdWVzdCBpcyBncmVhdGVyIHRoYW4gdGhlCiAgICBsb25nZXN0IGNvZGUgb3IgaWYgaXQgaXMgbGVzcyB0aGFuIHRoZSBzaG9ydGVzdCBjb2RlLgogICovCi1pbnQgaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBjb2RlcywgdGFibGUsIGJpdHMsIHdvcmspCitpbnQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX3RhYmxlKHR5cGUsIGxlbnMsIGNvZGVzLCB0YWJsZSwgYml0cywgd29yaykKIGNvZGV0eXBlIHR5cGU7CiB1bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnM7CiB1bnNpZ25lZCBjb2RlczsKQEAgLTUwLDcgKzUwLDcgQEAKICAgICB1bnNpZ25lZCBmaWxsOyAgICAgICAgICAgICAgLyogaW5kZXggZm9yIHJlcGxpY2F0aW5nIGVudHJpZXMgKi8KICAgICB1bnNpZ25lZCBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqLwogICAgIHVuc2lnbmVkIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovCi0gICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqLworICAgIGNvZGUgaGVyZTsgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi8KICAgICBjb2RlIEZBUiAqbmV4dDsgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gdGFibGUgKi8KICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGQVIgKmJhc2U7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqLwogICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEZBUiAqZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICAgIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwfTsKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGV4dFszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqLwogICAgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwKLSAgICAgICAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDIwMSwgMTk2fTsKKyAgICAgICAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OH07CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRiYXNlWzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqLwogICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsCiAgICAgICAgIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwKQEAgLTExNSwxNSArMTE1LDE1IEBACiAgICAgICAgIGlmIChjb3VudFttYXhdICE9IDApIGJyZWFrOwogICAgIGlmIChyb290ID4gbWF4KSByb290ID0gbWF4OwogICAgIGlmIChtYXggPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi8KLSAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovCi0gICAgICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKTE7Ci0gICAgICAgIHRoaXMudmFsID0gKHVuc2lnbmVkIHNob3J0KTA7Ci0gICAgICAgICooKnRhYmxlKSsrID0gdGhpczsgICAgICAgICAgICAgLyogbWFrZSBhIHRhYmxlIHRvIGZvcmNlIGFuIGVycm9yICovCi0gICAgICAgICooKnRhYmxlKSsrID0gdGhpczsKKyAgICAgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovCisgICAgICAgIGhlcmUuYml0cyA9ICh1bnNpZ25lZCBjaGFyKTE7CisgICAgICAgIGhlcmUudmFsID0gKHVuc2lnbmVkIHNob3J0KTA7CisgICAgICAgICooKnRhYmxlKSsrID0gaGVyZTsgICAgICAgICAgICAgLyogbWFrZSBhIHRhYmxlIHRvIGZvcmNlIGFuIGVycm9yICovCisgICAgICAgICooKnRhYmxlKSsrID0gaGVyZTsKICAgICAgICAgKmJpdHMgPSAxOwogICAgICAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi8KICAgICB9Ci0gICAgZm9yIChtaW4gPSAxOyBtaW4gPD0gTUFYQklUUzsgbWluKyspCisgICAgZm9yIChtaW4gPSAxOyBtaW4gPCBtYXg7IG1pbisrKQogICAgICAgICBpZiAoY291bnRbbWluXSAhPSAwKSBicmVhazsKICAgICBpZiAocm9vdCA8IG1pbikgcm9vdCA9IG1pbjsKIApAQCAtMTY2LDExICsxNjYsMTAgQEAKICAgICAgICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuCiAKICAgICAgICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZQotICAgICAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgd2hlbiBhIExFTlMgdGFibGUgaXMgYmVpbmcgbWFkZQotICAgICAgIGFnYWluc3QgdGhlIHNwYWNlIGluICp0YWJsZSwgRU5PVUdILCBtaW51cyB0aGUgbWF4aW11bSBzcGFjZSBuZWVkZWQgYnkKLSAgICAgICB0aGUgd29yc3QgY2FzZSBkaXN0YW5jZSBjb2RlLCBNQVhELiAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgdGhlCi0gICAgICAgc3VmZmljaWVuY3kgb2YgRU5PVUdIIGhhcyBub3QgYmVlbiBwcm92ZW4gZXhoYXVzdGl2ZWx5LCBoZW5jZSB0aGUgY2hlY2suCi0gICAgICAgVGhpcyBhc3N1bWVzIHRoYXQgd2hlbiB0eXBlID09IExFTlMsIGJpdHMgPT0gOS4KKyAgICAgICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIGZvciBMRU5TIGFuZCBESVNUIHRhYmxlcyBhZ2FpbnN0CisgICAgICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpbgorICAgICAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmgKKyAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAogICAgICAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4KICAgICAgICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzCkBAIC0yMDksMjQgKzIwOCwyNSBAQAogICAgIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovCiAKICAgICAvKiBjaGVjayBhdmFpbGFibGUgdGFibGUgc3BhY2UgKi8KLSAgICBpZiAodHlwZSA9PSBMRU5TICYmIHVzZWQgPj0gRU5PVUdIIC0gTUFYRCkKKyAgICBpZiAoKHR5cGUgPT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8CisgICAgICAgICh0eXBlID09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKQogICAgICAgICByZXR1cm4gMTsKIAogICAgIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi8KICAgICBmb3IgKDs7KSB7CiAgICAgICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqLwotICAgICAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7CisgICAgICAgIGhlcmUuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKICAgICAgICAgaWYgKChpbnQpKHdvcmtbc3ltXSkgPCBlbmQpIHsKLSAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikwOwotICAgICAgICAgICAgdGhpcy52YWwgPSB3b3JrW3N5bV07CisgICAgICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpMDsKKyAgICAgICAgICAgIGhlcmUudmFsID0gd29ya1tzeW1dOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKChpbnQpKHdvcmtbc3ltXSkgPiBlbmQpIHsKLSAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikoZXh0cmFbd29ya1tzeW1dXSk7Ci0gICAgICAgICAgICB0aGlzLnZhbCA9IGJhc2Vbd29ya1tzeW1dXTsKKyAgICAgICAgICAgIGhlcmUub3AgPSAodW5zaWduZWQgY2hhcikoZXh0cmFbd29ya1tzeW1dXSk7CisgICAgICAgICAgICBoZXJlLnZhbCA9IGJhc2Vbd29ya1tzeW1dXTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikoMzIgKyA2NCk7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovCi0gICAgICAgICAgICB0aGlzLnZhbCA9IDA7CisgICAgICAgICAgICBoZXJlLm9wID0gKHVuc2lnbmVkIGNoYXIpKDMyICsgNjQpOyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgaGVyZS52YWwgPSAwOwogICAgICAgICB9CiAKICAgICAgICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi8KQEAgLTIzNSw3ICsyMzUsNyBAQAogICAgICAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqLwogICAgICAgICBkbyB7CiAgICAgICAgICAgICBmaWxsIC09IGluY3I7Ci0gICAgICAgICAgICBuZXh0WyhodWZmID4+IGRyb3ApICsgZmlsbF0gPSB0aGlzOworICAgICAgICAgICAgbmV4dFsoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gaGVyZTsKICAgICAgICAgfSB3aGlsZSAoZmlsbCAhPSAwKTsKIAogICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLwpAQCAtMjc3LDcgKzI3Nyw4IEBACiAKICAgICAgICAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi8KICAgICAgICAgICAgIHVzZWQgKz0gMVUgPDwgY3VycjsKLSAgICAgICAgICAgIGlmICh0eXBlID09IExFTlMgJiYgdXNlZCA+PSBFTk9VR0ggLSBNQVhEKQorICAgICAgICAgICAgaWYgKCh0eXBlID09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fAorICAgICAgICAgICAgICAgICh0eXBlID09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKQogICAgICAgICAgICAgICAgIHJldHVybiAxOwogCiAgICAgICAgICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqLwpAQCAtMjg4LDM4ICsyODksMTQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qCi0gICAgICAgRmlsbCBpbiByZXN0IG9mIHRhYmxlIGZvciBpbmNvbXBsZXRlIGNvZGVzLiAgVGhpcyBsb29wIGlzIHNpbWlsYXIgdG8gdGhlCi0gICAgICAgbG9vcCBhYm92ZSBpbiBpbmNyZW1lbnRpbmcgaHVmZiBmb3IgdGFibGUgaW5kaWNlcy4gIEl0IGlzIGFzc3VtZWQgdGhhdAotICAgICAgIGxlbiBpcyBlcXVhbCB0byBjdXJyICsgZHJvcCwgc28gdGhlcmUgaXMgbm8gbG9vcCBuZWVkZWQgdG8gaW5jcmVtZW50Ci0gICAgICAgdGhyb3VnaCBoaWdoIGluZGV4IGJpdHMuICBXaGVuIHRoZSBjdXJyZW50IHN1Yi10YWJsZSBpcyBmaWxsZWQsIHRoZSBsb29wCi0gICAgICAgZHJvcHMgYmFjayB0byB0aGUgcm9vdCB0YWJsZSB0byBmaWxsIGluIGFueSByZW1haW5pbmcgZW50cmllcyB0aGVyZS4KLSAgICAgKi8KLSAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgICAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KLSAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7Ci0gICAgdGhpcy52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKLSAgICB3aGlsZSAoaHVmZiAhPSAwKSB7Ci0gICAgICAgIC8qIHdoZW4gZG9uZSB3aXRoIHN1Yi10YWJsZSwgZHJvcCBiYWNrIHRvIHJvb3QgdGFibGUgKi8KLSAgICAgICAgaWYgKGRyb3AgIT0gMCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgewotICAgICAgICAgICAgZHJvcCA9IDA7Ci0gICAgICAgICAgICBsZW4gPSByb290OwotICAgICAgICAgICAgbmV4dCA9ICp0YWJsZTsKLSAgICAgICAgICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKWxlbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHB1dCBpbnZhbGlkIGNvZGUgbWFya2VyIGluIHRhYmxlICovCi0gICAgICAgIG5leHRbaHVmZiA+PiBkcm9wXSA9IHRoaXM7Ci0KLSAgICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi8KLSAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSAxKTsKLSAgICAgICAgd2hpbGUgKGh1ZmYgJiBpbmNyKQotICAgICAgICAgICAgaW5jciA+Pj0gMTsKLSAgICAgICAgaWYgKGluY3IgIT0gMCkgewotICAgICAgICAgICAgaHVmZiAmPSBpbmNyIC0gMTsKLSAgICAgICAgICAgIGh1ZmYgKz0gaW5jcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBodWZmID0gMDsKKyAgICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZQorICAgICAgIGF0IG1vc3Qgb25lIHJlbWFpbmluZyBlbnRyeSwgc2luY2UgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSwgdGhlCisgICAgICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqLworICAgIGlmIChodWZmICE9IDApIHsKKyAgICAgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKTY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KKyAgICAgICAgaGVyZS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpKGxlbiAtIGRyb3ApOworICAgICAgICBoZXJlLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkwOworICAgICAgICBuZXh0W2h1ZmZdID0gaGVyZTsKICAgICB9CiAKICAgICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9pbmZ0cmVlcy5oIGIvTW9kdWxlcy96bGliL2luZnRyZWVzLmgKaW5kZXggYjExMDRjOC4uYmFhNTNhMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL2luZnRyZWVzLmgKKysrIGIvTW9kdWxlcy96bGliL2luZnRyZWVzLmgKQEAgLTEsNSArMSw1IEBACiAvKiBpbmZ0cmVlcy5oIC0tIGhlYWRlciB0byB1c2UgaW5mdHJlZXMuYwotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUsIDIwMTAgTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTM1LDIxICszNSwyOCBAQAogICAgIDAxMDAwMDAwIC0gaW52YWxpZCBjb2RlCiAgKi8KIAotLyogTWF4aW11bSBzaXplIG9mIGR5bmFtaWMgdHJlZS4gIFRoZSBtYXhpbXVtIGZvdW5kIGluIGEgbG9uZyBidXQgbm9uLQotICAgZXhoYXVzdGl2ZSBzZWFyY2ggd2FzIDE0NDQgY29kZSBzdHJ1Y3R1cmVzICg4NTIgZm9yIGxlbmd0aC9saXRlcmFscwotICAgYW5kIDU5MiBmb3IgZGlzdGFuY2VzLCB0aGUgbGF0dGVyIGFjdHVhbGx5IHRoZSByZXN1bHQgb2YgYW4KLSAgIGV4aGF1c3RpdmUgc2VhcmNoKS4gIFRoZSB0cnVlIG1heGltdW0gaXMgbm90IGtub3duLCBidXQgdGhlIHZhbHVlCi0gICBiZWxvdyBpcyBtb3JlIHRoYW4gc2FmZS4gKi8KLSNkZWZpbmUgRU5PVUdIIDIwNDgKLSNkZWZpbmUgTUFYRCA1OTIKKy8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZHluYW1pYyB0YWJsZS4gIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2RlIHN0cnVjdHVyZXMgaXMKKyAgIDE0NDQsIHdoaWNoIGlzIHRoZSBzdW0gb2YgODUyIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcyBhbmQgNTkyIGZvciBkaXN0YW5jZQorICAgY29kZXMuICBUaGVzZSB2YWx1ZXMgd2VyZSBmb3VuZCBieSBleGhhdXN0aXZlIHNlYXJjaGVzIHVzaW5nIHRoZSBwcm9ncmFtCisgICBleGFtcGxlcy9lbm91Z2guYyBmb3VuZCBpbiB0aGUgemxpYiBkaXN0cmlidHV0aW9uLiAgVGhlIGFyZ3VtZW50cyB0byB0aGF0CisgICBwcm9ncmFtIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMsIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSwgYW5kIHRoZQorICAgbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGEgY29kZS4gICJlbm91Z2ggMjg2IDkgMTUiIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcworICAgcmV0dXJucyByZXR1cm5zIDg1MiwgYW5kICJlbm91Z2ggMzAgNiAxNSIgZm9yIGRpc3RhbmNlIGNvZGVzIHJldHVybnMgNTkyLgorICAgVGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplICg5IG9yIDYpIGlzIGZvdW5kIGluIHRoZSBmaWZ0aCBhcmd1bWVudCBvZiB0aGUKKyAgIGluZmxhdGVfdGFibGUoKSBjYWxscyBpbiBpbmZsYXRlLmMgYW5kIGluZmJhY2suYy4gIElmIHRoZSByb290IHRhYmxlIHNpemUgaXMKKyAgIGNoYW5nZWQsIHRoZW4gdGhlc2UgbWF4aW11bSBzaXplcyB3b3VsZCBiZSBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCBhbmQKKyAgIHVwZGF0ZWQuICovCisjZGVmaW5lIEVOT1VHSF9MRU5TIDg1MgorI2RlZmluZSBFTk9VR0hfRElTVFMgNTkyCisjZGVmaW5lIEVOT1VHSCAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKQogCi0vKiBUeXBlIG9mIGNvZGUgdG8gYnVpbGQgZm9yIGluZnRhYmxlKCkgKi8KKy8qIFR5cGUgb2YgY29kZSB0byBidWlsZCBmb3IgaW5mbGF0ZV90YWJsZSgpICovCiB0eXBlZGVmIGVudW0gewogICAgIENPREVTLAogICAgIExFTlMsCiAgICAgRElTVFMKIH0gY29kZXR5cGU7CiAKLWV4dGVybiBpbnQgaW5mbGF0ZV90YWJsZSBPRigoY29kZXR5cGUgdHlwZSwgdW5zaWduZWQgc2hvcnQgRkFSICpsZW5zLAoraW50IFpMSUJfSU5URVJOQUwgaW5mbGF0ZV90YWJsZSBPRigoY29kZXR5cGUgdHlwZSwgdW5zaWduZWQgc2hvcnQgRkFSICpsZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb2RlcywgY29kZSBGQVIgKiBGQVIgKnRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGQVIgKmJpdHMsIHVuc2lnbmVkIHNob3J0IEZBUiAqd29yaykpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGliL21ha2Vfdm1zLmNvbSBiL01vZHVsZXMvemxpYi9tYWtlX3Ztcy5jb20KaW5kZXggYzJhMWZiNS4uNjVlOWQwYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL21ha2Vfdm1zLmNvbQorKysgYi9Nb2R1bGVzL3psaWIvbWFrZV92bXMuY29tCkBAIC0xLDQ2ICsxLDk1IEBACiAkISBtYWtlIGxpYnogdW5kZXIgVk1TIHdyaXR0ZW4gYnkKICQhIE1hcnRpbiBQLkouIFppbnNlcgotJCEgPHppbnNlckB6aW5zZXIubm8taXAuaW5mbyBvciB6aW5zZXJAc3lzZGV2LmRldXRzY2hlLWJvZXJzZS5jb20+CiskIQorJCEgSW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIHRoZSBpbnN0YWxsIHlvdSBtaWdodCBjb250YWN0IG1lIGF0CiskISB6aW5zZXJAemluc2VyLm5vLWlwLmluZm8ocHJlZmVycmVkKSBvcgorJCEgbWFydGluLnppbnNlckBldXJleGNoYW5nZS5jb20gKHdvcmspCiskIQorJCEgTWFrZSBwcm9jZWR1cmUgaGlzdG9yeSBmb3IgWmxpYgorJCEKKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwNjAxMjAgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiskISAwLjAyIDIwMDYxMDA4IEFkYXB0IHRvIG5ldyBNYWtlZmlsZS5pbgorJCEgMC4wMyAyMDA5MTIyNCBBZGQgc3VwcG9ydCBmb3IgbGFyZ2UgZmlsZSBjaGVjaworJCEgMC4wNCAyMDEwMDExMCBBZGQgbmV3IGd6Y2xvc2UsIGd6bGliLCBnenJlYWQsIGd6d3JpdGUKKyQhIDAuMDUgMjAxMDAyMjEgRXhjaGFuZ2UgemxpYmRlZnMuaCBieSB6Y29uZi5oLmluCiskISAwLjA2IDIwMTIwMTExIEZpeCBtaXNzaW5nIGFtaXNzX2VyciwgdXBkYXRlIHpjb25mX2guaW4sIGZpeCBuZXcgZXhtcGxlcworJCEgICAgICAgICAgICAgICBzdWJkaXIgcGF0aCwgdXBkYXRlIG1vZHVsZSBzZWFyY2ggaW4gbWFrZWZpbGUuaW4KKyQhIDAuMDcgMjAxMjAxMTUgVHJpZ2dlcmVkIGJ5IHdvcmsgZG9uZSBieSBBbGV4ZXkgQ2h1cGFoaW4gY29tcGxldGx5IHJlZGVzaWduZWQKKyQhICAgICAgICAgICAgICAgc2hhcmVkIGltYWdlIGNyZWF0aW9uCiskISAwLjA4IDIwMTIwMjE5IE1ha2UgaXQgd29yayBvbiBWQVggYWdhaW4sIHByZS1sb2FkIG1pc3Npbmcgc3ltYm9scyB0byBzaGFyZWQKKyQhICAgICAgICAgICAgICAgaW1hZ2UKKyQhIDAuMDkgMjAxMjAzMDUgU01TLiAgUDEgc2V0cyBidWlsZGVyICgiTU1LIiwgIk1NUyIsICIgIiAoYnVpbHQtaW4pKS4KKyQhICAgICAgICAgICAgICAgIiIgLT4gYXV0b21hdGljLCBwcmVmZXJlbmNlOiBNTUssIE1NUywgYnVpbHQtaW4uCiAkIQogJCBvbiBlcnJvciB0aGVuIGdvdG8gZXJyX2V4aXQKICQhCi0kIQotJCEgSnVzdCBzb21lIGdlbmVyYWwgY29uc3RhbnRzLi4uCi0kIQogJCB0cnVlICA9IDEKICQgZmFsc2UgPSAwCiAkIHRtcG5hbSA9ICJ0ZW1wXyIgKyBmJGdldGpwaSgiIiwicGlkIikKLSQgU0FZID0gIldSSVRFIFNZUyRPVVRQVVQiCiskIHR0ID0gdG1wbmFtICsgIi50eHQiCiskIHRjID0gdG1wbmFtICsgIi5jIgorJCB0aCA9IHRtcG5hbSArICIuaCIKKyQgZGVmaW5lL25vbG9nIHRjb25maWcgJ3RoJworJCBpdHNfZGVjYyA9IGZhbHNlCiskIGl0c192YXhjID0gZmFsc2UKKyQgaXRzX2dudWMgPSBmYWxzZQorJCBzX2Nhc2UgICA9IEZhbHNlCiAkIQogJCEgU2V0dXAgdmFyaWFibGVzIGhvbGRpbmcgImNvbmZpZyIgaW5mb3JtYXRpb24KICQhCi0kIE1ha2UgICAgID0gIiIKKyQgTWFrZSAgICA9ICInJ3AxJyIKICQgbmFtZSAgICAgPSAiWmxpYiIKICQgdmVyc2lvbiAgPSAiPy4/Lj8iCiAkIHZfc3RyaW5nID0gIlpMSUJfVkVSU0lPTiIKICQgdl9maWxlICAgPSAiemxpYi5oIgotJCBjY29wdCAgICA9ICIiCi0kIGxvcHRzICAgID0gIiIKKyQgY2NvcHQgICA9ICIvaW5jbHVkZSA9IFtdIgorJCBsb3B0cyAgID0gIiIKKyQgZG5zcmwgICA9ICIiCiskIGFjb25mX2luX2ZpbGUgPSAiemNvbmYuaC5pbiN6Y29uZi5oX2luI3pjb25mX2guaW4iCiskIGNvbmZfY2hlY2tfc3RyaW5nID0gIiIKICQgbGlua29ubHkgPSBmYWxzZQogJCBvcHRmaWxlICA9IG5hbWUgKyAiLm9wdCIKLSQgaXRzX2RlY2MgPSBmYWxzZQotJCBpdHNfdmF4YyA9IGZhbHNlCi0kIGl0c19nbnVjID0gZmFsc2UKLSQgYXhwICAgICAgPSBmJGdldHN5aSgiSFdfTU9ERUwiKS5nZS4xMDI0Ci0kIHNfY2FzZSAgID0gZmFsc2UKKyQgbWFwZmlsZSAgPSBuYW1lICsgIi5tYXAiCiskIGxpYmRlZnMgID0gIiIKKyQgdmF4ICAgICAgPSBmJGdldHN5aSgiSFdfTU9ERUwiKS5sdC4xMDI0CiskIGF4cCAgICAgID0gZiRnZXRzeWkoIkhXX01PREVMIikuZ2UuMTAyNCAuYW5kLiBmJGdldHN5aSgiSFdfTU9ERUwiKS5sdC40MDk2CiskIGlhNjQgICAgID0gZiRnZXRzeWkoIkhXX01PREVMIikuZ2UuNDA5NgorJCEKKyQhIDIwMTItMDMtMDUgU01TLgorJCEgV2h5IGlzIHRoaXMgbmVlZGVkPyAgQW5kIGlmIGl0IGlzIG5lZWRlZCwgd2h5IG5vdCBzaW1wbHkgIi5ub3QuIHZheCI/CiskIQorJCEhISBpZiBheHAgLm9yLiBpYTY0IHRoZW4gIHNldCBwcm9jL3BhcnNlPWV4dGVuZGVkCiskIQorJCB3aG9hbWkgPSBmJHBhcnNlKGYkZW52aXJvbm1lbnQoIlByb2NlZHVyZSIpLCwsLCJOT19DT05DRUFMIikKKyQgbXlkZWYgID0gRiRwYXJzZSh3aG9hbWksLCwiREVWSUNFIikKKyQgbXlkaXIgID0gZiRwYXJzZSh3aG9hbWksLCwiRElSRUNUT1JZIikgLSAiXVsiCiskIG15cHJvYyA9IGYkcGFyc2Uod2hvYW1pLCwsIk5hbWUiKSArIGYkcGFyc2Uod2hvYW1pLCwsInR5cGUiKQorJCEKICQhIENoZWNrIGZvciBNTUsvTU1TCiAkIQotJCBJZiBGJFNlYXJjaCAoIlN5cyRTeXN0ZW06TU1TLkVYRSIpIC5uZXMuICIiIFRoZW4gTWFrZSA9ICJNTVMiCi0kIElmIEYkVHlwZSAoTU1LKSAuZXFzLiAiU1RSSU5HIiBUaGVuIE1ha2UgPSAiTU1LIgotJCEKKyQgaWYgKE1ha2UgLmVxcy4gIiIpCiskIHRoZW4KKyQgICBJZiBGJFNlYXJjaCAoIlN5cyRTeXN0ZW06TU1TLkVYRSIpIC5uZXMuICIiIFRoZW4gTWFrZSA9ICJNTVMiCiskICAgSWYgRiRUeXBlIChNTUspIC5lcXMuICJTVFJJTkciIFRoZW4gTWFrZSA9ICJNTUsiCiskIGVsc2UKKyQgICBNYWtlID0gZiRlZGl0KCBNYWtlLCAidHJpbSIpCiskIGVuZGlmCiAkIQogJCBnb3N1YiBmaW5kX3ZlcnNpb24KICQhCiskICBvcGVuL3dyaXRlIHRvcHQgdG1wLm9wdAorJCAgb3Blbi93cml0ZSBvcHRmICdvcHRmaWxlJworJCEKICQgZ29zdWIgY2hlY2tfb3B0cwogJCEKICQhIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkCiAkIQogJCBnb3N1YiBjaGVja19jb21waWxlcgorJCBjbG9zZSB0b3B0CiskIGNsb3NlIG9wdGYKKyQhCiAkIGlmIGl0c19kZWNjCiAkIHRoZW4KICQgICBjY29wdCA9ICIvcHJlZml4PWFsbCIgKyBjY29wdApAQCAtNTQsMTggKzEwMyw3OSBAQAogJCAgICAgICBkZWZpbmUgc3lzIGRlY2MkbGlicmFyeV9pbmNsdWRlOgogJCAgICAgZW5kaWYKICQgICBlbmRpZgorJCEKKyQhIDIwMTItMDMtMDUgU01TLgorJCEgV2h5IC9OQU1FUyA9IEFTX0lTPyAgV2h5IG5vdCBzaW1wbHkgIi5ub3QuIHZheCI/ICBBbmQgd2h5IG5vdCBvbiBWQVg/CiskIQorJCAgIGlmIGF4cCAub3IuIGlhNjQKKyQgICB0aGVuCiskICAgICAgIGNjb3B0ID0gY2NvcHQgKyAiL25hbWU9YXNfaXMvb3B0PShpbmxpbmU9c3BlZWQpIgorJCAgICAgICBzX2Nhc2UgPSB0cnVlCiskICAgZW5kaWYKICQgZW5kaWYKICQgaWYgaXRzX3ZheGMgLm9yLiBpdHNfZ251YwogJCB0aGVuCiAkICAgIGlmIGYkdHJubG5tKCJTWVMiKS5lcXMuIiIgdGhlbiBkZWZpbmUgc3lzIHN5cyRsaWJyYXJ5OgogJCBlbmRpZgogJCEKKyQhIEJ1aWxkIGEgZmFrZSBjb25maWd1cmUgaW5wdXQgaGVhZGVyCiskIQorJCBvcGVuL3dyaXRlIGNvbmZfaGluIGNvbmZpZy5oaW4KKyQgd3JpdGUgY29uZl9oaW4gIiN1bmRlZiBfTEFSR0VGSUxFNjRfU09VUkNFIgorJCBjbG9zZSBjb25mX2hpbgorJCEKKyQhCiskIGkgPSAwCiskRklORF9BQ09ORjoKKyQgZm5hbWUgPSBmJGVsZW1lbnQoaSwiIyIsYWNvbmZfaW5fZmlsZSkKKyQgaWYgZm5hbWUgLmVxcy4gIiMiIHRoZW4gZ290byBBTUlTU19FUlIKKyQgaWYgZiRzZWFyY2goZm5hbWUpIC5lcXMuICIiCiskIHRoZW4KKyQgICBpID0gaSArIDEKKyQgICBnb3RvIGZpbmRfYWNvbmYKKyQgZW5kaWYKKyQgb3Blbi9yZWFkL2Vycj1hY29uZl9lcnIgYWNvbmZfaW4gJ2ZuYW1lJworJCBvcGVuL3dyaXRlIGFjb25mIHpjb25mLmgKKyRBQ09ORl9MT09QOgorJCByZWFkL2VuZF9vZl9maWxlPWFjb25mX2V4aXQgYWNvbmZfaW4gbGluZQorJCB3b3JrID0gZiRlZGl0KGxpbmUsICJjb21wcmVzcyx0cmltIikKKyQgaWYgZiRleHRyYWN0KDAsNix3b3JrKSAubmVzLiAiI3VuZGVmIgorJCB0aGVuCiskICAgaWYgZiRleHRyYWN0KDAsMTIsd29yaykgLm5lcy4gIiNjbWFrZWRlZmluZSIKKyQgICB0aGVuCiskICAgICAgIHdyaXRlIGFjb25mIGxpbmUKKyQgICBlbmRpZgorJCBlbHNlCiskICAgY2RlZiA9IGYkZWxlbWVudCgxLCIgIix3b3JrKQorJCAgIGdvc3ViIGNoZWNrX2NvbmZpZworJCBlbmRpZgorJCBnb3RvIGFjb25mX2xvb3AKKyRBQ09ORl9FWElUOgorJCB3cml0ZSBhY29uZiAiIgorJCB3cml0ZSBhY29uZiAiLyogVk1TIHNwZWNpZmljcyBhZGRlZCBieSBtYWtlX3Ztcy5jb206ICovIgorJCB3cml0ZSBhY29uZiAiI2RlZmluZSBWTVMgMSIKKyQgd3JpdGUgYWNvbmYgIiNpbmNsdWRlIDx1bmlzdGQuaD4iCiskIHdyaXRlIGFjb25mICIjaW5jbHVkZSA8dW5peGlvLmg+IgorJCB3cml0ZSBhY29uZiAiI2lmZGVmIF9MQVJHRUZJTEUiCiskIHdyaXRlIGFjb25mICIjIGRlZmluZSBvZmY2NF90IF9fb2ZmNjRfdCIKKyQgd3JpdGUgYWNvbmYgIiMgZGVmaW5lIGZvcGVuNjQgZm9wZW4iCiskIHdyaXRlIGFjb25mICIjIGRlZmluZSBmc2Vla282NCBmc2Vla28iCiskIHdyaXRlIGFjb25mICIjIGRlZmluZSBsc2VlazY0IGxzZWVrIgorJCB3cml0ZSBhY29uZiAiIyBkZWZpbmUgZnRlbGxvNjQgZnRlbGwiCiskIHdyaXRlIGFjb25mICIjZW5kaWYiCiskIHdyaXRlIGFjb25mICIjaWYgIWRlZmluZWQoIF9fVkFYKSAmJiAoX19DUlRMX1ZFUiA+PSA3MDMxMjAwMCkiCiskIHdyaXRlIGFjb25mICIjIGRlZmluZSBIQVZFX1ZTTlBSSU5URiIKKyQgd3JpdGUgYWNvbmYgIiNlbmRpZiIKKyQgY2xvc2UgYWNvbmZfaW4KKyQgY2xvc2UgYWNvbmYKKyQgaWYgZiRzZWFyY2goIicndGgnIikgLm5lcy4gIiIgdGhlbiBkZWxldGUgJ3RoJzsqCiAkISBCdWlsZCB0aGUgdGhpbmcgcGxhaW4gb3Igd2l0aCBtbXMKICQhCiAkIHdyaXRlIHN5cyRvdXRwdXQgIkNvbXBpbGluZyBabGliIHNvdXJjZXMgLi4uIgogJCBpZiBtYWtlLmVxcy4iIgotJCAgdGhlbgotJCAgIGRlbGUgZXhhbXBsZS5vYmo7KixtaW5pZ3ppcC5vYmo7KgorJCB0aGVuCiskICAgaWYgKGYkc2VhcmNoKCAiZXhhbXBsZS5vYmo7KiIpIC5uZXMuICIiKSB0aGVuIGRlbGV0ZSBleGFtcGxlLm9iajsqCiskICAgaWYgKGYkc2VhcmNoKCAibWluaWd6aXAub2JqOyoiKSAubmVzLiAiIikgdGhlbiBkZWxldGUgbWluaWd6aXAub2JqOyoKICQgICBDQUxMIE1BS0UgYWRsZXIzMi5PQkogIkNDICcnQ0NPUFQnIGFkbGVyMzIiIC0KICAgICAgICAgICAgICAgICBhZGxlcjMyLmMgemxpYi5oIHpjb25mLmgKICQgICBDQUxMIE1BS0UgY29tcHJlc3MuT0JKICJDQyAnJ0NDT1BUJyBjb21wcmVzcyIgLQpAQCAtNzQsOCArMTg0LDE0IEBACiAgICAgICAgICAgICAgICAgY3JjMzIuYyB6bGliLmggemNvbmYuaAogJCAgIENBTEwgTUFLRSBkZWZsYXRlLk9CSiAiQ0MgJydDQ09QVCcgZGVmbGF0ZSIgLQogICAgICAgICAgICAgICAgIGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAotJCAgIENBTEwgTUFLRSBnemlvLk9CSiAiQ0MgJydDQ09QVCcgZ3ppbyIgLQotICAgICAgICAgICAgICAgIGd6aW8uYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGd6Y2xvc2UuT0JKICJDQyAnJ0NDT1BUJyBnemNsb3NlIiAtCisgICAgICAgICAgICAgICAgZ3pjbG9zZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgZ3psaWIuT0JKICJDQyAnJ0NDT1BUJyBnemxpYiIgLQorICAgICAgICAgICAgICAgIGd6bGliLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorJCAgIENBTEwgTUFLRSBnenJlYWQuT0JKICJDQyAnJ0NDT1BUJyBnenJlYWQiIC0KKyAgICAgICAgICAgICAgICBnenJlYWQuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiskICAgQ0FMTCBNQUtFIGd6d3JpdGUuT0JKICJDQyAnJ0NDT1BUJyBnendyaXRlIiAtCisgICAgICAgICAgICAgICAgZ3p3cml0ZS5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKICQgICBDQUxMIE1BS0UgaW5mYmFjay5PQkogIkNDICcnQ0NPUFQnIGluZmJhY2siIC0KICAgICAgICAgICAgICAgICBpbmZiYWNrLmMgenV0aWwuaCBpbmZ0cmVlcy5oIGluZmxhdGUuaCBpbmZmYXN0LmggaW5mZml4ZWQuaAogJCAgIENBTEwgTUFLRSBpbmZmYXN0Lk9CSiAiQ0MgJydDQ09QVCcgaW5mZmFzdCIgLQpAQCAtOTMsNDYgKzIwOSw0NyBAQAogJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIFpsaWIgLi4uIgogJCAgIENBTEwgTUFLRSBsaWJ6Lk9MQiAibGliL2NyZWEgbGliei5vbGIgKi5vYmoiICouT0JKCiAkICAgd3JpdGUgc3lzJG91dHB1dCAiQnVpbGRpbmcgZXhhbXBsZS4uLiIKLSQgICBDQUxMIE1BS0UgZXhhbXBsZS5PQkogIkNDICcnQ0NPUFQnIGV4YW1wbGUiIC0KLSAgICAgICAgICAgICAgICBleGFtcGxlLmMgemxpYi5oIHpjb25mLmgKKyQgICBDQUxMIE1BS0UgZXhhbXBsZS5PQkogIkNDICcnQ0NPUFQnIFsudGVzdF1leGFtcGxlIiAtCisgICAgICAgICAgICAgICAgWy50ZXN0XWV4YW1wbGUuYyB6bGliLmggemNvbmYuaAogJCAgIGNhbGwgbWFrZSBleGFtcGxlLmV4ZSAiTElOSyBleGFtcGxlLGxpYnoub2xiL2xpYiIgZXhhbXBsZS5vYmogbGliei5vbGIKLSQgICBpZiBmJHNlYXJjaCgieDExdm1zOnh2bXN1dGlscy5vbGIiKSAubmVzLiAiIgotJCAgIHRoZW4KLSQgICAgIHdyaXRlIHN5cyRvdXRwdXQgIkJ1aWxkaW5nIG1pbmlnemlwLi4uIgotJCAgICAgQ0FMTCBNQUtFIG1pbmlnemlwLk9CSiAiQ0MgJydDQ09QVCcgbWluaWd6aXAiIC0KLSAgICAgICAgICAgICAgICBtaW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCi0kICAgICBjYWxsIG1ha2UgbWluaWd6aXAuZXhlIC0KLSAgICAgICAgICAgICAgICAiTElOSyBtaW5pZ3ppcCxsaWJ6Lm9sYi9saWIseDExdm1zOnh2bXN1dGlscy5vbGIvbGliIiAtCi0gICAgICAgICAgICAgICAgbWluaWd6aXAub2JqIGxpYnoub2xiCi0kICAgZW5kaWYKLSQgIGVsc2UKKyQgICB3cml0ZSBzeXMkb3V0cHV0ICJCdWlsZGluZyBtaW5pZ3ppcC4uLiIKKyQgICBDQUxMIE1BS0UgbWluaWd6aXAuT0JKICJDQyAnJ0NDT1BUJyBbLnRlc3RdbWluaWd6aXAiIC0KKyAgICAgICAgICAgICAgWy50ZXN0XW1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKKyQgICBjYWxsIG1ha2UgbWluaWd6aXAuZXhlIC0KKyAgICAgICAgICAgICAgIkxJTksgbWluaWd6aXAsbGliei5vbGIvbGliIiAtCisgICAgICAgICAgICAgIG1pbmlnemlwLm9iaiBsaWJ6Lm9sYgorJCBlbHNlCiAkICAgZ29zdWIgY3JlYV9tbXMKLSQgICBTQVkgIk1ha2UgJyduYW1lJyAnJ3ZlcnNpb24nIHdpdGggJydNYWtlJyAiCiskICAgd3JpdGUgc3lzJG91dHB1dCAiTWFrZSAnJ25hbWUnICcndmVyc2lvbicgd2l0aCAnJ01ha2UnICIKICQgICAnbWFrZScKLSQgIGVuZGlmCi0kIQotJCEgQWxwaGEgZ2V0cyBhIHNoYXJlYWJsZSBpbWFnZQotJCEKLSQgSWYgYXhwCi0kIFRoZW4KLSQgICBnb3N1YiBjcmVhX29saXN0Ci0kICAgd3JpdGUgc3lzJG91dHB1dCAiQ3JlYXRpbmcgbGlienNoci5leGUiCi0kICAgY2FsbCBhbmFsX29ial9heHAgbW9kdWxlcy5vcHQgX2xpbmsub3B0Ci0kICAgaWYgc19jYXNlCi0kICAgdGhlbgotJCAgICAgIG9wZW4vYXBwZW5kIG9wdGYgbW9kdWxlcy5vcHQKLSQgICAgICB3cml0ZSBvcHRmICJjYXNlX3NlbnNpdGl2ZT1ZRVMiCi0kICAgICAgY2xvc2Ugb3B0ZgotJCAgIGVuZGlmCi0kICAgTElOS18nbG9wdHMnL1NIQVJFPWxpYnpzaHIuZXhlIG1vZHVsZXMub3B0L29wdCxfbGluay5vcHQvb3B0CiAkIGVuZGlmCiskIQorJCEgQ3JlYXRlIHNoYXJlYWJsZSBpbWFnZQorJCEKKyQgZ29zdWIgY3JlYV9vbGlzdAorJCB3cml0ZSBzeXMkb3V0cHV0ICJDcmVhdGluZyBsaWJ6c2hyLmV4ZSIKKyQgY2FsbCBtYXBfMl9zaG9wdCAnbWFwZmlsZScgJ29wdGZpbGUnCiskIExJTktfJ2xvcHRzJy9TSEFSRT1saWJ6c2hyLmV4ZSBtb2R1bGVzLm9wdC9vcHQsJ29wdGZpbGUnL29wdAogJCB3cml0ZSBzeXMkb3V0cHV0ICJabGliIGJ1aWxkIGNvbXBsZXRlZCIKKyQgZGVsZXRlL25vbG9nIHRtcC5vcHQ7KgogJCBleGl0CiskQU1JU1NfRVJSOgorJCB3cml0ZSBzeXMkb3V0cHV0ICJObyBzb3VyY2UgZm9yIGNvbmZpZy5oaW4gZm91bmQuIgorJCB3cml0ZSBzeXMkb3V0cHV0ICJUcmllZCBhbnkgb2YgJydhY29uZl9pbl9maWxlJyIKKyQgZ290byBlcnJfZXhpdAogJENDX0VSUjoKICQgd3JpdGUgc3lzJG91dHB1dCAiQyBjb21waWxlciByZXF1aXJlZCB0byBidWlsZCAnJ25hbWUnIgogJCBnb3RvIGVycl9leGl0CiAkRVJSX0VYSVQ6CiAkIHNldCBtZXNzYWdlL2ZhY2lsL2lkZW50L3NldmVyL3RleHQKKyQgY2xvc2Uvbm9sb2cgb3B0ZgorJCBjbG9zZS9ub2xvZyB0b3B0CiskIGNsb3NlL25vbG9nIGFjb25mX2luCiskIGNsb3NlL25vbG9nIGFjb25mCiskIGNsb3NlL25vbG9nIG91dAorJCBjbG9zZS9ub2xvZyBtaW4KKyQgY2xvc2Uvbm9sb2cgbW9kCiskIGNsb3NlL25vbG9nIGhfaW4KICQgd3JpdGUgc3lzJG91dHB1dCAiRXhpdGluZy4uLiIKICQgZXhpdCAyCiAkIQpAQCAtMTgwLDYxICsyOTcsNzIgQEAKICQhCiAkISBDaGVjayBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgc2V0IHN5bWJvbHMgYWNjb3JkaW5nbHkKICQhCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEgVmVyc2lvbiBoaXN0b3J5CiskISAwLjAxIDIwMDQxMjA2IEZpcnN0IHZlcnNpb24gdG8gcmVjZWl2ZSBhIG51bWJlcgorJCEgMC4wMiAyMDA2MDEyNiBBZGQgbmV3ICJIRUxQIiB0YXJnZXQKICQgQ0hFQ0tfT1BUUzoKICQgaSA9IDEKICQgT1BUX0xPT1A6CiAkIGlmIGkgLmx0LiA5CiAkIHRoZW4KICQgICBjcGFybSA9IGYkZWRpdChwJ2knLCJ1cGNhc2UiKQotJCAgIGlmIGNwYXJtIC5lcXMuICJERUJVRyIKKyQhCiskISBDaGVjayBpZiBwYXJhbWV0ZXIgYWN0dWFsbHkgY29udGFpbnMgc29tZXRoaW5nCiskIQorJCAgIGlmIGYkZWRpdChjcGFybSwidHJpbSIpIC5uZXMuICIiCiAkICAgdGhlbgotJCAgICAgY2NvcHQgPSBjY29wdCArICIvbm9vcHQvZGViIgotJCAgICAgbG9wdHMgPSBsb3B0cyArICIvZGViIgotJCAgIGVuZGlmCi0kICAgaWYgZiRsb2NhdGUoIkNDT1BUPSIsY3Bhcm0pIC5sdC4gZiRsZW5ndGgoY3Bhcm0pCi0kICAgdGhlbgotJCAgICAgc3RhcnQgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQotJCAgICAgbGVuICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAotJCAgICAgY2NvcHQgPSBjY29wdCArIGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCi0kICAgICBpZiBmJGxvY2F0ZSgiQVNfSVMiLGYkZWRpdChjY29wdCwiVVBDQVNFIikpIC5sdC4gZiRsZW5ndGgoY2NvcHQpIC0KLSAgICAgICAgIHRoZW4gc19jYXNlID0gdHJ1ZQotJCAgIGVuZGlmCi0kICAgaWYgY3Bhcm0gLmVxcy4gIkxJTksiIHRoZW4gbGlua29ubHkgPSB0cnVlCi0kICAgaWYgZiRsb2NhdGUoIkxPUFRTPSIsY3Bhcm0pIC5sdC4gZiRsZW5ndGgoY3Bhcm0pCi0kICAgdGhlbgotJCAgICAgc3RhcnQgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQotJCAgICAgbGVuICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAotJCAgICAgbG9wdHMgPSBsb3B0cyArIGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCi0kICAgZW5kaWYKLSQgICBpZiBmJGxvY2F0ZSgiQ0M9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKLSQgICB0aGVuCi0kICAgICBzdGFydCAgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQotJCAgICAgbGVuICAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKLSQgICAgIGNjX2NvbSA9IGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCi0gICAgICBpZiAoY2NfY29tIC5uZXMuICJERUNDIikgLmFuZC4gLQotICAgICAgICAgKGNjX2NvbSAubmVzLiAiVkFYQyIpIC5hbmQuIC0KLQkgKGNjX2NvbSAubmVzLiAiR05VQyIpCiskICAgICBpZiBjcGFybSAuZXFzLiAiREVCVUciCiAkICAgICB0aGVuCi0kICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVuc3VwcG9ydGVkIGNvbXBpbGVyIGNob2ljZSAnJ2NjX2NvbScgaWdub3JlZCIKLSQgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVXNlIERFQ0MsIFZBWEMsIG9yIEdOVUMgaW5zdGVhZCIKLSQgICAgIGVsc2UKLSQgICAgIAlpZiBjY19jb20gLmVxcy4gIkRFQ0MiIHRoZW4gaXRzX2RlY2MgPSB0cnVlCi0kICAgICAJaWYgY2NfY29tIC5lcXMuICJWQVhDIiB0aGVuIGl0c192YXhjID0gdHJ1ZQotJCAgICAgCWlmIGNjX2NvbSAuZXFzLiAiR05VQyIgdGhlbiBpdHNfZ251YyA9IHRydWUKKyQgICAgICAgY2NvcHQgPSBjY29wdCArICIvbm9vcHQvZGViIgorJCAgICAgICBsb3B0cyA9IGxvcHRzICsgIi9kZWIiCiAkICAgICBlbmRpZgotJCAgIGVuZGlmCi0kICAgaWYgZiRsb2NhdGUoIk1BS0U9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKLSQgICB0aGVuCi0kICAgICBzdGFydCAgPSBmJGxvY2F0ZSgiPSIsY3Bhcm0pICsgMQotJCAgICAgbGVuICAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKLSQgICAgIG1ta3MgPSBmJGV4dHJhY3Qoc3RhcnQsbGVuLGNwYXJtKQotJCAgICAgaWYgKG1ta3MgLmVxcy4gIk1NSyIpIC5vci4gKG1ta3MgLmVxcy4gIk1NUyIpCiskICAgICBpZiBmJGxvY2F0ZSgiQ0NPUFQ9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKICQgICAgIHRoZW4KLSQgICAgICAgbWFrZSA9IG1ta3MKLSQgICAgIGVsc2UKLSQgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVW5zdXBwb3J0ZWQgbWFrZSBjaG9pY2UgJydtbWtzJyBpZ25vcmVkIgotJCAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVc2UgTU1LIG9yIE1NUyBpbnN0ZWFkIgorJCAgICAgICBzdGFydCA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCiskICAgICAgIGxlbiAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKKyQgICAgICAgY2NvcHQgPSBjY29wdCArIGYkZXh0cmFjdChzdGFydCxsZW4sY3Bhcm0pCiskICAgICAgIGlmIGYkbG9jYXRlKCJBU19JUyIsZiRlZGl0KGNjb3B0LCJVUENBU0UiKSkgLmx0LiBmJGxlbmd0aChjY29wdCkgLQorICAgICAgICAgIHRoZW4gc19jYXNlID0gdHJ1ZQogJCAgICAgZW5kaWYKKyQgICAgIGlmIGNwYXJtIC5lcXMuICJMSU5LIiB0aGVuIGxpbmtvbmx5ID0gdHJ1ZQorJCAgICAgaWYgZiRsb2NhdGUoIkxPUFRTPSIsY3Bhcm0pIC5sdC4gZiRsZW5ndGgoY3Bhcm0pCiskICAgICB0aGVuCiskICAgICAgIHN0YXJ0ID0gZiRsb2NhdGUoIj0iLGNwYXJtKSArIDEKKyQgICAgICAgbGVuICAgPSBmJGxlbmd0aChjcGFybSkgLSBzdGFydAorJCAgICAgICBsb3B0cyA9IGxvcHRzICsgZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKKyQgICAgIGVuZGlmCiskICAgICBpZiBmJGxvY2F0ZSgiQ0M9IixjcGFybSkgLmx0LiBmJGxlbmd0aChjcGFybSkKKyQgICAgIHRoZW4KKyQgICAgICAgc3RhcnQgID0gZiRsb2NhdGUoIj0iLGNwYXJtKSArIDEKKyQgICAgICAgbGVuICAgID0gZiRsZW5ndGgoY3Bhcm0pIC0gc3RhcnQKKyQgICAgICAgY2NfY29tID0gZiRleHRyYWN0KHN0YXJ0LGxlbixjcGFybSkKKyAgICAgICAgaWYgKGNjX2NvbSAubmVzLiAiREVDQyIpIC5hbmQuIC0KKyAgICAgICAgICAgKGNjX2NvbSAubmVzLiAiVkFYQyIpIC5hbmQuIC0KKyAgICAgICAgICAgKGNjX2NvbSAubmVzLiAiR05VQyIpCiskICAgICAgIHRoZW4KKyQgICAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVbnN1cHBvcnRlZCBjb21waWxlciBjaG9pY2UgJydjY19jb20nIGlnbm9yZWQiCiskICAgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVXNlIERFQ0MsIFZBWEMsIG9yIEdOVUMgaW5zdGVhZCIKKyQgICAgICAgZWxzZQorJCAgICAgICAgIGlmIGNjX2NvbSAuZXFzLiAiREVDQyIgdGhlbiBpdHNfZGVjYyA9IHRydWUKKyQgICAgICAgICBpZiBjY19jb20gLmVxcy4gIlZBWEMiIHRoZW4gaXRzX3ZheGMgPSB0cnVlCiskICAgICAgICAgaWYgY2NfY29tIC5lcXMuICJHTlVDIiB0aGVuIGl0c19nbnVjID0gdHJ1ZQorJCAgICAgICBlbmRpZgorJCAgICAgZW5kaWYKKyQgICAgIGlmIGYkbG9jYXRlKCJNQUtFPSIsY3Bhcm0pIC5sdC4gZiRsZW5ndGgoY3Bhcm0pCiskICAgICB0aGVuCiskICAgICAgIHN0YXJ0ICA9IGYkbG9jYXRlKCI9IixjcGFybSkgKyAxCiskICAgICAgIGxlbiAgICA9IGYkbGVuZ3RoKGNwYXJtKSAtIHN0YXJ0CiskICAgICAgIG1ta3MgPSBmJGV4dHJhY3Qoc3RhcnQsbGVuLGNwYXJtKQorJCAgICAgICBpZiAobW1rcyAuZXFzLiAiTU1LIikgLm9yLiAobW1rcyAuZXFzLiAiTU1TIikKKyQgICAgICAgdGhlbgorJCAgICAgICAgIG1ha2UgPSBtbWtzCiskICAgICAgIGVsc2UKKyQgICAgICAgICB3cml0ZSBzeXMkb3V0cHV0ICJVbnN1cHBvcnRlZCBtYWtlIGNob2ljZSAnJ21ta3MnIGlnbm9yZWQiCiskICAgICAgICAgd3JpdGUgc3lzJG91dHB1dCAiVXNlIE1NSyBvciBNTVMgaW5zdGVhZCIKKyQgICAgICAgZW5kaWYKKyQgICAgIGVuZGlmCiskICAgICBpZiBjcGFybSAuZXFzLiAiSEVMUCIgdGhlbiBnb3N1YiBiaGVscAogJCAgIGVuZGlmCiAkICAgaSA9IGkgKyAxCiAkICAgZ290byBvcHRfbG9vcApAQCAtMjQ0LDYgKzM3MiwxMSBAQAogJCEKICQhIExvb2sgZm9yIHRoZSBjb21waWxlciB1c2VkCiAkIQorJCEgVmVyc2lvbiBoaXN0b3J5CiskISAwLjAxIDIwMDQwMjIzIEZpcnN0IHZlcnNpb24gdG8gcmVjZWl2ZSBhIG51bWJlcgorJCEgMC4wMiAyMDA0MDIyOSBTYXZlL3NldCB2YWx1ZSBvZiBkZWNjJG5vX3Jvb3RlZF9zZWFyY2hfbGlzdHMKKyQhIDAuMDMgMjAwNjAyMDIgRXh0ZW5kIGhhbmRsaW5nIG9mIEdOVSBDCiskISAwLjA0IDIwMDkwNDAyIENvbXBhcSAtPiBocAogJENIRUNLX0NPTVBJTEVSOgogJCBpZiAoLm5vdC4gKGl0c19kZWNjIC5vci4gaXRzX3ZheGMgLm9yLiBpdHNfZ251YykpCiAkIHRoZW4KQEAgLTI1Nyw5ICszOTAsMjYgQEAKICQgaWYgKC5ub3QuIChpdHNfZGVjYyAub3IuIGl0c192YXhjIC5vci4gaXRzX2dudWMpKQogJCB0aGVuIGdvdG8gQ0NfRVJSCiAkIGVsc2UKLSQgICBpZiBpdHNfZGVjYyB0aGVuIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBDb21wYXEgQyIKLSQgICBpZiBpdHNfdmF4YyB0aGVuIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBWQVggQyIKLSQgICBpZiBpdHNfZ251YyB0aGVuIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBHTlUgQyIKKyQgICBpZiBpdHNfZGVjYworJCAgIHRoZW4KKyQgICAgIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBocCBDIgorJCAgICAgaWYgZiR0cm5sbm0oImRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cyIpIC5uZXMuICIiCiskICAgICB0aGVuCiskICAgICAgIGRucnNsID0gZiR0cm5sbm0oImRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cyIpCiskICAgICBlbmRpZgorJCAgICAgZGVmaW5lL25vbG9nIGRlY2Mkbm9fcm9vdGVkX3NlYXJjaF9saXN0cyAxCiskICAgZWxzZQorJCAgICAgaWYgaXRzX3ZheGMgdGhlbiB3cml0ZSBzeXMkb3V0cHV0ICJDQyBjb21waWxlciBjaGVjayAuLi4gVkFYIEMiCiskICAgICBpZiBpdHNfZ251YworJCAgICAgdGhlbgorJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIkNDIGNvbXBpbGVyIGNoZWNrIC4uLiBHTlUgQyIKKyQgICAgICAgICBpZiBmJHRybmxubSh0b3B0KSB0aGVuIHdyaXRlIHRvcHQgImdudV9jYzpbMDAwMDAwXWdjY2xpYi5vbGIvbGliIgorJCAgICAgICAgIGlmIGYkdHJubG5tKG9wdGYpIHRoZW4gd3JpdGUgb3B0ZiAiZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9saWIiCiskICAgICAgICAgY2MgPSAiZ2NjIgorJCAgICAgZW5kaWYKKyQgICAgIGlmIGYkdHJubG5tKHRvcHQpIHRoZW4gd3JpdGUgdG9wdCAic3lzJHNoYXJlOnZheGNydGwuZXhlL3NoYXJlIgorJCAgICAgaWYgZiR0cm5sbm0ob3B0ZikgdGhlbiB3cml0ZSBvcHRmICJzeXMkc2hhcmU6dmF4Y3J0bC5leGUvc2hhcmUiCiskICAgZW5kaWYKICQgZW5kaWYKICQgcmV0dXJuCiAkIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjc0LDE5ICs0MjQsMTkgQEAKICQgZGVjawogIyBkZXNjcmlwLm1tczogTU1TIGRlc2NyaXB0aW9uIGZpbGUgZm9yIGJ1aWxkaW5nIHpsaWIgb24gVk1TCiAjIHdyaXR0ZW4gYnkgTWFydGluIFAuSi4gWmluc2VyCi0jIDx6aW5zZXJAemluc2VyLm5vLWlwLmluZm8gb3Igemluc2VyQHN5c2Rldi5kZXV0c2NoZS1ib2Vyc2UuY29tPgorIyA8emluc2VyQHppbnNlci5uby1pcC5pbmZvIG9yIG1hcnRpbi56aW5zZXJAZXVyZXhjaGFuZ2UuY29tPgogCi1PQkpTID0gYWRsZXIzMi5vYmosIGNvbXByZXNzLm9iaiwgY3JjMzIub2JqLCBnemlvLm9iaiwgdW5jb21wci5vYmosIGluZmJhY2sub2JqXAorT0JKUyA9IGFkbGVyMzIub2JqLCBjb21wcmVzcy5vYmosIGNyYzMyLm9iaiwgZ3pjbG9zZS5vYmosIGd6bGliLm9ialwKKyAgICAgICBnenJlYWQub2JqLCBnendyaXRlLm9iaiwgdW5jb21wci5vYmosIGluZmJhY2sub2JqXAogICAgICAgIGRlZmxhdGUub2JqLCB0cmVlcy5vYmosIHp1dGlsLm9iaiwgaW5mbGF0ZS5vYmosIFwKICAgICAgICBpbmZ0cmVlcy5vYmosIGluZmZhc3Qub2JqCiAKICQgZW9kCiAkIHdyaXRlIG91dCAiQ0ZMQUdTPSIsIGNjb3B0CiAkIHdyaXRlIG91dCAiTE9QVFM9IiwgbG9wdHMKKyQgd3JpdGUgb3V0ICJhbGwgOiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUgbGliei5vbGIiCiAkIGNvcHkgc3lzJGlucHV0OiBvdXQKICQgZGVjawotCi1hbGwgOiBleGFtcGxlLmV4ZSBtaW5pZ3ppcC5leGUgbGliei5vbGIKICAgICAgICAgQCB3cml0ZSBzeXMkb3V0cHV0ICIgRXhhbXBsZSBhcHBsaWNhdGlvbnMgYXZhaWxhYmxlIgogCiBsaWJ6Lm9sYiA6IGxpYnoub2xiKCQoT0JKUykpCkBAIC0yOTYsNyArNDQ2LDcgQEAKICAgICAgICAgICAgICAgbGluayAkKExPUFRTKSBleGFtcGxlLGxpYnoub2xiL2xpYgogCiBtaW5pZ3ppcC5leGUgOiBtaW5pZ3ppcC5vYmogbGliei5vbGIKLSAgICAgICAgICAgICAgbGluayAkKExPUFRTKSBtaW5pZ3ppcCxsaWJ6Lm9sYi9saWIseDExdm1zOnh2bXN1dGlscy5vbGIvbGliCisgICAgICAgICAgICAgIGxpbmsgJChMT1BUUykgbWluaWd6aXAsbGliei5vbGIvbGliCiAKIGNsZWFuIDoKIAlkZWxldGUgKi5vYmo7KixsaWJ6Lm9sYjsqLCoub3B0OyosKi5leGU7KgpAQCAtMzA3LDEyICs0NTcsMTUgQEAKIGNvbXByZXNzLm9iaiA6IGNvbXByZXNzLmMgemxpYi5oIHpjb25mLmgKIGNyYzMyLm9iaiAgICA6IGNyYzMyLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAogZGVmbGF0ZS5vYmogIDogZGVmbGF0ZS5jIGRlZmxhdGUuaCB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCi1leGFtcGxlLm9iaiAgOiBleGFtcGxlLmMgemxpYi5oIHpjb25mLmgKLWd6aW8ub2JqICAgICA6IGd6aW8uYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitleGFtcGxlLm9iaiAgOiBbLnRlc3RdZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCitnemNsb3NlLm9iaiAgOiBnemNsb3NlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorZ3psaWIub2JqICAgIDogZ3psaWIuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitnenJlYWQub2JqICAgOiBnenJlYWQuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCitnendyaXRlLm9iaiAgOiBnendyaXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAogaW5mZmFzdC5vYmogIDogaW5mZmFzdC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZmYXN0LmgKIGluZmxhdGUub2JqICA6IGluZmxhdGUuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCiBpbmZ0cmVlcy5vYmogOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAotbWluaWd6aXAub2JqIDogbWluaWd6aXAuYyB6bGliLmggemNvbmYuaAorbWluaWd6aXAub2JqIDogWy50ZXN0XW1pbmlnemlwLmMgemxpYi5oIHpjb25mLmgKIHRyZWVzLm9iaiAgICA6IHRyZWVzLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKIHVuY29tcHIub2JqICA6IHVuY29tcHIuYyB6bGliLmggemNvbmYuaAogenV0aWwub2JqICAgIDogenV0aWwuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCkBAIC0zMjgsMTMgKzQ4MSwxOCBAQAogJENSRUFfT0xJU1Q6CiAkIG9wZW4vcmVhZCBtaW4gbWFrZWZpbGUuaW4KICQgb3Blbi93cml0ZSBtb2QgbW9kdWxlcy5vcHQKLSQgc3JjX2NoZWNrID0gIk9CSlMgPSIKKyQgc3JjX2NoZWNrX2xpc3QgPSAiT0JKWiA9I09CSkcgPSIKICRNUkxPT1A6CiAkIHJlYWQvZW5kPW1yZG9uZSBtaW4gcmVjCi0kIGlmIChmJGV4dHJhY3QoMCw2LHJlYykgLm5lcy4gc3JjX2NoZWNrKSB0aGVuIGdvdG8gbXJsb29wCiskIGkgPSAwCiskU1JDX0NIRUNLX0xPT1A6CiskIHNyY19jaGVjayA9IGYkZWxlbWVudChpLCAiIyIsIHNyY19jaGVja19saXN0KQorJCBpID0gaSsxCiskIGlmIHNyY19jaGVjayAuZXFzLiAiIyIgdGhlbiBnb3RvIG1ybG9vcAorJCBpZiAoZiRleHRyYWN0KDAsNixyZWMpIC5uZXMuIHNyY19jaGVjaykgdGhlbiBnb3RvIHNyY19jaGVja19sb29wCiAkIHJlYyA9IHJlYyAtIHNyY19jaGVjawogJCBnb3N1YiBleHRyYV9maWxuYW0KLSQgaWYgKGYkZWxlbWVudCgxLCJcIixyZWMpIC5lcXMuICJcIikgdGhlbiBnb3RvIG1yZG9uZQorJCBpZiAoZiRlbGVtZW50KDEsIlwiLHJlYykgLmVxcy4gIlwiKSB0aGVuIGdvdG8gbXJsb29wCiAkTVJTTE9PUDoKICQgcmVhZC9lbmQ9bXJkb25lIG1pbiByZWMKICQgZ29zdWIgZXh0cmFfZmlsbmFtCkBAIC0zODIsODAgKzU0MCwzMjggQEAKICQgcmV0dXJuCiAkIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJCEKLSQhIEFuYWx5emUgT2JqZWN0IGZpbGVzIGZvciBPcGVuVk1TIEFYUCB0byBleHRyYWN0IFByb2NlZHVyZSBhbmQgRGF0YQotJCEgaW5mb3JtYXRpb24gdG8gYnVpbGQgYSBzeW1ib2wgdmVjdG9yIGZvciBhIHNoYXJlYWJsZSBpbWFnZQotJCEgQWxsIHRoZSAiYnJhaW5zIiBvZiB0aGlzIGxvZ2ljIHdhcyBzdWdnZXN0ZWQgYnkgSGFydG11dCBCZWNrZXIKLSQhIChIYXJ0bXV0LkJlY2tlckBjb21wYXEuY29tKS4gQWxsIHRoZSBidWdzIHdlcmUgaW50cm9kdWNlZCBieSBtZQotJCEgKHppbnNlckBkZWN1cy5kZSksIHNvIGlmIHlvdSBkbyBoYXZlIHByb2JsZW0gcmVwb3J0cyBwbGVhc2UgZG8gbm90Ci0kISBib3RoZXIgSGFydG11dC9IUCwgYnV0IGdldCBpbiB0b3VjaCB3aXRoIG1lCiskQ0hFQ0tfQ09ORklHOgogJCEKLSQgQU5BTF9PQkpfQVhQOiBTdWJyb3V0aW5lCi0kIFYgPSAnRiRWZXJpZnkoMCkKKyQgaW5fbGRlZiA9IGYkbG9jYXRlKGNkZWYsbGliZGVmcykKKyQgaWYgKGluX2xkZWYgLmx0LiBmJGxlbmd0aChsaWJkZWZzKSkKKyQgdGhlbgorJCAgIHdyaXRlIGFjb25mICIjZGVmaW5lICcnY2RlZicgMSIKKyQgICBsaWJkZWZzID0gZiRleHRyYWN0KDAsaW5fbGRlZixsaWJkZWZzKSArIC0KKyAgICAgICAgICAgICAgZiRleHRyYWN0KGluX2xkZWYgKyBmJGxlbmd0aChjZGVmKSArIDEsIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYkbGVuZ3RoKGxpYmRlZnMpIC0gaW5fbGRlZiAtIGYkbGVuZ3RoKGNkZWYpIC0gMSwgLQorICAgICAgICAgICAgICAgICAgICAgICAgbGliZGVmcykKKyQgZWxzZQorJCAgIGlmIChmJHR5cGUoJ2NkZWYnKSAuZXFzLiAiSU5URUdFUiIpCiskICAgdGhlbgorJCAgICAgd3JpdGUgYWNvbmYgIiNkZWZpbmUgJydjZGVmJyAiLCAnY2RlZicKKyQgICBlbHNlCiskICAgICBpZiAoZiR0eXBlKCdjZGVmJykgLmVxcy4gIlNUUklORyIpCiskICAgICB0aGVuCiskICAgICAgIHdyaXRlIGFjb25mICIjZGVmaW5lICcnY2RlZicgIiwgIiIiIiwgJycnY2RlZicnLCAiIiIiCiskICAgICBlbHNlCiskICAgICAgIGdvc3ViIGNoZWNrX2NjX2RlZgorJCAgICAgZW5kaWYKKyQgICBlbmRpZgorJCBlbmRpZgorJCByZXR1cm4KKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIQorJCEgQ2hlY2sgaWYgdGhpcyBpcyBhIGRlZmluZSByZWxhdGluZyB0byB0aGUgcHJvcGVydGllcyBvZiB0aGUgQy9DKysKKyQhIGNvbXBpbGVyCiskIQorJCBDSEVDS19DQ19ERUY6CiskIGlmIChjZGVmIC5lcXMuICJfTEFSR0VGSUxFNjRfU09VUkNFIikKKyQgdGhlbgorJCAgIGNvcHkgc3lzJGlucHV0OiAndGMnCiskICAgZGVjaworI2luY2x1ZGUgInRjb25maWciCisjZGVmaW5lIF9MQVJHRUZJTEUKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbigpeworRklMRSAqZnA7CisgIGZwID0gZm9wZW4oInRlbXAudHh0IiwiciIpOworICBmc2Vla28oZnAsMSxTRUVLX1NFVCk7CisgIGZjbG9zZShmcCk7Cit9CisKKyQgICBlb2QKKyQgICB0ZXN0X2ludiA9IGZhbHNlCiskICAgY29tbV9oID0gZmFsc2UKKyQgICBnb3N1YiBjY19wcm9wX2NoZWNrCiskICAgcmV0dXJuCiskIGVuZGlmCiskIHdyaXRlIGFjb25mICIvKiAiLCBsaW5lLCAiICovIgorJCByZXR1cm4KKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIQorJCEgQ2hlY2sgZm9yIHByb3BlcnRpZXMgb2YgQy9DKysgY29tcGlsZXIKKyQhCiskISBWZXJzaW9uIGhpc3RvcnkKKyQhIDAuMDEgMjAwMzEwMjAgRmlyc3QgdmVyc2lvbiB0byByZWNlaXZlIGEgbnVtYmVyCiskISAwLjAyIDIwMDMxMDIyIEFkZGVkIGxvZ2ljIGZvciBkZWZpbmVzIHdpdGggdmFsdWUKKyQhIDAuMDMgMjAwNDAzMDkgTWFrZSBzdXJlIGxvY2FsIGNvbmZpZyBmaWxlIGdldHMgbm90IGRlbGV0ZWQKKyQhIDAuMDQgMjAwNDEyMzAgQWxzbyB3cml0ZSBpbmNsdWRlIGZvciBjb25maWd1cmUgcnVuCiskISAwLjA1IDIwMDUwMTAzIEFkZCBwcm9jZXNzaW5nIG9mICJjb21tZW50IGRlZmluZXMiCiskQ0NfUFJPUF9DSEVDSzoKKyQgY2NfcHJvcCA9IHRydWUKKyQgaXNfbmVlZCA9IGZhbHNlCiskIGlzX25lZWQgPSAoZiRleHRyYWN0KDAsNCxjZGVmKSAuZXFzLiAiTkVFRCIpIC5vci4gKHRlc3RfaW52IC5lcS4gdHJ1ZSkKKyQgaWYgZiRzZWFyY2godGgpIC5lcXMuICIiIHRoZW4gY3JlYXRlICd0aCcKKyQgc2V0IG1lc3NhZ2Uvbm9mYWMvbm9pZGVudC9ub3NldmVyL25vdGV4dAorJCBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCiskIGNjICd0bXBuYW0nCiskIGlmIC5ub3QuICgkc3RhdHVzKSAgdGhlbiBjY19wcm9wID0gZmFsc2UKKyQgb24gZXJyb3IgdGhlbiBjb250aW51ZQorJCEgVGhlIGhlYWRlcnMgbWlnaHQgbGllIGFib3V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIFJUTAorJCBsaW5rICd0bXBuYW0nLHRtcC5vcHQvb3B0CiskIGlmIC5ub3QuICgkc3RhdHVzKSAgdGhlbiBjY19wcm9wID0gZmFsc2UKKyQgc2V0IG1lc3NhZ2UvZmFjL2lkZW50L3NldmVyL3RleHQKKyQgb24gZXJyb3IgdGhlbiBnb3RvIGVycl9leGl0CiskIGRlbGV0ZS9ub2xvZyAndG1wbmFtJy4qOyovZXhjbHVkZT0ndGgnCiskIGlmIChjY19wcm9wIC5hbmQuIC5ub3QuIGlzX25lZWQpIC5vci4gLQorICAgICAoLm5vdC4gY2NfcHJvcCAuYW5kLiBpc19uZWVkKQorJCB0aGVuCiskICAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnY2RlZicuLi4geWVzIgorJCAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX3llcykgLm5lcy4gIiIKKyQgICB0aGVuCiskICAgICBpZiBmJHR5cGUoJ2NkZWZfdmFsJ195ZXMpIC5lcXMuICJJTlRFR0VSIiAtCisgICAgICAgICB0aGVuIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjZGVmaW5lICFBUyAhVUwiLGNkZWYsJ2NkZWZfdmFsJ195ZXMpCiskICAgICBpZiBmJHR5cGUoJ2NkZWZfdmFsJ195ZXMpIC5lcXMuICJTVFJJTkciIC0KKyAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFBUyIsY2RlZiwnY2RlZl92YWwnX3llcykKKyQgICBlbHNlCiskICAgICBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgMSIsY2RlZikKKyQgICBlbmRpZgorJCAgIGlmIChjZGVmIC5lcXMuICJIQVZFX0ZTRUVLTyIpIC5vci4gKGNkZWYgLmVxcy4gIl9MQVJHRV9GSUxFUyIpIC5vci4gLQorICAgICAgIChjZGVmIC5lcXMuICJfTEFSR0VGSUxFNjRfU09VUkNFIikgdGhlbiAtCisgICAgICBjYWxsIHdyaXRlX2NvbmZpZyBmJHN0cmluZygiI2RlZmluZSBfTEFSR0VGSUxFIDEiKQorJCBlbHNlCiskICAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnY2RlZicuLi4gbm8iCiskICAgaWYgKGNvbW1faCkKKyQgICB0aGVuCisgICAgICBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiLyogIUFTICovIixsaW5lKQorJCAgIGVsc2UKKyQgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX25vKSAubmVzLiAiIgorJCAgICAgdGhlbgorJCAgICAgICBpZiBmJHR5cGUoJ2NkZWZfdmFsJ19ubykgLmVxcy4gIklOVEVHRVIiIC0KKyAgICAgICAgICAgdGhlbiBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI2RlZmluZSAhQVMgIVVMIixjZGVmLCdjZGVmX3ZhbCdfbm8pCiskICAgICAgIGlmIGYkdHlwZSgnY2RlZl92YWwnX25vKSAuZXFzLiAiU1RSSU5HIiAtCisgICAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFBUyIsY2RlZiwnY2RlZl92YWwnX25vKQorJCAgICAgZWxzZQorJCAgICAgICBjYWxsIHdyaXRlX2NvbmZpZyBmJGZhbygiI3VuZGVmICFBUyIsY2RlZikKKyQgICAgIGVuZGlmCiskICAgZW5kaWYKKyQgZW5kaWYKKyQgcmV0dXJuCiskIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCEKKyQhIENoZWNrIGZvciBwcm9wZXJ0aWVzIG9mIEMvQysrIGNvbXBpbGVyIHdpdGggbXVsdGlwbGUgcmVzdWx0IHZhbHVlcworJCEKKyQhIFZlcnNpb24gaGlzdG9yeQorJCEgMC4wMSAyMDA0MDEyNyBGaXJzdCB2ZXJzaW9uCiskISAwLjAyIDIwMDUwMTAzIFJlY29uY2lsZSBjaGFuZ2VzIGZyb20gY2NfcHJvcCB1cCB0byB2ZXJzaW9uIDAuMDUKKyRDQ19NUFJPUF9DSEVDSzoKKyQgY2NfcHJvcCA9IHRydWUKKyQgaSAgICA9IDEKKyQgaWRlbCA9IDEKKyQgTVRfTE9PUDoKKyQgaWYgZiR0eXBlKHJlc3VsdF8naScpIC5lcXMuICJTVFJJTkciCiskIHRoZW4KKyQgICBzZXQgbWVzc2FnZS9ub2ZhYy9ub2lkZW50L25vc2V2ZXIvbm90ZXh0CiskICAgb24gZXJyb3IgdGhlbiBjb250aW51ZQorJCAgIGNjICd0bXBuYW0nXydpJworJCAgIGlmIC5ub3QuICgkc3RhdHVzKSAgdGhlbiBjY19wcm9wID0gZmFsc2UKKyQgICBvbiBlcnJvciB0aGVuIGNvbnRpbnVlCiskISBUaGUgaGVhZGVycyBtaWdodCBsaWUgYWJvdXQgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgUlRMCiskICAgbGluayAndG1wbmFtJ18naScsdG1wLm9wdC9vcHQKKyQgICBpZiAubm90LiAoJHN0YXR1cykgIHRoZW4gY2NfcHJvcCA9IGZhbHNlCiskICAgc2V0IG1lc3NhZ2UvZmFjL2lkZW50L3NldmVyL3RleHQKKyQgICBvbiBlcnJvciB0aGVuIGdvdG8gZXJyX2V4aXQKKyQgICBkZWxldGUvbm9sb2cgJ3RtcG5hbSdfJ2knLio7KgorJCAgIGlmIChjY19wcm9wKQorJCAgIHRoZW4KKyQgICAgIHdyaXRlIHN5cyRvdXRwdXQgIkNoZWNraW5nIGZvciAnJ2NkZWYnLi4uICIsIG1kZWZfJ2knCiskICAgICBpZiBmJHR5cGUobWRlZl8naScpIC5lcXMuICJJTlRFR0VSIiAtCisgICAgICAgICB0aGVuIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjZGVmaW5lICFBUyAhVUwiLGNkZWYsbWRlZl8naScpCiskICAgICBpZiBmJHR5cGUoJ2NkZWZfdmFsJ195ZXMpIC5lcXMuICJTVFJJTkciIC0KKyAgICAgICAgIHRoZW4gY2FsbCB3cml0ZV9jb25maWcgZiRmYW8oIiNkZWZpbmUgIUFTICFBUyIsY2RlZixtZGVmXydpJykKKyQgICAgIGdvdG8gbXN5bV9jbGVhbgorJCAgIGVsc2UKKyQgICAgIGkgPSBpICsgMQorJCAgICAgZ290byBtdF9sb29wCiskICAgZW5kaWYKKyQgZW5kaWYKKyQgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnY2RlZicuLi4gbm8iCiskIGNhbGwgd3JpdGVfY29uZmlnIGYkZmFvKCIjdW5kZWYgIUFTIixjZGVmKQorJCBNU1lNX0NMRUFOOgorJCBpZiAoaWRlbCAubGUuIG1zeW1fbWF4KQorJCB0aGVuCiskICAgZGVsZXRlL3N5bSBtZGVmXydpZGVsJworJCAgIGlkZWwgPSBpZGVsICsgMQorJCAgIGdvdG8gbXN5bV9jbGVhbgorJCBlbmRpZgorJCByZXR1cm4KKyQhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIQorJCEgV3JpdGUgY29uZmlndXJhdGlvbiB0byBib3RoIHBlcm1hbmVudCBhbmQgdGVtcG9yYXJ5IGNvbmZpZyBmaWxlCiskIQorJCEgVmVyc2lvbiBoaXN0b3J5CiskISAwLjAxIDIwMDMxMDI5IEZpcnN0IHZlcnNpb24gdG8gcmVjZWl2ZSBhIG51bWJlcgorJCEKKyRXUklURV9DT05GSUc6IFNVQlJPVVRJTkUKKyQgIHdyaXRlIGFjb25mICdwMScKKyQgIG9wZW4vYXBwZW5kIGNvbmZoICd0aCcKKyQgIHdyaXRlIGNvbmZoICdwMScKKyQgIGNsb3NlIGNvbmZoCiskRU5EU1VCUk9VVElORQorJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQhCiskISBBbmFseXplIHRoZSBwcm9qZWN0IG1hcCBmaWxlIGFuZCBjcmVhdGUgdGhlIHN5bWJvbCB2ZWN0b3IgZm9yIGEgc2hhcmVhYmxlCiskISBpbWFnZSBmcm9tIGl0CiskIQorJCEgVmVyc2lvbiBoaXN0b3J5CiskISAwLjAxIDIwMTIwMTI4IEZpcnN0IHZlcnNpb24KKyQhIDAuMDIgMjAxMjAyMjYgQWRkIHByZS1sb2FkIGxvZ2ljCiskIQorJCBNQVBfMl9TSE9QVDogU3Vicm91dGluZQorJCEKICQgU0FZIDo9ICJXUklURV8gU1lTJE9VVFBVVCIKLSQKKyQhCiAkIElGIEYkU0VBUkNIKCInJ1AxJyIpIC5FUVMuICIiCiAkIFRIRU4KLSQgICAgU0FZICJBTkFMX09CSl9BWFAtRS1OT1NVQ0hGSUxFOiAgRXJyb3IsIGlucHV0ZmlsZSAnJ3AxJyBub3QgYXZhaWxhYmxlIgotJCAgICBnb3RvIGV4aXRfYWEKKyQgICAgU0FZICJNQVBfMl9TSE9QVC1FLU5PU1VDSEZJTEU6ICBFcnJvciwgaW5wdXRmaWxlICcncDEnIG5vdCBhdmFpbGFibGUiCiskICAgIGdvdG8gZXhpdF9tMnMKICQgRU5ESUYKICQgSUYgIicnUDInIiAuRVFTLiAiIgogJCBUSEVOCi0kICAgIFNBWSAiQU5BTF9PQkpfQVhQOiAgRXJyb3IsIG5vIG91dHB1dCBmaWxlIHByb3ZpZGVkIgotJCAgICBnb3RvIGV4aXRfYWEKKyQgICAgU0FZICJNQVBfMl9TSE9QVDogIEVycm9yLCBubyBvdXRwdXQgZmlsZSBwcm92aWRlZCIKKyQgICAgZ290byBleGl0X20ycwogJCBFTkRJRgotJAotJCBvcGVuL3JlYWQgaW4gJ3AxCi0kIGNyZWF0ZSBhLnRtcAotJCBvcGVuL2FwcGVuZCBhdG1wIGEudG1wCi0kIGxvb3A6Ci0kIHJlYWQvZW5kPWVuZF9sb29wIGluIGxpbmUKLSQgZj0gZiRzZWFyY2gobGluZSkKLSQgaWYgZiAuZXFzLiAiIgotJCB0aGVuCi0kCXdyaXRlIHN5cyRvdXRwdXQgIkFOQUxfT0JKX0FYUC13LW5vc3VjaGZpbGUsICcnbGluZSciCi0kCWdvdG8gbG9vcAotJCBlbmRpZgotJCBkZWZpbmUvdXNlciBzeXMkb3V0cHV0IG5sOgotJCBkZWZpbmUvdXNlciBzeXMkZXJyb3Igbmw6Ci0kIGFuYWwvb2JqL2dzZCAnZiAvb3V0PXgudG1wCi0kIG9wZW4vcmVhZCB4dG1wIHgudG1wCi0kIFhMT09QOgotJCByZWFkL2VuZD1lbmRfeGxvb3AgeHRtcCB4bGluZQotJCB4bGluZSA9IGYkZWRpdCh4bGluZSwiY29tcHJlc3MiKQotJCB3cml0ZSBhdG1wIHhsaW5lCi0kIGdvdG8geGxvb3AKLSQgRU5EX1hMT09QOgotJCBjbG9zZSB4dG1wCi0kIGdvdG8gbG9vcAotJCBlbmRfbG9vcDoKLSQgY2xvc2UgaW4KLSQgY2xvc2UgYXRtcAotJCBpZiBmJHNlYXJjaCgiYS50bXAiKSAuZXFzLiAiIiAtCi0JdGhlbiAkIGV4aXQKLSQgISBhbGwgZ2xvYmFsIGRlZmluaXRpb25zCi0kIHNlYXJjaCBhLnRtcCAic3ltYm9sOiIsIkVHU1kkVl9ERUYgMSIsIkVHU1kkVl9OT1JNIDEiL291dD1iLnRtcAotJCAhIGFsbCBwcm9jZWR1cmVzCi0kIHNlYXJjaCBiLnRtcCAiRUdTWSRWX05PUk0gMSIvd2luZD0oMCwxKSAvb3V0PWMudG1wCi0kIHNlYXJjaCBjLnRtcCAic3ltYm9sOiIvb3V0PWQudG1wCi0kIGRlZmluZS91c2VyIHN5cyRvdXRwdXQgbmw6Ci0kIGVkaXRvL2VkdC9jb21tYW5kPXN5cyRpbnB1dCBkLnRtcAotc3ViL3N5bWJvbDogIi9zeW1ib2xfdmVjdG9yPSgvd2hvbGUKLXN1Yi8iLz1QUk9DRURVUkUpL3dob2xlCi1leGl0Ci0kICEgYWxsIGRhdGEKLSQgc2VhcmNoIGIudG1wICJFR1NZJFZfREVGIDEiL3dpbmQ9KDAsMSkgL291dD1lLnRtcAotJCBzZWFyY2ggZS50bXAgInN5bWJvbDoiL291dD1mLnRtcAotJCBkZWZpbmUvdXNlciBzeXMkb3V0cHV0IG5sOgotJCBlZGl0by9lZHQvY29tbWFuZD1zeXMkaW5wdXQgZi50bXAKLXN1Yi9zeW1ib2w6ICIvc3ltYm9sX3ZlY3Rvcj0oL3dob2xlCi1zdWIvIi89REFUQSkvd2hvbGUKLWV4aXQKLSQgc29ydC9ub2R1cGwgZC50bXAsZi50bXAgJ3AyJwotJCBkZWxldGUgYS50bXA7KixiLnRtcDsqLGMudG1wOyosZC50bXA7KixlLnRtcDsqLGYudG1wOyoKLSQgaWYgZiRzZWFyY2goIngudG1wIikgLm5lcy4gIiIgLQotCXRoZW4gJCBkZWxldGUgeC50bXA7KgogJCEKLSQgRVhJVF9BQToKLSQgaWYgViB0aGVuIHNldCB2ZXJpZnkKKyQgbW9kdWxlMSA9ICJkZWZsYXRlI2RlZmxhdGVFbmQjZGVmbGF0ZUluaXRfI2RlZmxhdGVQYXJhbXMjZGVmbGF0ZVNldERpY3Rpb25hcnkiCiskIG1vZHVsZTIgPSAiZ3pjbG9zZSNnemVycm9yI2d6Z2V0YyNnemdldHMjZ3pvcGVuI2d6cHJpbnRmI2d6cHV0YyNnenB1dHMjZ3pyZWFkIgorJCBtb2R1bGUzID0gImd6c2VlayNnenRlbGwjaW5mbGF0ZSNpbmZsYXRlRW5kI2luZmxhdGVJbml0XyNpbmZsYXRlU2V0RGljdGlvbmFyeSIKKyQgbW9kdWxlNCA9ICJpbmZsYXRlU3luYyN1bmNvbXByZXNzI3psaWJWZXJzaW9uI2NvbXByZXNzIgorJCBvcGVuL3JlYWQgbWFwICdwMQorJCBpZiBheHAgLm9yLiBpYTY0CiskIHRoZW4KKyQgICAgIG9wZW4vd3JpdGUgYW9wdCBhLm9wdAorJCAgICAgb3Blbi93cml0ZSBib3B0IGIub3B0CiskICAgICB3cml0ZSBhb3B0ICIgQ0FTRV9TRU5TSVRJVkU9WUVTIgorJCAgICAgd3JpdGUgYm9wdCAiU1lNQk9MX1ZFQ1RPUj0gKC0iCiskICAgICBtb2Rfc3ltX251bSA9IDEKKyQgTU9EX1NZTV9MT09QOgorJCAgICAgaWYgZiR0eXBlKG1vZHVsZSdtb2Rfc3ltX251bScpIC5uZXMuICIiCiskICAgICB0aGVuCiskICAgICAgICAgbW9kX2luID0gMAorJCBNT0RfU1lNX0lOOgorJCAgICAgICAgIHNoYXJlZF9wcm9jID0gZiRlbGVtZW50KG1vZF9pbiwgIiMiLCBtb2R1bGUnbW9kX3N5bV9udW0nKQorJCAgICAgICAgIGlmIHNoYXJlZF9wcm9jIC5uZXMuICIjIgorJCAgICAgICAgIHRoZW4KKyQgICAgICAgICAgICAgd3JpdGUgYW9wdCBmJGZhbygiIHN5bWJvbF92ZWN0b3I9KCFBUy8hQVM9UFJPQ0VEVVJFKSIsLQorICAgICAgICAJCSAgICAgICBmJGVkaXQoc2hhcmVkX3Byb2MsInVwY2FzZSIpLHNoYXJlZF9wcm9jKQorJCAgICAgICAgICAgICB3cml0ZSBib3B0IGYkZmFvKCIhQVM9UFJPQ0VEVVJFLC0iLHNoYXJlZF9wcm9jKQorJCAgICAgICAgICAgICBtb2RfaW4gPSBtb2RfaW4gKyAxCiskICAgICAgICAgICAgIGdvdG8gbW9kX3N5bV9pbgorJCAgICAgICAgIGVuZGlmCiskICAgICAgICAgbW9kX3N5bV9udW0gPSBtb2Rfc3ltX251bSArIDEKKyQgICAgICAgICBnb3RvIG1vZF9zeW1fbG9vcAorJCAgICAgZW5kaWYKKyRNQVBfTE9PUDoKKyQgICAgIHJlYWQvZW5kPW1hcF9lbmQgbWFwIGxpbmUKKyQgICAgIGlmIChmJGxvY2F0ZSgieyIsbGluZSkubHQuIGYkbGVuZ3RoKGxpbmUpKSAub3IuIC0KKyAgICAgICAgIChmJGxvY2F0ZSgiZ2xvYmFsOiIsIGxpbmUpIC5sdC4gZiRsZW5ndGgobGluZSkpCiskICAgICB0aGVuCiskICAgICAgICAgcHJvYyA9IHRydWUKKyQgICAgICAgICBnb3RvIG1hcF9sb29wCiskICAgICBlbmRpZgorJCAgICAgaWYgZiRsb2NhdGUoIn0iLGxpbmUpLmx0LiBmJGxlbmd0aChsaW5lKSB0aGVuIHByb2MgPSBmYWxzZQorJCAgICAgaWYgZiRsb2NhdGUoImxvY2FsOiIsIGxpbmUpIC5sdC4gZiRsZW5ndGgobGluZSkgdGhlbiBwcm9jID0gZmFsc2UKKyQgICAgIGlmIHByb2MKKyQgICAgIHRoZW4KKyQgICAgICAgICBzaGFyZWRfcHJvYyA9IGYkZWRpdChsaW5lLCJjb2xsYXBzZSIpCiskICAgICAgICAgY2hvcF9zZW1pID0gZiRsb2NhdGUoIjsiLCBzaGFyZWRfcHJvYykKKyQgICAgICAgICBpZiBjaG9wX3NlbWkgLmx0LiBmJGxlbmd0aChzaGFyZWRfcHJvYykgdGhlbiAtCisgICAgICAgICAgICAgIHNoYXJlZF9wcm9jID0gZiRleHRyYWN0KDAsIGNob3Bfc2VtaSwgc2hhcmVkX3Byb2MpCiskICAgICAgICAgd3JpdGUgYW9wdCBmJGZhbygiIHN5bWJvbF92ZWN0b3I9KCFBUy8hQVM9UFJPQ0VEVVJFKSIsLQorICAgICAgICAJCQkgZiRlZGl0KHNoYXJlZF9wcm9jLCJ1cGNhc2UiKSxzaGFyZWRfcHJvYykKKyQgICAgICAgICB3cml0ZSBib3B0IGYkZmFvKCIhQVM9UFJPQ0VEVVJFLC0iLHNoYXJlZF9wcm9jKQorJCAgICAgZW5kaWYKKyQgICAgIGdvdG8gbWFwX2xvb3AKKyRNQVBfRU5EOgorJCAgICAgY2xvc2Uvbm9sb2cgYW9wdAorJCAgICAgY2xvc2Uvbm9sb2cgYm9wdAorJCAgICAgb3Blbi9hcHBlbmQgbGlib3B0ICdwMicKKyQgICAgIG9wZW4vcmVhZCBhb3B0IGEub3B0CiskICAgICBvcGVuL3JlYWQgYm9wdCBiLm9wdAorJEFMT09QOgorJCAgICAgcmVhZC9lbmQ9YWxvb3BfZW5kIGFvcHQgbGluZQorJCAgICAgd3JpdGUgbGlib3B0IGxpbmUKKyQgICAgIGdvdG8gYWxvb3AKKyRBTE9PUF9FTkQ6CiskICAgICBjbG9zZS9ub2xvZyBhb3B0CiskICAgICBzdiA9ICIiCiskQkxPT1A6CiskICAgICByZWFkL2VuZD1ibG9vcF9lbmQgYm9wdCBzdm4KKyQgICAgIGlmIChzdm4ubmVzLiIiKQorJCAgICAgdGhlbgorJCAgICAgICAgaWYgKHN2Lm5lcy4iIikgdGhlbiB3cml0ZSBsaWJvcHQgc3YKKyQgICAgICAgIHN2ID0gc3ZuCiskICAgICBlbmRpZgorJCAgICAgZ290byBibG9vcAorJEJMT09QX0VORDoKKyQgICAgIHdyaXRlIGxpYm9wdCBmJGV4dHJhY3QoMCxmJGxlbmd0aChzdiktMixzdiksICItIgorJCAgICAgd3JpdGUgbGlib3B0ICIpIgorJCAgICAgY2xvc2Uvbm9sb2cgYm9wdAorJCAgICAgZGVsZXRlL25vbG9nL25vY29uZiBhLm9wdDsqLGIub3B0OyoKKyQgZWxzZQorJCAgICAgaWYgdmF4CiskICAgICB0aGVuCiskICAgICBvcGVuL2FwcGVuZCBsaWJvcHQgJ3AyJworJCAgICAgbW9kX3N5bV9udW0gPSAxCiskIFZNT0RfU1lNX0xPT1A6CiskICAgICBpZiBmJHR5cGUobW9kdWxlJ21vZF9zeW1fbnVtJykgLm5lcy4gIiIKKyQgICAgIHRoZW4KKyQgICAgICAgICBtb2RfaW4gPSAwCiskIFZNT0RfU1lNX0lOOgorJCAgICAgICAgIHNoYXJlZF9wcm9jID0gZiRlbGVtZW50KG1vZF9pbiwgIiMiLCBtb2R1bGUnbW9kX3N5bV9udW0nKQorJCAgICAgICAgIGlmIHNoYXJlZF9wcm9jIC5uZXMuICIjIgorJCAgICAgICAgIHRoZW4KKyQgICAgIAkgICAgICB3cml0ZSBsaWJvcHQgZiRmYW8oIlVOSVZFUlNBTD0hQVMiLC0KKyAgICAgIAkgIAkJCSAgICAgZiRlZGl0KHNoYXJlZF9wcm9jLCJ1cGNhc2UiKSkKKyQgICAgICAgICAgICAgbW9kX2luID0gbW9kX2luICsgMQorJCAgICAgICAgICAgICBnb3RvIHZtb2Rfc3ltX2luCiskICAgICAgICAgZW5kaWYKKyQgICAgICAgICBtb2Rfc3ltX251bSA9IG1vZF9zeW1fbnVtICsgMQorJCAgICAgICAgIGdvdG8gdm1vZF9zeW1fbG9vcAorJCAgICAgZW5kaWYKKyRWTUFQX0xPT1A6CiskICAgICAJICByZWFkL2VuZD12bWFwX2VuZCBtYXAgbGluZQorJCAgICAgCSAgaWYgKGYkbG9jYXRlKCJ7IixsaW5lKS5sdC4gZiRsZW5ndGgobGluZSkpIC5vci4gLQorICAgCSAgICAgIChmJGxvY2F0ZSgiZ2xvYmFsOiIsIGxpbmUpIC5sdC4gZiRsZW5ndGgobGluZSkpCiskICAgICAJICB0aGVuCiskICAgICAJICAgICAgcHJvYyA9IHRydWUKKyQgICAgIAkgICAgICBnb3RvIHZtYXBfbG9vcAorJCAgICAgCSAgZW5kaWYKKyQgICAgIAkgIGlmIGYkbG9jYXRlKCJ9IixsaW5lKS5sdC4gZiRsZW5ndGgobGluZSkgdGhlbiBwcm9jID0gZmFsc2UKKyQgICAgIAkgIGlmIGYkbG9jYXRlKCJsb2NhbDoiLCBsaW5lKSAubHQuIGYkbGVuZ3RoKGxpbmUpIHRoZW4gcHJvYyA9IGZhbHNlCiskICAgICAJICBpZiBwcm9jCiskICAgICAJICB0aGVuCiskICAgICAJICAgICAgc2hhcmVkX3Byb2MgPSBmJGVkaXQobGluZSwiY29sbGFwc2UiKQorJCAgICAgCSAgICAgIGNob3Bfc2VtaSA9IGYkbG9jYXRlKCI7Iiwgc2hhcmVkX3Byb2MpCiskICAgICAJICAgICAgaWYgY2hvcF9zZW1pIC5sdC4gZiRsZW5ndGgoc2hhcmVkX3Byb2MpIHRoZW4gLQorICAgICAgCSAgCSAgc2hhcmVkX3Byb2MgPSBmJGV4dHJhY3QoMCwgY2hvcF9zZW1pLCBzaGFyZWRfcHJvYykKKyQgICAgIAkgICAgICB3cml0ZSBsaWJvcHQgZiRmYW8oIlVOSVZFUlNBTD0hQVMiLC0KKyAgICAgIAkgIAkJCSAgICAgZiRlZGl0KHNoYXJlZF9wcm9jLCJ1cGNhc2UiKSkKKyQgICAgIAkgIGVuZGlmCiskICAgICAJICBnb3RvIHZtYXBfbG9vcAorJFZNQVBfRU5EOgorJCAgICAgZWxzZQorJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIlVua25vd24gQXJjaGl0ZWN0dXJlIChOb3QgVkFYLCBBWFAsIG9yIElBNjQpIgorJCAgICAgICAgIHdyaXRlIHN5cyRvdXRwdXQgIk5vIG9wdGlvbnMgZmlsZSBjcmVhdGVkIgorJCAgICAgZW5kaWYKKyQgZW5kaWYKKyQgRVhJVF9NMlM6CiskIGNsb3NlL25vbG9nIG1hcAorJCBjbG9zZS9ub2xvZyBsaWJvcHQKICQgZW5kc3Vicm91dGluZQotJCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi9taW5pZ3ppcC5jIGIvTW9kdWxlcy96bGliL21pbmlnemlwLmMKaW5kZXggNDUyNGI5Ni4uYjMwMjVhNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL21pbmlnemlwLmMKKysrIGIvTW9kdWxlcy96bGliL21pbmlnemlwLmMKQEAgLTEsNSArMSw1IEBACiAvKiBtaW5pZ3ppcC5jIC0tIHNpbXVsYXRlIGd6aXAgdXNpbmcgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA2LCAyMDEwLCAyMDExIEplYW4tbG91cCBHYWlsbHkuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKi8KIApAQCAtMTUsOCArMTUsOCBAQAogCiAvKiBAKCMpICRJZCQgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAiemxpYi5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpZmRlZiBTVERDCiAjICBpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTMyLDExICszMiwxOCBAQAogI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCiAjICBpbmNsdWRlIDxmY250bC5oPgogIyAgaW5jbHVkZSA8aW8uaD4KKyMgIGlmZGVmIFVOREVSX0NFCisjICAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyAgZW5kaWYKICMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkgc2V0bW9kZShmaWxlbm8oZmlsZSksIE9fQklOQVJZKQogI2Vsc2UKICMgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKICNlbmRpZgogCisjaWZkZWYgX01TQ19WRVIKKyMgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCiAjaWZkZWYgVk1TCiAjICBkZWZpbmUgdW5saW5rIGRlbGV0ZQogIyAgZGVmaW5lIEdaX1NVRkZJWCAiLWd6IgpAQCAtNTAsOSArNTcsNzUgQEAKICMgIGluY2x1ZGUgPHVuaXguaD4gLyogZm9yIGZpbGVubyAqLwogI2VuZGlmCiAKKyNpZiAhZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpICYmICFkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpCiAjaWZuZGVmIFdJTjMyIC8qIHVubGluayBhbHJlYWR5IGluIHN0ZGlvLmggZm9yIFdJTjMyICovCiAgIGV4dGVybiBpbnQgdW5saW5rIE9GKChjb25zdCBjaGFyICopKTsKICNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVOREVSX0NFKQorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgZGVmaW5lIHBlcnJvcihzKSBwd2luZXJyb3IocykKKworLyogTWFwIHRoZSBXaW5kb3dzIGVycm9yIG51bWJlciBpbiBFUlJPUiB0byBhIGxvY2FsZS1kZXBlbmRlbnQgZXJyb3IKKyAgIG1lc3NhZ2Ugc3RyaW5nIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LiAgVHlwaWNhbGx5LCB0aGUgdmFsdWVzCisgICBmb3IgRVJST1IgY29tZSBmcm9tIEdldExhc3RFcnJvci4KKworICAgVGhlIHN0cmluZyBwb2ludGVkIHRvIHNoYWxsIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgYXBwbGljYXRpb24sCisgICBidXQgbWF5IGJlIG92ZXJ3cml0dGVuIGJ5IGEgc3Vic2VxdWVudCBjYWxsIHRvIHN0cndpbmVycm9yCisKKyAgIFRoZSBzdHJ3aW5lcnJvciBmdW5jdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgc2V0dGluZworICAgb2YgR2V0TGFzdEVycm9yLiAgKi8KKworc3RhdGljIGNoYXIgKnN0cndpbmVycm9yIChlcnJvcikKKyAgICAgRFdPUkQgZXJyb3I7Cit7CisgICAgc3RhdGljIGNoYXIgYnVmWzEwMjRdOworCisgICAgd2NoYXJfdCAqbXNnYnVmOworICAgIERXT1JEIGxhc3RlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBEV09SRCBjaGFycyA9IEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0KKyAgICAgICAgfCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIsCisgICAgICAgIE5VTEwsCisgICAgICAgIGVycm9yLAorICAgICAgICAwLCAvKiBEZWZhdWx0IGxhbmd1YWdlICovCisgICAgICAgIChMUFZPSUQpJm1zZ2J1ZiwKKyAgICAgICAgMCwKKyAgICAgICAgTlVMTCk7CisgICAgaWYgKGNoYXJzICE9IDApIHsKKyAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gXHJcbiBhcHBlbmRlZCwgemFwIGl0LiAgKi8KKyAgICAgICAgaWYgKGNoYXJzID49IDIKKyAgICAgICAgICAgICYmIG1zZ2J1ZltjaGFycyAtIDJdID09ICdccicgJiYgbXNnYnVmW2NoYXJzIC0gMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgY2hhcnMgLT0gMjsKKyAgICAgICAgICAgIG1zZ2J1ZltjaGFyc10gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoYXJzID4gc2l6ZW9mIChidWYpIC0gMSkgeworICAgICAgICAgICAgY2hhcnMgPSBzaXplb2YgKGJ1ZikgLSAxOworICAgICAgICAgICAgbXNnYnVmW2NoYXJzXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICB3Y3N0b21icyhidWYsIG1zZ2J1ZiwgY2hhcnMgKyAxKTsKKyAgICAgICAgTG9jYWxGcmVlKG1zZ2J1Zik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzcHJpbnRmKGJ1ZiwgInVua25vd24gd2luMzIgZXJyb3IgKCVsZCkiLCBlcnJvcik7CisgICAgfQorCisgICAgU2V0TGFzdEVycm9yKGxhc3RlcnIpOworICAgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIHB3aW5lcnJvciAocykKKyAgICBjb25zdCBjaGFyICpzOworeworICAgIGlmIChzICYmICpzKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgcywgc3Ryd2luZXJyb3IoR2V0TGFzdEVycm9yICgpKSk7CisgICAgZWxzZQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBzdHJ3aW5lcnJvcihHZXRMYXN0RXJyb3IgKCkpKTsKK30KKworI2VuZGlmIC8qIFVOREVSX0NFICovCiAKICNpZm5kZWYgR1pfU1VGRklYCiAjICBkZWZpbmUgR1pfU1VGRklYICIuZ3oiCkBAIC02OSw2ICsxNDIsMTk3IEBACiAjICBkZWZpbmUgbG9jYWwKICNlbmRpZgogCisjaWZkZWYgWl9TT0xPCisvKiBmb3IgWl9TT0xPLCBjcmVhdGUgc2ltcGxpZmllZCBneiogZnVuY3Rpb25zIHVzaW5nIGRlZmxhdGUgYW5kIGluZmxhdGUgKi8KKworI2lmIGRlZmluZWQoWl9IQVZFX1VOSVNURF9IKSB8fCBkZWZpbmVkKFpfTEFSR0UpCisjICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgLyogZm9yIHVubGluaygpICovCisjZW5kaWYKKwordm9pZCAqbXlhbGxvYyBPRigodm9pZCAqLCB1bnNpZ25lZCwgdW5zaWduZWQpKTsKK3ZvaWQgbXlmcmVlIE9GKCh2b2lkICosIHZvaWQgKikpOworCit2b2lkICpteWFsbG9jKHEsIG4sIG0pCisgICAgdm9pZCAqcTsKKyAgICB1bnNpZ25lZCBuLCBtOworeworICAgIHEgPSBaX05VTEw7CisgICAgcmV0dXJuIGNhbGxvYyhuLCBtKTsKK30KKwordm9pZCBteWZyZWUocSwgcCkKKyAgICB2b2lkICpxLCAqcDsKK3sKKyAgICBxID0gWl9OVUxMOworICAgIGZyZWUocCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGd6RmlsZV9zIHsKKyAgICBGSUxFICpmaWxlOworICAgIGludCB3cml0ZTsKKyAgICBpbnQgZXJyOworICAgIGNoYXIgKm1zZzsKKyAgICB6X3N0cmVhbSBzdHJtOworfSAqZ3pGaWxlOworCitnekZpbGUgZ3pvcGVuIE9GKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworZ3pGaWxlIGd6ZG9wZW4gT0YoKGludCwgY29uc3QgY2hhciAqKSk7CitnekZpbGUgZ3pfb3BlbiBPRigoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOworCitnekZpbGUgZ3pvcGVuKHBhdGgsIG1vZGUpCitjb25zdCBjaGFyICpwYXRoOworY29uc3QgY2hhciAqbW9kZTsKK3sKKyAgICByZXR1cm4gZ3pfb3BlbihwYXRoLCAtMSwgbW9kZSk7Cit9CisKK2d6RmlsZSBnemRvcGVuKGZkLCBtb2RlKQoraW50IGZkOworY29uc3QgY2hhciAqbW9kZTsKK3sKKyAgICByZXR1cm4gZ3pfb3BlbihOVUxMLCBmZCwgbW9kZSk7Cit9CisKK2d6RmlsZSBnel9vcGVuKHBhdGgsIGZkLCBtb2RlKQorICAgIGNvbnN0IGNoYXIgKnBhdGg7CisgICAgaW50IGZkOworICAgIGNvbnN0IGNoYXIgKm1vZGU7Cit7CisgICAgZ3pGaWxlIGd6OworICAgIGludCByZXQ7CisKKyAgICBneiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGd6RmlsZV9zKSk7CisgICAgaWYgKGd6ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGd6LT53cml0ZSA9IHN0cmNocihtb2RlLCAndycpICE9IE5VTEw7CisgICAgZ3otPnN0cm0uemFsbG9jID0gbXlhbGxvYzsKKyAgICBnei0+c3RybS56ZnJlZSA9IG15ZnJlZTsKKyAgICBnei0+c3RybS5vcGFxdWUgPSBaX05VTEw7CisgICAgaWYgKGd6LT53cml0ZSkKKyAgICAgICAgcmV0ID0gZGVmbGF0ZUluaXQyKCYoZ3otPnN0cm0pLCAtMSwgOCwgMTUgKyAxNiwgOCwgMCk7CisgICAgZWxzZSB7CisgICAgICAgIGd6LT5zdHJtLm5leHRfaW4gPSAwOworICAgICAgICBnei0+c3RybS5hdmFpbF9pbiA9IFpfTlVMTDsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZUluaXQyKCYoZ3otPnN0cm0pLCAxNSArIDE2KTsKKyAgICB9CisgICAgaWYgKHJldCAhPSBaX09LKSB7CisgICAgICAgIGZyZWUoZ3opOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZ3otPmZpbGUgPSBwYXRoID09IE5VTEwgPyBmZG9wZW4oZmQsIGd6LT53cml0ZSA/ICJ3YiIgOiAicmIiKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3BlbihwYXRoLCBnei0+d3JpdGUgPyAid2IiIDogInJiIik7CisgICAgaWYgKGd6LT5maWxlID09IE5VTEwpIHsKKyAgICAgICAgZ3otPndyaXRlID8gZGVmbGF0ZUVuZCgmKGd6LT5zdHJtKSkgOiBpbmZsYXRlRW5kKCYoZ3otPnN0cm0pKTsKKyAgICAgICAgZnJlZShneik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBnei0+ZXJyID0gMDsKKyAgICBnei0+bXNnID0gIiI7CisgICAgcmV0dXJuIGd6OworfQorCitpbnQgZ3p3cml0ZSBPRigoZ3pGaWxlLCBjb25zdCB2b2lkICosIHVuc2lnbmVkKSk7CisKK2ludCBnendyaXRlKGd6LCBidWYsIGxlbikKKyAgICBnekZpbGUgZ3o7CisgICAgY29uc3Qgdm9pZCAqYnVmOworICAgIHVuc2lnbmVkIGxlbjsKK3sKKyAgICB6X3N0cmVhbSAqc3RybTsKKyAgICB1bnNpZ25lZCBjaGFyIG91dFtCVUZMRU5dOworCisgICAgaWYgKGd6ID09IE5VTEwgfHwgIWd6LT53cml0ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RybSA9ICYoZ3otPnN0cm0pOworICAgIHN0cm0tPm5leHRfaW4gPSAodm9pZCAqKWJ1ZjsKKyAgICBzdHJtLT5hdmFpbF9pbiA9IGxlbjsKKyAgICBkbyB7CisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0OworICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBCVUZMRU47CisgICAgICAgICh2b2lkKWRlZmxhdGUoc3RybSwgWl9OT19GTFVTSCk7CisgICAgICAgIGZ3cml0ZShvdXQsIDEsIEJVRkxFTiAtIHN0cm0tPmF2YWlsX291dCwgZ3otPmZpbGUpOworICAgIH0gd2hpbGUgKHN0cm0tPmF2YWlsX291dCA9PSAwKTsKKyAgICByZXR1cm4gbGVuOworfQorCitpbnQgZ3pyZWFkIE9GKChnekZpbGUsIHZvaWQgKiwgdW5zaWduZWQpKTsKKworaW50IGd6cmVhZChneiwgYnVmLCBsZW4pCisgICAgZ3pGaWxlIGd6OworICAgIHZvaWQgKmJ1ZjsKKyAgICB1bnNpZ25lZCBsZW47Cit7CisgICAgaW50IHJldDsKKyAgICB1bnNpZ25lZCBnb3Q7CisgICAgdW5zaWduZWQgY2hhciBpblsxXTsKKyAgICB6X3N0cmVhbSAqc3RybTsKKworICAgIGlmIChneiA9PSBOVUxMIHx8IGd6LT53cml0ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGd6LT5lcnIpCisgICAgICAgIHJldHVybiAwOworICAgIHN0cm0gPSAmKGd6LT5zdHJtKTsKKyAgICBzdHJtLT5uZXh0X291dCA9ICh2b2lkICopYnVmOworICAgIHN0cm0tPmF2YWlsX291dCA9IGxlbjsKKyAgICBkbyB7CisgICAgICAgIGdvdCA9IGZyZWFkKGluLCAxLCAxLCBnei0+ZmlsZSk7CisgICAgICAgIGlmIChnb3QgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzdHJtLT5uZXh0X2luID0gaW47CisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gMTsKKyAgICAgICAgcmV0ID0gaW5mbGF0ZShzdHJtLCBaX05PX0ZMVVNIKTsKKyAgICAgICAgaWYgKHJldCA9PSBaX0RBVEFfRVJST1IpIHsKKyAgICAgICAgICAgIGd6LT5lcnIgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBnei0+bXNnID0gc3RybS0+bXNnOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCisgICAgICAgICAgICBpbmZsYXRlUmVzZXQoc3RybSk7CisgICAgfSB3aGlsZSAoc3RybS0+YXZhaWxfb3V0KTsKKyAgICByZXR1cm4gbGVuIC0gc3RybS0+YXZhaWxfb3V0OworfQorCitpbnQgZ3pjbG9zZSBPRigoZ3pGaWxlKSk7CisKK2ludCBnemNsb3NlKGd6KQorICAgIGd6RmlsZSBnejsKK3sKKyAgICB6X3N0cmVhbSAqc3RybTsKKyAgICB1bnNpZ25lZCBjaGFyIG91dFtCVUZMRU5dOworCisgICAgaWYgKGd6ID09IE5VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdHJtID0gJihnei0+c3RybSk7CisgICAgaWYgKGd6LT53cml0ZSkgeworICAgICAgICBzdHJtLT5uZXh0X2luID0gWl9OVUxMOworICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0OworICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gQlVGTEVOOworICAgICAgICAgICAgKHZvaWQpZGVmbGF0ZShzdHJtLCBaX0ZJTklTSCk7CisgICAgICAgICAgICBmd3JpdGUob3V0LCAxLCBCVUZMRU4gLSBzdHJtLT5hdmFpbF9vdXQsIGd6LT5maWxlKTsKKyAgICAgICAgfSB3aGlsZSAoc3RybS0+YXZhaWxfb3V0ID09IDApOworICAgICAgICBkZWZsYXRlRW5kKHN0cm0pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGluZmxhdGVFbmQoc3RybSk7CisgICAgZmNsb3NlKGd6LT5maWxlKTsKKyAgICBmcmVlKGd6KTsKKyAgICByZXR1cm4gWl9PSzsKK30KKworY29uc3QgY2hhciAqZ3plcnJvciBPRigoZ3pGaWxlLCBpbnQgKikpOworCitjb25zdCBjaGFyICpnemVycm9yKGd6LCBlcnIpCisgICAgZ3pGaWxlIGd6OworICAgIGludCAqZXJyOworeworICAgICplcnIgPSBnei0+ZXJyOworICAgIHJldHVybiBnei0+bXNnOworfQorCisjZW5kaWYKKwogY2hhciAqcHJvZzsKIAogdm9pZCBlcnJvciAgICAgICAgICAgIE9GKChjb25zdCBjaGFyICptc2cpKTsKQEAgLTE5OCw4ICs0NjIsMTcgQEAKICAgICBGSUxFICAqaW47CiAgICAgZ3pGaWxlIG91dDsKIAorICAgIGlmIChzdHJsZW4oZmlsZSkgKyBzdHJsZW4oR1pfU1VGRklYKSA+PSBzaXplb2Yob3V0ZmlsZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZmlsZW5hbWUgdG9vIGxvbmdcbiIsIHByb2cpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworI2lmICFkZWZpbmVkKE5PX3NucHJpbnRmKSAmJiAhZGVmaW5lZChOT192c25wcmludGYpCisgICAgc25wcmludGYob3V0ZmlsZSwgc2l6ZW9mKG91dGZpbGUpLCAiJXMlcyIsIGZpbGUsIEdaX1NVRkZJWCk7CisjZWxzZQogICAgIHN0cmNweShvdXRmaWxlLCBmaWxlKTsKICAgICBzdHJjYXQob3V0ZmlsZSwgR1pfU1VGRklYKTsKKyNlbmRpZgogCiAgICAgaW4gPSBmb3BlbihmaWxlLCAicmIiKTsKICAgICBpZiAoaW4gPT0gTlVMTCkgewpAQCAtMjI3LDkgKzUwMCwxOCBAQAogICAgIGNoYXIgKmluZmlsZSwgKm91dGZpbGU7CiAgICAgRklMRSAgKm91dDsKICAgICBnekZpbGUgaW47Ci0gICAgdUludCBsZW4gPSAodUludClzdHJsZW4oZmlsZSk7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihmaWxlKTsKIAorICAgIGlmIChsZW4gKyBzdHJsZW4oR1pfU1VGRklYKSA+PSBzaXplb2YoYnVmKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBmaWxlbmFtZSB0b28gbG9uZ1xuIiwgcHJvZyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisjaWYgIWRlZmluZWQoTk9fc25wcmludGYpICYmICFkZWZpbmVkKE5PX3ZzbnByaW50ZikKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMiLCBmaWxlKTsKKyNlbHNlCiAgICAgc3RyY3B5KGJ1ZiwgZmlsZSk7CisjZW5kaWYKIAogICAgIGlmIChsZW4gPiBTVUZGSVhfTEVOICYmIHN0cmNtcChmaWxlK2xlbi1TVUZGSVhfTEVOLCBHWl9TVUZGSVgpID09IDApIHsKICAgICAgICAgaW5maWxlID0gZmlsZTsKQEAgLTIzOCw3ICs1MjAsMTEgQEAKICAgICB9IGVsc2UgewogICAgICAgICBvdXRmaWxlID0gZmlsZTsKICAgICAgICAgaW5maWxlID0gYnVmOworI2lmICFkZWZpbmVkKE5PX3NucHJpbnRmKSAmJiAhZGVmaW5lZChOT192c25wcmludGYpCisgICAgICAgIHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sICIlcyIsIEdaX1NVRkZJWCk7CisjZWxzZQogICAgICAgICBzdHJjYXQoaW5maWxlLCBHWl9TVUZGSVgpOworI2VuZGlmCiAgICAgfQogICAgIGluID0gZ3pvcGVuKGluZmlsZSwgInJiIik7CiAgICAgaWYgKGluID09IE5VTEwpIHsKQEAgLTI1OCw3ICs1NDQsOCBAQAogCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVXNhZ2U6ICBtaW5pZ3ppcCBbLWRdIFstZl0gWy1oXSBbLXJdIFstMSB0byAtOV0gW2ZpbGVzLi4uXQorICogVXNhZ2U6ICBtaW5pZ3ppcCBbLWNdIFstZF0gWy1mXSBbLWhdIFstcl0gWy0xIHRvIC05XSBbZmlsZXMuLi5dCisgKiAgIC1jIDogd3JpdGUgdG8gc3RhbmRhcmQgb3V0cHV0CiAgKiAgIC1kIDogZGVjb21wcmVzcwogICogICAtZiA6IGNvbXByZXNzIHdpdGggWl9GSUxURVJFRAogICogICAtaCA6IGNvbXByZXNzIHdpdGggWl9IVUZGTUFOX09OTFkKQEAgLTI3MCwxNyArNTU3LDM0IEBACiAgICAgaW50IGFyZ2M7CiAgICAgY2hhciAqYXJndltdOwogeworICAgIGludCBjb3B5b3V0ID0gMDsKICAgICBpbnQgdW5jb21wciA9IDA7CiAgICAgZ3pGaWxlIGZpbGU7Ci0gICAgY2hhciBvdXRtb2RlWzIwXTsKKyAgICBjaGFyICpibmFtZSwgb3V0bW9kZVsyMF07CiAKKyNpZiAhZGVmaW5lZChOT19zbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQorICAgIHNucHJpbnRmKG91dG1vZGUsIHNpemVvZihvdXRtb2RlKSwgIiVzIiwgIndiNiAiKTsKKyNlbHNlCiAgICAgc3RyY3B5KG91dG1vZGUsICJ3YjYgIik7CisjZW5kaWYKIAogICAgIHByb2cgPSBhcmd2WzBdOworICAgIGJuYW1lID0gc3RycmNocihhcmd2WzBdLCAnLycpOworICAgIGlmIChibmFtZSkKKyAgICAgIGJuYW1lKys7CisgICAgZWxzZQorICAgICAgYm5hbWUgPSBhcmd2WzBdOwogICAgIGFyZ2MtLSwgYXJndisrOwogCisgICAgaWYgKCFzdHJjbXAoYm5hbWUsICJndW56aXAiKSkKKyAgICAgIHVuY29tcHIgPSAxOworICAgIGVsc2UgaWYgKCFzdHJjbXAoYm5hbWUsICJ6Y2F0IikpCisgICAgICBjb3B5b3V0ID0gdW5jb21wciA9IDE7CisKICAgICB3aGlsZSAoYXJnYyA+IDApIHsKLSAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICItZCIpID09IDApCisgICAgICBpZiAoc3RyY21wKCphcmd2LCAiLWMiKSA9PSAwKQorICAgICAgICBjb3B5b3V0ID0gMTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1kIikgPT0gMCkKICAgICAgICAgdW5jb21wciA9IDE7CiAgICAgICBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItZiIpID09IDApCiAgICAgICAgIG91dG1vZGVbM10gPSAnZic7CkBAIC0zMTAsMTEgKzYxNCwzNiBAQAogICAgICAgICAgICAgZ3pfY29tcHJlc3Moc3RkaW4sIGZpbGUpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNvcHlvdXQpIHsKKyAgICAgICAgICAgIFNFVF9CSU5BUllfTU9ERShzdGRvdXQpOworICAgICAgICB9CiAgICAgICAgIGRvIHsKICAgICAgICAgICAgIGlmICh1bmNvbXByKSB7Ci0gICAgICAgICAgICAgICAgZmlsZV91bmNvbXByZXNzKCphcmd2KTsKKyAgICAgICAgICAgICAgICBpZiAoY29weW91dCkgeworICAgICAgICAgICAgICAgICAgICBmaWxlID0gZ3pvcGVuKCphcmd2LCAicmIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IGd6b3BlbiAlc1xuIiwgcHJvZywgKmFyZ3YpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBnel91bmNvbXByZXNzKGZpbGUsIHN0ZG91dCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZV91bmNvbXByZXNzKCphcmd2KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbGVfY29tcHJlc3MoKmFyZ3YsIG91dG1vZGUpOworICAgICAgICAgICAgICAgIGlmIChjb3B5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgIEZJTEUgKiBpbiA9IGZvcGVuKCphcmd2LCAicmIiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGVycm9yKCphcmd2KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBnemRvcGVuKGZpbGVubyhzdGRvdXQpLCBvdXRtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlID09IE5VTEwpIGVycm9yKCJjYW4ndCBnemRvcGVuIHN0ZG91dCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBnel9jb21wcmVzcyhpbiwgZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVfY29tcHJlc3MoKmFyZ3YsIG91dG1vZGUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSB3aGlsZSAoYXJndisrLCAtLWFyZ2MpOwogICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi90cmVlcy5jIGIvTW9kdWxlcy96bGliL3RyZWVzLmMKaW5kZXggMzk1ZTRlMS4uMWZkNzc1OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL3RyZWVzLmMKKysrIGIvTW9kdWxlcy96bGliL3RyZWVzLmMKQEAgLTEsNSArMSw2IEBACiAvKiB0cmVlcy5jIC0tIG91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5CisgKiBkZXRlY3RfZGF0YV90eXBlKCkgZnVuY3Rpb24gcHJvdmlkZWQgZnJlZWx5IGJ5IENvc21pbiBUcnV0YSwgMjAwNgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTczLDExICs3NCw2IEBACiAgKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy4KICAqLwogCi0jZGVmaW5lIEJ1Zl9zaXplICg4ICogMipzaXplb2YoY2hhcikpCi0vKiBOdW1iZXIgb2YgYml0cyB1c2VkIHdpdGhpbiBiaV9idWYuIChiaV9idWYgbWlnaHQgYmUgaW1wbGVtZW50ZWQgb24KLSAqIG1vcmUgdGhhbiAxNiBiaXRzIG9uIHNvbWUgc3lzdGVtcy4pCi0gKi8KLQogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBMb2NhbCBkYXRhLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlLgogICovCkBAIC0xNTAsOSArMTQ2LDkgQEAKIGxvY2FsIGludCAgYnVpbGRfYmxfdHJlZSAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKIGxvY2FsIHZvaWQgc2VuZF9hbGxfdHJlZXMgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBsY29kZXMsIGludCBkY29kZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxjb2RlcykpOwotbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqbHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdF9kYXRhICpkdHJlZSkpOwotbG9jYWwgdm9pZCBzZXRfZGF0YV90eXBlICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOworbG9jYWwgdm9pZCBjb21wcmVzc19ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY29uc3QgY3RfZGF0YSAqbHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdF9kYXRhICpkdHJlZSkpOworbG9jYWwgaW50ICBkZXRlY3RfZGF0YV90eXBlIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7CiBsb2NhbCB1bnNpZ25lZCBiaV9yZXZlcnNlIE9GKCh1bnNpZ25lZCB2YWx1ZSwgaW50IGxlbmd0aCkpOwogbG9jYWwgdm9pZCBiaV93aW5kdXAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwogbG9jYWwgdm9pZCBiaV9mbHVzaCAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwpAQCAtMjAzLDEyICsxOTksMTIgQEAKICAgICAgKiB1bnVzZWQgYml0cyBpbiB2YWx1ZS4KICAgICAgKi8KICAgICBpZiAocy0+YmlfdmFsaWQgPiAoaW50KUJ1Zl9zaXplIC0gbGVuZ3RoKSB7Ci0gICAgICAgIHMtPmJpX2J1ZiB8PSAodmFsdWUgPDwgcy0+YmlfdmFsaWQpOworICAgICAgICBzLT5iaV9idWYgfD0gKHVzaCl2YWx1ZSA8PCBzLT5iaV92YWxpZDsKICAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7CiAgICAgICAgIHMtPmJpX2J1ZiA9ICh1c2gpdmFsdWUgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpOwogICAgICAgICBzLT5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTsKICAgICB9IGVsc2UgewotICAgICAgICBzLT5iaV9idWYgfD0gdmFsdWUgPDwgcy0+YmlfdmFsaWQ7CisgICAgICAgIHMtPmJpX2J1ZiB8PSAodXNoKXZhbHVlIDw8IHMtPmJpX3ZhbGlkOwogICAgICAgICBzLT5iaV92YWxpZCArPSBsZW5ndGg7CiAgICAgfQogfQpAQCAtMjE4LDEyICsyMTQsMTIgQEAKIHsgaW50IGxlbiA9IGxlbmd0aDtcCiAgIGlmIChzLT5iaV92YWxpZCA+IChpbnQpQnVmX3NpemUgLSBsZW4pIHtcCiAgICAgaW50IHZhbCA9IHZhbHVlO1wKLSAgICBzLT5iaV9idWYgfD0gKHZhbCA8PCBzLT5iaV92YWxpZCk7XAorICAgIHMtPmJpX2J1ZiB8PSAodXNoKXZhbCA8PCBzLT5iaV92YWxpZDtcCiAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7XAogICAgIHMtPmJpX2J1ZiA9ICh1c2gpdmFsID4+IChCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkKTtcCiAgICAgcy0+YmlfdmFsaWQgKz0gbGVuIC0gQnVmX3NpemU7XAogICB9IGVsc2Uge1wKLSAgICBzLT5iaV9idWYgfD0gKHZhbHVlKSA8PCBzLT5iaV92YWxpZDtcCisgICAgcy0+YmlfYnVmIHw9ICh1c2gpKHZhbHVlKSA8PCBzLT5iaV92YWxpZDtcCiAgICAgcy0+YmlfdmFsaWQgKz0gbGVuO1wKICAgfVwKIH0KQEAgLTI1MCwxMSArMjQ2LDEzIEBACiAgICAgaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjsKIAogICAgIC8qIEZvciBzb21lIGVtYmVkZGVkIHRhcmdldHMsIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdCBpbml0aWFsaXplZDogKi8KKyNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSUwogICAgIHN0YXRpY19sX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfbHRyZWU7CiAgICAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7CiAgICAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTsKICAgICBzdGF0aWNfZF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9kYml0czsKICAgICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzOworI2VuZGlmCiAKICAgICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovCiAgICAgbGVuZ3RoID0gMDsKQEAgLTM0OCwxMyArMzQ2LDE0IEBACiAgICAgICAgICAgICAgICAgc3RhdGljX2R0cmVlW2ldLkxlbiwgU0VQQVJBVE9SKGksIERfQ09ERVMtMSwgNSkpOwogICAgIH0KIAotICAgIGZwcmludGYoaGVhZGVyLCAiY29uc3QgdWNoIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7XG4iKTsKKyAgICBmcHJpbnRmKGhlYWRlciwgImNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7XG4iKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgRElTVF9DT0RFX0xFTjsgaSsrKSB7CiAgICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTJ1JXMiLCBfZGlzdF9jb2RlW2ldLAogICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBESVNUX0NPREVfTEVOLTEsIDIwKSk7CiAgICAgfQogCi0gICAgZnByaW50ZihoZWFkZXIsICJjb25zdCB1Y2ggX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV09IHtcbiIpOworICAgIGZwcmludGYoaGVhZGVyLAorICAgICAgICAiY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV09IHtcbiIpOwogICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTUFUQ0gtTUlOX01BVENIKzE7IGkrKykgewogICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiUydSVzIiwgX2xlbmd0aF9jb2RlW2ldLAogICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBNQVhfTUFUQ0gtTUlOX01BVENILCAyMCkpOwpAQCAtMzc5LDcgKzM3OCw3IEBACiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS4KICAqLwotdm9pZCBfdHJfaW5pdChzKQordm9pZCBaTElCX0lOVEVSTkFMIF90cl9pbml0KHMpCiAgICAgZGVmbGF0ZV9zdGF0ZSAqczsKIHsKICAgICB0cl9zdGF0aWNfaW5pdCgpOwpAQCAtMzk1LDcgKzM5NCw2IEBACiAKICAgICBzLT5iaV9idWYgPSAwOwogICAgIHMtPmJpX3ZhbGlkID0gMDsKLSAgICBzLT5sYXN0X2VvYl9sZW4gPSA4OyAvKiBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlICovCiAjaWZkZWYgREVCVUcKICAgICBzLT5jb21wcmVzc2VkX2xlbiA9IDBMOwogICAgIHMtPmJpdHNfc2VudCA9IDBMOwpAQCAtODY0LDEzICs4NjIsMTMgQEAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogU2VuZCBhIHN0b3JlZCBibG9jawogICovCi12b2lkIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBlb2YpCit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpCiAgICAgZGVmbGF0ZV9zdGF0ZSAqczsKICAgICBjaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqLwogICAgIHVsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqLwotICAgIGludCBlb2Y7ICAgICAgICAgIC8qIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovCisgICAgaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLwogewotICAgIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLPDwxKStlb2YsIDMpOyAgLyogc2VuZCBibG9jayB0eXBlICovCisgICAgc2VuZF9iaXRzKHMsIChTVE9SRURfQkxPQ0s8PDEpK2xhc3QsIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi8KICNpZmRlZiBERUJVRwogICAgIHMtPmNvbXByZXNzZWRfbGVuID0gKHMtPmNvbXByZXNzZWRfbGVuICsgMyArIDcpICYgKHVsZyl+N0w7CiAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gKHN0b3JlZF9sZW4gKyA0KSA8PCAzOwpAQCAtODc5LDE3ICs4NzcsMTkgQEAKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGbHVzaCB0aGUgYml0cyBpbiB0aGUgYml0IGJ1ZmZlciB0byBwZW5kaW5nIG91dHB1dCAobGVhdmVzIGF0IG1vc3QgNyBiaXRzKQorICovCit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2ZsdXNoX2JpdHMocykKKyAgICBkZWZsYXRlX3N0YXRlICpzOworeworICAgIGJpX2ZsdXNoKHMpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuCiAgKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci4KLSAqIFRoZSBjdXJyZW50IGluZmxhdGUgY29kZSByZXF1aXJlcyA5IGJpdHMgb2YgbG9va2FoZWFkLiBJZiB0aGUKLSAqIGxhc3QgdHdvIGNvZGVzIGZvciB0aGUgcHJldmlvdXMgYmxvY2sgKHJlYWwgY29kZSBwbHVzIEVPQikgd2VyZSBjb2RlZAotICogb24gNSBiaXRzIG9yIGxlc3MsIGluZmxhdGUgbWF5IGhhdmUgb25seSA1KzMgYml0cyBvZiBsb29rYWhlYWQgdG8gZGVjb2RlCi0gKiB0aGUgbGFzdCByZWFsIGNvZGUuIEluIHRoaXMgY2FzZSB3ZSBzZW5kIHR3byBlbXB0eSBzdGF0aWMgYmxvY2tzIGluc3RlYWQKLSAqIG9mIG9uZS4gKFRoZXJlIGFyZSBubyBwcm9ibGVtcyBpZiB0aGUgcHJldmlvdXMgYmxvY2sgaXMgc3RvcmVkIG9yIGZpeGVkLikKLSAqIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBhc3N1bWUgdGhlIHdvcnN0IGNhc2Ugb2YgbGFzdCByZWFsIGNvZGUgZW5jb2RlZAotICogb24gb25lIGJpdCBvbmx5LgogICovCi12b2lkIF90cl9hbGlnbihzKQordm9pZCBaTElCX0lOVEVSTkFMIF90cl9hbGlnbihzKQogICAgIGRlZmxhdGVfc3RhdGUgKnM7CiB7CiAgICAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUzw8MSwgMyk7CkBAIC04OTgsMzEgKzg5OCwxNyBAQAogICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDEwTDsgLyogMyBmb3IgYmxvY2sgdHlwZSwgNyBmb3IgRU9CICovCiAjZW5kaWYKICAgICBiaV9mbHVzaChzKTsKLSAgICAvKiBPZiB0aGUgMTAgYml0cyBmb3IgdGhlIGVtcHR5IGJsb2NrLCB3ZSBoYXZlIGFscmVhZHkgc2VudAotICAgICAqICgxMCAtIGJpX3ZhbGlkKSBiaXRzLiBUaGUgbG9va2FoZWFkIGZvciB0aGUgbGFzdCByZWFsIGNvZGUgKGJlZm9yZQotICAgICAqIHRoZSBFT0Igb2YgdGhlIHByZXZpb3VzIGJsb2NrKSB3YXMgdGh1cyBhdCBsZWFzdCBvbmUgcGx1cyB0aGUgbGVuZ3RoCi0gICAgICogb2YgdGhlIEVPQiBwbHVzIHdoYXQgd2UgaGF2ZSBqdXN0IHNlbnQgb2YgdGhlIGVtcHR5IHN0YXRpYyBibG9jay4KLSAgICAgKi8KLSAgICBpZiAoMSArIHMtPmxhc3RfZW9iX2xlbiArIDEwIC0gcy0+YmlfdmFsaWQgPCA5KSB7Ci0gICAgICAgIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVM8PDEsIDMpOwotICAgICAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpOwotI2lmZGVmIERFQlVHCi0gICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDEwTDsKLSNlbmRpZgotICAgICAgICBiaV9mbHVzaChzKTsKLSAgICB9Ci0gICAgcy0+bGFzdF9lb2JfbGVuID0gNzsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWMKICAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS4KICAqLwotdm9pZCBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBlb2YpCit2b2lkIFpMSUJfSU5URVJOQUwgX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCkKICAgICBkZWZsYXRlX3N0YXRlICpzOwogICAgIGNoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi8KICAgICB1bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KLSAgICBpbnQgZW9mOyAgICAgICAgICAvKiB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworICAgIGludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi8KIHsKICAgICB1bGcgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovCiAgICAgaW50IG1heF9ibGluZGV4ID0gMDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KQEAgLTkzMSw4ICs5MTcsOCBAQAogICAgIGlmIChzLT5sZXZlbCA+IDApIHsKIAogICAgICAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBiaW5hcnkgb3IgdGV4dCAqLwotICAgICAgICBpZiAoc3RvcmVkX2xlbiA+IDAgJiYgcy0+c3RybS0+ZGF0YV90eXBlID09IFpfVU5LTk9XTikKLSAgICAgICAgICAgIHNldF9kYXRhX3R5cGUocyk7CisgICAgICAgIGlmIChzLT5zdHJtLT5kYXRhX3R5cGUgPT0gWl9VTktOT1dOKQorICAgICAgICAgICAgcy0+c3RybS0+ZGF0YV90eXBlID0gZGV0ZWN0X2RhdGFfdHlwZShzKTsKIAogICAgICAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCiAgICAgICAgIGJ1aWxkX3RyZWUocywgKHRyZWVfZGVzYyAqKSgmKHMtPmxfZGVzYykpKTsKQEAgLTk3OCwyMyArOTY0LDI1IEBACiAgICAgICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0bwogICAgICAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLgogICAgICAgICAgKi8KLSAgICAgICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGVvZik7CisgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTsKIAogI2lmZGVmIEZPUkNFX1NUQVRJQwogICAgIH0gZWxzZSBpZiAoc3RhdGljX2xlbmIgPj0gMCkgeyAvKiBmb3JjZSBzdGF0aWMgdHJlZXMgKi8KICNlbHNlCiAgICAgfSBlbHNlIGlmIChzLT5zdHJhdGVneSA9PSBaX0ZJWEVEIHx8IHN0YXRpY19sZW5iID09IG9wdF9sZW5iKSB7CiAjZW5kaWYKLSAgICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVM8PDEpK2VvZiwgMyk7Ci0gICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIChjdF9kYXRhICopc3RhdGljX2x0cmVlLCAoY3RfZGF0YSAqKXN0YXRpY19kdHJlZSk7CisgICAgICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTPDwxKStsYXN0LCAzKTsKKyAgICAgICAgY29tcHJlc3NfYmxvY2socywgKGNvbnN0IGN0X2RhdGEgKilzdGF0aWNfbHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjdF9kYXRhICopc3RhdGljX2R0cmVlKTsKICNpZmRlZiBERUJVRwogICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAzICsgcy0+c3RhdGljX2xlbjsKICNlbmRpZgogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTPDwxKStlb2YsIDMpOworICAgICAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUzw8MSkrbGFzdCwgMyk7CiAgICAgICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMtPmxfZGVzYy5tYXhfY29kZSsxLCBzLT5kX2Rlc2MubWF4X2NvZGUrMSwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2JsaW5kZXgrMSk7Ci0gICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSk7CisgICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIChjb25zdCBjdF9kYXRhICopcy0+ZHluX2x0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSk7CiAjaWZkZWYgREVCVUcKICAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMyArIHMtPm9wdF9sZW47CiAjZW5kaWYKQEAgLTEwMDUsMjEgKzk5MywyMSBAQAogICAgICAqLwogICAgIGluaXRfYmxvY2socyk7CiAKLSAgICBpZiAoZW9mKSB7CisgICAgaWYgKGxhc3QpIHsKICAgICAgICAgYmlfd2luZHVwKHMpOwogI2lmZGVmIERFQlVHCiAgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDc7ICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCiAjZW5kaWYKICAgICB9CiAgICAgVHJhY2V2KChzdGRlcnIsIlxuY29tcHJsZW4gJWx1KCVsdSkgIiwgcy0+Y29tcHJlc3NlZF9sZW4+PjMsCi0gICAgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuLTcqZW9mKSk7CisgICAgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuLTcqbGFzdCkpOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZgogICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLgogICovCi1pbnQgX3RyX3RhbGx5IChzLCBkaXN0LCBsYykKK2ludCBaTElCX0lOVEVSTkFMIF90cl90YWxseSAocywgZGlzdCwgbGMpCiAgICAgZGVmbGF0ZV9zdGF0ZSAqczsKICAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi8KICAgICB1bnNpZ25lZCBsYzsgICAgLyogbWF0Y2ggbGVuZ3RoLU1JTl9NQVRDSCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdD09MCkgKi8KQEAgLTEwNzEsOCArMTA1OSw4IEBACiAgKi8KIGxvY2FsIHZvaWQgY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKQogICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0gICAgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqLwotICAgIGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovCisgICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqLworICAgIGNvbnN0IGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovCiB7CiAgICAgdW5zaWduZWQgZGlzdDsgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLwogICAgIGludCBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovCkBAIC0xMTE0LDI4ICsxMTAyLDQ4IEBACiAgICAgfSB3aGlsZSAobHggPCBzLT5sYXN0X2xpdCk7CiAKICAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7Ci0gICAgcy0+bGFzdF9lb2JfbGVuID0gbHRyZWVbRU5EX0JMT0NLXS5MZW47CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2V0IHRoZSBkYXRhIHR5cGUgdG8gQklOQVJZIG9yIFRFWFQsIHVzaW5nIGEgY3J1ZGUgYXBwcm94aW1hdGlvbjoKLSAqIHNldCBpdCB0byBaX1RFWFQgaWYgYWxsIHN5bWJvbHMgYXJlIGVpdGhlciBwcmludGFibGUgY2hhcmFjdGVycyAoMzMgdG8gMjU1KQotICogb3Igd2hpdGUgc3BhY2VzICg5IHRvIDEzLCBvciAzMik7IG9yIHNldCBpdCB0byBaX0JJTkFSWSBvdGhlcndpc2UuCisgKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobToKKyAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDoKKyAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGUKKyAqICAgICAgICJibGFjayBsaXN0IiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLgorICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZQorICogICAgICAgIndoaXRlIGxpc3QiICg5IHtUQUJ9LCAxMCB7TEZ9LCAxMyB7Q1J9LCAzMi4uMjU1KS4KKyAqIC0gQklOQVJZIG90aGVyd2lzZS4KKyAqIC0gVGhlIGZvbGxvd2luZyBwYXJ0aWFsbHktcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGZvcm0gYQorICogICAiZ3JheSBsaXN0IiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOgorICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLgogICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuCiAgKi8KLWxvY2FsIHZvaWQgc2V0X2RhdGFfdHlwZShzKQorbG9jYWwgaW50IGRldGVjdF9kYXRhX3R5cGUocykKICAgICBkZWZsYXRlX3N0YXRlICpzOwogeworICAgIC8qIGJsYWNrX21hc2sgaXMgdGhlIGJpdCBtYXNrIG9mIGJsYWNrLWxpc3RlZCBieXRlcworICAgICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMQorICAgICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTEKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGJsYWNrX21hc2sgPSAweGYzZmZjMDdmVUw7CiAgICAgaW50IG47CiAKLSAgICBmb3IgKG4gPSAwOyBuIDwgOTsgbisrKQorICAgIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoImJsYWNrLWxpc3RlZCIpIGJ5dGVzLiAqLworICAgIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj0gMSkKKyAgICAgICAgaWYgKChibGFja19tYXNrICYgMSkgJiYgKHMtPmR5bl9sdHJlZVtuXS5GcmVxICE9IDApKQorICAgICAgICAgICAgcmV0dXJuIFpfQklOQVJZOworCisgICAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKCJ3aGl0ZS1saXN0ZWQiKSBieXRlcy4gKi8KKyAgICBpZiAocy0+ZHluX2x0cmVlWzldLkZyZXEgIT0gMCB8fCBzLT5keW5fbHRyZWVbMTBdLkZyZXEgIT0gMAorICAgICAgICAgICAgfHwgcy0+ZHluX2x0cmVlWzEzXS5GcmVxICE9IDApCisgICAgICAgIHJldHVybiBaX1RFWFQ7CisgICAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUzsgbisrKQogICAgICAgICBpZiAocy0+ZHluX2x0cmVlW25dLkZyZXEgIT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIGlmIChuID09IDkpCi0gICAgICAgIGZvciAobiA9IDE0OyBuIDwgMzI7IG4rKykKLSAgICAgICAgICAgIGlmIChzLT5keW5fbHRyZWVbbl0uRnJlcSAhPSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIHMtPnN0cm0tPmRhdGFfdHlwZSA9IChuID09IDMyKSA/IFpfVEVYVCA6IFpfQklOQVJZOworICAgICAgICAgICAgcmV0dXJuIFpfVEVYVDsKKworICAgIC8qIFRoZXJlIGFyZSBubyAiYmxhY2stbGlzdGVkIiBvciAid2hpdGUtbGlzdGVkIiBieXRlczoKKyAgICAgKiB0aGlzIHN0cmVhbSBlaXRoZXIgaXMgZW1wdHkgb3IgaGFzIHRvbGVyYXRlZCAoImdyYXktbGlzdGVkIikgYnl0ZXMgb25seS4KKyAgICAgKi8KKyAgICByZXR1cm4gWl9CSU5BUlk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTIwMSw3ICsxMjA5LDYgQEAKICAgICBpbnQgICAgICBoZWFkZXI7ICAvKiB0cnVlIGlmIGJsb2NrIGhlYWRlciBtdXN0IGJlIHdyaXR0ZW4gKi8KIHsKICAgICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCi0gICAgcy0+bGFzdF9lb2JfbGVuID0gODsgLyogZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZSAqLwogCiAgICAgaWYgKGhlYWRlcikgewogICAgICAgICBwdXRfc2hvcnQocywgKHVzaClsZW4pOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGliL3RyZWVzLmggYi9Nb2R1bGVzL3psaWIvdHJlZXMuaAppbmRleCA3MmZhY2Y5Li5kMzU2MzlkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWIvdHJlZXMuaAorKysgYi9Nb2R1bGVzL3psaWIvdHJlZXMuaApAQCAtNzAsNyArNzAsNyBAQAoge3sxOX0seyA1fX0sIHt7MTF9LHsgNX19LCB7ezI3fSx7IDV9fSwge3sgN30seyA1fX0sIHt7MjN9LHsgNX19CiB9OwogCi1jb25zdCB1Y2ggX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXSA9IHsKK2NvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9kaXN0X2NvZGVbRElTVF9DT0RFX0xFTl0gPSB7CiAgMCwgIDEsICAyLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsCiAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCiAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCkBAIC05OSw3ICs5OSw3IEBACiAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5CiB9OwogCi1jb25zdCB1Y2ggX2xlbmd0aF9jb2RlW01BWF9NQVRDSC1NSU5fTUFUQ0grMV09IHsKK2NvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdPSB7CiAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsCiAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCiAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvdW5jb21wci5jIGIvTW9kdWxlcy96bGliL3VuY29tcHIuYwppbmRleCBiNTllM2QwLi4yNDJlOTQ5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWIvdW5jb21wci5jCisrKyBiL01vZHVsZXMvemxpYi91bmNvbXByLmMKQEAgLTEsNSArMSw1IEBACiAvKiB1bmNvbXByLmMgLS0gZGVjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMywgMjAxMCBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTE2LDggKzE2LDYgQEAKICAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgogICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKICAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCi0gICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCiAKICAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAogICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CkBAIC0zMiw3ICszMCw3IEBACiAgICAgel9zdHJlYW0gc3RyZWFtOwogICAgIGludCBlcnI7CiAKLSAgICBzdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopc291cmNlOworICAgIHN0cmVhbS5uZXh0X2luID0gKHpfY29uc3QgQnl0ZWYgKilzb3VyY2U7CiAgICAgc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpc291cmNlTGVuOwogICAgIC8qIENoZWNrIGZvciBzb3VyY2UgPiA2NEsgb24gMTYtYml0IG1hY2hpbmU6ICovCiAgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfaW4gIT0gc291cmNlTGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvemNvbmYuaCBiL01vZHVsZXMvemxpYi96Y29uZi5oCmluZGV4IDAzYTk0MzEuLjk5ODdhNzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi96Y29uZi5oCisrKyBiL01vZHVsZXMvemxpYi96Y29uZi5oCkBAIC0xLDUgKzEsNSBAQAogLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTExLDUyICsxMSwxNDUgQEAKIC8qCiAgKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCiAgKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KKyAqIEV2ZW4gYmV0dGVyIHRoYW4gY29tcGlsaW5nIHdpdGggLURaX1BSRUZJWCB3b3VsZCBiZSB0byB1c2UgY29uZmlndXJlIHRvIHNldAorICogdGhpcyBwZXJtYW5lbnRseSBpbiB6Y29uZi5oIHVzaW5nICIuL2NvbmZpZ3VyZSAtLXpwcmVmaXgiLgogICovCi0jaWZkZWYgWl9QUkVGSVgKLSMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyNpZmRlZiBaX1BSRUZJWCAgICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfUFJFRklYX1NFVAorCisvKiBhbGwgbGlua2VkIHN5bWJvbHMgKi8KKyMgIGRlZmluZSBfZGlzdF9jb2RlICAgICAgICAgICAgel9fZGlzdF9jb2RlCisjICBkZWZpbmUgX2xlbmd0aF9jb2RlICAgICAgICAgIHpfX2xlbmd0aF9jb2RlCisjICBkZWZpbmUgX3RyX2FsaWduICAgICAgICAgICAgIHpfX3RyX2FsaWduCisjICBkZWZpbmUgX3RyX2ZsdXNoX2JpdHMgICAgICAgIHpfX3RyX2ZsdXNoX2JpdHMKKyMgIGRlZmluZSBfdHJfZmx1c2hfYmxvY2sgICAgICAgel9fdHJfZmx1c2hfYmxvY2sKKyMgIGRlZmluZSBfdHJfaW5pdCAgICAgICAgICAgICAgel9fdHJfaW5pdAorIyAgZGVmaW5lIF90cl9zdG9yZWRfYmxvY2sgICAgICB6X190cl9zdG9yZWRfYmxvY2sKKyMgIGRlZmluZSBfdHJfdGFsbHkgICAgICAgICAgICAgel9fdHJfdGFsbHkKKyMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lICAgICAgIHpfYWRsZXIzMl9jb21iaW5lCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lNjQgICAgIHpfYWRsZXIzMl9jb21iaW5lNjQKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCisjICAgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKKyMgICAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKKyMgIGVuZGlmCisjICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKKyMgIGRlZmluZSBjcmMzMl9jb21iaW5lICAgICAgICAgel9jcmMzMl9jb21iaW5lCisjICBkZWZpbmUgY3JjMzJfY29tYmluZTY0ICAgICAgIHpfY3JjMzJfY29tYmluZTY0CiAjICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQotIyAgZGVmaW5lIGRlZmxhdGVFbmQgICAgICAgICAgICB6X2RlZmxhdGVFbmQKLSMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KLSMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCi0jICBkZWZpbmUgaW5mbGF0ZUVuZCAgICAgICAgICAgIHpfaW5mbGF0ZUVuZAotIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KLSMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5Ci0jICBkZWZpbmUgZGVmbGF0ZVJlc2V0ICAgICAgICAgIHpfZGVmbGF0ZVJlc2V0Ci0jICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyAgICAgICAgIHpfZGVmbGF0ZVBhcmFtcwogIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAorIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5CisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgZGVmbGF0ZVBlbmRpbmcgICAgICAgIHpfZGVmbGF0ZVBlbmRpbmcKICMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKLSMgIGRlZmluZSBpbmZsYXRlSW5pdDJfICAgICAgICAgel9pbmZsYXRlSW5pdDJfCi0jICBkZWZpbmUgaW5mbGF0ZVNldERpY3Rpb25hcnkgIHpfaW5mbGF0ZVNldERpY3Rpb25hcnkKLSMgIGRlZmluZSBpbmZsYXRlU3luYyAgICAgICAgICAgel9pbmZsYXRlU3luYwotIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgICAgICB6X2luZmxhdGVTeW5jUG9pbnQKLSMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQotIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgICAgICAgICB6X2RlZmxhdGVSZXNldAorIyAgZGVmaW5lIGRlZmxhdGVSZXNldEtlZXAgICAgICB6X2RlZmxhdGVSZXNldEtlZXAKKyMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGRlZmxhdGVTZXRIZWFkZXIgICAgICB6X2RlZmxhdGVTZXRIZWFkZXIKKyMgIGRlZmluZSBkZWZsYXRlVHVuZSAgICAgICAgICAgel9kZWZsYXRlVHVuZQorIyAgZGVmaW5lIGRlZmxhdGVfY29weXJpZ2h0ICAgICB6X2RlZmxhdGVfY29weXJpZ2h0CisjICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQorIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgZ3pfZXJyb3IgICAgICAgICAgICAgIHpfZ3pfZXJyb3IKKyMgICAgZGVmaW5lIGd6X2ludG1heCAgICAgICAgICAgICB6X2d6X2ludG1heAorIyAgICBkZWZpbmUgZ3pfc3Ryd2luZXJyb3IgICAgICAgIHpfZ3pfc3Ryd2luZXJyb3IKKyMgICAgZGVmaW5lIGd6YnVmZmVyICAgICAgICAgICAgICB6X2d6YnVmZmVyCisjICAgIGRlZmluZSBnemNsZWFyZXJyICAgICAgICAgICAgel9nemNsZWFyZXJyCisjICAgIGRlZmluZSBnemNsb3NlICAgICAgICAgICAgICAgel9nemNsb3NlCisjICAgIGRlZmluZSBnemNsb3NlX3IgICAgICAgICAgICAgel9nemNsb3NlX3IKKyMgICAgZGVmaW5lIGd6Y2xvc2VfdyAgICAgICAgICAgICB6X2d6Y2xvc2VfdworIyAgICBkZWZpbmUgZ3pkaXJlY3QgICAgICAgICAgICAgIHpfZ3pkaXJlY3QKKyMgICAgZGVmaW5lIGd6ZG9wZW4gICAgICAgICAgICAgICB6X2d6ZG9wZW4KKyMgICAgZGVmaW5lIGd6ZW9mICAgICAgICAgICAgICAgICB6X2d6ZW9mCisjICAgIGRlZmluZSBnemVycm9yICAgICAgICAgICAgICAgel9nemVycm9yCisjICAgIGRlZmluZSBnemZsdXNoICAgICAgICAgICAgICAgel9nemZsdXNoCisjICAgIGRlZmluZSBnemdldGMgICAgICAgICAgICAgICAgel9nemdldGMKKyMgICAgZGVmaW5lIGd6Z2V0Y18gICAgICAgICAgICAgICB6X2d6Z2V0Y18KKyMgICAgZGVmaW5lIGd6Z2V0cyAgICAgICAgICAgICAgICB6X2d6Z2V0cworIyAgICBkZWZpbmUgZ3pvZmZzZXQgICAgICAgICAgICAgIHpfZ3pvZmZzZXQKKyMgICAgZGVmaW5lIGd6b2Zmc2V0NjQgICAgICAgICAgICB6X2d6b2Zmc2V0NjQKKyMgICAgZGVmaW5lIGd6b3BlbiAgICAgICAgICAgICAgICB6X2d6b3BlbgorIyAgICBkZWZpbmUgZ3pvcGVuNjQgICAgICAgICAgICAgIHpfZ3pvcGVuNjQKKyMgICAgaWZkZWYgX1dJTjMyCisjICAgICAgZGVmaW5lIGd6b3Blbl93ICAgICAgICAgICAgICB6X2d6b3Blbl93CisjICAgIGVuZGlmCisjICAgIGRlZmluZSBnenByaW50ZiAgICAgICAgICAgICAgel9nenByaW50ZgorIyAgICBkZWZpbmUgZ3p2cHJpbnRmICAgICAgICAgICAgIHpfZ3p2cHJpbnRmCisjICAgIGRlZmluZSBnenB1dGMgICAgICAgICAgICAgICAgel9nenB1dGMKKyMgICAgZGVmaW5lIGd6cHV0cyAgICAgICAgICAgICAgICB6X2d6cHV0cworIyAgICBkZWZpbmUgZ3pyZWFkICAgICAgICAgICAgICAgIHpfZ3pyZWFkCisjICAgIGRlZmluZSBnenJld2luZCAgICAgICAgICAgICAgel9nenJld2luZAorIyAgICBkZWZpbmUgZ3pzZWVrICAgICAgICAgICAgICAgIHpfZ3pzZWVrCisjICAgIGRlZmluZSBnenNlZWs2NCAgICAgICAgICAgICAgel9nenNlZWs2NAorIyAgICBkZWZpbmUgZ3pzZXRwYXJhbXMgICAgICAgICAgIHpfZ3pzZXRwYXJhbXMKKyMgICAgZGVmaW5lIGd6dGVsbCAgICAgICAgICAgICAgICB6X2d6dGVsbAorIyAgICBkZWZpbmUgZ3p0ZWxsNjQgICAgICAgICAgICAgIHpfZ3p0ZWxsNjQKKyMgICAgZGVmaW5lIGd6dW5nZXRjICAgICAgICAgICAgICB6X2d6dW5nZXRjCisjICAgIGRlZmluZSBnendyaXRlICAgICAgICAgICAgICAgel9nendyaXRlCisjICBlbmRpZgorIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKICMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjawogIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCi0jICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKLSMgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKLSMgIGRlZmluZSBjb21wcmVzc0JvdW5kICAgICAgICAgel9jb21wcmVzc0JvdW5kCi0jICBkZWZpbmUgdW5jb21wcmVzcyAgICAgICAgICAgIHpfdW5jb21wcmVzcwotIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKLSMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgotIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKKyMgIGRlZmluZSBpbmZsYXRlQmFja0luaXRfICAgICAgel9pbmZsYXRlQmFja0luaXRfCisjICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCisjICBkZWZpbmUgaW5mbGF0ZUdldEhlYWRlciAgICAgIHpfaW5mbGF0ZUdldEhlYWRlcgorIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8gICAgICAgICB6X2luZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlTWFyayAgICAgICAgICAgel9pbmZsYXRlTWFyaworIyAgZGVmaW5lIGluZmxhdGVQcmltZSAgICAgICAgICB6X2luZmxhdGVQcmltZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldCAgICAgICAgICB6X2luZmxhdGVSZXNldAorIyAgZGVmaW5lIGluZmxhdGVSZXNldDIgICAgICAgICB6X2luZmxhdGVSZXNldDIKKyMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSAgel9pbmZsYXRlU2V0RGljdGlvbmFyeQorIyAgZGVmaW5lIGluZmxhdGVHZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVHZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZVVuZGVybWluZSAgICAgIHpfaW5mbGF0ZVVuZGVybWluZQorIyAgZGVmaW5lIGluZmxhdGVSZXNldEtlZXAgICAgICB6X2luZmxhdGVSZXNldEtlZXAKKyMgIGRlZmluZSBpbmZsYXRlX2NvcHlyaWdodCAgICAgel9pbmZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGluZmxhdGVfZmFzdCAgICAgICAgICB6X2luZmxhdGVfZmFzdAorIyAgZGVmaW5lIGluZmxhdGVfdGFibGUgICAgICAgICB6X2luZmxhdGVfdGFibGUKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKKyMgIGVuZGlmCiAjICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSB6Y2FsbG9jICAgICAgICAgICAgICAgel96Y2FsbG9jCisjICAgIGRlZmluZSB6Y2ZyZWUgICAgICAgICAgICAgICAgel96Y2ZyZWUKKyMgIGVuZGlmCisjICBkZWZpbmUgemxpYkNvbXBpbGVGbGFncyAgICAgIHpfemxpYkNvbXBpbGVGbGFncworIyAgZGVmaW5lIHpsaWJWZXJzaW9uICAgICAgICAgICB6X3psaWJWZXJzaW9uCiAKLSMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCi0jICBkZWZpbmUgZnJlZV9mdW5jICAgICAgICAgICAgIHpfZnJlZV9mdW5jCi0jICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYwotIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCisvKiBhbGwgemxpYiB0eXBlZGVmcyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KICMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCi0jICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAotIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCiAjICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCiAjICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKKyMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGd6RmlsZSAgICAgICAgICAgICAgICB6X2d6RmlsZQorIyAgZW5kaWYKKyMgIGRlZmluZSBnel9oZWFkZXIgICAgICAgICAgICAgel9nel9oZWFkZXIKKyMgIGRlZmluZSBnel9oZWFkZXJwICAgICAgICAgICAgel9nel9oZWFkZXJwCisjICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYwogIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYworIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKICMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCiAjICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCi0jICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCiAjICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKKyMgIGRlZmluZSB2b2lkcGMgICAgICAgICAgICAgICAgel92b2lkcGMKKyMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKKworLyogYWxsIHpsaWIgc3RydWN0cyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KKyMgIGRlZmluZSBnel9oZWFkZXJfcyAgICAgICAgICAgel9nel9oZWFkZXJfcworIyAgZGVmaW5lIGludGVybmFsX3N0YXRlICAgICAgICB6X2ludGVybmFsX3N0YXRlCisKICNlbmRpZgogCiAjaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQpAQCAtMTI1LDYgKzIxOCwxMiBAQAogIyAgZW5kaWYKICNlbmRpZgogCisjaWYgZGVmaW5lZChaTElCX0NPTlNUKSAmJiAhZGVmaW5lZCh6X2NvbnN0KQorIyAgZGVmaW5lIHpfY29uc3QgY29uc3QKKyNlbHNlCisjICBkZWZpbmUgel9jb25zdAorI2VuZGlmCisKIC8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCiAjaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKICMgIGRlZmluZSBOT19EVU1NWV9ERUNMCkBAIC0xNzEsNiArMjcwLDE0IEBACiAjICBlbmRpZgogI2VuZGlmCiAKKyNpZm5kZWYgWl9BUkcgLyogZnVuY3Rpb24gcHJvdG90eXBlcyBmb3Igc3RkYXJnICovCisjICBpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQorIyAgICBkZWZpbmUgWl9BUkcoYXJncykgIGFyZ3MKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICAoKQorIyAgZW5kaWYKKyNlbmRpZgorCiAvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAogICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KICAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQpAQCAtMjg0LDQ5ICszOTEsMTIxIEBACiAgICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOwogI2VuZGlmCiAKLSNpZiAwICAgICAgICAgICAvKiBIQVZFX1VOSVNURF9IIC0tIHRoaXMgbGluZSBpcyB1cGRhdGVkIGJ5IC4vY29uZmlndXJlICovCi0jICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgLyogZm9yIFNFRUtfKiBhbmQgb2ZmX3QgKi8KLSMgIGlmZGVmIFZNUwotIyAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAvKiBmb3Igb2ZmX3QgKi8KKyNpZiAhZGVmaW5lZChaX1U0KSAmJiAhZGVmaW5lZChaX1NPTE8pICYmIGRlZmluZWQoU1REQykKKyMgIGluY2x1ZGUgPGxpbWl0cy5oPgorIyAgaWYgKFVJTlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKKyMgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQKKyMgIGVsaWYgKFVMT05HX01BWCA9PSAweGZmZmZmZmZmVUwpCisjICAgIGRlZmluZSBaX1U0IHVuc2lnbmVkIGxvbmcKKyMgIGVsaWYgKFVTSFJUX01BWCA9PSAweGZmZmZmZmZmVUwpCisjICAgIGRlZmluZSBaX1U0IHVuc2lnbmVkIHNob3J0CiAjICBlbmRpZgotIyAgZGVmaW5lIHpfb2ZmX3Qgb2ZmX3QKICNlbmRpZgotI2lmbmRlZiBTRUVLX1NFVAorCisjaWZkZWYgWl9VNAorICAgdHlwZWRlZiBaX1U0IHpfY3JjX3Q7CisjZWxzZQorICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIHpfY3JjX3Q7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVU5JU1REX0ggICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfSEFWRV9VTklTVERfSAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUREFSR19IICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KKyMgIGRlZmluZSBaX0hBVkVfU1REQVJHX0gKKyNlbmRpZgorCisjaWZkZWYgU1REQworIyAgaWZuZGVmIFpfU09MTworIyAgICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAvKiBmb3Igb2ZmX3QgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1REQykgfHwgZGVmaW5lZChaX0hBVkVfU1REQVJHX0gpCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGluY2x1ZGUgPHN0ZGFyZy5oPiAgICAgICAgIC8qIGZvciB2YV9saXN0ICovCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgaW5jbHVkZSA8c3RkZGVmLmg+ICAgICAgICAgLyogZm9yIHdjaGFyX3QgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogYSBsaXR0bGUgdHJpY2sgdG8gYWNjb21tb2RhdGUgYm90aCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQKKyAqICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMSIgYXMgcmVxdWVzdGluZyA2NC1iaXQgb3BlcmF0aW9ucywgKGV2ZW4KKyAqIHRob3VnaCB0aGUgZm9ybWVyIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIExGUyBkb2N1bWVudCksIGJ1dCBjb25zaWRlcmluZworICogYm90aCAiI3VuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDAiIGFzCisgKiBlcXVpdmFsZW50bHkgcmVxdWVzdGluZyBubyA2NC1iaXQgb3BlcmF0aW9ucworICovCisjaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiAtX0xBUkdFRklMRTY0X1NPVVJDRSAtIC0xID09IDEKKyMgIHVuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1dBVENPTUNfXykgJiYgIWRlZmluZWQoWl9IQVZFX1VOSVNURF9IKQorIyAgZGVmaW5lIFpfSEFWRV9VTklTVERfSAorI2VuZGlmCisjaWZuZGVmIFpfU09MTworIyAgaWYgZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpIHx8IGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkKKyMgICAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgICAgLyogZm9yIFNFRUtfKiwgb2ZmX3QsIGFuZCBfTEZTNjRfTEFSR0VGSUxFICovCisjICAgIGlmZGVmIFZNUworIyAgICAgIGluY2x1ZGUgPHVuaXhpby5oPiAgICAgICAvKiBmb3Igb2ZmX3QgKi8KKyMgICAgZW5kaWYKKyMgICAgaWZuZGVmIHpfb2ZmX3QKKyMgICAgICBkZWZpbmUgel9vZmZfdCBvZmZfdAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTEZTNjRfTEFSR0VGSUxFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKKyMgIGRlZmluZSBaX0xGUzY0CisjZW5kaWYKKworI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgZGVmaW5lZChaX0xGUzY0KQorIyAgZGVmaW5lIFpfTEFSR0U2NAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9GSUxFX09GRlNFVF9CSVRTKSAmJiBfRklMRV9PRkZTRVRfQklUUy0wID09IDY0ICYmIGRlZmluZWQoWl9MRlM2NCkKKyMgIGRlZmluZSBaX1dBTlQ2NAorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChTRUVLX1NFVCkgJiYgIWRlZmluZWQoWl9TT0xPKQogIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCiAjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLwogIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KICNlbmRpZgorCiAjaWZuZGVmIHpfb2ZmX3QKICMgIGRlZmluZSB6X29mZl90IGxvbmcKICNlbmRpZgogCi0jaWYgZGVmaW5lZChfX09TNDAwX18pCi0jICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19NVlNfXykKLSMgIGRlZmluZSBOT192c25wcmludGYKLSMgIGlmZGVmIEZBUgotIyAgICB1bmRlZiBGQVIKKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoWl9MQVJHRTY0KQorIyAgZGVmaW5lIHpfb2ZmNjRfdCBvZmY2NF90CisjZWxzZQorIyAgaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChaX1NPTE8pCisjICAgIGRlZmluZSB6X29mZjY0X3QgX19pbnQ2NAorIyAgZWxzZQorIyAgICBkZWZpbmUgel9vZmY2NF90IHpfb2ZmX3QKICMgIGVuZGlmCiAjZW5kaWYKIAogLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KICNpZiBkZWZpbmVkKF9fTVZTX18pCi0jICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlSW5pdF8sIklOSU4iKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVN5bmMsIklOU1kiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCi0jICAgcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX3RhYmxlLCJJTlRBQkwiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQorICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQorICAjcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQogI2VuZGlmCiAKICNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvemNvbmYuaC5jbWFrZWluIGIvTW9kdWxlcy96bGliL3pjb25mLmguY21ha2VpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDMwMTljCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy96bGliL3pjb25mLmguY21ha2VpbgpAQCAtMCwwICsxLDUxMyBAQAorLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworLyogQCgjKSAkSWQkICovCisKKyNpZm5kZWYgWkNPTkZfSAorI2RlZmluZSBaQ09ORl9ICisjY21ha2VkZWZpbmUgWl9QUkVGSVgKKyNjbWFrZWRlZmluZSBaX0hBVkVfVU5JU1REX0gKKworLyoKKyAqIElmIHlvdSAqcmVhbGx5KiBuZWVkIGEgdW5pcXVlIHByZWZpeCBmb3IgYWxsIHR5cGVzIGFuZCBsaWJyYXJ5IGZ1bmN0aW9ucywKKyAqIGNvbXBpbGUgd2l0aCAtRFpfUFJFRklYLiBUaGUgInN0YW5kYXJkIiB6bGliIHNob3VsZCBiZSBjb21waWxlZCB3aXRob3V0IGl0LgorICogRXZlbiBiZXR0ZXIgdGhhbiBjb21waWxpbmcgd2l0aCAtRFpfUFJFRklYIHdvdWxkIGJlIHRvIHVzZSBjb25maWd1cmUgdG8gc2V0CisgKiB0aGlzIHBlcm1hbmVudGx5IGluIHpjb25mLmggdXNpbmcgIi4vY29uZmlndXJlIC0tenByZWZpeCIuCisgKi8KKyNpZmRlZiBaX1BSRUZJWCAgICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfUFJFRklYX1NFVAorCisvKiBhbGwgbGlua2VkIHN5bWJvbHMgKi8KKyMgIGRlZmluZSBfZGlzdF9jb2RlICAgICAgICAgICAgel9fZGlzdF9jb2RlCisjICBkZWZpbmUgX2xlbmd0aF9jb2RlICAgICAgICAgIHpfX2xlbmd0aF9jb2RlCisjICBkZWZpbmUgX3RyX2FsaWduICAgICAgICAgICAgIHpfX3RyX2FsaWduCisjICBkZWZpbmUgX3RyX2ZsdXNoX2JpdHMgICAgICAgIHpfX3RyX2ZsdXNoX2JpdHMKKyMgIGRlZmluZSBfdHJfZmx1c2hfYmxvY2sgICAgICAgel9fdHJfZmx1c2hfYmxvY2sKKyMgIGRlZmluZSBfdHJfaW5pdCAgICAgICAgICAgICAgel9fdHJfaW5pdAorIyAgZGVmaW5lIF90cl9zdG9yZWRfYmxvY2sgICAgICB6X190cl9zdG9yZWRfYmxvY2sKKyMgIGRlZmluZSBfdHJfdGFsbHkgICAgICAgICAgICAgel9fdHJfdGFsbHkKKyMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lICAgICAgIHpfYWRsZXIzMl9jb21iaW5lCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lNjQgICAgIHpfYWRsZXIzMl9jb21iaW5lNjQKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCisjICAgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKKyMgICAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKKyMgIGVuZGlmCisjICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKKyMgIGRlZmluZSBjcmMzMl9jb21iaW5lICAgICAgICAgel9jcmMzMl9jb21iaW5lCisjICBkZWZpbmUgY3JjMzJfY29tYmluZTY0ICAgICAgIHpfY3JjMzJfY29tYmluZTY0CisjICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQorIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAorIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5CisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgZGVmbGF0ZVBlbmRpbmcgICAgICAgIHpfZGVmbGF0ZVBlbmRpbmcKKyMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXRLZWVwICAgICAgel9kZWZsYXRlUmVzZXRLZWVwCisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgIHpfZGVmbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBkZWZsYXRlU2V0SGVhZGVyICAgICAgel9kZWZsYXRlU2V0SGVhZGVyCisjICBkZWZpbmUgZGVmbGF0ZVR1bmUgICAgICAgICAgIHpfZGVmbGF0ZVR1bmUKKyMgIGRlZmluZSBkZWZsYXRlX2NvcHlyaWdodCAgICAgel9kZWZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGd6X2Vycm9yICAgICAgICAgICAgICB6X2d6X2Vycm9yCisjICAgIGRlZmluZSBnel9pbnRtYXggICAgICAgICAgICAgel9nel9pbnRtYXgKKyMgICAgZGVmaW5lIGd6X3N0cndpbmVycm9yICAgICAgICB6X2d6X3N0cndpbmVycm9yCisjICAgIGRlZmluZSBnemJ1ZmZlciAgICAgICAgICAgICAgel9nemJ1ZmZlcgorIyAgICBkZWZpbmUgZ3pjbGVhcmVyciAgICAgICAgICAgIHpfZ3pjbGVhcmVycgorIyAgICBkZWZpbmUgZ3pjbG9zZSAgICAgICAgICAgICAgIHpfZ3pjbG9zZQorIyAgICBkZWZpbmUgZ3pjbG9zZV9yICAgICAgICAgICAgIHpfZ3pjbG9zZV9yCisjICAgIGRlZmluZSBnemNsb3NlX3cgICAgICAgICAgICAgel9nemNsb3NlX3cKKyMgICAgZGVmaW5lIGd6ZGlyZWN0ICAgICAgICAgICAgICB6X2d6ZGlyZWN0CisjICAgIGRlZmluZSBnemRvcGVuICAgICAgICAgICAgICAgel9nemRvcGVuCisjICAgIGRlZmluZSBnemVvZiAgICAgICAgICAgICAgICAgel9nemVvZgorIyAgICBkZWZpbmUgZ3plcnJvciAgICAgICAgICAgICAgIHpfZ3plcnJvcgorIyAgICBkZWZpbmUgZ3pmbHVzaCAgICAgICAgICAgICAgIHpfZ3pmbHVzaAorIyAgICBkZWZpbmUgZ3pnZXRjICAgICAgICAgICAgICAgIHpfZ3pnZXRjCisjICAgIGRlZmluZSBnemdldGNfICAgICAgICAgICAgICAgel9nemdldGNfCisjICAgIGRlZmluZSBnemdldHMgICAgICAgICAgICAgICAgel9nemdldHMKKyMgICAgZGVmaW5lIGd6b2Zmc2V0ICAgICAgICAgICAgICB6X2d6b2Zmc2V0CisjICAgIGRlZmluZSBnem9mZnNldDY0ICAgICAgICAgICAgel9nem9mZnNldDY0CisjICAgIGRlZmluZSBnem9wZW4gICAgICAgICAgICAgICAgel9nem9wZW4KKyMgICAgZGVmaW5lIGd6b3BlbjY0ICAgICAgICAgICAgICB6X2d6b3BlbjY0CisjICAgIGlmZGVmIF9XSU4zMgorIyAgICAgIGRlZmluZSBnem9wZW5fdyAgICAgICAgICAgICAgel9nem9wZW5fdworIyAgICBlbmRpZgorIyAgICBkZWZpbmUgZ3pwcmludGYgICAgICAgICAgICAgIHpfZ3pwcmludGYKKyMgICAgZGVmaW5lIGd6dnByaW50ZiAgICAgICAgICAgICB6X2d6dnByaW50ZgorIyAgICBkZWZpbmUgZ3pwdXRjICAgICAgICAgICAgICAgIHpfZ3pwdXRjCisjICAgIGRlZmluZSBnenB1dHMgICAgICAgICAgICAgICAgel9nenB1dHMKKyMgICAgZGVmaW5lIGd6cmVhZCAgICAgICAgICAgICAgICB6X2d6cmVhZAorIyAgICBkZWZpbmUgZ3pyZXdpbmQgICAgICAgICAgICAgIHpfZ3pyZXdpbmQKKyMgICAgZGVmaW5lIGd6c2VlayAgICAgICAgICAgICAgICB6X2d6c2VlaworIyAgICBkZWZpbmUgZ3pzZWVrNjQgICAgICAgICAgICAgIHpfZ3pzZWVrNjQKKyMgICAgZGVmaW5lIGd6c2V0cGFyYW1zICAgICAgICAgICB6X2d6c2V0cGFyYW1zCisjICAgIGRlZmluZSBnenRlbGwgICAgICAgICAgICAgICAgel9nenRlbGwKKyMgICAgZGVmaW5lIGd6dGVsbDY0ICAgICAgICAgICAgICB6X2d6dGVsbDY0CisjICAgIGRlZmluZSBnenVuZ2V0YyAgICAgICAgICAgICAgel9nenVuZ2V0YworIyAgICBkZWZpbmUgZ3p3cml0ZSAgICAgICAgICAgICAgIHpfZ3p3cml0ZQorIyAgZW5kaWYKKyMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCisjICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKKyMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAorIyAgZGVmaW5lIGluZmxhdGVCYWNrSW5pdF8gICAgICB6X2luZmxhdGVCYWNrSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQorIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICB6X2luZmxhdGVFbmQKKyMgIGRlZmluZSBpbmZsYXRlR2V0SGVhZGVyICAgICAgel9pbmZsYXRlR2V0SGVhZGVyCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXworIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XworIyAgZGVmaW5lIGluZmxhdGVNYXJrICAgICAgICAgICB6X2luZmxhdGVNYXJrCisjICBkZWZpbmUgaW5mbGF0ZVByaW1lICAgICAgICAgIHpfaW5mbGF0ZVByaW1lCisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0CisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0MiAgICAgICAgIHpfaW5mbGF0ZVJlc2V0MgorIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZUdldERpY3Rpb25hcnkgIHpfaW5mbGF0ZUdldERpY3Rpb25hcnkKKyMgIGRlZmluZSBpbmZsYXRlU3luYyAgICAgICAgICAgel9pbmZsYXRlU3luYworIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgICAgICB6X2luZmxhdGVTeW5jUG9pbnQKKyMgIGRlZmluZSBpbmZsYXRlVW5kZXJtaW5lICAgICAgel9pbmZsYXRlVW5kZXJtaW5lCisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0S2VlcCAgICAgIHpfaW5mbGF0ZVJlc2V0S2VlcAorIyAgZGVmaW5lIGluZmxhdGVfY29weXJpZ2h0ICAgICB6X2luZmxhdGVfY29weXJpZ2h0CisjICBkZWZpbmUgaW5mbGF0ZV9mYXN0ICAgICAgICAgIHpfaW5mbGF0ZV9mYXN0CisjICBkZWZpbmUgaW5mbGF0ZV90YWJsZSAgICAgICAgIHpfaW5mbGF0ZV90YWJsZQorIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgdW5jb21wcmVzcyAgICAgICAgICAgIHpfdW5jb21wcmVzcworIyAgZW5kaWYKKyMgIGRlZmluZSB6RXJyb3IgICAgICAgICAgICAgICAgel96RXJyb3IKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIHpjYWxsb2MgICAgICAgICAgICAgICB6X3pjYWxsb2MKKyMgICAgZGVmaW5lIHpjZnJlZSAgICAgICAgICAgICAgICB6X3pjZnJlZQorIyAgZW5kaWYKKyMgIGRlZmluZSB6bGliQ29tcGlsZUZsYWdzICAgICAgel96bGliQ29tcGlsZUZsYWdzCisjICBkZWZpbmUgemxpYlZlcnNpb24gICAgICAgICAgIHpfemxpYlZlcnNpb24KKworLyogYWxsIHpsaWIgdHlwZWRlZnMgaW4gemxpYi5oIGFuZCB6Y29uZi5oICovCisjICBkZWZpbmUgQnl0ZSAgICAgICAgICAgICAgICAgIHpfQnl0ZQorIyAgZGVmaW5lIEJ5dGVmICAgICAgICAgICAgICAgICB6X0J5dGVmCisjICBkZWZpbmUgYWxsb2NfZnVuYyAgICAgICAgICAgIHpfYWxsb2NfZnVuYworIyAgZGVmaW5lIGNoYXJmICAgICAgICAgICAgICAgICB6X2NoYXJmCisjICBkZWZpbmUgZnJlZV9mdW5jICAgICAgICAgICAgIHpfZnJlZV9mdW5jCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSBnekZpbGUgICAgICAgICAgICAgICAgel9nekZpbGUKKyMgIGVuZGlmCisjICBkZWZpbmUgZ3pfaGVhZGVyICAgICAgICAgICAgIHpfZ3pfaGVhZGVyCisjICBkZWZpbmUgZ3pfaGVhZGVycCAgICAgICAgICAgIHpfZ3pfaGVhZGVycAorIyAgZGVmaW5lIGluX2Z1bmMgICAgICAgICAgICAgICB6X2luX2Z1bmMKKyMgIGRlZmluZSBpbnRmICAgICAgICAgICAgICAgICAgel9pbnRmCisjICBkZWZpbmUgb3V0X2Z1bmMgICAgICAgICAgICAgIHpfb3V0X2Z1bmMKKyMgIGRlZmluZSB1SW50ICAgICAgICAgICAgICAgICAgel91SW50CisjICBkZWZpbmUgdUludGYgICAgICAgICAgICAgICAgIHpfdUludGYKKyMgIGRlZmluZSB1TG9uZyAgICAgICAgICAgICAgICAgel91TG9uZworIyAgZGVmaW5lIHVMb25nZiAgICAgICAgICAgICAgICB6X3VMb25nZgorIyAgZGVmaW5lIHZvaWRwICAgICAgICAgICAgICAgICB6X3ZvaWRwCisjICBkZWZpbmUgdm9pZHBjICAgICAgICAgICAgICAgIHpfdm9pZHBjCisjICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCisKKy8qIGFsbCB6bGliIHN0cnVjdHMgaW4gemxpYi5oIGFuZCB6Y29uZi5oICovCisjICBkZWZpbmUgZ3pfaGVhZGVyX3MgICAgICAgICAgIHpfZ3pfaGVhZGVyX3MKKyMgIGRlZmluZSBpbnRlcm5hbF9zdGF0ZSAgICAgICAgel9pbnRlcm5hbF9zdGF0ZQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisjaWYgKGRlZmluZWQoT1NfMikgfHwgZGVmaW5lZChfX09TMl9fKSkgJiYgIWRlZmluZWQoT1MyKQorIyAgZGVmaW5lIE9TMgorI2VuZGlmCisjaWYgZGVmaW5lZChfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKKyMgIGRlZmluZSBXSU5ET1dTCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgIGlmbmRlZiBXSU4zMgorIyAgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQorIyAgICBpZm5kZWYgU1lTMTZCSVQKKyMgICAgICBkZWZpbmUgU1lTMTZCSVQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGlmbmRlZiBTVERDOTkKKyMgICAgICBkZWZpbmUgU1REQzk5CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLworIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFpMSUJfQ09OU1QpICYmICFkZWZpbmVkKHpfY29uc3QpCisjICBkZWZpbmUgel9jb25zdCBjb25zdAorI2Vsc2UKKyMgIGRlZmluZSB6X2NvbnN0CisjZW5kaWYKKworLyogU29tZSBNYWMgY29tcGlsZXJzIG1lcmdlIGFsbCAuaCBmaWxlcyBpbmNvcnJlY3RseTogKi8KKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pfHxkZWZpbmVkKGFwcGxlYyl8fGRlZmluZWQoVEhJTktfQyl8fGRlZmluZWQoX19TQ19fKQorIyAgZGVmaW5lIE5PX0RVTU1ZX0RFQ0wKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi8KKyNpZm5kZWYgTUFYX01FTV9MRVZFTAorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA4CisjICBlbHNlCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3Igd2luZG93Qml0cyBpbiBkZWZsYXRlSW5pdDIgYW5kIGluZmxhdGVJbml0Mi4KKyAqIFdBUk5JTkc6IHJlZHVjaW5nIE1BWF9XQklUUyBtYWtlcyBtaW5pZ3ppcCB1bmFibGUgdG8gZXh0cmFjdCAuZ3ogZmlsZXMKKyAqIGNyZWF0ZWQgYnkgZ3ppcC4gKEZpbGVzIGNyZWF0ZWQgYnkgbWluaWd6aXAgY2FuIHN0aWxsIGJlIGV4dHJhY3RlZCBieQorICogZ3ppcC4pCisgKi8KKyNpZm5kZWYgTUFYX1dCSVRTCisjICBkZWZpbmUgTUFYX1dCSVRTICAgMTUgLyogMzJLIExaNzcgd2luZG93ICovCisjZW5kaWYKKworLyogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6CisgICAgICAgICAgICAoMSA8PCAod2luZG93Qml0cysyKSkgKyAgKDEgPDwgKG1lbUxldmVsKzkpKQorIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHM9MTUgICsgIDEyOEsgZm9yIG1lbUxldmVsID0gOCAgKGRlZmF1bHQgdmFsdWVzKQorIHBsdXMgYSBmZXcga2lsb2J5dGVzIGZvciBzbWFsbCBvYmplY3RzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gcmVkdWNlCisgdGhlIGRlZmF1bHQgbWVtb3J5IHJlcXVpcmVtZW50cyBmcm9tIDI1NksgdG8gMTI4SywgY29tcGlsZSB3aXRoCisgICAgIG1ha2UgQ0ZMQUdTPSItTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NyIKKyBPZiBjb3Vyc2UgdGhpcyB3aWxsIGdlbmVyYWxseSBkZWdyYWRlIGNvbXByZXNzaW9uICh0aGVyZSdzIG5vIGZyZWUgbHVuY2gpLgorCisgICBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgaW5mbGF0ZSBhcmUgKGluIGJ5dGVzKSAxIDw8IHdpbmRvd0JpdHMKKyB0aGF0IGlzLCAzMksgZm9yIHdpbmRvd0JpdHM9MTUgKGRlZmF1bHQgdmFsdWUpIHBsdXMgYSBmZXcga2lsb2J5dGVzCisgZm9yIHNtYWxsIG9iamVjdHMuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIE9GIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyMgIGlmZGVmIFNUREMKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBPRihhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaX0FSRyAvKiBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBzdGRhcmcgKi8KKyMgIGlmIGRlZmluZWQoU1REQykgfHwgZGVmaW5lZChaX0hBVkVfU1REQVJHX0gpCisjICAgIGRlZmluZSBaX0FSRyhhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgWl9BUkcoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCisgICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisgICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQorICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgorICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgorICAgICovCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKKyMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAorICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgorICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfV0lOQVBJCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLworICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLworIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVAorIyAgZGVmaW5lIFpFWFBPUlQKKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUVkEKKyMgIGRlZmluZSBaRVhQT1JUVkEKKyNlbmRpZgorCisjaWZuZGVmIEZBUgorIyAgZGVmaW5lIEZBUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX01BQ1RZUEVTX18pCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KKworI2lmZGVmIFNNQUxMX01FRElVTQorICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KKyMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgorI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOworI2VuZGlmCit0eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKK3R5cGVkZWYgaW50ICAgRkFSIGludGY7Cit0eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKK3R5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKKworI2lmZGVmIFNUREMKKyAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiB2b2lkIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICAgKnZvaWRwOworI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiBCeXRlIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChaX1U0KSAmJiAhZGVmaW5lZChaX1NPTE8pICYmIGRlZmluZWQoU1REQykKKyMgIGluY2x1ZGUgPGxpbWl0cy5oPgorIyAgaWYgKFVJTlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKKyMgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQKKyMgIGVsaWYgKFVMT05HX01BWCA9PSAweGZmZmZmZmZmVUwpCisjICAgIGRlZmluZSBaX1U0IHVuc2lnbmVkIGxvbmcKKyMgIGVsaWYgKFVTSFJUX01BWCA9PSAweGZmZmZmZmZmVUwpCisjICAgIGRlZmluZSBaX1U0IHVuc2lnbmVkIHNob3J0CisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBaX1U0CisgICB0eXBlZGVmIFpfVTQgel9jcmNfdDsKKyNlbHNlCisgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgel9jcmNfdDsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSCAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCisjICBkZWZpbmUgWl9IQVZFX1VOSVNURF9ICisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1REQVJHX0ggICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfSEFWRV9TVERBUkdfSAorI2VuZGlmCisKKyNpZmRlZiBTVERDCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAgIC8qIGZvciBvZmZfdCAqLworIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgaW5jbHVkZSA8c3RkYXJnLmg+ICAgICAgICAgLyogZm9yIHZhX2xpc3QgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorIyAgaWZuZGVmIFpfU09MTworIyAgICBpbmNsdWRlIDxzdGRkZWYuaD4gICAgICAgICAvKiBmb3Igd2NoYXJfdCAqLworIyAgZW5kaWYKKyNlbmRpZgorCisvKiBhIGxpdHRsZSB0cmljayB0byBhY2NvbW1vZGF0ZSBib3RoICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZAorICogIiNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSAxIiBhcyByZXF1ZXN0aW5nIDY0LWJpdCBvcGVyYXRpb25zLCAoZXZlbgorICogdGhvdWdoIHRoZSBmb3JtZXIgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgTEZTIGRvY3VtZW50KSwgYnV0IGNvbnNpZGVyaW5nCisgKiBib3RoICIjdW5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRSIgYW5kICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMCIgYXMKKyAqIGVxdWl2YWxlbnRseSByZXF1ZXN0aW5nIG5vIDY0LWJpdCBvcGVyYXRpb25zCisgKi8KKyNpZiBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpICYmIC1fTEFSR0VGSUxFNjRfU09VUkNFIC0gLTEgPT0gMQorIyAgdW5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKSAmJiAhZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpCisjICBkZWZpbmUgWl9IQVZFX1VOSVNURF9ICisjZW5kaWYKKyNpZm5kZWYgWl9TT0xPCisjICBpZiBkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkgfHwgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKQorIyAgICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgICAvKiBmb3IgU0VFS18qLCBvZmZfdCwgYW5kIF9MRlM2NF9MQVJHRUZJTEUgKi8KKyMgICAgaWZkZWYgVk1TCisjICAgICAgaW5jbHVkZSA8dW5peGlvLmg+ICAgICAgIC8qIGZvciBvZmZfdCAqLworIyAgICBlbmRpZgorIyAgICBpZm5kZWYgel9vZmZfdAorIyAgICAgIGRlZmluZSB6X29mZl90IG9mZl90CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MRlM2NF9MQVJHRUZJTEUpICYmIF9MRlM2NF9MQVJHRUZJTEUtMAorIyAgZGVmaW5lIFpfTEZTNjQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiBkZWZpbmVkKFpfTEZTNjQpCisjICBkZWZpbmUgWl9MQVJHRTY0CisjZW5kaWYKKworI2lmIGRlZmluZWQoX0ZJTEVfT0ZGU0VUX0JJVFMpICYmIF9GSUxFX09GRlNFVF9CSVRTLTAgPT0gNjQgJiYgZGVmaW5lZChaX0xGUzY0KQorIyAgZGVmaW5lIFpfV0FOVDY0CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNFRUtfU0VUKSAmJiAhZGVmaW5lZChaX1NPTE8pCisjICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLworI2VuZGlmCisKKyNpZm5kZWYgel9vZmZfdAorIyAgZGVmaW5lIHpfb2ZmX3QgbG9uZworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoWl9MQVJHRTY0KQorIyAgZGVmaW5lIHpfb2ZmNjRfdCBvZmY2NF90CisjZWxzZQorIyAgaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChaX1NPTE8pCisjICAgIGRlZmluZSB6X29mZjY0X3QgX19pbnQ2NAorIyAgZWxzZQorIyAgICBkZWZpbmUgel9vZmY2NF90IHpfb2ZmX3QKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisgICNwcmFnbWEgbWFwKGRlZmxhdGVJbml0XywiREVJTiIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorICAjcHJhZ21hIG1hcChkZWZsYXRlQm91bmQsIkRFQk5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlRW5kLCJJTkVORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisgICNwcmFnbWEgbWFwKGNvbXByZXNzQm91bmQsIkNNQk5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV90YWJsZSwiSU5UQUJMIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCisjZW5kaWYKKworI2VuZGlmIC8qIFpDT05GX0ggKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi96Y29uZi5oLmluIGIvTW9kdWxlcy96bGliL3pjb25mLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4N2E3NwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvemxpYi96Y29uZi5oLmluCkBAIC0wLDAgKzEsNTExIEBACisvKiB6Y29uZi5oIC0tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2lmbmRlZiBaQ09ORl9ICisjZGVmaW5lIFpDT05GX0gKKworLyoKKyAqIElmIHlvdSAqcmVhbGx5KiBuZWVkIGEgdW5pcXVlIHByZWZpeCBmb3IgYWxsIHR5cGVzIGFuZCBsaWJyYXJ5IGZ1bmN0aW9ucywKKyAqIGNvbXBpbGUgd2l0aCAtRFpfUFJFRklYLiBUaGUgInN0YW5kYXJkIiB6bGliIHNob3VsZCBiZSBjb21waWxlZCB3aXRob3V0IGl0LgorICogRXZlbiBiZXR0ZXIgdGhhbiBjb21waWxpbmcgd2l0aCAtRFpfUFJFRklYIHdvdWxkIGJlIHRvIHVzZSBjb25maWd1cmUgdG8gc2V0CisgKiB0aGlzIHBlcm1hbmVudGx5IGluIHpjb25mLmggdXNpbmcgIi4vY29uZmlndXJlIC0tenByZWZpeCIuCisgKi8KKyNpZmRlZiBaX1BSRUZJWCAgICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfUFJFRklYX1NFVAorCisvKiBhbGwgbGlua2VkIHN5bWJvbHMgKi8KKyMgIGRlZmluZSBfZGlzdF9jb2RlICAgICAgICAgICAgel9fZGlzdF9jb2RlCisjICBkZWZpbmUgX2xlbmd0aF9jb2RlICAgICAgICAgIHpfX2xlbmd0aF9jb2RlCisjICBkZWZpbmUgX3RyX2FsaWduICAgICAgICAgICAgIHpfX3RyX2FsaWduCisjICBkZWZpbmUgX3RyX2ZsdXNoX2JpdHMgICAgICAgIHpfX3RyX2ZsdXNoX2JpdHMKKyMgIGRlZmluZSBfdHJfZmx1c2hfYmxvY2sgICAgICAgel9fdHJfZmx1c2hfYmxvY2sKKyMgIGRlZmluZSBfdHJfaW5pdCAgICAgICAgICAgICAgel9fdHJfaW5pdAorIyAgZGVmaW5lIF90cl9zdG9yZWRfYmxvY2sgICAgICB6X190cl9zdG9yZWRfYmxvY2sKKyMgIGRlZmluZSBfdHJfdGFsbHkgICAgICAgICAgICAgel9fdHJfdGFsbHkKKyMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lICAgICAgIHpfYWRsZXIzMl9jb21iaW5lCisjICBkZWZpbmUgYWRsZXIzMl9jb21iaW5lNjQgICAgIHpfYWRsZXIzMl9jb21iaW5lNjQKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCisjICAgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKKyMgICAgZGVmaW5lIGNvbXByZXNzQm91bmQgICAgICAgICB6X2NvbXByZXNzQm91bmQKKyMgIGVuZGlmCisjICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKKyMgIGRlZmluZSBjcmMzMl9jb21iaW5lICAgICAgICAgel9jcmMzMl9jb21iaW5lCisjICBkZWZpbmUgY3JjMzJfY29tYmluZTY0ICAgICAgIHpfY3JjMzJfY29tYmluZTY0CisjICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQorIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAorIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5CisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgZGVmbGF0ZVBlbmRpbmcgICAgICAgIHpfZGVmbGF0ZVBlbmRpbmcKKyMgIGRlZmluZSBkZWZsYXRlUHJpbWUgICAgICAgICAgel9kZWZsYXRlUHJpbWUKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXRLZWVwICAgICAgel9kZWZsYXRlUmVzZXRLZWVwCisjICBkZWZpbmUgZGVmbGF0ZVNldERpY3Rpb25hcnkgIHpfZGVmbGF0ZVNldERpY3Rpb25hcnkKKyMgIGRlZmluZSBkZWZsYXRlU2V0SGVhZGVyICAgICAgel9kZWZsYXRlU2V0SGVhZGVyCisjICBkZWZpbmUgZGVmbGF0ZVR1bmUgICAgICAgICAgIHpfZGVmbGF0ZVR1bmUKKyMgIGRlZmluZSBkZWZsYXRlX2NvcHlyaWdodCAgICAgel9kZWZsYXRlX2NvcHlyaWdodAorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIGd6X2Vycm9yICAgICAgICAgICAgICB6X2d6X2Vycm9yCisjICAgIGRlZmluZSBnel9pbnRtYXggICAgICAgICAgICAgel9nel9pbnRtYXgKKyMgICAgZGVmaW5lIGd6X3N0cndpbmVycm9yICAgICAgICB6X2d6X3N0cndpbmVycm9yCisjICAgIGRlZmluZSBnemJ1ZmZlciAgICAgICAgICAgICAgel9nemJ1ZmZlcgorIyAgICBkZWZpbmUgZ3pjbGVhcmVyciAgICAgICAgICAgIHpfZ3pjbGVhcmVycgorIyAgICBkZWZpbmUgZ3pjbG9zZSAgICAgICAgICAgICAgIHpfZ3pjbG9zZQorIyAgICBkZWZpbmUgZ3pjbG9zZV9yICAgICAgICAgICAgIHpfZ3pjbG9zZV9yCisjICAgIGRlZmluZSBnemNsb3NlX3cgICAgICAgICAgICAgel9nemNsb3NlX3cKKyMgICAgZGVmaW5lIGd6ZGlyZWN0ICAgICAgICAgICAgICB6X2d6ZGlyZWN0CisjICAgIGRlZmluZSBnemRvcGVuICAgICAgICAgICAgICAgel9nemRvcGVuCisjICAgIGRlZmluZSBnemVvZiAgICAgICAgICAgICAgICAgel9nemVvZgorIyAgICBkZWZpbmUgZ3plcnJvciAgICAgICAgICAgICAgIHpfZ3plcnJvcgorIyAgICBkZWZpbmUgZ3pmbHVzaCAgICAgICAgICAgICAgIHpfZ3pmbHVzaAorIyAgICBkZWZpbmUgZ3pnZXRjICAgICAgICAgICAgICAgIHpfZ3pnZXRjCisjICAgIGRlZmluZSBnemdldGNfICAgICAgICAgICAgICAgel9nemdldGNfCisjICAgIGRlZmluZSBnemdldHMgICAgICAgICAgICAgICAgel9nemdldHMKKyMgICAgZGVmaW5lIGd6b2Zmc2V0ICAgICAgICAgICAgICB6X2d6b2Zmc2V0CisjICAgIGRlZmluZSBnem9mZnNldDY0ICAgICAgICAgICAgel9nem9mZnNldDY0CisjICAgIGRlZmluZSBnem9wZW4gICAgICAgICAgICAgICAgel9nem9wZW4KKyMgICAgZGVmaW5lIGd6b3BlbjY0ICAgICAgICAgICAgICB6X2d6b3BlbjY0CisjICAgIGlmZGVmIF9XSU4zMgorIyAgICAgIGRlZmluZSBnem9wZW5fdyAgICAgICAgICAgICAgel9nem9wZW5fdworIyAgICBlbmRpZgorIyAgICBkZWZpbmUgZ3pwcmludGYgICAgICAgICAgICAgIHpfZ3pwcmludGYKKyMgICAgZGVmaW5lIGd6dnByaW50ZiAgICAgICAgICAgICB6X2d6dnByaW50ZgorIyAgICBkZWZpbmUgZ3pwdXRjICAgICAgICAgICAgICAgIHpfZ3pwdXRjCisjICAgIGRlZmluZSBnenB1dHMgICAgICAgICAgICAgICAgel9nenB1dHMKKyMgICAgZGVmaW5lIGd6cmVhZCAgICAgICAgICAgICAgICB6X2d6cmVhZAorIyAgICBkZWZpbmUgZ3pyZXdpbmQgICAgICAgICAgICAgIHpfZ3pyZXdpbmQKKyMgICAgZGVmaW5lIGd6c2VlayAgICAgICAgICAgICAgICB6X2d6c2VlaworIyAgICBkZWZpbmUgZ3pzZWVrNjQgICAgICAgICAgICAgIHpfZ3pzZWVrNjQKKyMgICAgZGVmaW5lIGd6c2V0cGFyYW1zICAgICAgICAgICB6X2d6c2V0cGFyYW1zCisjICAgIGRlZmluZSBnenRlbGwgICAgICAgICAgICAgICAgel9nenRlbGwKKyMgICAgZGVmaW5lIGd6dGVsbDY0ICAgICAgICAgICAgICB6X2d6dGVsbDY0CisjICAgIGRlZmluZSBnenVuZ2V0YyAgICAgICAgICAgICAgel9nenVuZ2V0YworIyAgICBkZWZpbmUgZ3p3cml0ZSAgICAgICAgICAgICAgIHpfZ3p3cml0ZQorIyAgZW5kaWYKKyMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCisjICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKKyMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAorIyAgZGVmaW5lIGluZmxhdGVCYWNrSW5pdF8gICAgICB6X2luZmxhdGVCYWNrSW5pdF8KKyMgIGRlZmluZSBpbmZsYXRlQ29weSAgICAgICAgICAgel9pbmZsYXRlQ29weQorIyAgZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICB6X2luZmxhdGVFbmQKKyMgIGRlZmluZSBpbmZsYXRlR2V0SGVhZGVyICAgICAgel9pbmZsYXRlR2V0SGVhZGVyCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXworIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XworIyAgZGVmaW5lIGluZmxhdGVNYXJrICAgICAgICAgICB6X2luZmxhdGVNYXJrCisjICBkZWZpbmUgaW5mbGF0ZVByaW1lICAgICAgICAgIHpfaW5mbGF0ZVByaW1lCisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0CisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0MiAgICAgICAgIHpfaW5mbGF0ZVJlc2V0MgorIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZUdldERpY3Rpb25hcnkgIHpfaW5mbGF0ZUdldERpY3Rpb25hcnkKKyMgIGRlZmluZSBpbmZsYXRlU3luYyAgICAgICAgICAgel9pbmZsYXRlU3luYworIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgICAgICB6X2luZmxhdGVTeW5jUG9pbnQKKyMgIGRlZmluZSBpbmZsYXRlVW5kZXJtaW5lICAgICAgel9pbmZsYXRlVW5kZXJtaW5lCisjICBkZWZpbmUgaW5mbGF0ZVJlc2V0S2VlcCAgICAgIHpfaW5mbGF0ZVJlc2V0S2VlcAorIyAgZGVmaW5lIGluZmxhdGVfY29weXJpZ2h0ICAgICB6X2luZmxhdGVfY29weXJpZ2h0CisjICBkZWZpbmUgaW5mbGF0ZV9mYXN0ICAgICAgICAgIHpfaW5mbGF0ZV9mYXN0CisjICBkZWZpbmUgaW5mbGF0ZV90YWJsZSAgICAgICAgIHpfaW5mbGF0ZV90YWJsZQorIyAgaWZuZGVmIFpfU09MTworIyAgICBkZWZpbmUgdW5jb21wcmVzcyAgICAgICAgICAgIHpfdW5jb21wcmVzcworIyAgZW5kaWYKKyMgIGRlZmluZSB6RXJyb3IgICAgICAgICAgICAgICAgel96RXJyb3IKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgZGVmaW5lIHpjYWxsb2MgICAgICAgICAgICAgICB6X3pjYWxsb2MKKyMgICAgZGVmaW5lIHpjZnJlZSAgICAgICAgICAgICAgICB6X3pjZnJlZQorIyAgZW5kaWYKKyMgIGRlZmluZSB6bGliQ29tcGlsZUZsYWdzICAgICAgel96bGliQ29tcGlsZUZsYWdzCisjICBkZWZpbmUgemxpYlZlcnNpb24gICAgICAgICAgIHpfemxpYlZlcnNpb24KKworLyogYWxsIHpsaWIgdHlwZWRlZnMgaW4gemxpYi5oIGFuZCB6Y29uZi5oICovCisjICBkZWZpbmUgQnl0ZSAgICAgICAgICAgICAgICAgIHpfQnl0ZQorIyAgZGVmaW5lIEJ5dGVmICAgICAgICAgICAgICAgICB6X0J5dGVmCisjICBkZWZpbmUgYWxsb2NfZnVuYyAgICAgICAgICAgIHpfYWxsb2NfZnVuYworIyAgZGVmaW5lIGNoYXJmICAgICAgICAgICAgICAgICB6X2NoYXJmCisjICBkZWZpbmUgZnJlZV9mdW5jICAgICAgICAgICAgIHpfZnJlZV9mdW5jCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGRlZmluZSBnekZpbGUgICAgICAgICAgICAgICAgel9nekZpbGUKKyMgIGVuZGlmCisjICBkZWZpbmUgZ3pfaGVhZGVyICAgICAgICAgICAgIHpfZ3pfaGVhZGVyCisjICBkZWZpbmUgZ3pfaGVhZGVycCAgICAgICAgICAgIHpfZ3pfaGVhZGVycAorIyAgZGVmaW5lIGluX2Z1bmMgICAgICAgICAgICAgICB6X2luX2Z1bmMKKyMgIGRlZmluZSBpbnRmICAgICAgICAgICAgICAgICAgel9pbnRmCisjICBkZWZpbmUgb3V0X2Z1bmMgICAgICAgICAgICAgIHpfb3V0X2Z1bmMKKyMgIGRlZmluZSB1SW50ICAgICAgICAgICAgICAgICAgel91SW50CisjICBkZWZpbmUgdUludGYgICAgICAgICAgICAgICAgIHpfdUludGYKKyMgIGRlZmluZSB1TG9uZyAgICAgICAgICAgICAgICAgel91TG9uZworIyAgZGVmaW5lIHVMb25nZiAgICAgICAgICAgICAgICB6X3VMb25nZgorIyAgZGVmaW5lIHZvaWRwICAgICAgICAgICAgICAgICB6X3ZvaWRwCisjICBkZWZpbmUgdm9pZHBjICAgICAgICAgICAgICAgIHpfdm9pZHBjCisjICBkZWZpbmUgdm9pZHBmICAgICAgICAgICAgICAgIHpfdm9pZHBmCisKKy8qIGFsbCB6bGliIHN0cnVjdHMgaW4gemxpYi5oIGFuZCB6Y29uZi5oICovCisjICBkZWZpbmUgZ3pfaGVhZGVyX3MgICAgICAgICAgIHpfZ3pfaGVhZGVyX3MKKyMgIGRlZmluZSBpbnRlcm5hbF9zdGF0ZSAgICAgICAgel9pbnRlcm5hbF9zdGF0ZQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisjaWYgKGRlZmluZWQoT1NfMikgfHwgZGVmaW5lZChfX09TMl9fKSkgJiYgIWRlZmluZWQoT1MyKQorIyAgZGVmaW5lIE9TMgorI2VuZGlmCisjaWYgZGVmaW5lZChfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKKyMgIGRlZmluZSBXSU5ET1dTCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgIGlmbmRlZiBXSU4zMgorIyAgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQorIyAgICBpZm5kZWYgU1lTMTZCSVQKKyMgICAgICBkZWZpbmUgU1lTMTZCSVQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGlmbmRlZiBTVERDOTkKKyMgICAgICBkZWZpbmUgU1REQzk5CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLworIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFpMSUJfQ09OU1QpICYmICFkZWZpbmVkKHpfY29uc3QpCisjICBkZWZpbmUgel9jb25zdCBjb25zdAorI2Vsc2UKKyMgIGRlZmluZSB6X2NvbnN0CisjZW5kaWYKKworLyogU29tZSBNYWMgY29tcGlsZXJzIG1lcmdlIGFsbCAuaCBmaWxlcyBpbmNvcnJlY3RseTogKi8KKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pfHxkZWZpbmVkKGFwcGxlYyl8fGRlZmluZWQoVEhJTktfQyl8fGRlZmluZWQoX19TQ19fKQorIyAgZGVmaW5lIE5PX0RVTU1ZX0RFQ0wKKyNlbmRpZgorCisvKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi8KKyNpZm5kZWYgTUFYX01FTV9MRVZFTAorIyAgaWZkZWYgTUFYU0VHXzY0SworIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA4CisjICBlbHNlCisjICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3Igd2luZG93Qml0cyBpbiBkZWZsYXRlSW5pdDIgYW5kIGluZmxhdGVJbml0Mi4KKyAqIFdBUk5JTkc6IHJlZHVjaW5nIE1BWF9XQklUUyBtYWtlcyBtaW5pZ3ppcCB1bmFibGUgdG8gZXh0cmFjdCAuZ3ogZmlsZXMKKyAqIGNyZWF0ZWQgYnkgZ3ppcC4gKEZpbGVzIGNyZWF0ZWQgYnkgbWluaWd6aXAgY2FuIHN0aWxsIGJlIGV4dHJhY3RlZCBieQorICogZ3ppcC4pCisgKi8KKyNpZm5kZWYgTUFYX1dCSVRTCisjICBkZWZpbmUgTUFYX1dCSVRTICAgMTUgLyogMzJLIExaNzcgd2luZG93ICovCisjZW5kaWYKKworLyogVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGRlZmxhdGUgYXJlIChpbiBieXRlcyk6CisgICAgICAgICAgICAoMSA8PCAod2luZG93Qml0cysyKSkgKyAgKDEgPDwgKG1lbUxldmVsKzkpKQorIHRoYXQgaXM6IDEyOEsgZm9yIHdpbmRvd0JpdHM9MTUgICsgIDEyOEsgZm9yIG1lbUxldmVsID0gOCAgKGRlZmF1bHQgdmFsdWVzKQorIHBsdXMgYSBmZXcga2lsb2J5dGVzIGZvciBzbWFsbCBvYmplY3RzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gcmVkdWNlCisgdGhlIGRlZmF1bHQgbWVtb3J5IHJlcXVpcmVtZW50cyBmcm9tIDI1NksgdG8gMTI4SywgY29tcGlsZSB3aXRoCisgICAgIG1ha2UgQ0ZMQUdTPSItTyAtRE1BWF9XQklUUz0xNCAtRE1BWF9NRU1fTEVWRUw9NyIKKyBPZiBjb3Vyc2UgdGhpcyB3aWxsIGdlbmVyYWxseSBkZWdyYWRlIGNvbXByZXNzaW9uICh0aGVyZSdzIG5vIGZyZWUgbHVuY2gpLgorCisgICBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgaW5mbGF0ZSBhcmUgKGluIGJ5dGVzKSAxIDw8IHdpbmRvd0JpdHMKKyB0aGF0IGlzLCAzMksgZm9yIHdpbmRvd0JpdHM9MTUgKGRlZmF1bHQgdmFsdWUpIHBsdXMgYSBmZXcga2lsb2J5dGVzCisgZm9yIHNtYWxsIG9iamVjdHMuCisqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIE9GIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyMgIGlmZGVmIFNUREMKKyMgICAgZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjICBlbHNlCisjICAgIGRlZmluZSBPRihhcmdzKSAgKCkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBaX0FSRyAvKiBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBzdGRhcmcgKi8KKyMgIGlmIGRlZmluZWQoU1REQykgfHwgZGVmaW5lZChaX0hBVkVfU1REQVJHX0gpCisjICAgIGRlZmluZSBaX0FSRyhhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgWl9BUkcoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCisgICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisgICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQorICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgorICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgorICAgICovCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKKyMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAorICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgorICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfV0lOQVBJCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLworICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLworIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVAorIyAgZGVmaW5lIFpFWFBPUlQKKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUVkEKKyMgIGRlZmluZSBaRVhQT1JUVkEKKyNlbmRpZgorCisjaWZuZGVmIEZBUgorIyAgZGVmaW5lIEZBUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX01BQ1RZUEVTX18pCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KKworI2lmZGVmIFNNQUxMX01FRElVTQorICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KKyMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgorI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOworI2VuZGlmCit0eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKK3R5cGVkZWYgaW50ICAgRkFSIGludGY7Cit0eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKK3R5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKKworI2lmZGVmIFNUREMKKyAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiB2b2lkIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICAgKnZvaWRwOworI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiBCeXRlIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChaX1U0KSAmJiAhZGVmaW5lZChaX1NPTE8pICYmIGRlZmluZWQoU1REQykKKyMgIGluY2x1ZGUgPGxpbWl0cy5oPgorIyAgaWYgKFVJTlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKKyMgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQKKyMgIGVsaWYgKFVMT05HX01BWCA9PSAweGZmZmZmZmZmVUwpCisjICAgIGRlZmluZSBaX1U0IHVuc2lnbmVkIGxvbmcKKyMgIGVsaWYgKFVTSFJUX01BWCA9PSAweGZmZmZmZmZmVUwpCisjICAgIGRlZmluZSBaX1U0IHVuc2lnbmVkIHNob3J0CisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBaX1U0CisgICB0eXBlZGVmIFpfVTQgel9jcmNfdDsKKyNlbHNlCisgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgel9jcmNfdDsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VTklTVERfSCAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCisjICBkZWZpbmUgWl9IQVZFX1VOSVNURF9ICisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1REQVJHX0ggICAgLyogbWF5IGJlIHNldCB0byAjaWYgMSBieSAuL2NvbmZpZ3VyZSAqLworIyAgZGVmaW5lIFpfSEFWRV9TVERBUkdfSAorI2VuZGlmCisKKyNpZmRlZiBTVERDCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGluY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAgIC8qIGZvciBvZmZfdCAqLworIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgaW5jbHVkZSA8c3RkYXJnLmg+ICAgICAgICAgLyogZm9yIHZhX2xpc3QgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorIyAgaWZuZGVmIFpfU09MTworIyAgICBpbmNsdWRlIDxzdGRkZWYuaD4gICAgICAgICAvKiBmb3Igd2NoYXJfdCAqLworIyAgZW5kaWYKKyNlbmRpZgorCisvKiBhIGxpdHRsZSB0cmljayB0byBhY2NvbW1vZGF0ZSBib3RoICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZAorICogIiNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSAxIiBhcyByZXF1ZXN0aW5nIDY0LWJpdCBvcGVyYXRpb25zLCAoZXZlbgorICogdGhvdWdoIHRoZSBmb3JtZXIgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgTEZTIGRvY3VtZW50KSwgYnV0IGNvbnNpZGVyaW5nCisgKiBib3RoICIjdW5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRSIgYW5kICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMCIgYXMKKyAqIGVxdWl2YWxlbnRseSByZXF1ZXN0aW5nIG5vIDY0LWJpdCBvcGVyYXRpb25zCisgKi8KKyNpZiBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpICYmIC1fTEFSR0VGSUxFNjRfU09VUkNFIC0gLTEgPT0gMQorIyAgdW5kZWYgX0xBUkdFRklMRTY0X1NPVVJDRQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKSAmJiAhZGVmaW5lZChaX0hBVkVfVU5JU1REX0gpCisjICBkZWZpbmUgWl9IQVZFX1VOSVNURF9ICisjZW5kaWYKKyNpZm5kZWYgWl9TT0xPCisjICBpZiBkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkgfHwgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKQorIyAgICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgICAvKiBmb3IgU0VFS18qLCBvZmZfdCwgYW5kIF9MRlM2NF9MQVJHRUZJTEUgKi8KKyMgICAgaWZkZWYgVk1TCisjICAgICAgaW5jbHVkZSA8dW5peGlvLmg+ICAgICAgIC8qIGZvciBvZmZfdCAqLworIyAgICBlbmRpZgorIyAgICBpZm5kZWYgel9vZmZfdAorIyAgICAgIGRlZmluZSB6X29mZl90IG9mZl90CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9MRlM2NF9MQVJHRUZJTEUpICYmIF9MRlM2NF9MQVJHRUZJTEUtMAorIyAgZGVmaW5lIFpfTEZTNjQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiBkZWZpbmVkKFpfTEZTNjQpCisjICBkZWZpbmUgWl9MQVJHRTY0CisjZW5kaWYKKworI2lmIGRlZmluZWQoX0ZJTEVfT0ZGU0VUX0JJVFMpICYmIF9GSUxFX09GRlNFVF9CSVRTLTAgPT0gNjQgJiYgZGVmaW5lZChaX0xGUzY0KQorIyAgZGVmaW5lIFpfV0FOVDY0CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNFRUtfU0VUKSAmJiAhZGVmaW5lZChaX1NPTE8pCisjICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjICBkZWZpbmUgU0VFS19FTkQgICAgICAgIDIgICAgICAgLyogU2V0IGZpbGUgcG9pbnRlciB0byBFT0YgcGx1cyAib2Zmc2V0IiAqLworI2VuZGlmCisKKyNpZm5kZWYgel9vZmZfdAorIyAgZGVmaW5lIHpfb2ZmX3QgbG9uZworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoWl9MQVJHRTY0KQorIyAgZGVmaW5lIHpfb2ZmNjRfdCBvZmY2NF90CisjZWxzZQorIyAgaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChaX1NPTE8pCisjICAgIGRlZmluZSB6X29mZjY0X3QgX19pbnQ2NAorIyAgZWxzZQorIyAgICBkZWZpbmUgel9vZmY2NF90IHpfb2ZmX3QKKyMgIGVuZGlmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisgICNwcmFnbWEgbWFwKGRlZmxhdGVJbml0XywiREVJTiIpCisgICNwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKKyAgI3ByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorICAjcHJhZ21hIG1hcChkZWZsYXRlQm91bmQsIkRFQk5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZUluaXQyXywiSU5JTjIiKQorICAjcHJhZ21hIG1hcChpbmZsYXRlRW5kLCJJTkVORCIpCisgICNwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZVNldERpY3Rpb25hcnksIklOU0VESSIpCisgICNwcmFnbWEgbWFwKGNvbXByZXNzQm91bmQsIkNNQk5EIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV90YWJsZSwiSU5UQUJMIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV9mYXN0LCJJTkZBIikKKyAgI3ByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCisjZW5kaWYKKworI2VuZGlmIC8qIFpDT05GX0ggKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi96Y29uZi5pbi5oIGIvTW9kdWxlcy96bGliL3pjb25mLmluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYTk0MzEuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy96bGliL3pjb25mLmluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpZm5kZWYgWkNPTkZfSAotI2RlZmluZSBaQ09ORl9ICi0KLS8qCi0gKiBJZiB5b3UgKnJlYWxseSogbmVlZCBhIHVuaXF1ZSBwcmVmaXggZm9yIGFsbCB0eXBlcyBhbmQgbGlicmFyeSBmdW5jdGlvbnMsCi0gKiBjb21waWxlIHdpdGggLURaX1BSRUZJWC4gVGhlICJzdGFuZGFyZCIgemxpYiBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG91dCBpdC4KLSAqLwotI2lmZGVmIFpfUFJFRklYCi0jICBkZWZpbmUgZGVmbGF0ZUluaXRfICAgICAgICAgIHpfZGVmbGF0ZUluaXRfCi0jICBkZWZpbmUgZGVmbGF0ZSAgICAgICAgICAgICAgIHpfZGVmbGF0ZQotIyAgZGVmaW5lIGRlZmxhdGVFbmQgICAgICAgICAgICB6X2RlZmxhdGVFbmQKLSMgIGRlZmluZSBpbmZsYXRlSW5pdF8gICAgICAgICAgel9pbmZsYXRlSW5pdF8KLSMgIGRlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgel9pbmZsYXRlCi0jICBkZWZpbmUgaW5mbGF0ZUVuZCAgICAgICAgICAgIHpfaW5mbGF0ZUVuZAotIyAgZGVmaW5lIGRlZmxhdGVJbml0Ml8gICAgICAgICB6X2RlZmxhdGVJbml0Ml8KLSMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGRlZmxhdGVDb3B5ICAgICAgICAgICB6X2RlZmxhdGVDb3B5Ci0jICBkZWZpbmUgZGVmbGF0ZVJlc2V0ICAgICAgICAgIHpfZGVmbGF0ZVJlc2V0Ci0jICBkZWZpbmUgZGVmbGF0ZVBhcmFtcyAgICAgICAgIHpfZGVmbGF0ZVBhcmFtcwotIyAgZGVmaW5lIGRlZmxhdGVCb3VuZCAgICAgICAgICB6X2RlZmxhdGVCb3VuZAotIyAgZGVmaW5lIGRlZmxhdGVQcmltZSAgICAgICAgICB6X2RlZmxhdGVQcmltZQotIyAgZGVmaW5lIGluZmxhdGVJbml0Ml8gICAgICAgICB6X2luZmxhdGVJbml0Ml8KLSMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSAgel9pbmZsYXRlU2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgICAgICAgICB6X2luZmxhdGVTeW5jCi0jICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCAgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAotIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgICAgICAgICB6X2luZmxhdGVDb3B5Ci0jICBkZWZpbmUgaW5mbGF0ZVJlc2V0ICAgICAgICAgIHpfaW5mbGF0ZVJlc2V0Ci0jICBkZWZpbmUgaW5mbGF0ZUJhY2sgICAgICAgICAgIHpfaW5mbGF0ZUJhY2sKLSMgIGRlZmluZSBpbmZsYXRlQmFja0VuZCAgICAgICAgel9pbmZsYXRlQmFja0VuZAotIyAgZGVmaW5lIGNvbXByZXNzICAgICAgICAgICAgICB6X2NvbXByZXNzCi0jICBkZWZpbmUgY29tcHJlc3MyICAgICAgICAgICAgIHpfY29tcHJlc3MyCi0jICBkZWZpbmUgY29tcHJlc3NCb3VuZCAgICAgICAgIHpfY29tcHJlc3NCb3VuZAotIyAgZGVmaW5lIHVuY29tcHJlc3MgICAgICAgICAgICB6X3VuY29tcHJlc3MKLSMgIGRlZmluZSBhZGxlcjMyICAgICAgICAgICAgICAgel9hZGxlcjMyCi0jICBkZWZpbmUgY3JjMzIgICAgICAgICAgICAgICAgIHpfY3JjMzIKLSMgIGRlZmluZSBnZXRfY3JjX3RhYmxlICAgICAgICAgel9nZXRfY3JjX3RhYmxlCi0jICBkZWZpbmUgekVycm9yICAgICAgICAgICAgICAgIHpfekVycm9yCi0KLSMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCi0jICBkZWZpbmUgZnJlZV9mdW5jICAgICAgICAgICAgIHpfZnJlZV9mdW5jCi0jICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYwotIyAgZGVmaW5lIG91dF9mdW5jICAgICAgICAgICAgICB6X291dF9mdW5jCi0jICBkZWZpbmUgQnl0ZSAgICAgICAgICAgICAgICAgIHpfQnl0ZQotIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKLSMgIGRlZmluZSB1TG9uZyAgICAgICAgICAgICAgICAgel91TG9uZwotIyAgZGVmaW5lIEJ5dGVmICAgICAgICAgICAgICAgICB6X0J5dGVmCi0jICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKLSMgIGRlZmluZSBpbnRmICAgICAgICAgICAgICAgICAgel9pbnRmCi0jICBkZWZpbmUgdUludGYgICAgICAgICAgICAgICAgIHpfdUludGYKLSMgIGRlZmluZSB1TG9uZ2YgICAgICAgICAgICAgICAgel91TG9uZ2YKLSMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKLSMgIGRlZmluZSB2b2lkcCAgICAgICAgICAgICAgICAgel92b2lkcAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fTVNET1NfXykgJiYgIWRlZmluZWQoTVNET1MpCi0jICBkZWZpbmUgTVNET1MKLSNlbmRpZgotI2lmIChkZWZpbmVkKE9TXzIpIHx8IGRlZmluZWQoX19PUzJfXykpICYmICFkZWZpbmVkKE9TMikKLSMgIGRlZmluZSBPUzIKLSNlbmRpZgotI2lmIGRlZmluZWQoX1dJTkRPV1MpICYmICFkZWZpbmVkKFdJTkRPV1MpCi0jICBkZWZpbmUgV0lORE9XUwotI2VuZGlmCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyX1dDRSkgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0jICBpZm5kZWYgV0lOMzIKLSMgICAgZGVmaW5lIFdJTjMyCi0jICBlbmRpZgotI2VuZGlmCi0jaWYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiAhZGVmaW5lZChXSU4zMikKLSMgIGlmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykgJiYgIWRlZmluZWQoX18zODZfXykKLSMgICAgaWZuZGVmIFNZUzE2QklUCi0jICAgICAgZGVmaW5lIFNZUzE2QklUCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qCi0gKiBDb21waWxlIHdpdGggLURNQVhTRUdfNjRLIGlmIHRoZSBhbGxvYyBmdW5jdGlvbiBjYW5ub3QgYWxsb2NhdGUgbW9yZQotICogdGhhbiA2NGsgYnl0ZXMgYXQgYSB0aW1lIChuZWVkZWQgb24gc3lzdGVtcyB3aXRoIDE2LWJpdCBpbnQpLgotICovCi0jaWZkZWYgU1lTMTZCSVQKLSMgIGRlZmluZSBNQVhTRUdfNjRLCi0jZW5kaWYKLSNpZmRlZiBNU0RPUwotIyAgZGVmaW5lIFVOQUxJR05FRF9PSwotI2VuZGlmCi0KLSNpZmRlZiBfX1NURENfVkVSU0lPTl9fCi0jICBpZm5kZWYgU1REQwotIyAgICBkZWZpbmUgU1REQwotIyAgZW5kaWYKLSMgIGlmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAotIyAgICBpZm5kZWYgU1REQzk5Ci0jICAgICAgZGVmaW5lIFNUREM5OQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChfX0hPU19BSVhfXykpCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fT1M0MDBfXykgJiYgIWRlZmluZWQoU1REQykgICAgLyogaVNlcmllcyAoZm9ybWVybHkgQVMvNDAwKS4gKi8KLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLQotI2lmbmRlZiBTVERDCi0jICBpZm5kZWYgY29uc3QgLyogY2Fubm90IHVzZSAhZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChjb25zdCkgb24gTWFjICovCi0jICAgIGRlZmluZSBjb25zdCAgICAgICAvKiBub3RlOiBuZWVkIGEgbW9yZSBnZW50bGUgc29sdXRpb24gaGVyZSAqLwotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLwotI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCi0jICBkZWZpbmUgTk9fRFVNTVlfREVDTAotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLwotI2lmbmRlZiBNQVhfTUVNX0xFVkVMCi0jICBpZmRlZiBNQVhTRUdfNjRLCi0jICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgotICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcwotICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5Ci0gKiBnemlwLikKLSAqLwotI2lmbmRlZiBNQVhfV0JJVFMKLSMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KLSNlbmRpZgotCi0vKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKLSAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCi0gdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCi0gcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKLSB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKLSAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgotIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCi0KLSAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cwotIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKLSBmb3Igc21hbGwgb2JqZWN0cy4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotIyAgaWZkZWYgU1REQwotIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBGQVIgYXJlIG5lZWRlZCBvbmx5IGZvciBNU0RPUyBtaXhlZAotICogbW9kZWwgcHJvZ3JhbW1pbmcgKHNtYWxsIG9yIG1lZGl1bSBtb2RlbCB3aXRoIHNvbWUgZmFyIGFsbG9jYXRpb25zKS4KLSAqIFRoaXMgd2FzIHRlc3RlZCBvbmx5IHdpdGggTVNDOyBmb3Igb3RoZXIgTVNET1MgY29tcGlsZXJzIHlvdSBtYXkgaGF2ZQotICogdG8gZGVmaW5lIE5PX01FTUNQWSBpbiB6dXRpbC5oLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlIG1peGVkIG1vZGVsLAotICoganVzdCBkZWZpbmUgRkFSIHRvIGJlIGVtcHR5LgotICovCi0jaWZkZWYgU1lTMTZCSVQKLSMgIGlmIGRlZmluZWQoTV9JODZTTSkgfHwgZGVmaW5lZChNX0k4Nk1NKQotICAgICAvKiBNU0Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCi0jICAgIGRlZmluZSBTTUFMTF9NRURJVU0KLSMgICAgaWZkZWYgX01TQ19WRVIKLSMgICAgICBkZWZpbmUgRkFSIF9mYXIKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBGQVIgZmFyCi0jICAgIGVuZGlmCi0jICBlbmRpZgotIyAgaWYgKGRlZmluZWQoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTUVESVVNX18pKQotICAgICAvKiBUdXJibyBDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgU01BTExfTUVESVVNCi0jICAgIGlmZGVmIF9fQk9STEFORENfXwotIyAgICAgIGRlZmluZSBGQVIgX2ZhcgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIEZBUiBmYXIKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikKLSAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgYXMgYSBETEwsIGRlZmluZSBaTElCX0RMTC4KLSAgICAqIFRoaXMgaXMgbm90IG1hbmRhdG9yeSwgYnV0IGl0IG9mZmVycyBhIGxpdHRsZSBwZXJmb3JtYW5jZSBpbmNyZWFzZS4KLSAgICAqLwotIyAgaWZkZWYgWkxJQl9ETEwKLSMgICAgaWYgZGVmaW5lZChXSU4zMikgJiYgKCFkZWZpbmVkKF9fQk9STEFORENfXykgfHwgKF9fQk9STEFORENfXyA+PSAweDUwMCkpCi0jICAgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAotIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICAgIGVsc2UKLSMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYgIC8qIFpMSUJfRExMICovCi0gICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIHdpdGggdGhlIFdJTkFQSS9XSU5BUElWIGNhbGxpbmcgY29udmVudGlvbiwKLSAgICAqIGRlZmluZSBaTElCX1dJTkFQSS4KLSAgICAqIENhdXRpb246IHRoZSBzdGFuZGFyZCBaTElCMS5ETEwgaXMgTk9UIGNvbXBpbGVkIHVzaW5nIFpMSUJfV0lOQVBJLgotICAgICovCi0jICBpZmRlZiBaTElCX1dJTkFQSQotIyAgICBpZmRlZiBGQVIKLSMgICAgICB1bmRlZiBGQVIKLSMgICAgZW5kaWYKLSMgICAgaW5jbHVkZSA8d2luZG93cy5oPgotICAgICAvKiBObyBuZWVkIGZvciBfZXhwb3J0LCB1c2UgWkxJQi5ERUYgaW5zdGVhZC4gKi8KLSAgICAgLyogRm9yIGNvbXBsZXRlIFdpbmRvd3MgY29tcGF0aWJpbGl0eSwgdXNlIFdJTkFQSSwgbm90IF9fc3RkY2FsbC4gKi8KLSMgICAgZGVmaW5lIFpFWFBPUlQgV0lOQVBJCi0jICAgIGlmZGVmIFdJTjMyCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBXSU5BUElWCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIEZBUiBDREVDTAotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX19CRU9TX18pCi0jICBpZmRlZiBaTElCX0RMTAotIyAgICBpZmRlZiBaTElCX0lOVEVSTkFMCi0jICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIFpFWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgICBkZWZpbmUgWkVYUE9SVFZBIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFpFWFRFUk4KLSMgIGRlZmluZSBaRVhURVJOIGV4dGVybgotI2VuZGlmCi0jaWZuZGVmIFpFWFBPUlQKLSMgIGRlZmluZSBaRVhQT1JUCi0jZW5kaWYKLSNpZm5kZWYgWkVYUE9SVFZBCi0jICBkZWZpbmUgWkVYUE9SVFZBCi0jZW5kaWYKLQotI2lmbmRlZiBGQVIKLSMgIGRlZmluZSBGQVIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX19NQUNUWVBFU19fKQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCeXRlOyAgLyogOCBiaXRzICovCi0jZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgdUludDsgIC8qIDE2IGJpdHMgb3IgbW9yZSAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nICB1TG9uZzsgLyogMzIgYml0cyBvciBtb3JlICovCi0KLSNpZmRlZiBTTUFMTF9NRURJVU0KLSAgIC8qIEJvcmxhbmQgQy9DKysgYW5kIHNvbWUgb2xkIE1TQyB2ZXJzaW9ucyBpZ25vcmUgRkFSIGluc2lkZSB0eXBlZGVmICovCi0jICBkZWZpbmUgQnl0ZWYgQnl0ZSBGQVIKLSNlbHNlCi0gICB0eXBlZGVmIEJ5dGUgIEZBUiBCeXRlZjsKLSNlbmRpZgotdHlwZWRlZiBjaGFyICBGQVIgY2hhcmY7Ci10eXBlZGVmIGludCAgIEZBUiBpbnRmOwotdHlwZWRlZiB1SW50ICBGQVIgdUludGY7Ci10eXBlZGVmIHVMb25nIEZBUiB1TG9uZ2Y7Ci0KLSNpZmRlZiBTVERDCi0gICB0eXBlZGVmIHZvaWQgY29uc3QgKnZvaWRwYzsKLSAgIHR5cGVkZWYgdm9pZCBGQVIgICAqdm9pZHBmOwotICAgdHlwZWRlZiB2b2lkICAgICAgICp2b2lkcDsKLSNlbHNlCi0gICB0eXBlZGVmIEJ5dGUgY29uc3QgKnZvaWRwYzsKLSAgIHR5cGVkZWYgQnl0ZSBGQVIgICAqdm9pZHBmOwotICAgdHlwZWRlZiBCeXRlICAgICAgICp2b2lkcDsKLSNlbmRpZgotCi0jaWYgMCAgICAgICAgICAgLyogSEFWRV9VTklTVERfSCAtLSB0aGlzIGxpbmUgaXMgdXBkYXRlZCBieSAuL2NvbmZpZ3VyZSAqLwotIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBvZmZfdCAqLwotIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAgIC8qIGZvciBTRUVLXyogYW5kIG9mZl90ICovCi0jICBpZmRlZiBWTVMKLSMgICAgaW5jbHVkZSA8dW5peGlvLmg+ICAgLyogZm9yIG9mZl90ICovCi0jICBlbmRpZgotIyAgZGVmaW5lIHpfb2ZmX3Qgb2ZmX3QKLSNlbmRpZgotI2lmbmRlZiBTRUVLX1NFVAotIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCi0jICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLwotIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KLSNlbmRpZgotI2lmbmRlZiB6X29mZl90Ci0jICBkZWZpbmUgel9vZmZfdCBsb25nCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19PUzQwMF9fKQotIyAgZGVmaW5lIE5PX3ZzbnByaW50ZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fTVZTX18pCi0jICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jICBpZmRlZiBGQVIKLSMgICAgdW5kZWYgRkFSCi0jICBlbmRpZgotI2VuZGlmCi0KLS8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCi0jaWYgZGVmaW5lZChfX01WU19fKQotIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKLSMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKLSMgICBwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKLSMgICBwcmFnbWEgbWFwKGRlZmxhdGVCb3VuZCwiREVCTkQiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQotIyAgIHByYWdtYSBtYXAoY29tcHJlc3NCb3VuZCwiQ01CTkQiKQotIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90YWJsZSwiSU5UQUJMIikKLSMgICBwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCi0jICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKLSNlbmRpZgotCi0jZW5kaWYgLyogWkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGliL3psaWIuMyBiL01vZHVsZXMvemxpYi96bGliLjMKaW5kZXggOTBiODE2Mi4uMDE2MGU2MiAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL3psaWIuMworKysgYi9Nb2R1bGVzL3psaWIvemxpYi4zCkBAIC0xLDQgKzEsNCBAQAotLlRIIFpMSUIgMyAiMTggSnVseSAyMDA1IgorLlRIIFpMSUIgMyAiMjggQXByIDIwMTMiCiAuU0ggTkFNRQogemxpYiBcLSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGxpYnJhcnkKIC5TSCBTWU5PUFNJUwpAQCAtOSwxNSArOSwxNSBAQAogVGhlCiAuSSB6bGliCiBsaWJyYXJ5IGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KLVRoZSBjb2RlIGlzIHRocmVhZCBzYWZlLgorVGhlIGNvZGUgaXMgdGhyZWFkIHNhZmUsIGFzc3VtaW5nIHRoYXQgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zCit1c2VkIGFyZSB0aHJlYWQgc2FmZSwgc3VjaCBhcyBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4KIEl0IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsCiBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCiBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kIChkZWZsYXRpb24pCi1idXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyCi1hbmQgd2lsbCBoYXZlIHRoZSBzYW1lIHN0cmVhbSBpbnRlcmZhY2UuCitidXQgb3RoZXIgYWxnb3JpdGhtcyBtYXkgYmUgYWRkZWQgbGF0ZXIKK3dpdGggdGhlIHNhbWUgc3RyZWFtIGludGVyZmFjZS4KIC5MUAogQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UgZW5vdWdoCi0oZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwKIG9yIGNhbiBiZSBkb25lIGJ5IHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4KIEluIHRoZSBsYXR0ZXIgY2FzZSwKIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CkBAIC0zMCwyNiArMzAsMjcgQEAKIC5MUAogVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuCiBUaGUgZGVjb2RlciBjaGVja3MgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsCi1zbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIgY3Jhc2ggZXZlbiBpbiBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KK3NvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlciBjcmFzaCBldmVuIGluIHRoZSBjYXNlIG9mIGNvcnJ1cHRlZCBpbnB1dC4KIC5MUAogQWxsIGZ1bmN0aW9ucyBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgZmlsZQogLklSIHpsaWIuaCAuCiBUaGUgZGlzdHJpYnV0aW9uIHNvdXJjZSBpbmNsdWRlcyBleGFtcGxlcyBvZiB1c2Ugb2YgdGhlIGxpYnJhcnkKIGluIHRoZSBmaWxlcwotLkkgZXhhbXBsZS5jCisuSSB0ZXN0L2V4YW1wbGUuYwogYW5kCi0uSVIgbWluaWd6aXAuYyAuCisuSVIgdGVzdC9taW5pZ3ppcC5jLAorYXMgd2VsbCBhcyBvdGhlciBleGFtcGxlcyBpbiB0aGUKKy5JUiBleGFtcGxlcy8KK2RpcmVjdG9yeS4KIC5MUAogQ2hhbmdlcyB0byB0aGlzIHZlcnNpb24gYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUKIC5JIENoYW5nZUxvZwotdGhhdCBhY2NvbXBhbmllcyB0aGUgc291cmNlLAotYW5kIGFyZSBjb25jZXJuZWQgcHJpbWFyaWx5IHdpdGggYnVnIGZpeGVzIGFuZCBwb3J0YWJpbGl0eSBlbmhhbmNlbWVudHMuCit0aGF0IGFjY29tcGFuaWVzIHRoZSBzb3VyY2UuCiAuTFAKLUEgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZgogLkkgemxpYgotaXMgYXZhaWxhYmxlIGluIHRoZSBKYXZhIERldmVsb3BtZW50IEtpdCAxLjE6CitpcyBhdmFpbGFibGUgaW4gSmF2YSB1c2luZyB0aGUgamF2YS51dGlsLnppcCBwYWNrYWdlOgogLklQCi1odHRwOi8vd3d3LmphdmFzb2Z0LmNvbS9wcm9kdWN0cy9KREsvMS4xL2RvY3MvYXBpL1BhY2thZ2UtamF2YS51dGlsLnppcC5odG1sCitodHRwOi8vamF2YS5zdW4uY29tL2RldmVsb3Blci90ZWNobmljYWxBcnRpY2xlcy9Qcm9ncmFtbWluZy9jb21wcmVzc2lvbi8KIC5MUAogQSBQZXJsIGludGVyZmFjZSB0bwogLklSIHpsaWIgLApAQCAtNTcsMjMgKzU4LDIwIEBACiBpcyBhdmFpbGFibGUgYXQgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMsCiBpbmNsdWRpbmc6CiAuSVAKLWh0dHA6Ly93d3cuY3Bhbi5vcmcvbW9kdWxlcy9ieS1tb2R1bGUvQ29tcHJlc3MvCitodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35wbXFzL0lPLUNvbXByZXNzLVpsaWIvCiAuTFAKIEEgUHl0aG9uIGludGVyZmFjZSB0bwogLklSIHpsaWIgLAogd3JpdHRlbiBieSBBLk0uIEt1Y2hsaW5nIChhbWtAbWFnbmV0LmNvbSksCiBpcyBhdmFpbGFibGUgaW4gUHl0aG9uIDEuNSBhbmQgbGF0ZXIgdmVyc2lvbnM6CiAuSVAKLWh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvbGliL21vZHVsZS16bGliLmh0bWwKK2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS96bGliLmh0bWwKIC5MUAotQQogLkkgemxpYgotYmluZGluZyBmb3IKLS5JUiB0Y2wgKDEpLAotd3JpdHRlbiBieSBBbmRyZWFzIEt1cHJpZXMgKGEua3Vwcmllc0B3ZXN0ZW5kLmNvbSksCi1pcyBhdmFpbGxhYmxlIGF0OgoraXMgYnVpbHQgaW50bworLklSIHRjbDoKIC5JUAotaHR0cDovL3d3dy53ZXN0ZW5kLmNvbS9+a3Vwcmllcy9kb2MvdHJmL21hbi9tYW4uaHRtbAoraHR0cDovL3dpa2kudGNsLnRrLzQ2MTAKIC5MUAogQW4gZXhwZXJpbWVudGFsIHBhY2thZ2UgdG8gcmVhZCBhbmQgd3JpdGUgZmlsZXMgaW4gLnppcCBmb3JtYXQsCiB3cml0dGVuIG9uIHRvcCBvZgpAQCAtODEsNDAgKzc5LDM0IEBACiBieSBHaWxsZXMgVm9sbGFudCAoaW5mb0B3aW5pbWFnZS5jb20pLAogaXMgYXZhaWxhYmxlIGF0OgogLklQCi1odHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKK2h0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvbWluaXppcC5odG1sCiBhbmQgYWxzbyBpbiB0aGUKIC5JIGNvbnRyaWIvbWluaXppcAogZGlyZWN0b3J5IG9mIHRoZSBtYWluCiAuSSB6bGliCi13ZWIgc2l0ZS4KK3NvdXJjZSBkaXN0cmlidXRpb24uCiAuU0ggIlNFRSBBTFNPIgogVGhlCiAuSSB6bGliCi13ZWIgc2l0ZSBjYW4gYmUgZm91bmQgYXQgZWl0aGVyIG9mIHRoZXNlIGxvY2F0aW9uczoKK3dlYiBzaXRlIGNhbiBiZSBmb3VuZCBhdDoKIC5JUAotaHR0cDovL3d3dy56bGliLm9yZwotLmJyCi1odHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvCitodHRwOi8vemxpYi5uZXQvCiAuTFAKIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQwogKFJlcXVlc3QgZm9yIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzOgogLklQCi1odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dCAoY29uY2VybmluZyB6bGliIGZvcm1hdCkKK2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTAgKGZvciB0aGUgemxpYiBoZWFkZXIgYW5kIHRyYWlsZXIgZm9ybWF0KQogLmJyCi1odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUxLnR4dCAoY29uY2VybmluZyBkZWZsYXRlIGZvcm1hdCkKK2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTEgKGZvciB0aGUgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0KQogLmJyCi1odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUyLnR4dCAoY29uY2VybmluZyBnemlwIGZvcm1hdCkKK2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTIgKGZvciB0aGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIgZm9ybWF0KQogLkxQCi1UaGVzZSBkb2N1bWVudHMgYXJlIGFsc28gYXZhaWxhYmxlIGluIG90aGVyIGZvcm1hdHMgZnJvbToKLS5JUAotZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sCi0uTFAKLU1hcmsgTmVsc29uIChtYXJrbkBpZWVlLm9yZykgd3JvdGUgYW4gYXJ0aWNsZSBhYm91dAorTWFyayBOZWxzb24gd3JvdGUgYW4gYXJ0aWNsZSBhYm91dAogLkkgemxpYgogZm9yIHRoZSBKYW4uIDE5OTcgaXNzdWUgb2YgIERyLiBEb2JiJ3MgSm91cm5hbDsKIGEgY29weSBvZiB0aGUgYXJ0aWNsZSBpcyBhdmFpbGFibGUgYXQ6CiAuSVAKLWh0dHA6Ly9kb2dtYS5uZXQvbWFya24vYXJ0aWNsZXMvemxpYnRvb2wvemxpYnRvb2wuaHRtCitodHRwOi8vbWFya25lbHNvbi51cy8xOTk3LzAxLzAxL3psaWItZW5naW5lLwogLlNIICJSRVBPUlRJTkcgUFJPQkxFTVMiCiBCZWZvcmUgcmVwb3J0aW5nIGEgcHJvYmxlbSwKIHBsZWFzZSBjaGVjayB0aGUKQEAgLTEyNywxNCArMTE5LDE0IEBACiAuSSB6bGliCiBGQVEgYXQ6CiAuSVAKLWh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi96bGliX2ZhcS5odG1sCitodHRwOi8vemxpYi5uZXQvemxpYl9mYXEuaHRtbAogLkxQCiBiZWZvcmUgYXNraW5nIGZvciBoZWxwLgogU2VuZCBxdWVzdGlvbnMgYW5kL29yIGNvbW1lbnRzIHRvIHpsaWJAZ3ppcC5vcmcsCiBvciAoZm9yIHRoZSBXaW5kb3dzIERMTCB2ZXJzaW9uKSB0byBHaWxsZXMgVm9sbGFudCAoaW5mb0B3aW5pbWFnZS5jb20pLgogLlNIIEFVVEhPUlMKLVZlcnNpb24gMS4yLjMKLUNvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkgKGpsb3VwQGd6aXAub3JnKQorVmVyc2lvbiAxLjIuOAorQ29weXJpZ2h0IChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSAoamxvdXBAZ3ppcC5vcmcpCiBhbmQgTWFyayBBZGxlciAobWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSkuCiAuTFAKIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzLWlzLCIKZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi96bGliLmggYi9Nb2R1bGVzL3psaWIvemxpYi5oCmluZGV4IGZkYTdiMTkuLjNlMGM3NjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi96bGliLmgKKysrIGIvTW9kdWxlcy96bGliL3psaWIuaApAQCAtMSw3ICsxLDcgQEAKIC8qIHpsaWIuaCAtLSBpbnRlcmZhY2Ugb2YgdGhlICd6bGliJyBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeQotICB2ZXJzaW9uIDEuMi4zLCBKdWx5IDE4dGgsIDIwMDUKKyAgdmVyc2lvbiAxLjIuOCwgQXByaWwgMjh0aCwgMjAxMwogCi0gIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKyAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgogCiAgIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiAgIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKQEAgLTI0LDggKzI0LDggQEAKIAogCiAgIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCi0gIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0Ci0gICh6bGliIGZvcm1hdCksIHJmYzE5NTEudHh0IChkZWZsYXRlIGZvcm1hdCkgYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuCisgIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTAKKyAgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MSAoZGVmbGF0ZSBmb3JtYXQpIGFuZCByZmMxOTUyIChnemlwIGZvcm1hdCkuCiAqLwogCiAjaWZuZGVmIFpMSUJfSApAQCAtMzcsNDEgKzM3LDQ0IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0jZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjMiCi0jZGVmaW5lIFpMSUJfVkVSTlVNIDB4MTIzMAorI2RlZmluZSBaTElCX1ZFUlNJT04gIjEuMi44IgorI2RlZmluZSBaTElCX1ZFUk5VTSAweDEyODAKKyNkZWZpbmUgWkxJQl9WRVJfTUFKT1IgMQorI2RlZmluZSBaTElCX1ZFUl9NSU5PUiAyCisjZGVmaW5lIFpMSUJfVkVSX1JFVklTSU9OIDgKKyNkZWZpbmUgWkxJQl9WRVJfU1VCUkVWSVNJT04gMAogCiAvKgotICAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZAotICBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZAotICBkYXRhLiAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZAotICAoZGVmbGF0aW9uKSBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUKLSAgc3RyZWFtIGludGVyZmFjZS4KKyAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZAorICBkZWNvbXByZXNzaW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGludGVncml0eSBjaGVja3Mgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgorICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kIChkZWZsYXRpb24pCisgIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZSBzdHJlYW0KKyAgaW50ZXJmYWNlLgogCi0gICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCi0gIGVub3VnaCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwgb3IgY2FuIGJlIGRvbmUgYnkKLSAgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKLSAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAorICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaCwKKyAgb3IgY2FuIGJlIGRvbmUgYnkgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlcgorICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAogICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgogCi0gICAgIFRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgaW4tbWVtb3J5IGZ1bmN0aW9ucyBpcworICAgIFRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgaW4tbWVtb3J5IGZ1bmN0aW9ucyBpcwogICB0aGUgemxpYiBmb3JtYXQsIHdoaWNoIGlzIGEgemxpYiB3cmFwcGVyIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTAsIHdyYXBwZWQKICAgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0sIHdoaWNoIGlzIGl0c2VsZiBkb2N1bWVudGVkIGluIFJGQyAxOTUxLgogCi0gICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAorICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAogICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8gdXNpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHN0YXJ0CiAgIHdpdGggImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEKICAgZ3ppcCB3cmFwcGVyLCBkb2N1bWVudGVkIGluIFJGQyAxOTUyLCB3cmFwcGVkIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLgogCi0gICAgIFRoaXMgbGlicmFyeSBjYW4gb3B0aW9uYWxseSByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMgaW4gbWVtb3J5IGFzIHdlbGwuCisgICAgVGhpcyBsaWJyYXJ5IGNhbiBvcHRpb25hbGx5IHJlYWQgYW5kIHdyaXRlIGd6aXAgc3RyZWFtcyBpbiBtZW1vcnkgYXMgd2VsbC4KIAotICAgICBUaGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIGJlIGNvbXBhY3QgYW5kIGZhc3QgZm9yIHVzZSBpbiBtZW1vcnkKKyAgICBUaGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIGJlIGNvbXBhY3QgYW5kIGZhc3QgZm9yIHVzZSBpbiBtZW1vcnkKICAgYW5kIG9uIGNvbW11bmljYXRpb25zIGNoYW5uZWxzLiAgVGhlIGd6aXAgZm9ybWF0IHdhcyBkZXNpZ25lZCBmb3Igc2luZ2xlLQogICBmaWxlIGNvbXByZXNzaW9uIG9uIGZpbGUgc3lzdGVtcywgaGFzIGEgbGFyZ2VyIGhlYWRlciB0aGFuIHpsaWIgdG8gbWFpbnRhaW4KICAgZGlyZWN0b3J5IGluZm9ybWF0aW9uLCBhbmQgdXNlcyBhIGRpZmZlcmVudCwgc2xvd2VyIGNoZWNrIG1ldGhvZCB0aGFuIHpsaWIuCiAKLSAgICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuIFRoZSBkZWNvZGVyIGNoZWNrcwotICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyCi0gIGNyYXNoIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCisgICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuICBUaGUgZGVjb2RlciBjaGVja3MKKyAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlciBjcmFzaAorICBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgogKi8KIAogdHlwZWRlZiB2b2lkcGYgKCphbGxvY19mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKSk7CkBAIC04MCwxNSArODMsMTUgQEAKIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZTsKIAogdHlwZWRlZiBzdHJ1Y3Qgel9zdHJlYW1fcyB7Ci0gICAgQnl0ZWYgICAgKm5leHRfaW47ICAvKiBuZXh0IGlucHV0IGJ5dGUgKi8KKyAgICB6X2NvbnN0IEJ5dGVmICpuZXh0X2luOyAgICAgLyogbmV4dCBpbnB1dCBieXRlICovCiAgICAgdUludCAgICAgYXZhaWxfaW47ICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKi8KLSAgICB1TG9uZyAgICB0b3RhbF9pbjsgIC8qIHRvdGFsIG5iIG9mIGlucHV0IGJ5dGVzIHJlYWQgc28gZmFyICovCisgICAgdUxvbmcgICAgdG90YWxfaW47ICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi8KIAogICAgIEJ5dGVmICAgICpuZXh0X291dDsgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCiAgICAgdUludCAgICAgYXZhaWxfb3V0OyAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dCAqLwotICAgIHVMb25nICAgIHRvdGFsX291dDsgLyogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqLworICAgIHVMb25nICAgIHRvdGFsX291dDsgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KIAotICAgIGNoYXIgICAgICptc2c7ICAgICAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCisgICAgel9jb25zdCBjaGFyICptc2c7ICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi8KICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICpzdGF0ZTsgLyogbm90IHZpc2libGUgYnkgYXBwbGljYXRpb25zICovCiAKICAgICBhbGxvY19mdW5jIHphbGxvYzsgIC8qIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIHN0YXRlICovCkBAIC0xMjYsNDUgKzEyOSw0NSBAQAogdHlwZWRlZiBnel9oZWFkZXIgRkFSICpnel9oZWFkZXJwOwogCiAvKgotICAgVGhlIGFwcGxpY2F0aW9uIG11c3QgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luIHdoZW4gYXZhaWxfaW4gaGFzCi0gICBkcm9wcGVkIHRvIHplcm8uIEl0IG11c3QgdXBkYXRlIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgd2hlbiBhdmFpbF9vdXQKLSAgIGhhcyBkcm9wcGVkIHRvIHplcm8uIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQKLSAgIG9wYXF1ZSBiZWZvcmUgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoZQotICAgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgbXVzdCBub3QgYmUgdXBkYXRlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbiB3aGVuIGF2YWlsX2luIGhhcyBkcm9wcGVkCisgICB0byB6ZXJvLiAgSXQgbXVzdCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dCB3aGVuIGF2YWlsX291dCBoYXMgZHJvcHBlZAorICAgdG8gemVyby4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIGJlZm9yZQorICAgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCBieSB0aGUgY29tcHJlc3Npb24KKyAgIGxpYnJhcnkgYW5kIG11c3Qgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgogCi0gICBUaGUgb3BhcXVlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QKLSAgIHBhcmFtZXRlciBmb3IgY2FsbHMgb2YgemFsbG9jIGFuZCB6ZnJlZS4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjdXN0b20KLSAgIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGUgY29tcHJlc3Npb24gbGlicmFyeSBhdHRhY2hlcyBubyBtZWFuaW5nIHRvIHRoZQorICAgICBUaGUgb3BhcXVlIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QKKyAgIHBhcmFtZXRlciBmb3IgY2FsbHMgb2YgemFsbG9jIGFuZCB6ZnJlZS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3VzdG9tCisgICBtZW1vcnkgbWFuYWdlbWVudC4gIFRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGF0dGFjaGVzIG5vIG1lYW5pbmcgdG8gdGhlCiAgICBvcGFxdWUgdmFsdWUuCiAKLSAgIHphbGxvYyBtdXN0IHJldHVybiBaX05VTEwgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBvYmplY3QuCisgICAgIHphbGxvYyBtdXN0IHJldHVybiBaX05VTEwgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBvYmplY3QuCiAgICBJZiB6bGliIGlzIHVzZWQgaW4gYSBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbiwgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlCiAgICB0aHJlYWQgc2FmZS4KIAotICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlIGFibGUgdG8gYWxsb2NhdGUKLSAgIGV4YWN0bHkgNjU1MzYgYnl0ZXMsIGJ1dCB3aWxsIG5vdCBiZSByZXF1aXJlZCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gdGhpcwotICAgaWYgdGhlIHN5bWJvbCBNQVhTRUdfNjRLIGlzIGRlZmluZWQgKHNlZSB6Y29uZi5oKS4gV0FSTklORzogT24gTVNET1MsCi0gICBwb2ludGVycyByZXR1cm5lZCBieSB6YWxsb2MgZm9yIG9iamVjdHMgb2YgZXhhY3RseSA2NTUzNiBieXRlcyAqbXVzdCoKLSAgIGhhdmUgdGhlaXIgb2Zmc2V0IG5vcm1hbGl6ZWQgdG8gemVyby4gVGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbgotICAgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5IGVuc3VyZXMgdGhpcyAoc2VlIHp1dGlsLmMpLiBUbyByZWR1Y2UgbWVtb3J5Ci0gICByZXF1aXJlbWVudHMgYW5kIGF2b2lkIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZgotICAgY29tcHJlc3Npb24gcmF0aW8sIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgorICAgICBPbiAxNi1iaXQgc3lzdGVtcywgdGhlIGZ1bmN0aW9ucyB6YWxsb2MgYW5kIHpmcmVlIG11c3QgYmUgYWJsZSB0byBhbGxvY2F0ZQorICAgZXhhY3RseSA2NTUzNiBieXRlcywgYnV0IHdpbGwgbm90IGJlIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiB0aGlzIGlmCisgICB0aGUgc3ltYm9sIE1BWFNFR182NEsgaXMgZGVmaW5lZCAoc2VlIHpjb25mLmgpLiAgV0FSTklORzogT24gTVNET1MsIHBvaW50ZXJzCisgICByZXR1cm5lZCBieSB6YWxsb2MgZm9yIG9iamVjdHMgb2YgZXhhY3RseSA2NTUzNiBieXRlcyAqbXVzdCogaGF2ZSB0aGVpcgorICAgb2Zmc2V0IG5vcm1hbGl6ZWQgdG8gemVyby4gIFRoZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb24gcHJvdmlkZWQgYnkgdGhpcworICAgbGlicmFyeSBlbnN1cmVzIHRoaXMgKHNlZSB6dXRpbC5jKS4gIFRvIHJlZHVjZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBhdm9pZAorICAgYW55IGFsbG9jYXRpb24gb2YgNjRLIG9iamVjdHMsIGF0IHRoZSBleHBlbnNlIG9mIGNvbXByZXNzaW9uIHJhdGlvLCBjb21waWxlCisgICB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCiAKLSAgIFRoZSBmaWVsZHMgdG90YWxfaW4gYW5kIHRvdGFsX291dCBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvcgotICAgcHJvZ3Jlc3MgcmVwb3J0cy4gQWZ0ZXIgY29tcHJlc3Npb24sIHRvdGFsX2luIGhvbGRzIHRoZSB0b3RhbCBzaXplIG9mCi0gICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYW5kIG1heSBiZSBzYXZlZCBmb3IgdXNlIGluIHRoZSBkZWNvbXByZXNzb3IKLSAgIChwYXJ0aWN1bGFybHkgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4KLSAgIGEgc2luZ2xlIHN0ZXApLgorICAgICBUaGUgZmllbGRzIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgY2FuIGJlIHVzZWQgZm9yIHN0YXRpc3RpY3Mgb3IgcHJvZ3Jlc3MKKyAgIHJlcG9ydHMuICBBZnRlciBjb21wcmVzc2lvbiwgdG90YWxfaW4gaG9sZHMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBhbmQgbWF5IGJlIHNhdmVkIGZvciB1c2UgaW4gdGhlIGRlY29tcHJlc3NvciAocGFydGljdWxhcmx5CisgICBpZiB0aGUgZGVjb21wcmVzc29yIHdhbnRzIHRvIGRlY29tcHJlc3MgZXZlcnl0aGluZyBpbiBhIHNpbmdsZSBzdGVwKS4KICovCiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0YW50cyAqLwogCiAjZGVmaW5lIFpfTk9fRkxVU0ggICAgICAwCi0jZGVmaW5lIFpfUEFSVElBTF9GTFVTSCAxIC8qIHdpbGwgYmUgcmVtb3ZlZCwgdXNlIFpfU1lOQ19GTFVTSCBpbnN0ZWFkICovCisjZGVmaW5lIFpfUEFSVElBTF9GTFVTSCAxCiAjZGVmaW5lIFpfU1lOQ19GTFVTSCAgICAyCiAjZGVmaW5lIFpfRlVMTF9GTFVTSCAgICAzCiAjZGVmaW5lIFpfRklOSVNIICAgICAgICA0CiAjZGVmaW5lIFpfQkxPQ0sgICAgICAgICA1CisjZGVmaW5lIFpfVFJFRVMgICAgICAgICA2CiAvKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovCiAKICNkZWZpbmUgWl9PSyAgICAgICAgICAgIDAKQEAgLTE3Niw4ICsxNzksOCBAQAogI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCiAjZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKICNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKLS8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQotICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KKy8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXMKKyAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KICAqLwogCiAjZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCkBAIC0yMDcsMTE5ICsyMTAsMTQxIEBACiAjZGVmaW5lIHpsaWJfdmVyc2lvbiB6bGliVmVyc2lvbigpCiAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIDwgMS4wLjIgKi8KIAorCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNpYyBmdW5jdGlvbnMgKi8KIAogWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCB6bGliVmVyc2lvbiBPRigodm9pZCkpOwogLyogVGhlIGFwcGxpY2F0aW9uIGNhbiBjb21wYXJlIHpsaWJWZXJzaW9uIGFuZCBaTElCX1ZFUlNJT04gZm9yIGNvbnNpc3RlbmN5LgotICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMKLSAgIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHpsaWIuaCBoZWFkZXIgZmlsZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAgIFRoaXMgY2hlY2sgaXMgYXV0b21hdGljYWxseSBtYWRlIGJ5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdC4KKyAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzIG5vdAorICAgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGlzIGNoZWNrCisgICBpcyBhdXRvbWF0aWNhbGx5IG1hZGUgYnkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0LgogICovCiAKIC8qCiBaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0IE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsKSk7CiAKLSAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKLSAgIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieSB0aGUgY2FsbGVyLgotICAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgZGVmbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvCi0gICB1c2UgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgY29tcHJlc3Npb24uICBUaGUgZmllbGRzCisgICB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4gIElmCisgICB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBkZWZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8gdXNlIGRlZmF1bHQKKyAgIGFsbG9jYXRpb24gZnVuY3Rpb25zLgogCiAgICAgIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBtdXN0IGJlIFpfREVGQVVMVF9DT01QUkVTU0lPTiwgb3IgYmV0d2VlbiAwIGFuZCA5OgotICAgMSBnaXZlcyBiZXN0IHNwZWVkLCA5IGdpdmVzIGJlc3QgY29tcHJlc3Npb24sIDAgZ2l2ZXMgbm8gY29tcHJlc3Npb24gYXQKLSAgIGFsbCAodGhlIGlucHV0IGRhdGEgaXMgc2ltcGx5IGNvcGllZCBhIGJsb2NrIGF0IGEgdGltZSkuCi0gICBaX0RFRkFVTFRfQ09NUFJFU1NJT04gcmVxdWVzdHMgYSBkZWZhdWx0IGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQKLSAgIGNvbXByZXNzaW9uIChjdXJyZW50bHkgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KKyAgIDEgZ2l2ZXMgYmVzdCBzcGVlZCwgOSBnaXZlcyBiZXN0IGNvbXByZXNzaW9uLCAwIGdpdmVzIG5vIGNvbXByZXNzaW9uIGF0IGFsbAorICAgKHRoZSBpbnB1dCBkYXRhIGlzIHNpbXBseSBjb3BpZWQgYSBibG9jayBhdCBhIHRpbWUpLiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OCisgICByZXF1ZXN0cyBhIGRlZmF1bHQgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZCBjb21wcmVzc2lvbiAoY3VycmVudGx5CisgICBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgogCi0gICAgIGRlZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwKKyAgICAgZGVmbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGxldmVsIGlzIG5vdCBhIHZhbGlkIGNvbXByZXNzaW9uIGxldmVsLCBvcgogICAgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiAoemxpYl92ZXJzaW9uKSBpcyBpbmNvbXBhdGlibGUKLSAgIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLgotICAgbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdCBkb2VzIG5vdAotICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KKyAgIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLiAgbXNnIGlzIHNldCB0byBudWxsCisgICBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246CisgICB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCiAqLwogCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOwogLyoKICAgICBkZWZsYXRlIGNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKLSAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlIHNvbWUKLSAgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiAgSXQgbWF5IGludHJvZHVjZQorICBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCiAgIGZvcmNlZCB0byBmbHVzaC4KIAotICAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGRlZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCisgICAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gIGRlZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCiAgIGZvbGxvd2luZyBhY3Rpb25zOgogCiAgIC0gQ29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KLSAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGFjY29yZGluZ2x5LiAgSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAogICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBhbmQgYXZhaWxfaW4gYXJlIHVwZGF0ZWQgYW5kCiAgICAgcHJvY2Vzc2luZyB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KIAogICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0Ci0gICAgYWNjb3JkaW5nbHkuIFRoaXMgYWN0aW9uIGlzIGZvcmNlZCBpZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIG5vbiB6ZXJvLgorICAgIGFjY29yZGluZ2x5LiAgVGhpcyBhY3Rpb24gaXMgZm9yY2VkIGlmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgbm9uIHplcm8uCiAgICAgRm9yY2luZyBmbHVzaCBmcmVxdWVudGx5IGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbywgc28gdGhpcyBwYXJhbWV0ZXIKLSAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuCi0gICAgU29tZSBvdXRwdXQgbWF5IGJlIHByb3ZpZGVkIGV2ZW4gaWYgZmx1c2ggaXMgbm90IHNldC4KKyAgICBzaG91bGQgYmUgc2V0IG9ubHkgd2hlbiBuZWNlc3NhcnkgKGluIGludGVyYWN0aXZlIGFwcGxpY2F0aW9ucykuICBTb21lCisgICAgb3V0cHV0IG1heSBiZSBwcm92aWRlZCBldmVuIGlmIGZsdXNoIGlzIG5vdCBzZXQuCiAKLSAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAotICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKLSAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyBhdmFpbF9pbiBvciBhdmFpbF9vdXQgYWNjb3JkaW5nbHk7IGF2YWlsX291dAotICBzaG91bGQgbmV2ZXIgYmUgemVybyBiZWZvcmUgdGhlIGNhbGwuIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUKLSAgY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsCi0gIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZiBkZWZsYXRlKCkuIElmIGRlZmxhdGUgcmV0dXJucyBaX09LCi0gIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUKLSAgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAorICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcgbW9yZQorICBvdXRwdXQsIGFuZCB1cGRhdGluZyBhdmFpbF9pbiBvciBhdmFpbF9vdXQgYWNjb3JkaW5nbHk7IGF2YWlsX291dCBzaG91bGQKKyAgbmV2ZXIgYmUgemVybyBiZWZvcmUgdGhlIGNhbGwuICBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIGNvbXByZXNzZWQKKyAgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvciBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoYXZhaWxfb3V0CisgID09IDApLCBvciBhZnRlciBlYWNoIGNhbGwgb2YgZGVmbGF0ZSgpLiAgSWYgZGVmbGF0ZSByZXR1cm5zIFpfT0sgYW5kIHdpdGgKKyAgemVybyBhdmFpbF9vdXQsIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQKKyAgYnVmZmVyIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KIAogICAgIE5vcm1hbGx5IHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfTk9fRkxVU0gsIHdoaWNoIGFsbG93cyBkZWZsYXRlIHRvCi0gIGRlY2lkZSBob3cgbXVjaCBkYXRhIHRvIGFjY3VtdWFsdGUgYmVmb3JlIHByb2R1Y2luZyBvdXRwdXQsIGluIG9yZGVyIHRvCisgIGRlY2lkZSBob3cgbXVjaCBkYXRhIHRvIGFjY3VtdWxhdGUgYmVmb3JlIHByb2R1Y2luZyBvdXRwdXQsIGluIG9yZGVyIHRvCiAgIG1heGltaXplIGNvbXByZXNzaW9uLgogCiAgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9TWU5DX0ZMVVNILCBhbGwgcGVuZGluZyBvdXRwdXQgaXMKICAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28KLSAgdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gKEluIHBhcnRpY3VsYXIKLSAgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkCi0gIGJlZm9yZSB0aGUgY2FsbC4pICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbgotICBhbGdvcml0aG1zIGFuZCBzbyBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgorICB0aGF0IHRoZSBkZWNvbXByZXNzb3IgY2FuIGdldCBhbGwgaW5wdXQgZGF0YSBhdmFpbGFibGUgc28gZmFyLiAgKEluCisgIHBhcnRpY3VsYXIgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuCisgIHByb3ZpZGVkIGJlZm9yZSB0aGUgY2FsbC4pIEZsdXNoaW5nIG1heSBkZWdyYWRlIGNvbXByZXNzaW9uIGZvciBzb21lCisgIGNvbXByZXNzaW9uIGFsZ29yaXRobXMgYW5kIHNvIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuICBUaGlzCisgIGNvbXBsZXRlcyB0aGUgY3VycmVudCBkZWZsYXRlIGJsb2NrIGFuZCBmb2xsb3dzIGl0IHdpdGggYW4gZW1wdHkgc3RvcmVkIGJsb2NrCisgIHRoYXQgaXMgdGhyZWUgYml0cyBwbHVzIGZpbGxlciBiaXRzIHRvIHRoZSBuZXh0IGJ5dGUsIGZvbGxvd2VkIGJ5IGZvdXIgYnl0ZXMKKyAgKDAwIDAwIGZmIGZmKS4KKworICAgIElmIGZsdXNoIGlzIHNldCB0byBaX1BBUlRJQUxfRkxVU0gsIGFsbCBwZW5kaW5nIG91dHB1dCBpcyBmbHVzaGVkIHRvIHRoZQorICBvdXRwdXQgYnVmZmVyLCBidXQgdGhlIG91dHB1dCBpcyBub3QgYWxpZ25lZCB0byBhIGJ5dGUgYm91bmRhcnkuICBBbGwgb2YgdGhlCisgIGlucHV0IGRhdGEgc28gZmFyIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBkZWNvbXByZXNzb3IsIGFzIGZvciBaX1NZTkNfRkxVU0guCisgIFRoaXMgY29tcGxldGVzIHRoZSBjdXJyZW50IGRlZmxhdGUgYmxvY2sgYW5kIGZvbGxvd3MgaXQgd2l0aCBhbiBlbXB0eSBmaXhlZAorICBjb2RlcyBibG9jayB0aGF0IGlzIDEwIGJpdHMgbG9uZy4gIFRoaXMgYXNzdXJlcyB0aGF0IGVub3VnaCBieXRlcyBhcmUgb3V0cHV0CisgIGluIG9yZGVyIGZvciB0aGUgZGVjb21wcmVzc29yIHRvIGZpbmlzaCB0aGUgYmxvY2sgYmVmb3JlIHRoZSBlbXB0eSBmaXhlZCBjb2RlCisgIGJsb2NrLgorCisgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfQkxPQ0ssIGEgZGVmbGF0ZSBibG9jayBpcyBjb21wbGV0ZWQgYW5kIGVtaXR0ZWQsIGFzCisgIGZvciBaX1NZTkNfRkxVU0gsIGJ1dCB0aGUgb3V0cHV0IGlzIG5vdCBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgYW5kIHVwIHRvCisgIHNldmVuIGJpdHMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgYXJlIGhlbGQgdG8gYmUgd3JpdHRlbiBhcyB0aGUgbmV4dCBieXRlIGFmdGVyCisgIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgaXMgY29tcGxldGVkLiAgSW4gdGhpcyBjYXNlLCB0aGUgZGVjb21wcmVzc29yIG1heSBub3QKKyAgYmUgcHJvdmlkZWQgZW5vdWdoIGJpdHMgYXQgdGhpcyBwb2ludCBpbiBvcmRlciB0byBjb21wbGV0ZSBkZWNvbXByZXNzaW9uIG9mCisgIHRoZSBkYXRhIHByb3ZpZGVkIHNvIGZhciB0byB0aGUgY29tcHJlc3Nvci4gIEl0IG1heSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXh0CisgIGJsb2NrIHRvIGJlIGVtaXR0ZWQuICBUaGlzIGlzIGZvciBhZHZhbmNlZCBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGNvbnRyb2wKKyAgdGhlIGVtaXNzaW9uIG9mIGRlZmxhdGUgYmxvY2tzLgogCiAgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfRlVMTF9GTFVTSCwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKICAgWl9TWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KICAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKLSAgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQorICByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuICBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQogICBjb21wcmVzc2lvbi4KIAogICAgIElmIGRlZmxhdGUgcmV0dXJucyB3aXRoIGF2YWlsX291dCA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCiAgIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKICAgYXZhaWxfb3V0KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlIChkZWZsYXRlIHJldHVybnMgd2l0aCBub24temVybwotICBhdmFpbF9vdXQpLiBJbiB0aGUgY2FzZSBvZiBhIFpfRlVMTF9GTFVTSCBvciBaX1NZTkNfRkxVU0gsIG1ha2Ugc3VyZSB0aGF0CisgIGF2YWlsX291dCkuICBJbiB0aGUgY2FzZSBvZiBhIFpfRlVMTF9GTFVTSCBvciBaX1NZTkNfRkxVU0gsIG1ha2Ugc3VyZSB0aGF0CiAgIGF2YWlsX291dCBpcyBncmVhdGVyIHRoYW4gc2l4IHRvIGF2b2lkIHJlcGVhdGVkIGZsdXNoIG1hcmtlcnMgZHVlIHRvCiAgIGF2YWlsX291dCA9PSAwIG9uIHJldHVybi4KIAogICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwKLSAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIGlmIHRoZXJlCi0gIHdhcyBlbm91Z2ggb3V0cHV0IHNwYWNlOyBpZiBkZWZsYXRlIHJldHVybnMgd2l0aCBaX09LLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKKyAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIGlmIHRoZXJlIHdhcworICBlbm91Z2ggb3V0cHV0IHNwYWNlOyBpZiBkZWZsYXRlIHJldHVybnMgd2l0aCBaX09LLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUKICAgY2FsbGVkIGFnYWluIHdpdGggWl9GSU5JU0ggYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkIGF2YWlsX291dCkgYnV0IG5vCi0gIG1vcmUgaW5wdXQgZGF0YSwgdW50aWwgaXQgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBvciBhbiBlcnJvci4gQWZ0ZXIKLSAgZGVmbGF0ZSBoYXMgcmV0dXJuZWQgWl9TVFJFQU1fRU5ELCB0aGUgb25seSBwb3NzaWJsZSBvcGVyYXRpb25zIG9uIHRoZQotICBzdHJlYW0gYXJlIGRlZmxhdGVSZXNldCBvciBkZWZsYXRlRW5kLgorICBtb3JlIGlucHV0IGRhdGEsIHVudGlsIGl0IHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IuICBBZnRlcgorICBkZWZsYXRlIGhhcyByZXR1cm5lZCBaX1NUUkVBTV9FTkQsIHRoZSBvbmx5IHBvc3NpYmxlIG9wZXJhdGlvbnMgb24gdGhlIHN0cmVhbQorICBhcmUgZGVmbGF0ZVJlc2V0IG9yIGRlZmxhdGVFbmQuCiAKICAgICBaX0ZJTklTSCBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCBpZiBhbGwgdGhlIGNvbXByZXNzaW9uCi0gIGlzIHRvIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcC4gSW4gdGhpcyBjYXNlLCBhdmFpbF9vdXQgbXVzdCBiZSBhdCBsZWFzdAotICB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVmbGF0ZUJvdW5kIChzZWUgYmVsb3cpLiBJZiBkZWZsYXRlIGRvZXMgbm90IHJldHVybgotICBaX1NUUkVBTV9FTkQsIHRoZW4gaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgorICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuICBJbiB0aGlzIGNhc2UsIGF2YWlsX291dCBtdXN0IGJlIGF0IGxlYXN0IHRoZQorICB2YWx1ZSByZXR1cm5lZCBieSBkZWZsYXRlQm91bmQgKHNlZSBiZWxvdykuICBUaGVuIGRlZmxhdGUgaXMgZ3VhcmFudGVlZCB0bworICByZXR1cm4gWl9TVFJFQU1fRU5ELiAgSWYgbm90IGVub3VnaCBvdXRwdXQgc3BhY2UgaXMgcHJvdmlkZWQsIGRlZmxhdGUgd2lsbAorICBub3QgcmV0dXJuIFpfU1RSRUFNX0VORCwgYW5kIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFzIGRlc2NyaWJlZCBhYm92ZS4KIAogICAgIGRlZmxhdGUoKSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBpbnB1dCByZWFkCiAgIHNvIGZhciAodGhhdCBpcywgdG90YWxfaW4gYnl0ZXMpLgogCiAgICAgZGVmbGF0ZSgpIG1heSB1cGRhdGUgc3RybS0+ZGF0YV90eXBlIGlmIGl0IGNhbiBtYWtlIGEgZ29vZCBndWVzcyBhYm91dAotICB0aGUgaW5wdXQgZGF0YSB0eXBlIChaX0JJTkFSWSBvciBaX1RFWFQpLiBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAotICBiaW5hcnkuIFRoaXMgZmllbGQgaXMgb25seSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMgYW5kIGRvZXMgbm90IGFmZmVjdAotICB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGluIGFueSBtYW5uZXIuCisgIHRoZSBpbnB1dCBkYXRhIHR5cGUgKFpfQklOQVJZIG9yIFpfVEVYVCkuICBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAorICBiaW5hcnkuICBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QgdGhlCisgIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgogCiAgICAgZGVmbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKICAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIGFsbCBpbnB1dCBoYXMgYmVlbgogICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bwogICBaX0ZJTklTSCksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKLSAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgTlVMTCksIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlCi0gIChmb3IgZXhhbXBsZSBhdmFpbF9pbiBvciBhdmFpbF9vdXQgd2FzIHplcm8pLiBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90CisgIGlmIG5leHRfaW4gb3IgbmV4dF9vdXQgd2FzIFpfTlVMTCksIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlCisgIChmb3IgZXhhbXBsZSBhdmFpbF9pbiBvciBhdmFpbF9vdXQgd2FzIHplcm8pLiAgTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdAogICBmYXRhbCwgYW5kIGRlZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQKICAgc3BhY2UgdG8gY29udGludWUgY29tcHJlc3NpbmcuCiAqLwpAQCAtMzI4LDEzICszNTMsMTMgQEAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKIC8qCiAgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCi0gICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55Ci0gICBwZW5kaW5nIG91dHB1dC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkgcGVuZGluZworICAgb3V0cHV0LgogCiAgICAgIGRlZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQogICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAotICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiBJbiB0aGUgZXJyb3IgY2FzZSwKLSAgIG1zZyBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlCisgICBwcmVtYXR1cmVseSAoc29tZSBpbnB1dCBvciBvdXRwdXQgd2FzIGRpc2NhcmRlZCkuICBJbiB0aGUgZXJyb3IgY2FzZSwgbXNnCisgICBtYXkgYmUgc2V0IGJ1dCB0aGVuIHBvaW50cyB0byBhIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlCiAgICBkZWFsbG9jYXRlZCkuCiAqLwogCkBAIC0zNDIsMTAgKzM2NywxMCBAQAogLyoKIFpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7CiAKLSAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbi4gVGhlIGZpZWxkcworICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uLiAgVGhlIGZpZWxkcwogICAgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQotICAgdGhlIGNhbGxlci4gSWYgbmV4dF9pbiBpcyBub3QgWl9OVUxMIGFuZCBhdmFpbF9pbiBpcyBsYXJnZSBlbm91Z2ggKHRoZSBleGFjdAotICAgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kKSwgaW5mbGF0ZUluaXQgZGV0ZXJtaW5lcyB0aGUKKyAgIHRoZSBjYWxsZXIuICBJZiBuZXh0X2luIGlzIG5vdCBaX05VTEwgYW5kIGF2YWlsX2luIGlzIGxhcmdlIGVub3VnaCAodGhlCisgICBleGFjdCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjb21wcmVzc2lvbiBtZXRob2QpLCBpbmZsYXRlSW5pdCBkZXRlcm1pbmVzIHRoZQogICAgY29tcHJlc3Npb24gbWV0aG9kIGZyb20gdGhlIHpsaWIgaGVhZGVyIGFuZCBhbGxvY2F0ZXMgYWxsIGRhdGEgc3RydWN0dXJlcwogICAgYWNjb3JkaW5nbHk7IG90aGVyd2lzZSB0aGUgYWxsb2NhdGlvbiB3aWxsIGJlIGRlZmVycmVkIHRvIHRoZSBmaXJzdCBjYWxsIG9mCiAgICBpbmZsYXRlLiAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgaW5mbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvCkBAIC0zNTMsOTUgKzM3OCwxMTYgQEAKIAogICAgICBpbmZsYXRlSW5pdCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKICAgIG1lbW9yeSwgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLiAgbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yCi0gICBtZXNzYWdlLiBpbmZsYXRlSW5pdCBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uIGFwYXJ0IGZyb20gcmVhZGluZwotICAgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZAotICAgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW5jaGFuZ2VkLikKKyAgIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgcGFyYW1ldGVycyBhcmUKKyAgIGludmFsaWQsIHN1Y2ggYXMgYSBudWxsIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZS4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZgorICAgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGluZmxhdGVJbml0IGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24KKyAgIGFwYXJ0IGZyb20gcG9zc2libHkgcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogYWN0dWFsIGRlY29tcHJlc3Npb24KKyAgIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQKKyAgIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVudXNlZCBhbmQgdW5jaGFuZ2VkLikgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KKyAgIG9mIGluZmxhdGVJbml0KCkgZG9lcyBub3QgcHJvY2VzcyBhbnkgaGVhZGVyIGluZm9ybWF0aW9uIC0tIHRoYXQgaXMgZGVmZXJyZWQKKyAgIHVudGlsIGluZmxhdGUoKSBpcyBjYWxsZWQuCiAqLwogCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZSBPRigoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCkpOwogLyoKICAgICBpbmZsYXRlIGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAotICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBpbnRyb2R1Y2UKKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiAgSXQgbWF5IGludHJvZHVjZQogICBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCiAgIGZvcmNlZCB0byBmbHVzaC4KIAotICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiBpbmZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQorICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiAgaW5mbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKICAgZm9sbG93aW5nIGFjdGlvbnM6CiAKICAgLSBEZWNvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgbmV4dF9pbiBhbmQgdXBkYXRlIG5leHRfaW4gYW5kIGF2YWlsX2luCi0gICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKLSAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIG5leHRfaW4gaXMgdXBkYXRlZCBhbmQgcHJvY2Vzc2luZwotICAgIHdpbGwgcmVzdW1lIGF0IHRoaXMgcG9pbnQgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgorICAgIGFjY29yZGluZ2x5LiAgSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nIHdpbGwKKyAgICByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCiAKICAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAotICAgIGFjY29yZGluZ2x5LiAgaW5mbGF0ZSgpIHByb3ZpZGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlLCB1bnRpbCB0aGVyZQotICAgIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIChzZWUgYmVsb3cKLSAgICBhYm91dCB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KKyAgICBhY2NvcmRpbmdseS4gIGluZmxhdGUoKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwgdW50aWwgdGhlcmUgaXMKKyAgICBubyBtb3JlIGlucHV0IGRhdGEgb3Igbm8gbW9yZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAoc2VlIGJlbG93IGFib3V0CisgICAgdGhlIGZsdXNoIHBhcmFtZXRlcikuCiAKLSAgQmVmb3JlIHRoZSBjYWxsIG9mIGluZmxhdGUoKSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCBhdCBsZWFzdAotICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKLSAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyB0aGUgbmV4dF8qIGFuZCBhdmFpbF8qIHZhbHVlcyBhY2NvcmRpbmdseS4KLSAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSB1bmNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvcgotICBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoYXZhaWxfb3V0ID09IDApLCBvciBhZnRlciBlYWNoCi0gIGNhbGwgb2YgaW5mbGF0ZSgpLiBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQKLSAgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZQotICBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgorICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKKyAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nIG1vcmUKKyAgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuICBUaGUKKyAgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUKKyAgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZgorICBpbmZsYXRlKCkuICBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQgbXVzdCBiZQorICBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZQorICBtb3JlIG91dHB1dCBwZW5kaW5nLgogCi0gICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwKLSAgWl9GSU5JU0gsIG9yIFpfQkxPQ0suIFpfU1lOQ19GTFVTSCByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBmbHVzaCBhcyBtdWNoCi0gIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gWl9CTE9DSyByZXF1ZXN0cyB0aGF0IGluZmxhdGUoKSBzdG9wCi0gIGlmIGFuZCB3aGVuIGl0IGdldHMgdG8gdGhlIG5leHQgZGVmbGF0ZSBibG9jayBib3VuZGFyeS4gV2hlbiBkZWNvZGluZyB0aGUKLSAgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIKLSAgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gV2hlbiBkb2luZyBhIHJhdyBpbmZsYXRlLCBpbmZsYXRlKCkKLSAgd2lsbCBnbyBhaGVhZCBhbmQgcHJvY2VzcyB0aGUgZmlyc3QgYmxvY2ssIGFuZCB3aWxsIHJldHVybiB3aGVuIGl0IGdldHMgdG8KLSAgdGhlIGVuZCBvZiB0aGF0IGJsb2NrLCBvciB3aGVuIGl0IHJ1bnMgb3V0IG9mIGRhdGEuCisgICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwgWl9GSU5JU0gsCisgIFpfQkxPQ0ssIG9yIFpfVFJFRVMuICBaX1NZTkNfRkxVU0ggcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgZmx1c2ggYXMgbXVjaAorICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuICBaX0JMT0NLIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpCisgIHN0b3AgaWYgYW5kIHdoZW4gaXQgZ2V0cyB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiAgV2hlbiBkZWNvZGluZworICB0aGUgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkKKyAgYWZ0ZXIgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwKKyAgaW5mbGF0ZSgpIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4gd2hlbiBpdAorICBnZXRzIHRvIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgogCiAgICAgVGhlIFpfQkxPQ0sgb3B0aW9uIGFzc2lzdHMgaW4gYXBwZW5kaW5nIHRvIG9yIGNvbWJpbmluZyBkZWZsYXRlIHN0cmVhbXMuCiAgIEFsc28gdG8gYXNzaXN0IGluIHRoaXMsIG9uIHJldHVybiBpbmZsYXRlKCkgd2lsbCBzZXQgc3RybS0+ZGF0YV90eXBlIHRvIHRoZQotICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQKLSAgaWYgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sCi0gIHBsdXMgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sKLSAgY29kZSBvciBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZQotICBkZWZsYXRlIHN0cmVhbS4gVGhlIGVuZC1vZi1ibG9jayB3aWxsIG5vdCBiZSBpbmRpY2F0ZWQgdW50aWwgYWxsIG9mIHRoZQotICB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIHRoYXQgYmxvY2sgaGFzIGJlZW4gd3JpdHRlbiB0byBzdHJtLT5uZXh0X291dC4gIFRoZQotICBudW1iZXIgb2YgdW51c2VkIGJpdHMgbWF5IGluIGdlbmVyYWwgYmUgZ3JlYXRlciB0aGFuIHNldmVuLCBleGNlcHQgd2hlbgotICBiaXQgNyBvZiBkYXRhX3R5cGUgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgd2lsbCBiZQotICBsZXNzIHRoYW4gZWlnaHQuCisgIG51bWJlciBvZiB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCBieXRlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pbiwgcGx1cyA2NCBpZgorICBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBkZWZsYXRlIHN0cmVhbSwgcGx1cworICAxMjggaWYgaW5mbGF0ZSgpIHJldHVybmVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlY29kaW5nIGFuIGVuZC1vZi1ibG9jayBjb2RlIG9yCisgIGRlY29kaW5nIHRoZSBjb21wbGV0ZSBoZWFkZXIgdXAgdG8ganVzdCBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGRlZmxhdGUKKyAgc3RyZWFtLiAgVGhlIGVuZC1vZi1ibG9jayB3aWxsIG5vdCBiZSBpbmRpY2F0ZWQgdW50aWwgYWxsIG9mIHRoZSB1bmNvbXByZXNzZWQKKyAgZGF0YSBmcm9tIHRoYXQgYmxvY2sgaGFzIGJlZW4gd3JpdHRlbiB0byBzdHJtLT5uZXh0X291dC4gIFRoZSBudW1iZXIgb2YKKyAgdW51c2VkIGJpdHMgbWF5IGluIGdlbmVyYWwgYmUgZ3JlYXRlciB0aGFuIHNldmVuLCBleGNlcHQgd2hlbiBiaXQgNyBvZgorICBkYXRhX3R5cGUgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgd2lsbCBiZSBsZXNzIHRoYW4KKyAgZWlnaHQuICBkYXRhX3R5cGUgaXMgc2V0IGFzIG5vdGVkIGhlcmUgZXZlcnkgdGltZSBpbmZsYXRlKCkgcmV0dXJucyBmb3IgYWxsCisgIGZsdXNoIG9wdGlvbnMsIGFuZCBzbyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBjdXJyZW50bHkKKyAgY29uc3VtZWQgaW5wdXQgaW4gYml0cy4KKworICAgIFRoZSBaX1RSRUVTIG9wdGlvbiBiZWhhdmVzIGFzIFpfQkxPQ0sgZG9lcywgYnV0IGl0IGFsc28gcmV0dXJucyB3aGVuIHRoZQorICBlbmQgb2YgZWFjaCBkZWZsYXRlIGJsb2NrIGhlYWRlciBpcyByZWFjaGVkLCBiZWZvcmUgYW55IGFjdHVhbCBkYXRhIGluIHRoYXQKKyAgYmxvY2sgaXMgZGVjb2RlZC4gIFRoaXMgYWxsb3dzIHRoZSBjYWxsZXIgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlCisgIGRlZmxhdGUgYmxvY2sgaGVhZGVyIGZvciBsYXRlciB1c2UgaW4gcmFuZG9tIGFjY2VzcyB3aXRoaW4gYSBkZWZsYXRlIGJsb2NrLgorICAyNTYgaXMgYWRkZWQgdG8gdGhlIHZhbHVlIG9mIHN0cm0tPmRhdGFfdHlwZSB3aGVuIGluZmxhdGUoKSByZXR1cm5zCisgIGltbWVkaWF0ZWx5IGFmdGVyIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgYmxvY2sgaGVhZGVyLgogCiAgICAgaW5mbGF0ZSgpIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyBaX1NUUkVBTV9FTkQgb3IgYW4KLSAgZXJyb3IuIEhvd2V2ZXIgaWYgYWxsIGRlY29tcHJlc3Npb24gaXMgdG8gYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIHN0ZXAKLSAgKGEgc2luZ2xlIGNhbGwgb2YgaW5mbGF0ZSksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bwotICBaX0ZJTklTSC4gSW4gdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcKLSAgb3V0cHV0IGlzIGZsdXNoZWQ7IGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKLSAgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbiBzYXZlZAotICBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcyBwdXJwb3NlLikgVGhlIG5leHQgb3BlcmF0aW9uIG9uIHRoaXMgc3RyZWFtIG11c3QKLSAgYmUgaW5mbGF0ZUVuZCB0byBkZWFsbG9jYXRlIHRoZSBkZWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgdXNlIG9mIFpfRklOSVNICi0gIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciBhcHByb2FjaAotICBtYXkgYmUgdXNlZCBmb3IgdGhlIHNpbmdsZSBpbmZsYXRlKCkgY2FsbC4KKyAgZXJyb3IuICBIb3dldmVyIGlmIGFsbCBkZWNvbXByZXNzaW9uIGlzIHRvIGJlIHBlcmZvcm1lZCBpbiBhIHNpbmdsZSBzdGVwIChhCisgIHNpbmdsZSBjYWxsIG9mIGluZmxhdGUpLCB0aGUgcGFyYW1ldGVyIGZsdXNoIHNob3VsZCBiZSBzZXQgdG8gWl9GSU5JU0guICBJbgorICB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZDsKKyAgYXZhaWxfb3V0IG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBmb3IgdGhlCisgIG9wZXJhdGlvbiB0byBjb21wbGV0ZS4gIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbgorICBzYXZlZCBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcyBwdXJwb3NlLikgVGhlIHVzZSBvZiBaX0ZJTklTSCBpcyBub3QKKyAgcmVxdWlyZWQgdG8gcGVyZm9ybSBhbiBpbmZsYXRpb24gaW4gb25lIHN0ZXAuICBIb3dldmVyIGl0IG1heSBiZSB1c2VkIHRvCisgIGluZm9ybSBpbmZsYXRlIHRoYXQgYSBmYXN0ZXIgYXBwcm9hY2ggY2FuIGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgaW5mbGF0ZSgpCisgIGNhbGwuICBaX0ZJTklTSCBhbHNvIGluZm9ybXMgaW5mbGF0ZSB0byBub3QgbWFpbnRhaW4gYSBzbGlkaW5nIHdpbmRvdyBpZiB0aGUKKyAgc3RyZWFtIGNvbXBsZXRlcywgd2hpY2ggcmVkdWNlcyBpbmZsYXRlJ3MgbWVtb3J5IGZvb3RwcmludC4gIElmIHRoZSBzdHJlYW0KKyAgZG9lcyBub3QgY29tcGxldGUsIGVpdGhlciBiZWNhdXNlIG5vdCBhbGwgb2YgdGhlIHN0cmVhbSBpcyBwcm92aWRlZCBvciBub3QKKyAgZW5vdWdoIG91dHB1dCBzcGFjZSBpcyBwcm92aWRlZCwgdGhlbiBhIHNsaWRpbmcgd2luZG93IHdpbGwgYmUgYWxsb2NhdGVkIGFuZAorICBpbmZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB0byBjb250aW51ZSB0aGUgb3BlcmF0aW9uIGFzIGlmIFpfTk9fRkxVU0ggaGFkCisgIGJlZW4gdXNlZC4KIAogICAgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBpbmZsYXRlKCkgYWx3YXlzIGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQgYXMKICAgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIsIGFuZCBhbHdheXMgdXNlcyB0aGUgZmFzdGVyIGFwcHJvYWNoIG9uIHRoZQotICBmaXJzdCBjYWxsLiBTbyB0aGUgb25seSBlZmZlY3Qgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBpbiB0aGlzIGltcGxlbWVudGF0aW9uCi0gIGlzIG9uIHRoZSByZXR1cm4gdmFsdWUgb2YgaW5mbGF0ZSgpLCBhcyBub3RlZCBiZWxvdywgb3Igd2hlbiBpdCByZXR1cm5zIGVhcmx5Ci0gIGJlY2F1c2UgWl9CTE9DSyBpcyB1c2VkLgorICBmaXJzdCBjYWxsLiAgU28gdGhlIGVmZmVjdHMgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBpbiB0aGlzIGltcGxlbWVudGF0aW9uIGFyZQorICBvbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGluZmxhdGUoKSBhcyBub3RlZCBiZWxvdywgd2hlbiBpbmZsYXRlKCkgcmV0dXJucyBlYXJseQorICB3aGVuIFpfQkxPQ0sgb3IgWl9UUkVFUyBpcyB1c2VkLCBhbmQgd2hlbiBpbmZsYXRlKCkgYXZvaWRzIHRoZSBhbGxvY2F0aW9uIG9mCisgIG1lbW9yeSBmb3IgYSBzbGlkaW5nIHdpbmRvdyB3aGVuIFpfRklOSVNIIGlzIHVzZWQuCiAKICAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYWZ0ZXIgdGhpcyBjYWxsIChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKLSAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlIGRpY3Rpb25hcnkKKyAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mIHRoZSBkaWN0aW9uYXJ5CiAgIGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX05FRURfRElDVDsgb3RoZXJ3aXNlIGl0IHNldHMKLSAgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIG91dHB1dCBwcm9kdWNlZCBzbyBmYXIgKHRoYXQgaXMsCisgIHN0cm0tPmFkbGVyIHRvIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkIHNvIGZhciAodGhhdCBpcywKICAgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQKLSAgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgaW5mbGF0ZSgpIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCBhZGxlcjMyCisgIGJlbG93LiAgQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCBpbmZsYXRlKCkgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIGFkbGVyMzIKICAgY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX1NUUkVBTV9FTkQKICAgb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KIAotICAgIGluZmxhdGUoKSB3aWxsIGRlY29tcHJlc3MgYW5kIGNoZWNrIGVpdGhlciB6bGliLXdyYXBwZWQgb3IgZ3ppcC13cmFwcGVkCi0gIGRlZmxhdGUgZGF0YS4gIFRoZSBoZWFkZXIgdHlwZSBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LiAgQW55IGluZm9ybWF0aW9uCi0gIGNvbnRhaW5lZCBpbiB0aGUgZ3ppcCBoZWFkZXIgaXMgbm90IHJldGFpbmVkLCBzbyBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRoYXQKLSAgaW5mb3JtYXRpb24gc2hvdWxkIGluc3RlYWQgdXNlIHJhdyBpbmZsYXRlLCBzZWUgaW5mbGF0ZUluaXQyKCkgYmVsb3csIG9yCi0gIGluZmxhdGVCYWNrKCkgYW5kIHBlcmZvcm0gdGhlaXIgb3duIHByb2Nlc3Npbmcgb2YgdGhlIGd6aXAgaGVhZGVyIGFuZAotICB0cmFpbGVyLgorICAgIGluZmxhdGUoKSBjYW4gZGVjb21wcmVzcyBhbmQgY2hlY2sgZWl0aGVyIHpsaWItd3JhcHBlZCBvciBnemlwLXdyYXBwZWQKKyAgZGVmbGF0ZSBkYXRhLiAgVGhlIGhlYWRlciB0eXBlIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHksIGlmIHJlcXVlc3RlZCB3aGVuCisgIGluaXRpYWxpemluZyB3aXRoIGluZmxhdGVJbml0MigpLiAgQW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZ3ppcAorICBoZWFkZXIgaXMgbm90IHJldGFpbmVkLCBzbyBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRoYXQgaW5mb3JtYXRpb24gc2hvdWxkCisgIGluc3RlYWQgdXNlIHJhdyBpbmZsYXRlLCBzZWUgaW5mbGF0ZUluaXQyKCkgYmVsb3csIG9yIGluZmxhdGVCYWNrKCkgYW5kCisgIHBlcmZvcm0gdGhlaXIgb3duIHByb2Nlc3Npbmcgb2YgdGhlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyLiAgV2hlbiBwcm9jZXNzaW5nCisgIGd6aXAtd3JhcHBlZCBkZWZsYXRlIGRhdGEsIHN0cm0tPmFkbGVyMzIgaXMgc2V0IHRvIHRoZSBDUkMtMzIgb2YgdGhlIG91dHB1dAorICBwcm9kdWN0ZWQgc28gZmFyLiAgVGhlIENSQy0zMiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGd6aXAgdHJhaWxlci4KIAogICAgIGluZmxhdGUoKSByZXR1cm5zIFpfT0sgaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAogICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIFpfU1RSRUFNX0VORCBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCkBAIC00NDksMjcgKzQ5NSwyOCBAQAogICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcwogICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0IGNoZWNrCiAgIHZhbHVlKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKLSAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgTlVMTCksIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSwKKyAgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5LAogICBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZQotICBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCisgIG91dHB1dCBidWZmZXIgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLiAgTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCiAgIGluZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgdG8KLSAgY29udGludWUgZGVjb21wcmVzc2luZy4gSWYgWl9EQVRBX0VSUk9SIGlzIHJldHVybmVkLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4KLSAgY2FsbCBpbmZsYXRlU3luYygpIHRvIGxvb2sgZm9yIGEgZ29vZCBjb21wcmVzc2lvbiBibG9jayBpZiBhIHBhcnRpYWwgcmVjb3ZlcnkKLSAgb2YgdGhlIGRhdGEgaXMgZGVzaXJlZC4KKyAgY29udGludWUgZGVjb21wcmVzc2luZy4gIElmIFpfREFUQV9FUlJPUiBpcyByZXR1cm5lZCwgdGhlIGFwcGxpY2F0aW9uIG1heQorICB0aGVuIGNhbGwgaW5mbGF0ZVN5bmMoKSB0byBsb29rIGZvciBhIGdvb2QgY29tcHJlc3Npb24gYmxvY2sgaWYgYSBwYXJ0aWFsCisgIHJlY292ZXJ5IG9mIHRoZSBkYXRhIGlzIGRlc2lyZWQuCiAqLwogCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKIC8qCiAgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCi0gICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55Ci0gICBwZW5kaW5nIG91dHB1dC4KKyAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkgcGVuZGluZworICAgb3V0cHV0LgogCiAgICAgIGluZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUKLSAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQorICAgd2FzIGluY29uc2lzdGVudC4gIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQogICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgogKi8KIAorCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlZCBmdW5jdGlvbnMgKi8KIAogLyoKQEAgLTQ4NCw1NSArNTMxLDU3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtZW1MZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHN0cmF0ZWd5KSk7CiAKLSAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgZGVmbGF0ZUluaXQgd2l0aCBtb3JlIGNvbXByZXNzaW9uIG9wdGlvbnMuIFRoZQotICAgZmllbGRzIG5leHRfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQotICAgdGhlIGNhbGxlci4KKyAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgZGVmbGF0ZUluaXQgd2l0aCBtb3JlIGNvbXByZXNzaW9uIG9wdGlvbnMuICBUaGUKKyAgIGZpZWxkcyBuZXh0X2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlCisgICBjYWxsZXIuCiAKLSAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gSXQgbXVzdCBiZSBaX0RFRkxBVEVEIGluCisgICAgIFRoZSBtZXRob2QgcGFyYW1ldGVyIGlzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuICBJdCBtdXN0IGJlIFpfREVGTEFURUQgaW4KICAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KIAogICAgICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgdHdvIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUKLSAgICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvciB0aGlzCi0gICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBMYXJnZXIgdmFsdWVzIG9mIHRoaXMgcGFyYW1ldGVyIHJlc3VsdCBpbiBiZXR0ZXIKLSAgIGNvbXByZXNzaW9uIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYKKyAgICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IgdGhpcworICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gIExhcmdlciB2YWx1ZXMgb2YgdGhpcyBwYXJhbWV0ZXIgcmVzdWx0IGluIGJldHRlcgorICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYKICAgIGRlZmxhdGVJbml0IGlzIHVzZWQgaW5zdGVhZC4KIAotICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIC04Li4tMTUgZm9yIHJhdyBkZWZsYXRlLiBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCi0gICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gZGVmbGF0ZSgpIHdpbGwgdGhlbiBnZW5lcmF0ZSByYXcgZGVmbGF0ZSBkYXRhCisgICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGRlZmxhdGUuICBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCisgICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gIGRlZmxhdGUoKSB3aWxsIHRoZW4gZ2VuZXJhdGUgcmF3IGRlZmxhdGUgZGF0YQogICAgd2l0aCBubyB6bGliIGhlYWRlciBvciB0cmFpbGVyLCBhbmQgd2lsbCBub3QgY29tcHV0ZSBhbiBhZGxlcjMyIGNoZWNrIHZhbHVlLgogCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGVuY29kaW5nLiBBZGQKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZW5jb2RpbmcuICBBZGQKICAgIDE2IHRvIHdpbmRvd0JpdHMgdG8gd3JpdGUgYSBzaW1wbGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIgYXJvdW5kIHRoZQotICAgY29tcHJlc3NlZCBkYXRhIGluc3RlYWQgb2YgYSB6bGliIHdyYXBwZXIuIFRoZSBnemlwIGhlYWRlciB3aWxsIGhhdmUgbm8KLSAgIGZpbGUgbmFtZSwgbm8gZXh0cmEgZGF0YSwgbm8gY29tbWVudCwgbm8gbW9kaWZpY2F0aW9uIHRpbWUgKHNldCB0byB6ZXJvKSwKLSAgIG5vIGhlYWRlciBjcmMsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aWxsIGJlIHNldCB0byAyNTUgKHVua25vd24pLiAgSWYgYQorICAgY29tcHJlc3NlZCBkYXRhIGluc3RlYWQgb2YgYSB6bGliIHdyYXBwZXIuICBUaGUgZ3ppcCBoZWFkZXIgd2lsbCBoYXZlIG5vCisgICBmaWxlIG5hbWUsIG5vIGV4dHJhIGRhdGEsIG5vIGNvbW1lbnQsIG5vIG1vZGlmaWNhdGlvbiB0aW1lIChzZXQgdG8gemVybyksIG5vCisgICBoZWFkZXIgY3JjLCBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBiZSBzZXQgdG8gMjU1ICh1bmtub3duKS4gIElmIGEKICAgIGd6aXAgc3RyZWFtIGlzIGJlaW5nIHdyaXR0ZW4sIHN0cm0tPmFkbGVyIGlzIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgogCiAgICAgIFRoZSBtZW1MZXZlbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkCi0gICBmb3IgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiBtZW1MZXZlbD0xIHVzZXMgbWluaW11bSBtZW1vcnkgYnV0Ci0gICBpcyBzbG93IGFuZCByZWR1Y2VzIGNvbXByZXNzaW9uIHJhdGlvOyBtZW1MZXZlbD05IHVzZXMgbWF4aW11bSBtZW1vcnkKLSAgIGZvciBvcHRpbWFsIHNwZWVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiBTZWUgemNvbmYuaCBmb3IgdG90YWwgbWVtb3J5Ci0gICB1c2FnZSBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLgorICAgZm9yIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4gIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQgaXMKKyAgIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87IG1lbUxldmVsPTkgdXNlcyBtYXhpbXVtIG1lbW9yeSBmb3IKKyAgIG9wdGltYWwgc3BlZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiAgU2VlIHpjb25mLmggZm9yIHRvdGFsIG1lbW9yeSB1c2FnZQorICAgYXMgYSBmdW5jdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC4KIAotICAgICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBVc2UgdGhlCisgICAgIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0dW5lIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0uICBVc2UgdGhlCiAgICB2YWx1ZSBaX0RFRkFVTFRfU1RSQVRFR1kgZm9yIG5vcm1hbCBkYXRhLCBaX0ZJTFRFUkVEIGZvciBkYXRhIHByb2R1Y2VkIGJ5IGEKICAgIGZpbHRlciAob3IgcHJlZGljdG9yKSwgWl9IVUZGTUFOX09OTFkgdG8gZm9yY2UgSHVmZm1hbiBlbmNvZGluZyBvbmx5IChubwogICAgc3RyaW5nIG1hdGNoKSwgb3IgWl9STEUgdG8gbGltaXQgbWF0Y2ggZGlzdGFuY2VzIHRvIG9uZSAocnVuLWxlbmd0aAotICAgZW5jb2RpbmcpLiBGaWx0ZXJlZCBkYXRhIGNvbnNpc3RzIG1vc3RseSBvZiBzbWFsbCB2YWx1ZXMgd2l0aCBhIHNvbWV3aGF0Ci0gICByYW5kb20gZGlzdHJpYnV0aW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgdHVuZWQgdG8KLSAgIGNvbXByZXNzIHRoZW0gYmV0dGVyLiBUaGUgZWZmZWN0IG9mIFpfRklMVEVSRUQgaXMgdG8gZm9yY2UgbW9yZSBIdWZmbWFuCisgICBlbmNvZGluZykuICBGaWx0ZXJlZCBkYXRhIGNvbnNpc3RzIG1vc3RseSBvZiBzbWFsbCB2YWx1ZXMgd2l0aCBhIHNvbWV3aGF0CisgICByYW5kb20gZGlzdHJpYnV0aW9uLiAgSW4gdGhpcyBjYXNlLCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzIHR1bmVkIHRvCisgICBjb21wcmVzcyB0aGVtIGJldHRlci4gIFRoZSBlZmZlY3Qgb2YgWl9GSUxURVJFRCBpcyB0byBmb3JjZSBtb3JlIEh1ZmZtYW4KICAgIGNvZGluZyBhbmQgbGVzcyBzdHJpbmcgbWF0Y2hpbmc7IGl0IGlzIHNvbWV3aGF0IGludGVybWVkaWF0ZSBiZXR3ZWVuCi0gICBaX0RFRkFVTFQgYW5kIFpfSFVGRk1BTl9PTkxZLiBaX1JMRSBpcyBkZXNpZ25lZCB0byBiZSBhbG1vc3QgYXMgZmFzdCBhcwotICAgWl9IVUZGTUFOX09OTFksIGJ1dCBnaXZlIGJldHRlciBjb21wcmVzc2lvbiBmb3IgUE5HIGltYWdlIGRhdGEuIFRoZSBzdHJhdGVneQotICAgcGFyYW1ldGVyIG9ubHkgYWZmZWN0cyB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlCi0gICBjb21wcmVzc2VkIG91dHB1dCBldmVuIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS4gIFpfRklYRUQgcHJldmVudHMgdGhlCi0gICB1c2Ugb2YgZHluYW1pYyBIdWZmbWFuIGNvZGVzLCBhbGxvd2luZyBmb3IgYSBzaW1wbGVyIGRlY29kZXIgZm9yIHNwZWNpYWwKLSAgIGFwcGxpY2F0aW9ucy4KKyAgIFpfREVGQVVMVF9TVFJBVEVHWSBhbmQgWl9IVUZGTUFOX09OTFkuICBaX1JMRSBpcyBkZXNpZ25lZCB0byBiZSBhbG1vc3QgYXMKKyAgIGZhc3QgYXMgWl9IVUZGTUFOX09OTFksIGJ1dCBnaXZlIGJldHRlciBjb21wcmVzc2lvbiBmb3IgUE5HIGltYWdlIGRhdGEuICBUaGUKKyAgIHN0cmF0ZWd5IHBhcmFtZXRlciBvbmx5IGFmZmVjdHMgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBub3QgdGhlCisgICBjb3JyZWN0bmVzcyBvZiB0aGUgY29tcHJlc3NlZCBvdXRwdXQgZXZlbiBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuCisgICBaX0ZJWEVEIHByZXZlbnRzIHRoZSB1c2Ugb2YgZHluYW1pYyBIdWZmbWFuIGNvZGVzLCBhbGxvd2luZyBmb3IgYSBzaW1wbGVyCisgICBkZWNvZGVyIGZvciBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KIAotICAgICAgZGVmbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKLSAgIG1ldGhvZCkuIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQyIGRvZXMKLSAgIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgorICAgICBkZWZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGFueSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCisgICBtZXRob2QpLCBvciBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICh6bGliX3ZlcnNpb24pIGlzCisgICBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuICBtc2cgaXMKKyAgIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdDIgZG9lcyBub3QgcGVyZm9ybSBhbnkKKyAgIGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKQEAgLTU0MCwzOCArNTg5LDQzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7CiAvKgogICAgICBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlCi0gICB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQKLSAgIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0LCBkZWZsYXRlSW5pdDIgb3IgZGVmbGF0ZVJlc2V0LCBiZWZvcmUgYW55Ci0gICBjYWxsIG9mIGRlZmxhdGUuIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQotICAgZGljdGlvbmFyeSAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5KS4KKyAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC4gIFdoZW4gdXNpbmcgdGhlIHpsaWIgZm9ybWF0LCB0aGlzCisgICBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCwgZGVmbGF0ZUluaXQyIG9yCisgICBkZWZsYXRlUmVzZXQsIGFuZCBiZWZvcmUgYW55IGNhbGwgb2YgZGVmbGF0ZS4gIFdoZW4gZG9pbmcgcmF3IGRlZmxhdGUsIHRoaXMKKyAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGVpdGhlciBiZWZvcmUgYW55IGNhbGwgb2YgZGVmbGF0ZSwgb3IgaW1tZWRpYXRlbHkKKyAgIGFmdGVyIHRoZSBjb21wbGV0aW9uIG9mIGEgZGVmbGF0ZSBibG9jaywgaS5lLiBhZnRlciBhbGwgaW5wdXQgaGFzIGJlZW4KKyAgIGNvbnN1bWVkIGFuZCBhbGwgb3V0cHV0IGhhcyBiZWVuIGRlbGl2ZXJlZCB3aGVuIHVzaW5nIGFueSBvZiB0aGUgZmx1c2gKKyAgIG9wdGlvbnMgWl9CTE9DSywgWl9QQVJUSUFMX0ZMVVNILCBaX1NZTkNfRkxVU0gsIG9yIFpfRlVMTF9GTFVTSC4gIFRoZQorICAgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUgZGljdGlvbmFyeSAoc2VlCisgICBpbmZsYXRlU2V0RGljdGlvbmFyeSkuCiAKICAgICAgVGhlIGRpY3Rpb25hcnkgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseQogICAgdG8gYmUgZW5jb3VudGVyZWQgbGF0ZXIgaW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgd2l0aCB0aGUgbW9zdCBjb21tb25seQotICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gVXNpbmcgYQorICAgdXNlZCBzdHJpbmdzIHByZWZlcmFibHkgcHV0IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeS4gIFVzaW5nIGEKICAgIGRpY3Rpb25hcnkgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkIGlzIHNob3J0IGFuZCBjYW4gYmUKICAgIHByZWRpY3RlZCB3aXRoIGdvb2QgYWNjdXJhY3k7IHRoZSBkYXRhIGNhbiB0aGVuIGJlIGNvbXByZXNzZWQgYmV0dGVyIHRoYW4KICAgIHdpdGggdGhlIGRlZmF1bHQgZW1wdHkgZGljdGlvbmFyeS4KIAogICAgICBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzaW9uIGRhdGEgc3RydWN0dXJlcyBzZWxlY3RlZCBieQogICAgZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLCBhIHBhcnQgb2YgdGhlIGRpY3Rpb25hcnkgbWF5IGluIGVmZmVjdCBiZQotICAgZGlzY2FyZGVkLCBmb3IgZXhhbXBsZSBpZiB0aGUgZGljdGlvbmFyeSBpcyBsYXJnZXIgdGhhbiB0aGUgd2luZG93IHNpemUgaW4KLSAgIGRlZmxhdGUgb3IgZGVmbGF0ZTIuIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZnVsIHNob3VsZCBiZQotICAgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuIEluIGFkZGl0aW9uLCB0aGUKLSAgIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGVmbGF0ZSB3aWxsIHVzZSBhdCBtb3N0IHRoZSB3aW5kb3cgc2l6ZSBtaW51cwotICAgMjYyIGJ5dGVzIG9mIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5LgorICAgZGlzY2FyZGVkLCBmb3IgZXhhbXBsZSBpZiB0aGUgZGljdGlvbmFyeSBpcyBsYXJnZXIgdGhhbiB0aGUgd2luZG93IHNpemUKKyAgIHByb3ZpZGVkIGluIGRlZmxhdGVJbml0IG9yIGRlZmxhdGVJbml0Mi4gIFRodXMgdGhlIHN0cmluZ3MgbW9zdCBsaWtlbHkgdG8gYmUKKyAgIHVzZWZ1bCBzaG91bGQgYmUgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnksIG5vdCBhdCB0aGUgZnJvbnQuICBJbgorICAgYWRkaXRpb24sIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGRlZmxhdGUgd2lsbCB1c2UgYXQgbW9zdCB0aGUgd2luZG93CisgICBzaXplIG1pbnVzIDI2MiBieXRlcyBvZiB0aGUgcHJvdmlkZWQgZGljdGlvbmFyeS4KIAogICAgICBVcG9uIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uLCBzdHJtLT5hZGxlciBpcyBzZXQgdG8gdGhlIGFkbGVyMzIgdmFsdWUKICAgIG9mIHRoZSBkaWN0aW9uYXJ5OyB0aGUgZGVjb21wcmVzc29yIG1heSBsYXRlciB1c2UgdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUKLSAgIHdoaWNoIGRpY3Rpb25hcnkgaGFzIGJlZW4gdXNlZCBieSB0aGUgY29tcHJlc3Nvci4gKFRoZSBhZGxlcjMyIHZhbHVlCisgICB3aGljaCBkaWN0aW9uYXJ5IGhhcyBiZWVuIHVzZWQgYnkgdGhlIGNvbXByZXNzb3IuICAoVGhlIGFkbGVyMzIgdmFsdWUKICAgIGFwcGxpZXMgdG8gdGhlIHdob2xlIGRpY3Rpb25hcnkgZXZlbiBpZiBvbmx5IGEgc3Vic2V0IG9mIHRoZSBkaWN0aW9uYXJ5IGlzCiAgICBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLikgSWYgYSByYXcgZGVmbGF0ZSB3YXMgcmVxdWVzdGVkLCB0aGVuIHRoZQogICAgYWRsZXIzMiB2YWx1ZSBpcyBub3QgY29tcHV0ZWQgYW5kIHN0cm0tPmFkbGVyIGlzIG5vdCBzZXQuCiAKICAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIGEKLSAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSBzdGF0ZSBpcworICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKGUuZy4gIGRpY3Rpb25hcnkgYmVpbmcgWl9OVUxMKSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCiAgICBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlIGlmIGRlZmxhdGUgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc3RyZWFtCi0gICBvciBpZiB0aGUgY29tcHJlc3Npb24gbWV0aG9kIGlzIGJzb3J0KS4gZGVmbGF0ZVNldERpY3Rpb25hcnkgZG9lcyBub3QKLSAgIHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCisgICBvciBpZiBub3QgYXQgYSBibG9jayBib3VuZGFyeSBmb3IgcmF3IGRlZmxhdGUpLiAgZGVmbGF0ZVNldERpY3Rpb25hcnkgZG9lcworICAgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKQEAgLTU4MSwyNiArNjM1LDI2IEBACiAKICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gc2V2ZXJhbCBjb21wcmVzc2lvbiBzdHJhdGVnaWVzIHdpbGwgYmUKICAgIHRyaWVkLCBmb3IgZXhhbXBsZSB3aGVuIHRoZXJlIGFyZSBzZXZlcmFsIHdheXMgb2YgcHJlLXByb2Nlc3NpbmcgdGhlIGlucHV0Ci0gICBkYXRhIHdpdGggYSBmaWx0ZXIuIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKKyAgIGRhdGEgd2l0aCBhIGZpbHRlci4gIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKICAgIGJ5IGNhbGxpbmcgZGVmbGF0ZUVuZC4gIE5vdGUgdGhhdCBkZWZsYXRlQ29weSBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAotICAgY29tcHJlc3Npb24gc3RhdGUgd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kCi0gICBjYW4gY29uc3VtZSBsb3RzIG9mIG1lbW9yeS4KKyAgIGNvbXByZXNzaW9uIHN0YXRlIHdoaWNoIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gdGhpcyBzdHJhdGVneSBpcyBzbG93IGFuZCBjYW4KKyAgIGNvbnN1bWUgbG90cyBvZiBtZW1vcnkuCiAKICAgICAgZGVmbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKICAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKLSAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBOVUxMKS4gbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAorICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuICBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCiAgICBkZXN0aW5hdGlvbi4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOwogLyoKICAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRlZmxhdGVFbmQgZm9sbG93ZWQgYnkgZGVmbGF0ZUluaXQsCi0gICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLgotICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGFueSBvdGhlciBhdHRyaWJ1dGVzCi0gICB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGRlZmxhdGVJbml0Mi4KKyAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuICBUaGUKKyAgIHN0cmVhbSB3aWxsIGtlZXAgdGhlIHNhbWUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGFueSBvdGhlciBhdHRyaWJ1dGVzIHRoYXQKKyAgIG1heSBoYXZlIGJlZW4gc2V0IGJ5IGRlZmxhdGVJbml0Mi4KIAotICAgICAgZGVmbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgTlVMTCkuCisgICAgIGRlZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIFpfTlVMTCkuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVQYXJhbXMgT0YoKHpfc3RyZWFtcCBzdHJtLApAQCAtNjEwLDE4ICs2NjQsMTggQEAKICAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgY29tcHJlc3Npb24gc3RyYXRlZ3kuICBUaGUKICAgIGludGVycHJldGF0aW9uIG9mIGxldmVsIGFuZCBzdHJhdGVneSBpcyBhcyBpbiBkZWZsYXRlSW5pdDIuICBUaGlzIGNhbiBiZQogICAgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQgZGF0YSwgb3IKLSAgIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IGRhdGEgcmVxdWlyaW5nIGEgZGlmZmVyZW50Ci0gICBzdHJhdGVneS4gSWYgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGNoYW5nZWQsIHRoZSBpbnB1dCBhdmFpbGFibGUgc28gZmFyCi0gICBpcyBjb21wcmVzc2VkIHdpdGggdGhlIG9sZCBsZXZlbCAoYW5kIG1heSBiZSBmbHVzaGVkKTsgdGhlIG5ldyBsZXZlbCB3aWxsCi0gICB0YWtlIGVmZmVjdCBvbmx5IGF0IHRoZSBuZXh0IGNhbGwgb2YgZGVmbGF0ZSgpLgorICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQgc3RyYXRlZ3kuCisgICBJZiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgY2hhbmdlZCwgdGhlIGlucHV0IGF2YWlsYWJsZSBzbyBmYXIgaXMKKyAgIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwgdGFrZQorICAgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCiAKICAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGVQYXJhbXMsIHRoZSBzdHJlYW0gc3RhdGUgbXVzdCBiZSBzZXQgYXMgZm9yCi0gICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0bwotICAgYmUgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gSW4gcGFydGljdWxhciwgc3RybS0+YXZhaWxfb3V0IG11c3QgYmUgbm9uLXplcm8uCisgICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0byBiZQorICAgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gIEluIHBhcnRpY3VsYXIsIHN0cm0tPmF2YWlsX291dCBtdXN0IGJlIG5vbi16ZXJvLgogCiAgICAgIGRlZmxhdGVQYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCBaX0JVRl9FUlJPUgotICAgaWYgc3RybS0+YXZhaWxfb3V0IHdhcyB6ZXJvLgorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgb3IgaWYgYSBwYXJhbWV0ZXIgd2FzIGludmFsaWQsIFpfQlVGX0VSUk9SIGlmCisgICBzdHJtLT5hdmFpbF9vdXQgd2FzIHplcm8uCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVUdW5lIE9GKCh6X3N0cmVhbXAgc3RybSwKQEAgLTY0NSwzMSArNjk5LDUzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TG9uZyBzb3VyY2VMZW4pKTsKIC8qCiAgICAgIGRlZmxhdGVCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgotICAgZGVmbGF0aW9uIG9mIHNvdXJjZUxlbiBieXRlcy4gIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZmxhdGVJbml0KCkKLSAgIG9yIGRlZmxhdGVJbml0MigpLiAgVGhpcyB3b3VsZCBiZSB1c2VkIHRvIGFsbG9jYXRlIGFuIG91dHB1dCBidWZmZXIKLSAgIGZvciBkZWZsYXRpb24gaW4gYSBzaW5nbGUgcGFzcywgYW5kIHNvIHdvdWxkIGJlIGNhbGxlZCBiZWZvcmUgZGVmbGF0ZSgpLgorICAgZGVmbGF0aW9uIG9mIHNvdXJjZUxlbiBieXRlcy4gIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIGRlZmxhdGVJbml0KCkgb3IKKyAgIGRlZmxhdGVJbml0MigpLCBhbmQgYWZ0ZXIgZGVmbGF0ZVNldEhlYWRlcigpLCBpZiB1c2VkLiAgVGhpcyB3b3VsZCBiZSB1c2VkCisgICB0byBhbGxvY2F0ZSBhbiBvdXRwdXQgYnVmZmVyIGZvciBkZWZsYXRpb24gaW4gYSBzaW5nbGUgcGFzcywgYW5kIHNvIHdvdWxkIGJlCisgICBjYWxsZWQgYmVmb3JlIGRlZmxhdGUoKS4gIElmIHRoYXQgZmlyc3QgZGVmbGF0ZSgpIGNhbGwgaXMgcHJvdmlkZWQgdGhlCisgICBzb3VyY2VMZW4gaW5wdXQgYnl0ZXMsIGFuIG91dHB1dCBidWZmZXIgYWxsb2NhdGVkIHRvIHRoZSBzaXplIHJldHVybmVkIGJ5CisgICBkZWZsYXRlQm91bmQoKSwgYW5kIHRoZSBmbHVzaCB2YWx1ZSBaX0ZJTklTSCwgdGhlbiBkZWZsYXRlKCkgaXMgZ3VhcmFudGVlZAorICAgdG8gcmV0dXJuIFpfU1RSRUFNX0VORC4gIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGNvbXByZXNzZWQgc2l6ZSB0bworICAgYmUgbGFyZ2VyIHRoYW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlZmxhdGVCb3VuZCgpIGlmIGZsdXNoIG9wdGlvbnMgb3RoZXIKKyAgIHRoYW4gWl9GSU5JU0ggb3IgWl9OT19GTFVTSCBhcmUgdXNlZC4KICovCiAKK1pFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVBlbmRpbmcgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKnBlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJpdHMpKTsKKy8qCisgICAgIGRlZmxhdGVQZW5kaW5nKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFuZCBiaXRzIG9mIG91dHB1dCB0aGF0IGhhdmUKKyAgIGJlZW4gZ2VuZXJhdGVkLCBidXQgbm90IHlldCBwcm92aWRlZCBpbiB0aGUgYXZhaWxhYmxlIG91dHB1dC4gIFRoZSBieXRlcyBub3QKKyAgIHByb3ZpZGVkIHdvdWxkIGJlIGR1ZSB0byB0aGUgYXZhaWxhYmxlIG91dHB1dCBzcGFjZSBoYXZpbmcgYmVpbmcgY29uc3VtZWQuCisgICBUaGUgbnVtYmVyIG9mIGJpdHMgb2Ygb3V0cHV0IG5vdCBwcm92aWRlZCBhcmUgYmV0d2VlbiAwIGFuZCA3LCB3aGVyZSB0aGV5CisgICBhd2FpdCBtb3JlIGJpdHMgdG8gam9pbiB0aGVtIGluIG9yZGVyIHRvIGZpbGwgb3V0IGEgZnVsbCBieXRlLiAgSWYgcGVuZGluZworICAgb3IgYml0cyBhcmUgWl9OVUxMLCB0aGVuIHRob3NlIHZhbHVlcyBhcmUgbm90IHNldC4KKworICAgICBkZWZsYXRlUGVuZGluZyByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCisgKi8KKwogWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUHJpbWUgT0YoKHpfc3RyZWFtcCBzdHJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkpOwogLyoKICAgICAgZGVmbGF0ZVByaW1lKCkgaW5zZXJ0cyBiaXRzIGluIHRoZSBkZWZsYXRlIG91dHB1dCBzdHJlYW0uICBUaGUgaW50ZW50Ci0gIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IG9mZiB0aGUgZGVmbGF0ZSBvdXRwdXQgd2l0aCB0aGUKLSAgYml0cyBsZWZ0b3ZlciBmcm9tIGEgcHJldmlvdXMgZGVmbGF0ZSBzdHJlYW0gd2hlbiBhcHBlbmRpbmcgdG8gaXQuICBBcyBzdWNoLAotICB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHJhdyBkZWZsYXRlLCBhbmQgbXVzdCBiZSB1c2VkIGJlZm9yZSB0aGUKLSAgZmlyc3QgZGVmbGF0ZSgpIGNhbGwgYWZ0ZXIgYSBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZQotICBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YKLSAgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgb3V0cHV0LgorICAgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgb2ZmIHRoZSBkZWZsYXRlIG91dHB1dCB3aXRoIHRoZSBiaXRzCisgICBsZWZ0b3ZlciBmcm9tIGEgcHJldmlvdXMgZGVmbGF0ZSBzdHJlYW0gd2hlbiBhcHBlbmRpbmcgdG8gaXQuICBBcyBzdWNoLCB0aGlzCisgICBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIGZvciByYXcgZGVmbGF0ZSwgYW5kIG11c3QgYmUgdXNlZCBiZWZvcmUgdGhlIGZpcnN0CisgICBkZWZsYXRlKCkgY2FsbCBhZnRlciBhIGRlZmxhdGVJbml0MigpIG9yIGRlZmxhdGVSZXNldCgpLiAgYml0cyBtdXN0IGJlIGxlc3MKKyAgIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdmFsdWUKKyAgIHdpbGwgYmUgaW5zZXJ0ZWQgaW4gdGhlIG91dHB1dC4KIAotICAgICAgZGVmbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyAgICAgZGVmbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgcm9vbSBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIGluc2VydCB0aGUgYml0cywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlCisgICBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKIC8qCi0gICAgICBkZWZsYXRlU2V0SGVhZGVyKCkgcHJvdmlkZXMgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9yIHdoZW4gYSBnemlwCisgICAgIGRlZmxhdGVTZXRIZWFkZXIoKSBwcm92aWRlcyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3Igd2hlbiBhIGd6aXAKICAgIHN0cmVhbSBpcyByZXF1ZXN0ZWQgYnkgZGVmbGF0ZUluaXQyKCkuICBkZWZsYXRlU2V0SGVhZGVyKCkgbWF5IGJlIGNhbGxlZAogICAgYWZ0ZXIgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZgogICAgZGVmbGF0ZSgpLiAgVGhlIHRleHQsIHRpbWUsIG9zLCBleHRyYSBmaWVsZCwgbmFtZSwgYW5kIGNvbW1lbnQgaW5mb3JtYXRpb24KQEAgLTY4MiwxMSArNzU4LDExIEBACiAgICAxLjMueCkgZG8gbm90IHN1cHBvcnQgaGVhZGVyIGNyYydzLCBhbmQgd2lsbCByZXBvcnQgdGhhdCBpdCBpcyBhICJtdWx0aS1wYXJ0CiAgICBnemlwIGZpbGUiIGFuZCBnaXZlIHVwLgogCi0gICAgICBJZiBkZWZsYXRlU2V0SGVhZGVyIGlzIG5vdCB1c2VkLCB0aGUgZGVmYXVsdCBnemlwIGhlYWRlciBoYXMgdGV4dCBmYWxzZSwKKyAgICAgSWYgZGVmbGF0ZVNldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlIGRlZmF1bHQgZ3ppcCBoZWFkZXIgaGFzIHRleHQgZmFsc2UsCiAgICB0aGUgdGltZSBzZXQgdG8gemVybywgYW5kIG9zIHNldCB0byAyNTUsIHdpdGggbm8gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQKICAgIGZpZWxkcy4gIFRoZSBnemlwIGhlYWRlciBpcyByZXR1cm5lZCB0byB0aGUgZGVmYXVsdCBzdGF0ZSBieSBkZWZsYXRlUmVzZXQoKS4KIAotICAgICAgZGVmbGF0ZVNldEhlYWRlciByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgICBkZWZsYXRlU2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCiAgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KICovCiAKQEAgLTY5NCw0MyArNzcwLDUwIEBACiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzKSk7CiAKLSAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgaW5mbGF0ZUluaXQgd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuIFRoZQorICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBpbmZsYXRlSW5pdCB3aXRoIGFuIGV4dHJhIHBhcmFtZXRlci4gIFRoZQogICAgZmllbGRzIG5leHRfaW4sIGF2YWlsX2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZAogICAgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCiAKICAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIG1heGltdW0gd2luZG93CiAgICBzaXplICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IKLSAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYgaW5mbGF0ZUluaXQgaXMgdXNlZAotICAgaW5zdGVhZC4gd2luZG93Qml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgd2luZG93Qml0cyB2YWx1ZQorICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYgaW5mbGF0ZUluaXQgaXMgdXNlZAorICAgaW5zdGVhZC4gIHdpbmRvd0JpdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHdpbmRvd0JpdHMgdmFsdWUKICAgIHByb3ZpZGVkIHRvIGRlZmxhdGVJbml0MigpIHdoaWxlIGNvbXByZXNzaW5nLCBvciBpdCBtdXN0IGJlIGVxdWFsIHRvIDE1IGlmCi0gICBkZWZsYXRlSW5pdDIoKSB3YXMgbm90IHVzZWQuIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cKKyAgIGRlZmxhdGVJbml0MigpIHdhcyBub3QgdXNlZC4gIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cKICAgIHNpemUgaXMgZ2l2ZW4gYXMgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlCiAgICBaX0RBVEFfRVJST1IgaW5zdGVhZCBvZiB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgogCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGluZmxhdGUuIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKLSAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiBpbmZsYXRlKCkgd2lsbCB0aGVuIHByb2Nlc3MgcmF3IGRlZmxhdGUgZGF0YSwKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSB6ZXJvIHRvIHJlcXVlc3QgdGhhdCBpbmZsYXRlIHVzZSB0aGUgd2luZG93IHNpemUgaW4KKyAgIHRoZSB6bGliIGhlYWRlciBvZiB0aGUgY29tcHJlc3NlZCBzdHJlYW0uCisKKyAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSAtOC4uLTE1IGZvciByYXcgaW5mbGF0ZS4gIEluIHRoaXMgY2FzZSwgLXdpbmRvd0JpdHMKKyAgIGRldGVybWluZXMgdGhlIHdpbmRvdyBzaXplLiAgaW5mbGF0ZSgpIHdpbGwgdGhlbiBwcm9jZXNzIHJhdyBkZWZsYXRlIGRhdGEsCiAgICBub3QgbG9va2luZyBmb3IgYSB6bGliIG9yIGd6aXAgaGVhZGVyLCBub3QgZ2VuZXJhdGluZyBhIGNoZWNrIHZhbHVlLCBhbmQgbm90Ci0gICBsb29raW5nIGZvciBhbnkgY2hlY2sgdmFsdWVzIGZvciBjb21wYXJpc29uIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gVGhpcworICAgbG9va2luZyBmb3IgYW55IGNoZWNrIHZhbHVlcyBmb3IgY29tcGFyaXNvbiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICBUaGlzCiAgICBpcyBmb3IgdXNlIHdpdGggb3RoZXIgZm9ybWF0cyB0aGF0IHVzZSB0aGUgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0Ci0gICBzdWNoIGFzIHppcC4gIFRob3NlIGZvcm1hdHMgcHJvdmlkZSB0aGVpciBvd24gY2hlY2sgdmFsdWVzLiBJZiBhIGN1c3RvbQorICAgc3VjaCBhcyB6aXAuICBUaG9zZSBmb3JtYXRzIHByb3ZpZGUgdGhlaXIgb3duIGNoZWNrIHZhbHVlcy4gIElmIGEgY3VzdG9tCiAgICBmb3JtYXQgaXMgZGV2ZWxvcGVkIHVzaW5nIHRoZSByYXcgZGVmbGF0ZSBmb3JtYXQgZm9yIGNvbXByZXNzZWQgZGF0YSwgaXQgaXMKICAgIHJlY29tbWVuZGVkIHRoYXQgYSBjaGVjayB2YWx1ZSBzdWNoIGFzIGFuIGFkbGVyMzIgb3IgYSBjcmMzMiBiZSBhcHBsaWVkIHRvCiAgICB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYXMgaXMgZG9uZSBpbiB0aGUgemxpYiwgZ3ppcCwgYW5kIHppcCBmb3JtYXRzLiAgRm9yCi0gICBtb3N0IGFwcGxpY2F0aW9ucywgdGhlIHpsaWIgZm9ybWF0IHNob3VsZCBiZSB1c2VkIGFzIGlzLiBOb3RlIHRoYXQgY29tbWVudHMKKyAgIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgemxpYiBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgYXMgaXMuICBOb3RlIHRoYXQgY29tbWVudHMKICAgIGFib3ZlIG9uIHRoZSB1c2UgaW4gZGVmbGF0ZUluaXQyKCkgYXBwbGllcyB0byB0aGUgbWFnbml0dWRlIG9mIHdpbmRvd0JpdHMuCiAKLSAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZGVjb2RpbmcuIEFkZAorICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBkZWNvZGluZy4gIEFkZAogICAgMzIgdG8gd2luZG93Qml0cyB0byBlbmFibGUgemxpYiBhbmQgZ3ppcCBkZWNvZGluZyB3aXRoIGF1dG9tYXRpYyBoZWFkZXIKICAgIGRldGVjdGlvbiwgb3IgYWRkIDE2IHRvIGRlY29kZSBvbmx5IHRoZSBnemlwIGZvcm1hdCAodGhlIHpsaWIgZm9ybWF0IHdpbGwKLSAgIHJldHVybiBhIFpfREFUQV9FUlJPUikuICBJZiBhIGd6aXAgc3RyZWFtIGlzIGJlaW5nIGRlY29kZWQsIHN0cm0tPmFkbGVyIGlzCi0gICBhIGNyYzMyIGluc3RlYWQgb2YgYW4gYWRsZXIzMi4KKyAgIHJldHVybiBhIFpfREFUQV9FUlJPUikuICBJZiBhIGd6aXAgc3RyZWFtIGlzIGJlaW5nIGRlY29kZWQsIHN0cm0tPmFkbGVyIGlzIGEKKyAgIGNyYzMyIGluc3RlYWQgb2YgYW4gYWRsZXIzMi4KIAogICAgICBpbmZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCi0gICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYSBudWxsIHN0cm0pLiBtc2cKLSAgIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBpbmZsYXRlSW5pdDIgZG9lcyBub3QgcGVyZm9ybQotICAgYW55IGRlY29tcHJlc3Npb24gYXBhcnQgZnJvbSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiB0aGlzIHdpbGwKLSAgIGJlIGRvbmUgYnkgaW5mbGF0ZSgpLiAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQgbmV4dF9vdXQKLSAgIGFuZCBhdmFpbF9vdXQgYXJlIHVuY2hhbmdlZC4pCisgICBtZW1vcnksIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciwgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHBhcmFtZXRlcnMgYXJlCisgICBpbnZhbGlkLCBzdWNoIGFzIGEgbnVsbCBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUuICBtc2cgaXMgc2V0IHRvIG51bGwgaWYKKyAgIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBpbmZsYXRlSW5pdDIgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbgorICAgYXBhcnQgZnJvbSBwb3NzaWJseSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiBhY3R1YWwgZGVjb21wcmVzc2lvbgorICAgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dAorICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgorICAgb2YgaW5mbGF0ZUluaXQyKCkgZG9lcyBub3QgcHJvY2VzcyBhbnkgaGVhZGVyIGluZm9ybWF0aW9uIC0tIHRoYXQgaXMKKyAgIGRlZmVycmVkIHVudGlsIGluZmxhdGUoKSBpcyBjYWxsZWQuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKQEAgLTczOCwzNiArODIxLDU2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICBkaWN0TGVuZ3RoKSk7CiAvKgogICAgICBJbml0aWFsaXplcyB0aGUgZGVjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIHVuY29tcHJlc3NlZCBieXRlCi0gICBzZXF1ZW5jZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgaW5mbGF0ZSwKLSAgIGlmIHRoYXQgY2FsbCByZXR1cm5lZCBaX05FRURfRElDVC4gVGhlIGRpY3Rpb25hcnkgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yCisgICBzZXF1ZW5jZS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIG9mIGluZmxhdGUsCisgICBpZiB0aGF0IGNhbGwgcmV0dXJuZWQgWl9ORUVEX0RJQ1QuICBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKICAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhhdCBjYWxsIG9mIGluZmxhdGUuCiAgICBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUgZGljdGlvbmFyeSAoc2VlCi0gICBkZWZsYXRlU2V0RGljdGlvbmFyeSkuICBGb3IgcmF3IGluZmxhdGUsIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZAotICAgaW1tZWRpYXRlbHkgYWZ0ZXIgaW5mbGF0ZUluaXQyKCkgb3IgaW5mbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSBhbnkgY2FsbCBvZgotICAgaW5mbGF0ZSgpIHRvIHNldCB0aGUgZGljdGlvbmFyeS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluc3VyZSB0aGF0IHRoZQotICAgZGljdGlvbmFyeSB0aGF0IHdhcyB1c2VkIGZvciBjb21wcmVzc2lvbiBpcyBwcm92aWRlZC4KKyAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5KS4gIEZvciByYXcgaW5mbGF0ZSwgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGF0IGFueQorICAgdGltZSB0byBzZXQgdGhlIGRpY3Rpb25hcnkuICBJZiB0aGUgcHJvdmlkZWQgZGljdGlvbmFyeSBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICB3aW5kb3cgYW5kIHRoZXJlIGlzIGFscmVhZHkgZGF0YSBpbiB0aGUgd2luZG93LCB0aGVuIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5CisgICB3aWxsIGFtZW5kIHdoYXQncyB0aGVyZS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluc3VyZSB0aGF0IHRoZSBkaWN0aW9uYXJ5CisgICB0aGF0IHdhcyB1c2VkIGZvciBjb21wcmVzc2lvbiBpcyBwcm92aWRlZC4KIAogICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYQotICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCisgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoZS5nLiAgZGljdGlvbmFyeSBiZWluZyBaX05VTEwpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKICAgIGluY29uc2lzdGVudCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBnaXZlbiBkaWN0aW9uYXJ5IGRvZXNuJ3QgbWF0Y2ggdGhlCi0gICBleHBlY3RlZCBvbmUgKGluY29ycmVjdCBhZGxlcjMyIHZhbHVlKS4gaW5mbGF0ZVNldERpY3Rpb25hcnkgZG9lcyBub3QKKyAgIGV4cGVjdGVkIG9uZSAoaW5jb3JyZWN0IGFkbGVyMzIgdmFsdWUpLiAgaW5mbGF0ZVNldERpY3Rpb25hcnkgZG9lcyBub3QKICAgIHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IHN1YnNlcXVlbnQgY2FsbHMgb2YKICAgIGluZmxhdGUoKS4KICovCiAKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUdldERpY3Rpb25hcnkgT0YoKHpfc3RyZWFtcCBzdHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZWYgKmRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1SW50ICAqZGljdExlbmd0aCkpOworLyoKKyAgICAgUmV0dXJucyB0aGUgc2xpZGluZyBkaWN0aW9uYXJ5IGJlaW5nIG1haW50YWluZWQgYnkgaW5mbGF0ZS4gIGRpY3RMZW5ndGggaXMKKyAgIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBkaWN0aW9uYXJ5LCBhbmQgdGhhdCBtYW55IGJ5dGVzIGFyZSBjb3BpZWQKKyAgIHRvIGRpY3Rpb25hcnkuICBkaWN0aW9uYXJ5IG11c3QgaGF2ZSBlbm91Z2ggc3BhY2UsIHdoZXJlIDMyNzY4IGJ5dGVzIGlzCisgICBhbHdheXMgZW5vdWdoLiAgSWYgaW5mbGF0ZUdldERpY3Rpb25hcnkoKSBpcyBjYWxsZWQgd2l0aCBkaWN0aW9uYXJ5IGVxdWFsIHRvCisgICBaX05VTEwsIHRoZW4gb25seSB0aGUgZGljdGlvbmFyeSBsZW5ndGggaXMgcmV0dXJuZWQsIGFuZCBub3RoaW5nIGlzIGNvcGllZC4KKyAgIFNpbWlsYXJ5LCBpZiBkaWN0TGVuZ3RoIGlzIFpfTlVMTCwgdGhlbiBpdCBpcyBub3Qgc2V0LgorCisgICAgIGluZmxhdGVHZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUKKyAgIHN0cmVhbSBzdGF0ZSBpcyBpbmNvbnNpc3RlbnQuCisqLworCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVTeW5jIE9GKCh6X3N0cmVhbXAgc3RybSkpOwogLyoKLSAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKLSAgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZSB3aXRoIFpfRlVMTF9GTFVTSCkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKLSAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dCBpcyBwcm92aWRlZC4KKyAgICAgU2tpcHMgaW52YWxpZCBjb21wcmVzc2VkIGRhdGEgdW50aWwgYSBwb3NzaWJsZSBmdWxsIGZsdXNoIHBvaW50IChzZWUgYWJvdmUKKyAgIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZSB3aXRoIFpfRlVMTF9GTFVTSCkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKKyAgIGF2YWlsYWJsZSBpbnB1dCBpcyBza2lwcGVkLiAgTm8gb3V0cHV0IGlzIHByb3ZpZGVkLgogCi0gICAgaW5mbGF0ZVN5bmMgcmV0dXJucyBaX09LIGlmIGEgZnVsbCBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwgWl9CVUZfRVJST1IKLSAgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIFpfREFUQV9FUlJPUiBpZiBubyBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwKLSAgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudC4gSW4gdGhlIHN1Y2Nlc3MKLSAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBzYXZlIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRvdGFsX2luIHdoaWNoCi0gIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlCi0gIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgaW5mbGF0ZVN5bmMsIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKLSAgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuCisgICAgIGluZmxhdGVTeW5jIHNlYXJjaGVzIGZvciBhIDAwIDAwIEZGIEZGIHBhdHRlcm4gaW4gdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAgIEFsbCBmdWxsIGZsdXNoIHBvaW50cyBoYXZlIHRoaXMgcGF0dGVybiwgYnV0IG5vdCBhbGwgb2NjdXJyZW5jZXMgb2YgdGhpcworICAgcGF0dGVybiBhcmUgZnVsbCBmbHVzaCBwb2ludHMuCisKKyAgICAgaW5mbGF0ZVN5bmMgcmV0dXJucyBaX09LIGlmIGEgcG9zc2libGUgZnVsbCBmbHVzaCBwb2ludCBoYXMgYmVlbiBmb3VuZCwKKyAgIFpfQlVGX0VSUk9SIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCBaX0RBVEFfRVJST1IgaWYgbm8gZmx1c2ggcG9pbnQKKyAgIGhhcyBiZWVuIGZvdW5kLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50LgorICAgSW4gdGhlIHN1Y2Nlc3MgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBzYXZlIHRoZSBjdXJyZW50IGN1cnJlbnQgdmFsdWUgb2YKKyAgIHRvdGFsX2luIHdoaWNoIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiAgSW4gdGhlCisgICBlcnJvciBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHJlcGVhdGVkbHkgY2FsbCBpbmZsYXRlU3luYywgcHJvdmlkaW5nIG1vcmUKKyAgIGlucHV0IGVhY2ggdGltZSwgdW50aWwgc3VjY2VzcyBvciBlbmQgb2YgdGhlIGlucHV0IGRhdGEuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKQEAgLTc4MiwxOCArODg1LDMwIEBACiAKICAgICAgaW5mbGF0ZUNvcHkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKICAgIGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQKLSAgIChzdWNoIGFzIHphbGxvYyBiZWluZyBOVUxMKS4gbXNnIGlzIGxlZnQgdW5jaGFuZ2VkIGluIGJvdGggc291cmNlIGFuZAorICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuICBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCiAgICBkZXN0aW5hdGlvbi4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOwogLyoKICAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGluZmxhdGVFbmQgZm9sbG93ZWQgYnkgaW5mbGF0ZUluaXQsCi0gICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGRlY29tcHJlc3Npb24gc3RhdGUuCi0gICBUaGUgc3RyZWFtIHdpbGwga2VlcCBhdHRyaWJ1dGVzIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgYnkgaW5mbGF0ZUluaXQyLgorICAgYnV0IGRvZXMgbm90IGZyZWUgYW5kIHJlYWxsb2NhdGUgYWxsIHRoZSBpbnRlcm5hbCBkZWNvbXByZXNzaW9uIHN0YXRlLiAgVGhlCisgICBzdHJlYW0gd2lsbCBrZWVwIGF0dHJpYnV0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSBpbmZsYXRlSW5pdDIuCiAKLSAgICAgIGluZmxhdGVSZXNldCByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIE5VTEwpLgorICAgICBpbmZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKKyAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBaX05VTEwpLgorKi8KKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMpKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgaW5mbGF0ZVJlc2V0LCBidXQgaXQgYWxzbyBwZXJtaXRzIGNoYW5naW5nCisgICB0aGUgd3JhcCBhbmQgd2luZG93IHNpemUgcmVxdWVzdHMuICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgaW50ZXJwcmV0ZWQKKyAgIHRoZSBzYW1lIGFzIGl0IGlzIGZvciBpbmZsYXRlSW5pdDIuCisKKyAgICAgaW5mbGF0ZVJlc2V0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIFpfTlVMTCksIG9yIGlmCisgICB0aGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVByaW1lIE9GKCh6X3N0cmVhbXAgc3RybSwKQEAgLTgwMSw1NCArOTE2LDg3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7CiAvKgogICAgICBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYml0cyBpbiB0aGUgaW5mbGF0ZSBpbnB1dCBzdHJlYW0uICBUaGUgaW50ZW50IGlzCi0gIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGluZmxhdGluZyBhdCBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKLSAgbWlkZGxlIG9mIGEgYnl0ZS4gIFRoZSBwcm92aWRlZCBiaXRzIHdpbGwgYmUgdXNlZCBiZWZvcmUgYW55IGJ5dGVzIGFyZSB1c2VkCi0gIGZyb20gbmV4dF9pbi4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBpbmZsYXRlLCBhbmQKLSAgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdCBpbmZsYXRlKCkgY2FsbCBhZnRlciBpbmZsYXRlSW5pdDIoKSBvcgotICBpbmZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTYsIGFuZCB0aGF0IG1hbnkgb2YgdGhlCi0gIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgaW5wdXQuCisgICB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCBpbmZsYXRpbmcgYXQgYSBiaXQgcG9zaXRpb24gaW4gdGhlCisgICBtaWRkbGUgb2YgYSBieXRlLiAgVGhlIHByb3ZpZGVkIGJpdHMgd2lsbCBiZSB1c2VkIGJlZm9yZSBhbnkgYnl0ZXMgYXJlIHVzZWQKKyAgIGZyb20gbmV4dF9pbi4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHJhdyBpbmZsYXRlLCBhbmQKKyAgIHNob3VsZCBiZSB1c2VkIGJlZm9yZSB0aGUgZmlyc3QgaW5mbGF0ZSgpIGNhbGwgYWZ0ZXIgaW5mbGF0ZUluaXQyKCkgb3IKKyAgIGluZmxhdGVSZXNldCgpLiAgYml0cyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNiwgYW5kIHRoYXQgbWFueSBvZiB0aGUKKyAgIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUgaW5wdXQuCiAKLSAgICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgICBJZiBiaXRzIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbnB1dCBzdHJlYW0gYml0IGJ1ZmZlciBpcyBlbXB0aWVkLiAgVGhlbgorICAgaW5mbGF0ZVByaW1lKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB0byBwdXQgYml0cyBpbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyB1c2VkCisgICB0byBjbGVhciBvdXQgYml0cyBsZWZ0b3ZlciBhZnRlciBmZWVkaW5nIGluZmxhdGUgYSBibG9jayBkZXNjcmlwdGlvbiBwcmlvcgorICAgdG8gZmVlZGluZyBpbmZsYXRlIGNvZGVzLgorCisgICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQogICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCiAqLwogCitaRVhURVJOIGxvbmcgWkVYUE9SVCBpbmZsYXRlTWFyayBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gdmFsdWVzLCBvbmUgaW4gdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIHJldHVybgorICAgdmFsdWUsIGFuZCB0aGUgb3RoZXIgaW4gdGhlIHJlbWFpbmluZyB1cHBlciBiaXRzLCBvYnRhaW5lZCBieSBzaGlmdGluZyB0aGUKKyAgIHJldHVybiB2YWx1ZSBkb3duIDE2IGJpdHMuICBJZiB0aGUgdXBwZXIgdmFsdWUgaXMgLTEgYW5kIHRoZSBsb3dlciB2YWx1ZSBpcworICAgemVybywgdGhlbiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIGluZm9ybWF0aW9uIG91dHNpZGUgb2YgYSBibG9jay4KKyAgIElmIHRoZSB1cHBlciB2YWx1ZSBpcyAtMSBhbmQgdGhlIGxvd2VyIHZhbHVlIGlzIG5vbi16ZXJvLCB0aGVuIGluZmxhdGUgaXMgaW4KKyAgIHRoZSBtaWRkbGUgb2YgYSBzdG9yZWQgYmxvY2ssIHdpdGggdGhlIGxvd2VyIHZhbHVlIGVxdWFsaW5nIHRoZSBudW1iZXIgb2YKKyAgIGJ5dGVzIGZyb20gdGhlIGlucHV0IHJlbWFpbmluZyB0byBjb3B5LiAgSWYgdGhlIHVwcGVyIHZhbHVlIGlzIG5vdCAtMSwgdGhlbgorICAgaXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIGJhY2sgZnJvbSB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGlucHV0IG9mCisgICB0aGUgY29kZSAobGl0ZXJhbCBvciBsZW5ndGgvZGlzdGFuY2UgcGFpcikgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gIEluCisgICB0aGF0IGNhc2UgdGhlIGxvd2VyIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBlbWl0dGVkIGZvciB0aGF0CisgICBjb2RlLgorCisgICAgIEEgY29kZSBpcyBiZWluZyBwcm9jZXNzZWQgaWYgaW5mbGF0ZSBpcyB3YWl0aW5nIGZvciBtb3JlIGlucHV0IHRvIGNvbXBsZXRlCisgICBkZWNvZGluZyBvZiB0aGUgY29kZSwgb3IgaWYgaXQgaGFzIGNvbXBsZXRlZCBkZWNvZGluZyBidXQgaXMgd2FpdGluZyBmb3IKKyAgIG1vcmUgb3V0cHV0IHNwYWNlIHRvIHdyaXRlIHRoZSBsaXRlcmFsIG9yIG1hdGNoIGRhdGEuCisKKyAgICAgaW5mbGF0ZU1hcmsoKSBpcyB1c2VkIHRvIG1hcmsgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBkYXRhIGZvciByYW5kb20KKyAgIGFjY2Vzcywgd2hpY2ggbWF5IGJlIGF0IGJpdCBwb3NpdGlvbnMsIGFuZCB0byBub3RlIHRob3NlIGNhc2VzIHdoZXJlIHRoZQorICAgb3V0cHV0IG9mIGEgY29kZSBtYXkgc3BhbiBib3VuZGFyaWVzIG9mIHJhbmRvbSBhY2Nlc3MgYmxvY2tzLiAgVGhlIGN1cnJlbnQKKyAgIGxvY2F0aW9uIGluIHRoZSBpbnB1dCBzdHJlYW0gY2FuIGJlIGRldGVybWluZWQgZnJvbSBhdmFpbF9pbiBhbmQgZGF0YV90eXBlCisgICBhcyBub3RlZCBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBaX0JMT0NLIGZsdXNoIHBhcmFtZXRlciBmb3IgaW5mbGF0ZS4KKworICAgICBpbmZsYXRlTWFyayByZXR1cm5zIHRoZSB2YWx1ZSBub3RlZCBhYm92ZSBvciAtMSA8PCAxNiBpZiB0aGUgcHJvdmlkZWQKKyAgIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KKyovCisKIFpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUdldEhlYWRlciBPRigoel9zdHJlYW1wIHN0cm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd6X2hlYWRlcnAgaGVhZCkpOwogLyoKLSAgICAgIGluZmxhdGVHZXRIZWFkZXIoKSByZXF1ZXN0cyB0aGF0IGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIGJlIHN0b3JlZCBpbiB0aGUKKyAgICAgaW5mbGF0ZUdldEhlYWRlcigpIHJlcXVlc3RzIHRoYXQgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gYmUgc3RvcmVkIGluIHRoZQogICAgcHJvdmlkZWQgZ3pfaGVhZGVyIHN0cnVjdHVyZS4gIGluZmxhdGVHZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkIGFmdGVyCiAgICBpbmZsYXRlSW5pdDIoKSBvciBpbmZsYXRlUmVzZXQoKSwgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZiBpbmZsYXRlKCkuCiAgICBBcyBpbmZsYXRlKCkgcHJvY2Vzc2VzIHRoZSBnemlwIHN0cmVhbSwgaGVhZC0+ZG9uZSBpcyB6ZXJvIHVudGlsIHRoZSBoZWFkZXIKICAgIGlzIGNvbXBsZXRlZCwgYXQgd2hpY2ggdGltZSBoZWFkLT5kb25lIGlzIHNldCB0byBvbmUuICBJZiBhIHpsaWIgc3RyZWFtIGlzCiAgICBiZWluZyBkZWNvZGVkLCB0aGVuIGhlYWQtPmRvbmUgaXMgc2V0IHRvIC0xIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgd2lsbCBiZQotICAgbm8gZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9ydGhjb21pbmcuICBOb3RlIHRoYXQgWl9CTE9DSyBjYW4gYmUgdXNlZCB0bwotICAgZm9yY2UgaW5mbGF0ZSgpIHRvIHJldHVybiBpbW1lZGlhdGVseSBhZnRlciBoZWFkZXIgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZQotICAgYW5kIGJlZm9yZSBhbnkgYWN0dWFsIGRhdGEgaXMgZGVjb21wcmVzc2VkLgorICAgbm8gZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9ydGhjb21pbmcuICBOb3RlIHRoYXQgWl9CTE9DSyBvciBaX1RSRUVTIGNhbiBiZQorICAgdXNlZCB0byBmb3JjZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGhlYWRlciBwcm9jZXNzaW5nIGlzCisgICBjb21wbGV0ZSBhbmQgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpcyBkZWNvbXByZXNzZWQuCiAKLSAgICAgIFRoZSB0ZXh0LCB0aW1lLCB4ZmxhZ3MsIGFuZCBvcyBmaWVsZHMgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSBnemlwIGhlYWRlcgorICAgICBUaGUgdGV4dCwgdGltZSwgeGZsYWdzLCBhbmQgb3MgZmllbGRzIGFyZSBmaWxsZWQgaW4gd2l0aCB0aGUgZ3ppcCBoZWFkZXIKICAgIGNvbnRlbnRzLiAgaGNyYyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGVyZSBpcyBhIGhlYWRlciBDUkMuICAoVGhlIGhlYWRlciBDUkMKLSAgIHdhcyB2YWxpZCBpZiBkb25lIGlzIHNldCB0byBvbmUuKSAgSWYgZXh0cmEgaXMgbm90IFpfTlVMTCwgdGhlbiBleHRyYV9tYXgKKyAgIHdhcyB2YWxpZCBpZiBkb25lIGlzIHNldCB0byBvbmUuKSBJZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGVuIGV4dHJhX21heAogICAgY29udGFpbnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIGV4dHJhLiAgT25jZSBkb25lIGlzIHRydWUsCiAgICBleHRyYV9sZW4gY29udGFpbnMgdGhlIGFjdHVhbCBleHRyYSBmaWVsZCBsZW5ndGgsIGFuZCBleHRyYSBjb250YWlucyB0aGUKICAgIGV4dHJhIGZpZWxkLCBvciB0aGF0IGZpZWxkIHRydW5jYXRlZCBpZiBleHRyYV9tYXggaXMgbGVzcyB0aGFuIGV4dHJhX2xlbi4KICAgIElmIG5hbWUgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBuYW1lX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAogICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gbmFtZV9tYXguICBJZgogICAgY29tbWVudCBpcyBub3QgWl9OVUxMLCB0aGVuIHVwIHRvIGNvbW1fbWF4IGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gdGhlcmUsCi0gICB0ZXJtaW5hdGVkIHdpdGggYSB6ZXJvIHVubGVzcyB0aGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBjb21tX21heC4gIFdoZW4KLSAgIGFueSBvZiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCBhcmUgbm90IFpfTlVMTCBhbmQgdGhlIHJlc3BlY3RpdmUgZmllbGQgaXMKLSAgIG5vdCBwcmVzZW50IGluIHRoZSBoZWFkZXIsIHRoZW4gdGhhdCBmaWVsZCBpcyBzZXQgdG8gWl9OVUxMIHRvIHNpZ25hbCBpdHMKKyAgIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8gdW5sZXNzIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGNvbW1fbWF4LiAgV2hlbiBhbnkKKyAgIG9mIGV4dHJhLCBuYW1lLCBvciBjb21tZW50IGFyZSBub3QgWl9OVUxMIGFuZCB0aGUgcmVzcGVjdGl2ZSBmaWVsZCBpcyBub3QKKyAgIHByZXNlbnQgaW4gdGhlIGhlYWRlciwgdGhlbiB0aGF0IGZpZWxkIGlzIHNldCB0byBaX05VTEwgdG8gc2lnbmFsIGl0cwogICAgYWJzZW5jZS4gIFRoaXMgYWxsb3dzIHRoZSB1c2Ugb2YgZGVmbGF0ZVNldEhlYWRlcigpIHdpdGggdGhlIHJldHVybmVkCiAgICBzdHJ1Y3R1cmUgdG8gZHVwbGljYXRlIHRoZSBoZWFkZXIuICBIb3dldmVyIGlmIHRob3NlIGZpZWxkcyBhcmUgc2V0IHRvCiAgICBhbGxvY2F0ZWQgbWVtb3J5LCB0aGVuIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5lZWQgdG8gc2F2ZSB0aG9zZSBwb2ludGVycwogICAgZWxzZXdoZXJlIHNvIHRoYXQgdGhleSBjYW4gYmUgZXZlbnR1YWxseSBmcmVlZC4KIAotICAgICAgSWYgaW5mbGF0ZUdldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlbiB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHNpbXBseQorICAgICBJZiBpbmZsYXRlR2V0SGVhZGVyIGlzIG5vdCB1c2VkLCB0aGVuIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gaXMgc2ltcGx5CiAgICBkaXNjYXJkZWQuICBUaGUgaGVhZGVyIGlzIGFsd2F5cyBjaGVja2VkIGZvciB2YWxpZGl0eSwgaW5jbHVkaW5nIHRoZSBoZWFkZXIKICAgIENSQyBpZiBwcmVzZW50LiAgaW5mbGF0ZVJlc2V0KCkgd2lsbCByZXNldCB0aGUgcHJvY2VzcyB0byBkaXNjYXJkIHRoZSBoZWFkZXIKICAgIGluZm9ybWF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIHdvdWxkIG5lZWQgdG8gY2FsbCBpbmZsYXRlR2V0SGVhZGVyKCkgYWdhaW4gdG8KICAgIHJldHJpZXZlIHRoZSBoZWFkZXIgZnJvbSB0aGUgbmV4dCBnemlwIHN0cmVhbS4KIAotICAgICAgaW5mbGF0ZUdldEhlYWRlciByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQorICAgICBpbmZsYXRlR2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCiAgICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KICovCiAKQEAgLTg2OSwxMiArMTAxNywxMyBAQAogICAgICBTZWUgaW5mbGF0ZUJhY2soKSBmb3IgdGhlIHVzYWdlIG9mIHRoZXNlIHJvdXRpbmVzLgogCiAgICAgIGluZmxhdGVCYWNrSW5pdCB3aWxsIHJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIGFueSBvZgotICAgdGhlIHBhcmFtYXRlcnMgYXJlIGludmFsaWQsIFpfTUVNX0VSUk9SIGlmIHRoZSBpbnRlcm5hbCBzdGF0ZSBjb3VsZCBub3QKLSAgIGJlIGFsbG9jYXRlZCwgb3IgWl9WRVJTSU9OX0VSUk9SIGlmIHRoZSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGRvZXMgbm90Ci0gICBtYXRjaCB0aGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyIGZpbGUuCisgICB0aGUgcGFyYW1ldGVycyBhcmUgaW52YWxpZCwgWl9NRU1fRVJST1IgaWYgdGhlIGludGVybmFsIHN0YXRlIGNvdWxkIG5vdCBiZQorICAgYWxsb2NhdGVkLCBvciBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgZG9lcyBub3QgbWF0Y2gKKyAgIHRoZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXIgZmlsZS4KICovCiAKLXR5cGVkZWYgdW5zaWduZWQgKCppbl9mdW5jKSBPRigodm9pZCBGQVIgKiwgdW5zaWduZWQgY2hhciBGQVIgKiBGQVIgKikpOwordHlwZWRlZiB1bnNpZ25lZCAoKmluX2Z1bmMpIE9GKCh2b2lkIEZBUiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICogRkFSICopKTsKIHR5cGVkZWYgaW50ICgqb3V0X2Z1bmMpIE9GKCh2b2lkIEZBUiAqLCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOwogCiBaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrIE9GKCh6X3N0cmVhbXAgc3RybSwKQEAgLTg4MiwyNCArMTAzMSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2Z1bmMgb3V0LCB2b2lkIEZBUiAqb3V0X2Rlc2MpKTsKIC8qCiAgICAgIGluZmxhdGVCYWNrKCkgZG9lcyBhIHJhdyBpbmZsYXRlIHdpdGggYSBzaW5nbGUgY2FsbCB1c2luZyBhIGNhbGwtYmFjawotICAgaW50ZXJmYWNlIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGluZmxhdGUoKSBmb3IKLSAgIGZpbGUgaS9vIGFwcGxpY2F0aW9ucyBpbiB0aGF0IGl0IGF2b2lkcyBjb3B5aW5nIGJldHdlZW4gdGhlIG91dHB1dCBhbmQgdGhlCi0gICBzbGlkaW5nIHdpbmRvdyBieSBzaW1wbHkgbWFraW5nIHRoZSB3aW5kb3cgaXRzZWxmIHRoZSBvdXRwdXQgYnVmZmVyLiAgVGhpcwotICAgZnVuY3Rpb24gdHJ1c3RzIHRoZSBhcHBsaWNhdGlvbiB0byBub3QgY2hhbmdlIHRoZSBvdXRwdXQgYnVmZmVyIHBhc3NlZCBieQotICAgdGhlIG91dHB1dCBmdW5jdGlvbiwgYXQgbGVhc3QgdW50aWwgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgorICAgaW50ZXJmYWNlIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgVGhpcyBpcyBwb3RlbnRpYWxseSBtb3JlIGVmZmljaWVudCB0aGFuCisgICBpbmZsYXRlKCkgZm9yIGZpbGUgaS9vIGFwcGxpY2F0aW9ucywgaW4gdGhhdCBpdCBhdm9pZHMgY29weWluZyBiZXR3ZWVuIHRoZQorICAgb3V0cHV0IGFuZCB0aGUgc2xpZGluZyB3aW5kb3cgYnkgc2ltcGx5IG1ha2luZyB0aGUgd2luZG93IGl0c2VsZiB0aGUgb3V0cHV0CisgICBidWZmZXIuICBpbmZsYXRlKCkgY2FuIGJlIGZhc3RlciBvbiBtb2Rlcm4gQ1BVcyB3aGVuIHVzZWQgd2l0aCBsYXJnZQorICAgYnVmZmVycy4gIGluZmxhdGVCYWNrKCkgdHJ1c3RzIHRoZSBhcHBsaWNhdGlvbiB0byBub3QgY2hhbmdlIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlciBwYXNzZWQgYnkgdGhlIG91dHB1dCBmdW5jdGlvbiwgYXQgbGVhc3QgdW50aWwgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgogCiAgICAgIGluZmxhdGVCYWNrSW5pdCgpIG11c3QgYmUgY2FsbGVkIGZpcnN0IHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQogICAgYW5kIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIHdpdGggdGhlIHVzZXItcHJvdmlkZWQgd2luZG93IGJ1ZmZlci4KICAgIGluZmxhdGVCYWNrKCkgbWF5IHRoZW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyB0byBpbmZsYXRlIGEgY29tcGxldGUsIHJhdwotICAgZGVmbGF0ZSBzdHJlYW0gd2l0aCBlYWNoIGNhbGwuICBpbmZsYXRlQmFja0VuZCgpIGlzIHRoZW4gY2FsbGVkIHRvIGZyZWUKLSAgIHRoZSBhbGxvY2F0ZWQgc3RhdGUuCisgICBkZWZsYXRlIHN0cmVhbSB3aXRoIGVhY2ggY2FsbC4gIGluZmxhdGVCYWNrRW5kKCkgaXMgdGhlbiBjYWxsZWQgdG8gZnJlZSB0aGUKKyAgIGFsbG9jYXRlZCBzdGF0ZS4KIAogICAgICBBIHJhdyBkZWZsYXRlIHN0cmVhbSBpcyBvbmUgd2l0aCBubyB6bGliIG9yIGd6aXAgaGVhZGVyIG9yIHRyYWlsZXIuCiAgICBUaGlzIHJvdXRpbmUgd291bGQgbm9ybWFsbHkgYmUgdXNlZCBpbiBhIHV0aWxpdHkgdGhhdCByZWFkcyB6aXAgb3IgZ3ppcAogICAgZmlsZXMgYW5kIHdyaXRlcyBvdXQgdW5jb21wcmVzc2VkIGZpbGVzLiAgVGhlIHV0aWxpdHkgd291bGQgZGVjb2RlIHRoZQotICAgaGVhZGVyIGFuZCBwcm9jZXNzIHRoZSB0cmFpbGVyIG9uIGl0cyBvd24sIGhlbmNlIHRoaXMgcm91dGluZSBleHBlY3RzCi0gICBvbmx5IHRoZSByYXcgZGVmbGF0ZSBzdHJlYW0gdG8gZGVjb21wcmVzcy4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlCi0gICBub3JtYWwgYmVoYXZpb3Igb2YgaW5mbGF0ZSgpLCB3aGljaCBleHBlY3RzIGVpdGhlciBhIHpsaWIgb3IgZ3ppcCBoZWFkZXIgYW5kCisgICBoZWFkZXIgYW5kIHByb2Nlc3MgdGhlIHRyYWlsZXIgb24gaXRzIG93biwgaGVuY2UgdGhpcyByb3V0aW5lIGV4cGVjdHMgb25seQorICAgdGhlIHJhdyBkZWZsYXRlIHN0cmVhbSB0byBkZWNvbXByZXNzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbm9ybWFsCisgICBiZWhhdmlvciBvZiBpbmZsYXRlKCksIHdoaWNoIGV4cGVjdHMgZWl0aGVyIGEgemxpYiBvciBnemlwIGhlYWRlciBhbmQKICAgIHRyYWlsZXIgYXJvdW5kIHRoZSBkZWZsYXRlIHN0cmVhbS4KIAogICAgICBpbmZsYXRlQmFjaygpIHVzZXMgdHdvIHN1YnJvdXRpbmVzIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgdGhhdCBhcmUgdGhlbgpAQCAtOTI1LDcgKzEwNzUsNyBAQAogICAgY2FsbGluZyBpbmZsYXRlQmFjaygpLiAgSWYgc3RybS0+bmV4dF9pbiBpcyBaX05VTEwsIHRoZW4gaW4oKSB3aWxsIGJlIGNhbGxlZAogICAgaW1tZWRpYXRlbHkgZm9yIGlucHV0LiAgSWYgc3RybS0+bmV4dF9pbiBpcyBub3QgWl9OVUxMLCB0aGVuIHN0cm0tPmF2YWlsX2luCiAgICBtdXN0IGFsc28gYmUgaW5pdGlhbGl6ZWQsIGFuZCB0aGVuIGlmIHN0cm0tPmF2YWlsX2luIGlzIG5vdCB6ZXJvLCBpbnB1dCB3aWxsCi0gICBpbml0aWFsbHkgYmUgdGFrZW4gZnJvbSBzdHJtLT5uZXh0X2luWzAgLi4gc3RybS0+YXZhaWxfaW4gLSAxXS4KKyAgIGluaXRpYWxseSBiZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW5bMCAuLiAgc3RybS0+YXZhaWxfaW4gLSAxXS4KIAogICAgICBUaGUgaW5fZGVzYyBhbmQgb3V0X2Rlc2MgcGFyYW1ldGVycyBvZiBpbmZsYXRlQmFjaygpIGlzIHBhc3NlZCBhcyB0aGUKICAgIGZpcnN0IHBhcmFtZXRlciBvZiBpbigpIGFuZCBvdXQoKSByZXNwZWN0aXZlbHkgd2hlbiB0aGV5IGFyZSBjYWxsZWQuICBUaGVzZQpAQCAtOTM1LDE1ICsxMDg1LDE1IEBACiAgICAgIE9uIHJldHVybiwgaW5mbGF0ZUJhY2soKSB3aWxsIHNldCBzdHJtLT5uZXh0X2luIGFuZCBzdHJtLT5hdmFpbF9pbiB0bwogICAgcGFzcyBiYWNrIGFueSB1bnVzZWQgaW5wdXQgdGhhdCB3YXMgcHJvdmlkZWQgYnkgdGhlIGxhc3QgaW4oKSBjYWxsLiAgVGhlCiAgICByZXR1cm4gdmFsdWVzIG9mIGluZmxhdGVCYWNrKCkgY2FuIGJlIFpfU1RSRUFNX0VORCBvbiBzdWNjZXNzLCBaX0JVRl9FUlJPUgotICAgaWYgaW4oKSBvciBvdXQoKSByZXR1cm5lZCBhbiBlcnJvciwgWl9EQVRBX0VSUk9SIGlmIHRoZXJlIHdhcyBhIGZvcm1hdAotICAgZXJyb3IgaW4gdGhlIGRlZmxhdGUgc3RyZWFtIChpbiB3aGljaCBjYXNlIHN0cm0tPm1zZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhlCi0gICBuYXR1cmUgb2YgdGhlIGVycm9yKSwgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSB3YXMgbm90IHByb3Blcmx5Ci0gICBpbml0aWFsaXplZC4gIEluIHRoZSBjYXNlIG9mIFpfQlVGX0VSUk9SLCBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3IgY2FuIGJlCi0gICBkaXN0aW5ndWlzaGVkIHVzaW5nIHN0cm0tPm5leHRfaW4gd2hpY2ggd2lsbCBiZSBaX05VTEwgb25seSBpZiBpbigpIHJldHVybmVkCi0gICBhbiBlcnJvci4gIElmIHN0cm0tPm5leHQgaXMgbm90IFpfTlVMTCwgdGhlbiB0aGUgWl9CVUZfRVJST1Igd2FzIGR1ZSB0bwotICAgb3V0KCkgcmV0dXJuaW5nIG5vbi16ZXJvLiAgKGluKCkgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSBvdXQoKSwgc28KLSAgIHN0cm0tPm5leHRfaW4gaXMgYXNzdXJlZCB0byBiZSBkZWZpbmVkIGlmIG91dCgpIHJldHVybnMgbm9uLXplcm8uKSAgTm90ZQotICAgdGhhdCBpbmZsYXRlQmFjaygpIGNhbm5vdCByZXR1cm4gWl9PSy4KKyAgIGlmIGluKCkgb3Igb3V0KCkgcmV0dXJuZWQgYW4gZXJyb3IsIFpfREFUQV9FUlJPUiBpZiB0aGVyZSB3YXMgYSBmb3JtYXQgZXJyb3IKKyAgIGluIHRoZSBkZWZsYXRlIHN0cmVhbSAoaW4gd2hpY2ggY2FzZSBzdHJtLT5tc2cgaXMgc2V0IHRvIGluZGljYXRlIHRoZSBuYXR1cmUKKyAgIG9mIHRoZSBlcnJvciksIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZC4KKyAgIEluIHRoZSBjYXNlIG9mIFpfQlVGX0VSUk9SLCBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3IgY2FuIGJlIGRpc3Rpbmd1aXNoZWQKKyAgIHVzaW5nIHN0cm0tPm5leHRfaW4gd2hpY2ggd2lsbCBiZSBaX05VTEwgb25seSBpZiBpbigpIHJldHVybmVkIGFuIGVycm9yLiAgSWYKKyAgIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiB0aGUgWl9CVUZfRVJST1Igd2FzIGR1ZSB0byBvdXQoKSByZXR1cm5pbmcKKyAgIG5vbi16ZXJvLiAgKGluKCkgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSBvdXQoKSwgc28gc3RybS0+bmV4dF9pbiBpcworICAgYXNzdXJlZCB0byBiZSBkZWZpbmVkIGlmIG91dCgpIHJldHVybnMgbm9uLXplcm8uKSBOb3RlIHRoYXQgaW5mbGF0ZUJhY2soKQorICAgY2Fubm90IHJldHVybiBaX09LLgogKi8KIAogWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKQEAgLTk5NSwyNyArMTE0NSwyNyBAQAogICAgICAyNy0zMTogMCAocmVzZXJ2ZWQpCiAgKi8KIAorI2lmbmRlZiBaX1NPTE8KIAogICAgICAgICAgICAgICAgICAgICAgICAgLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KIAogLyoKLSAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZQotICAgYmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9ucy4gVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQotICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAotICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCi0gICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KKyAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZSBiYXNpYworICAgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9ucy4gIFRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UsIHNvbWUgZGVmYXVsdCBvcHRpb25zCisgICBhcmUgYXNzdW1lZCAoY29tcHJlc3Npb24gbGV2ZWwgYW5kIG1lbW9yeSB1c2FnZSwgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24KKyAgIGZ1bmN0aW9ucykuICBUaGUgc291cmNlIGNvZGUgb2YgdGhlc2UgdXRpbGl0eSBmdW5jdGlvbnMgY2FuIGJlIG1vZGlmaWVkIGlmCisgICB5b3UgbmVlZCBzcGVjaWFsIG9wdGlvbnMuCiAqLwogCiBaRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzIE9GKChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKIC8qCiAgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgc291cmNlTGVuIGlzCi0gICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsCi0gICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkCi0gICBieSBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuICBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplCisgICBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAgY29tcHJlc3NCb3VuZChzb3VyY2VMZW4pLiAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKICAgIGNvbXByZXNzZWQgYnVmZmVyLgotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXByZXNzIGEgd2hvbGUgZmlsZSBhdCBvbmNlIGlmIHRoZQotICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLgorCiAgICAgIGNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90CiAgICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKICAgIGJ1ZmZlci4KQEAgLTEwMjUsMTEgKzExNzUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSk7CiAvKgotICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gVGhlIGxldmVsCisgICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgVGhlIGxldmVsCiAgICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKLSAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCiAgICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gICBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCisgICBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQogICAgY29tcHJlc3NlZCBidWZmZXIuCiAKICAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaApAQCAtMTA0MCwxNTkgKzExOTAsMjU1IEBACiBaRVhURVJOIHVMb25nIFpFWFBPUlQgY29tcHJlc3NCb3VuZCBPRigodUxvbmcgc291cmNlTGVuKSk7CiAvKgogICAgICBjb21wcmVzc0JvdW5kKCkgcmV0dXJucyBhbiB1cHBlciBib3VuZCBvbiB0aGUgY29tcHJlc3NlZCBzaXplIGFmdGVyCi0gICBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIG9uIHNvdXJjZUxlbiBieXRlcy4gIEl0IHdvdWxkIGJlIHVzZWQgYmVmb3JlCi0gICBhIGNvbXByZXNzKCkgb3IgY29tcHJlc3MyKCkgY2FsbCB0byBhbGxvY2F0ZSB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZSBhCisgICBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKIC8qCiAgICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKLSAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwKLSAgIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUKLSAgIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUKLSAgIGJlZW4gc2F2ZWQgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvcgotICAgYnkgc29tZSBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikKLSAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLgotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCi0gICBpbnB1dCBmaWxlIGlzIG1tYXAnZWQuCisgICB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuICBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplCisgICBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbnRpcmUKKyAgIHVuY29tcHJlc3NlZCBkYXRhLiAgKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUgYmVlbiBzYXZlZAorICAgcHJldmlvdXNseSBieSB0aGUgY29tcHJlc3NvciBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGRlY29tcHJlc3NvciBieSBzb21lCisgICBtZWNoYW5pc20gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjb21wcmVzc2lvbiBsaWJyYXJ5LikgVXBvbiBleGl0LCBkZXN0TGVuCisgICBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBidWZmZXIuCiAKICAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAogICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkIG9yIGluY29tcGxldGUuCisgICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkIG9yIGluY29tcGxldGUuICBJbgorICAgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm90IGVub3VnaCByb29tLCB1bmNvbXByZXNzKCkgd2lsbCBmaWxsIHRoZSBvdXRwdXQKKyAgIGJ1ZmZlciB3aXRoIHRoZSB1bmNvbXByZXNzZWQgZGF0YSB1cCB0byB0aGF0IHBvaW50LgogKi8KIAorICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3ppcCBmaWxlIGFjY2VzcyBmdW5jdGlvbnMgKi8KIAotdHlwZWRlZiB2b2lkcCBnekZpbGU7Ci0KLVpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuICBPRigoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkpOwogLyoKLSAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIG1vZGUgcGFyYW1ldGVyCi0gICBpcyBhcyBpbiBmb3BlbiAoInJiIiBvciAid2IiKSBidXQgY2FuIGFsc28gaW5jbHVkZSBhIGNvbXByZXNzaW9uIGxldmVsCi0gICAoIndiOSIpIG9yIGEgc3RyYXRlZ3k6ICdmJyBmb3IgZmlsdGVyZWQgZGF0YSBhcyBpbiAid2I2ZiIsICdoJyBmb3IKLSAgIEh1ZmZtYW4gb25seSBjb21wcmVzc2lvbiBhcyBpbiAid2IxaCIsIG9yICdSJyBmb3IgcnVuLWxlbmd0aCBlbmNvZGluZwotICAgYXMgaW4gIndiMVIiLiAoU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBkZWZsYXRlSW5pdDIgZm9yIG1vcmUgaW5mb3JtYXRpb24KLSAgIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKQorICAgICBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdCB3aXRoCisgICBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLCB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQgd2l0aAorICAgImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEgZ3ppcAorICAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KKyovCisKK3R5cGVkZWYgc3RydWN0IGd6RmlsZV9zICpnekZpbGU7ICAgIC8qIHNlbWktb3BhcXVlIGd6aXAgZmlsZSBkZXNjcmlwdG9yICovCisKKy8qCitaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiBPRigoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkpOworCisgICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgYXMKKyAgIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwgKCJ3YjkiKSBvcgorICAgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvciBIdWZmbWFuLW9ubHkKKyAgIGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIiwgJ1InIGZvciBydW4tbGVuZ3RoIGVuY29kaW5nIGFzIGluICJ3YjFSIiwgb3IgJ0YnCisgICBmb3IgZml4ZWQgY29kZSBjb21wcmVzc2lvbiBhcyBpbiAid2I5RiIuICAoU2VlIHRoZSBkZXNjcmlwdGlvbiBvZgorICAgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKSAgJ1QnIHdpbGwKKyAgIHJlcXVlc3QgdHJhbnNwYXJlbnQgd3JpdGluZyBvciBhcHBlbmRpbmcgd2l0aCBubyBjb21wcmVzc2lvbiBhbmQgbm90IHVzaW5nCisgICB0aGUgZ3ppcCBmb3JtYXQuCisKKyAgICAgImEiIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgInciIHRvIHJlcXVlc3QgdGhhdCB0aGUgZ3ppcCBzdHJlYW0gdGhhdCB3aWxsCisgICBiZSB3cml0dGVuIGJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlLiAgIisiIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLCBzaW5jZQorICAgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgc2FtZSBnemlwIGZpbGUgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSBhZGRpdGlvbiBvZgorICAgIngiIHdoZW4gd3JpdGluZyB3aWxsIGNyZWF0ZSB0aGUgZmlsZSBleGNsdXNpdmVseSwgd2hpY2ggZmFpbHMgaWYgdGhlIGZpbGUKKyAgIGFscmVhZHkgZXhpc3RzLiAgT24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQsIHRoZSBhZGRpdGlvbiBvZiAiZSIgd2hlbgorICAgcmVhZGluZyBvciB3cml0aW5nIHdpbGwgc2V0IHRoZSBmbGFnIHRvIGNsb3NlIHRoZSBmaWxlIG9uIGFuIGV4ZWN2ZSgpIGNhbGwuCisKKyAgICAgVGhlc2UgZnVuY3Rpb25zLCBhcyB3ZWxsIGFzIGd6aXAsIHdpbGwgcmVhZCBhbmQgZGVjb2RlIGEgc2VxdWVuY2Ugb2YgZ3ppcAorICAgc3RyZWFtcyBpbiBhIGZpbGUuICBUaGUgYXBwZW5kIGZ1bmN0aW9uIG9mIGd6b3BlbigpIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQorICAgc3VjaCBhIGZpbGUuICAoQWxzbyBzZWUgZ3pmbHVzaCgpIGZvciBhbm90aGVyIHdheSB0byBkbyB0aGlzLikgIFdoZW4KKyAgIGFwcGVuZGluZywgZ3pvcGVuIGRvZXMgbm90IHRlc3Qgd2hldGhlciB0aGUgZmlsZSBiZWdpbnMgd2l0aCBhIGd6aXAgc3RyZWFtLAorICAgbm9yIGRvZXMgaXQgbG9vayBmb3IgdGhlIGVuZCBvZiB0aGUgZ3ppcCBzdHJlYW1zIHRvIGJlZ2luIGFwcGVuZGluZy4gIGd6b3BlbgorICAgd2lsbCBzaW1wbHkgYXBwZW5kIGEgZ3ppcCBzdHJlYW0gdG8gdGhlIGV4aXN0aW5nIGZpbGUuCiAKICAgICAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsgaW4gdGhpcwotICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLgorICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLiAgV2hlbgorICAgcmVhZGluZywgdGhpcyB3aWxsIGJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkgYnkgbG9va2luZyBmb3IgdGhlIG1hZ2ljIHR3by0KKyAgIGJ5dGUgZ3ppcCBoZWFkZXIuCiAKLSAgICAgZ3pvcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIG9yIGlmIHRoZXJlIHdhcwotICAgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlOyBlcnJubwotICAgY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyAoaWYgZXJybm8gaXMgemVybywgdGhlCi0gICB6bGliIGVycm9yIGlzIFpfTUVNX0VSUk9SKS4gICovCisgICAgIGd6b3BlbiByZXR1cm5zIE5VTEwgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCwgaWYgdGhlcmUgd2FzCisgICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBnekZpbGUgc3RhdGUsIG9yIGlmIGFuIGludmFsaWQgbW9kZSB3YXMKKyAgIHNwZWNpZmllZCAoYW4gJ3InLCAndycsIG9yICdhJyB3YXMgbm90IHByb3ZpZGVkLCBvciAnKycgd2FzIHByb3ZpZGVkKS4KKyAgIGVycm5vIGNhbiBiZSBjaGVja2VkIHRvIGRldGVybWluZSBpZiB0aGUgcmVhc29uIGd6b3BlbiBmYWlsZWQgd2FzIHRoYXQgdGhlCisgICBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQuCisqLwogCi1aRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6ZG9wZW4gIE9GKChpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUpKTsKK1pFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiBPRigoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKSk7CiAvKgotICAgICBnemRvcGVuKCkgYXNzb2NpYXRlcyBhIGd6RmlsZSB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IgZmQuICBGaWxlCi0gICBkZXNjcmlwdG9ycyBhcmUgb2J0YWluZWQgZnJvbSBjYWxscyBsaWtlIG9wZW4sIGR1cCwgY3JlYXQsIHBpcGUgb3IKLSAgIGZpbGVubyAoaW4gdGhlIGZpbGUgaGFzIGJlZW4gcHJldmlvdXNseSBvcGVuZWQgd2l0aCBmb3BlbikuCi0gICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgYXMgaW4gZ3pvcGVuLgotICAgICBUaGUgbmV4dCBjYWxsIG9mIGd6Y2xvc2Ugb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlCi0gICBmaWxlIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkKSwgbW9kZSkgY2xvc2VzIHRoZSBmaWxlCi0gICBkZXNjcmlwdG9yIGZkLiBJZiB5b3Ugd2FudCB0byBrZWVwIGZkIG9wZW4sIHVzZSBnemRvcGVuKGR1cChmZCksIG1vZGUpLgotICAgICBnemRvcGVuIHJldHVybnMgTlVMTCBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZQotICAgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4KKyAgICAgZ3pkb3BlbiBhc3NvY2lhdGVzIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gIEZpbGUgZGVzY3JpcHRvcnMKKyAgIGFyZSBvYnRhaW5lZCBmcm9tIGNhbGxzIGxpa2Ugb3BlbiwgZHVwLCBjcmVhdCwgcGlwZSBvciBmaWxlbm8gKGlmIHRoZSBmaWxlCisgICBoYXMgYmVlbiBwcmV2aW91c2x5IG9wZW5lZCB3aXRoIGZvcGVuKS4gIFRoZSBtb2RlIHBhcmFtZXRlciBpcyBhcyBpbiBnem9wZW4uCisKKyAgICAgVGhlIG5leHQgY2FsbCBvZiBnemNsb3NlIG9uIHRoZSByZXR1cm5lZCBnekZpbGUgd2lsbCBhbHNvIGNsb3NlIHRoZSBmaWxlCisgICBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCwgbW9kZSkpIGNsb3NlcyB0aGUgZmlsZSBkZXNjcmlwdG9yCisgICBmZC4gIElmIHlvdSB3YW50IHRvIGtlZXAgZmQgb3BlbiwgdXNlIGZkID0gZHVwKGZkX2tlZXApOyBneiA9IGd6ZG9wZW4oZmQsCisgICBtb2RlKTsuICBUaGUgZHVwbGljYXRlZCBkZXNjcmlwdG9yIHNob3VsZCBiZSBzYXZlZCB0byBhdm9pZCBhIGxlYWssIHNpbmNlCisgICBnemRvcGVuIGRvZXMgbm90IGNsb3NlIGZkIGlmIGl0IGZhaWxzLiAgSWYgeW91IGFyZSB1c2luZyBmaWxlbm8oKSB0byBnZXQgdGhlCisgICBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIEZJTEUgKiwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIHVzZSBkdXAoKSB0byBhdm9pZAorICAgZG91YmxlLWNsb3NlKClpbmcgdGhlIGZpbGUgZGVzY3JpcHRvci4gIEJvdGggZ3pjbG9zZSgpIGFuZCBmY2xvc2UoKSB3aWxsCisgICBjbG9zZSB0aGUgYXNzb2NpYXRlZCBmaWxlIGRlc2NyaXB0b3IsIHNvIHRoZXkgbmVlZCB0byBoYXZlIGRpZmZlcmVudCBmaWxlCisgICBkZXNjcmlwdG9ycy4KKworICAgICBnemRvcGVuIHJldHVybnMgTlVMTCBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUKKyAgIGd6RmlsZSBzdGF0ZSwgaWYgYW4gaW52YWxpZCBtb2RlIHdhcyBzcGVjaWZpZWQgKGFuICdyJywgJ3cnLCBvciAnYScgd2FzIG5vdAorICAgcHJvdmlkZWQsIG9yICcrJyB3YXMgcHJvdmlkZWQpLCBvciBpZiBmZCBpcyAtMS4gIFRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgbm90CisgICB1c2VkIHVudGlsIHRoZSBuZXh0IGd6KiByZWFkLCB3cml0ZSwgc2Vlaywgb3IgY2xvc2Ugb3BlcmF0aW9uLCBzbyBnemRvcGVuCisgICB3aWxsIG5vdCBkZXRlY3QgaWYgZmQgaXMgaW52YWxpZCAodW5sZXNzIGZkIGlzIC0xKS4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pidWZmZXIgT0YoKGd6RmlsZSBmaWxlLCB1bnNpZ25lZCBzaXplKSk7CisvKgorICAgICBTZXQgdGhlIGludGVybmFsIGJ1ZmZlciBzaXplIHVzZWQgYnkgdGhpcyBsaWJyYXJ5J3MgZnVuY3Rpb25zLiAgVGhlCisgICBkZWZhdWx0IGJ1ZmZlciBzaXplIGlzIDgxOTIgYnl0ZXMuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyCisgICBnem9wZW4oKSBvciBnemRvcGVuKCksIGFuZCBiZWZvcmUgYW55IG90aGVyIGNhbGxzIHRoYXQgcmVhZCBvciB3cml0ZSB0aGUKKyAgIGZpbGUuICBUaGUgYnVmZmVyIG1lbW9yeSBhbGxvY2F0aW9uIGlzIGFsd2F5cyBkZWZlcnJlZCB0byB0aGUgZmlyc3QgcmVhZCBvcgorICAgd3JpdGUuICBUd28gYnVmZmVycyBhcmUgYWxsb2NhdGVkLCBlaXRoZXIgYm90aCBvZiB0aGUgc3BlY2lmaWVkIHNpemUgd2hlbgorICAgd3JpdGluZywgb3Igb25lIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBhbmQgdGhlIG90aGVyIHR3aWNlIHRoYXQgc2l6ZSB3aGVuCisgICByZWFkaW5nLiAgQSBsYXJnZXIgYnVmZmVyIHNpemUgb2YsIGZvciBleGFtcGxlLCA2NEsgb3IgMTI4SyBieXRlcyB3aWxsCisgICBub3RpY2VhYmx5IGluY3JlYXNlIHRoZSBzcGVlZCBvZiBkZWNvbXByZXNzaW9uIChyZWFkaW5nKS4KKworICAgICBUaGUgbmV3IGJ1ZmZlciBzaXplIGFsc28gYWZmZWN0cyB0aGUgbWF4aW11bSBsZW5ndGggZm9yIGd6cHJpbnRmKCkuCisKKyAgICAgZ3pidWZmZXIoKSByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZSwgc3VjaCBhcyBiZWluZyBjYWxsZWQKKyAgIHRvbyBsYXRlLgogKi8KIAogWkVYVEVSTiBpbnQgWkVYUE9SVCBnenNldHBhcmFtcyBPRigoZ3pGaWxlIGZpbGUsIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KSk7CiAvKgotICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIG9yIHN0cmF0ZWd5LiBTZWUgdGhlIGRlc2NyaXB0aW9uCisgICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuICBTZWUgdGhlIGRlc2NyaXB0aW9uCiAgICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCisKICAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKICAgIG9wZW5lZCBmb3Igd3JpdGluZy4KICovCiAKLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pyZWFkICBPRigoZ3pGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGd6cmVhZCBPRigoZ3pGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKSk7CiAvKgotICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCBnenJlYWQgY29waWVzIHRoZSBnaXZlbiBudW1iZXIKLSAgIG9mIGJ5dGVzIGludG8gdGhlIGJ1ZmZlci4KLSAgICAgZ3pyZWFkIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgcmVhZCAoMCBmb3IKLSAgIGVuZCBvZiBmaWxlLCAtMSBmb3IgZXJyb3IpLiAqLworICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuICBJZgorICAgdGhlIGlucHV0IGZpbGUgaXMgbm90IGluIGd6aXAgZm9ybWF0LCBnenJlYWQgY29waWVzIHRoZSBnaXZlbiBudW1iZXIgb2YKKyAgIGJ5dGVzIGludG8gdGhlIGJ1ZmZlciBkaXJlY3RseSBmcm9tIHRoZSBmaWxlLgogCi1aRVhURVJOIGludCBaRVhQT1JUICAgIGd6d3JpdGUgT0YoKGd6RmlsZSBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcGMgYnVmLCB1bnNpZ25lZCBsZW4pKTsKLS8qCi0gICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCi0gICBnendyaXRlIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbgotICAgKDAgaW4gY2FzZSBvZiBlcnJvcikuCisgICAgIEFmdGVyIHJlYWNoaW5nIHRoZSBlbmQgb2YgYSBnemlwIHN0cmVhbSBpbiB0aGUgaW5wdXQsIGd6cmVhZCB3aWxsIGNvbnRpbnVlCisgICB0byByZWFkLCBsb29raW5nIGZvciBhbm90aGVyIGd6aXAgc3RyZWFtLiAgQW55IG51bWJlciBvZiBnemlwIHN0cmVhbXMgbWF5IGJlCisgICBjb25jYXRlbmF0ZWQgaW4gdGhlIGlucHV0IGZpbGUsIGFuZCB3aWxsIGFsbCBiZSBkZWNvbXByZXNzZWQgYnkgZ3pyZWFkKCkuCisgICBJZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGd6aXAgc3RyZWFtIGlzIGVuY291bnRlcmVkIGFmdGVyIGEgZ3ppcCBzdHJlYW0sCisgICB0aGF0IHJlbWFpbmluZyB0cmFpbGluZyBnYXJiYWdlIGlzIGlnbm9yZWQgKGFuZCBubyBlcnJvciBpcyByZXR1cm5lZCkuCisKKyAgICAgZ3pyZWFkIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBnemlwIGZpbGUgdGhhdCBpcyBiZWluZyBjb25jdXJyZW50bHkgd3JpdHRlbi4KKyAgIFVwb24gcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgaW5wdXQsIGd6cmVhZCB3aWxsIHJldHVybiB3aXRoIHRoZSBhdmFpbGFibGUKKyAgIGRhdGEuICBJZiB0aGUgZXJyb3IgY29kZSByZXR1cm5lZCBieSBnemVycm9yIGlzIFpfT0sgb3IgWl9CVUZfRVJST1IsIHRoZW4KKyAgIGd6Y2xlYXJlcnIgY2FuIGJlIHVzZWQgdG8gY2xlYXIgdGhlIGVuZCBvZiBmaWxlIGluZGljYXRvciBpbiBvcmRlciB0byBwZXJtaXQKKyAgIGd6cmVhZCB0byBiZSB0cmllZCBhZ2Fpbi4gIFpfT0sgaW5kaWNhdGVzIHRoYXQgYSBnemlwIHN0cmVhbSB3YXMgY29tcGxldGVkCisgICBvbiB0aGUgbGFzdCBnenJlYWQuICBaX0JVRl9FUlJPUiBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5wdXQgZmlsZSBlbmRlZCBpbiB0aGUKKyAgIG1pZGRsZSBvZiBhIGd6aXAgc3RyZWFtLiAgTm90ZSB0aGF0IGd6cmVhZCBkb2VzIG5vdCByZXR1cm4gLTEgaW4gdGhlIGV2ZW50CisgICBvZiBhbiBpbmNvbXBsZXRlIGd6aXAgc3RyZWFtLiAgVGhpcyBlcnJvciBpcyBkZWZlcnJlZCB1bnRpbCBnemNsb3NlKCksIHdoaWNoCisgICB3aWxsIHJldHVybiBaX0JVRl9FUlJPUiBpZiB0aGUgbGFzdCBnenJlYWQgZW5kZWQgaW4gdGhlIG1pZGRsZSBvZiBhIGd6aXAKKyAgIHN0cmVhbS4gIEFsdGVybmF0aXZlbHksIGd6ZXJyb3IgY2FuIGJlIHVzZWQgYmVmb3JlIGd6Y2xvc2UgdG8gZGV0ZWN0IHRoaXMKKyAgIGNhc2UuCisKKyAgICAgZ3pyZWFkIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgcmVhZCwgbGVzcyB0aGFuCisgICBsZW4gZm9yIGVuZCBvZiBmaWxlLCBvciAtMSBmb3IgZXJyb3IuCiAqLwogCi1aRVhURVJOIGludCBaRVhQT1JUVkEgICBnenByaW50ZiBPRigoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGd6d3JpdGUgT0YoKGd6RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkcGMgYnVmLCB1bnNpZ25lZCBsZW4pKTsKIC8qCi0gICAgIENvbnZlcnRzLCBmb3JtYXRzLCBhbmQgd3JpdGVzIHRoZSBhcmdzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKLSAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuIGd6cHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgotICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuICBUaGUgbnVtYmVyIG9mCi0gICB1bmNvbXByZXNzZWQgYnl0ZXMgd3JpdHRlbiBpcyBsaW1pdGVkIHRvIDQwOTUuIFRoZSBjYWxsZXIgc2hvdWxkIGFzc3VyZSB0aGF0Ci0gICB0aGlzIGxpbWl0IGlzIG5vdCBleGNlZWRlZC4gSWYgaXQgaXMgZXhjZWVkZWQsIHRoZW4gZ3pwcmludGYoKSB3aWxsIHJldHVybgotICAgcmV0dXJuIGFuIGVycm9yICgwKSB3aXRoIG5vdGhpbmcgd3JpdHRlbi4gSW4gdGhpcyBjYXNlLCB0aGVyZSBtYXkgYWxzbyBiZSBhCi0gICBidWZmZXIgb3ZlcmZsb3cgd2l0aCB1bnByZWRpY3RhYmxlIGNvbnNlcXVlbmNlcywgd2hpY2ggaXMgcG9zc2libGUgb25seSBpZgotICAgemxpYiB3YXMgY29tcGlsZWQgd2l0aCB0aGUgaW5zZWN1cmUgZnVuY3Rpb25zIHNwcmludGYoKSBvciB2c3ByaW50ZigpCi0gICBiZWNhdXNlIHRoZSBzZWN1cmUgc25wcmludGYoKSBvciB2c25wcmludGYoKSBmdW5jdGlvbnMgd2VyZSBub3QgYXZhaWxhYmxlLgorICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3p3cml0ZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIHdyaXR0ZW4gb3IgMCBpbiBjYXNlIG9mCisgICBlcnJvci4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlRWQSBnenByaW50ZiBaX0FSRygoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSk7CisvKgorICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKKyAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuICBnenByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuLCBvciAwIGluIGNhc2Ugb2YgZXJyb3IuICBUaGUgbnVtYmVyIG9mCisgICB1bmNvbXByZXNzZWQgYnl0ZXMgd3JpdHRlbiBpcyBsaW1pdGVkIHRvIDgxOTEsIG9yIG9uZSBsZXNzIHRoYW4gdGhlIGJ1ZmZlcgorICAgc2l6ZSBnaXZlbiB0byBnemJ1ZmZlcigpLiAgVGhlIGNhbGxlciBzaG91bGQgYXNzdXJlIHRoYXQgdGhpcyBsaW1pdCBpcyBub3QKKyAgIGV4Y2VlZGVkLiAgSWYgaXQgaXMgZXhjZWVkZWQsIHRoZW4gZ3pwcmludGYoKSB3aWxsIHJldHVybiBhbiBlcnJvciAoMCkgd2l0aAorICAgbm90aGluZyB3cml0dGVuLiAgSW4gdGhpcyBjYXNlLCB0aGVyZSBtYXkgYWxzbyBiZSBhIGJ1ZmZlciBvdmVyZmxvdyB3aXRoCisgICB1bnByZWRpY3RhYmxlIGNvbnNlcXVlbmNlcywgd2hpY2ggaXMgcG9zc2libGUgb25seSBpZiB6bGliIHdhcyBjb21waWxlZCB3aXRoCisgICB0aGUgaW5zZWN1cmUgZnVuY3Rpb25zIHNwcmludGYoKSBvciB2c3ByaW50ZigpIGJlY2F1c2UgdGhlIHNlY3VyZSBzbnByaW50ZigpCisgICBvciB2c25wcmludGYoKSBmdW5jdGlvbnMgd2VyZSBub3QgYXZhaWxhYmxlLiAgVGhpcyBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZworICAgemxpYkNvbXBpbGVGbGFncygpLgogKi8KIAogWkVYVEVSTiBpbnQgWkVYUE9SVCBnenB1dHMgT0YoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpzKSk7CiAvKgotICAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZworICAgICBXcml0ZXMgdGhlIGdpdmVuIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdG8gdGhlIGNvbXByZXNzZWQgZmlsZSwgZXhjbHVkaW5nCiAgICB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuCi0gICAgICBnenB1dHMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKworICAgICBnenB1dHMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KICovCiAKIFpFWFRFUk4gY2hhciAqIFpFWFBPUlQgZ3pnZXRzIE9GKChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKSk7CiAvKgotICAgICAgUmVhZHMgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlIHVudGlsIGxlbi0xIGNoYXJhY3RlcnMgYXJlIHJlYWQsIG9yCi0gICBhIG5ld2xpbmUgY2hhcmFjdGVyIGlzIHJlYWQgYW5kIHRyYW5zZmVycmVkIHRvIGJ1Ziwgb3IgYW4gZW5kLW9mLWZpbGUKLSAgIGNvbmRpdGlvbiBpcyBlbmNvdW50ZXJlZC4gIFRoZSBzdHJpbmcgaXMgdGhlbiB0ZXJtaW5hdGVkIHdpdGggYSBudWxsCi0gICBjaGFyYWN0ZXIuCi0gICAgICBnemdldHMgcmV0dXJucyBidWYsIG9yIFpfTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorICAgICBSZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgdW50aWwgbGVuLTEgY2hhcmFjdGVycyBhcmUgcmVhZCwgb3IgYQorICAgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbiBlbmQtb2YtZmlsZQorICAgY29uZGl0aW9uIGlzIGVuY291bnRlcmVkLiAgSWYgYW55IGNoYXJhY3RlcnMgYXJlIHJlYWQgb3IgaWYgbGVuID09IDEsIHRoZQorICAgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgd2l0aCBhIG51bGwgY2hhcmFjdGVyLiAgSWYgbm8gY2hhcmFjdGVycyBhcmUgcmVhZCBkdWUKKyAgIHRvIGFuIGVuZC1vZi1maWxlIG9yIGxlbiA8IDEsIHRoZW4gdGhlIGJ1ZmZlciBpcyBsZWZ0IHVudG91Y2hlZC4KKworICAgICBnemdldHMgcmV0dXJucyBidWYgd2hpY2ggaXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLCBvciBpdCByZXR1cm5zIE5VTEwKKyAgIGZvciBlbmQtb2YtZmlsZSBvciBpbiBjYXNlIG9mIGVycm9yLiAgSWYgdGhlcmUgd2FzIGFuIGVycm9yLCB0aGUgY29udGVudHMgYXQKKyAgIGJ1ZiBhcmUgaW5kZXRlcm1pbmF0ZS4KICovCiAKLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pwdXRjIE9GKChnekZpbGUgZmlsZSwgaW50IGMpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRjIE9GKChnekZpbGUgZmlsZSwgaW50IGMpKTsKIC8qCi0gICAgICBXcml0ZXMgYywgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgIGd6cHV0YyByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgorICAgICBXcml0ZXMgYywgY29udmVydGVkIHRvIGFuIHVuc2lnbmVkIGNoYXIsIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4gIGd6cHV0YworICAgcmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgd3JpdHRlbiwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KICovCiAKLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pnZXRjIE9GKChnekZpbGUgZmlsZSkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemdldGMgT0YoKGd6RmlsZSBmaWxlKSk7CiAvKgotICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiBnemdldGMgcmV0dXJucyB0aGlzIGJ5dGUKLSAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCisgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZSBvciAtMQorICAgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBtYWNybyBmb3Igc3BlZWQuCisgICBBcyBzdWNoLCBpdCBkb2VzIG5vdCBkbyBhbGwgb2YgdGhlIGNoZWNraW5nIHRoZSBvdGhlciBmdW5jdGlvbnMgZG8uICBJLmUuCisgICBpdCBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZmlsZSBpcyBOVUxMLCBub3Igd2hldGhlciB0aGUgc3RydWN0dXJlIGZpbGUKKyAgIHBvaW50cyB0byBoYXMgYmVlbiBjbG9iYmVyZWQgb3Igbm90LgogKi8KIAotWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenVuZ2V0YyBPRigoaW50IGMsIGd6RmlsZSBmaWxlKSk7CitaRVhURVJOIGludCBaRVhQT1JUIGd6dW5nZXRjIE9GKChpbnQgYywgZ3pGaWxlIGZpbGUpKTsKIC8qCi0gICAgICBQdXNoIG9uZSBjaGFyYWN0ZXIgYmFjayBvbnRvIHRoZSBzdHJlYW0gdG8gYmUgcmVhZCBhZ2FpbiBsYXRlci4KLSAgIE9ubHkgb25lIGNoYXJhY3RlciBvZiBwdXNoLWJhY2sgaXMgYWxsb3dlZC4gIGd6dW5nZXRjKCkgcmV0dXJucyB0aGUKLSAgIGNoYXJhY3RlciBwdXNoZWQsIG9yIC0xIG9uIGZhaWx1cmUuICBnenVuZ2V0YygpIHdpbGwgZmFpbCBpZiBhCi0gICBjaGFyYWN0ZXIgaGFzIGJlZW4gcHVzaGVkIGJ1dCBub3QgcmVhZCB5ZXQsIG9yIGlmIGMgaXMgLTEuIFRoZSBwdXNoZWQKLSAgIGNoYXJhY3RlciB3aWxsIGJlIGRpc2NhcmRlZCBpZiB0aGUgc3RyZWFtIGlzIHJlcG9zaXRpb25lZCB3aXRoIGd6c2VlaygpCi0gICBvciBnenJld2luZCgpLgorICAgICBQdXNoIG9uZSBjaGFyYWN0ZXIgYmFjayBvbnRvIHRoZSBzdHJlYW0gdG8gYmUgcmVhZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCisgICBvbiB0aGUgbmV4dCByZWFkLiAgQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBvZiBwdXNoLWJhY2sgaXMgYWxsb3dlZC4KKyAgIGd6dW5nZXRjKCkgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHB1c2hlZCwgb3IgLTEgb24gZmFpbHVyZS4gIGd6dW5nZXRjKCkgd2lsbAorICAgZmFpbCBpZiBjIGlzIC0xLCBhbmQgbWF5IGZhaWwgaWYgYSBjaGFyYWN0ZXIgaGFzIGJlZW4gcHVzaGVkIGJ1dCBub3QgcmVhZAorICAgeWV0LiAgSWYgZ3p1bmdldGMgaXMgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBnem9wZW4gb3IgZ3pkb3BlbiwgYXQgbGVhc3QgdGhlCisgICBvdXRwdXQgYnVmZmVyIHNpemUgb2YgcHVzaGVkIGNoYXJhY3RlcnMgaXMgYWxsb3dlZC4gIChTZWUgZ3pidWZmZXIgYWJvdmUuKQorICAgVGhlIHB1c2hlZCBjaGFyYWN0ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhlIHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgd2l0aAorICAgZ3pzZWVrKCkgb3IgZ3pyZXdpbmQoKS4KICovCiAKLVpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemZsdXNoIE9GKChnekZpbGUgZmlsZSwgaW50IGZsdXNoKSk7CiAvKgotICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuIFRoZSBwYXJhbWV0ZXIKLSAgIGZsdXNoIGlzIGFzIGluIHRoZSBkZWZsYXRlKCkgZnVuY3Rpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIKLSAgIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiBnemZsdXNoIHJldHVybnMgWl9PSyBpZgotICAgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyBaX0ZJTklTSCBhbmQgYWxsIG91dHB1dCBjb3VsZCBiZSBmbHVzaGVkLgotICAgICBnemZsdXNoIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgotICAgZGVncmFkZSBjb21wcmVzc2lvbi4KKyAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiAgVGhlIHBhcmFtZXRlciBmbHVzaAorICAgaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIgZXJyb3IgbnVtYmVyCisgICAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiAgZ3pmbHVzaCBpcyBvbmx5IHBlcm1pdHRlZCB3aGVuIHdyaXRpbmcuCisKKyAgICAgSWYgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyBaX0ZJTklTSCwgdGhlIHJlbWFpbmluZyBkYXRhIGlzIHdyaXR0ZW4gYW5kIHRoZQorICAgZ3ppcCBzdHJlYW0gaXMgY29tcGxldGVkIGluIHRoZSBvdXRwdXQuICBJZiBnendyaXRlKCkgaXMgY2FsbGVkIGFnYWluLCBhIG5ldworICAgZ3ppcCBzdHJlYW0gd2lsbCBiZSBzdGFydGVkIGluIHRoZSBvdXRwdXQuICBnenJlYWQoKSBpcyBhYmxlIHRvIHJlYWQgc3VjaAorICAgY29uY2F0ZW50ZWQgZ3ppcCBzdHJlYW1zLgorCisgICAgIGd6Zmx1c2ggc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgd2lsbAorICAgZGVncmFkZSBjb21wcmVzc2lvbiBpZiBjYWxsZWQgdG9vIG9mdGVuLgogKi8KIAotWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3pzZWVrIE9GKChnekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpKTsKIC8qCi0gICAgICBTZXRzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlCi0gICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIFRoZSBvZmZzZXQgcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKLSAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4gVGhlIHdoZW5jZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBpbiBsc2VlaygyKTsKK1pFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7CisKKyAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZSBnaXZlbgorICAgY29tcHJlc3NlZCBmaWxlLiAgVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiAgVGhlIHdoZW5jZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBpbiBsc2VlaygyKTsKICAgIHRoZSB2YWx1ZSBTRUVLX0VORCBpcyBub3Qgc3VwcG9ydGVkLgorCiAgICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCi0gICBleHRyZW1lbHkgc2xvdy4gSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nLCBvbmx5IGZvcndhcmQgc2Vla3MgYXJlCisgICBleHRyZW1lbHkgc2xvdy4gIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQogICAgc3VwcG9ydGVkOyBnenNlZWsgdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKICAgIHN0YXJ0aW5nIHBvc2l0aW9uLgogCi0gICAgICBnenNlZWsgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9mZnNldCBsb2NhdGlvbiBhcyBtZWFzdXJlZCBpbiBieXRlcyBmcm9tCisgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCiAgICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgogICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgpAQCAtMTIwMiw2OCArMTQ0OCwxMzQgQEAKIC8qCiAgICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCiAKLSAgIGd6cmV3aW5kKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludClnenNlZWsoZmlsZSwgMEwsIFNFRUtfU0VUKQorICAgICBnenJld2luZChmaWxlKSBpcyBlcXVpdmFsZW50IHRvIChpbnQpZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX1NFVCkKICovCiAKLVpFWFRFUk4gel9vZmZfdCBaRVhQT1JUICAgIGd6dGVsbCBPRigoZ3pGaWxlIGZpbGUpKTsKIC8qCi0gICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKLSAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgorWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3p0ZWxsIE9GKChnekZpbGUgZmlsZSkpOwogCi0gICBnenRlbGwoZmlsZSkgaXMgZXF1aXZhbGVudCB0byBnenNlZWsoZmlsZSwgMEwsIFNFRUtfQ1VSKQorICAgICBSZXR1cm5zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlIGdpdmVuCisgICBjb21wcmVzc2VkIGZpbGUuICBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0sIGFuZCBpcyB6ZXJvIHdoZW4gc3RhcnRpbmcsIGV2ZW4gaWYgYXBwZW5kaW5nIG9yCisgICByZWFkaW5nIGEgZ3ppcCBzdHJlYW0gZnJvbSB0aGUgbWlkZGxlIG9mIGEgZmlsZSB1c2luZyBnemRvcGVuKCkuCisKKyAgICAgZ3p0ZWxsKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX0NVUikKKyovCisKKy8qCitaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnem9mZnNldCBPRigoZ3pGaWxlIGZpbGUpKTsKKworICAgICBSZXR1cm5zIHRoZSBjdXJyZW50IG9mZnNldCBpbiB0aGUgZmlsZSBiZWluZyByZWFkIG9yIHdyaXR0ZW4uICBUaGlzIG9mZnNldAorICAgaW5jbHVkZXMgdGhlIGNvdW50IG9mIGJ5dGVzIHRoYXQgcHJlY2VkZSB0aGUgZ3ppcCBzdHJlYW0sIGZvciBleGFtcGxlIHdoZW4KKyAgIGFwcGVuZGluZyBvciB3aGVuIHVzaW5nIGd6ZG9wZW4oKSBmb3IgcmVhZGluZy4gIFdoZW4gcmVhZGluZywgdGhlIG9mZnNldAorICAgZG9lcyBub3QgaW5jbHVkZSBhcyB5ZXQgdW51c2VkIGJ1ZmZlcmVkIGlucHV0LiAgVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZAorICAgZm9yIGEgcHJvZ3Jlc3MgaW5kaWNhdG9yLiAgT24gZXJyb3IsIGd6b2Zmc2V0KCkgcmV0dXJucyAtMS4KICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgZ3plb2YgT0YoKGd6RmlsZSBmaWxlKSk7CiAvKgotICAgICBSZXR1cm5zIDEgd2hlbiBFT0YgaGFzIHByZXZpb3VzbHkgYmVlbiBkZXRlY3RlZCByZWFkaW5nIHRoZSBnaXZlbgotICAgaW5wdXQgc3RyZWFtLCBvdGhlcndpc2UgemVyby4KKyAgICAgUmV0dXJucyB0cnVlICgxKSBpZiB0aGUgZW5kLW9mLWZpbGUgaW5kaWNhdG9yIGhhcyBiZWVuIHNldCB3aGlsZSByZWFkaW5nLAorICAgZmFsc2UgKDApIG90aGVyd2lzZS4gIE5vdGUgdGhhdCB0aGUgZW5kLW9mLWZpbGUgaW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZQorICAgcmVhZCB0cmllZCB0byBnbyBwYXN0IHRoZSBlbmQgb2YgdGhlIGlucHV0LCBidXQgY2FtZSB1cCBzaG9ydC4gIFRoZXJlZm9yZSwKKyAgIGp1c3QgbGlrZSBmZW9mKCksIGd6ZW9mKCkgbWF5IHJldHVybiBmYWxzZSBldmVuIGlmIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0bworICAgcmVhZCwgaW4gdGhlIGV2ZW50IHRoYXQgdGhlIGxhc3QgcmVhZCByZXF1ZXN0IHdhcyBmb3IgdGhlIGV4YWN0IG51bWJlciBvZgorICAgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyB3aWxsIGhhcHBlbiBpZiB0aGUgaW5wdXQgZmlsZSBzaXplCisgICBpcyBhbiBleGFjdCBtdWx0aXBsZSBvZiB0aGUgYnVmZmVyIHNpemUuCisKKyAgICAgSWYgZ3plb2YoKSByZXR1cm5zIHRydWUsIHRoZW4gdGhlIHJlYWQgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIG5vIG1vcmUgZGF0YSwKKyAgIHVubGVzcyB0aGUgZW5kLW9mLWZpbGUgaW5kaWNhdG9yIGlzIHJlc2V0IGJ5IGd6Y2xlYXJlcnIoKSBhbmQgdGhlIGlucHV0IGZpbGUKKyAgIGhhcyBncm93biBzaW5jZSB0aGUgcHJldmlvdXMgZW5kIG9mIGZpbGUgd2FzIGRldGVjdGVkLgogKi8KIAogWkVYVEVSTiBpbnQgWkVYUE9SVCBnemRpcmVjdCBPRigoZ3pGaWxlIGZpbGUpKTsKIC8qCi0gICAgIFJldHVybnMgMSBpZiBmaWxlIGlzIGJlaW5nIHJlYWQgZGlyZWN0bHkgd2l0aG91dCBkZWNvbXByZXNzaW9uLCBvdGhlcndpc2UKLSAgIHplcm8uCisgICAgIFJldHVybnMgdHJ1ZSAoMSkgaWYgZmlsZSBpcyBiZWluZyBjb3BpZWQgZGlyZWN0bHkgd2hpbGUgcmVhZGluZywgb3IgZmFsc2UKKyAgICgwKSBpZiBmaWxlIGlzIGEgZ3ppcCBzdHJlYW0gYmVpbmcgZGVjb21wcmVzc2VkLgorCisgICAgIElmIHRoZSBpbnB1dCBmaWxlIGlzIGVtcHR5LCBnemRpcmVjdCgpIHdpbGwgcmV0dXJuIHRydWUsIHNpbmNlIHRoZSBpbnB1dAorICAgZG9lcyBub3QgY29udGFpbiBhIGd6aXAgc3RyZWFtLgorCisgICAgIElmIGd6ZGlyZWN0KCkgaXMgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBnem9wZW4oKSBvciBnemRvcGVuKCkgaXQgd2lsbAorICAgY2F1c2UgYnVmZmVycyB0byBiZSBhbGxvY2F0ZWQgdG8gYWxsb3cgcmVhZGluZyB0aGUgZmlsZSB0byBkZXRlcm1pbmUgaWYgaXQKKyAgIGlzIGEgZ3ppcCBmaWxlLiAgVGhlcmVmb3JlIGlmIGd6YnVmZmVyKCkgaXMgdXNlZCwgaXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUKKyAgIGd6ZGlyZWN0KCkuCisKKyAgICAgV2hlbiB3cml0aW5nLCBnemRpcmVjdCgpIHJldHVybnMgdHJ1ZSAoMSkgaWYgdHJhbnNwYXJlbnQgd3JpdGluZyB3YXMKKyAgIHJlcXVlc3RlZCAoIndUIiBmb3IgdGhlIGd6b3BlbigpIG1vZGUpLCBvciBmYWxzZSAoMCkgb3RoZXJ3aXNlLiAgKE5vdGU6CisgICBnemRpcmVjdCgpIGlzIG5vdCBuZWVkZWQgd2hlbiB3cml0aW5nLiAgVHJhbnNwYXJlbnQgd3JpdGluZyBtdXN0IGJlCisgICBleHBsaWNpdGx5IHJlcXVlc3RlZCwgc28gdGhlIGFwcGxpY2F0aW9uIGFscmVhZHkga25vd3MgdGhlIGFuc3dlci4gIFdoZW4KKyAgIGxpbmtpbmcgc3RhdGljYWxseSwgdXNpbmcgZ3pkaXJlY3QoKSB3aWxsIGluY2x1ZGUgYWxsIG9mIHRoZSB6bGliIGNvZGUgZm9yCisgICBnemlwIGZpbGUgcmVhZGluZyBhbmQgZGVjb21wcmVzc2lvbiwgd2hpY2ggbWF5IG5vdCBiZSBkZXNpcmVkLikKICovCiAKIFpFWFRFUk4gaW50IFpFWFBPUlQgICAgZ3pjbG9zZSBPRigoZ3pGaWxlIGZpbGUpKTsKIC8qCi0gICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKLSAgIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgotICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gZ3plcnJvciBiZWxvdykuCisgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUgYW5kCisgICBkZWFsbG9jYXRlcyB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLiAgTm90ZSB0aGF0IG9uY2UgZmlsZSBpcyBjbG9zZWQsIHlvdQorICAgY2Fubm90IGNhbGwgZ3plcnJvciB3aXRoIGZpbGUsIHNpbmNlIGl0cyBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiBkZWFsbG9jYXRlZC4KKyAgIGd6Y2xvc2UgbXVzdCBub3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGZpbGUsIGp1c3QgYXMgZnJlZQorICAgbXVzdCBub3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGFsbG9jYXRpb24uCisKKyAgICAgZ3pjbG9zZSB3aWxsIHJldHVybiBaX1NUUkVBTV9FUlJPUiBpZiBmaWxlIGlzIG5vdCB2YWxpZCwgWl9FUlJOTyBvbiBhCisgICBmaWxlIG9wZXJhdGlvbiBlcnJvciwgWl9NRU1fRVJST1IgaWYgb3V0IG9mIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlCisgICBsYXN0IHJlYWQgZW5kZWQgaW4gdGhlIG1pZGRsZSBvZiBhIGd6aXAgc3RyZWFtLCBvciBaX09LIG9uIHN1Y2Nlc3MuCisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGd6Y2xvc2VfciBPRigoZ3pGaWxlIGZpbGUpKTsKK1pFWFRFUk4gaW50IFpFWFBPUlQgZ3pjbG9zZV93IE9GKChnekZpbGUgZmlsZSkpOworLyoKKyAgICAgU2FtZSBhcyBnemNsb3NlKCksIGJ1dCBnemNsb3NlX3IoKSBpcyBvbmx5IGZvciB1c2Ugd2hlbiByZWFkaW5nLCBhbmQKKyAgIGd6Y2xvc2VfdygpIGlzIG9ubHkgZm9yIHVzZSB3aGVuIHdyaXRpbmcgb3IgYXBwZW5kaW5nLiAgVGhlIGFkdmFudGFnZSB0bworICAgdXNpbmcgdGhlc2UgaW5zdGVhZCBvZiBnemNsb3NlKCkgaXMgdGhhdCB0aGV5IGF2b2lkIGxpbmtpbmcgaW4gemxpYgorICAgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBjb2RlIHRoYXQgaXMgbm90IHVzZWQgd2hlbiBvbmx5IHJlYWRpbmcgb3Igb25seQorICAgd3JpdGluZyByZXNwZWN0aXZlbHkuICBJZiBnemNsb3NlKCkgaXMgdXNlZCwgdGhlbiBib3RoIGNvbXByZXNzaW9uIGFuZAorICAgZGVjb21wcmVzc2lvbiBjb2RlIHdpbGwgYmUgaW5jbHVkZWQgdGhlIGFwcGxpY2F0aW9uIHdoZW4gbGlua2luZyB0byBhIHN0YXRpYworICAgemxpYiBsaWJyYXJ5LgogKi8KIAogWkVYVEVSTiBjb25zdCBjaGFyICogWkVYUE9SVCBnemVycm9yIE9GKChnekZpbGUgZmlsZSwgaW50ICplcnJudW0pKTsKIC8qCi0gICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQotICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgotICAgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksCi0gICBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubwotICAgdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgorICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUgZ2l2ZW4KKyAgIGNvbXByZXNzZWQgZmlsZS4gIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuICBJZiBhbiBlcnJvciBvY2N1cnJlZAorICAgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksIGVycm51bSBpcyBzZXQgdG8KKyAgIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubyB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisKKyAgICAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nLiAgRnV0dXJlIGNhbGxzIHRvCisgICB0aGlzIGZ1bmN0aW9uIG1heSBpbnZhbGlkYXRlIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIHN0cmluZy4gIElmIGZpbGUgaXMKKyAgIGNsb3NlZCwgdGhlbiB0aGUgc3RyaW5nIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgZ3plcnJvciB3aWxsIG5vIGxvbmdlciBiZQorICAgYXZhaWxhYmxlLgorCisgICAgIGd6ZXJyb3IoKSBzaG91bGQgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBlcnJvcnMgZnJvbSBlbmQtb2YtZmlsZSBmb3IgdGhvc2UKKyAgIGZ1bmN0aW9ucyBhYm92ZSB0aGF0IGRvIG5vdCBkaXN0aW5ndWlzaCB0aG9zZSBjYXNlcyBpbiB0aGVpciByZXR1cm4gdmFsdWVzLgogKi8KIAogWkVYVEVSTiB2b2lkIFpFWFBPUlQgZ3pjbGVhcmVyciBPRigoZ3pGaWxlIGZpbGUpKTsKIC8qCi0gICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiBUaGlzIGlzIGFuYWxvZ291cyB0byB0aGUKLSAgIGNsZWFyZXJyKCkgZnVuY3Rpb24gaW4gc3RkaW8uIFRoaXMgaXMgdXNlZnVsIGZvciBjb250aW51aW5nIHRvIHJlYWQgYSBnemlwCisgICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiAgVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlCisgICBjbGVhcmVycigpIGZ1bmN0aW9uIGluIHN0ZGlvLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnRpbnVpbmcgdG8gcmVhZCBhIGd6aXAKICAgIGZpbGUgdGhhdCBpcyBiZWluZyB3cml0dGVuIGNvbmN1cnJlbnRseS4KICovCiAKKyNlbmRpZiAvKiAhWl9TT0xPICovCisKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLwogCiAvKgogICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKLSAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKLSAgIGNvbXByZXNzaW9uIGxpYnJhcnkuCisgICBhbnl3YXkgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGNvbXByZXNzaW9uCisgICBsaWJyYXJ5LgogKi8KIAogWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzIgT0YoKHVMb25nIGFkbGVyLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOwogLyoKICAgICAgVXBkYXRlIGEgcnVubmluZyBBZGxlci0zMiBjaGVja3N1bSB3aXRoIHRoZSBieXRlcyBidWZbMC4ubGVuLTFdIGFuZAotICAgcmV0dXJuIHRoZSB1cGRhdGVkIGNoZWNrc3VtLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgotICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAotICAgbXVjaCBmYXN0ZXIuIFVzYWdlIGV4YW1wbGU6CisgICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCisgICByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCisKKyAgICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAorICAgbXVjaCBmYXN0ZXIuCisKKyAgIFVzYWdlIGV4YW1wbGU6CiAKICAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwogCkBAIC0xMjczLDIxICsxNTg1LDI1IEBACiAgICAgIGlmIChhZGxlciAhPSBvcmlnaW5hbF9hZGxlcikgZXJyb3IoKTsKICovCiAKKy8qCiBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZyBhZGxlcjEsIHVMb25nIGFkbGVyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3QgbGVuMikpOwotLyoKKwogICAgICBDb21iaW5lIHR3byBBZGxlci0zMiBjaGVja3N1bXMgaW50byBvbmUuICBGb3IgdHdvIHNlcXVlbmNlcyBvZiBieXRlcywgc2VxMQogICAgYW5kIHNlcTIgd2l0aCBsZW5ndGhzIGxlbjEgYW5kIGxlbjIsIEFkbGVyLTMyIGNoZWNrc3VtcyB3ZXJlIGNhbGN1bGF0ZWQgZm9yCiAgICBlYWNoLCBhZGxlcjEgYW5kIGFkbGVyMi4gIGFkbGVyMzJfY29tYmluZSgpIHJldHVybnMgdGhlIEFkbGVyLTMyIGNoZWNrc3VtIG9mCi0gICBzZXExIGFuZCBzZXEyIGNvbmNhdGVuYXRlZCwgcmVxdWlyaW5nIG9ubHkgYWRsZXIxLCBhZGxlcjIsIGFuZCBsZW4yLgorICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4gIE5vdGUKKyAgIHRoYXQgdGhlIHpfb2ZmX3QgdHlwZSAobGlrZSBvZmZfdCkgaXMgYSBzaWduZWQgaW50ZWdlci4gIElmIGxlbjIgaXMKKyAgIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGhhcyBubyBtZWFuaW5nIG9yIHV0aWxpdHkuCiAqLwogCiBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzIgICBPRigodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOwogLyoKICAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQotICAgdXBkYXRlZCBDUkMtMzIuIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkIGluaXRpYWwKLSAgIHZhbHVlIGZvciB0aGUgZm9yIHRoZSBjcmMuIFByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nIChvbmUncyBjb21wbGVtZW50KSBpcworICAgdXBkYXRlZCBDUkMtMzIuICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkCisgICBpbml0aWFsIHZhbHVlIGZvciB0aGUgY3JjLiAgUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzCiAgICBwZXJmb3JtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgorCiAgICBVc2FnZSBleGFtcGxlOgogCiAgICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwpAQCAtMTI5OCw5ICsxNjE0LDkgQEAKICAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7CiAqLwogCisvKgogWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nIGNyYzEsIHVMb25nIGNyYzIsIHpfb2ZmX3QgbGVuMikpOwogCi0vKgogICAgICBDb21iaW5lIHR3byBDUkMtMzIgY2hlY2sgdmFsdWVzIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsCiAgICBzZXExIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBDUkMtMzIgY2hlY2sgdmFsdWVzIHdlcmUKICAgIGNhbGN1bGF0ZWQgZm9yIGVhY2gsIGNyYzEgYW5kIGNyYzIuICBjcmMzMl9jb21iaW5lKCkgcmV0dXJucyB0aGUgQ1JDLTMyCkBAIC0xMzI5LDI2ICsxNjQ1LDEyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX3NpemUpKTsKICNkZWZpbmUgZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIFwKLSAgICAgICAgZGVmbGF0ZUluaXRfKChzdHJtKSwgKGxldmVsKSwgICAgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorICAgICAgICBkZWZsYXRlSW5pdF8oKHN0cm0pLCAobGV2ZWwpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKICNkZWZpbmUgaW5mbGF0ZUluaXQoc3RybSkgXAotICAgICAgICBpbmZsYXRlSW5pdF8oKHN0cm0pLCAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisgICAgICAgIGluZmxhdGVJbml0Xygoc3RybSksIFpMSUJfVkVSU0lPTiwgKGludClzaXplb2Yoel9zdHJlYW0pKQogI2RlZmluZSBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSBcCiAgICAgICAgIGRlZmxhdGVJbml0Ml8oKHN0cm0pLChsZXZlbCksKG1ldGhvZCksKHdpbmRvd0JpdHMpLChtZW1MZXZlbCksXAotICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSksICAgICAgICAgICBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCisgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5KSwgWkxJQl9WRVJTSU9OLCAoaW50KXNpemVvZih6X3N0cmVhbSkpCiAjZGVmaW5lIGluZmxhdGVJbml0MihzdHJtLCB3aW5kb3dCaXRzKSBcCi0gICAgICAgIGluZmxhdGVJbml0Ml8oKHN0cm0pLCAod2luZG93Qml0cyksIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyAgICAgICAgaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBcCisgICAgICAgICAgICAgICAgICAgICAgKGludClzaXplb2Yoel9zdHJlYW0pKQogI2RlZmluZSBpbmZsYXRlQmFja0luaXQoc3RybSwgd2luZG93Qml0cywgd2luZG93KSBcCiAgICAgICAgIGluZmxhdGVCYWNrSW5pdF8oKHN0cm0pLCAod2luZG93Qml0cyksICh3aW5kb3cpLCBcCi0gICAgICAgIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKyAgICAgICAgICAgICAgICAgICAgICBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKIAorI2lmbmRlZiBaX1NPTE8KIAotI2lmICFkZWZpbmVkKFpVVElMX0gpICYmICFkZWZpbmVkKE5PX0RVTU1ZX0RFQ0wpCi0gICAgc3RydWN0IGludGVybmFsX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogaGFjayBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisvKiBnemdldGMoKSBtYWNybyBhbmQgaXRzIHN1cHBvcnRpbmcgZnVuY3Rpb24gYW5kIGV4cG9zZWQgZGF0YSBzdHJ1Y3R1cmUuICBOb3RlCisgKiB0aGF0IHRoZSByZWFsIGludGVybmFsIHN0YXRlIGlzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlIGV4cG9zZWQgc3RydWN0dXJlLgorICogVGhpcyBhYmJyZXZpYXRlZCBzdHJ1Y3R1cmUgZXhwb3NlcyBqdXN0IGVub3VnaCBmb3IgdGhlIGd6Z2V0YygpIG1hY3JvLiAgVGhlCisgKiB1c2VyIHNob3VsZCBub3QgbWVzcyB3aXRoIHRoZXNlIGV4cG9zZWQgZWxlbWVudHMsIHNpbmNlIHRoZWlyIG5hbWVzIG9yCisgKiBiZWhhdmlvciBjb3VsZCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwgcGVyaGFwcyBldmVuIGNhcHJpY2lvdXNseS4gIFRoZXkgY2FuCisgKiBvbmx5IGJlIHVzZWQgYnkgdGhlIGd6Z2V0YygpIG1hY3JvLiAgWW91IGhhdmUgYmVlbiB3YXJuZWQuCisgKi8KK3N0cnVjdCBnekZpbGVfcyB7CisgICAgdW5zaWduZWQgaGF2ZTsKKyAgICB1bnNpZ25lZCBjaGFyICpuZXh0OworICAgIHpfb2ZmNjRfdCBwb3M7Cit9OworWkVYVEVSTiBpbnQgWkVYUE9SVCBnemdldGNfIE9GKChnekZpbGUgZmlsZSkpOyAgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2lmZGVmIFpfUFJFRklYX1NFVAorIyAgdW5kZWYgel9nemdldGMKKyMgIGRlZmluZSB6X2d6Z2V0YyhnKSBcCisgICAgICAgICAgKChnKS0+aGF2ZSA/ICgoZyktPmhhdmUtLSwgKGcpLT5wb3MrKywgKigoZyktPm5leHQpKyspIDogZ3pnZXRjKGcpKQorI2Vsc2UKKyMgIGRlZmluZSBnemdldGMoZykgXAorICAgICAgICAgICgoZyktPmhhdmUgPyAoKGcpLT5oYXZlLS0sIChnKS0+cG9zKyssICooKGcpLT5uZXh0KSsrKSA6IGd6Z2V0YyhnKSkKICNlbmRpZgogCisvKiBwcm92aWRlIDY0LWJpdCBvZmZzZXQgZnVuY3Rpb25zIGlmIF9MQVJHRUZJTEU2NF9TT1VSQ0UgZGVmaW5lZCwgYW5kL29yCisgKiBjaGFuZ2UgdGhlIHJlZ3VsYXIgZnVuY3Rpb25zIHRvIDY0IGJpdHMgaWYgX0ZJTEVfT0ZGU0VUX0JJVFMgaXMgNjQgKGlmCisgKiBib3RoIGFyZSB0cnVlLCB0aGUgYXBwbGljYXRpb24gZ2V0cyB0aGUgKjY0IGZ1bmN0aW9ucywgYW5kIHRoZSByZWd1bGFyCisgKiBmdW5jdGlvbnMgYXJlIGNoYW5nZWQgdG8gNjQgYml0cykgLS0gaW4gY2FzZSB0aGVzZSBhcmUgc2V0IG9uIHN5c3RlbXMKKyAqIHdpdGhvdXQgbGFyZ2UgZmlsZSBzdXBwb3J0LCBfTEZTNjRfTEFSR0VGSUxFIG11c3QgYWxzbyBiZSB0cnVlCisgKi8KKyNpZmRlZiBaX0xBUkdFNjQKKyAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7CisgICBaRVhURVJOIHpfb2ZmNjRfdCBaRVhQT1JUIGd6c2VlazY0IE9GKChnekZpbGUsIHpfb2ZmNjRfdCwgaW50KSk7CisgICBaRVhURVJOIHpfb2ZmNjRfdCBaRVhQT1JUIGd6dGVsbDY0IE9GKChnekZpbGUpKTsKKyAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pvZmZzZXQ2NCBPRigoZ3pGaWxlKSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmY2NF90KSk7CisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmNjRfdCkpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChaTElCX0lOVEVSTkFMKSAmJiBkZWZpbmVkKFpfV0FOVDY0KQorIyAgaWZkZWYgWl9QUkVGSVhfU0VUCisjICAgIGRlZmluZSB6X2d6b3BlbiB6X2d6b3BlbjY0CisjICAgIGRlZmluZSB6X2d6c2VlayB6X2d6c2VlazY0CisjICAgIGRlZmluZSB6X2d6dGVsbCB6X2d6dGVsbDY0CisjICAgIGRlZmluZSB6X2d6b2Zmc2V0IHpfZ3pvZmZzZXQ2NAorIyAgICBkZWZpbmUgel9hZGxlcjMyX2NvbWJpbmUgel9hZGxlcjMyX2NvbWJpbmU2NAorIyAgICBkZWZpbmUgel9jcmMzMl9jb21iaW5lIHpfY3JjMzJfY29tYmluZTY0CisjICBlbHNlCisjICAgIGRlZmluZSBnem9wZW4gZ3pvcGVuNjQKKyMgICAgZGVmaW5lIGd6c2VlayBnenNlZWs2NAorIyAgICBkZWZpbmUgZ3p0ZWxsIGd6dGVsbDY0CisjICAgIGRlZmluZSBnem9mZnNldCBnem9mZnNldDY0CisjICAgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmUgYWRsZXIzMl9jb21iaW5lNjQKKyMgICAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgY3JjMzJfY29tYmluZTY0CisjICBlbmRpZgorIyAgaWZuZGVmIFpfTEFSR0U2NAorICAgICBaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbjY0IE9GKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworICAgICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnenNlZWs2NCBPRigoZ3pGaWxlLCB6X29mZl90LCBpbnQpKTsKKyAgICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3p0ZWxsNjQgT0YoKGd6RmlsZSkpOworICAgICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnem9mZnNldDY0IE9GKChnekZpbGUpKTsKKyAgICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyAgICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisjICBlbmRpZgorI2Vsc2UKKyAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuIE9GKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOworICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3pzZWVrIE9GKChnekZpbGUsIHpfb2ZmX3QsIGludCkpOworICAgWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgZ3p0ZWxsIE9GKChnekZpbGUpKTsKKyAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6b2Zmc2V0IE9GKChnekZpbGUpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOworI2VuZGlmCisKKyNlbHNlIC8qIFpfU09MTyAqLworCisgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKworI2VuZGlmIC8qICFaX1NPTE8gKi8KKworLyogaGFjayBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisjaWYgIWRlZmluZWQoWlVUSUxfSCkgJiYgIWRlZmluZWQoTk9fRFVNTVlfREVDTCkKKyAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUge2ludCBkdW1teTt9OworI2VuZGlmCisKKy8qIHVuZG9jdW1lbnRlZCBmdW5jdGlvbnMgKi8KIFpFWFRFUk4gY29uc3QgY2hhciAgICogWkVYUE9SVCB6RXJyb3IgICAgICAgICAgIE9GKChpbnQpKTsKLVpFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlU3luY1BvaW50IE9GKCh6X3N0cmVhbXAgeikpOwotWkVYVEVSTiBjb25zdCB1TG9uZ2YgKiBaRVhQT1JUIGdldF9jcmNfdGFibGUgICAgT0YoKHZvaWQpKTsKK1pFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlU3luY1BvaW50IE9GKCh6X3N0cmVhbXApKTsKK1pFWFRFUk4gY29uc3Qgel9jcmNfdCBGQVIgKiBaRVhQT1JUIGdldF9jcmNfdGFibGUgICAgT0YoKHZvaWQpKTsKK1pFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlVW5kZXJtaW5lIE9GKCh6X3N0cmVhbXAsIGludCkpOworWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGluZmxhdGVSZXNldEtlZXAgT0YoKHpfc3RyZWFtcCkpOworWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUIGRlZmxhdGVSZXNldEtlZXAgT0YoKHpfc3RyZWFtcCkpOworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChaX1NPTE8pCitaRVhURVJOIGd6RmlsZSAgICAgICAgIFpFWFBPUlQgZ3pvcGVuX3cgT0YoKGNvbnN0IHdjaGFyX3QgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGUpKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoU1REQykgfHwgZGVmaW5lZChaX0hBVkVfU1REQVJHX0gpCisjICBpZm5kZWYgWl9TT0xPCitaRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlRWQSBnenZwcmludGYgWl9BUkcoKGd6RmlsZSBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgdmEpKTsKKyMgIGVuZGlmCisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvemxpYi5tYXAgYi9Nb2R1bGVzL3psaWIvemxpYi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjNjY0NwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvemxpYi96bGliLm1hcApAQCAtMCwwICsxLDgzIEBACitaTElCXzEuMi4wIHsKKyAgZ2xvYmFsOgorICAgIGNvbXByZXNzQm91bmQ7CisgICAgZGVmbGF0ZUJvdW5kOworICAgIGluZmxhdGVCYWNrOworICAgIGluZmxhdGVCYWNrRW5kOworICAgIGluZmxhdGVCYWNrSW5pdF87CisgICAgaW5mbGF0ZUNvcHk7CisgIGxvY2FsOgorICAgIGRlZmxhdGVfY29weXJpZ2h0OworICAgIGluZmxhdGVfY29weXJpZ2h0OworICAgIGluZmxhdGVfZmFzdDsKKyAgICBpbmZsYXRlX3RhYmxlOworICAgIHpjYWxsb2M7CisgICAgemNmcmVlOworICAgIHpfZXJybXNnOworICAgIGd6X2Vycm9yOworICAgIGd6X2ludG1heDsKKyAgICBfKjsKK307CisKK1pMSUJfMS4yLjAuMiB7CisgICAgZ3pjbGVhcmVycjsKKyAgICBnenVuZ2V0YzsKKyAgICB6bGliQ29tcGlsZUZsYWdzOworfSBaTElCXzEuMi4wOworCitaTElCXzEuMi4wLjggeworICAgIGRlZmxhdGVQcmltZTsKK30gWkxJQl8xLjIuMC4yOworCitaTElCXzEuMi4yIHsKKyAgICBhZGxlcjMyX2NvbWJpbmU7CisgICAgY3JjMzJfY29tYmluZTsKKyAgICBkZWZsYXRlU2V0SGVhZGVyOworICAgIGluZmxhdGVHZXRIZWFkZXI7Cit9IFpMSUJfMS4yLjAuODsKKworWkxJQl8xLjIuMi4zIHsKKyAgICBkZWZsYXRlVHVuZTsKKyAgICBnemRpcmVjdDsKK30gWkxJQl8xLjIuMjsKKworWkxJQl8xLjIuMi40IHsKKyAgICBpbmZsYXRlUHJpbWU7Cit9IFpMSUJfMS4yLjIuMzsKKworWkxJQl8xLjIuMy4zIHsKKyAgICBhZGxlcjMyX2NvbWJpbmU2NDsKKyAgICBjcmMzMl9jb21iaW5lNjQ7CisgICAgZ3pvcGVuNjQ7CisgICAgZ3pzZWVrNjQ7CisgICAgZ3p0ZWxsNjQ7CisgICAgaW5mbGF0ZVVuZGVybWluZTsKK30gWkxJQl8xLjIuMi40OworCitaTElCXzEuMi4zLjQgeworICAgIGluZmxhdGVSZXNldDI7CisgICAgaW5mbGF0ZU1hcms7Cit9IFpMSUJfMS4yLjMuMzsKKworWkxJQl8xLjIuMy41IHsKKyAgICBnemJ1ZmZlcjsKKyAgICBnem9mZnNldDsKKyAgICBnem9mZnNldDY0OworICAgIGd6Y2xvc2VfcjsKKyAgICBnemNsb3NlX3c7Cit9IFpMSUJfMS4yLjMuNDsKKworWkxJQl8xLjIuNS4xIHsKKyAgICBkZWZsYXRlUGVuZGluZzsKK30gWkxJQl8xLjIuMy41OworCitaTElCXzEuMi41LjIgeworICAgIGRlZmxhdGVSZXNldEtlZXA7CisgICAgZ3pnZXRjXzsKKyAgICBpbmZsYXRlUmVzZXRLZWVwOworfSBaTElCXzEuMi41LjE7CisKK1pMSUJfMS4yLjcuMSB7CisgICAgaW5mbGF0ZUdldERpY3Rpb25hcnk7CisgICAgZ3p2cHJpbnRmOworfSBaTElCXzEuMi41LjI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvemxpYi5wYy5pbiBiL01vZHVsZXMvemxpYi96bGliLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNWFjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL3psaWIvemxpYi5wYy5pbgpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAorc2hhcmVkbGliZGlyPUBzaGFyZWRsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiB6bGliCitEZXNjcmlwdGlvbjogemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5CitWZXJzaW9uOiBAVkVSU0lPTkAKKworUmVxdWlyZXM6CitMaWJzOiAtTCR7bGliZGlyfSAtTCR7c2hhcmVkbGliZGlyfSAtbHoKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWIvenV0aWwuYyBiL01vZHVsZXMvemxpYi96dXRpbC5jCmluZGV4IGQ1NWY1OTQuLjIzZDJlYmUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYi96dXRpbC5jCisrKyBiL01vZHVsZXMvemxpYi96dXRpbC5jCkBAIC0xLDE3ICsxLDIwIEBACiAvKiB6dXRpbC5jIC0tIHRhcmdldCBkZXBlbmRlbnQgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBKZWFuLWxvdXAgR2FpbGx5LgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUsIDIwMTAsIDIwMTEsIDIwMTIgSmVhbi1sb3VwIEdhaWxseS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCiAvKiBAKCMpICRJZCQgKi8KIAogI2luY2x1ZGUgInp1dGlsLmgiCisjaWZuZGVmIFpfU09MTworIyAgaW5jbHVkZSAiZ3pndXRzLmgiCisjZW5kaWYKIAogI2lmbmRlZiBOT19EVU1NWV9ERUNMCiBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgICAgICB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KICNlbmRpZgogCi1jb25zdCBjaGFyICogY29uc3Qgel9lcnJtc2dbMTBdID0geworel9jb25zdCBjaGFyICogY29uc3Qgel9lcnJtc2dbMTBdID0gewogIm5lZWQgZGljdGlvbmFyeSIsICAgICAvKiBaX05FRURfRElDVCAgICAgICAyICAqLwogInN0cmVhbSBlbmQiLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqLwogIiIsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqLwpAQCAtMzQsMjUgKzM3LDI1IEBACiAgICAgdUxvbmcgZmxhZ3M7CiAKICAgICBmbGFncyA9IDA7Ci0gICAgc3dpdGNoIChzaXplb2YodUludCkpIHsKKyAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih1SW50KSkpIHsKICAgICBjYXNlIDI6ICAgICBicmVhazsKICAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxOyAgICAgYnJlYWs7CiAgICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMjsgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDM7CiAgICAgfQotICAgIHN3aXRjaCAoc2l6ZW9mKHVMb25nKSkgeworICAgIHN3aXRjaCAoKGludCkoc2l6ZW9mKHVMb25nKSkpIHsKICAgICBjYXNlIDI6ICAgICBicmVhazsKICAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxIDw8IDI7ICAgICAgICBicmVhazsKICAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyIDw8IDI7ICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzIDw8IDI7CiAgICAgfQotICAgIHN3aXRjaCAoc2l6ZW9mKHZvaWRwZikpIHsKKyAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih2b2lkcGYpKSkgewogICAgIGNhc2UgMjogICAgIGJyZWFrOwogICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgNDsgICAgICAgIGJyZWFrOwogICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgNDsgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgNDsKICAgICB9Ci0gICAgc3dpdGNoIChzaXplb2Yoel9vZmZfdCkpIHsKKyAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih6X29mZl90KSkpIHsKICAgICBjYXNlIDI6ICAgICBicmVhazsKICAgICBjYXNlIDQ6ICAgICBmbGFncyArPSAxIDw8IDY7ICAgICAgICBicmVhazsKICAgICBjYXNlIDg6ICAgICBmbGFncyArPSAyIDw8IDY7ICAgICAgICBicmVhazsKQEAgLTg1LDI3ICs4OCwyNyBAQAogI2lmZGVmIEZBU1RFU1QKICAgICBmbGFncyArPSAxTCA8PCAyMTsKICNlbmRpZgotI2lmZGVmIFNUREMKKyNpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQogIyAgaWZkZWYgTk9fdnNucHJpbnRmCi0gICAgICAgIGZsYWdzICs9IDFMIDw8IDI1OworICAgIGZsYWdzICs9IDFMIDw8IDI1OwogIyAgICBpZmRlZiBIQVNfdnNwcmludGZfdm9pZAotICAgICAgICBmbGFncyArPSAxTCA8PCAyNjsKKyAgICBmbGFncyArPSAxTCA8PCAyNjsKICMgICAgZW5kaWYKICMgIGVsc2UKICMgICAgaWZkZWYgSEFTX3ZzbnByaW50Zl92b2lkCi0gICAgICAgIGZsYWdzICs9IDFMIDw8IDI2OworICAgIGZsYWdzICs9IDFMIDw8IDI2OwogIyAgICBlbmRpZgogIyAgZW5kaWYKICNlbHNlCi0gICAgICAgIGZsYWdzICs9IDFMIDw8IDI0OworICAgIGZsYWdzICs9IDFMIDw8IDI0OwogIyAgaWZkZWYgTk9fc25wcmludGYKLSAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjU7CisgICAgZmxhZ3MgKz0gMUwgPDwgMjU7CiAjICAgIGlmZGVmIEhBU19zcHJpbnRmX3ZvaWQKLSAgICAgICAgZmxhZ3MgKz0gMUwgPDwgMjY7CisgICAgZmxhZ3MgKz0gMUwgPDwgMjY7CiAjICAgIGVuZGlmCiAjICBlbHNlCiAjICAgIGlmZGVmIEhBU19zbnByaW50Zl92b2lkCi0gICAgICAgIGZsYWdzICs9IDFMIDw8IDI2OworICAgIGZsYWdzICs9IDFMIDw8IDI2OwogIyAgICBlbmRpZgogIyAgZW5kaWYKICNlbmRpZgpAQCAtMTE3LDkgKzEyMCw5IEBACiAjICBpZm5kZWYgdmVyYm9zZQogIyAgICBkZWZpbmUgdmVyYm9zZSAwCiAjICBlbmRpZgotaW50IHpfdmVyYm9zZSA9IHZlcmJvc2U7CitpbnQgWkxJQl9JTlRFUk5BTCB6X3ZlcmJvc2UgPSB2ZXJib3NlOwogCi12b2lkIHpfZXJyb3IgKG0pCit2b2lkIFpMSUJfSU5URVJOQUwgel9lcnJvciAobSkKICAgICBjaGFyICptOwogewogICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG0pOwpAQCAtMTQ2LDcgKzE0OSw3IEBACiAKICNpZm5kZWYgSEFWRV9NRU1DUFkKIAotdm9pZCB6bWVtY3B5KGRlc3QsIHNvdXJjZSwgbGVuKQordm9pZCBaTElCX0lOVEVSTkFMIHptZW1jcHkoZGVzdCwgc291cmNlLCBsZW4pCiAgICAgQnl0ZWYqIGRlc3Q7CiAgICAgY29uc3QgQnl0ZWYqIHNvdXJjZTsKICAgICB1SW50ICBsZW47CkBAIC0xNTcsNyArMTYwLDcgQEAKICAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKIH0KIAotaW50IHptZW1jbXAoczEsIHMyLCBsZW4pCitpbnQgWkxJQl9JTlRFUk5BTCB6bWVtY21wKHMxLCBzMiwgbGVuKQogICAgIGNvbnN0IEJ5dGVmKiBzMTsKICAgICBjb25zdCBCeXRlZiogczI7CiAgICAgdUludCAgbGVuOwpAQCAtMTcwLDcgKzE3Myw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgem1lbXplcm8oZGVzdCwgbGVuKQordm9pZCBaTElCX0lOVEVSTkFMIHptZW16ZXJvKGRlc3QsIGxlbikKICAgICBCeXRlZiogZGVzdDsKICAgICB1SW50ICBsZW47CiB7CkBAIC0xODEsNiArMTg0LDcgQEAKIH0KICNlbmRpZgogCisjaWZuZGVmIFpfU09MTwogCiAjaWZkZWYgU1lTMTZCSVQKIApAQCAtMjEzLDcgKzIxNyw3IEBACiAgKiBhIHByb3RlY3RlZCBzeXN0ZW0gbGlrZSBPUy8yLiBVc2UgTWljcm9zb2Z0IEMgaW5zdGVhZC4KICAqLwogCi12b2lkcGYgemNhbGxvYyAodm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpCit2b2lkcGYgWkxJQl9JTlRFUk5BTCB6Y2FsbG9jICh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywgdW5zaWduZWQgc2l6ZSkKIHsKICAgICB2b2lkcGYgYnVmID0gb3BhcXVlOyAvKiBqdXN0IHRvIG1ha2Ugc29tZSBjb21waWxlcnMgaGFwcHkgKi8KICAgICB1bGcgYnNpemUgPSAodWxnKWl0ZW1zKnNpemU7CkBAIC0yMzcsNyArMjQxLDcgQEAKICAgICByZXR1cm4gYnVmOwogfQogCi12b2lkICB6Y2ZyZWUgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpCit2b2lkIFpMSUJfSU5URVJOQUwgemNmcmVlICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKQogewogICAgIGludCBuOwogICAgIGlmICgqKHVzaCopJnB0ciAhPSAwKSB7IC8qIG9iamVjdCA8IDY0SyAqLwpAQCAtMjcyLDEzICsyNzYsMTMgQEAKICMgIGRlZmluZSBfaGZyZWUgICBoZnJlZQogI2VuZGlmCiAKLXZvaWRwZiB6Y2FsbG9jICh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywgdW5zaWduZWQgc2l6ZSkKK3ZvaWRwZiBaTElCX0lOVEVSTkFMIHpjYWxsb2MgKHZvaWRwZiBvcGFxdWUsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSkKIHsKICAgICBpZiAob3BhcXVlKSBvcGFxdWUgPSAwOyAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCiAgICAgcmV0dXJuIF9oYWxsb2MoKGxvbmcpaXRlbXMsIHNpemUpOwogfQogCi12b2lkICB6Y2ZyZWUgKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpCit2b2lkIFpMSUJfSU5URVJOQUwgemNmcmVlICh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKQogewogICAgIGlmIChvcGFxdWUpIG9wYXF1ZSA9IDA7IC8qIHRvIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KICAgICBfaGZyZWUocHRyKTsKQEAgLTI5Nyw3ICszMDEsNyBAQAogZXh0ZXJuIHZvaWQgICBmcmVlICAgT0YoKHZvaWRwZiBwdHIpKTsKICNlbmRpZgogCi12b2lkcGYgemNhbGxvYyAob3BhcXVlLCBpdGVtcywgc2l6ZSkKK3ZvaWRwZiBaTElCX0lOVEVSTkFMIHpjYWxsb2MgKG9wYXF1ZSwgaXRlbXMsIHNpemUpCiAgICAgdm9pZHBmIG9wYXF1ZTsKICAgICB1bnNpZ25lZCBpdGVtczsKICAgICB1bnNpZ25lZCBzaXplOwpAQCAtMzA3LDcgKzMxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZHBmKWNhbGxvYyhpdGVtcywgc2l6ZSk7CiB9CiAKLXZvaWQgIHpjZnJlZSAob3BhcXVlLCBwdHIpCit2b2lkIFpMSUJfSU5URVJOQUwgemNmcmVlIChvcGFxdWUsIHB0cikKICAgICB2b2lkcGYgb3BhcXVlOwogICAgIHZvaWRwZiBwdHI7CiB7CkBAIC0zMTYsMyArMzIwLDUgQEAKIH0KIAogI2VuZGlmIC8qIE1ZX1pDQUxMT0MgKi8KKworI2VuZGlmIC8qICFaX1NPTE8gKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYi96dXRpbC5oIGIvTW9kdWxlcy96bGliL3p1dGlsLmgKaW5kZXggYjdkNWVmZi4uMjRhYjA2YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGliL3p1dGlsLmgKKysrIGIvTW9kdWxlcy96bGliL3p1dGlsLmgKQEAgLTEsNSArMSw1IEBACiAvKiB6dXRpbC5oIC0tIGludGVybmFsIGludGVyZmFjZSBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKi8KIApAQCAtMTMsMzAgKzEzLDI0IEBACiAjaWZuZGVmIFpVVElMX0gKICNkZWZpbmUgWlVUSUxfSAogCi0jZGVmaW5lIFpMSUJfSU5URVJOQUwKKyNpZmRlZiBIQVZFX0hJRERFTgorIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKKyNlbHNlCisjICBkZWZpbmUgWkxJQl9JTlRFUk5BTAorI2VuZGlmCisKICNpbmNsdWRlICJ6bGliLmgiCiAKLSNpZmRlZiBTVERDCi0jICBpZm5kZWYgX1dJTjMyX1dDRQorI2lmIGRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoWl9TT0xPKQorIyAgaWYgIShkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIGRlZmluZWQoX01TQ19WRVIpKQogIyAgICBpbmNsdWRlIDxzdGRkZWYuaD4KICMgIGVuZGlmCiAjICBpbmNsdWRlIDxzdHJpbmcuaD4KICMgIGluY2x1ZGUgPHN0ZGxpYi5oPgogI2VuZGlmCi0jaWZkZWYgTk9fRVJSTk9fSAotIyAgIGlmZGVmIF9XSU4zMl9XQ0UKLSAgICAgIC8qIFRoZSBNaWNyb3NvZnQgQyBSdW4tVGltZSBMaWJyYXJ5IGZvciBXaW5kb3dzIENFIGRvZXNuJ3QgaGF2ZQotICAgICAgICogZXJybm8uICBXZSBkZWZpbmUgaXQgYXMgYSBnbG9iYWwgdmFyaWFibGUgdG8gc2ltcGxpZnkgcG9ydGluZy4KLSAgICAgICAqIEl0cyB2YWx1ZSBpcyBhbHdheXMgMCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgV2UgcmVuYW1lIGl0IHRvCi0gICAgICAgKiBhdm9pZCBjb25mbGljdCB3aXRoIG90aGVyIGxpYnJhcmllcyB0aGF0IHVzZSB0aGUgc2FtZSB3b3JrYXJvdW5kLgotICAgICAgICovCi0jICAgICBkZWZpbmUgZXJybm8gel9lcnJubwotIyAgIGVuZGlmCi0gICAgZXh0ZXJuIGludCBlcnJubzsKLSNlbHNlCi0jICBpZm5kZWYgX1dJTjMyX1dDRQotIyAgICBpbmNsdWRlIDxlcnJuby5oPgotIyAgZW5kaWYKKworI2lmZGVmIFpfU09MTworICAgdHlwZWRlZiBsb25nIHB0cmRpZmZfdDsgIC8qIGd1ZXNzIC0tIHdpbGwgYmUgY2F1Z2h0IGlmIGd1ZXNzIGlzIHdyb25nICovCiAjZW5kaWYKIAogI2lmbmRlZiBsb2NhbApAQCAtNTAsMTMgKzQ0LDEzIEBACiB0eXBlZGVmIHVzaCBGQVIgdXNoZjsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOwogCi1leHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IHpfZXJybXNnWzEwXTsgLyogaW5kZXhlZCBieSAyLXpsaWJfZXJyb3IgKi8KK2V4dGVybiB6X2NvbnN0IGNoYXIgKiBjb25zdCB6X2Vycm1zZ1sxMF07IC8qIGluZGV4ZWQgYnkgMi16bGliX2Vycm9yICovCiAvKiAoc2l6ZSBnaXZlbiB0byBhdm9pZCBzaWxseSB3YXJuaW5ncyB3aXRoIFZpc3VhbCBDKyspICovCiAKICNkZWZpbmUgRVJSX01TRyhlcnIpIHpfZXJybXNnW1pfTkVFRF9ESUNULShlcnIpXQogCiAjZGVmaW5lIEVSUl9SRVRVUk4oc3RybSxlcnIpIFwKLSAgcmV0dXJuIChzdHJtLT5tc2cgPSAoY2hhciopRVJSX01TRyhlcnIpLCAoZXJyKSkKKyAgcmV0dXJuIChzdHJtLT5tc2cgPSBFUlJfTVNHKGVyciksIChlcnIpKQogLyogVG8gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHN0YXRlIGlzIGtub3duIHRvIGJlIHZhbGlkICovCiAKICAgICAgICAgLyogY29tbW9uIGNvbnN0YW50cyAqLwpAQCAtODgsMTYgKzgyLDE4IEBACiAKICNpZiBkZWZpbmVkKE1TRE9TKSB8fCAoZGVmaW5lZChXSU5ET1dTKSAmJiAhZGVmaW5lZChXSU4zMikpCiAjICBkZWZpbmUgT1NfQ09ERSAgMHgwMAotIyAgaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLSMgICAgaWYoX19TVERDX18gPT0gMSkgJiYgKGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKSkKLSAgICAgICAvKiBBbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkICovCi0gICAgICAgdm9pZCBfQ2RlY2wgZmFyZnJlZSggdm9pZCAqYmxvY2sgKTsKLSAgICAgICB2b2lkICpfQ2RlY2wgZmFybWFsbG9jKCB1bnNpZ25lZCBsb25nIG5ieXRlcyApOwotIyAgICBlbHNlCi0jICAgICAgaW5jbHVkZSA8YWxsb2MuaD4KKyMgIGlmbmRlZiBaX1NPTE8KKyMgICAgaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKKyMgICAgICBpZiAoX19TVERDX18gPT0gMSkgJiYgKGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKSkKKyAgICAgICAgIC8qIEFsbG93IGNvbXBpbGF0aW9uIHdpdGggQU5TSSBrZXl3b3JkcyBvbmx5IGVuYWJsZWQgKi8KKyAgICAgICAgIHZvaWQgX0NkZWNsIGZhcmZyZWUoIHZvaWQgKmJsb2NrICk7CisgICAgICAgICB2b2lkICpfQ2RlY2wgZmFybWFsbG9jKCB1bnNpZ25lZCBsb25nIG5ieXRlcyApOworIyAgICAgIGVsc2UKKyMgICAgICAgIGluY2x1ZGUgPGFsbG9jLmg+CisjICAgICAgZW5kaWYKKyMgICAgZWxzZSAvKiBNU0Mgb3IgREpHUFAgKi8KKyMgICAgICBpbmNsdWRlIDxtYWxsb2MuaD4KICMgICAgZW5kaWYKLSMgIGVsc2UgLyogTVNDIG9yIERKR1BQICovCi0jICAgIGluY2x1ZGUgPG1hbGxvYy5oPgogIyAgZW5kaWYKICNlbmRpZgogCkBAIC0xMTcsMTggKzExMywyMCBAQAogCiAjaWZkZWYgT1MyCiAjICBkZWZpbmUgT1NfQ09ERSAgMHgwNgotIyAgaWZkZWYgTV9JODYKLSAgICAgI2luY2x1ZGUgPG1hbGxvYy5oPgorIyAgaWYgZGVmaW5lZChNX0k4NikgJiYgIWRlZmluZWQoWl9TT0xPKQorIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4KICMgIGVuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoTUFDT1MpIHx8IGRlZmluZWQoVEFSR0VUX09TX01BQykKICMgIGRlZmluZSBPU19DT0RFICAweDA3Ci0jICBpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIF9fZGVzdF9vcyAhPSBfX2JlX29zICYmIF9fZGVzdF9vcyAhPSBfX3dpbjMyX29zCi0jICAgIGluY2x1ZGUgPHVuaXguaD4gLyogZm9yIGZkb3BlbiAqLwotIyAgZWxzZQotIyAgICBpZm5kZWYgZmRvcGVuCi0jICAgICAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCisjICBpZm5kZWYgWl9TT0xPCisjICAgIGlmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19kZXN0X29zICE9IF9fYmVfb3MgJiYgX19kZXN0X29zICE9IF9fd2luMzJfb3MKKyMgICAgICBpbmNsdWRlIDx1bml4Lmg+IC8qIGZvciBmZG9wZW4gKi8KKyMgICAgZWxzZQorIyAgICAgIGlmbmRlZiBmZG9wZW4KKyMgICAgICAgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLworIyAgICAgIGVuZGlmCiAjICAgIGVuZGlmCiAjICBlbmRpZgogI2VuZGlmCkBAIC0xNTEsNyArMTQ5LDcgQEAKICMgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLwogI2VuZGlmCiAKLSNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gNjAwKSkKKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gNjAwKSkgJiYgIWRlZmluZWQgX19JTlRFUklYCiAjICBpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCiAjICAgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLwogIyAgICBpZm5kZWYgX1BUUkRJRkZfVF9ERUZJTkVECkBAIC0xNjMsNiArMTYxLDE5IEBACiAjICBlbmRpZgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgIWRlZmluZWQoTVNET1MpCisgICNwcmFnbWEgd2FybiAtODAwNAorICAjcHJhZ21hIHdhcm4gLTgwMDgKKyAgI3ByYWdtYSB3YXJuIC04MDY2CisjZW5kaWYKKworLyogcHJvdmlkZSBwcm90b3R5cGVzIGZvciB0aGVzZSB3aGVuIGJ1aWxkaW5nIHpsaWIgd2l0aG91dCBMRlMgKi8KKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmIFwKKyAgICAoIWRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgfHwgX0xGUzY0X0xBUkdFRklMRS0wID09IDApCisgICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZTY0IE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKKyNlbmRpZgorCiAgICAgICAgIC8qIGNvbW1vbiBkZWZhdWx0cyAqLwogCiAjaWZuZGVmIE9TX0NPREUKQEAgLTE3NSw0MCArMTg2LDcgQEAKIAogICAgICAgICAgLyogZnVuY3Rpb25zICovCiAKLSNpZiBkZWZpbmVkKFNUREM5OSkgfHwgKGRlZmluZWQoX19UVVJCT0NfXykgJiYgX19UVVJCT0NfXyA+PSAweDU1MCkKLSMgIGlmbmRlZiBIQVZFX1ZTTlBSSU5URgotIyAgICBkZWZpbmUgSEFWRV9WU05QUklOVEYKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jICBpZm5kZWYgSEFWRV9WU05QUklOVEYKLSMgICAgZGVmaW5lIEhBVkVfVlNOUFJJTlRGCi0jICBlbmRpZgotI2VuZGlmCi0jaWZuZGVmIEhBVkVfVlNOUFJJTlRGCi0jICBpZmRlZiBNU0RPUwotICAgICAvKiB2c25wcmludGYgbWF5IGV4aXN0IG9uIHNvbWUgTVMtRE9TIGNvbXBpbGVycyAoREpHUFA/KSwKLSAgICAgICAgYnV0IGZvciBub3cgd2UganVzdCBhc3N1bWUgaXQgZG9lc24ndC4gKi8KLSMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgotIyAgZW5kaWYKLSMgIGlmZGVmIF9fVFVSQk9DX18KLSMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgotIyAgZW5kaWYKLSMgIGlmZGVmIFdJTjMyCi0gICAgIC8qIEluIFdpbjMyLCB2c25wcmludGYgaXMgYXZhaWxhYmxlIGFzIHRoZSAibm9uLUFOU0kiIF92c25wcmludGYuICovCi0jICAgIGlmICFkZWZpbmVkKHZzbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQotIyAgICAgIGRlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSMgIGlmZGVmIF9fU0FTQwotIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jICBlbmRpZgotI2VuZGlmCi0jaWZkZWYgVk1TCi0jICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQocHlyKQorI2lmIGRlZmluZWQocHlyKSB8fCBkZWZpbmVkKFpfU09MTykKICMgIGRlZmluZSBOT19NRU1DUFkKICNlbmRpZgogI2lmIGRlZmluZWQoU01BTExfTUVESVVNKSAmJiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19TQ19fKQpAQCAtMjMyLDE2ICsyMTAsMTYgQEAKICMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgbWVtc2V0KGRlc3QsIDAsIGxlbikKICMgIGVuZGlmCiAjZWxzZQotICAgZXh0ZXJuIHZvaWQgem1lbWNweSAgT0YoKEJ5dGVmKiBkZXN0LCBjb25zdCBCeXRlZiogc291cmNlLCB1SW50IGxlbikpOwotICAgZXh0ZXJuIGludCAgem1lbWNtcCAgT0YoKGNvbnN0IEJ5dGVmKiBzMSwgY29uc3QgQnl0ZWYqIHMyLCB1SW50IGxlbikpOwotICAgZXh0ZXJuIHZvaWQgem1lbXplcm8gT0YoKEJ5dGVmKiBkZXN0LCB1SW50IGxlbikpOworICAgdm9pZCBaTElCX0lOVEVSTkFMIHptZW1jcHkgT0YoKEJ5dGVmKiBkZXN0LCBjb25zdCBCeXRlZiogc291cmNlLCB1SW50IGxlbikpOworICAgaW50IFpMSUJfSU5URVJOQUwgem1lbWNtcCBPRigoY29uc3QgQnl0ZWYqIHMxLCBjb25zdCBCeXRlZiogczIsIHVJbnQgbGVuKSk7CisgICB2b2lkIFpMSUJfSU5URVJOQUwgem1lbXplcm8gT0YoKEJ5dGVmKiBkZXN0LCB1SW50IGxlbikpOwogI2VuZGlmCiAKIC8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCiAjaWZkZWYgREVCVUcKICMgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0gICBleHRlcm4gaW50IHpfdmVyYm9zZTsKLSAgIGV4dGVybiB2b2lkIHpfZXJyb3IgICAgT0YoKGNoYXIgKm0pKTsKKyAgIGV4dGVybiBpbnQgWkxJQl9JTlRFUk5BTCB6X3ZlcmJvc2U7CisgICBleHRlcm4gdm9pZCBaTElCX0lOVEVSTkFMIHpfZXJyb3IgT0YoKGNoYXIgKm0pKTsKICMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpIHtpZighKGNvbmQpKSB6X2Vycm9yKG1zZyk7fQogIyAgZGVmaW5lIFRyYWNlKHgpIHtpZiAoel92ZXJib3NlPj0wKSBmcHJpbnRmIHggO30KICMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh6X3ZlcmJvc2U+MCkgZnByaW50ZiB4IDt9CkBAIC0yNTcsMTMgKzIzNSwxOSBAQAogIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQogI2VuZGlmCiAKLQotdm9pZHBmIHpjYWxsb2MgT0YoKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKSk7Ci12b2lkICAgemNmcmVlICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikpOworI2lmbmRlZiBaX1NPTE8KKyAgIHZvaWRwZiBaTElCX0lOVEVSTkFMIHpjYWxsb2MgT0YoKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2l6ZSkpOworICAgdm9pZCBaTElCX0lOVEVSTkFMIHpjZnJlZSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpKTsKKyNlbmRpZgogCiAjZGVmaW5lIFpBTExPQyhzdHJtLCBpdGVtcywgc2l6ZSkgXAogICAgICAgICAgICAoKigoc3RybSktPnphbGxvYykpKChzdHJtKS0+b3BhcXVlLCAoaXRlbXMpLCAoc2l6ZSkpCiAjZGVmaW5lIFpGUkVFKHN0cm0sIGFkZHIpICAoKigoc3RybSktPnpmcmVlKSkoKHN0cm0pLT5vcGFxdWUsICh2b2lkcGYpKGFkZHIpKQogI2RlZmluZSBUUllfRlJFRShzLCBwKSB7aWYgKHApIFpGUkVFKHMsIHApO30KIAorLyogUmV2ZXJzZSB0aGUgYnl0ZXMgaW4gYSAzMi1iaXQgdmFsdWUgKi8KKyNkZWZpbmUgWlNXQVAzMihxKSAoKCgocSkgPj4gMjQpICYgMHhmZikgKyAoKChxKSA+PiA4KSAmIDB4ZmYwMCkgKyBcCisgICAgICAgICAgICAgICAgICAgICgoKHEpICYgMHhmZjAwKSA8PCA4KSArICgoKHEpICYgMHhmZikgPDwgMjQpKQorCiAjZW5kaWYgLyogWlVUSUxfSCAqLwo=