ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggNmZkNzc1Yy4uMTY5N2MxZSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTMgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODA2MDEgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODA2MTQgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDYwMTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBOZXcgcmVzb3VyY2UgY29tcGlsZXIuCi0JLSBUb29sYmFyIGNvbnRyb2wuCi0JLSBQYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIENyZWF0ZURJQlNlY3Rpb24uCitXSEFUJ1MgTkVXIHdpdGggV2luZS05ODA2MTQ6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gTWFueSBkcmF3aW5nIGZpeGVzLgorCS0gSW50ZXItRExMIGNhbGxzIHNub29waW5nLgogCS0gTG90cyBvZiBidWcgZml4ZXMuCiAKIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KQEAgLTE3LDEwICsxNiwxMCBAQAogdGhlIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGF0IHRoZSBmdHAgc2l0ZXMuICBUaGUgc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZQogZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKIAotICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA2MDEudGFyLmd6Ci0gIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNjAxLnRhci5negotICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC9zdW5zaXRlL0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA2MDEudGFyLmd6Ci0gIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA2MDEudGFyLmd6CisgIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDYxNC50YXIuZ3oKKyAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA2MTQudGFyLmd6CisgIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3N1bnNpdGUvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDYxNC50YXIuZ3oKKyAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDYxNC50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9CVUdTIGIvQlVHUwppbmRleCA3Y2EyMDBjLi44ZTI2YjA0IDEwMDY0NAotLS0gYS9CVUdTCisrKyBiL0JVR1MKQEAgLTUsMjYgKzUsMjcgQEAKIGFkZCBuZXcgZW50cmllcyBhbmQsIG1vcmUgaW1wb3J0YW50bHksIHJlbW92ZSB0aG9zZSBmb3IgdGhlIAogYnVncyB5b3UgZml4ZWQgOy0pCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFzIG9mIERlYyAxOTk3IC0KK0FzIG9mIEp1biAxOTk4IC0KIAogR2VuZXJhbDoKIAogICogVHJ1ZVR5cGUsIC5GT04gcmFzdGVyaXplci4KIAotICogTm8gdGhyZWFkL3Byb2Nlc3Mgc2NoZWR1bGluZyBzdXBwb3J0IGluIFdpbjMyIGNvZGUuIAorICogSW5jb21wbGV0ZSB0aHJlYWQvcHJvY2VzcyBzY2hlZHVsaW5nIHN1cHBvcnQgaW4gV2luMzIgY29kZS4KIAotICogVmVyeSBhbHBoYSBwcmludGluZyBjb2RlLiBbam9obkBkaXZpc2lvbi5jby51a10KKyAqIFZlcnkgYWxwaGEgcHJpbnRpbmcgY29kZSB1c2luZyB3aW4xNiBkcml2ZXJzLgorICAgV2Ugc2hvdWxkIGFkZCBhIFdJTkUgaW50ZXJuYWwgUG9zdFNjcmlwdCBkcml2ZXIgKGFsbCBvdGhlciBwcmludGVycworICAgY2FuIGJlIHN1cHBvcnRlZCB1c2luZyBnaG9zdHNjcmlwdCBmaWx0ZXJzKS4KIAogICogRXh0cmVtZWx5IGFscGhhIFdpbjk1IGludGVyZmFjZSBjb2RlLgogCiAgKiBObyBPTEUyIGFuZCBPTEUzMiBzdXBwb3J0IChpbmNsdWRpbmcgT0xFMiBpbnRlcmZhY2VzIGV0Yy4pLgogCi0gKiBObyBNUyBWaWRlbyBzdXBwb3J0IChwZXJoYXBzIGludGVyZmFjZSB3aXRoIHhhbmltLCBkb24ndCBob2xkCi0gICB5b3VyIGJyZWF0aCBmb3IgdGhpcyBvbmUpLgorICogTm8gTVMgVmlkZW8gc3VwcG9ydC4gW2p1c3Qgc3RhcnRlZCwgbWFyY3VzQGpldC5mcmFua2VuLmRlXQogCi0gKiBDT01ETEczMiBzdXBwb3J0IG5vdCBjb21wbGV0ZSB5ZXQuCisgKiBDT01ETEczMiBzdXBwb3J0IG5vdCBjb21wbGV0ZSB5ZXQgW2JlcnRob0Bha2hwaGQuYXUuZGs/XQogCi0gKiBObyBDT01NQ1RSTC9DT01DVEwzMiBzdXBwb3J0LgorICogQ09NTUNUUkwvQ09NQ1RMMzIgc3VwcG9ydCBpbiBwcm9ncmVzcyBbZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGVdLgogCiAgKiBObyBtYW51YWwgcGFnZXMgZGVzY3JpYmluZyB0aGUgdmFyaW91cyBXaW5kb3dzIGNhbGxzLgogCS0gWW91IGNhbiBmaW5kIGluZm9ybWF0aW9uIGFib3V0IG1vc3Qgb2YgdGhlIFdpbjMyIEFQSSBjYWxscwpAQCAtMzgsNiArMzksNyBAQAogCiAgKiAxNi1iaXQgRXVkb3JhIDEuNS4yIGdvZXMgaW50byByZWN1cnNpb24gdHJ5aW5nIHRvIGRpc3BsYXkKICAgIGEgaG9yaXpvbnRhbCBzY3JvbGxiYXIgKFNldFNjcm9sbFBvcygpIGFydGlmYWN0KS4KKyAgIFdpbmRvd3M5NSB0ZWxuZXQuZXhlIGFuZCBOVCAzLjUxIHRlbG5ldC5leGUgZXhoaWJpdCB0aGUgc2FtZSBiZWhhdmlvdXIuCiAKICAqIG1JUkMgJ2NvbW1hbmRzJyBtZW51IHN0YXlzIG9uIHRvcCBhbmQgd2lsbCBub3QgcmVmcmVzaC4KIApAQCAtNTMsNyArNTUsNyBAQAogICAgKHByb2JhYmx5IGJlY2F1c2Ugb2YgYnl0ZXMgd2lkdGggc3R1ZmYpLgogCiAgKiBOZXRzY2FwZSBkaXNwbGF5cyBwYXJ0aWFsbHkgZG93bmxvYWRlZCBpbmxpbmUgZ3JhcGhpY3Mgd2l0aAotICAgd3Jvbmcgb2Zmc2V0cy4gCisgICB3cm9uZyBvZmZzZXRzLgogCiAgKiBUZXh0IGFsaWdubWVudCBwcm9ibGVtcyBpbiBXb3JkIGFuZCBXcml0ZSAodmFyaWFibGUgcGl0Y2ggZm9udHMpLgogCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggY2E3NjI3MS4uMmM0Yjk2NSAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDIxMyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU3VuIEp1biAxNSAxMDozMDozNSAxOTk4ICBBbmRyZWFzIE1vaHIgPDEwMC4zMDkzNkBnZXJtYW55Lm5ldD4KKworCSogW2ZpbGVzL2Rvc19mcy5jXSBbZmlsZXMvZmlsZS5jXSBbaWYxNjMyL3dwcm9jcy5zcGVjXQorCSAgW21pc2MvYXNwaS5jXQorCUFkZGVkIHN1cHBvcnQgZm9yIHNjYW5uZXJzIHRoYXQgbmVlZCBBZGFwdGVjJ3MgQVNQSTJET1MuCisKKwkqIFtncmFwaGljcy9lbnYuY10gW21pc2MvcHJpbnRlcmRydi5jXSBbZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jXQorCSAgW2lmMTYzMi9nZGkuc3BlY10gW2luY2x1ZGUvZ2RpLmhdCisJRW5oYW5jZWQgcHJpbnRlciBzdXBwb3J0IChlc3BlY2lhbGx5IFdpbjk1KToKKwlEcnZbR1NdZXRQcmludGVyRGF0YSwgW0dTXWV0RW52aXJvbm1lbnQ7IGFkZGVkIEFib3J0UHJvYyBoYW5kbGluZy4KKworCSogW21pc2MvdGFwaTMyLmNdIFtyZWxheTMyL3RhcGkzMi5zcGVjXQorCUFkZGVkIHNvbWUgc3R1YnMuCisKKwkqIFtjb25maWd1cmUuaW5dIFtncmFwaGljcy9mb250ZW5naW5lLmNdIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwkgIFttaXNjL2NvbW0uY10gW21pc2MvdzMyc2tybmwuY10gW21pc2Mvd2luMzJzMTYuY10KKwlNYWRlIFdpbmUgY29tcGlsZSBvbiBIUC1VWCAoanVzdCBmb3IgZnVuIDspCisKKwkqIFtjb250cm9scy9tZW51LmNdIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwlDb21wbGV0ZSByZXdyaXRlIG9mIEVuYWJsZU1lbnVJdGVtMzIuCisJRnJlZSBBZ2VudCAzMiBzdGlsbCBkb2Vzbid0IHdvcmsgOigKKworCSogW21pc2MvdmVyc2lvbi5jXSBbaWYxNjMyL2tlcm5lbC5zcGVjXSBbaW5jbHVkZS93aW5iYXNlLmhdCisJSW1wbGVtZW50ZWQgR2V0VmVyc2lvbkV4MTYuCisKKwkqIFttaXNjL25ldHdvcmsuY10gW2lmMTYzMi91c2VyLnNwZWNdCisJRml4ZWQgYXJndW1lbnRzIG9mIFdOZXRHZXRQcm9wZXJ0eVRleHQuCisKKwkqIFttaXNjL3ZlcnNpb24uY10gW3JlbGF5MzIvY29tY3RsMzIuc3BlY10gW3JlbGF5MzIvb2xlYXV0MzIuc3BlY10KKwlJbXBsZW1lbnRlZCBDT01DVEwzMl9EbGxHZXRWZXJzaW9uLCBPYUJ1aWxkVmVyc2lvbi4KKworCSogW3dpbjMyL2ZpbGUuY10KKwlGaXhlZCBVTkMgaGFuZGxpbmcgb2YgQ3JlYXRlRmlsZTMyLgorCitTYXQgSnVuIDEzIDIyOjM1OjEyIDE5OTggIERvdWdsYXMgUmlkZ3dheSAgPHJpZGd3YXlAd2luZWhxLmNvbT4KKworCSogW01ha2VmaWxlLmluXSBbTWFrZS5ydWxlcy5pbl0KKwlBZGRlZCBwYXR0ZXJuIGZvciBDVlMgbWVyZ2UgZmlsZXMgdG8gJ21ha2UgY2xlYW4nCisKKwkqIFtvbGUvb2xlY2xpLmNdIFt3aW5kb3dzL3Njcm9sbC5jXSBbd2luZG93cy9ncmFoaWNzLmNdCisJQWRkIHNvbWUgREMgaGFuZGxlIHVubG9ja2luZy4gKFdoZW4gaGRjJ3MgYXJlIGFsd2F5cyB1bmxvY2tlZCwKKwl0aGV5IGNhbiBiZSBtYWRlIG1vdmVhYmxlLikKKworCSogW2RvY3VtZW50YXRpb24vd2luZS50ZXhpbmZvXSAKKwlTdGFydGVkIGEgV2luZSBEZXNpZ24gY2hhcHRlciB3aXRoIGRpc2N1c3Npb24gb2YgCisJZ3JhcGhpY3MgZHJpdmVyIG1vZGVsLgorCitTYXQgSnVuIDEzIDExOjE5OjI1IDE5OTggIERhdmlkIEx1eWVyIDxsdXllckB1Y3MudXdhLmVkdS5hdT4KKworCSogW21pc2MvbWFpbi5jXSBbcmVsYXkzMi9yZWxheTM4Ni5jXQorCUFkZGVkIG5ldyBvcHRpb24gLWRlYnVnbXNnICtyZWxheT0uLi4uIG9yIC1kZWJ1Z21zZyAtcmVsYXk9Li4uCisKK0ZyaSBKdW4gMTIgMjI6NTY6MDkgMTk5OCAgTWFyY3VzIE1laXNzbmVyIDxtYXJjdXNAamV0LmZyYW5rZW4uZGU+CisKKwkqIFtyZWxheTMyL3Nub29wLmNdW3JlbGF5MzIvYnVpbHRpbi5jXVtsb2FkZXIvcGVfaW1hZ2UuY10KKwlBZGRlZCBpbnRlciB3aW4zMiBkbGwgc25vb3BpbmcuIFVzZSAtZGVidWdtc2cgK3Nub29wLgorCU51bWJlciBvZiBhcmd1bWVudHMgYW5kIHN0cmluZyByZWZlcmVuY2VzIGFyZSBhdXRvZGV0ZWN0ZWQuCisJU29tZSBzbWFsbCBidWdmaXhlcyBpbiB0aGUgUEUgbG9hZGVyLgorCisJKiBbbWlzYy9zeXN0ZW0uY10KKwlEaXNhYmxlZCBTeXN0ZW1UaW1lcnMuIFRoZXkgZG8gbm90IHdvcmsgd2l0aCB0aGUgY3VycmVudAorCSVmcyBoYW5kbGluZyBpbiB0aGUgMzItPjE2IHJlbGF5Y29kZS4gKGhlbHBzIGxhYnZpZXcpCisKKwkqIFttc2Rvcy9kcG1pLmNdW21zZG9zL2ludDJmLmNdW2ZpbGVzL2RyaXZlLmNdCisJQWRkZWQgYSBtb25vdG9uIGxpbmVhciBpbmNyZWFzaW5nIG1lbW9yeSBhbGxvY2F0b3IgZm9yIERQTUkgKHJlcXVpcmVkCisJZm9yIExhYlZpZXcsIEhBRkFTLCAuLi4pCisJbXNjZGV4IGhhbmRsaW5nIGluIGVtdWxhdGVkIHJlYWxtb2RlIGludGVycnVwdHMgKGZvciBtY2ljZGEuZHJ2KQorCWFsbG9jYXRlIGxvZ2ljYWwgZHJpdmVzIG9ubHkgb25jZS4gKGhlbHBzIE15c3QpCisKKwkqIFtmaWxlcy9wcm9maWxlLmNdCisJSGFuZGxlIF5aIGFzIHNwYWNlLiBGb3VuZCBvbiBDRFJPTVMgKGhlbHBzIE15c3QgSW5zdGFsbGVyKS4KKworCSogW211bHRpbWVkaWEvbW1pby5jXQorCW1taW8qIHBhcnRpYWxseSB1cGRhdGVkIHRvIHdpbjMyLiBObyBmdW5ueSBhZGRpdGlvbnMuCisKKwkqIFt3aW5kb3dzL2RyaXZlci5jXQorCUFkZGVkIHdpbjMyIGRyaXZlciBoYW5kbGluZyAod2lsbCBiZSB1c2VkIGZvciB3aW4zMiBtdWx0aW1lZGlhLworCW1zdmlkZW8gZHJpdmVycykuCisKKwkqIFt3aW4zMi9kZXZpY2UuY10KKwlBZGRlZCBkZXZpY2UgaGFuZGxpbmcgKEszMk9CSl9ERVZJQ0VfSU9DVEwpLiBJbXBsZW1lbnRlZCAKKwlWVERBUEkuNSAodXNlZCBieSB3aW45NScgV0lOTU0udGltZUdldFRpbWUoKSkKKworRnJpIEp1biAxMiAxODowMToxOCAxOTk4IFJlaW4gS2xhemVzIDxya2xhemVzQGNhc2VtYS5uZXQ+CisKKwkqIFtvbGUvY29tcG9iai5jIHJlbGF5MzIvb2xlMzIuc3BlY10KKwlBZGQgYSBzdHViIGZvciBDb0xvY2tPYmplY3RFeHRlcm5hbDMyLgorCisJKiBbb2JqZWN0cy9jbGlwcGluZy5jXQorCUZpeCBpbiBJbnRlcnNlY3RDbGlwUmVjdCgpLCB3aGVuIHRoZXJlIGlzIG5vIGluaXRpYWwgY2xpcHBpbmcKKwlyZWdpb24uCisKKwkqIFtncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuY10KKwlDb3JyZWN0ZWQgc2V2ZXJhbCAib25lLW9mZiIgZXJyb3JzIGZvciB0aGUgRWxsaXBzZSwgUmVjdGFuZ2xlCisJYW5kIFJvdW5kUmVjdGFuZ2xlIChlc3BlY2lhbGx5IHNtYWxsIG9uZXMpIGRyYXcgcm91dGluZXMuIAorCUFyYyBhbmQgZnJpZW5kcyBzdGlsbCBoYXZlIHRvIGJlIGRvbmUuCisKK0ZyaSBKdW4gMTIgMDY6MjM6MTkgMTk5OCAgTWF0dGhldyBCZWNrZXIgPG1iZWNrZXJAZ2xhc3NjaXR5Lm5ldD4KKworCSogW21pc2MvbnRkbGwuY10KKwlGaXhlZCBzb21lIG9mIHRoZSBwYXJhbWV0ZXIgY291bnRzLgorCisJKiBbbWlzYy9yZWdpc3RyeS5jXQorCUdlbmVyYWwgY2xlYW51cCwgZG9jdW1lbnRhdGlvbi4KKwlTdGFuZGFyZCBrZXlzIGFyZSBhbGxvd2VkIHRvIGJlICdjbG9zZWQnIGFuZCBzdWNjZWVkLgorCisJKiBbbWlzYy9zaGVsbC5jXQorCUNoZWNrIGZvciBjb3JyZWN0IHJldHVybiB2YWx1ZXMgZnJvbSBSZWcqIGZ1bmN0aW9ucy4KKworCSogW3dpbjMyL25ld2Zucy5jXQorCUFkZGVkIHN0dWJzIGZvciBPcGVuRGVza3RvcEEsIFNldFRocmVhZERlc2t0b3AsIGFuZAorCVNldFVzZXJPYmplY3RJbmZvcm1hdGlvbkEuCisKK1R1ZSBKdW4gMTAgMjI6MDA6MTggMTk5OCAgRXJpYyBLb2hsIDxla29obEBhYm8ucmhlaW4temVpdHVuZy5kZT4KKworCSogW3dpbmRvd3Mvc3lzbWV0cmljcy5jXVtpbmNsdWRlL3N5c21ldHJpY3MuaF0KKwlGaXhlZCBzb21lIFdpbjk1IHZhbHVlcy4KKworCSogW3dpbmRvd3Mvbm9uY2xpZW50LmNdW2luY2x1ZGUvd2luZG93cy5oXQorCUZpeGVkIHNvbWUgV2luOTUgZHJhd2luZyBidWdzLgorCUFkZGVkIGV4dGVuZGVkIHdpbmRvdyBzdHlsZSBmbGFncyAoV1NfRVhfeHh4KS4KKworCSogW21pc2MvcHJpbnRkcnYuY11bcmVsYXkzMi93aW5zcG9vbC5zcGVjXQorCUFkZGVkIHN0dWJzIGZvciBEZWxldGVQcmludGVyRHJpdmVyMzJBLCBEZWxldGVNb25pdG9yMzJBCisJYW5kIERlbGV0ZVBvcnQzMkEuCisKKwkqIFt3aW5kb3dzL21kaS5jXVtpbmNsdWRlL3dpbmRvd3MuaF1bcmVsYXkzMi91c2VyMzIuc3BlY10KKwlBZGRlZCBzdHVicyBmb3IgQ2FzY2FkZVdpbmRvd3MgYW5kIFRpbGVXaW5kb3dzLgorCisJKiBbY29udHJvbHMvdG9vbGJhci5jXVtpbmNsdWRlL3Rvb2xiYXIuaF0KKwlGaXhlZCBhIGZldyBidWdzIGFuZCBpbXBsZW1lbnRlZCBuZXcgZmVhdHVyZXMuCisKKwkqIFttaXNjL3NoZWxsb3JkLmNdW3JlbGF5MzIvc2hlbGwzMi5zcGVjXQorCUFkZGVkIHN0dWJzIGZvciBTSEVMTDMyXzYwLCBTSEVMTDMyXzYxIGFuZCBTSEVMTDMyXzE4NC4KKworCSogW2NvbnRyb2xzL2NvbWN0bDMydW5kb2MuY11bcmVsYXkzMi9jb21jdGwzMi5zcGVjXQorCU5ldyBmaWxlIGNvbWN0bDMydW5kb2MuYy4gQ29udGFpbnMgdW5kb2N1bWVudGVkIGZ1bmN0aW9ucworCW9mIENPTUNUTDMyLkRMTC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBuZWVkZWQgdG8gcnVuIEVYUExPUkVSLkVYRQorCUlFWFBMT1JFLkVYRSBhbmQgVEFTS01BTi5FWEUuCisKKwkqIFtjb250cm9scy9zdGF0dXMuY10KKwlBZGRlZCB0ZXh0IGFsaWdubWVudC4KKworVHVlIEp1biAgOCAyMjowMDowMCAxOTk4ICBCZXJ0aG8gU3R1bHRpZW5zIDxiZXJ0aG9AYWtocGhkLmF1LmRrPgorCisJKiBbcHJvZ3JhbXMvKi9NYWtlZmlsZS5pbl0KKwlDaGFuZ2VkIHRoZSBydWxlcyB0byB1c2Ugd3JjIGFzIHJlc291cmNlIGNvbXBpbGVyIGJ1dAorCXBhc3NpbmcgdGhlIHNvdXJjZSB0aHJvdWdoIGdjYyBmaXJzdCBmb3IgbWFjcm8gZXhwYW5zaW9uLgorCisJKiBbcHJvZ3JhbXMvKi8qLnJjXQorCUFkZGVkICNpbmNsdWRlICJ3aW5kb3dzLmgiIGZvciB0aGUgcmVzb3VyY2UgY29tcGlsZXIgaW4gdGhlCisJYXBwcm9wcmlhdGUgZmlsZXMuCisKKwkqIFt0b29scy93cmMvd3JjLltjaF1dIFt0b29scy93cmMvd3JpdGVyZXMuY10KKwlBZGRlZCBjb21tYW5kbGluZSBvcHRpb24gLUEgZm9yIGF1dG9yZWdpc3RlciBjb2RlLgorCUNvcnJlY3RlZCB0aGUgdW5kZXJzY29yZSBwcm9ibGVtIGJ5IGNoZWNraW5nIHRoZSBwcm9wZXIgZGVmaW5lCisJZnJvbSBjb25maWcuaC4KKworU3VuIEp1biAgNyAyMjowOToyOSAxOTk4ICBQYXNjYWwgQ3VvcSA8cGN1b3FAZW5zLWx5b24uZnI+CisKKwkqIFtvbGUvb2xlMm5scy5jXSBbbWVtb3J5L3N0cmluZy5jXQorCUltcHJvdmVkIExDTWFwU3RyaW5nMzJBLCBhbmQgY2hhbmdlZCBDb21wYXJlU3RyaW5nMzJBLAorCWxzdHJjbXAsIGxzdHJjbXBpIHRvIHVzZSBpdC4KKworU2F0IEp1biAgNiAxOTowMDo1MCAxOTk4ICBNYXJ0aW4gU3Ry9m1iZXJnIDxhbXNAbHVkZC5sdXRoLnNlPgorCisJKiBbaW5jbHVkZS93aW5udC5oXQorCUFkZGVkIHR5cGVkZWZzIGZvciBzZWN1cml0eSBhbmQgdG9rZW5zLgorCitTYXQgSnVuICA2IDEyOjI2OjMxIDE5OTggIE1vcnRlbiBXZWxpbmRlciAgPHRlcnJhQGRpa3UuZGs+CisKKwkqIFtvYmplY3RzL3RleHQuY10KKwlVc2UgZGVidWdzdHJfYW4gaW4gRHJhd1RleHQxNi4KKworCSogW2xvYWRlci9yZXNvdXJjZS5jXQorCVVzZSBkZWJ1Z3Jlc193IGluIEZpbmRSZXNvdXJjZUV4MzJXLiAgQXZvaWQgY3Jhc2hpbmcgZHVyaW5nCisJZGVidWcgd2hlbiB3bSBpcyBOVUxMLgorCisJKiBbaWYxNjMyL3JlbGF5LmNdCisJSW4gUkVMQVlfRGVidWdDYWxsVG8xNiwgc2VuZCBvdXRwdXQgdG8gdGhlIHJpZ2h0IHBsYWNlIGFuZAorCWF2b2lkIHNpZGUgZWZmZWN0cyBpbiBtYWNybyBhcmd1bWVudHMuCisKK1dlZCBKdW4gIDMgMjA6NTY6MDMgMTk5OCAgSHV3IEQgTSBEYXZpZXMgPGRhdmllc2hAYWJhY3VzLnBoeXNpY3Mub3guYWMudWs+CisKKwkqIFtjb250cm9scy9zY3JvbGwuY10gW3dpbmRvd3Mvbm9uY2xpZW50LmNdCisJRml4IHNldmVyYWwgb2ZmIGJ5IG9uZSBlcnJvcnMgaW4gc2Nyb2xsYmFyIHBhaW50aW5nLgorCitUdWUgSnVuICAyIDIzOjU4OjU5IDE5OTggIEluc29tbmlhIChTdGVhIEdyZWVuZSkgPGluc29tbmlhQGNvcmUuYmluZ2hhbXRvbi5lZHU+CisKKwkqIFtncmFwaGljcy9kc291bmQuY10KKwlSZXdyb3RlIG1peGVyIGNvZGUgdG8gaGFuZGxlIHBhbm5pbmcgYW5kIHZvbHVtZSBmb3IgMTYtPjE2LCAxNi0+OCwKKwk4LT4xNiwgYW5kIDgtPjggYml0IG1peGVzLiAgQ29uZm9ybXMgdG8gRGlyZWN0WCdzICJsb2dhcml0aG1pYworCWhlYXJpbmcgc2NhbGUiIGFzIHNwZWNpZmllZCBpbiBNJFZDIGRvY3MuICBTdGlsbCBkb2VzIG5vdCBoYW5kbGUKKwltaXhpbmcgb2YgZGlmZmVyZW50IGZyZXF1ZW5jaWVzIChJIGFtIHN0aWxsIHdvcmtpbmcgb24gdGhhdCkuIAorCVRlc3RlZCAxNi0+MTYgZXh0ZW5zaXZlbHkgd2l0aCBTdGFyQ3JhZnQuICBPdGhlciBtaXhpbmcgY29tYmluYXRpb25zCisJdW50ZXN0ZWQgYnV0IHNob3VsZCB3b3JrIGZpbmUuICBTdGlsbCBraW5kIG9mIGEgd29yayBpbiBwcm9ncmVzcywKKwlzbyBiZSB3YXJuZWQuCisKK1R1ZSBKdW4gIDIgMDM6MzE6MzMgMTk5OCAgQWxleGFuZGVyIFYuIEx1a3lhbm92IDxsYXZAbG9uZy55YXIucnU+CisKKwkqIFt0b29scy93cmMvdXRpbHMuY10KKwlkdXBfYmFzZW5hbWU6IGZpeCB0byBzdHJpcCBkaXJlY3RvcnkuCisKK01vbiBKdW4gIDEgMjA6MDA6MDAgMTk5OCAgSnVlcmdlbiBTY2htaWVkIDxqdWVyZ2VuLnNjaG1pZWRAbWV0cm9uZXQuZGU+CisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0gW29iamVjdHMvY3Vyc29yaWNvbi5jXSBbcmVsYXkzMi91c2VyMzIuc3BlY10KKwlBZGRlZCBzdHVicyBMb2FkQ3Vyc29yRnJvbUZpbGVXIGFuZCBMb2FkQ3Vyc29yRnJvbUZpbGVBLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTdW4gTWF5IDMxIDEzOjQwOjEzIDE5OTggIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgogCiAJKiBbaWYxNjMyL3NpZ25hbC5jXQpkaWZmIC0tZ2l0IGEvTWFrZS5ydWxlcy5pbiBiL01ha2UucnVsZXMuaW4KaW5kZXggNWZlZmE1My4uNGZjMWI2YyAxMDA2NDQKLS0tIGEvTWFrZS5ydWxlcy5pbgorKysgYi9NYWtlLnJ1bGVzLmluCkBAIC0xNTUsNyArMTU1LDcgQEAKIAkkKE1BS0VERVApICQoRElWSU5DTCkgLUMkKFNSQ0RJUikgJChDX1NSQ1MpICQoUkNfU1JDUykgJChFWFRSQV9TUkNTKQogCiBjbGVhbjo6Ci0JJChSTSkgKi5vIFwjKlwjICp+IColICouYmFrICoub3JpZyAqLnJlaiAqLmZsYyAqLXRtcC5jIHkudGFiLmMgeS50YWIuaCBsZXgueXkuYyBjb3JlICQoR0VOX0FTTV9TUkNTKSAkKFJDX1NSQ1M6LnJjPS5zKSAkKFJDX1NSQ1M6LnJjPS5oKSAkKFBST0dSQU1TKQorCSQoUk0pICoubyBcIypcIyAqfiAqJSAuIyogKi5iYWsgKi5vcmlnICoucmVqICouZmxjICotdG1wLmMgeS50YWIuYyB5LnRhYi5oIGxleC55eS5jIGNvcmUgJChHRU5fQVNNX1NSQ1MpICQoUkNfU1JDUzoucmM9LnMpICQoUkNfU1JDUzoucmM9LmgpICQoUFJPR1JBTVMpCiAKIGR1bW15OgogCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCmluZGV4IDlmZTFjMzguLmEwNjc0ZmUgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmluCisrKyBiL01ha2VmaWxlLmluCkBAIC0yNCw3ICsyNCw2IEBACiBNT0RVTEUgICAgPSBub25lCiAKIExJQlNVQkRJUlMgPSBcCi0JcmMgXAogCXRvb2xzIFwKIAl0b29scy93cmMgXAogCWNvbnRyb2xzIFwKQEAgLTE2MCw4ICsxNTksOCBAQAogCiBjbGVhbjo6CiAJZm9yIGkgaW4gJChBTExTVUJESVJTKTsgZG8gKGNkICQkaTsgJChNQUtFKSBjbGVhbikgfHwgZXhpdCAxOyBkb25lCi0JZm9yIGkgaW4gaW5jbHVkZTsgZG8gKGNkICQkaTsgJChSTSkgKi5vIFwjKlwjICp+IColICouYmFrICoub3JpZyAqLnJlaiAqLmZsYyk7IGRvbmUKLQkkKFJNKSB3aW5lIHdpbmUuc3ltIGxpYndpbmUuYSBsaWJ3aW5lLnNvLjEuMCBUQUdTCisJZm9yIGkgaW4gaW5jbHVkZTsgZG8gKGNkICQkaTsgJChSTSkgKi5vIFwjKlwjIC4jKiAqfiAqJSAqLmJhayAqLm9yaWcgKi5yZWogKi5mbGMpOyBkb25lCisJJChSTSkgd2luZSB3aW5lLnN5bSBsaWJ3aW5lLmEgbGlid2luZS5zby4xLjAgVEFHUyAuIyoKIAogZGlzdGNsZWFuOiBjbGVhbgogCSQoUk0pIGNvbmZpZy4qIE1ha2UucnVsZXMgaW5jbHVkZS9jb25maWcuaApkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDMzOGI1NDguLjQwOWIzZjUgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTE3LDYgKzE3LDEwIEBACiBhY19oZWxwPSIkYWNfaGVscAogICAtLWVuYWJsZS1kbGwgICAgICAgICAgICBidWlsZCB0aGUgV2luZSBsaWJyYXJ5IGFzIGEgRExMIgogYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1kaXNhYmxlLWRlYnVnICAgICAgICAgY29tcGlsZSBvdXQgYWxsIGRlYnVnZ2luZyBtZXNzYWdlcyIKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZGlzYWJsZS10cmFjZSAgICAgICAgIGNvbXBpbGUgb3V0IFRSQUNFIG1lc3NhZ2VzIgorYWNfaGVscD0iJGFjX2hlbHAKICAgLS13aXRob3V0LXJlZW50cmFudC14ICAgQ29tcGlsZSBmb3IgdXNlIHdpdGggbm9uLXJlZW50cmFudCBYIGxpYnJhcmllcyIKIGFjX2hlbHA9IiRhY19oZWxwCiAgIC0td2l0aC14ICAgICAgICAgICAgICAgIHVzZSB0aGUgWCBXaW5kb3cgU3lzdGVtIgpAQCAtNTU1LDYgKzU1OSw4IEBACiAKIE1BSU5fVEFSR0VUPWVtdQogTElCX1RBUkdFVD1saWJ3aW5lLmEKK1RSQUNFX01TR1M9eWVzCSMgdGhlIFRSQUNFKCkgbWFjcm8KK0RFQlVHX01TR1M9eWVzCSMgdGhlIFRSQUNFKCksIFdBUk4oKSwgYW5kIEZJWE1FKCkgbWFjcm9zLgogCiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZW11bGF0b3Igb3IgLS1kaXNhYmxlLWVtdWxhdG9yIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7ZW5hYmxlX2VtdWxhdG9yK3NldH0iID0gc2V0OyB0aGVuCkBAIC01NzEsNiArNTc3LDIwIEBACiAKIAogCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgb3IgLS1kaXNhYmxlLWRlYnVnIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9kZWJ1ZyIKKyAgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iOyB0aGVuIERFQlVHX01TR1M9Im5vIjsgZmkKK2ZpCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRyYWNlIG9yIC0tZGlzYWJsZS10cmFjZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV90cmFjZStzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfdHJhY2UiCisgIGlmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIjsgdGhlbiBUUkFDRV9NU0dTPSJubyI7IGZpCitmaQorCisKICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcmVlbnRyYW50LXggb3IgLS13aXRob3V0LXJlZW50cmFudC14IHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF9yZWVudHJhbnRfeCtzZXR9IiA9IHNldDsgdGhlbgogICB3aXRodmFsPSIkd2l0aF9yZWVudHJhbnRfeCIKQEAgLTU4Miw5ICs2MDIsMjkgQEAKIAogCiAKK2lmIHRlc3QgIiRERUJVR19NU0dTIiA9ICJubyIKK3RoZW4KKyAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTk9fREVCVUdfTVNHUyAxCitFT0YKKworICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBOT19UUkFDRV9NU0dTIDEKK0VPRgorCitlbHNlCisgICAgaWYgdGVzdCAiJFRSQUNFX01TR1MiID0gIm5vIgorICAgIHRoZW4KKyAgICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5PX1RSQUNFX01TR1MgMQorRU9GCisKKyAgICBmaQorZmkKKwogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1ODg6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorZWNobyAiY29uZmlndXJlOjYyODogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CiBzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTYxMyw3ICs2NTMsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NjU3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjQyLDcgKzY4Miw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2ODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC02OTAsNyArNzMwLDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njk0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorZWNobyAiY29uZmlndXJlOjczNDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKIAogYWNfZXh0PWMKICMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KQEAgLTcwMCwxMSArNzQwLDExIEBACiBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKIAogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzA0ICJjb25maWd1cmUiCisjbGluZSA3NDQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogbWFpbigpe3JldHVybigwKTt9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzQ4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKICAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgogICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KQEAgLTcyNCwxMiArNzY0LDEyIEBACiAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcyODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiY29uZmlndXJlOjc2ODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQogZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2CiBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczMzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQorZWNobyAiY29uZmlndXJlOjc3MzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTczOCw3ICs3NzgsNyBAQAogICB5ZXM7CiAjZW5kaWYKIEVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjc0MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzgyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgYWNfY3ZfcHJvZ19nY2M9eWVzCiBlbHNlCiAgIGFjX2N2X3Byb2dfZ2NjPW5vCkBAIC03NTMsNyArNzkzLDcgQEAKICAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCiAgIENGTEFHUz0KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTc6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitlY2hvICJjb25maWd1cmU6Nzk3OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC03ODEsNyArODIxLDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODU6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo4MjU6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKICMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCiBpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgogICBDUFA9CkBAIC03OTYsMTMgKzgzNiwxMyBAQAogICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAogICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MDAgImNvbmZpZ3VyZSIKKyNsaW5lIDg0MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiBTeW50YXggRXJyb3IKIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODA2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NDY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIDoKQEAgLTgxMywxMyArODUzLDEzIEBACiAgIHJtIC1yZiBjb25mdGVzdCoKICAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MTcgImNvbmZpZ3VyZSIKKyNsaW5lIDg1NyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiBTeW50YXggRXJyb3IKIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODIzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIDoKQEAgLTg0Niw3ICs4ODYsNyBAQAogIyBVc2VzIGFjXyB2YXJzIGFzIHRlbXBzIHRvIGFsbG93IGNvbW1hbmQgbGluZSB0byBvdmVycmlkZSBjYWNoZSBhbmQgY2hlY2tzLgogIyAtLXdpdGhvdXQteCBvdmVycmlkZXMgZXZlcnl0aGluZyBlbHNlLCBidXQgZG9lcyBub3QgdG91Y2ggdGhlIGNhY2hlLgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1MDogY2hlY2tpbmcgZm9yIFgiID4mNQorZWNobyAiY29uZmlndXJlOjg5MDogY2hlY2tpbmcgZm9yIFgiID4mNQogCiAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXggb3IgLS13aXRob3V0LXggd2FzIGdpdmVuLgogaWYgdGVzdCAiJHt3aXRoX3grc2V0fSIgPSBzZXQ7IHRoZW4KQEAgLTkwOCwxMiArOTQ4LDEyIEBACiAKICAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkxMiAiY29uZmlndXJlIgorI2xpbmUgOTUyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkeF9kaXJlY3RfdGVzdF9pbmNsdWRlPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjk1NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtOTgyLDE0ICsxMDIyLDE0IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiAgIExJQlM9Ii1sJHhfZGlyZWN0X3Rlc3RfbGlicmFyeSAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk4NiAiY29uZmlndXJlIgorI2xpbmUgMTAyNiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogJHt4X2RpcmVjdF90ZXN0X2Z1bmN0aW9ufSgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTkzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgTElCUz0iJGFjX3NhdmVfTElCUyIKICMgV2UgY2FuIGxpbmsgWCBwcm9ncmFtcyB3aXRoIG5vIHNwZWNpYWwgbGlicmFyeSBwYXRoLgpAQCAtMTA5NSwxNyArMTEzNSwxNyBAQAogICAgIGNhc2UgImAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAiIGluCiAgICAgIlN1bk9TIDUiKikKICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDk5OiBjaGVja2luZyB3aGV0aGVyIC1SIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSIgPiY1CitlY2hvICJjb25maWd1cmU6MTEzOTogY2hlY2tpbmcgd2hldGhlciAtUiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UiID4mNQogICAgICAgYWNfeHNhdmVfTElCUz0iJExJQlMiOyBMSUJTPSIkTElCUyAtUiR4X2xpYnJhcmllcyIKICAgICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMDIgImNvbmZpZ3VyZSIKKyNsaW5lIDExNDIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTQ5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19SX25vc3BhY2U9eWVzCiBlbHNlCkBAIC0xMTIxLDE0ICsxMTYxLDE0IEBACiAgICAgICBlbHNlCiAJTElCUz0iJGFjX3hzYXZlX0xJQlMgLVIgJHhfbGlicmFyaWVzIgogCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMjUgImNvbmZpZ3VyZSIKKyNsaW5lIDExNjUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19SX3NwYWNlPXllcwogZWxzZQpAQCAtMTE2MCw3ICsxMjAwLDcgQEAKICAgICAjIGxpYnJhcmllcyB3ZXJlIGJ1aWx0IHdpdGggREVDbmV0IHN1cHBvcnQuICBBbmQga2FybEBjcy51bWIuZWR1IHNheXMKICAgICAjIHRoZSBBbHBoYSBuZWVkcyBkbmV0X3N0dWIgKGRuZXQgZG9lcyBub3QgZXhpc3QpLgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTY0OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldCIgPiY1CitlY2hvICJjb25maWd1cmU6MTIwNDogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXQiID4mNQogYWNfbGliX3Zhcj1gZWNobyBkbmV0J18nZG5ldF9udG9hIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xMTY4LDcgKzEyMDgsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxkbmV0ICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExNzIgImNvbmZpZ3VyZSIKKyNsaW5lIDEyMTIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTExNzksNyArMTIxOSw3IEBACiBkbmV0X250b2EoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExODM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTIwMSw3ICsxMjQxLDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjA1OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMjQ1OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gZG5ldF9zdHViJ18nZG5ldF9udG9hIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xMjA5LDcgKzEyNDksNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxkbmV0X3N0dWIgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIxMyAiY29uZmlndXJlIgorI2xpbmUgMTI1MyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTIyMCw3ICsxMjYwLDcgQEAKIGRuZXRfbnRvYSgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIyNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xMjQ5LDEyICsxMjg5LDEyIEBACiAgICAgIyBUaGUgbnNsIGxpYnJhcnkgcHJldmVudHMgcHJvZ3JhbXMgZnJvbSBvcGVuaW5nIHRoZSBYIGRpc3BsYXkKICAgICAjIG9uIElyaXggNS4yLCBhY2NvcmRpbmcgdG8gZGlja2V5QGNsYXJrLm5ldC4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1MzogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUiID4mNQorZWNobyAiY29uZmlndXJlOjEyOTM6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2dldGhvc3RieW5hbWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjU4ICJjb25maWd1cmUiCisjbGluZSAxMjk4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGdldGhvc3RieW5hbWUoKTsgYmVsb3cuICAqLwpAQCAtMTI3Nyw3ICsxMzE3LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jX2dldGhvc3RieW5hbWU9eWVzIgogZWxzZQpAQCAtMTI5OCw3ICsxMzM4LDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMwMjogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorZWNobyAiY29uZmlndXJlOjEzNDI6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTMwNiw3ICsxMzQ2LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sbnNsICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMTAgImNvbmZpZ3VyZSIKKyNsaW5lIDEzNTAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTEzMTcsNyArMTM1Nyw3IEBACiBnZXRob3N0YnluYW1lKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM2MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTEzNDcsMTIgKzEzODcsMTIgQEAKICAgICAjIC1sc29ja2V0IG11c3QgYmUgZ2l2ZW4gYmVmb3JlIC1sbnNsIGlmIGJvdGggYXJlIG5lZWRlZC4KICAgICAjIFdlIGFzc3VtZSB0aGF0IGlmIGNvbm5lY3QgbmVlZHMgLWxuc2wsIHNvIGRvZXMgZ2V0aG9zdGJ5bmFtZS4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY29ubmVjdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM1MTogY2hlY2tpbmcgZm9yIGNvbm5lY3QiID4mNQorZWNobyAiY29uZmlndXJlOjEzOTE6IGNoZWNraW5nIGZvciBjb25uZWN0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2Nvbm5lY3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzU2ICJjb25maWd1cmUiCisjbGluZSAxMzk2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGNvbm5lY3QoKTsgYmVsb3cuICAqLwpAQCAtMTM3NSw3ICsxNDE1LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDE5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jX2Nvbm5lY3Q9eWVzIgogZWxzZQpAQCAtMTM5Niw3ICsxNDM2LDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfY29ubmVjdCA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY29ubmVjdCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQwMDogY2hlY2tpbmcgZm9yIGNvbm5lY3QgaW4gLWxzb2NrZXQiID4mNQorZWNobyAiY29uZmlndXJlOjE0NDA6IGNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nY29ubmVjdCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTQwNCw3ICsxNDQ0LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDA4ICJjb25maWd1cmUiCisjbGluZSAxNDQ4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xNDE1LDcgKzE0NTUsNyBAQAogY29ubmVjdCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xNDM5LDEyICsxNDc5LDEyIEBACiAKICAgICAjIGdvbWV6QG1pLnVuaS1lcmxhbmdlbi5kZSBzYXlzIC1scG9zaXggaXMgbmVjZXNzYXJ5IG9uIEEvVVguCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJlbW92ZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ0MzogY2hlY2tpbmcgZm9yIHJlbW92ZSIgPiY1CitlY2hvICJjb25maWd1cmU6MTQ4MzogY2hlY2tpbmcgZm9yIHJlbW92ZSIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19yZW1vdmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDQ4ICJjb25maWd1cmUiCisjbGluZSAxNDg4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHJlbW92ZSgpOyBiZWxvdy4gICovCkBAIC0xNDY3LDcgKzE1MDcsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfcmVtb3ZlPXllcyIKIGVsc2UKQEAgLTE0ODgsNyArMTUyOCw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3JlbW92ZSA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcmVtb3ZlIGluIC1scG9zaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0OTI6IGNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeCIgPiY1CitlY2hvICJjb25maWd1cmU6MTUzMjogY2hlY2tpbmcgZm9yIHJlbW92ZSBpbiAtbHBvc2l4IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gcG9zaXgnXydyZW1vdmUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE0OTYsNyArMTUzNiw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbHBvc2l4ICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE1MDAgImNvbmZpZ3VyZSIKKyNsaW5lIDE1NDAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTE1MDcsNyArMTU0Nyw3IEBACiByZW1vdmUoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTUxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTUzMSwxMiArMTU3MSwxMiBAQAogCiAgICAgIyBCU0RJIEJTRC9PUyAyLjEgbmVlZHMgLWxpcGMgZm9yIFhPcGVuRGlzcGxheS4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2htYXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MzU6IGNoZWNraW5nIGZvciBzaG1hdCIgPiY1CitlY2hvICJjb25maWd1cmU6MTU3NTogY2hlY2tpbmcgZm9yIHNobWF0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3NobWF0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU0MCAiY29uZmlndXJlIgorI2xpbmUgMTU4MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaG1hdCgpOyBiZWxvdy4gICovCkBAIC0xNTU5LDcgKzE1OTksNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfc2htYXQ9eWVzIgogZWxzZQpAQCAtMTU4MCw3ICsxNjIwLDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2htYXQgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNobWF0IGluIC1saXBjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTg0OiBjaGVja2luZyBmb3Igc2htYXQgaW4gLWxpcGMiID4mNQorZWNobyAiY29uZmlndXJlOjE2MjQ6IGNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYyIgPiY1CiBhY19saWJfdmFyPWBlY2hvIGlwYydfJ3NobWF0IHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNTg4LDcgKzE2MjgsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxpcGMgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU5MiAiY29uZmlndXJlIgorI2xpbmUgMTYzMiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTU5OSw3ICsxNjM5LDcgQEAKIHNobWF0KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjAzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY0MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTE2MzIsNyArMTY3Miw3IEBACiAgICMgbGlicmFyaWVzIHdlIGNoZWNrIGZvciBiZWxvdywgc28gdXNlIGEgZGlmZmVyZW50IHZhcmlhYmxlLgogICAjICAtLWludGVycmFuQHVsdXJ1LlN0YW5mb3JkLkVEVSwga2JAY3MudW1iLmVkdS4KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEljZUNvbm5lY3Rpb25OdW1iZXIgaW4gLWxJQ0UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MzY6IGNoZWNraW5nIGZvciBJY2VDb25uZWN0aW9uTnVtYmVyIGluIC1sSUNFIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNjc2OiBjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRSIgPiY1CiBhY19saWJfdmFyPWBlY2hvIElDRSdfJ0ljZUNvbm5lY3Rpb25OdW1iZXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE2NDAsNyArMTY4MCw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbElDRSAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjQ0ICJjb25maWd1cmUiCisjbGluZSAxNjg0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xNjUxLDcgKzE2OTEsNyBAQAogSWNlQ29ubmVjdGlvbk51bWJlcigpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2OTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xNjgwLDcgKzE3MjAsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY4NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNzI0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfWUFDQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xNzEyLDcgKzE3NTIsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MTc1NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xNzQ1LDcgKzE3ODUsNyBAQAogICAqKSBhY19saWI9bCA7OwogICBlc2FjCiAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ5OiBjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIgPiY1CitlY2hvICJjb25maWd1cmU6MTc4OTogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQogYWNfbGliX3Zhcj1gZWNobyAkYWNfbGliJ18neXl3cmFwIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNzUzLDcgKzE3OTMsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWwkYWNfbGliICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3NTcgImNvbmZpZ3VyZSIKKyNsaW5lIDE3OTcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTE3NjQsNyArMTgwNCw3IEBACiB5eXdyYXAoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3Njg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTc4OSw3ICsxODI5LDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc5MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxODMzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE4MjYsNyArMTg2Niw3IEBACiAjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCiAjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MzA6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQorZWNobyAiY29uZmlndXJlOjE4NzA6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQogaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE4NzYsNyArMTkxNiw3IEBACiB0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODgwOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxOTIwOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMTg5OSw3ICsxOTM5LDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYzJtYW4iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGMybWFuOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MTk0MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0MyTUFOJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE5MjgsNyArMTk2OCw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGkzODZfc2V0X2xkdCBpbiAtbGkzODYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MzI6IGNoZWNraW5nIGZvciBpMzg2X3NldF9sZHQgaW4gLWxpMzg2IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxOTcyOiBjaGVja2luZyBmb3IgaTM4Nl9zZXRfbGR0IGluIC1saTM4NiIgPiY1CiBhY19saWJfdmFyPWBlY2hvIGkzODYnXydpMzg2X3NldF9sZHQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE5MzYsNyArMTk3Niw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbGkzODYgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk0MCAiY29uZmlndXJlIgorI2xpbmUgMTk4MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTk0Nyw3ICsxOTg3LDcgQEAKIGkzODZfc2V0X2xkdCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk1MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xOTc1LDcgKzIwMTUsNyBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlzd2FsbnVtIGluIC1sdyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk3OTogY2hlY2tpbmcgZm9yIGlzd2FsbnVtIGluIC1sdyIgPiY1CitlY2hvICJjb25maWd1cmU6MjAxOTogY2hlY2tpbmcgZm9yIGlzd2FsbnVtIGluIC1sdyIgPiY1CiBhY19saWJfdmFyPWBlY2hvIHcnXydpc3dhbG51bSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTk4Myw3ICsyMDIzLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sdyAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTg3ICJjb25maWd1cmUiCisjbGluZSAyMDI3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xOTk0LDcgKzIwMzQsNyBAQAogaXN3YWxudW0oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5OTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMjAyMiw3ICsyMDYyLDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYRjg2REdBUXVlcnlFeHRlbnNpb24gaW4gLWxYeGY4NmRnYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAyNjogY2hlY2tpbmcgZm9yIFhGODZER0FRdWVyeUV4dGVuc2lvbiBpbiAtbFh4Zjg2ZGdhIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMDY2OiBjaGVja2luZyBmb3IgWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWHhmODZkZ2EiID4mNQogYWNfbGliX3Zhcj1gZWNobyBYeGY4NmRnYSdfJ1hGODZER0FRdWVyeUV4dGVuc2lvbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMjAzMCw3ICsyMDcwLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sWHhmODZkZ2EgJFhfTElCUyAtbFhleHQgLWxYMTEgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDM0ICJjb25maWd1cmUiCisjbGluZSAyMDc0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0yMDQxLDcgKzIwODEsNyBAQAogWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA4NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTIwNjksMTcgKzIxMDksMTcgQEAKIGRvCiBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDczOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitlY2hvICJjb25maWd1cmU6MjExMzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNzggImNvbmZpZ3VyZSIKKyNsaW5lIDIxMTggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCRhY19oZHI+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIwODM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTIxMDcsMTIgKzIxNDcsMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIE9wZW4gU291bmQgU3lzdGVtIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjExMTogY2hlY2tpbmcgImZvciBPcGVuIFNvdW5kIFN5c3RlbSIiID4mNQorZWNobyAiY29uZmlndXJlOjIxNTE6IGNoZWNraW5nICJmb3IgT3BlbiBTb3VuZCBTeXN0ZW0iIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX29wZW5zb3VuZHN5c3RlbScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMTYgImNvbmZpZ3VyZSIKKyNsaW5lIDIxNTYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAJI2lmZGVmIEhBVkVfU1lTX1NPVU5EQ0FSRF9ICkBAIC0yMTMyLDcgKzIxNzIsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEzNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTc2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19vcGVuc291bmRzeXN0ZW09InllcyIKIGVsc2UKQEAgLTIxNTYsMTIgKzIxOTYsMTIgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHVuaW9uIHNlbXVuIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE2MDogY2hlY2tpbmcgImZvciB1bmlvbiBzZW11biIiID4mNQorZWNobyAiY29uZmlndXJlOjIyMDA6IGNoZWNraW5nICJmb3IgdW5pb24gc2VtdW4iIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3VuaW9uX3NlbXVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE2NSAiY29uZmlndXJlIgorI2xpbmUgMjIwNSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NlbS5oPgpAQCAtMjE2OSw3ICsyMjA5LDcgQEAKIHVuaW9uIHNlbXVuIGZvbwogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNzM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIxMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfdW5pb25fc2VtdW49InllcyIKIGVsc2UKQEAgLTIxOTcsNyArMjIzNyw3IEBACiB0aGVuCiAgIENGTEFHUz0iJENGTEFHUyAtV2FsbCIKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMDE6IGNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMjQxOiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTIyMDUsNyArMjI0NSw3IEBACiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ieWVzIgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjA5ICJjb25maWd1cmUiCisjbGluZSAyMjQ5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4odm9pZCkgewpAQCAtMjIxNiw3ICsyMjU2LDcgQEAKICAgZXhpdCggQXJyYXlbMV0gIT0gLTIgKTsKIH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjIwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnPSJubyIKIGVsc2UKQEAgLTIyMzksNyArMjI3OSw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI0MzogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CitlY2hvICJjb25maWd1cmU6MjI4MzogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19leHRlcm5fcHJlZml4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTIyNTEsMTQgKzIyOTEsMTQgQEAKIAkubG9uZyAwCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNTUgImNvbmZpZ3VyZSIKKyNsaW5lIDIyOTUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogZXh0ZXJuIGludCBhY190ZXN0OwogaW50IG1haW4oKSB7CiBpZiAoYWNfdGVzdCkgcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjYyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19leHRlcm5fcHJlZml4PSJ5ZXMiCiBlbHNlCkBAIC0yMjgyLDcgKzIzMjIsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIGFzc2VtYmxlciBhY2NlcHRzIC5zdHJpbmciIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjg2OiBjaGVja2luZyAid2hldGhlciBhc3NlbWJsZXIgYWNjZXB0cyAuc3RyaW5nIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjMyNjogY2hlY2tpbmcgIndoZXRoZXIgYXNzZW1ibGVyIGFjY2VwdHMgLnN0cmluZyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYXNtX3N0cmluZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMjkyLDE0ICsyMzMyLDE0IEBACiAJLnN0cmluZyAidGVzdCIKIEVPRgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI5NiAiY29uZmlndXJlIgorI2xpbmUgMjMzNiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNDM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfYXNtX3N0cmluZz0ieWVzIgogZWxzZQpAQCAtMjMyNiwyMSArMjM2NiwyMSBAQAogaWYgdGVzdCAiJExJQl9UQVJHRVQiID0gImxpYndpbmUuc28uMS4wIgogdGhlbgogICBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzMwOiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMzcwOiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2RsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIHNhdmVkX2NmbGFncz0kQ0ZMQUdTCiAgIENGTEFHUz0iJENGTEFHUyAtZlBJQyAtc2hhcmVkIC1XbCwtc29uYW1lLGNvbmZ0ZXN0LnNvLjEuMCIKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMzNyAiY29uZmlndXJlIgorI2xpbmUgMjM3NyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM4NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19kbGw9InllcyIKIGVsc2UKQEAgLTIzNjYsNyArMjQwNiw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciByZWVudHJhbnQgWCBsaWJyYXJpZXMiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzcwOiBjaGVja2luZyAiZm9yIHJlZW50cmFudCBYIGxpYnJhcmllcyIiID4mNQorZWNobyAiY29uZmlndXJlOjI0MTA6IGNoZWNraW5nICJmb3IgcmVlbnRyYW50IFggbGlicmFyaWVzIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl94X3JlZW50cmFudCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yNDEwLDEyICsyNDUwLDEyIEBACiBmb3IgYWNfZnVuYyBpbiBjbG9uZSBnZXRwYWdlc2l6ZSBtZW1tb3ZlIHNpZ2FsdHN0YWNrIHN0cmVycm9yIHN0cmljbXAgdGNnZXRhdHRyIHRpbWVnbSB1c2xlZXAgd2FpdDQgd2FpdHBpZAogZG8KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQxNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNDU0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDE5ICJjb25maWd1cmUiCisjbGluZSAyNDU5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KQEAgLTI0MzgsNyArMjQ3OCw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDQyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ4MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCiBlbHNlCkBAIC0yNDYyLDIxICsyNTAyLDIxIEBACiBmaQogZG9uZQogCi1mb3IgYWNfaGRyIGluIHdjdHlwZS5oIHN5cy9zeXNjYWxsLmggc3lzY2FsbC5oIHN5cy9wYXJhbS5oIHN5cy92ZnMuaCBzeXMvbW91bnQuaCBzeXMvc3RhdGZzLmggZmxvYXQuaCBsaW51eC9jZHJvbS5oIHN5cy9jZGlvLmggc3lzL2ZpbGlvLmgKK2ZvciBhY19oZHIgaW4gd2N0eXBlLmggc3lzL3N5c2NhbGwuaCBzeXNjYWxsLmggc3lzL3BhcmFtLmggc3lzL3Zmcy5oIHN5cy9tb3VudC5oIHN5cy9zdGF0ZnMuaCBmbG9hdC5oIGxpbnV4L2Nkcm9tLmggc3lzL2NkaW8uaCBzeXMvZmlsaW8uaCBzeXMvbW9kZW0uaCBzdHJpbmdzLmggc3lzL3N0cnRpby5oCiBkbwogYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ3MDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorZWNobyAiY29uZmlndXJlOjI1MTA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDc1ICJjb25maWd1cmUiCisjbGluZSAyNTE1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkYWNfaGRyPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDgwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTIwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0yNTAzLDEyICsyNTQzLDEyIEBACiBkb25lCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MDc6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQorZWNobyAiY29uZmlndXJlOjI1NDc6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGF0X2Jyb2tlbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MTIgImNvbmZpZ3VyZSIKKyNsaW5lIDI1NTIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CkBAIC0yNTU5LDEyICsyNTk5LDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU2MzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQorZWNobyAiY29uZmlndXJlOjI2MDM6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU2OCAiY29uZmlndXJlIgorI2xpbmUgMjYwOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewpAQCAtMjYxMyw3ICsyNjUzLDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY1NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfY29uc3Q9eWVzCiBlbHNlCkBAIC0yNjM0LDEyICsyNjc0LDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYzODogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAiY29uZmlndXJlOjI2Nzg6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NDMgImNvbmZpZ3VyZSIKKyNsaW5lIDI2ODMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgpAQCAtMjY0Nyw3ICsyNjg3LDcgQEAKICNpbmNsdWRlIDxmbG9hdC5oPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjUxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjkxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0yNjY0LDcgKzI3MDQsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY2OCAiY29uZmlndXJlIgorI2xpbmUgMjcwOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiBFT0YKQEAgLTI2ODIsNyArMjcyMiw3IEBACiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjg2ICJjb25maWd1cmUiCisjbGluZSAyNzI2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRsaWIuaD4KIEVPRgpAQCAtMjcwMyw3ICsyNzQzLDcgQEAKICAgOgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzA3ICJjb25maWd1cmUiCisjbGluZSAyNzQ3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxjdHlwZS5oPgogI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCkBAIC0yNzE0LDcgKzI3NTQsNyBAQAogZXhpdCAoMCk7IH0KIAogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3MTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICA6CiBlbHNlCkBAIC0yNzM4LDEyICsyNzc4LDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzQyOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNzgyOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NDcgImNvbmZpZ3VyZSIKKyNsaW5lIDI3ODcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2lmIFNURENfSEVBREVSUwpAQCAtMjc3MSw3ICsyODExLDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzc1OiBjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIgPiY1CitlY2hvICJjb25maWd1cmU6MjgxNTogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NpemVvZl9sb25nX2xvbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjc3OSw3ICsyODE5LDcgQEAKICAgYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZz0wCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3ODMgImNvbmZpZ3VyZSIKKyNsaW5lIDI4MjMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGlvLmg+CiBtYWluKCkKQEAgLTI3OTAsNyArMjgzMCw3IEBACiAgIGV4aXQoMCk7CiB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9YGNhdCBjb25mdGVzdHZhbGAKIGVsc2UKQEAgLTI4MTQsMTIgKzI4NTQsMTIgQEAKIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3Zmc19oIiA9ICJ5ZXMiCiB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgc3lzL3Zmcy5oIGRlZmluZXMgc3RhdGZzIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgxODogY2hlY2tpbmcgIndoZXRoZXIgc3lzL3Zmcy5oIGRlZmluZXMgc3RhdGZzIiIgPiY1CitlY2hvICJjb25maWd1cmU6Mjg1ODogY2hlY2tpbmcgIndoZXRoZXIgc3lzL3Zmcy5oIGRlZmluZXMgc3RhdGZzIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zeXNfdmZzX2hhc19zdGF0ZnMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODIzICJjb25maWd1cmUiCisjbGluZSAyODYzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTI4MzYsNyArMjg3Niw3IEBACiAJCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg0MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODgwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgd2luZV9jdl9zeXNfdmZzX2hhc19zdGF0ZnM9eWVzCiBlbHNlCkBAIC0yODYzLDEyICsyOTAzLDEyIEBACiBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19zdGF0ZnNfaCIgPSAieWVzIgogdGhlbgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIHN5cy9zdGF0ZnMuaCBkZWZpbmVzIHN0YXRmcyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Njc6IGNoZWNraW5nICJ3aGV0aGVyIHN5cy9zdGF0ZnMuaCBkZWZpbmVzIHN0YXRmcyIiID4mNQorZWNobyAiY29uZmlndXJlOjI5MDc6IGNoZWNraW5nICJ3aGV0aGVyIHN5cy9zdGF0ZnMuaCBkZWZpbmVzIHN0YXRmcyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3Zfc3lzX3N0YXRmc19oYXNfc3RhdGZzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg3MiAiY29uZmlndXJlIgorI2xpbmUgMjkxMiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIAkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0yODgzLDcgKzI5MjMsNyBAQAogCQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4ODc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkyNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIHdpbmVfY3Zfc3lzX3N0YXRmc19oYXNfc3RhdGZzPXllcwogZWxzZQpAQCAtMjkxMCwxMiArMjk1MCwxMiBAQAogaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zeXNfbW91bnRfaCIgPSAieWVzIgogdGhlbgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIHN5cy9tb3VudC5oIGRlZmluZXMgc3RhdGZzIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkxNDogY2hlY2tpbmcgIndoZXRoZXIgc3lzL21vdW50LmggZGVmaW5lcyBzdGF0ZnMiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyOTU0OiBjaGVja2luZyAid2hldGhlciBzeXMvbW91bnQuaCBkZWZpbmVzIHN0YXRmcyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3Zfc3lzX21vdW50X2hhc19zdGF0ZnMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTE5ICJjb25maWd1cmUiCisjbGluZSAyOTU5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTI5MzAsNyArMjk3MCw3IEBACiAJCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkzNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTc0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgd2luZV9jdl9zeXNfbW91bnRfaGFzX3N0YXRmcz15ZXMKIGVsc2UKQEAgLTI5NTYsNyArMjk5Niw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iZnJlZSIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5NjA6IGNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmZyZWUiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMDAwOiBjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JmcmVlIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zdGF0ZnNfYmZyZWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjk2NSw3ICszMDA1LDcgQEAKICAgICAgICAgd2luZV9jdl9zdGF0ZnNfYmZyZWU9bm8KICAgICBlbHNlCiAgICAgCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NjkgImNvbmZpZ3VyZSIKKyNsaW5lIDMwMDkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMjk5Miw3ICszMDMyLDcgQEAKIAkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTk2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICB3aW5lX2N2X3N0YXRmc19iZnJlZT15ZXMKIGVsc2UKQEAgLTMwMTYsNyArMzA1Niw3IEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JhdmFpbCIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwMjA6IGNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmF2YWlsIiIgPiY1CitlY2hvICJjb25maWd1cmU6MzA2MDogY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iYXZhaWwiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X3N0YXRmc19iYXZhaWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzAyNSw3ICszMDY1LDcgQEAKICAgICAgICAgd2luZV9jdl9zdGF0ZnNfYmF2YWlsPW5vCiAgICAgZWxzZQogICAgIAljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDI5ICJjb25maWd1cmUiCisjbGluZSAzMDY5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTMwNTIsNyArMzA5Miw3IEBACiAJCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA1NjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDk2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgd2luZV9jdl9zdGF0ZnNfYmF2YWlsPXllcwogZWxzZQpAQCAtMzA3Nyw3ICszMTE3LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHdvcmtpbmcgc2lnYWx0c3RhY2siIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDgxOiBjaGVja2luZyAiZm9yIHdvcmtpbmcgc2lnYWx0c3RhY2siIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMTIxOiBjaGVja2luZyAiZm9yIHdvcmtpbmcgc2lnYWx0c3RhY2siIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3dvcmtpbmdfc2lnYWx0c3RhY2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMzA4Niw3ICszMTI2LDcgQEAKIAogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDkwICJjb25maWd1cmUiCisjbGluZSAzMTMwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMzEyNCw3ICszMTY0LDcgQEAKIAl9CiAJCiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIGFjX2N2X2Nfd29ya2luZ19zaWdhbHRzdGFjaz0ieWVzIgogZWxzZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmluZGV4IDkxYmMzN2QuLmFlOTk0NGMgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5pbgorKysgYi9jb25maWd1cmUuaW4KQEAgLTE1LDYgKzE1LDggQEAKIGRubCBEZWZhdWx0IHZhbHVlcwogTUFJTl9UQVJHRVQ9ZW11CiBMSUJfVEFSR0VUPWxpYndpbmUuYQorVFJBQ0VfTVNHUz15ZXMJIyB0aGUgVFJBQ0UoKSBtYWNybworREVCVUdfTVNHUz15ZXMJIyB0aGUgVFJBQ0UoKSwgV0FSTigpLCBhbmQgRklYTUUoKSBtYWNyb3MuCiAKIEFDX0FSR19FTkFCTEUoZW11bGF0b3IsCiBbICAtLWRpc2FibGUtZW11bGF0b3IgICAgICBidWlsZCBvbmx5IHRoZSBXaW5lIGxpYnJhcnksIG5vdCB0aGUgZW11bGF0b3JdLApAQCAtMjgsNiArMzAsMTQgQEAKIGRubCBbICAtLWVuYWJsZS1pcGMgICAgICAgICAgICB1c2UgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIGZvciBEREVdLAogZG5sIFtpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyI7IHRoZW4gOiA7IGVsc2UgT1BUSU9OUz0iLURDT05GSUdfSVBDIjsgZmldKQogCitBQ19BUkdfRU5BQkxFKGRlYnVnLAorWyAgLS1kaXNhYmxlLWRlYnVnICAgICAgICAgY29tcGlsZSBvdXQgYWxsIGRlYnVnZ2luZyBtZXNzYWdlc10sCitbaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iOyB0aGVuIERFQlVHX01TR1M9Im5vIjsgZmldKQorCitBQ19BUkdfRU5BQkxFKHRyYWNlLAorWyAgLS1kaXNhYmxlLXRyYWNlICAgICAgICAgY29tcGlsZSBvdXQgVFJBQ0UgbWVzc2FnZXNdLAorW2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIjsgdGhlbiBUUkFDRV9NU0dTPSJubyI7IGZpXSkKKwogQUNfQVJHX1dJVEgocmVlbnRyYW50LXgsCiBbICAtLXdpdGhvdXQtcmVlbnRyYW50LXggICBDb21waWxlIGZvciB1c2Ugd2l0aCBub24tcmVlbnRyYW50IFggbGlicmFyaWVzXSkKIApAQCAtMzUsNiArNDUsMTcgQEAKIEFDX1NVQlNUKExJQl9UQVJHRVQpCiBBQ19TVUJTVChPUFRJT05TKQogCitpZiB0ZXN0ICIkREVCVUdfTVNHUyIgPSAibm8iCit0aGVuCisgICAgQUNfREVGSU5FKE5PX0RFQlVHX01TR1MpCisgICAgQUNfREVGSU5FKE5PX1RSQUNFX01TR1MpCitlbHNlCisgICAgaWYgdGVzdCAiJFRSQUNFX01TR1MiID0gIm5vIgorICAgIHRoZW4KKyAgICAgICAgQUNfREVGSU5FKE5PX1RSQUNFX01TR1MpCisgICAgZmkKK2ZpCisKIGRubCAqKioqIENoZWNrIGZvciBzb21lIHByb2dyYW1zICoqKioKIAogQUNfUFJPR19NQUtFX1NFVApAQCAtMjE1LDcgKzIzNiw3IEBACiBkbmwgKioqKiBDaGVjayBmb3IgZnVuY3Rpb25zIGFuZCBoZWFkZXIgZmlsZXMgKioqKgogCiBBQ19DSEVDS19GVU5DUyhjbG9uZSBnZXRwYWdlc2l6ZSBtZW1tb3ZlIHNpZ2FsdHN0YWNrIHN0cmVycm9yIHN0cmljbXAgdGNnZXRhdHRyIHRpbWVnbSB1c2xlZXAgd2FpdDQgd2FpdHBpZCkKLUFDX0NIRUNLX0hFQURFUlMod2N0eXBlLmggc3lzL3N5c2NhbGwuaCBzeXNjYWxsLmggc3lzL3BhcmFtLmggc3lzL3Zmcy5oIHN5cy9tb3VudC5oIHN5cy9zdGF0ZnMuaCBmbG9hdC5oIGxpbnV4L2Nkcm9tLmggc3lzL2NkaW8uaCBzeXMvZmlsaW8uaCkKK0FDX0NIRUNLX0hFQURFUlMod2N0eXBlLmggc3lzL3N5c2NhbGwuaCBzeXNjYWxsLmggc3lzL3BhcmFtLmggc3lzL3Zmcy5oIHN5cy9tb3VudC5oIHN5cy9zdGF0ZnMuaCBmbG9hdC5oIGxpbnV4L2Nkcm9tLmggc3lzL2NkaW8uaCBzeXMvZmlsaW8uaCBzeXMvbW9kZW0uaCBzdHJpbmdzLmggc3lzL3N0cnRpby5oKQogQUNfSEVBREVSX1NUQVQoKQogQUNfQ19DT05TVCgpCiBBQ19UWVBFX1NJWkVfVCgpCmRpZmYgLS1naXQgYS9jb250cm9scy9NYWtlZmlsZS5pbiBiL2NvbnRyb2xzL01ha2VmaWxlLmluCmluZGV4IGZmOTJmNWMuLmYzNmEzODIgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL01ha2VmaWxlLmluCisrKyBiL2NvbnRyb2xzL01ha2VmaWxlLmluCkBAIC04LDYgKzgsNyBAQAogQ19TUkNTID0gXAogCWJ1dHRvbi5jIFwKIAljb21iby5jIFwKKwljb21jdGwzMnVuZG9jLmMgXAogCWNvbW1jdHJsLmMgXAogCWRlc2t0b3AuYyBcCiAJZWRpdC5jIFwKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWN0bDMydW5kb2MuYyBiL2NvbnRyb2xzL2NvbWN0bDMydW5kb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzE5ZTNiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJvbHMvY29tY3RsMzJ1bmRvYy5jCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogVW5kb2N1bWVudGVkIGZ1bmN0aW9ucyBmcm9tIENPTUNUTDMyLkRMTAorICoKKyAqIENvcHlyaWdodCAxOTk4IEVyaWMgS29obCA8ZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGU+CisgKgorICogTk9URVMKKyAqICAgICBBbGwgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBVTkRPQ1VNRU5URUQhISBBbmQgSSBtZWFuIFVORE9DVU1FTlRFRCEhISEKKyAqICAgICBEbyBOT1QgcmVseSBvbiBuYW1lcyBvZiB1bmRvY3VtZW50ZWQgc3RydWN0dXJlcyBhbmQgdHlwZXMhISEKKyAqICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgYnkgRVhQTE9SRVIuRVhFLCBJRVhQTE9SRS5FWEUgYW5kCisgKiAgICAgQ09NQ1RMMzIuRExMIChpbnRlcm5hbGx5KS4KKyAqCisgKiBUT0RPCisgKiAgICAgLSBGaXggRFNBX0luc2VydEl0ZW0uCisgKiAgICAgLSBXcml0ZSBkb2N1bWVudGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgX0RTQV9EQVRBCit7CisgICAgRFdPUkQgICBkd0VudHJ5Q291bnQ7CisgICAgRFdPUkQgICBkd01heENvdW50OworICAgIERXT1JEICAgZHdJbml0aWFsOworICAgIERXT1JEICAgZHdHcm93OworICAgIExQU1RSICAgKnB0cnM7Cit9IERTQV9EQVRBLCAqTFBEU0FfREFUQTsKKworCit0eXBlZGVmIHN0cnVjdCBfRFBBX0RBVEEKK3sKKyAgICBEV09SRCAgIGR3RW50cnlDb3VudDsKKyAgICBEV09SRCAgIGR3TWF4Q291bnQ7CisgICAgRFdPUkQgICBkd0dyb3c7CisgICAgTFBEV09SRCBwdHJzOyAKK30gRFBBX0RBVEEsICpMUERQQV9EQVRBOworCisKK0RXT1JEIFdJTkFQSSBBbGxvYyAoRFdPUkQpOworRFdPUkQgV0lOQVBJIFJlQWxsb2MgKERXT1JELCBEV09SRCk7CitEV09SRCBXSU5BUEkgRnJlZSAoRFdPUkQpOworCitEV09SRCBXSU5BUEkgRFNBX0NyZWF0ZSAoRFdPUkQsIERXT1JEKTsKKworCitEV09SRCBXSU5BUEkgRFBBX0NyZWF0ZSAoRFdPUkQpOworRFdPUkQgV0lOQVBJIERQQV9HZXRQdHIgKERXT1JELCBEV09SRCk7CitEV09SRCBXSU5BUEkgRFBBX0luc2VydFB0ciAoRFdPUkQsIERXT1JELCBEV09SRCk7CisKKworTFBTVFIgV0lOQVBJIENPTUNUTDMyX1N0ckNockEgKExQU1RSIGxwU3RyaW5nLCBDSEFSIGNDaGFyKTsKKworCitEV09SRCBXSU5BUEkKK0FsbG9jIChEV09SRCBkd1BhcmFtMSkKK3sKKyAgICBEV09SRCBkd1B0cjsKKworICAgIGR3UHRyID0gKERXT1JEKUhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgZHdQYXJhbTEpOworCisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKDB4JTA4bHgpIHJldD0weCUwOGx4XG4iLCBkd1BhcmFtMSwgZHdQdHIpOworCisgICAgcmV0dXJuIGR3UHRyOworfQorCisKK0RXT1JEIFdJTkFQSQorUmVBbGxvYyAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQoreworICAgIERXT1JEIGR3UHRyOworCisgICAgaWYgKGR3UGFyYW0xID09IDApCisJZHdQdHIgPSAoRFdPUkQpSGVhcEFsbG9jIChTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLCBkd1BhcmFtMik7CisgICAgZWxzZQorCWR3UHRyID0gKERXT1JEKUhlYXBSZUFsbG9jIChTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLCAKKwkJCQkgICAgKExQVk9JRClkd1BhcmFtMSwgZHdQYXJhbTIpOworCisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKDB4JTA4bHggMHglMDhseCkgcmV0PTB4JTA4bHhcbiIsCisJICAgZHdQYXJhbTEsIGR3UGFyYW0yLCBkd1B0cik7CisKKyAgICByZXR1cm4gZHdQdHI7Cit9CisKKworRFdPUkQgV0lOQVBJCitGcmVlIChEV09SRCBkd1BhcmFtMSkKK3sKKyAgICBUUkFDRSAoY29tbWN0cmwsICIoMHglMDhseClcbiIsIGR3UGFyYW0xKTsKKyAgICBIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgKExQVk9JRClkd1BhcmFtMSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCisKKworCitEV09SRCBXSU5BUEkKK0RTQV9DcmVhdGUgKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKK3sKKyAgICBMUERTQV9EQVRBIGRzYVB0cjsKKworICAgIGRzYVB0ciA9IChMUERTQV9EQVRBKUhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKERTQV9EQVRBKSk7CisgICAgZHNhUHRyLT5kd0luaXRpYWwgPSBkd1BhcmFtMTsKKyAgICBkc2FQdHItPmR3R3JvdyA9IGR3UGFyYW0yOworCisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKDB4JTA4bHggMHglMDhseCkgcmV0PTB4JTA4bHhcbiIsCisJICAgZHdQYXJhbTEsIGR3UGFyYW0yLCAoRFdPUkQpZHNhUHRyKTsKKworICAgIHJldHVybiAoRFdPUkQpZHNhUHRyOworfQorCisKK0RXT1JEIFdJTkFQSQorRFNBX0Rlc3Ryb3kgKERXT1JEIGR3UGFyYW0xKQoreworICAgIExQRFNBX0RBVEEgZHNhUHRyID0gKExQRFNBX0RBVEEpZHdQYXJhbTE7CisgICAgRFdPUkQgaTsKKworICAgIFRSQUNFIChjb21tY3RybCwgIigweCUwOGx4KTpzZW1pLXN0dWIhXG4iLCBkd1BhcmFtMSk7CisKKyAgICBpZiAoZHNhUHRyLT5wdHJzKSB7CisJZm9yIChpID0gMDsgaSA8IGRzYVB0ci0+ZHdFbnRyeUNvdW50OyBpKyspIHsKKwkgICAgaWYgKGRzYVB0ci0+cHRyc1tpXSkKKwkJSGVhcEZyZWUgKFN5c3RlbUhlYXAsIDAsIChMUFNUUilkc2FQdHItPnB0cnNbaV0pOworCX0KKyAgICB9CisKKyAgICBIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgZHNhUHRyKTsKKworICAgIHJldHVybiAwOworfQorCisKK0RXT1JEIFdJTkFQSQorRFNBX0luc2VydEl0ZW0gKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMiwgRFdPUkQgZHdQYXJhbTMpCit7CisgICAgTFBEU0FfREFUQSBkc2FQdHIgPSAoTFBEU0FfREFUQSlkd1BhcmFtMTsKKyAgICBEV09SRCBkd0luZGV4OworICAgIElOVDMyIGxlbjsKKworICAgIFRSQUNFIChjb21tY3RybCwgIigweCUwOGx4IDB4JTA4bHggXCIlc1wiKTpzZW1pLXN0dWIhXG4iLAorCSAgIGR3UGFyYW0xLCBkd1BhcmFtMiwgKExQU1RSKWR3UGFyYW0zKTsKKworICAgIGlmIChkc2FQdHItPnB0cnMgPT0gTlVMTCkgeworCWRzYVB0ci0+cHRycyA9IChMUFNUUiopSGVhcEFsbG9jIChTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkJCQkgIGRzYVB0ci0+ZHdJbml0aWFsICogc2l6ZW9mKExQVk9JRCkpOworCWRzYVB0ci0+ZHdNYXhDb3VudCA9IGRzYVB0ci0+ZHdJbml0aWFsOworICAgICAgICBkd0luZGV4ID0gMDsKKwlsZW4gPSBsc3RybGVuMzJBICgoTFBTVFIpZHdQYXJhbTMpOworCWRzYVB0ci0+cHRyc1tkd0luZGV4XSA9CisJICAgIChMUFNUUilIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksIGxlbisxKTsKKwlsc3RyY3B5MzJBIChkc2FQdHItPnB0cnNbZHdJbmRleF0sIChMUFNUUilkd1BhcmFtMyk7CisgICAgfQorICAgIGVsc2UgeworCVRSQUNFIChjb21tY3RybCwgIigweCUwOGx4IDB4JTA4bHgpXG4iLAorCSAgICAgICBkc2FQdHItPmR3RW50cnlDb3VudCwgZHNhUHRyLT5kd01heENvdW50KTsKKwlpZiAoZHdQYXJhbTIgPj0gZHNhUHRyLT5kd0VudHJ5Q291bnQpIHsKKwkgICAgaWYgKGRzYVB0ci0+ZHdFbnRyeUNvdW50IDwgZHNhUHRyLT5kd01heENvdW50KSB7CisJCWR3SW5kZXggPSBkc2FQdHItPmR3RW50cnlDb3VudDsKKwkJbGVuID0gbHN0cmxlbjMyQSAoKExQU1RSKWR3UGFyYW0zKTsKKwkJZHNhUHRyLT5wdHJzW2R3SW5kZXhdID0KKwkJICAgIChMUFNUUilIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksIGxlbisxKTsKKwkJbHN0cmNweTMyQSAoZHNhUHRyLT5wdHJzW2R3SW5kZXhdLCAoTFBTVFIpZHdQYXJhbTMpOworCSAgICB9CisJICAgIGVsc2UgeworCQlGSVhNRSAoY29tbWN0cmwsICJyZXNpemluZyBhcnJheSEgc3R1YiFcbiIpOworCisJCWR3SW5kZXggPSBkd1BhcmFtMjsKKworCSAgICB9CisJfQorCWVsc2UgeworCSAgICBGSVhNRSAoY29tbWN0cmwsICJpbnNlcnRpbmchIHN0dWIhXG4iKTsKKworCSAgICBkd0luZGV4ID0gZHdQYXJhbTI7CisJfQorICAgIH0KKworICAgIGRzYVB0ci0+ZHdFbnRyeUNvdW50Kys7CisKKyAgICBUUkFDRSAoY29tbWN0cmwsICJyZXQ9MHglMDhseFxuIiwgZHdJbmRleCk7CisKKyAgICByZXR1cm4gKGR3SW5kZXgpOworfQorCisKK0RXT1JEIFdJTkFQSQorRFNBX0dldEl0ZW1QdHIgKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKK3sKKyAgICBMUERTQV9EQVRBIGRzYVB0ciA9IChMUERTQV9EQVRBKWR3UGFyYW0xOworCisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKDB4JTA4bHggMHglMDhseClcbiIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CisKKyAgICBpZiAoZHNhUHRyID09IE5VTEwpCisJcmV0dXJuIDA7CisgICAgaWYgKGRzYVB0ci0+cHRycyA9PSBOVUxMKQorCXJldHVybiAwOworICAgIGlmICgoZHdQYXJhbTIgPCAwKSB8fCAoZHdQYXJhbTIgPj0gZHNhUHRyLT5kd0VudHJ5Q291bnQpKQorCXJldHVybiAwOworCisgICAgVFJBQ0UgKGNvbW1jdHJsLCAicmV0PTB4JTA4bHhcbiIsIChEV09SRClkc2FQdHItPnB0cnNbZHdQYXJhbTJdKTsKKworICAgIHJldHVybiAoRFdPUkQpZHNhUHRyLT5wdHJzW2R3UGFyYW0yXTsKK30KKworCitEV09SRCBXSU5BUEkKK0RTQV9EZWxldGVJdGVtIChEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCit7CisgICAgTFBEU0FfREFUQSBkc2FQdHIgPSAoTFBEU0FfREFUQSlkd1BhcmFtMTsKKworICAgIFRSQUNFIChjb21tY3RybCwgIigweCUwOGx4IDB4JTA4bHgpOnNlbWktc3R1YiFcbiIsCisJICAgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKworICAgIGlmIChkc2FQdHItPnB0cnMpIHsKKwlpZiAoZHNhUHRyLT5kd0VudHJ5Q291bnQgPT0gMSkgeworCSAgICBpZiAoZHNhUHRyLT5wdHJzW2R3UGFyYW0yXSkKKwkJSGVhcEZyZWUgKFN5c3RlbUhlYXAsIDAsIGRzYVB0ci0+cHRyc1tkd1BhcmFtMl0pOworCSAgICBkc2FQdHItPmR3RW50cnlDb3VudC0tOworCX0KKwllbHNlIHsKKwkgICAgTFBTVFIgKm9sZFB0cnMgPSBkc2FQdHItPnB0cnM7CisJICAgIFRSQUNFIChjb21tY3RybCwgImNvbXBsZXggZGVsZXRlIVxuIik7CisKKwkgICAgaWYgKGRzYVB0ci0+cHRyc1tkd1BhcmFtMl0pCisJCUhlYXBGcmVlIChTeXN0ZW1IZWFwLCAwLCBkc2FQdHItPnB0cnNbZHdQYXJhbTJdKTsKKworCSAgICBkc2FQdHItPmR3RW50cnlDb3VudC0tOworCSAgICBkc2FQdHItPnB0cnMgPSAKKwkJKExQU1RSKilIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksCisJCQkJICAgZHNhUHRyLT5kd0VudHJ5Q291bnQgKiBzaXplb2YoTFBWT0lEKSk7CisJICAgIGlmIChkd1BhcmFtMiA+IDApIHsKKwkJbWVtY3B5ICgmZHNhUHRyLT5wdHJzWzBdLCAmb2xkUHRyc1swXSwKKwkJCWR3UGFyYW0yICogc2l6ZW9mKExQU1RSKSk7CisJICAgIH0KKworCSAgICBpZiAoZHdQYXJhbTIgPCBkc2FQdHItPmR3RW50cnlDb3VudCkgeworCQltZW1jcHkgKCZkc2FQdHItPnB0cnNbZHdQYXJhbTJdLCAmb2xkUHRyc1tkd1BhcmFtMisxXSwKKwkJCShkc2FQdHItPmR3RW50cnlDb3VudCAtIGR3UGFyYW0yKSAqIHNpemVvZihMUFNUUikpOworCSAgICB9CisJICAgIEhlYXBGcmVlIChTeXN0ZW1IZWFwLCAwLCBvbGRQdHJzKTsKKwl9CisKKwlpZiAoZHNhUHRyLT5kd0VudHJ5Q291bnQgPT0gMCkgeworCSAgICBIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgZHNhUHRyLT5wdHJzKTsKKwkgICAgZHNhUHRyLT5wdHJzID0gTlVMTDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKworRFdPUkQgV0lOQVBJCitEUEFfQ3JlYXRlIChEV09SRCBkd1BhcmFtMSkKK3sKKyAgICBMUERQQV9EQVRBIGRwYVB0cjsKKworICAgIFRSQUNFIChjb21tY3RybCwgIigweCUwOGx4KVxuIiwgZHdQYXJhbTEpOworCisgICAgZHBhUHRyID0gKExQRFBBX0RBVEEpSGVhcEFsbG9jIChTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoRFBBX0RBVEEpKTsKKyAgICBkcGFQdHItPmR3R3JvdyA9IGR3UGFyYW0xOworCisgICAgVFJBQ0UgKGNvbW1jdHJsLCAicmV0PTB4JTA4bHhcbiIsIChEV09SRClkcGFQdHIpOworCisgICAgcmV0dXJuIChEV09SRClkcGFQdHI7Cit9CisKKworCitEV09SRCBXSU5BUEkKK0RQQV9HZXRQdHIgKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKK3sKKyAgICBMUERQQV9EQVRBIGRwYVB0ciA9IChMUERQQV9EQVRBKWR3UGFyYW0xOworCisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKDB4JTA4bHggMHglMDhseClcbiIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CisKKyAgICBpZiAoZHBhUHRyID09IE5VTEwpCisJcmV0dXJuIDA7CisgICAgaWYgKGRwYVB0ci0+cHRycyA9PSBOVUxMKQorCXJldHVybiAwOworICAgIGlmICgoZHdQYXJhbTIgPCAwKSB8fCAoZHdQYXJhbTIgPj0gZHBhUHRyLT5kd0VudHJ5Q291bnQpKQorCXJldHVybiAwOworCisgICAgVFJBQ0UgKGNvbW1jdHJsLCAicmV0PTB4JTA4bHhcbiIsIChEV09SRClkcGFQdHItPnB0cnNbZHdQYXJhbTJdKTsKKworICAgIHJldHVybiAoRFdPUkQpZHBhUHRyLT5wdHJzW2R3UGFyYW0yXTsKK30KKworCisKK0RXT1JEIFdJTkFQSQorRFBBX0luc2VydFB0ciAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLCBEV09SRCBkd1BhcmFtMykKK3sKKyAgICBMUERQQV9EQVRBIGRwYVB0ciA9IChMUERQQV9EQVRBKWR3UGFyYW0xOworICAgIERXT1JEIGR3SW5kZXg7CisKKyAgICBUUkFDRSAoY29tbWN0cmwsICIoMHglMDhseCAweCUwOGx4IDB4JWx4KVxuIiwKKwkgICBkd1BhcmFtMSwgZHdQYXJhbTIsIGR3UGFyYW0zKTsKKworICAgIGlmIChkcGFQdHItPnB0cnMgPT0gTlVMTCkgeworCWRwYVB0ci0+cHRycyA9IChMUERXT1JEKUhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwKKwkJCQkJICAgZHBhUHRyLT5kd0dyb3cgKiBzaXplb2YoTFBWT0lEKSk7CisJZHBhUHRyLT5kd01heENvdW50ID0gZHBhUHRyLT5kd0dyb3c7CisgICAgICAgIGR3SW5kZXggPSAwOworICAgICAgICBkcGFQdHItPnB0cnNbZHdJbmRleF0gPSBkd1BhcmFtMzsKKyAgICB9CisgICAgZWxzZSB7CisJRklYTUUgKGNvbW1jdHJsLCAiYWRkaW5nIHRvIGV4aXN0aW5nIGFycmF5ISBzdHViIVxuIik7CisKKworCWR3SW5kZXggPSBkd1BhcmFtMjsKKyAgICB9CisKKyAgICBkcGFQdHItPmR3RW50cnlDb3VudCsrOworCisgICAgcmV0dXJuIChkd0luZGV4KTsKK30KKworCitMUFNUUiBXSU5BUEkKK0NPTUNUTDMyX1N0ckNockEgKExQU1RSIGxwU3RyaW5nLCBDSEFSIGNDaGFyKQoreworICAgIHJldHVybiBzdHJjaHIgKGxwU3RyaW5nLCBjQ2hhcik7Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbW1jdHJsLmMgYi9jb250cm9scy9jb21tY3RybC5jCmluZGV4IDkzZGUwOTIuLjIyZWY0YzQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbW1jdHJsLmMKKysrIGIvY29udHJvbHMvY29tbWN0cmwuYwpAQCAtMTMxLDggKzEzMSw4IEBACiAgIElOVDMyIGNDb3VudDsKICAgRFdPUkQgZHdNYXNrOwogCi0gIGlmIChscEluaXRDdHJscyA9PSBOVUxMKSByZXR1cm4gKEZBTFNFKTsKLSAgaWYgKGxwSW5pdEN0cmxzLT5kd1NpemUgPCBzaXplb2YoSU5JVENPTU1PTkNPTlRST0xTRVgpKSByZXR1cm4gKEZBTFNFKTsKKyAgaWYgKGxwSW5pdEN0cmxzID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgaWYgKGxwSW5pdEN0cmxzLT5kd1NpemUgPCBzaXplb2YoSU5JVENPTU1PTkNPTlRST0xTRVgpKSByZXR1cm4gRkFMU0U7CiAKICAgZm9yIChjQ291bnQgPSAwOyBjQ291bnQgPD0gMzE7IGNDb3VudCsrKSB7CiAgICAgZHdNYXNrID0gMSA8PCBjQ291bnQ7CkBAIC0xNjAsNiArMTYwLDcgQEAKICAgICAgIGNhc2UgSUNDX1RBQl9DTEFTU0VTOgogICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyB0YWIgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKICAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gdG9vbHRpcCBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworICAgICAgICBVUERPV05fUmVnaXN0ZXIgKCk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIElDQ19VUERPV05fQ0xBU1M6CkBAIC0xNzgsNiArMTc5LDcgQEAKICAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gYW5pbWF0aW9uIGNsYXNzIGltcGxlbWVudGVkIVxuIik7CiAgICAgICAgIGJyZWFrOwogCisgICAgICAvKiBhZHZhbmNlZCBjbGFzc2VzIC0gbm90IGluY2x1ZGVkIGluIFdpbjk1ICovCiAgICAgICBjYXNlIElDQ19EQVRFX0NMQVNTRVM6CiAgICAgICAgIFRSQUNFIChjb21tY3RybCwgIk5vIG1vbnRoIGNhbGVuZGFyIGNsYXNzIGltcGxlbWVudGVkIVxuIik7CiAgICAgICAgIFRSQUNFIChjb21tY3RybCwgIk5vIGRhdGUgcGlja2VyIGNsYXNzIGltcGxlbWVudGVkIVxuIik7CkBAIC0yMTEsNyArMjEzLDcgQEAKICAgICB9CiAgIH0KIAotICByZXR1cm4gKFRSVUUpOworICByZXR1cm4gVFJVRTsKIH0KIAogCkBAIC0yNDIsMTMgKzI0NCwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKEhJV09SRCh3UGFyYW0pICYgTUZfUE9QVVApIHsKLSAgICAgICAgICAgICAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiUG9wdXAgbWVudSBzZWxlY3RlZCFcbiIpOwotICAgICAgICAgICAgICAgICAgICBGSVhNRSAoY29tbWN0cmwsICJObyBwb3B1cCBtZW51IHRleHRzIVxuIik7CisgICAgICAgICAgICAgICAgICAgIFRSQUNFIChjb21tY3RybCwgInBvcHVwIG1lbnUgc2VsZWN0ZWQhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgRklYTUUgKGNvbW1jdHJsLCAibm8gcG9wdXAgbWVudSB0ZXh0cyFcbiIpOwogCiAgICAgICAgICAgICAgICAgICAgIHN6U3RhdHVzVGV4dFswXSA9IDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJNZW51IGl0ZW0gc2VsZWN0ZWQhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAibWVudSBpdGVtIHNlbGVjdGVkIVxuIik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghTG9hZFN0cmluZzMyQSAoaEluc3QsIExPV09SRCh3UGFyYW0pLCBzelN0YXR1c1RleHQsIDEyOCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBzelN0YXR1c1RleHRbMF0gPSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4NCw3ICsyODYsOCBAQAogICAgIGlmKGh3bmRUQikgewogCVRCQUREQklUTUFQIHRiYWI7CiAKLSAgICAgICAgU2VuZE1lc3NhZ2UzMkEgKGh3bmRUQiwgVEJfQlVUVE9OU1RSVUNUU0laRSwgc2l6ZW9mKFRCQlVUVE9OKSwgMCk7CisgICAgICAgIFNlbmRNZXNzYWdlMzJBIChod25kVEIsIFRCX0JVVFRPTlNUUlVDVFNJWkUsCisJCQkoV1BBUkFNMzIpdVN0cnVjdFNpemUsIDApOwogCiAJLyogc2V0IGJpdG1hcCBhbmQgYnV0dG9uIHNpemUgKi8KIApAQCAtMjk2LDEwICsyOTksMTAgQEAKIAogCS8qIGFkZCBidXR0b25zICovCiAJU2VuZE1lc3NhZ2UzMkEgKGh3bmRUQiwgVEJfQUREQlVUVE9OUzMyQSwKLQkJCShXUEFSQU0zMilpTnVtQnV0dG9ucywgKExQQVJBTSkmbHBCdXR0b25zKTsKKwkJCShXUEFSQU0zMilpTnVtQnV0dG9ucywgKExQQVJBTSlscEJ1dHRvbnMpOwogICAgIH0KIAotICAgIHJldHVybiAoaHduZFRCKTsKKyAgICByZXR1cm4gaHduZFRCOwogfQogCiAKQEAgLTM0MSwzICszNDQsMzkgQEAKIAkJCSAgICBpTnVtQnV0dG9ucywgMCwgMCwgMCwgMCwgc2l6ZW9mIChPTERUQkJVVFRPTikpOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2V0RWZmZWN0aXZlQ2xpZW50UmVjdCBbQ09NQ1RMMzIuNF0KKyAqCisgKgorICoKKyAqLworCitWT0lEIFdJTkFQSQorR2V0RWZmZWN0aXZlQ2xpZW50UmVjdCAoSFdORDMyIGh3bmQsIExQUkVDVDMyIGxwUmVjdCwgTFBJTlQzMiBscEluZm8pCit7CisgICAgUkVDVDMyICByY0NsaWVudCwgcmNDdHJsOworICAgIEhXTkQzMiAgaHduZEN0cmw7CisgICAgTFBJTlQzMiBscFJ1bjsKKworICAgIFRSQUNFIChjb21tY3RybCwgImh3bmQ9MHglMDhseCBscFJlY3Q9MHglMDhseCBscEluZm89MHglMDhseFxuIiwKKwkgICAoRFdPUkQpaHduZCwgKERXT1JEKWxwUmVjdCwgKERXT1JEKWxwSW5mbyk7CisKKyAgICBHZXRDbGllbnRSZWN0MzIgKGh3bmQsICZyY0NsaWVudCk7CisKKyAgICBscFJ1biA9IGxwSW5mbzsKKyAgICBUUkFDRSAoY29tbWN0cmwsICIqbHBSdW49MHglMDh4XG4iLCAqbHBSdW4pOworICAgIHdoaWxlICgqbHBSdW4pIHsKKwlscFJ1bisrOworCVRSQUNFIChjb21tY3RybCwgImNvbnRyb2wgaWQgMHglMDh4XG4iLCAqbHBSdW4pOworCWh3bmRDdHJsID0gR2V0RGxnSXRlbTMyIChod25kLCAqbHBSdW4pOworCUdldFdpbmRvd1JlY3QzMiAoaHduZEN0cmwsICZyY0N0cmwpOworCU1hcFdpbmRvd1BvaW50czMyIChOVUxMLCBod25kLCAoTFBQT0lOVDMyKSZyY0N0cmwsIDIpOworCVN1YnRyYWN0UmVjdDMyICgmcmNDbGllbnQsICZyY0NsaWVudCwgJnJjQ3RybCk7CisJbHBSdW4rKzsKKwlUUkFDRSAoY29tbWN0cmwsICIqbHBSdW49MHglMDh4XG4iLCAqbHBSdW4pOworICAgIH0KKworICAgIENvcHlSZWN0MzIgKGxwUmVjdCwgJnJjQ2xpZW50KTsKK30KKwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbWVudS5jIGIvY29udHJvbHMvbWVudS5jCmluZGV4IDgxYmM2ODAuLmVlNDA3ZTIgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL21lbnUuYworKysgYi9jb250cm9scy9tZW51LmMKQEAgLTI3ODQsNyArMjc4NCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBFbmFibGVNZW51SXRlbTE2ICAgIChVU0VSLjE1NSkKICAqLwotQk9PTDE2IFdJTkFQSSBFbmFibGVNZW51SXRlbTE2KCBITUVOVTE2IGhNZW51LCBVSU5UMTYgd0l0ZW1JRCwgVUlOVDE2IHdGbGFncyApCitVSU5UMTYgV0lOQVBJIEVuYWJsZU1lbnVJdGVtMTYoIEhNRU5VMTYgaE1lbnUsIFVJTlQxNiB3SXRlbUlELCBVSU5UMTYgd0ZsYWdzICkKIHsKICAgICByZXR1cm4gRW5hYmxlTWVudUl0ZW0zMiggaE1lbnUsIHdJdGVtSUQsIHdGbGFncyApOwogfQpAQCAtMjc5MywzOCArMjc5MywyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgRW5hYmxlTWVudUl0ZW0zMiAgICAoVVNFUjMyLjE3MCkKICAqLwotQk9PTDMyIFdJTkFQSSBFbmFibGVNZW51SXRlbTMyKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgd0l0ZW1JRCwgVUlOVDMyIHdGbGFncyApCitVSU5UMzIgV0lOQVBJIEVuYWJsZU1lbnVJdGVtMzIoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB3SXRlbUlELCBVSU5UMzIgd0ZsYWdzICkKIHsKLSAgICBCT09MMzIgICAgYlJldCA9IEZBTFNFOwotICAgIE1FTlVJVEVNICppdGVtLCAqZmlyc3QgPSBOVUxMOworICAgIFVJTlQzMiAgICBvbGRmbGFnczsKKyAgICBNRU5VSVRFTSAqaXRlbTsKIAogICAgIFRSQUNFKG1lbnUsIiglMDR4LCAlMDRYLCAlMDRYKSAhXG4iLCAKIAkJIGhNZW51LCB3SXRlbUlELCB3RmxhZ3MpOwogCi0gICAgd2hpbGUoIChpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpICkKLSAgICB7Ci0gICAgICBpZiggKHdGbGFncyAmIE1GX0JZUE9TSVRJT04pIHx8ICEoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCkgKQotICAgICAgewotICAgICAgICAgICAvKiBXZSBjYW4ndCBoYXZlIE1GX0dSQVlFRCBhbmQgTUZfRElTQUJMRUQgdG9nZXRoZXIgKi8KLSAgICAgICAgICAgaWYgKHdGbGFncyAmIE1GX0dSQVlFRCkKLSAgICAgICAgICAgewotICAJICAgICBpdGVtLT5mU3RhdGUgPSAoaXRlbS0+ZlN0YXRlICYgfk1GX0RJU0FCTEVEKSB8IE1GX0dSQVlFRDsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIGlmICh3RmxhZ3MgJiBNRl9ESVNBQkxFRCkKLSAgICAgICAgICAgewotCSAgICAgaXRlbS0+ZlN0YXRlID0gKGl0ZW0tPmZTdGF0ZSAmIH5NRl9HUkFZRUQpIHwgTUZfRElTQUJMRUQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZSAgIC8qIE1GX0VOQUJMRUQgKi8KLSAgICAgICAgICAgewotCSAgICAgaXRlbS0+ZlN0YXRlICY9IH4oTUZfR1JBWUVEIHwgTUZfRElTQUJMRUQpOwotICAgICAgICAgICB9IAotCSAgIGJSZXQgPSBUUlVFOwotCSAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYoICFmaXJzdCApIGZpcnN0ID0gaXRlbTsKLSAgICAgIGVsc2UgaWYoIGZpcnN0ID09IGl0ZW0gKSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGJSZXQ7CisgICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJndJdGVtSUQsIHdGbGFncyApKSkKKwlyZXR1cm4gKFVJTlQzMiktMTsKKworICAgIG9sZGZsYWdzID0gaXRlbS0+ZlN0YXRlICYgKE1GX0dSQVlFRCB8IE1GX0RJU0FCTEVEKTsKKyAgICBpdGVtLT5mU3RhdGUgXj0gKG9sZGZsYWdzIF4gd0ZsYWdzKSAmIChNRl9HUkFZRUQgfCBNRl9ESVNBQkxFRCk7CisgICAgcmV0dXJuIG9sZGZsYWdzOwogfQogCiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Njcm9sbC5jIGIvY29udHJvbHMvc2Nyb2xsLmMKaW5kZXggNGY4NDRjZi4uMGNhZGUwMSAxMDA2NDQKLS0tIGEvY29udHJvbHMvc2Nyb2xsLmMKKysrIGIvY29udHJvbHMvc2Nyb2xsLmMKQEAgLTQ2LDYgKzQ2LDkgQEAKICAgLyogTWluaW11bSBzaXplIG9mIHRoZSB0aHVtYiBpbiBwaXhlbHMgKi8KICNkZWZpbmUgU0NST0xMX01JTl9USFVNQiA2CiAKKyAgLyogT3ZlcmxhcCBiZXR3ZWVuIGFycm93cyBhbmQgdGh1bWIgKi8KKyNkZWZpbmUgU0NST0xMX0FSUk9XX1RIVU1CX09WRVJMQVAgMQorCiAgIC8qIERlbGF5IChpbiBtcykgYmVmb3JlIGZpcnN0IHJlcGV0aXRpb24gd2hlbiBob2xkaW5nIHRoZSBidXR0b24gZG93biAqLwogI2RlZmluZSBTQ1JPTExfRklSU1RfREVMQVkgICAyMDAKIApAQCAtMTU5LDE4ICsxNjIsMjggQEAKICAgICBzd2l0Y2gobkJhcikKICAgICB7CiAgICAgICBjYXNlIFNCX0hPUlo6Ci0gICAgICAgIGxwcmVjdC0+bGVmdCAgID0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQgLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCAtIDE7CisgICAgICAgIGxwcmVjdC0+bGVmdCAgID0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQgLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKICAgICAgICAgbHByZWN0LT50b3AgICAgPSB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0gd25kUHRyLT5yZWN0V2luZG93LnRvcDsKLSAgICAgICAgbHByZWN0LT5yaWdodCAgPSB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCArMTsKLSAgICAgICAgbHByZWN0LT5ib3R0b20gPSBscHJlY3QtPnRvcCArIFNZU01FVFJJQ1NfQ1lIU0NST0xMICsgMTsKKyAgICAgICAgbHByZWN0LT5yaWdodCAgPSB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKKyAgICAgICAgbHByZWN0LT5ib3R0b20gPSBscHJlY3QtPnRvcCArIFNZU01FVFJJQ1NfQ1lIU0NST0xMOworCWlmKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0JPUkRFUikgeworCSAgbHByZWN0LT5sZWZ0LS07CisJICBscHJlY3QtPnJpZ2h0Kys7CisJfSBlbHNlIGlmKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZTQ1JPTEwpCisJICBscHJlY3QtPnJpZ2h0Kys7CiAgICAgICAgIHZlcnRpY2FsID0gRkFMU0U7CiAJYnJlYWs7CiAKICAgICAgIGNhc2UgU0JfVkVSVDoKICAgICAgICAgbHByZWN0LT5sZWZ0ICAgPSB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKLSAgICAgICAgbHByZWN0LT50b3AgICAgPSB3bmRQdHItPnJlY3RDbGllbnQudG9wIC0gd25kUHRyLT5yZWN0V2luZG93LnRvcCAtIDE7Ci0gICAgICAgIGxwcmVjdC0+cmlnaHQgID0gbHByZWN0LT5sZWZ0ICsgU1lTTUVUUklDU19DWFZTQ1JPTEwgKyAxOwotICAgICAgICBscHJlY3QtPmJvdHRvbSA9IHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20gLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wICsxOworICAgICAgICBscHJlY3QtPnRvcCAgICA9IHduZFB0ci0+cmVjdENsaWVudC50b3AgLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wOworICAgICAgICBscHJlY3QtPnJpZ2h0ICA9IGxwcmVjdC0+bGVmdCArIFNZU01FVFJJQ1NfQ1hWU0NST0xMOworICAgICAgICBscHJlY3QtPmJvdHRvbSA9IHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20gLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wOworCWlmKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0JPUkRFUikgeworCSAgbHByZWN0LT50b3AtLTsKKwkgIGxwcmVjdC0+Ym90dG9tKys7CisJfSBlbHNlIGlmKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0hTQ1JPTEwpCisJICBscHJlY3QtPmJvdHRvbSsrOwogICAgICAgICB2ZXJ0aWNhbCA9IFRSVUU7CiAJYnJlYWs7CiAKQEAgLTE5OSw3ICsyMTIsNyBAQAogICAgICAgICBTQ1JPTExCQVJfSU5GTyAqaW5mbyA9IFNDUk9MTF9HZXRQdHJTY3JvbGxJbmZvKCB3bmRQdHIsIG5CYXIgKTsKIAogICAgICAgICAqYXJyb3dTaXplID0gU1lTTUVUUklDU19DWFZTQ1JPTEw7Ci0gICAgICAgIHBpeGVscyAtPSAyICogU1lTTUVUUklDU19DWFZTQ1JPTEw7CisgICAgICAgIHBpeGVscyAtPSAoMiAqIChTWVNNRVRSSUNTX0NYVlNDUk9MTCAtIFNDUk9MTF9BUlJPV19USFVNQl9PVkVSTEFQKSk7CiAKICAgICAgICAgaWYgKGluZm8tPlBhZ2UpCiAgICAgICAgIHsKQEAgLTIwOCw3ICsyMjEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UgKnRodW1iU2l6ZSA9IFNZU01FVFJJQ1NfQ1hWU0NST0xMOwogCi0gICAgICAgIGlmICgoKHBpeGVscyAtPSAqdGh1bWJTaXplICsgMSkgPCAwKSB8fAorICAgICAgICBpZiAoKChwaXhlbHMgLT0gKnRodW1iU2l6ZSApIDwgMCkgfHwKICAgICAgICAgICAgICgoaW5mby0+ZmxhZ3MgJiBFU0JfRElTQUJMRV9CT1RIKSA9PSBFU0JfRElTQUJMRV9CT1RIKSkKICAgICAgICAgewogICAgICAgICAgICAgLyogUmVjdGFuZ2xlIHRvbyBzbWFsbCBvciBzY3JvbGxiYXIgZGlzYWJsZWQgLT4gbm8gdGh1bWIgKi8KQEAgLTIxOCwxMCArMjMxLDEwIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElOVDMyIG1heCA9IGluZm8tPk1heFZhbCAtIE1BWCggaW5mby0+UGFnZS0xLCAwICk7CiAgICAgICAgICAgICBpZiAoaW5mby0+TWluVmFsID49IG1heCkKLSAgICAgICAgICAgICAgICAqdGh1bWJQb3MgPSAqYXJyb3dTaXplOworICAgICAgICAgICAgICAgICp0aHVtYlBvcyA9ICphcnJvd1NpemUgLSBTQ1JPTExfQVJST1dfVEhVTUJfT1ZFUkxBUDsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqdGh1bWJQb3MgPSAqYXJyb3dTaXplICsgcGl4ZWxzICogKGluZm8tPkN1clZhbC1pbmZvLT5NaW5WYWwpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heCAtIGluZm8tPk1pblZhbCk7CisgICAgICAgICAgICAgICAgKnRodW1iUG9zID0gKmFycm93U2l6ZSAtIFNDUk9MTF9BUlJPV19USFVNQl9PVkVSTEFQCisJCSArIHBpeGVscyAqIChpbmZvLT5DdXJWYWwtaW5mby0+TWluVmFsKSAvIChtYXggLSBpbmZvLT5NaW5WYWwpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiB2ZXJ0aWNhbDsKQEAgLTI0MCw3ICsyNTMsOCBAQAogICAgIElOVDMyIHRodW1iU2l6ZTsKICAgICBJTlQzMiBwaXhlbHMgPSB2ZXJ0aWNhbCA/IHJlY3QtPmJvdHRvbS1yZWN0LT50b3AgOiByZWN0LT5yaWdodC1yZWN0LT5sZWZ0OwogCi0gICAgaWYgKChwaXhlbHMgLT0gMipTWVNNRVRSSUNTX0NYVlNDUk9MTCkgPD0gMCkgcmV0dXJuIGluZm9QdHItPk1pblZhbDsKKyAgICBpZiAoKHBpeGVscyAtPSAyKihTWVNNRVRSSUNTX0NYVlNDUk9MTCAtIFNDUk9MTF9BUlJPV19USFVNQl9PVkVSTEFQKSkgPD0gMCkKKyAgICAgICAgcmV0dXJuIGluZm9QdHItPk1pblZhbDsKIAogICAgIGlmIChpbmZvUHRyLT5QYWdlKQogICAgIHsKQEAgLTI0OSw5ICsyNjMsOSBAQAogICAgIH0KICAgICBlbHNlIHRodW1iU2l6ZSA9IFNZU01FVFJJQ1NfQ1hWU0NST0xMOwogCi0gICAgaWYgKChwaXhlbHMgLT0gdGh1bWJTaXplICsgMSkgPD0gMCkgcmV0dXJuIGluZm9QdHItPk1pblZhbDsKKyAgICBpZiAoKHBpeGVscyAtPSB0aHVtYlNpemUpIDw9IDApIHJldHVybiBpbmZvUHRyLT5NaW5WYWw7CiAKLSAgICBwb3MgPSBNQVgoIDAsIHBvcyAtIFNZU01FVFJJQ1NfQ1hWU0NST0xMICk7CisgICAgcG9zID0gTUFYKCAwLCBwb3MgLSAoU1lTTUVUUklDU19DWFZTQ1JPTEwgLSBTQ1JPTExfQVJST1dfVEhVTUJfT1ZFUkxBUCkgKTsKICAgICBpZiAocG9zID4gcGl4ZWxzKSBwb3MgPSBwaXhlbHM7CiAKICAgICBpZiAoIWluZm9QdHItPlBhZ2UpIHBvcyAqPSBpbmZvUHRyLT5NYXhWYWwgLSBpbmZvUHRyLT5NaW5WYWw7CkBAIC0yNzcsMjIgKzI5MSwyMiBAQAogCiAgICAgaWYgKHZlcnRpY2FsKQogICAgIHsKLSAgICAgICAgaWYgKHB0LnkgPD0gcmVjdC50b3AgKyBhcnJvd1NpemUgKyAxKSByZXR1cm4gU0NST0xMX1RPUF9BUlJPVzsKKyAgICAgICAgaWYgKHB0LnkgPCByZWN0LnRvcCArIGFycm93U2l6ZSkgcmV0dXJuIFNDUk9MTF9UT1BfQVJST1c7CiAgICAgICAgIGlmIChwdC55ID49IHJlY3QuYm90dG9tIC0gYXJyb3dTaXplKSByZXR1cm4gU0NST0xMX0JPVFRPTV9BUlJPVzsKICAgICAgICAgaWYgKCF0aHVtYlBvcykgcmV0dXJuIFNDUk9MTF9UT1BfUkVDVDsKICAgICAgICAgcHQueSAtPSByZWN0LnRvcDsKICAgICAgICAgaWYgKHB0LnkgPCB0aHVtYlBvcykgcmV0dXJuIFNDUk9MTF9UT1BfUkVDVDsKLSAgICAgICAgaWYgKHB0LnkgPiB0aHVtYlBvcyArIHRodW1iU2l6ZSkgcmV0dXJuIFNDUk9MTF9CT1RUT01fUkVDVDsKKyAgICAgICAgaWYgKHB0LnkgPj0gdGh1bWJQb3MgKyB0aHVtYlNpemUpIHJldHVybiBTQ1JPTExfQk9UVE9NX1JFQ1Q7CiAgICAgICAgIHJldHVybiBTQ1JPTExfVEhVTUI7CiAgICAgfQogICAgIGVsc2UgIC8qIGhvcml6b250YWwgKi8KICAgICB7Ci0gICAgICAgIGlmIChwdC54IDw9IHJlY3QubGVmdCArIGFycm93U2l6ZSkgcmV0dXJuIFNDUk9MTF9UT1BfQVJST1c7CisgICAgICAgIGlmIChwdC54IDwgcmVjdC5sZWZ0ICsgYXJyb3dTaXplKSByZXR1cm4gU0NST0xMX1RPUF9BUlJPVzsKICAgICAgICAgaWYgKHB0LnggPj0gcmVjdC5yaWdodCAtIGFycm93U2l6ZSkgcmV0dXJuIFNDUk9MTF9CT1RUT01fQVJST1c7CiAgICAgICAgIGlmICghdGh1bWJQb3MpIHJldHVybiBTQ1JPTExfVE9QX1JFQ1Q7CiAgICAgICAgIHB0LnggLT0gcmVjdC5sZWZ0OwogICAgICAgICBpZiAocHQueCA8IHRodW1iUG9zKSByZXR1cm4gU0NST0xMX1RPUF9SRUNUOwotICAgICAgICBpZiAocHQueCA+IHRodW1iUG9zICsgdGh1bWJTaXplKSByZXR1cm4gU0NST0xMX0JPVFRPTV9SRUNUOworICAgICAgICBpZiAocHQueCA+PSB0aHVtYlBvcyArIHRodW1iU2l6ZSkgcmV0dXJuIFNDUk9MTF9CT1RUT01fUkVDVDsKICAgICAgICAgcmV0dXJuIFNDUk9MTF9USFVNQjsKICAgICB9CiB9CkBAIC0zMTMsMjYgKzMyNywyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBMRUZUX0FSUk9XKGluZm9QdHItPmZsYWdzLCB0b3BfcHJlc3NlZCkpOwogICAgIFNldFN0cmV0Y2hCbHRNb2RlMzIoIGhkYywgU1RSRVRDSF9ERUxFVEVTQ0FOUyApOwogICAgIFN0cmV0Y2hCbHQzMiggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCi0gICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCA/IHJlY3QtPnJpZ2h0LXJlY3QtPmxlZnQgOiBhcnJvd1NpemUrMSwKLSAgICAgICAgICAgICAgICAgIHZlcnRpY2FsID8gYXJyb3dTaXplKzEgOiByZWN0LT5ib3R0b20tcmVjdC0+dG9wLAorICAgICAgICAgICAgICAgICAgdmVydGljYWwgPyByZWN0LT5yaWdodC1yZWN0LT5sZWZ0IDogYXJyb3dTaXplLAorICAgICAgICAgICAgICAgICAgdmVydGljYWwgPyBhcnJvd1NpemUgOiByZWN0LT5ib3R0b20tcmVjdC0+dG9wLAogICAgICAgICAgICAgICAgICAgaGRjTWVtLCAwLCAwLAotICAgICAgICAgICAgICAgICAgU1lTTUVUUklDU19DWFZTQ1JPTEwgKyAxLCBTWVNNRVRSSUNTX0NZSFNDUk9MTCArIDEsCisgICAgICAgICAgICAgICAgICBTWVNNRVRSSUNTX0NYVlNDUk9MTCwgU1lTTUVUUklDU19DWUhTQ1JPTEwsCiAgICAgICAgICAgICAgICAgICBTUkNDT1BZICk7CiAKICAgICBTZWxlY3RPYmplY3QzMiggaGRjTWVtLCB2ZXJ0aWNhbCA/CiAgICAgICAgICAgICAgICAgICAgIEJPVFRPTV9BUlJPVyggaW5mb1B0ci0+ZmxhZ3MsIGJvdHRvbV9wcmVzc2VkICkKICAgICAgICAgICAgICAgICAgICAgOiBSSUdIVF9BUlJPVyggaW5mb1B0ci0+ZmxhZ3MsIGJvdHRvbV9wcmVzc2VkICkgKTsKICAgICBpZiAodmVydGljYWwpCi0gICAgICAgIFN0cmV0Y2hCbHQzMiggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSBhcnJvd1NpemUgLSAxLAotICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgYXJyb3dTaXplICsgMSwKKyAgICAgICAgU3RyZXRjaEJsdDMyKCBoZGMsIHJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbSAtIGFycm93U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQsIGFycm93U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICBoZGNNZW0sIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgU1lTTUVUUklDU19DWFZTQ1JPTEwgKyAxLCBTWVNNRVRSSUNTX0NZSFNDUk9MTCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgU1lTTUVUUklDU19DWFZTQ1JPTEwsIFNZU01FVFJJQ1NfQ1lIU0NST0xMLAogICAgICAgICAgICAgICAgICAgICAgIFNSQ0NPUFkgKTsKICAgICBlbHNlCi0gICAgICAgIFN0cmV0Y2hCbHQzMiggaGRjLCByZWN0LT5yaWdodCAtIGFycm93U2l6ZSAtIDEsIHJlY3QtPnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICBhcnJvd1NpemUgKyAxLCByZWN0LT5ib3R0b20gLSByZWN0LT50b3AsCisgICAgICAgIFN0cmV0Y2hCbHQzMiggaGRjLCByZWN0LT5yaWdodCAtIGFycm93U2l6ZSwgcmVjdC0+dG9wLAorICAgICAgICAgICAgICAgICAgICAgIGFycm93U2l6ZSwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wLAogICAgICAgICAgICAgICAgICAgICAgIGhkY01lbSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICBTWVNNRVRSSUNTX0NYVlNDUk9MTCArIDEsIFNZU01FVFJJQ1NfQ1lIU0NST0xMICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICBTWVNNRVRSSUNTX0NYVlNDUk9MTCwgU1lTTUVUUklDU19DWUhTQ1JPTEwsCiAgICAgICAgICAgICAgICAgICAgICAgU1JDQ09QWSApOwogICAgIFNlbGVjdE9iamVjdDMyKCBoZGNNZW0sIGhibXBQcmV2ICk7CiAgICAgRGVsZXRlREMzMiggaGRjTWVtICk7CkBAIC0zNTEsMjAgKzM2NSwyNSBAQAogICAgIGlmICh2ZXJ0aWNhbCkKICAgICB7CiAgICAgICAgIHIudG9wICs9IFNDUk9MTF9UcmFja2luZ1BvczsKLSAgICAgICAgaWYgKHIudG9wIDwgcmVjdC0+dG9wICsgYXJyb3dTaXplKSByLnRvcCA9IHJlY3QtPnRvcCArIGFycm93U2l6ZTsKLSAgICAgICAgaWYgKHIudG9wICsgdGh1bWJTaXplID49IHJlY3QtPmJvdHRvbSAtIGFycm93U2l6ZSkKLSAgICAgICAgICAgIHIudG9wID0gcmVjdC0+Ym90dG9tIC0gYXJyb3dTaXplIC0gdGh1bWJTaXplIC0gMTsKLSAgICAgICAgci5ib3R0b20gPSByLnRvcCArIHRodW1iU2l6ZSArIDE7CisgICAgICAgIGlmIChyLnRvcCA8IHJlY3QtPnRvcCArIGFycm93U2l6ZSAtIFNDUk9MTF9BUlJPV19USFVNQl9PVkVSTEFQKQorCSAgICByLnRvcCA9IHJlY3QtPnRvcCArIGFycm93U2l6ZSAtIFNDUk9MTF9BUlJPV19USFVNQl9PVkVSTEFQOworICAgICAgICBpZiAoci50b3AgKyB0aHVtYlNpemUgPgorCSAgICAgICAgICAgICAgIHJlY3QtPmJvdHRvbSAtIChhcnJvd1NpemUgLSBTQ1JPTExfQVJST1dfVEhVTUJfT1ZFUkxBUCkpCisgICAgICAgICAgICByLnRvcCA9IHJlY3QtPmJvdHRvbSAtIChhcnJvd1NpemUgLSBTQ1JPTExfQVJST1dfVEhVTUJfT1ZFUkxBUCkKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aHVtYlNpemU7CisgICAgICAgIHIuYm90dG9tID0gci50b3AgKyB0aHVtYlNpemU7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgIHIubGVmdCArPSBTQ1JPTExfVHJhY2tpbmdQb3M7Ci0gICAgICAgIGlmIChyLmxlZnQgPCByZWN0LT5sZWZ0ICsgYXJyb3dTaXplKSByLmxlZnQgPSByZWN0LT5sZWZ0ICsgYXJyb3dTaXplOwotICAgICAgICBpZiAoci5sZWZ0ICsgdGh1bWJTaXplID49IHJlY3QtPnJpZ2h0IC0gYXJyb3dTaXplKQotICAgICAgICAgICAgci5sZWZ0ID0gcmVjdC0+cmlnaHQgLSBhcnJvd1NpemUgLSB0aHVtYlNpemUgLSAxOwotICAgICAgICByLnJpZ2h0ID0gci5sZWZ0ICsgdGh1bWJTaXplICsgMTsKKyAgICAgICAgaWYgKHIubGVmdCA8IHJlY3QtPmxlZnQgKyBhcnJvd1NpemUgLSBTQ1JPTExfQVJST1dfVEhVTUJfT1ZFUkxBUCkKKwkgICAgci5sZWZ0ID0gcmVjdC0+bGVmdCArIGFycm93U2l6ZSAtIFNDUk9MTF9BUlJPV19USFVNQl9PVkVSTEFQOworICAgICAgICBpZiAoci5sZWZ0ICsgdGh1bWJTaXplID4KKwkgICAgICAgICAgICAgICByZWN0LT5yaWdodCAtIChhcnJvd1NpemUgLSBTQ1JPTExfQVJST1dfVEhVTUJfT1ZFUkxBUCkpCisgICAgICAgICAgICByLmxlZnQgPSByZWN0LT5yaWdodCAtIChhcnJvd1NpemUgLSBTQ1JPTExfQVJST1dfVEhVTUJfT1ZFUkxBUCkgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGh1bWJTaXplOworICAgICAgICByLnJpZ2h0ID0gci5sZWZ0ICsgdGh1bWJTaXplOwogICAgIH0KLSAgICBJbmZsYXRlUmVjdDMyKCAmciwgLTEsIC0xICk7CiAgICAgRHJhd0ZvY3VzUmVjdDMyKCBoZGMsICZyICk7CiAgICAgU0NST0xMX01vdmluZ1RodW1iID0gIVNDUk9MTF9Nb3ZpbmdUaHVtYjsKIH0KQEAgLTQwNywxNSArNDI2LDEzIEBACiAgICAgciA9ICpyZWN0OwogICAgIGlmICh2ZXJ0aWNhbCkKICAgICB7Ci0gICAgICAgIHIudG9wICAgICs9IGFycm93U2l6ZSAtIDE7Ci0gICAgICAgIHIuYm90dG9tIC09IGFycm93U2l6ZTsKLQlyLnJpZ2h0LS07CisgICAgICAgIHIudG9wICAgICs9IGFycm93U2l6ZSAtIFNDUk9MTF9BUlJPV19USFVNQl9PVkVSTEFQOworICAgICAgICByLmJvdHRvbSAtPSAoYXJyb3dTaXplIC0gU0NST0xMX0FSUk9XX1RIVU1CX09WRVJMQVApOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICByLmxlZnQgICs9IGFycm93U2l6ZSAtIDE7Ci0gICAgICAgIHIucmlnaHQgLT0gYXJyb3dTaXplOwotCXIuYm90dG9tLS07CisgICAgICAgIHIubGVmdCAgKz0gYXJyb3dTaXplIC0gU0NST0xMX0FSUk9XX1RIVU1CX09WRVJMQVA7CisgICAgICAgIHIucmlnaHQgLT0gKGFycm93U2l6ZSAtIFNDUk9MTF9BUlJPV19USFVNQl9PVkVSTEFQKTsKICAgICB9CiAKICAgICAgIC8qIERyYXcgdGhlIHNjcm9sbCBiYXIgZnJhbWUgKi8KQEAgLTQzNSwyNyArNDUyLDI3IEBACiAgICAgewogICAgICAgICBQYXRCbHQzMiggaGRjLCByLmxlZnQgKyAxLCByLnRvcCArIDEsCiAgICAgICAgICAgICAgICAgICByLnJpZ2h0IC0gci5sZWZ0IC0gMiwKLSAgICAgICAgICAgICAgICAgIHRodW1iUG9zIC0gYXJyb3dTaXplLAorICAgICAgICAgICAgICAgICAgdGh1bWJQb3MgLSAoYXJyb3dTaXplIC0gU0NST0xMX0FSUk9XX1RIVU1CX09WRVJMQVApIC0gMSwKICAgICAgICAgICAgICAgICAgIHRvcF9zZWxlY3RlZCA/IDB4MGYwMDAwIDogUEFUQ09QWSApOwotICAgICAgICByLnRvcCArPSB0aHVtYlBvcyAtIGFycm93U2l6ZTsKLSAgICAgICAgUGF0Qmx0MzIoIGhkYywgci5sZWZ0ICsgMSwgci50b3AgKyB0aHVtYlNpemUgKyAxLAorICAgICAgICByLnRvcCArPSB0aHVtYlBvcyAtIChhcnJvd1NpemUgLSBTQ1JPTExfQVJST1dfVEhVTUJfT1ZFUkxBUCk7CisgICAgICAgIFBhdEJsdDMyKCBoZGMsIHIubGVmdCArIDEsIHIudG9wICsgdGh1bWJTaXplLAogICAgICAgICAgICAgICAgICAgci5yaWdodCAtIHIubGVmdCAtIDIsCi0gICAgICAgICAgICAgICAgICByLmJvdHRvbSAtIHIudG9wIC0gdGh1bWJTaXplIC0gMiwKKyAgICAgICAgICAgICAgICAgIHIuYm90dG9tIC0gci50b3AgLSB0aHVtYlNpemUgLSAxLAogICAgICAgICAgICAgICAgICAgYm90dG9tX3NlbGVjdGVkID8gMHgwZjAwMDAgOiBQQVRDT1BZICk7Ci0gICAgICAgIHIuYm90dG9tID0gci50b3AgKyB0aHVtYlNpemUgKyAyOworICAgICAgICByLmJvdHRvbSA9IHIudG9wICsgdGh1bWJTaXplOwogICAgIH0KICAgICBlbHNlICAvKiBob3Jpem9udGFsICovCiAgICAgewogICAgICAgICBQYXRCbHQzMiggaGRjLCByLmxlZnQgKyAxLCByLnRvcCArIDEsCi0gICAgICAgICAgICAgICAgICB0aHVtYlBvcyAtIGFycm93U2l6ZSwKKyAgICAgICAgICAgICAgICAgIHRodW1iUG9zIC0gKGFycm93U2l6ZSAtIFNDUk9MTF9BUlJPV19USFVNQl9PVkVSTEFQKSAtIDEsCiAgICAgICAgICAgICAgICAgICByLmJvdHRvbSAtIHIudG9wIC0gMiwKICAgICAgICAgICAgICAgICAgIHRvcF9zZWxlY3RlZCA/IDB4MGYwMDAwIDogUEFUQ09QWSApOwotICAgICAgICByLmxlZnQgKz0gdGh1bWJQb3MgLSBhcnJvd1NpemU7Ci0gICAgICAgIFBhdEJsdDMyKCBoZGMsIHIubGVmdCArIHRodW1iU2l6ZSArIDEsIHIudG9wICsgMSwKLSAgICAgICAgICAgICAgICAgIHIucmlnaHQgLSByLmxlZnQgLSB0aHVtYlNpemUgLSAyLAorICAgICAgICByLmxlZnQgKz0gdGh1bWJQb3MgLSAoYXJyb3dTaXplIC0gU0NST0xMX0FSUk9XX1RIVU1CX09WRVJMQVApOworICAgICAgICBQYXRCbHQzMiggaGRjLCByLmxlZnQgKyB0aHVtYlNpemUsIHIudG9wICsgMSwKKyAgICAgICAgICAgICAgICAgIHIucmlnaHQgLSByLmxlZnQgLSB0aHVtYlNpemUgLSAxLAogICAgICAgICAgICAgICAgICAgci5ib3R0b20gLSByLnRvcCAtIDIsCiAgICAgICAgICAgICAgICAgICBib3R0b21fc2VsZWN0ZWQgPyAweDBmMDAwMCA6IFBBVENPUFkgKTsKLSAgICAgICAgci5yaWdodCA9IHIubGVmdCArIHRodW1iU2l6ZSArIDI7CisgICAgICAgIHIucmlnaHQgPSByLmxlZnQgKyB0aHVtYlNpemU7CiAgICAgfQogCiAgICAgICAvKiBEcmF3IHRoZSB0aHVtYiAqLwpAQCAtNDkzLDYgKzUxMCw3IEBACiAKICAgICB2ZXJ0aWNhbCA9IFNDUk9MTF9HZXRTY3JvbGxCYXJSZWN0KCBod25kLCBuQmFyLCAmcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJyb3dTaXplLCAmdGh1bWJTaXplLCAmdGh1bWJQb3MgKTsKKwogICAgICAgLyogRHJhdyB0aGUgYXJyb3dzICovCiAKICAgICBpZiAoYXJyb3dzICYmIGFycm93U2l6ZSkgU0NST0xMX0RyYXdBcnJvd3MoIGhkYywgaW5mb1B0ciwgJnJlY3QsIGFycm93U2l6ZSwKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3N0YXR1cy5jIGIvY29udHJvbHMvc3RhdHVzLmMKaW5kZXggYTI0YTQ3Yi4uNmRmMzliMCAxMDA2NDQKLS0tIGEvY29udHJvbHMvc3RhdHVzLmMKKysrIGIvY29udHJvbHMvc3RhdHVzLmMKQEAgLTEwMyw5ICsxMDMsMTkgQEAKICAgICAvKiBub3cgZHJhdyB0ZXh0ICovCiAgICAgaWYgKHRleHQpIHsKICAgICAgIGludCBvbGRia21vZGUgPSBTZXRCa01vZGUzMihoZGMsIFRSQU5TUEFSRU5UKTsKKyAgICAgIExQU1RSIHAgPSB0ZXh0OworICAgICAgVUlOVDMyIGFsaWduID0gRFRfTEVGVDsKKyAgICAgIGlmICgqcCA9PSAnXHQnKSB7CisJcCsrOworCWFsaWduID0gRFRfQ0VOVEVSOworCisJaWYgKCpwID09ICdcdCcpIHsKKwkgIHArKzsKKwkgIGFsaWduID0gRFRfUklHSFQ7CisJfQorICAgICAgfQogICAgICAgci5sZWZ0ICs9IDM7Ci0gICAgICBEcmF3VGV4dDMyQShoZGMsIHRleHQsIGxzdHJsZW4zMkEodGV4dCksCi0JCSAgJnIsIERUX0xFRlR8RFRfVkNFTlRFUnxEVF9TSU5HTEVMSU5FKTsgIAorICAgICAgRHJhd1RleHQzMkEoaGRjLCBwLCBsc3RybGVuMzJBKHApLCAmciwgYWxpZ258RFRfVkNFTlRFUnxEVF9TSU5HTEVMSU5FKTsKICAgICAgIGlmIChvbGRia21vZGUgIT0gVFJBTlNQQVJFTlQpCiAJU2V0QmtNb2RlMzIoaGRjLCBvbGRia21vZGUpOwogICAgIH0KQEAgLTExOCw2ICsxMjgsNyBAQAogICAgIGludCAgICAgIGk7CiAgICAgUkVDVDMyICAgcmVjdDsKICAgICBIQlJVU0gzMiBoYnJCazsKKyAgICBIRk9OVDMyIGhPbGRGb250OwogICAgIFdORCAqd25kUHRyOwogCiAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CkBAIC0xMzQsNiArMTQ1LDggQEAKIAloYnJCayA9IEdldFN5c0NvbG9yQnJ1c2gzMiAoQ09MT1JfM0RGQUNFKTsKICAgICBGaWxsUmVjdDMyKGhkYywgJnJlY3QsIGhickJrKTsKIAorICAgIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0MzIgKGhkYywgc2VsZi0+aEZvbnQgPyBzZWxmLT5oRm9udCA6IHNlbGYtPmhEZWZhdWx0Rm9udCk7CisKICAgICBpZiAoc2VsZi0+c2ltcGxlKSB7CiAJU0JfRHJhd1BhcnQgKGhkYywKIAkJICAgICAmc2VsZi0+cGFydDAuYm91bmQsCkBAIC0xNjUsNiArMTc4LDggQEAKIAl9CiAgICAgfQogCisgICAgU2VsZWN0T2JqZWN0MzIgKGhkYywgaE9sZEZvbnQpOworCiAgICAgaWYgKHNlbGYtPmNsckJrICE9IENMUl9ERUZBVUxUKQogCURlbGV0ZU9iamVjdDMyIChoYnJCayk7CiAKQEAgLTI1Miw2ICsyNjcsNyBAQAogCX0KICAgICB9CiAgICAgSW52YWxpZGF0ZVJlY3QzMihod25kLCAmcGFydC0+Ym91bmQsIEZBTFNFKTsKKy8vICAgIFNXX1JlZnJlc2hQYXJ0IChoZGMsIHBhcnQpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0zMjAsOSArMzM2LDEwIEBACiBzdGF0aWMgTFJFU1VMVAogU1dfQ3JlYXRlKEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0gICAgUkVDVDMyCXJlY3Q7CiAgICAgTFBDUkVBVEVTVFJVQ1QzMkEgbHBDcmVhdGUgPSAoTFBDUkVBVEVTVFJVQ1QzMkEpIGxQYXJhbTsKLSAgICBpbnQJaGVpZ2h0LCB3aWR0aCwgbGVuOworICAgIE5PTkNMSUVOVE1FVFJJQ1MzMkEgbmNsbTsKKyAgICBSRUNUMzIJcmVjdDsKKyAgICBpbnQJICAgICAgICB3aWR0aCwgbGVuOwogICAgIEhEQzMyCWhkYzsKICAgICBIV05EMzIJcGFyZW50OwogICAgIFdORCAqd25kUHRyOwpAQCAtMzMxLDcgKzM0OCw2IEBACiAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CiAgICAgc2VsZiA9IChTVEFUVVNXSU5ET1dJTkZPKilIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksCiAJCQkJCSBzaXplb2YoU1RBVFVTV0lORE9XSU5GTykpOwotCiAgICAgd25kUHRyLT53RXh0cmFbMF0gPSAoRFdPUkQpc2VsZjsKIAogICAgIHNlbGYtPm51bVBhcnRzID0gMTsKQEAgLTM0MSw2ICszNTcsMTAgQEAKICAgICBzZWxmLT5oRm9udCA9IDA7CiAgICAgR2V0Q2xpZW50UmVjdDMyKGh3bmQsICZyZWN0KTsKIAorICAgIG5jbG0uY2JTaXplID0gc2l6ZW9mKE5PTkNMSUVOVE1FVFJJQ1MzMkEpOworICAgIFN5c3RlbVBhcmFtZXRlcnNJbmZvMzJBIChTUElfR0VUTk9OQ0xJRU5UTUVUUklDUywgMCwgJm5jbG0sIDApOworICAgIHNlbGYtPmhEZWZhdWx0Rm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdDMyQSAoJm5jbG0ubGZTdGF0dXNGb250KTsKKwogICAgIC8qIGluaXRpYWxpemUgc2ltcGxlIGNhc2UgKi8KICAgICBzZWxmLT5wYXJ0MC5ib3VuZCA9IHJlY3Q7CiAgICAgc2VsZi0+cGFydDAudGV4dCA9IDA7CkBAIC0zNjIsMTEgKzM4MiwxNCBAQAogICAgICAgICBsc3RyY3B5MzJBIChzZWxmLT5wYXJ0c1swXS50ZXh0LCBscENyZWF0ZS0+bHBzek5hbWUpOwogICAgIH0KIAotICAgIGhlaWdodCA9IDIwOwogICAgIGlmICgoaGRjID0gR2V0REMzMiAoMCkpKSB7CiAJVEVYVE1FVFJJQzMyQSB0bTsKKwlIRk9OVDMyIGhPbGRGb250OworCisJaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QzMiAoaGRjLHNlbGYtPmhEZWZhdWx0Rm9udCk7CiAJR2V0VGV4dE1ldHJpY3MzMkEoaGRjLCAmdG0pOwogCXNlbGYtPnRleHRIZWlnaHQgPSB0bS50bUhlaWdodDsKKwlTZWxlY3RPYmplY3QzMiAoaGRjLCBoT2xkRm9udCk7CiAJUmVsZWFzZURDMzIoMCwgaGRjKTsKICAgICB9CiAKQEAgLTU1NCw2ICs1NzcsMTEgQEAKICAgICBpZiAoc2VsZi0+cGFydDAudGV4dCAmJiAoc2VsZi0+cGFydDAuc3R5bGUgIT0gU0JUX09XTkVSRFJBVykpCiAJSGVhcEZyZWUoU3lzdGVtSGVhcCwgMCwgc2VsZi0+cGFydDAudGV4dCk7CiAgICAgSGVhcEZyZWUoU3lzdGVtSGVhcCwgMCwgc2VsZi0+cGFydHMpOworCisgICAgLyogZGVsZXRlIGRlZmF1bHQgZm9udCAqLworICAgIGlmIChzZWxmLT5oRGVmYXVsdEZvbnQpCisJRGVsZXRlT2JqZWN0MzIgKHNlbGYtPmhEZWZhdWx0Rm9udCk7CisKICAgICBIZWFwRnJlZShTeXN0ZW1IZWFwLCAwLCBzZWxmKTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTY3Myw2ICs3MDEsNyBAQAogICAgICAgICBsc3RyY3B5MzJBIChwYXJ0LT50ZXh0LCAoTFBDU1RSKWxQYXJhbSk7CiAgICAgfQogICAgIEludmFsaWRhdGVSZWN0MzIoaHduZCwgJnBhcnQtPmJvdW5kLCBGQUxTRSk7CisvLyAgICBTV19SZWZyZXNoUGFydCAoaGRjLCBwYXJ0KTsKIAogICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvdG9vbGJhci5jIGIvY29udHJvbHMvdG9vbGJhci5jCmluZGV4IDg2YTFlNmMuLjNjNWQxMzQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3Rvb2xiYXIuYworKysgYi9jb250cm9scy90b29sYmFyLmMKQEAgLTEzLDcgKzEzLDkgQEAKICAqIFRPRE86CiAgKiAgIC0gTWFueSBtZXNzYWdlcy4KICAqICAgLSBBbGwgbm90aWZpY2F0aW9ucy4KLSAqICAgLSBUb29sdGlwIHN1cHBvcnQuCisgKiAgIC0gRml4IFRCX0dFVEJJVE1BUEZMQUdTLgorICogICAtIEZpeCBUQl9HRVRST1dTIGFuZCBUQl9TRVRST1dTLgorICogICAtIFRvb2x0aXAgc3VwcG9ydCAocGFydGlhbGx5KS4KICAqICAgLSBVbmljb2RlIHN1cHBwb3J0LgogICogICAtIEludGVybmFsIENPTU1DVEwzMiBiaXRtYXBzLgogICogICAtIEN1c3RvbWl6ZSBkaWFsb2cuCkBAIC0zMCwxNCArMzIsMTUgQEAKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjb21tY3RybC5oIgorI2luY2x1ZGUgImNhY2hlLmgiCiAjaW5jbHVkZSAidG9vbGJhci5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKLSNkZWZpbmUgU0VQQVJBVE9SX1dJRFRIICAxMgotCisjZGVmaW5lIFNFUEFSQVRPUl9XSURUSCAgOAorI2RlZmluZSBTRVBBUkFUT1JfSEVJR0hUIDUKIAogCiAKQEAgLTYwLDEwICs2MywxNSBAQAogICAgIGVsc2UgewogCWlmICghKGJ0blB0ci0+ZnNTdGF0ZSAmIFRCU1RBVEVfRU5BQkxFRCkpIHsKIAkgICAgLyogYnV0dG9uIGlzIGRpc2FibGVkICovCisJICAgIEhJQ09OMzIgaEljb247CiAJICAgIERyYXdFZGdlMzIgKGhkYywgJnJjLCBFREdFX1JBSVNFRCwKIAkJCUJGX1NPRlQgfCBCRl9SRUNUIHwgQkZfTUlERExFIHwgQkZfQURKVVNUKTsKLQkgICAgSW1hZ2VMaXN0X0RyYXcgKGluZm9QdHItPmhpbWxEaXMsIGJ0blB0ci0+aUJpdG1hcCwgaGRjLAotCQkJICAgIHJjLmxlZnQrMiwgcmMudG9wKzIsIElMRF9OT1JNQUwpOworCSAgICBoSWNvbiA9IEltYWdlTGlzdF9HZXRJY29uIChpbmZvUHRyLT5oaW1sRGVmLCBidG5QdHItPmlCaXRtYXAsIElMRF9JTUFHRSk7CisJICAgIERyYXdTdGF0ZTMyQSAoaGRjLCAoSEJSVVNIMzIpTlVMTCwgTlVMTCwgTUFLRUxPTkcoaEljb24sIDApLCAwLAorCQlyYy5sZWZ0KzEsIHJjLnRvcCsxLAorCQlpbmZvUHRyLT5uQml0bWFwV2lkdGgsIGluZm9QdHItPm5CaXRtYXBIZWlnaHQsIERTVF9JQ09OfERTU19ESVNBQkxFRCk7CisvLwkgICAgSW1hZ2VMaXN0X0RyYXcgKGluZm9QdHItPmhpbWxEaXMsIGJ0blB0ci0+aUJpdG1hcCwgaGRjLAorLy8JCQkgICAgcmMubGVmdCsxLCByYy50b3ArMSwgSUxEX05PUk1BTCk7CiAJICAgIHJldHVybjsKIAl9CiAKQEAgLTcyLDE1ICs4MCw0NCBAQAogCSAgICBEcmF3RWRnZTMyIChoZGMsICZyYywgRURHRV9TVU5LRU4sCiAJCQlCRl9SRUNUIHwgQkZfTUlERExFIHwgQkZfQURKVVNUKTsKIAkgICAgSW1hZ2VMaXN0X0RyYXcgKGluZm9QdHItPmhpbWxEZWYsIGJ0blB0ci0+aUJpdG1hcCwgaGRjLAotCQkJICAgIHJjLmxlZnQrMywgcmMudG9wKzMsIElMRF9OT1JNQUwpOworCQkJICAgIHJjLmxlZnQrMiwgcmMudG9wKzIsIElMRF9OT1JNQUwpOwogCSAgICByZXR1cm47CiAJfQotCWVsc2UgewotCSAgICBEcmF3RWRnZTMyIChoZGMsICZyYywgRURHRV9SQUlTRUQsCi0JCQlCRl9TT0ZUIHwgQkZfUkVDVCB8IEJGX01JRERMRSB8IEJGX0FESlVTVCk7CisKKwlpZiAoKGJ0blB0ci0+ZnNTdHlsZSAmIFRCU1RZTEVfQ0hFQ0spICYmCisJICAgIChidG5QdHItPmZzU3RhdGUgJiBUQlNUQVRFX0NIRUNLRUQpKSB7CisJICAgIEhCUlVTSDMyIGhicjsKKwkgICAgRHJhd0VkZ2UzMiAoaGRjLCAmcmMsIEVER0VfU1VOS0VOLAorCQkJQkZfUkVDVCB8IEJGX01JRERMRSB8IEJGX0FESlVTVCk7CisKKwkgICAgaGJyID0gU2VsZWN0T2JqZWN0MzIgKGhkYywgQ0FDSEVfR2V0UGF0dGVybjU1QUFCcnVzaCAoKSk7CisJICAgIFBhdEJsdDMyIChoZGMsIHJjLmxlZnQsIHJjLnRvcCwgcmMucmlnaHQgLSByYy5sZWZ0LAorCQkgICAgICByYy5ib3R0b20gLSByYy50b3AsIDB4MDBGQTAwODkpOworCSAgICBTZWxlY3RPYmplY3QzMiAoaGRjLCBoYnIpOwogCSAgICBJbWFnZUxpc3RfRHJhdyAoaW5mb1B0ci0+aGltbERlZiwgYnRuUHRyLT5pQml0bWFwLCBoZGMsCiAJCQkgICAgcmMubGVmdCsyLCByYy50b3ArMiwgSUxEX05PUk1BTCk7CisJICAgIHJldHVybjsKIAl9CisJCisJaWYgKGJ0blB0ci0+ZnNTdGF0ZSAmIFRCU1RBVEVfSU5ERVRFUk1JTkFURSkgeworCSAgICBIQlJVU0gzMiBoYnI7CisJICAgIERyYXdFZGdlMzIgKGhkYywgJnJjLCBFREdFX1JBSVNFRCwKKwkJCUJGX1NPRlQgfCBCRl9SRUNUIHwgQkZfTUlERExFIHwgQkZfQURKVVNUKTsKKworCSAgICBoYnIgPSBTZWxlY3RPYmplY3QzMiAoaGRjLCBDQUNIRV9HZXRQYXR0ZXJuNTVBQUJydXNoICgpKTsKKwkgICAgUGF0Qmx0MzIgKGhkYywgcmMubGVmdCwgcmMudG9wLCByYy5yaWdodCAtIHJjLmxlZnQsCisJCSAgICAgIHJjLmJvdHRvbSAtIHJjLnRvcCwgMHgwMEZBMDA4OSk7CisJICAgIFNlbGVjdE9iamVjdDMyIChoZGMsIGhicik7CisvLwkgICAgSW1hZ2VMaXN0X0RyYXcgKGluZm9QdHItPmhpbWxEZWYsIGJ0blB0ci0+aUJpdG1hcCwgaGRjLAorLy8JCQkgICAgcmMubGVmdCsxLCByYy50b3ArMSwgSUxEX05PUk1BTCk7CisJICAgIHJldHVybjsKKwl9CisKKwkvKiBub3JtYWwgc3RhdGUgKi8KKwlEcmF3RWRnZTMyIChoZGMsICZyYywgRURHRV9SQUlTRUQsCisJCSAgICBCRl9TT0ZUIHwgQkZfUkVDVCB8IEJGX01JRERMRSB8IEJGX0FESlVTVCk7CisJSW1hZ2VMaXN0X0RyYXcgKGluZm9QdHItPmhpbWxEZWYsIGJ0blB0ci0+aUJpdG1hcCwgaGRjLAorCQkJcmMubGVmdCsxLCByYy50b3ArMSwgSUxEX05PUk1BTCk7CiAgICAgfQogfQogCkBAIC0xMzQsNiArMTcxLDggQEAKIAkgICAgYnRuUHRyLT5yZWN0LnJpZ2h0ID0gYnRuUHRyLT5yZWN0LmxlZnQgKyBpbmZvUHRyLT5uQnV0dG9uV2lkdGg7CiAJcmVjdC5sZWZ0ID0gYnRuUHRyLT5yZWN0LnJpZ2h0OwogICAgIH0KKworICAgIGluZm9QdHItPm5IZWlnaHQgPSByZWN0LmJvdHRvbSArIDg7CiB9CiAKIApAQCAtMTQ5LDEzICsxODgsMTMgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mb1B0ci0+bk51bUJ1dHRvbnM7IGkrKykgewogCWlmIChidG5QdHItPmZzU3R5bGUgJiBUQlNUWUxFX1NFUCkgewogCSAgICBpZiAoUHRJblJlY3QzMiAoJmJ0blB0ci0+cmVjdCwgKmxwUHQpKSB7Ci0vLwkJVFJBQ0UgKHRvb2xiYXIsICIgT04gU0VQQVJBVE9SICVkIVxuIiwgaSk7CisJCVRSQUNFICh0b29sYmFyLCAiIE9OIFNFUEFSQVRPUiAlZCFcbiIsIGkpOwogCQlyZXR1cm4gLWk7CiAJICAgIH0KIAl9CiAJZWxzZSB7CiAJICAgIGlmIChQdEluUmVjdDMyICgmYnRuUHRyLT5yZWN0LCAqbHBQdCkpIHsKLS8vCQlUUkFDRSAodG9vbGJhciwgIiBPTiBCVVRUT04gJWQhXG4iLCBpKTsKKwkJVFJBQ0UgKHRvb2xiYXIsICIgT04gQlVUVE9OICVkIVxuIiwgaSk7CiAJCXJldHVybiBpOwogCSAgICB9CiAKQEAgLTE2NCw3ICsyMDMsNyBAQAogCWJ0blB0cisrOwogICAgIH0KIAotLy8gICAgVFJBQ0UgKHRvb2xiYXIsICIgTk9XSEVSRSFcbiIpOworICAgIFRSQUNFICh0b29sYmFyLCAiIE5PV0hFUkUhXG4iKTsKICAgICByZXR1cm4gLTE7CiB9CiAKQEAgLTE3NywxMCArMjE2LDU5IEBACiAKICAgICBidG5QdHIgPSBpbmZvUHRyLT5idXR0b25zOwogICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvUHRyLT5uTnVtQnV0dG9uczsgaSsrKSB7Ci0JaWYgKGJ0blB0ci0+aWRDb21tYW5kID09IGlkQ29tbWFuZCkKKwlpZiAoYnRuUHRyLT5pZENvbW1hbmQgPT0gaWRDb21tYW5kKSB7CisJICAgIFRSQUNFICh0b29sYmFyLCAiY29tbWFuZD0lZCBpbmRleD0lZFxuIiwgaWRDb21tYW5kLCBpKTsKIAkgICAgcmV0dXJuIGk7CisJfQogCWJ0blB0cisrOwogICAgIH0KKyAgICBUUkFDRSAodG9vbGJhciwgIm5vIGluZGV4IGZvdW5kIGZvciBjb21tYW5kPSVkXG4iLCBpZENvbW1hbmQpOworICAgIHJldHVybiAtMTsKK30KKworCitzdGF0aWMgSU5UMzIKK1RPT0xCQVJfR2V0Q2hlY2tlZEdyb3VwQnV0dG9uSW5kZXggKFRPT0xCQVJfSU5GTyAqaW5mb1B0ciwgSU5UMzIgbkluZGV4KQoreworICAgIFRCVVRUT05fSU5GTyAqYnRuUHRyOworICAgIElOVDMyIG5SdW5JbmRleDsKKworICAgIGlmICgobkluZGV4IDwgMCkgfHwgKG5JbmRleCA+IGluZm9QdHItPm5OdW1CdXR0b25zKSkKKwlyZXR1cm4gLTE7CisKKyAgICAvKiBjaGVjayBpbmRleCBidXR0b24gKi8KKyAgICBidG5QdHIgPSAmaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdOworICAgIGlmICgoYnRuUHRyLT5mc1N0eWxlICYgVEJTVFlMRV9DSEVDS0dST1VQKSA9PSBUQlNUWUxFX0NIRUNLR1JPVVApIHsKKwlpZiAoYnRuUHRyLT5mc1N0YXRlICYgVEJTVEFURV9DSEVDS0VEKQorCSAgICByZXR1cm4gbkluZGV4OworICAgIH0KKworICAgIC8qIGNoZWNrIHByZXZpb3VzIGJ1dHRvbnMgKi8KKyAgICBuUnVuSW5kZXggPSBuSW5kZXggLSAxOworICAgIHdoaWxlIChuUnVuSW5kZXggPj0gMCkgeworCWJ0blB0ciA9ICZpbmZvUHRyLT5idXR0b25zW25SdW5JbmRleF07CisJaWYgKChidG5QdHItPmZzU3R5bGUgJiBUQlNUWUxFX0NIRUNLR1JPVVApID09IFRCU1RZTEVfQ0hFQ0tHUk9VUCkgeworCSAgICBpZiAoYnRuUHRyLT5mc1N0YXRlICYgVEJTVEFURV9DSEVDS0VEKQorCQlyZXR1cm4gblJ1bkluZGV4OworCX0KKwllbHNlCisJICAgIGJyZWFrOworCW5SdW5JbmRleC0tOworICAgIH0KKworICAgIC8qIGNoZWNrIG5leHQgYnV0dG9ucyAqLworICAgIG5SdW5JbmRleCA9IG5JbmRleCArIDE7CisgICAgd2hpbGUgKG5SdW5JbmRleCA8IGluZm9QdHItPm5OdW1CdXR0b25zKSB7CisJYnRuUHRyID0gJmluZm9QdHItPmJ1dHRvbnNbblJ1bkluZGV4XTsJCisJaWYgKChidG5QdHItPmZzU3R5bGUgJiBUQlNUWUxFX0NIRUNLR1JPVVApID09IFRCU1RZTEVfQ0hFQ0tHUk9VUCkgeworCSAgICBpZiAoYnRuUHRyLT5mc1N0YXRlICYgVEJTVEFURV9DSEVDS0VEKQorCQlyZXR1cm4gblJ1bkluZGV4OworCX0KKwllbHNlCisJICAgIGJyZWFrOworCW5SdW5JbmRleCsrOworICAgIH0KKwogICAgIHJldHVybiAtMTsKIH0KIApAQCAtMTkwLDYgKzI3OCw3IEBACiB7CiAgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CiAgICAgTFBUQkFEREJJVE1BUCBscEFkZEJtcCA9IChMUFRCQUREQklUTUFQKWxQYXJhbTsKKyAgICBJTlQzMiBuSW5kZXggPSAwOwogCiAgICAgaWYgKCghbHBBZGRCbXApIHx8ICgoSU5UMzIpd1BhcmFtIDw9IDApKQogCXJldHVybiAtMTsKQEAgLTIwNSw2ICsyOTQsNyBAQAogCQkJICAgICAgKElOVDMyKXdQYXJhbSwgMik7CiAgICAgfQogCisjaWYgMAogICAgIGlmICghKGluZm9QdHItPmhpbWxEaXMpKSB7CiAJLyogY3JlYXRlIG5ldyBkaXNhYmxlZCBpbWFnZSBsaXN0ICovCiAJVFJBQ0UgKHRvb2xiYXIsICJjcmVhdGluZyBkaXNhYmxlZCBpbWFnZSBsaXN0IVxuIik7CkBAIC0yMTMsMTIgKzMwMywxNCBAQAogCQkJICAgICAgaW5mb1B0ci0+bkJpdG1hcEhlaWdodCwgSUxDX0NPTE9SIHwgSUxDX01BU0ssCiAJCQkgICAgICAoSU5UMzIpd1BhcmFtLCAyKTsKICAgICB9Ci0KKyNlbmRpZgogCiAgICAgLyogQWRkIGJpdG1hcHMgdG8gdGhlIGRlZmF1bHQgaW1hZ2UgbGlzdCAqLwogICAgIGlmIChscEFkZEJtcC0+aEluc3QgPT0gKEhJTlNUQU5DRTMyKTApIHsKLQotCUltYWdlTGlzdF9BZGQgKGluZm9QdHItPmhpbWxEZWYsIChIQklUTUFQMzIpbHBBZGRCbXAtPm5JRCwgMCk7CisJbkluZGV4ID0gCisJICAgIEltYWdlTGlzdF9BZGRNYXNrZWQgKGluZm9QdHItPmhpbWxEZWYsIChIQklUTUFQMzIpbHBBZGRCbXAtPm5JRCwKKwkJCQkgMHhDMEMwQzApOworLy8JCQkJIEdldFN5c0NvbG9yMzIgKENPTE9SXzNERkFDRSkpOwogICAgIH0KICAgICBlbHNlIGlmIChscEFkZEJtcC0+aEluc3QgPT0gSElOU1RfQ09NTUNUUkwpIHsKIAkvKiBhZGQgaW50ZXJuYWwgYml0bWFwcyAqLwpAQCAtMjI2LDIzICszMTgsMjIgQEAKIAogCS8qIEhhY2sgdG8gImFkZCIgc29tZSByZXNlcnZlZCBpbWFnZXMgd2l0aGluIHRoZSBpbWFnZSBsaXN0IAogCSAgIHRvIGdldCB0aGUgcmlnaHQgaW1hZ2UgaW5kaWNlcyAqLwotCUltYWdlTGlzdF9TZXRJbWFnZUNvdW50IChpbmZvUHRyLT5oaW1sRGVmLAotCSAgICBJbWFnZUxpc3RfR2V0SW1hZ2VDb3VudCAoaW5mb1B0ci0+aGltbERlZikgKyAoSU5UMzIpd1BhcmFtKTsKKwluSW5kZXggPSBJbWFnZUxpc3RfR2V0SW1hZ2VDb3VudCAoaW5mb1B0ci0+aGltbERlZik7CisJSW1hZ2VMaXN0X1NldEltYWdlQ291bnQgKGluZm9QdHItPmhpbWxEZWYsIG5JbmRleCArIChJTlQzMil3UGFyYW0pOwogICAgIH0KICAgICBlbHNlIHsKIAlIQklUTUFQMzIgaEJtcCA9CiAJICAgIExvYWRCaXRtYXAzMkEgKGxwQWRkQm1wLT5oSW5zdCwgKExQU1RSKWxwQWRkQm1wLT5uSUQpOwogCi0JSW1hZ2VMaXN0X0FkZCAoaW5mb1B0ci0+aGltbERlZiwgaEJtcCwgKEhCSVRNQVAzMikwKTsKKwluSW5kZXggPSBJbWFnZUxpc3RfQWRkIChpbmZvUHRyLT5oaW1sRGVmLCBoQm1wLCAoSEJJVE1BUDMyKTApOwogCiAJRGVsZXRlT2JqZWN0MzIgKGhCbXApOyAKICAgICB9CiAKIAotICAgIC8qIEFkZCBiaXRtYXBzIHRvIHRoZSBkaXNhYmxlZCBpbWFnZSBsaXN0ICovCisgICAgaW5mb1B0ci0+bk51bUJpdG1hcHMgKz0gKElOVDMyKXdQYXJhbTsKIAotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIG5JbmRleDsKIH0KIAogCkBAIC0yOTcsOCArMzg4LDk1IEBACiB9CiAKIAotLy8gPDwgVE9PTEJBUl9BZGRTdHJpbmczMkEgPj4KLS8vIDw8IFRPT0xCQVJfQXV0b1NpemUgPj4KKy8vIDw8IFRPT0xCQVJfQWRkQnV0dG9uczMyVyA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX0FkZFN0cmluZzMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBJTlQzMiBuSW5kZXg7CisKKyAgICBpZiAod1BhcmFtKSB7CisJY2hhciBzelN0cmluZ1syNTZdOworCUlOVDMyIGxlbjsKKwlUUkFDRSAodG9vbGJhciwgImFkZGluZyBzdHJpbmcgZnJvbSByZXNvdXJjZSFcbiIpOworCisJbGVuID0gTG9hZFN0cmluZzMyQSAoKEhJTlNUQU5DRTMyKXdQYXJhbSwgKFVJTlQzMilsUGFyYW0sCisJCQkgICAgIHN6U3RyaW5nLCAyNTYpOworCisJVFJBQ0UgKHRvb2xiYXIsICJsZW49JWRcbiIsIGxlbik7CisJbkluZGV4ID0gaW5mb1B0ci0+bk51bVN0cmluZ3M7CisJaWYgKGluZm9QdHItPm5OdW1TdHJpbmdzID09IDApIHsKKwkgICAgaW5mb1B0ci0+c3RyaW5ncyA9CisJCUhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKGNoYXIgKikpOworCX0KKwllbHNlIHsKKwkgICAgY2hhciAqKm9sZFN0cmluZ3MgPSBpbmZvUHRyLT5zdHJpbmdzOworCSAgICBpbmZvUHRyLT5zdHJpbmdzID0KKwkJSGVhcEFsbG9jIChTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkJICAgc2l6ZW9mKGNoYXIgKikgKiAoaW5mb1B0ci0+bk51bVN0cmluZ3MgKyAxKSk7CisJICAgIG1lbWNweSAoJmluZm9QdHItPnN0cmluZ3NbMF0sICZvbGRTdHJpbmdzWzBdLAorCQkgICAgc2l6ZW9mKGNoYXIgKikgKiBpbmZvUHRyLT5uTnVtU3RyaW5ncyk7CisJICAgIEhlYXBGcmVlIChTeXN0ZW1IZWFwLCAwLCBvbGRTdHJpbmdzKTsKKwl9CisKKwlpbmZvUHRyLT5zdHJpbmdzW2luZm9QdHItPm5OdW1TdHJpbmdzXSA9CisJICAgIEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKGNoYXIpKihsZW4rMSkpOworCWxzdHJjcHkzMkEgKGluZm9QdHItPnN0cmluZ3NbaW5mb1B0ci0+bk51bVN0cmluZ3NdLCBzelN0cmluZyk7CisJaW5mb1B0ci0+bk51bVN0cmluZ3MrKzsKKyAgICB9CisgICAgZWxzZSB7CisJY2hhciAqcCA9IChjaGFyKilsUGFyYW07CisJSU5UMzIgbGVuOworCisJaWYgKHAgPT0gTlVMTCkgcmV0dXJuIC0xOworCVRSQUNFICh0b29sYmFyLCAiYWRkaW5nIHN0cmluZyhzKSBmcm9tIGFycmF5IVxuIik7CisJbkluZGV4ID0gaW5mb1B0ci0+bk51bVN0cmluZ3M7CisJd2hpbGUgKCpwKSB7CisJICAgIGxlbiA9IGxzdHJsZW4zMkEgKHApOworCSAgICBUUkFDRSAodG9vbGJhciwgImxlbj0lZFxuIiwgbGVuKTsKKworCSAgICBpZiAoaW5mb1B0ci0+bk51bVN0cmluZ3MgPT0gMCkgeworCQlpbmZvUHRyLT5zdHJpbmdzID0KKwkJICAgIEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKGNoYXIgKikpOworCSAgICB9CisJICAgIGVsc2UgeworCQljaGFyICoqb2xkU3RyaW5ncyA9IGluZm9QdHItPnN0cmluZ3M7CisJCWluZm9QdHItPnN0cmluZ3MgPQorCQkgICAgSGVhcEFsbG9jIChTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkJICAgICAgIHNpemVvZihjaGFyICopICogKGluZm9QdHItPm5OdW1TdHJpbmdzICsgMSkpOworCQltZW1jcHkgKCZpbmZvUHRyLT5zdHJpbmdzWzBdLCAmb2xkU3RyaW5nc1swXSwKKwkJCXNpemVvZihjaGFyICopICogaW5mb1B0ci0+bk51bVN0cmluZ3MpOworCQlIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgb2xkU3RyaW5ncyk7CisJICAgIH0KKworCSAgICBpbmZvUHRyLT5zdHJpbmdzW2luZm9QdHItPm5OdW1TdHJpbmdzXSA9CisJCUhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKGNoYXIpKihsZW4rMSkpOworCSAgICBsc3RyY3B5MzJBIChpbmZvUHRyLT5zdHJpbmdzW2luZm9QdHItPm5OdW1TdHJpbmdzXSwgcCk7CisJICAgIGluZm9QdHItPm5OdW1TdHJpbmdzKys7CisKKwkgICAgcCArPSAobGVuKzEpOworCX0KKworICAgIH0KKworICAgIHJldHVybiBuSW5kZXg7Cit9CisKKworLy8gPDwgVE9PTEJBUl9BZGRTdHJpbmczMlcgPj4KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9BdXRvU2l6ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIFRSQUNFICh0b29sYmFyLCAiYXV0byBzaXplIVxuIik7CisKKyAgICByZXR1cm4gMDsKK30KIAogCiBzdGF0aWMgTFJFU1VMVApAQCAtMzQ0LDcgKzUyMiw2IEBACiB9CiAKIAotLyoKIHN0YXRpYyBMUkVTVUxUCiBUT09MQkFSX0NoZWNrQnV0dG9uIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewpAQCAtMzUyLDI0ICs1MjksNDEgQEAKICAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKICAgICBIREMzMiBoZGM7CiAgICAgSU5UMzIgbkluZGV4OworICAgIElOVDMyIG5PbGRJbmRleCA9IC0xOwogCiAgICAgbkluZGV4ID0gVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoaW5mb1B0ciwgKElOVDMyKXdQYXJhbSk7CiAgICAgaWYgKG5JbmRleCA9PSAtMSkKIAlyZXR1cm4gRkFMU0U7CiAKICAgICBidG5QdHIgPSAmaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdOworCisgICAgaWYgKCEoYnRuUHRyLT5mc1N0eWxlICYgVEJTVFlMRV9DSEVDSykpCisJcmV0dXJuIEZBTFNFOworCiAgICAgaWYgKExPV09SRChsUGFyYW0pID09IEZBTFNFKQogCWJ0blB0ci0+ZnNTdGF0ZSAmPSB+VEJTVEFURV9DSEVDS0VEOwotICAgIGVsc2UKKyAgICBlbHNlIHsKKwlpZiAoYnRuUHRyLT5mc1N0eWxlICYgVEJTVFlMRV9HUk9VUCkgeworCSAgICBuT2xkSW5kZXggPSAKKwkJVE9PTEJBUl9HZXRDaGVja2VkR3JvdXBCdXR0b25JbmRleCAoaW5mb1B0ciwgbkluZGV4KTsKKwkgICAgaWYgKG5PbGRJbmRleCA9PSBuSW5kZXgpCisJCXJldHVybiAwOworCSAgICBpZiAobk9sZEluZGV4ICE9IC0xKQorCQlpbmZvUHRyLT5idXR0b25zW25PbGRJbmRleF0uZnNTdGF0ZSAmPSB+VEJTVEFURV9DSEVDS0VEOworCX0KIAlidG5QdHItPmZzU3RhdGUgfD0gVEJTVEFURV9DSEVDS0VEOworICAgIH0KIAogICAgIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworICAgIGlmIChuT2xkSW5kZXggIT0gLTEpCisJVE9PTEJBUl9EcmF3QnV0dG9uICh3bmRQdHIsICZpbmZvUHRyLT5idXR0b25zW25PbGRJbmRleF0sIGhkYyk7CiAgICAgVE9PTEJBUl9EcmF3QnV0dG9uICh3bmRQdHIsIGJ0blB0ciwgaGRjKTsKICAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKIAorICAgIC8qIEZJWE1FOiBTZW5kIGEgV01fQ09NTUFORCBvciBXTV9OT1RJRlkgKi8KKwogICAgIHJldHVybiBUUlVFOwogfQotKi8KIAogCiBzdGF0aWMgTFJFU1VMVApAQCAtMzg4LDkgKzU4Miw5IEBACiBUT09MQkFSX0RlbGV0ZUJ1dHRvbiAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKLSAgICBJTlQzMiBpSW5kZXggPSAoSU5UMzIpd1BhcmFtOworICAgIElOVDMyIG5JbmRleCA9IChJTlQzMil3UGFyYW07CiAKLSAgICBpZiAoKGlJbmRleCA8IDApIHx8IChpSW5kZXggPj0gaW5mb1B0ci0+bk51bUJ1dHRvbnMpKQorICAgIGlmICgobkluZGV4IDwgMCkgfHwgKG5JbmRleCA+PSBpbmZvUHRyLT5uTnVtQnV0dG9ucykpCiAJcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKGluZm9QdHItPm5OdW1CdXR0b25zID09IDEpIHsKQEAgLTQwMCw5ICs1OTQsMjMgQEAKIAlpbmZvUHRyLT5uTnVtQnV0dG9ucyA9IDA7CiAgICAgfQogICAgIGVsc2UgeworCVRCVVRUT05fSU5GTyAqb2xkQnV0dG9ucyA9IGluZm9QdHItPmJ1dHRvbnM7CisgICAgICAgIFRSQUNFKHRvb2xiYXIsICJjb21wbGV4IGRlbGV0ZSEgW25JbmRleD0lZF1cbiIsIG5JbmRleCk7CiAKLSAgICAgICAgVFJBQ0UoaGVhZGVyLCAiY29tcGxleCBkZWxldGUhIFtpSW5kZXg9JWRdXG4iLCBpSW5kZXgpOworCWluZm9QdHItPm5OdW1CdXR0b25zLS07CisJaW5mb1B0ci0+YnV0dG9ucyA9IEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwKKwkJCQkgICAgICBzaXplb2YgKFRCVVRUT05fSU5GTykgKiBpbmZvUHRyLT5uTnVtQnV0dG9ucyk7CisgICAgICAgIGlmIChuSW5kZXggPiAwKSB7CisgICAgICAgICAgICBtZW1jcHkgKCZpbmZvUHRyLT5idXR0b25zWzBdLCAmb2xkQnV0dG9uc1swXSwKKyAgICAgICAgICAgICAgICAgICAgbkluZGV4ICogc2l6ZW9mKFRCVVRUT05fSU5GTykpOworICAgICAgICB9CiAKKyAgICAgICAgaWYgKG5JbmRleCA8IGluZm9QdHItPm5OdW1CdXR0b25zKSB7CisgICAgICAgICAgICBtZW1jcHkgKCZpbmZvUHRyLT5idXR0b25zW25JbmRleF0sICZvbGRCdXR0b25zW25JbmRleCsxXSwKKyAgICAgICAgICAgICAgICAgICAgKGluZm9QdHItPm5OdW1CdXR0b25zIC0gbkluZGV4KSAqIHNpemVvZihUQlVUVE9OX0lORk8pKTsKKyAgICAgICAgfQorCisgICAgICAgIEhlYXBGcmVlIChTeXN0ZW1IZWFwLCAwLCBvbGRCdXR0b25zKTsKICAgICB9CiAKICAgICBUT09MQkFSX0NhbGNUb29sYmFyICh3bmRQdHIpOwpAQCAtNDU3LDkgKzY2NSwxNjQgQEAKIH0KIAogCi0vLyA8PCBUT09MQkFSX0dldEJpdG1hcEZsYWdzID4+Ci0vLyA8PCBUT09MQkFSX0dldEJ1dHRvbiA+PgotLy8gPDwgLi4uID4+CitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9HZXRCaXRtYXBGbGFncyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBGSVhNRSAodG9vbGJhciwgInN0dWIhXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9HZXRCdXR0b24gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTFBUQkJVVFRPTiBscFRiYiA9IChMUFRCQlVUVE9OKWxQYXJhbTsKKyAgICBJTlQzMiBuSW5kZXggPSAoSU5UMzIpd1BhcmFtOworICAgIFRCVVRUT05fSU5GTyAqYnRuUHRyOworCisgICAgaWYgKGluZm9QdHIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChscFRiYiA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoKG5JbmRleCA8IDApIHx8IChuSW5kZXggPj0gaW5mb1B0ci0+bk51bUJ1dHRvbnMpKQorCXJldHVybiBGQUxTRTsKKworICAgIGJ0blB0ciA9ICZpbmZvUHRyLT5idXR0b25zW25JbmRleF07CisgICAgbHBUYmItPmlCaXRtYXAgICA9IGJ0blB0ci0+aUJpdG1hcDsKKyAgICBscFRiYi0+aWRDb21tYW5kID0gYnRuUHRyLT5pZENvbW1hbmQ7CisgICAgbHBUYmItPmZzU3RhdGUgICA9IGJ0blB0ci0+ZnNTdGF0ZTsKKyAgICBscFRiYi0+ZnNTdHlsZSAgID0gYnRuUHRyLT5mc1N0eWxlOworICAgIGxwVGJiLT5kd0RhdGEgICAgPSBidG5QdHItPmR3RGF0YTsKKyAgICBscFRiYi0+aVN0cmluZyAgID0gYnRuUHRyLT5pU3RyaW5nOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gPDwgVE9PTEJBUl9HZXRCdXR0b25JbmZvID4+CisvLyA8PCBUT09MQkFSX0dldEJ1dHRvblNpemUgPj4KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9HZXRCdXR0b25UZXh0MzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIElOVDMyIG5JbmRleCwgblN0cmluZ0luZGV4OworCisgICAgbkluZGV4ID0gVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoaW5mb1B0ciwgKElOVDMyKXdQYXJhbSk7CisgICAgaWYgKG5JbmRleCA9PSAtMSkKKwlyZXR1cm4gLTE7CisKKyAgICBuU3RyaW5nSW5kZXggPSBpbmZvUHRyLT5idXR0b25zW25JbmRleF0uaVN0cmluZzsKKworICAgIFRSQUNFICh0b29sYmFyLCAiaW5kZXg9JWQgc3RyaW5nSW5kZXg9JWRcbiIsIG5JbmRleCwgblN0cmluZ0luZGV4KTsKKworICAgIGlmICgoblN0cmluZ0luZGV4IDwgMCkgfHwgKG5TdHJpbmdJbmRleCA+PSBpbmZvUHRyLT5uTnVtU3RyaW5ncykpCisJcmV0dXJuIC0xOworCisgICAgaWYgKGxQYXJhbSA9PSAwKSByZXR1cm4gLTE7CisKKyAgICBsc3RyY3B5MzJBICgoTFBTVFIpbFBhcmFtLCAoTFBTVFIpaW5mb1B0ci0+c3RyaW5nc1tuU3RyaW5nSW5kZXhdKTsKKworICAgIHJldHVybiBsc3RybGVuMzJBICgoTFBTVFIpaW5mb1B0ci0+c3RyaW5nc1tuU3RyaW5nSW5kZXhdKTsKK30KKworCisvLyA8PCBUT09MQkFSX0dldEJ1dHRvblRleHQzMlcgPj4KKy8vIDw8IFRPT0xCQVJfR2V0Q29sb3JTY2hlbWUgPj4KKy8vIDw8IFRPT0xCQVJfR2V0RGlzYWJsZWRJbWFnZUxpc3QgPj4KKy8vIDw8IFRPT0xCQVJfR2V0RXh0ZW5kZWRTdHlsZSA+PgorLy8gPDwgVE9PTEJBUl9HZXRIb3RJbWFnZUxpc3QgPj4KKy8vIDw8IFRPT0xCQVJfR2V0SG90SXRlbSA+PgorLy8gPDwgVE9PTEJBUl9HZXRJbWFnZUxpc3QgPj4KKy8vIDw8IFRPT0xCQVJfR2V0SW5zZXJ0TWFyayA+PgorLy8gPDwgVE9PTEJBUl9HZXRJbnNlcnRNYXJrQ29sb3IgPj4KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9HZXRJdGVtUmVjdCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKKyAgICBMUFJFQ1QzMiAgICAgbHBSZWN0OworICAgIElOVDMyICAgICAgICBuSW5kZXg7CisKKyAgICBpZiAoaW5mb1B0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgICAgbkluZGV4ID0gKElOVDMyKXdQYXJhbTsKKyAgICBidG5QdHIgPSAmaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdOworICAgIGlmICgobkluZGV4IDwgMCkgfHwgKG5JbmRleCA+PSBpbmZvUHRyLT5uTnVtQnV0dG9ucykpCisJcmV0dXJuIEZBTFNFOworICAgIGxwUmVjdCA9IChMUFJFQ1QzMilsUGFyYW07CisgICAgaWYgKGxwUmVjdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKGJ0blB0ci0+ZnNTdGF0ZSAmIFRCU1RBVEVfSElEREVOKSByZXR1cm4gRkFMU0U7CisgICAgCisgICAgbHBSZWN0LT5sZWZ0ICAgPSBidG5QdHItPnJlY3QubGVmdDsKKyAgICBscFJlY3QtPnJpZ2h0ICA9IGJ0blB0ci0+cmVjdC5yaWdodDsKKyAgICBscFJlY3QtPmJvdHRvbSA9IGJ0blB0ci0+cmVjdC5ib3R0b207CisgICAgbHBSZWN0LT50b3AgICAgPSBidG5QdHItPnJlY3QudG9wOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gPDwgVE9PTEJBUl9HZXRNYXhTaXplID4+CisvLyA8PCBUT09MQkFSX0dldE9iamVjdCA+PgorLy8gPDwgVE9PTEJBUl9HZXRQYWRkaW5nID4+CisvLyA8PCBUT09MQkFSX0dldFJlY3QgPj4KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9HZXRSb3dzIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworCisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRCU1RZTEVfV1JBUEFCTEUpCisJcmV0dXJuIGluZm9QdHItPm5NYXhSb3dzOworICAgIGVsc2UKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9HZXRTdGF0ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBJTlQzMiBuSW5kZXg7CisKKyAgICBuSW5kZXggPSBUT09MQkFSX0dldEJ1dHRvbkluZGV4IChpbmZvUHRyLCAoSU5UMzIpd1BhcmFtKTsKKyAgICBpZiAobkluZGV4ID09IC0xKSByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdLmZzU3RhdGU7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfR2V0U3R5bGUgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSU5UMzIgbkluZGV4OworCisgICAgbkluZGV4ID0gVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoaW5mb1B0ciwgKElOVDMyKXdQYXJhbSk7CisgICAgaWYgKG5JbmRleCA9PSAtMSkgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGluZm9QdHItPmJ1dHRvbnNbbkluZGV4XS5mc1N0eWxlOworfQorCisKKy8vIDw8IFRPT0xCQVJfR2V0VGV4dFJvd3MgPj4KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9HZXRUb29sVGlwcyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIGlmIChpbmZvUHRyID09IE5VTEwpIHJldHVybiAwOworICAgIHJldHVybiBpbmZvUHRyLT5od25kVG9vbFRpcDsKK30KKworCisvLyA8PCBUT09MQkFSX0dldFVuaWNvZGVGb3JtYXQgPj4KIAogCiBzdGF0aWMgTFJFU1VMVApAQCAtNDk2LDYgKzg1OSw5MCBAQAogCiAKIHN0YXRpYyBMUkVTVUxUCitUT09MQkFSX0luZGV0ZXJtaW5hdGUgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgVEJVVFRPTl9JTkZPICpidG5QdHI7CisgICAgSERDMzIgaGRjOworICAgIElOVDMyIG5JbmRleDsKKworICAgIG5JbmRleCA9IFRPT0xCQVJfR2V0QnV0dG9uSW5kZXggKGluZm9QdHIsIChJTlQzMil3UGFyYW0pOworICAgIGlmIChuSW5kZXggPT0gLTEpCisJcmV0dXJuIEZBTFNFOworCisgICAgYnRuUHRyID0gJmluZm9QdHItPmJ1dHRvbnNbbkluZGV4XTsKKyAgICBpZiAoTE9XT1JEKGxQYXJhbSkgPT0gRkFMU0UpCisJYnRuUHRyLT5mc1N0YXRlICY9IH5UQlNUQVRFX0lOREVURVJNSU5BVEU7CisgICAgZWxzZQorCWJ0blB0ci0+ZnNTdGF0ZSB8PSBUQlNUQVRFX0lOREVURVJNSU5BVEU7CisKKyAgICBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKyAgICBUT09MQkFSX0RyYXdCdXR0b24gKHduZFB0ciwgYnRuUHRyLCBoZGMpOworICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfSW5zZXJ0QnV0dG9uMzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIExQVEJCVVRUT04gbHBUYmIgPSAoTFBUQkJVVFRPTilsUGFyYW07CisgICAgSU5UMzIgbkluZGV4ID0gKElOVDMyKXdQYXJhbTsKKyAgICBUQlVUVE9OX0lORk8gKm9sZEJ1dHRvbnM7CisgICAgSERDMzIgaGRjOworCisgICAgaWYgKGxwVGJiID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBpZiAobkluZGV4IDwgMCkgcmV0dXJuIEZBTFNFOworCisgICAgVFJBQ0UgKHRvb2xiYXIsICJpbnNlcnRpbmcgYnV0dG9uIGluZGV4PSVkXG4iLCBuSW5kZXgpOworICAgIGlmIChuSW5kZXggPiBpbmZvUHRyLT5uTnVtQnV0dG9ucykgeworCW5JbmRleCA9IGluZm9QdHItPm5OdW1CdXR0b25zOworCVRSQUNFICh0b29sYmFyLCAiYWRqdXN0IGluZGV4PSVkXG4iLCBuSW5kZXgpOworICAgIH0KKworICAgIG9sZEJ1dHRvbnMgPSBpbmZvUHRyLT5idXR0b25zOworICAgIGluZm9QdHItPm5OdW1CdXR0b25zKys7CisgICAgaW5mb1B0ci0+YnV0dG9ucyA9IEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwKKwkJCQkgIHNpemVvZiAoVEJVVFRPTl9JTkZPKSAqIGluZm9QdHItPm5OdW1CdXR0b25zKTsKKyAgICAvKiBwcmUgaW5zZXJ0IGNvcHkgKi8KKyAgICBpZiAobkluZGV4ID4gMCkgeworCW1lbWNweSAoJmluZm9QdHItPmJ1dHRvbnNbMF0sICZvbGRCdXR0b25zWzBdLAorCQluSW5kZXggKiBzaXplb2YoVEJVVFRPTl9JTkZPKSk7CisgICAgfQorCisgICAgLyogaW5zZXJ0IG5ldyBidXR0b24gKi8KKyAgICBpbmZvUHRyLT5idXR0b25zW25JbmRleF0uaUJpdG1hcCAgID0gbHBUYmItPmlCaXRtYXA7CisgICAgaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdLmlkQ29tbWFuZCA9IGxwVGJiLT5pZENvbW1hbmQ7CisgICAgaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdLmZzU3RhdGUgICA9IGxwVGJiLT5mc1N0YXRlOworICAgIGluZm9QdHItPmJ1dHRvbnNbbkluZGV4XS5mc1N0eWxlICAgPSBscFRiYi0+ZnNTdHlsZTsKKyAgICBpbmZvUHRyLT5idXR0b25zW25JbmRleF0uZHdEYXRhICAgID0gbHBUYmItPmR3RGF0YTsKKyAgICBpbmZvUHRyLT5idXR0b25zW25JbmRleF0uaVN0cmluZyAgID0gbHBUYmItPmlTdHJpbmc7CisKKyAgICAvKiBwb3N0IGluc2VydCBjb3B5ICovCisgICAgaWYgKG5JbmRleCA8IGluZm9QdHItPm5OdW1CdXR0b25zIC0gMSkgeworCW1lbWNweSAoJmluZm9QdHItPmJ1dHRvbnNbbkluZGV4KzFdLCAmb2xkQnV0dG9uc1tuSW5kZXhdLAorCQkoaW5mb1B0ci0+bk51bUJ1dHRvbnMgLSBuSW5kZXggLSAxKSAqIHNpemVvZihUQlVUVE9OX0lORk8pKTsKKyAgICB9CisKKyAgICBIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgb2xkQnV0dG9ucyk7CisKKyAgICBUT09MQkFSX0NhbGNUb29sYmFyICh3bmRQdHIpOworCisgICAgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisgICAgVE9PTEJBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisgICAgUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyA8PCBUT09MQkFSX0luc2VydEJ1dHRvbjMyVyA+PgorLy8gPDwgVE9PTEJBUl9JbnNlcnRNYXJrSGl0VGVzdCA+PgorCisKK3N0YXRpYyBMUkVTVUxUCiBUT09MQkFSX0lzQnV0dG9uQ2hlY2tlZCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKQEAgLTYxNSw2ICsxMDYyLDcgQEAKIC8vIDw8IFRPT0xCQVJfU2F2ZVJlc3RvcmUgPj4KIC8vIDw8IFRPT0xCQVJfU2V0QW5jaG9ySGlnaGxpZ2h0ID4+CiAKKwogc3RhdGljIExSRVNVTFQKIFRPT0xCQVJfU2V0Qml0bWFwU2l6ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKQEAgLTY2Niw2ICsxMTE0LDE0IEBACiB9CiAKIAorLy8gPDwgVE9PTEJBUl9TZXRDb2xvclNjaGVtZSA+PgorLy8gPDwgVE9PTEJBUl9TZXREaXNhYmxlZEltYWdlTGlzdCA+PgorLy8gPDwgVE9PTEJBUl9TZXREcmF3VGV4dEZsYWdzID4+CisvLyA8PCBUT09MQkFSX1NldEV4dGVuZGVkU3R5bGUgPj4KKy8vIDw8IFRPT0xCQVJfU2V0SG90SW1hZ2VMaXN0ID4+CisvLyA8PCBUT09MQkFSX1NldEhvdEl0ZW0gPj4KKy8vIDw8IFRPT0xCQVJfU2V0SW1hZ2VMaXN0ID4+CisKIAogc3RhdGljIExSRVNVTFQKIFRPT0xCQVJfU2V0SW5kZW50IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQpAQCAtNjgzLDYgKzExMzksMzYgQEAKIH0KIAogCisvLyA8PCBUT09MQkFSX1NldEluc2VydE1hcmsgPj4KKy8vIDw8IFRPT0xCQVJfU2V0SW5zZXJ0TWFya0NvbG9yID4+CisvLyA8PCBUT09MQkFSX1NldE1heFRleHRSb3dzID4+CisvLyA8PCBUT09MQkFSX1NldFBhZGRpbmcgPj4KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9TZXRQYXJlbnQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSFdORDMyIGh3bmRPbGROb3RpZnk7CisKKyAgICBpZiAoaW5mb1B0ciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICBod25kT2xkTm90aWZ5ID0gaW5mb1B0ci0+aHduZE5vdGlmeTsKKyAgICBpbmZvUHRyLT5od25kTm90aWZ5ID0gKEhXTkQzMil3UGFyYW07CisKKyAgICByZXR1cm4gaHduZE9sZE5vdGlmeTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9TZXRSb3dzIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworCisgICAgRklYTUUgKHRvb2xiYXIsICJzdXBwb3J0IG11bHRpcGxlIHJvd3MhXG4iKTsKKworICAgIHJldHVybiAwOworfQorCiAKIHN0YXRpYyBMUkVTVUxUCiBUT09MQkFSX1NldFN0YXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQpAQCAtNzMwLDcgKzEyMTYsMTcgQEAKIH0KIAogCi0vLyA8PCBUT09MQkFSX1NldFRvb2xUaXBzID4+CitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9TZXRUb29sVGlwcyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIGlmIChpbmZvUHRyID09IE5VTEwpIHJldHVybiAwOworICAgIGluZm9QdHItPmh3bmRUb29sVGlwID0gKEhXTkQzMil3UGFyYW07CisgICAgcmV0dXJuIDA7Cit9CisKKwogLy8gPDwgVE9PTEJBUl9TZXRVbmljb2RlRm9ybWF0ID4+CiAKIApAQCAtNzQ0LDE4ICsxMjQwLDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihUT09MQkFSX0lORk8pKTsKICAgICB3bmRQdHItPndFeHRyYVswXSA9IChEV09SRClpbmZvUHRyOwogCisgICAgaWYgKGluZm9QdHIgPT0gTlVMTCkgeworCUVSUiAodG9vbGJhciwgImNvdWxkIG5vdCBhbGxvY2F0ZSBpbmZvIG1lbW9yeSFcbiIpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgaW5mbyBzdHJ1Y3R1cmUgKi8KICAgICBpbmZvUHRyLT5uQnV0dG9uSGVpZ2h0ID0gMjI7Ci0gICAgaW5mb1B0ci0+bkJ1dHRvbldpZHRoID0gMjQ7CisgICAgaW5mb1B0ci0+bkJ1dHRvbldpZHRoID0gMjM7CiAgICAgaW5mb1B0ci0+bkJ1dHRvblRvcCA9IDI7CiAgICAgaW5mb1B0ci0+bkJpdG1hcEhlaWdodCA9IDE1OwogICAgIGluZm9QdHItPm5CaXRtYXBXaWR0aCA9IDE2OwogCiAgICAgaW5mb1B0ci0+bkhlaWdodCA9IGluZm9QdHItPm5CdXR0b25IZWlnaHQgKyA2OworICAgIGluZm9QdHItPm5NYXhSb3dzID0gMTsKIAogICAgIGluZm9QdHItPmJDYXB0dXJlZCA9IDA7CiAgICAgaW5mb1B0ci0+bkJ1dHRvbkRvd24gPSAtMTsKICAgICBpbmZvUHRyLT5uT2xkSGl0ID0gLTE7CiAKKyAgICBpbmZvUHRyLT5od25kTm90aWZ5ID0gR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpOworCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTc2NSwxMCArMTI3MCwyNCBAQAogewogICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOwogCisgICAgLyogZGVsZXRlIHRvb2wgdGlwICovCisgICAgaWYgKGluZm9QdHItPmh3bmRUb29sVGlwKQorCURlc3Ryb3lXaW5kb3czMiAoaW5mb1B0ci0+aHduZFRvb2xUaXApOworCiAgICAgLyogZGVsZXRlIGJ1dHRvbiBkYXRhICovCiAgICAgaWYgKGluZm9QdHItPmJ1dHRvbnMpCiAJSGVhcEZyZWUgKFN5c3RlbUhlYXAsIDAsIGluZm9QdHItPmJ1dHRvbnMpOwogCisgICAgLyogZGVsZXRlIHN0cmluZ3MgKi8KKyAgICBpZiAoaW5mb1B0ci0+c3RyaW5ncykgeworCUlOVDMyIGk7CisJZm9yIChpID0gMDsgaSA8IGluZm9QdHItPm5OdW1TdHJpbmdzOyBpKyspCisJICAgIGlmIChpbmZvUHRyLT5zdHJpbmdzW2ldKQorCQlIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgaW5mb1B0ci0+c3RyaW5nc1tpXSk7CisKKwlIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgaW5mb1B0ci0+c3RyaW5ncyk7CisgICAgfQorCiAgICAgLyogZGVzdHJveSBkZWZhdWx0IGltYWdlIGxpc3QgKi8KICAgICBpZiAoaW5mb1B0ci0+aGltbERlZikKIAlJbWFnZUxpc3RfRGVzdHJveSAoaW5mb1B0ci0+aGltbERlZik7CkBAIC04NjcsNiArMTM4Niw3IEBACiAgICAgVEJVVFRPTl9JTkZPICpidG5QdHI7CiAgICAgUE9JTlQzMiBwdDsKICAgICBJTlQzMiAgIG5IaXQ7CisgICAgSU5UMzIgICBuT2xkSW5kZXggPSAtMTsKICAgICBIREMzMiAgIGhkYzsKIAogICAgIHB0LnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CkBAIC04NzQsMjAgKzEzOTQsMzQgQEAKICAgICBuSGl0ID0gVE9PTEJBUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0KTsKIAogICAgIGlmICgoaW5mb1B0ci0+YkNhcHR1cmVkKSAmJiAoaW5mb1B0ci0+bkJ1dHRvbkRvd24gPj0gMCkpIHsKLQorCWluZm9QdHItPmJDYXB0dXJlZCA9IEZBTFNFOworCVJlbGVhc2VDYXB0dXJlICgpOwogCWJ0blB0ciA9ICZpbmZvUHRyLT5idXR0b25zW2luZm9QdHItPm5CdXR0b25Eb3duXTsKLQotCi0KLQogCWJ0blB0ci0+ZnNTdGF0ZSAmPSB+VEJTVEFURV9QUkVTU0VEOworCisJaWYgKGJ0blB0ci0+ZnNTdHlsZSAmIFRCU1RZTEVfQ0hFQ0spIHsKKwkgICAgaWYgKGJ0blB0ci0+ZnNTdHlsZSAmIFRCU1RZTEVfR1JPVVApIHsKKwkJbk9sZEluZGV4ID0gVE9PTEJBUl9HZXRDaGVja2VkR3JvdXBCdXR0b25JbmRleCAoaW5mb1B0ciwgaW5mb1B0ci0+bkJ1dHRvbkRvd24pOworCQlpZiAobk9sZEluZGV4ID09IGluZm9QdHItPm5CdXR0b25Eb3duKQorCQkgICAgcmV0dXJuIDA7CisJCWlmIChuT2xkSW5kZXggIT0gLTEpCisJCSAgICBpbmZvUHRyLT5idXR0b25zW25PbGRJbmRleF0uZnNTdGF0ZSAmPSB+VEJTVEFURV9DSEVDS0VEOworCQlidG5QdHItPmZzU3RhdGUgfD0gVEJTVEFURV9DSEVDS0VEOworCSAgICB9CisJICAgIGVsc2UgeworCQlpZiAoYnRuUHRyLT5mc1N0YXRlICYgVEJTVEFURV9DSEVDS0VEKQorCQkgICAgYnRuUHRyLT5mc1N0YXRlICY9IH5UQlNUQVRFX0NIRUNLRUQ7CisJCWVsc2UKKwkJICAgIGJ0blB0ci0+ZnNTdGF0ZSB8PSBUQlNUQVRFX0NIRUNLRUQ7CisJICAgIH0KKwl9CisKIAlpbmZvUHRyLT5uQnV0dG9uRG93biA9IC0xOwogCWluZm9QdHItPm5PbGRIaXQgPSAtMTsKIAotCWluZm9QdHItPmJDYXB0dXJlZCA9IEZBTFNFOwotCVJlbGVhc2VDYXB0dXJlICgpOwotCiAJaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisJaWYgKG5PbGRJbmRleCAhPSAtMSkKKwkgICAgVE9PTEJBUl9EcmF3QnV0dG9uICh3bmRQdHIsICZpbmZvUHRyLT5idXR0b25zW25PbGRJbmRleF0sIGhkYyk7CiAJVE9PTEJBUl9EcmF3QnV0dG9uICh3bmRQdHIsIGJ0blB0ciwgaGRjKTsKIAlSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKIApAQCAtMTA0Nyw2ICsxNTgxLDcgQEAKIAlwYXJlbnQgPSBHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZik7CiAJR2V0Q2xpZW50UmVjdDMyKHBhcmVudCwgJnBhcmVudF9yZWN0KTsKICAgICAgICAgaW5mb1B0ci0+bldpZHRoID0gcGFyZW50X3JlY3QucmlnaHQgLSBwYXJlbnRfcmVjdC5sZWZ0OworCVRPT0xCQVJfQ2FsY1Rvb2xiYXIgKHduZFB0cik7CiAJTW92ZVdpbmRvdzMyKHduZFB0ci0+aHduZFNlbGYsIHBhcmVudF9yZWN0LmxlZnQsIHBhcmVudF9yZWN0LnRvcCwgLy8wLCAwLAogCQkgICAgIGluZm9QdHItPm5XaWR0aCwgaW5mb1B0ci0+bkhlaWdodCwgVFJVRSk7CiAvLyAgICB9CkBAIC0xMDcyLDExICsxNjA3LDE1IEBACiAJY2FzZSBUQl9BRERCVVRUT05TMzJBOgogCSAgICByZXR1cm4gVE9PTEJBUl9BZGRCdXR0b25zMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotLy8JY2FzZSBUQl9BRERTVFJJTkczMkE6Ci0vLwkgICAgcmV0dXJuIFRPT0xCQVJfQWRkU3RyaW5nMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKy8vCWNhc2UgVEJfQUREQlVUVE9OUzMyVzoKIAotLy8JY2FzZSBUQl9BVVRPU0laRToKLS8vCSAgICByZXR1cm4gVE9PTEJBUl9BdXRvU2l6ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJY2FzZSBUQl9BRERTVFJJTkczMkE6CisJICAgIHJldHVybiBUT09MQkFSX0FkZFN0cmluZzMyQSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKy8vCWNhc2UgVEJfQUREU1RSSU5HMzJXOgorCisJY2FzZSBUQl9BVVRPU0laRToKKwkgICAgcmV0dXJuIFRPT0xCQVJfQXV0b1NpemUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCiAJY2FzZSBUQl9CVVRUT05DT1VOVDoKIAkgICAgcmV0dXJuIFRPT0xCQVJfQnV0dG9uQ291bnQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtMTA4Nyw4ICsxNjI2LDggQEAKIAljYXNlIFRCX0NIQU5HRUJJVE1BUDoKIAkgICAgcmV0dXJuIFRPT0xCQVJfQ2hhbmdlQml0bWFwICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotLy8JY2FzZSBUQl9DSEVDS0JVVFRPTjoKLS8vCSAgICByZXR1cm4gVE9PTEJBUl9DaGVja0J1dHRvbiAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJY2FzZSBUQl9DSEVDS0JVVFRPTjoKKwkgICAgcmV0dXJuIFRPT0xCQVJfQ2hlY2tCdXR0b24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCiAJY2FzZSBUQl9DT01NQU5EVE9JTkRFWDoKIAkgICAgcmV0dXJuIFRPT0xCQVJfQ29tbWFuZFRvSW5kZXggKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtMTEwNiw3ICsxNjQ1LDIwIEBACiAJY2FzZSBUQl9HRVRCSVRNQVA6CiAJICAgIHJldHVybiBUT09MQkFSX0dldEJpdG1hcCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLS8vCWNhc2UgVEJfR0VUQklUTUFQRkxBR1M6CisJY2FzZSBUQl9HRVRCSVRNQVBGTEFHUzoKKwkgICAgcmV0dXJuIFRPT0xCQVJfR2V0Qml0bWFwRmxhZ3MgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBUQl9HRVRCVVRUT046CisJICAgIHJldHVybiBUT09MQkFSX0dldEJ1dHRvbiAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKy8vCWNhc2UgVEJfR0VUQlVUVE9OSU5GTzoJCQkvKiA0LjcxICovCisvLwljYXNlIFRCX0dFVEJVVFRPTlNJWkU6CQkJLyogNC43MCAqLworCisJY2FzZSBUQl9HRVRCVVRUT05URVhUMzJBOgorCSAgICByZXR1cm4gVE9PTEJBUl9HZXRCdXR0b25UZXh0MzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBUQl9HRVRCVVRUT05URVhUMzJXOgorLy8JY2FzZSBUQl9HRVRDT0xPUlNDSEVNRToJCQkvKiA0LjcxICovCiAvLwljYXNlIFRCX0dFVERJU0FCTEVESU1BR0VMSVNUOgkJLyogNC43MCAqLwogLy8JY2FzZSBUQl9HRVRFWFRFTkRFRFNUWUxFOgkJLyogNC43MSAqLwogLy8JY2FzZSBUQl9HRVRIT1RJTUFHRUxJU1Q6CQkvKiA0LjcwICovCkBAIC0xMTE0LDE2ICsxNjY2LDI5IEBACiAvLwljYXNlIFRCX0dFVElNQUdFTElTVDoJCQkvKiA0LjcwICovCiAvLwljYXNlIFRCX0dFVElOU0VSVE1BUks6CQkJLyogNC43MSAqLwogLy8JY2FzZSBUQl9HRVRJTlNFUlRNQVJLQ09MT1I6CQkvKiA0LjcxICovCi0vLwljYXNlIFRCX0dFVElURU1SRUNUOgorCisJY2FzZSBUQl9HRVRJVEVNUkVDVDoKKwkgICAgcmV0dXJuIFRPT0xCQVJfR2V0SXRlbVJlY3QgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCiAvLwljYXNlIFRCX0dFVE1BWFNJWkU6CQkJLyogNC43MSAqLwogLy8JY2FzZSBUQl9HRVRPQkpFQ1Q6CQkJLyogNC43MSAqLwogLy8JY2FzZSBUQl9HRVRQQURESU5HOgkJCS8qIDQuNzEgKi8KIC8vCWNhc2UgVEJfR0VUUkVDVDoJCQkvKiA0LjcwICovCi0vLwljYXNlIFRCX0dFVFJPV1M6Ci0vLwljYXNlIFRCX0dFVFNUQVRFOgotLy8JY2FzZSBUQl9HRVRTVFlMRToJCQkvKiA0LjcwICovCisKKwljYXNlIFRCX0dFVFJPV1M6CisJICAgIHJldHVybiBUT09MQkFSX0dldFJvd3MgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBUQl9HRVRTVEFURToKKwkgICAgcmV0dXJuIFRPT0xCQVJfR2V0U3RhdGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBUQl9HRVRTVFlMRToKKwkgICAgcmV0dXJuIFRPT0xCQVJfR2V0U3R5bGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCiAvLwljYXNlIFRCX0dFVFRFWFRST1dTOgkJCS8qIDQuNzAgKi8KLS8vCWNhc2UgVEJfR0VUVE9PTFRJUFM6CisKKwljYXNlIFRCX0dFVFRPT0xUSVBTOgorCSAgICByZXR1cm4gVE9PTEJBUl9HZXRUb29sVGlwcyAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKIC8vCWNhc2UgVEJfR0VUVU5JQ09ERUZPUk1BVDoKIAogCWNhc2UgVEJfSElERUJVVFRPTjoKQEAgLTExMzIsMTIgKzE2OTcsMTMgQEAKIAljYXNlIFRCX0hJVFRFU1Q6CiAJICAgIHJldHVybiBUT09MQkFSX0hpdFRlc3QgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0vLwljYXNlIFRCX0lOREVURVJNSU5BVEU6Ci0vLwkgICAgcmV0dXJuIFRPT0xCQVJfSW5kZXRlcm1pbmF0ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJY2FzZSBUQl9JTkRFVEVSTUlOQVRFOgorCSAgICByZXR1cm4gVE9PTEJBUl9JbmRldGVybWluYXRlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotLy8JY2FzZSBUQl9JTlNFUlRCVVRUT046Ci0vLwkgICAgcmV0dXJuIFRPT0xCQVJfSW5zZXJ0QnV0dG9uICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwljYXNlIFRCX0lOU0VSVEJVVFRPTjMyQToKKwkgICAgcmV0dXJuIFRPT0xCQVJfSW5zZXJ0QnV0dG9uMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAorLy8JY2FzZSBUQl9JTlNFUlRCVVRUT04zMlc6CiAvLwljYXNlIFRCX0lOU0VSVE1BUktISVRURVNUOgkJLyogNC43MSAqLwogCiAJY2FzZSBUQl9JU0JVVFRPTkNIRUNLRUQ6CkBAIC0xMTU5LDE4ICsxNzI1LDE3IEBACiAJICAgIHJldHVybiBUT09MQkFSX0lzQnV0dG9uUHJlc3NlZCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKIC8vCWNhc2UgVEJfTE9BRElNQUdFUzoJCQkvKiA0LjcwICovCi0vLwljYXNlIFRCX01BUEFDQ0VMRVJBVE9SOgkJCS8qIDQuNzEgKi8KLQorLy8JY2FzZSBUQl9NQVBBQ0NFTEVSQVRPUjMyQToJCS8qIDQuNzEgKi8KKy8vCWNhc2UgVEJfTUFQQUNDRUxFUkFUT1IzMlc6CQkvKiA0LjcxICovCiAvLwljYXNlIFRCX01BUktCVVRUT046CQkJLyogNC43MSAqLwotLy8JICAgIHJldHVybiBUT09MQkFSX01hcmtCdXR0b24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwotCiAvLwljYXNlIFRCX01PVkVCVVRUT046CQkJLyogNC43MSAqLwogCiAJY2FzZSBUQl9QUkVTU0JVVFRPTjoKIAkgICAgcmV0dXJuIFRPT0xCQVJfUHJlc3NCdXR0b24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCiAvLwljYXNlIFRCX1JFUExBQ0VCSVRNQVA6Ci0vLwljYXNlIFRCX1NBVkVSRVNUT1JFOgorLy8JY2FzZSBUQl9TQVZFUkVTVE9SRTMyQToKKy8vCWNhc2UgVEJfU0FWRVJFU1RPUkUzMlc6CiAvLwljYXNlIFRCX1NFVEFOQ0hPUkhJR0hMSUdIVDoJCS8qIDQuNzEgKi8KIAogCWNhc2UgVEJfU0VUQklUTUFQU0laRToKQEAgLTEyMDEsOCArMTc2NiwxMiBAQAogLy8JY2FzZSBUQl9TRVRJTlNFUlRNQVJLQ09MT1I6CQkvKiA0LjcxICovCiAvLwljYXNlIFRCX1NFVE1BWFRFWFRST1dTOgkJCS8qIDQuNzAgKi8KIC8vCWNhc2UgVEJfU0VUUEFERElORzoJCQkvKiA0LjcxICovCi0vLwljYXNlIFRCX1NFVFBBUkVOVDoKLS8vCWNhc2UgVEJfU0VUUk9XUzoKKworCWNhc2UgVEJfU0VUUEFSRU5UOgorCSAgICByZXR1cm4gVE9PTEJBUl9TZXRQYXJlbnQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBUQl9TRVRST1dTOgorCSAgICByZXR1cm4gVE9PTEJBUl9TZXRSb3dzICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAogCWNhc2UgVEJfU0VUU1RBVEU6CiAJICAgIHJldHVybiBUT09MQkFSX1NldFN0YXRlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTEyMTAsNyArMTc3OSw5IEBACiAJY2FzZSBUQl9TRVRTVFlMRToKIAkgICAgcmV0dXJuIFRPT0xCQVJfU2V0U3R5bGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0vLwljYXNlIFRCX1NFVFRPT0xUSVBTOgorCWNhc2UgVEJfU0VUVE9PTFRJUFM6CisJICAgIHJldHVybiBUT09MQkFSX1NldFRvb2xUaXBzICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwogLy8JY2FzZSBUQl9TRVRVTklDT0RFRk9STUFUOgogCiAJY2FzZSBXTV9DUkVBVEU6CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9icmVhay5jIGIvZGVidWdnZXIvYnJlYWsuYwppbmRleCBhY2JmY2IzLi42OGRjNTg4IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9icmVhay5jCisrKyBiL2RlYnVnZ2VyL2JyZWFrLmMKQEAgLTM1MiwxMyArMzUyLDMxIEBACiAgICAgICAgICAgICBhZGRyLm9mZiA9IHBNb2R1bGUtPmlwOwogICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2luMTYgdGFzayAnJXMnOiAiLCBlbnRyeS5zek1vZHVsZSApOwogICAgICAgICAgICAgREVCVUdfQWRkQnJlYWtwb2ludCggJmFkZHIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKHdtPVBST0NFU1NfQ3VycmVudCgpLT5tb2RyZWZfbGlzdDt3bTt3bT13bS0+bmV4dCkgewotCWFkZHIuc2VnID0gMDsKLQlhZGRyLm9mZiA9KERXT1JEKVJWQV9QVFIod20tPm1vZHVsZSxPcHRpb25hbEhlYWRlci5BZGRyZXNzT2ZFbnRyeVBvaW50KTsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2luMzIgbW9kdWxlICclcyc6ICIsIHdtLT5tb2RuYW1lICk7Ci0gICAgICAgIERFQlVHX0FkZEJyZWFrcG9pbnQoICZhZGRyICk7CisJfQorCWVsc2UgLyogUEUgbW9kdWxlICovCisJeworICAgIAorCSAgICBpZiAoISh3bSA9IFBST0NFU1NfQ3VycmVudCgpLT5tb2RyZWZfbGlzdCkpCisJICAgIHsKKwkJYWRkci5zZWcgPSAwOworCQlhZGRyLm9mZiA9IChEV09SRClSVkFfUFRSKCBwTW9kdWxlLT5tb2R1bGUzMiwKKwkJCSAgIE9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQl3aGlsZSAod20pCisJCXsKKwkJICAgIGlmICh3bS0+bW9kdWxlID09IHBNb2R1bGUtPm1vZHVsZTMyKSBicmVhazsKKwkJICAgIHdtID0gd20tPm5leHQ7CisJCX0KKwkJaWYgKCF3bSkgY29udGludWU7CisJCWFkZHIuc2VnID0gMDsKKwkJYWRkci5vZmYgPSAoRFdPUkQpUlZBX1BUUiggd20tPm1vZHVsZSwKKwkJCSAgIE9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQpOworCSAgICB9CisJICAgIGZwcmludGYoIHN0ZGVyciwgIldpbjMyIHRhc2sgJyVzJzogIiwgZW50cnkuc3pNb2R1bGUgKTsKKwkgICAgREVCVUdfQWRkQnJlYWtwb2ludCggJmFkZHIgKTsKKwl9CiAgICAgfQogCiAgICAgREVCVUdfU2V0QnJlYWtwb2ludHMoIFRSVUUgKTsgIC8qIFNldHVwIGJyZWFrcG9pbnRzICovCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9tZW1vcnkuYyBiL2RlYnVnZ2VyL21lbW9yeS5jCmluZGV4IDlmMGNiNTIuLjBiMjY3NDggMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL21lbW9yeS5jCisrKyBiL2RlYnVnZ2VyL21lbW9yeS5jCkBAIC00Nyw3ICs0Nyw3IEBACiAKICAgd2hpbGUgKGZnZXRzKCBidWYsIDc5LCBmcCkpIHsKICAgICBzc2NhbmYoYnVmLCAiJXgtJXggJTNzIiwgKGludCAqKSAmc3RhcnQsIChpbnQgKikgJmVuZCwgcHJvdCk7Ci0gICAgaWYgKCBlbmQgPCBhZGRyKQorICAgIGlmICggZW5kIDw9IGFkZHIpCiAgICAgICBjb250aW51ZTsKICAgICBpZiAoc3RhcnQgPD0gYWRkciAmJiBhZGRyK3NpemUgPCBlbmQpIHsKICAgICAgIGlmIChyd2ZsYWcpIApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvc3RhYnMuYyBiL2RlYnVnZ2VyL3N0YWJzLmMKaW5kZXggM2FmMWVmOS4uMTBhZGE1ZCAxMDA2NDQKLS0tIGEvZGVidWdnZXIvc3RhYnMuYworKysgYi9kZWJ1Z2dlci9zdGFicy5jCkBAIC02LDcgKzYsNiBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CkBAIC0xNzgsOSArMTc3LDkgQEAKIAkgICAgeC0tOwogCXgrKzsJCQkJLyogJygnICovCiAJZmlsZW5yPXN0cnRvbCh4LCZ4LDEwKTsJCS8qIDxpbnQ+ICovCi0JYXNzZXJ0KCooeCsrKT09JywnKTsJCS8qICcsJyAqLworCXgrKzsJCQkJLyogJywnICovCiAJc3VibnI9c3RydG9sKHgsJngsMTApOwkJLyogPGludD4gKi8KLQlhc3NlcnQoKih4KyspPT0nKScpOwkJLyogJyknICovCisJeCsrOwkJCQkvKiAnKScgKi8KICAgICB9IGVsc2UgewogCXdoaWxlICgoKng+PScwJykgJiYgKCp4PD0nOScpKQogCSAgICB4LS07CkBAIC00NzgsMTMgKzQ3NywxMyBAQAogCSAgICAgLyogYXI8dHlwZWluZm9fbm9kZWY+OzxpbnQ+OzxpbnQ+Ozx0eXBlaW5mbz4sPGludD4sPGludD47OyAqLwogCiAJICAgICB0YyAgPSBjICsgMzsKLQkgICAgIGFzc2VydChjWzJdPT0ncicpOworCSAgICAgCQkJCQkJLyogJ3InICovCiAJICAgICBERUJVR19SZWFkVHlwZUVudW0oJnRjKTsKLQkgICAgIGFzc2VydCgqKHRjKyspPT0nOycpOyAJCQkvKiAnOycgKi8KKwkgICAgIHRjKys7CQkgCQkJLyogJzsnICovCiAJICAgICBhcnJtaW4gPSBzdHJ0b2wodGMsICZ0YywgMTApOyAJCS8qIDxpbnQ+ICovCi0JICAgICBhc3NlcnQoKih0YysrKT09JzsnKTsgCQkJLyogJzsnICovCisJICAgICB0YysrOwkJIAkJCS8qICc7JyAqLwogCSAgICAgYXJybWF4ID0gc3RydG9sKHRjLCAmdGMsIDEwKTsJCS8qIDxpbnQ+ICovCi0JICAgICBhc3NlcnQoKih0YysrKT09JzsnKTsgCQkJLyogJzsnICovCisJICAgICB0YysrOwkJIAkJCS8qICc7JyAqLwogCSAgICAgZGF0YXR5cGUgPSBzdGFiX3R5cGVzW0RFQlVHX1JlYWRUeXBlRW51bSgmdGMpXTsgLyogPHR5cGVpbmZvPiAqLwogCSAgICAgaWYoICp0YyA9PSAnXDAnICkKIAkJICpjID0gJ1wwJzsKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vYXNwaSBiL2RvY3VtZW50YXRpb24vYXNwaQppbmRleCA5NDIzNTdlLi5hMGI5ZDQzIDEwMDY0NAotLS0gYS9kb2N1bWVudGF0aW9uL2FzcGkKKysrIGIvZG9jdW1lbnRhdGlvbi9hc3BpCkBAIC0yMyw2ICsyMyw4IEBACiAoQVNQSSkuIEF0IGxlYXN0IHdpdGggTXVzdGVrLCB0aGV5IGFsbG93IHlvdSB0aGUgY2hvaWNlIG9mIHVzaW5nCiB0aGUgYnVpbHRpbiBjYXJkIG9yIHRoZSAiQWRhcHRlYyAoQUhBKSIgY29tcGF0aWJsZSBkcml2ZXJzLiBUaGlzIHdpbGwgbm90CiB3b3JrIGFueSBvdGhlciB3YXkuCitTb2Z0d2FyZSB0aGF0IGFjY2Vzc2VzIHRoZSBzY2FubmVyIHZpYSBhIERPUyBBU1BJIGRyaXZlciAoZS5nLiBBU1BJMkRPUykKK2lzIHN1cHBvcnRlZCwgdG9vLiBbQU1dCiAKIDEpIFlvdSBwcm9iYWJseSBuZWVkIGEgcmVhbCB3aW5kb3dzIGluc3RhbGwgb2YgdGhlIHNvZnR3YXJlIHRvIHNldCB0aGUKIExVTidzL1NDU0kgaWQncyB1cCBjb3JyZWN0bHkuIEknbSBub3QgZXhhY3RseSBzdXJlLgpAQCAtNzAsOSArNzIsMTUgQEAKIFRoZSBiaWdnZXN0IGlzIHRoYXQgaXQgb25seSB3b3JrcyB1bmRlciBsaW51eCBhdCB0aGUgbW9tZW50LgogVGhlIEFTUEkgY29kZSB3YXMgb25seSB0ZXN0ZWQgdXNpbmcgYSBNdXN0ZWsgODAwU1Agd2l0aCBhIEJ1c2xvZ2ljCiBjb250cm9sbGVyIHVuZGVyIExpbnV4LgorVGhlIEFTUEkgY29kZSBoYXMgb25seSBiZWVuIHRlc3RlZCB3aXRoOgorLSBhIE11c3RlayA4MDBTUCB3aXRoIGEgQnVzbG9naWMgY29udHJvbGxlciB1bmRlciBMaW51eCBbQk1dCistIGEgU2llbWVucyBOaXhkb3JmIDkwMzYgd2l0aCBBZGFwdGVjIEFWQS0xNTA1IHVuZGVyIExpbnV4CisgIGFjY2Vzc2VkIHZpYSBET1NBU1BJLgorICBOb3RlIHRoYXQgSSBoYWQgY29sb3IgcHJvYmxlbXMsIHRob3VnaCAoYmFyZWx5IHJlYWRhYmxlIHJlc3VsdCkuIFtBTV0KIAogSSBtYWtlIG5vIHdhcnJhbnR5IHRvIHRoZSBhc3BpIGNvZGUuIEl0IG1ha2VzIG15IHNjYW5uZXIgd29yay4gWW91ciBzY2FubmVyCiBtYXkgZXhwbG9kZS4gSSBoYXZlIG5vIHdheSBvZiBkZXRlcm1pbmluZyB0aGlzLiBJIHRha2UgemVybyByZXNwb25zaWJpbGl0eSEKIAogCiBCcnVjZSBNaWxuZXIKK0FkZGl0aW9ucyBieSBBbmRyZWFzIE1vaHIKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vZGVidWctbXNncyBiL2RvY3VtZW50YXRpb24vZGVidWctbXNncwppbmRleCBkYTAwYjdmLi5lYWNmMzcwIDEwMDY0NAotLS0gYS9kb2N1bWVudGF0aW9uL2RlYnVnLW1zZ3MKKysrIGIvZG9jdW1lbnRhdGlvbi9kZWJ1Zy1tc2dzCkBAIC0xLDE0ICsxLDEyIEBACiBOb3RlOiBUaGUgbmV3IGRlYnVnZ2luZyBpbnRlcmZhY2UgY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUgc3RhYmxlLAogICAgICAgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBpbi1tZW1vcnkgbWVzc2FnZSBjb25zdHJ1Y3Rpb24gZnVuY3Rpb25zLgogICAgICAgSG93ZXZlciwgdGhlcmUgaXMgc3RpbGwgYSBsb3Qgb2Ygd29yayB0byBiZSBkb25lIHRvIHBvbGlzaAotICAgICAgdGhpbmdzIHVwIGFuZCB0byBjb252ZXJ0IHRoZSByZW1haW5pbmcgZnByaW50Zi4gVG8gbWFrZSBteSBsaWZlIAotICAgICAgZWFzaWVyLCBwbGVhc2UgZm9sbG93IHRoZSBndWlkZWxpbmVzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiAKKyAgICAgIHRoaW5ncyB1cC4gVG8gbWFrZSBteSBsaWZlIGVhc2llciwgcGxlYXNlIGZvbGxvdyB0aGUgZ3VpZGVsaW5lcworICAgICAgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIAogCi0gICAgICBSZWFkIHRoaXMgZG9jdW1lbnQgYmVmb3JlIHdyaXRpbmcgbmV3IGNvZGUuCi0gICAgICBBbHNvLCBETyBOT1QgVVNFIGZwcmludGYgKG9yIHByaW50ZikgdG8gb3V0cHV0IHRoaW5ncy4gQWxsIHRoZXNlCi0gICAgICB3aWxsIGhhdmUgdG8gYmUgdHJhbnNsYXRlZCB0byB0aGUgbmV3IGludGVyZmFjZSBhbmQgdGhlcmUgYXJlIGFscmVhZHkKLSAgICAgIGFib3V0IDEwMDAgb2YgdGhlbSEgQWxzbywgaW5zdGVhZCBvZiB3cml0aW5nIEZJWE1FcyBpbiB0aGUgc291cmNlLAotICAgICAgb3V0cHV0IGEgRklYTUUgbWVzc2FnZSBpZiB5b3UgY2FuLiAKKyAgICAgIFJlYWQgdGhpcyBkb2N1bWVudCBiZWZvcmUgd3JpdGluZyBuZXcgY29kZS4gRE8gTk9UIFVTRSBmcHJpbnRmIAorICAgICAgKG9yIHByaW50ZikgdG8gb3V0cHV0IHRoaW5ncy4gQWxzbywgaW5zdGVhZCBvZiB3cml0aW5nIAorICAgICAgRklYTUVzIGluIHRoZSBzb3VyY2UsIG91dHB1dCBhIEZJWE1FIG1lc3NhZ2UgaWYgeW91IGNhbi4gCiAKICAgICAgIElNUE9SVEFOVDogYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIHRoZXJlIGlzIGEgIlN0eWxlIEd1aWRlIgogICAgICAgZm9yIGRlYnVnZ2luZyBtZXNzYWdlcy4gUGxlYXNlIHJlYWQgaXQuCkBAIC0zNDksOSArMzQ3LDI0IEBACiBBbHNvLCBub3RlIHRoYXQgYXQgdGhlIG1vbWVudDoKICAgIC0gdGhlIGZpeG1lIGFuZCBlcnIgY2xhc3NlcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0CiAgICAtIHRoZSB0cmFjZSBhbmQgd2FybiAgY2xhc3NlcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdAotICAgLSB0aGVyZSBpcyBubyB3YXkgdG8gY29tcGlsZSBvdXQgdGhlIG1lc3NhZ2VzLiBBbGwgYXJlIAotICAgICBydW50aW1lIGNvbmZpZ3VyYWJsZS4gVGhpcyB3aWxsIChob3BlZnVsbHkpIGNvbWUgbmV4dCAKLSAgICAgcmVsZWFzZS4KKworCitDb21waWxpbmcgT3V0IERlYnVnZ2luZyBNZXNzYWdlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gY29tcGlsZSBvdXQgdGhlIGRlYnVnZ2luZyBtZXNzYWdlcywgcHJvdmlkZSBjb25maWd1cmUgd2l0aCB0aGUKK2ZvbGxvd2luZyBvcHRpb25zOgorCistLWRpc2FibGUtZGVidWcgICAgICAtLSB0dXJucyBvZmYgVFJBQ0UsIFdBUk4sIGFuZCBGSVhNRSAoYW5kIERVTVApLgorCistLWRpc2FibGUtdHJhY2UgICAgICAtLSB0dXJucyBvZmYgVFJBQ0Ugb25seS4KKworVGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBleGVjdXRhYmxlIHRoYXQsIHdoZW4gc3RyaXBwZWQsIGlzIGFib3V0IDE1JS0yMCUKK3NtYWxsZXIuICBOb3RlLCBob3dldmVyLCB0aGF0IHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGVmZmVjdGl2ZWx5IGRlYnVnCitXaW5lIHdpdGhvdXQgdGhlc2UgbWVzc2FnZXMuICAKKworVGhpcyBmZWF0dXJlIGhhcyBub3QgYmVlbiBleHRlbnNpdmVseSB0ZXN0ZWQtLWl0IG1heSBzdWJ0bHkgYnJlYWsgc29tZQordGhpbmdzLgogCiAKIEEgRmV3IE5vdGVzIG9uIFN0eWxlCmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL2RlYnVnZ2luZyBiL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCmluZGV4IDZkZTBjYjUuLmRjYzlkZTAgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCisrKyBiL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCkBAIC02OCwxMCArNjgsOSBAQAogCiAgMy4gSWYgeW91IGhhdmUgZm91bmQgYSBtaXNiZWhhdmluZyBmdW5jdGlvbiwgdHJ5IHRvIGZpbmQgb3V0IHdoeSBpdAogICAgIG1pc2JlaGF2ZXMuIEZpbmQgdGhlIGZ1bmN0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4gVHJ5IHRvIG1ha2Ugc2Vuc2Ugb2YKLSAgICB0aGUgYXJndW1lbnRzIHBhc3NlZC4gVXN1YWxseSB0aGVyZSBpcyBhCi0gICAgImRwcmludGZfeHl6KHN0ZGRlYiwiRnVuY3Rpb24oLi4uKSIuLi4pOyIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICBmdW5jdGlvbi4gUmVydW4gd2luZSB3aXRoICItZGVidWdtc2cgK3h5eiwrcmVsYXkiIGFkZGVkIHRvIHRoZQotICAgIGNvbW1hbmRsaW5lLgorICAgIHRoZSBhcmd1bWVudHMgcGFzc2VkLiBVc3VhbGx5IHRoZXJlIGlzIGEgJ1RSQUNFKDxjaGFubmVsPiwiKC4uLilcbiIpOycgCisgICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24uIFJlcnVuIHdpbmUgd2l0aCAKKyAgICAiLWRlYnVnbXNnICt4eXosK3JlbGF5IiBhZGRlZCB0byB0aGUgY29tbWFuZGxpbmUuCiAKICA0LiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGhvdyB0byBkZWJ1ZyB1c2luZyB0aGUgaW50ZXJuYWwgZGVidWdnZXIgY2FuIGJlIAogICAgIGZvdW5kIGluIGRlYnVnZ2VyL1JFQURNRS4KQEAgLTgxLDcgKzgwLDcgQEAKICAgICArYWxsIiwgd2hpY2ggZHVtcHMgQUxMIGluY2x1ZGVkIGRlYnVnIGluZm9ybWF0aW9uIGluIHdpbmUuCiAKICA2LiBJZiB0aGF0IGlzbid0IGVub3VnaCBhZGQgbW9yZSBkZWJ1ZyBvdXRwdXQgZm9yIHlvdXJzZWxmIGludG8gdGhlCi0gICAgZnVuY3Rpb25zIHlvdSBmaW5kIHJlbGV2YW50LgorICAgIGZ1bmN0aW9ucyB5b3UgZmluZCByZWxldmFudC4gIFNlZSBkb2N1bWVudGF0aW9uL2RlYnVnLW1zZ3MuCiAgICAgWW91IG1pZ2h0IGFsc28gdHJ5IHRvIHJ1biB0aGUgcHJvZ3JhbSBpbiBnZGIgaW5zdGVhZCBvZiB1c2luZyB0aGUKICAgICBXSU5FLWRlYnVnZ2VyLiBJZiB5b3UgZG9uJ3QgdXNlIHRoZSAiLWRlc2t0b3AiIG9yICItbWFuYWdlZCIgb3B0aW9uLAogICAgIHN0YXJ0IHRoZSBXSU5FIHByb2Nlc3Mgd2l0aCAiLXN5bmMiLCBvciBjaGFuY2VzIGFyZSBnb29kIHRvIGdldCBYIGludG8KZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vd2luZS50ZXhpbmZvIGIvZG9jdW1lbnRhdGlvbi93aW5lLnRleGluZm8KaW5kZXggMTQyNWY4NC4uZGNmNzZhMSAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi93aW5lLnRleGluZm8KKysrIGIvZG9jdW1lbnRhdGlvbi93aW5lLnRleGluZm8KQEAgLTI3MSw2ICsyNzEsNyBAQAogQG1lbnUKICogQ29weWluZzo6ICAgICAgICAgICAgICAgICAgICAgTGljZW5zZSwgV2FycmFudHksIGFuZCBBdXRob3JzIG9mIFdpbmUuCiAqIEludHJvZHVjdGlvbjo6ICAgICAgICAgICAgICAgIEEgc2hvcnQgb3ZlcnZpZXcuCisqIFdpbmUgRGVzaWduOjogICAgICAgICAgICAgICAgIFRoZSBkZXNpZ24gb2YgV2luZS4KICogUmVmZXJlbmNlIE1hbnVhbDo6ICAgICAgICAgICAgVGhlIFdpbmUgcmVmZXJlbmNlIG1hbnVhbC4KICogSW5zdGFsbGF0aW9uOjogICAgICAgICAgICAgICAgSW5zdGFsbGluZyBhbmQgY29uZmlndXJpbmcgV2luZS4KICogVGhlIFdpbmUgUHJvamVjdDo6ICAgICAgICAgICAgSG93IHRvIGNvbnRyaWJ1dGUgdG8gV2luZS4KQEAgLTM0MCw1NCArMzQxLDM3IEBACiAKIAogCi1Abm9kZSBJbnRyb2R1Y3Rpb24sIFJlZmVyZW5jZSBNYW51YWwsIENvcHlpbmcsIFRvcAorQG5vZGUgSW50cm9kdWN0aW9uLCBXaW5lIERlc2lnbiwgQ29weWluZywgVG9wCiBAY2hhcHRlciBJbnRyb2R1Y3Rpb24KIAotQGNlbnRlciBXaW5lOgotQGNlbnRlciB0aGUgV0lOZG93cyBFbXVsYXRvciwKLUBjZW50ZXIgb3IgV2luZSBJcyBOb3QgYW4gRW11bGF0b3IKLQotRklYTUU6IG1ha2UgYW4gZWFzeS1yZWFkYWJsZSBmbHVlbnQgdGV4dCBvdXQgb2YgdGhpcy4KLQotV2VsY29tZSB0byBAd2luZW1hbnVhbHRpdGxle30uIFRoaXMgaXMgZWRpdGlvbiBAd2luZW1hbnVhbHZlcnNpb257fSwKLWxhc3QgdXBkYXRlZCBAd2luZW1hbnVhbGRhdGV7fS4KLQogQHN0cm9uZ3tXaGF0IGlzIFdpbmU/fQogCi1XaW5lIGlzIGEgcHJvZ3JhbSB0aGF0IGFsbG93cyBydW5uaW5nIE1TLVdpbmRvd3MgcHJvZ3JhbXMgdW5kZXIgWDExLgotCi0KLVdpbmUgaW5jb3Jwb3JhdGVzIHR3byBmZWF0dXJlcywgdGhlIHByb2dyYW0gbG9hZGVyIGFuZCBAd2luZWxpYnt9OgorV2luZSBpcyBhIFdpbmRvd3MtY29tcGF0aWJpbGl0eSBsYXllciBmb3IgVW5peCBhbmQgWDExLgorVGhlIFdpbmUgc3lzdGVtIGNvbnNpc3RzIG9mIHNldmVyYWwgdGhpbmc6CiBAZW51bWVyYXRlCiBAaXRlbQotWW91IGNhbiBydW4gQG1zd2luZG93c3t9IGJpbmFyaWVzIChwcm9ncmFtcykgaW4gV2luZS4gV2luZSBjb250YWlucyBhCi1wcm9ncmFtIGxvYWRlciB3aGljaCBsb2FkcyBhbmQgZXhlY3V0ZXMgYW4gQG1zd2luZG93c3t9IGJpbmFyeS4gSXQgdXNlcwotdGhlIEB3aW5lbGlie30gZmVhdHVyZXMgb2YgV2luZSB0byB0cmFuc2xhdGUgQFdJTjMye30gYW5kIEBXSU4xNnt9IGNhbGxzCi10byB0aGVpciBAdW5peHt9L1gxMSBlcXVpdmFsZW50LgotCi1Cb3RoIDE2IGJpdCBhbmQgMzIgYml0IGJpbmFyaWVzIGNhbiBiZSBsb2FkZWQuCitBbiBBUEksIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUgV2luZSBBUEksCitkZXNpZ25lZCB0byBiZSBhcyBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggdGhlCitAbXN3aW5kb3dze30gQVBJCiBAaXRlbQotQHdpbmVsaWJ7fTogV2luZSBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgbGlicmFyeSB3aGljaCBpbXBsZW1lbnRzIHRoZSAKLUBtc3dpbmRvd3N7fSBBUEkgb24gdG9wIG9mIGEgQHVuaXh7fSBvciBAdW5peHt9LWxpa2Ugb3BlcmF0aW5nIHN5c3RlbQotd2l0aCBYMTEuIEB3aW5lbGlie30gKGkuZS4gdGhlIFdpbmUgbGlicmFyeSkgdHJhbnNsYXRlcyBAV0lOMTZ7fSBvcgotQFdJTjMye30gQVBJIGNhbGxzIHRvIHRoZWlyIEB1bml4e30vWDExIGVxdWl2YWxlbnQuCitBIGxpYnJhcnksIGNhbGxlZCBAd2luZWxpYnt9LCB3aGljaCBpbXBsZW1lbnRzIHRoaXMgQVBJCitAaXRlbQorQSBiaW5hcnkgY29tcGF0aWJpbGl0eSBsYXllciwgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHRoZSBXaW5lCitlbXVsYXRvciwgd2hpY2ggYWN0cyBhcyBhIHByb2dyYW0gbG9hZGVyIGZvciBuYXRpdmUgV2luZG93cyBiaW5hcmllcy4KK1RoZSBlbXVsYXRvciB3b3JrcyBmb3IgYm90aCAxNiBhbmQgMzIgYml0IEludGVsIGJpbmFyaWVzLCBhbmQKK3Byb3ZpZGVzIGFsbCB0aGUgYXBwcm9wcmlhdGUgdHJhbnNsYXRpb24gYmV0d2VlbiAxNiBhbmQgMzIgYml0IGNvZGUKKyh0aHVua2luZykuIFJlYWwgbW9kZSBpbnRlcnJ1cHRzIGFyZSBhbHNvIHN1cHBvcnRlZCwgYW5kIHRoZWlyCitmdW5jdGlvbmFsaXR5IGlzIGltcGxlbWVudGVkIGluIEB3aW5lbGlie30uCiAKLVlvdSBjYW4gd3JpdGUgYSB1c2VyLWxldmVsIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCBjYWxscyB0aGUgQFdJTjE2e30KLW9yIEBXSU4zMnt9IEFQSSBmdW5jdGlvbnMgYW5kIGNvbXBpbGUgaXQgb24gYSBAdW5peHt9IGJveC4KIEBlbmQgZW51bWVyYXRlCiAKLUBzdHJvbmd7U3RhdHVzfQorQHN0cm9uZ3tTeXN0ZW0gUmVxdWlyZW1lbnRzfQogCi1XaW5lIGlzIHN0aWxsIGF0IGRldmVsb3BtZW50IHN0YWdlLiBUaGUgZmlsZSBAZmlsZXtBTk5PVU5DRX0gc2F5cywKLWBgVGhpcyBpcyBzdGlsbCBhIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kCi1tYW55IHVuaW1wbGVtZW50ZWQgQVBJIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsKLWNvcnJlY3RseS4nJwotQHhyZWZ7V2FycmFudHl9LCBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KIAotQHN0cm9uZ3tSZXF1aXJlbWVudHN9Ci0KLVdpbmUgbmVlZHMgYW4gODB4ODYgQ1BVIHRvIHJ1biBvbi4gRW11bGF0aW5nIHRoZSBDUFUgaXMgY3VycmVudGx5IG5vdAotcG9zc2libGUuCitXaW5lIHByb3ZpZGVzIGJpbmFyeSBzdXBwb3J0IGZvciBJbnRlbCBjb2RlIG9uIEludGVsIGhhcmR3YXJlIG9ubHkuIAorTmVpdGhlciBoYXJkd2FyZSBlbXVsYXRpb24KK25vciBub24tSW50ZWwgYmluYXJpZXMgYXJlIHN1cHBvcnRlZC4KK0B3aW5lbGlie30gc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHBvcnQgdG8ganVzdCBhYm91dCBhbnkgVW5peCBzeXN0ZW0uCiAKIEN1cnJlbnRseSwgeW91IG11c3QgaGF2ZSBvbmUgb2Y6CiBAaXRlbWl6ZSBAYnVsbGV0CkBAIC0zOTcsNDYgKzM4MSwxNjEgQEAKIE5ldEJTRC1jdXJyZW50CiBAaXRlbQogRnJlZUJTRC1jdXJyZW50IG9yIEZyZWVCU0QgMS4xCitAaXRlbQorT3BlbkJTRC9pMzg2IDIuMSBvciBsYXRlcgorQGl0ZW0KK1NvbGFyaXMgeDg2IDIuNSBvciBsYXRlcgogQGVuZCBpdGVtaXplCiBZb3UgbmVlZCBYMTEsIGFuZCB5b3UgbXVzdCBoYXZlIEBmaWxle2xpYlhwbX0gaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLgogCiBAc3Ryb25ne0F2YWlsYWJpbGl0eX0KIAotV2luZSBpcyBmcmVlIHNvZnR3YXJlLiBUaGUgZmlsZSBAZmlsZXtSRUFETUV9IHNheXMsIGBgQmFzaWNhbGx5LCB5b3UgY2FuIGRvCi1hbnl0aGluZyB3aXRoIGl0LCBleGNlcHQgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgaXQuJycKK1dpbmUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIGxpY2Vuc2UgaXMgQlNELXN0eWxlLiBCYXNpY2FsbHksIHlvdSBjYW4gZG8KK2FueXRoaW5nIHdpdGggaXQsIGV4Y2VwdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSBpdC4KIEB4cmVme0NvcHlpbmd9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAotQHN0cm9uZ3tQZXJmb3JtYW5jZX0KLQotV2luZSBpcyBleHBlY3RlZCB0byBydW4gQG1zd2luZG93c3t9IGJpbmFyaWVzIGFib3V0IHRoZSBzYW1lIHNwZWVkIGFzCi1AbXN3aW5kb3dze30gd291bGQuIEhvd2V2ZXIsIGJlIGF3YXJlIHRoYXQgdGhlIDE2IGJpdCB2ZXJzaW9ucyBvZgotQG1zd2luZG93c3t9IHByb2dyYW1zIGFyZSBnZW5lcmFsbHkgc2xvd2VyIHRoYW4gdGhlaXIgMzIgYml0Ci1jb3VudGVycGFydHMuCi0KIEBzdHJvbmd7RnVydGhlciBpbmZvcm1hdGlvbn0KIAogWW91IHNob3VsZCBjb25zdWx0IHRoZSBmaWxlcyBAZmlsZXtSRUFETUV9LCBAZmlsZXtBTk5PVU5DRX0sCiBAZmlsZXtSRUxFQVNFLU5PVEVTfSwgQGZpbGV7QlVHU30sIEBmaWxle0xJQ0VOU0V9LCBhbmQgQGZpbGV7V0FSUkFOVFl9LAogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBXaW5lIGRpc3RyaWJ1dGlvbi4KIAotVGhlIFdpbmUgRkFRLCBhdmFpbGFibGUgZnJvbSBAKgotQHVybHtmdHA6Ly9mdHAuYXNnYXJkcHJvLmNvbS93aW5lL2RhdmUvV2luZS5GQVF9LCBAKgotQHVybHtmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9XaW5lLkZBUX0sIEAqCi1AdXJse2Z0cDovL3J0Zm0ubWl0LmVkdS9wdWIvdXNlbmV0LWJ5LWdyb3VwL2NvbXAuZW11bGF0b3JzLm1zLXdpbmRvd3Mud2luZS9XSU5FXyhXSU5kb3dzX0VtdWxhdG9yKV9GcmVxdWVudGx5X0Fza2VkX1F1ZXN0aW9uc30sIEAqCi1AdXJse2Z0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9XaW5lLkZBUX0sIEAqCi1AdXJse2h0dHA6Ly93d3cuYXNnYXJkcHJvLmNvbS93aW5lL2luZGV4Lmh0bWx9LCBAKgotZ2l2ZXMgYW5zd2VyIHRvIGEgbG90IG9mIHF1ZXN0aW9ucy4KK1RoZSBXaW5lIFVTRU5FVCBuZXdzZ3JvdXAgIEB1cmx7bmV3czpjb21wLmVtdWxhdG9ycy5tcy13aW5kb3dzLndpbmV9IAoraXMgdXNlZnVsIGZvciBib3RoIFdpbmUgZGV2ZWxvcGVycyBhbmQgV2luZSB1c2Vycy4gVGhlIFdpbmUgaG9tZSBwYWdlCitpcyBAdXJse2h0dHA6Ly93d3cud2luZWhxLmNvbS99LgogCi1UaGUgV2luZSBVU0VORVQgbmV3c2dyb3VwIGlzIGludGVyZXN0aW5nIGZvciBkZXZlbG9wZXJzLiBJdCBkaXNjdXNzZXMgdGVjaG5pY2FsCi1tYXR0ZXJzIGFib3V0IFdpbmUuIFRoZSBhZGRyZXNzIGlzOiBAdXJse25ld3M6Y29tcC5lbXVsYXRvcnMubXMtd2luZG93cy53aW5lfS4KK0Bub2RlIFdpbmUgRGVzaWduLCAgUmVmZXJlbmNlIE1hbnVhbCwgIEludHJvZHVjdGlvbiwgIFRvcAorQGNoYXB0ZXIgV2luZSBEZXNpZ24KKworQHN1YnNlY3Rpb24gVGhlIFdpbmUgR3JhcGhpY3MgRHJpdmVyIE1vZGVsCisKK1dpbmUsIGxpa2UgV2luZG93cywgYWJzdHJhY3RzIGRyYXdpbmcgY29kZSBzbyB0aGF0IGFwcGxpY2F0aW9ucyBtYXkgYWNjZXNzCithIHdpZGUgdmFyaWV0eSBvZiBkZXZpY2VzLCBmcm9tIGRpZmZlcmVudCBraW5kcyBvZiBncmFwaGljcyBjYXJkcywKK1ggZGlzcGxheXMgYW5kIHByaW50ZXJzLCB1c2luZyBhIHNpbmdsZSB1bmlmaWVkIGdyYXBoaWNzIG1vZGVsLgorVGhpcyBtb2RlbCBpcyByZWZlcnJlZCB0byBhcyBHREk6IF9HX3JhcGhpY3MgX0Rfcml2ZXIgX0lfbnRlcmZhY2UuCitUaGlzIHNlY3Rpb24gZGlzY3Vzc2VzIHRoZSBXaW5lIGltcGxlbWVudGF0aW9uIG9mIEdESS4KK1RoZXJlIGFyZSA2MSBmdW5jdGlvbnMgaW4gdGhlIFdpbmUgZ3JhcGhpY3MgbW9kZWwsIGluY2x1ZGluZyBBcmMsIEJpdEJsdCwKK0Nob3JkLCBldGMuIEZvciBhIGNvbXBsZXRlIGxpc3QgYW5kIHByb3RvdHlwZXMsIHNlZSB0aGUgZGVmaW5pdGlvbgorb2YgRENfRlVOQ1RJT05TIGluIFtpbmNsdWRlL2dkaS5oXS4KKworV2luZSwgYXMgb2YgMlExOTk4LCBoYXMgdGhyZWUgbmF0aXZlIGRyaXZlcnM6IHRoZXNlIHByb3ZpZGUgc3VwcG9ydAorZm9yIHJlbmRlcmluZyB0byBYIGRpc3BsYXlzLCBtZXRhZmlsZXMsIGFuZCBXaW4xNiBuYXRpdmUgcHJpbnRlciBkcml2ZXJzLgorQXMgZmFyIGFzIFdpbmUgaXMgY29uY2VybmVkLCBhIGRyaXZlcgorc2ltcGx5IGNvbnNpc3RzIG9mIGEgbmFtZSBhbmQgYSB0YWJsZSBvZiBmdW5jdGlvbiBwb2ludGVycyAKKyhzZWUgW2dyYXBoaWNzL2RyaXZlci5jXSkuIFRoZXNlIGZ1bmN0aW9ucworYXJlIHRoZSBkcml2ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFyaW91cyBXaW5lIGdyYXBoaWNzCitvcGVyYXRpb25zICh0aGUgR0RJKS4gIFdpbmUgbWFpbnRhaW5zIGEgbGlua2VkIGxpc3Qgb2YgYWxsIGRyaXZlcnMgd2hpY2gKK3JlZ2lzdGVyIHRoZW1zZWx2ZXMgd2l0aCBXaW5lLCBhcyB3ZWxsIGFzIGEgYGBnZW5lcmljJycKK2RyaXZlci4gQ3VycmVudGx5LCB0aGUgWDExIGRyaXZlciByZWdpc3RlcnMgaXRzZWxmIGFzIERJU1BMQVksIHRoZQord2luMTYgZHJpdmVyIHJlZ2lzdGVycyBpdHNlbGYgYXMgdGhlIGdlbmVyaWMgZHJpdmVyLCBhbmQgdGhlIG1ldGFmaWxlCitkcml2ZXIgZG9lc24ndCByZWdpc3RlciBpdHNlbGYgYXQgYWxsLgorCitAc3Vic3Vic2VjdGlvbiBIb3cgYSBkcml2ZXIgZnVuY3Rpb24gZ2V0cyBpbnZva2VkCisKK0FsbCBkcmF3aW5nIGJ5IFdpbmUgYXBwbGljYXRpb25zIAoraXMgZG9uZSBpbiB0ZXJtcyBvZiBhIERldmljZSBDb250ZXh0IChEQykuCitCZWZvcmUgYW4gYXBwbGljYXRpb24gY2FuIGRyYXcsIGl0IG11c3QgY3JlYXRlIGEgREMsIGFuZCBhbGwgZHJhd2luZyBjYWxscworbXVzdCBwYXNzIGEgaGFuZGxlIHRvIHRoZSBEQyB0aGV5IHdpc2ggdG8gZHJhdyB0by4KK1tpbmNsdWRlL2dkaS5oXSBkZWZpbmVzIHNldmVyYWwgc3RydWN0dXJlcyByZWxhdGluZyB0byBEQ3MsIGluY2x1ZGluZworREMsIFdJTl9EQ19JTkZPLCBhbmQgRGV2aWNlQ2Fwcy4gVGhlIERldmljZUNhcHMgc3RydWN0dXJlIGlzIGF0IHRoZSBsb3dlc3QKK2xldmVsOiBpdCBob2xkcworaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gc3BlY2lmaWNzIG9mIHRoZSBncmFwaGljcyBkaXNwbGF5IAoraGFyZHdhcmUgYW5kIGFzc29jaWF0ZWQKK2RyaXZlci4gCitXSU5fRENfSU5GTyBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBzZXZlcmFsIGRldmljZSBpbmRlcGVuZGVudAorbW9kZXMgdGhlIERDIGNhbiBiZSBpbiwgcGx1cyBhIHBvaW50ZXIgdG8gRGV2aWNlQ2Fwcy4KK0ZpbmFsbHksCit0aGUgREMgc3RydWN0dXJlIGlzIHRoZSB0b3BsZXZlbCBzdHJ1Y3R1cmUgdXN1YWxseSBwYXNzZWQgYXJvdW5kLgorSXQgaG9sZHMgdmlld3BvcnQgaW5mb3JtYXRpb24sIGEgcG9pbnRlciB0byBXSU5fRENfSU5GTywgYW5kIGEKK3BvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRhYmxlIHRvIGJlIHVzZWQgd2hpbGUgcmVuZGVyaW5nIHRoYXQgREMuCitUaGlzIGZ1bmN0aW9uIHRhYmxlIGlzIGZpbGxlZCBhdCB0aGUgdGltZSBvZiBjcmVhdGluZyB0aGUgREMuCisKK0BjIE1vZGVzCisKK0BjICBTb21lIGRpc2N1c3Npb24gb2YgdGhlIHZhcmlvdXMgbW9kYWxpdGllcyBhdmFpbGFibGUgdG8gYSBEQyB3b3VsZCBiZSBuaWNlLgorCitAYyBDb29yZGluYXRlIFN5c3RlbXMKKworQGMgIFNvbWUgZGlzY3Vzc2lvbiBvZiB0aGUgbWF6ZSBvZiBjb29yZGluYXRlIHN5c3RlbXMgd291bGQgYWxzbyBiZSBuaWNlLgorCitAYyAgRGV2aWNlIENvb3JkaW5hdGVzCisKK0BjICBMb2dpY2FsIENvb3JkaW5hdGVzCisKK0BjICBXb3JsZCB0cmFuc2Zvcm1zCiAKIAorQHN1YnN1YnNlY3Rpb24gVGhlIFgxMSBkcml2ZXIKIAotQHhyZWZ7VGhlIFdpbmUgUHJvamVjdH0sIGlmIHlvdSBjb25zaWRlciBjb250cmlidXRpbmcgc29tZSB3b3JrLgorQXMgYSBwYXJ0IG9mIHRoZSBXaW5lIGxvYWRpbmcgcHJvY2VzcywKK1gxMURSVl9Jbml0IGluIFtncmFwaGljcy94MTFkcnYvaW5pdC5jXSBpcyBjYWxsZWQuIAorVGhpcyBpbml0aWFsaXplcyB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIFgxMSBkcml2ZXIgYW5kCityZWdpc3RlcnMgaXQgYXMgRElTUExBWS4gIFRoaXMgZnVuY3Rpb24gZmlyc3QgCitjYWxscyBpbml0aWFsaXphdGlvbiBwcm9jZWR1cmVzIGZvciB2YXJpb3VzIHBhcnRzIG9mIHRoZSBYMTEgZHJpdmVyLgorSXQgdGhlbgorY3JlYXRlcyBhbmQgCitmaWxscyBhIHN0YXRpYyBEZXZpY2VDYXBzCitzdHJ1Y3R1cmUgdG8gYmUgdXNlZCBmb3IgZXZlcnkgWDExIERDLgorRmluYWxseSwgaXQgZmlsbHMgdGhlIHRhYmxlIG9mIEdESSBmdW5jdGlvbnMgdG8gYmUgdXNlZCBmb3IgWDExCityZW5kZXJpbmcgYW5kIHJlZ2lzdGVycyBpdHNlbGYgYXMgYGBESVNQTEFZJycuCisKK0BzdWJzdWJzZWN0aW9uIFRoZSBNZXRhZmlsZSBEcml2ZXIKKworVGhlIG1ldGFmaWxlIGRyaXZlciBpcyB1bnVzdWFsLCBpbiB0aGF0IGl0IGlzIG5vdCBhIGRyaXZlciBmb3IgYW55CitraW5kIG9mIGRpc3BsYXkgZGV2aWNlLCBidXQgcmF0aGVyIGEgbWVjaGFuaXNtIHdoaWNoIGFsbG93cyB1c2luZwordGhlIFdpbmUgZ3JhcGhpY3MgbW9kZWwgYXMgYSBmaWxlIGZvcm1hdCBmb3Igc2F2aW5nIGdyYXBoaWNzLgorVGhlIGFkdmFudGFnZSBvZiB0aGlzIGlzIHRoYXQgaXQgYWxsb3dzIHVzaW5nIGlkZW50aWNhbCBmb3JtYXRzIGZvcgorc2F2aW5nIHBpY3R1cmVzIGFzIGlzIGFjdHVhbGx5IHVzZWQgdG8gZGlzcGxheSB0aGVtOyBpdCBpcyBhbmFsb2dvdXMKK3RvIERpc3BsYXkgUG9zdFNjcmlwdC4KKworVGhlIG1ldGFmaWxlIGRyaXZlciBpcyBpbnZva2VkIGV4cGxpY2l0bHkgYnkgdGhlIGFwcGxpY2F0aW9uLiBUaGUKK2FwcGxpY2F0aW9uIGNhbGxzIENyZWF0ZU1ldGFGaWxlKCkgdG8gY3JlYXRlIGEgc3BlY2lhbCBEQyBmb3IgcmVjb3JkaW5nCitncmFwaGljcyBkcmF3aW5nIG9wZXJhdGlvbnMgaW4gYSBtZXRhZmlsZS4gQW55IGRyYXdpbmcgb3BlcmF0aW9ucworcGVyZm9ybWVkIGluIHRoaXMgREMgYXJlIG5vdCBkcmF3biBwaHlzaWNhbGx5IGFueXdoZXJlLCB0aGV5IGFyZQoraW5zdGVhZCBzdG9yZWQgaW4gdGhlIG1ldGFmaWxlLiAgVGhlIERDIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGJ5IGEKK2NhbGwgdG8gQ2xvc2VNZXRhRmlsZSgpLCB3aGljaCBhbHNvIGZpbmlzaGVzIHdyaXRpbmcgdGhlIG1ldGFmaWxlLgorTWV0YWZpbGVzIG1heSBiZSB3cml0dGVuIGVpdGhlciB0byBhIGZpbGUgb3IgdG8gbWVtb3J5LiBMYXRlciwgdGhlCittZXRhZmlsZSBjYW4gYmUgcmVuZGVyZWQgKGluIGEgcGh5c2ljYWwgREMpIGJ5IFBsYXlNZXRhRmlsZSgpLgorCitUaGUgd2F5IHRoYXQgdGhpcyB3b3JrcyBpcyB0aGF0IGRldmljZSBjb250ZXh0cyBjb250YWluIGEgcG9pbnRlcgordG8gdGhlIGZ1bmN0aW9uIGxvb2t1cCB0YWJsZSBmb3IgZHJhd2luZyBvcGVyYXRpb25zIGFwcHJvcHJpYXRlIGZvcgordGhhdCBkZXZpY2UuCisKK05vdCBhbGwgZnVuY3Rpb25zIGluIHRoZSBXaW5lIGdyYXBoaWNzIG1vZGVsIGFyZSByZWxldmFudCB0byBtZXRhZmlsZXMsIGJ1dAorc29tZSByZWxldmFudCBidXQgcmFyZWx5IHVzZWQgZnVuY3Rpb25zIGFyZSB1bmltcGxlbWVudGVkLgorCitAc3Vic3Vic2VjdGlvbiBUaGUgV0lOMTYgRHJpdmVyCisKK1dJTjE2RFJWX0luaXQgaXMgY2FsbGVkIGJ5IE1BSU5fRW11bGF0b3JJbml0LCBhbmQgcmVnaXN0ZXJzIHRoZQorV0lOMTZEUlYgZnVuY3Rpb24gdGFibGUgV0lOMTZEUlZfRnVuY3MgW2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuY10KK2ZvciB0aGUgZ2VuZXJpYyBkcml2ZXIuIFRoZSBXSU4xNiBkcml2ZXIgaXMgZGVzaWduZWQgdG8gbG9hZCAKK3NwZWNpZmllZCBuYXRpdmUgV2luZG93cyBwcmludGVyIGRyaXZlcnMuIEkgZG9uJ3QgdW5kZXJzdGFuZCAKK2hvdyB0aGUgd2hvbGUgc2NoZW1lIHdvcmtzLCAKK3N0YXJ0IHN0dWR5aW5nIHdoYXQgaGFwcGVucyB3aGVuIGEgcHJpbnRlciBEQyBpcworY3JlYXRlZCB2aWEgV0lOMTZEUlZfQ3JlYXRlREMuCisKK0lmIGEgREMgaXMgY3JlYXRlZCBleHBsaWNpdGx5LCB2aWEgdGhlCitDcmVhdGVEQygpIGNhbGwsIHRoZSBkcml2ZXIgbmFtZSBpcyBzcGVjaWZpZWQgZXhwbGljaXRseSBhbmQgV2luZQorZmluZHMgdGhlIGFwcHJvcHJpYXRlIGRyaXZlciBieSBsZWFmaW5nIHRocm91Z2ggaXRzIHRhYmxlIG9mIHJlZ2lzdGVyZWQKK2RyaXZlcnMuIE1ldGFmaWxlIERDcyBjYW4gb25seSBiZSBjcmVhdGVkIGJ5IHRoZSBDcmVhdGVNZXRhRmlsZSBmdW5jdGlvbi4KKworQWx0ZXJuYXRpdmVseSwgbW9zdCBvZiB0aGUgdGltZSwgdGhlIERJU1BMQVkgZHJpdmVyIGlzIGludm9rZWQKK2ltcGxpY2l0bHkuIAorVGhlIGFwcGxpY2F0aW9uIGNyZWF0ZXMgYSB3aW5kb3cgd2l0aAorQ3JlYXRlV2luZG93KCkuIElmIHRoZSBDU19DTEFTU0RDIG9yIENTX09XTkRDIGZsYWcgaXMgcGFzc2VkLCBhIG5ldyBEQworaXMgY3JlYXRlZCBhbmQgc2F2ZWQgZm9yIHRoZSB3aW5kb3cgaW4gYSBzdHJ1Y3R1cmUgY2FsbGVkIERDRSwgd2hpY2ggaG9sZHMKK2EgREMsIGEgY2xpcHBpbmcgcmVnaW9uLCBhbmQgZmxhZ3MuIFdoZW5ldmVyIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0bworcGFpbnQgaW4gdGhhdCB3aW5kb3csIGl0IGNhbGxzIEdldERDKGh3bmQpLCB3aGljaCByZXR1cm5zIHRoZSBEQyBpbiB0aGUKK0RDRSBzYXZlZCBpbiB0aGUgd2luZG93LgorCitJZiBuZWl0aGVyIG9mIHRob3NlIGZsYWdzIGFyZSB1c2VkLCB0aGUgd2luZG93IGdldHMgYSBEQ0UgYXNzaWduZWQgdG8gaXQKK2Zyb20gYSBwb29sIG9mIERDRXMgY3JlYXRlZCBkdXJpbmcgV2luZSBpbml0aWFsaXphdGlvbiBhbmQgdGVtcG9yYXJpbHkKK2Fzc2lnbmVkIGR1cmluZyB0aGUgR2V0REMoKSBjYWxsLgorQWxsIERDRXMsIHdoZXRoZXIgcGFydCBvZiB0aGUgV2luZSBEQyBwb29sIG9yIGNyZWF0ZWQgYnkgcmVxdWVzdCBvZiBhIHdpbmRvdywKK3VzZSB0aGUgYGBESVNQTEFZJycgZHJpdmVyLiAKIAogCi0KLUBub2RlIFJlZmVyZW5jZSBNYW51YWwsIEluc3RhbGxhdGlvbiwgSW50cm9kdWN0aW9uLCBUb3AKK0Bub2RlIFJlZmVyZW5jZSBNYW51YWwsIEluc3RhbGxhdGlvbiwgV2luZSBEZXNpZ24sIFRvcAogCiBAbWVudQogKiBXSU4zMiBSZWZlcmVuY2UgTWFudWFsOjogICAgICBUaGUgQFdJTjMye30gZnVuY3Rpb24gY2FsbHMgYW5kIGRhdGEgdHlwZXMuCmRpZmYgLS1naXQgYS9maWxlcy9kb3NfZnMuYyBiL2ZpbGVzL2Rvc19mcy5jCmluZGV4IDRkOTU4NmYuLjhjMTY1OWQgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2Rvc19mcy5jCisrKyBiL2ZpbGVzL2Rvc19mcy5jCkBAIC00Nyw3ICs0Nyw3IEBACiAjZGVmaW5lIElOVkFMSURfRE9TX0NIQVJTICAiKj88PnxcIis9LDtbXSBcMzQ1IgogCiBzdGF0aWMgY29uc3QgY2hhciAqRE9TRlNfRGV2aWNlc1tdID0gewotIkNPTiIsIlBSTiIsIk5VTCIsIkFVWCIsIkxQVDEiLCJMUFQyIiwiTFBUMyIsIkxQVDQiLCJDT00xIiwiQ09NMiIsIkNPTTMiLCJDT000IiwKKyJDT04iLCJQUk4iLCJOVUwiLCJBVVgiLCJMUFQxIiwiTFBUMiIsIkxQVDMiLCJMUFQ0IiwiQ09NMSIsIkNPTTIiLCJDT00zIiwiQ09NNCIsIlNDU0lNR1IkIgogfTsKIAogCkBAIC01ODcsNiArNTg3LDggQEAKIHsKICAgICBpbnQgaTsKICAgICBjb25zdCBjaGFyICpwOworICAgIEZJTEVfT0JKRUNUICpmaWxlOworICAgIEhGSUxFMzIgaGFuZGxlOwogCiAgICAgaWYgKG5hbWVbMF0gJiYgKG5hbWVbMV0gPT0gJzonKSkgbmFtZSArPSAyOwogICAgIGlmICgocCA9IHN0cnJjaHIoIG5hbWUsICcvJyApKSkgbmFtZSA9IHAgKyAxOwpAQCAtNjE1LDYgKzYxNywxNCBAQAogCQkJCWJyZWFrOwogCQkJfQogCQl9CisJCWlmICghc3RyY21wKERPU0ZTX0RldmljZXNbaV0sIlNDU0lNR1IkIikpIHsKKwkJICAgICAgICBpZiAoKGhhbmRsZSA9IEZJTEVfQWxsb2MoICZmaWxlICkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCisJCQkJcmV0dXJuIEhGSUxFX0VSUk9SMzI7CisJCQllbHNlIHsKKwkJCQlmaWxlLT51bml4X25hbWUgPSBIRUFQX3N0cmR1cEEoIFN5c3RlbUhlYXAsIDAsIG5hbWUgKTsKKwkJCQlyZXR1cm4gaGFuZGxlOworCQkJfQorCQl9CiAJCUZJWE1FKGRvc2ZzLCJkZXZpY2Ugb3BlbiAlcyBub3Qgc3VwcG9ydGVkICh5ZXQpXG4iLERPU0ZTX0RldmljZXNbaV0pOwogICAgIAkJcmV0dXJuIEhGSUxFX0VSUk9SMzI7CiAJICAgIH0KZGlmZiAtLWdpdCBhL2ZpbGVzL2RyaXZlLmMgYi9maWxlcy9kcml2ZS5jCmluZGV4IGE1MTY4YmMuLjI0NmIzNDcgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RyaXZlLmMKKysrIGIvZmlsZXMvZHJpdmUuYwpAQCAtNTQyLDYgKzU0Miw5IEBACiAJICAgICAgICAgICAgICAgICAgICAgICAgImRyaXZlICVjIGFscmVhZHkgZXhpc3RzXG4iLAogCQkJJ0EnICsgZXhpc3RpbmdfZHJpdmUsICdBJyArIG5ld19kcml2ZSwKIAkJCSdBJyArIG5ld19kcml2ZSApOworCS8qIGl0IGlzIGFscmVhZHkgbWFwcGVkIHRoZXJlLCBzbyByZXR1cm4gc3VjY2VzcyAqLworCWlmICghc3RyY21wKG9sZC0+cm9vdCxuZXctPnJvb3QpKQorCSAgICByZXR1cm4gMTsKIAlyZXR1cm4gMDsKICAgICB9CiAKQEAgLTg1MSw2ICs4NTQsMTAgQEAKIHsKICAgICBpbnQgZHJpdmUgPSBEUklWRV9HZXRDdXJyZW50RHJpdmUoKTsKIAorICAgIGlmICghZGlyKSB7CisgICAgCUVSUihmaWxlLCIoTlVMTCkhXG4iKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQogICAgIGlmIChkaXJbMF0gJiYgKGRpclsxXT09JzonKSkKICAgICB7CiAgICAgICAgIGRyaXZlID0gdG9sb3dlciggKmRpciApIC0gJ2EnOwpkaWZmIC0tZ2l0IGEvZmlsZXMvZmlsZS5jIGIvZmlsZXMvZmlsZS5jCmluZGV4IDk4MzM1M2UuLmM0OGJiYzYgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2ZpbGUuYworKysgYi9maWxlcy9maWxlLmMKQEAgLTczLDE0ICs3MywxNCBAQAogICoKICAqIEFsbG9jYXRlIGEgZmlsZS4KICAqLwotc3RhdGljIEhGSUxFMzIgRklMRV9BbGxvYyggRklMRV9PQkpFQ1QgKipmaWxlICkKK0hGSUxFMzIgRklMRV9BbGxvYyggRklMRV9PQkpFQ1QgKipmaWxlICkKIHsKICAgICBIRklMRTMyIGhhbmRsZTsKICAgICAqZmlsZSA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKEZJTEVfT0JKRUNUKSApOwogICAgIGlmICghKmZpbGUpCiAgICAgewogICAgICAgICBET1NfRVJST1IoIEVSX1Rvb01hbnlPcGVuRmlsZXMsIEVDX1Byb2dyYW1FcnJvciwgU0FfQWJvcnQsIEVMX0Rpc2sgKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiAoSEZJTEUzMilOVUxMOwogICAgIH0KICAgICAoKmZpbGUpLT5oZWFkZXIudHlwZSA9IEszMk9CSl9GSUxFOwogICAgICgqZmlsZSktPmhlYWRlci5yZWZjb3VudCA9IDA7CkBAIC0xODUsNyArMTg1LDcgQEAKICAqIFJldHVybiB0aGUgRE9TIGZpbGUgYXNzb2NpYXRlZCB0byBhIHRhc2sgZmlsZSBoYW5kbGUuIEZJTEVfUmVsZWFzZUZpbGUgbXVzdAogICogYmUgY2FsbGVkIHRvIHJlbGVhc2UgdGhlIGZpbGUuCiAgKi8KLXN0YXRpYyBGSUxFX09CSkVDVCAqRklMRV9HZXRGaWxlKCBIRklMRTMyIGhhbmRsZSApCitGSUxFX09CSkVDVCAqRklMRV9HZXRGaWxlKCBIRklMRTMyIGhhbmRsZSApCiB7CiAgICAgcmV0dXJuIChGSUxFX09CSkVDVCAqKUhBTkRMRV9HZXRPYmpQdHIoIFBST0NFU1NfQ3VycmVudCgpLCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9GSUxFLCAwIC8qRklYTUUqLyApOwpkaWZmIC0tZ2l0IGEvZmlsZXMvcHJvZmlsZS5jIGIvZmlsZXMvcHJvZmlsZS5jCmluZGV4IGY1MzgwMGYuLjUzZTYxMGEgMTAwNjQ0Ci0tLSBhL2ZpbGVzL3Byb2ZpbGUuYworKysgYi9maWxlcy9wcm9maWxlLmMKQEAgLTE1MCw2ICsxNTAsMTQgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBpbnQKK1BST0ZJTEVfaXNzcGFjZShjaGFyIGMpIHsKKwlpZiAoaXNzcGFjZShjKSkgcmV0dXJuIDE7CisJaWYgKGM9PSdccicgfHwgYz09MHgxYSkgcmV0dXJuIDE7CisJLyogQ1IgYW5kIF5aIChET1MgRU9GKSBhcmUgc3BhY2VzIHRvbyAgKGZvdW5kIG9uIENELVJPTXMpICovCisJcmV0dXJuIDA7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUFJPRklMRV9Mb2FkCkBAIC0xNzYsOSArMTg0LDkgQEAKICAgICB7CiAgICAgICAgIGxpbmUrKzsKICAgICAgICAgcCA9IGJ1ZmZlciArIHN0cmxlbihidWZmZXIpIC0gMTsKLSAgICAgICAgd2hpbGUgKChwID4gYnVmZmVyKSAmJiAoKCpwID09ICdcbicpIHx8IGlzc3BhY2UoKnApKSkgKnAtLSA9ICdcMCc7CisgICAgICAgIHdoaWxlICgocCA+IGJ1ZmZlcikgJiYgKCgqcCA9PSAnXG4nKSB8fCBQUk9GSUxFX2lzc3BhY2UoKnApKSkgKnAtLT0nXDAnOwogICAgICAgICBwID0gYnVmZmVyOwotICAgICAgICB3aGlsZSAoKnAgJiYgaXNzcGFjZSgqcCkpIHArKzsKKyAgICAgICAgd2hpbGUgKCpwICYmIFBST0ZJTEVfaXNzcGFjZSgqcCkpIHArKzsKICAgICAgICAgaWYgKCpwID09ICdbJykgIC8qIHNlY3Rpb24gc3RhcnQgKi8KICAgICAgICAgewogICAgICAgICAgICAgaWYgKCEocDIgPSBzdHJyY2hyKCBwLCAnXScgKSkpCkBAIC0yMDMsOSArMjExLDkgQEAKICAgICAgICAgaWYgKChwMiA9IHN0cmNociggcCwgJz0nICkpICE9IE5VTEwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNoYXIgKnAzID0gcDIgLSAxOwotICAgICAgICAgICAgd2hpbGUgKChwMyA+IHApICYmIGlzc3BhY2UoKnAzKSkgKnAzLS0gPSAnXDAnOworICAgICAgICAgICAgd2hpbGUgKChwMyA+IHApICYmIFBST0ZJTEVfaXNzcGFjZSgqcDMpKSAqcDMtLSA9ICdcMCc7CiAgICAgICAgICAgICAqcDIrKyA9ICdcMCc7Ci0gICAgICAgICAgICB3aGlsZSAoKnAyICYmIGlzc3BhY2UoKnAyKSkgcDIrKzsKKyAgICAgICAgICAgIHdoaWxlICgqcDIgJiYgUFJPRklMRV9pc3NwYWNlKCpwMikpIHAyKys7CiAgICAgICAgIH0KICAgICAgICAga2V5ID0gSEVBUF94YWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZigqa2V5KSApOwogICAgICAgICBrZXktPm5hbWUgID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBwICk7CkBAIC03NjUsNyArNzczLDcgQEAKICAgICAgICAgZmNsb3NlKCBmICk7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICBXQVJOKHByb2ZpbGUsICJDYW4ndCBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZSAlcyBvciAkSE9NRSVzXG4iLAorICAgIE1TRyggIkNhbid0IG9wZW4gY29uZmlndXJhdGlvbiBmaWxlICVzIG9yICRIT01FJXNcbiIsCiAJIFdJTkVfSU5JX0dMT0JBTCwgUFJPRklMRV9XaW5lSW5pTmFtZSApOwogICAgIHJldHVybiAwOwogfQpAQCAtNzg3LDkgKzc5NSw5IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKCBscGNoICkgKmxwY2ggPSAnXDAnOyBlbHNlICpscGNoWCA9ICdcMCc7CiAgICAgICAgICAgICB3aGlsZSggKigrK2xwY2hYKSApCi0gICAgICAgICAgICAgICAgaWYoICFpc3NwYWNlKCpscGNoWCkgKSByZXR1cm4gbHBjaFg7CisgICAgICAgICAgICAgICAgaWYoICFQUk9GSUxFX2lzc3BhY2UoKmxwY2hYKSApIHJldHVybiBscGNoWDsKICAgICAgICAgfQotCWVsc2UgaWYoIGlzc3BhY2UoICpscGNoWCApICYmICFscGNoICkgbHBjaCA9IGxwY2hYOworCWVsc2UgaWYoIFBST0ZJTEVfaXNzcGFjZSggKmxwY2hYICkgJiYgIWxwY2ggKSBscGNoID0gbHBjaFg7CiAJICAgICBlbHNlIGxwY2ggPSBOVUxMOwogICAgIH0KICAgICBpZiggbHBjaCApICpscGNoID0gJ1wwJzsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2RkcmF3LmMgYi9ncmFwaGljcy9kZHJhdy5jCmluZGV4IGJkMzc5OTguLjVjNDZjMTMgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2RkcmF3LmMKKysrIGIvZ3JhcGhpY3MvZGRyYXcuYwpAQCAtOTYwLDExICs5NjAsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Q2xpcHBlcl9HZXRDbGlwTGlzdCgKKwlMUERJUkVDVERSQVdDTElQUEVSIHRoaXMsTFBSRUNUMzIgcmVjdHMsTFBSR05EQVRBIGxwcmduLExQRFdPUkQgaG1tCispIHsKKwlGSVhNRShkZHJhdywiKCVwLCVwLCVwLCVwKSxzdHViIVxuIix0aGlzLHJlY3RzLGxwcmduLGhtbSk7CisJaWYgKGhtbSkgKmhtbT0wOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlcl9WVGFibGUgZGRjbGlwdnQgPSB7CiAJKHZvaWQqKTEsCiAJKHZvaWQqKTIsCiAJSURpcmVjdERyYXdDbGlwcGVyX1JlbGVhc2UsCi0JKHZvaWQqKTQsCisJSURpcmVjdERyYXdDbGlwcGVyX0dldENsaXBMaXN0LAogCSh2b2lkKik1LAogCSh2b2lkKik2LAogCSh2b2lkKik3LApAQCAtMTUxMSw2ICsxNTE5LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHdoYXQgY2FuIHdlIGRpcmVjdGx5IGRlY29tcHJlc3M/ICovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfR2V0Rm91ckNDQ29kZXMoCisJTFBESVJFQ1REUkFXIHRoaXMsTFBEV09SRCB4LExQRFdPUkQgeQorKSB7CisJRklYTUUoZGRyYXcsIiglcCwlcCwlcCksIHN0dWJcbiIsdGhpcyx4LHkpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgSURpcmVjdERyYXdfVlRhYmxlIGRkdnQgPSB7CiAJSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UsCiAJSURpcmVjdERyYXdfQWRkUmVmLApAQCAtMTUyNSw3ICsxNTQxLDcgQEAKIAlJRGlyZWN0RHJhd19GbGlwVG9HRElTdXJmYWNlLAogCUlEaXJlY3REcmF3X0dldENhcHMsCiAJSURpcmVjdERyYXdfR2V0RGlzcGxheU1vZGUsCi0JKHZvaWQqKTE0LAorCUlEaXJlY3REcmF3X0dldEZvdXJDQ0NvZGVzLAogCSh2b2lkKikxNSwKIAlJRGlyZWN0RHJhd19HZXRNb25pdG9yRnJlcXVlbmN5LAogCSh2b2lkKikxNywKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2Vudi5jIGIvZ3JhcGhpY3MvZW52LmMKaW5kZXggYTAwNGVlOC4uY2IxZjQ5OCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvZW52LmMKKysrIGIvZ3JhcGhpY3MvZW52LmMKQEAgLTQsODAgKzQsMTM2IEBACiAgKiBOb3RlOiBUaGlzIGhhcyBOT1RISU5HIHRvIGRvIHdpdGggdGhlIHRhc2svcHJvY2VzcyBlbnZpcm9ubWVudCEKICAqCiAgKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAxOTk4IEFuZHJlYXMgTW9ocgogICovCiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8Z2RpLmg+CiAjaW5jbHVkZSA8ZGVidWcuaD4KIAordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBBVE9NIGF0b207CisJSEdMT0JBTDE2IGhhbmRsZTsKK30gRU5WVEFCTEU7CisKK3N0YXRpYyBFTlZUQUJMRSBFbnZUYWJsZVsyMF07CisKK3N0YXRpYyBFTlZUQUJMRSAqU2VhcmNoRW52VGFibGUoQVRPTSBhdG9tKQoreworICAgIElOVDE2IGk7CisgICAgCisgICAgZm9yIChpID0gMjA7IGk7IGktLSkgeworICAgICAgaWYgKEVudlRhYmxlW2ldLmF0b20gPT0gYXRvbSkgcmV0dXJuICZFbnZUYWJsZVtpXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBBVE9NIEdESV9HZXROdWxsUG9ydEF0b20odm9pZCkKK3sKKyAgICBzdGF0aWMgQVRPTSBOdWxsUG9ydEF0b20gPSAwOworICAgIGlmICghTnVsbFBvcnRBdG9tKQorICAgIHsKKyAgICAgICAgY2hhciBOdWxsUG9ydFsyNTZdOworICAgICAgICAKKyAgICAgICAgR2V0UHJvZmlsZVN0cmluZzMyQSggIndpbmRvd3MiLCAibnVsbHBvcnQiLCAibm9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bGxQb3J0LCBzaXplb2YoTnVsbFBvcnQpICk7CisgICAgICAgIE51bGxQb3J0QXRvbSA9IEFkZEF0b20zMkEoIE51bGxQb3J0ICk7CisgICAgfQorICAgIHJldHVybiBOdWxsUG9ydEF0b207Cit9CisKK3N0YXRpYyBBVE9NIFBvcnROYW1lVG9BdG9tKExQQ1NUUiBscFBvcnROYW1lLCBCT09MMTYgYWRkKQoreworICAgIGNoYXIgUG9ydE5hbWVbMjU2XTsKKyAgICBMUENTVFIgcDsKKworICAgIGlmIChscFBvcnROYW1lW3N0cmxlbihscFBvcnROYW1lKSAtIDFdID09ICc6JykgeworICAgICAgICBzdHJuY3B5KFBvcnROYW1lLCBscFBvcnROYW1lLCBzdHJsZW4obHBQb3J0TmFtZSkgLSAxKTsKKyAgICAgICAgcCA9IFBvcnROYW1lOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHAgPSBscFBvcnROYW1lOworCisgICAgaWYgKGFkZCkKKyAgICAgICAgcmV0dXJuIEFkZEF0b20zMkEocCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRmluZEF0b20zMkEocCk7Cit9CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0RW52aXJvbm1lbnQgICAoR0RJLjEzNCkKICAqLwotSU5UMTYgV0lOQVBJIEdldEVudmlyb25tZW50KExQQ1NUUiBscFBvcnROYW1lLCBMUERFVk1PREUxNiBscGRldiwgVUlOVDE2IG5NYXhTaXopCitJTlQxNiBXSU5BUEkgR2V0RW52aXJvbm1lbnQoTFBDU1RSIGxwUG9ydE5hbWUsIExQREVWTU9ERTE2IGxwZGV2LCBVSU5UMTYgbk1heFNpemUpCiB7Ci0gICBGSVhNRShnZGksICIoJyVzJywnJXAnLCVkKSxzdHViXG4iLCBscFBvcnROYW1lLCBscGRldiwgbk1heFNpeik7Ci0gICAgcmV0dXJuIDA7CisgICAgQVRPTSBhdG9tOworICAgIExQQ1NUUiBwOworICAgIEVOVlRBQkxFICplbnY7CisgICAgV09SRCBzaXplOworCisgICAgVFJBQ0UoZ2RpLCAiKCclcycsICVwLCAlZClcbiIsIGxwUG9ydE5hbWUsIGxwZGV2LCBuTWF4U2l6ZSk7CisKKyAgICBpZiAoIShhdG9tID0gUG9ydE5hbWVUb0F0b20obHBQb3J0TmFtZSwgRkFMU0UpKSkKKwlyZXR1cm4gMDsKKyAgICBpZiAoYXRvbSA9PSBHRElfR2V0TnVsbFBvcnRBdG9tKCkpCisJaWYgKCEoYXRvbSA9IEZpbmRBdG9tMzJBKChMUENTVFIpbHBkZXYpKSkKKwkgICAgcmV0dXJuIDA7CisgICAgaWYgKCEoZW52ID0gU2VhcmNoRW52VGFibGUoYXRvbSkpKQorCXJldHVybiAwOworICAgIHNpemUgPSBHbG9iYWxTaXplMTYoZW52LT5oYW5kbGUpOworICAgIGlmICghbHBkZXYpIHJldHVybiAwOworICAgIGlmIChzaXplIDwgbk1heFNpemUpIG5NYXhTaXplID0gc2l6ZTsKKyAgICBpZiAoIShwID0gR2xvYmFsTG9jazE2KGVudi0+aGFuZGxlKSkpIHJldHVybiAwOworICAgIG1lbWNweShscGRldiwgcCwgbk1heFNpemUpOworICAgIEdsb2JhbFVubG9jazE2KGVudi0+aGFuZGxlKTsKKyAgICByZXR1cm4gbk1heFNpemU7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICBTZXRFbnZpcm9ubWVudCAgIChHREkuMTMyKQogICovCiBJTlQxNiBXSU5BUEkgU2V0RW52aXJvbm1lbnQoTFBDU1RSIGxwUG9ydE5hbWUsIExQREVWTU9ERTE2IGxwZGV2LCBVSU5UMTYgbkNvdW50KQogeworICAgIEFUT00gYXRvbTsgCisgICAgQk9PTDE2IG51bGxwb3J0ID0gRkFMU0U7CisgICAgTFBTVFIgcDsKKyAgICBFTlZUQUJMRSAqZW52OworICAgIEhHTE9CQUwxNiBoYW5kbGU7CiAKLSAgIEZJWE1FKGdkaSwgIignJXMnLCAnJXAnLCAlZCkgc3R1YiFcbiIsIGxwUG9ydE5hbWUsIGxwZGV2LCBuQ291bnQpOwotICAgaWYgKFRSQUNFX09OKGdkaSkpIERVTVAoCi0gICAgCSJcdGRldm1vZGU6XG4iCi0gICAgCSJcdG5hbWUgPSAlc1xuIgotCSJcdGRtU3BlY1ZlcnNpb24gPSAlZFxuIgotCSJcdGRtRHJpdmVyVmVyc2lvbiA9ICVkXG4iCi0JIlx0ZG1TaXplID0gJWRcbiIKLQkiXHRkbURyaXZlckV4dHJhID0gJWRcbiIKLQkiXHRkbUZpZWxkcyA9ICVsZFxuIgotCSJcdGRtT3JpZW50YXRpb24gPSAlZFxuIgotCSJcdGRtUGFwZXJTaXplID0gJWRcbiIKLQkiXHRkbVBhcGVyTGVuZ3RoID0gJWRcbiIKLQkiXHRkbVBhcGVyV2lkdGggPSAlZFxuIgotCSJcdGRtU2NhbGUgPSAlZFxuIgotCSJcdGRtQ29waWVzID0gJWRcbiIKLQkiXHRkbURlZmF1bHRTb3VyY2UgPSAlZFxuIgotCSJcdGRtUHJpbnRRdWFsaXR5ID0gJWRcbiIKLQkiXHRkbUNvbG9yID0gJWRcbiIKLQkiXHRkbUR1cGxleCA9ICVkXG4iCi0JIlx0ZG1ZUmVzb2x1dGlvbiA9ICVkXG4iCi0JIlx0ZG1UVE9wdGlvbiA9ICVkXG4iCi0JIlx0ZG1Db2xsYXRlID0gJWRcbiIKLQkiXHRkbUZCaXRzUGVyUGVsID0gJWRcbiIKLQkiXHRkbVBlbHNXaWR0aCA9ICVsZFxuIgotCSJcdGRtUGVsc0hlaWdodCA9ICVsZFxuIgotCSJcdGRtRGlzcGxheUZsYWdzID0gJWxkXG4iCi0JIlx0ZG1EaXNwbGF5RnJlcXVlbmN5ID0gJWxkXG4iLAotCQotICAgIAlscGRldi0+ZG1EZXZpY2VOYW1lLAotICAgIAlscGRldi0+ZG1TcGVjVmVyc2lvbiwKLSAgICAJbHBkZXYtPmRtRHJpdmVyVmVyc2lvbiwKLSAgICAJbHBkZXYtPmRtU2l6ZSwKLSAgICAJbHBkZXYtPmRtRHJpdmVyRXh0cmEsCi0gICAgCWxwZGV2LT5kbUZpZWxkcywKLSAgICAJbHBkZXYtPmRtT3JpZW50YXRpb24sCi0gICAgCWxwZGV2LT5kbVBhcGVyU2l6ZSwKLSAgICAJbHBkZXYtPmRtUGFwZXJMZW5ndGgsCi0gICAgCWxwZGV2LT5kbVBhcGVyV2lkdGgsCi0gICAgCWxwZGV2LT5kbVNjYWxlLAotICAgIAlscGRldi0+ZG1Db3BpZXMsCi0gICAgCWxwZGV2LT5kbURlZmF1bHRTb3VyY2UsCi0gICAgCWxwZGV2LT5kbVByaW50UXVhbGl0eSwKLSAgICAJbHBkZXYtPmRtQ29sb3IsCi0gICAgCWxwZGV2LT5kbUR1cGxleCwKLSAgICAJbHBkZXYtPmRtWVJlc29sdXRpb24sCi0gICAgCWxwZGV2LT5kbVRUT3B0aW9uLAotICAgIAlscGRldi0+ZG1Db2xsYXRlLAotICAgIAlscGRldi0+ZG1CaXRzUGVyUGVsLAotICAgIAlscGRldi0+ZG1QZWxzV2lkdGgsCi0gICAgCWxwZGV2LT5kbVBlbHNIZWlnaHQsCi0gICAgCWxwZGV2LT5kbURpc3BsYXlGbGFncywKLSAgICAJbHBkZXYtPmRtRGlzcGxheUZyZXF1ZW5jeQotICAgKTsKLSAgICByZXR1cm4gMDsKKyAgICBUUkFDRShnZGksICIoJyVzJywgJXAsICVkKVxuIiwgbHBQb3J0TmFtZSwgbHBkZXYsIG5Db3VudCk7CisKKyAgICBpZiAoKGF0b20gPSBQb3J0TmFtZVRvQXRvbShscFBvcnROYW1lLCBGQUxTRSkpKSB7CisJaWYgKGF0b20gPT0gR0RJX0dldE51bGxQb3J0QXRvbSgpKSB7CisJICAgIG51bGxwb3J0ID0gVFJVRTsKKwkgICAgYXRvbSA9IEZpbmRBdG9tMzJBKChMUENTVFIpbHBkZXYpOworCX0KKwllbnYgPSBTZWFyY2hFbnZUYWJsZShhdG9tKTsKKyAgICAgICAgR2xvYmFsRnJlZTE2KGVudi0+aGFuZGxlKTsKKyAgICAgICAgZW52LT5hdG9tID0gMDsKKyAgICB9CisgICAgaWYgKG5Db3VudCkgeyAvKiBzdG9yZSBERVZNT0RFIHN0cnVjdCAqLworCWlmIChudWxscG9ydCkKKwkgICAgcCA9IChMUFNUUilscGRldjsKKyAgICAgICAgZWxzZQorCSAgICBwID0gKExQU1RSKWxwUG9ydE5hbWU7CisKKyAgICAgICAgaWYgKChhdG9tID0gUG9ydE5hbWVUb0F0b20ocCwgVFJVRSkpCisJICYmIChlbnYgPSBTZWFyY2hFbnZUYWJsZSgwKSkKKwkgJiYgKGhhbmRsZSA9IEdsb2JhbEFsbG9jMTYoR01FTV9TSEFSRXxHTUVNX01PVkVBQkxFLCBuQ291bnQpKSkgeworCSAgICBpZiAoIShwID0gR2xvYmFsTG9jazE2KGhhbmRsZSkpKSB7CisJICAgICAgICBHbG9iYWxGcmVlMTYoaGFuZGxlKTsKKwkgICAgICAgIHJldHVybiAwOworCSAgICB9CisJICAgIGVudi0+YXRvbSA9IGF0b207CisJICAgIGVudi0+aGFuZGxlID0gaGFuZGxlOworICAgICAgICAgICAgbWVtY3B5KHAsIGxwZGV2LCBuQ291bnQpOworICAgICAgICAgICAgR2xvYmFsVW5sb2NrMTYoaGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGU7CisJfQorCWVsc2UgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvZm9udGVuZ2luZS5jIGIvZ3JhcGhpY3MvZm9udGVuZ2luZS5jCmluZGV4IDBhNjUyOTcuLjFlYTY3YzcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2ZvbnRlbmdpbmUuYworKysgYi9ncmFwaGljcy9mb250ZW5naW5lLmMKQEAgLTUsMTAgKzUsMTAgQEAKICAqIENvcHlyaWdodCAxOTk4IERhdmlkIExlZSBMYW1iZXJ0CiAgKiAKICAqLwotI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGRlYnVnLmg+ICAgICAKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiZm9udC5oIgogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYwppbmRleCAyYjg1NzA3Li5lN2FkMDE4IDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJkYy5oIgogCiAjZGVmaW5lIFNVUFBPUlRfUkVBTElaRURfRk9OVFMgMQogI3ByYWdtYSBwYWNrKDEpCkBAIC0xNzUsNiArMTc2LDcgQEAKICAgICBpZiAobHN0cmNtcGkzMkEocHJpbnRlckVuYWJsZWQsIm9uIikpCiAgICAgewogICAgICAgICBNU0coIldJTjE2RFJWX0NyZWF0ZURDIGRpc2FibGVkIGluIHdpbmUuY29uZiBmaWxlXG4iKTsKKwlNU0coIkVuYWJsZSBwcmludGluZyB3aXRoIFwicHJpbnRlcj1vblwiIik7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKQEAgLTI4NCw4ICsyODYsMTIgQEAKICAgICAgICAgICAgIG5SZXQgPSAwOwogCSAgICBicmVhazsKICAgICAgICAgICBjYXNlIFNFVEFCT1JUUFJPQzoKLQkgICAgRklYTUUod2luMTZkcnYsIkVzY2FwZTogU2V0QWJvcnRQcm9jIGlnbm9yZWQgc2hvdWxkIGJlIHN0b3JlZCBpbiBkYyBzb21ld2hlcmVcbiIpOwotICAgICAgICAgICAgLyogTWFrZSBjYWxsaW5nIGFwcGxpY2F0aW9uIGJlbGlldmUgdGhpcyB3b3JrZWQgKi8KKwkJLyogRklYTUU6IFRoZSBBYm9ydFByb2Mgc2hvdWxkIGJlIGNhbGxlZDoKKwkJLSBBZnRlciBldmVyeSB3cml0ZSB0byBwcmludGVyIHBvcnQgb3Igc3Bvb2wgZmlsZQorCQktIFNldmVyYWwgdGltZXMgd2hlbiBubyBtb3JlIGRpc2sgc3BhY2UKKwkJLSBCZWZvcmUgZXZlcnkgbWV0YWZpbGUgcmVjb3JkIHdoZW4gR0RJIGRvZXMgYmFuZGluZworCQkqLyAKKy8qCSAgICBkYy0+dy5scGZuUHJpbnQgPSAoRkFSUFJPQzE2KWxwSW5EYXRhOyBGSVhNRSEgKi8KICAgICAgICAgICAgIG5SZXQgPSAxOwogCSAgICBicmVhazsKIApAQCAtMzQwLDkgKzM0Niw0MCBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUXVlcnlBYm9ydCAgIChHREkuMTU1KQorICoKKyAqICBDYWxscyB0aGUgYXBwJ3MgQWJvcnRQcm9jIGZ1bmN0aW9uIGlmIGF2YWlsLgorICoKKyAqIFJFVFVSTlMKKyAqIFRSVUUgaWYgbm8gQWJvcnRQcm9jIGF2YWlsIG9yIEFib3J0UHJvYyB3YW50cyB0byBjb250aW51ZSBwcmludGluZy4KKyAqIEZBTFNFIGlmIEFib3J0UHJvYyB3YW50cyB0byBhYm9ydCBwcmludGluZy4KKyAqLworQk9PTDE2IFdJTkFQSSBRdWVyeUFib3J0KEhEQzE2IGhkYywgSU5UMTYgcmVzZXJ2ZWQpCit7CisgICAgREMgKmRjID0gRENfR2V0RENQdHIoIGhkYyApOwogCisgICAgaWYgKCghZGMpIHx8ICghZGMtPncubHBmblByaW50KSkKKwlyZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gZGMtPncubHBmblByaW50KGhkYywgMCk7Cit9CiAKLS8qKioqKioqKioqKioqKioqKiogbWlzYy4gcHJpbnRlciByZWxlYXRlZCBmdW5jdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0QWJvcnRQcm9jICAgKEdESS4zODEpCisgKgorICovCitJTlQxNiBXSU5BUEkgU2V0QWJvcnRQcm9jKEhEQzE2IGhkYywgRkFSUFJPQzE2IGFicnRwcmMpCit7CisgICAgREMgKmRjID0gRENfR2V0RENQdHIoIGhkYyApOworCisgICAgaWYgKGRjKSB7CisJZGMtPncubHBmblByaW50ID0gYWJydHByYzsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfSAKKworLyoqKioqKioqKioqKioqKioqKiBtaXNjLiBwcmludGVyIHJlbGF0ZWQgZnVuY3Rpb25zICovCiAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHNob3VsZCBpbXBsZW1lbnQgYSBxdWVpbmcgc3lzdGVtCkBAIC02MDAsNiArNjM3LDE1IEBACiAJICBuUmV0ID0gU1BfT1VUT0ZESVNLOwogCWVsc2UKIAkgIG5SZXQgPSBjY2g7CisJaWYgKHBQcmludEpvYi0+aERDID09IDApIHsKKwkgICAgRVJSKHByaW50LCAiaERDID09IDAgIVxuIik7CisJICAgIHJldHVybiBTUF9FUlJPUjsKKwl9CisJaWYgKCEoUXVlcnlBYm9ydChwUHJpbnRKb2ItPmhEQywgKG5SZXQgPT0gU1BfT1VUT0ZESVNLKSA/IG5SZXQgOiAwICkpKQorCXsKKwkgICAgQ2xvc2VKb2IoaEpvYik7IC8qIHByaW50aW5nIGFib3J0ZWQgKi8KKwkgICAgblJldCA9IFNQX0FQUEFCT1JUOworCX0KICAgICB9CiAgICAgcmV0dXJuIG5SZXQ7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYyBiL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCmluZGV4IDg4NzQzNjguLjRmMDhmZGYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCkBAIC00LDYgKzQsMTIgQEAKICAqIENvcHlyaWdodCAxOTkzLDE5OTQgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAorCisvKgorICogRklYTUU6IG5vbmUgb2YgdGhlc2UgZnVuY3Rpb25zIG9iZXkgdGhlIEdNX0FEVkFOQ0VECisgKiBncmFwaGljcyBtb2RlCisgKi8KKwogI2luY2x1ZGUgPG1hdGguaD4KICNpZmRlZiBIQVZFX0ZMT0FUX0gKICMgaW5jbHVkZSA8ZmxvYXQuaD4KQEAgLTcyLDYgKzc4LDkgQEAKICAqCiAgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBBcmMoKSwgQ2hvcmQoKSBhbmQgUGllKCkuCiAgKiAnbGluZXMnIGlzIHRoZSBudW1iZXIgb2YgbGluZXMgdG8gZHJhdzogMCBmb3IgQXJjLCAxIGZvciBDaG9yZCwgMiBmb3IgUGllLgorICoKKyAqIEZJWE1FOiBpbmNvcnJlY3Qgd2l0aCB0aGljayBwZW4gYW5kL29yIFBTX0lOU0lERUZSQU1FIHN0eWxlCisgKiAgICAgICAgc2VlIGVsbGlwc2UgYW5kIHJlY3RhbmdsZSBmdW5jdGlvbnMKICAqLwogc3RhdGljIEJPT0wzMgogWDExRFJWX0RyYXdBcmMoIERDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwKQEAgLTE5MSwyNCArMjAwLDMyIEBACiBCT09MMzIKIFgxMURSVl9FbGxpcHNlKCBEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSApCiB7CisgICAgSU5UMzIgd2lkdGgsIG9sZHdpZHRoOworCiAgICAgbGVmdCAgID0gWExQVE9EUCggZGMsIGxlZnQgKTsKICAgICB0b3AgICAgPSBZTFBUT0RQKCBkYywgdG9wICk7CiAgICAgcmlnaHQgID0gWExQVE9EUCggZGMsIHJpZ2h0ICk7CiAgICAgYm90dG9tID0gWUxQVE9EUCggZGMsIGJvdHRvbSApOwotICAgIGlmICgobGVmdCA9PSByaWdodCkgfHwgKHRvcCA9PSBib3R0b20pKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKChsZWZ0ID09IHJpZ2h0KSB8fCAodG9wID09IGJvdHRvbSkpIHJldHVybiBUUlVFOwogCiAgICAgaWYgKHJpZ2h0IDwgbGVmdCkgeyBJTlQzMiB0bXAgPSByaWdodDsgcmlnaHQgPSBsZWZ0OyBsZWZ0ID0gdG1wOyB9CiAgICAgaWYgKGJvdHRvbSA8IHRvcCkgeyBJTlQzMiB0bXAgPSBib3R0b207IGJvdHRvbSA9IHRvcDsgdG9wID0gdG1wOyB9CiAgICAgCi0gICAgaWYgKChkYy0+dS54LnBlbi5zdHlsZSA9PSBQU19JTlNJREVGUkFNRSkgJiYKLSAgICAgICAgKGRjLT51LngucGVuLndpZHRoIDwgcmlnaHQtbGVmdC0xKSAmJgotICAgICAgICAoZGMtPnUueC5wZW4ud2lkdGggPCBib3R0b20tdG9wLTEpKQorICAgIG9sZHdpZHRoID0gd2lkdGggPSBkYy0+dS54LnBlbi53aWR0aDsKKyAgICBpZiAoIXdpZHRoKSB3aWR0aCA9IDE7CisgICAgaWYoZGMtPnUueC5wZW4uc3R5bGUgPT0gUFNfTlVMTCkgd2lkdGggPSAwOworCisgICAgaWYgKChkYy0+dS54LnBlbi5zdHlsZSA9PSBQU19JTlNJREVGUkFNRSkpCiAgICAgewotICAgICAgICBsZWZ0ICAgKz0gZGMtPnUueC5wZW4ud2lkdGggLyAyOwotICAgICAgICByaWdodCAgLT0gKGRjLT51LngucGVuLndpZHRoICsgMSkgLyAyOwotICAgICAgICB0b3AgICAgKz0gZGMtPnUueC5wZW4ud2lkdGggLyAyOwotICAgICAgICBib3R0b20gLT0gKGRjLT51LngucGVuLndpZHRoICsgMSkgLyAyOworICAgICAgICBpZiAoMip3aWR0aCA+IChyaWdodC1sZWZ0KSkgd2lkdGg9KHJpZ2h0LWxlZnQgKyAxKS8yOworICAgICAgICBpZiAoMip3aWR0aCA+IChib3R0b20tdG9wKSkgd2lkdGg9KGJvdHRvbS10b3AgKyAxKS8yOworICAgICAgICBsZWZ0ICAgKz0gd2lkdGggLyAyOworICAgICAgICByaWdodCAgLT0gKHdpZHRoIC0gMSkgLyAyOworICAgICAgICB0b3AgICAgKz0gd2lkdGggLyAyOworICAgICAgICBib3R0b20gLT0gKHdpZHRoIC0gMSkgLyAyOwogICAgIH0KKyAgICBpZih3aWR0aCA9PSAxKSB3aWR0aD0wOworICAgIGRjLT51LngucGVuLndpZHRoPXdpZHRoOwogCiAgICAgaWYgKERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSkKIAlUU1hGaWxsQXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLApAQCAtMjE4LDYgKzIzNSw3IEBACiAJVFNYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKIAkJICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyB0b3AsCiAJCSAgcmlnaHQtbGVmdC0xLCBib3R0b20tdG9wLTEsIDAsIDM2MCo2NCApOworICAgIGRjLT51LngucGVuLndpZHRoPW9sZHdpZHRoOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0yMjgsMzkgKzI0NiwzNiBAQAogQk9PTDMyCiBYMTFEUlZfUmVjdGFuZ2xlKERDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tKQogewotICAgIElOVDMyIHdpZHRoOworICAgIElOVDMyIHdpZHRoLCBvbGR3aWR0aDsKKworICAgIFRSQUNFKGdyYXBoaWNzLCAiKCVkICVkICVkICVkKVxuIiwgCisgICAgCWxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisKICAgICBsZWZ0ICAgPSBYTFBUT0RQKCBkYywgbGVmdCApOwogICAgIHRvcCAgICA9IFlMUFRPRFAoIGRjLCB0b3AgKTsKICAgICByaWdodCAgPSBYTFBUT0RQKCBkYywgcmlnaHQgKTsKICAgICBib3R0b20gPSBZTFBUT0RQKCBkYywgYm90dG9tICk7CiAKKyAgICBpZiAoKGxlZnQgPT0gcmlnaHQpIHx8ICh0b3AgPT0gYm90dG9tKSkgcmV0dXJuIFRSVUU7CisKICAgICBpZiAocmlnaHQgPCBsZWZ0KSB7IElOVDMyIHRtcCA9IHJpZ2h0OyByaWdodCA9IGxlZnQ7IGxlZnQgPSB0bXA7IH0KICAgICBpZiAoYm90dG9tIDwgdG9wKSB7IElOVDMyIHRtcCA9IGJvdHRvbTsgYm90dG9tID0gdG9wOyB0b3AgPSB0bXA7IH0KIAotICAgIGlmICgobGVmdCA9PSByaWdodCkgfHwgKHRvcCA9PSBib3R0b20pKQotICAgIHsKLSNpZiAwCi0JaWYgKERDX1NldHVwR0NGb3JQZW4oIGRjICkpCi0JICAgIFRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAotCQkgIGRjLT53LkRDT3JnWCArIGxlZnQsCi0JCSAgZGMtPncuRENPcmdZICsgdG9wLAotCQkgIGRjLT53LkRDT3JnWCArIHJpZ2h0LAotCQkgIGRjLT53LkRDT3JnWSArIGJvdHRvbSk7Ci0jZW5kaWYKLQlyZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgd2lkdGggPSBkYy0+dS54LnBlbi53aWR0aDsKKyAgICBvbGR3aWR0aCA9IHdpZHRoID0gZGMtPnUueC5wZW4ud2lkdGg7CiAgICAgaWYgKCF3aWR0aCkgd2lkdGggPSAxOwogICAgIGlmKGRjLT51LngucGVuLnN0eWxlID09IFBTX05VTEwpIHdpZHRoID0gMDsKIAotICAgIGlmICgoZGMtPnUueC5wZW4uc3R5bGUgPT0gUFNfSU5TSURFRlJBTUUpICYmCi0gICAgICAgICh3aWR0aCA8IHJpZ2h0LWxlZnQpICYmICh3aWR0aCA8IGJvdHRvbS10b3ApKQorICAgIGlmICgoZGMtPnUueC5wZW4uc3R5bGUgPT0gUFNfSU5TSURFRlJBTUUpKQogICAgIHsKKyAgICAgICAgaWYgKDIqd2lkdGggPiAocmlnaHQtbGVmdCkpIHdpZHRoPShyaWdodC1sZWZ0ICsgMSkvMjsKKyAgICAgICAgaWYgKDIqd2lkdGggPiAoYm90dG9tLXRvcCkpIHdpZHRoPShib3R0b20tdG9wICsgMSkvMjsKICAgICAgICAgbGVmdCAgICs9IHdpZHRoIC8gMjsKLSAgICAgICAgcmlnaHQgIC09ICh3aWR0aCArIDEpIC8gMjsKKyAgICAgICAgcmlnaHQgIC09ICh3aWR0aCAtIDEpIC8gMjsKICAgICAgICAgdG9wICAgICs9IHdpZHRoIC8gMjsKLSAgICAgICAgYm90dG9tIC09ICh3aWR0aCArIDEpIC8gMjsKKyAgICAgICAgYm90dG9tIC09ICh3aWR0aCAtIDEpIC8gMjsKICAgICB9CisgICAgaWYod2lkdGggPT0gMSkgd2lkdGg9MDsKKyAgICBkYy0+dS54LnBlbi53aWR0aD13aWR0aDsKIAogICAgIGlmICgocmlnaHQgPiBsZWZ0ICsgd2lkdGgpICYmIChib3R0b20gPiB0b3AgKyB3aWR0aCkpCiAgICAgewpAQCAtMjc0LDYgKzI4OSw4IEBACiAJVFNYRHJhd1JlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKIAkJICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyB0b3AsCiAJCSAgICAgICAgcmlnaHQtbGVmdC0xLCBib3R0b20tdG9wLTEgKTsKKworICAgIGRjLT51LngucGVuLndpZHRoPW9sZHdpZHRoOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0yODQsNiArMzAxLDggQEAKIFgxMURSVl9Sb3VuZFJlY3QoIERDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwKICAgICAgICAgICAgICAgICAgIElOVDMyIGJvdHRvbSwgSU5UMzIgZWxsX3dpZHRoLCBJTlQzMiBlbGxfaGVpZ2h0ICkKIHsKKyAgICBJTlQzMiB3aWR0aCwgb2xkd2lkdGg7CisKICAgICBUUkFDRShncmFwaGljcywgIiglZCAlZCAlZCAlZCAgJWQgJWRcbiIsIAogICAgIAlsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGVsbF93aWR0aCwgZWxsX2hlaWdodCk7CiAKQEAgLTI5MSw2ICszMTAsMTAgQEAKICAgICB0b3AgICAgPSBZTFBUT0RQKCBkYywgdG9wICk7CiAgICAgcmlnaHQgID0gWExQVE9EUCggZGMsIHJpZ2h0ICk7CiAgICAgYm90dG9tID0gWUxQVE9EUCggZGMsIGJvdHRvbSApOworCisgICAgaWYgKChsZWZ0ID09IHJpZ2h0KSB8fCAodG9wID09IGJvdHRvbSkpCisJcmV0dXJuIFRSVUU7CisKICAgICBlbGxfd2lkdGggID0gYWJzKCBlbGxfd2lkdGggKiBkYy0+dnBvcnRFeHRYIC8gZGMtPnduZEV4dFggKTsKICAgICBlbGxfaGVpZ2h0ID0gYWJzKCBlbGxfaGVpZ2h0ICogZGMtPnZwb3J0RXh0WSAvIGRjLT53bmRFeHRZICk7CiAKQEAgLTI5OCwyNSArMzIxLDYyIEBACiAKICAgICBpZiAocmlnaHQgPCBsZWZ0KSB7IElOVDMyIHRtcCA9IHJpZ2h0OyByaWdodCA9IGxlZnQ7IGxlZnQgPSB0bXA7IH0KICAgICBpZiAoYm90dG9tIDwgdG9wKSB7IElOVDMyIHRtcCA9IGJvdHRvbTsgYm90dG9tID0gdG9wOyB0b3AgPSB0bXA7IH0KLSAgICBpZiAoZWxsX3dpZHRoID4gcmlnaHQgLSBsZWZ0KSBlbGxfd2lkdGggPSByaWdodCAtIGxlZnQ7Ci0gICAgaWYgKGVsbF9oZWlnaHQgPiBib3R0b20gLSB0b3ApIGVsbF9oZWlnaHQgPSBib3R0b20gLSB0b3A7CisKKyAgICBvbGR3aWR0aD13aWR0aCA9IGRjLT51LngucGVuLndpZHRoOworICAgIGlmICghd2lkdGgpIHdpZHRoID0gMTsKKyAgICBpZihkYy0+dS54LnBlbi5zdHlsZSA9PSBQU19OVUxMKSB3aWR0aCA9IDA7CisKKyAgICBpZiAoKGRjLT51LngucGVuLnN0eWxlID09IFBTX0lOU0lERUZSQU1FKSkKKyAgICB7CisgICAgICAgIGlmICgyKndpZHRoID4gKHJpZ2h0LWxlZnQpKSB3aWR0aD0ocmlnaHQtbGVmdCArIDEpLzI7CisgICAgICAgIGlmICgyKndpZHRoID4gKGJvdHRvbS10b3ApKSB3aWR0aD0oYm90dG9tLXRvcCArIDEpLzI7CisgICAgICAgIGxlZnQgICArPSB3aWR0aCAvIDI7CisgICAgICAgIHJpZ2h0ICAtPSAod2lkdGggLSAxKSAvIDI7CisgICAgICAgIHRvcCAgICArPSB3aWR0aCAvIDI7CisgICAgICAgIGJvdHRvbSAtPSAod2lkdGggLSAxKSAvIDI7CisgICAgfQorICAgIGlmKHdpZHRoID09IDEpIHdpZHRoPTA7CisgICAgZGMtPnUueC5wZW4ud2lkdGg9d2lkdGg7CiAKICAgICBpZiAoRENfU2V0dXBHQ0ZvckJydXNoKCBkYyApKQogICAgIHsKLSAgICAgICAgaWYgKGVsbF93aWR0aCAmJiBlbGxfaGVpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICBUU1hGaWxsQXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICBpZiAoZWxsX3dpZHRoID4gKHJpZ2h0LWxlZnQpICkKKyAgICAgICAgICAgIGlmIChlbGxfaGVpZ2h0ID4gKGJvdHRvbS10b3ApICkKKyAgICAgICAgICAgICAgICAgICAgVFNYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCAtIDEsIGJvdHRvbSAtIHRvcCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAzNjAgKiA2NCApOworICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgVFNYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCAtIDEsIGVsbF9oZWlnaHQsIDAsIDE4MCAqIDY0ICk7CisgICAgICAgICAgICAgICAgICAgIFRTWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtIGxlZnQgLSAxLCBlbGxfaGVpZ2h0LCAxODAgKiA2NCwgMTgwICogNjQgKTsKKyAgICAgICAgICAgfQorCWVsc2UgaWYgKGVsbF9oZWlnaHQgPiAoYm90dG9tLXRvcCkgKXsKKyAgICAgICAgICAgICAgICBUU1hGaWxsQXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGJvdHRvbSAtIHRvcCAtIDEsIDkwICogNjQsIDE4MCAqIDY0ICk7CisgICAgICAgICAgICAgICAgVFNYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCAtMSwgZGMtPncuRENPcmdZICsgdG9wLAorICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgYm90dG9tIC0gdG9wIC0gMSwgMjcwICogNjQsIDE4MCAqIDY0ICk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIFRTWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgdG9wLAogICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgOTAgKiA2NCwgOTAgKiA2NCApOwotICAgICAgICAgICAgVFNYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLSAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0LAorICAgICAgICAgICAgICAgIFRTWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0IC0gMSwKICAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDE4MCAqIDY0LCA5MCAqIDY0ICk7Ci0gICAgICAgICAgICBUU1hGaWxsQXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0IC0gZWxsX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIGJvdHRvbSAtIGVsbF9oZWlnaHQsCisgICAgICAgICAgICAgICAgVFNYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0LCAyNzAgKiA2NCwgOTAgKiA2NCApOwotICAgICAgICAgICAgVFNYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLSAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCwgZGMtPncuRENPcmdZICsgdG9wLAorICAgICAgICAgICAgICAgIFRTWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCwKICAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDAsIDkwICogNjQgKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZWxsX3dpZHRoIDwgcmlnaHQgLSBsZWZ0KQpAQCAtMzI4LDYxICszODgsODMgQEAKICAgICAgICAgICAgIFRTWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gKGVsbF9oZWlnaHQrMSkgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCAtIGVsbF93aWR0aCwgKGVsbF9oZWlnaHQrMSkgLyAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgLSBsZWZ0IC0gZWxsX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbGxfaGVpZ2h0KzEpIC8gMiAtIDEgKTsKICAgICAgICAgfQogICAgICAgICBpZiAgKGVsbF9oZWlnaHQgPCBib3R0b20gLSB0b3ApCiAgICAgICAgIHsKICAgICAgICAgICAgIFRTWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0IC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCAtIGVsbF9oZWlnaHQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtIGxlZnQgLSAxLCBib3R0b20gLSB0b3AgLSBlbGxfaGVpZ2h0ICk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKERDX1NldHVwR0NGb3JQZW4oZGMpKQotICAgIHsKLSAgICAgICAgaWYgKGVsbF93aWR0aCAmJiBlbGxfaGVpZ2h0KQotICAgICAgICB7CisgICAgaWYgKERDX1NldHVwR0NGb3JQZW4oZGMpKSB7CisgICAgICAgIGlmIChlbGxfd2lkdGggPiAocmlnaHQtbGVmdCkgKQorICAgICAgICAgICAgaWYgKGVsbF9oZWlnaHQgPiAoYm90dG9tLXRvcCkgKQorICAgICAgICAgICAgICAgIFRTWERyYXdBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJCSAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKKwkJICAgICAgcmlnaHQgLSBsZWZ0IC0gMSwgYm90dG9tIC10b3AgLSAxLCAwICwgMzYwICogNjQgKTsKKyAgICAgICAgICAgIGVsc2V7CisJCVRTWERyYXdBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJCSAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKKwkJICAgICAgcmlnaHQgLSBsZWZ0IC0gMSwgZWxsX2hlaWdodCAtIDEsIDAgLCAxODAgKiA2NCApOworCQlUU1hEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCQkgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCAKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0LAorCQkgICAgICByaWdodCAtIGxlZnQgLSAxLCBlbGxfaGVpZ2h0IC0gMSwgMTgwICogNjQgLCAxODAgKiA2NCApOworICAgICAgICAgICAgfQorCWVsc2UgaWYgKGVsbF9oZWlnaHQgPiAoYm90dG9tLXRvcCkgKXsKKyAgICAgICAgICAgICAgICBUU1hEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGggLSAxICwgYm90dG9tIC0gdG9wIC0gMSwgOTAgKiA2NCAsIDE4MCAqIDY0ICk7CisgICAgICAgICAgICAgICAgVFNYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCwgCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgdG9wLAorICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCAtIDEgLCBib3R0b20gLSB0b3AgLSAxLCAyNzAgKiA2NCAsIDE4MCAqIDY0ICk7CisJfWVsc2V7CiAgICAgICAgICAgICBUU1hEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDkwICogNjQsIDkwICogNjQgKTsKKyAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGggLSAxLCBlbGxfaGVpZ2h0IC0gMSwgOTAgKiA2NCwgOTAgKiA2NCApOwogICAgICAgICAgICAgVFNYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMTgwICogNjQsIDkwICogNjQgKTsKKyAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGggLSAxLCBlbGxfaGVpZ2h0IC0gMSwgMTgwICogNjQsIDkwICogNjQgKTsKICAgICAgICAgICAgIFRTWERyYXdBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCiAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDI3MCAqIDY0LCA5MCAqIDY0ICk7CisgICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoIC0gMSwgZWxsX2hlaWdodCAtIDEsIDI3MCAqIDY0LCA5MCAqIDY0ICk7CiAgICAgICAgICAgICBUU1hEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0IC0gZWxsX3dpZHRoLCBkYy0+dy5EQ09yZ1kgKyB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0LCAwLCA5MCAqIDY0ICk7CisgICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoIC0gMSwgZWxsX2hlaWdodCAtIDEsIDAsIDkwICogNjQgKTsKIAl9Ci0gICAgICAgIGlmIChlbGxfd2lkdGggPCByaWdodCAtIGxlZnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRTWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGggLyAyLAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKTsKLSAgICAgICAgICAgIFRTWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGggLyAyLAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZWxsX2hlaWdodCA8IGJvdHRvbSAtIHRvcCkKLSAgICAgICAgewotICAgICAgICAgICAgVFNYRHJhd0xpbmUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgdG9wICsgZWxsX2hlaWdodCAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0IC8gMiApOwotICAgICAgICAgICAgVFNYRHJhd0xpbmUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0IC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCAvIDIgKTsKLSAgICAgICAgfQorCWlmIChlbGxfd2lkdGggPCByaWdodCAtIGxlZnQpCisJeworCSAgICBUU1hEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisJCSAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0ICsgZWxsX3dpZHRoIC8gMiAtIDIsCisJCSAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AsCisJCSAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCAvIDIsCisJCSAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3ApOworCSAgICBUU1hEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisJCSAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0ICsgZWxsX3dpZHRoIC8gMiAtIDIsCisJCSAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSAxLAorCQkgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGggLyAyLAorCQkgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gMSk7CisJfQorCWlmIChlbGxfaGVpZ2h0IDwgYm90dG9tIC0gdG9wKQorCXsKKwkgICAgVFNYRHJhd0xpbmUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAorCQkgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSAxLAorCQkgICAgICAgZGMtPncuRENPcmdZICsgdG9wICsgZWxsX2hlaWdodCAvIDIgLSAxLAorCQkgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSAxLAorCQkgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCAvIDIpOworCSAgICBUU1hEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisJCSAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LAorCQkgICAgICAgZGMtPncuRENPcmdZICsgdG9wICsgZWxsX2hlaWdodCAvIDIgLSAxLAorCQkgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwKKwkJICAgICAgIGRjLT53LkRDT3JnWSArIGJvdHRvbSAtIGVsbF9oZWlnaHQgLyAyKTsKKwl9CiAgICAgfQorICAgIGRjLT51LngucGVuLndpZHRoPW9sZHdpZHRoOwogICAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9pZjE2MzIvYnVpbHRpbi5jIGIvaWYxNjMyL2J1aWx0aW4uYwppbmRleCBiYTlkYjE5Li43ZjQwZTIxIDEwMDY0NAotLS0gYS9pZjE2MzIvYnVpbHRpbi5jCisrKyBiL2lmMTYzMi9idWlsdGluLmMKQEAgLTg5LDcgKzg5LDcgQEAKICAgICB7ICZHRElfRGVzY3JpcHRvciwgICAgICBETExfRkxBR19BTFdBWVNfVVNFRCB9LAogICAgIHsgJlNZU1RFTV9EZXNjcmlwdG9yLCAgIERMTF9GTEFHX0FMV0FZU19VU0VEIH0sCiAgICAgeyAmV1BST0NTX0Rlc2NyaXB0b3IsICAgRExMX0ZMQUdfQUxXQVlTX1VTRUQgfSwKLSAgICB7ICZXSU5ERUJVR19EZXNjcmlwdG9yLCBETExfRkxBR19BTFdBWVNfVVNFRCB9LAorICAgIHsgJldJTkRFQlVHX0Rlc2NyaXB0b3IsIERMTF9GTEFHX05PVF9VU0VEIH0sCiAgICAgeyAmQ09NTURMR19EZXNjcmlwdG9yLCAgRExMX0ZMQUdfTk9UX1VTRUQgfSwKICAgICB7ICZDT01QT0JKX0Rlc2NyaXB0b3IsICBETExfRkxBR19OT1RfVVNFRCB9LAogICAgIHsgJkRERU1MX0Rlc2NyaXB0b3IsICAgIERMTF9GTEFHX05PVF9VU0VEIH0sCmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpLnNwZWMgYi9pZjE2MzIvZ2RpLnNwZWMKaW5kZXggMzRjZWYzMi4uMzQzMjJiNCAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaS5zcGVjCisrKyBiL2lmMTYzMi9nZGkuc3BlYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAxNTEgcGFzY2FsMTYgQ29weU1ldGFGaWxlKHdvcmQgc3RyKSBDb3B5TWV0YUZpbGUxNgogMTUzIHBhc2NhbDE2IENyZWF0ZUlDKHN0ciBzdHIgc3RyIHB0cikgQ3JlYXRlSUMxNgogMTU0IHBhc2NhbCAgIEdldE5lYXJlc3RDb2xvcih3b3JkIGxvbmcpIEdldE5lYXJlc3RDb2xvcjE2Ci0xNTUgc3R1YiBRdWVyeUFib3J0CisxNTUgcGFzY2FsMTYgUXVlcnlBYm9ydCh3b3JkIHdvcmQpIFF1ZXJ5QWJvcnQKIDE1NiBwYXNjYWwxNiBDcmVhdGVEaXNjYXJkYWJsZUJpdG1hcCh3b3JkIHdvcmQgd29yZCkgQ3JlYXRlRGlzY2FyZGFibGVCaXRtYXAxNgogMTU4IHBhc2NhbDE2IEVudW1DYWxsYmFjayhwdHIgcHRyIHdvcmQgbG9uZykgV2luZUVudW1ERm9udENhbGxiYWNrCiAxNTkgcGFzY2FsMTYgR2V0TWV0YUZpbGVCaXRzKHdvcmQpIEdldE1ldGFGaWxlQml0cwpAQCAtMjA3LDcgKzIwNyw3IEBACiAyNzIgc3R1YiBFbmREb2NQcmludGVyCiAyNzQgc3R1YiBDbG9zZVByaW50ZXIKIDI4MCBzdHViIEdldFJlYWxEcml2ZXJJbmZvCi0yODEgcGFzY2FsIERydlNldFByaW50ZXJEYXRhKHB0ciBwdHIgcHRyIHB0ciBsb25nKSBEcnZTZXRQcmludGVyRGF0YQorMjgxIHBhc2NhbCBEcnZTZXRQcmludGVyRGF0YShwdHIgcHRyIGxvbmcgcHRyIGxvbmcpIERydlNldFByaW50ZXJEYXRhCiAyODIgcGFzY2FsIERydkdldFByaW50ZXJEYXRhKHB0ciBwdHIgcHRyIHB0ciBsb25nIHB0cikgRHJ2R2V0UHJpbnRlckRhdGEKIDI5OSBzdHViIEVOR0lORUdFVENIQVJXSURUSEVYCiAzMDAgcGFzY2FsIEVuZ2luZUVudW1lcmF0ZUZvbnQocHRyIHNlZ3B0ciBsb25nKSBFbmdpbmVFbnVtZXJhdGVGb250CmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggMzhiZDM2Ni4uODhmOWNmMCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAxNDYgcGFzY2FsMTYgRGVsZXRlRmlsZShwdHIpIERlbGV0ZUZpbGUxNgogMTQ3IHBhc2NhbDE2IFNldExhc3RFcnJvcihsb25nKSBTZXRMYXN0RXJyb3IKIDE0OCBwYXNjYWwgICBHZXRMYXN0RXJyb3IoKSBHZXRMYXN0RXJyb3IKLTE0OSBzdHViIEdldFZlcnNpb25FeAorMTQ5IHBhc2NhbDE2IEdldFZlcnNpb25FeChwdHIpIEdldFZlcnNpb25FeDE2CiAxNTAgcGFzY2FsMTYgRGlyZWN0ZWRZaWVsZCh3b3JkKSBEaXJlY3RlZFlpZWxkCiAxNTEgc3R1YiBXaW5PbGRBcENhbGwKIDE1MiBwYXNjYWwxNiBHZXROdW1UYXNrcygpIEdldE51bVRhc2tzCmRpZmYgLS1naXQgYS9pZjE2MzIvbW1zeXN0ZW0uc3BlYyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCmluZGV4IGNkOTg4OWEuLjViZDBiMjQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9tbXN5c3RlbS5zcGVjCisrKyBiL2lmMTYzMi9tbXN5c3RlbS5zcGVjCkBAIC0xMzksNyArMTM5LDcgQEAKIDExMDAgICBwYXNjYWwgIERSVk9QRU4oc3RyIHN0ciBsb25nKSBEcnZPcGVuCiAxMTAxICAgcGFzY2FsICBEUlZDTE9TRSh3b3JkIGxvbmcgbG9uZykgRHJ2Q2xvc2UKIDExMDIgICBwYXNjYWwgIERSVlNFTkRNRVNTQUdFKHdvcmQgd29yZCBsb25nIGxvbmcpIERydlNlbmRNZXNzYWdlCi0xMTAzICAgcGFzY2FsICBEUlZHRVRNT0RVTEVIQU5ETEUod29yZCkgRHJ2R2V0TW9kdWxlSGFuZGxlCisxMTAzICAgcGFzY2FsICBkcnZHZXRNb2R1bGVIYW5kbGUod29yZCkgRHJ2R2V0TW9kdWxlSGFuZGxlMTYKIDExMDQgICBwYXNjYWwgIERSVkRFRkRSSVZFUlBST0MobG9uZyB3b3JkIHdvcmQgbG9uZyBsb25nKSBEcnZEZWZEcml2ZXJQcm9jCiAxMTIwICAgcGFzY2FsICBtbVRocmVhZENyZWF0ZShwdHIgcHRyIGxvbmcgbG9uZykgbW1UaHJlYWRDcmVhdGUxNgogMTEyMSAgIHBhc2NhbCAgbW1UaHJlYWRTaWduYWwod29yZCkgbW1UaHJlYWRTaWduYWwxNgpAQCAtMTQ4LDIzICsxNDgsMjUgQEAKIDExMjQgICBzdHViICAgIE1NVEhSRUFESVNWQUxJRAogMTEyNSAgIHBhc2NhbCAgbW1UaHJlYWRHZXRUYXNrKHdvcmQpIG1tVGhyZWFkR2V0VGFzazE2CiAxMTUwICAgc3R1YiAgICBNTVNIT1dNTUNQTFBST1BFUlRZU0hFRVQKKwogMTIxMCAgIHBhc2NhbCAgbW1pb09wZW4oc3RyIHB0ciBsb25nKSBtbWlvT3BlbjE2Ci0xMjExICAgcGFzY2FsICBNTUlPQ0xPU0Uod29yZCB3b3JkKSBtbWlvQ2xvc2UKLTEyMTIgICBwYXNjYWwgIE1NSU9SRUFEKHdvcmQgcHRyIGxvbmcpIG1taW9SZWFkCi0xMjEzICAgcGFzY2FsICBNTUlPV1JJVEUod29yZCBwdHIgbG9uZykgbW1pb1dyaXRlCi0xMjE0ICAgcGFzY2FsICBNTUlPU0VFSyh3b3JkIGxvbmcgd29yZCkgbW1pb1NlZWsKLTEyMTUgICBwYXNjYWwgIE1NSU9HRVRJTkZPKHdvcmQgcHRyIHdvcmQpIG1taW9HZXRJbmZvCisxMjExICAgcGFzY2FsICBtbWlvQ2xvc2Uod29yZCB3b3JkKSBtbWlvQ2xvc2UxNgorMTIxMiAgIHBhc2NhbCAgbW1pb1JlYWQod29yZCBwdHIgbG9uZykgbW1pb1JlYWQxNgorMTIxMyAgIHBhc2NhbCAgbW1pb1dyaXRlKHdvcmQgcHRyIGxvbmcpIG1taW9Xcml0ZTE2CisxMjE0ICAgcGFzY2FsICBtbWlvU2Vlayh3b3JkIGxvbmcgd29yZCkgbW1pb1NlZWsxNgorMTIxNSAgIHBhc2NhbCAgbW1pb0dldEluZm8od29yZCBwdHIgd29yZCkgbW1pb0dldEluZm8xNgogMTIxNiAgIHBhc2NhbCAgTU1JT1NFVElORk8od29yZCBwdHIgd29yZCkgbW1pb1NldEluZm8KIDEyMTcgICBwYXNjYWwgIE1NSU9TRVRCVUZGRVIod29yZCBwdHIgbG9uZyB3b3JkKSBtbWlvU2V0QnVmZmVyCi0xMjE4ICAgcGFzY2FsICBNTUlPRkxVU0god29yZCB3b3JkKSBtbWlvRmx1c2gKLTEyMTkgICBwYXNjYWwgIE1NSU9BRFZBTkNFKHdvcmQgcHRyIHdvcmQpIG1taW9BZHZhbmNlCisxMjE4ICAgcGFzY2FsICBtbWlvRmx1c2god29yZCB3b3JkKSBtbWlvRmx1c2gxNgorMTIxOSAgIHBhc2NhbCAgbW1pb0FkdmFuY2Uod29yZCBwdHIgd29yZCkgbW1pb0FkdmFuY2UxNgogMTIyMCAgIHBhc2NhbCAgbW1pb1N0cmluZ1RvRk9VUkNDKHN0ciB3b3JkKSBtbWlvU3RyaW5nVG9GT1VSQ0MxNgogMTIyMSAgIHBhc2NhbCAgTU1JT0lOU1RBTExJT1BST0MobG9uZyBwdHIgbG9uZykgbW1pb0luc3RhbGxJT1Byb2MxNgogMTIyMiAgIHBhc2NhbCAgTU1JT1NFTkRNRVNTQUdFKHdvcmQgd29yZCBsb25nIGxvbmcpIG1taW9TZW5kTWVzc2FnZQogMTIyMyAgIHBhc2NhbCAgTU1JT0RFU0NFTkQod29yZCBwdHIgcHRyIHdvcmQpIG1taW9EZXNjZW5kCi0xMjI0ICAgcGFzY2FsICBNTUlPQVNDRU5EKHdvcmQgcHRyIHdvcmQpIG1taW9Bc2NlbmQKKzEyMjQgICBwYXNjYWwgIG1taW9Bc2NlbmQod29yZCBwdHIgd29yZCkgbW1pb0FzY2VuZDE2CiAxMjI1ICAgcGFzY2FsICBNTUlPQ1JFQVRFQ0hVTksod29yZCBwdHIgd29yZCkgbW1pb0NyZWF0ZUNodW5rCiAxMjI2ICAgcGFzY2FsICBNTUlPUkVOQU1FKHB0ciBwdHIgcHRyIGxvbmcpIG1taW9SZW5hbWUKKwogIzIwMDAgICBzdHViICAgIFdJTk1NRl9USFVOS0RBVEExNgogIzIwMDEgICBzdHViICAgIFJJTkczX0RFVkxPQURFUgogIzIwMDIgICBzdHViICAgIFdJTk1NVElMRUJVRkZFUgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCAzMTM1ZDljLi5jNmYwMmY0IDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtMjUzLDcgKzI1MywxMCBAQAogICAgICAgICBEUFJJTlRGKCJDYWxsVG8xNihmdW5jPSUwNGx4OiUwNHgsZHM9JTA0bHgiLAogICAgICAgICAgICAgICAgIENTX3JlZyhjb250ZXh0KSwgSVBfcmVnKGNvbnRleHQpLCBEU19yZWcoY29udGV4dCkgKTsKICAgICAgICAgbmJfYXJncyA9IHN0YWNrWzFdIC8gc2l6ZW9mKFdPUkQpOwotICAgICAgICB3aGlsZSAobmJfYXJncy0tKSBwcmludGYoICIsMHglMDR4IiwgKigtLXN0YWNrMTYpICk7CisgICAgICAgIHdoaWxlIChuYl9hcmdzLS0pIHsKKwkgICAgLS1zdGFjazE2OworCSAgICBEUFJJTlRGKCAiLDB4JTA0eCIsICpzdGFjazE2ICk7CisJfQogICAgICAgICBEUFJJTlRGKCIpIHNzOnNwPSUwNHg6JTA0eFxuIiwgU0VMRUNUT1JPRih0aGRiLT5jdXJfc3RhY2spLAogICAgICAgICAgICAgICAgIE9GRlNFVE9GKHRoZGItPmN1cl9zdGFjaykgKTsKICAgICAgICAgRFBSSU5URigiICAgICBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4IFNJPSUwNHggREk9JTA0eCBCUD0lMDR4IEVTPSUwNHhcbiIsCkBAIC0yNjcsNyArMjcwLDEwIEBACiAgICAgICAgICAgICAgICAgSElXT1JEKHN0YWNrWzBdKSwgTE9XT1JEKHN0YWNrWzBdKSwKICAgICAgICAgICAgICAgICBTRUxFQ1RPUk9GKHRoZGItPmN1cl9zdGFjaykgKTsKICAgICAgICAgc3RhY2srKzsKLSAgICAgICAgd2hpbGUgKG5iX2FyZ3MtLSkgRFBSSU5URigiLDB4JTA0eCIsICpzdGFjaysrICk7CisgICAgICAgIHdoaWxlIChuYl9hcmdzLS0pIHsKKwkgICAgRFBSSU5URigiLDB4JTA0eCIsICpzdGFjayApOworCSAgICBzdGFjaysrOworCX0KICAgICAgICAgRFBSSU5URigiKSBzczpzcD0lMDR4OiUwNHhcbiIsIFNFTEVDVE9ST0YodGhkYi0+Y3VyX3N0YWNrKSwKICAgICAgICAgICAgICAgICBPRkZTRVRPRih0aGRiLT5jdXJfc3RhY2spICk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIuc3BlYyBiL2lmMTYzMi91c2VyLnNwZWMKaW5kZXggNTcwYWEyMS4uODNlNzYwMyAxMDA2NDQKLS0tIGEvaWYxNjMyL3VzZXIuc3BlYworKysgYi9pZjE2MzIvdXNlci5zcGVjCkBAIC0yNTUsMTAgKzI1NSwxMCBAQAogMjQ4IHBhc2NhbDE2IEdldE9wZW5DbGlwYm9hcmRXaW5kb3coKSBHZXRPcGVuQ2xpcGJvYXJkV2luZG93MTYKIDI0OSBwYXNjYWwxNiBHZXRBc3luY0tleVN0YXRlKHdvcmQpIEdldEFzeW5jS2V5U3RhdGUxNgogMjUwIHBhc2NhbDE2IEdldE1lbnVTdGF0ZSh3b3JkIHdvcmQgd29yZCkgR2V0TWVudVN0YXRlMTYKLTI1MSBwYXNjYWwgICBTZW5kRHJpdmVyTWVzc2FnZSh3b3JkIHdvcmQgbG9uZyBsb25nKSBTZW5kRHJpdmVyTWVzc2FnZQotMjUyIHBhc2NhbDE2IE9wZW5Ecml2ZXIoc3RyIHN0ciBsb25nKSBPcGVuRHJpdmVyCi0yNTMgcGFzY2FsICAgQ2xvc2VEcml2ZXIod29yZCBsb25nIGxvbmcpIENsb3NlRHJpdmVyCi0yNTQgcGFzY2FsMTYgR2V0RHJpdmVyTW9kdWxlSGFuZGxlKHdvcmQpIEdldERyaXZlck1vZHVsZUhhbmRsZQorMjUxIHBhc2NhbCAgIFNlbmREcml2ZXJNZXNzYWdlKHdvcmQgd29yZCBsb25nIGxvbmcpIFNlbmREcml2ZXJNZXNzYWdlMTYKKzI1MiBwYXNjYWwxNiBPcGVuRHJpdmVyKHN0ciBzdHIgbG9uZykgT3BlbkRyaXZlcjE2CisyNTMgcGFzY2FsICAgQ2xvc2VEcml2ZXIod29yZCBsb25nIGxvbmcpIENsb3NlRHJpdmVyMTYKKzI1NCBwYXNjYWwxNiBHZXREcml2ZXJNb2R1bGVIYW5kbGUod29yZCkgR2V0RHJpdmVyTW9kdWxlSGFuZGxlMTYKIDI1NSBwYXNjYWwgICBEZWZEcml2ZXJQcm9jKGxvbmcgd29yZCB3b3JkIGxvbmcgbG9uZykgRGVmRHJpdmVyUHJvYwogMjU2IHBhc2NhbDE2IEdldERyaXZlckluZm8od29yZCBwdHIpIEdldERyaXZlckluZm8KIDI1NyBwYXNjYWwxNiBHZXROZXh0RHJpdmVyKHdvcmQgbG9uZykgR2V0TmV4dERyaXZlcgpAQCAtNDc3LDcgKzQ3Nyw3IEBACiA1MjkgcGFzY2FsMTYgV05ldFByb3BlcnR5RGlhbG9nKHdvcmQgd29yZCBwdHIgd29yZCkgV05ldFByb3BlcnR5RGlhbG9nCiA1MzAgcGFzY2FsMTYgV05ldEdldERpcmVjdG9yeVR5cGUocHRyIHB0cikgV05ldEdldERpcmVjdG9yeVR5cGUxNgogNTMxIHBhc2NhbDE2IFdOZXREaXJlY3RvcnlOb3RpZnkod29yZCBwdHIgd29yZCkgV05ldERpcmVjdG9yeU5vdGlmeQotNTMyIHBhc2NhbDE2IFdOZXRHZXRQcm9wZXJ0eVRleHQod29yZCB3b3JkIHdvcmQgcHRyIHdvcmQpIFdOZXRHZXRQcm9wZXJ0eVRleHQKKzUzMiBwYXNjYWwxNiBXTmV0R2V0UHJvcGVydHlUZXh0KHdvcmQgd29yZCBzdHIgc3RyIHdvcmQgd29yZCkgV05ldEdldFByb3BlcnR5VGV4dAogNTMzIHN0dWIgV05ldEluaXRpYWxpemUKIDUzNCBzdHViIFdOZXRMb2dvbgogNjAwIHBhc2NhbDE2IEdldFNoZWxsV2luZG93KCkgR2V0U2hlbGxXaW5kb3cxNgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dwcm9jcy5zcGVjIGIvaWYxNjMyL3dwcm9jcy5zcGVjCmluZGV4IGRiN2FhNjYuLjc5OTNhZWEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93cHJvY3Muc3BlYworKysgYi9pZjE2MzIvd3Byb2NzLnNwZWMKQEAgLTEzLDYgKzEzLDcgQEAKIDI4IHBhc2NhbCBNeUFsbG9jKHdvcmQgd29yZCB3b3JkKSBORV9BbGxvY2F0ZVNlZ21lbnQKIDI5IHBhc2NhbCBEZWZSZXNvdXJjZUhhbmRsZXIod29yZCB3b3JkIHdvcmQpIE5FX0RlZlJlc291cmNlSGFuZGxlcgogMzAgcGFzY2FsIEZvcm1hdENoYXJEbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIEZvcm1hdENoYXJEbGdQcm9jMTYKKzMxIHBhc2NhbDE2IEFTUElfRE9TX2Z1bmMobG9uZykgQVNQSV9ET1NfZnVuYwogIAogIyBJbnRlcnJ1cHQgdmVjdG9ycyAwLTI1NSBhcmUgb3JkaW5hbHMgMTAwLTM1NQogIyBUaGUgJ3dvcmQnIHBhcmFtZXRlciBhcmUgdGhlIGZsYWdzIHB1c2hlZCBvbiB0aGUgc3RhY2sgYnkgdGhlIGludGVycnVwdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY2NvbmZpZy5oIGIvaW5jbHVkZS9hY2NvbmZpZy5oCmluZGV4IDIwZmFhMmYuLjFmYWQ1ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNjb25maWcuaAorKysgYi9pbmNsdWRlL2FjY29uZmlnLmgKQEAgLTIxLDYgKzIxLDEyIEBACiAvKiBEZWZpbmUgaWYgWCBsaWJyYXJpZXMgYXJlIG5vdCByZWVudHJhbnQgKGNvbXBpbGVkIHdpdGhvdXQgLURfUkVFTlRSQU5UKS4gICovCiAjdW5kZWYgTk9fUkVFTlRSQU5UX1gxMQogCisvKiBEZWZpbmUgaWYgYWxsIGRlYnVnIG1lc3NhZ2VzIGFyZSB0byBiZSBjb21waWxlZCBvdXQgKi8KKyN1bmRlZiBOT19ERUJVR19NU0dTCisKKy8qIERlZmluZSBpZiBUUkFDRSBtZXNzYWdlcyBhcmUgdG8gYmUgY29tcGlsZWQgb3V0ICovCisjdW5kZWYgTk9fVFJBQ0VfTVNHUworCiAvKiBEZWZpbmUgaWYgdGhlIHN0cnVjdCBzdGF0ZnMgaGFzIHRoZSBtZW1iZXIgYmF2YWlsICovCiAjdW5kZWYgU1RBVEZTX0hBU19CQVZBSUwKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tY3RybC5oIGIvaW5jbHVkZS9jb21tY3RybC5oCmluZGV4IGM1N2M5OTIuLmJhOTRiZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tbWN0cmwuaAorKysgYi9pbmNsdWRlL2NvbW1jdHJsLmgKQEAgLTcsNiArNyw5IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKK1ZPSUQgV0lOQVBJIEdldEVmZmVjdGl2ZUNsaWVudFJlY3QgKEhXTkQzMiwgTFBSRUNUMzIsIExQSU5UMzIpOworCisKIHZvaWQgV0lOQVBJIEluaXRDb21tb25Db250cm9scyh2b2lkKTsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnSU5JVENPTU1PTkNPTlRST0xTRVggewpAQCAtNzYsMTEgKzc5LDE3IEBACiAjZGVmaW5lIE5NX1RPT0xUSVBTQ1JFQVRFRCAgIChOTV9GSVJTVC0xOSkKIAogCisvKiBjYWxsYmFjayBjb25zdGFudHMgKi8KKyNkZWZpbmUgTFBTVFJfVEVYVENBTExCQUNLMzJBICAgICgoTFBTVFIpLTFMKQorI2RlZmluZSBMUFNUUl9URVhUQ0FMTEJBQ0szMlcgICAgKChMUFdTVFIpLTFMKQorI2RlZmluZSBMUFNUUl9URVhUQ0FMTEJBQ0sgV0lORUxJQl9OQU1FX0FXKExQU1RSX1RFWFRDQUxMQkFDSykKKworCiAvKiBTdGF0dXNXaW5kb3cgKi8KIAogI2RlZmluZSBTVEFUVVNDTEFTU05BTUUxNiAgICAgIm1zY3Rsc19zdGF0dXNiYXIiCiAjZGVmaW5lIFNUQVRVU0NMQVNTTkFNRTMyQSAgICAibXNjdGxzX3N0YXR1c2JhcjMyIgotI2RlZmluZSBTVEFUVVNDTEFTU05BTUUzMlcgICBMIm1zY3Rsc19zdGF0dXNiYXIzMiIgICAgICAgLypGSVhNRSovCisjZGVmaW5lIFNUQVRVU0NMQVNTTkFNRTMyVyAgIEwibXNjdGxzX3N0YXR1c2JhcjMyIgogI2RlZmluZSBTVEFUVVNDTEFTU05BTUUgV0lORUxJQl9OQU1FX0FXKFNUQVRVU0NMQVNTTkFNRSkKIAogI2RlZmluZSBTQl9TRVRURVhUMzJBICAgICAgICAgKFdNX1VTRVIrMSkKQEAgLTQ5Nyw0NyArNTA2LDQ2IEBACiAKIC8qIFRvb2xiYXIgKi8KIAotI2RlZmluZSBUT09MQkFSQ0xBU1NOQU1FMTYgICAgICAgICJUb29sYmFyV2luZG93IiAKLSNkZWZpbmUgVE9PTEJBUkNMQVNTTkFNRTMyVyAgICAgICBMIlRvb2xiYXJXaW5kb3czMiIgCi0jZGVmaW5lIFRPT0xCQVJDTEFTU05BTUUzMkEgICAgICAgIlRvb2xiYXJXaW5kb3czMiIgCisjZGVmaW5lIFRPT0xCQVJDTEFTU05BTUUxNiAgICAgICAgIlRvb2xiYXJXaW5kb3ciCisjZGVmaW5lIFRPT0xCQVJDTEFTU05BTUUzMlcgICAgICAgTCJUb29sYmFyV2luZG93MzIiCisjZGVmaW5lIFRPT0xCQVJDTEFTU05BTUUzMkEgICAgICAgIlRvb2xiYXJXaW5kb3czMiIKICNkZWZpbmUgVE9PTEJBUkNMQVNTTkFNRSBXSU5FTElCX05BTUVfQVcoVE9PTEJBUkNMQVNTTkFNRSkKIAotIAotI2RlZmluZSBDTUJfTUFTS0VEICAgICAgICAgICAgICAweDAyIAotIAotI2RlZmluZSBUQlNUQVRFX0NIRUNLRUQgICAgICAgICAweDAxIAotI2RlZmluZSBUQlNUQVRFX1BSRVNTRUQgICAgICAgICAweDAyIAotI2RlZmluZSBUQlNUQVRFX0VOQUJMRUQgICAgICAgICAweDA0IAotI2RlZmluZSBUQlNUQVRFX0hJRERFTiAgICAgICAgICAweDA4IAotI2RlZmluZSBUQlNUQVRFX0lOREVURVJNSU5BVEUgICAweDEwIAotI2RlZmluZSBUQlNUQVRFX1dSQVAgICAgICAgICAgICAweDIwIAorCisjZGVmaW5lIENNQl9NQVNLRUQgICAgICAgICAgICAgIDB4MDIKKworI2RlZmluZSBUQlNUQVRFX0NIRUNLRUQgICAgICAgICAweDAxCisjZGVmaW5lIFRCU1RBVEVfUFJFU1NFRCAgICAgICAgIDB4MDIKKyNkZWZpbmUgVEJTVEFURV9FTkFCTEVEICAgICAgICAgMHgwNAorI2RlZmluZSBUQlNUQVRFX0hJRERFTiAgICAgICAgICAweDA4CisjZGVmaW5lIFRCU1RBVEVfSU5ERVRFUk1JTkFURSAgIDB4MTAKKyNkZWZpbmUgVEJTVEFURV9XUkFQICAgICAgICAgICAgMHgyMAogI2RlZmluZSBUQlNUQVRFX0VMTElQU0VTICAgICAgICAweDQwCi0jZGVmaW5lIFRCU1RBVEVfTUFSS0VEICAgICAgICAgIDB4ODAgCisjZGVmaW5lIFRCU1RBVEVfTUFSS0VEICAgICAgICAgIDB4ODAKKworI2RlZmluZSBUQlNUWUxFX0JVVFRPTiAgICAgICAgICAweDAwCisjZGVmaW5lIFRCU1RZTEVfU0VQICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgVEJTVFlMRV9DSEVDSyAgICAgICAgICAgMHgwMgorI2RlZmluZSBUQlNUWUxFX0dST1VQICAgICAgICAgICAweDA0CisjZGVmaW5lIFRCU1RZTEVfQ0hFQ0tHUk9VUCAgICAgIChUQlNUWUxFX0dST1VQIHwgVEJTVFlMRV9DSEVDSykKKyNkZWZpbmUgVEJTVFlMRV9EUk9QRE9XTiAgICAgICAgMHgwOAogIAotIAotI2RlZmluZSBUQlNUWUxFX0JVVFRPTiAgICAgICAgICAweDAwIAotI2RlZmluZSBUQlNUWUxFX1NFUCAgICAgICAgICAgICAweDAxIAotI2RlZmluZSBUQlNUWUxFX0NIRUNLICAgICAgICAgICAweDAyIAotI2RlZmluZSBUQlNUWUxFX0dST1VQICAgICAgICAgICAweDA0IAotI2RlZmluZSBUQlNUWUxFX0NIRUNLR1JPVVAgICAgICAoVEJTVFlMRV9HUk9VUCB8IFRCU1RZTEVfQ0hFQ0spIAotI2RlZmluZSBUQlNUWUxFX0RST1BET1dOICAgICAgICAweDA4IAotIAotI2RlZmluZSBUQlNUWUxFX1RPT0xUSVBTICAgICAgICAweDAxMDAgCi0jZGVmaW5lIFRCU1RZTEVfV1JBUEFCTEUgICAgICAgIDB4MDIwMCAKLSNkZWZpbmUgVEJTVFlMRV9BTFREUkFHICAgICAgICAgMHgwNDAwIAotI2RlZmluZSBUQlNUWUxFX0ZMQVQgICAgICAgICAgICAweDA4MDAgCi0jZGVmaW5lIFRCU1RZTEVfTElTVCAgICAgICAgICAgIDB4MTAwMCAKLSNkZWZpbmUgVEJTVFlMRV9DVVNUT01FUkFTRSAgICAgMHgyMDAwIAotIAorI2RlZmluZSBUQlNUWUxFX1RPT0xUSVBTICAgICAgICAweDAxMDAKKyNkZWZpbmUgVEJTVFlMRV9XUkFQQUJMRSAgICAgICAgMHgwMjAwCisjZGVmaW5lIFRCU1RZTEVfQUxURFJBRyAgICAgICAgIDB4MDQwMAorI2RlZmluZSBUQlNUWUxFX0ZMQVQgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgVEJTVFlMRV9MSVNUICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFRCU1RZTEVfQ1VTVE9NRVJBU0UgICAgIDB4MjAwMAorCiAjZGVmaW5lIFRCX0VOQUJMRUJVVFRPTiAgICAgICAgICAoV01fVVNFUisxKQogI2RlZmluZSBUQl9DSEVDS0JVVFRPTiAgICAgICAgICAgKFdNX1VTRVIrMikKICNkZWZpbmUgVEJfUFJFU1NCVVRUT04gICAgICAgICAgIChXTV9VU0VSKzMpCiAjZGVmaW5lIFRCX0hJREVCVVRUT04gICAgICAgICAgICAoV01fVVNFUis0KQogI2RlZmluZSBUQl9JTkRFVEVSTUlOQVRFICAgICAgICAgKFdNX1VTRVIrNSkKLSNkZWZpbmUgVEJfSVNCVVRUT05FTkFCTEVEICAgICAgIChXTV9VU0VSKzkpIAotI2RlZmluZSBUQl9JU0JVVFRPTkNIRUNLRUQgICAgICAgKFdNX1VTRVIrMTApIAotI2RlZmluZSBUQl9JU0JVVFRPTlBSRVNTRUQgICAgICAgKFdNX1VTRVIrMTEpIAotI2RlZmluZSBUQl9JU0JVVFRPTkhJRERFTiAgICAgICAgKFdNX1VTRVIrMTIpIAorI2RlZmluZSBUQl9JU0JVVFRPTkVOQUJMRUQgICAgICAgKFdNX1VTRVIrOSkKKyNkZWZpbmUgVEJfSVNCVVRUT05DSEVDS0VEICAgICAgIChXTV9VU0VSKzEwKQorI2RlZmluZSBUQl9JU0JVVFRPTlBSRVNTRUQgICAgICAgKFdNX1VTRVIrMTEpCisjZGVmaW5lIFRCX0lTQlVUVE9OSElEREVOICAgICAgICAoV01fVVNFUisxMikKICNkZWZpbmUgVEJfSVNCVVRUT05JTkRFVEVSTUlOQVRFIChXTV9VU0VSKzEzKQogI2RlZmluZSBUQl9JU0JVVFRPTkhJR0hMSUdIVEVEICAgKFdNX1VTRVIrMTQpCiAjZGVmaW5lIFRCX1NFVFNUQVRFICAgICAgICAgICAgICAoV01fVVNFUisxNykKQEAgLTU1OCw4ICs1NjYsOCBAQAogI2RlZmluZSBUQl9TQVZFUkVTVE9SRTMyVyAgICAgICAgKFdNX1VTRVIrNzYpCiAjZGVmaW5lIFRCX1NBVkVSRVNUT1JFIFdJTkVMSUJfTkFNRV9BVyhUQl9TQVZFUkVTVE9SRSkKICNkZWZpbmUgVEJfQ1VTVE9NSVpFICAgICAgICAgICAgIChXTV9VU0VSKzI3KQotI2RlZmluZSBUQl9BRERTVFJJTkczMkEgICAgICAgICAgKFdNX1VTRVIrMjgpIAotI2RlZmluZSBUQl9BRERTVFJJTkczMlcgICAgICAgICAgKFdNX1VTRVIrNzcpIAorI2RlZmluZSBUQl9BRERTVFJJTkczMkEgICAgICAgICAgKFdNX1VTRVIrMjgpCisjZGVmaW5lIFRCX0FERFNUUklORzMyVyAgICAgICAgICAoV01fVVNFUis3NykKICNkZWZpbmUgVEJfQUREU1RSSU5HIFdJTkVMSUJfTkFNRV9BVyhUQl9BRERTVFJJTkcpCiAjZGVmaW5lIFRCX0dFVElURU1SRUNUICAgICAgICAgICAoV01fVVNFUisyOSkKICNkZWZpbmUgVEJfQlVUVE9OU1RSVUNUU0laRSAgICAgIChXTV9VU0VSKzMwKQpAQCAtNTcxLDYgKzU3OSw3IEBACiAjZGVmaW5lIFRCX1NFVFBBUkVOVCAgICAgICAgICAgICAoV01fVVNFUiszNykKICNkZWZpbmUgVEJfU0VUUk9XUyAgICAgICAgICAgICAgIChXTV9VU0VSKzM5KQogI2RlZmluZSBUQl9HRVRST1dTICAgICAgICAgICAgICAgKFdNX1VTRVIrNDApCisjZGVmaW5lIFRCX0dFVEJJVE1BUEZMQUdTICAgICAgICAoV01fVVNFUis0MSkKICNkZWZpbmUgVEJfU0VUQ01ESUQgICAgICAgICAgICAgIChXTV9VU0VSKzQyKQogI2RlZmluZSBUQl9DSEFOR0VCSVRNQVAgICAgICAgICAgKFdNX1VTRVIrNDMpCiAjZGVmaW5lIFRCX0dFVEJJVE1BUCAgICAgICAgICAgICAoV01fVVNFUis0NCkKQEAgLTU5NCw2ICs2MDMsMTAgQEAKICNkZWZpbmUgVEJfU0VUTUFYVEVYVFJPV1MgICAgICAgIChXTV9VU0VSKzYwKQogI2RlZmluZSBUQl9HRVRURVhUUk9XUyAgICAgICAgICAgKFdNX1VTRVIrNjEpCiAKKyNkZWZpbmUgVEJfTUFQQUNDRUxFUkFUT1IzMkEgICAgIChXTV9VU0VSKzc4KQorI2RlZmluZSBUQl9NQVBBQ0NFTEVSQVRPUjMyVyAgICAgKFdNX1VTRVIrOTApCisjZGVmaW5lIFRCX01BUEFDQ0VMRVJBVE9SIFdJTkVMSUJfTkFNRV9BVyhUQl9NQVBBQ0NFTEVSQVRPUikKKwogCiAvKiBUaGlzIGlzIGp1c3QgZm9yIG9sZCBDcmVhdGVUb29sYmFyLiAqLwogLyogRG9uJ3QgdXNlIGl0IGluIG5ldyBwcm9ncmFtcy4gKi8KQEAgLTYzMywxOCArNjQ2LDEyIEBACiAjZGVmaW5lIEhJTlNUX0NPTU1DVFJMICAgICAgICAgKChISU5TVEFOQ0UzMiktMSkKIAogCi1IV05EMzIgV0lOQVBJCi1DcmVhdGVUb29sYmFyKEhXTkQzMiwgRFdPUkQsIFVJTlQzMiwgSU5UMzIsIEhJTlNUQU5DRTMyLAotICAgICAgICAgICAgICBVSU5UMzIsIExQQ09MRFRCQlVUVE9OLCBJTlQzMik7IAotIAotSFdORDMyIFdJTkFQSQotQ3JlYXRlVG9vbGJhckV4KEhXTkQzMiwgRFdPUkQsIFVJTlQzMiwgSU5UMzIsCi0gICAgICAgICAgICAgICAgSElOU1RBTkNFMzIsIFVJTlQzMiwgTFBDVEJCVVRUT04sIAotICAgICAgICAgICAgICAgIElOVDMyLCBJTlQzMiwgSU5UMzIsIElOVDMyLCBJTlQzMiwgVUlOVDMyKTsgCi0KLUhCSVRNQVAzMiBXSU5BUEkKLUNyZWF0ZU1hcHBlZEJpdG1hcCAoSElOU1RBTkNFMzIsIElOVDMyLCBVSU5UMzIsIExQQ09MT1JNQVAsIElOVDMyKTsgCi0KLQorSFdORDMyIFdJTkFQSSBDcmVhdGVUb29sYmFyKEhXTkQzMiwgRFdPUkQsIFVJTlQzMiwgSU5UMzIsIEhJTlNUQU5DRTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiwgTFBDT0xEVEJCVVRUT04sIElOVDMyKTsKK0hXTkQzMiBXSU5BUEkgQ3JlYXRlVG9vbGJhckV4KEhXTkQzMiwgRFdPUkQsIFVJTlQzMiwgSU5UMzIsIEhJTlNUQU5DRTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyLCBMUENUQkJVVFRPTiwgSU5UMzIsIElOVDMyLCBJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyLCBJTlQzMiwgVUlOVDMyKTsKK0hCSVRNQVAzMiBXSU5BUEkgQ3JlYXRlTWFwcGVkQml0bWFwIChISU5TVEFOQ0UzMiwgSU5UMzIsIFVJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENPTE9STUFQLCBJTlQzMik7CiAKICNlbmRpZiAgLyogX19XSU5FX0NPTU1DVFJMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tbWRsZy5oIGIvaW5jbHVkZS9jb21tZGxnLmgKaW5kZXggYTU0NDk5ZC4uMWJmNWQyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21tZGxnLmgKKysrIGIvaW5jbHVkZS9jb21tZGxnLmgKQEAgLTQ4NSw2ICs0ODUsNzYgQEAKICNkZWZpbmUgQ0RFUlJfTk9IT09LICAgICAgICAgICAweDAwMEIKICNkZWZpbmUgQ0RFUlJfUkVHSVNURVJNU0dGQUlMICAweDAwMEMKIAorLyogUGFnZVNldHVwRGxnIHN0dWZmIC4uLiAqLworI2RlZmluZSBXTV9QU0RfUEFHRVNFVFVQRExHCShXTV9VU0VSICApCisjZGVmaW5lIFdNX1BTRF9GVUxMUEFHRVJFQ1QJKFdNX1VTRVIrMSkKKyNkZWZpbmUgV01fUFNEX01JTk1BUkdJTlJFQ1QJKFdNX1VTRVIrMikKKyNkZWZpbmUgV01fUFNEX01BUkdJTlJFQ1QJKFdNX1VTRVIrMykKKyNkZWZpbmUgV01fUFNEX0dSRUVLVEVYVFJFQ1QJKFdNX1VTRVIrNCkKKyNkZWZpbmUgV01fUFNEX0VOVlNUQU1QUkVDVAkoV01fVVNFUis1KQorI2RlZmluZSBXTV9QU0RfWUFGVUxMUEFHRVJFQ1QJKFdNX1VTRVIrNikKKwordHlwZWRlZiBVSU5UMzIgKENBTExCQUNLKiBMUFBBR0VQQUlOVEhPT0spKCBIV05EMzIsIFVJTlQzMiwgV1BBUkFNMzIsIExQQVJBTSApOwordHlwZWRlZiBVSU5UMzIgKENBTExCQUNLKiBMUFBBR0VTRVRVUEhPT0spKCBIV05EMzIsIFVJTlQzMiwgV1BBUkFNMzIsIExQQVJBTSApOworCit0eXBlZGVmIHN0cnVjdCB0YWdQU0QzMkEKK3sKKwlEV09SRAkJbFN0cnVjdFNpemU7CisJSFdORDMyCQlod25kT3duZXI7CisJSEdMT0JBTDMyCWhEZXZNb2RlOworCUhHTE9CQUwzMgloRGV2TmFtZXM7CisJRFdPUkQJCUZsYWdzOworCVBPSU5UMzIJCXB0UGFwZXJTaXplOworCVJFQ1QzMgkJcnRNaW5NYXJnaW47CisJUkVDVDMyCQlydE1hcmdpbjsKKwlISU5TVEFOQ0UzMgloSW5zdGFuY2U7CisJTFBBUkFNCQlsQ3VzdERhdGE7CisJTFBQQUdFU0VUVVBIT09LCWxwZm5QYWdlU2V0dXBIb29rOworCUxQUEFHRVBBSU5USE9PSwlscGZuUGFnZVBhaW50SG9vazsKKwlMUENTVFIJCWxwUGFnZVNldHVwVGVtcGxhdGVOYW1lOworCUhHTE9CQUwzMgloUGFnZVNldHVwVGVtcGxhdGU7Cit9IFBBR0VTRVRVUERMRzMyQSwqTFBQQUdFU0VUVVBETEczMkE7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1BTRDMyVworeworCURXT1JECQlsU3RydWN0U2l6ZTsKKwlIV05EMzIJCWh3bmRPd25lcjsKKwlIR0xPQkFMMzIJaERldk1vZGU7CisJSEdMT0JBTDMyCWhEZXZOYW1lczsKKwlEV09SRAkJRmxhZ3M7CisJUE9JTlQzMgkJcHRQYXBlclNpemU7CisJUkVDVDMyCQlydE1pbk1hcmdpbjsKKwlSRUNUMzIJCXJ0TWFyZ2luOworCUhJTlNUQU5DRTMyCWhJbnN0YW5jZTsKKwlMUEFSQU0JCWxDdXN0RGF0YTsKKwlMUFBBR0VTRVRVUEhPT0sJbHBmblBhZ2VTZXR1cEhvb2s7CisJTFBQQUdFUEFJTlRIT09LCWxwZm5QYWdlUGFpbnRIb29rOworCUxQQ1dTVFIJCWxwUGFnZVNldHVwVGVtcGxhdGVOYW1lOworCUhHTE9CQUwzMgloUGFnZVNldHVwVGVtcGxhdGU7Cit9IFBBR0VTRVRVUERMRzMyVywqTFBQQUdFU0VUVVBETEczMlc7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhQQUdFU0VUVVBETEcpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUFBBR0VTRVRVUERMRykKKworI2RlZmluZSBQU0RfREVGQVVMVE1JTk1BUkdJTlMgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQU0RfSU5XSU5JTklJTlRMTUVBU1VSRSAgICAgICAgICAgMHgwMDAwMDAwMAorCisjZGVmaW5lIFBTRF9NSU5NQVJHSU5TICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFBTRF9NQVJHSU5TICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFBTRF9JTlRIT1VTQU5EVEhTT0ZJTkNIRVMgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFBTRF9JTkhVTkRSRURUSFNPRk1JTExJTUVURVJTICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFBTRF9ESVNBQkxFTUFSR0lOUyAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFBTRF9ESVNBQkxFUFJJTlRFUiAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFBTRF9OT1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFBTRF9ESVNBQkxFT1JJRU5UQVRJT04gICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFBTRF9SRVRVUk5ERUZBVUxUICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBTRF9ESVNBQkxFUEFQRVIgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFBTRF9TSE9XSEVMUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBTRF9FTkFCTEVQQUdFU0VUVVBIT09LICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFBTRF9FTkFCTEVQQUdFU0VUVVBURU1QTEFURSAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFBTRF9FTkFCTEVQQUdFU0VUVVBURU1QTEFURUhBTkRMRSAweDAwMDIwMDAwCisjZGVmaW5lIFBTRF9FTkFCTEVQQUdFUEFJTlRIT09LICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIFBTRF9ESVNBQkxFUEFHRVBBSU5USU5HICAgICAgICAgICAweDAwMDgwMDAwCisKIEJPT0wxNiAgV0lOQVBJIENob29zZUNvbG9yMTYoTFBDSE9PU0VDT0xPUjE2IGxwQ2hDb2wpOwogQk9PTDMyICBXSU5BUEkgQ2hvb3NlQ29sb3IzMkEoTFBDSE9PU0VDT0xPUjMyQSBscENoQ29sKTsKIEJPT0wzMiAgV0lOQVBJIENob29zZUNvbG9yMzJXKExQQ0hPT1NFQ09MT1IzMlcgbHBDaENvbCk7CkBAIC01MDYsNiArNTc2LDkgQEAKIEJPT0wzMiAgV0lOQVBJIEdldFNhdmVGaWxlTmFtZTMyQShMUE9QRU5GSUxFTkFNRTMyQSBvZm4pOwogQk9PTDMyICBXSU5BUEkgR2V0U2F2ZUZpbGVOYW1lMzJXKExQT1BFTkZJTEVOQU1FMzJXIG9mbik7CiAjZGVmaW5lIEdldFNhdmVGaWxlTmFtZSBXSU5FTElCX05BTUVfQVcoR2V0U2F2ZUZpbGVOYW1lKQorQk9PTDMyIFdJTkFQSSBQYWdlU2V0dXBEbGczMkEoIExQUEFHRVNFVFVQRExHMzJBICk7CitCT09MMzIgV0lOQVBJIFBhZ2VTZXR1cERsZzMyVyggTFBQQUdFU0VUVVBETEczMlcgKTsKKyNkZWZpbmUgUGFnZVNldHVwRGxnIFdJTkVMSUJfTkFNRV9BVyhQYWdlU2V0dXBEbGcpCiBCT09MMTYgIFdJTkFQSSBQcmludERsZyggU0VHUFRSIHByaW50KTsKIEhXTkQxNiAgV0lOQVBJIFJlcGxhY2VUZXh0MTYoIFNFR1BUUiBmaW5kKTsKIEhXTkQzMiAgV0lOQVBJIFJlcGxhY2VUZXh0MzJBKCBMUEZJTkRSRVBMQUNFMzJBIGxwRmluZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZy5oLmluIGIvaW5jbHVkZS9jb25maWcuaC5pbgppbmRleCA2YTdhNGMxLi5lNTdhNzhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZy5oLmluCisrKyBiL2luY2x1ZGUvY29uZmlnLmguaW4KQEAgLTMzLDYgKzMzLDEyIEBACiAvKiBEZWZpbmUgaWYgWCBsaWJyYXJpZXMgYXJlIG5vdCByZWVudHJhbnQgKGNvbXBpbGVkIHdpdGhvdXQgLURfUkVFTlRSQU5UKS4gICovCiAjdW5kZWYgTk9fUkVFTlRSQU5UX1gxMQogCisvKiBEZWZpbmUgaWYgYWxsIGRlYnVnIG1lc3NhZ2VzIGFyZSB0byBiZSBjb21waWxlZCBvdXQgKi8KKyN1bmRlZiBOT19ERUJVR19NU0dTCisKKy8qIERlZmluZSBpZiBUUkFDRSBtZXNzYWdlcyBhcmUgdG8gYmUgY29tcGlsZWQgb3V0ICovCisjdW5kZWYgTk9fVFJBQ0VfTVNHUworCiAvKiBEZWZpbmUgaWYgdGhlIHN0cnVjdCBzdGF0ZnMgaGFzIHRoZSBtZW1iZXIgYmF2YWlsICovCiAjdW5kZWYgU1RBVEZTX0hBU19CQVZBSUwKIApAQCAtOTYsMTIgKzEwMiwxOCBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfTUFDSElORV9TT1VORENBUkRfSAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvY2Rpby5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9TWVNfQ0RJT19ICiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxpby5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9TWVNfRklMSU9fSAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW9kZW0uaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX01PREVNX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL21vdW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX1NZU19NT1VOVF9ICiAKQEAgLTExNCw2ICsxMjYsOSBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXRmcy5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9TWVNfU1RBVEZTX0gKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0cnRpby5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfU1RSVElPX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N5c2NhbGwuaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfU1lTX1NZU0NBTExfSAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnLmggYi9pbmNsdWRlL2RlYnVnLmgKaW5kZXggM2QxNzAyYS4uZmY0YjUwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZGVidWcuaApAQCAtOTQsMzMgKzk0LDM0IEBACiAjZGVmaW5lIGRiY2hfc2VuZG1zZyA4NgogI2RlZmluZSBkYmNoX3NoZWxsIDg3CiAjZGVmaW5lIGRiY2hfc2htIDg4Ci0jZGVmaW5lIGRiY2hfc291bmQgODkKLSNkZWZpbmUgZGJjaF9zdGF0aWMgOTAKLSNkZWZpbmUgZGJjaF9zdHJlc3MgOTEKLSNkZWZpbmUgZGJjaF9zdHJpbmcgOTIKLSNkZWZpbmUgZGJjaF9zeXNjb2xvciA5MwotI2RlZmluZSBkYmNoX3N5c3RlbSA5NAotI2RlZmluZSBkYmNoX3Rhc2sgOTUKLSNkZWZpbmUgZGJjaF90ZXh0IDk2Ci0jZGVmaW5lIGRiY2hfdGhyZWFkIDk3Ci0jZGVmaW5lIGRiY2hfdGh1bmsgOTgKLSNkZWZpbmUgZGJjaF90aW1lciA5OQotI2RlZmluZSBkYmNoX3Rvb2xiYXIgMTAwCi0jZGVmaW5lIGRiY2hfdG9vbGhlbHAgMTAxCi0jZGVmaW5lIGRiY2hfdHdlYWsgMTAyCi0jZGVmaW5lIGRiY2hfdWl0b29scyAxMDMKLSNkZWZpbmUgZGJjaF91cGRvd24gMTA0Ci0jZGVmaW5lIGRiY2hfdmVyIDEwNQotI2RlZmluZSBkYmNoX3ZpcnR1YWwgMTA2Ci0jZGVmaW5lIGRiY2hfdnhkIDEwNwotI2RlZmluZSBkYmNoX3dpbiAxMDgKLSNkZWZpbmUgZGJjaF93aW4xNmRydiAxMDkKLSNkZWZpbmUgZGJjaF93aW4zMiAxMTAKLSNkZWZpbmUgZGJjaF93aW5nIDExMQotI2RlZmluZSBkYmNoX3dpbnNvY2sgMTEyCi0jZGVmaW5lIGRiY2hfd25ldCAxMTMKLSNkZWZpbmUgZGJjaF94MTEgMTE0Ci0jZGVmaW5lIGRiY2hfeDExZHJ2IDExNQorI2RlZmluZSBkYmNoX3Nub29wIDg5CisjZGVmaW5lIGRiY2hfc291bmQgOTAKKyNkZWZpbmUgZGJjaF9zdGF0aWMgOTEKKyNkZWZpbmUgZGJjaF9zdHJlc3MgOTIKKyNkZWZpbmUgZGJjaF9zdHJpbmcgOTMKKyNkZWZpbmUgZGJjaF9zeXNjb2xvciA5NAorI2RlZmluZSBkYmNoX3N5c3RlbSA5NQorI2RlZmluZSBkYmNoX3Rhc2sgOTYKKyNkZWZpbmUgZGJjaF90ZXh0IDk3CisjZGVmaW5lIGRiY2hfdGhyZWFkIDk4CisjZGVmaW5lIGRiY2hfdGh1bmsgOTkKKyNkZWZpbmUgZGJjaF90aW1lciAxMDAKKyNkZWZpbmUgZGJjaF90b29sYmFyIDEwMQorI2RlZmluZSBkYmNoX3Rvb2xoZWxwIDEwMgorI2RlZmluZSBkYmNoX3R3ZWFrIDEwMworI2RlZmluZSBkYmNoX3VpdG9vbHMgMTA0CisjZGVmaW5lIGRiY2hfdXBkb3duIDEwNQorI2RlZmluZSBkYmNoX3ZlciAxMDYKKyNkZWZpbmUgZGJjaF92aXJ0dWFsIDEwNworI2RlZmluZSBkYmNoX3Z4ZCAxMDgKKyNkZWZpbmUgZGJjaF93aW4gMTA5CisjZGVmaW5lIGRiY2hfd2luMTZkcnYgMTEwCisjZGVmaW5lIGRiY2hfd2luMzIgMTExCisjZGVmaW5lIGRiY2hfd2luZyAxMTIKKyNkZWZpbmUgZGJjaF93aW5zb2NrIDExMworI2RlZmluZSBkYmNoX3duZXQgMTE0CisjZGVmaW5lIGRiY2hfeDExIDExNQorI2RlZmluZSBkYmNoX3gxMWRydiAxMTYKIC8qIERlZmluaXRpb25zIGZvciBjbGFzc2VzIGlkZW50aWZpZXJzICovCiAjZGVmaW5lIGRiY2xfZml4bWUgMAogI2RlZmluZSBkYmNsX2VyciAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnZGVmcy5oIGIvaW5jbHVkZS9kZWJ1Z2RlZnMuaAppbmRleCA5NjcwNGM4Li42YWFlNDlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RlYnVnZGVmcy5oCisrKyBiL2luY2x1ZGUvZGVidWdkZWZzLmgKQEAgLTQsNyArNCw3IEBACiAjaW5jbHVkZSAiZGVidWd0b29scy5oIgogI2VuZGlmCiAKLSNkZWZpbmUgREVCVUdfQ0hBTk5FTF9DT1VOVCAxMTYKKyNkZWZpbmUgREVCVUdfQ0hBTk5FTF9DT1VOVCAxMTcKICNpZmRlZiBERUJVR19SVU5USU1FCiBzaG9ydCBkZWJ1Z19tc2dfZW5hYmxlZFtdW0RFQlVHX0NMQVNTX0NPVU5UXSA9IHsKIHsxLCAxLCAwLCAwfSwKQEAgLTEyMyw2ICsxMjMsNyBAQAogezEsIDEsIDAsIDB9LAogezEsIDEsIDAsIDB9LAogezEsIDEsIDAsIDB9LAorezEsIDEsIDAsIDB9LAogfTsKIGNvbnN0IGNoYXIqIGRlYnVnX2NoX25hbWVbXSA9IHsKICJhY2NlbCIsCkBAIC0yMTQsNiArMjE1LDcgQEAKICJzZW5kbXNnIiwKICJzaGVsbCIsCiAic2htIiwKKyJzbm9vcCIsCiAic291bmQiLAogInN0YXRpYyIsCiAic3RyZXNzIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWd0b29scy5oIGIvaW5jbHVkZS9kZWJ1Z3Rvb2xzLmgKaW5kZXggYjZiNTBkOC4uNDBmY2IxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Z3Rvb2xzLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z3Rvb2xzLmgKQEAgLTUsNiArNSw3IEBACiAjaWZkZWYgX19XSU5FX18gIC8qIERlYnVnZ2luZyBpbnRlcmZhY2UgaXMgaW50ZXJuYWwgdG8gV2luZSAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJkZWJ1Z3N0ci5oIgogCiAjZGVmaW5lIERFQlVHX1JVTlRJTUUKQEAgLTM5LDE4ICs0MCw0NCBAQAogICBpZighREVCVUdHSU5HKGNsLCBjaCkpIDsgXAogICBlbHNlIERQUklOVEYoIyBjbCAiOiIgIyBjaCAiOiVzICIgZm9ybWF0LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQogCisvKiB1c2UgY29uZmlndXJlIHRvIGFsbG93IHVzZXIgdG8gY29tcGlsZSBvdXQgZGVidWdnaW5nIG1lc3NhZ2VzICovCisKKyNpZm5kZWYgTk9fVFJBQ0VfTVNHUwogI2RlZmluZSBUUkFDRShjaCwgZm10LCBhcmdzLi4uKSBEUFJJTlRGXyh0cmFjZSwgY2gsIGZtdCwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFRSQUNFKGNoLCBmbXQsIGFyZ3MuLi4pCisjZW5kaWYgLyogTk9fVFJBQ0VfTVNHUyAqLworCisjaWZuZGVmIE5PX0RFQlVHX01TR1MKICNkZWZpbmUgV0FSTihjaCwgZm10LCBhcmdzLi4uKSAgRFBSSU5URl8od2FybiwgIGNoLCBmbXQsICMjIGFyZ3MpCiAjZGVmaW5lIEZJWE1FKGNoLCBmbXQsIGFyZ3MuLi4pIERQUklOVEZfKGZpeG1lLCBjaCwgZm10LCAjIyBhcmdzKQotI2RlZmluZSBFUlIoY2gsIGZtdCwgYXJncy4uLikgICBEUFJJTlRGXyhlcnIsIGNoLCBmbXQsICMjIGFyZ3MpCi0KICNkZWZpbmUgRFVNUChmb3JtYXQsIGFyZ3MuLi4pICAgRFBSSU5URihmb3JtYXQsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBXQVJOKGNoLCBmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIEZJWE1FKGNoLCBmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIERVTVAoZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmIC8qIE5PX0RFQlVHX01TR1MgKi8KKworLyogZGVmaW5lIGVycm9yIG1hY3JvIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBpcyBjb25maWd1cmVkICovCisjZGVmaW5lIEVSUihjaCwgZm10LCBhcmdzLi4uKSAgIERQUklOVEZfKGVyciwgY2gsIGZtdCwgIyMgYXJncykKICNkZWZpbmUgTVNHKGZvcm1hdCwgYXJncy4uLikgICAgZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgIyMgYXJncykKIAotI2RlZmluZSBGSVhNRV9PTihjaCkgIERFQlVHR0lORyhmaXhtZSwgY2gpCi0jZGVmaW5lIEVSUl9PTihjaCkgICAgREVCVUdHSU5HKGVyciwgY2gpCi0jZGVmaW5lIFdBUk5fT04oY2gpICAgREVCVUdHSU5HKHdhcm4sIGNoKQorLyogaWYgdGhlIGRlYnVnIG1lc3NhZ2UgaXMgY29tcGlsZWQgb3V0LCBtYWtlIHRoZXNlIHJldHVybiBmYWxzZSAqLworI2lmbmRlZiBOT19UUkFDRV9NU0dTCiAjZGVmaW5lIFRSQUNFX09OKGNoKSAgREVCVUdHSU5HKHRyYWNlLCBjaCkKKyNlbHNlCisjZGVmaW5lIFRSQUNFX09OKGNoKSAwCisjZW5kaWYgLyogTk9fVFJBQ0VfTVNHUyAqLworCisjaWZuZGVmIE5PX0RFQlVHX01TR1MKKyNkZWZpbmUgV0FSTl9PTihjaCkgICBERUJVR0dJTkcod2FybiwgY2gpCisjZGVmaW5lIEZJWE1FX09OKGNoKSAgREVCVUdHSU5HKGZpeG1lLCBjaCkKKyNlbHNlCisjZGVmaW5lIFdBUk5fT04oY2gpIDAKKyNkZWZpbmUgRklYTUVfT04oY2gpIDAKKyNlbmRpZiAvKiBOT19ERUJVR19NU0dTICovCisKKyNkZWZpbmUgRVJSX09OKGNoKSAgICBERUJVR0dJTkcoZXJyLCBjaCkKIAogI2VuZGlmICAvKiBfX1dJTkVfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RldmljZS5oIGIvaW5jbHVkZS9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2E4OGZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kZXZpY2UuaApAQCAtMCwwICsxLDQgQEAKKyNpZm5kZWYgX19XSU5FX0RFVklDRV9ICisjZGVmaW5lIF9fV0lORV9ERVZJQ0VfSAorZXh0ZXJuIEhBTkRMRTMyIERFVklDRV9PcGVuKCBMUENTVFIgbmFtZSwgRFdPUkQgZmxhZ3MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RyaXZlci5oIGIvaW5jbHVkZS9kcml2ZXIuaAppbmRleCA1NGZlZDEyLi5mNDBjMjljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RyaXZlci5oCisrKyBiL2luY2x1ZGUvZHJpdmVyLmgKQEAgLTM0LDEyICszNCwxNiBAQAogI2RlZmluZSBHTkRfRk9SV0FSRCAgCQkJMHgwMDAwMDAwMAogI2RlZmluZSBHTkRfUkVWRVJTRSAgICAJCQkweDAwMDAwMDAyCiAKKy8qIEZJWE1FOiB1bnVzZWQ/ICovCiB0eXBlZGVmIHN0cnVjdCB7CiAJRFdPUkQgICBkd0RDSVNpemU7CiAJTFBDU1RSICBscHN6RENJU2VjdGlvbk5hbWU7CiAJTFBDU1RSICBscHN6RENJQWxpYXNOYW1lOwotfSBEUlZDT05GSUdJTkZPLCAqTFBEUlZDT05GSUdJTkZPOworfSB4RFJWQ09ORklHSU5GTywgKnhMUERSVkNPTkZJR0lORk87CiAKKy8qIEdldERyaXZlckluZm8xNiByZWZlcmVuY2VzIHRoaXMgc3RydWN0dXJlLCBzbyB0aGlzIGEgc3RydWN0IGRlZmluZWQKKyAqIGluIHRoZSBXaW4xNiBBUEkuCisgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgVUlOVDE2ICAgICAgIGxlbmd0aDsKQEAgLTQ4LDYgKzUyLDcgQEAKICAgICBDSEFSICAgICAgICAgc3pBbGlhc05hbWVbMTI4XTsKIH0gRFJJVkVSSU5GT1NUUlVDVDE2LCAqTFBEUklWRVJJTkZPU1RSVUNUMTY7CiAKKy8qIEZJWE1FOiBJcyB0aGlzIGEgV0lORSBpbnRlcm5hbCBzdHJ1Y3Q/ICovCiB0eXBlZGVmIHN0cnVjdCB0YWdEUklWRVJJVEVNCiB7CiAgICAgRFJJVkVSSU5GT1NUUlVDVDE2ICAgIGRpczsKQEAgLTU3LDE0ICs2Miw0NSBAQAogICAgIERSSVZFUlBST0MxNiAgICAgICAgICBscERydlByb2M7CiB9IERSSVZFUklURU0sICpMUERSSVZFUklURU07CiAKKy8qIGludGVybmFsICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQzMglsZW5ndGg7CisgICAgSERSVlIzMgloRHJpdmVyOworICAgIEhNT0RVTEUzMgloTW9kdWxlOworICAgIENIQVIJc3pBbGlhc05hbWVbMTI4XTsKK30gRFJJVkVSSU5GT1NUUlVDVDMyQSwgKkxQRFJJVkVSSU5GT1NUUlVDVDMyQTsKKworLyogaW50ZXJuYWwgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0RSSVZFUklURU0zMkEgeworCURSSVZFUklORk9TVFJVQ1QzMkEJZGlzOworCURXT1JECQkJY291bnQ7CisJc3RydWN0IHRhZ0RSSVZFUklURU0zMkEJKm5leHQ7CisJRFJJVkVSUFJPQzMyCQlkcml2ZXJwcm9jOworfSBEUklWRVJJVEVNMzJBLCpMUERSSVZFUklURU0zMkE7CisKIExSRVNVTFQgV0lOQVBJIERlZkRyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIxNiBoRHJpdiwgVUlOVDE2IHdNc2csIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gZHdQYXJhbTEsIExQQVJBTSBkd1BhcmFtMik7Ci1IRFJWUjE2IFdJTkFQSSBPcGVuRHJpdmVyKExQU1RSIHN6RHJpdmVyTmFtZSwgTFBTVFIgc3pTZWN0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbTIpOwotTFJFU1VMVCBXSU5BUEkgQ2xvc2VEcml2ZXIoSERSVlIxNiBoRHJpdmVyLCBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpOwotTFJFU1VMVCBXSU5BUEkgU2VuZERyaXZlck1lc3NhZ2UoIEhEUlZSMTYgaERyaXZlciwgVUlOVDE2IG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yICk7Ci1ITU9EVUxFMTYgV0lOQVBJIEdldERyaXZlck1vZHVsZUhhbmRsZShIRFJWUjE2IGhEcml2ZXIpOworSERSVlIxNiBXSU5BUEkgT3BlbkRyaXZlcjE2KExQQ1NUUiBzekRyaXZlck5hbWUsIExQQ1NUUiBzelNlY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0yKTsKK0hEUlZSMzIgV0lOQVBJIE9wZW5Ecml2ZXIzMkEoTFBDU1RSIHN6RHJpdmVyTmFtZSwgTFBDU1RSIHN6U2VjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0yKTsKK0hEUlZSMzIgV0lOQVBJIE9wZW5Ecml2ZXIzMlcoTFBDV1NUUiBzekRyaXZlck5hbWUsIExQQ1dTVFIgc3pTZWN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbTIpOworI2RlZmluZSBPcGVuRHJpdmVyIFdJTkVMSUJfTkFNRV9BVyhPcGVuRHJpdmVyKQorTFJFU1VMVCBXSU5BUEkgQ2xvc2VEcml2ZXIxNihIRFJWUjE2IGhEcml2ZXIsIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMik7CitMUkVTVUxUIFdJTkFQSSBDbG9zZURyaXZlcjMyKEhEUlZSMzIgaERyaXZlciwgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKTsKKyNkZWZpbmUgQ2xvc2VEcml2ZXIgV0lORUxJQl9OQU1FKENsb3NlRHJpdmVyKQorTFJFU1VMVCBXSU5BUEkgU2VuZERyaXZlck1lc3NhZ2UxNiggSERSVlIxNiBoRHJpdmVyLCBVSU5UMTYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMiApOworTFJFU1VMVCBXSU5BUEkgU2VuZERyaXZlck1lc3NhZ2UzMiggSERSVlIzMiBoRHJpdmVyLCBVSU5UMzIgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMiApOworI2RlZmluZSBTZW5kRHJpdmVyTWVzc2FnZSBXSU5FTElCX05BTUUoU2VuZERyaXZlck1lc3NhZ2UpCitITU9EVUxFMTYgV0lOQVBJIEdldERyaXZlck1vZHVsZUhhbmRsZTE2KEhEUlZSMTYgaERyaXZlcik7CitITU9EVUxFMzIgV0lOQVBJIEdldERyaXZlck1vZHVsZUhhbmRsZTMyKEhEUlZSMzIgaERyaXZlcik7CisjZGVmaW5lIEdldERyaXZlck1vZHVsZUhhbmRsZSBXSU5FTElCX05BTUUoR2V0RHJpdmVyTW9kdWxlSGFuZGxlKQorCisvKiBvbmx5IHdpbjMxIHZlcnNpb24gZm9yIHRob3NlIGJlbG93ID8gKi8KIEhEUlZSMTYgV0lOQVBJIEdldE5leHREcml2ZXIoSERSVlIxNiwgRFdPUkQpOwogQk9PTDE2IFdJTkFQSSBHZXREcml2ZXJJbmZvKEhEUlZSMTYsIERSSVZFUklORk9TVFJVQ1QxNiAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9maWxlLmggYi9pbmNsdWRlL2ZpbGUuaAppbmRleCA3YmEwYzBiLi45YzJhYmVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZpbGUuaAorKysgYi9pbmNsdWRlL2ZpbGUuaApAQCAtMzUsNiArMzUsOCBAQAogCiAKIC8qIGZpbGVzL2ZpbGUuYyAqLworZXh0ZXJuIEZJTEVfT0JKRUNUICpGSUxFX0dldEZpbGUoIEhGSUxFMzIgaGFuZGxlICk7CitleHRlcm4gSEZJTEUzMiBGSUxFX0FsbG9jKCBGSUxFX09CSkVDVCAqKmZpbGUgKTsKIGV4dGVybiB2b2lkIEZJTEVfU2V0RG9zRXJyb3Iodm9pZCk7CiBleHRlcm4gSEZJTEUzMiBGSUxFX0R1cFVuaXhIYW5kbGUoIGludCBmZCApOwogZXh0ZXJuIEJPT0wzMiBGSUxFX1N0YXQoIExQQ1NUUiB1bml4TmFtZSwgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gKmluZm8gKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2RpLmggYi9pbmNsdWRlL2dkaS5oCmluZGV4IGFlNDBiZDEuLjcyM2FhMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ2RpLmgKKysrIGIvaW5jbHVkZS9nZGkuaApAQCAtMTMwLDYgKzEzMCw3IEBACiAgICAgSU5UMzIgICAgICAgICBHcmFwaGljc01vZGU7ICAgICAgLyogR3JhcGhpY3MgbW9kZSAqLwogICAgIElOVDMyICAgICAgICAgRENPcmdYOyAgICAgICAgICAgIC8qIERDIG9yaWdpbiAqLwogICAgIElOVDMyICAgICAgICAgRENPcmdZOworICAgIEZBUlBST0MxNiAgICAgbHBmblByaW50OyAgICAgICAgIC8qIEFib3J0UHJvYyBmb3IgUHJpbnRpbmcgKi8KICAgICBJTlQzMiAgICAgICAgIEN1cnNQb3NYOyAgICAgICAgICAvKiBDdXJyZW50IHBvc2l0aW9uICovCiAgICAgSU5UMzIgICAgICAgICBDdXJzUG9zWTsKICAgICBJTlQzMiAgICAgICAgIEFyY0RpcmVjdGlvbjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2xvYmFsLmggYi9pbmNsdWRlL2dsb2JhbC5oCmluZGV4IDVjOGNjOWIuLjU2YmU2NWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ2xvYmFsLmgKKysrIGIvaW5jbHVkZS9nbG9iYWwuaApAQCAtMjUsNyArMjUsOCBAQAogZXh0ZXJuIEhHTE9CQUwxNiBHTE9CQUxfQWxsb2MoIFdPUkQgZmxhZ3MsIERXT1JEIHNpemUsIEhHTE9CQUwxNiBoT3duZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDE2IGlzQ29kZSwgQk9PTDE2IGlzMzJCaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDE2IGlzUmVhZE9ubHkgKTsKLWV4dGVybiBXT1JEIEdsb2JhbEhhbmRsZVRvU2VsKCBIR0xPQkFMMTYgaGFuZGxlICk7CisKK2V4dGVybiBXT1JEIFdJTkFQSSBHbG9iYWxIYW5kbGVUb1NlbCggSEdMT0JBTDE2IGhhbmRsZSApOwogCiAvKiBtZW1vcnkvdmlydHVhbC5jICovCiBleHRlcm4gQk9PTDMyIFZJUlRVQUxfSW5pdCggdm9pZCApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9taXNjZW11LmggYi9pbmNsdWRlL21pc2NlbXUuaAppbmRleCAzZDU4YTZjLi40NmYyMzJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21pc2NlbXUuaAorKysgYi9pbmNsdWRlL21pc2NlbXUuaApAQCAtNDMsNiArNDMsOSBAQAogLyogaWYxNjMyL3NpZ25hbC5jICovCiBleHRlcm4gQk9PTDMyIFNJR05BTF9Jbml0RW11bGF0b3Iodm9pZCk7CiAKKy8qIG1pc2MvYXNwaS5jICovCitleHRlcm4gdm9pZCBBU1BJX0RPU19IYW5kbGVJbnQoQ09OVEVYVCAqY29udGV4dCk7CisKICNkZWZpbmUgSU5UX0JBUkYoY29udGV4dCxudW0pIFwKICAgICBmcHJpbnRmKCBzdGRlcnIsICJpbnQleDogdW5rbm93bi9ub3QgaW1wbGVtZW50ZWQgcGFyYW1ldGVyczpcbiIgXAogICAgICAgICAgICAgICAgICAgICAgImludCV4OiBBWCAlMDR4LCBCWCAlMDR4LCBDWCAlMDR4LCBEWCAlMDR4LCAiIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW1zeXN0ZW0uaCBiL2luY2x1ZGUvbW1zeXN0ZW0uaAppbmRleCBjMjAxMWJmLi41MDJmYjM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21tc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9tbXN5c3RlbS5oCkBAIC0xNTgwLDU0ICsxNTgwLDY0IEBACiBMUE1NSU9QUk9DMzIgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jMzJXKEZPVVJDQyxMUE1NSU9QUk9DMzIsRFdPUkQpOwogI2RlZmluZSAgICAgIG1taW9JbnN0YWxsSU9Qcm8gV0lORUxJQl9OQU1FX0FXKG1taW9JbnN0YWxsSU9Qcm9jKQogCi1GT1VSQ0MgV0lOQVBJIG1taW9TdHJpbmdUb0ZPVVJDQzE2KExQQ1NUUiBzeiwgVUlOVDE2IHVGbGFncyk7Ci1GT1VSQ0MgV0lOQVBJIG1taW9TdHJpbmdUb0ZPVVJDQzMyQShMUENTVFIgc3osIFVJTlQzMiB1RmxhZ3MpOwotRk9VUkNDIFdJTkFQSSBtbWlvU3RyaW5nVG9GT1VSQ0MzMlcoTFBDV1NUUiBzeiwgVUlOVDMyIHVGbGFncyk7CitGT1VSQ0MgV0lOQVBJCW1taW9TdHJpbmdUb0ZPVVJDQzE2KExQQ1NUUixVSU5UMTYpOworRk9VUkNDIFdJTkFQSQltbWlvU3RyaW5nVG9GT1VSQ0MzMkEoTFBDU1RSLFVJTlQzMik7CitGT1VSQ0MgV0lOQVBJCW1taW9TdHJpbmdUb0ZPVVJDQzMyVyhMUENXU1RSLFVJTlQzMik7CiAjZGVmaW5lIG1taW9TdHJpbmdUb0ZPVVJDQyBXSU5FTElCX05BTUVfQVcobW1pb1N0cmluZ1RvRk9VUkNDKQotSE1NSU8xNiBXSU5BUEkgbW1pb09wZW4xNihMUFNUUiBzekZpbGVOYW1lLCBNTUlPSU5GTzE2ICogbHBtbWlvaW5mbywgRFdPUkQgZHdPcGVuRmxhZ3MpOwotSE1NSU8zMiBXSU5BUEkgbW1pb09wZW4zMkEoTFBTVFIgc3pGaWxlTmFtZSwgTU1JT0lORk8zMiAqIGxwbW1pb2luZm8sIERXT1JEIGR3T3BlbkZsYWdzKTsKLUhNTUlPMzIgV0lOQVBJIG1taW9PcGVuMzJXKExQV1NUUiBzekZpbGVOYW1lLCBNTUlPSU5GTzMyICogbHBtbWlvaW5mbywgRFdPUkQgZHdPcGVuRmxhZ3MpOwotI2RlZmluZSBtbWlvT3BlbiBXSU5FTElCX05BTUVfQVcobW1pb09wZW4pCitITU1JTzE2CVdJTkFQSQltbWlvT3BlbjE2IChMUFNUUiAsTU1JT0lORk8xNiosRFdPUkQpOworSE1NSU8zMglXSU5BUEkJbW1pb09wZW4zMkEoTFBTVFIgLE1NSU9JTkZPMzIqLERXT1JEKTsKK0hNTUlPMzIJV0lOQVBJCW1taW9PcGVuMzJXKExQV1NUUixNTUlPSU5GTzMyKixEV09SRCk7CisjZGVmaW5lCQltbWlvT3BlbiBXSU5FTElCX05BTUVfQVcobW1pb09wZW4pCiAKLVVJTlQxNiBXSU5BUEkgbW1pb1JlbmFtZShMUENTVFIgc3pGaWxlTmFtZSwgTFBDU1RSIHN6TmV3RmlsZU5hbWUsCitVSU5UMTYgV0lOQVBJCW1taW9SZW5hbWUoTFBDU1RSIHN6RmlsZU5hbWUsIExQQ1NUUiBzek5ld0ZpbGVOYW1lLAogICAgICBNTUlPSU5GTzE2ICogbHBtbWlvaW5mbywgRFdPUkQgZHdSZW5hbWVGbGFncyk7CiAKLVVJTlQxNiBXSU5BUEkgbW1pb0Nsb3NlKEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1RmxhZ3MpOwotTE9ORyBXSU5BUEkgbW1pb1JlYWQoSE1NSU8xNiBobW1pbywgSFBTVFIgcGNoLCBMT05HIGNjaCk7Ci1MT05HIFdJTkFQSSBtbWlvV3JpdGUoSE1NSU8xNiBobW1pbywgSFBDU1RSIHBjaCwgTE9ORyBjY2gpOwotTE9ORyBXSU5BUEkgbW1pb1NlZWsoSE1NSU8xNiBobW1pbywgTE9ORyBsT2Zmc2V0LCBpbnQgaU9yaWdpbik7Ci1VSU5UMTYgV0lOQVBJIG1taW9HZXRJbmZvKEhNTUlPMTYgaG1taW8sIE1NSU9JTkZPMTYgKiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKTsKLVVJTlQxNiBXSU5BUEkgbW1pb1NldEluZm8oSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8xNiAqIGxwbW1pb2luZm8sIFVJTlQxNiB1RmxhZ3MpOwotVUlOVDE2IFdJTkFQSSBtbWlvU2V0QnVmZmVyKEhNTUlPMTYgaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgTE9ORyBjY2hCdWZmZXIsCi0gICAgVUlOVDE2IHVGbGFncyk7Ci1VSU5UMTYgV0lOQVBJIG1taW9GbHVzaChITU1JTzE2IGhtbWlvLCBVSU5UMTYgdUZsYWdzKTsKLVVJTlQxNiBXSU5BUEkgbW1pb0FkdmFuY2UoSE1NSU8xNiBobW1pbywgTU1JT0lORk8xNiAqIGxwbW1pb2luZm8sIFVJTlQxNiB1RmxhZ3MpOwotTE9ORyBXSU5BUEkgbW1pb1NlbmRNZXNzYWdlKEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1TWVzc2FnZSwKLSAgICBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpOwotVUlOVDE2IFdJTkFQSSBtbWlvRGVzY2VuZChITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyAqIGxwY2ssCi0gICAgY29uc3QgTU1DS0lORk8gKiBscGNrUGFyZW50LCBVSU5UMTYgdUZsYWdzKTsKLVVJTlQxNiBXSU5BUEkgbW1pb0FzY2VuZChITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyAqIGxwY2ssIFVJTlQxNiB1RmxhZ3MpOwotVUlOVDE2IFdJTkFQSSBtbWlvQ3JlYXRlQ2h1bmsoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLCBVSU5UMTYgdUZsYWdzKTsKK01NUkVTVUxUMTYgV0lOQVBJIG1taW9DbG9zZTE2KEhNTUlPMTYsVUlOVDE2KTsKK01NUkVTVUxUMzIgV0lOQVBJIG1taW9DbG9zZTMyKEhNTUlPMzIsVUlOVDMyKTsKKyNkZWZpbmUJCSAgbW1pb0Nsb3NlIFdJTkVMSUJfTkFNRShtbWlvQ2xvc2UpCitMT05HIFdJTkFQSQltbWlvUmVhZDE2KEhNTUlPMTYsSFBTVFIsTE9ORyk7CitMT05HIFdJTkFQSQltbWlvUmVhZDMyKEhNTUlPMzIsSFBTVFIsTE9ORyk7CisjZGVmaW5lCQltbWlvUmVhZCBXSU5FTElCX05BTUUobW1pb1JlYWQpCitMT05HIFdJTkFQSQltbWlvV3JpdGUxNihITU1JTzE2LEhQQ1NUUixMT05HKTsKK0xPTkcgV0lOQVBJCW1taW9Xcml0ZTMyKEhNTUlPMzIsSFBDU1RSLExPTkcpOworI2RlZmluZQkJbW1pb1dyaXRlIFdJTkVMSUJfTkFNRShtbWlvV3JpdGUpCitMT05HIFdJTkFQSQltbWlvU2VlazE2KEhNTUlPMTYsTE9ORyxJTlQxNik7CitMT05HIFdJTkFQSQltbWlvU2VlazMyKEhNTUlPMzIsTE9ORyxJTlQzMik7CisjZGVmaW5lCQltbWlvU2VlayBXSU5FTElCX05BTUUobW1pb1NlZWspCiAKLXR5cGVkZWYgVUlOVDE2IChDQUxMQkFDSyAqWUlFTERQUk9DKSAoVUlOVDE2IHVEZXZpY2VJRCwgRFdPUkQgZHdZaWVsZERhdGEpOworTU1SRVNVTFQxNiBXSU5BUEkJbW1pb0dldEluZm8xNihITU1JTzE2LE1NSU9JTkZPMTYqLFVJTlQxNik7CitNTVJFU1VMVDMyIFdJTkFQSQltbWlvR2V0SW5mbzMyKEhNTUlPMzIsTU1JT0lORk8zMiosVUlOVDMyKTsKKyNkZWZpbmUJCQltbWlvR2V0SW5mbyBXSU5FTElCX05BTUUobW1pb0dldEluZm8pCitNTVJFU1VMVDE2IFdJTkFQSQltbWlvU2V0SW5mbyhITU1JTzE2LGNvbnN0IE1NSU9JTkZPMTYqLFVJTlQxNik7CitVSU5UMTYgV0lOQVBJIG1taW9TZXRCdWZmZXIoSE1NSU8xNixMUFNUUixMT05HLFVJTlQxNik7CitVSU5UMTYgV0lOQVBJCW1taW9GbHVzaDE2KEhNTUlPMTYsVUlOVDE2KTsKK1VJTlQzMiBXSU5BUEkJbW1pb0ZsdXNoMzIoSE1NSU8zMixVSU5UMzIpOworI2RlZmluZQkJbW1pb0ZsdXNoIFdJTkVMSUJfTkFNRShtbWlvRmx1c2gpCiAKLURXT1JEIFdJTkFQSSBtY2lTZW5kQ29tbWFuZCAoVUlOVDE2IHVEZXZpY2VJRCwgVUlOVDE2IHVNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpOwotRFdPUkQgV0lOQVBJIG1jaVNlbmRTdHJpbmcgKExQQ1NUUiBscHN0ckNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBzdHJSZXR1cm5TdHJpbmcsIFVJTlQxNiB1UmV0dXJuTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQxNiBod25kQ2FsbGJhY2spOwotVUlOVDE2IFdJTkFQSSBtY2lHZXREZXZpY2VJRCAoTFBDU1RSIGxwc3RyTmFtZSk7Ci1VSU5UMTYgV0lOQVBJIG1jaUdldERldmljZUlERnJvbUVsZW1lbnRJRCAoRFdPUkQgZHdFbGVtZW50SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwc3RyVHlwZSk7CitVSU5UMTYgV0lOQVBJCW1taW9BZHZhbmNlMTYoSE1NSU8xNixNTUlPSU5GTzE2KixVSU5UMTYpOworVUlOVDMyIFdJTkFQSQltbWlvQWR2YW5jZTMyKEhNTUlPMzIsTU1JT0lORk8zMiosVUlOVDMyKTsKKyNkZWZpbmUJCW1taW9BZHZhbmNlIFdJTkVMSUJfTkFNRShtbWlvQWR2YW5jZSkKK0xPTkcgV0lOQVBJIG1taW9TZW5kTWVzc2FnZShITU1JTzE2LFVJTlQxNixMUEFSQU0sTFBBUkFNKTsKK1VJTlQxNiBXSU5BUEkgbW1pb0Rlc2NlbmQoSE1NSU8xNixNTUNLSU5GTyosY29uc3QgTU1DS0lORk8qLFVJTlQxNik7CitVSU5UMTYgV0lOQVBJCW1taW9Bc2NlbmQxNihITU1JTzE2LE1NQ0tJTkZPKixVSU5UMTYpOworVUlOVDMyIFdJTkFQSQltbWlvQXNjZW5kMzIoSE1NSU8zMixNTUNLSU5GTyosVUlOVDMyKTsKKyNkZWZpbmUJCW1taW9Bc2NlbmQgV0lORUxJQl9OQU1FKG1taW9Bc2NlbmQpCitVSU5UMTYgV0lOQVBJIG1taW9DcmVhdGVDaHVuayhITU1JTzE2LE1NQ0tJTkZPKixVSU5UMTYpOworCit0eXBlZGVmIFVJTlQxNiAoQ0FMTEJBQ0sgKllJRUxEUFJPQykoVUlOVDE2LERXT1JEKTsKKworRFdPUkQgV0lOQVBJIG1jaVNlbmRDb21tYW5kIChVSU5UMTYsVUlOVDE2LERXT1JELERXT1JEKTsKK0RXT1JEIFdJTkFQSSBtY2lTZW5kU3RyaW5nIChMUENTVFIsTFBTVFIsVUlOVDE2LEhXTkQxNik7CitVSU5UMTYgV0lOQVBJIG1jaUdldERldmljZUlEKExQQ1NUUik7CitVSU5UMTYgV0lOQVBJIG1jaUdldERldmljZUlERnJvbUVsZW1lbnRJRChEV09SRCxMUENTVFIpOwogQk9PTDE2IFdJTkFQSSBtY2lHZXRFcnJvclN0cmluZzE2IChEV09SRCxMUFNUUixVSU5UMTYpOwogQk9PTDMyIFdJTkFQSSBtY2lHZXRFcnJvclN0cmluZzMyQShEV09SRCxMUFNUUixVSU5UMzIpOwogQk9PTDMyIFdJTkFQSSBtY2lHZXRFcnJvclN0cmluZzMyVyhEV09SRCxMUFdTVFIsVUlOVDMyKTsKICNkZWZpbmUgbWNpR2V0RXJyb3JTdHJpbmcgV0lORUxJQl9OQU1FX0FXKG1jaUdldEVycm9yU3RyaW5nKQotQk9PTDE2IFdJTkFQSSBtY2lTZXRZaWVsZFByb2MgKFVJTlQxNiB1RGV2aWNlSUQsIFlJRUxEUFJPQyBmcFlpZWxkUHJvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1lpZWxkRGF0YSk7CitCT09MMTYgV0lOQVBJIG1jaVNldFlpZWxkUHJvYyAoVUlOVDE2LFlJRUxEUFJPQyxEV09SRCk7CiAKLUhUQVNLMTYgV0lOQVBJIG1jaUdldENyZWF0b3JUYXNrKFVJTlQxNiB1RGV2aWNlSUQpOwotWUlFTERQUk9DIFdJTkFQSSBtY2lHZXRZaWVsZFByb2MgKFVJTlQxNiB1RGV2aWNlSUQsIERXT1JEICogbHBkd1lpZWxkRGF0YSk7CitIVEFTSzE2IFdJTkFQSSBtY2lHZXRDcmVhdG9yVGFzayhVSU5UMTYpOworWUlFTERQUk9DIFdJTkFQSSBtY2lHZXRZaWVsZFByb2MoVUlOVDE2LERXT1JEKik7CiAKICNkZWZpbmUgTUNJRVJSX0lOVkFMSURfREVWSUNFX0lEICAgICAgICAoTUNJRVJSX0JBU0UgKyAxKQogI2RlZmluZSBNQ0lFUlJfVU5SRUNPR05JWkVEX0tFWVdPUkQgICAgIChNQ0lFUlJfQkFTRSArIDMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL21zZG9zLmggYi9pbmNsdWRlL21zZG9zLmgKaW5kZXggYmE4NmZlNi4uZjgyNzZhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tc2Rvcy5oCisrKyBiL2luY2x1ZGUvbXNkb3MuaApAQCAtMTkzLDYgKzE5Myw2IEBACiAjZGVmaW5lIEVMX01lbW9yeSAgICAgICAgICAgIDB4MDUKIAogdm9pZCBXSU5BUEkgRE9TM0NhbGwoIENPTlRFWFQgKmNvbnRleHQgKTsKLXZvaWQgZG9fbXNjZGV4KCBDT05URVhUICpjb250ZXh0ICk7Cit2b2lkIGRvX21zY2RleCggQ09OVEVYVCAqY29udGV4dCwgaW50IGRvcmVhbG1vZGUgKTsKIAogI2VuZGlmIC8qIF9fV0lORV9NU0RPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Nub29wLmggYi9pbmNsdWRlL3Nub29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1ZmQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc25vb3AuaApAQCAtMCwwICsxLDggQEAKKy8qIAorICogRGVmaW5pdGlvbnMgZm9yIGludGVyLXdpbjMyLWRsbCBzbm9vcGluZworICovCisjaWZuZGVmIF9fV0lORV9TTk9PUF9ICisjZGVmaW5lIF9fV0lORV9TTk9PUF9ICitleHRlcm4gdm9pZCBTTk9PUF9SZWdpc3RlckRMTChITU9EVUxFMzIgaG1vZCxMUENTVFIgbmFtZSxEV09SRCBucm9mb3JkaW5hbHMpOworZXh0ZXJuIEZBUlBST0MzMiBTTk9PUF9HZXRQcm9jQWRkcmVzczMyKEhNT0RVTEUzMiBobW9kLExQQ1NUUiBuYW1lLERXT1JEIG9yZGluYWwsRkFSUFJPQzMyIG9yaWdmdW4pOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0YXR1cy5oIGIvaW5jbHVkZS9zdGF0dXMuaAppbmRleCBhNTNjZWFlLi43YmYyYjRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0YXR1cy5oCisrKyBiL2luY2x1ZGUvc3RhdHVzLmgKQEAgLTI1LDYgKzI1LDcgQEAKICAgICBVSU5UMzIgICAgICAgICAgICAgIGhlaWdodDsKICAgICBCT09MMzIgICAgICAgICAgICAgIHNpbXBsZTsKICAgICBIRk9OVDMyICAgICAgICAgICAgIGhGb250OworICAgIEhGT05UMzIgICAgICAgICAgICAgaERlZmF1bHRGb250OwogICAgIENPTE9SUkVGICAgICAgICAgICAgY2xyQms7ICAvKiBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICAgU1RBVFVTV0lORE9XUEFSVAlwYXJ0MDsJLyogc2ltcGxlIHdpbmRvdyAqLwogICAgIFNUQVRVU1dJTkRPV1BBUlQgICAqcGFydHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c21ldHJpY3MuaCBiL2luY2x1ZGUvc3lzbWV0cmljcy5oCmluZGV4IGEzOTgyMzUuLjEwMWYzMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3lzbWV0cmljcy5oCisrKyBiL2luY2x1ZGUvc3lzbWV0cmljcy5oCkBAIC0xMyw4ICsxMyw4IEBACiAgIC8qIENvbnN0YW50IHN5c3RlbSBtZXRyaWNzICovCiAjaWYgMAogI2lmZGVmIFdJTl85NV9MT09LCi0jZGVmaW5lIFNZU01FVFJJQ1NfQ1hETEdGUkFNRSAgICAgICAgIDIKLSNkZWZpbmUgU1lTTUVUUklDU19DWURMR0ZSQU1FICAgICAgICAgMgorI2RlZmluZSBTWVNNRVRSSUNTX0NYRExHRlJBTUUgICAgICAgICAzCisjZGVmaW5lIFNZU01FVFJJQ1NfQ1lETEdGUkFNRSAgICAgICAgIDMKICNkZWZpbmUgU1lTTUVUUklDU19DWVZUSFVNQiAgICAgICAgICAxMwogI2RlZmluZSBTWVNNRVRSSUNTX0NYSFRIVU1CICAgICAgICAgIDEzCiAjZWxzZQpAQCAtMTIzLDggKzEyMyw4IEBACiAKIC8qIFVzZSB0aGUgZm9sbG93aW5nIGluc3RlYWQgb2Ygc3lzTWV0cmljc1tTTV9DWE1FTlVDSEVDS10gR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnMoKSEgKi8KICNkZWZpbmUgU1lTTUVUUklDU19DWE1FTlVDSEVDSyAgICAgICAgICBzeXNNZXRyaWNzW1NNX0NYTUVOVUNIRUNLXSAgICAgICAgICAvKiA3MSAqLwotCiAjZGVmaW5lIFNZU01FVFJJQ1NfQ1lNRU5VQ0hFQ0sgICAgICAgICAgc3lzTWV0cmljc1tTTV9DWU1FTlVDSEVDS10gICAgICAgICAgLyogNzIgKi8KKwogI2RlZmluZSBTWVNNRVRSSUNTX1NMT1dNQUNISU5FICAgICAgICAgIHN5c01ldHJpY3NbU01fU0xPV01BQ0hJTkVdICAgICAgICAgIC8qIDczICovCiAjZGVmaW5lIFNZU01FVFJJQ1NfTUlERUFTVEVOQUJMRUQgICAgICAgc3lzTWV0cmljc1tTTV9NSURFQVNURU5BQkxFRF0gICAgICAgLyogNzQgKi8KICNkZWZpbmUgU1lTTUVUUklDU19NT1VTRVdIRUVMUFJFU0VOVCAgICBzeXNNZXRyaWNzW1NNX01PVVNFV0hFRUxQUkVTRU5UXSAgICAvKiA3NSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90b29sYmFyLmggYi9pbmNsdWRlL3Rvb2xiYXIuaAppbmRleCAwY2FkMzJhLi4xNGVjZDg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Rvb2xiYXIuaAorKysgYi9pbmNsdWRlL3Rvb2xiYXIuaApAQCAtMjQsMTkgKzI0LDIwIEBACiAKIHR5cGVkZWYgc3RydWN0IHRhZ1RPT0xCQVJfSU5GTwogewotICAgIERXT1JEICAgICAgZHdTdHJ1Y3RTaXplOyAgIC8qIFNpemUgb2YgVEJCVVRUT04tU3RydWN0ICovCi0gICAgSU5UMzIgICAgICBuSGVpZ2h0OyAgICAgICAgLyogSGVpZ2h0IG9mIHRoZSBUb29sYmFyICovCi0gICAgSU5UMzIgICAgICBuV2lkdGg7ICAgICAgICAgLyogV2lkdGggb2YgdGhlIFRvb2xiYXIgKi8KKyAgICBEV09SRCAgICAgIGR3U3RydWN0U2l6ZTsgICAvKiBzaXplIG9mIFRCQlVUVE9OIHN0cnVjdCAqLworICAgIElOVDMyICAgICAgbkhlaWdodDsgICAgICAgIC8qIGhlaWdodCBvZiB0aGUgdG9vbGJhciAqLworICAgIElOVDMyICAgICAgbldpZHRoOyAgICAgICAgIC8qIHdpZHRoIG9mIHRoZSB0b29sYmFyICovCiAgICAgSU5UMzIgICAgICBuQnV0dG9uVG9wOyAgICAgLyogdG9wIG9mIHRoZSBidXR0b24gcmVjdGFuZ2xlICovCiAgICAgSU5UMzIgICAgICBuQnV0dG9uSGVpZ2h0OwogICAgIElOVDMyICAgICAgbkJ1dHRvbldpZHRoOwogICAgIElOVDMyICAgICAgbkJpdG1hcEhlaWdodDsKICAgICBJTlQzMiAgICAgIG5CaXRtYXBXaWR0aDsKICAgICBJTlQzMiAgICAgIG5JbmRlbnQ7CisgICAgSU5UMzIgICAgICBuTWF4Um93czsgICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgKi8KIAotICAgIElOVDMyICAgICAgbk51bUJ1dHRvbnM7ICAgICAvKiBOdW1iZXIgb2YgYnV0dG9ucyAqLwotICAgIElOVDMyICAgICAgbk51bUJpdG1hcHM7Ci0gICAgSU5UMzIgICAgICBuTnVtU3RyaW5nczsKKyAgICBJTlQzMiAgICAgIG5OdW1CdXR0b25zOyAgICAgLyogbnVtYmVyIG9mIGJ1dHRvbnMgKi8KKyAgICBJTlQzMiAgICAgIG5OdW1CaXRtYXBzOyAgICAgLyogbnVtYmVyIG9mIGJpdG1hcHMgKi8KKyAgICBJTlQzMiAgICAgIG5OdW1TdHJpbmdzOyAgICAgLyogbnVtYmVyIG9mIHN0cmluZ3MgKi8KIAogICAgIEJPT0wzMiAgICAgYkNhcHR1cmVkOwogICAgIElOVDMyICAgICAgbkJ1dHRvbkRvd247CkBAIC00NSw4ICs0NiwxMSBAQAogICAgIEhJTUFHRUxJU1QgaGltbERlZjsgICAgICAgICAvKiBkZWZhdWx0IGltYWdlIGxpc3QgKi8KICAgICBISU1BR0VMSVNUIGhpbWxIb3Q7ICAgICAgICAgLyogaG90IGltYWdlIGxpc3QgKi8KICAgICBISU1BR0VMSVNUIGhpbWxEaXM7ICAgICAgICAgLyogZGlzYWJsZWQgaW1hZ2UgbGlzdCAqLworICAgIEhXTkQzMiAgICAgaHduZFRvb2xUaXA7ICAgICAvKiBoYW5kbGUgdG8gdG9vbCB0aXAgY29udHJvbCAqLworICAgIEhXTkQzMiAgICAgaHduZE5vdGlmeTsgICAgICAvKiBoYW5kbGUgdG8gdGhlIHdpbmRvdyB0aGF0IGdldHMgbm90aWZpY2F0aW9ucyAqLwogCiAgICAgVEJVVFRPTl9JTkZPICpidXR0b25zOworICAgIENIQVIgICAgICAgICAqKnN0cmluZ3M7CiB9IFRPT0xCQVJfSU5GTzsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZlcnNpb24uaCBiL2luY2x1ZGUvdmVyc2lvbi5oCmluZGV4IDBjYzM2YjMuLjVhMDkyZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0xICsxIEBACi0jZGVmaW5lIFdJTkVfUkVMRUFTRV9JTkZPICJXaW5lIHJlbGVhc2UgOTgwNjAxIgorI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk4MDYxNCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luYmFzZS5oIGIvaW5jbHVkZS93aW5iYXNlLmgKaW5kZXggMjJkYzE4My4uYjRjYzIzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5iYXNlLmgKKysrIGIvaW5jbHVkZS93aW5iYXNlLmgKQEAgLTE0Myw2ICsxNDMsMTUgQEAKIH1DUklUSUNBTF9TRUNUSU9OOwogCiB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIERXT1JEIGR3T1NWZXJzaW9uSW5mb1NpemU7CisgICAgICAgIERXT1JEIGR3TWFqb3JWZXJzaW9uOworICAgICAgICBEV09SRCBkd01pbm9yVmVyc2lvbjsKKyAgICAgICAgRFdPUkQgZHdCdWlsZE51bWJlcjsKKyAgICAgICAgRFdPUkQgZHdQbGF0Zm9ybUlkOworICAgICAgICBDSEFSIHN6Q1NEVmVyc2lvblsxMjhdOworfSBPU1ZFUlNJT05JTkZPMTY7CisKK3R5cGVkZWYgc3RydWN0IHsKIAlEV09SRCBkd09TVmVyc2lvbkluZm9TaXplOwogCURXT1JEIGR3TWFqb3JWZXJzaW9uOwogCURXT1JEIGR3TWlub3JWZXJzaW9uOwpAQCAtMTY3LDYgKzE3Niw3IEBACiAjZGVmaW5lIFZFUl9QTEFURk9STV9XSU4zMl9OVCAgICAgICAgICAgMgogCiAvKkRXT1JEIFdJTkFQSSBHZXRWZXJzaW9uKCB2b2lkICk7Ki8KK0JPT0wxNiBXSU5BUEkgR2V0VmVyc2lvbkV4MTYoT1NWRVJTSU9OSU5GTzE2Kik7CiBCT09MMzIgV0lOQVBJIEdldFZlcnNpb25FeDMyQShPU1ZFUlNJT05JTkZPMzJBKik7CiBCT09MMzIgV0lOQVBJIEdldFZlcnNpb25FeDMyVyhPU1ZFUlNJT05JTkZPMzJXKik7CiAjZGVmaW5lIEdldFZlcnNpb25FeCBXSU5FTElCX05BTUVfQVcoR2V0VmVyc2lvbkV4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5kb3dzLmggYi9pbmNsdWRlL3dpbmRvd3MuaAppbmRleCBlMjhhMTcxLi45MTE5ZTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmRvd3MuaAorKysgYi9pbmNsdWRlL3dpbmRvd3MuaApAQCAtNDY3LDYgKzQ2Nyw5IEBACiAjZGVmaW5lIEhUWk9PTSAgICAgICAgICAgICAgSFRNQVhCVVRUT04KIAogICAvKiBXTV9TWVNDT01NQU5EIHBhcmFtZXRlcnMgKi8KKyNpZmRlZiBTQ19TSVpFIC8qIGF0IGxlYXN0IEhQLVVYOiBhbHJlYWR5IGRlZmluZWQgaW4gL3Vzci9pbmNsdWRlL3N5cy9zaWduYWwuaCAqLworI3VuZGVmIFNDX1NJWkUKKyNlbmRpZgogI2RlZmluZSBTQ19TSVpFICAgICAgICAgMHhmMDAwCiAjZGVmaW5lIFNDX01PVkUgICAgICAgICAweGYwMTAKICNkZWZpbmUgU0NfTUlOSU1JWkUgICAgIDB4ZjAyMApAQCAtMzYxMSw2ICszNjE0LDI1IEBACiAjZGVmaW5lIFdTX0VYX0FDQ0VQVEZJTEVTICAgICAgMHgwMDAwMDAxMEwKICNkZWZpbmUgV1NfRVhfVFJBTlNQQVJFTlQgICAgICAweDAwMDAwMDIwTAogCisvKiBOZXcgV2luOTUvV2luTlQ0IHN0eWxlcyAqLworI2RlZmluZSBXU19FWF9NRElDSElMRCAgICAgICAgIDB4MDAwMDAwNDBMCisjZGVmaW5lIFdTX0VYX1RPT0xXSU5ET1cgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgV1NfRVhfV0lORE9XRURHRSAgICAgICAweDAwMDAwMTAwTAorI2RlZmluZSBXU19FWF9DTElFTlRFREdFICAgICAgIDB4MDAwMDAyMDBMCisjZGVmaW5lIFdTX0VYX0NPTlRFWFRIRUxQICAgICAgMHgwMDAwMDQwMEwKKyNkZWZpbmUgV1NfRVhfUklHSFQgICAgICAgICAgICAweDAwMDAxMDAwTAorI2RlZmluZSBXU19FWF9MRUZUICAgICAgICAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIFdTX0VYX1JUTFJFQURJTkcgICAgICAgMHgwMDAwMjAwMEwKKyNkZWZpbmUgV1NfRVhfTFRSUkVBRElORyAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBXU19FWF9MRUZUU0NST0xMQkFSICAgIDB4MDAwMDQwMDBMCisjZGVmaW5lIFdTX0VYX1JJR0hUU0NST0xMQkFSICAgMHgwMDAwMDAwMEwKKyNkZWZpbmUgV1NfRVhfQ09OVFJPTFBBUkVOVCAgICAweDAwMDEwMDAwTAorI2RlZmluZSBXU19FWF9TVEFUSUNFREdFICAgICAgIDB4MDAwMjAwMDBMCisjZGVmaW5lIFdTX0VYX0FQUFdJTkRPVyAgICAgICAgMHgwMDA0MDAwMEwKKworI2RlZmluZSBXU19FWF9PVkVSTEFQUEVEV0lORE9XIChXU19FWF9XSU5ET1dFREdFfFdTX0VYX0NMSUVOVEVER0UpCisjZGVmaW5lIFdTX0VYX1BBTEVUVEVXSU5ET1cgICAgKFdTX0VYX1dJTkRPV0VER0V8V1NfRVhfVE9PTFdJTkRPV3xXU19FWF9UT1BNT1NUKQorCiAvKiBXaW5kb3cgc2Nyb2xsaW5nICovCiAjZGVmaW5lIFNXX1NDUk9MTENISUxEUkVOICAgICAgMHgwMDAxCiAjZGVmaW5lIFNXX0lOVkFMSURBVEUgICAgICAgICAgMHgwMDAyCkBAIC02MDQ2LDYgKzYwNjgsMTMgQEAKICAgICBEV09SRCAgICBuRmlsZVNpemVMb3c7CiB9IFdJTjMyX0ZJTEVfQVRUUklCVVRFX0RBVEEsICpMUFdJTjMyX0ZJTEVfQVRUUklCVVRFX0RBVEE7CiAKK3R5cGVkZWYgc3RydWN0IF9EbGxWZXJzaW9uSW5mbyB7CisgICAgRFdPUkQgY2JTaXplOworICAgIERXT1JEIGR3TWFqb3JWZXJzaW9uOworICAgIERXT1JEIGR3TWlub3JWZXJzaW9uOworICAgIERXT1JEIGR3QnVpbGROdW1iZXI7CisgICAgRFdPUkQgZHdQbGF0Zm9ybUlEOworfSBETExWRVJTSU9OSU5GTzsKIAogCiAKQEAgLTYyMTMsNiArNjI0Miw4IEBACiBCT09MMzIgICAgICBXSU5BUEkgQWxsb2NDb25zb2xlKHZvaWQpOwogQk9PTDMyICAgICAgV0lOQVBJIEFyZUZpbGVBcGlzQU5TSSh2b2lkKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBCZWVwKERXT1JELERXT1JEKTsKK1dPUkQgICAgICAgIFdJTkFQSSBDYXNjYWRlV2luZG93cyAoSFdORDMyLCBVSU5UMzIsIGNvbnN0IExQUkVDVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIsIGNvbnN0IEhXTkQzMiAqKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBDbGVhckNvbW1FcnJvcihJTlQzMixMUERXT1JELExQQ09NU1RBVCk7CiBCT09MMzIgICAgICBXSU5BUEkgQ2xvc2VIYW5kbGUoSEFORExFMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIENsb3NlU2VydmljZUhhbmRsZShIQU5ETEUzMik7CkBAIC02MzQxLDYgKzYzNzIsOCBAQAogQk9PTDMyICAgICAgV0lOQVBJIEdldEZpbGVBdHRyaWJ1dGVzRXgzMlcoTFBDV1NUUixHRVRfRklMRUVYX0lORk9fTEVWRUxTLExQVk9JRCk7CiAjZGVmaW5lICAgICBHZXRGaWxlYXR0cmlidXRlc0V4IFdJTkVMSUJfTkFNRV9BVyhHZXRGaWxlQXR0cmlidXRlc0V4KQogRFdPUkQgICAgICAgV0lOQVBJIEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKEhGSUxFMzIsQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04qKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBHZXRGaWxlU2VjdXJpdHlBKExQQ1NUUixTRUNVUklUWV9JTkZPUk1BVElPTixMUFNFQ1VSSVRZX0RFU0NSSVBUT1IsRFdPUkQsTFBEV09SRCk7CitCT09MMzIgICAgICBXSU5BUEkgR2V0RmlsZVNlY3VyaXR5VyhMUENXU1RSLFNFQ1VSSVRZX0lORk9STUFUSU9OLExQU0VDVVJJVFlfREVTQ1JJUFRPUixEV09SRCxMUERXT1JEKTsKIERXT1JEICAgICAgIFdJTkFQSSBHZXRGaWxlU2l6ZShIRklMRTMyLExQRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldEZpbGVUaW1lKEhGSUxFMzIsTFBGSUxFVElNRSxMUEZJTEVUSU1FLExQRklMRVRJTUUpOwogRFdPUkQgICAgICAgV0lOQVBJIEdldEZpbGVUeXBlKEhGSUxFMzIpOwpAQCAtNjU2Niw2ICs2NTk5LDggQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBTdGFydFNlcnZpY2UzMlcoSEFORExFMzIsRFdPUkQsTFBDV1NUUiopOwogI2RlZmluZSAgICAgU3RhcnRTZXJ2aWNlIFdJTkVMSUJfTkFNRV9BVyhTdGFydFNlcnZpY2UpCiBCT09MMzIgICAgICBXSU5BUEkgU3lzdGVtVGltZVRvRmlsZVRpbWUoY29uc3QgU1lTVEVNVElNRSosTFBGSUxFVElNRSk7CitXT1JEICAgICAgICBXSU5BUEkgVGlsZVdpbmRvd3MgKEhXTkQzMiwgVUlOVDMyLCBjb25zdCBMUFJFQ1QzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyLCBjb25zdCBIV05EMzIgKik7CiBCT09MMzIgICAgICBXSU5BUEkgVHJhY2tQb3B1cE1lbnVFeChITUVOVTMyLFVJTlQzMixJTlQzMixJTlQzMixIV05EMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRQTVBBUkFNUyk7CiBEV09SRCAgICAgICBXSU5BUEkgVGxzQWxsb2Modm9pZCk7CkBAIC03MTUwLDggKzcxODUsOCBAQAogQk9PTDE2ICAgICAgV0lOQVBJIEVtcHR5Q2xpcGJvYXJkMTYodm9pZCk7CiBCT09MMzIgICAgICBXSU5BUEkgRW1wdHlDbGlwYm9hcmQzMih2b2lkKTsKICNkZWZpbmUgICAgIEVtcHR5Q2xpcGJvYXJkIFdJTkVMSUJfTkFNRShFbXB0eUNsaXBib2FyZCkKLUJPT0wxNiAgICAgIFdJTkFQSSBFbmFibGVNZW51SXRlbTE2KEhNRU5VMTYsVUlOVDE2LFVJTlQxNik7Ci1CT09MMzIgICAgICBXSU5BUEkgRW5hYmxlTWVudUl0ZW0zMihITUVOVTMyLFVJTlQzMixVSU5UMzIpOworVUlOVDE2ICAgICAgV0lOQVBJIEVuYWJsZU1lbnVJdGVtMTYoSE1FTlUxNixVSU5UMTYsVUlOVDE2KTsKK1VJTlQzMiAgICAgIFdJTkFQSSBFbmFibGVNZW51SXRlbTMyKEhNRU5VMzIsVUlOVDMyLFVJTlQzMik7CiAjZGVmaW5lICAgICBFbmFibGVNZW51SXRlbSBXSU5FTElCX05BTUUoRW5hYmxlTWVudUl0ZW0pCiBCT09MMTYgICAgICBXSU5BUEkgRW5hYmxlU2Nyb2xsQmFyMTYoSFdORDE2LElOVDE2LFVJTlQxNik7CiBCT09MMzIgICAgICBXSU5BUEkgRW5hYmxlU2Nyb2xsQmFyMzIoSFdORDMyLElOVDMyLFVJTlQzMik7CkBAIC04MDE5LDYgKzgwNTQsOSBAQAogSENVUlNPUjMyICAgV0lOQVBJIExvYWRDdXJzb3IzMkEoSElOU1RBTkNFMzIsTFBDU1RSKTsKIEhDVVJTT1IzMiAgIFdJTkFQSSBMb2FkQ3Vyc29yMzJXKEhJTlNUQU5DRTMyLExQQ1dTVFIpOwogI2RlZmluZSAgICAgTG9hZEN1cnNvciBXSU5FTElCX05BTUVfQVcoTG9hZEN1cnNvcikKK0hDVVJTT1IzMiAgIFdJTkFQSSBMb2FkQ3Vyc29yRnJvbUZpbGUzMkEoTFBDU1RSKTsKK0hDVVJTT1IzMiAgIFdJTkFQSSBMb2FkQ3Vyc29yRnJvbUZpbGUzMlcoTFBDV1NUUik7CisjZGVmaW5lICAgICBMb2FkQ3Vyc29yRnJvbUZpbGUgV0lORUxJQl9OQU1FX0FXKExvYWRDdXJzb3JGcm9tRmlsZSkKIEhJQ09OMTYgICAgIFdJTkFQSSBMb2FkSWNvbjE2KEhJTlNUQU5DRTE2LFNFR1BUUik7CiBISUNPTjMyICAgICBXSU5BUEkgTG9hZEljb24zMkEoSElOU1RBTkNFMzIsTFBDU1RSKTsKIEhJQ09OMzIgICAgIFdJTkFQSSBMb2FkSWNvbjMyVyhISU5TVEFOQ0UzMixMUENXU1RSKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZXJyb3IuaCBiL2luY2x1ZGUvd2luZXJyb3IuaAppbmRleCAzNGFlMjM5Li5kNWIyY2ZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmVycm9yLmgKKysrIGIvaW5jbHVkZS93aW5lcnJvci5oCkBAIC0zMSw2ICszMSw3IEBACiAjZGVmaW5lIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZICAgICA4CiAjZGVmaW5lIEVSUk9SX0JBRF9GT1JNQVQgICAgICAgICAgICAxMQogI2RlZmluZSBFUlJPUl9JTlZBTElEX0FDQ0VTUyAgICAgICAgMTIKKyNkZWZpbmUgRVJST1JfSU5WQUxJRF9EQVRBICAgICAgICAgIDEzCiAjZGVmaW5lIEVSUk9SX09VVE9GTUVNT1JZICAgICAgICAgICAxNAogI2RlZmluZSBFUlJPUl9OT19NT1JFX0ZJTEVTICAgICAgICAgMTgKICNkZWZpbmUgRVJST1JfU0hBUklOR19WSU9MQVRJT04gICAgIDMyCkBAIC01Nyw2ICs1OCw3IEBACiAjZGVmaW5lIEVSUk9SX0lOVkFMSURfQUREUkVTUyAgICAgICA0ODcKICNkZWZpbmUgRVJST1JfQ0FOX05PVF9DT01QTEVURSAgICAgIDEwMDMKICNkZWZpbmUgRVJST1JfQkFES0VZICAgICAgICAgICAgICAgIDEwMTAgLyogQ29uZmlnIHJlZyBrZXkgaW52YWxpZCAqLworI2RlZmluZSBFUlJPUl9DQU5UUkVBRCAgICAgICAgICAgICAgMTAxMiAvKiBDb25maWcgcmVnIGtleSBjb3VsZG4ndCBiZSByZWFkICovCiAjZGVmaW5lIEVSUk9SX0NBTlRXUklURSAgICAgICAgICAgICAxMDEzIC8qIENvbmZpZyByZWcga2V5IGNvdWxkbid0IGJlIHdyaXR0ZW4gKi8KICNkZWZpbmUgRVJST1JfSU9fREVWSUNFICAgICAgICAgICAgIDExMTcKICNkZWZpbmUgRVJST1JfUE9TU0lCTEVfREVBRExPQ0sgICAgIDExMzEKQEAgLTY1LDYgKzY3LDcgQEAKICNkZWZpbmUgRVJST1JfQUxSRUFEWV9JTklUSUFMSVpFRCAgIDEyNDcKICNkZWZpbmUgRVJST1JfUFJJVklMRUdFX05PVF9IRUxEICAgIDEzMTQKICNkZWZpbmUgRVJST1JfQ09NTUlUTUVOVF9MSU1JVCAgICAgIDE0NTUKKyNkZWZpbmUgRVJST1JfSU5WQUxJRF9QUklOVEVSX05BTUUgIDE4MDEKIAogLyogSFJFU1VMVCB2YWx1ZXMgZm9yIE9MRSwgU0hFTEwgYW5kIG90aGVyIEludGVyZmFjZSBzdHVmZiAqLwogI2RlZmluZQlOT0VSUk9SCQkJCTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2lubnQuaCBiL2luY2x1ZGUvd2lubnQuaAppbmRleCA2NDFkZjkzLi40NGZjNzMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbm50LmgKKysrIGIvaW5jbHVkZS93aW5udC5oCkBAIC04LDYgKzgsNyBAQAogI2RlZmluZSBfX1dJTkVfV0lOTlRfSAogCiAjaW5jbHVkZSAid2ludHlwZXMuaCIKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKIC8qIEhlYXAgZmxhZ3MgKi8KIApAQCAtOTcsNiArOTgsNyBAQAogICAgIERXT1JEICAgU2VnU3M7CiB9IENPTlRFWFQsICpQQ09OVEVYVDsKIAordHlwZWRlZiBIQU5ETEUzMiAqUEhBTkRMRTsKIAogI2lmZGVmIF9fV0lORV9fCiAKQEAgLTI3Miw2ICsyNzQsMTY0IEBACiBMUFRPUF9MRVZFTF9FWENFUFRJT05fRklMVEVSCiBXSU5BUEkgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKCBMUFRPUF9MRVZFTF9FWENFUFRJT05fRklMVEVSIGZpbHRlciApOwogCisvKgorICogSGVyZSBmb2xsb3dzIHR5cGVkZWZzIGZvciBzZWN1cml0eSBhbmQgdG9rZW5zLgorICovIAorCisvKgorICogRmlyc3QgYSBjb25zdGFudCBmb3IgdGhlIGZvbGxvd2luZyB0eXBkZWZzLgorICovCisKKyNkZWZpbmUgQU5ZU0laRV9BUlJBWSAgIDEKKworLyoKKyAqIFRPS0VOX0lORk9STUFUSU9OX0NMQVNTCisgKi8KKwordHlwZWRlZiBlbnVtIF9UT0tFTl9JTkZPUk1BVElPTl9DTEFTUyB7CisgIFRva2VuVXNlciA9IDEsIAorICBUb2tlbkdyb3VwcywgCisgIFRva2VuUHJpdmlsZWdlcywgCisgIFRva2VuT3duZXIsIAorICBUb2tlblByaW1hcnlHcm91cCwgCisgIFRva2VuRGVmYXVsdERhY2wsIAorICBUb2tlblNvdXJjZSwgCisgIFRva2VuVHlwZSwgCisgIFRva2VuSW1wZXJzb25hdGlvbkxldmVsLCAKKyAgVG9rZW5TdGF0aXN0aWNzIAorfSBUT0tFTl9JTkZPUk1BVElPTl9DTEFTUzsgCisKKy8qIAorICogU0lEX0FORF9BVFRSSUJVVEVTCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1NJRF9BTkRfQVRUUklCVVRFUyB7CisgIFBTSUQgIFNpZDsgCisgIERXT1JEIEF0dHJpYnV0ZXM7IAorfSBTSURfQU5EX0FUVFJJQlVURVMgOyAKKyAKKy8qCisgKiBUT0tFTl9VU0VSCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1RPS0VOX1VTRVIgeworICBTSURfQU5EX0FUVFJJQlVURVMgVXNlcjsgCit9IFRPS0VOX1VTRVI7IAorCisvKgorICogVE9LRU5fR1JPVVBTCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1RPS0VOX0dST1VQUyAgeworICBEV09SRCBHcm91cENvdW50OyAKKyAgU0lEX0FORF9BVFRSSUJVVEVTIEdyb3Vwc1tBTllTSVpFX0FSUkFZXTsgCit9IFRPS0VOX0dST1VQUzsgCisKKy8qCisgKiBMVUlEX0FORF9BVFRSSUJVVEVTCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0xVSURfQU5EX0FUVFJJQlVURVMgeworICBMVUlEICAgTHVpZDsgCisgIERXT1JEICBBdHRyaWJ1dGVzOyAKK30gTFVJRF9BTkRfQVRUUklCVVRFUzsgCisKKy8qCisgKiBUT0tFTl9QUklWSUxFR0VTCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1RPS0VOX1BSSVZJTEVHRVMgeworICBEV09SRCBQcml2aWxlZ2VDb3VudDsgCisgIExVSURfQU5EX0FUVFJJQlVURVMgUHJpdmlsZWdlc1tBTllTSVpFX0FSUkFZXTsgCit9IFRPS0VOX1BSSVZJTEVHRVM7IAorCisvKgorICogVE9LRU5fT1dORVIKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfVE9LRU5fT1dORVIgeworICBQU0lEIE93bmVyOyAKK30gVE9LRU5fT1dORVI7IAorCisvKgorICogVE9LRU5fUFJJTUFSWV9HUk9VUAorICovCisKK3R5cGVkZWYgc3RydWN0IF9UT0tFTl9QUklNQVJZX0dST1VQIHsKKyAgUFNJRCBQcmltYXJ5R3JvdXA7IAorfSBUT0tFTl9QUklNQVJZX0dST1VQOyAKKworCisvKgorICogQUNMIChhbmQgUEFDTCBMUEFDTD8pLgorICovCisvKgorCithcmUgZGVmaW5lZCBpbiBudGRkbC5oLgordHlwZWRlZiBzdHJ1Y3QgX0FDTCB7CisgIEJZVEUgQWNsUmV2aXNpb247CisgIEJZVEUgU2J6MTsKKyAgV09SRCBBY2xTaXplOworICBXT1JEIEFjZUNvdW50OworICBXT1JEIFNiejI7Cit9IEFDTCwgKlBBQ0w7IFBBQ0wgPD0+IExQQUNMPyAqLworCisvKgorICogVE9LRU5fREVGQVVMVF9EQUNMCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1RPS0VOX0RFRkFVTFRfREFDTCB7IAorICBMUEFDTCBEZWZhdWx0RGFjbDsgCit9IFRPS0VOX0RFRkFVTFRfREFDTDsgCisKKy8qCisgKiBUT0tFTl9TT1VSQ0VMCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1RPS0VOX1NPVVJDRSB7CisgIGNoYXIgU291cmNlbmFtZVs4XTsgCisgIExVSUQgU291cmNlSWRlbnRpZmllcjsgCit9IFRPS0VOX1NPVVJDRTsgCisKKy8qCisgKiBUT0tFTl9UWVBFCisgKi8KKwordHlwZWRlZiBlbnVtIHRhZ1RPS0VOX1RZUEUgeworICBUb2tlblByaW1hcnkgPSAxLCAKKyAgVG9rZW5JbXBlcnNvbmF0aW9uIAorfSBUT0tFTl9UWVBFOyAKKworLyoKKyAqIFNFQ1VSSVRZX0lNUEVSU09OQVRJT05fTEVWRUwKKyAqLworCit0eXBlZGVmIGVudW0gX1NFQ1VSSVRZX0lNUEVSU09OQVRJT05fTEVWRUwgeworICBTZWN1cml0eUFub255bW91cywgCisgIFNlY3VyaXR5SWRlbnRpZmljYXRpb24sIAorICBTZWN1cml0eUltcGVyc29uYXRpb24sIAorICBTZWN1cml0eURlbGVnYXRpb24gCit9IFNFQ1VSSVRZX0lNUEVSU09OQVRJT05fTEVWRUw7IAorCisKKy8qCisgKiBUT0tFTl9TVEFUSVNUSUNTCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1RPS0VOX1NUQVRJU1RJQ1MgeworICBMVUlEICBUb2tlbklkOyAKKyAgTFVJRCAgQXV0aGVudGljYXRpb25JZDsgCisgIExBUkdFX0lOVEVHRVIgRXhwaXJhdGlvblRpbWU7IAorICBUT0tFTl9UWVBFICAgIFRva2VuVHlwZTsgCisgIFNFQ1VSSVRZX0lNUEVSU09OQVRJT05fTEVWRUwgSW1wZXJzb25hdGlvbkxldmVsOyAKKyAgRFdPUkQgRHluYW1pY0NoYXJnZWQ7IAorICBEV09SRCBEeW5hbWljQXZhaWxhYmxlOyAKKyAgRFdPUkQgR3JvdXBDb3VudDsgCisgIERXT1JEIFByaXZpbGVnZUNvdW50OyAKKyAgTFVJRCAgTW9kaWZpZWRJZDsgCit9IFRPS0VOX1NUQVRJU1RJQ1M7IAorCisKIC8qIEkgbW92ZWQgdGhlIExhbmd1YWdlIElEcyB0byB3aW5ubHMuaCAoRGF2aWQgTGVlIExhbWJlcnQpICovCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5yZWcuaCBiL2luY2x1ZGUvd2lucmVnLmgKaW5kZXggNjZjOGZjNC4uYjU5NGM0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5yZWcuaAorKysgYi9pbmNsdWRlL3dpbnJlZy5oCkBAIC01MywxMSArNTMsMTIgQEAKICNkZWZpbmUgSEtFWV9DVVJSRU5UX0NPTkZJRwkweDgwMDAwMDA1CiAjZGVmaW5lIEhLRVlfRFlOX0RBVEEJCTB4ODAwMDAwMDYKIAotI2RlZmluZQlSRUdfT1BUSU9OX1JFU0VSVkVECTB4MDAwMDAwMDAKLSNkZWZpbmUJUkVHX09QVElPTl9OT05fVk9MQVRJTEUJMHgwMDAwMDAwMAotI2RlZmluZQlSRUdfT1BUSU9OX1ZPTEFUSUxFCTB4MDAwMDAwMDEKLSNkZWZpbmUJUkVHX09QVElPTl9DUkVBVEVfTElOSwkweDAwMDAwMDAyCi0jZGVmaW5lIFJFR19PUFRJT05fVEFJTlRFRAkweDgwMDAwMDAwCisjZGVmaW5lCVJFR19PUFRJT05fUkVTRVJWRUQJCTB4MDAwMDAwMDAKKyNkZWZpbmUJUkVHX09QVElPTl9OT05fVk9MQVRJTEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUJUkVHX09QVElPTl9WT0xBVElMRQkJMHgwMDAwMDAwMQorI2RlZmluZQlSRUdfT1BUSU9OX0NSRUFURV9MSU5LCQkweDAwMDAwMDAyCisjZGVmaW5lCVJFR19PUFRJT05fQkFDS1VQX1JFU1RPUkUJMHgwMDAwMDAwNCAvKiBGSVhNRSAqLworI2RlZmluZQlSRUdfT1BUSU9OX1RBSU5URUQJCTB4ODAwMDAwMDAgLyogSW50ZXJuYWw/ICovCiAKICNkZWZpbmUgUkVHX0NSRUFURURfTkVXX0tFWQkweDAwMDAwMDAxCiAjZGVmaW5lIFJFR19PUEVORURfRVhJU1RJTkdfS0VZCTB4MDAwMDAwMDIKZGlmZiAtLWdpdCBhL2xpYnRlc3QvTWFrZWZpbGUuaW4gYi9saWJ0ZXN0L01ha2VmaWxlLmluCmluZGV4IDAzOWM2ZjkuLmIzOThiMTUgMTAwNjQ0Ci0tLSBhL2xpYnRlc3QvTWFrZWZpbGUuaW4KKysrIGIvbGlidGVzdC9NYWtlZmlsZS5pbgpAQCAtMjAsMTMgKzIwLDEzIEBACiBSQ19TUkNTID0gXAogCWhlbGxvM3Jlcy5yYwogCi1hbGw6IGNoZWNrX3dpbmVyYyAkKFBST0dSQU1TKQorYWxsOiBjaGVja193cmMgJChQUk9HUkFNUykKIAogZGVwZW5kOjogJChSQ19TUkNTOi5yYz0uaCkKIAogQE1BS0VfUlVMRVNACiAKLSQoUkNfU1JDUzoucmM9LmMpICQoUkNfU1JDUzoucmM9LmgpOiAkKFdJTkVSQykKKyQoUkNfU1JDUzoucmM9LnMpOiAkKFdSQykKIAogZXhwYW5kOiBleHBhbmQubwogCSQoQ0MpIC1vIGV4cGFuZCBleHBhbmQubyAkKExET1BUSU9OUykgJChBTExfTElCUykKZGlmZiAtLWdpdCBhL2xpYnRlc3QvaGVsbG8zcmVzLnJjIGIvbGlidGVzdC9oZWxsbzNyZXMucmMKaW5kZXggMDIwZTU3NC4uZTY2YzVhMSAxMDA2NDQKLS0tIGEvbGlidGVzdC9oZWxsbzNyZXMucmMKKysrIGIvbGlidGVzdC9oZWxsbzNyZXMucmMKQEAgLTEsMyArMSw1IEBACisjaW5jbHVkZSAid2luZG93cy5oIgorCiBNQUlOIE1FTlUgCiB7CiAgUE9QVVAgIk1lbnUgZGVtbyIgewpAQCAtNyw3ICs5LDcgQEAKICB9CiB9CiAKLUJJVERFTU8gQklUTUFQICIuLi9yYy93aW5lbG9nby5ibXAiCisvKkJJVERFTU8gQklUTUFQICIuLi9yYy93aW5lbG9nby5ibXAiKi8KIAogRElBREVNTyBESUFMT0cgMjAsIDIwLCAxNzksIDExOAogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19TWVNNRU5VCkBAIC0yMCw5ICsyMiw2IEBACiAJQ09OVFJPTCAiRWRpdCBjb250cm9sIiwgMTAzLCAiRURJVCIsIEVTX0xFRlQgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QLCAxOCwgNDEsIDQ0LCAxMwogCUNPTlRST0wgIlJhZGlvIGJ1dHRvbiIsIDEwNCwgIkJVVFRPTiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSwgMTcsIDIzLCA1OCwgMTIKIAlDT05UUk9MICJDaGVja2JveCIsIDEwMSwgIkJVVFRPTiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AsIDE5LCA3NiwgNDcsIDEyCi0jaWYgMQogCUNPTlRST0wgIiIsIDEwNiwgIkNPTUJPQk9YIiwgQ0JTX0RST1BET1dOIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUCwgODYsIDIzLCA4NiwgODUKLSNlbHNlCi0JQ09OVFJPTCAiIiwgMTA2LCAiTElTVEJPWCIsIExCU19TVEFOREFSRCB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QLCA4NiwgMjMsIDg2LCA4NQotI2VuZGlmCisvKglDT05UUk9MICIiLCAxMDYsICJMSVNUQk9YIiwgTEJTX1NUQU5EQVJEIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AsIDg2LCAyMywgODYsIDg1ICovCiBFTkQKZGlmZiAtLWdpdCBhL2xvYWRlci9tb2R1bGUuYyBiL2xvYWRlci9tb2R1bGUuYwppbmRleCBjMDRlMmIyLi43YjdmZjY1IDEwMDY0NAotLS0gYS9sb2FkZXIvbW9kdWxlLmMKKysrIGIvbG9hZGVyL21vZHVsZS5jCkBAIC0xNzMsNyArMTczLDcgQEAKICAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzE2KVByaW50U2V0dXBEbGdQcm9jOwogICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCJSZXBsYWNlVGV4dERsZ1Byb2MiKSkKICAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzE2KVJlcGxhY2VUZXh0RGxnUHJvYzE2OwotICAgICAgICBXQVJOKG1vZHVsZSwiTm8gbWFwcGluZyBmb3IgJXMoKSwgYWRkIG9uZSBpbiBsaWJyYXJ5L21pc2NzdHVicy5jXG4iLG5hbWUpOworICAgICAgICBGSVhNRShtb2R1bGUsIk5vIG1hcHBpbmcgZm9yICVzKCksIGFkZCBvbmUgaW4gbGlicmFyeS9taXNjc3R1YnMuY1xuIixuYW1lKTsKICAgICAgICAgYXNzZXJ0KCBGQUxTRSApOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC00OTYsNyArNDk2LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBGcmVlTGlicmFyeTMyKEhJTlNUQU5DRTMyIGhMaWJNb2R1bGUpCiB7Ci0gICAgV0FSTihtb2R1bGUsIiglMDh4KTogc3R1YlxuIiwgaExpYk1vZHVsZSk7CisgICAgRklYTUUobW9kdWxlLCIoJTA4eCk6IHN0dWJcbiIsIGhMaWJNb2R1bGUpOwogICAgIHJldHVybiBUUlVFOyAgLyogRklYTUUgKi8KIH0KIApkaWZmIC0tZ2l0IGEvbG9hZGVyL25lL21vZHVsZS5jIGIvbG9hZGVyL25lL21vZHVsZS5jCmluZGV4IDg5M2M4MzQuLmU5YjY0NWMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZS9tb2R1bGUuYworKysgYi9sb2FkZXIvbmUvbW9kdWxlLmMKQEAgLTM5NSw4ICszOTUsNyBAQAogICAgIG5hbWUgPSBORV9NT0RVTEVfTkFNRSggcE1vZHVsZSApOwogICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIG5hbWUsIFRSVUUsICZmdWxsX25hbWUgKSB8fAogICAgICAgICAoY2FjaGVkZmQgPSBvcGVuKCBmdWxsX25hbWUubG9uZ19uYW1lLCBPX1JET05MWSApKSA9PSAtMSkKLSAgICAgICAgV0FSTiggbW9kdWxlLCAiQ2FuJ3Qgb3BlbiBmaWxlICclcycgZm9yIG1vZHVsZSAlMDR4XG4iLAotICAgICAgICAgICAgICBuYW1lLCBwTW9kdWxlLT5zZWxmICk7CisgICAgICAgIE1TRyggIkNhbid0IG9wZW4gZmlsZSAnJXMnIGZvciBtb2R1bGUgJTA0eFxuIiwgbmFtZSwgcE1vZHVsZS0+c2VsZiApOwogICAgIFRSQUNFKG1vZHVsZSwgIm9wZW5lZCAnJXMnIC0+ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBuYW1lLCBjYWNoZWRmZCApOwogICAgIHJldHVybiBjYWNoZWRmZDsKQEAgLTY5NSw5ICs2OTQsOSBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBjbGVhbnVwIHdoYXQgd2FzIGRvbmUgKi8KIAotICAgICAgICAgICAgICAgV0FSTiggbW9kdWxlLCAiQ291bGQgbm90IGxvYWQgJyVzJyByZXF1aXJlZCBieSAnJS4qcycsIGVycm9yPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgKigoQllURSopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUgKyAxLCBoRExMICk7CisgICAgICAgICAgICAgICAgTVNHKCAiQ291bGQgbm90IGxvYWQgJyVzJyByZXF1aXJlZCBieSAnJS4qcycsIGVycm9yPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCAqKChCWVRFKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSwgaERMTCApOwogICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwTW9kUmVmID0gR2V0RXhlUHRyKCBoRExMICk7CkBAIC03NTEsNyArNzUwLDggQEAKICAgICAgICAgLyogTm93IHRyeSB0aGUgYnVpbHQtaW4gZXZlbiBpZiBkaXNhYmxlZCAqLwogICAgICAgICBpZiAoKGhNb2R1bGUgPSBmbkJVSUxUSU5fTG9hZE1vZHVsZSggbmFtZSwgVFJVRSApKSkKICAgICAgICAgewotICAgICAgICAgICAgV0FSTihtb2R1bGUsICJDb3VsZCBub3QgbG9hZCBXaW5kb3dzIERMTCAnJXMnLCB1c2luZyBidWlsdC1pbiBtb2R1bGUuXG4iLCBuYW1lICk7CisgICAgICAgICAgICBNU0coICJDb3VsZCBub3QgbG9hZCBXaW5kb3dzIERMTCAnJXMnLCB1c2luZyBidWlsdC1pbiBtb2R1bGUuXG4iLAorICAgICAgICAgICAgICAgICBuYW1lICk7CiAgICAgICAgICAgICByZXR1cm4gaE1vZHVsZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMjsgIC8qIEZpbGUgbm90IGZvdW5kICovCmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfaW1hZ2UuYyBiL2xvYWRlci9wZV9pbWFnZS5jCmluZGV4IGVmNjczNGEuLmFhZjJkZWMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9pbWFnZS5jCisrKyBiL2xvYWRlci9wZV9pbWFnZS5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCiAjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInNub29wLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogc3RhdGljIHZvaWQgUEVfSW5pdERMTChXSU5FX01PRFJFRiAqd20sIERXT1JEIHR5cGUsIExQVk9JRCBscFJlc2VydmVkKTsKQEAgLTE2MiwxNCArMTYzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciA9IGZ1bmN0aW9uWypvcmRpbmFsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZHIpIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYWRkciA8IHJ2YV9zdGFydCkgfHwgKGFkZHIgPj0gcnZhX2VuZCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzMyKVJWQShhZGRyKTsKKwkJCQlyZXR1cm4gU05PT1BfR2V0UHJvY0FkZHJlc3MzMih3bS0+bW9kdWxlLGVuYW1lLCpvcmRpbmFsLChGQVJQUk9DMzIpUlZBKGFkZHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkID0gKGNoYXIgKilSVkEoYWRkcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAJCQl9CiAJCQlvcmRpbmFsKys7CiAJCQluYW1lKys7CiAJCX0KLQl9IGVsc2UgeworCX0gZWxzZSAJeworCQlpbnQgaTsKIAkJaWYgKExPV09SRChmdW5jTmFtZSktZXhwb3J0cy0+QmFzZSA+IGV4cG9ydHMtPk51bWJlck9mRnVuY3Rpb25zKSB7CiAJCQlUUkFDRSh3aW4zMiwiCW9yZGluYWwgJWQgb3V0IG9mIHJhbmdlIVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XT1JEKGZ1bmNOYW1lKSk7CkBAIC0xNzcsOCArMTc5LDIwIEBACiAJCX0KIAkJYWRkciA9IGZ1bmN0aW9uWyhpbnQpZnVuY05hbWUtZXhwb3J0cy0+QmFzZV07CiAgICAgICAgICAgICAgICAgaWYgKCFhZGRyKSByZXR1cm4gTlVMTDsKKwkJZW5hbWUgPSAiIjsKKwkJaWYgKG5hbWUpIHsKKwkJICAgIGZvciAoaT0wO2k8ZXhwb3J0cy0+TnVtYmVyT2ZOYW1lcztpKyspIHsKKwkJCSAgICBlbmFtZSA9IChjaGFyKilSVkEoKm5hbWUpOworCQkJICAgIGlmICgqb3JkaW5hbCA9PSBMT1dPUkQoZnVuY05hbWUpLWV4cG9ydHMtPkJhc2UpCisJCQkgICAgCWJyZWFrOworCQkJICAgIG9yZGluYWwrKzsKKwkJCSAgICBuYW1lKys7CisJCSAgICB9CisJCSAgICBpZiAoaT09ZXhwb3J0cy0+TnVtYmVyT2ZOYW1lcykKKwkJICAgIAllbmFtZSA9ICIiOworCQl9CiAJCWlmICgoYWRkciA8IHJ2YV9zdGFydCkgfHwgKGFkZHIgPj0gcnZhX2VuZCkpCi0JCQlyZXR1cm4gKEZBUlBST0MzMilSVkEoYWRkcik7CisJCQlyZXR1cm4gU05PT1BfR2V0UHJvY0FkZHJlc3MzMih3bS0+bW9kdWxlLGVuYW1lLChEV09SRClmdW5jTmFtZS1leHBvcnRzLT5CYXNlLChGQVJQUk9DMzIpUlZBKGFkZHIpKTsKIAkJZm9yd2FyZCA9IChjaGFyICopUlZBKGFkZHIpOwogCX0KIAlpZiAoZm9yd2FyZCkKQEAgLTU4NCw2ICs1OTgsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgKihJTUFHRV9ET1NfSEVBREVSICopbG9hZF9hZGRyID0gKmRvc19oZWFkZXI7CiAgICAgICAgICooSU1BR0VfTlRfSEVBREVSUyAqKShsb2FkX2FkZHIgKyBkb3NfaGVhZGVyLT5lX2xmYW5ldykgPSAqbnRfaGVhZGVyOworCW1lbWNweShQRV9TRUNUSU9OUyhsb2FkX2FkZHIpLFBFX1NFQ1RJT05TKGhNb2R1bGUpLHNpemVvZihJTUFHRV9TRUNUSU9OX0hFQURFUikqbnRfaGVhZGVyLT5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnMpOwogCiAgICAgICAgIHBlX3NlZyA9IFBFX1NFQ1RJT05TKGhNb2R1bGUpOwogCWZvciAoaSA9IDA7IGkgPCBudF9oZWFkZXItPkZpbGVIZWFkZXIuTnVtYmVyT2ZTZWN0aW9uczsgaSsrLCBwZV9zZWcrKykKQEAgLTY4MSwxMSArNjk2LDExIEBACiAKIAlpZihudF9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnkKIAkJW0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9CT1VORF9JTVBPUlRdLlNpemUpCi0JCUZJWE1FKHdpbjMyLCJCb3VuZCBJbXBvcnQgZGlyZWN0b3J5IGlnbm9yZWRcbiIpOworCQlUUkFDRSh3aW4zMiwiQm91bmQgSW1wb3J0IGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKIAogCWlmKG50X2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQogCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0lBVF0uU2l6ZSkKLQkJRklYTUUod2luMzIsIkltcG9ydCBBZGRyZXNzIFRhYmxlIGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKKwkJVFJBQ0Uod2luMzIsIkltcG9ydCBBZGRyZXNzIFRhYmxlIGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKIAlpZihudF9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbMTNdLlNpemUpCiAJCUZJWE1FKHdpbjMyLCJVbmtub3duIGRpcmVjdG9yeSAxMyBpZ25vcmVkXG4iKTsKIAlpZihudF9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbMTRdLlNpemUpCkBAIC03NjksNyArNzg0LDcgQEAKIAkJICAgIFdBUk4oIG1vZHVsZSwgIkNvdWxkIG5vdCBsb2FkIGV4dGVybmFsIERMTCAnJXMnLCB1c2luZyBidWlsdC1pbiBtb2R1bGUuXG4iLCBuYW1lICk7CiAJCSAgICByZXR1cm4gaE1vZHVsZTsKIAkJfQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CiAJfQogCS8qIHdpbGwgZ28gYXdheSAuLi4gKi8KIAlpZiAoKGhNb2R1bGUgPSBNT0RVTEVfQ3JlYXRlRHVtbXlNb2R1bGUoICZvZnMgKSkgPCAzMikgewpAQCAtNzk1LDcgKzgxMCw3IEBACiAJICAgIEZyZWVMaWJyYXJ5MTYoIGhNb2R1bGUpOwogCSAgICBIZWFwRnJlZShwcm9jZXNzLT5oZWFwLDAsd20pOwogCSAgICBFUlIod2luMzIsImNhbid0IGxvYWQgJXNcbiIsb2ZzLnN6UGF0aE5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIDIxOyAvKiBGSVhNRTogcHJvYmFibHkgMCAqLworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KIAogCS8qIChwb3NzaWJsZSkgcmVjdXJzaW9uICovCkBAIC04MTUsNiArODMwLDggQEAKIAkgICAgcmV0dXJuIDA7CiAJfQogICAgICAgICBwTW9kdWxlLT5tb2R1bGUzMiA9IHdtLT5tb2R1bGU7CisJaWYgKHdtLT5iaW5mbXQucGUucGVfZXhwb3J0KQorCQlTTk9PUF9SZWdpc3RlckRMTCh3bS0+bW9kdWxlLHdtLT5tb2RuYW1lLHdtLT5iaW5mbXQucGUucGVfZXhwb3J0LT5OdW1iZXJPZkZ1bmN0aW9ucyk7CiAJcmV0dXJuIHdtLT5tb2R1bGU7CiB9CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9yZXNvdXJjZS5jIGIvbG9hZGVyL3Jlc291cmNlLmMKaW5kZXggZTRiMmEyYS4uNGYwZDI4ZCAxMDA2NDQKLS0tIGEvbG9hZGVyL3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL3Jlc291cmNlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImxpYnJlcy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAiZGVidWdzdHIuaCIKIAogZXh0ZXJuIFdPUkQgV0lORV9MYW5ndWFnZUlkOwogCkBAIC02OSwxMCArNzAsMTEgQEAKICAgICBXSU5FX01PRFJFRgkqd20gPSBNT0RVTEUzMl9Mb29rdXBITU9EVUxFKFBST0NFU1NfQ3VycmVudCgpLGhNb2R1bGUpOwogICAgIEhSU1JDMzIJaHJzcmM7CiAKLSAgICBUUkFDRShyZXNvdXJjZSwgIm1vZHVsZT0lMDh4ICIKLQkJICAgICAidHlwZT0lcyVwIG5hbWU9JXMlcFxuIiwgd20tPm1vZHVsZSwKLQkJICAgICAoSElXT1JEKHR5cGUpKT8gIiIgOiAiIyIsIHR5cGUsCi0JCSAgICAgKEhJV09SRChuYW1lKSk/ICIiIDogIiMiLCBuYW1lKTsKKyAgICBUUkFDRShyZXNvdXJjZSwgIm1vZHVsZT0lMDh4IHR5cGU9JXMgbmFtZT0lc1xuIiwKKwkgIGhNb2R1bGUsCisJICBkZWJ1Z3Jlc193ICh0eXBlKSwKKwkgIGRlYnVncmVzX3cgKG5hbWUpKTsKKwogICAgIGlmIChfX3dpbmVsaWIpIHsKICAgICAJaHJzcmMgPSBMSUJSRVNfRmluZFJlc291cmNlKCBoTW9kdWxlLCBuYW1lLCB0eXBlICk7CiAJaWYgKGhyc3JjKQpAQCAtMzQ2LDcgKzM0OCw3IEBACiAJCQkgICAgICAgY0VudHJpZXMgKiBzaXplb2YoQUNDRUwzMikpOwogICBUUkFDRShhY2NlbCwgImhhbmRsZSAlcFxuIiwgKExQVk9JRCloQWNjZWwpOwogICBpZighaEFjY2VsKSB7Ci0gICAgV0FSTihhY2NlbCwgIk91dCBvZiBtZW1vcnkuXG4iKTsKKyAgICBFUlIoYWNjZWwsICJPdXQgb2YgbWVtb3J5LlxuIik7CiAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICByZXR1cm4gKEhBQ0NFTDMyKU5VTEw7CiAgIH0KQEAgLTM4OSwxMyArMzkxLDE1IEBACiAgICAgIGZyb20gTG9hZEFjY2VsZXJhdG9ycygpLiBXVEg/ICovCiAgIAogICAvKiBQYXJhbWV0ZXIgY2hlY2tpbmcgdG8gYXZvaWQgYW55IGVtYmFyYXNzaW5nIHNpdHVhdGlvbnMuICovCi0vKiAgIGlmKCFoYW5kbGUpIHsgKi8KLS8qICAgICBXQVJOKGFjY2VsLCAiQXBwbGljYXRpb24gc2VudCBOVUxMIHB0ci5cbiIpOyAqLwotLyogICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7ICovCi0vKiAgICAgcmV0dXJuIEZBTFNFOyAqLwotLyogICB9ICovCisjaWYgMAorICAgICBpZighaGFuZGxlKSB7CisgICAgICAgV0FSTihhY2NlbCwgIkFwcGxpY2F0aW9uIHNlbnQgTlVMTCBwdHIuXG4iKTsKKyAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOworICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgfQogICAKLS8qICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQQUNDRUwzMiloYW5kbGUpOyAqLworICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBBQ0NFTDMyKWhhbmRsZSk7CisjZW5kaWYKIAogICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL21lbW9yeS9sZHQuYyBiL21lbW9yeS9sZHQuYwppbmRleCAxNDQxOTA3Li5jZGJlN2YzIDEwMDY0NAotLS0gYS9tZW1vcnkvbGR0LmMKKysrIGIvbWVtb3J5L2xkdC5jCkBAIC0yODUsMTAgKzI4NSw5IEBACiAgICAgICAgICAgICBmbGFnc1sxXSA9IChsZHRfZmxhZ3NfY29weVtpXSAmIExEVF9GTEFHU19SRUFET05MWSkgPyAnLScgOiAndyc7CiAgICAgICAgICAgICBmbGFnc1syXSA9ICctJzsKICAgICAgICAgfQotICAgICAgICBUUkFDRShsZHQsIiUwNHg6IHNlbD0lMDR4IGJhc2U9JTA4bHggbGltaXQ9JTA4bHggJWQtYml0ICVjJWMlY1xuIiwKLSAgICAgICAgICAgICAgICBpLCBFTlRSWV9UT19TRUxFQ1RPUihpKSwKLSAgICAgICAgICAgICAgICBsZHRfY29weVtpXS5iYXNlLCBsZHRfY29weVtpXS5saW1pdCwKLSAgICAgICAgICAgICAgICBsZHRfZmxhZ3NfY29weVtpXSAmIExEVF9GTEFHU18zMkJJVCA/IDMyIDogMTYsCi0gICAgICAgICAgICAgICAgZmxhZ3NbMF0sIGZsYWdzWzFdLCBmbGFnc1syXSApOworICAgICAgICBNU0coIiUwNHg6IHNlbD0lMDR4IGJhc2U9JTA4bHggbGltaXQ9JTA4bHggJWQtYml0ICVjJWMlY1xuIiwKKyAgICAgICAgICAgIGksIEVOVFJZX1RPX1NFTEVDVE9SKGkpLCBsZHRfY29weVtpXS5iYXNlLCBsZHRfY29weVtpXS5saW1pdCwKKyAgICAgICAgICAgIGxkdF9mbGFnc19jb3B5W2ldICYgTERUX0ZMQUdTXzMyQklUID8gMzIgOiAxNiwKKyAgICAgICAgICAgIGZsYWdzWzBdLCBmbGFnc1sxXSwgZmxhZ3NbMl0gKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZW1vcnkvc3RyaW5nLmMgYi9tZW1vcnkvc3RyaW5nLmMKaW5kZXggOTJkMWE4OC4uMjYyNjY3ZiAxMDA2NDQKLS0tIGEvbWVtb3J5L3N0cmluZy5jCisrKyBiL21lbW9yeS9zdHJpbmcuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ3aW5ubHMuaCIKIAogc3RhdGljIGNvbnN0IEJZVEUgU1RSSU5HX09lbTJBbnNpWzI1Nl0gPQogIlwwMDBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwyNDQiCkBAIC0xNDQsNyArMTQ1LDcgQEAKICAqLwogSU5UMTYgV0lOQVBJIGxzdHJjbXAxNiggTFBDU1RSIHN0cjEsIExQQ1NUUiBzdHIyICkKIHsKLSAgICByZXR1cm4gKElOVDE2KWxzdHJjbXAzMkEoIHN0cjEsIHN0cjIgKTsKKyAgICByZXR1cm4gKElOVDE2KXN0cmNtcCggc3RyMSwgc3RyMiApOwogfQogCiAKQEAgLTE1MywxOSArMTU0LDE0IEBACiAgKi8KIElOVDMyIFdJTkFQSSBsc3RyY21wMzJBKCBMUENTVFIgc3RyMSwgTFBDU1RSIHN0cjIgKQogewotICAgIFRSQUNFKHN0cmluZywiJXMgYW5kICVzXG4iLAotCQkgICBkZWJ1Z3N0cl9hIChzdHIxKSwgZGVidWdzdHJfYSAoc3RyMikpOwotICAgIC8qIFdpbjk1IEtFUk5FTDMyLkRMTCBkb2VzIGl0IHRoYXQgd2F5LiBIYW5kcyBvZmYhICovCi0gICAgaWYgKCFzdHIxIHx8ICFzdHIyKSB7Ci0gICAgCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAoSU5UMzIpc3RyY21wKCBzdHIxLCBzdHIyICk7CisgICAgcmV0dXJuIENvbXBhcmVTdHJpbmczMkEoTE9DQUxFX1NZU1RFTV9ERUZBVUxULDAsc3RyMSwtMSxzdHIyLC0xKSAtIDIgOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIGxzdHJjbXAzMlcgICAoS0VSTkVMLjYwMykKKyAqIEZJWE1FIDogc2hvdWxkIGNhbGwgQ29tcGFyZVN0cmluZzMyVywgd2hlbiBpdCBpcyBpbXBsZW1lbnRlZC4KKyAqICAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90ICJ3b3JkIHNvcnQiLCBhcyBpdCBzaG91bGQuCiAgKi8KIElOVDMyIFdJTkFQSSBsc3RyY21wMzJXKCBMUENXU1RSIHN0cjEsIExQQ1dTVFIgc3RyMiApCiB7CkBAIC0xOTgsMTcgKzE5NCw3IEBACiAKICAgICBUUkFDRShzdHJpbmcsInN0cmNtcGkgJXMgYW5kICVzXG4iLAogCQkgICBkZWJ1Z3N0cl9hIChzdHIxKSwgZGVidWdzdHJfYSAoc3RyMikpOwotICAgIGlmICghc3RyMSB8fCAhc3RyMikgewotICAgIAlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwotCXJldHVybiAwOwotICAgIH0KLSAgICB3aGlsZSAoKnN0cjEpCi0gICAgewotICAgICAgICBpZiAoKHJlcyA9IHRvdXBwZXIoKnN0cjEpIC0gdG91cHBlcigqc3RyMikpICE9IDApIHJldHVybiByZXM7Ci0gICAgICAgIHN0cjErKzsKLSAgICAgICAgc3RyMisrOwotICAgIH0KLSAgICByZXR1cm4gdG91cHBlcigqc3RyMSkgLSB0b3VwcGVyKCpzdHIyKTsKKyAgICByZXR1cm4gQ29tcGFyZVN0cmluZzMyQShMT0NBTEVfU1lTVEVNX0RFRkFVTFQsTk9STV9JR05PUkVDQVNFLHN0cjEsLTEsc3RyMiwtMSktMjsKIH0KIAogCmRpZmYgLS1naXQgYS9taXNjL01ha2VmaWxlLmluIGIvbWlzYy9NYWtlZmlsZS5pbgppbmRleCBlZTdmNWM1Li40MjBkOWUyIDEwMDY0NAotLS0gYS9taXNjL01ha2VmaWxlLmluCisrKyBiL21pc2MvTWFrZWZpbGUuaW4KQEAgLTMwLDYgKzMwLDcgQEAKIAlzcHkuYyBcCiAJc3RyZXNzLmMgXAogCXN5c3RlbS5jIFwKKwl0YXBpMzIuYyBcCiAJdG9vbGhlbHAuYyBcCiAJdHdlYWsuYyBcCiAJdmVyLmMgXApkaWZmIC0tZ2l0IGEvbWlzYy9hc3BpLmMgYi9taXNjL2FzcGkuYwppbmRleCA1MWUxMWIwLi5hYWQ3ZjA1IDEwMDY0NAotLS0gYS9taXNjL2FzcGkuYworKysgYi9taXNjL2FzcGkuYwpAQCAtMTIsNiArMTIsOSBAQAogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJzZWxlY3RvcnMuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJtaXNjZW11LmgiCiAKIAogLyogRklYTUUhCkBAIC05NSw2ICs5OCw4IEBACiB0eXBlZGVmIHN0cnVjdCBBU1BJX0RFVklDRV9JTkZPIEFTUElfREVWSUNFX0lORk87CiBzdGF0aWMgQVNQSV9ERVZJQ0VfSU5GTyAqQVNQSV9vcGVuX2RldmljZXMgPSBOVUxMOwogCitzdGF0aWMgQk9PTDE2IERPU0FTUEkgPSBGQUxTRTsKKwogI2lmZGVmIGxpbnV4CiBzdGF0aWMgaW50CiBBU1BJX09wZW5EZXZpY2UxNihTUkJfRXhlY1NDU0lDbWQxNiAqcHJiKQpAQCAtMTU3LDcgKzE2MiwxMCBAQAogICBCWVRFICpscEJ1ZjsKICAgZGJnX2RlY2xfc3RyKGFzcGksIDUxMik7CiAKLSAgbHBCdWYgPSBQVFJfU0VHX1RPX0xJTihwcmItPlNSQl9CdWZQb2ludGVyKTsKKyAgaWYgKChET1NBU1BJKSAmJiAocHJiLT5TUkJfQnVmUG9pbnRlcikpIC8qIHRyYW5zbGF0ZSByZWFsIG1vZGUgYWRkcmVzcyAqLworICAgIGxwQnVmID0gKEJZVEUgKilET1NNRU1fTWFwUmVhbFRvTGluZWFyKChVSU5UMzIpcHJiLT5TUkJfQnVmUG9pbnRlcik7CisgIGVsc2UKKyAgICBscEJ1ZiA9IFBUUl9TRUdfVE9fTElOKHByYi0+U1JCX0J1ZlBvaW50ZXIpOwogCiAgIHN3aXRjaCAocHJiLT5DREJCeXRlWzBdKSB7CiAgIGNhc2UgQ01EX0lOUVVJUlk6CkBAIC0yMjksNyArMjM3LDEwIEBACiB7CiAgIEJZVEUgKmxwQnVmOwogCi0gIGxwQnVmID0gUFRSX1NFR19UT19MSU4ocHJiLT5TUkJfQnVmUG9pbnRlcik7CisgIGlmICgoRE9TQVNQSSkgJiYgKHByYi0+U1JCX0J1ZlBvaW50ZXIpKSAvKiB0cmFuc2xhdGUgcmVhbCBtb2RlIGFkZHJlc3MgKi8KKyAgICBscEJ1ZiA9IChCWVRFICopRE9TTUVNX01hcFJlYWxUb0xpbmVhcigoVUlOVDMyKXByYi0+U1JCX0J1ZlBvaW50ZXIpOworICBlbHNlCisgICAgbHBCdWYgPSBQVFJfU0VHX1RPX0xJTihwcmItPlNSQl9CdWZQb2ludGVyKTsKIAogICBzd2l0Y2ggKHByYi0+Q0RCQnl0ZVswXSkgewogICBjYXNlIENNRF9JTlFVSVJZOgpAQCAtMjU1LDYgKzI2Niw3IEBACiAKICAgZmQgPSBBU1BJX09wZW5EZXZpY2UxNihwcmIpOwogICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgIFdBUk4oYXNwaSwgIkFTUElfRXhlY1Njc2lDbWQxNiBmYWlsZWQ6IGNvdWxkIG5vdCBvcGVuIGRldmljZS5cbiIpOwogICAgICAgcHJiLT5TUkJfU3RhdHVzID0gU1NfRVJSOwogICAgICAgcmV0dXJuIFNTX0VSUjsKICAgfQpAQCAtMjYzLDkgKzI3NSwxMyBAQAogICBzZ19yZXBseV9oZHIgPSBOVUxMOwogCiAgIHByYi0+U1JCX1N0YXR1cyA9IFNTX1BFTkRJTkc7Ci0gIGxwQnVmID0gUFRSX1NFR19UT19MSU4ocHJiLT5TUkJfQnVmUG9pbnRlcik7CisgIGlmICgoRE9TQVNQSSkgJiYgKHByYi0+U1JCX0J1ZlBvaW50ZXIpKSAvKiB0cmFuc2xhdGUgcmVhbCBtb2RlIGFkZHJlc3MgKi8KKyAgICBscEJ1ZiA9IChCWVRFICopRE9TTUVNX01hcFJlYWxUb0xpbmVhcigoVUlOVDMyKXByYi0+U1JCX0J1ZlBvaW50ZXIpOworICBlbHNlCisgICAgbHBCdWYgPSBQVFJfU0VHX1RPX0xJTihwcmItPlNSQl9CdWZQb2ludGVyKTsKIAogICBpZiAoIXByYi0+U1JCX0NEQkxlbikgeworICAgICAgV0FSTihhc3BpLCAiQVNQSV9FeGVjU2NzaUNtZDE2IGZhaWxlZDogcHJiLT5TUkJfQ0RCTGVuID0gMC5cbiIpOwogICAgICAgcHJiLT5TUkJfU3RhdHVzID0gU1NfRVJSOwogICAgICAgcmV0dXJuIFNTX0VSUjsKICAgfQpAQCAtNDA2LDcgKzQyMiwxNCBAQAogCiAgIHN3aXRjaCAobHBTUkItPmNvbW1vbi5TUkJfY21kKSB7CiAgIGNhc2UgU0NfSEFfSU5RVUlSWToKLSAgICBGSVhNRShhc3BpLCAiTm90IGltcGxlbWVudGVkIFNDX0hBX0lOUVVJUllcbiIpOworICAgIGxwU1JCLT5pbnF1aXJ5LlNSQl9TdGF0dXMgPSAweDE7ICAgICAgICAgICAvKiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgbHBTUkItPmlucXVpcnkuU1JCX0hhSWQgPSAxOyAgICAgICAgICAgICAgIC8qIGJvZ3VzIHZhbHVlICovCisgICAgbHBTUkItPmlucXVpcnkuSEFfQ291bnQgPSAxOyAgICAgICAgICAgICAgIC8qIG5vdCBhbHdheXMgKi8KKyAgICBscFNSQi0+aW5xdWlyeS5IQV9TQ1NJX0lEID0gNzsgICAgICAgICAgICAgLyogbm90IGFsd2F5cyBJRCA3ICovCisgICAgc3RyY2F0KGxwU1JCLT5pbnF1aXJ5LkhBX01hbmFnZXJJZCwgIldpbmUgQVNQSSIpOyAvKiBtYXggMTUgY2hhcnMgKi8KKyAgICBscFNSQi0+aW5xdWlyeS5TUkJfNTVBQVNpZ25hdHVyZSA9IDB4NTVhYTsgLyogY29ycmVjdCA/Pz8gKi8KKyAgICBscFNSQi0+aW5xdWlyeS5TUkJfRXh0QnVmZmVyU2l6ZSA9IDB4MjAwMDsgLyogYm9ndXMgdmFsdWUgKi8KKyAgICBGSVhNRShhc3BpLCAiQVNQSTogUGFydGlhbGx5IGltcGxlbWVudGVkIFNDX0hBX0lOUVVJUllcbiIpOwogICAgIGJyZWFrOwogICBjYXNlIFNDX0dFVF9ERVZfVFlQRToKICAgICBGSVhNRShhc3BpLCAiTm90IGltcGxlbWVudGVkIFNDX0dFVF9ERVZfVFlQRVxuIik7CkBAIC00MzgsMyArNDYxLDM5IEBACiAJcmV0dXJuIChEV09SRCkwOwogI2VuZGlmCiB9CisKKwordm9pZCBXSU5BUEkgQVNQSV9ET1NfZnVuYyhEV09SRCBzcmIpCit7CisgICAgICAgTFBTUkIxNiBscFNSQiA9IChMUFNSQjE2KURPU01FTV9NYXBSZWFsVG9MaW5lYXIoc3JiKTsKKyAgICAgICBTRUdQVFIgc3BTUkIgPSBNYXBMUyhscFNSQik7CisKKyAgICAgICBUUkFDRShhc3BpLCAiRE9TQVNQSTogZnVuY3Rpb24gIyVkXG4iLCBscFNSQi0+Y29tbW9uLlNSQl9jbWQpOworICAgICAgIERPU0FTUEkgPSBUUlVFOworICAgICAgIFNlbmRBU1BJQ29tbWFuZDE2KHNwU1JCKTsKKyAgICAgICBET1NBU1BJID0gRkFMU0U7CisgICAgICAgVW5NYXBMUyhzcFNSQik7Cit9CisKK3ZvaWQgQVNQSV9ET1NfSGFuZGxlSW50KENPTlRFWFQgKmNvbnRleHQpCisvKiByZXR1cm5zIGEgcmVhbCBtb2RlIGNhbGwgYWRkcmVzcyB0byBBU1BJX0RPU19mdW5jKCkgKi8KK3sKKyNpZmRlZiBsaW51eAorICAgICAgIEZBUlBST0MxNiBET1NfZnVuYzsKKyAgICAgICBEV09SRCBkb3M7CisgICAgICAgTFBCWVRFIGRvc3B0cjsKKworICAgICAgIERPU19mdW5jID0gTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCJBU1BJX0RPU19mdW5jIik7CisgICAgICAgZG9zID0gR2xvYmFsRE9TQWxsb2MoNSk7CisgICAgICAgZG9zcHRyID0gKEJZVEUgKilQVFJfU0VHX09GRl9UT19MSU4oTE9XT1JEKGRvcyksIDApOworICAgICAgICpkb3NwdHIrKyA9IDB4ZWE7IC8qIGxqbXAgKi8KKyAgICAgICAqKEZBUlBST0MxNiAqKWRvc3B0ciA9IERPU19mdW5jOworCisgICAgICAgKihEV09SRCAqKVBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkKKyAgICAgICAgICAgICAgID0gTUFLRUxPTkcoMCwgSElXT1JEKGRvcykpOyAvKiByZWFsIG1vZGUgYWRkcmVzcyAqLworICAgICAgIFJFU0VUX0NGTEFHKGNvbnRleHQpOworICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IENYX3JlZyhjb250ZXh0KTsKKyNlbHNlCisgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9taXNjL2NvbW0uYyBiL21pc2MvY29tbS5jCmluZGV4IGZlNjdmNmYuLmExZjY5ZDMgMTAwNjQ0Ci0tLSBhL21pc2MvY29tbS5jCisrKyBiL21pc2MvY29tbS5jCkBAIC0yMiw2ICsyMiw5IEBACiAjaW5jbHVkZSA8dGVybWlvcy5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CkBAIC0zMyw2ICszNiwxMiBAQAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImNvbW0uaCIKKyNpZmRlZiBIQVZFX1NZU19NT0RFTV9ICisjIGluY2x1ZGUgPHN5cy9tb2RlbS5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RSVElPX0gKKyMgaW5jbHVkZSA8c3lzL3N0cnRpby5oPgorI2VuZGlmCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEvbWlzYy9jb21tZGxnLmMgYi9taXNjL2NvbW1kbGcuYwppbmRleCAxZTNjZmVjLi4wM2U1N2Y5IDEwMDY0NAotLS0gYS9taXNjL2NvbW1kbGcuYworKysgYi9taXNjL2NvbW1kbGcuYwpAQCAtMzkyOCwzICszOTI4LDExIEBACiAgIFNFR1BUUl9GUkVFKGxwY2MxNik7CiAgIHJldHVybiAoQk9PTDMyKXJldDsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIFBhZ2VTZXR1cERsZ0EgIChDT01ETEczMi4xNSkKKyAqLworQk9PTDMyIFdJTkFQSSBQYWdlU2V0dXBEbGczMkEoTFBQQUdFU0VUVVBETEczMkEgc2V0dXBkbGcpIHsKKwlGSVhNRShjb21tZGxnLCIoJXApLCBzdHViIVxuIixzZXR1cGRsZyk7CisJcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggM2Q0MTBlYS4uM2I4OGMzZiAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC05ODcsMTEgKzk4NywxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICBfc3RyZHVwICAgICAgICAgIChDUlRETEwuMjg1KQogICovCi1MUFNUUiBfX2NkZWNsIENSVERMTF9fc3RyZHVwKExQU1RSIHB0cikKK0xQU1RSIF9fY2RlY2wgQ1JURExMX19zdHJkdXAoTFBDU1RSIHB0cikKIHsKICAgICByZXR1cm4gSEVBUF9zdHJkdXBBKEdldFByb2Nlc3NIZWFwKCksMCxwdHIpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIF93Y3NkdXAgICAgICAgICAgKENSVERMTC4zMjApCisgKi8KK0xQV1NUUiBfX2NkZWNsIENSVERMTF9fd2NzZHVwKExQQ1dTVFIgcHRyKQoreworICAgIHJldHVybiBIRUFQX3N0cmR1cFcoR2V0UHJvY2Vzc0hlYXAoKSwwLHB0cik7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgZmNsb3NlICAgICAgICAgICAoQ1JURExMLjM2MikKQEAgLTE4MzMsMyArMTg0MCwyNyBAQAogCS8qIEZJWE1FOiBoYW5kbGUgbXVsdGlieXRlIHN0cmluZ3MgKi8KIAlyZXR1cm4gc3RycmNocihzLHgpOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIF9tZW1pY21wICAgICAgICAgICAoQ1JURExMLjIzMykoTlRETEwuODY4KQorICogQSBzdHJpbmdjb21wYXJlLCB3aXRob3V0IFwwIGNoZWNrCisgKiBSRVRVUk5TCisgKgktMTppZiBmaXJzdCBzdHJpbmcgaXMgYWxwaGFiZXRpY2FsbHkgYmVmb3JlIHNlY29uZCBzdHJpbmcKKyAqCTE6aWYgc2Vjb25kICcnICAgICcnICAgICAgJycgICAgICAgICAgJycgICBmaXJzdCAgICcnCisgKiAgICAgIDA6aWYgYm90aCBhcmUgZXF1YWwuCisgKi8KK0lOVDMyIF9fY2RlY2wgQ1JURExMX19tZW1pY21wKAorCUxQQ1NUUiBzMSwJLyogW2luXSBmaXJzdCBzdHJpbmcgKi8KKwlMUENTVFIgczIsCS8qIFtpbl0gc2Vjb25kIHN0cmluZyAqLworCURXT1JEIGxlbgkvKiBbaW5dIGxlbmd0aCB0byBjb21wYXJlICovCispIHsgCisJaW50CWk7CisKKwlmb3IgKGk9MDtpPGxlbjtpKyspIHsKKwkJaWYgKHRvbG93ZXIoczFbaV0pPHRvbG93ZXIoczJbaV0pKQorCQkJcmV0dXJuIC0xOworCQlpZiAodG9sb3dlcihzMVtpXSk+dG9sb3dlcihzMltpXSkpCisJCQlyZXR1cm4gIDE7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWlzYy9sc3RyLmMgYi9taXNjL2xzdHIuYwppbmRleCBiZmZkMWU3Li4wNDNhNzc4IDEwMDY0NAotLS0gYS9taXNjL2xzdHIuYworKysgYi9taXNjL2xzdHIuYwpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgaWYgKChwID4gYnVmZmVyKSAmJiAocFstMV0gPT0gJ1xuJykpIHBbMV0gPSAnXDAnOyAvKiBSZW1vdmUgdHJhaWxpbmcgXG4gKi8KICAgICBpZiAoIUdldE1vZHVsZU5hbWUoIEdldEN1cnJlbnRUYXNrKCksIG1vZHVsZSwgc2l6ZW9mKG1vZHVsZSkgKSkKICAgICAgICAgc3RyY3B5KCBtb2R1bGUsICI/Pz8iICk7Ci0gICAgVFJBQ0UocmVzb3VyY2UsICIlcyBzYXlzICclcydcbiIsIG1vZHVsZSwgYnVmZmVyICk7CisgICAgRFVNUCgiJXMgc2F5cyAnJXMnXG4iLCBtb2R1bGUsIGJ1ZmZlciApOwogICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIgKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCA0OWVmNmRmLi44ZGIwZjlkIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtMjA5LDYgKzIwOSwxMCBAQAogICovCiBzdGF0aWMgQk9PTDMyIE1BSU5fUGFyc2VEZWJ1Z09wdGlvbnMoY2hhciAqb3B0aW9ucykKIHsKKyAgLyogZGVmaW5lZCBpbiByZWxheTMyL3JlbGF5Mzg2LmMgKi8KKyAgZXh0ZXJuIGNoYXIgKipkZWJ1Z19yZWxheV9pbmNsdWRlbGlzdDsKKyAgZXh0ZXJuIGNoYXIgKipkZWJ1Z19yZWxheV9leGNsdWRlbGlzdDsKKwogICBpbnQgbCwgY2xzOwogICBpZiAoc3RybGVuKG9wdGlvbnMpPDMpCiAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMjQzLDYgKzI0Nyw0NSBAQAogCSAgICBpZihjbHMgPT0gLTEgfHwgY2xzID09IGopCiAJICAgICAgZGVidWdfbXNnX2VuYWJsZWRbaV1bal09KCpvcHRpb25zPT0nKycpOwogICAgICAgfQorICAgIGVsc2UgaWYgKCFsc3RybmNtcGkzMkEob3B0aW9ucysxLCAicmVsYXk9IiwgNikpCisgICAgICB7CisJaW50IGksIGo7CisJY2hhciAqcywgKnMyLCAqKipvdXRwdXQsIGM7CisKKwlmb3IgKGk9MDsgaTxERUJVR19DSEFOTkVMX0NPVU5UOyBpKyspCisJICBpZiAoZGVidWdfY2hfbmFtZSAmJiAoIWxzdHJuY21waTMyQShkZWJ1Z19jaF9uYW1lW2ldLCJyZWxheSIsNSkpKXsKKwkgICAgZm9yKGo9MDsgajxERUJVR19DTEFTU19DT1VOVDsgaisrKQorCSAgICAgIGlmKGNscyA9PSAtMSB8fCBjbHMgPT0gaikKKwkJZGVidWdfbXNnX2VuYWJsZWRbaV1bal09VFJVRTsKKwkgICAgYnJlYWs7CisJICB9CisJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiwgbWF5YmUgYXNzZXJ0KGkhPURFQlVHX0NIQU5ORUxfQ09VTlQpPyAqLworCWlmIChpPT1ERUJVR19DSEFOTkVMX0NPVU5UKQorCSAgcmV0dXJuIEZBTFNFOworCWlmICgqb3B0aW9ucyA9PSAnKycpCisJICBvdXRwdXQgPSAmZGVidWdfcmVsYXlfaW5jbHVkZWxpc3Q7CisJZWxzZQorCSAgb3V0cHV0ID0gJmRlYnVnX3JlbGF5X2V4Y2x1ZGVsaXN0OworCXMgPSBvcHRpb25zICsgNzsKKwlpID0gMTsKKwl3aGlsZSgocyA9IHN0cmNocihzLCAnOicpKSkgaSsrLCBzKys7CisJKm91dHB1dCA9IG1hbGxvYyhzaXplb2YoY2hhciAqKikgKiBpICsgMSk7CisJaSA9IDA7CisJcyA9IG9wdGlvbnMgKyA3OworCXdoaWxlKChzMiA9IHN0cmNocihzLCAnOicpKSkgeworICAgICAgICAgIGMgPSAqczI7CisgICAgICAgICAgKnMyID0gJ1wwJzsKKwkgICooKCpvdXRwdXQpK2kpID0gc3RyZHVwKHMpOworICAgICAgICAgICpzMiA9IGM7CisJICBzID0gczIgKyAxOworCSAgaSsrOworCX0KKwljID0gKihvcHRpb25zICsgbCk7CisJKihvcHRpb25zICsgbCkgPSAnXDAnOworCSooKCpvdXRwdXQpK2kpID0gc3RyZHVwKHMpOworCSoob3B0aW9ucyArIGwpID0gYzsKKwkqKCgqb3V0cHV0KStpKzEpID0gTlVMTDsKKyAgICAgIH0KICAgICBlbHNlCiAgICAgICB7CiAJaW50IGksIGo7CkBAIC03NTgsNyArODAxLDYgQEAKIAkJR2V0UHJvZmlsZVN0cmluZzMyQSgiRGVza3RvcCIsICJJY29uVGl0bGVGYWNlTmFtZSIsICJNUyBTYW5zIFNlcmlmIiwgCiAJCQlscExvZ0ZvbnQtPmxmRmFjZU5hbWUsIExGX0ZBQ0VTSVpFICk7CiAJCWxwTG9nRm9udC0+bGZIZWlnaHQgPSAtR2V0UHJvZmlsZUludDMyQSgiRGVza3RvcCIsIkljb25UaXRsZVNpemUiLCA4KTsKLQogCQlscExvZ0ZvbnQtPmxmV2lkdGggPSAwOwogCQlscExvZ0ZvbnQtPmxmRXNjYXBlbWVudCA9IGxwTG9nRm9udC0+bGZPcmllbnRhdGlvbiA9IDA7CiAJCWxwTG9nRm9udC0+bGZXZWlnaHQgPSBGV19OT1JNQUw7CkBAIC03ODcsNiArODI5LDcgQEAKIAogCQkgICAgU3lzdGVtUGFyYW1ldGVyc0luZm8zMkEoU1BJX0dFVElDT05USVRMRUxPR0ZPTlQsIDAsCiAJCQkJCQkJKExQVk9JRCkmKGxwbm0tPmxmQ2FwdGlvbkZvbnQpLDApOworCQkgICAgbHBubS0+bGZDYXB0aW9uRm9udC5sZldlaWdodCA9IEZXX0JPTEQ7CiAJCSAgICBTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyQShTUElfR0VUSUNPTlRJVExFTE9HRk9OVCwgMCwKIAkJCQkJCQkoTFBWT0lEKSYobHBubS0+bGZNZW51Rm9udCksMCk7CiAJCSAgICBTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyQShTUElfR0VUSUNPTlRJVExFTE9HRk9OVCwgMCwKQEAgLTk3NSw3ICsxMDE4LDYgQEAKIAkJICAgIEdldFByb2ZpbGVTdHJpbmczMkEoIkRlc2t0b3AiLCAiSWNvblRpdGxlRmFjZU5hbWUiLCAiTVMgU2FucyBTZXJpZiIsIAogCQkJCQlscExvZ0ZvbnQtPmxmRmFjZU5hbWUsIExGX0ZBQ0VTSVpFICk7CiAgICAgICAgICAgICAgICAgICAgIGxwTG9nRm9udC0+bGZIZWlnaHQgPSAtR2V0UHJvZmlsZUludDMyQSgiRGVza3RvcCIsIkljb25UaXRsZVNpemUiLCA4KTsKLQogICAgICAgICAgICAgICAgICAgICBscExvZ0ZvbnQtPmxmV2lkdGggPSAwOwogICAgICAgICAgICAgICAgICAgICBscExvZ0ZvbnQtPmxmRXNjYXBlbWVudCA9IGxwTG9nRm9udC0+bGZPcmllbnRhdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGxwTG9nRm9udC0+bGZXZWlnaHQgPSBGV19OT1JNQUw7CkBAIC05OTYsNiArMTAzOCw3IEBACiAJCQkvKiBGSVhNRTogaW5pdGlhbGl6ZSBnZW9tZXRyeSBlbnRyaWVzICovCiAJCQlTeXN0ZW1QYXJhbWV0ZXJzSW5mbzE2KCBTUElfR0VUSUNPTlRJVExFTE9HRk9OVCwgMCwgCiAJCQkJCQkJKExQVk9JRCkmKGxwbm0tPmxmQ2FwdGlvbkZvbnQpLDApOworCQkJbHBubS0+bGZDYXB0aW9uRm9udC5sZldlaWdodCA9IEZXX0JPTEQ7CiAJCQlTeXN0ZW1QYXJhbWV0ZXJzSW5mbzE2KCBTUElfR0VUSUNPTlRJVExFTE9HRk9OVCwgMCwKIAkJCQkJCQkoTFBWT0lEKSYobHBubS0+bGZNZW51Rm9udCksMCk7CiAJCQlTeXN0ZW1QYXJhbWV0ZXJzSW5mbzE2KCBTUElfR0VUSUNPTlRJVExFTE9HRk9OVCwgMCwKQEAgLTEwODUsNiArMTEyOCw3IEBACiAJTFBOT05DTElFTlRNRVRSSUNTMzJXCWxwbm09KExQTk9OQ0xJRU5UTUVUUklDUzMyVylscHZQYXJhbTsKIAogCVN5c3RlbVBhcmFtZXRlcnNJbmZvMzJXKFNQSV9HRVRJQ09OVElUTEVMT0dGT05ULDAsKExQVk9JRCkmKGxwbm0tPmxmQ2FwdGlvbkZvbnQpLDApOworCWxwbm0tPmxmQ2FwdGlvbkZvbnQubGZXZWlnaHQgPSBGV19CT0xEOwogCVN5c3RlbVBhcmFtZXRlcnNJbmZvMzJXKFNQSV9HRVRJQ09OVElUTEVMT0dGT05ULDAsKExQVk9JRCkmKGxwbm0tPmxmTWVudUZvbnQpLDApOwogCVN5c3RlbVBhcmFtZXRlcnNJbmZvMzJXKFNQSV9HRVRJQ09OVElUTEVMT0dGT05ULDAsKExQVk9JRCkmKGxwbm0tPmxmU3RhdHVzRm9udCksMCk7CiAJU3lzdGVtUGFyYW1ldGVyc0luZm8zMlcoU1BJX0dFVElDT05USVRMRUxPR0ZPTlQsMCwoTFBWT0lEKSYobHBubS0+bGZNZXNzYWdlRm9udCksMCk7CmRpZmYgLS1naXQgYS9taXNjL25ldHdvcmsuYyBiL21pc2MvbmV0d29yay5jCmluZGV4IDc5MzYzODMuLmEwZWVkYWQgMTAwNjQ0Ci0tLSBhL21pc2MvbmV0d29yay5jCisrKyBiL21pc2MvbmV0d29yay5jCkBAIC0yODEsNiArMjgxLDIyIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlXTmV0R2V0Q29ubmVjdGlvblcJW01QUi43Ml0KKyAqLworRFdPUkQgV0lOQVBJCitXTmV0R2V0Q29ubmVjdGlvbjMyVyhMUENXU1RSIGxvY2FsbmFtZVcsTFBTVFIgcmVtb3RlbmFtZVcsTFBEV09SRCBidWZsZW4pCit7CisJVUlOVDE2CXg7CisJQ0hBUglidWZbMjAwXTsJCisJTFBTVFIJbG5BID0gSEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCxsb2NhbG5hbWVXKTsKKwlEV09SRAlyZXQgPSBXTmV0R2V0Q29ubmVjdGlvbjE2KGxuQSxidWYsJngpOworCisJKmJ1ZmxlbiA9IHg7IC8qIEZJWE1FOiAqMiA/ICovCisJbHN0cmNweUF0b1cocmVtb3RlbmFtZVcsYnVmKTsKKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbG5BKTsKKwlyZXR1cm4gcmV0OworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCVdOZXRHZXRDYXBzCQlbVVNFUi41MTNdCkBAIC01MDgsMTEgKzUyNCwxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgV05ldEdldFByb3BlcnR5VGV4dCAgICAgICBbVVNFUi41MzJdCiAgKi8KLWludCBXSU5BUEkgV05ldEdldFByb3BlcnR5VGV4dChIV05EMTYgaHduZFBhcmVudCxXT1JEIGlCdXR0b24sV09SRCBuUHJvcFNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscHN6TmFtZSxXT1JEIG5UeXBlKQoraW50IFdJTkFQSSBXTmV0R2V0UHJvcGVydHlUZXh0KFdPUkQgaUJ1dHRvbiwgV09SRCBuUHJvcFNlbCwgTFBTVFIgbHBzek5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwc3pCdXR0b25OYW1lLCBXT1JEIGNiQnV0dG9uTmFtZSwgV09SRCBuVHlwZSkKIHsKLQlGSVhNRSh3bmV0LCAiKCUwNHgsJXgsJXgsJyVzJywleCk6IHN0dWJcbiIsCi0JICAgICAgaHduZFBhcmVudCxpQnV0dG9uLG5Qcm9wU2VsLGxwc3pOYW1lLG5UeXBlKTsKKwlGSVhNRSh3bmV0LCAiKCUwNHgsJTA0eCwnJXMnLCclcycsJTA0eCk6IHN0dWJcbiIsCisJICAgICAgaUJ1dHRvbixuUHJvcFNlbCxscHN6TmFtZSxscHN6QnV0dG9uTmFtZSwgblR5cGUpOwogCXJldHVybiBXTl9OT19ORVRXT1JLOwogfQogCmRpZmYgLS1naXQgYS9taXNjL250ZGxsLmMgYi9taXNjL250ZGxsLmMKaW5kZXggMjFlZmI1MC4uZDI2NWQ5MiAxMDA2NDQKLS0tIGEvbWlzYy9udGRsbC5jCisrKyBiL21pc2MvbnRkbGwuYwpAQCAtMzMyLDcgKzMzMiw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgIFJ0bEluaXRTdHJpbmcJCQlbTlRETExdCisgKiAgICAgICAgICAgICAgICAgUnRsSW5pdEFuc2lTdHJpbmcJCQlbTlRETExdCiAgKi8KIFZPSUQgV0lOQVBJIFJ0bEluaXRBbnNpU3RyaW5nKExQQU5TSV9TVFJJTkcgdGFyZ2V0LExQQ1NUUiBzb3VyY2UpCiB7CkBAIC00MjksNyArNDI5LDcgQEAKICAqLwogRFdPUkQgV0lOQVBJIFJ0bE50U3RhdHVzVG9Eb3NFcnJvcihEV09SRCBlcnJvcikKIHsKLSAgICBGSVhNRShudGRsbCwgIigleCk6IG1hcCBTVEFUVVNfIHRvIEVSUk9SX1xuIixlcnJvcik7CisgICAgRklYTUUobnRkbGwsICIoJWx4KTogbWFwIFNUQVRVU18gdG8gRVJST1JfXG4iLGVycm9yKTsKICAgICByZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTU1Niw2ICs1NTYsOSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICBOVERMTF9jaGtzdGsgICAoTlRETEwuODYyKQorICoKKyAqIE5PVEVTCisgKiAgICBTaG91bGQgdGhpcyBiZSBXSU5BUEk/CiAgKi8KIHZvaWQgTlRETExfY2hrc3RrKHZvaWQpCiB7CkBAIC01NzQsMTIgKzU3NywxMyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTnRRdWVyeURpcmVjdG9yeU9iamVjdCBbTlRETEwuMTQ5XQogICovCi1EV09SRCBXSU5BUEkgTnRRdWVyeURpcmVjdG9yeU9iamVjdChEV09SRCB4MSwgRFdPUkQgeDIpCitEV09SRCBXSU5BUEkgTnRRdWVyeURpcmVjdG9yeU9iamVjdCggRFdPUkQgeDEsIERXT1JEIHgyLCBEV09SRCB4MywgRFdPUkQgeDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgeDUsIERXT1JEIHg2LCBEV09SRCB4NyApCiB7Ci0gICAgRklYTUUobnRkbGwsIiglbHgsJWx4KTogc3R1YlxuIix4MSx4Mik7CisgICAgRklYTUUobnRkbGwsIiglbHgsJWx4LCVseCwlbHgsJWx4LCVseCwlbHgpOiBzdHViXG4iLHgxLHgyLHgzLHg0LHg1LHg2LHg3KTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNTg3LDE5ICs1OTEsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUnRsRnJlZUFuc2lTdHJpbmcgW05URExMLjM3M10KICAqLwotRFdPUkQgV0lOQVBJIFJ0bEZyZWVBbnNpU3RyaW5nKERXT1JEIHgxKQorVk9JRCBXSU5BUEkgUnRsRnJlZUFuc2lTdHJpbmcoTFBBTlNJX1NUUklORyBBbnNpU3RyaW5nKQogewotICAgIEZJWE1FKG50ZGxsLCIoJWx4KTogc3R1YlxuIix4MSk7Ci0gICAgcmV0dXJuIDA7CisgICAgaWYoIEFuc2lTdHJpbmctPkJ1ZmZlciApCisgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLDAsQW5zaVN0cmluZy0+QnVmZmVyICk7CiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24gW05URExMLjE2OF0KICAqLwotRFdPUkQgV0lOQVBJIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiggRFdPUkQgeDEgKQorRFdPUkQgV0lOQVBJIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiggRFdPUkQgeDEsIERXT1JEIHgyLCBEV09SRCB4MywgRFdPUkQgeDQgKQogewotICAgIEZJWE1FKG50ZGxsLCIoJWx4KTogc3R1YlxuIix4MSk7CisgICAgRklYTUUobnRkbGwsIiglbHgsJWx4LCVseCwlbHgpOiBzdHViXG4iLHgxLHgyLHgzLHg0KTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNjA3LDkgKzYxMSw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBOdFF1ZXJ5T2JqZWN0IFtOVERMTC4xNjFdCiAgKi8KLURXT1JEIFdJTkFQSSBOdFF1ZXJ5T2JqZWN0KCBEV09SRCB4MSwgRFdPUkQgeDIgKQorRFdPUkQgV0lOQVBJIE50UXVlcnlPYmplY3QoIERXT1JEIHgxLCBEV09SRCB4MiAsRFdPUkQgeDMsIERXT1JEIHg0LCBEV09SRCB4NSApCiB7Ci0gICAgRklYTUUobnRkbGwsIiglbHgsJWx4KTogc3R1YlxuIix4MSx4Mik7CisgICAgRklYTUUobnRkbGwsIiglbHgsJWx4LCVseCwlbHgsJWx4KTogc3R1YlxuIix4MSx4Mix4Myx4NCx4NSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTYxNyw5ICs2MjEsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUnRsVGltZVRvRWxhcHNlZFRpbWVGaWVsZHMgW05URExMLjUwMl0KICAqLwotRFdPUkQgV0lOQVBJIFJ0bFRpbWVUb0VsYXBzZWRUaW1lRmllbGRzKCBEV09SRCB4MSApCitEV09SRCBXSU5BUEkgUnRsVGltZVRvRWxhcHNlZFRpbWVGaWVsZHMoIERXT1JEIHgxLCBEV09SRCB4MiApCiB7Ci0gICAgRklYTUUobnRkbGwsIiglbHgpOiBzdHViXG4iLHgxKTsKKyAgICBGSVhNRShudGRsbCwiKCVseCwlbHgpOiBzdHViXG4iLHgxLHgyKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNjI3LDEwICs2MzEsNTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE50U2V0SW5mb3JtYXRpb25Qcm9jZXNzIFtOVERMTC4yMDddCiAgKi8KLURXT1JEIFdJTkFQSSBOdFNldEluZm9ybWF0aW9uUHJvY2VzcyggRFdPUkQgeDEgKQorRFdPUkQgV0lOQVBJIE50U2V0SW5mb3JtYXRpb25Qcm9jZXNzKCBEV09SRCB4MSwgRFdPUkQgeDIsIERXT1JEIHgzLCBEV09SRCB4NCApCiB7Ci0gICAgRklYTUUobnRkbGwsIiglbHgpOiBzdHViXG4iLHgxKTsKKyAgICBGSVhNRShudGRsbCwiKCVseCwlbHgsJWx4LCVseCk6IHN0dWJcbiIseDEseDIseDMseDQpOwogICAgIHJldHVybiAwOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOdEZzQ29udHJvbEZpbGUgW05URExMLjEwOF0KKyAqLworVk9JRCBXSU5BUEkgTnRGc0NvbnRyb2xGaWxlKFZPSUQpCit7CisgICAgRklYTUUobnRkbGwsIih2b2lkKTogc3R1YlxuIik7Cit9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJ0bEV4dGVuZGVkTGFyZ2VJbnRlZ2VyRGl2aWRlIFtOVERMTC4zNTldCisgKi8KK0lOVDMyIFdJTkFQSSBSdGxFeHRlbmRlZExhcmdlSW50ZWdlckRpdmlkZSgKKwlMQVJHRV9JTlRFR0VSIGRpdmlkZW5kLAorCURXT1JEIGRpdmlzb3IsCisJTFBEV09SRCByZXN0CispIHsKKyNpZiBTSVpFT0ZfTE9OR19MT05HPT04CisJbG9uZyBsb25nIHgxID0gKihsb25nIGxvbmcqKSZkaXZpZGVuZDsKKworCWlmICgqcmVzdCkKKwkJKnJlc3QgPSB4MSAlIGRpdmlzb3I7CisJcmV0dXJuIHgxL2Rpdmlzb3I7CisjZWxzZQorCUZJWE1FKG50ZGxsLCIoKCVkPDwzMikrJWQsJWQsJXApLCBpbXBsZW1lbnQgdGhpcyB1c2luZyBub3JtYWwgaW50ZWdlciBhcml0aG1ldGljIVxuIixkaXZpZGVuZC5IaWdoUGFydCxkaXZpZGVuZC5Mb3dQYXJ0LGRpdmlzb3IscmVzdCk7CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUnRsRXh0ZW5kZWRMYXJnZUludGVnZXJNdWx0aXBseSBbTlRETEwuMzU5XQorICogTm90ZTogVGhpcyBldmVuIHdvcmtzLCBzaW5jZSBnY2MgcmV0dXJucyA2NGJpdCB2YWx1ZXMgaW4gZWF4L2VkeCBqdXN0IGxpa2UKKyAqIHRoZSBjYWxsZXIgZXhwZWN0cy4gSG93ZXZlci4uLiBUaGUgcmVsYXkgY29kZSB3b24ndCBncm9rIHRoaXMgSSB0aGluay4KKyAqLworbG9uZyBsb25nIC8qTEFSR0VfSU5URUdFUiovIFdJTkFQSSBSdGxFeHRlbmRlZEludGVnZXJNdWx0aXBseSgKKwlMQVJHRV9JTlRFR0VSIGZhY3RvcjEsSU5UMzIgZmFjdG9yMgorKSB7CisjaWYgU0laRU9GX0xPTkdfTE9ORz09OAorCXJldHVybiAoKihsb25nIGxvbmcqKSZmYWN0b3IxKSpmYWN0b3IyOworI2Vsc2UKKwlGSVhNRShudGRsbCwiKCglZDw8MzIpKyVkLCVsZCksIGltcGxlbWVudCB0aGlzIHVzaW5nIG5vcm1hbCBpbnRlZ2VyIGFyaXRobWV0aWMhXG4iLGZhY3RvcjEuSGlnaFBhcnQsZmFjdG9yMS5Mb3dQYXJ0LGZhY3RvcjIpOworCXJldHVybiAwOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9taXNjL3ByaW50ZHJ2LmMgYi9taXNjL3ByaW50ZHJ2LmMKaW5kZXggMjBjMjIwNy4uMzdhMTc0OCAxMDA2NDQKLS0tIGEvbWlzYy9wcmludGRydi5jCisrKyBiL21pc2MvcHJpbnRkcnYuYwpAQCAtMTAsOCArMTAsMTcgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJ3aW5yZWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisjZGVmaW5lIElOVF9QRF9ERUZBVUxUX0RFVk1PREUJMQorI2RlZmluZSBJTlRfUERfREVGQVVMVF9NT0RFTAkyCisKK3N0YXRpYyBjaGFyIFByaW50ZXJNb2RlbFtdCT0gIlByaW50ZXIgTW9kZWwiOworc3RhdGljIGNoYXIgRGVmYXVsdERldk1vZGVbXQk9ICJEZWZhdWx0IERldk1vZGUiOworc3RhdGljIGNoYXIgUHJpbnRlckRyaXZlckRhdGFbXSA9ICJQcmludGVyRHJpdmVyRGF0YSI7CitzdGF0aWMgY2hhciBQcmludGVyc1tdCQk9ICJTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxDb250cm9sXFxQcmludFxcUHJpbnRlcnNcXCI7CisKIElOVDE2IFdJTkFQSSBTdGFydERvYzE2KCBIREMxNiBoZGMsIGNvbnN0IERPQ0lORk8xNiAqbHBkb2MgKQogewogICBJTlQxNiByZXRWYWw7CkBAIC0zMiw0MiArNDEsMTcyIEBACiAgIHJldHVybiAgRXNjYXBlMTYoaGRjLCBFTkRET0MsIDAsIDAsIDApOwogfQogCitXT1JEIERydkdldFByaW50ZXJEYXRhSW50ZXJuYWwoTFBTVFIgUmVnU3RyX1ByaW50ZXIsIExQQllURSBscFByaW50ZXJEYXRhLCBpbnQgY2JEYXRhKQoreworICAgIFdPUkQgcmVzID0gLTE7CisgICAgSEtFWSBoa2V5OworICAgIERXT1JEIGR3VHlwZSwgY2JRdWVyeURhdGE7CisKKyAgICBpZiAoIShSZWdPcGVuS2V5MzJBKEhLRVlfTE9DQUxfTUFDSElORSwgUmVnU3RyX1ByaW50ZXIsICZoa2V5KSkpIHsKKyAgICAgICAgaWYgKGNiRGF0YSA+IDEpIHsgLyogIkRlZmF1bHQgRGV2TW9kZSIgKi8KKyAgICAgICAgICAgIGlmICghKFJlZ1F1ZXJ5VmFsdWVFeDMyQShoa2V5LCBEZWZhdWx0RGV2TW9kZSwgMCwgJmR3VHlwZSwgMCwgJmNiUXVlcnlEYXRhKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWxwUHJpbnRlckRhdGEpIHJlcyA9IGNiUXVlcnlEYXRhOworCQllbHNlCisJCWlmICgoY2JRdWVyeURhdGEpICYmIChjYlF1ZXJ5RGF0YSA8PSBjYkRhdGEpKSB7CisJCSAgICBjYlF1ZXJ5RGF0YSA9IGNiRGF0YTsKKwkJICAgIGlmIChSZWdRdWVyeVZhbHVlRXgzMkEoaGtleSwgRGVmYXVsdERldk1vZGUsIDAsCisJCQkJJmR3VHlwZSwgbHBQcmludGVyRGF0YSwgJmNiUXVlcnlEYXRhKSkKKwkJICAgICAgICByZXMgPSBjYlF1ZXJ5RGF0YTsKKwkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiAiUHJpbnRlciBEcml2ZXIiICovCisJICAgIHsKKwkJY2JRdWVyeURhdGEgPSAzMjsKKwkgICAgICAgIFJlZ1F1ZXJ5VmFsdWVFeDMyQShoa2V5LCAiUHJpbnRlciBEcml2ZXIiLCAwLAorCQkJJmR3VHlwZSwgbHBQcmludGVyRGF0YSwgJmNiUXVlcnlEYXRhKTsKKwkJcmVzID0gY2JRdWVyeURhdGE7CisJICAgIH0KKwl9CisgICAgfQorICAgIGlmIChoa2V5KSBSZWdDbG9zZUtleShoa2V5KTsKKyAgICByZXR1cm4gcmVzOworfQogCiAKIERXT1JEIFdJTkFQSSBEcnZHZXRQcmludGVyRGF0YShMUFNUUiBscFByaW50ZXIsIExQU1RSIGxwUHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwVHlwZSwgTFBCWVRFIGxwUHJpbnRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiRGF0YSwgTFBEV09SRCBscE5lZWRlZCkKIHsKLSAgICBGSVhNRShwcmludCwgInN0dWIuXG4iKTsKKyAgICBMUFNUUiBSZWdTdHJfUHJpbnRlcjsKKyAgICBIS0VZIGhrZXkgPSAwLCBoa2V5MiA9IDA7CisgICAgRFdPUkQgcmVzID0gMDsKKyAgICBEV09SRCBkd1R5cGUsIFByaW50ZXJBdHRyLCBjYlByaW50ZXJBdHRyLCBTZXREYXRhLCBzaXplOworCiAgICAgaWYgKEhJV09SRChscFByaW50ZXIpKQotCSAgICBUUkFDRShwcmludCwicHJpbnRlciAlc1xuIixscFByaW50ZXIpOworICAgICAgICAgICAgVFJBQ0UocHJpbnQsInByaW50ZXIgJXNcbiIsbHBQcmludGVyKTsKICAgICBlbHNlCi0JICAgIFRSQUNFKHByaW50LCJwcmludGVyICVwXG4iLGxwUHJpbnRlcik7CisgICAgICAgICAgICBUUkFDRShwcmludCwicHJpbnRlciAlcFxuIixscFByaW50ZXIpOwogICAgIGlmIChISVdPUkQobHBQcm9maWxlKSkKLQkgICAgVFJBQ0UocHJpbnQsInByb2ZpbGUgJXNcbiIsbHBQcm9maWxlKTsKKyAgICAgICAgICAgIFRSQUNFKHByaW50LCJwcm9maWxlICVzXG4iLGxwUHJvZmlsZSk7CiAgICAgZWxzZQotCSAgICBUUkFDRShwcmludCwicHJvZmlsZSAlcFxuIixscFByb2ZpbGUpOworICAgICAgICAgICAgVFJBQ0UocHJpbnQsInByb2ZpbGUgJXBcbiIsbHBQcm9maWxlKTsKICAgICBUUkFDRShwcmludCwibHBUeXBlICVwXG4iLGxwVHlwZSk7Ci0gICAgcmV0dXJuIDA7CisKKyAgICBpZiAoKCFscFByaW50ZXIpIHx8ICghbHBQcm9maWxlKSB8fCAoIWxwTmVlZGVkKSkKKwlyZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICBSZWdTdHJfUHJpbnRlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihQcmludGVycykgKyBzdHJsZW4obHBQcmludGVyKSArIDIpOworICAgIHN0cmNweShSZWdTdHJfUHJpbnRlciwgUHJpbnRlcnMpOworICAgIHN0cmNhdChSZWdTdHJfUHJpbnRlciwgbHBQcmludGVyKTsKKworICAgIGlmICgoKERXT1JEKWxwUHJvZmlsZSA9PSBJTlRfUERfREVGQVVMVF9ERVZNT0RFKSB8fAorICAgICghbHN0cmNtcDMyQShscFByb2ZpbGUsIERlZmF1bHREZXZNb2RlKSkpIHsKKwlzaXplID0gRHJ2R2V0UHJpbnRlckRhdGFJbnRlcm5hbChSZWdTdHJfUHJpbnRlciwgbHBQcmludGVyRGF0YSwgY2JEYXRhKTsKKwlpZiAoc2l6ZSsxKSB7CisJICAgICpscE5lZWRlZCA9IHNpemU7CisJICAgIGlmICgobHBQcmludGVyRGF0YSkgJiYgKCpscE5lZWRlZCA+IGNiRGF0YSkpCisJCXJlcyA9IEVSUk9SX01PUkVfREFUQTsKKwl9CisJZWxzZSByZXMgPSBFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRTsKKyAgICB9CisgICAgZWxzZQorICAgIGlmICgoKERXT1JEKWxwUHJvZmlsZSA9PSBJTlRfUERfREVGQVVMVF9NT0RFTCkgfHwKKyAgICAoIWxzdHJjbXAzMkEobHBQcm9maWxlLCBQcmludGVyTW9kZWwpKSkgeworCSpscE5lZWRlZCA9IDMyOworCWlmICghbHBQcmludGVyRGF0YSkgZ290byBmYWlsZWQ7CisJaWYgKGNiRGF0YSA8IDMyKSB7CisJICAgIHJlcyA9IEVSUk9SX01PUkVfREFUQTsKKwkgICAgZ290byBmYWlsZWQ7CisJfQorCXNpemUgPSBEcnZHZXRQcmludGVyRGF0YUludGVybmFsKFJlZ1N0cl9QcmludGVyLCBscFByaW50ZXJEYXRhLCAxKTsKKwlpZiAoKHNpemUrMSkgJiYgKGxwVHlwZSkpCisJICAgICpscFR5cGUgPSBSRUdfU1o7CisJZWxzZQorCSAgICByZXMgPSBFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoKHJlcyA9IFJlZ09wZW5LZXkzMkEoSEtFWV9MT0NBTF9NQUNISU5FLCBSZWdTdHJfUHJpbnRlciwgJmhrZXkpKSkKKwkgICAgZ290byBmYWlsZWQ7CisgICAgICAgIGNiUHJpbnRlckF0dHIgPSA0OworCWlmICgocmVzID0gUmVnUXVlcnlWYWx1ZUV4MzJBKGhrZXksICJBdHRyaWJ1dGVzIiwgMCwgJmR3VHlwZSwgKExQQllURSkmUHJpbnRlckF0dHIsICZjYlByaW50ZXJBdHRyKSkpCisJICAgIGdvdG8gZmFpbGVkOworCWlmICgocmVzID0gUmVnT3BlbktleTMyQShoa2V5LCBQcmludGVyRHJpdmVyRGF0YSwgJmhrZXkyKSkpCisJICAgIGdvdG8gZmFpbGVkOworICAgICAgICAqbHBOZWVkZWQgPSBjYkRhdGE7CisJcmVzID0gUmVnUXVlcnlWYWx1ZUV4MzJBKGhrZXkyLCBscFByb2ZpbGUsIDAsIGxwVHlwZSwgbHBQcmludGVyRGF0YSwgbHBOZWVkZWQpOworCWlmICgocmVzICE9IEVSUk9SX0NBTlRSRUFEKSAmJiAoKFByaW50ZXJBdHRyICYgKDB4ODAwfDB4MTApKSA9PSAweDEwKSkKKyAgICAgICAgeworCSAgICBpZiAoIShyZXMpICYmICgqbHBUeXBlID09IFJFR19EV09SRCkgJiYgKCooTFBEV09SRClscFByaW50ZXJEYXRhID09IC0xKSkKKwkgICAgICAgIHJlcyA9IEVSUk9SX0lOVkFMSURfREFUQTsKKwl9CisJZWxzZQorICAgICAgICB7CisJICAgIFNldERhdGEgPSAtMTsKKwkgICAgUmVnU2V0VmFsdWVFeDMyQShoa2V5MiwgbHBQcm9maWxlLCAwLCBSRUdfRFdPUkQsIChMUEJZVEUpJlNldERhdGEsIDQpOyAvKiBubyByZXN1bHQgcmV0dXJuZWQgKi8KKwl9CisgICAgfQorCQorZmFpbGVkOgorICAgIGlmIChoa2V5MikgUmVnQ2xvc2VLZXkoaGtleTIpOworICAgIGlmIChoa2V5KSBSZWdDbG9zZUtleShoa2V5KTsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBSZWdTdHJfUHJpbnRlcik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCiAKIERXT1JEIFdJTkFQSSBEcnZTZXRQcmludGVyRGF0YShMUFNUUiBscFByaW50ZXIsIExQU1RSIGxwUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwVHlwZSwgTFBCWVRFIGxwUHJpbnRlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbHBUeXBlLCBMUEJZVEUgbHBQcmludGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1NpemUpCiB7Ci0gICAgRklYTUUocHJpbnQsICJzdHViLlxuIik7CisgICAgTFBTVFIgUmVnU3RyX1ByaW50ZXI7CisgICAgSEtFWSBoa2V5ID0gMDsKKyAgICBEV09SRCByZXMgPSAwOworCiAgICAgaWYgKEhJV09SRChscFByaW50ZXIpKQotCSAgICBUUkFDRShwcmludCwicHJpbnRlciAlc1xuIixscFByaW50ZXIpOworICAgICAgICAgICAgVFJBQ0UocHJpbnQsInByaW50ZXIgJXNcbiIsbHBQcmludGVyKTsKICAgICBlbHNlCi0JICAgIFRSQUNFKHByaW50LCJwcmludGVyICVwXG4iLGxwUHJpbnRlcik7CisgICAgICAgICAgICBUUkFDRShwcmludCwicHJpbnRlciAlcFxuIixscFByaW50ZXIpOwogICAgIGlmIChISVdPUkQobHBQcm9maWxlKSkKLQkgICAgVFJBQ0UocHJpbnQsInByb2ZpbGUgJXNcbiIsbHBQcm9maWxlKTsKKyAgICAgICAgICAgIFRSQUNFKHByaW50LCJwcm9maWxlICVzXG4iLGxwUHJvZmlsZSk7CiAgICAgZWxzZQotCSAgICBUUkFDRShwcmludCwicHJvZmlsZSAlcFxuIixscFByb2ZpbGUpOwotICAgIFRSQUNFKHByaW50LCJscFR5cGUgJXBcbiIsbHBUeXBlKTsKLSAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIFRSQUNFKHByaW50LCJwcm9maWxlICVwXG4iLGxwUHJvZmlsZSk7CisgICAgVFJBQ0UocHJpbnQsImxwVHlwZSAlMDhseFxuIixscFR5cGUpOworCisgICAgaWYgKCghbHBQcmludGVyKSB8fCAoIWxwUHJvZmlsZSkgfHwKKyAgICAoKERXT1JEKWxwUHJvZmlsZSA9PSBJTlRfUERfREVGQVVMVF9NT0RFTCkgfHwKKyAgICAoIWxzdHJjbXAzMkEobHBQcm9maWxlLCBQcmludGVyTW9kZWwpKSkKKwlyZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICBSZWdTdHJfUHJpbnRlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAorCQkJc3RybGVuKFByaW50ZXJzKSArIHN0cmxlbihscFByaW50ZXIpICsgMik7CisgICAgc3RyY3B5KFJlZ1N0cl9QcmludGVyLCBQcmludGVycyk7CisgICAgc3RyY2F0KFJlZ1N0cl9QcmludGVyLCBscFByaW50ZXIpOworCisgICAgaWYgKCgoRFdPUkQpbHBQcm9maWxlID09IElOVF9QRF9ERUZBVUxUX0RFVk1PREUpIHx8CisgICAgKCFsc3RyY21wMzJBKGxwUHJvZmlsZSwgRGVmYXVsdERldk1vZGUpKSkgeworCWlmICghKFJlZ09wZW5LZXkzMkEoSEtFWV9MT0NBTF9NQUNISU5FLCBSZWdTdHJfUHJpbnRlciwgJmhrZXkpKSB8fAorCSAgICAoUmVnU2V0VmFsdWVFeDMyQShoa2V5LCBEZWZhdWx0RGV2TW9kZSwgMCwgUkVHX0JJTkFSWSwgbHBQcmludGVyRGF0YSwgZHdTaXplKSkpCisJICAgICAgICByZXMgPSBFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlzdHJjYXQoUmVnU3RyX1ByaW50ZXIsICJcXCIpOworCisJaWYgKCEocmVzID0gUmVnT3BlbktleTMyQShIS0VZX0xPQ0FMX01BQ0hJTkUsIFJlZ1N0cl9QcmludGVyLCAmaGtleSkpKSB7CisKKwkgICAgaWYgKCFscFByaW50ZXJEYXRhKSAKKwkgICAgICAgIHJlcyA9IFJlZ0RlbGV0ZVZhbHVlMzJBKGhrZXksIGxwUHJvZmlsZSk7CisJICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXMgPSBSZWdTZXRWYWx1ZUV4MzJBKGhrZXksIGxwUHJvZmlsZSwgMCwgbHBUeXBlLCBscFByaW50ZXJEYXRhLCBkd1NpemUpOworCX0KKyAgICB9CisKKyAgICBpZiAoaGtleSkgUmVnQ2xvc2VLZXkoaGtleSk7CisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgUmVnU3RyX1ByaW50ZXIpOworICAgIHJldHVybiByZXM7CiB9CiAKIApAQCAtMTA1LDkgKzI0NCwzOSBAQAogICAgICpscGR3UmV0dXJuZWQ9MDsKICAgICByZXR1cm4gVFJVRTsKIH0KKworCiBCT09MMzIgV0lOQVBJIEFkZE1vbml0b3IzMkEoTFBDU1RSIHBOYW1lLCBEV09SRCBMZXZlbCwgTFBCWVRFIHBNb25pdG9ycykKIHsKICAgICBGSVhNRShwcmludCwgIiglcywlbHgsJXApOnN0dWIhXG4iLCBwTmFtZSwgTGV2ZWwsIHBNb25pdG9ycyk7CiAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgICByZXR1cm4gRkFMU0U7CiB9CisKKworQk9PTDMyIFdJTkFQSQorRGVsZXRlUHJpbnRlckRyaXZlcjMyQSAoTFBTVFIgcE5hbWUsIExQU1RSIHBFbnZpcm9ubWVudCwgTFBTVFIgcERyaXZlck5hbWUpCit7CisgICAgRklYTUUocHJpbnQsICIoJXMsJXMsJXMpOnN0dWIhXG4iLCBwTmFtZSwgcEVudmlyb25tZW50LCBwRHJpdmVyTmFtZSk7CisgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworQk9PTDMyIFdJTkFQSQorRGVsZXRlTW9uaXRvcjMyQSAoTFBTVFIgcE5hbWUsIExQU1RSIHBFbnZpcm9ubWVudCwgTFBTVFIgcE1vbml0b3JOYW1lKQoreworICAgIEZJWE1FKHByaW50LCAiKCVzLCVzLCVzKTpzdHViIVxuIiwgcE5hbWUsIHBFbnZpcm9ubWVudCwgcE1vbml0b3JOYW1lKTsKKyAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICAgIHJldHVybiBGQUxTRTsKK30KKworCitCT09MMzIgV0lOQVBJCitEZWxldGVQb3J0MzJBIChMUFNUUiBwTmFtZSwgSFdORDMyIGhXbmQsIExQU1RSIHBQb3J0TmFtZSkKK3sKKyAgICBGSVhNRShwcmludCwgIiglcywweCUwOHgsJXMpOnN0dWIhXG4iLCBwTmFtZSwgaFduZCwgcFBvcnROYW1lKTsKKyAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICAgIHJldHVybiBGQUxTRTsKK30KKwpkaWZmIC0tZ2l0IGEvbWlzYy9yZWdpc3RyeS5jIGIvbWlzYy9yZWdpc3RyeS5jCmluZGV4IDU1MzA3ZTUuLjAxYjc0OTggMTAwNjQ0Ci0tLSBhL21pc2MvcmVnaXN0cnkuYworKysgYi9taXNjL3JlZ2lzdHJ5LmMKQEAgLTIsMjEgKzIsMTkgQEAKICAqIAlSZWdpc3RyeSBGdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgMTk5NiBNYXJjdXMgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAxOTk4IE1hdHRoZXcgQmVja2VyCiAgKgogICogRGVjZW1iZXIgMjEsIDE5OTcgLSBLZXZpbiBDb3plbnMKICAqIEZpeGVkIGJ1Z3MgaW4gdGhlIF93OTVfbG9hZHJlZygpIGZ1bmN0aW9uLiBBZGRlZCBleHRyYSBpbmZvcm1hdGlvbgogICogcmVnYXJkaW5nIHRoZSBmb3JtYXQgb2YgdGhlIFdpbmRvd3MgJzk1IHJlZ2lzdHJ5IGZpbGVzLgogICoKLSAqIE1heSA1LCAxOTk4IC0gTWF0dGhldyBCZWNrZXIKLSAqIENoYW5nZWQgb3B0aW9uZmxhZ3MgdG8gRFdPUkQgaW5zdGVhZCBvZiBpbnQgYmVjYXVzZSBpdCBjb3VsZCBiZSAweDgwMDAwMDAKLSAqIEFsbCBlcnJvciByZXR1cm4gdmFsdWVzIG11c3QgY29tZSBmcm9tIHdpbmVycm9yLmgKLSAqCiAgKiBOT1RFUwogICogICAgV2hlbiBjaGFuZ2luZyB0aGlzIGZpbGUsIHBsZWFzZSByZS1ydW4gdGhlIHJlZ3Rlc3QgcHJvZ3JhbSB0byBlbnN1cmUKICAqICAgIHRoZSBjb25kaXRpb25zIGFyZSBoYW5kbGVkIHByb3Blcmx5LgogICoKICAqIFRPRE8KICAqICAgIFNlY3VyaXR5IGFjY2VzcworICogICAgT3B0aW9uIGhhbmRsaW5nCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtOTMsOCArOTEsMTggQEAKICNkZWZpbmUgVU5JQ09OVk1BU0sJKCgxPDxSRUdfU1opfCgxPDxSRUdfTVVMVElfU1opfCgxPDxSRUdfRVhQQU5EX1NaKSkKIAogCitzdGF0aWMgc3RydWN0IG9wZW5oYW5kbGUgeworCUxQS0VZU1RSVUNUCWxwa2V5OworCUhLRVkJCWhrZXk7CisJUkVHU0FNCQlhY2Nlc3NtYXNrOworfSAgKm9wZW5oYW5kbGVzPU5VTEw7CitzdGF0aWMgaW50CW5yb2ZvcGVuaGFuZGxlcz0wOworLyogU3RhcnRzIGFmdGVyIDEgYmVjYXVzZSAwLDEgYXJlIHJlc2VydmVkIGZvciBXaW4xNiAqLworc3RhdGljIGludAljdXJyZW50aGFuZGxlPTE7CisKKwogLyoKLSAqIEZJWE1FCisgKiBRVUVTVElPTgogICogICBBcmUgdGhlc2UgZG9pbmcgdGhlIHNhbWUgYXMgSEVBUF9zdHJkdXBBdG9XIGFuZCBIRUFQX3N0cmR1cFd0b0E/CiAgKiAgIElmIHNvLCBjYW4gd2UgcmVtb3ZlIHRoZW0/CiAgKiBBTlNXRVIKQEAgLTEwNCwzMCArMTEyLDU5IEBACiAgKi8KIHN0YXRpYyBMUFdTVFIgc3RyZHVwQTJXKExQQ1NUUiBzcmMpCiB7CisgICAgaWYoc3JjKSB7CiAJTFBXU1RSIGRlc3Q9eG1hbGxvYygyKnN0cmxlbihzcmMpKzIpOwogCWxzdHJjcHlBdG9XKGRlc3Qsc3JjKTsKIAlyZXR1cm4gZGVzdDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBMUFdTVFIgc3RyZHVwVyhMUENXU1RSIGEpIHsKIAlMUFdTVFIJYjsKIAlpbnQJbGVuOwogCisgICAgaWYoYSkgewogCWxlbj1zaXplb2YoV0NIQVIpKihsc3RybGVuMzJXKGEpKzEpOwogCWI9KExQV1NUUil4bWFsbG9jKGxlbik7CiAJbWVtY3B5KGIsYSxsZW4pOwogCXJldHVybiBiOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworTFBXU1RSIHN0cmN2dEEyVyhMUENTVFIgc3JjLCBpbnQgbmNoYXJzKQorCit7CisgICBMUFdTVFIgZGVzdCA9IHhtYWxsb2MgKDIgKiBuY2hhcnMgKyAyKTsKKworICAgbHN0cmNweW5BdG9XKGRlc3Qsc3JjLG5jaGFycysxKTsKKyAgIGRlc3RbbmNoYXJzXSA9IDA7CisgICByZXR1cm4gZGVzdDsKIH0KIAogCi1zdGF0aWMgc3RydWN0IG9wZW5oYW5kbGUgewotCUxQS0VZU1RSVUNUCWxwa2V5OwotCUhLRVkJCWhrZXk7Ci0JUkVHU0FNCQlhY2Nlc3NtYXNrOwotfSAgKm9wZW5oYW5kbGVzPU5VTEw7Ci1zdGF0aWMgaW50CW5yb2ZvcGVuaGFuZGxlcz0wOwotc3RhdGljIGludAljdXJyZW50aGFuZGxlPTE7Ci0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGlzX3N0YW5kYXJkX2hrZXkgW0ludGVybmFsXQorICogRGV0ZXJtaW5lcyBpZiBhIGhrZXkgaXMgYSBzdGFuZGFyZCBrZXkKKyAqLworc3RhdGljIEJPT0wzMiBpc19zdGFuZGFyZF9oa2V5KCBIS0VZIGhrZXkgKQoreworICAgIHN3aXRjaChoa2V5KSB7CisgICAgICAgIGNhc2UgMHgwMDAwMDAwMDoKKyAgICAgICAgY2FzZSAweDAwMDAwMDAxOgorICAgICAgICBjYXNlIEhLRVlfQ0xBU1NFU19ST09UOgorICAgICAgICBjYXNlIEhLRVlfQ1VSUkVOVF9DT05GSUc6CisgICAgICAgIGNhc2UgSEtFWV9DVVJSRU5UX1VTRVI6CisgICAgICAgIGNhc2UgSEtFWV9MT0NBTF9NQUNISU5FOgorICAgICAgICBjYXNlIEhLRVlfVVNFUlM6CisgICAgICAgIGNhc2UgSEtFWV9QRVJGT1JNQU5DRV9EQVRBOgorICAgICAgICBjYXNlIEhLRVlfRFlOX0RBVEE6CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGFkZF9oYW5kbGUgW0ludGVybmFsXQpAQCAtMTM3LDkgKzE3NCw2IEBACiAgICAgaW50IGk7CiAKICAgICBUUkFDRShyZWcsIigleCwlcCwlbHgpXG4iLGhrZXksbHBrZXksYWNjZXNzbWFzayk7Ci0gICAgaWYgKGxwa2V5KQotICAgICAgICBUUkFDRShyZWcsIiAoJXMpXG4iLGRlYnVnc3RyX3cobHBrZXktPmtleW5hbWUpKTsKLQogICAgIC8qIENoZWNrIGZvciBkdXBsaWNhdGVzICovCiAgICAgZm9yIChpPTA7aTxucm9mb3BlbmhhbmRsZXM7aSsrKSB7CiAgICAgICAgIGlmIChvcGVuaGFuZGxlc1tpXS5scGtleT09bHBrZXkpIHsKQEAgLTIxMiw3ICsyNDYsNiBAQAogICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGxvb2t1cF9oa2V5IFtJbnRlcm5hbF0KICAqIApAQCAtNDMxLDggKzQ2NCwxMiBAQAogICogW0hLRVlfQ1VSUkVOVF9VU0VSXFxTb2Z0d2FyZVxcVGhlIFdJTkUgdGVhbVxcV0lORVxcUmVnaXN0cnldCiAgKiBTYXZlT25seVVwZGF0ZWRLZXlzPXllcwogICovCi1zdGF0aWMgaW50Ci1fc2F2ZV9jaGVja190YWludGVkKExQS0VZU1RSVUNUIGxwa2V5KSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIF9zYXZlX2NoZWNrX3RhaW50ZWQgW0ludGVybmFsXQorICovCitzdGF0aWMgaW50IF9zYXZlX2NoZWNrX3RhaW50ZWQoIExQS0VZU1RSVUNUIGxwa2V5ICkKK3sKIAlpbnQJCXRhaW50ZWQ7CiAKIAlpZiAoIWxwa2V5KQpAQCAtNDUxLDggKzQ4OCwxMSBAQAogCXJldHVybiB0YWludGVkOwogfQogCi1zdGF0aWMgdm9pZAotX3NhdmVfVVNUUklORyhGSUxFICpGLExQV1NUUiB3c3RyLGludCBlc2NhcGVlcSkgeworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogX3NhdmVfVVNUUklORyBbSW50ZXJuYWxdCisgKi8KK3N0YXRpYyB2b2lkIF9zYXZlX1VTVFJJTkcoIEZJTEUgKkYsIExQV1NUUiB3c3RyLCBpbnQgZXNjYXBlZXEgKQorewogCUxQV1NUUglzOwogCWludAlkb2VzY2FwZTsKIApAQCAtNDc3LDggKzUxNywxMSBAQAogCX0KIH0KIAotc3RhdGljIGludAotX3NhdmVzdWJrZXkoRklMRSAqRixMUEtFWVNUUlVDVCBscGtleSxpbnQgbGV2ZWwsaW50IGFsbCkgeworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogX3NhdmVzdWJrZXkgW0ludGVybmFsXQorICovCitzdGF0aWMgaW50IF9zYXZlc3Via2V5KCBGSUxFICpGLCBMUEtFWVNUUlVDVCBscGtleSwgaW50IGxldmVsLCBpbnQgYWxsICkKK3sKIAlMUEtFWVNUUlVDVAlscHhrZXk7CiAJaW50CQlpLHRhYnMsajsKIApAQCAtNTE1LDE1ICs1NTgsMjMgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludAotX3NhdmVzdWJyZWcoRklMRSAqRixMUEtFWVNUUlVDVCBscGtleSxpbnQgYWxsKSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIF9zYXZlc3VicmVnIFtJbnRlcm5hbF0KKyAqLworc3RhdGljIGludCBfc2F2ZXN1YnJlZyggRklMRSAqRiwgTFBLRVlTVFJVQ1QgbHBrZXksIGludCBhbGwgKQorewogCWZwcmludGYoRiwiV0lORSBSRUdJU1RSWSBWZXJzaW9uICVkXG4iLFJFR0lTVFJZX1NBVkVfVkVSU0lPTik7CiAJX3NhdmVfY2hlY2tfdGFpbnRlZChscGtleS0+bmV4dHN1Yik7CiAJcmV0dXJuIF9zYXZlc3Via2V5KEYsbHBrZXktPm5leHRzdWIsMCxhbGwpOwogfQogCi1zdGF0aWMgQk9PTDMyCi1fc2F2ZXJlZyhMUEtFWVNUUlVDVCBscGtleSxjaGFyICpmbixpbnQgYWxsKSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIF9zYXZlcmVnIFtJbnRlcm5hbF0KKyAqLworc3RhdGljIEJPT0wzMiBfc2F2ZXJlZyggTFBLRVlTVFJVQ1QgbHBrZXksIGNoYXIgKmZuLCBpbnQgYWxsICkKK3sKIAlGSUxFCSpGOwogCiAJRj1mb3BlbihmbiwidyIpOwpAQCAtNjE3LDkgKzY2OCwxMSBAQAogCQlXQVJOKHJlZywiRmFpbGVkIHRvIGdldCBob21lZGlyZWN0b3J5IG9mIFVJRCAlZC5cbiIsZ2V0dWlkKCkpOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKiogTE9BRCBSZWdpc3RyeSBGdW5jdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogX2ZpbmRfb3JfYWRkX2tleSBbSW50ZXJuYWxdCiAgKi8KQEAgLTY0OSwxMSArNzAyLDEyIEBACiAJcmV0dXJuIGxweGtleTsKIH0KIAotc3RhdGljIHZvaWQKLV9maW5kX29yX2FkZF92YWx1ZSgKLQlMUEtFWVNUUlVDVCBscGtleSxMUFdTVFIgbmFtZSxEV09SRCB0eXBlLExQQllURSBkYXRhLERXT1JEIGxlbiwKLQlEV09SRCBsYXN0bW9kaWZpZWQKLSkgeworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogX2ZpbmRfb3JfYWRkX3ZhbHVlIFtJbnRlcm5hbF0KKyAqLworc3RhdGljIHZvaWQgX2ZpbmRfb3JfYWRkX3ZhbHVlKCBMUEtFWVNUUlVDVCBscGtleSwgTFBXU1RSIG5hbWUsIERXT1JEIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQllURSBkYXRhLCBEV09SRCBsZW4sIERXT1JEIGxhc3Rtb2RpZmllZCApCit7CiAJTFBLRVlWQUxVRQl2YWw9TlVMTDsKIAlpbnQJCWk7CiAKQEAgLTY5OCwxMSArNzUyLDE0IEBACiB9CiAKIAotLyogcmVhZHMgYSBsaW5lIGluY2x1ZGluZyBkeW5hbWljYWxseSBlbmxhcmdpbmcgdGhlIHJlYWRidWZmZXIgYW5kIHRocm93aW5nCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBfd2luZV9yZWFkX2xpbmUgW0ludGVybmFsXQorICoKKyAqIHJlYWRzIGEgbGluZSBpbmNsdWRpbmcgZHluYW1pY2FsbHkgZW5sYXJnaW5nIHRoZSByZWFkYnVmZmVyIGFuZCB0aHJvd2luZwogICogYXdheSBjb21tZW50cwogICovCi1zdGF0aWMgaW50IAotX3dpbmVfcmVhZF9saW5lKEZJTEUgKkYsY2hhciAqKmJ1ZixpbnQgKmxlbikgeworc3RhdGljIGludCBfd2luZV9yZWFkX2xpbmUoIEZJTEUgKkYsIGNoYXIgKipidWYsIGludCAqbGVuICkKK3sKIAljaGFyCSpzLCpjdXJyZWFkOwogCWludAlteWxlbixjdXJvZmY7CiAKQEAgLTc0MCwxMSArNzk3LDE1IEBACiAJcmV0dXJuIDE7CiB9CiAKLS8qIGNvbnZlcnRzIGEgY2hhciogaW50byBhIFVOSUNPREUgc3RyaW5nICh1cCB0byBhIHNwZWNpYWwgY2hhcikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogX3dpbmVfcmVhZF9VU1RSSU5HIFtJbnRlcm5hbF0KKyAqCisgKiBjb252ZXJ0cyBhIGNoYXIqIGludG8gYSBVTklDT0RFIHN0cmluZyAodXAgdG8gYSBzcGVjaWFsIGNoYXIpCiAgKiBhbmQgcmV0dXJucyB0aGUgcG9zaXRpb24gZXhhY3RseSBhZnRlciB0aGF0IHN0cmluZwogICovCi1zdGF0aWMgY2hhcioKLV93aW5lX3JlYWRfVVNUUklORyhjaGFyICpidWYsTFBXU1RSICpzdHIpIHsKK3N0YXRpYyBjaGFyKiBfd2luZV9yZWFkX1VTVFJJTkcoIGNoYXIgKmJ1ZiwgTFBXU1RSICpzdHIgKQorewogCWNoYXIJKnM7CiAJTFBXU1RSCXdzOwogCkBAIC0xMTE0LDE2ICsxMTc1LDYgQEAKICAgaW50ICBsYXN0bW9kaWZpZWQ7CiB9OwogCi1MUFdTVFIgc3RyY3Z0QTJXKExQQ1NUUiBzcmMsIGludCBuY2hhcnMpCi0KLXsKLSAgIExQV1NUUiBkZXN0ID0geG1hbGxvYyAoMiAqIG5jaGFycyArIDIpOwotCi0gICBsc3RyY3B5bkF0b1coZGVzdCxzcmMsbmNoYXJzKzEpOwotICAgZGVzdFtuY2hhcnNdID0gMDsKLSAgIHJldHVybiBkZXN0OwotfQotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIF93OTVfcHJvY2Vzc0tleSBbSW50ZXJuYWxdCkBAIC0xMjM5LDggKzEyOTAsMTEgQEAKIAlyZXR1cm4gKGxweGtleSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1fdzk1X3dhbGtyZ2tuKExQS0VZU1RSVUNUIHByZXZrZXksIGNoYXIgKm9mZiwgc3RydWN0IF93OTVfaW5mbyAqaW5mbykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIF93OTVfd2Fsa3Jna24gW0ludGVybmFsXQorICovCitzdGF0aWMgdm9pZCBfdzk1X3dhbGtyZ2tuKCBMUEtFWVNUUlVDVCBwcmV2a2V5LCBjaGFyICpvZmYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IF93OTVfaW5mbyAqaW5mbyApCiAKIHsKICAgLyogRGlzayBLZXkgRW50cnkgc3RydWN0dXJlIChSR0tOIHBhcnQpICovCkBAIC0xMjg2LDggKzEzNDAsMTIgQEAKICAgcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZAotX3c5NV9sb2FkcmVnKGNoYXIqIGZuLExQS0VZU1RSVUNUIGxwa2V5KSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIF93OTVfbG9hZHJlZyBbSW50ZXJuYWxdCisgKi8KK3N0YXRpYyB2b2lkIF93OTVfbG9hZHJlZyggY2hhciogZm4sIExQS0VZU1RSVUNUIGxwa2V5ICkKK3sKIAlIRklMRTMyCQloZmQ7CiAJY2hhcgkJbWFnaWNbNV07CiAJdW5zaWduZWQgbG9uZwl3aGVyZSx2ZXJzaW9uLHJnZGJzZWN0aW9uLGVuZDsKQEAgLTE2NDQsOCArMTcwMiw2IEBACiAgKiBBbGwgZnVuY3Rpb25zIGFyZSBzdHVicyB0byBSZWdPcGVuS2V5RXgzMlcgd2hlcmUgYWxsIHRoZQogICogbWFnaWMgaGFwcGVucy4gCiAgKgotICogRklYTUU6IHNlY3VyaXR5LG9wdGlvbnMsZGVzaXJlZGFjY2VzcywuLi4KLSAqCiAgKiBDYWxscGF0aDoKICAqIFJlZ09wZW5LZXkxNiAtPiBSZWdPcGVuS2V5MzJBIC0+IFJlZ09wZW5LZXlFeDMyQSBcCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdPcGVuS2V5MzJXICAgLT4gUmVnT3BlbktleUV4MzJXIApAQCAtMTY3OSwxMSArMTczNSw5IEBACiAgICAgVFJBQ0UocmVnLCIoJXgsJXMsJWxkLCVseCwlcClcbiIsIGhrZXksZGVidWdzdHJfdyhscHN6U3ViS2V5KSxkd1Jlc2VydmVkLAogICAgICAgICAgIHNhbURlc2lyZWQscmV0a2V5KTsKIAotICAgIGxwTmV4dEtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOwotICAgIGlmICghbHBOZXh0S2V5KSB7Ci0gICAgICAgIFdBUk4ocmVnLCJJbnZhbGlkIGhhbmRsZTogJXhcbiIsaGtleSk7CisgICAgbHBOZXh0S2V5ID0gbG9va3VwX2hrZXkoIGhrZXkgKTsKKyAgICBpZiAoIWxwTmV4dEtleSkKICAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfSEFORExFOwotICAgIH0KIAogICAgIGlmICghbHBzelN1YktleSB8fCAhKmxwc3pTdWJLZXkpIHsKICAgICAgICAgLyogRWl0aGVyIE5VTEwgb3IgcG9pbnRlciB0byBlbXB0eSBzdHJpbmcsIHNvIHJldHVybiBhIG5ldyBoYW5kbGUKQEAgLTE2OTMsNiArMTc0NywxMSBAQAogICAgICAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKICAgICB9CiAKKyAgICBpZiAobHBzelN1YktleVswXSA9PSAnXFwnKSB7CisgICAgICAgIFdBUk4ocmVnLCJTdWJrZXkgJXMgbXVzdCBub3QgYmVnaW4gd2l0aCBiYWNrc2xhc2guXG4iLGRlYnVnc3RyX3cobHBzelN1YktleSkpOworICAgICAgICByZXR1cm4gRVJST1JfQkFEX1BBVEhOQU1FOworICAgIH0KKwogCXNwbGl0X2tleXBhdGgobHBzelN1YktleSwmd3BzLCZ3cGMpOwogCWkgPSAwOwogCXdoaWxlICgoaTx3cGMpICYmICh3cHNbaV1bMF09PSdcMCcpKSBpKys7CkBAIC0xNzEwLDcgKzE3NjksNyBAQAogICAgICAgICBpZiAoIWxweGtleSkgewogICAgICAgICAgICAgVFJBQ0UocmVnLCJDb3VsZCBub3QgZmluZCBzdWJrZXkgJXNcbiIsZGVidWdzdHJfdyh3cHNbaV0pKTsKICAgICAgICAgICAgIEZSRUVfS0VZX1BBVEg7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQkFES0VZOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOwogICAgICAgICB9CiAgICAgICAgIGkrKzsKICAgICAgICAgbHBOZXh0S2V5ID0gbHB4a2V5OwpAQCAtMTcyNSw0MCArMTc4NCw1MiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJlZ09wZW5LZXkzMlcgW0FEVkFQSTMyLjE1MV0KLSAqLwotRFdPUkQgV0lOQVBJIFJlZ09wZW5LZXkzMlcoIEhLRVkgaGtleSwgTFBDV1NUUiBscHN6U3ViS2V5LCBMUEhLRVkgcmV0a2V5ICkKLXsKLSAgICBUUkFDRShyZWcsIigleCwlcywlcClcbiIsaGtleSxkZWJ1Z3N0cl93KGxwc3pTdWJLZXkpLHJldGtleSk7Ci0gICAgcmV0dXJuIFJlZ09wZW5LZXlFeDMyVyhoa2V5LGxwc3pTdWJLZXksMCxLRVlfQUxMX0FDQ0VTUyxyZXRrZXkpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJlZ09wZW5LZXlFeDMyQSBbQURWQVBJMzIuMTQ5XQogICovCiBEV09SRCBXSU5BUEkgUmVnT3BlbktleUV4MzJBKCBIS0VZIGhrZXksIExQQ1NUUiBscHN6U3ViS2V5LCBEV09SRCBkd1Jlc2VydmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHU0FNIHNhbURlc2lyZWQsIExQSEtFWSByZXRrZXkgKQogewotICAgIExQV1NUUiBscHN6U3ViS2V5VyA9IEhFQVBfc3RyZHVwQXRvVyhHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelN1YktleSk7CisgICAgTFBXU1RSIGxwc3pTdWJLZXlXID0gc3RyZHVwQTJXKGxwc3pTdWJLZXkpOwogICAgIERXT1JEIHJldDsKIAogICAgIFRSQUNFKHJlZywiKCV4LCVzLCVsZCwlbHgsJXApXG4iLGhrZXksZGVidWdzdHJfYShscHN6U3ViS2V5KSxkd1Jlc2VydmVkLAogICAgICAgICAgIHNhbURlc2lyZWQscmV0a2V5KTsKLQotICAgIHJldCA9IFJlZ09wZW5LZXlFeDMyVyhoa2V5LGxwc3pTdWJLZXlXLGR3UmVzZXJ2ZWQsc2FtRGVzaXJlZCxyZXRrZXkpOwotICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxscHN6U3ViS2V5Vyk7CisgICAgcmV0ID0gUmVnT3BlbktleUV4MzJXKCBoa2V5LCBscHN6U3ViS2V5VywgZHdSZXNlcnZlZCwgc2FtRGVzaXJlZCwgcmV0a2V5ICk7CisgICAgZnJlZShscHN6U3ViS2V5Vyk7CiAgICAgcmV0dXJuIHJldDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdPcGVuS2V5MzJXIFtBRFZBUEkzMi4xNTFdCisgKgorICogUEFSQU1TCisgKiAgICBoa2V5ICAgICAgIFtJXSBIYW5kbGUgb2Ygb3BlbiBrZXkKKyAqICAgIGxwc3pTdWJLZXkgW0ldIEFkZHJlc3Mgb2YgbmFtZSBvZiBzdWJrZXkgdG8gb3BlbgorICogICAgcmV0a2V5ICAgICBbT10gQWRkcmVzcyBvZiBoYW5kbGUgb2Ygb3BlbiBrZXkKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBFUlJPUl9TVUNDRVNTCisgKiAgICBGYWlsdXJlOiBFcnJvciBjb2RlCisgKi8KK0RXT1JEIFdJTkFQSSBSZWdPcGVuS2V5MzJXKCBIS0VZIGhrZXksIExQQ1dTVFIgbHBzelN1YktleSwgTFBIS0VZIHJldGtleSApCit7CisgICAgVFJBQ0UocmVnLCIoJXgsJXMsJXApXG4iLGhrZXksZGVidWdzdHJfdyhscHN6U3ViS2V5KSxyZXRrZXkpOworICAgIHJldHVybiBSZWdPcGVuS2V5RXgzMlcoIGhrZXksIGxwc3pTdWJLZXksIDAsIEtFWV9BTExfQUNDRVNTLCByZXRrZXkgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSZWdPcGVuS2V5MzJBIFtBRFZBUEkzMi4xNDhdCiAgKi8KIERXT1JEIFdJTkFQSSBSZWdPcGVuS2V5MzJBKCBIS0VZIGhrZXksIExQQ1NUUiBscHN6U3ViS2V5LCBMUEhLRVkgcmV0a2V5ICkKIHsKKyAgICBEV09SRCByZXQ7CisgICAgTFBXU1RSIGxwc3pTdWJLZXlXID0gc3RyZHVwQTJXKGxwc3pTdWJLZXkpOwogICAgIFRSQUNFKHJlZywiKCV4LCVzLCVwKVxuIixoa2V5LGRlYnVnc3RyX2EobHBzelN1YktleSkscmV0a2V5KTsKLSAgICByZXR1cm4gUmVnT3BlbktleUV4MzJBKGhrZXksbHBzelN1YktleSwwLEtFWV9BTExfQUNDRVNTLHJldGtleSk7CisgICAgcmV0ID0gIFJlZ09wZW5LZXkzMlcoIGhrZXksIGxwc3pTdWJLZXlXLCByZXRrZXkgKTsKKyAgICBmcmVlKGxwc3pTdWJLZXlXKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKQEAgLTE3NjgsNyArMTgzOSw3IEBACiBEV09SRCBXSU5BUEkgUmVnT3BlbktleTE2KCBIS0VZIGhrZXksIExQQ1NUUiBscHN6U3ViS2V5LCBMUEhLRVkgcmV0a2V5ICkKIHsKICAgICBUUkFDRShyZWcsIigleCwlcywlcClcbiIsaGtleSxkZWJ1Z3N0cl9hKGxwc3pTdWJLZXkpLHJldGtleSk7Ci0gICAgcmV0dXJuIFJlZ09wZW5LZXkzMkEoaGtleSxscHN6U3ViS2V5LHJldGtleSk7CisgICAgcmV0dXJuIFJlZ09wZW5LZXkzMkEoIGhrZXksIGxwc3pTdWJLZXksIHJldGtleSApOwogfQogCiAKQEAgLTE3NzgsMTEgKzE4NDksMTIgQEAKICAqIEFsbCB0aG9zZSBmdW5jdGlvbnMgY29udmVydCB0aGVpciByZXNwZWN0aXZlIAogICogYXJndW1lbnRzIGFuZCBjYWxsIFJlZ0NyZWF0ZUtleUV4VyBhdCB0aGUgZW5kLgogICoKLSAqIEZJWE1FOiBubyBzZWN1cml0eSxubyBhY2Nlc3MgYXR0cmliLG5vIG9wdGlvbmhhbmRsaW5nIHlldC4KKyAqIFdlIHN0YXkgYXdheSBmcm9tIHRoZSBFeCBmdW5jdGlvbnMgYXMgbG9uZyBhcyBwb3NzaWJsZSBiZWNhdXNlIHRoZXJlIGFyZQorICogZGlmZmVyZW5jZXMgaW4gdGhlIHJldHVybiB2YWx1ZXMKICAqCiAgKiBDYWxscGF0aDoKLSAqIFJlZ0NyZWF0ZUtleTE2IC0+IFJlZ0NyZWF0ZUtleTMyQSAtPiBSZWdDcmVhdGVLZXlFeDMyQSBcCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnQ3JlYXRlS2V5MzJXICAgLT4gUmVnQ3JlYXRlS2V5RXgzMlcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdDcmVhdGVLZXlFeDMyQSBcCisgKiBSZWdDcmVhdGVLZXkxNiAtPiBSZWdDcmVhdGVLZXkzMkEgLT4gUmVnQ3JlYXRlS2V5MzJXICAgLT4gUmVnQ3JlYXRlS2V5RXgzMlcKICAqLwogCiAKQEAgLTE3OTAsOSArMTg2MiwxNSBAQAogICogUmVnQ3JlYXRlS2V5RXgzMlcgW0FEVkFQSTMyLjEzMV0KICAqCiAgKiBQQVJBTVMKLSAqICAgIC4uLgotICogICAgcmV0a2V5ICAgW09dIEFkZHJlc3Mgb2YgYnVmZmVyIGZvciBvcGVuZWQgaGFuZGxlCi0gKiAgICBscERpc3BvcyBbT10gUmVjZWl2ZXMgUkVHX0NSRUFURURfTkVXX0tFWSBvciBSRUdfT1BFTkVEX0VYSVNUSU5HX0tFWQorICogICAgaGtleSAgICAgICAgIFtJXSBIYW5kbGUgb2YgYW4gb3BlbiBrZXkKKyAqICAgIGxwc3pTdWJLZXkgICBbSV0gQWRkcmVzcyBvZiBzdWJrZXkgbmFtZQorICogICAgZHdSZXNlcnZlZCAgIFtJXSBSZXNlcnZlZCAtIG11c3QgYmUgMAorICogICAgbHBzekNsYXNzICAgIFtJXSBBZGRyZXNzIG9mIGNsYXNzIHN0cmluZworICogICAgZmR3T3B0aW9ucyAgIFtJXSBTcGVjaWFsIG9wdGlvbnMgZmxhZworICogICAgc2FtRGVzaXJlZCAgIFtJXSBEZXNpcmVkIHNlY3VyaXR5IGFjY2VzcworICogICAgbHBTZWNBdHRyaWJzIFtJXSBBZGRyZXNzIG9mIGtleSBzZWN1cml0eSBzdHJ1Y3R1cmUKKyAqICAgIHJldGtleSAgICAgICBbT10gQWRkcmVzcyBvZiBidWZmZXIgZm9yIG9wZW5lZCBoYW5kbGUKKyAqICAgIGxwRGlzcG9zICAgICBbT10gUmVjZWl2ZXMgUkVHX0NSRUFURURfTkVXX0tFWSBvciBSRUdfT1BFTkVEX0VYSVNUSU5HX0tFWQogICovCiBEV09SRCBXSU5BUEkgUmVnQ3JlYXRlS2V5RXgzMlcoIEhLRVkgaGtleSwgTFBDV1NUUiBscHN6U3ViS2V5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdSZXNlcnZlZCwgTFBXU1RSIGxwc3pDbGFzcywgCkBAIC0xODA0LDE1ICsxODgyLDMwIEBACiAJTFBXU1RSCQkqd3BzOwogCWludAkJd3BjLGk7CiAKLSAgICAvKkZJWE1FOiBoYW5kbGUgc2VjdXJpdHkvYWNjZXNzL3doYXRldmVyICovCi0KICAgICBUUkFDRShyZWcsIigleCwlcywlbGQsJXMsJWx4LCVseCwlcCwlcCwlcClcbiIsIGhrZXksCiAJCWRlYnVnc3RyX3cobHBzelN1YktleSksIGR3UmVzZXJ2ZWQsIGRlYnVnc3RyX3cobHBzekNsYXNzKSwKIAkJZmR3T3B0aW9ucywgc2FtRGVzaXJlZCwgbHBTZWNBdHRyaWJzLCByZXRrZXksIGxwRGlzcG9zKTsKIAogICAgIGxwTmV4dEtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOwogICAgIGlmICghbHBOZXh0S2V5KQotICAgICAgICByZXR1cm4gRVJST1JfQkFES0VZOworICAgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9IQU5ETEU7CisKKyAgICAvKiBDaGVjayBmb3IgdmFsaWQgb3B0aW9ucyAqLworICAgIHN3aXRjaChmZHdPcHRpb25zKSB7CisgICAgICAgIGNhc2UgUkVHX09QVElPTl9OT05fVk9MQVRJTEU6CisgICAgICAgIGNhc2UgUkVHX09QVElPTl9WT0xBVElMRToKKyAgICAgICAgY2FzZSBSRUdfT1BUSU9OX0JBQ0tVUF9SRVNUT1JFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgLyogU2FtIGhhcyB0byBiZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgKi8KKyAgICBpZiAoIShzYW1EZXNpcmVkICYgCisgICAgICAgICAgKEtFWV9BTExfQUNDRVNTIHwgS0VZX0NSRUFURV9MSU5LIHwgS0VZX0NSRUFURV9TVUJfS0VZIHwgCisgICAgICAgICAgIEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMgfCBLRVlfRVhFQ1VURSB8IEtFWV9OT1RJRlkgfAorICAgICAgICAgICBLRVlfUVVFUllfVkFMVUUgfCBLRVlfUkVBRCB8IEtFWV9TRVRfVkFMVUUgfCBLRVlfV1JJVEUpKSkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogCiAJaWYgKCFscHN6U3ViS2V5IHx8ICEqbHBzelN1YktleSkgewogCQlhZGRfaGFuZGxlKCsrY3VycmVudGhhbmRsZSxscE5leHRLZXksc2FtRGVzaXJlZCk7CkBAIC0xOTAxLDIwICsxOTk0LDYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSZWdDcmVhdGVLZXkzMlcgW0FEVkFQSTMyLjEzMl0KLSAqLwotRFdPUkQgV0lOQVBJIFJlZ0NyZWF0ZUtleTMyVyggSEtFWSBoa2V5LCBMUENXU1RSIGxwc3pTdWJLZXksIExQSEtFWSByZXRrZXkgKQotewotICAgIERXT1JEIGp1bms7Ci0KLSAgICBUUkFDRShyZWcsIigleCwlcywlcClcbiIsIGhrZXksZGVidWdzdHJfdyhscHN6U3ViS2V5KSxyZXRrZXkpOwotICAgIHJldHVybiBSZWdDcmVhdGVLZXlFeDMyVyggaGtleSwgbHBzelN1YktleSwgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT1BUSU9OX05PTl9WT0xBVElMRSwgS0VZX0FMTF9BQ0NFU1MsTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGtleSwgJmp1bmspOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJlZ0NyZWF0ZUtleUV4MzJBIFtBRFZBUEkzMi4xMzBdCiAgKi8KIERXT1JEIFdJTkFQSSBSZWdDcmVhdGVLZXlFeDMyQSggSEtFWSBoa2V5LCBMUENTVFIgbHBzelN1YktleSwgRFdPUkQgZHdSZXNlcnZlZCwKQEAgLTE5MzAsNTEgKzIwMDksNTUgQEAKICAgICAgICAgICBkd1Jlc2VydmVkLGRlYnVnc3RyX2EobHBzekNsYXNzKSxmZHdPcHRpb25zLHNhbURlc2lyZWQsbHBTZWNBdHRyaWJzLAogICAgICAgICAgIHJldGtleSxscERpc3Bvcyk7CiAKLSAgICBscHN6U3ViS2V5VyA9IEhFQVBfc3RyZHVwQXRvVyhHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelN1YktleSk7Ci0vKgotCWlmIChscHN6U3ViS2V5KQotCQlscHN6U3ViS2V5Vz1zdHJkdXBBMlcobHBzelN1YktleSk7Ci0JZWxzZQotCQlscHN6U3ViS2V5Vz1OVUxMOwotKi8KLQlpZiAobHBzekNsYXNzKQotCQlscHN6Q2xhc3NXPXN0cmR1cEEyVyhscHN6Q2xhc3MpOwotCWVsc2UKLQkJbHBzekNsYXNzVz1OVUxMOworICAgIGxwc3pTdWJLZXlXID0gbHBzelN1YktleT9zdHJkdXBBMlcobHBzelN1YktleSk6TlVMTDsKKyAgICBscHN6Q2xhc3NXID0gbHBzekNsYXNzP3N0cmR1cEEyVyhscHN6Q2xhc3MpOk5VTEw7CisKICAgICByZXQgPSBSZWdDcmVhdGVLZXlFeDMyVyggaGtleSwgbHBzelN1YktleVcsIGR3UmVzZXJ2ZWQsIGxwc3pDbGFzc1csIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZHdPcHRpb25zLCBzYW1EZXNpcmVkLCBscFNlY0F0dHJpYnMsIHJldGtleSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRGlzcG9zICk7Ci0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pTdWJLZXlXKTsKLS8qCi0JaWYgKGxwc3pTdWJLZXlXKQotCQlmcmVlKGxwc3pTdWJLZXlXKTsKLSovCi0JaWYgKGxwc3pDbGFzc1cpCi0JCWZyZWUobHBzekNsYXNzVyk7CisKKyAgICBpZihscHN6U3ViS2V5VykgZnJlZShscHN6U3ViS2V5Vyk7CisgICAgaWYobHBzekNsYXNzVykgZnJlZShscHN6Q2xhc3NXKTsKKwogICAgIHJldHVybiByZXQ7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnQ3JlYXRlS2V5MzJXIFtBRFZBUEkzMi4xMzJdCisgKi8KK0RXT1JEIFdJTkFQSSBSZWdDcmVhdGVLZXkzMlcoIEhLRVkgaGtleSwgTFBDV1NUUiBscHN6U3ViS2V5LCBMUEhLRVkgcmV0a2V5ICkKK3sKKyAgICBEV09SRCBqdW5rOworICAgIExQS0VZU1RSVUNUCWxwTmV4dEtleTsKKworICAgIFRSQUNFKHJlZywiKCV4LCVzLCVwKVxuIiwgaGtleSxkZWJ1Z3N0cl93KGxwc3pTdWJLZXkpLHJldGtleSk7CisKKyAgICAvKiBUaGlzIGNoZWNrIGlzIGhlcmUgYmVjYXVzZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGRpZmZlcmVudCB0aGFuIHRoZQorICAgICAgIG9uZSBmcm9tIHRoZSBFeCBmdW5jdGlvbnMgKi8KKyAgICBscE5leHRLZXkgPSBsb29rdXBfaGtleShoa2V5KTsKKyAgICBpZiAoIWxwTmV4dEtleSkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0JBREtFWTsKKworICAgIHJldHVybiBSZWdDcmVhdGVLZXlFeDMyVyggaGtleSwgbHBzelN1YktleSwgMCwgTlVMTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfT1BUSU9OX05PTl9WT0xBVElMRSwgS0VZX0FMTF9BQ0NFU1MsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRrZXksICZqdW5rKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSZWdDcmVhdGVLZXkzMkEgW0FEVkFQSTMyLjEyOV0KICAqLwogRFdPUkQgV0lOQVBJIFJlZ0NyZWF0ZUtleTMyQSggSEtFWSBoa2V5LCBMUENTVFIgbHBzelN1YktleSwgTFBIS0VZIHJldGtleSApCiB7Ci0gICAgRFdPUkQganVuazsKKyAgICBEV09SRCByZXQ7CisgICAgTFBXU1RSIGxwc3pTdWJLZXlXOwogCiAgICAgVFJBQ0UocmVnLCIoJXgsJXMsJXApXG4iLGhrZXksZGVidWdzdHJfYShscHN6U3ViS2V5KSxyZXRrZXkpOwotCi0JcmV0dXJuCVJlZ0NyZWF0ZUtleUV4MzJBKAotCQloa2V5LAkJLyoga2V5IGhhbmRsZSAqLwotCQlscHN6U3ViS2V5LAkvKiBzdWJrZXkgbmFtZSAqLwotCQkwLAkJLyogcmVzZXJ2ZWQgPSAwICovCi0JCU5VTEwsCQkvKiBscHN6Q2xhc3M/IEZJWE1FOiA/ICovCi0JCVJFR19PUFRJT05fTk9OX1ZPTEFUSUxFLC8qIG9wdGlvbnMgKi8KLQkJS0VZX0FMTF9BQ0NFU1MsCS8qIGRlc2lyZWQgYWNjZXNzIGF0dHJpYnMgKi8KLQkJTlVMTCwJCS8qIGxwc2VjdXJpdHkgYXR0cmlidXRlcyAqLwotCQlyZXRrZXksCQkvKiBscHJldGtleSAqLwotCQkmanVuawkJLyogZGlzcG9zaXRpb24gdmFsdWUgKi8KLQkpOworICAgIGxwc3pTdWJLZXlXID0gbHBzelN1YktleT9zdHJkdXBBMlcobHBzelN1YktleSk6TlVMTDsKKyAgICByZXQgPSBSZWdDcmVhdGVLZXkzMlcoIGhrZXksIGxwc3pTdWJLZXlXLCByZXRrZXkgKTsKKyAgICBpZihscHN6U3ViS2V5VykgZnJlZShscHN6U3ViS2V5Vyk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogCkBAIC0yMDMwLDEwICsyMTEzLDEyIEBACiAgICAgICAgICAgbHBkd1Jlc2VydmVkLCBscGR3VHlwZSwgbHBiRGF0YSwgbHBjYkRhdGE/KmxwY2JEYXRhOjApOwogCiAgICAgbHBrZXkgPSBsb29rdXBfaGtleShoa2V5KTsKLSAgICBpZiAoIWxwa2V5KSB7Ci0gICAgICAgIFRSQUNFKHJlZywgIkludmFsaWQgaGFuZGxlKCV4KVxuIixoa2V5KTsKKyAgICBpZiAoIWxwa2V5KQogICAgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQorCisgICAgLyogUmVzZXJ2ZWQgbXVzdCBiZSBOVUxMIChhdCBsZWFzdCBmb3Igbm93KSAqLworICAgIGlmIChscGR3UmVzZXJ2ZWQpCisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKIAogICAgIC8qIEFuIGVtcHR5IG5hbWUgc3RyaW5nIGlzIGVxdWl2YWxlbnQgdG8gTlVMTCAqLwogICAgIGlmIChscFZhbHVlTmFtZSAmJiAhKmxwVmFsdWVOYW1lKQpAQCAtMjA2Niw3ICsyMTUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKHJlZywgIlJldHVybmluZyBhbiBlbXB0eSBzdHJpbmdcbiIpOwogCQkJcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiAJCX0KLQkJcmV0dXJuIEVSUk9SX0JBREtFWTsgLyogRklYTUUgKi8KKwkJcmV0dXJuIEVSUk9SX0JBRF9QQVRITkFNRTsKIAl9CiAKICAgICBpZiAobHBkd1R5cGUpCkBAIC0yMTIyLDkgKzIyMDcsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSZWdRdWVyeVZhbHVlMzJXIFtBRFZBUEkzMi4xNTldCi0gKgotICogTk9URVMKLSAqICAgIFdoeSBpcyB0aGlzIGNhbGxpbmcgUmVnT3BlbktleTMyVz8KICAqLwogRFdPUkQgV0lOQVBJIFJlZ1F1ZXJ5VmFsdWUzMlcoIEhLRVkgaGtleSwgTFBXU1RSIGxwc3pTdWJLZXksIExQV1NUUiBscHN6RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY2JEYXRhICkKQEAgLTIxMzUsMzMgKzIyMTcsMjcgQEAKICAgICBUUkFDRShyZWcsIigleCwlcywlcCwlbGQpXG4iLGhrZXksZGVidWdzdHJfdyhscHN6U3ViS2V5KSxscHN6RGF0YSwKICAgICAgICAgICBscGNiRGF0YT8qbHBjYkRhdGE6MCk7CiAKLQkvKiBvbmx5IG9wZW4gc3Via2V5LCBpZiB3ZSByZWFsbHkgZG8gZGVzY2VuZCAqLwotCWlmIChscHN6U3ViS2V5ICYmICpscHN6U3ViS2V5KSB7Ci0JCXJldAk9IFJlZ09wZW5LZXkzMlcoaGtleSxscHN6U3ViS2V5LCZ4aGtleSk7Ci0JCWlmIChyZXQhPUVSUk9SX1NVQ0NFU1MpCi0JCQlyZXR1cm4gcmV0OwotCX0gZWxzZQotCQl4aGtleQk9IGhrZXk7CisgICAgLyogT25seSBvcGVuIHN1YmtleSwgaWYgd2UgcmVhbGx5IGRvIGRlc2NlbmQgKi8KKyAgICBpZiAobHBzelN1YktleSAmJiAqbHBzelN1YktleSkgeworICAgICAgICByZXQgPSBSZWdPcGVuS2V5MzJXKCBoa2V5LCBscHN6U3ViS2V5LCAmeGhrZXkgKTsKKyAgICAgICAgaWYgKHJldCAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgICAgICBXQVJOKHJlZywgIkNvdWxkIG5vdCBvcGVuICVzXG4iLCBkZWJ1Z3N0cl93KGxwc3pTdWJLZXkpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgeGhrZXkgPSBoa2V5OwogCi0JbHBkd1R5cGUJPSBSRUdfU1o7Ci0JcmV0CT0gUmVnUXVlcnlWYWx1ZUV4MzJXKAotCQl4aGtleSwKLQkJTlVMTCwJCS8qIHZhcm5hbWUgTlVMTCAtPiBjb21wYXQgKi8KLQkJTlVMTCwJCS8qIGxwZHdSZXNlcnZlZCwgbXVzdCBiZSBOVUxMICovCi0JCSZscGR3VHlwZSwKLQkJKExQQllURSlscHN6RGF0YSwKLQkJbHBjYkRhdGEKLQkpOwotCWlmICh4aGtleSE9aGtleSkKLQkJUmVnQ2xvc2VLZXkoeGhrZXkpOwotCXJldHVybiByZXQ7CisgICAgbHBkd1R5cGUgPSBSRUdfU1o7CisgICAgcmV0ID0gUmVnUXVlcnlWYWx1ZUV4MzJXKCB4aGtleSwgTlVMTCwgTlVMTCwgJmxwZHdUeXBlLCAoTFBCWVRFKWxwc3pEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBjYkRhdGEgKTsKKyAgICBpZiAoeGhrZXkgIT0gaGtleSkKKyAgICAgICAgUmVnQ2xvc2VLZXkoeGhrZXkpOworICAgIHJldHVybiByZXQ7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUmVnUXVlcnlWYWx1ZUV4MzJBIFtBRFZBUEkzMi4xNTddCi0gKgotICogQ2FuIHRoaXMgdXNlIEhFQVBfc3RyZHVwQXRvVz8KICAqLwogRFdPUkQgV0lOQVBJIFJlZ1F1ZXJ5VmFsdWVFeDMyQSggSEtFWSBoa2V5LCBMUFNUUiBscHN6VmFsdWVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscGR3UmVzZXJ2ZWQsIExQRFdPUkQgbHBkd1R5cGUsCkBAIC0yMTc2LDI3ICsyMjUyLDE5IEBACiAgICAgVFJBQ0UocmVnLCIoJXgsJXMsJXAsJXAsJXAsJWxkKVxuIiwgaGtleSxkZWJ1Z3N0cl9hKGxwc3pWYWx1ZU5hbWUpLAogICAgICAgICAgIGxwZHdSZXNlcnZlZCxscGR3VHlwZSxscGJEYXRhLGxwY2JEYXRhPypscGNiRGF0YTowKTsKIAotICAgIGlmIChscHN6VmFsdWVOYW1lKQotICAgICAgICBscHN6VmFsdWVOYW1lVz1zdHJkdXBBMlcobHBzelZhbHVlTmFtZSk7Ci0gICAgZWxzZSAKLSAgICAgICAgbHBzelZhbHVlTmFtZVc9TlVMTDsKKyAgICBscHN6VmFsdWVOYW1lVyA9IGxwc3pWYWx1ZU5hbWU/c3RyZHVwQTJXKGxwc3pWYWx1ZU5hbWUpOk5VTEw7CiAKKyAgICAvKiBXaHkgd291bGQgdGhpcyBiZSBzZXQ/IEl0IGlzIGp1c3QgYW4gb3V0cHV0ICovCiAgICAgaWYgKGxwZHdUeXBlKQotICAgICAgICB0eXBlPSpscGR3VHlwZTsKKyAgICAgICAgdHlwZSA9ICpscGR3VHlwZTsKIAogCWlmIChscGJEYXRhKSB7CiAJCW15eGxlbiAgPSAwOwogCQlteWxlbgk9ICZteXhsZW47CiAJCWJ1Zgk9IHhtYWxsb2MoNCk7CiAgICAgICAgICAgICAgICAgLyogT25seSBnZXQgdGhlIHNpemUgZm9yIG5vdyAqLwotCQlyZXQ9UmVnUXVlcnlWYWx1ZUV4MzJXKAotCQkJaGtleSwKLQkJCWxwc3pWYWx1ZU5hbWVXLAotCQkJbHBkd1Jlc2VydmVkLAotCQkJJnR5cGUsCi0JCQlidWYsCi0JCQlteWxlbgotCQkpOworCQlyZXQgPSBSZWdRdWVyeVZhbHVlRXgzMlcoIGhrZXksIGxwc3pWYWx1ZU5hbWVXLCBscGR3UmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZSwgYnVmLCBteWxlbiApOwogCQlmcmVlKGJ1Zik7CiAJCWlmIChyZXQ9PUVSUk9SX01PUkVfREFUQSkgewogCQkJYnVmCT0gKExQQllURSl4bWFsbG9jKCpteWxlbik7CkBAIC0yMjA1LDYgKzIyNzMsNyBAQAogCQkJbXl4bGVuICA9IDIqKCpscGNiRGF0YSk7CiAJCX0KIAl9IGVsc2UgeworCQkvKiBEYXRhIGlzIG5vdCByZXF1aXJlZCAqLwogCQlidWY9TlVMTDsKIAkJaWYgKGxwY2JEYXRhKSB7CiAJCQlteXhsZW4JPSAqbHBjYkRhdGEqMjsKQEAgLTIyMTIsMTUgKzIyODEsMTAgQEAKIAkJfSBlbHNlCiAJCQlteWxlbgk9IE5VTEw7CiAJfQorCiAgICAgICAgIC8qIE5vdyBnZXQgdGhlIGRhdGEgKi8KLQlyZXQ9UmVnUXVlcnlWYWx1ZUV4MzJXKAotCQloa2V5LAotCQlscHN6VmFsdWVOYW1lVywKLQkJbHBkd1Jlc2VydmVkLAotCQkmdHlwZSwKLQkJYnVmLAotCQlteWxlbgotCSk7CisJcmV0ID0gUmVnUXVlcnlWYWx1ZUV4MzJXKCBoa2V5LCBscHN6VmFsdWVOYW1lVywgbHBkd1Jlc2VydmVkLCAmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIG15bGVuICk7CiAJaWYgKGxwZHdUeXBlKSAKIAkJKmxwZHdUeXBlPXR5cGU7CiAKQEAgLTIyNDYsOSArMjMxMCw5IEBACiAJCWlmICgoVU5JQ09OVk1BU0sgJiAoMTw8KHR5cGUpKSkgJiYgbHBjYkRhdGEpCiAJCQkqbHBjYkRhdGEJPSBteXhsZW4vMjsKIAl9Ci0JaWYgKGJ1ZikKLQkJZnJlZShidWYpOwogCisgICAgaWYoYnVmKSBmcmVlKGJ1Zik7CisgICAgaWYobHBzelZhbHVlTmFtZVcpIGZyZWUobHBzelZhbHVlTmFtZVcpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTIyNjksNDIgKzIzMzMsMjkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUmVnUXVlcnlWYWx1ZTMyQSBbQURWQVBJMzIuMTU2XQotICoKLSAqIE5PVEVTCi0gKiAgICBXaHkgaXMgdGhpcyBjYWxsaW5nIFJlZ09wZW5LZXkxNj8KICAqLwotRFdPUkQgV0lOQVBJIFJlZ1F1ZXJ5VmFsdWUzMkEoCi0JSEtFWQloa2V5LAotCUxQU1RSCWxwc3pTdWJLZXksCi0JTFBTVFIJbHBzekRhdGEsCi0JTFBEV09SRAlscGNiRGF0YQotKSB7Ci0JSEtFWQl4aGtleTsKLQlEV09SRAlyZXQsbHBkd1R5cGU7CitEV09SRCBXSU5BUEkgUmVnUXVlcnlWYWx1ZTMyQSggSEtFWSBoa2V5LCBMUFNUUiBscHN6U3ViS2V5LCBMUFNUUiBscHN6RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY2JEYXRhICkKK3sKKyAgICBIS0VZIHhoa2V5OworICAgIERXT1JEIHJldCwgZHdUeXBlOwogCiAgICAgVFJBQ0UocmVnLCIoJXgsJXMsJXAsJWxkKVxuIixoa2V5LGRlYnVnc3RyX2EobHBzelN1YktleSksbHBzekRhdGEsCiAgICAgICAgICAgbHBjYkRhdGE/KmxwY2JEYXRhOjApOwogCi0JLyogb25seSBvcGVuIHN1YmtleSwgaWYgd2UgcmVhbGx5IGRvIGRlc2NlbmQgKi8KLQlpZiAobHBzelN1YktleSAmJiAqbHBzelN1YktleSkgewotCQlyZXQgPSBSZWdPcGVuS2V5MTYoaGtleSxscHN6U3ViS2V5LCZ4aGtleSk7Ci0JCWlmIChyZXQhPUVSUk9SX1NVQ0NFU1MpCi0JCQlyZXR1cm4gcmV0OwotCX0gZWxzZQotCQl4aGtleQk9IGhrZXk7CisgICAgaWYgKGxwc3pTdWJLZXkgJiYgKmxwc3pTdWJLZXkpIHsKKyAgICAgICAgcmV0ID0gUmVnT3BlbktleTE2KCBoa2V5LCBscHN6U3ViS2V5LCAmeGhrZXkgKTsKKyAgICAgICAgaWYoIHJldCAhPSBFUlJPUl9TVUNDRVNTICkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlCisgICAgICAgIHhoa2V5ID0gaGtleTsKIAotCWxwZHdUeXBlCT0gUkVHX1NaOwotCXJldAk9IFJlZ1F1ZXJ5VmFsdWVFeDMyQSgKLQkJeGhrZXksCi0JCU5VTEwsCQkvKiBscHN6VmFsdWVOYW1lIE5VTEwgLT4gY29tcGF0ICovCi0JCU5VTEwsCQkvKiBscGR3UmVzZXJ2ZWQsIG11c3QgYmUgTlVMTCAqLwotCQkmbHBkd1R5cGUsCi0JCShMUEJZVEUpbHBzekRhdGEsCi0JCWxwY2JEYXRhCi0JKTsKLQlpZiAoeGhrZXkhPWhrZXkpCi0JCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKLQlyZXR1cm4gcmV0OworICAgIGR3VHlwZSA9IFJFR19TWjsKKyAgICByZXQgPSBSZWdRdWVyeVZhbHVlRXgzMkEoIHhoa2V5LCBOVUxMLE5VTEwsICZkd1R5cGUsIChMUEJZVEUpbHBzekRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGNiRGF0YSApOworICAgIGlmKCB4aGtleSAhPSBoa2V5ICkKKyAgICAgICAgUmVnQ2xvc2VLZXkoIHhoa2V5ICk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogCkBAIC0yMzgwLDExICsyNDMxLDkgQEAKICAgICAgICAgICAgIFRSQUNFKHJlZywiVW5rbm93biB0eXBlOiAlbGRcbiIsIGR3VHlwZSk7CiAgICAgfQogCi0JbHBrZXkgPSBsb29rdXBfaGtleShoa2V5KTsKLQlpZiAoIWxwa2V5KSB7Ci0gICAgICAgICAgICBXQVJOKHJlZywiUmV0dXJuaW5nIGJhZGtleVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICAgIH0KKyAgICBscGtleSA9IGxvb2t1cF9oa2V5KCBoa2V5ICk7CisgICAgaWYgKCFscGtleSkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfSEFORExFOwogCiAJbHBrZXktPmZsYWdzIHw9IFJFR19PUFRJT05fVEFJTlRFRDsKIApAQCAtMjQyNyw4ICsyNDc2LDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJlZ1NldFZhbHVlRXgzMkEgW0FEVkFQSTMyLjE2OV0KICAqCi0gKiBOT1RFUwotICogICAgQ2FuIHRoaXMgdXNlIHRoZSBzdGFuZGFyZCBIRUFQX3N0cmR1cEF0b1cgaW5zdGVhZD8KICAqLwogRFdPUkQgV0lOQVBJIFJlZ1NldFZhbHVlRXgzMkEoIEhLRVkgaGtleSwgTFBTVFIgbHBzelZhbHVlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1Jlc2VydmVkLCBEV09SRCBkd1R5cGUsIExQQllURSBscGJEYXRhLApAQCAtMjQ3NSwxMyArMjUyMiw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSZWdTZXRWYWx1ZTMyVwlbQURWQVBJMzIuMTcxXQogICovCi1EV09SRCBXSU5BUEkgUmVnU2V0VmFsdWUzMlcoCi0JSEtFWQloa2V5LAotCUxQQ1dTVFIJbHBzelN1YktleSwKLQlEV09SRAlkd1R5cGUsCi0JTFBDV1NUUglscHN6RGF0YSwKLQlEV09SRAljYkRhdGEKLSkgeworRFdPUkQgV0lOQVBJIFJlZ1NldFZhbHVlMzJXKCBIS0VZIGhrZXksIExQQ1dTVFIgbHBzelN1YktleSwgRFdPUkQgZHdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwc3pEYXRhLCBEV09SRCBjYkRhdGEgKQorewogCUhLRVkJeGhrZXk7CiAJRFdPUkQJcmV0OwogCkBAIC0yNDk1LDExICsyNTM4LDExIEBACiAJfSBlbHNlCiAJCXhoa2V5PWhrZXk7CiAJaWYgKGR3VHlwZSE9UkVHX1NaKSB7Ci0JCVRSQUNFKHJlZywiUmVnU2V0VmFsdWVYIGNhbGxlZCB3aXRoIGR3VHlwZT0lbGQhXG4iLGR3VHlwZSk7CisJCVRSQUNFKHJlZywiZHdUeXBlPSVsZCAtIENoYW5naW5nIHRvIFJFR19TWlxuIixkd1R5cGUpOwogCQlkd1R5cGU9UkVHX1NaOwogCX0KIAlpZiAoY2JEYXRhIT0yKmxzdHJsZW4zMlcobHBzekRhdGEpKzIpIHsKLQkJVFJBQ0UocmVnLCJSZWdTZXRWYWx1ZVggY2FsbGVkIHdpdGggbGVuPSVsZCAhPSBzdHJsZW4oJXMpKzE9JWQhXG4iLAorCQlUUkFDRShyZWcsIkxlbj0lbGQgIT0gc3RybGVuKCVzKSsxPSVkIVxuIiwKIAkJCWNiRGF0YSxkZWJ1Z3N0cl93KGxwc3pEYXRhKSwyKmxzdHJsZW4zMlcobHBzekRhdGEpKzIKIAkJKTsKIAkJY2JEYXRhPTIqbHN0cmxlbjMyVyhscHN6RGF0YSkrMjsKQEAgLTI1MTQsMjIgKzI1NTcsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJlZ1NldFZhbHVlMzJBIFtBRFZBUEkzMi4xNjhdCiAgKgotICogTk9URVMKLSAqICAgIFdoeSBpcyB0aGlzIGNhbGxpbmcgUmVnQ3JlYXRlS2V5MTY/CiAgKi8KLURXT1JEIFdJTkFQSSBSZWdTZXRWYWx1ZTMyQSgKLQlIS0VZCWhrZXksCi0JTFBDU1RSCWxwc3pTdWJLZXksCi0JRFdPUkQJZHdUeXBlLAotCUxQQ1NUUglscHN6RGF0YSwKLQlEV09SRAljYkRhdGEKLSkgeworRFdPUkQgV0lOQVBJIFJlZ1NldFZhbHVlMzJBKCBIS0VZIGhrZXksIExQQ1NUUiBscHN6U3ViS2V5LCBEV09SRCBkd1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscHN6RGF0YSwgRFdPUkQgY2JEYXRhICkKK3sKIAlEV09SRAlyZXQ7CiAJSEtFWQl4aGtleTsKIAotCVRSQUNFKHJlZywiKCV4LCVzLCVsZCwlcywlbGQpXG4iLAotCQloa2V5LGxwc3pTdWJLZXksZHdUeXBlLGxwc3pEYXRhLGNiRGF0YQotCSk7CisJVFJBQ0UocmVnLCIoJXgsJXMsJWxkLCVzLCVsZClcbiIsaGtleSxscHN6U3ViS2V5LGR3VHlwZSxscHN6RGF0YSxjYkRhdGEpOwogCWlmIChscHN6U3ViS2V5ICYmICpscHN6U3ViS2V5KSB7CiAJCXJldD1SZWdDcmVhdGVLZXkxNihoa2V5LGxwc3pTdWJLZXksJnhoa2V5KTsKIAkJaWYgKHJldCE9RVJST1JfU1VDQ0VTUykKQEAgLTI1MzgsNyArMjU3Myw3IEBACiAJCXhoa2V5PWhrZXk7CiAKIAlpZiAoZHdUeXBlIT1SRUdfU1opIHsKLQkJVFJBQ0UocmVnLCJSZWdTZXRWYWx1ZUEgY2FsbGVkIHdpdGggZHdUeXBlPSVsZCFcbiIsZHdUeXBlKTsKKwkJVFJBQ0UocmVnLCJkd1R5cGU9JWxkIVxuIixkd1R5cGUpOwogCQlkd1R5cGU9UkVHX1NaOwogCX0KIAlpZiAoY2JEYXRhIT1zdHJsZW4obHBzekRhdGEpKzEpCkBAIC0yNTg0LDcgKzI2MTksNyBAQAogICAgIFRSQUNFKHJlZywiKCV4LCVsZCwlcCwlbGQsJXAsJXAsJXAsJXApXG4iLGhrZXksaVN1YmtleSxscHN6TmFtZSwKICAgICAgICAgICAqbHBjY2hOYW1lLGxwZHdSZXNlcnZlZCxscHN6Q2xhc3MsbHBjY2hDbGFzcyxmdCk7CiAKLSAgICBscGtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOworICAgIGxwa2V5ID0gbG9va3VwX2hrZXkoIGhrZXkgKTsKICAgICBpZiAoIWxwa2V5KQogICAgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAKQEAgLTI2MjIsMTcgKzI2NTcsMTQgQEAKIH0KIAogCi0vKiBSZWdFbnVtS2V5RXhBCQlbQURWQVBJMzIuMTM4XSAqLwotRFdPUkQgV0lOQVBJIFJlZ0VudW1LZXlFeDMyQSgKLQlIS0VZCWhrZXksCi0JRFdPUkQJaVN1YmtleSwKLQlMUFNUUglscHN6TmFtZSwKLQlMUERXT1JECWxwY2NoTmFtZSwKLQlMUERXT1JECWxwZHdSZXNlcnZlZCwKLQlMUFNUUglscHN6Q2xhc3MsCi0JTFBEV09SRAlscGNjaENsYXNzLAotCUZJTEVUSU1FCSpmdAotKSB7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdFbnVtS2V5RXgzMkEgW0FEVkFQSTMyLjEzOF0KKyAqLworRFdPUkQgV0lOQVBJIFJlZ0VudW1LZXlFeDMyQSggSEtFWSBoa2V5LCBEV09SRCBpU3Via2V5LCBMUFNUUiBscHN6TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBjY2hOYW1lLCBMUERXT1JEIGxwZHdSZXNlcnZlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscHN6Q2xhc3MsIExQRFdPUkQgbHBjY2hDbGFzcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFVElNRSAqZnQgKQorewogCURXT1JECXJldCxscGNjaE5hbWVXLGxwY2NoQ2xhc3NXOwogCUxQV1NUUglscHN6TmFtZVcsbHBzekNsYXNzVzsKIApAQCAtMjcxNSwyOSArMjc0NywzNCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSZWdFbnVtVmFsdWUzMlcgW0FEVkFQSTMyLjE0Ml0KKyAqCisgKiBQQVJBTVMKKyAqICAgIGhrZXkgICBbSV0KKyAqICAgIGlWYWx1ZSBbSV0KKyAqICAgIC4uLgogICovCi1EV09SRCBXSU5BUEkgUmVnRW51bVZhbHVlMzJXKAotCUhLRVkgaGtleSwKLQlEV09SRCBpVmFsdWUsCi0JTFBXU1RSIGxwc3pWYWx1ZSwKLQlMUERXT1JECWxwY2NoVmFsdWUsCi0JTFBEV09SRAlscGRSZXNlcnZlZCwKLQlMUERXT1JECWxwZHdUeXBlLAotCUxQQllURQlscGJEYXRhLAotCUxQRFdPUkQJbHBjYkRhdGEKLSkgeworRFdPUkQgV0lOQVBJIFJlZ0VudW1WYWx1ZTMyVyggSEtFWSBoa2V5LCBEV09SRCBpVmFsdWUsIExQV1NUUiBscHN6VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY2NoVmFsdWUsIExQRFdPUkQgbHBkUmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdUeXBlLCBMUEJZVEUgbHBiRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY2JEYXRhICkKK3sKIAlMUEtFWVNUUlVDVAlscGtleTsKIAlMUEtFWVZBTFVFCXZhbDsKIAotCVRSQUNFKHJlZywiKCV4LCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsCi0JCWhrZXksaVZhbHVlLGxwc3pWYWx1ZSxscGNjaFZhbHVlLGxwZFJlc2VydmVkLGxwZHdUeXBlLGxwYkRhdGEsbHBjYkRhdGEKLQkpOwotCWxwa2V5ID0gbG9va3VwX2hrZXkoaGtleSk7Ci0JaWYgKCFscGtleSkKLQkJcmV0dXJuIEVSUk9SX0lOVkFMSURfSEFORExFOworICAgIFRSQUNFKHJlZywiKCV4LCVsZCwlcCwlcCwlcCwlcCwlcCwlcClcbiIsaGtleSxpVmFsdWUsZGVidWdzdHJfdyhscHN6VmFsdWUpLAorICAgICAgICAgIGxwY2NoVmFsdWUsbHBkUmVzZXJ2ZWQsbHBkd1R5cGUsbHBiRGF0YSxscGNiRGF0YSk7CisKKyAgICBscGtleSA9IGxvb2t1cF9oa2V5KCBoa2V5ICk7CisgICAgaWYgKCFscGtleSkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfSEFORExFOworCisgICAgLyogTm9uZSBhc2tlZCBmb3IgKi8KKyAgICBpZiAoIWlWYWx1ZSkKKyAgICAgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiAKIAlpZiAobHBrZXktPm5yb2Z2YWx1ZXM8PWlWYWx1ZSkKIAkJcmV0dXJuIEVSUk9SX05PX01PUkVfSVRFTVM7CisKIAl2YWwJPSBscGtleS0+dmFsdWVzK2lWYWx1ZTsKIAogCWlmICh2YWwtPm5hbWUpIHsKQEAgLTI3NjMsMTcgKzI4MDAsMTQgQEAKIH0KIAogCi0vKiBSZWdFbnVtVmFsdWVBCQlbQURWQVBJMzIuMTQxXSAqLwotRFdPUkQgV0lOQVBJIFJlZ0VudW1WYWx1ZTMyQSgKLQlIS0VZCWhrZXksCi0JRFdPUkQJaVZhbHVlLAotCUxQU1RSCWxwc3pWYWx1ZSwKLQlMUERXT1JECWxwY2NoVmFsdWUsCi0JTFBEV09SRAlscGRSZXNlcnZlZCwKLQlMUERXT1JECWxwZHdUeXBlLAotCUxQQllURQlscGJEYXRhLAotCUxQRFdPUkQJbHBjYkRhdGEKLSkgeworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnRW51bVZhbHVlMzJBIFtBRFZBUEkzMi4xNDFdCisgKi8KK0RXT1JEIFdJTkFQSSBSZWdFbnVtVmFsdWUzMkEoIEhLRVkgaGtleSwgRFdPUkQgaVZhbHVlLCBMUFNUUiBscHN6VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY2NoVmFsdWUsIExQRFdPUkQgbHBkUmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwZHdUeXBlLCBMUEJZVEUgbHBiRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY2JEYXRhICkKK3sKIAlMUFdTVFIJbHBzelZhbHVlVzsKIAlMUEJZVEUJbHBiRGF0YVc7CiAJRFdPUkQJcmV0LGxwY2JEYXRhVzsKQEAgLTI4NTAsNiArMjg4NCwxMiBAQAogRFdPUkQgV0lOQVBJIFJlZ0Nsb3NlS2V5KCBIS0VZIGhrZXkgKQogewogICAgIFRSQUNFKHJlZywiKCV4KVxuIixoa2V5KTsKKworICAgIC8qIFRoZSBzdGFuZGFyZCBoYW5kbGVzIGFyZSBhbGxvd2VkIHRvIHN1Y2NlZWQsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdAorICAgICAgIGNsb3NlZCAqLworICAgIGlmIChpc19zdGFuZGFyZF9oa2V5KGhrZXkpKQorICAgICAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKKwogICAgIHJldHVybiByZW1vdmVfaGFuZGxlKGhrZXkpOwogfQogCkBAIC0yODgyLDE2ICsyOTIyLDEzIEBACiAgICAgVFJBQ0UocmVnLCIoJXgsJXMpXG4iLGhrZXksZGVidWdzdHJfdyhscHN6U3ViS2V5KSk7CiAKICAgICBscE5leHRLZXkgPSBsb29rdXBfaGtleShoa2V5KTsKLSAgICBpZiAoIWxwTmV4dEtleSkgewotICAgICAgICBUUkFDRShyZWcsICIgIEludmFsaWQgaGFuZGxlLlxuIik7CisgICAgaWYgKCFscE5leHRLZXkpCiAgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKLSAgICB9CiAKLQkvKiB3ZSBuZWVkIHRvIGtub3cgdGhlIHByZXZpb3VzIGtleSBpbiB0aGUgaGllci4gKi8KLQlpZiAoIWxwc3pTdWJLZXkgfHwgISpscHN6U3ViS2V5KSB7Ci0JCVRSQUNFKHJlZywgIiAgQmFka2V5WzJdLlxuIik7Ci0JCXJldHVybiBFUlJPUl9CQURLRVk7Ci0JfQorICAgIC8qIFdlIG5lZWQgdG8ga25vdyB0aGUgcHJldmlvdXMga2V5IGluIHRoZSBoaWVyLiAqLworICAgIGlmICghbHBzelN1YktleSB8fCAhKmxwc3pTdWJLZXkpCisgICAgICAgIHJldHVybiBFUlJPUl9CQURLRVk7CisKIAlzcGxpdF9rZXlwYXRoKGxwc3pTdWJLZXksJndwcywmd3BjKTsKIAlpIAk9IDA7CiAJbHB4a2V5CT0gbHBOZXh0S2V5OwpAQCAtMjk1NiwxMCArMjk5MywxMCBAQAogICAgIExQV1NUUiBscHN6U3ViS2V5VzsKICAgICBEV09SRCAgcmV0OwogCi0gICAgVFJBQ0UocmVnLCIoJXgsJXMpXG4iLGhrZXksbHBzelN1YktleSk7Ci0gICAgbHBzelN1YktleVcgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwc3pTdWJLZXkgKTsKKyAgICBUUkFDRShyZWcsIigleCwlcylcbiIsaGtleSxkZWJ1Z3N0cl9hKGxwc3pTdWJLZXkpKTsKKyAgICBscHN6U3ViS2V5VyA9IGxwc3pTdWJLZXk/c3RyZHVwQTJXKGxwc3pTdWJLZXkpOk5VTEw7CiAgICAgcmV0ID0gUmVnRGVsZXRlS2V5MzJXKCBoa2V5LCBscHN6U3ViS2V5VyApOwotICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscHN6U3ViS2V5VyApOworICAgIGlmKGxwc3pTdWJLZXlXKSBmcmVlKGxwc3pTdWJLZXlXKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0yOTk5LDcgKzMwMzYsNyBAQAogCiAgICAgVFJBQ0UocmVnLCIoJXgsJXMpXG4iLGhrZXksZGVidWdzdHJfdyhscHN6VmFsdWUpKTsKIAotICAgIGxwa2V5ID0gbG9va3VwX2hrZXkoaGtleSk7CisgICAgbHBrZXkgPSBsb29rdXBfaGtleSggaGtleSApOwogICAgIGlmICghbHBrZXkpCiAgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKIApAQCAtMzA0NCw5ICszMDgxLDkgQEAKICAgICBEV09SRCAgcmV0OwogCiAgICAgVFJBQ0UocmVnLCAiKCV4LCVzKVxuIixoa2V5LGRlYnVnc3RyX2EobHBzelZhbHVlKSk7Ci0gICAgbHBzelZhbHVlVz1IRUFQX3N0cmR1cEF0b1coR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pWYWx1ZSk7CisgICAgbHBzelZhbHVlVyA9IGxwc3pWYWx1ZT9zdHJkdXBBMlcobHBzelZhbHVlKTpOVUxMOwogICAgIHJldCA9IFJlZ0RlbGV0ZVZhbHVlMzJXKCBoa2V5LCBscHN6VmFsdWVXICk7Ci0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pWYWx1ZVcpOworICAgIGlmKGxwc3pWYWx1ZVcpIGZyZWUobHBzelZhbHVlVyk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMzA1Nyw3ICszMDk0LDcgQEAKIERXT1JEIFdJTkFQSSBSZWdEZWxldGVWYWx1ZTE2KCBIS0VZIGhrZXksIExQU1RSIGxwc3pWYWx1ZSApCiB7CiAgICAgVFJBQ0UocmVnLCIoJXgsJXMpXG4iLCBoa2V5LGRlYnVnc3RyX2EobHBzelZhbHVlKSk7Ci0gICAgcmV0dXJuIFJlZ0RlbGV0ZVZhbHVlMzJBKGhrZXksbHBzelZhbHVlKTsKKyAgICByZXR1cm4gUmVnRGVsZXRlVmFsdWUzMkEoIGhrZXksIGxwc3pWYWx1ZSApOwogfQogCiAKQEAgLTMwNzQsOCArMzExMSwyMyBAQAogICovCiBEV09SRCBXSU5BUEkgUmVnRmx1c2hLZXkoIEhLRVkgaGtleSApCiB7Ci0gICAgRklYTUUocmVnLCAiKCV4KTogc3R1YlxuIiwgaGtleSk7Ci0gICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CisgICAgTFBLRVlTVFJVQ1QJbHBrZXk7CisgICAgQk9PTDMyIHJldDsKKworICAgIFRSQUNFKHJlZywgIigleClcbiIsIGhrZXkpOworCisgICAgbHBrZXkgPSBsb29rdXBfaGtleSggaGtleSApOworICAgIGlmICghbHBrZXkpCisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKKworICAgIEVSUihyZWcsICJXaGF0IGlzIHRoZSBjb3JyZWN0IGZpbGVuYW1lP1xuIik7CisKKyAgICByZXQgPSBfc2F2ZXJlZyggbHBrZXksICJmb28uYmFyIiwgVFJVRSk7CisKKyAgICBpZiggcmV0ICkgeworICAgICAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOS05PV047ICAvKiBGSVhNRSAqLwogfQogCiAKQEAgLTMyMTUsMTEgKzMyNjcsMjQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUmVnQ29ubmVjdFJlZ2lzdHJ5MzJXIFtBRFZBUEkzMi4xMjhdCisgKgorICogUEFSQU1TCisgKiAgICBscE1hY2hpbmVOYW1lIFtJXSBBZGRyZXNzIG9mIG5hbWUgb2YgcmVtb3RlIGNvbXB1dGVyCisgKiAgICBoSGV5ICAgICAgICAgIFtJXSBQcmVkZWZpbmVkIHJlZ2lzdHJ5IGhhbmRsZQorICogICAgcGhrUmVzdWx0ICAgICBbSV0gQWRkcmVzcyBvZiBidWZmZXIgZm9yIHJlbW90ZSByZWdpc3RyeSBoYW5kbGUKICAqLwotTE9ORyBXSU5BUEkgUmVnQ29ubmVjdFJlZ2lzdHJ5MzJXKCBMUENXU1RSIG1hY2hpbmUsIEhLRVkgaGtleSwgTFBIS0VZIHJlc2tleSApCitMT05HIFdJTkFQSSBSZWdDb25uZWN0UmVnaXN0cnkzMlcoIExQQ1dTVFIgbHBNYWNoaW5lTmFtZSwgSEtFWSBoS2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBIS0VZIHBoa1Jlc3VsdCApCiB7Ci0gICAgRklYTUUocmVnLCIoJXMsJXgsJXApOiBzdHViXG4iLGRlYnVnc3RyX3cobWFjaGluZSksaGtleSxyZXNrZXkpOwotICAgIHJldHVybiBFUlJPUl9CQURfTkVUUEFUSDsgLyogRklYTUUgKi8KKyAgICBUUkFDRShyZWcsIiglcywleCwlcCk6IHN0dWJcbiIsZGVidWdzdHJfdyhscE1hY2hpbmVOYW1lKSxoS2V5LHBoa1Jlc3VsdCk7CisKKyAgICBpZiAoIWxwTWFjaGluZU5hbWUgfHwgISpscE1hY2hpbmVOYW1lKSB7CisgICAgICAgIC8qIFVzZSB0aGUgbG9jYWwgbWFjaGluZSBuYW1lICovCisgICAgICAgIHJldHVybiBSZWdPcGVuS2V5MTYoIGhLZXksICIiLCBwaGtSZXN1bHQgKTsKKyAgICB9CisKKyAgICBGSVhNRShyZWcsIkNhbm5vdCBjb25uZWN0IHRvICVzXG4iLGRlYnVnc3RyX3cobHBNYWNoaW5lTmFtZSkpOworICAgIHJldHVybiBFUlJPUl9CQURfTkVUUEFUSDsKIH0KIAogCkBAIC0zMjI5LDkgKzMyOTQsOSBAQAogTE9ORyBXSU5BUEkgUmVnQ29ubmVjdFJlZ2lzdHJ5MzJBKCBMUENTVFIgbWFjaGluZSwgSEtFWSBoa2V5LCBMUEhLRVkgcmVza2V5ICkKIHsKICAgICBEV09SRCByZXQ7Ci0gICAgTFBXU1RSIG1hY2hpbmVXID0gSEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksMCxtYWNoaW5lKTsKKyAgICBMUFdTVFIgbWFjaGluZVcgPSBzdHJkdXBBMlcobWFjaGluZSk7CiAgICAgcmV0ID0gUmVnQ29ubmVjdFJlZ2lzdHJ5MzJXKCBtYWNoaW5lVywgaGtleSwgcmVza2V5ICk7Ci0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLG1hY2hpbmVXKTsKKyAgICBmcmVlKG1hY2hpbmVXKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0zMjQwLDYgKzMzMDUsMTIgQEAKICAqIFJlZ0dldEtleVNlY3VyaXR5IFtBRFZBUEkzMi4xNDRdCiAgKiBSZXRyaWV2ZXMgYSBjb3B5IG9mIHNlY3VyaXR5IGRlc2NyaXB0b3IgcHJvdGVjdGluZyB0aGUgcmVnaXN0cnkga2V5CiAgKgorICogUEFSQU1TCisgKiAgICBoa2V5ICAgICAgICAgICAgICAgICAgIFtJXSAgIE9wZW4gaGFuZGxlIG9mIGtleSB0byBzZXQKKyAqICAgIFNlY3VyaXR5SW5mb3JtYXRpb24gICAgW0ldICAgRGVzY3JpcHRvciBjb250ZW50cworICogICAgcFNlY3VyaXR5RGVzY3JpcHRvciAgICBbT10gICBBZGRyZXNzIG9mIGRlc2NyaXB0b3IgZm9yIGtleQorICogICAgbHBjYlNlY3VyaXR5RGVzY3JpcHRvciBbSS9PXSBBZGRyZXNzIG9mIHNpemUgb2YgYnVmZmVyIGFuZCBkZXNjcmlwdGlvbgorICoKICAqIFJFVFVSTlMKICAqICAgIFN1Y2Nlc3M6IEVSUk9SX1NVQ0NFU1MKICAqICAgIEZhaWx1cmU6IEVycm9yIGNvZGUKQEAgLTMyNTAsMjMgKzMzMjEsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY2JTZWN1cml0eURlc2NyaXB0b3IgKQogewogICAgIExQS0VZU1RSVUNUCWxwa2V5OwotICAgIGxwa2V5ID0gbG9va3VwX2hrZXkoaGtleSk7CisKKyAgICBGSVhNRShyZWcsICIoJXgsJWxkLCVwLCVsZCk6IHN0dWJcbiIsaGtleSxTZWN1cml0eUluZm9ybWF0aW9uLAorICAgICAgICAgIHBTZWN1cml0eURlc2NyaXB0b3IsbHBjYlNlY3VyaXR5RGVzY3JpcHRvcj8qbHBjYlNlY3VyaXR5RGVzY3JpcHRvcjowKTsKKworICAgIGxwa2V5ID0gbG9va3VwX2hrZXkoIGhrZXkgKTsKICAgICBpZiAoIWxwa2V5KQogICAgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAKLSAgICBGSVhNRShyZWcsICIoJWQsJWxkLCVwLCVwKTogc3R1YlxuIiwgaGtleSwgU2VjdXJpdHlJbmZvcm1hdGlvbiwKLSAgICAgICAgICBwU2VjdXJpdHlEZXNjcmlwdG9yLCBscGNiU2VjdXJpdHlEZXNjcmlwdG9yKTsKKyAgICBpZiAoKmxwY2JTZWN1cml0eURlc2NyaXB0b3IgPCBzaXplb2YoKnBTZWN1cml0eURlc2NyaXB0b3IpKQorICAgICAgICByZXR1cm4gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUjsKKwogICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJlZ0xvYWRLZXkzMlcgW0FEVkFQSTMyLj8/P10KKyAqCisgKiBQQVJBTVMKKyAqICAgIGhrZXkgICAgICAgW0ldIEhhbmRsZSBvZiBvcGVuIGtleQorICogICAgbHBzelN1YktleSBbSV0gQWRkcmVzcyBvZiBuYW1lIG9mIHN1YmtleQorICogICAgbHBzekZpbGUgICBbSV0gQWRkcmVzcyBvZiBmaWxlbmFtZSBmb3IgcmVnaXN0cnkgaW5mb3JtYXRpb24KICAqLwogTE9ORyBXSU5BUEkgUmVnTG9hZEtleTMyVyggSEtFWSBoa2V5LCBMUENXU1RSIGxwc3pTdWJLZXksIExQQ1dTVFIgbHBzekZpbGUgKQogeworICAgIExQS0VZU1RSVUNUCWxwa2V5OwogICAgIEZJWE1FKHJlZywiKCV4LCVzLCVzKTogc3R1YlxuIixoa2V5LGRlYnVnc3RyX3cobHBzelN1YktleSksCiAgICAgICAgICAgZGVidWdzdHJfdyhscHN6RmlsZSkpOworCisgICAgLyogRG8gdGhpcyBjaGVjayBiZWZvcmUgdGhlIGhrZXkgY2hlY2sgKi8KKyAgICBpZiAoIWxwc3pTdWJLZXkgfHwgISpscHN6U3ViS2V5IHx8ICFscHN6RmlsZSB8fCAhKmxwc3pGaWxlKQorICAgICAgICByZXR1cm4gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICBscGtleSA9IGxvb2t1cF9oa2V5KCBoa2V5ICk7CisgICAgaWYgKCFscGtleSkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfSEFORExFOworCiAgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiB9CiAKQEAgLTMyNzcsMzAgKzMzNjgsNDcgQEAKIExPTkcgV0lOQVBJIFJlZ0xvYWRLZXkzMkEoIEhLRVkgaGtleSwgTFBDU1RSIGxwc3pTdWJLZXksIExQQ1NUUiBscHN6RmlsZSApCiB7CiAgICAgTE9ORyByZXQ7Ci0gICAgTFBXU1RSIGxwc3pTdWJLZXlXID0gSEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksMCxscHN6U3ViS2V5KTsKLSAgICBMUFdTVFIgbHBzekZpbGVXID0gSEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksMCxscHN6RmlsZSk7CisgICAgTFBXU1RSIGxwc3pTdWJLZXlXID0gc3RyZHVwQTJXKGxwc3pTdWJLZXkpOworICAgIExQV1NUUiBscHN6RmlsZVcgPSBzdHJkdXBBMlcobHBzekZpbGUpOwogICAgIHJldCA9IFJlZ0xvYWRLZXkzMlcoIGhrZXksIGxwc3pTdWJLZXlXLCBscHN6RmlsZVcgKTsKLSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzekZpbGVXKTsKLSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelN1YktleVcpOworICAgIGlmKGxwc3pGaWxlVykgZnJlZShscHN6RmlsZVcpOworICAgIGlmKGxwc3pTdWJLZXlXKSBmcmVlKGxwc3pTdWJLZXlXKTsKICAgICByZXR1cm4gcmV0OwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJlZ05vdGlmeUNoYW5nZUtleVZhbHVlIFtBRFZBUEkzMi4/Pz9dCisgKgorICogUEFSQU1TCisgKiAgICBoa2V5ICAgICAgICAgICAgW0ldIEhhbmRsZSBvZiBrZXkgdG8gd2F0Y2gKKyAqICAgIGZXYXRjaFN1YlRyZWUgICBbSV0gRmxhZyBmb3Igc3Via2V5IG5vdGlmaWNhdGlvbgorICogICAgZmR3Tm90aWZ5RmlsdGVyIFtJXSBDaGFuZ2VzIHRvIGJlIHJlcG9ydGVkCisgKiAgICBoRXZlbnQgICAgICAgICAgW0ldIEhhbmRsZSBvZiBzaWduYWxlZCBldmVudAorICogICAgZkFzeW5jICAgICAgICAgIFtJXSBGbGFnIGZvciBhc3luY2hyb25vdXMgcmVwb3J0aW5nCiAgKi8KIExPTkcgV0lOQVBJIFJlZ05vdGlmeUNoYW5nZUtleVZhbHVlKCBIS0VZIGhrZXksIEJPT0wzMiBmV2F0Y2hTdWJUcmVlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBmZHdOb3RpZnlGaWx0ZXIsIEhBTkRMRTMyIGhFdmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgZkFzeW5jICkKIHsKLSAgICBGSVhNRShyZWcsIigleCwlaSwlbGQsJWQsJWkpOiBzdHViXG4iLGhrZXksZldhdGNoU3ViVHJlZSxmZHdOb3RpZnlGaWx0ZXIsCisgICAgTFBLRVlTVFJVQ1QJbHBrZXk7CisgICAgRklYTUUocmVnLCIoJXgsJWksJWxkLCV4LCVpKTogc3R1YlxuIixoa2V5LGZXYXRjaFN1YlRyZWUsZmR3Tm90aWZ5RmlsdGVyLAogICAgICAgICAgIGhFdmVudCxmQXN5bmMpOworCisgICAgbHBrZXkgPSBsb29rdXBfaGtleSggaGtleSApOworICAgIGlmICghbHBrZXkpCisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKKwogICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJlZ1VuTG9hZEtleTMyVyBbQURWQVBJMzIuMTczXQorICoKKyAqIFBBUkFNUworICogICAgaGtleSAgICAgW0ldIEhhbmRsZSBvZiBvcGVuIGtleQorICogICAgbHBTdWJLZXkgW0ldIEFkZHJlc3Mgb2YgbmFtZSBvZiBzdWJrZXkgdG8gdW5sb2FkCiAgKi8KIExPTkcgV0lOQVBJIFJlZ1VuTG9hZEtleTMyVyggSEtFWSBoa2V5LCBMUENXU1RSIGxwU3ViS2V5ICkKIHsKQEAgLTMzMTUsMzEgKzM0MjMsNzEgQEAKIExPTkcgV0lOQVBJIFJlZ1VuTG9hZEtleTMyQSggSEtFWSBoa2V5LCBMUENTVFIgbHBTdWJLZXkgKQogewogICAgIExPTkcgcmV0OwotICAgIExQV1NUUiBscFN1YktleVcgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwU3ViS2V5ICk7CisgICAgTFBXU1RSIGxwU3ViS2V5VyA9IHN0cmR1cEEyVyhscFN1YktleSk7CiAgICAgcmV0ID0gUmVnVW5Mb2FkS2V5MzJXKCBoa2V5LCBscFN1YktleVcgKTsKLSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBTdWJLZXlXICk7CisgICAgaWYobHBTdWJLZXlXKSBmcmVlKGxwU3ViS2V5Vyk7CiAgICAgcmV0dXJuIHJldDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSZWdTZXRLZXlTZWN1cml0eSBbQURWQVBJMzIuMTY3XQorICoKKyAqIFBBUkFNUworICogICAgaGtleSAgICAgICAgICBbSV0gT3BlbiBoYW5kbGUgb2Yga2V5IHRvIHNldAorICogICAgU2VjdXJpdHlJbmZvICBbSV0gRGVzY3JpcHRvciBjb250ZW50cworICogICAgcFNlY3VyaXR5RGVzYyBbSV0gQWRkcmVzcyBvZiBkZXNjcmlwdG9yIGZvciBrZXkKICAqLwogTE9ORyBXSU5BUEkgUmVnU2V0S2V5U2VjdXJpdHkoIEhLRVkgaGtleSwgU0VDVVJJVFlfSU5GT1JNQVRJT04gU2VjdXJpdHlJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfREVTQ1JJUFRPUiBwU2VjdXJpdHlEZXNjICkKIHsKLSAgICBGSVhNRShyZWcsICIleCwlbGQsJXApOiBzdHViXG4iLCBoa2V5LCBTZWN1cml0eUluZm8sIHBTZWN1cml0eURlc2MpOworICAgIExQS0VZU1RSVUNUCWxwa2V5OworCisgICAgRklYTUUocmVnLCAiKCV4LCVsZCwlcCk6IHN0dWJcbiIsIGhrZXksIFNlY3VyaXR5SW5mbywgcFNlY3VyaXR5RGVzYyk7CisKKyAgICAvKiBJdCBzZWVtcyB0byBwZXJmb3JtIHRoaXMgY2hlY2sgYmVmb3JlIHRoZSBoa2V5IGNoZWNrICovCisgICAgaWYgKChTZWN1cml0eUluZm8gJiBPV05FUl9TRUNVUklUWV9JTkZPUk1BVElPTikgfHwKKyAgICAgICAgKFNlY3VyaXR5SW5mbyAmIEdST1VQX1NFQ1VSSVRZX0lORk9STUFUSU9OKSB8fAorICAgICAgICAoU2VjdXJpdHlJbmZvICYgREFDTF9TRUNVUklUWV9JTkZPUk1BVElPTikgfHwKKyAgICAgICAgKFNlY3VyaXR5SW5mbyAmIFNBQ0xfU0VDVVJJVFlfSU5GT1JNQVRJT04pKSB7CisgICAgICAgIC8qIFBhcmFtIE9LICovCisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKworICAgIGlmICghcFNlY3VyaXR5RGVzYykKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworCisgICAgbHBrZXkgPSBsb29rdXBfaGtleSggaGtleSApOworICAgIGlmICghbHBrZXkpCisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKKwogICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJlZ1NhdmVLZXkzMlcgW0FEVkFQSTMyLjE2Nl0KKyAqCisgKiBQQVJBTVMKKyAqICAgIGhrZXkgICBbSV0gSGFuZGxlIG9mIGtleSB3aGVyZSBzYXZlIGJlZ2lucworICogICAgbHBGaWxlIFtJXSBBZGRyZXNzIG9mIGZpbGVuYW1lIHRvIHNhdmUgdG8KKyAqICAgIHNhICAgICBbSV0gQWRkcmVzcyBvZiBzZWN1cml0eSBzdHJ1Y3R1cmUKICAqLwogTE9ORyBXSU5BUEkgUmVnU2F2ZUtleTMyVyggSEtFWSBoa2V5LCBMUENXU1RSIGxwRmlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgc2EgKQogewotICAgIEZJWE1FKHJlZywgIiV4LCVzLCVwKTogc3R1YlxuIiwgaGtleSwgZGVidWdzdHJfdyhscEZpbGUpLCBzYSk7CisgICAgTFBLRVlTVFJVQ1QJbHBrZXk7CisKKyAgICBGSVhNRShyZWcsICIoJXgsJXMsJXApOiBzdHViXG4iLCBoa2V5LCBkZWJ1Z3N0cl93KGxwRmlsZSksIHNhKTsKKworICAgIC8qIEl0IGFwcGVhcnMgdG8gZG8gdGhpcyBjaGVjayBiZWZvcmUgdGhlIGhrZXkgY2hlY2sgKi8KKyAgICBpZiAoIWxwRmlsZSB8fCAhKmxwRmlsZSkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworCisgICAgbHBrZXkgPSBsb29rdXBfaGtleSggaGtleSApOworICAgIGlmICghbHBrZXkpCisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKKwogICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCkBAIC0zMzUxLDE5ICszNDk5LDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgc2EgKQogewogICAgIExPTkcgcmV0OwotICAgIExQV1NUUiBscEZpbGVXID0gSEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwRmlsZSk7CisgICAgTFBXU1RSIGxwRmlsZVcgPSBzdHJkdXBBMlcobHBGaWxlKTsKICAgICByZXQgPSBSZWdTYXZlS2V5MzJXKCBoa2V5LCBscEZpbGVXLCBzYSApOwotICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEZpbGVXICk7CisgICAgZnJlZShscEZpbGVXKTsKICAgICByZXR1cm4gcmV0OwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJlZ1Jlc3RvcmVLZXkzMlcgW0FEVkFQSTMyLjE2NF0KKyAqCisgKiBQQVJBTVMKKyAqICAgIGhrZXkgICAgW0ldIEhhbmRsZSBvZiBrZXkgd2hlcmUgcmVzdG9yZSBiZWdpbnMKKyAqICAgIGxwRmlsZSAgW0ldIEFkZHJlc3Mgb2YgZmlsZW5hbWUgY29udGFpbmluZyBzYXZlZCB0cmVlCisgKiAgICBkd0ZsYWdzIFtJXSBPcHRpb25hbCBmbGFncwogICovCiBMT05HIFdJTkFQSSBSZWdSZXN0b3JlS2V5MzJXKCBIS0VZIGhrZXksIExQQ1dTVFIgbHBGaWxlLCBEV09SRCBkd0ZsYWdzICkKIHsKLSAgICBGSVhNRShyZWcsICIleCwlcywlbGQpOiBzdHViXG4iLCBoa2V5LCBkZWJ1Z3N0cl93KGxwRmlsZSksIGR3RmxhZ3MpOworICAgIExQS0VZU1RSVUNUCWxwa2V5OworICAgIEZJWE1FKHJlZywgIigleCwlcywlbGQpOiBzdHViXG4iLCBoa2V5LCBkZWJ1Z3N0cl93KGxwRmlsZSksIGR3RmxhZ3MpOworCisgICAgLyogSXQgc2VlbXMgdG8gZG8gdGhpcyBjaGVjayBiZWZvcmUgdGhlIGhrZXkgY2hlY2sgKi8KKyAgICBpZiAoIWxwRmlsZSB8fCAhKmxwRmlsZSkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworCisgICAgbHBrZXkgPSBsb29rdXBfaGtleSggaGtleSApOworICAgIGlmICghbHBrZXkpCisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKKworICAgIC8qIENoZWNrIGZvciBmaWxlIGV4aXN0ZW5jZSAqLworCiAgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CiB9CiAKQEAgLTMzNzQsMjEgKzM1MzksMzQgQEAKIExPTkcgV0lOQVBJIFJlZ1Jlc3RvcmVLZXkzMkEoIEhLRVkgaGtleSwgTFBDU1RSIGxwRmlsZSwgRFdPUkQgZHdGbGFncyApCiB7CiAgICAgTE9ORyByZXQ7Ci0gICAgTFBXU1RSIGxwRmlsZVcgPSBIRUFQX3N0cmR1cEF0b1coR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBGaWxlKTsKKyAgICBMUFdTVFIgbHBGaWxlVyA9IHN0cmR1cEEyVyhscEZpbGUpOwogICAgIHJldCA9IFJlZ1Jlc3RvcmVLZXkzMlcoIGhrZXksIGxwRmlsZVcsIGR3RmxhZ3MgKTsKLSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBGaWxlVyApOworICAgIGlmKGxwRmlsZVcpIGZyZWUobHBGaWxlVyk7CiAgICAgcmV0dXJuIHJldDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSZWdSZXBsYWNlS2V5MzJXIFtBRFZBUEkzMi4xNjJdCisgKgorICogUEFSQU1TCisgKiAgICBoa2V5ICAgICAgW0ldIEhhbmRsZSBvZiBvcGVuIGtleQorICogICAgbHBTdWJLZXkgIFtJXSBBZGRyZXNzIG9mIG5hbWUgb2Ygc3Via2V5CisgKiAgICBscE5ld0ZpbGUgW0ldIEFkZHJlc3Mgb2YgZmlsZW5hbWUgZm9yIGZpbGUgd2l0aCBuZXcgZGF0YQorICogICAgbHBPbGRGaWxlIFtJXSBBZGRyZXNzIG9mIGZpbGVuYW1lIGZvciBiYWNrdXAgZmlsZQogICovCiBMT05HIFdJTkFQSSBSZWdSZXBsYWNlS2V5MzJXKCBIS0VZIGhrZXksIExQQ1dTVFIgbHBTdWJLZXksIExQQ1dTVFIgbHBOZXdGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBscE9sZEZpbGUgKQogewotICAgIEZJWE1FKHJlZywgIiV4LCVzLCVzLCVzKTogc3R1YlxuIiwgaGtleSwgZGVidWdzdHJfdyhscFN1YktleSksIAorICAgIExQS0VZU1RSVUNUCWxwa2V5OworCisgICAgRklYTUUocmVnLCAiKCV4LCVzLCVzLCVzKTogc3R1YlxuIiwgaGtleSwgZGVidWdzdHJfdyhscFN1YktleSksIAogICAgICAgICAgIGRlYnVnc3RyX3cobHBOZXdGaWxlKSxkZWJ1Z3N0cl93KGxwT2xkRmlsZSkpOworCisgICAgbHBrZXkgPSBsb29rdXBfaGtleSggaGtleSApOworICAgIGlmICghbHBrZXkpCisgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX0hBTkRMRTsKKwogICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCkBAIC0zNDAwLDEzICszNTc4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBPbGRGaWxlICkKIHsKICAgICBMT05HIHJldDsKLSAgICBMUFdTVFIgbHBTdWJLZXlXID0gSEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwU3ViS2V5KTsKLSAgICBMUFdTVFIgbHBOZXdGaWxlVyA9IEhFQVBfc3RyZHVwQXRvVyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBscE5ld0ZpbGUpOwotICAgIExQV1NUUiBscE9sZEZpbGVXID0gSEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwT2xkRmlsZSk7CisgICAgTFBXU1RSIGxwU3ViS2V5VyA9IHN0cmR1cEEyVyhscFN1YktleSk7CisgICAgTFBXU1RSIGxwTmV3RmlsZVcgPSBzdHJkdXBBMlcobHBOZXdGaWxlKTsKKyAgICBMUFdTVFIgbHBPbGRGaWxlVyA9IHN0cmR1cEEyVyhscE9sZEZpbGUpOwogICAgIHJldCA9IFJlZ1JlcGxhY2VLZXkzMlcoIGhrZXksIGxwU3ViS2V5VywgbHBOZXdGaWxlVywgbHBPbGRGaWxlVyApOwotICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscE9sZEZpbGVXICk7Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwTmV3RmlsZVcgKTsKLSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBTdWJLZXlXICk7CisgICAgZnJlZShscE9sZEZpbGVXKTsKKyAgICBmcmVlKGxwTmV3RmlsZVcpOworICAgIGZyZWUobHBTdWJLZXlXKTsKICAgICByZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9taXNjL3NoZWxsLmMgYi9taXNjL3NoZWxsLmMKaW5kZXggNGFjMGQ3Yy4uNDBhODA4NCAxMDA2NDQKLS0tIGEvbWlzYy9zaGVsbC5jCisrKyBiL21pc2Mvc2hlbGwuYwpAQCAtMzc1LDggKzM3NSw4IEBACiAJICB9CiAKICAgICAvKiBDaGVjayByZWdpc3RyeSAqLwotICAgIGlmIChSZWdRdWVyeVZhbHVlMTYoIChIS0VZKUhLRVlfQ0xBU1NFU19ST09ULCB0bXBleHQsIGZpbGV0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxldHlwZWxlbiApID09IFNIRUxMX0VSUk9SX1NVQ0NFU1MgKQorICAgIGlmIChSZWdRdWVyeVZhbHVlMTYoIEhLRVlfQ0xBU1NFU19ST09ULCB0bXBleHQsIGZpbGV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxldHlwZWxlbiApID09IEVSUk9SX1NVQ0NFU1MgKQogICAgIHsKIAlmaWxldHlwZVtmaWxldHlwZWxlbl09J1wwJzsKIAlUUkFDRShleGVjLCAiRmlsZSB0eXBlOiAlc1xuIiwKQEAgLTM4Nyw4ICszODcsOCBAQAogCXN0cmNhdCggZmlsZXR5cGUsIGxwT3BlcmF0aW9uICk7CiAJc3RyY2F0KCBmaWxldHlwZSwgIlxcY29tbWFuZCIgKTsKIAkKLQlpZiAoUmVnUXVlcnlWYWx1ZTE2KCAoSEtFWSlIS0VZX0NMQVNTRVNfUk9PVCwgZmlsZXR5cGUsIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kbGVuICkgPT0gU0hFTExfRVJST1JfU1VDQ0VTUyApCisJaWYgKFJlZ1F1ZXJ5VmFsdWUxNiggSEtFWV9DTEFTU0VTX1JPT1QsIGZpbGV0eXBlLCBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZGxlbiApID09IEVSUk9SX1NVQ0NFU1MgKQogCXsKIAkgICAgLyogSXMgdGhlcmUgYSByZXBsYWNlKCkgZnVuY3Rpb24gYW55d2hlcmU/ICovCiAJICAgIGNvbW1hbmRbY29tbWFuZGxlbl09J1wwJzsKQEAgLTExNzIsNyArMTE3Miw3IEBACiAJZm9yIChpPTA7aTxuO2krKykgewogCSAgICBMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWQl4cmVzZGlyOwogCi0JICAgIHhyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcoaWNvbnJlc2RpciwoTFBXU1RSKVJldFB0cltpXSwoRFdPUkQpcm9vdHJlc2RpcixGQUxTRSk7CisJICAgIHhyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcoaWNvbnJlc2RpciwoTFBXU1RSKSYoUmV0UHRyW2ldKSwoRFdPUkQpcm9vdHJlc2RpcixGQUxTRSk7CiAJICAgIHhyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcoeHJlc2RpciwoTFBXU1RSKTAsKERXT1JEKXJvb3RyZXNkaXIsVFJVRSk7CiAKIAkgICAgaWRhdGFlbnQgPSAoTFBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZKXhyZXNkaXI7CkBAIC0xNTYzLDExICsxNTYzLDExIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGcmVlSWNvbkxpc3QKICAqLwotCiB2b2lkIFdJTkFQSSBGcmVlSWNvbkxpc3QoIERXT1JEIGR3ICkKIHsKLSAgICBGSVhNRShyZWcsICJlbXB0eSBzdHViXG4iICk7CisgICAgRklYTUUocmVnLCAiKCVseCk6IHN0dWJcbiIsZHcpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTU4MCw3ICsxNTgwLDYgQEAKICAgICBjaGFyCXhjbHNpZFs1MF0seGlpZFs1MF07CiAgICAgSFJFU1VMVAlocmVzID0gRV9PVVRPRk1FTU9SWTsKIAotCiAgICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmNsc2lkLHhjbHNpZCk7CiAgICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpaWlkLHhpaWQpOwogICAgIFRSQUNFKHNoZWxsLCIoJXMsJXMsJXApXG4iLHhjbHNpZCx4aWlkLHBwdik7CkBAIC0xNjEwLDcgKzE2MDksNyBAQAogCXJldHVybiAwOwogICAgIH0KIAotICAgIEZJWE1FKHNoZWxsLCAiICAgLT4gY2xzaWQgbm90IGZvdW5kLiByZXR1cm5pbmcgRV9PVVRPRk1FTU9SWS5cbiIpOworICAgIEZJWE1FKHNoZWxsLCAiY2xzaWQoJXMpIG5vdCBmb3VuZC4gIFJldHVybmluZyBFX09VVE9GTUVNT1JZLlxuIix4Y2xzaWQpOwogICAgIHJldHVybiBocmVzOwogfQogCkBAIC0xNjY5LDMgKzE2NjgsMTggQEAKIAlsc3RyY3B5MzJBKHBzelBhdGgsIkU6XFwiKTsgLyogRklYTUUgKi8KIAlyZXR1cm4gTk9FUlJPUjsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNISGVscFNob3J0Y3V0c19SdW5ETEwgW1NIRUxMMzIuMjI0XQorICoKKyAqLworCitEV09SRCBXSU5BUEkKK1NISGVscFNob3J0Y3V0c19SdW5ETEwgKERXT1JEIGR3QXJnMSwgRFdPUkQgZHdBcmcyLCBEV09SRCBkd0FyZzMsIERXT1JEIGR3QXJnNCkKK3sKKyAgICBGSVhNRSAoZXhlYywgIiglbHgsICVseCwgJWx4LCAlbHgpIGVtcHR5IHN0dWIhXG4iLAorCSAgIGR3QXJnMSwgZHdBcmcyLCBkd0FyZzMsIGR3QXJnNCk7CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbG9yZC5jIGIvbWlzYy9zaGVsbG9yZC5jCmluZGV4IDQxZjA1MzguLjYyZGU2OGIgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGxvcmQuYworKysgYi9taXNjL3NoZWxsb3JkLmMKQEAgLTQyLDYgKzQyLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgCQkgU0hFTEwzMl8xNiAgIAkJCVtTSEVMTDMyLjE2XQogICogZmluZF9sYXN0aXRlbV9pbl9pdGVtaWRsaXN0KCkKKyAqCisgKiBOT1RFUworICogICAgIE9yaWdpbmFsIG5hbWU6IElMRmluZExhc3QgKGV4cG9ydGVkIGJ5IG9yZGluYWwpCiAgKi8KIExQU0hJVEVNSUQgV0lOQVBJIFNIRUxMMzJfMTYoTFBJVEVNSURMSVNUIGlpbCkgewogCUxQU0hJVEVNSUQJbGFzdHNpaSxzaWk7CkBAIC01Niw5ICs1OSwxMyBAQAogCX0KIAlyZXR1cm4gbGFzdHNpaTsKIH0KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAJCSBTSEVMTDMyXzI5ICAgCQkJW1NIRUxMMzIuMjldCiAgKiBpc19yb290ZGlyKGNvbnN0IGNoYXIqcGF0aCkKKyAqCisgKiBOT1RFUworICogICAgIE9yaWdpbmFsIE5hbWU6IFBhdGhJc1Jvb3QKICAqLwogQk9PTDMyIFdJTkFQSSBTSEVMTDMyXzI5KExQQ1NUUiB4KSB7CiAJaWYgKCFsc3RyY21wMzJBKHgrMSwiOlxcIikpCQkvKiAiWDpcIiAqLwpAQCAtODEsNiArODgsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAJCSBTSEVMTDMyXzMwICAgCQkJW1NIRUxMMzIuMzBdCiAgKiBnZXRfcm9vdGRpcihjaGFyKnBhdGgsaW50IGRyaXZlKQorICoKKyAqIE5PVEVTCisgKiAgICAgT3JpZ2luYWwgTmFtZTogUGF0aEJ1aWxkUm9vdAogICovCiBMUFNUUiBXSU5BUEkgU0hFTEwzMl8zMChMUFNUUiByb290LEJZVEUgZHJpdmUpIHsKIAlzdHJjcHkocm9vdCwiQTpcXCIpOwpAQCAtMzgxLDkgKzM5MSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCVNIRUxMMzJfMTgxCVtTSEVMTDMyLjE4MV0KICAqIHVua25vd24KKyAqCisgKiBQQVJBTVMKKyAqICAgICAgaHduZCBbSV0gIHdpbmRvdyBoYW5kbGUKKyAqICAgICAgeSAgICBbSV0gIGZsYWcgPz8/PworICoKKyAqIE5PVEVTCisgKiAgICAgT3JpZ2luYWwgbmFtZTogUmVnaXN0ZXJTaGVsbEhvb2sgKGV4cG9ydGVkIGJ5IG9yZGluYWwpCiAgKi8KLXZvaWQgV0lOQVBJIFNIRUxMMzJfMTgxKERXT1JEIHgsRFdPUkQgeSkgewotICAgIEZJWE1FKHNoZWxsLCIoMHglMDhseCwweCUwOGx4KTpzdHViLlxuIix4LHkpOwordm9pZCBXSU5BUEkgU0hFTEwzMl8xODEoSFdORDMyIGh3bmQsIERXT1JEIHkpIHsKKyAgICBGSVhNRShzaGVsbCwiKDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIsaHduZCx5KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUyNCw2ICs1NDEsOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJIFNIRUxMMzJfMTgzICAgCQkJW1NIRUxMMzIuMTgzXQogICogRm9ybWF0IGFuZCBvdXRwdXQgZXJyb3JtZXNzYWdlLgorICoKKyAqIE5PVEVTCisgKiAgICAgT3JpZ2luYWwgbmFtZTogU2hlbGxNZXNzYWdlQm94QQogICovCiB2b2lkIF9fY2RlY2wgU0hFTEwzMl8xODMoSE1PRFVMRTMyIGhtb2QsSFdORDMyIGh3bmQsRFdPUkQgaWQsRFdPUkQgeCxEV09SRCB0eXBlLExQVk9JRCBhcmdsaXN0KSB7CiAJY2hhcglidWZbMTAwXSxidWYyWzEwMF0sKmJ1ZjM7CkBAIC03MDEsMyArNzIxLDQzIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNIRUxMMzJfNjEgW1NIRUxMMzIuNjFdCisgKiBTaGVsbC9SdW4tRGlhbG9nCisgKi8KK0RXT1JEIFdJTkFQSQorU0hFTEwzMl82MSAoSFdORDMyIGh3bmRPd25lciwgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLAorCSAgICBMUFNUUiBscHN6VGl0bGUsIExQU1RSIGxwc3pQcm9tcHQsIFVJTlQzMiB1RmxhZ3MpCit7CisgICAgRklYTUUgKHNoZWxsLCIoMHglMDh4IDB4JWx4IDB4JWx4IFwiJXNcIiBcIiVzXCIgMHglbHgpOnN0dWIuXG4iLAorCSAgIGh3bmRPd25lciwgZHdQYXJhbTEsIGR3UGFyYW0yLCBscHN6VGl0bGUsIGxwc3pQcm9tcHQsIHVGbGFncyk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNIRUxMMzJfNjAgW1NIRUxMMzIuNjBdCisgKiBTaGVsbC9TaHV0ZG93bi1EaWFsb2cKKyAqLworRFdPUkQgV0lOQVBJCitTSEVMTDMyXzYwIChIV05EMzIgaHduZE93bmVyKQoreworICAgIEZJWE1FIChzaGVsbCwiKDB4JTA4eCk6c3R1Yi5cbiIsIGh3bmRPd25lcik7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNIRUxMMzJfMTg0IFtTSEVMTDMyLjE4NF0KKyAqIHVua25vd24KKyAqLworRFdPUkQgV0lOQVBJCitTSEVMTDMyXzE4NCAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLCBEV09SRCBkd1BhcmFtMywKKwkgICAgIERXT1JEIGR3UGFyYW00LCBEV09SRCBkd1BhcmFtNSkKK3sKKyAgICBGSVhNRSAoc2hlbGwsIigweCVseCAweCVseCAweCVseCAweCVseCAweCVseCk6c3R1Yi5cbiIsCisJICAgZHdQYXJhbTEsIGR3UGFyYW0yLCBkd1BhcmFtMywgZHdQYXJhbTQsIGR3UGFyYW01KTsKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbWlzYy9zeXN0ZW0uYyBiL21pc2Mvc3lzdGVtLmMKaW5kZXggNzdlNDk0MC4uMjJhNWRkZSAxMDA2NDQKLS0tIGEvbWlzYy9zeXN0ZW0uYworKysgYi9taXNjL3N5c3RlbS5jCkBAIC0xNSw2ICsxNSw4IEBACiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgorI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgInNpZ19jb250ZXh0LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTMzLDEwICszNSwxNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTWVNURU1fVGltZXJUaWNrCisgKiBGSVhNRTogSXQgaXMgYSB2ZXJ5IGJhZCBpZGVhIHRvIGNhbGwgMTZiaXQgY29kZSBpbiBhIHNpZ25hbCBoYW5kbGVyOgorICoJICBJZiB0aGUgc2lnbmFsIHJlYWNoZWQgdXMgaW4gMTYgYml0IGNvZGUsIHdlIGNvdWxkIGhhdmUgYSBicm9rZW4KKyAqCSAgJUZTLCB3aGljaCBpcyBpbiB0dXJuZWQgc2F2ZWQgaW50byB0aGUgc2luZ2xlIGdsb2JhbAorICoJICBDQUxMVE8xNl9DdXJyZW50X2ZzIHRlbXBvcmFyeSBzdG9yYWdlLCBzbyBhIHNpbmdsZSBtaXNwbGFjZWQKKyAqCSAgc2lnbmFsIGNyYXNoZXMgdGhlIHdob2xlIFdJTkUgcHJvY2Vzcy4KKyAqCSAgVGhpcyBuZWVkcyBtb3JlIHRob3VnaHQuIC1NTQogICovCi1zdGF0aWMgdm9pZCBTWVNURU1fVGltZXJUaWNrKHZvaWQpCitzdGF0aWMgSEFORExFUl9ERUYoU1lTVEVNX1RpbWVyVGljaykKIHsKICAgICBpbnQgaTsKKyAgICBIQU5ETEVSX0lOSVQoKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBOQl9TWVNfVElNRVJTOyBpKyspCiAgICAgewpAQCAtNDQsMTIgKzUzLDE1IEBACiAgICAgICAgIGlmICgoU1lTX1RpbWVyc1tpXS50aWNrcyAtPSBTWVNfVElNRVJfUkFURSkgPD0gMCkKICAgICAgICAgewogICAgICAgICAgICAgU1lTX1RpbWVyc1tpXS50aWNrcyArPSBTWVNfVGltZXJzW2ldLnJhdGU7Ci0gICAgICAgICAgICBDYWxsYmFja3MtPkNhbGxTeXN0ZW1UaW1lclByb2MoIFNZU19UaW1lcnNbaV0uY2FsbGJhY2sgKTsKKworCSAgICBpZiAoU1lTX1RpbWVyc1tpXS5jYWxsYmFjayA9PSAoRkFSUFJPQzE2KURPU01FTV9UaWNrKSB7CisJICAgIAlET1NNRU1fVGljaygpOworCSAgICB9IGVsc2UKKwkJQ2FsbGJhY2tzLT5DYWxsU3lzdGVtVGltZXJQcm9jKCBTWVNfVGltZXJzW2ldLmNhbGxiYWNrICk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTWVNURU1fU3RhcnRUaWNrcwogICoKQEAgLTYyLDcgKzc0LDcgQEAKICAgICBpZiAoIWhhbmRsZXJfaW5zdGFsbGVkKQogICAgIHsKICAgICAgICAgaGFuZGxlcl9pbnN0YWxsZWQgPSBUUlVFOwotICAgICAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHQUxSTSwgU1lTVEVNX1RpbWVyVGljaywgMSApOworCVNJR05BTF9TZXRIYW5kbGVyKCBTSUdBTFJNLCBTWVNURU1fVGltZXJUaWNrLCAxICk7CiAgICAgfQogI2lmbmRlZiBfX0VNWF9fIC8qIEZJWE1FOiBUaW1lIGRvbid0IHdvcmsuLi4gVXNlIEJJT1MgZGlyZWN0bHkgaW5zdGVhZCAqLwogICAgIHsKQEAgLTEzMCw2ICsxNDIsMTQgQEAKIHsKICAgICBpbnQgaTsKIAorICAgIC8qIEZJWE1FOiBIQUNLOiBkbyBub3QgY3JlYXRlIHN5c3RlbSB0aW1lcnMgZHVlIHRvIHByb2JsZW1zIG1lbnRpb25lZAorICAgICAqIGFib3ZlLCBleGNlcHQgRE9TTUVNX1RpY2soKS4KKyAgICAgKi8KKyAgICBpZiAoY2FsbGJhY2shPShGQVJQUk9DMTYpRE9TTUVNX1RpY2spIHsKKyAgICAJRklYTUUoc3lzdGVtLCJhcmUgY3VycmVudGx5IGJyb2tlbiwgcmV0dXJuaW5nIDAuXG4iKTsKKyAgICAJcmV0dXJuIDA7CisgICAgfQorCiAgICAgZm9yIChpID0gMDsgaSA8IE5CX1NZU19USU1FUlM7IGkrKykKICAgICAgICAgaWYgKCFTWVNfVGltZXJzW2ldLmNhbGxiYWNrKSAgLyogRm91bmQgb25lICovCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL21pc2MvdGFwaTMyLmMgYi9taXNjL3RhcGkzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZTQ1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL3RhcGkzMi5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBUQVBJMzIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggQW5kcmVhcyBNb2hyCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK1VJTlQzMiBXSU5BUEkgbGluZUluaXRpYWxpemUoCisgIExQVk9JRCBscGhMaW5lQXBwLCAvKiBGSVhNRSAqLworICBISU5TVEFOQ0UzMiBoSW5zdGFuY2UsCisgIExQVk9JRCBscGZuQ2FsbGJhY2ssIC8qIEZJWE1FICovCisgIExQQ1NUUiBscHN6QXBwTmFtZSwKKyAgTFBEV09SRCBscGR3TnVtRGV2cykKK3sKKyAgICBGSVhNRShjb21tLCAic3R1Yi5cbiIpOworICAgIHJldHVybiAwOworfQorCitVSU5UMzIgV0lOQVBJIGxpbmVTaHV0ZG93biggSEFORExFMzIgaExpbmVBcHAgKSAvKiBGSVhNRSAqLworeworICAgIEZJWE1FKGNvbW0sICJzdHViLlxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKK1VJTlQzMiBXSU5BUEkgbGluZU5lZ290aWF0ZUFQSVZlcnNpb24oCisgIEhBTkRMRTMyIGhMaW5lQXBwLCAvKiBGSVhNRSAqLworICBEV09SRCBkd0RldmljZUlELAorICBEV09SRCBkd0FQSUxvd1ZlcnNpb24sCisgIERXT1JEIGR3QVBJSGlnaFZlcnNpb24sCisgIExQRFdPUkQgbHBkd0FQSVZlcnNpb24sCisgIExQVk9JRCBscEV4dGVuc2lvbklEIC8qIEZJWE1FICovCispCit7CisgICAgRklYTUUoY29tbSwgInN0dWIuXG4iKTsKKyAgICAqbHBkd0FQSVZlcnNpb24gPSBkd0FQSUhpZ2hWZXJzaW9uOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWlzYy92ZXJzaW9uLmMgYi9taXNjL3ZlcnNpb24uYwppbmRleCA4OWNiOGNkLi5lYTAzNDhjIDEwMDY0NAotLS0gYS9taXNjL3ZlcnNpb24uYworKysgYi9taXNjL3ZlcnNpb24uYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJvbGUuaCIKIAogdHlwZWRlZiBlbnVtCiB7CkBAIC0xNjMsNiArMTY0LDI2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEdldFZlcnNpb25FeDE2ICAgKEtFUk5FTC4xNDkpCisgKi8KK0JPT0wxNiBXSU5BUEkgR2V0VmVyc2lvbkV4MTYoT1NWRVJTSU9OSU5GTzE2ICp2KQoreworICAgIFZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisgICAgaWYgKHYtPmR3T1NWZXJzaW9uSW5mb1NpemUgIT0gc2l6ZW9mKE9TVkVSU0lPTklORk8xNikpCisgICAgeworICAgICAgICBXQVJOKHZlciwid3JvbmcgT1NWRVJTSU9OSU5GTyBzaXplIGZyb20gYXBwIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgdi0+ZHdNYWpvclZlcnNpb24gPSBWZXJzaW9uRGF0YVt2ZXJdLmdldFZlcnNpb25FeC5kd01ham9yVmVyc2lvbjsKKyAgICB2LT5kd01pbm9yVmVyc2lvbiA9IFZlcnNpb25EYXRhW3Zlcl0uZ2V0VmVyc2lvbkV4LmR3TWlub3JWZXJzaW9uOworICAgIHYtPmR3QnVpbGROdW1iZXIgID0gVmVyc2lvbkRhdGFbdmVyXS5nZXRWZXJzaW9uRXguZHdCdWlsZE51bWJlcjsKKyAgICB2LT5kd1BsYXRmb3JtSWQgICA9IFZlcnNpb25EYXRhW3Zlcl0uZ2V0VmVyc2lvbkV4LmR3UGxhdGZvcm1JZDsKKyAgICBzdHJjcHkoIHYtPnN6Q1NEVmVyc2lvbiwgVmVyc2lvbkRhdGFbdmVyXS5nZXRWZXJzaW9uRXguc3pDU0RWZXJzaW9uICk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIEdldFZlcnNpb25FeDMyQSAgIChLRVJORUwzMi40MjgpCiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0VmVyc2lvbkV4MzJBKE9TVkVSU0lPTklORk8zMkEgKnYpCkBAIC0zMDAsMyArMzIxLDgxIEBACiAgICAgICAgIC8qIEZJWE1FICovCiAJRFBSSU5URigiRElBR09VVFBVVDolc1xuIixzdHIpOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERsbEdldFZlcnNpb24gW0NPTUNUTDMyLjI1XQorICoKKyAqCisgKgorICovCitIUkVTVUxUIFdJTkFQSSBDT01DVEwzMl9EbGxHZXRWZXJzaW9uKERMTFZFUlNJT05JTkZPICpwZHZpKQoreworICAgIFZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisKKyAgICBpZiAocGR2aS0+Y2JTaXplICE9IHNpemVvZihETExWRVJTSU9OSU5GTykpCisgICAgeworICAgICAgICBXQVJOKHZlciwgIndyb25nIERMTFZFUlNJT05JTkZPIHNpemUgZnJvbSBhcHAiKTsKKyAgICAgICAgcmV0dXJuIE9MRV9FUlJPUl9TSVpFOyAvKiBGSVhNRTogaXMgdGhpcyBlcnJvciBjb3JyZWN0ID8gKi8KKyAgICB9CisKKyAgICBwZHZpLT5kd1BsYXRmb3JtSUQgPSBWZXJzaW9uRGF0YVt2ZXJdLmdldFZlcnNpb25FeC5kd1BsYXRmb3JtSWQ7CisgICAgc3dpdGNoKFZlcnNpb25EYXRhW3Zlcl0uZ2V0VmVyc2lvbjMyKQorICAgIHsKKyAgICAgICAgY2FzZSAweDgwMDAwYTAzOiAvKiBXaW4gMy4xICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHBkdmktPmR3TWFqb3JWZXJzaW9uID0gMzsKKyAgICAgICAgICAgIHBkdmktPmR3TWlub3JWZXJzaW9uID0gNTE7CisgICAgICAgICAgICBwZHZpLT5kd0J1aWxkTnVtYmVyID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGMwMDAwMDA0OiAvKiBXaW4gOTUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcGR2aS0+ZHdNYWpvclZlcnNpb24gPSA0OworICAgICAgICAgICAgcGR2aS0+ZHdNaW5vclZlcnNpb24gPSAwOworICAgICAgICAgICAgcGR2aS0+ZHdCdWlsZE51bWJlciA9IDk1MDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDA0MjEzMzAzOiAvKiBOVCAzLjUxIEZJWE1FOiBjb3JyZWN0ID8gKi8KKyAgICAgICAgeworICAgICAgICAgICAgcGR2aS0+ZHdNYWpvclZlcnNpb24gPSAzOworICAgICAgICAgICAgcGR2aS0+ZHdNaW5vclZlcnNpb24gPSA1MTsKKyAgICAgICAgICAgIHBkdmktPmR3QnVpbGROdW1iZXIgPSAweDQyMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDA1NjUwMDA0OiAvKiBOVCA0LjAgRklYTUU6IGNvcnJlY3QgPyAqLworICAgICAgICB7CisgICAgICAgICAgICBwZHZpLT5kd01ham9yVmVyc2lvbiA9IDQ7CisgICAgICAgICAgICBwZHZpLT5kd01pbm9yVmVyc2lvbiA9IDA7CisgICAgICAgICAgICBwZHZpLT5kd0J1aWxkTnVtYmVyID0gMHg1NjU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEVSUih2ZXIsICJVbmtub3duIFdpbmRvd3MgdmVyc2lvbiwgcGxlYXNlIGFkZCBpdCB0byB0aGUgbGlzdCAhXG4iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7IC8qIHdpbmVycm9yLmg6IE5PRVJST1IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgT2FCdWlsZFZlcnNpb24gICAgICAgICAgIFtPTEVBVVQzMi4xNzBdCisgKi8KK1VJTlQzMiBXSU5BUEkgT2FCdWlsZFZlcnNpb24oKQoreworICAgIFZFUlNJT04gdmVyID0gVkVSU0lPTl9HZXRWZXJzaW9uKCk7CisKKyAgICBzd2l0Y2goVmVyc2lvbkRhdGFbdmVyXS5nZXRWZXJzaW9uMzIpCisgICAgeworICAgICAgICBjYXNlIDB4ODAwMDBhMDM6IC8qIFdpbiAzLjEgKi8KKwkJcmV0dXJuIDB4MTQwZmQxOyAvKiBmcm9tIFdpbjMycyAxLjFlICovCisgICAgICAgIGNhc2UgMHhjMDAwMDAwNDogLyogV2luIDk1ICovCisJCXJldHVybiAweDBhMGJkMzsKKyAgICAgICAgY2FzZSAweDA0MjEzMzAzOiAvKiBOVCAzLjUxICovCisJCXJldHVybiAweDA7IC8qIEZJWE1FICovCisgICAgICAgIGNhc2UgMHgwNTY1MDAwNDogLyogTlQgNC4wICovCisJCXJldHVybiAweDE0MTAxNjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMHgwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21pc2MvdzMyc2tybmwuYyBiL21pc2MvdzMyc2tybmwuYwppbmRleCBkZjlkNjVhLi42ZjMwMzBmIDEwMDY0NAotLS0gYS9taXNjL3czMnNrcm5sLmMKKysrIGIvbWlzYy93MzJza3JubC5jCkBAIC01LDEwICs1LDEwIEBACiAgKiBDb3B5cmlnaHQgKGMpIDE5OTcgQW5kcmVhcyBNb2hyCiAgKi8KIAotI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKIAogTFBTVFIgV0lOQVBJIEdldFdpbjMyc0RpcmVjdG9yeSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvbWlzYy93aW4zMnMxNi5jIGIvbWlzYy93aW4zMnMxNi5jCmluZGV4IDVmYzA0ODQuLjQ4YjAwY2IgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luMzJzMTYuYworKysgYi9taXNjL3dpbjMyczE2LmMKQEAgLTUsMTAgKzUsMTAgQEAKICAqIENvcHlyaWdodCAoYykgMTk5NyBBbmRyZWFzIE1vaHIKICAqLwogCi0jaW5jbHVkZSAid2luZG93cy5oIgotI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAKIHZvaWQgQm9vdFRhc2soKQogewpkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrLmMgYi9taXNjL3dpbnNvY2suYwppbmRleCA0ZGFlNmM0Li40NGMxZWNkIDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2suYworKysgYi9taXNjL3dpbnNvY2suYwpAQCAtMTkyOSw3ICsxOTI5LDcgQEAKIAogSU5UMTYgV0lOQVBJIFdTQUNhbmNlbEFzeW5jUmVxdWVzdDE2KEhBTkRMRTE2IGhBc3luY1Rhc2tIYW5kbGUpCiB7Ci0gICAgcmV0dXJuIChIQU5ETEUxNilXU0FDYW5jZWxBc3luY1JlcXVlc3QxNigoSEFORExFMzIpaEFzeW5jVGFza0hhbmRsZSk7CisgICAgcmV0dXJuIChIQU5ETEUxNilXU0FDYW5jZWxBc3luY1JlcXVlc3QzMigoSEFORExFMzIpaEFzeW5jVGFza0hhbmRsZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbXNkb3MvZHBtaS5jIGIvbXNkb3MvZHBtaS5jCmluZGV4IGQ3MTI4ZDkuLjRlZGJjOWUgMTAwNjQ0Ci0tLSBhL21zZG9zL2RwbWkuYworKysgYi9tc2Rvcy9kcG1pLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJnbG9iYWwuaCIKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCkBAIC0yNCw2ICsyNSw3IEBACiAKIHZvaWQgQ3JlYXRlQlBCKGludCBkcml2ZSwgQllURSAqZGF0YSwgQk9PTDE2IGxpbWl0ZWQpOyAgLyogZGVmaW5lZCBpbiBpbnQyMS5jICovCiAKK3N0YXRpYyB2b2lkKiBsYXN0dmFsbG9jZWQgPSBOVUxMOwogCiAvKiBTdHJ1Y3R1cmUgZm9yIHJlYWwtbW9kZSBjYWxsYmFja3MgKi8KIHR5cGVkZWYgc3RydWN0CkBAIC01OCw2ICs2MCw3MiBAQAogc3RhdGljIFJNQ0IgKkZpcnN0Uk1DQiA9IE5VTEw7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgRFBNSV94YWxsb2MKKyAqIHNwZWNpYWwgdmlydHVhbGFsbG9jLCBhbGxvY2F0ZXMgbGluZWFyeSBtb25vdG9uIGdyb3dpbmcgbWVtb3J5LgorICogKHRoZSB1c3VhbCBWaXJ0dWFsQWxsb2MgZG9lcyBub3Qgc2F0aXNmeSB0aGF0IHJlc3RyaWN0aW9uKQorICovCitzdGF0aWMgTFBWT0lECitEUE1JX3hhbGxvYyhpbnQgbGVuKSB7CisJTFBWT0lECXJldDsKKwlMUFZPSUQJb2xkbGFzdHYgPSBsYXN0dmFsbG9jZWQ7CisKKwlpZiAobGFzdHZhbGxvY2VkKSB7CisJCWludAl4ZmxhZyA9IDA7CisJCXJldCA9IE5VTEw7CisJCXdoaWxlICghcmV0KSB7CisJCQlyZXQ9VmlydHVhbEFsbG9jKGxhc3R2YWxsb2NlZCxsZW4sTUVNX0NPTU1JVHxNRU1fUkVTRVJWRSxQQUdFX0VYRUNVVEVfUkVBRFdSSVRFKTsKKwkJCWlmICghcmV0KQorCQkJCWxhc3R2YWxsb2NlZCs9MHgxMDAwMDsKKwkJCS8qIHdlIGZhaWxlZCB0byBhbGxvY2F0ZSBvbmUgaW4gdGhlIGZpcnN0IHJvdW5kLiAKKwkJCSAqIHRyeSBub24tbGluZWFyCisJCQkgKi8KKwkJCWlmICgheGZsYWcgJiYgKGxhc3R2YWxsb2NlZDxvbGRsYXN0dikpIHsgLyogd3JhcHBlZCAqLworCQkJCUZJWE1FKGludDMxLCJmYWlsZWQgdG8gYWxsb2NhdGUgbGluZWFyeSBncm93aW5nIG1lbW9yeSAoJWQgYnl0ZXMpLCB1c2luZyBub24tbGluZWFyIGdyb3dpbmcuLi5cbiIsbGVuKTsKKwkJCQl4ZmxhZysrOworCQkJfQorCQkJLyogaWYgd2UgZXZlbiBmYWlsIHRvIGFsbG9jYXRlIHNvbWV0aGluZyBpbiB0aGUgbmV4dCAKKwkJCSAqIHJvdW5kLCByZXR1cm4gTlVMTAorCQkJICovCisJCQlpZiAoKHhmbGFnPT0xKSAmJiAobGFzdHZhbGxvY2VkID49IG9sZGxhc3R2KSkKKwkJCQl4ZmxhZysrOworCQkJaWYgKCh4ZmxhZz09MikgJiYgKGxhc3R2YWxsb2NlZCA8IG9sZGxhc3R2KSkgeworCQkJCUZJWE1FKGludDMxLCJmYWlsZWQgdG8gYWxsb2NhdGUgYW55IG1lbW9yeSBvZiAlZCBieXRlcyFcbiIsbGVuKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQkgcmV0PVZpcnR1YWxBbGxvYyhOVUxMLGxlbixNRU1fQ09NTUlUfE1FTV9SRVNFUlZFLFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOworCWxhc3R2YWxsb2NlZCA9IChMUFZPSUQpKCgoRFdPUkQpcmV0K2xlbisweGZmZmYpJn4weGZmZmYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitEUE1JX3hmcmVlKExQVk9JRCBwdHIpIHsKKwlWaXJ0dWFsRnJlZShwdHIsMCxNRU1fUkVMRUFTRSk7Cit9CisKKy8qIEZJWE1FOiBwZXJoYXBzIHdlIGNvdWxkIGdyb3cgdGhpcyBtYXBwZWQgYXJlYS4uLiAqLworc3RhdGljIExQVk9JRAorRFBNSV94cmVhbGxvYyhMUFZPSUQgcHRyLGludCBuZXdzaXplKSB7CisJTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OCW1iaTsKKwlMUFZPSUQJCQkJbmV3cHRyOworCisJaWYgKCFWaXJ0dWFsUXVlcnkocHRyLCZtYmksc2l6ZW9mKG1iaSkpKSB7CisJCUZJWE1FKGludDMxLCJyZWFsbG9jaW5nIG5vbiBEUE1JX3hhbGxvY2VkIHJlZ2lvbj9cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogV2UgZG8gbm90IHNocmluayBhbGxvY2F0ZWQgbWVtb3J5LiBtb3N0IHJlYWxsb2NzIG9ubHkgZG8gZ3Jvd3MKKwkgKiBhbnl3YXkKKwkgKi8KKwlpZiAobmV3c2l6ZTw9bWJpLlJlZ2lvblNpemUpCisJCXJldHVybiBwdHI7CisKKwluZXdwdHIgPSBEUE1JX3hhbGxvYyhuZXdzaXplKTsKKwltZW1jcHkobmV3cHRyLHB0cixuZXdzaXplKTsKKwlEUE1JX3hmcmVlKHB0cik7CisJcmV0dXJuIG5ld3B0cjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgSU5UX0dldFJlYWxNb2RlQ29udGV4dAogICovCiBzdGF0aWMgdm9pZCBJTlRfR2V0UmVhbE1vZGVDb250ZXh0KCBSRUFMTU9ERUNBTEwgKmNhbGwsIENPTlRFWFQgKmNvbnRleHQgKQpAQCAtMTIxLDcgKzE4OSw3IEBACiAgICAgICAgIHsKICAgICAgICAgY2FzZSAweDE1OgogICAgICAgICAgICAgLyogTVNDREVYIGhvb2sgKi8KLSAgICAgICAgICAgIGRvX21zY2RleCggJnJlYWxtb2RlX2N0eCApOworICAgICAgICAgICAgZG9fbXNjZGV4KCAmcmVhbG1vZGVfY3R4LCAxICk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKQEAgLTIwNywxMiArMjc1LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKwljYXNlIDB4NjA6IHsvKiBDQU5PTklDQUxJWkUgUEFUSCAqLworCQlMUENTVFIgcGF0aCA9IChMUENTVFIpRE9TTUVNX01hcFJlYWxUb0xpbmVhcigoRFNfcmVnKCZyZWFsbW9kZV9jdHgpPDwxNikrU0lfcmVnKCZyZWFsbW9kZV9jdHgpKTsKKworCQlUUkFDRShpbnQzMSwiVFJVRU5BTUUgJXNcbiIscGF0aCk7CisJCWlmICghR2V0RnVsbFBhdGhOYW1lMzJBKCAKKwkJICAgIHBhdGgsCisJCSAgICAxMjgsCisJCSAgICAoTFBTVFIpRE9TTUVNX01hcFJlYWxUb0xpbmVhcigKKwkJICAgIChFU19yZWcoJnJlYWxtb2RlX2N0eCk8PDE2KStESV9yZWcoJnJlYWxtb2RlX2N0eCkpLAorCQkgICAgTlVMTAorCQkpKQorCQkgICAgU0VUX0NGTEFHKGNvbnRleHQpOworCQllbHNlCisJCSAgICBBWF9yZWcoJnJlYWxtb2RlX2N0eCkgPSAwOworCSAgICB9CisJICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC01MjUsNyArNjA5LDggQEAKIAlicmVhazsKIAogICAgIGNhc2UgMHgwMjA1OiAgLyogU2V0IHByb3RlY3RlZCBtb2RlIGludGVycnVwdCB2ZWN0b3IgKi8KLSAgICAJVFJBQ0UoaW50MzEsInNldCBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciAoMHglMDJ4LDB4JTA4bHgpLCBzdHViIVxuIixCTF9yZWcoY29udGV4dCksUFRSX1NFR19PRkZfVE9fTElOKENYX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpKTsKKyAgICAJVFJBQ0UoaW50MzEsInNldCBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQgaGFuZGxlciAoMHglMDJ4LDB4JTA4bHgpLCBzdHViIVxuIiwKKyAgICAgICAgICAgIEJMX3JlZyhjb250ZXh0KSxQVFJfU0VHX09GRl9UT19MSU4oQ1hfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSkpOwogCUlOVF9TZXRIYW5kbGVyKCBCTF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoRkFSUFJPQzE2KVBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggQ1hfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApKTsKQEAgLTU4NCwxMyArNjY5LDExIEBACiAgICAgICAgIH0KICAgICBjYXNlIDB4MDUwMTogIC8qIEFsbG9jYXRlIG1lbW9yeSBibG9jayAqLwogICAgICAgICBUUkFDRShpbnQzMSwiYWxsb2NhdGUgbWVtb3J5IGJsb2NrICglbGQpXG4iLE1BS0VMT05HKENYX3JlZyhjb250ZXh0KSxCWF9yZWcoY29udGV4dCkpKTsKLQlpZiAoIShwdHIgPSAoQllURSAqKVZpcnR1YWxBbGxvYyhOVUxMLCBNQUtFTE9ORyhDWF9yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSksIE1FTV9DT01NSVQsIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpKSkKKwlpZiAoIShwdHIgPSAoQllURSAqKURQTUlfeGFsbG9jKE1BS0VMT05HKENYX3JlZyhjb250ZXh0KSwgQlhfcmVnKGNvbnRleHQpKSkpKQogICAgICAgICB7CiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDgwMTI7ICAvKiBsaW5lYXIgbWVtb3J5IG5vdCBhdmFpbGFibGUgKi8KICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSA9IFNJX3JlZyhjb250ZXh0KSA9IEhJV09SRChwdHIpOwogICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpID0gRElfcmVnKGNvbnRleHQpID0gTE9XT1JEKHB0cik7CiAgICAgICAgIH0KQEAgLTU5OCwyMCArNjgxLDE4IEBACiAKICAgICBjYXNlIDB4MDUwMjogIC8qIEZyZWUgbWVtb3J5IGJsb2NrICovCiAgICAgICAgIFRSQUNFKGludDMxLCJmcmVlIG1lbW9yeSBibG9jayAoMHglMDhseClcbiIsTUFLRUxPTkcoRElfcmVnKGNvbnRleHQpLFNJX3JlZyhjb250ZXh0KSkpOwotCVZpcnR1YWxGcmVlKCh2b2lkICopTUFLRUxPTkcoRElfcmVnKGNvbnRleHQpLCBTSV9yZWcoY29udGV4dCkpLCAwLCBNRU1fUkVMRUFTRSk7CisJRFBNSV94ZnJlZSgodm9pZCAqKU1BS0VMT05HKERJX3JlZyhjb250ZXh0KSwgU0lfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDA1MDM6ICAvKiBSZXNpemUgbWVtb3J5IGJsb2NrICovCiAgICAgICAgIFRSQUNFKGludDMxLCJyZXNpemUgbWVtb3J5IGJsb2NrICgweCUwOGx4LCVsZClcbiIsTUFLRUxPTkcoRElfcmVnKGNvbnRleHQpLFNJX3JlZyhjb250ZXh0KSksTUFLRUxPTkcoQ1hfcmVnKGNvbnRleHQpLEJYX3JlZyhjb250ZXh0KSkpOwotICAgICAgICBpZiAoIShwdHIgPSAoQllURSAqKUhlYXBSZUFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAorICAgICAgICBpZiAoIShwdHIgPSAoQllURSAqKURQTUlfeHJlYWxsb2MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKU1BS0VMT05HKERJX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhDWF9yZWcoY29udGV4dCksQlhfcmVnKGNvbnRleHQpKSkpKQogICAgICAgICB7CiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDgwMTI7ICAvKiBsaW5lYXIgbWVtb3J5IG5vdCBhdmFpbGFibGUgKi8KICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSA9IFNJX3JlZyhjb250ZXh0KSA9IEhJV09SRChwdHIpOwogICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpID0gRElfcmVnKGNvbnRleHQpID0gTE9XT1JEKHB0cik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21zZG9zL2ludDIxLmMgYi9tc2Rvcy9pbnQyMS5jCmluZGV4IDcyM2RlYjMuLjMxZDZhOTMgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDIxLmMKKysrIGIvbXNkb3MvaW50MjEuYwpAQCAtMTMxMyw2ICsxMzEzLDEzIEBACiAKICAgICAgICAgY2FzZSAweDAxOgogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMjp7CisgICAgICAgICAgIEZJTEVfT0JKRUNUICpmaWxlOworICAgICAgICAgICBmaWxlID0gRklMRV9HZXRGaWxlKEJYX3JlZyhjb250ZXh0KSk7CisgICAgICAgICAgICBpZiAoIWxzdHJjbXBpMzJBKGZpbGUtPnVuaXhfbmFtZSwgIlNDU0lNR1IkIikpCisgICAgICAgICAgICAgICAgICAgICAgICBBU1BJX0RPU19IYW5kbGVJbnQoY29udGV4dCk7CisgICAgICAgICAgIGJyZWFrOworICAgICAgIH0KIAljYXNlIDB4MDU6ewkvKiBJT0NUTCAtIFdSSVRFIFRPIEJMT0NLIERFVklDRSBDT05UUk9MIENIQU5ORUwgKi8KIAkgICAgLypCWVRFICpkYXRhcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpOyovCiAJICAgIGludAlkcml2ZSA9IERPU19HRVRfRFJJVkUoQkxfcmVnKGNvbnRleHQpKTsKZGlmZiAtLWdpdCBhL21zZG9zL2ludDJmLmMgYi9tc2Rvcy9pbnQyZi5jCmluZGV4IDQwODc4ZjEuLmU2YTBkZDIgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDJmLmMKKysrIGIvbXNkb3MvaW50MmYuYwpAQCAtMzIsNyArMzIsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgxNTogLyogbXNjZGV4ICovCi0gICAgICAgIGRvX21zY2RleChjb250ZXh0KTsKKyAgICAgICAgZG9fbXNjZGV4KGNvbnRleHQsIEZBTFNFICk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDE2OgpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgfQogfQogCi12b2lkIGRvX21zY2RleCggQ09OVEVYVCAqY29udGV4dCApCit2b2lkIGRvX21zY2RleCggQ09OVEVYVCAqY29udGV4dCwgaW50IGRvcmVhbG1vZGUgKQogewogICAgIGludCBkcml2ZSwgY291bnQ7CiAgICAgY2hhciAqcDsKQEAgLTIxNyw3ICsyMTcsMTAgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgwRDogLyogZ2V0IGRyaXZlIGxldHRlcnMgKi8KLSAgICAgICAgICAgIHAgPSBQVFJfU0VHX09GRl9UT19MSU4oRVNfcmVnKGNvbnRleHQpLCBCWF9yZWcoY29udGV4dCkpOworCSAgICBpZiAoZG9yZWFsbW9kZSkKKwkgICAgCXAgPSBET1NNRU1fTWFwUmVhbFRvTGluZWFyKE1BS0VMT05HKEJYX3JlZyhjb250ZXh0KSxFU19yZWcoY29udGV4dCkpKTsKKwkgICAgZWxzZQorCQlwID0gUFRSX1NFR19PRkZfVE9fTElOKEVTX3JlZyhjb250ZXh0KSwgQlhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgIG1lbXNldCggcCwgMCwgTUFYX0RPU19EUklWRVMgKTsKICAgICAgICAgICAgIGZvciAoZHJpdmUgPSAwOyBkcml2ZSA8IE1BWF9ET1NfRFJJVkVTOyBkcml2ZSsrKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9hdWRpby5jIGIvbXVsdGltZWRpYS9hdWRpby5jCmluZGV4IGNhZjYzYzYuLjdhZTAyNTEgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvYXVkaW8uYworKysgYi9tdWx0aW1lZGlhL2F1ZGlvLmMKQEAgLTIxMiw3ICsyMTIsNyBAQAogCQlUUkFDRShtY2l3YXZlLCAiQ2h1bmsgRm91bmQgY2tpZD0lLjRzIGZjY1R5cGU9JS40cyBja3NpemU9JTA4bFggXG4iLAogCQkJICAgICAoTFBTVFIpJm1tY2tJbmZvLmNraWQsIChMUFNUUikmbW1ja0luZm8uZmNjVHlwZSwKIAkJCSAgICAgbW1ja0luZm8uY2tzaXplKTsKLQkJaWYgKG1taW9SZWFkKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAoSFBTVFIpIGxwV2F2ZUZvcm1hdCwKKwkJaWYgKG1taW9SZWFkMzIoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUikgbHBXYXZlRm9ybWF0LAogCQkgICAgKGxvbmcpIHNpemVvZihQQ01XQVZFRk9STUFUKSkgIT0gKGxvbmcpIHNpemVvZihQQ01XQVZFRk9STUFUKSkKIAkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJCW1tY2tJbmZvLmNraWQgPSBtbWlvRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk7CkBAIC0yNjMsNyArMjYzLDcgQEAKIC8qIGFsd2F5cyBjbG9zZSBlbGVtZW50cyA/ICovCiAKIAlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgIT0gMCkgewotCSAgbW1pb0Nsb3NlKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAwKTsKKwkgIG1taW9DbG9zZTMyKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAwKTsKIAkgIE1DSVdhdkRldlt3RGV2SURdLmhGaWxlID0gMDsKIAl9CiAKQEAgLTMwMCw3ICszMDAsNyBAQAogCU1DSVdhdkRldlt3RGV2SURdLm5Vc2VDb3VudC0tOwogCWlmIChNQ0lXYXZEZXZbd0RldklEXS5uVXNlQ291bnQgPT0gMCkgewogCSAgICAgICAgaWYgKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlICE9IDApIHsKLQkJICAgICAgICBtbWlvQ2xvc2UoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUsIDApOworCQkgICAgICAgIG1taW9DbG9zZTMyKE1DSVdhdkRldlt3RGV2SURdLmhGaWxlLCAwKTsKIAkJCU1DSVdhdkRldlt3RGV2SURdLmhGaWxlID0gMDsKIAkJfQogCQlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uZklucHV0KQpAQCAtMzcwLDcgKzM3MCw3IEBACiAJbHBXYXZlSGRyLT5kd0xvb3BzID0gMEw7CiAJZHdSZXQ9d29kTWVzc2FnZSh3RGV2SUQsV09ETV9QUkVQQVJFLDAsKERXT1JEKWxwV2F2ZUhkcixzaXplb2YoV0FWRUhEUikpOwogCXdoaWxlKFRSVUUpIHsKLQkJY291bnQgPSBtbWlvUmVhZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgbHBXYXZlSGRyLT5scERhdGEsIGJ1ZnNpemUpOworCQljb3VudCA9IG1taW9SZWFkMzIoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUsIGxwV2F2ZUhkci0+bHBEYXRhLCBidWZzaXplKTsKIAkJVFJBQ0UobWNpd2F2ZSwibW1pb1JlYWQgYnVmc2l6ZT0lbGQgY291bnQ9JWxkXG4iLCBidWZzaXplLCBjb3VudCk7CiAJCWlmIChjb3VudCA8IDEpIGJyZWFrOwogCQlscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoID0gY291bnQ7CkBAIC0xMDU2LDEwICsxMDU2LDEyIEBACiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCX0KIAkvKiBGSVhNRTogaXMgTm90aWZ5Q2xpZW50IHdpdGggV09NX0RPTkUgcmlnaHQgPyAoQ29tZXQgQnVzdGVycyAxLjMuMyBuZWVkcyB0aGlzIG5vdGlmaWNhdGlvbikgKi8KKwkvKiBGSVhNRTogTXlzdCBjcmFzaGVzIHdpdGggdGhpcyAuLi4gaG1tIC1NTQogICAgICAgIAlpZiAoV0FWRV9Ob3RpZnlDbGllbnQod0RldklELCBXT01fRE9ORSwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7CiAgICAgICAgICAgICAgICAJV0FSTihtY2l3YXZlLCAiY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKICAgICAgICAgICAgICAgIAlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKICAgICAgICAgfQorCSovCiAKIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvZHNvdW5kLmMgYi9tdWx0aW1lZGlhL2Rzb3VuZC5jCmluZGV4IDYzNTE5ZmEuLjVlMjQ4YjAgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvZHNvdW5kLmMKKysrIGIvbXVsdGltZWRpYS9kc291bmQuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4JLyogSW5zb21uaWEgLSBwb3coKSBmdW5jdGlvbiAqLwogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgImludGVyZmFjZXMuaCIKQEAgLTE3OSw2ICsxODAsNyBAQAogCVRSQUNFKGRzb3VuZCwiKCVwLCVsZClcbiIsdGhpcyx2b2wpOwogCXRoaXMtPnZvbHVtZSA9IHZvbDsKIAl0aGlzLT52b2xmYWMgPSAoKGRvdWJsZSl2b2wrMTAwMDAuMCkvMTAwMDAuMDsKKwogCXJldHVybiAwOwogfQogCkBAIC0zNDAsNyArMzQyLDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfVW5sb2NrKAogCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMUFZPSUQgcDEsRFdPUkQgeDEsTFBWT0lEIHAyLERXT1JEIHgyCiApIHsKLQlGSVhNRShkc291bmQsIiglcCwlcCwlbGQsJXAsJWxkKTpzdHViXG4iLCB0aGlzLHAxLHgxLHAyLHgyKTsKKy8qCUZJWE1FKGRzb3VuZCwiKCVwLCVwLCVsZCwlcCwlbGQpOnN0dWJcbiIsIHRoaXMscDEseDEscDIseDIpOyAqLwogCXJldHVybiAwOwogfQogCkBAIC0zNTYsNiArMzU4LDcgQEAKIAlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBESVJFQ1RTT1VORCBkc291bmQsTFBEU0JVRkZFUkRFU0MgZGJzZAogKSB7CiAJRklYTUUoZHNvdW5kLCIoJXAsJXAsJXApOnN0dWJcbiIsdGhpcyxkc291bmQsZGJzZCk7CisJcHJpbnRmKCJSZS1Jbml0ISEhXG4iKTsKIAlyZXR1cm4gRFNFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOwogfQogCkBAIC02MjIsNyArNjI1LDI5IEBACiAJaW50CWosYnVmbGVuID0gZHNiLT5idWZsZW47CiAJTFBEU0JQT1NJVElPTk5PVElGWQluZXh0ZXZlbnQ7CiAJaW50CXhkaWZmID0gZHNiLT53ZngublNhbXBsZXNQZXJTZWMtZHNvdW5kLT53ZngublNhbXBsZXNQZXJTZWM7Ci0JZG91YmxlCXZvbGZhYyA9IGRzYi0+dm9sZmFjOworCisJLyogSW5zb21uaWEgLSBHb2luZyBhbG9uZyB3aXRoIFJFQUwgYXV0aG9yJ3Mgc3R5bGUgKi8KKwlsb25nCVJ2b2xkZWMsIEx2b2xkZWM7CisJbG9uZwlwYW4gPSBkc2ItPnBhbjsKKwlsb25nIHNhbXA7CS8qIHRlbXBvcmFyeSBzYW1wbGUgd29ya3NwYWNlICovCisKKwl7CisJCWRvdWJsZQl0bXByPWRzYi0+dm9sdW1lLTUwMDsKKwkJZG91YmxlICB0bXBsPXRtcHI7CisJCWlmKHBhbj4wKSAgdG1wbCAtPSAoZG91YmxlKXBhbjsKKwkJZWxzZSAgdG1wciArPSAoZG91YmxlKXBhbjsKKwkJdG1wbCAvPSAxMDAwLjA7CisJCXRtcHIgLz0gMTAwMC4wOworCQl0bXBsID0gcG93KDIuMCwgdG1wbCk7CisJCXRtcHIgPSBwb3coMi4wLCB0bXByKTsKKwkJdG1wbCAqPSA2NTUzNjsJLyogU2V0IHRvIHRoZSBjb3JyZWN0IG11bHRpcGxlIHRpbWVzICovCisJCXRtcHIgKj0gNjU1MzY7CS8qIDY1NTM2IHRvIGJlIGNvbnZlbmllbnQgZm9yIGJpdCBzaGlmdGluZyAqLworCQl0bXBsICs9IDAuNTsJLyogQWRkIC41IGZvciByb3VuZGluZyBhY2N1cmFjeSAqLworCQl0bXByICs9IDAuNTsKKwkJTHZvbGRlYyA9IChsb25nKXRtcGw7CisJCVJ2b2xkZWMgPSAobG9uZyl0bXByOworCX0KKwkvKiBFbmQgSW5zb21uaWEncyBtb2QgKi8KIAogCWlmICh4ZGlmZjwwKSB4ZGlmZj0teGRpZmY7CiAJaWYgKHhkaWZmPjE1MDApIHsKQEAgLTY0Niw5ICs2NzEsMjYgQEAKIAkJCQkJCWRzYi0+cGxheXBvcyA9IGJ1ZmxlbjsKIAkJCQkJCXJldHVybjsKIAkJCQkJfQotCQkJCQkvKiBGSVhNRTogcGFuLHZvbHVtZSAqLwotCQkJCQlwbGF5YnVmOFsoajw8MSkgIF0rPXhidWZbZHNiLT5wbGF5cG9zXSp2b2xmYWM7Ci0JCQkJCXBsYXlidWY4WyhqPDwxKSsxXSs9eGJ1Zltkc2ItPnBsYXlwb3NdKnZvbGZhYzsKKwkJCQkJLyogSW5zb21uaWEtIHZvbHVtZSwgcGFubmluZywgYW5kIGNvcnJlY3RpbmcgYWdhaW5zdCB3cmFwICovCisJCQkJCS8qIExlZnQgQ2hhbm5lbCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCQkJCQlzYW1wICo9IEx2b2xkZWM7CisJCQkJCXNhbXAgPj49IDE2OworCQkJCQlzYW1wICs9IHBsYXlidWY4WyhqPDwxKV07CisJCQkJCWlmKHNhbXAgPiAxMjdMKSAgc2FtcCA9IDEyN0w7CisJCQkJCWVsc2UgaWYoc2FtcCA8IC0xMjhMKSAgc2FtcCA9IC0xMjhMOworCQkJCQlwbGF5YnVmOFsoajw8MSldID0gKHNob3J0KXNhbXA7CisKKwkJCQkJLyogUmlnaHQgQ2hhbm5lbCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCQkJCQlzYW1wICo9IFJ2b2xkZWM7CisJCQkJCXNhbXAgPj49IDE2OworCQkJCQlzYW1wICs9IHBsYXlidWY4WyhqPDwxKSsxXTsKKwkJCQkJaWYoc2FtcCA+IDEyN0wpICBzYW1wID0gMTI3TDsKKwkJCQkJZWxzZSBpZihzYW1wIDwgLTEyOEwpICBzYW1wID0gLTEyOEw7CisJCQkJCXBsYXlidWY4WyhqPDwxKSsxXSA9IChzaG9ydClzYW1wOworCQkJCQkvKiBFbmQgSW5zb21uaWEncyBtb2QgKi8KKwogCQkJCQlDSEVDS19FVkVOVAogCQkJCX0KIAkJCX0gZWxzZSB7CkBAIC02NTksOCArNzAxLDIxIEBACiAJCQkJCQlkc2ItPnBsYXlwb3MgPSBidWZsZW47CiAJCQkJCQlyZXR1cm47CiAJCQkJCX0KLQkJCQkJLyogRklYTUU6IHBhbix2b2x1bWUgKi8KLQkJCQkJcGxheWJ1Zjhbal0rPXhidWZbZHNiLT5wbGF5cG9zXSp2b2xmYWM7CisJCQkJCS8qIEluc29tbmlhLSB2b2x1bWUsIHBhbm5pbmcsIGFuZCBjb3JyZWN0aW5nIGFnYWluc3Qgd3JhcCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCisJCQkJCS8qIFJpZ2h0IENoYW5uZWwgKi8KKwkJCQkJaWYoaiYxKSBzYW1wICo9IFJ2b2xkZWM7CisJCQkJCS8qIExlZnQgQ2hhbm5lbCAqLworCQkJCQllbHNlICAgIHNhbXAgKj0gTHZvbGRlYzsKKworCQkJCQlzYW1wID4+PSAxNjsKKwkJCQkJc2FtcCArPSBwbGF5YnVmOFtqXTsKKwkJCQkJaWYoc2FtcCA+IDEyN0wpICBzYW1wID0gMTI3TDsKKwkJCQkJZWxzZSBpZihzYW1wIDwgLTEyOEwpICBzYW1wID0gLTEyOEw7CisJCQkJCXBsYXlidWY4W2pdID0gKHNob3J0KXNhbXA7CisJCQkJCS8qIEVuZCBJbnNvbW5pYSdzIG1vZCAqLworCiAJCQkJCUNIRUNLX0VWRU5UCiAJCQkJfQogCQkJfQpAQCAtNjc0LDkgKzcyOSwyNiBAQAogCQkJCQkJZHNiLT5wbGF5cG9zID0gYnVmbGVuOwogCQkJCQkJcmV0dXJuOwogCQkJCQl9Ci0JCQkJCS8qIEZJWE1FOiBwYW4sdm9sdW1lICovCi0JCQkJCXBsYXlidWY4WyhqPDwxKSAgXSs9KHhidWZbZHNiLT5wbGF5cG9zPj4xXT4+OCkqdm9sZmFjOwotCQkJCQlwbGF5YnVmOFsoajw8MSkrMV0rPSh4YnVmW2RzYi0+cGxheXBvcz4+MV0+PjgpKnZvbGZhYzsKKwkJCQkJLyogSW5zb21uaWEtIHZvbHVtZSwgcGFubmluZywgYW5kIGNvcnJlY3RpbmcgYWdhaW5zdCB3cmFwICovCisJCQkJCS8qIExlZnQgQ2hhbm5lbCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCQkJCQlzYW1wICo9IEx2b2xkZWM7CisJCQkJCXNhbXAgPj49IDI0OworCQkJCQlzYW1wICs9IHBsYXlidWY4WyhqPDwxKV07CisJCQkJCWlmKHNhbXAgPiAxMjdMKSAgc2FtcCA9IDEyN0w7CisJCQkJCWVsc2UgaWYoc2FtcCA8IC0xMjhMKSAgc2FtcCA9IC0xMjhMOworCQkJCQlwbGF5YnVmOFsoajw8MSldID0gKHNob3J0KXNhbXA7CisKKwkJCQkJLyogUmlnaHQgQ2hhbm5lbCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCQkJCQlzYW1wICo9IFJ2b2xkZWM7CisJCQkJCXNhbXAgPj49IDI0OworCQkJCQlzYW1wICs9IHBsYXlidWY4WyhqPDwxKSsxXTsKKwkJCQkJaWYoc2FtcCA+IDEyN0wpICBzYW1wID0gMTI3TDsKKwkJCQkJZWxzZSBpZihzYW1wIDwgLTEyOEwpICBzYW1wID0gLTEyOEw7CisJCQkJCXBsYXlidWY4WyhqPDwxKSsxXSA9IChzaG9ydClzYW1wOworCQkJCQkvKiBFbmQgSW5zb21uaWEncyBtb2QgKi8KKwogCQkJCQlDSEVDS19FVkVOVAogCQkJCX0KIAkJCX0gZWxzZSB7CkBAIC02ODcsMTYgKzc1OSwzMSBAQAogCQkJCQkJZHNiLT5wbGF5cG9zID0gYnVmbGVuOwogCQkJCQkJcmV0dXJuOwogCQkJCQl9Ci0JCQkJCS8qIEZJWE1FOiBwYW4sdm9sdW1lICovCi0JCQkJCXBsYXlidWY4W2pdKz0oeGJ1Zltkc2ItPnBsYXlwb3M+PjFdPj44KSp2b2xmYWM7CisJCQkJCS8qIEluc29tbmlhLSB2b2x1bWUsIHBhbm5pbmcsIGFuZCBjb3JyZWN0aW5nIGFnYWluc3Qgd3JhcCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCisJCQkJCS8qIFJpZ2h0IENoYW5uZWwgKi8KKwkJCQkJaWYoaiYxKSBzYW1wICo9IFJ2b2xkZWM7CisJCQkJCS8qIExlZnQgQ2hhbm5lbCAqLworCQkJCQllbHNlICAgIHNhbXAgKj0gTHZvbGRlYzsKKworCQkJCQlzYW1wID4+PSAyNDsKKwkJCQkJc2FtcCArPSBwbGF5YnVmOFtqXTsKKwkJCQkJaWYoc2FtcCA+IDEyN0wpICBzYW1wID0gMTI3TDsKKwkJCQkJZWxzZSBpZihzYW1wIDwgLTEyOEwpICBzYW1wID0gLTEyOEw7CisJCQkJCXBsYXlidWY4W2pdID0gKHNob3J0KXNhbXA7CisJCQkJCS8qIEVuZCBJbnNvbW5pYSdzIG1vZCAqLworCiAJCQkJCUNIRUNLX0VWRU5UCiAJCQkJfQogCQkJfQogCQl9CiAJfSBlbHNlIHsgLyogMTYgYml0ICovCiAJCWlmIChkc2ItPndmeC53Qml0c1BlclNhbXBsZSA9PSA4KSB7Ci0JCQl1bnNpZ25lZCBjaGFyCSp4YnVmID0gKHVuc2lnbmVkIGNoYXIqKShkc2ItPmJ1ZmZlcik7CisvKgkJCXVuc2lnbmVkIGNoYXIJKnhidWYgPSAodW5zaWduZWQgY2hhciopKGRzYi0+YnVmZmVyKTsgKi8KKwkJCWNoYXIJKnhidWYgPSBkc2ItPmJ1ZmZlcjsKIAkJCWlmIChkc2ItPndmeC5uQ2hhbm5lbHMgPT0gMSkgeworCXByaW50ZigiTWl4aW5nIDgtYml0IHN0ZXJlbyBpbnRvIDE2ISFcbiIpOwogCQkJCWZvciAoaj0wO2o8c2l6ZW9mKHBsYXlidWYpL3NpemVvZihwbGF5YnVmWzBdKS8yO2orKykgewogCQkJCQlkc2ItPnBsYXlwb3M9KGRzYi0+cGxheXBvcysxKSVidWZsZW47CiAJCQkJCWlmICghZHNiLT5wbGF5cG9zICYmICEoZHNiLT5wbGF5ZmxhZ3MmRFNCUExBWV9MT09QSU5HKSkgewpAQCAtNzA0LDEwICs3OTEsMjYgQEAKIAkJCQkJCWRzYi0+cGxheXBvcyA9IGJ1ZmxlbjsKIAkJCQkJCXJldHVybjsKIAkJCQkJfQotCQkJCQkvKiBGSVhNRTogcGFuLHZvbHVtZSAqLwotCQkJCQkvKiBGSVhNRTogc2hvdWxkIGJlICoyNTYgKi8KLQkJCQkJcGxheWJ1Zlsoajw8MSkgIF0rPSh4YnVmW2RzYi0+cGxheXBvc108PDcpKnZvbGZhYzsKLQkJCQkJcGxheWJ1Zlsoajw8MSkrMV0rPSh4YnVmW2RzYi0+cGxheXBvc108PDcpKnZvbGZhYzsKKwkJCQkJLyogSW5zb21uaWEtIHZvbHVtZSwgcGFubmluZywgYW5kIGNvcnJlY3RpbmcgYWdhaW5zdCB3cmFwICovCisJCQkJCS8qIExlZnQgQ2hhbm5lbCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCQkJCQlzYW1wICo9IEx2b2xkZWM7CisJCQkJCXNhbXAgPj49IDg7CisJCQkJCXNhbXAgKz0gcGxheWJ1Zlsoajw8MSldOworCQkJCQlpZihzYW1wID4gMzI3NjdMKSAgc2FtcCA9IDMyNzY3TDsKKwkJCQkJZWxzZSBpZihzYW1wIDwgLTMyNzY4TCkgIHNhbXAgPSAtMzI3NjhMOworCQkJCQlwbGF5YnVmWyhqPDwxKV0gPSAoc2hvcnQpc2FtcDsKKworCQkJCQkvKiBSaWdodCBDaGFubmVsICovCisJCQkJCXNhbXAgPSB4YnVmW2RzYi0+cGxheXBvcz4+MV07CisJCQkJCXNhbXAgKj0gUnZvbGRlYzsKKwkJCQkJc2FtcCA+Pj0gODsKKwkJCQkJc2FtcCArPSBwbGF5YnVmWyhqPDwxKSsxXTsKKwkJCQkJaWYoc2FtcCA+IDMyNzY3TCkgIHNhbXAgPSAzMjc2N0w7CisJCQkJCWVsc2UgaWYoc2FtcCA8IC0zMjc2OEwpICBzYW1wID0gLTMyNzY4TDsKKwkJCQkJcGxheWJ1Zlsoajw8MSkrMV0gPSAoc2hvcnQpc2FtcDsKKwkJCQkJLyogRW5kIEluc29tbmlhJ3MgbW9kICovCisKIAkJCQkJQ0hFQ0tfRVZFTlQKIAkJCQl9CiAJCQl9IGVsc2UgewpAQCAtNzE4LDkgKzgyMSwyMSBAQAogCQkJCQkJZHNiLT5wbGF5cG9zID0gYnVmbGVuOwogCQkJCQkJcmV0dXJuOwogCQkJCQl9Ci0JCQkJCS8qIEZJWE1FOiBwYW4sdm9sdW1lICovCi0JCQkJCS8qIEZJWE1FOiBzaG91bGQgYmUgKjI1NiAqLwotCQkJCQlwbGF5YnVmW2pdKz0oeGJ1Zltkc2ItPnBsYXlwb3NdPDw3KSp2b2xmYWM7CisJCQkJCS8qIEluc29tbmlhLSB2b2x1bWUsIHBhbm5pbmcsIGFuZCBjb3JyZWN0aW5nIGFnYWluc3Qgd3JhcCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCisJCQkJCS8qIFJpZ2h0IENoYW5uZWwgKi8KKwkJCQkJaWYoaiYxKSBzYW1wICo9IFJ2b2xkZWM7CisJCQkJCS8qIExlZnQgQ2hhbm5lbCAqLworCQkJCQllbHNlICAgIHNhbXAgKj0gTHZvbGRlYzsKKworCQkJCQlzYW1wID4+PSA4OworCQkJCQlzYW1wICs9IHBsYXlidWZbal07CisJCQkJCWlmKHNhbXAgPiAzMjc2N0wpICBzYW1wID0gMzI3NjdMOworCQkJCQllbHNlIGlmKHNhbXAgPCAtMzI3NjhMKSAgc2FtcCA9IC0zMjc2OEw7CisJCQkJCXBsYXlidWZbal0gPSAoc2hvcnQpc2FtcDsKKwkJCQkJLyogRW5kIEluc29tbmlhJ3MgbW9kICovCisKIAkJCQkJQ0hFQ0tfRVZFTlQKIAkJCQl9CiAJCQl9CkBAIC03MzQsOSArODQ5LDI2IEBACiAJCQkJCQlkc2ItPnBsYXlwb3MgPSBidWZsZW47CiAJCQkJCQlyZXR1cm47CiAJCQkJCX0KLQkJCQkJLyogRklYTUU6IHBhbix2b2x1bWUgKi8KLQkJCQkJcGxheWJ1Zlsoajw8MSkgIF0rPSh4YnVmW2RzYi0+cGxheXBvcz4+MV0qdm9sZmFjKTsKLQkJCQkJcGxheWJ1Zlsoajw8MSkrMV0rPSh4YnVmW2RzYi0+cGxheXBvcz4+MV0qdm9sZmFjKTsKKwkJCQkJLyogSW5zb21uaWEtIHZvbHVtZSwgcGFubmluZywgYW5kIGNvcnJlY3RpbmcgYWdhaW5zdCB3cmFwICovCisJCQkJCS8qIExlZnQgQ2hhbm5lbCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCQkJCQlzYW1wICo9IEx2b2xkZWM7CisJCQkJCXNhbXAgPj49IDE2OworCQkJCQlzYW1wICs9IHBsYXlidWZbKGo8PDEpXTsKKwkJCQkJaWYoc2FtcCA+IDMyNzY3TCkgIHNhbXAgPSAzMjc2N0w7CisJCQkJCWVsc2UgaWYoc2FtcCA8IC0zMjc2OEwpICBzYW1wID0gLTMyNzY4TDsKKwkJCQkJcGxheWJ1Zlsoajw8MSldID0gKHNob3J0KXNhbXA7CisKKwkJCQkJLyogUmlnaHQgQ2hhbm5lbCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCQkJCQlzYW1wICo9IFJ2b2xkZWM7CisJCQkJCXNhbXAgPj49IDE2OworCQkJCQlzYW1wICs9IHBsYXlidWZbKGo8PDEpKzFdOworCQkJCQlpZihzYW1wID4gMzI3NjdMKSAgc2FtcCA9IDMyNzY3TDsKKwkJCQkJZWxzZSBpZihzYW1wIDwgLTMyNzY4TCkgIHNhbXAgPSAtMzI3NjhMOworCQkJCQlwbGF5YnVmWyhqPDwxKSsxXSA9IChzaG9ydClzYW1wOworCQkJCQkvKiBFbmQgSW5zb21uaWEncyBtb2QgKi8KKwogCQkJCQlDSEVDS19FVkVOVAogCQkJCX0KIAkJCX0gZWxzZSB7CkBAIC03NDcsOCArODc5LDIxIEBACiAJCQkJCQlkc2ItPnBsYXlwb3MgPSBidWZsZW47CiAJCQkJCQlyZXR1cm47CiAJCQkJCX0KLQkJCQkJLyogRklYTUU6IHBhbix2b2x1bWUgKi8KLQkJCQkJcGxheWJ1ZltqXSs9eGJ1Zltkc2ItPnBsYXlwb3M+PjFdLyoqdm9sZmFjKi87CisJCQkJCS8qIEluc29tbmlhLSB2b2x1bWUsIHBhbm5pbmcsIGFuZCBjb3JyZWN0aW5nIGFnYWluc3Qgd3JhcCAqLworCQkJCQlzYW1wID0geGJ1Zltkc2ItPnBsYXlwb3M+PjFdOworCisJCQkJCS8qIFJpZ2h0IENoYW5uZWwgKi8KKwkJCQkJaWYoaiYxKSBzYW1wICo9IFJ2b2xkZWM7CisJCQkJCS8qIExlZnQgQ2hhbm5lbCAqLworCQkJCQllbHNlICAgIHNhbXAgKj0gTHZvbGRlYzsKKworCQkJCQlzYW1wID4+PSAxNjsKKwkJCQkJc2FtcCArPSBwbGF5YnVmW2pdOworCQkJCQlpZihzYW1wID4gMzI3NjdMKSAgc2FtcCA9IDMyNzY3TDsKKwkJCQkJZWxzZSBpZihzYW1wIDwgLTMyNzY4TCkgIHNhbXAgPSAtMzI3NjhMOworCQkJCQlwbGF5YnVmW2pdID0gKHNob3J0KXNhbXA7CisJCQkJCS8qIEVuZCBJbnNvbW5pYSdzIG1vZCAqLworCiAJCQkJCUNIRUNLX0VWRU5UCiAJCQkJfQogCQkJfQpAQCAtNzg0LDYgKzkyOSw4IEBACiAJCWZvciAoaT1kc291bmQtPm5yb2ZidWZmZXJzO2ktLTspIHsKIAkJCUlEaXJlY3RTb3VuZEJ1ZmZlcgkqZHNiID0gZHNvdW5kLT5idWZmZXJzW2ldOwogCisJCQlpZiAoIWRzYiB8fCAhZHNiLT5scHZ0YmwpCisJCQkJY29udGludWU7CiAJCQlkc2ItPmxwdnRibC0+Zm5BZGRSZWYoZHNiKTsKIAkJCWlmIChkc2ItPnBsYXlpbmcgJiYgZHNiLT5idWZsZW4pCiAJCQkJcGxheWluZysrOwpAQCAtODE0LDYgKzk2MSw4IEBACiAJCWZvciAoaT1kc291bmQtPm5yb2ZidWZmZXJzO2ktLTspIHsKIAkJCUlEaXJlY3RTb3VuZEJ1ZmZlcgkqZHNiID0gZHNvdW5kLT5idWZmZXJzW2ldOwogCisJCQlpZiAoIWRzYiB8fCAhZHNiLT5scHZ0YmwpCisJCQkJY29udGludWU7CiAJCQlkc2ItPmxwdnRibC0+Zm5BZGRSZWYoZHNiKTsKIAkJCWlmIChkc2ItPmJ1ZmxlbiAmJiBkc2ItPnBsYXlpbmcpIHsKIAkJCQlwbGF5aW5nKys7CkBAIC04ODIsNyArMTAzMSw3IEBACiAJCURXT1JECQl4aWQ7CiAKIAkJZHNvdW5kID0gKCpwcERTKTsKLQkJaG5kID0gQ3JlYXRlVGhyZWFkKE5VTEwsTlVMTCxEU09VTkRfdGhyZWFkLDAsMCwmeGlkKTsKKwkJaG5kID0gQ3JlYXRlVGhyZWFkKE5VTEwsMCxEU09VTkRfdGhyZWFkLDAsMCwmeGlkKTsKIAl9CiAJcmV0dXJuIDA7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tY2lzdHJpbmcuYyBiL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKaW5kZXggODM0MzI0MS4uZTMyZTk5ZCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2lzdHJpbmcuYworKysgYi9tdWx0aW1lZGlhL21jaXN0cmluZy5jCkBAIC0yMTc3LDkgKzIxNzcsOSBAQAogCQkJU0VHUFRSCWRuYW1lOwogCiAJCQlkbmFtZT0oU0VHUFRSKUdldE9wZW5EcnYod0RldklEKS0+bHBzdHJBbGlhczsKLQkJCWlmIChkbmFtZT09TlVMTCkgCisJCQlpZiAoZG5hbWU9PShTRUdQVFIpTlVMTCkgCiAJCQkJZG5hbWU9KFNFR1BUUilHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyRGV2aWNlVHlwZTsKLQkJCWlmICgoZG5hbWUhPU5VTEwpJiYoIVNUUkNNUChQVFJfU0VHX1RPX0xJTihkbmFtZSksZGV2KSkpCisJCQlpZiAoKGRuYW1lIT0oU0VHUFRSKU5VTEwpJiYoIVNUUkNNUChQVFJfU0VHX1RPX0xJTihkbmFtZSksZGV2KSkpCiAJCQkJYnJlYWs7CiAJCQl3RGV2SUQgPSBNTVNZU1RFTV9OZXh0RGV2SUQod0RldklEKTsKIAkJCWlmICghTU1TWVNURU1fRGV2SURWYWxpZCh3RGV2SUQpKSB7CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21pZGkuYyBiL211bHRpbWVkaWEvbWlkaS5jCmluZGV4IGVlYzBmODIuLmFiY2NjYjUgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWlkaS5jCisrKyBiL211bHRpbWVkaWEvbWlkaS5jCkBAIC04MSw3ICs4MSw3IEBACiBzdGF0aWMgRFdPUkQgTUlESV9SZWFkQnl0ZShVSU5UMTYgd0RldklELCBCWVRFICpscGJ5dCkKIHsKIAlpZiAobHBieXQgIT0gTlVMTCkgewotCQlpZiAobW1pb1JlYWQoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAoSFBTVFIpbHBieXQsCisJCWlmIChtbWlvUmVhZDMyKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgKEhQU1RSKWxwYnl0LAogCQkJKGxvbmcpIHNpemVvZihCWVRFKSkgPT0gKGxvbmcpIHNpemVvZihCWVRFKSkgewogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTE2NiwxMSArMTY2LDExIEBACiAJRFdPUkQJdG9iZXJlYWQ7CiAJRk9VUkNDCWZvdXJjYzsKIAlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdPZmZzZXQpOwotCWlmIChtbWlvU2VlayhNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGR3T2Zmc2V0LCBTRUVLX1NFVCkgIT0gZHdPZmZzZXQpIHsKKwlpZiAobW1pb1NlZWszMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGR3T2Zmc2V0LCBTRUVLX1NFVCkgIT0gZHdPZmZzZXQpIHsKIAkJV0FSTihtaWRpLCAiY2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CiAJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJfQotCWlmIChtbWlvUmVhZChNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUikmZm91cmNjLAorCWlmIChtbWlvUmVhZDMyKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgKEhQU1RSKSZmb3VyY2MsCiAJCShsb25nKSBzaXplb2YoRk9VUkNDKSkgIT0gKGxvbmcpIHNpemVvZihGT1VSQ0MpKQogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWlmIChNSURJX1JlYWRMb25nKHdEZXZJRCwgJnRvYmVyZWFkKSAhPSAwKQpAQCAtMTk4LDEwICsxOTgsMTAgQEAKIHsKIAlEV09SRAl0b2JlcmVhZDsKIAlGT1VSQ0MJZm91cmNjOwotCWlmIChtbWlvU2VlayhNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGR3T2Zmc2V0LCBTRUVLX1NFVCkgIT0gZHdPZmZzZXQpIHsKKwlpZiAobW1pb1NlZWszMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGR3T2Zmc2V0LCBTRUVLX1NFVCkgIT0gZHdPZmZzZXQpIHsKIAkJV0FSTihtaWRpLCAiY2FuJ3Qgc2VlayBhdCAlMDhsWCBiZWdpbiBvZiAnTVRoZCcgXG4iLCBkd09mZnNldCk7CiAJCX0KLQlpZiAobW1pb1JlYWQoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAoSFBTVFIpJmZvdXJjYywKKwlpZiAobW1pb1JlYWQzMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIChIUFNUUikmZm91cmNjLAogCQkobG9uZykgc2l6ZW9mKEZPVVJDQykpICE9IChsb25nKSBzaXplb2YoRk9VUkNDKSkgewogCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CkBAIC0yOTAsMTIgKzI5MCwxMiBAQAogCQkJV0FSTihtaWRpLCAiY2FuJ3QgcmVhZCAnTVRoZCcgaGVhZGVyIFxuIik7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9Ci0JCWR3T2Zmc2V0ID0gbW1pb1NlZWsoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAwLCBTRUVLX0NVUik7CisJCWR3T2Zmc2V0ID0gbW1pb1NlZWszMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKIAkJaWYgKE1JRElfUmVhZE1Ucmsod0RldklELCBkd09mZnNldCkgIT0gMCkgewogCQkJV0FSTihtaWRpLCAiY2FuJ3QgcmVhZCAnTVRyaycgaGVhZGVyIFxuIik7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9Ci0JCWR3T2Zmc2V0ID0gbW1pb1NlZWsoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAwLCBTRUVLX0NVUik7CisJCWR3T2Zmc2V0ID0gbW1pb1NlZWszMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDAsIFNFRUtfQ1VSKTsKIAkJTUNJTWlkaURldlt3RGV2SURdLmR3QmVnaW5EYXRhID0gZHdPZmZzZXQ7CiAJCVRSQUNFKG1pZGksICJDaHVuayBGb3VuZCBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCiAJCQkJKExQU1RSKSZja01haW5SSUZGLmNraWQsIChMUFNUUikmY2tNYWluUklGRi5mY2NUeXBlLApAQCAtMzM3LDEwICszMzcsMTAgQEAKIAlNQ0lNaWRpRGV2W3dEZXZJRF0ublVzZUNvdW50LS07CiAJaWYgKE1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQgPT0gMCkgewogCQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlICE9IDApIHsKLQkJCW1taW9DbG9zZShNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIDApOworCQkJbW1pb0Nsb3NlMzIoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCAwKTsKIAkJCU1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSA9IDA7CiAJCQlUUkFDRShtaWRpLCAiaEZpbGUgY2xvc2VkICFcbiIpOwotCQkJfQorCQl9CiAJCVVTRVJfSEVBUF9GUkVFKE1DSU1pZGlEZXZbd0RldklEXS5oTWlkaUhkcik7CiAJCWR3UmV0ID0gbW9kTWVzc2FnZSh3RGV2SUQsIE1PRE1fQ0xPU0UsIDAsIDBMLCAwTCk7CiAJCWlmIChkd1JldCAhPSBNTVNZU0VSUl9OT0VSUk9SKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwpAQCAtNDE3LDcgKzQxNyw3IEBACiAJCQkqcHRyID0gTE9XT1JEKGR3RGF0YSk7CiAJCX0KIC8qCi0JCWNvdW50ID0gbW1pb1JlYWQoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlLCBscE1pZGlIZHItPmxwRGF0YSwgbHBNaWRpSGRyLT5kd0J1ZmZlckxlbmd0aCk7CisJCWNvdW50ID0gbW1pb1JlYWQzMihNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGxwTWlkaUhkci0+bHBEYXRhLCBscE1pZGlIZHItPmR3QnVmZmVyTGVuZ3RoKTsKICovCiAJCVRSQUNFKG1pZGksICJhZnRlciByZWFkIGNvdW50ID0gJWRcbiIsY291bnQpOwogCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21taW8uYyBiL211bHRpbWVkaWEvbW1pby5jCmluZGV4IDMyOTIyZWQuLjVkODg1NDIgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1pby5jCisrKyBiL211bHRpbWVkaWEvbW1pby5jCkBAIC0yMiw4ICsyMiw4IEBACiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICBtbWlvRG9zSU9Qcm9jICAgICAgICAgICBbaW50ZXJuYWxdCi0qLworICogICAgICAgICAgICAgICBtbWlvRG9zSU9Qcm9jICAgICAgICAgICBbaW50ZXJuYWxdCisgKi8KIHN0YXRpYyBMUkVTVUxUIG1taW9Eb3NJT1Byb2MoTFBNTUlPSU5GTzE2IGxwbW1pb2luZm8sIFVJTlQxNiB1TWVzc2FnZSwgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKSB7CiAJVFJBQ0UobW1pbywgIiglcCwgJVgsICVsZCwgJWxkKTtcbiIsIGxwbW1pb2luZm8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKIApAQCAtMTQ4LDcgKzE0OCw3IEBACiAJCX0KIAogCQlkZWZhdWx0OgotCQkJV0FSTihtbWlvLCAidW5leHBlY3RlZCBtZXNzYWdlICV1XG4iLCB1TWVzc2FnZSk7CisJCQlGSVhNRShtbWlvLCAidW5leHBlY3RlZCBtZXNzYWdlICV1XG4iLCB1TWVzc2FnZSk7CiAJCQlyZXR1cm4gMDsKIAl9CiAJCkBAIC0xNTYsOSArMTU2LDEwIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgIG1taW9Eb3NJT1Byb2MgICAgICAgICAgIFtpbnRlcm5hbF0KKyogICAgICAgICAgICAgICBtbWlvTWVtSU9Qcm9jICAgICAgICAgICBbaW50ZXJuYWxdCiAqLwogc3RhdGljIExSRVNVTFQgbW1pb01lbUlPUHJvYyhMUE1NSU9JTkZPMTYgbHBtbWlvaW5mbywgVUlOVDE2IHVNZXNzYWdlLCBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpIHsKKwlGSVhNRShtbWlvLCIoJXAsMHglMDR4LDB4JTA4bHgsMHglMDhseCksIHN0dWIhXG4iLGxwbW1pb2luZm8sdU1lc3NhZ2UsbFBhcmFtMSxsUGFyYW0yKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ4LDEyICsyNDksMTIgQEAKIAogICAgIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkJCQltbWlvQ2xvc2UgICAgICAJCVtNTVNZU1RFTS4xMjExXQotKi8KLVVJTlQxNiBXSU5BUEkgbW1pb0Nsb3NlKEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1RmxhZ3MpCisgKiAJCQkJbW1pb0Nsb3NlICAgICAgCQlbV0lOTU0uMTE0XQorICovCitNTVJFU1VMVDMyIFdJTkFQSSBtbWlvQ2xvc2UzMihITU1JTzMyIGhtbWlvLCBVSU5UMzIgdUZsYWdzKQogewogCUxQTU1JT0lORk8xNiBscG1taW5mbzsKLQlVSU5UMTYgcmVzdWx0OworCU1NUkVTVUxUMzIgcmVzdWx0OwogCiAJVFJBQ0UobW1pbywgIiglMDRYLCAlMDRYKTtcbiIsIGhtbWlvLCB1RmxhZ3MpOwogCkBAIC0yNjIsMTAgKzI2MywxMCBAQAogCQlyZXR1cm4gMDsKIAogCS8qIGZsdXNoIHRoZSBmaWxlIC0gaWYgZXJyb3IgcmVwb3J0ZWQsIGlnbm9yZSAqLwotCWlmIChtbWlvRmx1c2goaG1taW8sIE1NSU9fRU1QVFlCVUYpICE9IDApCisJaWYgKG1taW9GbHVzaDMyKGhtbWlvLCBNTUlPX0VNUFRZQlVGKSAhPSAwKQogCQlscG1taW5mby0+ZHdGbGFncyAmPSB+TU1JT19ESVJUWTsKIAotCXJlc3VsdCA9IChVSU5UMTYpIG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fQ0xPU0UsIChMUEFSQU0pIHVGbGFncywgKExQQVJBTSkgMCk7CisJcmVzdWx0ID0gbW1pb1NlbmRNZXNzYWdlKGhtbWlvLE1NSU9NX0NMT1NFLChMUEFSQU0pdUZsYWdzLChMUEFSQU0pMCk7CiAKIAltbWlvU2V0QnVmZmVyKGhtbWlvLCBOVUxMLCAwLCAwKTsKIApAQCAtMjc2LDExICsyNzcsMjAgQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQltbWlvQ2xvc2UgICAgICAJCVtNTVNZU1RFTS4xMjExXQorICovCitNTVJFU1VMVDE2IFdJTkFQSSBtbWlvQ2xvc2UxNihITU1JTzE2IGhtbWlvLCBVSU5UMTYgdUZsYWdzKQoreworCXJldHVybiBtbWlvQ2xvc2UzMihobW1pbyx1RmxhZ3MpOworfQorCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkJCQltbWlvUmVhZAkgICAgICAgCVtNTVNZU1RFTS4xMjEyXQotKi8KLUxPTkcgV0lOQVBJIG1taW9SZWFkKEhNTUlPMTYgaG1taW8sIEhQU1RSIHBjaCwgTE9ORyBjY2gpCisgKiAJCQkJbW1pb1JlYWQJICAgICAgIAlbV0lOTS4xMjRdCisgKi8KK0xPTkcgV0lOQVBJIG1taW9SZWFkMzIoSE1NSU8zMiBobW1pbywgSFBTVFIgcGNoLCBMT05HIGNjaCkKIHsKIAlMT05HIGNvdW50OwogCUxQTU1JT0lORk8xNiBscG1taW5mbzsKQEAgLTI5OCwxMiArMzA4LDE4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCW1taW9SZWFkCSAgICAgICAJW01NU1lTVEVNLjEyMTJdCisgKi8KK0xPTkcgV0lOQVBJIG1taW9SZWFkMTYoSE1NSU8xNiBobW1pbywgSFBTVFIgcGNoLCBMT05HIGNjaCkKK3sKKwlyZXR1cm4gbW1pb1JlYWQzMihobW1pbyxwY2gsY2NoKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkJCQltbWlvV3JpdGUgICAgICAJCVtNTVNZU1RFTS4xMjEzXQotKi8KLUxPTkcgV0lOQVBJIG1taW9Xcml0ZShITU1JTzE2IGhtbWlvLCBIUENTVFIgcGNoLCBMT05HIGNjaCkKKyAqIAkJCQltbWlvV3JpdGUgICAgICAJCVtXSU5NTS4xMzNdCisgKi8KK0xPTkcgV0lOQVBJIG1taW9Xcml0ZTMyKEhNTUlPMzIgaG1taW8sIEhQQ1NUUiBwY2gsIExPTkcgY2NoKQogewogCUxPTkcgY291bnQ7CiAJTFBNTUlPSU5GTzE2IGxwbW1pbmZvOwpAQCAtMzIyLDkgKzMzOCwxNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCW1taW9TZWVrICAgICAgIAkJW01NU1lTVEVNLjEyMTRdCi0qLwotTE9ORyBXSU5BUEkgbW1pb1NlZWsoSE1NSU8xNiBobW1pbywgTE9ORyBsT2Zmc2V0LCBpbnQgaU9yaWdpbikKKyAqIAkJCQltbWlvV3JpdGUgICAgICAJCVtNTVNZU1RFTS4xMjEzXQorICovCitMT05HIFdJTkFQSSBtbWlvV3JpdGUxNihITU1JTzE2IGhtbWlvLCBIUENTVFIgcGNoLCBMT05HIGNjaCkKK3sKKwlyZXR1cm4gbW1pb1dyaXRlMzIoaG1taW8scGNoLGNjaCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCW1taW9TZWVrICAgICAgIAkJW01NU1lTVEVNLjEyMTRdCisgKi8KK0xPTkcgV0lOQVBJIG1taW9TZWVrMzIoSE1NSU8zMiBobW1pbywgTE9ORyBsT2Zmc2V0LCBJTlQzMiBpT3JpZ2luKQogewogCWludCBvZmZzZXQ7CiAJTFBNTUlPSU5GTzE2IGxwbW1pbmZvOwpAQCAtMzQyLDkgKzM2NiwxNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCW1taW9HZXRJbmZvCSAgICAgICAJW01NU1lTVEVNLjEyMTVdCi0qLwotVUlOVDE2IFdJTkFQSSBtbWlvR2V0SW5mbyhITU1JTzE2IGhtbWlvLCBNTUlPSU5GTzE2ICogbHBtbWlvaW5mbywgVUlOVDE2IHVGbGFncykKKyAqIAkJCQltbWlvU2VlayAgICAgICAJCVtNTVNZU1RFTS4xMjE0XQorICovCitMT05HIFdJTkFQSSBtbWlvU2VlazE2KEhNTUlPMTYgaG1taW8sIExPTkcgbE9mZnNldCwgSU5UMTYgaU9yaWdpbikKK3sKKwlyZXR1cm4gbW1pb1NlZWszMihobW1pbyxsT2Zmc2V0LGlPcmlnaW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQltbWlvR2V0SW5mbwkgICAgICAgCVtNTVNZU1RFTS4xMjE1XQorICovCitVSU5UMTYgV0lOQVBJIG1taW9HZXRJbmZvMTYoSE1NSU8xNiBobW1pbywgTU1JT0lORk8xNiAqIGxwbW1pb2luZm8sIFVJTlQxNiB1RmxhZ3MpCiB7CiAJTFBNTUlPSU5GTzE2CWxwbW1pbmZvOwogCVRSQUNFKG1taW8sICJtbWlvR2V0SW5mb1xuIik7CkBAIC0zNTYsNiArMzg4LDM4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCW1taW9HZXRJbmZvCSAgICAgICAJW1dJTk1NLjExOF0KKyAqLworVUlOVDMyIFdJTkFQSSBtbWlvR2V0SW5mbzMyKEhNTUlPMzIgaG1taW8sIE1NSU9JTkZPMzIqbHBtbWlvaW5mbywgVUlOVDMyIHVGbGFncykKK3sKKwlNTUlPSU5GTzE2CW1taW9pbmZvOworCUxQTU1JT0lORk8xNglscG1taW5mbz0mbW1pb2luZm87CisJVUlOVDE2CQlyZXQ7CisKKwlUUkFDRShtbWlvLCAiKDB4JTA0eCwlcCwweCUwOHgpXG4iLGhtbWlvLGxwbW1pb2luZm8sdUZsYWdzKTsKKwlyZXQgPSBtbWlvR2V0SW5mbzE2KGhtbWlvLCZtbWlvaW5mbyx1RmxhZ3MpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKwlscG1taW9pbmZvLT5kd0ZsYWdzCT0gbHBtbWluZm8tPmR3RmxhZ3M7CisJbHBtbWlvaW5mby0+ZmNjSU9Qcm9jCT0gbHBtbWluZm8tPmZjY0lPUHJvYzsKKwlscG1taW9pbmZvLT5wSU9Qcm9jCT0gKExQTU1JT1BST0MzMilscG1taW5mby0+cElPUHJvYzsKKwlscG1taW9pbmZvLT53RXJyb3JSZXQJPSBscG1taW5mby0+d0Vycm9yUmV0OworCWxwbW1pb2luZm8tPmh0YXNrCT0gbHBtbWluZm8tPmh0YXNrOworCWxwbW1pb2luZm8tPmNjaEJ1ZmZlcgk9IGxwbW1pbmZvLT5jY2hCdWZmZXI7CisJbHBtbWlvaW5mby0+cGNoQnVmZmVyCT0gbHBtbWluZm8tPnBjaEJ1ZmZlcjsKKwlscG1taW9pbmZvLT5wY2hOZXh0CT0gbHBtbWluZm8tPnBjaE5leHQ7CisJbHBtbWlvaW5mby0+cGNoRW5kUmVhZAk9IGxwbW1pbmZvLT5wY2hFbmRSZWFkOworCWxwbW1pb2luZm8tPnBjaEVuZFdyaXRlCT0gbHBtbWluZm8tPnBjaEVuZFdyaXRlOworCWxwbW1pb2luZm8tPmxCdWZPZmZzZXQJPSBscG1taW5mby0+bEJ1Zk9mZnNldDsKKwlscG1taW9pbmZvLT5sRGlza09mZnNldAk9IGxwbW1pbmZvLT5sRGlza09mZnNldDsKKwltZW1jcHkobHBtbWlvaW5mby0+YWR3SW5mbyxscG1taW5mby0+YWR3SW5mbyxzaXplb2YobHBtbWluZm8tPmFkd0luZm8pKTsKKwlscG1taW9pbmZvLT5kd1Jlc2VydmVkMQk9IGxwbW1pbmZvLT5kd1Jlc2VydmVkMTsKKwlscG1taW9pbmZvLT5kd1Jlc2VydmVkMgk9IGxwbW1pbmZvLT5kd1Jlc2VydmVkMjsKKwlscG1taW9pbmZvLT5obW1pbwk9IGxwbW1pbmZvLT5obW1pbzsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU2V0SW5mbyAgICAJCVtNTVNZU1RFTS4xMjE2XQogKi8KIFVJTlQxNiBXSU5BUEkgbW1pb1NldEluZm8oSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8xNiAqIGxwbW1pb2luZm8sIFVJTlQxNiB1RmxhZ3MpCkBAIC0zODMsOSArNDQ3LDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkJCQltbWlvRmx1c2ggICAgICAJCVtNTVNZU1RFTS4xMjE4XQotKi8KLVVJTlQxNiBXSU5BUEkgbW1pb0ZsdXNoKEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1RmxhZ3MpCisgKiAJCQkJbW1pb0ZsdXNoICAgICAgCQlbV0lOTU0uMTE3XQorICovCitVSU5UMzIgV0lOQVBJIG1taW9GbHVzaDMyKEhNTUlPMzIgaG1taW8sIFVJTlQzMiB1RmxhZ3MpCiB7CiAJTFBNTUlPSU5GTzE2CWxwbW1pbmZvOwogCVRSQUNFKG1taW8sICIoJTA0WCwgJTA0WClcbiIsIGhtbWlvLCB1RmxhZ3MpOwpAQCAtMzk2LDIzICs0NjAsNTEgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkJCQltbWlvQWR2YW5jZSAgICAJCVtNTVNZU1RFTS4xMjE5XQotKi8KLVVJTlQxNiBXSU5BUEkgbW1pb0FkdmFuY2UoSE1NSU8xNiBobW1pbywgTU1JT0lORk8xNiAqIGxwbW1pb2luZm8sIFVJTlQxNiB1RmxhZ3MpCisgKiAJCQkJbW1pb0ZsdXNoICAgICAgCQlbTU1TWVNURU0uMTIxOF0KKyAqLworVUlOVDE2IFdJTkFQSSBtbWlvRmx1c2gxNihITU1JTzE2IGhtbWlvLCBVSU5UMTYgdUZsYWdzKQoreworCXJldHVybiBtbWlvRmx1c2gzMihobW1pbyx1RmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQltbWlvQWR2YW5jZSAgICAJCVtNTVNZU1RFTS4xMjE5XQorICovCitVSU5UMzIgV0lOQVBJIG1taW9BZHZhbmNlMzIoSE1NSU8zMiBobW1pbyxNTUlPSU5GTzMyKmxwbW1pb2luZm8sVUlOVDMyIHVGbGFncykKIHsKIAlpbnQJCWNvdW50ID0gMDsKIAlMUE1NSU9JTkZPMTYJbHBtbWluZm87CiAJVFJBQ0UobW1pbywgIm1taW9BZHZhbmNlXG4iKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7Ci0JaWYgKHVGbGFncyA9PSBNTUlPX1JFQUQpIHsKKwlpZiAodUZsYWdzID09IE1NSU9fUkVBRCkKIAkJY291bnQgPSBfbHJlYWQzMihMT1dPUkQobHBtbWluZm8tPmFkd0luZm9bMF0pLCAKIAkJCWxwbW1pb2luZm8tPnBjaEJ1ZmZlciwgbHBtbWlvaW5mby0+Y2NoQnVmZmVyKTsKLQkJfQotCWlmICh1RmxhZ3MgPT0gTU1JT19XUklURSkgeworCWlmICh1RmxhZ3MgPT0gTU1JT19XUklURSkKIAkJY291bnQgPSBfbHdyaXRlMzIoTE9XT1JEKGxwbW1pbmZvLT5hZHdJbmZvWzBdKSwKIAkJCWxwbW1pb2luZm8tPnBjaEJ1ZmZlciwgbHBtbWlvaW5mby0+Y2NoQnVmZmVyKTsKLQkJfQorCWxwbW1pb2luZm8tPnBjaE5leHQJKz0gY291bnQ7CisJR2xvYmFsVW5sb2NrMTYoaG1taW8pOworCWxwbW1pbmZvLT5sRGlza09mZnNldCA9IF9sbHNlZWszMigoSEZJTEUzMilscG1taW5mby0+YWR3SW5mb1swXSwgMCwgU0VFS19DVVIpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQltbWlvQWR2YW5jZSAgICAJCVtNTVNZU1RFTS4xMjE5XQorICovCitVSU5UMTYgV0lOQVBJIG1taW9BZHZhbmNlMTYoSE1NSU8xNiBobW1pbyxNTUlPSU5GTzE2KmxwbW1pb2luZm8sVUlOVDE2IHVGbGFncykKK3sKKwlpbnQJCWNvdW50ID0gMDsKKwlMUE1NSU9JTkZPMTYJbHBtbWluZm87CisJVFJBQ0UobW1pbywgIm1taW9BZHZhbmNlXG4iKTsKKwlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKKwlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CisJaWYgKHVGbGFncyA9PSBNTUlPX1JFQUQpCisJCWNvdW50ID0gX2xyZWFkMzIoTE9XT1JEKGxwbW1pbmZvLT5hZHdJbmZvWzBdKSwgCisJCQlscG1taW9pbmZvLT5wY2hCdWZmZXIsIGxwbW1pb2luZm8tPmNjaEJ1ZmZlcik7CisJaWYgKHVGbGFncyA9PSBNTUlPX1dSSVRFKQorCQljb3VudCA9IF9sd3JpdGUzMihMT1dPUkQobHBtbWluZm8tPmFkd0luZm9bMF0pLAorCQkJbHBtbWlvaW5mby0+cGNoQnVmZmVyLCBscG1taW9pbmZvLT5jY2hCdWZmZXIpOwogCWxwbW1pb2luZm8tPnBjaE5leHQJKz0gY291bnQ7CiAJR2xvYmFsVW5sb2NrMTYoaG1taW8pOwogCWxwbW1pbmZvLT5sRGlza09mZnNldCA9IF9sbHNlZWszMigoSEZJTEUzMilscG1taW5mby0+YWR3SW5mb1swXSwgMCwgU0VFS19DVVIpOwpAQCAtNDQ0LDggKzUzNiw3IEBACiAgKi8KIEZPVVJDQyBXSU5BUEkgbW1pb1N0cmluZ1RvRk9VUkNDMTYoTFBDU1RSIHN6LCBVSU5UMTYgdUZsYWdzKQogewotCUZJWE1FKG1taW8sICJlbXB0eSBzdHViIFxuIik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIG1taW9GT1VSQ0Moc3pbMF0sc3pbMV0sc3pbMl0sc3pbM10pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU1NCwxMiArNjQ1LDEyIEBACiAJZHdmY2MgPSBscGNrLT5ja2lkOwogCVRSQUNFKG1taW8sICJkd2ZjYz0lMDhsWFxuIiwgZHdmY2MpOwogCi0JZHdPbGRQb3MgPSBtbWlvU2VlayhobW1pbywgMCwgU0VFS19DVVIpOworCWR3T2xkUG9zID0gbW1pb1NlZWszMihobW1pbywgMCwgU0VFS19DVVIpOwogCVRSQUNFKG1taW8sICJkd09sZFBvcz0lbGRcbiIsIGR3T2xkUG9zKTsKIAogCWlmIChscGNrUGFyZW50ICE9IE5VTEwpIHsKIAkJVFJBQ0UobW1pbywgInNlZWsgaW5zaWRlIHBhcmVudCBhdCAlbGQgIVxuIiwgbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0KTsKLQkJZHdPbGRQb3MgPSBtbWlvU2VlayhobW1pbywgbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0LCBTRUVLX1NFVCk7CisJCWR3T2xkUG9zID0gbW1pb1NlZWszMihobW1pbyxscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQsU0VFS19TRVQpOwogCX0KIC8qCiAKQEAgLTU3NCwxMSArNjY1LDExIEBACiAJCXdoaWxlIChUUlVFKSB7CiAJCSAgICAgICAgTE9ORyBpeDsKIAotCQkJaXggPSBtbWlvUmVhZChobW1pbywgKExQU1RSKWxwY2ssIHNpemVvZihNTUNLSU5GTykpOworCQkJaXggPSBtbWlvUmVhZDMyKGhtbWlvLCAoTFBTVFIpbHBjaywgc2l6ZW9mKE1NQ0tJTkZPKSk7CiAJCQlUUkFDRShtbWlvLCAiYWZ0ZXIgX2xyZWFkMzIgaXggPSAlbGQgcmVxID0gJWQsIGVycm5vID0gJWRcbiIsaXgsc2l6ZW9mKE1NQ0tJTkZPKSxlcnJubyk7CiAJCQlpZiAoaXggPCBzaXplb2YoTU1DS0lORk8pKSB7CiAKLQkJCQltbWlvU2VlayhobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKKwkJCQltbWlvU2VlazMyKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwogCQkJCVdBUk4obW1pbywgInJldHVybiBDaHVua05vdEZvdW5kXG4iKTsKIAkJCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwogCQkJfQpAQCAtNTkwLDEyICs2ODEsMTIgQEAKIAkJCWR3T2xkUG9zICs9IGxwY2stPmNrc2l6ZSArIDIgKiBzaXplb2YoRFdPUkQpOwogCQkJaWYgKGxwY2stPmNraWQgPT0gRk9VUkNDX1JJRkYgfHwgbHBjay0+Y2tpZCA9PSBGT1VSQ0NfTElTVCkgCiAJCQkJZHdPbGRQb3MgKz0gc2l6ZW9mKERXT1JEKTsKLQkJCW1taW9TZWVrKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOworCQkJbW1pb1NlZWszMihobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKIAkJfQogCX0KIAllbHNlIHsKLQkJaWYgKG1taW9SZWFkKGhtbWlvLCAoTFBTVFIpbHBjaywgc2l6ZW9mKE1NQ0tJTkZPKSkgPCBzaXplb2YoTU1DS0lORk8pKSB7Ci0JCQltbWlvU2VlayhobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKKwkJaWYgKG1taW9SZWFkMzIoaG1taW8sIChMUFNUUilscGNrLCBzaXplb2YoTU1DS0lORk8pKSA8IHNpemVvZihNTUNLSU5GTykpIHsKKwkJCW1taW9TZWVrMzIoaG1taW8sIGR3T2xkUG9zLCBTRUVLX1NFVCk7CiAJCQlXQVJOKG1taW8sICJyZXR1cm4gQ2h1bmtOb3RGb3VuZCAybmRcbiIpOwogCQkJcmV0dXJuIE1NSU9FUlJfQ0hVTktOT1RGT1VORDsKIAkJfQpAQCAtNjAzLDcgKzY5NCw3IEBACiAJbHBjay0+ZHdEYXRhT2Zmc2V0ID0gZHdPbGRQb3MgKyAyICogc2l6ZW9mKERXT1JEKTsKIAlpZiAobHBjay0+Y2tpZCA9PSBGT1VSQ0NfUklGRiB8fCBscGNrLT5ja2lkID09IEZPVVJDQ19MSVNUKSAKIAkJbHBjay0+ZHdEYXRhT2Zmc2V0ICs9IHNpemVvZihEV09SRCk7Ci0JbW1pb1NlZWsoaG1taW8sIGxwY2stPmR3RGF0YU9mZnNldCwgU0VFS19TRVQpOworCW1taW9TZWVrMzIoaG1taW8sIGxwY2stPmR3RGF0YU9mZnNldCwgU0VFS19TRVQpOwogCiAJVFJBQ0UobW1pbywgImxwY2stPmNraWQ9JTA4bFggbHBjay0+Y2tzaXplPSVsZCAhXG4iLCAKIAkJCQkJCQkJbHBjay0+Y2tpZCwgbHBjay0+Y2tzaXplKTsKQEAgLTYxMywxNyArNzA0LDI1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJbW1pb0FzY2VuZCAgICAgCQlbTU1TWVNURU0uMTIyNF0KLSovCi1VSU5UMTYgV0lOQVBJIG1taW9Bc2NlbmQoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLCBVSU5UMTYgdUZsYWdzKQorICogCQkJCW1taW9Bc2NlbmQgICAgIAkJW1dJTk1NLjExM10KKyAqLworVUlOVDMyIFdJTkFQSSBtbWlvQXNjZW5kMzIoSE1NSU8zMiBobW1pbywgTU1DS0lORk8gKiBscGNrLCBVSU5UMzIgdUZsYWdzKQogewogCUZJWE1FKG1taW8sICJlbXB0eSBzdHViICFcbiIpOwogCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCW1taW9DcmVhdGVDaHVuawkJW01NU1lTVEVNLjEyMjVdCi0qLworICogCQkJCW1taW9Bc2NlbmQgICAgIAkJW01NU1lTVEVNLjEyMjRdCisgKi8KK1VJTlQxNiBXSU5BUEkgbW1pb0FzY2VuZDE2KEhNTUlPMTYgaG1taW8sIE1NQ0tJTkZPICogbHBjaywgVUlOVDE2IHVGbGFncykKK3sKKwlyZXR1cm4gbW1pb0FzY2VuZDMyKGhtbWlvLGxwY2ssdUZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQkJbW1pb0NyZWF0ZUNodW5rCQlbTU1TWVNURU0uMTIyNV0KKyAqLwogVUlOVDE2IFdJTkFQSSBtbWlvQ3JlYXRlQ2h1bmsoSE1NSU8xNiBobW1pbywgTU1DS0lORk8gKiBscGNrLCBVSU5UMTYgdUZsYWdzKQogewogCUZJWE1FKG1taW8sICJlbXB0eSBzdHViIFxuIik7CkBAIC02MzIsOCArNzMxLDggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCW1taW9SZW5hbWUgICAgIAkJW01NU1lTVEVNLjEyMjZdCi0qLworICogCQkJCW1taW9SZW5hbWUgICAgIAkJW01NU1lTVEVNLjEyMjZdCisgKi8KIFVJTlQxNiBXSU5BUEkgbW1pb1JlbmFtZShMUENTVFIgc3pGaWxlTmFtZSwgTFBDU1RSIHN6TmV3RmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTU1JT0lORk8xNiAqIGxwbW1pb2luZm8sIERXT1JEIGR3UmVuYW1lRmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKaW5kZXggMjc1Y2MxNy4uNTg4OGNhNSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jCisrKyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJCSAgICBUUkFDRShtbXN5cywgIkNodW5rIEZvdW5kIGNraWQ9JS40cyBmY2NUeXBlPSUuNHMgY2tzaXplPSUwOGxYIFxuIiwKIAkJCQkoTFBTVFIpJm1tY2tJbmZvLmNraWQsIChMUFNUUikmbW1ja0luZm8uZmNjVHlwZSwgbW1ja0luZm8uY2tzaXplKTsKIAotCQkgICAgaWYgKG1taW9SZWFkKGhtbWlvLCAoSFBTVFIpICZwY21XYXZlRm9ybWF0LAorCQkgICAgaWYgKG1taW9SZWFkMzIoaG1taW8sKEhQU1RSKSZwY21XYXZlRm9ybWF0LAogCQkJICAgICAgICAobG9uZykgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKSA9PSAobG9uZykgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKQogCQkgICAgewogCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAkJCQl7CiAJCQkJICAgIHdoaWxlKCBUUlVFICkKIAkJCQkgICAgewotCQkJCQljb3VudCA9IG1taW9SZWFkKGhtbWlvLCB3YXZlSGRyLmxwRGF0YSwgYnVmc2l6ZSk7CisJCQkJCWNvdW50ID0gbW1pb1JlYWQzMihobW1pbyx3YXZlSGRyLmxwRGF0YSxidWZzaXplKTsKIAkJCQkJaWYgKGNvdW50IDwgMSkgYnJlYWs7CiAJCQkJCXdhdmVIZHIuZHdCdWZmZXJMZW5ndGggPSBjb3VudDsKIAkJCQkvKgl3YXZlSGRyLmR3Qnl0ZXNSZWNvcmRlZCA9IGNvdW50OyAqLwpAQCAtMjY5LDcgKzI2OSw3IEBACiAJICAgIH0KIAl9CiAKLQlpZiAoaG1taW8gIT0gMCkgbW1pb0Nsb3NlKGhtbWlvLCAwKTsKKwlpZiAoaG1taW8gIT0gMCkgbW1pb0Nsb3NlMzIoaG1taW8sIDApOwogCXJldHVybiBiUmV0OwogfQogCkBAIC0zNjMxLDQ4ICszNjMxLDQ2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJRHJ2T3BlbgkgICAgICAgCQlbTU1TWVNURU0uMTEwMF0KLSovCisgKiAJCQkJRHJ2T3BlbgkgICAgICAgCQlbTU1TWVNURU0uMTEwMF0KKyAqLwogSERSVlIxNiBXSU5BUEkgRHJ2T3BlbihMUFNUUiBscERyaXZlck5hbWUsIExQU1RSIGxwU2VjdGlvbk5hbWUsIExQQVJBTSBsUGFyYW0pCiB7Ci0JVFJBQ0UobW1zeXMsICIoJyVzJywgJyVzJywgJTA4bFgpO1xuIiwKLQkJbHBEcml2ZXJOYW1lLCBscFNlY3Rpb25OYW1lLCBsUGFyYW0pOwotCXJldHVybiBPcGVuRHJpdmVyKGxwRHJpdmVyTmFtZSwgbHBTZWN0aW9uTmFtZSwgbFBhcmFtKTsKKwlUUkFDRShtbXN5cywiKCclcycsJyVzJywlMDhsWCk7XG4iLGxwRHJpdmVyTmFtZSxscFNlY3Rpb25OYW1lLGxQYXJhbSk7CisJcmV0dXJuIE9wZW5Ecml2ZXIxNihscERyaXZlck5hbWUsIGxwU2VjdGlvbk5hbWUsIGxQYXJhbSk7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkJCQlEcnZDbG9zZSAgICAgICAJCVtNTVNZU1RFTS4xMTAxXQotKi8KKyAqIAkJCQlEcnZDbG9zZSAgICAgICAJCVtNTVNZU1RFTS4xMTAxXQorICovCiBMUkVTVUxUIFdJTkFQSSBEcnZDbG9zZShIRFJWUjE2IGhEcnZyLCBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpCiB7CiAJVFJBQ0UobW1zeXMsICIoJTA0WCwgJTA4bFgsICUwOGxYKTtcbiIsIGhEcnZyLCBsUGFyYW0xLCBsUGFyYW0yKTsKLQlyZXR1cm4gQ2xvc2VEcml2ZXIoaERydnIsIGxQYXJhbTEsIGxQYXJhbTIpOworCXJldHVybiBDbG9zZURyaXZlcjE2KGhEcnZyLCBsUGFyYW0xLCBsUGFyYW0yKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCURydlNlbmRNZXNzYWdlCQlbTU1TWVNURU0uMTEwMl0KLSovCisgKiAJCQkJRHJ2U2VuZE1lc3NhZ2UJCVtNTVNZU1RFTS4xMTAyXQorICovCiBMUkVTVUxUIFdJTkFQSSBEcnZTZW5kTWVzc2FnZShIRFJWUjE2IGhEcml2ZXIsIFdPUkQgbXNnLCBMUEFSQU0gbFBhcmFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0yKQogewogCURXT1JEIAlkd0RyaXZlcklEID0gMDsKLQlUUkFDRShtbXN5cywgIiglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwKKwlGSVhNRShtbXN5cywgIiglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpO1xuIiwKIAkJCQkJaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yKTsKKwkvKiBGSVhNRTogd3JvbmcgLi4uICovCiAJcmV0dXJuIENEQVVESU9fRHJpdmVyUHJvYyhkd0RyaXZlcklELCBoRHJpdmVyLCBtc2csIGxQYXJhbTEsIGxQYXJhbTIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCURydkdldE1vZHVsZUhhbmRsZQlbTU1TWVNURU0uMTEwM10KLSovCi1IQU5ETEUxNiBXSU5BUEkgRHJ2R2V0TW9kdWxlSGFuZGxlKEhEUlZSMTYgaERydnIpCisgKiAJCQkJRHJ2R2V0TW9kdWxlSGFuZGxlCVtNTVNZU1RFTS4xMTAzXQorICovCitIQU5ETEUxNiBXSU5BUEkgRHJ2R2V0TW9kdWxlSGFuZGxlMTYoSERSVlIxNiBoRHJ2cikKIHsKLQlUUkFDRShtbXN5cywgIiglMDRYKTtcbiIsIGhEcnZyKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBHZXREcml2ZXJNb2R1bGVIYW5kbGUxNihoRHJ2cik7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJRHJ2RGVmRHJpdmVyUHJvYwlbTU1TWVNURU0uMTEwNF0KICAqLwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jbGlwcGluZy5jIGIvb2JqZWN0cy9jbGlwcGluZy5jCmluZGV4IGFjNzExOWUuLjc4YjNkNzkgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY2xpcHBpbmcuYworKysgYi9vYmplY3RzL2NsaXBwaW5nLmMKQEAgLTE3OCw4ICsxNzgsMTQgQEAKICAgICAgICB7CiAJICAgZGMtPncuaENsaXBSZ24gPSBuZXdSZ247CiAJICAgQ0xJUFBJTkdfVXBkYXRlR0NSZWdpb24oIGRjICk7CisgICAgICAgICAgIHJldHVybiBTSU1QTEVSRUdJT047CiAgICAgICAgfQotICAgICAgIHJldHVybiBTSU1QTEVSRUdJT047CisgICAgICAgZWxzZSBpZiggZmxhZ3MgJiBDTElQX0VYQ0xVREUgKQorICAgICAgIHsKKyAgICAgICAgICAgZGMtPncuaENsaXBSZ24gPSBDcmVhdGVSZWN0UmduMzIoIDAsIDAsIDAsIDAgKTsKKyAgICAgCSAgIENvbWJpbmVSZ24zMiggZGMtPncuaENsaXBSZ24sIGRjLT53LmhWaXNSZ24sIDAsIFJHTl9DT1BZICk7CisgICAgICAgfQorICAgICAgIGVsc2UgV0FSTihjbGlwcGluZywiTm8gaENsaXBSZ24gYW5kIGZsYWdzIGFyZSAleFxuIixmbGFncyk7CiAgICAgfQogCiAgICAgcmV0ID0gQ29tYmluZVJnbjMyKCBuZXdSZ24sIGRjLT53LmhDbGlwUmduLCBuZXdSZ24sIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jdXJzb3JpY29uLmMgYi9vYmplY3RzL2N1cnNvcmljb24uYwppbmRleCA0Mzk2NjBmLi4xOGYxNzIxIDEwMDY0NAotLS0gYS9vYmplY3RzL2N1cnNvcmljb24uYworKysgYi9vYmplY3RzL2N1cnNvcmljb24uYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJrZXlib2FyZC5oIgogI2luY2x1ZGUgIngxMWRydi5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCiAKIEN1cnNvciBDVVJTT1JJQ09OX1hDdXJzb3IgPSBOb25lOyAgICAvKiBDdXJyZW50IFggY3Vyc29yICovCiBzdGF0aWMgSENVUlNPUjMyIGhBY3RpdmVDdXJzb3IgPSAwOyAgLyogQWN0aXZlIGN1cnNvciAqLwpAQCAtMTQ3MSw4ICsxNDcyLDI2IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlczsKIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgIExvYWRDdXJzb3JGcm9tRmlsZTMyVyAgICAoVVNFUjMyLjM2MSkKKyovCitIQ1VSU09SMzIgV0lOQVBJIExvYWRDdXJzb3JGcm9tRmlsZTMyVyAoTFBDV1NUUiBuYW1lKQoreyAgICAgICBGSVhNRShjdXJzb3IsICI6c3R1YiBMb2FkQ3Vyc29yRnJvbUZpbGUzMldcbiIpOworCVNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7ICAKKwlyZXR1cm4gMDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgTG9hZEN1cnNvckZyb21GaWxlMzJBICAgIChVU0VSMzIuMzYwKQorKi8KK0hDVVJTT1IzMiBXSU5BUEkgTG9hZEN1cnNvckZyb21GaWxlMzJBIChMUENTVFIgbmFtZSkKK3sJRklYTUUoY3Vyc29yLCAiOnN0dWIgTG9hZEN1cnNvckZyb21GaWxlMzJBICVzXG4iLCBuYW1lKTsKKwlTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOyAgCisJcmV0dXJuIDA7CisKK30KKyAgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMb2FkSWNvblcgICAgICAgICAgKFVTRVIzMi4zNjQpCiAgKi8KIEhJQ09OMzIgV0lOQVBJIExvYWRJY29uMzJXKEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgTFBDV1NUUiBuYW1lKQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kYy5jIGIvb2JqZWN0cy9kYy5jCmluZGV4IDgwYTViOTQuLjc1MTQzMGQgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGMuYworKysgYi9vYmplY3RzL2RjLmMKQEAgLTEzMiw2ICsxMzIsNyBAQAogICAgIHdpbl9kY19pbmZvLT5HcmFwaGljc01vZGUgICAgICAgID0gR01fQ09NUEFUSUJMRTsKICAgICB3aW5fZGNfaW5mby0+RENPcmdYICAgICAgICAgICAgICA9IDA7CiAgICAgd2luX2RjX2luZm8tPkRDT3JnWSAgICAgICAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5scGZuUHJpbnQgICAgICAgICAgID0gTlVMTDsKICAgICB3aW5fZGNfaW5mby0+Q3Vyc1Bvc1ggICAgICAgICAgICA9IDA7CiAgICAgd2luX2RjX2luZm8tPkN1cnNQb3NZICAgICAgICAgICAgPSAwOwogICAgIHdpbl9kY19pbmZvLT5BcmNEaXJlY3Rpb24gICAgICAgID0gQURfQ09VTlRFUkNMT0NLV0lTRTsKZGlmZiAtLWdpdCBhL29iamVjdHMvZGliLmMgYi9vYmplY3RzL2RpYi5jCmluZGV4IGU0MWVkZWIuLjRmODhlZTkgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGliLmMKKysrIGIvb2JqZWN0cy9kaWIuYwpAQCAtMTA3NCw2ICsxMDc0LDcgQEAKICAgICBEQ19TZXR1cEdDRm9yVGV4dCggZGMgKTsgIC8qIFRvIGhhdmUgdGhlIGNvcnJlY3QgY29sb3JzICovCiAgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIERDX1hST1BmdW5jdGlvbltkYy0+dy5ST1Btb2RlLTFdICk7CiAKKyAgICBkZXNjci5kYyA9IGRjOwogICAgIGlmIChkZXNjci5pbmZvQnBwIDw9IDgpCiAgICAgewogICAgICAgICBkZXNjci5jb2xvck1hcCA9IERJQl9CdWlsZENvbG9yTWFwKCBpbmZvLCBjb2xvcnVzZSA9PSBESUJfUEFMX0NPTE9SUz8KQEAgLTEwODMsOCArMTA4NCw2IEBACiAgICAgICAgIGlmICghZGVzY3IuY29sb3JNYXApCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0KLSAgICBkZXNjci5kYyAgICAgICAgPSBkYzsKICAgICBkZXNjci5iaXRzICAgICAgPSBiaXRzOwogICAgIGRlc2NyLmxpbmVzICAgICA9IHRtcGhlaWdodCA+PSAwID8gbGluZXMgOiAtbGluZXM7CiAgICAgZGVzY3IuaW5mb1dpZHRoID0gd2lkdGg7CmRpZmYgLS1naXQgYS9vYmplY3RzL2VuaG1ldGFmaWxlLmMgYi9vYmplY3RzL2VuaG1ldGFmaWxlLmMKaW5kZXggOTI3NTI3OC4uZWFjMGM4ZSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9lbmhtZXRhZmlsZS5jCisrKyBiL29iamVjdHMvZW5obWV0YWZpbGUuYwpAQCAtNDQ0LDE0ICs0NDQsMTYgQEAKICAgSEFORExFVEFCTEUzMiAqaHQgPSAoSEFORExFVEFCTEUzMiAqKUdsb2JhbEFsbG9jMzIoR1BUUiwgCiAJCQkJICAgIHNpemVvZihIQU5ETEVUQUJMRTMyKSpjb3VudCk7CiAgIEJPT0wzMiByZXQgPSBGQUxTRTsKKyAgSU5UMzIgc2F2ZWRNb2RlID0gMDsKICAgaWYgKGxwUmVjdCkgewogICAgIExQRU5ITUVUQUhFQURFUiBoID0gKExQRU5ITUVUQUhFQURFUikgcDsKICAgICBGTE9BVCB4c2NhbGUgPSAoaC0+cmNsQm91bmRzLnJpZ2h0LWgtPnJjbEJvdW5kcy5sZWZ0KS8obHBSZWN0LT5yaWdodC1scFJlY3QtPmxlZnQpOwogICAgIEZMT0FUIHlzY2FsZSA9IChoLT5yY2xCb3VuZHMuYm90dG9tLWgtPnJjbEJvdW5kcy50b3ApLyhscFJlY3QtPmJvdHRvbS1scFJlY3QtPnRvcCk7CiAgICAgWEZPUk0geGZvcm0gPSB7eHNjYWxlLCAwLCAwLCB5c2NhbGUsIDAsIDB9OwotICAgIC8qICAgIHhmb3JtLmVEeCA9IGxwUmVjdC0+bGVmdDsKLQkgIHhmb3JtLmVEeSA9IGxwUmVjdC0+dG9wOyAqLworICAgICAgICB4Zm9ybS5lRHggPSBscFJlY3QtPmxlZnQ7CisJICB4Zm9ybS5lRHkgPSBscFJlY3QtPnRvcDsgCiAgICAgRklYTUUobWV0YWZpbGUsICJwbGF5IGludG8gcmVjdCBkb2Vzbid0IHdvcmtcbiIpOworICAgIHNhdmVkTW9kZSA9IFNldEdyYXBoaWNzTW9kZShoZGMsIEdNX0FEVkFOQ0VEKTsKICAgICBpZiAoIVNldFdvcmxkVHJhbnNmb3JtKGhkYywgJnhmb3JtKSkgewogICAgICAgV0FSTihtZXRhZmlsZSwgIldvcmxkIHRyYW5zZm9ybSBmYWlsZWQhXG4iKTsKICAgICB9CkBAIC00NjQsNiArNDY2LDcgQEAKICAgICBwID0gKHZvaWQgKikgcCArIHAtPm5TaXplOyAvKiBjYXN0ZWQgc28gdGhhdCBhcml0aG1ldGljIGlzIGluIGJ5dGVzICovCiAgIH0KICAgR2xvYmFsVW5sb2NrMzIoaG1mKTsKKyAgaWYgKHNhdmVkTW9kZSkgU2V0R3JhcGhpY3NNb2RlKGhkYywgc2F2ZWRNb2RlKTsKICAgcmV0ID0gVFJVRTsgLyogRklYTUU6IGNhbGN1bGF0ZSBhIG1vcmUgYWNjdXJhdGUgcmV0dXJuIHZhbHVlICovCiAgIHJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9vYmplY3RzL3RleHQuYyBiL29iamVjdHMvdGV4dC5jCmluZGV4IDIxNzIzNzkuLmY3ZjBjYmYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvdGV4dC5jCisrKyBiL29iamVjdHMvdGV4dC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkZWJ1Z3N0ci5oIgogCiAjZGVmaW5lIFRBQiAgICAgOQogI2RlZmluZSBMRiAgICAgMTAKQEAgLTE5OCw4ICsxOTksOSBAQAogICAgIGludCB3aWR0aCA9IHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdDsKICAgICBpbnQgbWF4X3dpZHRoID0gMDsKIAotICAgIFRSQUNFKHRleHQsIiclcycsICVkICwgWyglZCwlZCksKCVkLCVkKV1cbiIsIHN0ciwKLQkJIGNvdW50LCByZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0LCByZWN0LT5ib3R0b20pOworICAgIFRSQUNFKHRleHQsIiVzLCAlZCAsIFsoJWQsJWQpLCglZCwlZCldXG4iLAorCSAgZGVidWdzdHJfYW4gKHN0ciwgY291bnQpLCBjb3VudCwKKwkgIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQsIHJlY3QtPmJvdHRvbSk7CiAgICAgCiAgICAgaWYgKGNvdW50ID09IC0xKSBjb3VudCA9IHN0cmxlbihzdHIpOwogICAgIHN0clB0ciA9IHN0cjsKZGlmZiAtLWdpdCBhL29sZS9jb21wb2JqLmMgYi9vbGUvY29tcG9iai5jCmluZGV4IDM1ZWIyOTAuLmJhODRlNWQgMTAwNjQ0Ci0tLSBhL29sZS9jb21wb2JqLmMKKysrIGIvb2xlL2NvbXBvYmouYwpAQCAtNTU0LDMgKzU1NCwxNCBAQAogICAgIEZJWE1FKG9sZSwiKCVwLCVkLCVkKSxzdHViIVxuIixwVW5rLGZMb2NrLGZMYXN0VW5sb2NrUmVsZWFzZXMpOwogICAgIHJldHVybiBTX09LOwogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ29Mb2NrT2JqZWN0RXh0ZXJuYWwgKE9MRTMyLjMxKQorICovCitIUkVTVUxUIFdJTkFQSSBDb0xvY2tPYmplY3RFeHRlcm5hbDMyKAorICAgIExQVU5LTk9XTiBwVW5rLAkJLyogW2luXSBvYmplY3QgdG8gYmUgbG9ja2VkICovCisgICAgQk9PTDMyIGZMb2NrLAkJLyogW2luXSBkbyBsb2NrICovCisgICAgQk9PTDMyIGZMYXN0VW5sb2NrUmVsZWFzZXMJLyogW2luXSA/ICovCispIHsKKyAgICBGSVhNRShvbGUsIiglcCwlZCwlZCksc3R1YiFcbiIscFVuayxmTG9jayxmTGFzdFVubG9ja1JlbGVhc2VzKTsKKyAgICByZXR1cm4gU19PSzsKK30KZGlmZiAtLWdpdCBhL29sZS9vbGUybmxzLmMgYi9vbGUvb2xlMm5scy5jCmluZGV4IGFiYmE2NjAuLmE2MzE4ZGMgMTAwNjQ0Ci0tLSBhL29sZS9vbGUybmxzLmMKKysrIGIvb2xlL29sZTJubHMuYwpAQCAtMTY5Miw3MiArMTY5Miw2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENvbXBhcmVTdHJpbmcxNiAgICAgICAoT0xFMk5MUy44KQotICovCi1VSU5UMTYgV0lOQVBJIENvbXBhcmVTdHJpbmcxNihEV09SRCBsY2lkLERXT1JEIGZkd1N0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHMxLERXT1JEIGwxLExQQ1NUUiBzMixEV09SRCBsMikKLXsKLQlyZXR1cm4gKFVJTlQxNilDb21wYXJlU3RyaW5nMzJBKGxjaWQsZmR3U3R5bGUsczEsbDEsczIsbDIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDb21wYXJlU3RyaW5nMzJBICAgKEtFUk5FTDMyLjI5KQotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKLSAqIEZJWE1FCi0gKi8KLVVJTlQzMiBXSU5BUEkgQ29tcGFyZVN0cmluZzMyQShEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHMxLCBEV09SRCBsMSwgTFBDU1RSIHMyLERXT1JEIGwyKQotewotCWludCBsZW4scmV0OwotCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKLQkJRklYTUUob2xlLCAiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBvcnRlZFxuIik7Ci0JaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCi0JCUZJWE1FKG9sZSwgIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7Ci0JLyogSXMgc3RyY21wIGRlZmF1bHRpbmcgdG8gc3RyaW5nIHNvcnQgb3IgdG8gd29yZCBzb3J0Pz8gKi8KLQkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwotCWwxID0gKGwxPT0tMSk/c3RybGVuKHMxKTpsMTsKLQlsMiA9IChsMj09LTEpP3N0cmxlbihzMik6bDI7Ci0JbGVuID0gbDE8bDIgPyBsMTpsMjsKLQlyZXQgPSAoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRUNBU0UpID8KLQkJbHN0cm5jbXBpMzJBKHMxLHMyLGxlbikJOiBsc3RybmNtcDMyQShzMSxzMixsZW4pOwotCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwotCWlmKHJldCE9MClyZXR1cm4gcmV0KzI7Ci0JLyogc2FtZSBsZW4sIHJldHVybiAyICovCi0JaWYobDE9PWwyKXJldHVybiAyOwotCS8qIHRoZSBsb25nZXIgb25lIGlzIGxleGljYWxseSBncmVhdGVyICovCi0JcmV0dXJuIChsMTxsMik/IDEgOiAzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDb21wYXJlU3RyaW5nMzJXICAgICAgIChLRVJORUwzMi4zMCkKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCi0gKiBGSVhNRQotICovCi1VSU5UMzIgV0lOQVBJIENvbXBhcmVTdHJpbmczMlcoRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgczEsIERXT1JEIGwxLCBMUENXU1RSIHMyLERXT1JEIGwyKQotewotCWludCBsZW4scmV0OwotCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKLQkJRklYTUUob2xlLCJJR05PUkVOT05TUEFDRSBub3Qgc3VwcHJ0ZWRcbiIpOwotCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQotCQlGSVhNRShvbGUsIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7Ci0KLQkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwotCS8qIEZJWE1FOiBIYW5kbGUgTk9STV9TVFJJTkdTT1JUICovCi0JbDEgPSAobDE9PS0xKT9sc3RybGVuMzJXKHMxKTpsMTsKLQlsMiA9IChsMj09LTEpP2xzdHJsZW4zMlcoczIpOmwyOwotCWxlbiA9IGwxPGwyID8gbDE6bDI7Ci0JcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/Ci0JCWxzdHJuY21waTMyVyhzMSxzMixsZW4pCTogbHN0cm5jbXAzMlcoczEsczIsbGVuKTsKLQkvKiBub3QgZXF1YWwsIHJldHVybiAxIG9yIDMgKi8KLQlpZihyZXQhPTApIHJldHVybiByZXQrMjsKLQkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KLQlpZihsMT09bDIpIHJldHVybiAyOwotCS8qIHRoZSBsb25nZXIgb25lIGlzIGxleGljYWxseSBncmVhdGVyICovCi0JcmV0dXJuIChsMTxsMik/IDEgOiAzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTZXRMb2NhbGVJbmZvQSAgICAgICBbS0VSTkVMMzIuNDk5XQogICovCiBCT09MMTYgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCkBAIC0yMDI3LDEwICsxOTYxLDE0IEBACiAJcmV0dXJuIGxhbmduYW1lbGVuOwogfQogIAotc3RhdGljIGludCBpc19wdW5jdHVhdGlvbih1bnNpZ25lZCBjaGFyIGMpCitzdGF0aWMgaW50IGlzX3B1bmN0dWF0aW9uKHVuc2lnbmVkIGNoYXIgYykgCiB7CiAgIC8qIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMgYXJlIDoKLSAgICAgMzksIDQ1LCAxMjctMTI5LCAxNDEtMTQ0LCAxNTAtMTUxLCAxNTctMTU4LCAxNzMgKi8KKyAgICAgMS04LCAxNC0zMSwgMzksIDQ1LCAxMjctMTI5LCAxNDEtMTQ0LCAxNTAtMTUxLCAxNTctMTU4LCAxNzMgCisKKyAgICAgInB1bmN0dWF0aW9uIGNoYXJhY3RlciIgaW4gdGhpcyBjb250ZXh0IGlzIGEgY2hhcmFjdGVyIHdoaWNoIGlzIAorICAgICBjb25zaWRlcmVkICJsZXNzIGltcG9ydGFudCIgZHVyaW5nIHdvcmQgc29ydCBjb21wYXJpc29uLgorICAgICBTZWUgTENNYXBTdHJpbmcgZm9yIHRoZSBwcmVjaXNlIGRlZmluaXRpb24gb2YgImxlc3MgaW1wb3J0YW50Ii4gKi8KICAgaWYgKGM+PTE0MSkKICAgewogICAgIGlmIChjPD0xNTEpCkBAIC0yMDQxLDcgKzE5NzksOSBAQAogICB9CiAgIGlmIChjPj0xMjcpCiAgICAgcmV0dXJuIChjPD0xMjkpOwotICByZXR1cm4gKGM9PTM5KSB8fCAoYz09NDUpOworICBpZiAoYz49MTQpCisgICAgcmV0dXJuIChjPD0zMSkgfHwgKGM9PTM5KSB8fCAoYz09NDUpOworICByZXR1cm4gKGM8PTgpOwogfQogCiBzdGF0aWMgaW50IGlkZW50aXR5KGludCBjKQpAQCAtMjA1MCw2ICsxOTkwLDM3IEBACiB9CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0geworICA2ICAgICAgLCAgIDMsIC8qICAgLSAgIDEgKi8gIAorICA2ICAgICAgLCAgIDQsIC8qICAgLSAgIDIgKi8gIAorICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8gIAorICA2ICAgICAgLCAgIDYsIC8qICAgLSAgIDQgKi8gIAorICA2ICAgICAgLCAgIDcsIC8qICAgLSAgIDUgKi8gIAorICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8gIAorICA2ICAgICAgLCAgIDksIC8qICAgLSAgIDcgKi8gIAorICA2ICAgICAgLCAgMTAsIC8qICAgLSAgIDggKi8gIAorICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8gIAorICA3ICAgICAgLCAgIDYsIC8qICAgLSAgMTAgKi8gIAorICA3ICAgICAgLCAgIDcsIC8qICAgLSAgMTEgKi8gIAorICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8gIAorICA3ICAgICAgLCAgIDksIC8qICAgLSAgMTMgKi8gIAorICA2ICAgICAgLCAgMTEsIC8qICAgLSAgMTQgKi8gIAorICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8gIAorICA2ICAgICAgLCAgMTMsIC8qICAgLSAgMTYgKi8gIAorICA2ICAgICAgLCAgMTQsIC8qICAgLSAgMTcgKi8gIAorICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8gIAorICA2ICAgICAgLCAgMTYsIC8qICAgLSAgMTkgKi8gIAorICA2ICAgICAgLCAgMTcsIC8qICAgLSAgMjAgKi8gIAorICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8gIAorICA2ICAgICAgLCAgMTksIC8qICAgLSAgMjIgKi8gIAorICA2ICAgICAgLCAgMjAsIC8qICAgLSAgMjMgKi8gIAorICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8gIAorICA2ICAgICAgLCAgMjIsIC8qICAgLSAgMjUgKi8gIAorICA2ICAgICAgLCAgMjMsIC8qICAgLSAgMjYgKi8gIAorICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8gIAorICA2ICAgICAgLCAgMjUsIC8qICAgLSAgMjggKi8gIAorICA2ICAgICAgLCAgMjYsIC8qICAgLSAgMjkgKi8gIAorICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8gIAorICA2ICAgICAgLCAgMjgsIC8qICAgLSAgMzEgKi8gIAogICA3ICAgICAgLCAgIDIsIC8qICAgLSAgMzIgKi8KICAgNyAgICAgICwgIDI4LCAvKiAhIC0gIDMzICovCiAgIDcgICAgICAsICAyOSwgLyogIiAtICAzNCAqLyAvKiAiICovCkBAIC0yNDE1LDE0ICsyMzg2LDE3IEBACiAgKiBhY2NvcmRpbmdseSB0byB0aGUgZmxhZ3MgTENNQVBfVVBQRVJDQVNFLCBMQ01BUF9MT1dFUkNBU0UsLi4uCiAgKgogICogUkVUVVJOUwotICogICAgRXJyb3IgOiAoZGVzdGluYXRpb24gYnVmZmVyIHRvbyBzbWFsbCkgMC4KKyAqICAgIEVycm9yIDogMC4KICAqICAgIFN1Y2Nlc3MgOiBsZW5ndGggb2YgdGhlIHJlc3VsdCBzdHJpbmcuCiAgKgogICogUkVNQVJLUwogICogICAgSWYgY2FsbGVkIHdpdGggc2NybGVuID0gLTEsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGxlbmd0aAogICogICAgICBvZiB0aGUgMC10ZXJtaW5hdGVkIHN0cmluZyBzdHJzcmMgYnkgaXRzZWxmLiAgICAgIAorICogCisgKiAgICBJZiBjYWxsZWQgd2l0aCBkc3RsZW4gPSAwLCByZXR1cm5zIHRoZSBidWZmZXIgbGVuZ3RoIHRoYXQgCisgKiAgICAgIHdvdWxkIGJlIHJlcXVpcmVkLgogICovCi0gSU5UMzIgV0lOQVBJIExDTWFwU3RyaW5nMzJBKAorSU5UMzIgV0lOQVBJIExDTWFwU3RyaW5nMzJBKAogCUxDSUQgbGNpZCAvKiBsb2NhbGUgaWRlbnRpZmllciBjcmVhdGVkIHdpdGggTUFLRUxDSUQ7IAogCQkgICAgIExPQ0FMRV9TWVNURU1fREVGQVVMVCBhbmQgTE9DQUxFX1VTRVJfREVGQVVMVCBhcmUgcHJlZGVmaW5lZAogCQkgICAgIHZhbHVlcy4gKi8sCkBAIC0yNDMzLDE3ICsyNDA3LDIwIEBACiAJSU5UMzIgZHN0bGVuICAgLyogZGVzdGluYXRpb24gYnVmZmVyIGxlbmd0aCAqLykgCiB7CiAgIGludCBpOwotIAorCiAgIFRSQUNFKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcywlZCwlcCwlZClcbiIsCiAJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwogCi0gIGlmICgoZHN0c3RyPT1OVUxMKSB8fCAoc3Jjc3RyPT1OVUxMKSkKKyAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKKyAgeworICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIDA7CisgIH0KICAgaWYgKHNyY2xlbj09LTEpIAogICAgIHNyY2xlbiA9IGxzdHJsZW4zMkEoc3Jjc3RyKTsKIAogICBpZiAobWFwZmxhZ3MgJiB+ICggTENNQVBfVVBQRVJDQVNFIHwgTENNQVBfTE9XRVJDQVNFIHwgTENNQVBfU09SVEtFWSB8Ci0JCSAgICAgU09SVF9TVFJJTkdTT1JUKSApCisJCSAgICAgTk9STV9JR05PUkVDQVNFIHwgTk9STV9JR05PUkVOT05TUEFDRSB8IFNPUlRfU1RSSU5HU09SVCkgKQogICB7CiAgICAgRklYTUUoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgogCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCkBAIC0yNDU3LDcgKzI0MzQsMTAgQEAKICAgICBpZiAoZHN0bGVuPT0wKQogICAgICAgcmV0dXJuIHNyY2xlbjsgIC8qIGRzdGxlbj0wIG1lYW5zICJkbyBub3RoaW5nIGJ1dCByZXR1cm4gcmVxdWlyZWQgbGVuZ3RoIiAqLwogICAgIGlmIChkc3RsZW48c3JjbGVuKQotICAgICAgcmV0dXJuIDA7ICAgICAgIC8qIGl0J3MgYW4gZXJyb3IgKi8KKyAgICB7CisgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICAgZiA9IHRvdXBwZXI7CiAgICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCkBAIC0yNDcyLDggKzI0NTIsMTAgQEAKICAgICBpbnQgdW5pY29kZV9sZW49MDsKICAgICBpbnQgY2FzZV9sZW49MDsKICAgICBpbnQgZGlhY3JpdGljX2xlbj0wOworICAgIGludCBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbj0wOwogICAgIGNoYXIgKmNhc2VfY29tcG9uZW50OwogICAgIGNoYXIgKmRpYWNyaXRpY19jb21wb25lbnQ7CisgICAgY2hhciAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQ7CiAgICAgaW50IHJvb20sY291bnQ7CiAgICAgaW50IGZsYWdfc3RyaW5nc29ydCA9IG1hcGZsYWdzICYgU09SVF9TVFJJTkdTT1JUOwogCkBAIC0yNDgxLDg5ICsyNDYzLDExNyBAQAogICAgIGZvciAoaT0wO2k8c3JjbGVuO2krKykKICAgICB7CiAgICAgICBpbnQgb2ZzOwotICAgICAgaWYgKChzcmNzdHJbaV0hPSdcMCcpICYmIChmbGFnX3N0cmluZ3NvcnQgfHwgIWlzX3B1bmN0dWF0aW9uKHNyY3N0cltpXSkpKQorICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhciA9IHNyY3N0cltpXTsKKyAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykgCiAgICAgICB7Ci0JdW5pY29kZV9sZW4rKzsKLQlpZigoKHVuc2lnbmVkIGNoYXIpc3Jjc3RyW2ldKTw9MzEpCisJaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhaXNfcHVuY3R1YXRpb24oc291cmNlX2NoYXIpKQogCXsKLQkgIEZJWE1FKHN0cmluZywiIGNvbnRyb2wgY2hhcmFjdGVycyBpbiBhcmd1bWVudCBzdHJpbmdcbiIpOwotCSAgcmV0dXJuIDA7CisJICB1bmljb2RlX2xlbisrOworCSAgaWYgKCBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl0gJiB+MTUgKQorCSAgICB1bmljb2RlX2xlbisrOyAgICAgICAgICAgICAvKiBkb3VibGUgbGV0dGVyICovCiAJfQotCWlmICggTENNX1VuaWNvZGVfTFVUWzIqKCh1bnNpZ25lZCBjaGFyKXNyY3N0cltpXS0zMildICYgfjE1ICkKLQkgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KKwllbHNlCisJeworCSAgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4rKzsKKwl9CSAgCiAgICAgICB9CiAJICAKLSAgICAgIGlmIChpc3VwcGVyKHNyY3N0cltpXSkpCisgICAgICBpZiAoaXN1cHBlcihzb3VyY2VfY2hhcikpCiAJY2FzZV9sZW49dW5pY29kZV9sZW47IAogCi0gICAgICBvZnMgPSAodW5zaWduZWQgY2hhcilzcmNzdHJbaV0gLSBMQ01fRGlhY3JpdGljX1N0YXJ0OworICAgICAgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwogICAgICAgaWYgKChvZnM+PTApICYmIChMQ01fRGlhY3JpdGljX0xVVFtvZnNdIT0yKSkKIAlkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgIH0KIAotICAgIHJvb20gPSAgMiAqIHVuaWNvZGVfbGVuICAgICAgICAgLyogInVuaWNvZGUiIGNvbXBvbmVudCAqLwotICAgICAgKyAgICAgZGlhY3JpdGljX2xlbiAgICAgICAgICAgLyogImRpYWNyaXRpYyIgY29tcG9uZW50ICovCi0gICAgICArICAgICBjYXNlX2xlbiAgICAgICAgICAgICAgICAvKiAiY2FzZSIgY29tcG9uZW50ICovCi0gICAgICArICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VyICdcMScgc2VwYXJhdG9ycyAqLwotICAgICAgKyAgICAgMSAgOyAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYWwgJ1wwJyAqLworICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKKyAgICAgIGNhc2VfbGVuPTA7ICAgICAgICAgICAgICAgICAgIAorICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCisgICAgICBkaWFjcml0aWNfbGVuPTA7CisKKyAgICByb29tID0gIDIgKiB1bmljb2RlX2xlbiAgICAgICAgICAgICAgLyogInVuaWNvZGUiIGNvbXBvbmVudCAqLworICAgICAgKyAgICAgZGlhY3JpdGljX2xlbiAgICAgICAgICAgICAgICAvKiAiZGlhY3JpdGljIiBjb21wb25lbnQgKi8KKyAgICAgICsgICAgIGNhc2VfbGVuICAgICAgICAgICAgICAgICAgICAgLyogImNhc2UiIGNvbXBvbmVudCAqLworICAgICAgKyAgICAgNCAqIGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuICAvKiBwdW5jdHVhdGlvbiBpbiB3b3JkIHNvcnQgbW9kZSAqLworICAgICAgKyAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VyICdcMScgc2VwYXJhdG9ycyAqLworICAgICAgKyAgICAgMSAgOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hbCAnXDAnICovCiAgICAgaWYgKGRzdGxlbj09MCkKICAgICAgIHJldHVybiByb29tOyAgICAgIAogICAgIGVsc2UgaWYgKGRzdGxlbjxyb29tKQotICAgICAgcmV0dXJuIDA7ICAgCisgICAgeworICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgICAgLyogbG9jYXRlIGVhY2ggY29tcG9uZW50LCB3cml0ZSBzZXBhcmF0b3JzICovCiAgICAgZGlhY3JpdGljX2NvbXBvbmVudCA9IGRzdHN0ciArIDIqdW5pY29kZV9sZW4gOwogICAgICpkaWFjcml0aWNfY29tcG9uZW50KysgPSAnXDEnOyAKLQogICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgICpjYXNlX2NvbXBvbmVudCsrID0gJ1wxJzsgCisgICAgZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQgPSBjYXNlX2NvbXBvbmVudCArIGNhc2VfbGVuIDsKKyAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CisgICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwogCiAgICAgLyogcmVhZCBzb3VyY2Ugc3RyaW5nIGNoYXIgYnkgY2hhciwgd3JpdGUgCiAgICAgICAgY29ycmVzcG9uZGluZyB3ZWlnaHQgaW4gZWFjaCBjb21wb25lbnQuICovCi0gICAgZm9yIChpPTAsY291bnQ9MDtjb3VudDx1bmljb2RlX2xlbjtpKyspCisgICAgZm9yIChpPTAsY291bnQ9MDtpPHNyY2xlbjtpKyspCiAgICAgewotICAgICAgdW5zaWduZWQgY2hhciBjPXNyY3N0cltpXTsKLSAgICAgIGlmICggKGMhPSdcMCcpICYmIChmbGFnX3N0cmluZ3NvcnQgfHwgIWlzX3B1bmN0dWF0aW9uKGMpKSApCisgICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyPXNyY3N0cltpXTsKKyAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykgCiAgICAgICB7CiAJaW50IHR5cGUsbG9uZ2NvZGU7Ci0JaW50IExVVF9vZmZzZXQgPSAyKihjLTMyKTsKLQl0eXBlID0gTENNX1VuaWNvZGVfTFVUW0xVVF9vZmZzZXRdOworCXR5cGUgPSBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl07CiAJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7CiAJdHlwZSAmPSAxNTsKLQlkc3RzdHJbMipjb3VudF0gPSB0eXBlOwotCWRzdHN0clsyKmNvdW50KzFdID0gTENNX1VuaWNvZGVfTFVUW0xVVF9vZmZzZXQrMV07ICAKLQlpZiAobG9uZ2NvZGUpCisJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgaXNfcHVuY3R1YXRpb24oc291cmNlX2NoYXIpKSAKIAl7Ci0JICBpZiAoY291bnQ8Y2FzZV9sZW4pCi0JICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzcmNzdHJbaV0pID8gMTggOiAyICkgOwotCSAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCi0JICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gMjsgLyogYXNzdW1wdGlvbjogYSBkb3VibGUgbGV0dGVyCi0JCQkJCSAgICAgICBpcyBuZXZlciBhY2NlbnRlZCAqLwotCSAgY291bnQrKzsKKwkgIFVJTlQxNiBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CisJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uPj44KTsKKwkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24mMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQorCQkJY29tcGF0aWJsZSB3aXRoIG51bWVyaWNhbCBjb21wYXJpc29uICovCiAKKwkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKKwkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCisgICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bXB0aW9uIDogYSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIgaXMgbmV2ZXIgYSAKKwkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KKwl9CisJZWxzZQorCXsKIAkgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7Ci0JICBkc3RzdHJbMipjb3VudCsxXSA9ICooTENNX1VuaWNvZGVfTFVUXzIgLSAxICsgbG9uZ2NvZGUpOyAKLQkgIC8qIDE2IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMSAKLQkgICAgIDMyIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMiAKLQkgICAgIDQ4IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMyAqLwotCX0KKwkgIGRzdHN0clsyKmNvdW50KzFdID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCisJICBpZiAobG9uZ2NvZGUpCisJICB7CisJICAgIGlmIChjb3VudDxjYXNlX2xlbikKKwkgICAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc291cmNlX2NoYXIpID8gMTggOiAyICkgOworCSAgICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKKwkgICAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IDI7IC8qIGFzc3VtcHRpb246IGEgZG91YmxlIGxldHRlcgorCQkJCQkJIGlzIG5ldmVyIGFjY2VudGVkICovCisJICAgIGNvdW50Kys7CisJICAgIAorCSAgICBkc3RzdHJbMipjb3VudF0gPSB0eXBlOworCSAgICBkc3RzdHJbMipjb3VudCsxXSA9ICooTENNX1VuaWNvZGVfTFVUXzIgLSAxICsgbG9uZ2NvZGUpOyAKKwkgICAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxIAorCSAgICAgICAzMiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDIgCisJICAgICAgIDQ4IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMyAqLworCSAgfQogCi0JaWYgKGNvdW50PGNhc2VfbGVuKQotCSAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNyY3N0cltpXSkgPyAxOCA6IDIgKSA7Ci0JaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCi0JewotCSAgaW50IG9mcyA9ICh1bnNpZ25lZCBjaGFyKXNyY3N0cltpXSAtIExDTV9EaWFjcml0aWNfU3RhcnQ7Ci0JICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IChvZnM+PTAgPyBMQ01fRGlhY3JpdGljX0xVVFtvZnNdIDogMik7CisJICBpZiAoY291bnQ8Y2FzZV9sZW4pCisJICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CisJICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKKwkgIHsKKwkgICAgaW50IG9mcyA9IHNvdXJjZV9jaGFyIC0gTENNX0RpYWNyaXRpY19TdGFydDsKKwkgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAob2ZzPj0wID8gTENNX0RpYWNyaXRpY19MVVRbb2ZzXSA6IDIpOworCSAgfQorCSAgY291bnQrKzsKIAl9Ci0JY291bnQrKzsKICAgICAgIH0KICAgICB9Ci0gICAgZHN0c3RyW3Jvb20tM10gPSBkc3RzdHJbcm9vbS0yXSA9ICdcMSc7CiAgICAgZHN0c3RyW3Jvb20tMV0gPSAnXDAnOwogICAgIHJldHVybiByb29tOwogICB9CiB9Ci0gCisJCSAgICAgCiBJTlQzMiBXSU5BUEkgTENNYXBTdHJpbmczMlcoCiAJTENJRCBsY2lkLERXT1JEIG1hcGZsYWdzLExQQ1dTVFIgc3Jjc3RyLElOVDMyIHNyY2xlbixMUFdTVFIgZHN0c3RyLAogCUlOVDMyIGRzdGxlbikKQEAgLTI1NzMsOCArMjU4MywxMSBAQAogICBUUkFDRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAogCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKIAotICBpZiAoKGRzdHN0cj09TlVMTCkgfHwgKHNyY3N0cj09TlVMTCkpCisgIGlmICggKChkc3RsZW4hPTApICYmIChkc3RzdHI9PU5VTEwpKSB8fCAoc3Jjc3RyPT1OVUxMKSApCisgIHsKKyAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOworICB9CiAgIGlmIChzcmNsZW49PS0xKSAKICAgICBzcmNsZW4gPSBsc3RybGVuMzJXKHNyY3N0cik7CiAgIGlmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpIApAQCAtMjYwMiw2ICsyNjE1LDkwIEBACiAgIH0KIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ29tcGFyZVN0cmluZzE2ICAgICAgIChPTEUyTkxTLjgpCisgKi8KK1VJTlQxNiBXSU5BUEkgQ29tcGFyZVN0cmluZzE2KERXT1JEIGxjaWQsRFdPUkQgZmR3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgczEsRFdPUkQgbDEsTFBDU1RSIHMyLERXT1JEIGwyKQoreworCXJldHVybiAoVUlOVDE2KUNvbXBhcmVTdHJpbmczMkEobGNpZCxmZHdTdHlsZSxzMSxsMSxzMixsMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENvbXBhcmVTdHJpbmczMkEgICAoS0VSTkVMMzIuMjkpCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQorICogRklYTUUKKyAqIE1vcmVvdmVyIGl0IGlzIHF1aXRlIGluZWZmaWNpZW50LiBGSVhNRSB0b28hCisgKi8KK1VJTlQzMiBXSU5BUEkgQ29tcGFyZVN0cmluZzMyQShEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHMxLCBEV09SRCBsMSwgTFBDU1RSIHMyLERXT1JEIGwyKQoreworICBpbnQgbWFwc3RyaW5nX2ZsYWdzOworICBpbnQgbGVuMSxsZW4yOworCisgIFRSQUNFKG9sZSwiJXMgYW5kICVzXG4iLAorCWRlYnVnc3RyX2EgKHMxKSwgZGVidWdzdHJfYSAoczIpKTsKKworICBpZiAoIChzMT09TlVMTCkgfHwgKHMyPT1OVUxMKSApCisgIHsgICAgCisgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKKyAgICBGSVhNRShvbGUsICJJR05PUkVOT05TUEFDRSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCisgICAgRklYTUUob2xlLCAiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgCQorICBtYXBzdHJpbmdfZmxhZ3MgPSBMQ01BUF9TT1JUS0VZIHwgZmR3U3R5bGUgOworICBsZW4xID0gTENNYXBTdHJpbmczMkEobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsTlVMTCwwKTsKKyAgbGVuMiA9IExDTWFwU3RyaW5nMzJBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLE5VTEwsMCk7CisKKyAgaWYgKChsZW4xPT0wKXx8KGxlbjI9PTApKQorICAgIHJldHVybiAwOyAgICAgLyogc29tZXRoaW5nIHdyb25nIGhhcHBlbmVkICovCisKKyAgeworICAgIGNoYXIgc2sxW2xlbjFdOyAgICAKKyAgICBjaGFyIHNrMltsZW4yXTsgICAgCisgICAgaWYgKCAoIUxDTWFwU3RyaW5nMzJBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMxLGwxLHNrMSxsZW4xKSkKKwkgfHwgKCFMQ01hcFN0cmluZzMyQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMixsMixzazIsbGVuMikpICkKKyAgICB7CisgICAgICBFUlIob2xlLCJCdWcgaW4gTENtYXBTdHJpbmczMkEuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHN0cmNtcChzazEsc2syKSsyOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENvbXBhcmVTdHJpbmczMlcgICAgICAgKEtFUk5FTDMyLjMwKQorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKKyAqIEZJWE1FIDogIERvZXMgb25seSBzdHJpbmcgc29ydC4gIFNob3VsZAorICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZzMyQS4KKyAqLworVUlOVDMyIFdJTkFQSSBDb21wYXJlU3RyaW5nMzJXKERXT1JEIGxjaWQsIERXT1JEIGZkd1N0eWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIHMxLCBEV09SRCBsMSwgTFBDV1NUUiBzMixEV09SRCBsMikKK3sKKwlpbnQgbGVuLHJldDsKKwlpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCisJCUZJWE1FKG9sZSwiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKKwlpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKKwkJRklYTUUob2xlLCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOworCisJLyogSXMgc3RyY21wIGRlZmF1bHRpbmcgdG8gc3RyaW5nIHNvcnQgb3IgdG8gd29yZCBzb3J0Pz8gKi8KKwkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLworCWwxID0gKGwxPT0tMSk/bHN0cmxlbjMyVyhzMSk6bDE7CisJbDIgPSAobDI9PS0xKT9sc3RybGVuMzJXKHMyKTpsMjsKKwlsZW4gPSBsMTxsMiA/IGwxOmwyOworCXJldCA9IChmZHdTdHlsZSAmIE5PUk1fSUdOT1JFQ0FTRSkgPworCQlsc3RybmNtcGkzMlcoczEsczIsbGVuKQk6IGxzdHJuY21wMzJXKHMxLHMyLGxlbik7CisJLyogbm90IGVxdWFsLCByZXR1cm4gMSBvciAzICovCisJaWYocmV0IT0wKSByZXR1cm4gcmV0KzI7CisJLyogc2FtZSBsZW4sIHJldHVybiAyICovCisJaWYobDE9PWwyKSByZXR1cm4gMjsKKwkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLworCXJldHVybiAobDE8bDIpPyAxIDogMzsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpkaWZmIC0tZ2l0IGEvb2xlL29sZWNsaS5jIGIvb2xlL29sZWNsaS5jCmluZGV4IDAxMGYxZWIuLmQ0YzU1ZGUgMTAwNjQ0Ci0tLSBhL29sZS9vbGVjbGkuYworKysgYi9vbGUvb2xlY2xpLmMKQEAgLTEwNiw3ICsxMDYsMTEgQEAKIEJPT0wxNiBXSU5BUEkgT2xlSXNEY01ldGExNihIREMxNiBoZGMpCiB7CiAJVFJBQ0Uob2xlLCIoJTA0eClcbiIsaGRjKTsKLQlyZXR1cm4gR0RJX0dldE9ialB0ciggaGRjLCBNRVRBRklMRV9EQ19NQUdJQyApICE9IDA7CisJaWYgKEdESV9HZXRPYmpQdHIoIGhkYywgTUVUQUZJTEVfRENfTUFHSUMgKSAhPSAwKSB7CisJICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7CisJICAgIHJldHVybiBUUlVFOworCX0KKwlyZXR1cm4gRkFMU0U7CiB9CiAKIApAQCAtMTE2LDcgKzEyMCwxMSBAQAogQk9PTDMyIFdJTkFQSSBPbGVJc0RjTWV0YTMyKEhEQzMyIGhkYykKIHsKICAgICAgICAgVFJBQ0Uob2xlLCIoJTA0eClcbiIsaGRjKTsKLSAgICAgICAgcmV0dXJuIEdESV9HZXRPYmpQdHIoIGhkYywgTUVUQUZJTEVfRENfTUFHSUMgKSAhPSAwOworCWlmIChHRElfR2V0T2JqUHRyKCBoZGMsIE1FVEFGSUxFX0RDX01BR0lDICkgIT0gMCkgeworCSAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOworCSAgICByZXR1cm4gVFJVRTsKKwl9CisJcmV0dXJuIEZBTFNFOwogfQogCiAKZGlmZiAtLWdpdCBhL29sZS90eXBlbGliLmMgYi9vbGUvdHlwZWxpYi5jCmluZGV4IDBmNjc0YWIuLjFmZmRiZDEgMTAwNjQ0Ci0tLSBhL29sZS90eXBlbGliLmMKKysrIGIvb2xlL3R5cGVsaWIuYwpAQCAtNDMsNyArNDMsNyBAQAogCQkpOwogCX0gZWxzZSB7CiAJCXNwcmludGYoeGd1aWQsIjxndWlkIDB4JTA4bHg+IiwoRFdPUkQpZ3VpZCk7Ci0JCUZJWE1FKG9sZSwiKCVzLCVkLCVkLDB4JTA0eCwlcCksY2FuJ3QgaGFuZGxlIG5vbi1zdHJpbmcgZ3VpZHMuXG4iLHhndWlkLHdNYWosd01pbiwoRFdPUkQpbGNpZCxwYXRoKTsKKwkJRklYTUUob2xlLCIoJXMsJWQsJWQsMHglMDRseCwlcCksY2FuJ3QgaGFuZGxlIG5vbi1zdHJpbmcgZ3VpZHMuXG4iLHhndWlkLHdNYWosd01pbiwoRFdPUkQpbGNpZCxwYXRoKTsKIAkJcmV0dXJuIEVfRkFJTDsKIAl9CiAJcGxlbiA9IHNpemVvZihwYXRobmFtZSk7CkBAIC04MCw3ICs4MCw3IEBACiAJCSk7CiAJfSBlbHNlIHsKIAkJc3ByaW50Zih4Z3VpZCwiPGd1aWQgMHglMDhseD4iLChEV09SRClndWlkKTsKLQkJRklYTUUob2xlLCIoJXMsJWQsJWQsMHglMDR4LCVwKSxzdHViIVxuIix4Z3VpZCx3TWFqLHdNaW4sKERXT1JEKWxjaWQscGF0aCk7CisJCUZJWE1FKG9sZSwiKCVzLCVkLCVkLDB4JTA0bHgsJXApLHN0dWIhXG4iLHhndWlkLHdNYWosd01pbiwoRFdPUkQpbGNpZCxwYXRoKTsKIAkJcmV0dXJuIEVfRkFJTDsKIAl9CiAJcGxlbiA9IHNpemVvZihwYXRobmFtZSk7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9DaGFuZ2VMb2cgYi9wcm9ncmFtcy9jbG9jay9DaGFuZ2VMb2cKaW5kZXggMTE2Mjc2NS4uNTkwNmQ3OSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvY2xvY2svQ2hhbmdlTG9nCisrKyBiL3Byb2dyYW1zL2Nsb2NrL0NoYW5nZUxvZwpAQCAtMSwzICsxLDkgQEAKK0ZyaSBKdW4gMTIgMjI6NDc6NTYgMTk5OCAgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgorICAgICAgICogRml4ZWQgcmVzb3VyY2UgYnVnIGluIFVwZGF0ZVdpbmRvd0NhcHRpb24oKSB0aGF0IGNhdXNlZCB3cm9uZyAob2xkKQorICAgICAgICAgbG9jYWxlIGZvciB0aGUgZGlzcGxheWVkIGRhdGUKKyAgICAgICAqIFRoZSBkaWdpdGFsIGNsb2NrIG5vdyBzaG93cyB1cCAoV0lORS1OTFMtVU5LTk9XTiBtZWFucyB0aGF0IHRoZXJlCisgICAgICAgICBpcyBubyBsb2NhbGUgcnVsZSBmb3IgdGltZSBzdHJpbmcgZm9ybWF0IGluIC9vbGUvd2lubmxzLmMpCisKIFRodSBNYXkgMjggMjA6NDI6MTMgMTk5OCAgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogICAgICAgICogW2xhbmd1YWdlLmNdCiAgICAgICAgICBVcGRhdGVXaW5kb3dDYXB0aW9uKCksIGxvY2FsZSBhbmQgZGF0ZQpAQCAtMzEsMyArMzcsNCBAQAogCiAgICAgICAgICBPcmlnaW5hbHMgYnkgTWFyY2VsIEJhdXIKIAorCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9MaWNlbnNlX0VuLmMgYi9wcm9ncmFtcy9jbG9jay9MaWNlbnNlX0VuLmMKaW5kZXggYmVjNjZkOS4uNTExYmNlNCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvY2xvY2svTGljZW5zZV9Fbi5jCisrKyBiL3Byb2dyYW1zL2Nsb2NrL0xpY2Vuc2VfRW4uYwpAQCAtNDQsNSArNDQsNSBAQAogIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4iOwogCiBMSUNFTlNFIFdpbmVMaWNlbnNlX0VuID0ge0xpY2Vuc2VfRW4sIExpY2Vuc2VDYXB0aW9uX0VuLAotCQkJICBOb1dhcnJhbnR5X0VuLCBOb1dhcnJhbnR5Q2FwdGlvbl9Fbn07CisgICAgICAgICAgICAgICAgICAgICAgICAgIE5vV2FycmFudHlfRW4sIE5vV2FycmFudHlDYXB0aW9uX0VufTsKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9jbG9jay9NYWtlZmlsZS5pbgppbmRleCBmZGJkMmNjLi42YWNkNmE4IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9jbG9jay9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy9jbG9jay9NYWtlZmlsZS5pbgpAQCAtNyw2ICs3LDcgQEAKIFBST0dSQU1TICA9IGNsb2NrCiBBTExfTElCUyAgPSAkKFdJTkVMSUIpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMSUJTKQogUkNGTEFHUyAgID0gLXczMiAtaAorV1JDRVhUUkEgID0gLUEgLXAgJCoKIAogTEFOR1VBR0VTICAgPSBFbiBEYSBEZSBTdwogTElDRU5TRUxBTkcgPSBFbgpAQCAtMjgsMjcgKzI5LDE4IEBACiBNT1NUT0JKUyA9ICQoTU9TVFNSQ1M6LmM9Lm8pCiBTVFJJTkdPQkpTID0gJChTVFJJTkdTUkNTOi5jPS5vKSAkKFJDX1NSQ1M6LnJjPS5vKQogCi1hbGw6IGNoZWNrX3dpbmVyYyAkKFBST0dSQU1TKQorYWxsOiBjaGVja193cmMgJChQUk9HUkFNUykKIAotZGVwZW5kOjogJChSQ19TUkNTOi5yYz0uaCkKK2RlcGVuZDo6CiAKIEBNQUtFX1JVTEVTQAogCi0jIFJ1bGVzIGZvciB1c2luZyBvbGQgcmVzb3VyY2UgY29tcGlsZXIKLS5yYy5jOgotCWVjaG8gIiNpbmNsdWRlIFwid2luZG93cy5oXCIiID4kKi10bXAuYwotCWVjaG8gV0lORE9XU19IX0VORFNfSEVSRSA+PiQqLXRtcC5jCi0JY2F0ICQ8ID4+JCotdG1wLmMKLQkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QICQqLXRtcC5jIHwgc2VkIC1lICcxLC9eV0lORE9XU19IX0VORFNfSEVSRS9kJyB8ICQoV0lORVJDKSAkKFJDRkxBR1MpIC1jIC1vICQqIC1wICQqCi0JJChSTSkgJCotdG1wLmMKKyMgT3ZlcnJpZGUgcmVzb3VyY2UgY29tcGlsZXIgcnVsZXMKKy5yYy5zOgorCSQoQ1BQKSAkKERFRlMpICQoT1BUSU9OUykgJChESVZJTkNMKSAtRFJDX0lOVk9LRUQgLVAgLXggYyAkPCB8ICQoV1JDKSAkKFdSQ0ZMQUdTKSAkKFdSQ0VYVFJBKSAtbyAkKi5zCisKIC5yYy5oOgotCWVjaG8gIiNpbmNsdWRlIFwid2luZG93cy5oXCIiID4kKi10bXAuYwotCWVjaG8gV0lORE9XU19IX0VORFNfSEVSRSA+PiQqLXRtcC5jCi0JY2F0ICQ8ID4+JCotdG1wLmMKLQkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QICQqLXRtcC5jIHwgc2VkIC1lICcxLC9eV0lORE9XU19IX0VORFNfSEVSRS9kJyB8ICQoV0lORVJDKSAkKFJDRkxBR1MpIC1jIC1vICQqIC1wICQqCi0JJChSTSkgJCotdG1wLmMKLWNsZWFuOjoKLQkkKFJNKSAkKFJDX1NSQ1M6LnJjPS5jKQorCSQoQ1BQKSAkKERFRlMpICQoT1BUSU9OUykgJChESVZJTkNMKSAtRFJDX0lOVk9LRUQgLVAgLXggYyAkPCB8ICQoV1JDKSAkKFdSQ0ZMQUdTKSAkKFdSQ0VYVFJBKSAtbkggJCouaAogCiAKIGNsb2NrOiAkKE1PU1RPQkpTKSAkKFNUUklOR09CSlMpCkBAIC01Nyw3ICs0OSw3IEBACiBpbnN0YWxsOiBkdW1teQogCSQoSU5TVEFMTF9QUk9HUkFNKSBjbG9jayAkKGJpbmRpcikvY2xvY2sKIAotJChSQ19TUkNTOi5yYz0uYykgJChSQ19TUkNTOi5yYz0uaCk6ICQoV0lORVJDKQorJChSQ19TUkNTOi5yYz0ucyk6ICQoV1JDKQogCiBkdW1teToKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svUkVBRE1FIGIvcHJvZ3JhbXMvY2xvY2svUkVBRE1FCmluZGV4IDQwY2MwNDguLjI5NmE2YTIgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL2Nsb2NrL1JFQURNRQorKysgYi9wcm9ncmFtcy9jbG9jay9SRUFETUUKQEAgLTgsMTEgKzgsNSBAQAogIFBsZWFzZSBzZWUgZmlsZSBUT0RPIGZvciB0aGluZ3MgdG8gZG8gYW5kIGtlZXAgdGhlIGZpbGUgQ2hhbmdlTG9nCiAgdXAgdG8gZGF0ZS4KIAotIENvZGUgaXMgY3VycmVudGx5IHVuZGVyIGhlYXZ5IGNvbnN0cnVjdGlvbi4gTmVhcmx5IGFsbCBmaWxlcyB3aWxsIAotIGNoYW5nZSB1bnRpbCBuZXh0IHJlbGVhc2UuIFlvdSBjYW4gc3BlZWQgdXAgZGV2ZWxvcG1lbnQgb2YgY2xvY2sKLSBpZiB5b3Ugc2VuZCBwYXRjaGVzIGFuZCBhZGRpdGlvbnMgZGlyZWN0bHkgdG8gbXkgcGVyc29uYWwgZW1haWwgCi0gYWRkcmVzcyA8bWJhdXJAZzI2LmV0aHouY2g+LgotCi0gSSBhbHNvIHRyeSB0byByZWFkIG5ld3M6Y29tcC5lbXVsYXRvcnMubXMtd2luZG93cy53aW5lIGZyZXF1ZW50bHksIAotIHNvIEkgY2FuIGFsc28gaW50ZWdyYXRlIHBhdGNoZXMgcG9zdGVkIHZpYSB1c2VuZXQuCi0KKyBDb2RlIGlzIGN1cnJlbnRseSB1bmRlciBoZWF2eSBjb25zdHJ1Y3Rpb24uIFBsZWFzZSBkaXJlY3QgcGF0Y2hlcyBhbmQKKyBhZGRpdGlvbnMgdG8gbXkgcGVyc29uYWwgZW1haWwgYWRkcmVzcyA8bWJhdXJAZzI2LmV0aHouY2g+CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9UT0RPIGIvcHJvZ3JhbXMvY2xvY2svVE9ETwppbmRleCA3ZDE1ZDFhLi5mODMzNmYwIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9jbG9jay9UT0RPCisrKyBiL3Byb2dyYW1zL2Nsb2NrL1RPRE8KQEAgLTIsMzUgKzIsMjEgQEAKIFNvbWUgaWRlYXMgZm9yIGltcHJvdmVtZW50czoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotLSBBZGQgRm9udCBTZWxlY3Rpb24gRGlhbG9nIChzaG91bGQgYmUgQ29tbURsZykuCi0KIC0gTWFrZSAiV2l0aG91dCBUaXRsZWJhciIsIERvdWJsZS1jbGlja2luZyB0aGUgY2xvY2sgc2hvdWxkIHJldmVhbCB0aGUgY2FwdGlvbgogICBhZ2Fpbi4KIAogLSBNb3ZlIHRoZSAiV2l0aG91dCBUaXRsZWJhciIgaW50byB0aGUgU3lzdGVtIE1lbnUgKGFzIGluIFdpbmRvd3MpCi0KLS0gSW1wbGVtZW50IGEgImRpZ2l0YWwgY2xvY2siCisgIChEb2VzIG5vdCB3b3JrIHByb2JhYmx5IGR1ZSB0byBXaW5lbGliKQogCiAtIEZvbnQgSGFuZGxpbmcgb2YgRGlnaXRhbCBDbG9jay4KLQotLSBNYWtlIGRpc3RpbmN0aW9uIGJldHdlZW4gYW5hbG9nIGNsb2NrIGFuZCBkaWdpdGFsIGNsb2NrIGFjY29yZGluZyB0bwotICBHbG9iYWxzLmJBbmFsb2cgc2V0dGluZyAvIENMX0FOQUxPRyBtZW51IGV2ZW50LgotCi0tIEltcGxlbWVudCBEYXRlIChXaW5kb3cgY2FwdGlvbiksIGJ1dCBtaW5kIHRoZSBkaWZmZXJlbnQgbGFuZ3VhZ2VzLgotCi0tIE1ha2UgZGlzdGluY3Rpb24gYmV0d2VlbiBEYXRlIC8gbm8gRGF0ZSBhY2NvcmRpbmcgdG8KLSAgR2xvYmFscy5iRGF0ZSBzZXR0aW5nIC8gQ0xfREFURSBtZW51IGV2ZW50LgorICAoRG9lcyBub3Qgd29yayBwcm9iYWJseSBkdWUgdG8gV2luZWxpYikKIAogLSBJbXBsZW1lbnQgVGltZXIgTWVjaGFuaXNtIGluc3RlYWQgUG9sbGluZy4KICAgQ2xvY2sgZG9lcyBub3QgcnVuIGlmIG1lbnUgaXMgYmVpbmcgc2VsZWN0ZWQgKD8pLgogCi0tIEZpeCBDbG9jayBCYWNrZ3JvdW5kIChzb21ldGltZXMgZGVzdHJveWVkKS4KLSAgKCBUaGlzIGlzIGJlY2F1c2UgdGhlIG9sZCAiSGFuZHMiIGFyZSByZW1vdmVkIG9uZSBtb3JlIHRpbWUgKQotCiAtIEZpeCBFbmdsaXNoIHRyYW5zbGF0aW9uIGJ5IGNvbXBhcmluZyBzdHJpbmdzIGZyb20gYW4gb3JpZ2luYWwgRW5nbGlzaAogICBXaW5kb3dzIENsb2NrIGFwcGxpY2F0aW9uIChJIG9ubHkgaGF2ZSBhIEdlcm1hbiB2ZXJzaW9uKS4KIAogLSBBZGQgbmV3IC5yYyByZXNvdXJjZXMgZm9yIGFsbCBsYW5ndWFnZXMgeW91IGtub3cuCiAKLQogUGxlYXNlIGRvbid0IGZvcmdldCBhIENoYW5nZUxvZyBlbnRyeS4KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL2Nsb2NrLnJjIGIvcHJvZ3JhbXMvY2xvY2svY2xvY2sucmMKaW5kZXggMmQ3OWVhNS4uNzU2YjgzNiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvY2xvY2svY2xvY2sucmMKKysrIGIvcHJvZ3JhbXMvY2xvY2svY2xvY2sucmMKQEAgLTQsNiArNCw3IEBACiAgKiBDb3B5cmlnaHQgMTk5OCBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAgKi8KIAorI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJtYWluLmgiCiAgCiAjZGVmaW5lIENPTkNBVChhLCBiKSBDT05DQVQxKGEsIGIpCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9sYW5ndWFnZS5jIGIvcHJvZ3JhbXMvY2xvY2svbGFuZ3VhZ2UuYwppbmRleCBhYTkyMGE3Li5hNDFhZTZmIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9jbG9jay9sYW5ndWFnZS5jCisrKyBiL3Byb2dyYW1zL2Nsb2NrL2xhbmd1YWdlLmMKQEAgLTM4LDYgKzM4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfVU5DSEVDS0VEKTsKICAgICAgICAgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfRElHSVRBTCwgXAogICAgICAgICAgICAgICAgICAgICAgICBNRl9CWUNPTU1BTkQgfCBNRl9DSEVDS0VEKTsKKyAgICAgICAgRW5hYmxlTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0ZPTlQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgTUZfQllDT01NQU5EKTsKKyAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfQogICAgIAogICAgIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX1dJVEhPVVRfVElUTEUsIE1GX0JZQ09NTUFORCB8IFwKQEAgLTEyMywxMCArMTI2LDggQEAKICAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX0xBTkdVQUdFX0lELCBsYW5nLCBzaXplb2YobGFuZykpOwogICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IGxhbmc7CiAKLSAgTEFOR1VBR0VfVXBkYXRlV2luZG93Q2FwdGlvbigpOwotCiAgIC8qIENoYW5nZSBSZXNvdXJjZSBuYW1lcyAqLwotICBsc3RyY3B5bihTVFJJTkdfTUVOVV9YeCAgICArIHNpemVvZihTVFJJTkdfTUVOVV9YeCkgICAgLSAzLCBsYW5nLCAzKTsKKyAgbHN0cmNweW4oU1RSSU5HX01FTlVfWHggKyBzaXplb2YoU1RSSU5HX01FTlVfWHgpIC0gMywgbGFuZywgMyk7CiAKICAgLyogQ3JlYXRlIG1lbnUgKi8KICAgaE1haW5NZW51ID0gTG9hZE1lbnUoR2xvYmFscy5oSW5zdGFuY2UsIFNUUklOR19NRU5VX1h4KTsKQEAgLTE1Nyw2ICsxNTgsNyBAQAogICAgLyogc3BlY2lmaWMgZm9yIENsb2NrOiAqLwogCiAgICBMQU5HVUFHRV9VcGRhdGVNZW51Q2hlY2ttYXJrcygpOworICAgTEFOR1VBR0VfVXBkYXRlV2luZG93Q2FwdGlvbigpOyAgIAogfQogCiBWT0lEIExBTkdVQUdFX0RlZmF1bHRIYW5kbGUoV1BBUkFNIHdQYXJhbSkKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL21haW4uYyBiL3Byb2dyYW1zL2Nsb2NrL21haW4uYwppbmRleCBkNzM1NThiLi5lNWM2NTkxIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9jbG9jay9tYWluLmMKKysrIGIvcHJvZ3JhbXMvY2xvY2svbWFpbi5jCkBAIC0yMTMsOCArMjEzLDYgQEAKICAgICAgIExJQldJTkVfUmVnaXN0ZXJfU3coKTsKICAgICAjZW5kaWYKIAotICAgIHByaW50ZigiV2luTWFpbigpXG4iKTsKLSAgICAKICAgICAvKiBTZXR1cCBHbG9iYWxzICovCiAgICAgR2xvYmFscy5iQW5hbG9nCSAgICA9IFRSVUU7CiAgICAgR2xvYmFscy5iU2Vjb25kcyAgICAgICAgPSBUUlVFOwpAQCAtMjU1LDEyICsyNTMsMTcgQEAKICAgICBTZXRNZW51KEdsb2JhbHMuaE1haW5XbmQsIEdsb2JhbHMuaE1haW5NZW51KTsKIAogICAgIEdsb2JhbHMuaFN5c3RlbU1lbnUgPSBHZXRTeXN0ZW1NZW51KEdsb2JhbHMuaE1haW5XbmQsIFRSVUUpOworCisgICAgLyoKKyAgICAgICAgRklYTUU6IFRoZSBuZXh0IGZldyBsaW5lcyBhcmUgYW4gYXR0ZW1wdCB0byBhZGQgYSBtZW51IGl0ZW0gdG8gdGhlIAorICAgICAgICAgICAgICAgd2luZG93IHN5c3RlbSBtZW51LiAKKyAgICAqLwogICAgIAogICAgIEFwcGVuZE1lbnUoR2xvYmFscy5oU3lzdGVtTWVudSwgTUZfU1RSSU5HIHwgTUZfQllDT01NQU5ELCAxMDAwLCAiaXRlbSIpOwogICAgIFNldFN5c3RlbU1lbnUoR2xvYmFscy5oTWFpblduZCwgR2xvYmFscy5oU3lzdGVtTWVudSk7CiAKLSAgICBFbmFibGVNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfRk9OVCwgXAotICAgICAgICAgICAgICAgICAgICBNRl9CWUNPTU1BTkQgfCBNRl9HUkFZRUQpOworICAgIExBTkdVQUdFX1VwZGF0ZU1lbnVDaGVja21hcmtzKCk7CisKICAgICBTaG93V2luZG93IChHbG9iYWxzLmhNYWluV25kLCBzaG93KTsKICAgICBVcGRhdGVXaW5kb3cgKEdsb2JhbHMuaE1haW5XbmQpOwogCkBAIC0yNzksNCArMjgyLDMgQEAKICAgICByZXR1cm4gMDsgICAgCiB9CiAKLQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svd2luY2xvY2suYyBiL3Byb2dyYW1zL2Nsb2NrL3dpbmNsb2NrLmMKaW5kZXggOGEzZGVhMC4uNWJhZjVlYiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvY2xvY2svd2luY2xvY2suYworKysgYi9wcm9ncmFtcy9jbG9jay93aW5jbG9jay5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAid2luY2xvY2suaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIndpbm5scy5oIgogCiBDT0xPUlJFRiBGYWNlQ29sb3IgPSBSR0IoMTkyLDE5MiwxOTIpOwogQ09MT1JSRUYgSGFuZENvbG9yID0gUkdCKDAsMCwwKTsKQEAgLTE1Myw4ICsxNTQsOCBAQAogICAgIEV4ID0gTWlkWCtzaW4oUG9zKlBpLzMwMDApKlhFeHQ7CiAgICAgRXkgPSBNaWRZLWNvcyhQb3MqUGkvMzAwMCkqWUV4dDsKICAgICBydiA9ICggU3ghPU9sZFNlY29uZC5TdGFydFggfHwgRXghPU9sZFNlY29uZC5FbmRYIHx8Ci0gIAkgU3khPU9sZFNlY29uZC5TdGFydFkgfHwgRXkhPU9sZFNlY29uZC5FbmRZICk7Ci0gICAgaWYgKEdsb2JhbHMuYkFuYWxvZyAmJiBydilEcmF3U2Vjb25kSGFuZChkYyk7CisgICAgICAgICAgIFN5IT1PbGRTZWNvbmQuU3RhcnRZIHx8IEV5IT1PbGRTZWNvbmQuRW5kWSApOworICAgIGlmIChHbG9iYWxzLmJBbmFsb2cgJiYgcnYpIERyYXdTZWNvbmRIYW5kKGRjKTsKICAgICBPbGRTZWNvbmQuU3RhcnRYID0gU3g7IE9sZFNlY29uZC5FbmRYID0gRXg7CiAgICAgT2xkU2Vjb25kLlN0YXJ0WSA9IFN5OyBPbGRTZWNvbmQuRW5kWSA9IEV5OwogICAgIE9sZFNlY29uZC5Eb250UmVkcmF3PUZBTFNFOwpAQCAtMTYzLDIyICsxNjQsNDAgQEAKICAgcmV0dXJuIHJ2OwogfQogCi12b2lkIElkbGUoSERDIGlkYykKLXsKLSAgU1lTVEVNVElNRSBzdDsKLSAgVEVYVE1FVFJJQyB0bTsKK3ZvaWQgRGlnaXRhbENsb2NrKEhEQyBkYykgeworCisgIENIQVIgc3pUaW1lW01BWF9TVFJJTkdfTEVOXTsKKyAgTFBTVFIgdGltZSA9IHN6VGltZTsKICAgc3RhdGljIHNob3J0IHhDaGFyLCB5Q2hhcjsKKyAgVEVYVE1FVFJJQyB0bTsKKyAgCisgIFNZU1RFTVRJTUUgc3Q7CisgIExQU1lTVEVNVElNRSBscHN0ID0gJnN0OworICAKKyAgR2V0TG9jYWxUaW1lKCZzdCk7CisgIEdldFRpbWVGb3JtYXQoTE9DQUxFX1VTRVJfREVGQVVMVCwgTE9DQUxFX1NUSU1FRk9STUFULCBscHN0LCBOVUxMLCB0aW1lLCAKKyAgICAgICAgICAgICAgICBNQVhfU1RSSU5HX0xFTik7CisgICAgICAgICAgICAgICAgCisgIFNlbGVjdE9iamVjdChkYyxDcmVhdGVQZW4oUFNfU09MSUQsMSxGYWNlQ29sb3IpKTsKKyAgeENoYXIgPSB0bS50bUF2ZUNoYXJXaWR0aDsKKyAgeUNoYXIgPSB0bS50bUhlaWdodDsKKyAgCisgIHhDaGFyID0gMTAwOworICB5Q2hhciA9IDEwMDsKKyAgVGV4dE91dCAoZGMsIHhDaGFyLCB5Q2hhciwgc3pUaW1lLCBzdHJsZW4gKHN6VGltZSkpOyAKKyAgRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChkYyxHZXRTdG9ja09iamVjdChOVUxMX1BFTikpKTsKKyAgICAgICAgICAgICAgCit9CisKKworCit2b2lkIEFuYWxvZ0Nsb2NrKEhEQyBkYykgeworCisgIFNZU1RFTVRJTUUgc3Q7CiAgIFdPUkQgSCwgTSwgUywgRjsKICAgaW50IE1pZFgsIE1pZFksIERpZmZYLCBEaWZmWTsKLSAgSERDIGRjOwogICBCT09MIFJlZHJhdzsKIAotICBpZihpZGMpCi0gICAgZGM9aWRjOwotICBlbHNlCi0gICAgZGM9R2V0REMoR2xvYmFscy5oTWFpblduZCk7Ci0gIGlmKCFkYylyZXR1cm47Ci0KICAgR2V0TG9jYWxUaW1lKCZzdCk7CiAgIEggPSBzdC53SG91cjsKICAgTSA9IHN0LndNaW51dGU7CkBAIC0xOTcsMjYgKzIxNiwzNiBAQAogICBpZihVcGRhdGVIb3VySGFuZChkYyxNaWRYK0RpZmZYLE1pZFkrRGlmZlksTWlkWCowLjUsTWlkWSowLjUsSCkpIFJlZHJhdyA9IFRSVUU7CiAgIGlmKFVwZGF0ZU1pbnV0ZUhhbmQoZGMsTWlkWCtEaWZmWCxNaWRZK0RpZmZZLE1pZFgqMC42NSxNaWRZKjAuNjUsTSkpIFJlZHJhdyA9IFRSVUU7CiAgIGlmKFVwZGF0ZVNlY29uZEhhbmQoZGMsTWlkWCtEaWZmWCxNaWRZK0RpZmZZLE1pZFgqMC43OSxNaWRZKjAuNzksRikpIFJlZHJhdyA9IFRSVUU7Ci0gIGlmIChHbG9iYWxzLmJBbmFsb2cpCi0gIHsKLSAgICBEZWxldGVPYmplY3QoU2VsZWN0T2JqZWN0KGRjLENyZWF0ZVBlbihQU19TT0xJRCwxLEhhbmRDb2xvcikpKTsKLSAgICAgIGlmKFJlZHJhdykKKworICBEZWxldGVPYmplY3QoU2VsZWN0T2JqZWN0KGRjLENyZWF0ZVBlbihQU19TT0xJRCwxLEhhbmRDb2xvcikpKTsKKyAgICBpZihSZWRyYXcpCiAgICAgICB7CiAgICAgICAgIERyYXdTZWNvbmRIYW5kKGRjKTsKICAgICAgICAgRHJhd01pbnV0ZUhhbmQoZGMpOwogICAgICAgICBEcmF3SG91ckhhbmQoZGMpOwogICAgICAgfQotICAgIERlbGV0ZU9iamVjdChTZWxlY3RPYmplY3QoZGMsR2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pKSk7IAorICBEZWxldGVPYmplY3QoU2VsZWN0T2JqZWN0KGRjLEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSkpOyAKKyAgCit9CisKK3ZvaWQgSWRsZShIREMgaWRjKQoreworICBIREMgY29udGV4dDsKKworICBpZihpZGMpCisgICAgICAgIGNvbnRleHQ9aWRjOworICBlbHNlCisgICAgICAgIGNvbnRleHQ9R2V0REMoR2xvYmFscy5oTWFpblduZCk7CisKKyAgaWYgKCFjb250ZXh0KSByZXR1cm47CisKKyAgaWYgKEdsb2JhbHMuYkFuYWxvZykKKyAgeworICAgIEFuYWxvZ0Nsb2NrKGNvbnRleHQpOwogICB9CiAgIGVsc2UgCiAgIHsKLSAgICBTZWxlY3RPYmplY3QoZGMsQ3JlYXRlUGVuKFBTX1NPTElELDEsRmFjZUNvbG9yKSk7Ci0gICAgeENoYXIgPSB0bS50bUF2ZUNoYXJXaWR0aDsKLSAgICB5Q2hhciA9IHRtLnRtSGVpZ2h0OwotICAgIFRleHRPdXQgKGRjLCB4Q2hhciwgeUNoYXIsICJIb2xhIiwgc3RybGVuICgiSG9sYSIpKTsgCi0gICAgRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChkYyxHZXRTdG9ja09iamVjdChOVUxMX1BFTikpKTsKKyAgICBEaWdpdGFsQ2xvY2soY29udGV4dCk7CiAgIH0KLSAgaWYoIWlkYykgUmVsZWFzZURDKEdsb2JhbHMuaE1haW5XbmQsZGMpOworICBpZighaWRjKSBSZWxlYXNlREMoR2xvYmFscy5oTWFpblduZCwgY29udGV4dCk7CiB9Ci0KLS8vICAgIGNsYXNzLmhickJhY2tncm91bmQgPSAoSEJSVVNIKShDT0xPUl9CQUNLR1JPVU5EICsgMSk7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay93aW5jbG9jay5oIGIvcHJvZ3JhbXMvY2xvY2svd2luY2xvY2suaAppbmRleCBkMzBmYmJjLi5jNWY1MTE3IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9jbG9jay93aW5jbG9jay5oCisrKyBiL3Byb2dyYW1zL2Nsb2NrL3dpbmNsb2NrLmgKQEAgLTIxLDggKzIxLDYgQEAKIAogCiB2b2lkIERyYXdGYWNlKEhEQyBkYyk7Ci0KLQogdm9pZCBEcmF3SG91ckhhbmQoSERDIGRjKTsKIHZvaWQgRHJhd01pbnV0ZUhhbmQoSERDIGRjKTsKIHZvaWQgRHJhd1NlY29uZEhhbmQoSERDIGRjKTsKQEAgLTMwLDQgKzI4LDMgQEAKIEJPT0wgVXBkYXRlTWludXRlSGFuZChIREMgZGMsaW50IE1pZFgsaW50IE1pZFksaW50IFhFeHQsaW50IFlFeHQsV09SRCBQb3MpOwogQk9PTCBVcGRhdGVTZWNvbmRIYW5kKEhEQyBkYyxpbnQgTWlkWCxpbnQgTWlkWSxpbnQgWEV4dCxpbnQgWUV4dCxXT1JEIFBvcyk7CiB2b2lkIElkbGUoSERDIGlkYyk7Ci0KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvQ2hhbmdlTG9nIGIvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKaW5kZXggMGMyZDcwNS4uODE4NmRjNyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKQEAgLTEsNCArMSw3IEBACi1IZW5yaWsgT2xzZW4gPGhlbnJpa0BpYWVzdGUuZGs+CitGcmkgSnVuIDEyIDIzOjI5OjQ0IDE5OTggIE1hcmNlbCBCYXVyICA8bWJhdXJAZzI2LmV0aHouY2g+CisgICAgICAgICogRml4ZWQgR2V0RGF0ZUZvcm1hdCgpLT5HZXRUaW1lRm9ybWF0KCkgZm9yIGxvY2FsZSB0aW1lLgorCitNb24gTWF5IDI1IDE0OjMwOjAwIDE5OTggIEhlbnJpayBPbHNlbiA8aGVucmlrQGlhZXN0ZS5kaz4KICAgICAgICAgKiBbRGEucmNdCiAgICAgICAgIEFkZGVkIERhbmlzaCBsYW5ndWFnZSBzdXBwb3J0LgogCkBAIC00Niw0ICs0OSwzIEBACiAgICAgICAgICAgW2xpY2Vuc2UuY10gW2xpY2Vuc2UuaF0gW0xpY2Vuc2VfRW4uY10KICAgICAgICAgICBbUkVBRE1FXSBbVE9ET10gW0NoYW5nZUxvZ10KICAgICAgICAgICBPcmlnaW5hbHMgYnkgTWFyY2VsIEJhdXIKLQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4KaW5kZXggZjZmZTk2MS4uNDZmZWQyNCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlLmluCkBAIC03LDYgKzcsNyBAQAogUFJPR1JBTVMgID0gbm90ZXBhZAogQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKIFJDRkxBR1MgICA9IC13MzIgLWgKK1dSQ0VYVFJBICA9IC1BIC1wICQqCiAKIExBTkdVQUdFUyAgID0gRW4gRGEgRGUgRnIgU3cKIExJQ0VOU0VMQU5HID0gRW4KQEAgLTI4LDI3ICsyOSwxOCBAQAogTU9TVE9CSlMgPSAkKE1PU1RTUkNTOi5jPS5vKQogU1RSSU5HT0JKUyA9ICQoU1RSSU5HU1JDUzouYz0ubykgJChSQ19TUkNTOi5yYz0ubykKIAotYWxsOiBjaGVja193aW5lcmMgJChQUk9HUkFNUykKK2FsbDogY2hlY2tfd3JjICQoUFJPR1JBTVMpCiAKLWRlcGVuZDo6ICQoUkNfU1JDUzoucmM9LmgpCitkZXBlbmQ6OgogCiBATUFLRV9SVUxFU0AKIAotIyBSdWxlcyBmb3IgdXNpbmcgb2xkIHJlc291cmNlIGNvbXBpbGVyCi0ucmMuYzoKLQllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKLQllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj4kKi10bXAuYwotCWNhdCAkPCA+PiQqLXRtcC5jCi0JJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgotCSQoUk0pICQqLXRtcC5jCisjIE92ZXJyaWRlIHJlc291cmNlIGNvbXBpbGVyIHJ1bGVzCisucmMuczoKKwkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QIC14IGMgJDwgfCAkKFdSQykgJChXUkNGTEFHUykgJChXUkNFWFRSQSkgLW8gJCoucworCiAucmMuaDoKLQllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKLQllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj4kKi10bXAuYwotCWNhdCAkPCA+PiQqLXRtcC5jCi0JJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgotCSQoUk0pICQqLXRtcC5jCi1jbGVhbjo6Ci0JJChSTSkgJChSQ19TUkNTOi5yYz0uYykKKwkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QIC14IGMgJDwgfCAkKFdSQykgJChXUkNGTEFHUykgJChXUkNFWFRSQSkgLW5IICQqLmgKIAogCiBub3RlcGFkOiAkKE1PU1RPQkpTKSAkKFNUUklOR09CSlMpCkBAIC01Nyw3ICs0OSw3IEBACiBpbnN0YWxsOiBkdW1teQogCSQoSU5TVEFMTF9QUk9HUkFNKSBub3RlcGFkICQoYmluZGlyKS9ub3RlcGFkCiAKLSQoUkNfU1JDUzoucmM9LmMpICQoUkNfU1JDUzoucmM9LmgpOiAkKFdJTkVSQykKKyQoUkNfU1JDUzoucmM9LnMpOiAkKFdSQykKIAogZHVtbXk6CiAKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvVE9ETyBiL3Byb2dyYW1zL25vdGVwYWQvVE9ETwppbmRleCAyN2U4ZmZmLi4xM2YxNWY2IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL1RPRE8KKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9UT0RPCkBAIC03LDEwICs3LDYgQEAKICAtIE5vdGVwYWQgc2VnZmF1bHRzIHdoZW4gc2VsZWN0aW5nICJGaW5kIiBidXR0b24gaW4gIlNlYXJjaCIgZGlhbG9nLgogICAgVGhpcyBpcyBwcm9iYWJseSBhIHByb2JsZW0gcmVsYXRlZCB0byBXaW5lbGliLgogIAotIC0gVGhlcmUgaXMgc3RpbGwgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIDJuZCBmb3JtYXQgc3RyaW5nIG9mIERhdGUvVGltZS4KLSAgIFdpdGggc29tZSBsYW5ndWFnZXMsIHR3aWNlIHRoZSBkYXRlIGlzIHByaW50ZWQgKGluc3RlYWQgb2YgdGltZSkuCi0gICBPdGhlciBsYW5ndWFnZXMsIHN1Y2ggYXMgZnJlbmNoIGRvIG5vdCBzdXBwb3J0IGFueSBsb2NhbGVzIC0+IGFubm95aW5nLgotCiAgLSBQYWdlIFNldHVwIGRpYWxvZyBib3ggc2hvdWxkIGV4Y2hhbmdlIHN0cmluZ3Mgd2l0aCB0aGUgY29ycmVzcG9uZGluZwogICAgR2xvYmFscy5zek1hcmdpbj8/Py1zdHJpbmdzIChuZWVkZWQgdG8gZXZhbHVhdGUgc3RyaW5ncyB3aGVuIHByaW50aW5nKQogICAgCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL2RpYWxvZy5jIGIvcHJvZ3JhbXMvbm90ZXBhZC9kaWFsb2cuYwppbmRleCAxNzIxZGNkLi4zZmI0OTFhIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL2RpYWxvZy5jCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvZGlhbG9nLmMKQEAgLTQzMCw3ICs0MzAsNyBAQAogICAKICAgcHJpbnRmKCJEYXRlOiAlc1xuIiwgZGF0ZSk7CiAgIAotICBHZXREYXRlRm9ybWF0KExPQ0FMRV9VU0VSX0RFRkFVTFQsIExPQ0FMRV9TVElNRUZPUk1BVCwgbHBzdCwgTlVMTCwgZGF0ZSwgTUFYX1NUUklOR19MRU4pOworICBHZXRUaW1lRm9ybWF0KExPQ0FMRV9VU0VSX0RFRkFVTFQsIExPQ0FMRV9TVElNRUZPUk1BVCwgbHBzdCwgTlVMTCwgZGF0ZSwgTUFYX1NUUklOR19MRU4pOwogICAKICAgcHJpbnRmKCJUaW1lOiAlc1xuIiwgZGF0ZSk7CiAKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvbm90ZXBhZC5yYyBiL3Byb2dyYW1zL25vdGVwYWQvbm90ZXBhZC5yYwppbmRleCAyNmFkZTYzLi5lNzliODhkIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL25vdGVwYWQucmMKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9ub3RlcGFkLnJjCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IDE5OTcgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogICovCiAKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAibWFpbi5oIgogIAogI2RlZmluZSBDT05DQVQoYSwgYikgQ09OQ0FUMShhLCBiKQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KaW5kZXggNGFmNThiOC4uMGE2ZTJjZCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCkBAIC03LDYgKzcsNyBAQAogUFJPR1JBTVMgID0gcHJvZ21hbgogQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKIFJDRkxBR1MgICA9IC13MzIgLWgKK1dSQ0VYVFJBICA9IC1BIC1wICQqCiAKIExBTkdVQUdFUyAgID0gRW4gRGEgRGUgRnIgRmkgS28gSHUgSXQgVmEgU3cKIExJQ0VOU0VMQU5HID0gRW4KQEAgLTMzLDI3ICszNCwxOCBAQAogTU9TVE9CSlMgPSAkKE1PU1RTUkNTOi5jPS5vKQogU1RSSU5HT0JKUyA9ICQoU1RSSU5HU1JDUzouYz0ubykgJChSQ19TUkNTOi5yYz0ubykKIAotYWxsOiBjaGVja193aW5lcmMgJChQUk9HUkFNUykKK2FsbDogY2hlY2tfd3JjICQoUFJPR1JBTVMpCiAKIGRlcGVuZDo6ICQoUkNfU1JDUzoucmM9LmgpCiAKIEBNQUtFX1JVTEVTQAogCi0jIFJ1bGVzIGZvciB1c2luZyBvbGQgcmVzb3VyY2UgY29tcGlsZXIKLS5yYy5jOgotCWVjaG8gIiNpbmNsdWRlIFwid2luZG93cy5oXCIiID4kKi10bXAuYwotCWVjaG8gV0lORE9XU19IX0VORFNfSEVSRSA+PiQqLXRtcC5jCi0JY2F0ICQ8ID4+JCotdG1wLmMKLQkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QICQqLXRtcC5jIHwgc2VkIC1lICcxLC9eV0lORE9XU19IX0VORFNfSEVSRS9kJyB8ICQoV0lORVJDKSAkKFJDRkxBR1MpIC1jIC1vICQqIC1wICQqCi0JJChSTSkgJCotdG1wLmMKKyMgT3ZlcnJpZGUgcmVzb3VyY2UgY29tcGlsZXIgcnVsZXMKKy5yYy5zOgorCSQoQ1BQKSAkKERFRlMpICQoT1BUSU9OUykgJChESVZJTkNMKSAtRFJDX0lOVk9LRUQgLVAgLXggYyAkPCB8ICQoV1JDKSAkKFdSQ0ZMQUdTKSAkKFdSQ0VYVFJBKSAtbyAkKi5zCisKIC5yYy5oOgotCWVjaG8gIiNpbmNsdWRlIFwid2luZG93cy5oXCIiID4kKi10bXAuYwotCWVjaG8gV0lORE9XU19IX0VORFNfSEVSRSA+PiQqLXRtcC5jCi0JY2F0ICQ8ID4+JCotdG1wLmMKLQkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QICQqLXRtcC5jIHwgc2VkIC1lICcxLC9eV0lORE9XU19IX0VORFNfSEVSRS9kJyB8ICQoV0lORVJDKSAkKFJDRkxBR1MpIC1jIC1vICQqIC1wICQqCi0JJChSTSkgJCotdG1wLmMKLWNsZWFuOjoKLQkkKFJNKSAkKFJDX1NSQ1M6LnJjPS5jKQorCSQoQ1BQKSAkKERFRlMpICQoT1BUSU9OUykgJChESVZJTkNMKSAtRFJDX0lOVk9LRUQgLVAgLXggYyAkPCB8ICQoV1JDKSAkKFdSQ0ZMQUdTKSAkKFdSQ0VYVFJBKSAtbkggJCouaAogCiAKIHByb2dtYW46ICQoTU9TVE9CSlMpICQoU1RSSU5HT0JKUykKQEAgLTYyLDcgKzU0LDcgQEAKIGluc3RhbGw6IGR1bW15CiAJJChJTlNUQUxMX1BST0dSQU0pIHByb2dtYW4gJChiaW5kaXIpL3Byb2dtYW4KIAotJChSQ19TUkNTOi5yYz0uYykgJChSQ19TUkNTOi5yYz0uaCk6ICQoV0lORVJDKQorJChSQ19TUkNTOi5yYz0ucyk6ICQoV1JDKQogCiBkdW1teToKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9YeC5yYyBiL3Byb2dyYW1zL3Byb2dtYW4vWHgucmMKaW5kZXggZTA4YjA5ZS4uNmY1YTk2YSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcHJvZ21hbi9YeC5yYworKysgYi9wcm9ncmFtcy9wcm9nbWFuL1h4LnJjCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogICovCiAKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAicHJvZ21hbi5oIgogCiAjZGVmaW5lIENPTkNBVChhLCBiKSBDT05DQVQxKGEsIGIpCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL2FjY2VsLnJjIGIvcHJvZ3JhbXMvcHJvZ21hbi9hY2NlbC5yYwppbmRleCAzNDA5NjgyLi4xMWYwMjA4IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL2FjY2VsLnJjCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vYWNjZWwucmMKQEAgLTEsMyArMSw0IEBACisjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInByb2dtYW4uaCIKIAogQUNDRUwgQUNDRUxFUkFUT1JTCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9yZWd0ZXN0L01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvcmVndGVzdC9NYWtlZmlsZS5pbgppbmRleCAwNzQ5YzhjLi45ODY4M2Q0IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9yZWd0ZXN0L01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL3JlZ3Rlc3QvTWFrZWZpbGUuaW4KQEAgLTcsNiArNyw3IEBACiBQUk9HUkFNUyAgPSByZWd0ZXN0CiBBTExfTElCUyAgPSAkKFdJTkVMSUIpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMSUJTKQogUkNGTEFHUyAgID0gLXczMiAtaAorV1JDRVhUUkEgID0gLUEgLXAgJCoKIAogQ19TUkNTID0gcmVndGVzdC5jCiAKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3JlZ3Rlc3QvcmVndGVzdC5jIGIvcHJvZ3JhbXMvcmVndGVzdC9yZWd0ZXN0LmMKaW5kZXggZDAzOGNiYi4uMTYxNTQ4YiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcmVndGVzdC9yZWd0ZXN0LmMKKysrIGIvcHJvZ3JhbXMvcmVndGVzdC9yZWd0ZXN0LmMKQEAgLTkwLDggKzkwLDEwIEBACiAgICAgbFN0cyA9IFJlZ0NyZWF0ZUtleShIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcYXNkZiIsJmhrZXkpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX0JBRF9QQVRITkFNRSkgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7CiAKKyNpZiAwCiAgICAgbFN0cyA9IFJlZ0NyZWF0ZUtleShIS0VZX0xPQ0FMX01BQ0hJTkUsImFzZGZcXCIsJmhrZXkpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiA0OiVsZFxuIixsU3RzKTsKKyNlbmRpZgogCiAgICAgbFN0cyA9IFJlZ0NyZWF0ZUtleShIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcYXNkZlxcIiwmaGtleSk7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfQkFEX1BBVEhOQU1FKSBmcHJpbnRmKHN0ZGVyciwgIiA1OiVsZFxuIixsU3RzKTsKQEAgLTM0Nyw3ICszNDksNyBAQAogICAgIEhLRVkgaGtleTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnT3BlbktleS4uLlxuIik7CiAKLSAgICBsU3RzID0gUmVnT3BlbktleSgoSEtFWSkyLCAiIiwmaGtleSk7CisgICAgbFN0cyA9IFJlZ09wZW5LZXkoKEhLRVkpNzIsICIiLCZoa2V5KTsKICAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKICAgICBSZWdDbG9zZUtleShoa2V5KTsKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvdmlldy9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3ZpZXcvTWFrZWZpbGUuaW4KaW5kZXggZGY4OTFhZC4uMGFlYTdmNiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvdmlldy9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy92aWV3L01ha2VmaWxlLmluCkBAIC03LDYgKzcsNyBAQAogUFJPR1JBTVMgID0gdmlldwogQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKIFJDRkxBR1MgICA9IC13MzIgLWgKK1dSQ0VYVFJBICA9IC1BIC1wICQqCiAKIENfU1JDUyA9IFwKIAlpbml0LmMgXApAQCAtMTYsMjcgKzE3LDE4IEBACiBSQ19TUkNTID0gXAogCXZpZXdyYy5yYwogCi1hbGw6IGNoZWNrX3dpbmVyYyAkKFBST0dSQU1TKQorYWxsOiBjaGVja193cmMgJChQUk9HUkFNUykKIAogZGVwZW5kOjogJChSQ19TUkNTOi5yYz0uaCkKIAogQE1BS0VfUlVMRVNACiAKLSMgUnVsZXMgZm9yIHVzaW5nIG9sZCByZXNvdXJjZSBjb21waWxlcgotLnJjLmM6Ci0JZWNobyAiI2luY2x1ZGUgXCJ3aW5kb3dzLmhcIiIgPiQqLXRtcC5jCi0JZWNobyBXSU5ET1dTX0hfRU5EU19IRVJFID4+JCotdG1wLmMKLQljYXQgJDwgPj4kKi10bXAuYwotCSQoQ1BQKSAkKERFRlMpICQoT1BUSU9OUykgJChESVZJTkNMKSAtRFJDX0lOVk9LRUQgLVAgJCotdG1wLmMgfCBzZWQgLWUgJzEsL15XSU5ET1dTX0hfRU5EU19IRVJFL2QnIHwgJChXSU5FUkMpICQoUkNGTEFHUykgLWMgLW8gJCogLXAgJCoKLQkkKFJNKSAkKi10bXAuYworIyBPdmVycmlkZSByZXNvdXJjZSBjb21waWxlciBydWxlcworLnJjLnM6CisJJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAteCBjICQ8IHwgJChXUkMpICQoV1JDRkxBR1MpICQoV1JDRVhUUkEpIC1vICQqLnMKKwogLnJjLmg6Ci0JZWNobyAiI2luY2x1ZGUgXCJ3aW5kb3dzLmhcIiIgPiQqLXRtcC5jCi0JZWNobyBXSU5ET1dTX0hfRU5EU19IRVJFID4+JCotdG1wLmMKLQljYXQgJDwgPj4kKi10bXAuYwotCSQoQ1BQKSAkKERFRlMpICQoT1BUSU9OUykgJChESVZJTkNMKSAtRFJDX0lOVk9LRUQgLVAgJCotdG1wLmMgfCBzZWQgLWUgJzEsL15XSU5ET1dTX0hfRU5EU19IRVJFL2QnIHwgJChXSU5FUkMpICQoUkNGTEFHUykgLWMgLW8gJCogLXAgJCoKLQkkKFJNKSAkKi10bXAuYwotY2xlYW46OgotCSQoUk0pICQoUkNfU1JDUzoucmM9LmMpCisJJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAteCBjICQ8IHwgJChXUkMpICQoV1JDRkxBR1MpICQoV1JDRVhUUkEpIC1uSCAkKi5oCiAKIAogdmlldzogJChPQkpTKQpAQCAtNDUsNyArMzcsNyBAQAogaW5zdGFsbDogZHVtbXkKIAkkKElOU1RBTExfUFJPR1JBTSkgdmlldyAkKGJpbmRpcikvdmlldwogCi0kKFJDX1NSQ1M6LnJjPS5jKSAkKFJDX1NSQ1M6LnJjPS5oKTogJChXSU5FUkMpCiskKFJDX1NSQ1M6LnJjPS5zKTogJChXUkMpCiAKIGR1bW15OgogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L3ZpZXdyYy5yYyBiL3Byb2dyYW1zL3ZpZXcvdmlld3JjLnJjCmluZGV4IGMzZWI0MDAuLmQ5NzgyYTQgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3ZpZXcvdmlld3JjLnJjCisrKyBiL3Byb2dyYW1zL3ZpZXcvdmlld3JjLnJjCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJyZXNvdXJjZS5oIgogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4KaW5kZXggMmI3MTI0OWMuLjc2YzQwZjAgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbgpAQCAtNyw2ICs3LDcgQEAKIFBST0dSQU1TICA9IHdpbmhlbHAgaGxwMnNnbWwKIEFMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExJQlMpCiBSQ0ZMQUdTICAgPSAtdzMyIC1oCitXUkNFWFRSQSAgPSAtQSAtcCAkKgogCiBMQU5HVUFHRVMgICA9IEVuIERhIERlIEZyIEZpIEtvIEh1IEl0IFZhIFN3CiAKQEAgLTI4LDI3ICsyOSwxOCBAQAogTU9TVE9CSlMgPSAkKE1PU1RTUkNTOi5jPS5vKSAkKEVYVFJBX09CSlMpCiBTVFJJTkdPQkpTID0gJChTVFJJTkdTUkNTOi5jPS5vKSAkKFJDX1NSQ1M6LnJjPS5vKQogCi1hbGw6IGNoZWNrX3dpbmVyYyAkKFBST0dSQU1TKQorYWxsOiBjaGVja193cmMgJChQUk9HUkFNUykKIAogZGVwZW5kOjogJChSQ19TUkNTOi5yYz0uaCkgeS50YWIuaAogCiBATUFLRV9SVUxFU0AKIAotIyBSdWxlcyBmb3IgdXNpbmcgb2xkIHJlc291cmNlIGNvbXBpbGVyCi0ucmMuYzoKLQllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKLQllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj4kKi10bXAuYwotCWNhdCAkPCA+PiQqLXRtcC5jCi0JJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgotCSQoUk0pICQqLXRtcC5jCisjIE92ZXJyaWRlIHJlc291cmNlIGNvbXBpbGVyIHJ1bGVzCisucmMuczoKKwkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QIC14IGMgJDwgfCAkKFdSQykgJChXUkNGTEFHUykgJChXUkNFWFRSQSkgLW8gJCoucworCiAucmMuaDoKLQllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKLQllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj4kKi10bXAuYwotCWNhdCAkPCA+PiQqLXRtcC5jCi0JJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgotCSQoUk0pICQqLXRtcC5jCi1jbGVhbjo6Ci0JJChSTSkgJChSQ19TUkNTOi5yYz0uYykKKwkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QIC14IGMgJDwgfCAkKFdSQykgJChXUkNGTEFHUykgJChXUkNFWFRSQSkgLW5IICQqLmgKIAogIyBTb21lIHN0cmluZ3MgbmVlZCBhZGRyZXNzZXMgPj0gMHgxMDAwMAogd2luaGVscDogJChNT1NUT0JKUykgJChTVFJJTkdPQkpTKQpAQCAtNjcsNyArNTksNyBAQAogbGV4Lnl5LmM6IG1hY3JvLmxleC5sCiAJJChMRVgpIC04IC1pICQoU1JDRElSKS9tYWNyby5sZXgubAogCi0kKFJDX1NSQ1M6LnJjPS5jKSAkKFJDX1NSQ1M6LnJjPS5oKTogJChXSU5FUkMpCiskKFJDX1NSQ1M6LnJjPS5zKTogJChXUkMpCiAKIGR1bW15OgogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5oZWxwL1h4LnJjIGIvcHJvZ3JhbXMvd2luaGVscC9YeC5yYwppbmRleCBkMmU3MTNiLi5jZmUwYjgyIDEwMDY0NAotLS0gYS9wcm9ncmFtcy93aW5oZWxwL1h4LnJjCisrKyBiL3Byb2dyYW1zL3dpbmhlbHAvWHgucmMKQEAgLTQsNiArNCw3IEBACiAgKiBDb3B5cmlnaHQgMTk5NiBVbHJpY2ggU2NobWlkCiAgKi8KIAorI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5oZWxwLmgiCiAKICNkZWZpbmUgQ09OQ0FUKGEsIGIpIENPTkNBVDEoYSwgYikKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbnZlci9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3dpbnZlci9NYWtlZmlsZS5pbgppbmRleCBhNDRjYTg0Li5lZDU5MTFiIDEwMDY0NAotLS0gYS9wcm9ncmFtcy93aW52ZXIvTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvd2ludmVyL01ha2VmaWxlLmluCkBAIC03LDEwICs3LDExIEBACiBQUk9HUkFNUyAgPSB3aW52ZXIKIEFMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExJQlMpCiBSQ0ZMQUdTICAgPSAtdzMyIC1oCitXUkNFWFRSQSAgPSAtQSAtcCAkKgogCiBDX1NSQ1MgPSB3aW52ZXIuYwogCi1hbGw6IGNoZWNrX3dpbmVyYyAkKFBST0dSQU1TKQorYWxsOiBjaGVja193cmMgJChQUk9HUkFNUykKIAogQE1BS0VfUlVMRVNACiAKZGlmZiAtLWdpdCBhL3JlbGF5MzIvTWFrZWZpbGUuaW4gYi9yZWxheTMyL01ha2VmaWxlLmluCmluZGV4IDk1ZmExNmMuLmE4YWE1NWIgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvTWFrZWZpbGUuaW4KKysrIGIvcmVsYXkzMi9NYWtlZmlsZS5pbgpAQCAtMzksNyArMzksOCBAQAogCiBDX1NSQ1MgPSBcCiAJYnVpbHRpbjMyLmMgXAotCXJlbGF5Mzg2LmMKKwlyZWxheTM4Ni5jIFwKKwlzbm9vcC5jCiAKIFNQRUNfRklMRVMgPSAkKERMTFM6LnNwZWM9LmMpCiAKZGlmZiAtLWdpdCBhL3JlbGF5MzIvYWR2YXBpMzIuc3BlYyBiL3JlbGF5MzIvYWR2YXBpMzIuc3BlYwppbmRleCBiM2ZjYzBkLi4yYzk1OTAyIDEwMDY0NAotLS0gYS9yZWxheTMyL2FkdmFwaTMyLnNwZWMKKysrIGIvcmVsYXkzMi9hZHZhcGkzMi5zcGVjCkBAIC00Niw4ICs0Niw4IEBACiAwMDQyIHN0ZGNhbGwgRnJlZVNpZChwdHIpIEZyZWVTaWQKIDAwNDMgc3R1YiBHZXRBY2UKIDAwNDQgc3R1YiBHZXRBY2xJbmZvcm1hdGlvbgotMDA0NSBzdHViIEdldEZpbGVTZWN1cml0eUEKLTAwNDYgc3R1YiBHZXRGaWxlU2VjdXJpdHlXCiswMDQ1IHN0ZGNhbGwgR2V0RmlsZVNlY3VyaXR5QShzdHIgbG9uZyBwdHIgbG9uZyBwdHIpIEdldEZpbGVTZWN1cml0eTMyQQorMDA0NiBzdGRjYWxsIEdldEZpbGVTZWN1cml0eVcod3N0ciBsb25nIHB0ciBsb25nIHB0cikgR2V0RmlsZVNlY3VyaXR5MzJXCiAwMDQ3IHN0dWIgR2V0S2VybmVsT2JqZWN0U2VjdXJpdHkKIDAwNDggc3RkY2FsbCBHZXRMZW5ndGhTaWQocHRyKSBHZXRMZW5ndGhTaWQKIDAwNDkgc3R1YiBHZXROdW1iZXJPZkV2ZW50TG9nUmVjb3JkcwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9idWlsdGluMzIuYyBiL3JlbGF5MzIvYnVpbHRpbjMyLmMKaW5kZXggM2UyMzhjYS4uYWZhYzk5MyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9idWlsdGluMzIuYworKysgYi9yZWxheTMyL2J1aWx0aW4zMi5jCkBAIC0yOTksOCArMjk5LDExIEBACiAgICAgZm9yICh0YWJsZSA9IEJ1aWx0aW5ETExzOyB0YWJsZS0+ZGVzY3I7IHRhYmxlKyspCiAgICAgICAgIGlmICghbHN0cmNtcGkzMkEoIHRhYmxlLT5kZXNjci0+bmFtZSwgZGxsbmFtZSApKSBicmVhazsKICAgICBpZiAoIXRhYmxlLT5kZXNjcikgcmV0dXJuIDA7Ci0gICAgaWYgKCF0YWJsZS0+dXNlZCAmJiAhZm9yY2UpIHJldHVybiAwOwotCisgICAgaWYgKCF0YWJsZS0+dXNlZCkKKyAgICB7CisgICAgICAgIGlmICghZm9yY2UpIHJldHVybiAwOworICAgICAgICB0YWJsZS0+dXNlZCA9IFRSVUU7ICAvKiBTbyBuZXh0IHRpbWUgd2UgdXNlIGl0IGF0IG9uY2UgKi8KKyAgICB9CiAgICAgcmV0dXJuIEJVSUxUSU4zMl9Eb0xvYWRNb2R1bGUoIHRhYmxlLCBwcm9jZXNzICk7CiB9CiAKQEAgLTMzOSw3ICszNDIsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgCi0gICAgYXNzZXJ0KGRsbC0+ZGVzY3IpOworICAgIGlmICghZGxsLT5kZXNjcikKKyAgICAJcmV0dXJuIChFTlRSWVBPSU5UMzIpTlVMTDsKIAogICAgIC8qIE5vdyBmaW5kIHRoZSBmdW5jdGlvbiAqLwogCmRpZmYgLS1naXQgYS9yZWxheTMyL2NvbWN0bDMyLnNwZWMgYi9yZWxheTMyL2NvbWN0bDMyLnNwZWMKaW5kZXggYTQ5M2RjZi4uY2Q1ODcxYyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9jb21jdGwzMi5zcGVjCisrKyBiL3JlbGF5MzIvY29tY3RsMzIuc3BlYwpAQCAtOCw5ICs4LDkgQEAKIAogICAyIHN0ZGNhbGwgTWVudUhlbHAobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBNZW51SGVscAogICAzIHN0dWIgU2hvd0hpZGVNZW51Q3RsCi0gIDQgc3R1YiBHZXRFZmZlY3RpdmVDbGllbnRSZWN0Ci0gIDUgc3RkY2FsbCBEcmF3U3RhdHVzVGV4dEEobG9uZyBwdHIgcHRyIGxvbmcpIERyYXdTdGF0dXNUZXh0MzJBCi0gIDYgc3RkY2FsbCBDcmVhdGVTdGF0dXNXaW5kb3dBKGxvbmcgcHRyIGxvbmcgbG9uZykgQ3JlYXRlU3RhdHVzV2luZG93MzJBCisgIDQgc3RkY2FsbCBHZXRFZmZlY3RpdmVDbGllbnRSZWN0KGxvbmcgbG9uZyBsb25nKSBHZXRFZmZlY3RpdmVDbGllbnRSZWN0CisgIDUgc3RkY2FsbCBEcmF3U3RhdHVzVGV4dEEobG9uZyBwdHIgc3RyIGxvbmcpIERyYXdTdGF0dXNUZXh0MzJBCisgIDYgc3RkY2FsbCBDcmVhdGVTdGF0dXNXaW5kb3dBKGxvbmcgc3RyIGxvbmcgbG9uZykgQ3JlYXRlU3RhdHVzV2luZG93MzJBCiAgIDcgc3RkY2FsbCBDcmVhdGVUb29sYmFyKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIHB0ciBsb25nKSBDcmVhdGVUb29sYmFyCiAgIDggc3RkY2FsbCBDcmVhdGVNYXBwZWRCaXRtYXAobG9uZyBsb25nIGxvbmcgcHRyIGxvbmcpIENyZWF0ZU1hcHBlZEJpdG1hcAogICA5IHN0dWIgQ09NQ1RMMzJfOQpAQCAtMjUsMTQgKzI1LDE0IEBACiAgMTggc3R1YiBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZQogIDE5IHN0dWIgQ3JlYXRlUHJvcGVydHlTaGVldFBhZ2VBCiAgMjAgc3R1YiBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZVcKLSAyMSBzdGRjYWxsIENyZWF0ZVN0YXR1c1dpbmRvdyhsb25nIHB0ciBsb25nIGxvbmcpIENyZWF0ZVN0YXR1c1dpbmRvdzMyQQotIDIyIHN0ZGNhbGwgQ3JlYXRlU3RhdHVzV2luZG93Vyhsb25nIHB0ciBsb25nIGxvbmcpIENyZWF0ZVN0YXR1c1dpbmRvdzMyVworIDIxIHN0ZGNhbGwgQ3JlYXRlU3RhdHVzV2luZG93KGxvbmcgc3RyIGxvbmcgbG9uZykgQ3JlYXRlU3RhdHVzV2luZG93MzJBCisgMjIgc3RkY2FsbCBDcmVhdGVTdGF0dXNXaW5kb3dXKGxvbmcgd3N0ciBsb25nIGxvbmcpIENyZWF0ZVN0YXR1c1dpbmRvdzMyVwogIDIzIHN0ZGNhbGwgQ3JlYXRlVG9vbGJhckV4KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgQ3JlYXRlVG9vbGJhckV4CiAgMjQgc3R1YiBEZXN0cm95UHJvcGVydHlTaGVldFBhZ2UKLSAyNSBzdHViIERsbEdldFZlcnNpb24KKyAyNSBzdGRjYWxsIERsbEdldFZlcnNpb24ocHRyKSBDT01DVEwzMl9EbGxHZXRWZXJzaW9uCiAgMjYgc3R1YiBEbGxJbnN0YWxsCi0gMjcgc3RkY2FsbCBEcmF3U3RhdHVzVGV4dChsb25nIHB0ciBwdHIgbG9uZykgRHJhd1N0YXR1c1RleHQzMkEKLSAyOCBzdGRjYWxsIERyYXdTdGF0dXNUZXh0Vyhsb25nIHB0ciBwdHIgbG9uZykgRHJhd1N0YXR1c1RleHQzMlcKKyAyNyBzdGRjYWxsIERyYXdTdGF0dXNUZXh0KGxvbmcgcHRyIHN0ciBsb25nKSBEcmF3U3RhdHVzVGV4dDMyQQorIDI4IHN0ZGNhbGwgRHJhd1N0YXR1c1RleHRXKGxvbmcgcHRyIHdzdHIgbG9uZykgRHJhd1N0YXR1c1RleHQzMlcKICAyOSBzdHViIEZsYXRTQl9FbmFibGVTY3JvbGxCYXIKICAzMCBzdHViIEZsYXRTQl9HZXRTY3JvbGxJbmZvCiAgMzEgc3R1YiBGbGF0U0JfR2V0U2Nyb2xsUG9zCkBAIC02NiwxOCArNjYsMTggQEAKICA1OSBzdGRjYWxsIEltYWdlTGlzdF9HZXRJbWFnZUNvdW50KHB0cikgSW1hZ2VMaXN0X0dldEltYWdlQ291bnQKICA2MCBzdGRjYWxsIEltYWdlTGlzdF9HZXRJbWFnZUluZm8ocHRyIGxvbmcgcHRyKSBJbWFnZUxpc3RfR2V0SW1hZ2VJbmZvCiAgNjEgc3RkY2FsbCBJbWFnZUxpc3RfR2V0SW1hZ2VSZWN0KHB0ciBsb25nIHB0cikgSW1hZ2VMaXN0X0dldEltYWdlUmVjdAotIDYzIHN0ZGNhbGwgSW1hZ2VMaXN0X0xvYWRJbWFnZShsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMkEKLSA2MyBzdGRjYWxsIEltYWdlTGlzdF9Mb2FkSW1hZ2VBKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0xvYWRJbWFnZTMyQQotIDY0IHN0ZGNhbGwgSW1hZ2VMaXN0X0xvYWRJbWFnZVcobG9uZyBwdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfTG9hZEltYWdlMzJXCisgNjMgc3RkY2FsbCBJbWFnZUxpc3RfTG9hZEltYWdlKGxvbmcgc3RyIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0xvYWRJbWFnZTMyQQorIDYzIHN0ZGNhbGwgSW1hZ2VMaXN0X0xvYWRJbWFnZUEobG9uZyBzdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfTG9hZEltYWdlMzJBCisgNjQgc3RkY2FsbCBJbWFnZUxpc3RfTG9hZEltYWdlVyhsb25nIHdzdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfTG9hZEltYWdlMzJXCiAgNjUgc3RkY2FsbCBJbWFnZUxpc3RfTWVyZ2UocHRyIGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfTWVyZ2UKICA2NiBzdGRjYWxsIEltYWdlTGlzdF9SZWFkKHB0cikgSW1hZ2VMaXN0X1JlYWQKICA2NyBzdGRjYWxsIEltYWdlTGlzdF9SZW1vdmUocHRyIGxvbmcpIEltYWdlTGlzdF9SZW1vdmUKICA2OCBzdGRjYWxsIEltYWdlTGlzdF9SZXBsYWNlKHB0ciBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1JlcGxhY2UKICA2OSBzdGRjYWxsIEltYWdlTGlzdF9SZXBsYWNlSWNvbihwdHIgbG9uZyBsb25nKSBJbWFnZUxpc3RfUmVwbGFjZUljb24KICA3MCBzdGRjYWxsIEltYWdlTGlzdF9TZXRCa0NvbG9yKHB0ciBsb25nKSBJbWFnZUxpc3RfU2V0QmtDb2xvcgotIDcxIHN0dWIgQWxsb2MKLSA3MiBzdHViIFJlQWxsb2MKLSA3MyBzdHViIEZyZWUKKyA3MSBzdGRjYWxsIEFsbG9jKGxvbmcpIEFsbG9jCisgNzIgc3RkY2FsbCBSZUFsbG9jKGxvbmcgbG9uZykgUmVBbGxvYworIDczIHN0ZGNhbGwgRnJlZShsb25nKSBGcmVlCiAgNzQgc3R1YiBHZXRTaXplCiAgNzUgc3RkY2FsbCBJbWFnZUxpc3RfU2V0RHJhZ0N1cnNvckltYWdlKHB0ciBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1NldERyYWdDdXJzb3JJbWFnZQogIDc2IHN0dWIgSW1hZ2VMaXN0X1NldEZpbHRlcgpAQCAtMTEyLDIyICsxMTIsMjIgQEAKIDIzNSBzdHViIFN0cl9HZXRQdHJXCiAyMzYgc3R1YiBTdHJfU2V0UHRyVwogCi0zMjAgc3R1YiBEU0FfQ3JlYXRlCi0zMjEgc3R1YiBEU0FfRGVzdHJveQorMzIwIHN0ZGNhbGwgRFNBX0NyZWF0ZShsb25nIGxvbmcpIERTQV9DcmVhdGUKKzMyMSBzdGRjYWxsIERTQV9EZXN0cm95KGxvbmcpIERTQV9EZXN0cm95CiAzMjIgc3R1YiBEU0FfR2V0SXRlbQotMzIzIHN0dWIgRFNBX0dldEl0ZW1QdHIKLTMyNCBzdHViIERTQV9JbnNlcnRJdGVtCiszMjMgc3RkY2FsbCBEU0FfR2V0SXRlbVB0cihsb25nIGxvbmcpIERTQV9HZXRJdGVtUHRyCiszMjQgc3RkY2FsbCBEU0FfSW5zZXJ0SXRlbShsb25nIGxvbmcgbG9uZykgRFNBX0luc2VydEl0ZW0KIDMyNSBzdHViIERTQV9TZXRJdGVtCi0zMjYgc3R1YiBEU0FfRGVsZXRlSXRlbQorMzI2IHN0ZGNhbGwgRFNBX0RlbGV0ZUl0ZW0obG9uZyBsb25nKSBEU0FfRGVsZXRlSXRlbQogMzI3IHN0dWIgRFNBX0RlbGV0ZUFsbEl0ZW1zCiAKLTMyOCBzdHViIERQQV9DcmVhdGUKKzMyOCBzdGRjYWxsIERQQV9DcmVhdGUobG9uZykgRFBBX0NyZWF0ZQogMzI5IHN0dWIgRFBBX0Rlc3Ryb3kKIDMzMCBzdHViIERQQV9Hcm93CiAzMzEgc3R1YiBEUEFfQ2xvbmUKLTMzMiBzdHViIERQQV9HZXRQdHIKKzMzMiBzdGRjYWxsIERQQV9HZXRQdHIobG9uZyBsb25nKSBEUEFfR2V0UHRyCiAzMzMgc3R1YiBEUEFfR2V0UHRySW5kZXgKLTMzNCBzdHViIERQQV9JbnNlcnRQdHIKKzMzNCBzdGRjYWxsIERQQV9JbnNlcnRQdHIobG9uZyBsb25nIGxvbmcpIERQQV9JbnNlcnRQdHIKIDMzNSBzdHViIERQQV9TZXRQdHIKIDMzNiBzdHViIERQQV9EZWxldGVQdHIKIDMzNyBzdHViIERQQV9EZWxldGVBbGxQdHJzCkBAIC0xMzcsNyArMTM3LDcgQEAKIDM0MSBzdHViIFNlbmROb3RpZnkKIDM0MiBzdHViIFNlbmROb3RpZnlFeAogCi0zNTAgc3R1YiBTdHJDaHJBCiszNTAgc3RkY2FsbCBTdHJDaHJBKGxvbmcgbG9uZykgQ09NQ1RMMzJfU3RyQ2hyQQogMzUxIHN0dWIgU3RyUkNocgogMzUyIHN0dWIgU3RyQ21wTkEKIDM1MyBzdHViIFN0ckNtcE5JQQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9jb21kbGczMi5zcGVjIGIvcmVsYXkzMi9jb21kbGczMi5zcGVjCmluZGV4IGYzYzYyMjMuLmM5MDA2Y2UgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvY29tZGxnMzIuc3BlYworKysgYi9yZWxheTMyL2NvbWRsZzMyLnNwZWMKQEAgLTE2LDcgKzE2LDcgQEAKIDEyIHN0ZGNhbGwgR2V0U2F2ZUZpbGVOYW1lQShwdHIpIEdldFNhdmVGaWxlTmFtZTMyQQogMTMgc3RkY2FsbCBHZXRTYXZlRmlsZU5hbWVXKHB0cikgR2V0U2F2ZUZpbGVOYW1lMzJBCiAxNCBzdHViIExvYWRBbHRlckJpdG1hcAotMTUgc3R1YiBQYWdlU2V0dXBEbGdBCisxNSBzdGRjYWxsIFBhZ2VTZXR1cERsZ0EocHRyKSBQYWdlU2V0dXBEbGczMkEKIDE2IHN0dWIgUGFnZVNldHVwRGxnVwogMTcgc3RkY2FsbCBQcmludERsZ0EocHRyKSBQcmludERsZzMyQQogMTggc3RkY2FsbCBQcmludERsZ1cocHRyKSBQcmludERsZzMyVwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9jcnRkbGwuc3BlYyBiL3JlbGF5MzIvY3J0ZGxsLnNwZWMKaW5kZXggNTI1OWU1My4uOTVhNTU1NSAxMDA2NDQKLS0tIGEvcmVsYXkzMi9jcnRkbGwuc3BlYworKysgYi9yZWxheTMyL2NydGRsbC5zcGVjCkBAIC0yMzQsNyArMjM0LDcgQEAKIDIzMCBzdHViIF9tYnN0cmxlbgogMjMxIHN0dWIgX21ic3VwcgogMjMyIHN0dWIgX21lbWNjcHkKLTIzMyBzdHViIF9tZW1pY21wCisyMzMgY2RlY2wgX21lbWljbXAoc3RyIHN0ciBsb25nKSBDUlRETExfX21lbWljbXAKIDIzNCBjZGVjbCBfbWtkaXIoc3RyKSBDUlRETExfX21rZGlyCiAyMzUgc3R1YiBfbWt0ZW1wCiAyMzYgc3R1YiBfbXNpemUKQEAgLTMyMSw3ICszMjEsNyBAQAogMzE3IHN0dWIgX3V0aW1lCiAzMTggc3R1YiBfdnNucHJpbnRmCiAzMTkgc3R1YiBfdnNud3ByaW50ZgotMzIwIHN0dWIgX3djc2R1cAorMzIwIGNkZWNsIF93Y3NkdXAod3N0cikgQ1JURExMX193Y3NkdXAKIDMyMSBjZGVjbCBfd2NzaWNtcCh3c3RyIHdzdHIpIENSVERMTF9fd2NzaWNtcAogMzIyIGNkZWNsIF93Y3NpY29sbCh3c3RyIHdzdHIpIENSVERMTF9fd2NzaWNvbGwKIDMyMyBjZGVjbCBfd2NzbHdyKHdzdHIpIENSVERMTF9fd2NzbHdyCmRpZmYgLS1naXQgYS9yZWxheTMyL2tlcm5lbDMyLnNwZWMgYi9yZWxheTMyL2tlcm5lbDMyLnNwZWMKaW5kZXggNDJlMGFmNy4uZTQwMzQ1MSAxMDA2NDQKLS0tIGEvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCisrKyBiL3JlbGF5MzIva2VybmVsMzIuc3BlYwpAQCAtODcsOSArODcsOSBAQAogIDczIHN0dWIgSzMyUnRsRW5sYXJnZWRJbnRlZ2VyTXVsdGlwbHkKICA3NCBzdHViIEszMlJ0bEVubGFyZ2VkVW5zaWduZWRNdWx0aXBseQogIDc1IHN0dWIgSzMyUnRsRW5sYXJnZWRVbnNpZ25lZERpdmlkZQotIDc2IHN0dWIgSzMyUnRsRXh0ZW5kZWRMYXJnZUludGVnZXJEaXZpZGUKKyA3NiBzdGRjYWxsIEszMlJ0bEV4dGVuZGVkTGFyZ2VJbnRlZ2VyRGl2aWRlKGxvbmcgbG9uZyBsb25nIHB0cikgUnRsRXh0ZW5kZWRMYXJnZUludGVnZXJEaXZpZGUKICA3NyBzdHViIEszMlJ0bEV4dGVuZGVkTWFnaWNEaXZpZGUKLSA3OCBzdHViIEszMlJ0bEV4dGVuZGVkSW50ZWdlck11bHRpcGx5CisgNzggc3RkY2FsbCBLMzJSdGxFeHRlbmRlZEludGVnZXJNdWx0aXBseShsb25nIGxvbmcgbG9uZykgUnRsRXh0ZW5kZWRJbnRlZ2VyTXVsdGlwbHkKICA3OSBzdHViIEszMlJ0bExhcmdlSW50ZWdlclNoaWZ0TGVmdAogIDgwIHN0dWIgSzMyUnRsTGFyZ2VJbnRlZ2VyU2hpZnRSaWdodAogIDgxIHN0dWIgSzMyUnRsTGFyZ2VJbnRlZ2VyQXJpdGhtZXRpY1NoaWZ0CkBAIC0xODIsNyArMTgyLDcgQEAKIDE2NyBzdGRjYWxsIENyZWF0ZU11dGV4VyhwdHIgbG9uZyB3c3RyKSBDcmVhdGVNdXRleDMyVwogMTY4IHN0ZGNhbGwgQ3JlYXRlTmFtZWRQaXBlQShzdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBDcmVhdGVOYW1lZFBpcGVBCiAxNjkgc3RkY2FsbCBDcmVhdGVOYW1lZFBpcGVXKHdzdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBDcmVhdGVOYW1lZFBpcGVXCi0xNzAgc3R1YiBDcmVhdGVQaXBlCisxNzAgc3RkY2FsbCBDcmVhdGVQaXBlKHB0ciBwdHIgcHRyIGxvbmcpIENyZWF0ZVBpcGUKIDE3MSBzdGRjYWxsIENyZWF0ZVByb2Nlc3NBKHN0ciBzdHIgcHRyIHB0ciBsb25nIGxvbmcgcHRyIHN0ciBwdHIgcHRyKSBDcmVhdGVQcm9jZXNzMzJBCiAxNzIgc3RkY2FsbCBDcmVhdGVQcm9jZXNzVyh3c3RyIHdzdHIgcHRyIHB0ciBsb25nIGxvbmcgcHRyIHdzdHIgcHRyIHB0cikgQ3JlYXRlUHJvY2VzczMyVwogMTczIHN0dWIgQ3JlYXRlUmVtb3RlVGhyZWFkCkBAIC0yNjMsNyArMjYzLDcgQEAKIDI0NyBzdGRjYWxsIEZpbmRDbG9zZUNoYW5nZU5vdGlmaWNhdGlvbihsb25nKSBGaW5kQ2xvc2VDaGFuZ2VOb3RpZmljYXRpb24KIDI0NiBzdGRjYWxsIEZpbmRDbG9zZShsb25nKSBGaW5kQ2xvc2UzMgogMjQ4IHN0ZGNhbGwgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uQShzdHIgbG9uZyBsb25nKSBGaW5kRmlyc3RDaGFuZ2VOb3RpZmljYXRpb24zMkEKLTI0OSBzdHViIEZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvblcKKzI0OSBzdGRjYWxsIEZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvblcod3N0ciBsb25nIGxvbmcpIEZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvbjMyVwogMjUwIHN0ZGNhbGwgRmluZEZpcnN0RmlsZUEoc3RyIHB0cikgRmluZEZpcnN0RmlsZTMyQQogMjUxIHN0ZGNhbGwgRmluZEZpcnN0RmlsZVcod3N0ciBwdHIpIEZpbmRGaXJzdEZpbGUzMlcKIDI1MiBzdGRjYWxsIEZpbmROZXh0Q2hhbmdlTm90aWZpY2F0aW9uKGxvbmcpIEZpbmROZXh0Q2hhbmdlTm90aWZpY2F0aW9uCkBAIC0zOTAsNyArMzkwLDcgQEAKIDM3MyBzdGRjYWxsIEdldFByb2Nlc3NBZmZpbml0eU1hc2sobG9uZyBwdHIgcHRyKSBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrCiAzNzQgc3RkY2FsbCBHZXRQcm9jZXNzRmxhZ3MobG9uZykgR2V0UHJvY2Vzc0ZsYWdzCiAzNzUgc3RkY2FsbCBHZXRQcm9jZXNzSGVhcCgpIEdldFByb2Nlc3NIZWFwCi0zNzYgc3R1YiBHZXRQcm9jZXNzSGVhcHMKKzM3NiBzdGRjYWxsIEdldFByb2Nlc3NIZWFwcyhsb25nIHB0cikgR2V0UHJvY2Vzc0hlYXBzCiAzNzcgc3R1YiBHZXRQcm9jZXNzU2h1dGRvd25QYXJhbWV0ZXJzCiAzNzggc3RkY2FsbCBHZXRQcm9jZXNzVGltZXMobG9uZyBwdHIgcHRyIHB0ciBwdHIpIEdldFByb2Nlc3NUaW1lcwogMzc5IHN0ZGNhbGwgR2V0UHJvY2Vzc1ZlcnNpb24obG9uZykgR2V0UHJvY2Vzc1ZlcnNpb24KQEAgLTg0MSw3ICs4NDEsNyBAQAogODI0IHN0dWIgSGVhcFN1bW1hcnkKIDgyNSBzdHViIEhlYXBVc2FnZQogODI2IHN0dWIgSW52YWxpZGF0ZUNvbnNvbGVESUJpdHMKLTgyNyBzdHViIElzRGVidWdnZXJQcmVzZW50Cis4Mjcgc3RkY2FsbCBJc0RlYnVnZ2VyUHJlc2VudCgpIElzRGVidWdnZXJQcmVzZW50CiA4Mjkgc3R1YiBPcGVuQ29uc29sZVcKIDgzMCBzdHViIFF1ZXJ5V2luMzFJbmlGaWxlc01hcHBlZFRvUmVnaXN0cnkKIDgzMSBzdHViIFJlZ2lzdGVyQ29uc29sZVZETQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9tcHIuc3BlYyBiL3JlbGF5MzIvbXByLnNwZWMKaW5kZXggYWEyNTE2YS4uYWE4M2MzOSAxMDA2NDQKLS0tIGEvcmVsYXkzMi9tcHIuc3BlYworKysgYi9yZWxheTMyL21wci5zcGVjCkBAIC03MSw4ICs3MSw4IEBACiAwMDY4IHN0dWIgV05ldEZvcm1hdE5ldHdvcmtOYW1lQQogMDA2OSBzdHViIFdOZXRGb3JtYXROZXR3b3JrTmFtZVcKIDAwNzAgc3RkY2FsbCBXTmV0R2V0Q2FjaGVkUGFzc3dvcmQocHRyIGxvbmcgcHRyIHB0ciBsb25nKSBXTmV0R2V0Q2FjaGVkUGFzc3dvcmQKLTAwNzEgc3RkY2FsbCBXTmV0R2V0Q29ubmVjdGlvbkEocHRyIHB0ciBwdHIpIFdOZXRHZXRDb25uZWN0aW9uMzJBCi0wMDcyIHN0dWIgV05ldEdldENvbm5lY3Rpb25XCiswMDcxIHN0ZGNhbGwgV05ldEdldENvbm5lY3Rpb25BKHN0ciBwdHIgcHRyKSBXTmV0R2V0Q29ubmVjdGlvbjMyQQorMDA3MiBzdGRjYWxsIFdOZXRHZXRDb25uZWN0aW9uVyh3c3RyIHB0ciBwdHIpIFdOZXRHZXRDb25uZWN0aW9uMzJXCiAwMDczIHN0dWIgV05ldEdldEhvbWVEaXJlY3RvcnlBCiAwMDc0IHN0dWIgV05ldEdldEhvbWVEaXJlY3RvcnlXCiAwMDc1IHN0dWIgV05ldEdldExhc3RFcnJvckEKZGlmZiAtLWdpdCBhL3JlbGF5MzIvbnRkbGwuc3BlYyBiL3JlbGF5MzIvbnRkbGwuc3BlYwppbmRleCBkOGFiYTNiLi4yZTRhN2VjIDEwMDY0NAotLS0gYS9yZWxheTMyL250ZGxsLnNwZWMKKysrIGIvcmVsYXkzMi9udGRsbC5zcGVjCkBAIC0xMDgsNyArMTA4LDcgQEAKIDEwNSBzdHViIE50Rmx1c2hWaXJ0dWFsTWVtb3J5CiAxMDYgc3R1YiBOdEZsdXNoV3JpdGVCdWZmZXIKIDEwNyBzdHViIE50RnJlZVZpcnR1YWxNZW1vcnkKLTEwOCBzdHViIE50RnNDb250cm9sRmlsZQorMTA4IHN0ZGNhbGwgTnRGc0NvbnRyb2xGaWxlKCkgTnRGc0NvbnRyb2xGaWxlCiAxMDkgc3R1YiBOdEdldENvbnRleHRUaHJlYWQKIDExMCBzdHViIE50R2V0UGx1Z1BsYXlFdmVudAogMTExIHN0dWIgTnRHZXRUaWNrQ291bnQKQEAgLTE0OSw3ICsxNDksNyBAQAogMTQ2IHN0dWIgTnRRdWVyeUF0dHJpYnV0ZXNGaWxlCiAxNDcgc3R1YiBOdFF1ZXJ5RGVmYXVsdExvY2FsZQogMTQ4IHN0dWIgTnRRdWVyeURpcmVjdG9yeUZpbGUKLTE0OSBzdGRjYWxsIE50UXVlcnlEaXJlY3RvcnlPYmplY3QobG9uZyBsb25nKSBOdFF1ZXJ5RGlyZWN0b3J5T2JqZWN0CisxNDkgc3RkY2FsbCBOdFF1ZXJ5RGlyZWN0b3J5T2JqZWN0KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIE50UXVlcnlEaXJlY3RvcnlPYmplY3QKIDE1MCBzdHViIE50UXVlcnlFYUZpbGUKIDE1MSBzdHViIE50UXVlcnlFdmVudAogMTUyIHN0dWIgTnRRdWVyeUluZm9ybWF0aW9uRmlsZQpAQCAtMTYxLDE0ICsxNjEsMTQgQEAKIDE1OCBzdHViIE50UXVlcnlJb0NvbXBsZXRpb24KIDE1OSBzdHViIE50UXVlcnlLZXkKIDE2MCBzdHViIE50UXVlcnlNdXRhbnQKLTE2MSBzdGRjYWxsIE50UXVlcnlPYmplY3QobG9uZyBsb25nKSBOdFF1ZXJ5T2JqZWN0CisxNjEgc3RkY2FsbCBOdFF1ZXJ5T2JqZWN0KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgTnRRdWVyeU9iamVjdAogMTYyIHN0dWIgTnRRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgogMTYzIHN0dWIgTnRRdWVyeVNlY3Rpb24KIDE2NCBzdHViIE50UXVlcnlTZWN1cml0eU9iamVjdAogMTY1IHN0dWIgTnRRdWVyeVNlbWFwaG9yZQogMTY2IHN0dWIgTnRRdWVyeVN5bWJvbGljTGlua09iamVjdAogMTY3IHN0dWIgTnRRdWVyeVN5c3RlbUVudmlyb25tZW50VmFsdWUKLTE2OCBzdGRjYWxsIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbihsb25nKSBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24KKzE2OCBzdGRjYWxsIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbihsb25nIGxvbmcgbG9uZyBsb25nKSBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24KIDE2OSBzdHViIE50UXVlcnlTeXN0ZW1UaW1lCiAxNzAgc3R1YiBOdFF1ZXJ5VGltZXIKIDE3MSBzdHViIE50UXVlcnlUaW1lclJlc29sdXRpb24KQEAgLTIwNyw3ICsyMDcsNyBAQAogMjA0IHN0dWIgTnRTZXRJbmZvcm1hdGlvbkZpbGUKIDIwNSBzdHViIE50U2V0SW5mb3JtYXRpb25LZXkKIDIwNiBzdHViIE50U2V0SW5mb3JtYXRpb25PYmplY3QKLTIwNyBzdGRjYWxsIE50U2V0SW5mb3JtYXRpb25Qcm9jZXNzKGxvbmcpIE50U2V0SW5mb3JtYXRpb25Qcm9jZXNzCisyMDcgc3RkY2FsbCBOdFNldEluZm9ybWF0aW9uUHJvY2Vzcyhsb25nIGxvbmcgbG9uZyBsb25nKSBOdFNldEluZm9ybWF0aW9uUHJvY2VzcwogMjA4IHN0dWIgTnRTZXRJbmZvcm1hdGlvblRocmVhZAogMjA5IHN0dWIgTnRTZXRJbmZvcm1hdGlvblRva2VuCiAyMTAgc3R1YiBOdFNldEludGVydmFsUHJvZmlsZQpAQCAtMzU4LDggKzM1OCw4IEBACiAzNTUgc3R1YiBSdGxFcmFzZVVuaWNvZGVTdHJpbmcKIDM1NiBzdHViIFJ0bEV4cGFuZEVudmlyb25tZW50U3RyaW5nc19VCiAzNTcgc3R1YiBSdGxFeHRlbmRIZWFwCi0zNTggc3R1YiBSdGxFeHRlbmRlZEludGVnZXJNdWx0aXBseQotMzU5IHN0dWIgUnRsRXh0ZW5kZWRMYXJnZUludGVnZXJEaXZpZGUKKzM1OCBzdGRjYWxsIFJ0bEV4dGVuZGVkSW50ZWdlck11bHRpcGx5KGxvbmcgbG9uZyBsb25nKSBSdGxFeHRlbmRlZEludGVnZXJNdWx0aXBseQorMzU5IHN0ZGNhbGwgUnRsRXh0ZW5kZWRMYXJnZUludGVnZXJEaXZpZGUobG9uZyBsb25nIGxvbmcgcHRyKSBSdGxFeHRlbmRlZExhcmdlSW50ZWdlckRpdmlkZQogMzYwIHN0dWIgUnRsRXh0ZW5kZWRNYWdpY0RpdmlkZQogMzYxIHN0ZGNhbGwgUnRsRmlsbE1lbW9yeShwdHIgbG9uZyBsb25nKSBSdGxGaWxsTWVtb3J5CiAzNjIgc3R1YiBSdGxGaWxsTWVtb3J5VWxvbmcKQEAgLTUwMiw3ICs1MDIsNyBAQAogNDk5IHN0dWIgUnRsU3VidHJlZVN1Y2Nlc3NvcgogNTAwIHN0dWIgUnRsU3lzdGVtVGltZVRvTG9jYWxUaW1lCiA1MDEgc3R1YiBSdGxUaW1lRmllbGRzVG9UaW1lCi01MDIgc3RkY2FsbCBSdGxUaW1lVG9FbGFwc2VkVGltZUZpZWxkcyhsb25nKSBSdGxUaW1lVG9FbGFwc2VkVGltZUZpZWxkcworNTAyIHN0ZGNhbGwgUnRsVGltZVRvRWxhcHNlZFRpbWVGaWVsZHMobG9uZyBsb25nKSBSdGxUaW1lVG9FbGFwc2VkVGltZUZpZWxkcwogNTAzIHN0dWIgUnRsVGltZVRvU2Vjb25kc1NpbmNlMTk3MAogNTA0IHN0dWIgUnRsVGltZVRvU2Vjb25kc1NpbmNlMTk4MAogNTA1IHN0dWIgUnRsVGltZVRvVGltZUZpZWxkcwpAQCAtODY4LDcgKzg2OCw3IEBACiA4NjUgc3R1YiBfaXRvYQogODY2IHN0dWIgX2x0b2EKIDg2NyBzdHViIF9tZW1jY3B5Ci04Njggc3R1YiBfbWVtaWNtcAorODY4IGNkZWNsIF9tZW1pY21wKHN0ciBzdHIgbG9uZykgQ1JURExMX19tZW1pY21wCiA4Njkgc3R1YiBfc25wcmludGYKIDg3MCBzdHViIF9zbndwcmludGYKIDg3MSBzdHViIF9zcGxpdHBhdGgKZGlmZiAtLWdpdCBhL3JlbGF5MzIvb2xlMzIuc3BlYyBiL3JlbGF5MzIvb2xlMzIuc3BlYwppbmRleCA3MzUwYzEwLi5jYmJmODMyIDEwMDY0NAotLS0gYS9yZWxheTMyL29sZTMyLnNwZWMKKysrIGIvcmVsYXkzMi9vbGUzMi5zcGVjCkBAIC0zMSw3ICszMSw3IEBACiAgMjggc3R1YiBDb0lzSGFuZGxlckNvbm5lY3RlZAogIDI5IHN0dWIgQ29Jc09sZTFDbGFzcwogIDMwIHN0dWIgQ29Mb2FkTGlicmFyeQotIDMxIHN0dWIgQ29Mb2NrT2JqZWN0RXh0ZXJuYWwKKyAzMSBzdGRjYWxsIENvTG9ja09iamVjdEV4dGVybmFsKHB0ciBsb25nIGxvbmcpIENvTG9ja09iamVjdEV4dGVybmFsMzIKICAzMiBzdHViIENvTWFyc2hhbEhyZXN1bHQKICAzMyBzdHViIENvTWFyc2hhbEludGVyVGhyZWFkSW50ZXJmYWNlSW5TdHJlYW0KICAzNCBzdHViIENvTWFyc2hhbEludGVyZmFjZQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9vbGVhdXQzMi5zcGVjIGIvcmVsYXkzMi9vbGVhdXQzMi5zcGVjCmluZGV4IGEzMTViMGEuLmFmODA5NTUgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvb2xlYXV0MzIuc3BlYworKysgYi9yZWxheTMyL29sZWF1dDMyLnNwZWMKQEAgLTEzNyw3ICsxMzcsNyBAQAogMTY0IHN0ZGNhbGwgUXVlcnlQYXRoT2ZSZWdUeXBlTGliKHB0ciBsb25nIGxvbmcgbG9uZyBwdHIpIFF1ZXJ5UGF0aE9mUmVnVHlwZUxpYjMyCiAxNjUgc3R1YiBMSGFzaFZhbE9mTmFtZVN5cwogMTY2IHN0dWIgTEhhc2hWYWxPZk5hbWVTeXNBCi0xNzAgc3R1YiBPYUJ1aWxkVmVyc2lvbgorMTcwIHN0ZGNhbGwgT2FCdWlsZFZlcnNpb24oKSBPYUJ1aWxkVmVyc2lvbgogMTcxIHN0dWIgQ2xlYXJDdXN0RGF0YQogMTgwIHN0dWIgQ3JlYXRlVHlwZUxpYjIKIDE4MyBzdHViIExvYWRUeXBlTGliRXgKZGlmZiAtLWdpdCBhL3JlbGF5MzIvcmVsYXkzODYuYyBiL3JlbGF5MzIvcmVsYXkzODYuYwppbmRleCA2MTJiYmM1Li5lNTg2ZDQwIDEwMDY0NAotLS0gYS9yZWxheTMyL3JlbGF5Mzg2LmMKKysrIGIvcmVsYXkzMi9yZWxheTM4Ni5jCkBAIC03LDYgKzcsNyBAQAogI2lmZGVmIF9faTM4Nl9fCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJidWlsdGluMzIuaCIKQEAgLTE0LDYgKzE1LDggQEAKICNpbmNsdWRlICJkZWJ1Z3N0ci5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKK2NoYXIgKipkZWJ1Z19yZWxheV9leGNsdWRlbGlzdCA9IE5VTEwsICoqZGVidWdfcmVsYXlfaW5jbHVkZWxpc3QgPSBOVUxMOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBSRUxBWV9DYWxsRnJvbTMyCiAgKgpAQCAtMjYsNyArMjksNyBAQAogICovCiBpbnQgUkVMQVlfQ2FsbEZyb20zMiggaW50IHJldF9hZGRyLCAuLi4gKQogewotICAgIGludCBpLCByZXQ7CisgICAgaW50IGksIHJldCwgc2hvdyA9IDE7CiAgICAgY2hhciBidWZmZXJbODBdOwogICAgIEZBUlBST0MzMiBmdW5jOwogICAgIHVuc2lnbmVkIGludCBtYXNrLCB0eXBlbWFzazsKQEAgLTM4LDEyICs0MSw0MSBAQAogICAgIFdPUkQgbmJfYXJncyA9ICooV09SRCAqKShyZWxheV9hZGRyICsgMSkgLyBzaXplb2YoaW50KTsKIAogICAgIGFzc2VydChUUkFDRV9PTihyZWxheSkpOworICAgIEdFVF9GUyggZnMgKTsKICAgICBmdW5jID0gKEZBUlBST0MzMilCVUlMVElOMzJfR2V0RW50cnlQb2ludCggYnVmZmVyLCByZWxheV9hZGRyIC0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVtYXNrICk7Ci0gICAgRFBSSU5URiggIkNhbGwgJXMoIiwgYnVmZmVyICk7Ci0gICAgYXJncysrOwotICAgIGZvciAoaSA9IDAsIG1hc2sgPSAzOyBpIDwgbmJfYXJnczsgaSsrLCBtYXNrIDw8PSAyKQotICAgIHsKKyAgICBpZihkZWJ1Z19yZWxheV9leGNsdWRlbGlzdCB8fCBkZWJ1Z19yZWxheV9pbmNsdWRlbGlzdCkgeworICAgICAgY2hhciAqdGVybSA9IHN0cmNocihidWZmZXIsICc6JyksICoqbGlzdGl0ZW07CisgICAgICBpbnQgbGVuLCBsZW4yLCBpdGVtbGVuOworCisgICAgICBpZihkZWJ1Z19yZWxheV9leGNsdWRlbGlzdCkgeworCXNob3cgPSAxOworCWxpc3RpdGVtID0gZGVidWdfcmVsYXlfZXhjbHVkZWxpc3Q7CisgICAgICB9IGVsc2UgeworCXNob3cgPSAwOworCWxpc3RpdGVtID0gZGVidWdfcmVsYXlfaW5jbHVkZWxpc3Q7CisgICAgICB9CisgICAgICBhc3NlcnQodGVybSk7CisgICAgICBhc3NlcnQoc3RybGVuKHRlcm0pID4gMik7CisgICAgICBsZW4gPSB0ZXJtIC0gYnVmZmVyOworICAgICAgbGVuMiA9IHN0cmNocihidWZmZXIsICcuJykgLSBidWZmZXI7CisgICAgICBhc3NlcnQobGVuMiAmJiBsZW4yID4gMCAmJiBsZW4yIDwgNjQpOworICAgICAgdGVybSArPSAyOworICAgICAgZm9yKDsgKmxpc3RpdGVtOyBsaXN0aXRlbSsrKSB7CisgICAgICAgIGl0ZW1sZW4gPSBzdHJsZW4oKmxpc3RpdGVtKTsKKyAgICAgICAgaWYoKGl0ZW1sZW4gPT0gbGVuICYmICFzdHJuY21wKCpsaXN0aXRlbSwgYnVmZmVyLCBsZW4pKSB8fAorICAgICAgICAgICAoaXRlbWxlbiA9PSBsZW4yICYmICFzdHJuY21wKCpsaXN0aXRlbSwgYnVmZmVyLCBsZW4yKSkgfHwKKyAgICAgICAgICAgIXN0cmNtcCgqbGlzdGl0ZW0sIHRlcm0pKSB7CisgICAgICAgICAgc2hvdyA9ICFzaG93OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmKHNob3cpIHsKKyAgICAgIERQUklOVEYoICJDYWxsICVzKCIsIGJ1ZmZlciApOworICAgICAgYXJncysrOworICAgICAgZm9yIChpID0gMCwgbWFzayA9IDM7IGkgPCBuYl9hcmdzOyBpKyssIG1hc2sgPDw9IDIpCisgICAgICB7CiAgICAgICAgIGlmIChpKSBEUFJJTlRGKCAiLCIgKTsKIAlpZiAoKHR5cGVtYXNrICYgbWFzaykgJiYgSElXT1JEKGFyZ3NbaV0pKQogICAgICAgICB7CkBAIC01Myw5ICs4NSwxMCBAQAogCSAgICAJRFBSSU5URiggIiUwOHggJXMiLCBhcmdzW2ldLCBkZWJ1Z3N0cl9hKChMUENTVFIpYXJnc1tpXSkgKTsKIAl9CiAgICAgICAgIGVsc2UgRFBSSU5URiggIiUwOHgiLCBhcmdzW2ldICk7Ci0gICAgfQotICAgIEdFVF9GUyggZnMgKTsKLSAgICBEUFJJTlRGKCAiKSByZXQ9JTA4eCBmcz0lMDR4XG4iLCByZXRfYWRkciwgZnMgKTsKKyAgICAgIH0KKyAgICAgIERQUklOVEYoICIpIHJldD0lMDh4IGZzPSUwNHhcbiIsIHJldF9hZGRyLCBmcyApOworICAgIH0gZWxzZQorICAgICAgYXJncysrOwogICAgIGlmICgqcmVsYXlfYWRkciA9PSAweGMzKSAvKiBjZGVjbCAqLwogICAgIHsKICAgICAgICAgTFJFU1VMVCAoKmNmdW5jKSgpID0gKExSRVNVTFQoKikoKSlmdW5jOwpAQCAtMTM2LDggKzE2OSw5IEBACiAgICAgICAgICAgICBhc3NlcnQoRkFMU0UpOwogICAgICAgICB9CiAgICAgfQotICAgIERQUklOVEYoICJSZXQgICVzKCkgcmV0dmFsPSUwOHggcmV0PSUwOHggZnM9JTA0eFxuIiwKLSAgICAgICAgICAgICBidWZmZXIsIHJldCwgcmV0X2FkZHIsIGZzICk7CisgICAgaWYoc2hvdykKKyAgICAgIERQUklOVEYoICJSZXQgICVzKCkgcmV0dmFsPSUwOHggcmV0PSUwOHggZnM9JTA0eFxuIiwKKyAgICAgICAgICAgICAgIGJ1ZmZlciwgcmV0LCByZXRfYWRkciwgZnMgKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0yMDcsMzEgKzI0MSwzOSBAQAogCSAqLwogCiAgICAgICAgIHJlbGF5X2FkZHIgPSAqKEJZVEUgKiopIEVTUF9yZWcoJmNvbnRleHQpOyAKLSAgICAgICAgRVNQX3JlZygmY29udGV4dCkgKz0gc2l6ZW9mKEJZVEUgKik7Ci0JRUlQX3JlZygmY29udGV4dCkgPSAqKERXT1JEICopRVNQX3JlZygmY29udGV4dCk7CisgICAgICAgIGlmIChCVUlMVElOMzJfR2V0RW50cnlQb2ludCggYnVmZmVyLCByZWxheV9hZGRyIC0gNSwgJnR5cGVtYXNrICkpIHsKKwkgICAgLyogY29ycmVjdCB3aW4zMiBzcGVjIGdlbmVyYXRlZCByZWdpc3RlciBmdW5jdGlvbiBmb3VuZC4gCisJICAgICAqIHJlbW92ZSBleHRyYSBjYWxsIHN0dWZmIGZyb20gc3RhY2sKKwkgICAgICovCisgICAgICAgICAgICBFU1BfcmVnKCZjb250ZXh0KSArPSBzaXplb2YoQllURSAqKTsKKwkgICAgRUlQX3JlZygmY29udGV4dCkgPSAqKERXT1JEICopRVNQX3JlZygmY29udGV4dCk7CisJICAgIERQUklOVEYoIkNhbGwgJXMocmVncykgcmV0PSUwOHhcbiIsIGJ1ZmZlciwgKihpbnQgKilFU1BfcmVnKCZjb250ZXh0KSApOworCSAgICBEUFJJTlRGKCIgRUFYPSUwOGx4IEVCWD0lMDhseCBFQ1g9JTA4bHggRURYPSUwOGx4IEVTST0lMDhseCBFREk9JTA4bHhcbiIsCisJCSAgICBFQVhfcmVnKCZjb250ZXh0KSwgRUJYX3JlZygmY29udGV4dCksIEVDWF9yZWcoJmNvbnRleHQpLAorCQkgICAgRURYX3JlZygmY29udGV4dCksIEVTSV9yZWcoJmNvbnRleHQpLCBFRElfcmVnKCZjb250ZXh0KSApOworCSAgICBEUFJJTlRGKCIgRUJQPSUwOGx4IEVTUD0lMDhseCBFSVA9JTA4bHggRFM9JTA0bHggRVM9JTA0bHggRlM9JTA0bHggR1M9JTA0bHggRUZMPSUwOGx4XG4iLAorCQkgICAgRUJQX3JlZygmY29udGV4dCksIEVTUF9yZWcoJmNvbnRleHQpLCBFSVBfcmVnKCZjb250ZXh0KSwKKwkJICAgIERTX3JlZygmY29udGV4dCksIEVTX3JlZygmY29udGV4dCksIEZTX3JlZygmY29udGV4dCksCisJCSAgICBHU19yZWcoJmNvbnRleHQpLCBFRkxfcmVnKCZjb250ZXh0KSApOwogCi0gICAgICAgIEJVSUxUSU4zMl9HZXRFbnRyeVBvaW50KCBidWZmZXIsIHJlbGF5X2FkZHIgLSA1LCAmdHlwZW1hc2sgKTsKLSAgICAgICAgRFBSSU5URigiQ2FsbCAlcyhyZWdzKSByZXQ9JTA4eFxuIiwgYnVmZmVyLCAqKGludCAqKUVTUF9yZWcoJmNvbnRleHQpICk7Ci0gICAgICAgIERQUklOVEYoIiBFQVg9JTA4bHggRUJYPSUwOGx4IEVDWD0lMDhseCBFRFg9JTA4bHggRVNJPSUwOGx4IEVEST0lMDhseFxuIiwKLSAgICAgICAgICAgICAgICBFQVhfcmVnKCZjb250ZXh0KSwgRUJYX3JlZygmY29udGV4dCksIEVDWF9yZWcoJmNvbnRleHQpLAotICAgICAgICAgICAgICAgIEVEWF9yZWcoJmNvbnRleHQpLCBFU0lfcmVnKCZjb250ZXh0KSwgRURJX3JlZygmY29udGV4dCkgKTsKLSAgICAgICAgRFBSSU5URigiIEVCUD0lMDhseCBFU1A9JTA4bHggRUlQPSUwOGx4IERTPSUwNGx4IEVTPSUwNGx4IEZTPSUwNGx4IEdTPSUwNGx4IEVGTD0lMDhseFxuIiwKLSAgICAgICAgICAgICAgICBFQlBfcmVnKCZjb250ZXh0KSwgRVNQX3JlZygmY29udGV4dCksIEVJUF9yZWcoJmNvbnRleHQpLAotICAgICAgICAgICAgICAgIERTX3JlZygmY29udGV4dCksIEVTX3JlZygmY29udGV4dCksIEZTX3JlZygmY29udGV4dCksCi0gICAgICAgICAgICAgICAgR1NfcmVnKCZjb250ZXh0KSwgRUZMX3JlZygmY29udGV4dCkgKTsKKwkgICAgLyogTm93IGNhbGwgdGhlIHJlYWwgZnVuY3Rpb24gKi8KKwkgICAgZW50cnlfcG9pbnQoICZjb250ZXh0ICk7CiAKLSAgICAgICAgLyogTm93IGNhbGwgdGhlIHJlYWwgZnVuY3Rpb24gKi8KLSAgICAgICAgZW50cnlfcG9pbnQoICZjb250ZXh0ICk7CiAKLSAgICAgICAgRFBSSU5URigiUmV0ICAlcygpIHJldHZhbD1yZWdzIHJldD0lMDh4XG4iLCBidWZmZXIsICooaW50ICopRVNQX3JlZygmY29udGV4dCkgKTsKLSAgICAgICAgRFBSSU5URigiIEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseCBFU0k9JTA4bHggRURJPSUwOGx4XG4iLAotICAgICAgICAgICAgICAgIEVBWF9yZWcoJmNvbnRleHQpLCBFQlhfcmVnKCZjb250ZXh0KSwgRUNYX3JlZygmY29udGV4dCksCi0gICAgICAgICAgICAgICAgRURYX3JlZygmY29udGV4dCksIEVTSV9yZWcoJmNvbnRleHQpLCBFRElfcmVnKCZjb250ZXh0KSApOwotICAgICAgICBEUFJJTlRGKCIgRUJQPSUwOGx4IEVTUD0lMDhseCBFSVA9JTA4bHggRFM9JTA0bHggRVM9JTA0bHggRlM9JTA0bHggR1M9JTA0bHggRUZMPSUwOGx4XG4iLAotICAgICAgICAgICAgICAgIEVCUF9yZWcoJmNvbnRleHQpLCBFU1BfcmVnKCZjb250ZXh0KSwgRUlQX3JlZygmY29udGV4dCksCi0gICAgICAgICAgICAgICAgRFNfcmVnKCZjb250ZXh0KSwgRVNfcmVnKCZjb250ZXh0KSwgRlNfcmVnKCZjb250ZXh0KSwKLSAgICAgICAgICAgICAgICBHU19yZWcoJmNvbnRleHQpLCBFRkxfcmVnKCZjb250ZXh0KSApOworCSAgICBEUFJJTlRGKCJSZXQgICVzKCkgcmV0dmFsPXJlZ3MgcmV0PSUwOHhcbiIsIGJ1ZmZlciwgKihpbnQgKilFU1BfcmVnKCZjb250ZXh0KSApOworCSAgICBEUFJJTlRGKCIgRUFYPSUwOGx4IEVCWD0lMDhseCBFQ1g9JTA4bHggRURYPSUwOGx4IEVTST0lMDhseCBFREk9JTA4bHhcbiIsCisJCSAgICBFQVhfcmVnKCZjb250ZXh0KSwgRUJYX3JlZygmY29udGV4dCksIEVDWF9yZWcoJmNvbnRleHQpLAorCQkgICAgRURYX3JlZygmY29udGV4dCksIEVTSV9yZWcoJmNvbnRleHQpLCBFRElfcmVnKCZjb250ZXh0KSApOworCSAgICBEUFJJTlRGKCIgRUJQPSUwOGx4IEVTUD0lMDhseCBFSVA9JTA4bHggRFM9JTA0bHggRVM9JTA0bHggRlM9JTA0bHggR1M9JTA0bHggRUZMPSUwOGx4XG4iLAorCQkgICAgRUJQX3JlZygmY29udGV4dCksIEVTUF9yZWcoJmNvbnRleHQpLCBFSVBfcmVnKCZjb250ZXh0KSwKKwkJICAgIERTX3JlZygmY29udGV4dCksIEVTX3JlZygmY29udGV4dCksIEZTX3JlZygmY29udGV4dCksCisJCSAgICBHU19yZWcoJmNvbnRleHQpLCBFRkxfcmVnKCZjb250ZXh0KSApOworCX0gZWxzZQorCSAgICAvKiBXSU5FIGludGVybmFsIHJlZ2lzdGVyIGZ1bmN0aW9uIGZvdW5kLiBEbyBub3QgcmVtb3ZlIGFueXRoaW5nLgorCSAgICAgKiBEbyBub3QgcHJpbnQgYW55IGRlYnVnaW5mbyAoaXQgaXMgbm90IGEgbm9ybWFsIHJlbGF5ZWQgb25lKS4KKwkgICAgICogQ3VycmVudGx5IG9ubHkgdXNlZCBmb3Igc25vb3BpbmcuCisJICAgICAqLworCSAgIGVudHJ5X3BvaW50KCAmY29udGV4dCApOwogICAgIH0KIH0KLQogI2VuZGlmICAvKiBfX2kzODZfXyAqLwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9zaGVsbDMyLnNwZWMgYi9yZWxheTMyL3NoZWxsMzIuc3BlYwppbmRleCA3MDNmNTc0Li41NjA3NTc4IDEwMDY0NAotLS0gYS9yZWxheTMyL3NoZWxsMzIuc3BlYworKysgYi9yZWxheTMyL3NoZWxsMzIuc3BlYwpAQCAtNTksOCArNTksOCBAQAogICA1NyBzdHViIFNIRUxMMzJfNTcKICAgNTggc3RkY2FsbCBTSEVMTDMyXzU4KGxvbmcgbG9uZyBsb25nIGxvbmcpIFNIRUxMMzJfNTgKICAgNTkgc3R1YiBTSEVMTDMyXzU5Ci0gIDYwIHN0dWIgU0hFTEwzMl82MAotICA2MSBzdHViIFNIRUxMMzJfNjEKKyAgNjAgc3RkY2FsbCBTSEVMTDMyXzYwKGxvbmcpIFNIRUxMMzJfNjAKKyAgNjEgc3RkY2FsbCBTSEVMTDMyXzYxKGxvbmcgbG9uZyBsb25nIHN0ciBzdHIgbG9uZykgU0hFTEwzMl82MQogICA2MiBzdGRjYWxsIFNIRUxMMzJfNjIobG9uZyBsb25nIGxvbmcgbG9uZykgU0hFTEwzMl82MgogICA2MyBzdGRjYWxsIFNIRUxMMzJfNjMobG9uZyBsb25nIGxvbmcgbG9uZyBzdHIgc3RyIHN0cikgU0hFTEwzMl82MwogICA2NCBzdHViIFNIRUxMMzJfNjQKQEAgLTE4Myw3ICsxODMsNyBAQAogIDE4MSBzdGRjYWxsIFNIRUxMMzJfMTgxKGxvbmcgbG9uZykgU0hFTEwzMl8xODEKICAxODIgc3R1YiBFeHRyYWN0VmVyc2lvblJlc291cmNlMTZXCiAgMTgzIGNkZWNsIFNIRUxMMzJfMTgzKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBTSEVMTDMyXzE4MwotIDE4NCBzdHViIFNIRUxMMzJfMTg0CisgMTg0IHN0ZGNhbGwgU0hFTEwzMl8xODQobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBTSEVMTDMyXzE4NAogIDE4NSBzdHViIFNIRUxMMzJfMTg1CiAgMTg2IHN0ZGNhbGwgRmluZEV4ZWN1dGFibGVBKHB0ciBwdHIgcHRyKSBGaW5kRXhlY3V0YWJsZTMyQQogIDE4NyBzdHViIEZpbmRFeGVjdXRhYmxlVwpAQCAtMjIzLDcgKzIyMyw3IEBACiAgMjIxIHN0ZGNhbGwgU0hHZXRQYXRoRnJvbUlETGlzdChwdHIgcHRyKSBTSEdldFBhdGhGcm9tSURMaXN0CiAgMjIyIHN0dWIgU0hHZXRQYXRoRnJvbUlETGlzdEEKICAyMjMgc3RkY2FsbCBTSEdldFNwZWNpYWxGb2xkZXJMb2NhdGlvbihsb25nIGxvbmcgcHRyKSBTSEdldFNwZWNpYWxGb2xkZXJMb2NhdGlvbgotIDIyNCBzdHViIFNISGVscFNob3J0Y3V0c19SdW5ETEwKKyAyMjQgc3RkY2FsbCBTSEhlbHBTaG9ydGN1dHNfUnVuRExMKGxvbmcgbG9uZyBsb25nIGxvbmcpIFNISGVscFNob3J0Y3V0c19SdW5ETEwKICAyMjUgc3R1YiBTSExvYWRJblByb2MKICAyMjYgc3R1YiBTaGVDaGFuZ2VEaXJBCiAgMjI3IHN0dWIgU2hlQ2hhbmdlRGlyRXhBCmRpZmYgLS1naXQgYS9yZWxheTMyL3Nub29wLmMgYi9yZWxheTMyL3Nub29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZmFkMgotLS0gL2Rldi9udWxsCisrKyBiL3JlbGF5MzIvc25vb3AuYwpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIDM4Ni1zcGVjaWZpYyBXaW4zMiBkbGw8LT5kbGwgc25vb3BpbmcgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTggTWFyY3VzIE1laXNzbmVyCisgKi8KKworI2lmZGVmIF9faTM4Nl9fCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbm50LmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgImJ1aWx0aW4zMi5oIgorI2luY2x1ZGUgInNub29wLmgiCisjaW5jbHVkZSAicGVleGUuaCIKKyNpbmNsdWRlICJzZWxlY3RvcnMuaCIKKyNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCisjaW5jbHVkZSAiZGVidWdzdHIuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisjaWZkZWYgTkVFRF9VTkRFUlNDT1JFX1BSRUZJWAorIyBkZWZpbmUgUFJFRklYICJfIgorI2Vsc2UKKyMgZGVmaW5lIFBSRUZJWAorI2VuZGlmCisKKy8qIFdlbGwgLG5vdCBleGFjdGx5IGV4dGVybiBzaW5jZSB0aGV5IGFyZSBpbiB0aGUgc2FtZSBmaWxlIChpbiB0aGUgbGluZXMKKyAqIGJlbG93KS4gQnV0IHRoZSBDIENvbXBpbGVyIGRvZXNuJ3Qgc2VlIHRoZW0gdGhlcmUsIHNvIHdlIGhhdmUgdG8gaGVscCBhIGJpdC4KKyAqLworZXh0ZXJuIHZvaWQgU05PT1BfUmV0dXJuKCk7CitleHRlcm4gdm9pZCBTTk9PUF9FbnRyeSgpOworX19hc21fXygiLmFsaWduIDRcblx0IgorICAgICAgICAiLmdsb2JsICJQUkVGSVgiU05PT1BfRW50cnlcblx0IgorICAgICAgICAiLnR5cGUgIlBSRUZJWCJTTk9PUF9FbnRyeSxAZnVuY3Rpb25cblx0IgorICAgICAgICBQUkVGSVgiU05PT1BfRW50cnk6XG5cdCIKKyAgICAgICAgInB1c2hsICQiUFJFRklYIl9fcmVnc19TTk9PUF9FbnRyeVxuXHQiCisgICAgICAgICJwdXNobCAkIlBSRUZJWCJDQUxMMzJfUmVnc1xuXHQiCisgICAgICAgICJyZXRcblx0IgorCSIuYWxpZ24gNFxuXHQiCisgICAgICAgICIuZ2xvYmwgIlBSRUZJWCJTTk9PUF9SZXR1cm5cblx0IgorICAgICAgICAiLnR5cGUgIlBSRUZJWCJTTk9PUF9SZXR1cm4sQGZ1bmN0aW9uXG5cdCIKKyAgICAgICAgUFJFRklYIlNOT09QX1JldHVybjpcblx0IgorICAgICAgICAicHVzaGwgJCJQUkVGSVgiX19yZWdzX1NOT09QX1JldHVyblxuXHQiCisgICAgICAgICJwdXNobCAkIlBSRUZJWCJDQUxMMzJfUmVnc1xuXHQiCisgICAgICAgICJyZXQiCispOworCisjcHJhZ21hIHBhY2soMSkKKwordHlwZWRlZglzdHJ1Y3QgdGFnU05PT1BfRlVOIHsKKwkvKiBjb2RlIHBhcnQgKi8KKwlCWVRFCQlsY2FsbDsJCS8qIDB4ZTggY2FsbCBzbm9vcGVudHJ5IChyZWxhdGl2ZSkgKi8KKwkvKiBOT1RFOiBJZiB5b3UgbW92ZSBzbm9vcGVudHJ5IE9SIG5yb2ZhcmdzIGZpeCB0aGUgcmVsYXRpdmUgb2Zmc2V0CisJICogY2FsY3VsYXRpb24hCisJICovCisJRFdPUkQJCXNub29wZW50cnk7CS8qIFNOT09QX0VudHJ5IHJlbGF0aXZlICovCisJLyogdW5yZWFjaGVkICovCisJaW50CQlucm9mYXJnczsKKwlGQVJQUk9DMzIJb3JpZ2Z1bjsKKwljaGFyCQkqbmFtZTsKK30gU05PT1BfRlVOOworCit0eXBlZGVmIHN0cnVjdCB0YWdTTk9PUF9ETEwgeworCUhNT0RVTEUzMglobW9kOworCVNOT09QX0ZVTgkqZnVuczsKKwlMUENTVFIJCW5hbWU7CisJaW50CQlucm9mb3JkaW5hbHM7CisJc3RydWN0IHRhZ1NOT09QX0RMTAkqbmV4dDsKK30gU05PT1BfRExMOwordHlwZWRlZiBzdHJ1Y3QgdGFnU05PT1BfUkVUVVJORU5UUlkgeworCS8qIGNvZGUgcGFydCAqLworCUJZVEUJCWxjYWxsOwkJLyogMHhlOCBjYWxsIHNub29wcmV0IHJlbGF0aXZlKi8KKwkvKiBOT1RFOiBJZiB5b3UgbW92ZSBzbm9vcHJldCBPUiBvcmlncmV0dXJuIGZpeCB0aGUgcmVsYXRpdmUgb2Zmc2V0CisJICogY2FsY3VsYXRpb24hCisJICovCisJRFdPUkQJCXNub29wcmV0OwkvKiBTTk9PUF9SZXQgcmVsYXRpdmUgKi8KKwkvKiB1bnJlYWNoZWQgKi8KKwlGQVJQUk9DMzIJb3JpZ3JldHVybjsKKwlTTk9PUF9ETEwJKmRsbDsKKwlEV09SRAkJb3JkaW5hbDsKKwlEV09SRAkJb3JpZ0VTUDsKKwlEV09SRAkJKmFyZ3M7CQkvKiBzYXZlZCBhcmdzIGFjcm9zcyBhIHN0ZGNhbGwgKi8KK30gU05PT1BfUkVUVVJORU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1NOT09QX1JFVFVSTkVOVFJJRVMgeworCVNOT09QX1JFVFVSTkVOVFJZIGVudHJ5WzQwOTIvc2l6ZW9mKFNOT09QX1JFVFVSTkVOVFJZKV07CisJc3RydWN0IHRhZ1NOT09QX1JFVFVSTkVOVFJJRVMJKm5leHQ7Cit9IFNOT09QX1JFVFVSTkVOVFJJRVM7CisKKyNwcmFnbWEgcGFjayg0KQorCitzdGF0aWMJU05PT1BfRExMCQkqZmlyc3RkbGwgPSBOVUxMOworc3RhdGljCVNOT09QX1JFVFVSTkVOVFJJRVMgCSpmaXJzdHJldHMgPSBOVUxMOworCit2b2lkCitTTk9PUF9SZWdpc3RlckRMTChITU9EVUxFMzIgaG1vZCxMUENTVFIgbmFtZSxEV09SRCBucm9mb3JkaW5hbHMpIHsKKwlTTk9PUF9ETEwJKipkbGwgPSAmKGZpcnN0ZGxsKTsKKwljaGFyCQkqczsKKworCWlmICghVFJBQ0VfT04oc25vb3ApKSByZXR1cm47CisJd2hpbGUgKCpkbGwpIHsKKwkJaWYgKCgqZGxsKS0+aG1vZCA9PSBobW9kKQorCQkJcmV0dXJuOyAvKiBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KKwkJZGxsID0gJigoKmRsbCktPm5leHQpOworCX0KKwkqZGxsID0gKFNOT09QX0RMTCopSGVhcEFsbG9jKFN5c3RlbUhlYXAsSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoU05PT1BfRExMKSk7CisJKCpkbGwpLT5uZXh0CT0gTlVMTDsKKwkoKmRsbCktPmhtb2QJPSBobW9kOworCSgqZGxsKS0+bnJvZm9yZGluYWxzID0gbnJvZm9yZGluYWxzOworCSgqZGxsKS0+bmFtZQk9IEhFQVBfc3RyZHVwQShTeXN0ZW1IZWFwLDAsbmFtZSk7CisJaWYgKChzPXN0cnJjaHIoKCpkbGwpLT5uYW1lLCcuJykpKQorCQkqcz0nXDAnOworCSgqZGxsKS0+ZnVucyA9IFZpcnR1YWxBbGxvYyhOVUxMLG5yb2ZvcmRpbmFscypzaXplb2YoU05PT1BfRlVOKSxNRU1fQ09NTUlUfE1FTV9SRVNFUlZFLFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOworCW1lbXNldCgoKmRsbCktPmZ1bnMsMCxucm9mb3JkaW5hbHMqc2l6ZW9mKFNOT09QX0ZVTikpOworCWlmICghKCpkbGwpLT5mdW5zKSB7CisJCUhlYXBGcmVlKFN5c3RlbUhlYXAsMCwqZGxsKTsKKwkJRklYTUUoc25vb3AsIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm47CisJfQorfQorCitGQVJQUk9DMzIKK1NOT09QX0dldFByb2NBZGRyZXNzMzIoSE1PRFVMRTMyIGhtb2QsTFBDU1RSIG5hbWUsRFdPUkQgb3JkaW5hbCxGQVJQUk9DMzIgb3JpZ2Z1bikgeworCVNOT09QX0RMTAkJCSpkbGwgPSBmaXJzdGRsbDsKKwlTTk9PUF9GVU4JCQkqZnVuOworCWludAkJCQlqOworCUlNQUdFX1NFQ1RJT05fSEVBREVSCQkqcGVfc2VnID0gUEVfU0VDVElPTlMoaG1vZCk7CisKKwlpZiAoIVRSQUNFX09OKHNub29wKSkgcmV0dXJuIG9yaWdmdW47CisJaWYgKCEqKExQQllURSlvcmlnZnVuKSAvKiAweDAwIGlzIGFuIGltcG9zcy4gb3Bjb2RlLCBwb3NzLiBkYXRhcmVmLiAqLworCQlyZXR1cm4gb3JpZ2Z1bjsKKwlmb3IgKGo9MDtqPFBFX0hFQURFUihobW9kKS0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zO2orKykKKwkJaWYgKCgoRFdPUkQpb3JpZ2Z1bi1obW9kPj1wZV9zZWdbal0uVmlydHVhbEFkZHJlc3MpJiYKKwkJICAgICgoRFdPUkQpb3JpZ2Z1bi1obW9kIDxwZV9zZWdbal0uVmlydHVhbEFkZHJlc3MrCisJCSAgICAJCSAgIHBlX3NlZ1tqXS5TaXplT2ZSYXdEYXRhKQorCQkpCisJCQlicmVhazsKKwkvKiBJZiB3ZSBsb29rZWQgdGhyb3VnaCBhbGwgc2VjdGlvbnMgKGFuZCBkaWRuJ3QgZmluZCBvbmUpIAorCSAqIG9yIGlmIHRoZSBzZWN0aW9ubmFtZSBjb250YWlucyAiZGF0YSIsIHdlIHJldHVybiB0aGUKKwkgKiBvcmlnaW5hbCBmdW5jdGlvbiBzaW5jZSBpdCBpcyBtb3N0IGxpa2VseSBhIGRhdGFyZWZlcmVuY2UuCisJICovCisJaWYgKAkoaj09UEVfSEVBREVSKGhtb2QpLT5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnMpCXx8CisJCShzdHJzdHIocGVfc2VnW2pdLk5hbWUsImRhdGEiKSkJCQkJfHwKKwkJIShwZV9zZWdbal0uQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfU0NOX0NOVF9DT0RFKQorCSkKKwkJcmV0dXJuIG9yaWdmdW47CisKKwl3aGlsZSAoZGxsKSB7CisJCWlmIChobW9kID09IGRsbC0+aG1vZCkKKwkJCWJyZWFrOworCQlkbGw9ZGxsLT5uZXh0OworCX0KKwlpZiAoIWRsbCkJLyogcHJvYmFibHkgaW50ZXJuYWwgKi8KKwkJcmV0dXJuIG9yaWdmdW47CisJYXNzZXJ0KG9yZGluYWw8ZGxsLT5ucm9mb3JkaW5hbHMpOworCWZ1biA9IGRsbC0+ZnVucytvcmRpbmFsOworCWlmICghZnVuLT5uYW1lKSBmdW4tPm5hbWUgPSBIRUFQX3N0cmR1cEEoU3lzdGVtSGVhcCwwLG5hbWUpOworCWZ1bi0+bGNhbGwJPSAweGU4OworCS8qIE5PVEU6IG9yaWdyZXR1cm4gc3RydWN0IG1lbWJlciBNVVNUIGNvbWUgZGlyZWN0bHkgYWZ0ZXIgc25vb3BlbnRyeSAqLworCWZ1bi0+c25vb3BlbnRyeQk9IChjaGFyKilTTk9PUF9FbnRyeS0oKGNoYXIqKSgmZnVuLT5ucm9mYXJncykpOworCWZ1bi0+b3JpZ2Z1bgk9IG9yaWdmdW47CisJZnVuLT5ucm9mYXJncwk9IC0xOworCXJldHVybiAoRkFSUFJPQzMyKSYoZnVuLT5sY2FsbCk7Cit9CisKK3N0YXRpYyBjaGFyKgorU05PT1BfUHJpbnRBcmcoRFdPUkQgeCkgeworCXN0YXRpYyBjaGFyCWJ1ZlsyMDBdOworCWludAkJaSxub3N0cmluZzsKKwlNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04JbWJpOworCisJaWYgKAkhSElXT1JEKHgpCQkJCQl8fAorCQkhVmlydHVhbFF1ZXJ5KChMUFZPSUQpeCwmbWJpLHNpemVvZihtYmkpKQl8fAorCQkhbWJpLlR5cGUKKwkpIHsKKwkJc3ByaW50ZihidWYsIiUwOGx4Iix4KTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisJaT0wO25vc3RyaW5nPTA7CisJaWYgKCFJc0JhZFN0cmluZ1B0cjMyQSgoTFBTVFIpeCw4MCkpIHsKKwkJd2hpbGUgKGk8ODApIHsKKwkJCUxQQllURQlzPShMUEJZVEUpeDsKKworCQkJaWYgKHNbaV09PTApIGJyZWFrOworCQkJaWYgKHNbaV08MHgyMCkge25vc3RyaW5nPTE7YnJlYWs7fQorCQkJaWYgKHNbaV0+PTB4ODApIHtub3N0cmluZz0xO2JyZWFrO30KKwkJCWkrKzsKKwkJfQorCQlpZiAoIW5vc3RyaW5nKSB7CisJCQlpZiAoaT41KSB7CisJCQkJc3ByaW50ZihidWYsIiUwOGx4IFwiIix4KTsKKwkJCQlzdHJuY2F0KGJ1ZiwoTFBTVFIpeCwxOTgtc3RybGVuKGJ1ZiktMik7CisJCQkJc3RyY2F0KGJ1ZiwiXCIiKTsKKwkJCQlyZXR1cm4gYnVmOworCQkJfQorCQl9CisJfQorCWk9MDtub3N0cmluZz0wOworCWlmICghSXNCYWRTdHJpbmdQdHIzMlcoKExQV1NUUil4LDgwKSkgeworCQl3aGlsZSAoaTw4MCkgeworCQkJTFBXU1RSCXM9KExQV1NUUil4OworCisJCQlpZiAoc1tpXT09MCkgYnJlYWs7CisJCQlpZiAoc1tpXTwweDIwKSB7bm9zdHJpbmc9MTticmVhazt9CisJCQlpZiAoc1tpXT4weDEwMCkge25vc3RyaW5nPTE7YnJlYWs7fQorCQkJaSsrOworCQl9CisJCWlmICghbm9zdHJpbmcpIHsKKwkJCWlmIChpPjUpIHsKKwkJCQlzcHJpbnRmKGJ1ZiwiJTA4bHggTCIseCk7CisJCQkJc3RyY2F0KGJ1ZixkZWJ1Z3N0cl93bigoTFBXU1RSKXgsMTk4LXN0cmxlbihidWYpLTIpKTsKKwkJCQlyZXR1cm4gYnVmOworCQkJfQorCQl9CisJfQorCXNwcmludGYoYnVmLCIlMDhseCIseCk7CisJcmV0dXJuIGJ1ZjsKK30KKworI2RlZmluZSBDQUxMRVIxUkVGICgqKERXT1JEKikoRVNQX3JlZyhjb250ZXh0KSs0KSkKK1JFR1NfRU5UUllQT0lOVChTTk9PUF9FbnRyeSkgeworCURXT1JECQlvcmRpbmFsPTAsZW50cnkgPSBFSVBfcmVnKGNvbnRleHQpLTU7CisJU05PT1BfRExMCSpkbGwgPSBmaXJzdGRsbDsKKwlTTk9PUF9GVU4JKmZ1biA9IE5VTEw7CisJU05PT1BfUkVUVVJORU5UUklFUwkqKnJldHMgPSAmZmlyc3RyZXRzOworCVNOT09QX1JFVFVSTkVOVFJZCSpyZXQ7CisJaW50CQlpLG1heDsKKworCXdoaWxlIChkbGwpIHsKKwkJaWYgKAkoKGNoYXIqKWVudHJ5Pj0oY2hhciopZGxsLT5mdW5zKQkmJgorCQkJKChjaGFyKillbnRyeTw9KGNoYXIqKShkbGwtPmZ1bnMrZGxsLT5ucm9mb3JkaW5hbHMpKQorCQkpIHsKKwkJCWZ1biA9IChTTk9PUF9GVU4qKWVudHJ5OworCQkJb3JkaW5hbCA9IGZ1bi1kbGwtPmZ1bnM7CisJCQlicmVhazsKKwkJfQorCQlkbGw9ZGxsLT5uZXh0OworCX0KKwlpZiAoIWRsbCkgeworCQlGSVhNRShzbm9vcCwiZW50cnlwb2ludCAweCUwOGx4IG5vdCBmb3VuZFxuIixlbnRyeSk7CisJCXJldHVybjsgLyogb29wcyAqLworCX0KKwkvKiBndWVzcyBjZGVjbCAuLi4gKi8KKwlpZiAoZnVuLT5ucm9mYXJnczwwKSB7CisJCS8qIFR5cGljYWwgY2RlY2wgcmV0dXJuIGZyYW1lIGlzOgorCQkgKiAJYWRkIGVzcCwgeHh4eHh4eHggCisJCSAqIHdoaWNoIGhhcyAoZm9yIHh4eHh4eHh4IHVwIHRvIDI1NSB0aGUgb3Bjb2RlICI4MyBDNCB4eCIuCisJCSAqLworCQlMUEJZVEUJcmV0ZWlwID0gKExQQllURSlDQUxMRVIxUkVGOworCisJCWlmICgocmV0ZWlwWzBdPT0weDgzKSYmKHJldGVpcFsxXT09MHhjNCkpCisJCQlmdW4tPm5yb2ZhcmdzPXJldGVpcFsyXS80OworCX0KKworCXdoaWxlICgqcmV0cykgeworCQlmb3IgKGk9MDtpPHNpemVvZigoKnJldHMpLT5lbnRyeSkvc2l6ZW9mKCgqcmV0cyktPmVudHJ5WzBdKTtpKyspCisJCQlpZiAoISgqcmV0cyktPmVudHJ5W2ldLm9yaWdyZXR1cm4pCisJCQkJYnJlYWs7CisJCWlmIChpIT1zaXplb2YoKCpyZXRzKS0+ZW50cnkpL3NpemVvZigoKnJldHMpLT5lbnRyeVswXSkpCisJCQlicmVhazsKKwkJcmV0cyA9ICYoKCpyZXRzKS0+bmV4dCk7CisJfQorCWlmICghKnJldHMpIHsKKwkJKnJldHMgPSBWaXJ0dWFsQWxsb2MoTlVMTCw0MDk2LE1FTV9DT01NSVR8TUVNX1JFU0VSVkUsUEFHRV9FWEVDVVRFX1JFQURXUklURSk7CisJCW1lbXNldCgqcmV0cywwLDQwOTYpOworCQlpID0gMDsJLyogZW50cnkgMCBpcyBmcmVlICovCisJfQorCXJldCA9ICYoKCpyZXRzKS0+ZW50cnlbaV0pOworCXJldC0+bGNhbGwJPSAweGU4OworCS8qIE5PVEU6IG9yaWdyZXR1cm4gc3RydWN0IG1lbWJlciBNVVNUIGNvbWUgZGlyZWN0bHkgYWZ0ZXIgc25vb3ByZXQgKi8KKwlyZXQtPnNub29wcmV0CT0gKChjaGFyKilTTk9PUF9SZXR1cm4pLShjaGFyKikoJnJldC0+b3JpZ3JldHVybik7CisJcmV0LT5vcmlncmV0dXJuCT0gKEZBUlBST0MzMilDQUxMRVIxUkVGOworCUNBTExFUjFSRUYJPSAoRFdPUkQpJnJldC0+bGNhbGw7CisJcmV0LT5kbGwJPSBkbGw7CisJcmV0LT5hcmdzCT0gTlVMTDsKKwlyZXQtPm9yZGluYWwJPSBvcmRpbmFsOworCXJldC0+b3JpZ0VTUAk9IEVTUF9yZWcoY29udGV4dCk7CisKKwlFSVBfcmVnKGNvbnRleHQpPSAoRFdPUkQpZnVuLT5vcmlnZnVuOworCisJRFBSSU5URigiQ2FsbCAlcy4lbGQ6ICVzKCIsZGxsLT5uYW1lLG9yZGluYWwsZnVuLT5uYW1lKTsKKwlpZiAoZnVuLT5ucm9mYXJncz4wKSB7CisJCW1heCA9IGZ1bi0+bnJvZmFyZ3M7IGlmIChtYXg+MTYpIG1heD0xNjsKKwkJZm9yIChpPTA7aTxtYXg7aSsrKQorCQkJRFBSSU5URigiJXMlcyIsU05PT1BfUHJpbnRBcmcoKihEV09SRCopKEVTUF9yZWcoY29udGV4dCkrOCtzaXplb2YoRFdPUkQpKmkpKSwoaTxmdW4tPm5yb2ZhcmdzLTEpPyIsIjoiIik7CisJCWlmIChtYXghPWZ1bi0+bnJvZmFyZ3MpCisJCQlEUFJJTlRGKCIgLi4uIik7CisJfSBlbHNlIGlmIChmdW4tPm5yb2ZhcmdzPDApIHsKKwkJRFBSSU5URigiPHVua25vd24sIGNoZWNrIHJldHVybj4iKTsKKwkJcmV0LT5hcmdzID0gSGVhcEFsbG9jKFN5c3RlbUhlYXAsMCwxNipzaXplb2YoRFdPUkQpKTsKKwkJbWVtY3B5KHJldC0+YXJncywoTFBCWVRFKShFU1BfcmVnKGNvbnRleHQpKzgpLHNpemVvZihEV09SRCkqMTYpOworCX0KKwlEUFJJTlRGKCIpIHJldD0lMDhseCBmcz0lMDRseFxuIiwoRFdPUkQpKCpyZXRzKS0+ZW50cnlbaV0ub3JpZ3JldHVybixGU19yZWcoY29udGV4dCkpOworfQorCitSRUdTX0VOVFJZUE9JTlQoU05PT1BfUmV0dXJuKSB7CisJU05PT1BfUkVUVVJORU5UUlkJKnJldCA9IChTTk9PUF9SRVRVUk5FTlRSWSopKEVJUF9yZWcoY29udGV4dCktNSk7CisKKwkvKiBXZSBoYXZlbid0IGZvdW5kIG91dCB0aGUgbnJvZmFyZ3MgeWV0LiBJZiB3ZSBjYWxsZWQgYSBjZGVjbAorCSAqIGZ1bmN0aW9uIGl0IGlzIHRvbyBsYXRlIGFueXdheSBhbmQgd2UgY2FuIGp1c3Qgc2V0ICcwJyAod2hpY2ggCisJICogd2lsbCBiZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yaWcgYW5kIGN1cnJlbnQgRVNQCisJICogSWYgc3RkY2FsbCAtPiBldmVyeXRoaW5nIG9rLgorCSAqLworCWlmIChyZXQtPmRsbC0+ZnVuc1tyZXQtPm9yZGluYWxdLm5yb2ZhcmdzPDApCisJCXJldC0+ZGxsLT5mdW5zW3JldC0+b3JkaW5hbF0ubnJvZmFyZ3M9KEVTUF9yZWcoY29udGV4dCktcmV0LT5vcmlnRVNQLTQpLzQ7CisJRUlQX3JlZyhjb250ZXh0KSA9IChEV09SRClyZXQtPm9yaWdyZXR1cm47CisJaWYgKHJldC0+YXJncykgeworCQlpbnQJaSxtYXg7CisKKwkJRFBSSU5URigiUmV0ICAlcy4lbGQ6ICVzKCIscmV0LT5kbGwtPm5hbWUscmV0LT5vcmRpbmFsLHJldC0+ZGxsLT5mdW5zW3JldC0+b3JkaW5hbF0ubmFtZSk7CisJCW1heCA9IHJldC0+ZGxsLT5mdW5zW3JldC0+b3JkaW5hbF0ubnJvZmFyZ3M7CisJCWlmIChtYXg+MTYpIG1heD0xNjsKKworCQlmb3IgKGk9MDtpPG1heDtpKyspCisJCQlEUFJJTlRGKCIlcyVzIixTTk9PUF9QcmludEFyZyhyZXQtPmFyZ3NbaV0pLChpPG1heC0xKT8iLCI6IiIpOworCQlEUFJJTlRGKCIpIHJldHZhbCA9ICUwOGx4IHJldD0lMDhseCBmcz0lMDRseFxuIiwKKwkJCUVBWF9yZWcoY29udGV4dCksKERXT1JEKXJldC0+b3JpZ3JldHVybixGU19yZWcoY29udGV4dCkKKwkJKTsKKwkJSGVhcEZyZWUoU3lzdGVtSGVhcCwwLHJldC0+YXJncyk7CisJCXJldC0+YXJncyA9IE5VTEw7CisJfSBlbHNlCisJCURQUklOVEYoIlJldCAgJXMuJWxkOiAlcygpIHJldHZhbCA9ICUwOGx4IHJldD0lMDhseCBmcz0lMDRseFxuIiwKKwkJCXJldC0+ZGxsLT5uYW1lLHJldC0+b3JkaW5hbCxyZXQtPmRsbC0+ZnVuc1tyZXQtPm9yZGluYWxdLm5hbWUsCisJCQlFQVhfcmVnKGNvbnRleHQpLChEV09SRClyZXQtPm9yaWdyZXR1cm4sRlNfcmVnKGNvbnRleHQpCisJCSk7CisJcmV0LT5vcmlncmV0dXJuID0gTlVMTDsgLyogbWFyayBhcyBlbXB0eSAqLworfQorI2Vsc2UJLyogIV9faTM4Nl9fICovCit2b2lkIFNOT09QX1JlZ2lzdGVyRExMKEhNT0RVTEUzMiBobW9kLExQQ1NUUiBuYW1lLERXT1JEIG5yb2ZvcmRpbmFscykgeworCUZJWE1FKHNub29wLCJzbm9vcGluZyB3b3JrcyBvbmx5IG9uIGkzODYgZm9yIG5vdy5cbiIpOworCXJldHVybjsKK30KKworRkFSUFJPQzMyIFNOT09QX0dldFByb2NBZGRyZXNzMzIoSE1PRFVMRTMyIGhtb2QsTFBDU1RSIG5hbWUsRFdPUkQgb3JkaW5hbCxGQVJQUk9DMzIgb3JpZ2Z1bikgeworCXJldHVybiBvcmlnZnVuOworfQorI2VuZGlmCS8qICFfX2kzODZfXyAqLwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi90YXBpMzIuc3BlYyBiL3JlbGF5MzIvdGFwaTMyLnNwZWMKaW5kZXggMDExZDBhYi4uNDQ5ZGYwYyAxMDA2NDQKLS0tIGEvcmVsYXkzMi90YXBpMzIuc3BlYworKysgYi9yZWxheTMyL3RhcGkzMi5zcGVjCkBAIC00MiwxMiArNDIsMTIgQEAKICAzOSBzdHViICAgIGxpbmVHZXRUcmFuc2xhdGVDYXBzCiAgNDAgc3R1YiAgICBsaW5lSGFuZG9mZgogIDQxIHN0dWIgICAgbGluZUhvbGQKLSA0MiBzdHViICAgIGxpbmVJbml0aWFsaXplCisgNDIgc3RkY2FsbCBsaW5lSW5pdGlhbGl6ZShwdHIgbG9uZyBwdHIgc3RyIHB0cikgbGluZUluaXRpYWxpemUKICA0MyBzdHViICAgIGxpbmVNYWtlQ2FsbAogIDQ0IHN0dWIgICAgbGluZU1vbml0b3JEaWdpdHMKICA0NSBzdHViICAgIGxpbmVNb25pdG9yTWVkaWEKICA0NiBzdHViICAgIGxpbmVNb25pdG9yVG9uZXMKLSA0NyBzdHViICAgIGxpbmVOZWdvdGlhdGVBUElWZXJzaW9uCisgNDcgc3RkY2FsbCBsaW5lTmVnb3RpYXRlQVBJVmVyc2lvbihsb25nIGxvbmcgbG9uZyBsb25nIHB0ciBwdHIpIGxpbmVOZWdvdGlhdGVBUElWZXJzaW9uCiAgNDggc3R1YiAgICBsaW5lTmVnb3RpYXRlRXh0VmVyc2lvbgogIDQ5IHN0dWIgICAgbGluZU9wZW4KICA1MCBzdHViICAgIGxpbmVQYXJrCkBAIC03NCw3ICs3NCw3IEBACiAgNzEgc3R1YiAgICBsaW5lU2V0VG9sbExpc3QKICA3MiBzdHViICAgIGxpbmVTZXR1cENvbmZlcmVuY2UKICA3MyBzdHViICAgIGxpbmVTZXR1cFRyYW5zZmVyCi0gNzQgc3R1YiAgICBsaW5lU2h1dGRvd24KKyA3NCBzdGRjYWxsIGxpbmVTaHV0ZG93bihsb25nKSBsaW5lU2h1dGRvd24KICA3NSBzdHViICAgIGxpbmVTd2FwSG9sZAogIDc2IHN0dWIgICAgbGluZVRyYW5zbGF0ZUFkZHJlc3MKICA3NyBzdHViICAgIGxpbmVUcmFuc2xhdGVEaWFsb2cKZGlmZiAtLWdpdCBhL3JlbGF5MzIvdXNlcjMyLnNwZWMgYi9yZWxheTMyL3VzZXIzMi5zcGVjCmluZGV4IDcxZTgxNmMuLmZlMjQxYWYgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvdXNlcjMyLnNwZWMKKysrIGIvcmVsYXkzMi91c2VyMzIuc3BlYwpAQCAtMjEsNyArMjEsNyBAQAogIDE4IHN0ZGNhbGwgQ2FsbFdpbmRvd1Byb2NBKHB0ciBsb25nIGxvbmcgbG9uZyBsb25nKSBDYWxsV2luZG93UHJvYzMyQQogIDE5IHN0ZGNhbGwgQ2FsbFdpbmRvd1Byb2NXKHB0ciBsb25nIGxvbmcgbG9uZyBsb25nKSBDYWxsV2luZG93UHJvYzMyVwogIDIwIHN0dWIgQ2FzY2FkZUNoaWxkV2luZG93cwotIDIxIHN0dWIgQ2FzY2FkZVdpbmRvd3MKKyAyMSBzdGRjYWxsIENhc2NhZGVXaW5kb3dzKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIpIENhc2NhZGVXaW5kb3dzCiAgMjIgc3RkY2FsbCBDaGFuZ2VDbGlwYm9hcmRDaGFpbihsb25nIGxvbmcpIENoYW5nZUNsaXBib2FyZENoYWluMzIKICAyMyBzdGRjYWxsIENoYW5nZU1lbnVBKGxvbmcgbG9uZyBwdHIgbG9uZyBsb25nKSBDaGFuZ2VNZW51MzJBCiAgMjQgc3RkY2FsbCBDaGFuZ2VNZW51Vyhsb25nIGxvbmcgcHRyIGxvbmcgbG9uZykgQ2hhbmdlTWVudTMyVwpAQCAtMzI4LDcgKzMyOCw3IEBACiAzMjMgc3RkY2FsbCBJbnNlcnRNZW51SXRlbUEobG9uZyBsb25nIGxvbmcgcHRyKSBJbnNlcnRNZW51SXRlbTMyQQogMzI0IHN0ZGNhbGwgSW5zZXJ0TWVudUl0ZW1XKGxvbmcgbG9uZyBsb25nIHB0cikgSW5zZXJ0TWVudUl0ZW0zMlcKIDMyNSBzdGRjYWxsIEluc2VydE1lbnVXKGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBJbnNlcnRNZW51MzJXCi0zMjYgc3R1YiBJbnRlcm5hbEdldFdpbmRvd1RleHQKKzMyNiBzdGRjYWxsIEludGVybmFsR2V0V2luZG93VGV4dChsb25nIGxvbmcgbG9uZykgSW50ZXJuYWxHZXRXaW5kb3dUZXh0CiAzMjcgc3RkY2FsbCBJbnRlcnNlY3RSZWN0KHB0ciBwdHIgcHRyKSBJbnRlcnNlY3RSZWN0MzIKIDMyOCBzdGRjYWxsIEludmFsaWRhdGVSZWN0KGxvbmcgcHRyIGxvbmcpIEludmFsaWRhdGVSZWN0MzIKIDMyOSBzdGRjYWxsIEludmFsaWRhdGVSZ24obG9uZyBsb25nIGxvbmcpIEludmFsaWRhdGVSZ24zMgpAQCAtMzYyLDggKzM2Miw4IEBACiAzNTcgc3RkY2FsbCBMb2FkQml0bWFwQShsb25nIHN0cikgTG9hZEJpdG1hcDMyQQogMzU4IHN0ZGNhbGwgTG9hZEJpdG1hcFcobG9uZyB3c3RyKSBMb2FkQml0bWFwMzJXCiAzNTkgc3RkY2FsbCBMb2FkQ3Vyc29yQShsb25nIHN0cikgTG9hZEN1cnNvcjMyQQotMzYwIHN0dWIgTG9hZEN1cnNvckZyb21GaWxlQQotMzYxIHN0dWIgTG9hZEN1cnNvckZyb21GaWxlVworMzYwIHN0ZGNhbGwgTG9hZEN1cnNvckZyb21GaWxlQShzdHIpIExvYWRDdXJzb3JGcm9tRmlsZTMyQQorMzYxIHN0ZGNhbGwgTG9hZEN1cnNvckZyb21GaWxlVyh3c3RyKSBMb2FkQ3Vyc29yRnJvbUZpbGUzMlcKIDM2MiBzdGRjYWxsIExvYWRDdXJzb3JXKGxvbmcgd3N0cikgTG9hZEN1cnNvcjMyVwogMzYzIHN0ZGNhbGwgTG9hZEljb25BKGxvbmcgc3RyKSBMb2FkSWNvbjMyQQogMzY0IHN0ZGNhbGwgTG9hZEljb25XKGxvbmcgd3N0cikgTG9hZEljb24zMlcKQEAgLTQxMCw3ICs0MTAsNyBAQAogNDA1IHN0ZGNhbGwgT2VtVG9DaGFyVyhwdHIgcHRyKSBPZW1Ub0NoYXIzMlcKIDQwNiBzdGRjYWxsIE9mZnNldFJlY3QocHRyIGxvbmcgbG9uZykgT2Zmc2V0UmVjdDMyCiA0MDcgc3RkY2FsbCBPcGVuQ2xpcGJvYXJkKGxvbmcpIE9wZW5DbGlwYm9hcmQzMgotNDA4IHN0dWIgT3BlbkRlc2t0b3BBCis0MDggc3RkY2FsbCBPcGVuRGVza3RvcEEoc3RyIGxvbmcgbG9uZyBsb25nKSBPcGVuRGVza3RvcDMyQQogNDA5IHN0dWIgT3BlbkRlc2t0b3BXCiA0MTAgc3RkY2FsbCBPcGVuSWNvbihsb25nKSBPcGVuSWNvbjMyCiA0MTEgc3R1YiBPcGVuSW5wdXREZXNrdG9wCkBAIC00NTcsNyArNDU3LDcgQEAKIDQ1MiBzdGRjYWxsIFNlbmREbGdJdGVtTWVzc2FnZUEobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBTZW5kRGxnSXRlbU1lc3NhZ2UzMkEKIDQ1MyBzdGRjYWxsIFNlbmREbGdJdGVtTWVzc2FnZVcobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBTZW5kRGxnSXRlbU1lc3NhZ2UzMlcKIDQ1NCBzdGRjYWxsIFNlbmRNZXNzYWdlQShsb25nIGxvbmcgbG9uZyBsb25nKSBTZW5kTWVzc2FnZTMyQQotNDU1IHN0dWIgU2VuZE1lc3NhZ2VDYWxsYmFja0EKKzQ1NSBzdGRjYWxsIFNlbmRNZXNzYWdlQ2FsbGJhY2tBKGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyIGxvbmcpIFNlbmRNZXNzYWdlQ2FsbEJhY2szMkEKIDQ1NiBzdHViIFNlbmRNZXNzYWdlQ2FsbGJhY2tXCiA0NTcgc3RkY2FsbCBTZW5kTWVzc2FnZVRpbWVvdXRBKGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyIHB0cikgU2VuZE1lc3NhZ2VUaW1lb3V0MzJBCiA0NTggc3RkY2FsbCBTZW5kTWVzc2FnZVRpbWVvdXRXKGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyIHB0cikgU2VuZE1lc3NhZ2VUaW1lb3V0MzJXCkBAIC01MTIsOSArNTEyLDkgQEAKIDUwNyBzdHViIFNldFN5c3RlbUN1cnNvcgogNTA4IHN0ZGNhbGwgU2V0U3lzdGVtTWVudShsb25nIGxvbmcpIFNldFN5c3RlbU1lbnUzMgogNTA5IHN0ZGNhbGwgU2V0U3lzdGVtVGltZXIobG9uZyBsb25nIGxvbmcgcHRyKSBTZXRTeXN0ZW1UaW1lcjMyCi01MTAgc3R1YiBTZXRUaHJlYWREZXNrdG9wCis1MTAgc3RkY2FsbCBTZXRUaHJlYWREZXNrdG9wKGxvbmcpIFNldFRocmVhZERlc2t0b3AKIDUxMSBzdGRjYWxsIFNldFRpbWVyKGxvbmcgbG9uZyBsb25nIHB0cikgU2V0VGltZXIzMgotNTEyIHN0dWIgU2V0VXNlck9iamVjdEluZm9ybWF0aW9uQQorNTEyIHN0ZGNhbGwgU2V0VXNlck9iamVjdEluZm9ybWF0aW9uQShsb25nIGxvbmcgbG9uZyBsb25nKSBTZXRVc2VyT2JqZWN0SW5mb3JtYXRpb24zMkEKIDUxMyBzdHViIFNldFVzZXJPYmplY3RJbmZvcm1hdGlvblcKIDUxNCBzdHViIFNldFVzZXJPYmplY3RTZWN1cml0eQogNTE1IHN0ZGNhbGwgU2V0V2luZG93Q29udGV4dEhlbHBJZChsb25nIGxvbmcpIFNldFdpbmRvd0NvbnRleHRIZWxwSWQKQEAgLTU0Nyw3ICs1NDcsNyBAQAogNTQyIHN0ZGNhbGwgVGFiYmVkVGV4dE91dEEobG9uZyBsb25nIGxvbmcgc3RyIGxvbmcgbG9uZyBwdHIgbG9uZykgVGFiYmVkVGV4dE91dDMyQQogNTQzIHN0ZGNhbGwgVGFiYmVkVGV4dE91dFcobG9uZyBsb25nIGxvbmcgd3N0ciBsb25nIGxvbmcgcHRyIGxvbmcpIFRhYmJlZFRleHRPdXQzMlcKIDU0NCBzdHViIFRpbGVDaGlsZFdpbmRvd3MKLTU0NSBzdHViIFRpbGVXaW5kb3dzCis1NDUgc3RkY2FsbCBUaWxlV2luZG93cyhsb25nIGxvbmcgcHRyIGxvbmcgcHRyKSBUaWxlV2luZG93cwogNTQ2IHN0ZGNhbGwgVG9Bc2NpaShsb25nIGxvbmcgcHRyIHB0ciBsb25nKSBUb0FzY2lpMzIKIDU0NyBzdHViIFRvQXNjaWlFeAogNTQ4IHN0dWIgVG9Vbmljb2RlCmRpZmYgLS1naXQgYS9yZWxheTMyL3dpbm1tLnNwZWMgYi9yZWxheTMyL3dpbm1tLnNwZWMKaW5kZXggZjNiNDk0ZC4uZmMyMTBlNiAxMDA2NDQKLS0tIGEvcmVsYXkzMi93aW5tbS5zcGVjCisrKyBiL3JlbGF5MzIvd2lubW0uc3BlYwpAQCAtOSwxNCArOSwxNCBAQAogICA2IHN0dWIgRHJpdmVyQ2FsbGJhY2sKICAgNyBzdHViIERydkNsb3NlCiAgIDggc3R1YiBEcnZEZWZEcml2ZXJQcm9jCi0gIDkgc3R1YiBEcnZHZXRNb2R1bGVIYW5kbGUKKyAgOSBzdGRjYWxsIERydkdldE1vZHVsZUhhbmRsZShsb25nKSBHZXREcml2ZXJNb2R1bGVIYW5kbGUzMgogIDEwIHN0dWIgRHJ2T3BlbgogIDExIHN0dWIgRHJ2T3BlbkEKICAxMiBzdHViIERydlNlbmRNZXNzYWdlCiAgMTMgc3R1YiBHZXREcml2ZXJGbGFncwotIDE0IHN0dWIgR2V0RHJpdmVyTW9kdWxlSGFuZGxlCi0gMTUgc3RkY2FsbCBPcGVuRHJpdmVyKHB0ciBwdHIgbG9uZykgT3BlbkRyaXZlcgotIDE2IHN0dWIgT3BlbkRyaXZlckEKKyAxNCBzdGRjYWxsIEdldERyaXZlck1vZHVsZUhhbmRsZShsb25nKSBHZXREcml2ZXJNb2R1bGVIYW5kbGUzMgorIDE1IHN0ZGNhbGwgT3BlbkRyaXZlcih3c3RyIHdzdHIgbG9uZykgT3BlbkRyaXZlcjMyVworIDE2IHN0ZGNhbGwgT3BlbkRyaXZlckEoc3RyIHN0ciBsb25nKSBPcGVuRHJpdmVyMzJBCiAgMTcgc3RkY2FsbCBQbGF5U291bmQocHRyIGxvbmcgbG9uZykgUGxheVNvdW5kMzJBCiAgMTggc3RkY2FsbCBQbGF5U291bmRXKHB0ciBsb25nIGxvbmcpIFBsYXlTb3VuZDMyVwogIDE5IHN0dWIgU2VuZERyaXZlck1lc3NhZ2UKQEAgLTExMiwxOSArMTEyLDE5IEBACiAxMDkgc3RkY2FsbCBtaXhlck1lc3NhZ2UobG9uZyBsb25nIGxvbmcgbG9uZykgbWl4ZXJNZXNzYWdlMzIKIDExMCBzdGRjYWxsIG1peGVyT3BlbihwdHIgbG9uZyBsb25nIGxvbmcgbG9uZykgbWl4ZXJPcGVuMzIKIDExMSBzdGRjYWxsIG1peGVyU2V0Q29udHJvbERldGFpbHMobG9uZyBwdHIgbG9uZykgbWl4ZXJTZXRDb250cm9sRGV0YWlsczMyCi0xMTIgc3R1YiBtbWlvQWR2YW5jZQotMTEzIHN0dWIgbW1pb0FzY2VuZAotMTE0IHN0dWIgbW1pb0Nsb3NlCisxMTIgc3RkY2FsbCBtbWlvQWR2YW5jZShsb25nIHB0ciBsb25nKSBtbWlvQWR2YW5jZTMyCisxMTMgc3RkY2FsbCBtbWlvQXNjZW5kKGxvbmcgcHRyIGxvbmcpIG1taW9Bc2NlbmQzMgorMTE0IHN0ZGNhbGwgbW1pb0Nsb3NlKGxvbmcgbG9uZykgbW1pb0Nsb3NlMzIKIDExNSBzdHViIG1taW9DcmVhdGVDaHVuawotMTE2IHN0dWIgbW1pb0Rlc2NlbmQKLTExNyBzdHViIG1taW9GbHVzaAotMTE4IHN0dWIgbW1pb0dldEluZm8KKzExNiBzdGRjYWxsIG1taW9EZXNjZW5kKGxvbmcgcHRyIHB0ciBsb25nKSBtbWlvRGVzY2VuZAorMTE3IHN0ZGNhbGwgbW1pb0ZsdXNoKGxvbmcgbG9uZykgbW1pb0ZsdXNoMzIKKzExOCBzdGRjYWxsIG1taW9HZXRJbmZvKGxvbmcgcHRyIGxvbmcpIG1taW9HZXRJbmZvMzIKIDExOSBzdHViIG1taW9JbnN0YWxsSU9Qcm9jMTYKIDEyMCBzdGRjYWxsIG1taW9JbnN0YWxsSU9Qcm9jQShsb25nIHB0ciBsb25nKSBtbWlvSW5zdGFsbElPUHJvYzMyQQogMTIxIHN0dWIgbW1pb0luc3RhbGxJT1Byb2NXCiAxMjIgc3RkY2FsbCBtbWlvT3BlbkEoc3RyIHB0ciBsb25nKSBtbWlvT3BlbjMyQQogMTIzIHN0ZGNhbGwgbW1pb09wZW5XKHdzdHIgcHRyIGxvbmcpIG1taW9PcGVuMzJXCi0xMjQgc3R1YiBtbWlvUmVhZAorMTI0IHN0ZGNhbGwgbW1pb1JlYWQobG9uZyBwdHIgbG9uZykgbW1pb1JlYWQzMgogMTI1IHN0dWIgbW1pb1JlbmFtZUEKIDEyNiBzdHViIG1taW9SZW5hbWVXCiAxMjcgc3R1YiBtbWlvU2VlawpkaWZmIC0tZ2l0IGEvcmVsYXkzMi93aW5zcG9vbC5zcGVjIGIvcmVsYXkzMi93aW5zcG9vbC5zcGVjCmluZGV4IDllMDU5MzMuLjQ1NzVkM2YgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvd2luc3Bvb2wuc3BlYworKysgYi9yZWxheTMyL3dpbnNwb29sLnNwZWMKQEAgLTM1LDkgKzM1LDkgQEAKIDEzMiBzdHViIERFVklDRU1PREUKIDEzMyBzdHViIERlbGV0ZUZvcm1BCiAxMzQgc3R1YiBEZWxldGVGb3JtVwotMTM1IHN0dWIgRGVsZXRlTW9uaXRvckEKKzEzNSBzdGRjYWxsIERlbGV0ZU1vbml0b3JBKHN0ciBzdHIgc3RyKSBEZWxldGVNb25pdG9yMzJBCiAxMzYgc3R1YiBEZWxldGVNb25pdG9yVwotMTM3IHN0dWIgRGVsZXRlUG9ydEEKKzEzNyBzdGRjYWxsIERlbGV0ZVBvcnRBKHN0ciBsb25nIHN0cikgRGVsZXRlUG9ydDMyQQogMTM4IHN0dWIgRGVsZXRlUG9ydFcKIDEzOSBzdHViIERlbGV0ZVByaW50UHJvY2Vzc29yQQogMTQwIHN0dWIgRGVsZXRlUHJpbnRQcm9jZXNzb3JXCkBAIC00Niw3ICs0Niw3IEBACiAxNDMgc3R1YiBEZWxldGVQcmludGVyCiAxNDQgc3R1YiBEZWxldGVQcmludGVyQ29ubmVjdGlvbkEKIDE0NSBzdHViIERlbGV0ZVByaW50ZXJDb25uZWN0aW9uVwotMTQ2IHN0dWIgRGVsZXRlUHJpbnRlckRyaXZlckEKKzE0NiBzdGRjYWxsIERlbGV0ZVByaW50ZXJEcml2ZXJBKHN0ciBzdHIgc3RyKSBEZWxldGVQcmludGVyRHJpdmVyMzJBCiAxNDcgc3R1YiBEZWxldGVQcmludGVyRHJpdmVyVwogMTQ4IHN0dWIgRGVsZXRlUHJpbnRlcklDCiAxNDkgc3R1YiBEZXZRdWVyeVByaW50CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYyBiL3NjaGVkdWxlci9jcml0c2VjdGlvbi5jCmluZGV4IDQ4OTM3MTIuLmFjZWIyYzkgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9jcml0c2VjdGlvbi5jCisrKyBiL3NjaGVkdWxlci9jcml0c2VjdGlvbi5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAid2luYmFzZS5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJrMzJvYmouaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogCiB0eXBlZGVmIHN0cnVjdApAQCAtMTIyLDYgKzEyMywxMCBAQAogICovCiB2b2lkIFdJTkFQSSBFbnRlckNyaXRpY2FsU2VjdGlvbiggQ1JJVElDQUxfU0VDVElPTiAqY3JpdCApCiB7CisgICAgaWYgKChjcml0LT5SZXNlcnZlZD09LTEpICYmICEoY3JpdC0+TG9ja1NlbWFwaG9yZSkpIHsKKyAgICAJRklYTUUod2luMzIsImVudGVyaW5nIHVuaW5pdGlhbGl6ZWQgc2VjdGlvbiglcCk/XG4iLGNyaXQpOworICAgIAlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKGNyaXQpOworICAgIH0KICAgICBpZiAoSW50ZXJsb2NrZWRJbmNyZW1lbnQoICZjcml0LT5Mb2NrQ291bnQgKSkKICAgICB7CiAgICAgICAgIGlmIChjcml0LT5Pd25pbmdUaHJlYWQgPT0gR2V0Q3VycmVudFRocmVhZElkKCkpCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvazMyb2JqLmMgYi9zY2hlZHVsZXIvazMyb2JqLmMKaW5kZXggOTgwNTNhNC4uM2I5MWFiNSAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL2szMm9iai5jCisrKyBiL3NjaGVkdWxlci9rMzJvYmouYwpAQCAtMjM0LDcgKzIzNCw3IEBACiAgICAgZW50cnkgPSBLMzJPQkpfRmlyc3RFbnRyeTsKICAgICB3aGlsZSAoZW50cnkpCiAgICAgewotICAgICAgICBpZiAoKGxlbiA9PSBlbnRyeS0+bGVuKSAmJiAhbHN0cmNtcDMyQSggbmFtZSwgZW50cnktPm5hbWUpKQorICAgICAgICBpZiAoKGxlbiA9PSBlbnRyeS0+bGVuKSAmJiAhc3RyY21wKCBuYW1lLCBlbnRyeS0+bmFtZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIEszMk9CSiAqb2JqID0gZW50cnktPm9iajsKICAgICAgICAgICAgIEszMk9CSl9JbmNDb3VudCggb2JqICk7CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvcHJvY2Vzcy5jIGIvc2NoZWR1bGVyL3Byb2Nlc3MuYwppbmRleCAyMjU0ZDYzLi4zZWJjNjliIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvcHJvY2Vzcy5jCisrKyBiL3NjaGVkdWxlci9wcm9jZXNzLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgImZpbGUuaCIKQEAgLTY5MCwzICs2OTEsMTggQEAKICAgICBLMzJPQkpfRGVjQ291bnQoICZwcm9jZXNzLT5oZWFkZXIgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZXRQcm9jZXNzSGVhcHMgW0tFUk5FTDMyLjM3Nl0KKyAqLworRFdPUkQgV0lOQVBJIEdldFByb2Nlc3NIZWFwcyhEV09SRCBucm9maGVhcHMsSEFORExFMzIgKmhlYXBzKSB7CisJRklYTUUod2luMzIsIiglbGQsJXApLCBpbmNvbXBsZXRlIGltcGxlbWVudGF0aW9uLlxuIixucm9maGVhcHMsaGVhcHMpOworCisJaWYgKG5yb2ZoZWFwcykgeworCQloZWFwc1swXSA9IEdldFByb2Nlc3NIZWFwKCk7CisJCS8qIC4uLiBwcm9iYWJseSBTeXN0ZW1IZWFwIHRvbyA/ICovCisJCXJldHVybiAxOworCX0KKwkvKiBudW1iZXIgb2YgYXZhaWxhYmxlIGhlYXBzICovCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS90b29scy9idWlsZC5jIGIvdG9vbHMvYnVpbGQuYwppbmRleCBiYzM2Mjk0Li5mMDU2NGQ0IDEwMDY0NAotLS0gYS90b29scy9idWlsZC5jCisrKyBiL3Rvb2xzL2J1aWxkLmMKQEAgLTk5OCw3ICs5OTgsNyBAQAogICAgICAgICAgICAgICAgICAiX19hc21fXyhcIi5hbGlnbiA0XFxuXFx0XCJcbiIKICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCIuZ2xvYmwgIiBQUkVGSVggIiVzXFxuXFx0XCJcbiIKICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCIudHlwZSAiIFBSRUZJWCAiJXMsQGZ1bmN0aW9uXFxuXFx0XCJcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgXCIlczpcXG5cXHRcIlxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICBcIiIgUFJFRklYICIlczpcXG5cXHRcIlxuIgogICAgICAgICAgICAgICAgICAiICAgICAgICBcInB1c2hsICQiIFBSRUZJWCAiX19yZWdzXyVzXFxuXFx0XCJcbiIKICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCJwdXNobCAkIiBQUkVGSVggIkNBTEwzMl9SZWdzXFxuXFx0XCJcbiIKICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCJyZXRcIik7XG4iLApkaWZmIC0tZ2l0IGEvdG9vbHMvd3JjL3V0aWxzLmMgYi90b29scy93cmMvdXRpbHMuYwppbmRleCBmZDI4MzJmLi4xY2I4YWI4IDEwMDY0NAotLS0gYS90b29scy93cmMvdXRpbHMuYworKysgYi90b29scy93cmMvdXRpbHMuYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy93cmMvd3JjLmMgYi90b29scy93cmMvd3JjLmMKaW5kZXggOTEwY2YxNC4uNmZmY2QyOSAxMDA2NDQKLS0tIGEvdG9vbHMvd3JjL3dyYy5jCisrKyBiL3Rvb2xzL3dyYy93cmMuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAKICNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxyZXNvdXJjZS5oPgkvKiBGb3IgSEFWRV9XSU5FX0NPTlNUUlVDVE9SICovCiAjaW5jbHVkZSAid3JjLmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKICNpbmNsdWRlICJ3cml0ZXJlcy5oIgpAQCAtNDUsNiArNDYsNyBAQAogCiBjaGFyIHVzYWdlW10gPSAiVXNhZ2U6IHdyYyBbb3B0aW9ucy4uLl0gW2luZmlsZVsucmN8LnJlc11dXG4iCiAJIiAgIC1hIG4gICAgICAgIEFsaWdubWVudCBvZiByZXNvdXJjZSAod2luMTYgb25seSwgZGVmYXVsdCBpcyA0KVxuIgorCSIgICAtQSAgICAgICAgICBBdXRvIHJlZ2lzdGVyIHJlc291cmNlcyAob25seSB3aXRoIGdjYyAyLjcgYW5kIGJldHRlcilcbiIKIAkiICAgLWIgICAgICAgICAgQ3JlYXRlIGEgQyBhcnJheSBmcm9tIGEgYmluYXJ5IC5yZXMgZmlsZVxuIgogCSIgICAtYyAgICAgICAgICBBZGQgJ2NvbnN0JyBwcmVmaXggdG8gQyBjb25zdGFudHNcbiIKIAkiICAgLUMgY3AgICAgICAgU2V0IHRoZSByZXNvdXJjZSdzIGNvZGVwYWdlIHRvIGNwIChkZWZhdWx0IGlzIDApXG4iCkBAIC04Niw3ICs4OCwxMSBAQAogICogRGVmYXVsdCBwcmVmaXggZm9yIHJlc291cmNlIG5hbWVzIHVzZWQgaW4gdGhlIEMgYXJyYXkuCiAgKiBPcHRpb24gJy1wIG5hbWUnIHNldHMgaXQgdG8gJ25hbWUnCiAgKi8KKyNpZmRlZiBORUVEX1VOREVSU0NPUkVfUFJFRklYCitjaGFyICpwcmVmaXggPSAiX19SZXNvdXJjZSI7CisjZWxzZQogY2hhciAqcHJlZml4ID0gIl9SZXNvdXJjZSI7CisjZW5kaWYKIAogLyoKICAqIFNldCBpZiBjb21waWxpbmcgaW4gMzJiaXQgbW9kZSAoZGVmYXVsdCkuCkBAIC0xNzcsNiArMTgzLDExIEBACiAgKi8KIGludCBwZWRhbnRpYyA9IDA7CiAKKy8qCisgKiBTZXQgd2hlbiBhdXRvcmVnaXN0ZXIgY29kZSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBvdXRwdXQgKC1BIG9wdGlvbikKKyAqLworaW50IGF1dG9fcmVnaXN0ZXIgPSAwOworCiBjaGFyICpvdXRwdXRfbmFtZTsJCS8qIFRoZSBuYW1lIGdpdmVuIGJ5IHRoZSAtbyBvcHRpb24gKi8KIGNoYXIgKmlucHV0X25hbWU7CQkvKiBUaGUgbmFtZSBnaXZlbiBvbiB0aGUgY29tbWFuZC1saW5lICovCiBjaGFyICpoZWFkZXJfbmFtZTsJCS8qIFRoZSBuYW1lIGdpdmVuIGJ5IHRoZSAtSCBvcHRpb24gKi8KQEAgLTIxMiwxMyArMjIzLDE2IEBACiAJCQlzdHJjYXQoY21kbGluZSwgIiAiKTsKIAl9CiAKLQl3aGlsZSgob3B0YyA9IGdldG9wdChhcmdjLCBhcmd2LCAiYTpiY0M6ZDpEOmVnaEg6STpsOm5vOnA6cnN0VFZ3OlciKSkgIT0gRU9GKQorCXdoaWxlKChvcHRjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJhOkFiY0M6ZDpEOmVnaEg6STpsOm5vOnA6cnN0VFZ3OlciKSkgIT0gRU9GKQogCXsKIAkJc3dpdGNoKG9wdGMpCiAJCXsKIAkJY2FzZSAnYSc6CiAJCQlhbGlnbm1lbnQgPSBhdG9pKG9wdGFyZyk7CiAJCQlicmVhazsKKwkJY2FzZSAnQSc6CisJCQlhdXRvX3JlZ2lzdGVyID0gMTsKKwkJCWJyZWFrOwogCQljYXNlICdiJzoKIAkJCWJpbmFyeSA9IDE7CiAJCQlicmVhazsKQEAgLTI2Myw3ICsyNzcsMTMgQEAKIAkJCW91dHB1dF9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CiAJCQlicmVhazsKIAkJY2FzZSAncCc6Ci0JCQlwcmVmaXggPSBzdHJkdXAob3B0YXJnKTsKKyNpZmRlZiBORUVEX1VOREVSU0NPUkVfUFJFRklYCisJCQlwcmVmaXggPSAoY2hhciAqKXhtYWxsb2Moc3RybGVuKG9wdGFyZykrMik7CisJCQlwcmVmaXhbMF0gPSAnXyc7CisJCQlzdHJjcHkocHJlZml4KzEsIG9wdGFyZyk7CisjZWxzZQorCQkJcHJlZml4ID0geHN0cmR1cChvcHRhcmcpOworI2VuZGlmCiAJCQlicmVhazsKIAkJY2FzZSAncic6CiAJCQljcmVhdGVfcmVzID0gMTsKQEAgLTM1Nyw2ICszNzcsMTQgQEAKIAkJfQogCX0KIAorI2lmICFkZWZpbmVkKEhBVkVfV0lORV9DT05TVFJVQ1RPUikKKwlpZihhdXRvX3JlZ2lzdGVyKQorCXsKKwkJd2FybmluZygiQXV0b3JlZ2lzdGVyIGNvZGUgbm9uLW9wZXJhYmxlIChIQVZFX1dJTkVfQ09OU1RSVUNUT1Igbm90IGRlZmluZWQpIik7CisJCWF1dG9fcmVnaXN0ZXIgPSAwOworCX0KKyNlbmRpZgorCiAJLyogU2V0IGFsaWdubWVudCBwb3dlciAqLwogCWEgPSBhbGlnbm1lbnQ7CiAJZm9yKGFsaWdubWVudF9wd3IgPSAwOyBhbGlnbm1lbnRfcHdyIDwgMTAgJiYgYSA+IDE7IGFsaWdubWVudF9wd3IrKykKZGlmZiAtLWdpdCBhL3Rvb2xzL3dyYy93cmMuaCBiL3Rvb2xzL3dyYy93cmMuaAppbmRleCAxM2FkMjllLi5iM2Q4ZWY2IDEwMDY0NAotLS0gYS90b29scy93cmMvd3JjLmgKKysrIGIvdG9vbHMvd3JjL3dyYy5oCkBAIC0xMiw4ICsxMiw4IEBACiAjaW5jbHVkZSAid3JjdHlwZXMuaCIKICNlbmRpZgogCi0jZGVmaW5lIFdSQ19WRVJTSU9OCSIxLjAuMCIKLSNkZWZpbmUgV1JDX1JFTEVBU0VEQVRFCSIoMjgtTWF5LTE5OTgpIgorI2RlZmluZSBXUkNfVkVSU0lPTgkiMS4wLjEiCisjZGVmaW5lIFdSQ19SRUxFQVNFREFURQkiKDA4LUp1bi0xOTk4KSIKICNkZWZpbmUgV1JDX0ZVTExWRVJTSU9OIFdSQ19WRVJTSU9OICIgIiBXUkNfUkVMRUFTRURBVEUKIAogLyogT25seSB1c2VkIGluIGhlYXZ5IGRlYnVnZ2luZyBzZXNzaW9ucyAqLwpAQCAtNzYsNiArNzYsNyBAQAogZXh0ZXJuIGludCBjcmVhdGVfczsKIGV4dGVybiBEV09SRCBjb2RlcGFnZTsKIGV4dGVybiBpbnQgcGVkYW50aWM7CitleHRlcm4gaW50IGF1dG9fcmVnaXN0ZXI7CiAKIGV4dGVybiBjaGFyICpwcmVmaXg7CiBleHRlcm4gY2hhciAqb3V0cHV0X25hbWU7CmRpZmYgLS1naXQgYS90b29scy93cmMvd3JpdGVyZXMuYyBiL3Rvb2xzL3dyYy93cml0ZXJlcy5jCmluZGV4IDE4MDg0ZjAuLmJkMmZhMzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3dyYy93cml0ZXJlcy5jCisrKyBiL3Rvb2xzL3dyYy93cml0ZXJlcy5jCkBAIC0zMiw2ICszMiwyMSBAQAogCSIjIDxlb2Y+XG5cbiIKIAk7CiAKK2NoYXIgc19maWxlX2F1dG9yZWdfc3RyW10gPQorCSJcdC50ZXh0XG4iCisJIi5MQXV0b19SZWdpc3RlcjpcbiIKKwkiXHRwdXNobFx0JCVzJXNcbiIKKyNpZmRlZiBORUVEX1VOREVSU0NPUkVfUFJFRklYCisJIlx0Y2FsbFx0X0xJQlJFU19SZWdpc3RlclJlc291cmNlc1xuIgorI2Vsc2UKKwkiXHRjYWxsXHRMSUJSRVNfUmVnaXN0ZXJSZXNvdXJjZXNcbiIKKyNlbmRpZgorCSJcdGFkZGxcdCQ0LCUlZXNwXG4iCisJIlx0cmV0XG5cbiIKKwkiXHQuc2VjdGlvbiAuY3RvcnMsXCJhd1wiXG4iCisJIlx0LmxvbmdcdC5MQXV0b19SZWdpc3RlclxuXG4iCisJOworCiBjaGFyIGhfZmlsZV9oZWFkX3N0cltdID0KIAkiLypcbiIKIAkiICogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCB3aXRoIHdyYyB2ZXJzaW9uICIgV1JDX0ZVTExWRVJTSU9OICIuIERvIG5vdCBlZGl0IVxuIgpAQCAtMTAzMSw2ICsxMDQ2LDkgQEAKIAkJZnByaW50ZihmbywgIlxuIik7CiAJfQogCisJaWYoYXV0b19yZWdpc3RlcikKKwkJZnByaW50Zihmbywgc19maWxlX2F1dG9yZWdfc3RyLCBwcmVmaXgsIF9SZXNUYWJsZSk7CisKIAlmcHJpbnRmKGZvLCBzX2ZpbGVfdGFpbF9zdHIpOwogCWZjbG9zZShmbyk7CiB9CkBAIC0xMDUyLDI0ICsxMDcwLDEyIEBACiAJRklMRSAqZm87CiAJcmVzb3VyY2VfdCAqcnNjOwogCWNoYXIgKmhfcHJlZml4OwotCWludCBjbmFtZWlkeDsKIAotCWlmKHByZWZpeFswXSA9PSAnXycpCi0JewotCQloX3ByZWZpeCA9IHByZWZpeCArIDE7Ci0JCWNuYW1laWR4ID0gMDsKLQl9Ci0JZWxzZSBpZihwcmVmaXhbMF0gPT0gJ1wwJykKLQl7Ci0JCWhfcHJlZml4ID0gcHJlZml4OwotCQljbmFtZWlkeCA9IDE7Ci0JfQotCWVsc2UKLQl7Ci0JCWhfcHJlZml4ID0gcHJlZml4OwotCQljbmFtZWlkeCA9IDA7Ci0JCXdhcm5pbmcoIlJlc291cmNlcyBtaWdodCBub3QgYmUgdmlzaWJsZSBpbiBjLW5hbWVzcGFjZSAobWlzc2luZyAnXycgaW4gcHJlZml4KVxuIik7Ci0JfQorI2lmZGVmIE5FRURfVU5ERVJTQ09SRV9QUkVGSVgKKwloX3ByZWZpeCA9IHByZWZpeCArIDE7CisjZWxzZQorCWhfcHJlZml4ID0gcHJlZml4OworI2VuZGlmCiAKIAlmbyA9IGZvcGVuKG91dG5hbWUsICJ3dCIpOwogCWlmKCFmbykKQEAgLTEwODYsNyArMTA5Miw3IEBACiAJCWZwcmludGYoZm8sICJleHRlcm4gJXNjaGFyICVzJXNbXTtcblxuIiwKIAkJCWNvbnN0YW50ID8gImNvbnN0ICIgOiAiIiwKIAkJCWhfcHJlZml4LAotCQkJKHdpbjMyID8gX1BFUmVzVGFiIDogX05FUmVzVGFiKSArIGNuYW1laWR4KTsKKwkJCXdpbjMyID8gX1BFUmVzVGFiIDogX05FUmVzVGFiKTsKIAl9CiAKIAkvKiBXcml0ZSB0aGUgcmVzb3VyY2UgZGF0YSAqLwpAQCAtMTA5OCw3ICsxMTA0LDcgQEAKIAkJZnByaW50ZihmbywgImV4dGVybiAlc2NoYXIgJXMlc19kYXRhW107XG4iLAogCQkJY29uc3RhbnQgPyAiY29uc3QgIiA6ICIiLAogCQkJaF9wcmVmaXgsCi0JCQlyc2MtPmNfbmFtZSArIGNuYW1laWR4KTsKKwkJCXJzYy0+Y19uYW1lKTsKIAl9CiAKIAlpZihpbmRpcmVjdCkKQEAgLTExMTMsNyArMTExOSw3IEBACiAJCQkJY29uc3RhbnQgPyAiY29uc3QgIiA6ICIiLAogCQkJCXdpbjMyID8gMzIgOiAxNiwKIAkJCQloX3ByZWZpeCwKLQkJCQlyc2MtPmNfbmFtZSArIGNuYW1laWR4KTsKKwkJCQlyc2MtPmNfbmFtZSk7CiAJCX0KIAogCQlpZihnbG9iYWwpCkBAIC0xMTI0LDcgKzExMzAsNyBAQAogCQkJY29uc3RhbnQgPyAiY29uc3QgIiA6ICIiLAogCQkJd2luMzIgPyAzMiA6IDE2LAogCQkJaF9wcmVmaXgsCi0JCQlfUmVzVGFibGUgKyBjbmFtZWlkeCk7CisJCQlfUmVzVGFibGUpOwogCX0KIAogCWZwcmludGYoZm8sIGhfZmlsZV90YWlsX3N0cik7CmRpZmYgLS1naXQgYS93aW4zMi9NYWtlZmlsZS5pbiBiL3dpbjMyL01ha2VmaWxlLmluCmluZGV4IGJlYmY2MzIuLjM5Nzk4YWEgMTAwNjQ0Ci0tLSBhL3dpbjMyL01ha2VmaWxlLmluCisrKyBiL3dpbjMyL01ha2VmaWxlLmluCkBAIC05LDYgKzksNyBAQAogCWFkdmFwaS5jIFwKIAljb2RlX3BhZ2UuYyBcCiAJY29uc29sZS5jIFwKKwlkZXZpY2UuYyBcCiAJZXJyb3IuYyBcCiAJZXhjZXB0LmMgXAogCWZpbGUuYyBcCmRpZmYgLS1naXQgYS93aW4zMi9hZHZhcGkuYyBiL3dpbjMyL2FkdmFwaS5jCmluZGV4IDBiMzlkMGEuLjM2ODY0MmUgMTAwNjQ0Ci0tLSBhL3dpbjMyL2FkdmFwaS5jCisrKyBiL3dpbjMyL2FkdmFwaS5jCkBAIC0yMTIsNiArMjEyLDQwIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2V0RmlsZVNlY3VyaXR5QSBbMzIuNDVdCisgKiBPYnRhaW5zIFNwZWNpZmllZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VjdXJpdHkgb2YgYSBmaWxlIG9yIGRpcmVjdG9yeQorICogVGhlIGluZm9ybWF0aW9uIG9idGFpbmVkIGlzIGNvbnN0cmFpbmVkIGJ5IHRoZSBjYWxsZXJzIGFjY2VzIHJpZ2h0cyBhbmQKKyAqIHByaXZpbGlnZXMKKyAqLworCitCT09MMzIgV0lOQVBJIEdldEZpbGVTZWN1cml0eTMyQSggTFBDU1RSIGxwRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1VSSVRZX0lORk9STUFUSU9OIFJlcXVlc3RlZEluZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0RFU0NSSVBUT1IgcFNlY3VyaXR5RGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscG5MZW5ndGhOZWVkZWQpCit7CisgIEZJWE1FKGFkdmFwaSwgIiglcykgOiBzdHViXG4iLCBkZWJ1Z3N0cl9hKGxwRmlsZU5hbWUpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdldEZpbGVTZWN1cml0eWlXIFszMi40Nl0KKyAqIE9idGFpbnMgU3BlY2lmaWVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWN1cml0eSBvZiBhIGZpbGUgb3IgZGlyZWN0b3J5CisgKiBUaGUgaW5mb3JtYXRpb24gb2J0YWluZWQgaXMgY29uc3RyYWluZWQgYnkgdGhlIGNhbGxlcnMgYWNjZXMgcmlnaHRzIGFuZAorICogcHJpdmlsaWdlcworICovCisKK0JPT0wzMiBXSU5BUEkgR2V0RmlsZVNlY3VyaXR5MzJXKCBMUENXU1RSIGxwRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1VSSVRZX0lORk9STUFUSU9OIFJlcXVlc3RlZEluZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0RFU0NSSVBUT1IgcFNlY3VyaXR5RGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscG5MZW5ndGhOZWVkZWQpCit7CisgIEZJWE1FKGFkdmFwaSwgIiglcykgOiBzdHViXG4iLCBkZWJ1Z3N0cl93KGxwRmlsZU5hbWUpICk7IAorICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogT3BlblNlcnZpY2UzMkEgW0FEVkFQSTMyLjExMl0KICAqLwogSEFORExFMzIgV0lOQVBJIE9wZW5TZXJ2aWNlMzJBKCBIQU5ETEUzMiBoU0NNYW5hZ2VyLCBMUENTVFIgbHBTZXJ2aWNlTmFtZSwKZGlmZiAtLWdpdCBhL3dpbjMyL2RldmljZS5jIGIvd2luMzIvZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4ZDM2YQotLS0gL2Rldi9udWxsCisrKyBiL3dpbjMyL2RldmljZS5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogV2luMzIgZGV2aWNlIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTk4IE1hcmN1cyBNZWlzc25lcgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJtbXN5c3RlbS5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCit2b2lkIERFVklDRV9EZXN0cm95KEszMk9CSiAqZGV2KTsKK2NvbnN0IEszMk9CSl9PUFMgREVWSUNFX09wcyA9Cit7CisgICAgTlVMTCwJCS8qIHNpZ25hbGVkICovCisgICAgTlVMTCwJCS8qIHNhdGlzZmllZCAqLworICAgIE5VTEwsCQkvKiBhZGRfd2FpdCAqLworICAgIE5VTEwsCQkvKiByZW1vdmVfd2FpdCAqLworICAgIE5VTEwsCQkvKiByZWFkICovCisgICAgTlVMTCwJCS8qIHdyaXRlICovCisgICAgREVWSUNFX0Rlc3Ryb3kJLyogZGVzdHJveSAqLworfTsKKworLyogVGhlIGRldmljZSBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSzMyT0JKICAgIGhlYWRlcjsKKyAgICBpbnQgICAgICAgbW9kZTsKKyAgICBjaGFyICAgICAqZGV2bmFtZTsKK30gREVWSUNFX09CSkVDVDsKKworSEFORExFMzIKK0RFVklDRV9PcGVuKExQQ1NUUiBmaWxlbmFtZSwgRFdPUkQgYWNjZXNzKSB7CisJREVWSUNFX09CSkVDVAkqZGV2OworCUhBTkRMRTMyIGhhbmRsZTsKKworCWRldiA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKEZJTEVfT0JKRUNUKSApOworCWlmICghZGV2KQorCSAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKKwlkZXYtPmhlYWRlci50eXBlID0gSzMyT0JKX0RFVklDRV9JT0NUTDsKKwlkZXYtPmhlYWRlci5yZWZjb3VudCA9IDA7CisJZGV2LT5tb2RlCT0gYWNjZXNzOworCWRldi0+ZGV2bmFtZQk9IEhFQVBfc3RyZHVwQShTeXN0ZW1IZWFwLDAsZmlsZW5hbWUpOworCisJaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgJihkZXYtPmhlYWRlciksCisJCQkgICAgICAgRklMRV9BTExfQUNDRVNTIHwgR0VORVJJQ19SRUFEIHwKKwkJCSAgICAgICBHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19FWEVDVVRFIC8qRklYTUUqLywgVFJVRSApOworCS8qIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCwgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGRlc3Ryb3llZCAqLworCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikgZGV2ID0gTlVMTDsKKwlyZXR1cm4gaGFuZGxlOworfQorCit2b2lkCitERVZJQ0VfRGVzdHJveShLMzJPQkogKmRldikgeworCWFzc2VydChkZXYtPnR5cGUgPT0gSzMyT0JKX0RFVklDRV9JT0NUTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJRGV2aWNlSW9Db250cm9sIChLRVJORUwzMi4xODgpCisgKi8KK0JPT0wzMiBXSU5BUEkgRGV2aWNlSW9Db250cm9sKEhBTkRMRTMyIGhEZXZpY2UsIERXT1JEIGR3SW9Db250cm9sQ29kZSwgCisJCQkgICAgICBMUFZPSUQgbHB2bG5CdWZmZXIsIERXT1JEIGNibG5CdWZmZXIsCisJCQkgICAgICBMUFZPSUQgbHB2T3V0QnVmZmVyLCBEV09SRCBjYk91dEJ1ZmZlciwKKwkJCSAgICAgIExQRFdPUkQgbHBjYkJ5dGVzUmV0dXJuZWQsCisJCQkgICAgICBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKQoreworCURFVklDRV9PQkpFQ1QJKmRldiA9IChERVZJQ0VfT0JKRUNUICopSEFORExFX0dldE9ialB0cigKKwkJUFJPQ0VTU19DdXJyZW50KCksIGhEZXZpY2UsIEszMk9CSl9ERVZJQ0VfSU9DVEwsIDAgLypGSVhNRSovICk7CisKKyAgICAgICAgRklYTUUod2luMzIsICIoJWxkLCVsZCwlcCwlbGQsJXAsJWxkLCVwLCVwKSwgc3R1YlxuIiwKKwkJaERldmljZSxkd0lvQ29udHJvbENvZGUsbHB2bG5CdWZmZXIsY2JsbkJ1ZmZlciwKKwkJbHB2T3V0QnVmZmVyLGNiT3V0QnVmZmVyLGxwY2JCeXRlc1JldHVybmVkLGxwT3ZlcmxhcHBlZAorCSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBGQUxTRTsKKwkvKiBGSVhNRTogU2V0IGFwcHJvcHJpYXRlIGVycm9yICovCisJRklYTUUod2luMzIsIglkZXZpY2UgJXNcbiIsZGV2LT5kZXZuYW1lKTsKKwlpZiAoIXN0cmNtcChkZXYtPmRldm5hbWUsIlZUREFQSSIpKSB7CisJCXN3aXRjaCAoZHdJb0NvbnRyb2xDb2RlKSB7CisJCWNhc2UgNToJaWYgKGxwdk91dEJ1ZmZlciAmJiAoY2JPdXRCdWZmZXI+PTQpKQorCQkJCSooRFdPUkQqKWxwdk91dEJ1ZmZlciA9IHRpbWVHZXRUaW1lKCk7CisJCQlpZiAobHBjYkJ5dGVzUmV0dXJuZWQpCisJCQkJKmxwY2JCeXRlc1JldHVybmVkID0gNDsKKwkJCXJldHVybiBUUlVFOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJRklYTUUod2luMzIsIgkodW5oYW5kbGVkKVxuIik7CisJcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvd2luMzIvZmlsZS5jIGIvd2luMzIvZmlsZS5jCmluZGV4IDQ5YTJkNzcuLmNiYTg3MGYgMTAwNjQ0Ci0tLSBhL3dpbjMyL2ZpbGUuYworKysgYi93aW4zMi9maWxlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJmaWxlLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtMTE1LDEwICsxMTYsMjQgQEAKICAgICBpZih0ZW1wbGF0ZSkKICAgICAgICAgRklYTUUoZmlsZSwgInRlbXBsYXRlIGhhbmRsZXMgbm90IHN1cHBvcnRlZC5cbiIpOwogCi0gICAgLyogSWYgdGhlIG5hbWUgc3RhcnRzIHdpdGggJ1xcPycgb3IgJ1xcLicsIGlnbm9yZSB0aGUgZmlyc3QgMyBjaGFycy4KKyAgICAvKiBJZiB0aGUgbmFtZSBzdGFydHMgd2l0aCAnXFw/XCcgb3IgJ1xcLlwnLCBpZ25vcmUgdGhlIGZpcnN0IDQgY2hhcnMuCiAgICAgICovCi0gICAgaWYoIXN0cm5jbXAoZmlsZW5hbWUsICJcXFxcPyIsIDMpIHx8ICFzdHJuY21wKGZpbGVuYW1lLCAiXFxcXC4iLCAzKSkKLSAgICAgICAgZmlsZW5hbWUgKz0gMzsKKyAgICBpZighc3RybmNtcChmaWxlbmFtZSwgIlxcXFw/XFwiLCA0KSB8fCAhc3RybmNtcChmaWxlbmFtZSwgIlxcXFwuXFwiLCA0KSkKKyAgICB7CisgICAgICAgIGlmIChmaWxlbmFtZVsyXSA9PSAnLicpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZJWE1FKGZpbGUsImRldmljZSBuYW1lPyAlc1xuIixmaWxlbmFtZSk7CisgICAgICAgICAgICAvKiBkZXZpY2U/ICovCisgICAgICAgICAgICByZXR1cm4gREVWSUNFX09wZW4oIGZpbGVuYW1lKzQsIGFjY2Vzc19mbGFncyB8IGNyZWF0ZV9mbGFncyApOworICAgICAgICB9CisgICAgICAgIGZpbGVuYW1lICs9IDQ7CisJaWYgKCFzdHJuY21wKGZpbGVuYW1lLCAiVU5DIiwgMykpCisJeworICAgICAgICAgICAgRklYTUUoZmlsZSwgIlVOQyBuYW1lcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICAgICAgICAgICAgcmV0dXJuIEhGSUxFX0VSUk9SMzI7CisJfQkKKyAgICB9CiAKICAgICAvKiBJZiB0aGUgbmFtZSBzdGlsbCBzdGFydHMgd2l0aCAnXFwnLCBpdCdzIGEgVU5DIG5hbWUuCiAgICAgICovCmRpZmYgLS1naXQgYS93aW4zMi9uZXdmbnMuYyBiL3dpbjMyL25ld2Zucy5jCmluZGV4IDM3NmY0YTEuLjA4ZmFmMDEgMTAwNjQ0Ci0tLSBhL3dpbjMyL25ld2Zucy5jCisrKyBiL3dpbjMyL25ld2Zucy5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Z3N0ci5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCVVUUmVnaXN0ZXIgKEtFUk5FTDMyLjY5NykKQEAgLTYwLDYgKzYxLDEyIEBACiAJcmV0dXJuIDB4Y2FmZWJhYmU7CiB9CiAKK0hBTkRMRTMyIFdJTkFQSSBGaW5kRmlyc3RDaGFuZ2VOb3RpZmljYXRpb24zMlcoTFBDV1NUUiBscFBhdGhOYW1lLEJPT0wzMiBiV2F0Y2hTdWJ0cmVlLERXT1JEIGR3Tm90aWZ5RmlsdGVyKSB7CisJRklYTUUoZmlsZSwiKCVzLCVkLCUwOGx4KTogc3R1YlxuIiwKKwkgICAgICBkZWJ1Z3N0cl93KGxwUGF0aE5hbWUpLGJXYXRjaFN1YnRyZWUsZHdOb3RpZnlGaWx0ZXIpOworCXJldHVybiAweGNhZmViYWJlOworfQorCiBCT09MMzIgV0lOQVBJIEZpbmROZXh0Q2hhbmdlTm90aWZpY2F0aW9uKEhBTkRMRTMyIGZjbmhhbmRsZSkgewogCUZJWE1FKGZpbGUsIiglMDh4KTogc3R1YiFcbiIsZmNuaGFuZGxlKTsKIAlyZXR1cm4gRkFMU0U7CkBAIC04MSwyMiArODgsNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCURldmljZUlvQ29udHJvbCAoS0VSTkVMMzIuMTg4KQotICovCi1CT09MMzIgV0lOQVBJIERldmljZUlvQ29udHJvbChIQU5ETEUzMiBoRGV2aWNlLCBEV09SRCBkd0lvQ29udHJvbENvZGUsIAotCQkJICAgICAgTFBWT0lEIGxwdmxuQnVmZmVyLCBEV09SRCBjYmxuQnVmZmVyLAotCQkJICAgICAgTFBWT0lEIGxwdk91dEJ1ZmZlciwgRFdPUkQgY2JPdXRCdWZmZXIsCi0JCQkgICAgICBMUERXT1JEIGxwY2JCeXRlc1JldHVybmVkLAotCQkJICAgICAgTFBPVkVSTEFQUEVEIGxwb1B2ZXJsYXBwZWQpCi17Ci0KLSAgICAgICAgRklYTUUoY29tbSwgIiguLi4pOiBzdHViIVxuIik7Ci0JLyogRklYTUU6IFNldCBhcHByb3ByaWF0ZSBlcnJvciAqLwotCXJldHVybiBGQUxTRTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCUZsdXNoSW5zdHJ1Y3Rpb25DYWNoZSAoS0VSTkVMMzIuMjYxKQogICovCiBCT09MMzIgV0lOQVBJIEZsdXNoSW5zdHJ1Y3Rpb25DYWNoZShEV09SRCB4LERXT1JEIHksRFdPUkQgeikgewpAQCAtMTEwLDEyICsxMDEsMTIgQEAKIEhBTkRMRTMyIFdJTkFQSSBDcmVhdGVOYW1lZFBpcGVBIChMUENTVFIgbHBOYW1lLCBEV09SRCBkd09wZW5Nb2RlLAogCQkJCSAgRFdPUkQgZHdQaXBlTW9kZSwgRFdPUkQgbk1heEluc3RhbmNlcywKIAkJCQkgIERXT1JEIG5PdXRCdWZmZXJTaXplLCBEV09SRCBuSW5CdWZmZXJTaXplLAotCQkJCSAgRFdPUkQgbkRhZmF1bHRUaW1lT3V0LAorCQkJCSAgRFdPUkQgbkRlZmF1bHRUaW1lT3V0LAogCQkJCSAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwU2VjdXJpdHlBdHRyaWJ1dGVzKQogewogICBGSVhNRSAod2luMzIsICIoTmFtZT0lcywgT3Blbk1vZGU9JSMwOGx4LCBkd1BpcGVNb2RlPSUjMDhseCwgTWF4SW5zdD0lbGQsIE91dEJTaXplPSVsZCwgSW5CdWZmU2l6ZT0lbGQsIERlZlRpbWVPdXQ9JWxkLCBTZWNBdHRyPSVwKTogc3R1YlxuIiwKIAkgZGVidWdzdHJfYShscE5hbWUpLCBkd09wZW5Nb2RlLCBkd1BpcGVNb2RlLCBuTWF4SW5zdGFuY2VzLAotCSBuT3V0QnVmZmVyU2l6ZSwgbkluQnVmZmVyU2l6ZSwgbkRhZmF1bHRUaW1lT3V0LCAKKwkgbk91dEJ1ZmZlclNpemUsIG5JbkJ1ZmZlclNpemUsIG5EZWZhdWx0VGltZU91dCwgCiAJIGxwU2VjdXJpdHlBdHRyaWJ1dGVzKTsKICAgLyogaWYgKG5NYXhJbnN0YW5jZXMgPiBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMpIHsKICAgICBTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKQEAgLTEzMiwxMiArMTIzLDEyIEBACiBIQU5ETEUzMiBXSU5BUEkgQ3JlYXRlTmFtZWRQaXBlVyAoTFBDV1NUUiBscE5hbWUsIERXT1JEIGR3T3Blbk1vZGUsCiAJCQkJICBEV09SRCBkd1BpcGVNb2RlLCBEV09SRCBuTWF4SW5zdGFuY2VzLAogCQkJCSAgRFdPUkQgbk91dEJ1ZmZlclNpemUsIERXT1JEIG5JbkJ1ZmZlclNpemUsCi0JCQkJICBEV09SRCBuRGFmYXVsdFRpbWVPdXQsCisJCQkJICBEV09SRCBuRGVmYXVsdFRpbWVPdXQsCiAJCQkJICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBTZWN1cml0eUF0dHJpYnV0ZXMpCiB7CiAgIEZJWE1FICh3aW4zMiwgIihOYW1lPSVzLCBPcGVuTW9kZT0lIzA4bHgsIGR3UGlwZU1vZGU9JSMwOGx4LCBNYXhJbnN0PSVsZCwgT3V0QlNpemU9JWxkLCBJbkJ1ZmZTaXplPSVsZCwgRGVmVGltZU91dD0lbGQsIFNlY0F0dHI9JXApOiBzdHViXG4iLAogCSBkZWJ1Z3N0cl93KGxwTmFtZSksIGR3T3Blbk1vZGUsIGR3UGlwZU1vZGUsIG5NYXhJbnN0YW5jZXMsCi0JIG5PdXRCdWZmZXJTaXplLCBuSW5CdWZmZXJTaXplLCBuRGFmYXVsdFRpbWVPdXQsIAorCSBuT3V0QnVmZmVyU2l6ZSwgbkluQnVmZmVyU2l6ZSwgbkRlZmF1bHRUaW1lT3V0LCAKIAkgbHBTZWN1cml0eUF0dHJpYnV0ZXMpOwogCiAgIFNldExhc3RFcnJvciAoRVJST1JfVU5LTk9XTik7CkBAIC0xNDUsNiArMTM2LDIxIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJQ3JlYXRlUGlwZSAoS0VSTkVMMzIuMTcwKQorICovCisKK0JPT0wzMiBXSU5BUEkgQ3JlYXRlUGlwZShQSEFORExFIGhSZWFkUGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQSEFORExFIGhXcml0ZVBpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwUGlwZUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgblNpemUpCit7CisgIEZJWE1FICh3aW4zMiwiUmVhZFBpcGU9JXAgV3JpdGVQaXBlPSVwIFNlY0F0dHI9JXAgU2l6ZT0lbGQiLAorICAgICAgICAgICAgICAgaFJlYWRQaXBlLGhXcml0ZVBpcGUsbHBQaXBlQXR0cmlidXRlcyxuU2l6ZSk7CisgIFNldExhc3RFcnJvcihFUlJPUl9VTktOT1dOKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRTeXN0ZW1Qb3dlclN0YXR1cyAgICAgIChLRVJORUwzMi42MjEpCiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0U3lzdGVtUG93ZXJTdGF0dXMoTFBTWVNURU1fUE9XRVJfU1RBVFVTIHNwc19wdHIpCkBAIC0yOTksNyArMzA1LDcgQEAKICAqLwogRFdPUkQgV0lOQVBJIEdldFRocmVhZERlc2t0b3AoIERXT1JEIGR3VGhyZWFkSWQgKQogewotICAgIEZJWE1FKHdpbjMyLCAiKCVsZCk6IHN0dWJcbiIsZHdUaHJlYWRJZCk7CisgICAgRklYTUUod2luMzIsICIoJWx4KTogc3R1YlxuIixkd1RocmVhZElkKTsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMzYzLDYgKzM2OSw0NiBAQAogCiAKIEJPT0wzMiBXSU5BUEkgRW51bVBvcnRzMzJBKExQU1RSIG5hbWUsRFdPUkQgbGV2ZWwsTFBCWVRFIHBvcnRzLERXT1JEIGJ1ZnNpemUsTFBEV09SRCBidWZuZWVkZWQsTFBEV09SRCBidWZyZXR1cm5lZCkgewotCUZJWE1FKHdpbjMyLCIoJXMsJWQsJXAsJWQsJXAsJXApLCBzdHViIVxuIixuYW1lLGxldmVsLHBvcnRzLGJ1ZnNpemUsYnVmbmVlZGVkLGJ1ZnJldHVybmVkKTsKKwlGSVhNRSh3aW4zMiwiKCVzLCVsZCwlcCwlbGQsJXAsJXApLCBzdHViIVxuIixuYW1lLGxldmVsLHBvcnRzLGJ1ZnNpemUsYnVmbmVlZGVkLGJ1ZnJldHVybmVkKTsKIAlyZXR1cm4gRkFMU0U7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElzRGVidWdnZXJQcmVzZW50IFtLRVJORUwzMi44MjddCisgKgorICovCitCT09MMzIgV0lOQVBJIElzRGVidWdnZXJQcmVzZW50KCkgeworCUZJWE1FKHdpbjMyLCIgLi4uIG5vIGRlYnVnZ2VycyB5ZXQsIHJldHVybmluZyBGQUxTRS5cbiIpOworCXJldHVybiBGQUxTRTsgCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3BlbkRlc2t0b3AzMkEgW1VTRVIzMi40MDhdCisgKgorICogTk9URVMKKyAqICAgIFJldHVybiB0eXBlIHNob3VsZCBiZSBIREVTSworICovCitIQU5ETEUzMiBXSU5BUEkgT3BlbkRlc2t0b3AzMkEoIExQQ1NUUiBscHN6RGVza3RvcCwgRFdPUkQgZHdGbGFncywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmSW5oZXJpdCwgRFdPUkQgZHdEZXNpcmVkQWNjZXNzICkKK3sKKyAgICBGSVhNRSh3aW4zMiwiKCVzLCVseCwlaSwlbHgpOiBzdHViXG4iLGRlYnVnc3RyX2EobHBzekRlc2t0b3ApLGR3RmxhZ3MsCisgICAgICAgICAgZkluaGVyaXQsZHdEZXNpcmVkQWNjZXNzKTsKKyAgICByZXR1cm4gMTsKK30KKworCitCT09MMzIgV0lOQVBJIFNldFVzZXJPYmplY3RJbmZvcm1hdGlvbjMyQSggSEFORExFMzIgaE9iaiwgaW50IG5JbmRleCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIHB2SW5mbywgRFdPUkQgbkxlbmd0aCApCit7CisgICAgRklYTUUod2luMzIsIigleCwlZCwlcCwlbHgpOiBzdHViXG4iLGhPYmosbkluZGV4LHB2SW5mbyxuTGVuZ3RoKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitCT09MMzIgV0lOQVBJIFNldFRocmVhZERlc2t0b3AoIEhBTkRMRTMyIGhEZXNrdG9wICkKK3sKKyAgICBGSVhNRSh3aW4zMiwiKCV4KTogc3R1YlxuIixoRGVza3RvcCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL3dpbjMyL29yZGluYWxzLmMgYi93aW4zMi9vcmRpbmFscy5jCmluZGV4IGUwZTA4ZjcuLjQ4MWZhMDggMTAwNjQ0Ci0tLSBhL3dpbjMyL29yZGluYWxzLmMKKysrIGIvd2luMzIvb3JkaW5hbHMuYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAKIHN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIFdpbjE2TXV0ZXg7Ci1zdGF0aWMgU0VHUFRSIHNlZ1dpbjE2TXV0ZXggPSBOVUxMOworc3RhdGljIFNFR1BUUiBzZWdXaW4xNk11dGV4ID0gKFNFR1BUUilOVUxMOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzMsNyArMzMsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgX0NvbmZpcm1XaW4xNkxvY2sgICAgKEtFUk5FTDMyLjk2KQogICovCi1EV09SRCBfQ29uZmlybVdpbjE2TG9jayh2b2lkKQorRFdPUkQgV0lOQVBJIF9Db25maXJtV2luMTZMb2NrKHZvaWQpCiB7CiAgICAgRklYTUUod2luMzIsICIoKVxuIik7CiAgICAgcmV0dXJuIDE7CkBAIC00Miw3ICs0Miw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBfRW50ZXJTeXNMZXZlbCAgICAoS0VSTkVMMzIuOTcpCiAgKi8KLVZPSUQgX0VudGVyU3lzTGV2ZWwoQ1JJVElDQUxfU0VDVElPTiAqbG9jaykKK1ZPSUQgV0lOQVBJIF9FbnRlclN5c0xldmVsKENSSVRJQ0FMX1NFQ1RJT04gKmxvY2spCiB7CiAgICAgRklYTUUod2luMzIsICIoJXApXG4iLCBsb2NrKTsKIH0KQEAgLTUwLDcgKzUwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIF9FbnRlclN5c0xldmVsICAgIChLRVJORUwzMi45OCkKICAqLwotVk9JRCBfTGVhdmVTeXNMZXZlbChDUklUSUNBTF9TRUNUSU9OICpsb2NrKQorVk9JRCBXSU5BUEkgX0xlYXZlU3lzTGV2ZWwoQ1JJVElDQUxfU0VDVElPTiAqbG9jaykKIHsKICAgICBGSVhNRSh3aW4zMiwgIiglcClcbiIsIGxvY2spOwogfQpAQCAtNTgsNyArNTgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUmVsZWFzZVRodW5rTG9jayAgICAoS0VSTkVMMzIuNDgpCiAgKi8KLVZPSUQgUmVsZWFzZVRodW5rTG9jayhEV09SRCAqbXV0ZXhfY291bnQpCitWT0lEIFdJTkFQSSBSZWxlYXNlVGh1bmtMb2NrKERXT1JEICptdXRleF9jb3VudCkKIHsKICAgICBfTGVhdmVTeXNMZXZlbCgmV2luMTZNdXRleCk7CiAKQEAgLTY5LDcgKzY5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFJlc3RvcmVUaHVua0xvY2sgICAgKEtFUk5FTDMyLjQ5KQogICovCi1WT0lEIFJlc3RvcmVUaHVua0xvY2soRFdPUkQgbXV0ZXhfY291bnQpCitWT0lEIFdJTkFQSSBSZXN0b3JlVGh1bmtMb2NrKERXT1JEIG11dGV4X2NvdW50KQogewogICAgIE50Q3VycmVudFRlYigpLT5tdXRleF9jb3VudCA9IChXT1JEKW11dGV4X2NvdW50OwogCmRpZmYgLS1naXQgYS93aW4zMi90aW1lLmMgYi93aW4zMi90aW1lLmMKaW5kZXggYmZhMjc2NS4uOWRjMWU0YyAxMDA2NDQKLS0tIGEvd2luMzIvdGltZS5jCisrKyBiL3dpbjMyL3RpbWUuYwpAQCAtMTQ2LDUgKzE0Niw1IEBACiAgKiAgICAgICAgICAgICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUgIChLRVJORUwzMikKICAqLwogVk9JRCBXSU5BUEkgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoTFBGSUxFVElNRSBzeXN0ZW10aW1lQXNmaWxldGltZSkgewotCURPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSh0aW1lKE5VTEwpLHN5c3RlbXRpbWVBc2ZpbGV0aW1lLE5VTEwpOworCURPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSh0aW1lKE5VTEwpLHN5c3RlbXRpbWVBc2ZpbGV0aW1lLDApOwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9kZWZ3bmQuYyBiL3dpbmRvd3MvZGVmd25kLmMKaW5kZXggZWMwYWRlOC4uMWE1N2ZhNCAxMDA2NDQKLS0tIGEvd2luZG93cy9kZWZ3bmQuYworKysgYi93aW5kb3dzL2RlZnduZC5jCkBAIC0xNTMsNyArMTUzLDcgQEAKIAogICAgIGNhc2UgV01fUkJVVFRPTkRPV046CiAgICAgY2FzZSBXTV9OQ1JCVVRUT05ET1dOOgotICAgICAgICBpZiggd25kUHRyLT5mbGFncyAmIFdJTl9JU1dJTjMyICkgCisgICAgICAgIGlmICgod25kUHRyLT5mbGFncyAmIFdJTl9JU1dJTjMyKSB8fCBUV0VBS19XaW45NUxvb2spCiAgICAgICAgIHsKIAkgICAgQ2xpZW50VG9TY3JlZW4xNih3bmRQdHItPmh3bmRTZWxmLCAoTFBQT0lOVDE2KSZsUGFyYW0pOwogICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIHduZFB0ci0+aHduZFNlbGYsIFdNX0NPTlRFWFRNRU5VLApAQCAtMTY3LDcgKzE2Nyw2IEBACiAKICAgICAgLyogZWxzZSAKICAgICAgICogICAgIEZJWE1FOiBUcmFjayBzeXN0ZW0gcG9wdXAgaWYgY2xpY2sgd2FzIGluIHRoZSBjYXB0aW9uIGFyZWEuICovCi0KIAlicmVhazsKIAogICAgIGNhc2UgV01fTkNBQ1RJVkFURToKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCmluZGV4IDUzZTg5MWUuLjIyMjZhMmUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGlhbG9nLmMKKysrIGIvd2luZG93cy9kaWFsb2cuYwpAQCAtNTc2LDYgKzU3Niw3IEBACiAgICAgewogICAgICAgICAgIC8qIFRoZSBmb250IGhlaWdodCBtdXN0IGJlIG5lZ2F0aXZlIGFzIGl0IGlzIGEgcG9pbnQgc2l6ZSAqLwogICAgICAgICAgIC8qIChzZWUgQ3JlYXRlRm9udCgpIGRvY3VtZW50YXRpb24gaW4gdGhlIFdpbmRvd3MgU0RLKS4gICAqLworCiAJaWYgKHdpbjMyVGVtcGxhdGUpCiAJICAgIGhGb250ID0gQ3JlYXRlRm9udDMyVyggLXRlbXBsYXRlLnBvaW50U2l6ZSwgMCwgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUud2VpZ2h0LCB0ZW1wbGF0ZS5pdGFsaWMsIEZBTFNFLApAQCAtNTgzLDkgKzU4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0RPTlRDQVJFLCAoTFBDV1NUUil0ZW1wbGF0ZS5mYWNlTmFtZSApOwogCWVsc2UKIAkgICAgaEZvbnQgPSBDcmVhdGVGb250MTYoIC10ZW1wbGF0ZS5wb2ludFNpemUsIDAsIDAsIDAsIEZXX0RPTlRDQVJFLAotCQkJICAgIEZBTFNFLCBGQUxTRSwgRkFMU0UsIERFRkFVTFRfQ0hBUlNFVCwgMCwgMCwKLQkJCSAgICBQUk9PRl9RVUFMSVRZLCBGRl9ET05UQ0FSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5mYWNlTmFtZSApOworCQkJCSAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgREVGQVVMVF9DSEFSU0VULCAwLCAwLAorCQkJCSAgUFJPT0ZfUVVBTElUWSwgRkZfRE9OVENBUkUsCisJCQkJICB0ZW1wbGF0ZS5mYWNlTmFtZSApOwogCWlmIChoRm9udCkKIAl7CiAJICAgIFRFWFRNRVRSSUMxNiB0bTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZHJpdmVyLmMgYi93aW5kb3dzL2RyaXZlci5jCmluZGV4IDc5MzMzZmEuLmY2MmIzZjEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZHJpdmVyLmMKKysrIGIvd2luZG93cy9kcml2ZXIuYwpAQCAtMSwxMCArMSwxMiBAQAogLyoKLSAqIFdpbmUgRHJpdmVycyBmdW5jdGlvbnMKKyAqIFdJTkUgRHJpdmVycyBmdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgMTk5NCBNYXJ0aW4gQXlvdHRlCi0qLworICogQ29weXJpZ2h0IDE5OTggTWFyY3VzIE1laXNzbmVyCisgKi8KIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJkcml2ZXIuaCIKQEAgLTEyLDYgKzE0LDcgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiBMUERSSVZFUklURU0gbHBEcnZJdGVtTGlzdCA9IE5VTEw7CitMUERSSVZFUklURU0zMkEgbHBEcnZJdGVtTGlzdDMyID0gTlVMTDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglMb2FkU3RhcnR1cERyaXZlcnMKQEAgLTMzLDIwICszNiwxOSBAQAogICAgIHdoaWxlIChsc3RybGVuMzJBKCBwdHIgKSAhPSAwKQogICAgIHsKIAlUUkFDRShkcml2ZXIsICJzdHI9JyVzJ1xuIiwgcHRyICk7Ci0JaERydiA9IE9wZW5Ecml2ZXIoIHB0ciwgImRyaXZlcnMiLCAwTCApOworCWhEcnYgPSBPcGVuRHJpdmVyMTYoIHB0ciwgImRyaXZlcnMiLCAwTCApOwogCVRSQUNFKGRyaXZlciwgImhEcnY9JTA0eFxuIiwgaERydiApOwogCXB0ciArPSBsc3RybGVuMzJBKHB0cikgKyAxOwogICAgIH0KICAgICBUUkFDRShkcml2ZXIsICJlbmQgb2YgbGlzdCAhXG4iICk7Ci0KICAgICByZXR1cm47CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJU2VuZERyaXZlck1lc3NhZ2UJCVtVU0VSLjI1MV0KICAqLwotTFJFU1VMVCBXSU5BUEkgU2VuZERyaXZlck1lc3NhZ2UoSERSVlIxNiBoRHJpdmVyLCBVSU5UMTYgbXNnLCBMUEFSQU0gbFBhcmFtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0yKQorTFJFU1VMVCBXSU5BUEkgU2VuZERyaXZlck1lc3NhZ2UxNihIRFJWUjE2IGhEcml2ZXIsIFVJTlQxNiBtc2csIExQQVJBTSBsUGFyYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtMikKIHsKICAgICBMUERSSVZFUklURU0gbHBkcnY7CiAgICAgTFJFU1VMVCByZXR2YWw7CkBAIC03MSwyMSArNzMsNDggQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlTZW5kRHJpdmVyTWVzc2FnZQkJW1dJTk1NLjE5XQorICovCitMUkVTVUxUIFdJTkFQSSBTZW5kRHJpdmVyTWVzc2FnZTMyKEhEUlZSMzIgaERyaXZlciwgVUlOVDMyIG1zZywgTFBBUkFNIGxQYXJhbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0yKQoreworICAgIExQRFJJVkVSSVRFTTMyQSBscGRydjsKKyAgICBMUkVTVUxUIHJldHZhbDsKKworICAgIFRSQUNFKGRyaXZlciwgIiglMDR4LCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLAorCQkgICAgaERyaXZlciwgbXNnLCBsUGFyYW0xLCBsUGFyYW0yICk7CisKKyAgICBscGRydiA9IChMUERSSVZFUklURU0zMkEpaERyaXZlcjsKKyAgICBpZiAoIWxwZHJ2KQorCXJldHVybiAwOworCisgICAgcmV0dmFsID0gbHBkcnYtPmRyaXZlcnByb2MobHBkcnYtPmRpcy5oRHJpdmVyLGhEcml2ZXIsbXNnLGxQYXJhbTEsbFBhcmFtMik7CisKKyAgICBUUkFDRShkcml2ZXIsICJyZXR2YWwgPSAlbGRcbiIsIHJldHZhbCApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlPcGVuRHJpdmVyCQkgICAgICAgIFtVU0VSLjI1Ml0KICAqLwotSERSVlIxNiBXSU5BUEkgT3BlbkRyaXZlcihMUFNUUiBscERyaXZlck5hbWUsIExQU1RSIGxwU2VjdGlvbk5hbWUsIExQQVJBTSBsUGFyYW0pCi17CitIRFJWUjE2IFdJTkFQSSBPcGVuRHJpdmVyMTYoCisJTFBDU1RSIGxwRHJpdmVyTmFtZSwgTFBDU1RSIGxwU2VjdGlvbk5hbWUsIExQQVJBTSBsUGFyYW0KKykgewogICAgIEhEUlZSMTYgaERydnI7CiAgICAgTFBEUklWRVJJVEVNIGxwZHJ2LCBscG5ld2RydjsKICAgICBjaGFyIERydk5hbWVbMTI4XTsKLSAgICBXT1JEIG9yZGluYWw7CiAKICAgICBUUkFDRShkcml2ZXIsIignJXMnLCAnJXMnLCAlMDhsWCk7XG4iLAogCQkgICAgbHBEcml2ZXJOYW1lLCBscFNlY3Rpb25OYW1lLCBsUGFyYW0gKTsKIAotICAgIGlmIChscFNlY3Rpb25OYW1lID09IE5VTEwpIGxwU2VjdGlvbk5hbWUgPSAiZHJpdmVycyI7Ci0gICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmczMkEoIGxwU2VjdGlvbk5hbWUsIGxwRHJpdmVyTmFtZSwgIiIsIERydk5hbWUsCi0JCQkgICAgIHNpemVvZihEcnZOYW1lKSwgIlNZU1RFTS5JTkkiICk7CisgICAgaWYgKGxwU2VjdGlvbk5hbWUgPT0gTlVMTCkgeworICAgIAlsc3RyY3B5bjMyQShEcnZOYW1lLGxwRHJpdmVyTmFtZSxzaXplb2YoRHJ2TmFtZSkpOworCUZJWE1FKGRyaXZlciwic2VjdGlvbm5hbWUgTlVMTCwgYXNzdW1pbmcgZGlyZWN0ZmlsZW5hbWUgKCVzKVxuIixscERyaXZlck5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKCBscFNlY3Rpb25OYW1lLCBscERyaXZlck5hbWUsICIiLCBEcnZOYW1lLAorCQkJCSAgICAgc2l6ZW9mKERydk5hbWUpLCAiU1lTVEVNLklOSSIgKTsKKyAgICB9CiAgICAgVFJBQ0UoZHJpdmVyLCJEcnZOYW1lPSclcydcbiIsIERydk5hbWUgKTsKICAgICBpZiAobHN0cmxlbjMyQShEcnZOYW1lKSA8IDEpIHJldHVybiAwOwogCkBAIC05NSw3ICsxMjQsNyBAQAogCWlmICghbHN0cmNtcGkzMkEoIGxwRHJpdmVyTmFtZSwgbHBkcnYtPmRpcy5zekFsaWFzTmFtZSApKQogCXsKIAkgICAgbHBkcnYtPmNvdW50Kys7Ci0JICAgIFNlbmREcml2ZXJNZXNzYWdlKCBscGRydi0+ZGlzLmhEcml2ZXIsIERSVl9PUEVOLCAwTCwgbFBhcmFtICk7CisJICAgIFNlbmREcml2ZXJNZXNzYWdlMTYoIGxwZHJ2LT5kaXMuaERyaXZlciwgRFJWX09QRU4sIDBMLCBsUGFyYW0gKTsKIAkgICAgcmV0dXJuIGxwZHJ2LT5kaXMuaERyaXZlcjsKIAl9CiAJbHBkcnYgPSBscGRydi0+bHBOZXh0SXRlbTsKQEAgLTEyMCwxMCArMTQ5LDcgQEAKICAgICBscG5ld2Rydi0+ZGlzLmhEcml2ZXIgPSBoRHJ2cjsKICAgICBsc3RyY3B5MzJBKCBscG5ld2Rydi0+ZGlzLnN6QWxpYXNOYW1lLCBscERyaXZlck5hbWUgKTsKICAgICBscG5ld2Rydi0+Y291bnQgPSAxOwotICAgIG9yZGluYWwgPSBORV9HZXRPcmRpbmFsKCBscG5ld2Rydi0+ZGlzLmhNb2R1bGUsICJEUklWRVJQUk9DIiApOwotICAgIGlmICghb3JkaW5hbCB8fAotICAgICAgICAhKGxwbmV3ZHJ2LT5scERydlByb2MgPSAoRFJJVkVSUFJPQzE2KU5FX0dldEVudHJ5UG9pbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscG5ld2Rydi0+ZGlzLmhNb2R1bGUsIG9yZGluYWwgKSkpCisgICAgaWYgKCEobHBuZXdkcnYtPmxwRHJ2UHJvYyA9IChEUklWRVJQUk9DMTYpV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihscG5ld2Rydi0+ZGlzLmhNb2R1bGUsICJEUklWRVJQUk9DIiApKSkKICAgICB7CiAJRnJlZU1vZHVsZTE2KCBscG5ld2Rydi0+ZGlzLmhNb2R1bGUgKTsKIAlHbG9iYWxVbmxvY2sxNiggaERydnIgKTsKQEAgLTE0MywxOCArMTY5LDEwNCBAQAogCWxwbmV3ZHJ2LT5scFByZXZJdGVtID0gbHBkcnY7CiAgICAgfQogCi0gICAgU2VuZERyaXZlck1lc3NhZ2UoIGhEcnZyLCBEUlZfTE9BRCwgMEwsIGxQYXJhbSApOwotICAgIFNlbmREcml2ZXJNZXNzYWdlKCBoRHJ2ciwgRFJWX0VOQUJMRSwgMEwsIGxQYXJhbSApOwotICAgIFNlbmREcml2ZXJNZXNzYWdlKCBoRHJ2ciwgRFJWX09QRU4sIDBMLCBsUGFyYW0gKTsKKyAgICBTZW5kRHJpdmVyTWVzc2FnZTE2KCBoRHJ2ciwgRFJWX0xPQUQsIDBMLCBsUGFyYW0gKTsKKyAgICBTZW5kRHJpdmVyTWVzc2FnZTE2KCBoRHJ2ciwgRFJWX0VOQUJMRSwgMEwsIGxQYXJhbSApOworICAgIFNlbmREcml2ZXJNZXNzYWdlMTYoIGhEcnZyLCBEUlZfT1BFTiwgMEwsIGxQYXJhbSApOwogCiAgICAgVFJBQ0UoZHJpdmVyLCAiaERydnI9JTA0eCBsb2FkZWQgIVxuIiwgaERydnIgKTsKICAgICByZXR1cm4gaERydnI7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJQ2xvc2VEcml2ZXIJCQkJW1VTRVIuMjUzXQorICoJCQkJT3BlbkRyaXZlcgkJICAgICAgICBbV0lOTU0uMTVdCisgKiAoMCwxLERSVl9MT0FEICAsMCAgICAgICAsMCkKKyAqICgwLDEsRFJWX0VOQUJMRSwwICAgICAgICwwKQorICogKDAsMSxEUlZfT1BFTiAgLGJ1ZlsyNTZdLDApCiAgKi8KLUxSRVNVTFQgV0lOQVBJIENsb3NlRHJpdmVyKEhEUlZSMTYgaERydnIsIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikKK0hEUlZSMzIgV0lOQVBJIE9wZW5Ecml2ZXIzMkEoCisJTFBDU1RSIGxwRHJpdmVyTmFtZSwgTFBDU1RSIGxwU2VjdGlvbk5hbWUsIExQQVJBTSBsUGFyYW0KKykgeworICAgIEhEUlZSMzIgaERydnI7CisgICAgTFBEUklWRVJJVEVNMzJBIGxwZHJ2LCBscG5ld2RydjsKKyAgICBjaGFyIERydk5hbWVbMTI4XSwqdG1wYnVmOworCisgICAgVFJBQ0UoZHJpdmVyLCIoJyVzJywgJyVzJywgJTA4bFgpO1xuIiwKKwkJICAgIGxwRHJpdmVyTmFtZSxscFNlY3Rpb25OYW1lLGxQYXJhbSApOworCisgICAgaWYgKGxwU2VjdGlvbk5hbWUgPT0gTlVMTCkgeworICAgIAlsc3RyY3B5bjMyQShEcnZOYW1lLGxwRHJpdmVyTmFtZSxzaXplb2YoRHJ2TmFtZSkpOworCUZJWE1FKGRyaXZlciwic2VjdGlvbm5hbWUgTlVMTCwgYXNzdW1pbmcgZGlyZWN0ZmlsZW5hbWUgKCVzKVxuIixscERyaXZlck5hbWUpOworICAgIH0gZWxzZSAgeworCUdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKCBscFNlY3Rpb25OYW1lLCBscERyaXZlck5hbWUsICIiLCBEcnZOYW1lLAorCQkJCSBzaXplb2YoRHJ2TmFtZSksICJzeXN0ZW0uaW5pIiApOworICAgIH0KKyAgICBUUkFDRShkcml2ZXIsIkRydk5hbWU9JyVzJ1xuIiwgRHJ2TmFtZSApOworICAgIGlmIChsc3RybGVuMzJBKERydk5hbWUpIDwgMSkgcmV0dXJuIDA7CisKKyAgICBscGRydiA9IGxwRHJ2SXRlbUxpc3QzMjsKKyAgICB3aGlsZSAobHBkcnYpIHsKKwlpZiAoIWxzdHJjbXBpMzJBKCBscERyaXZlck5hbWUsIGxwZHJ2LT5kaXMuc3pBbGlhc05hbWUgKSkgeworCSAgICBscGRydi0+Y291bnQrKzsKKwkgICAgbHBkcnYtPmRpcy5oRHJpdmVyID0gU2VuZERyaXZlck1lc3NhZ2UzMiggbHBkcnYtPmRpcy5oRHJpdmVyLCBEUlZfT1BFTiwgIiIvKkZJWE1FKi8sIDBMICk7CisJICAgIHJldHVybiAoSERSVlIzMilscGRydjsKKwl9CisJbHBkcnYgPSBscGRydi0+bmV4dDsKKyAgICB9CisKKyAgICBoRHJ2ciA9IChIRFJWUjMyKUhlYXBBbGxvYyhTeXN0ZW1IZWFwLDAsIHNpemVvZihEUklWRVJJVEVNMzJBKSApOworICAgIGlmICghaERydnIpIHsKKyAgICAJRVJSKGRyaXZlciwib3V0IG9mIG1lbW9yeSIpOworCXJldHVybiAwOworICAgIH0KKyAgICBscG5ld2RydiA9IChEUklWRVJJVEVNMzJBKiloRHJ2cjsKKyAgICBscG5ld2Rydi0+ZGlzLmxlbmd0aCA9IHNpemVvZiggRFJJVkVSSU5GT1NUUlVDVDMyQSApOworICAgIGxwbmV3ZHJ2LT5kaXMuaE1vZHVsZSA9IExvYWRMaWJyYXJ5MzJBKCBEcnZOYW1lICk7CisgICAgaWYgKCFscG5ld2Rydi0+ZGlzLmhNb2R1bGUpIHsKKyAgICAJRklYTUUoZHJpdmVyLCJjb3VsZCBub3QgbG9hZCBsaWJyYXJ5ICVzXG4iLERydk5hbWUpOworCUhlYXBGcmVlKCBTeXN0ZW1IZWFwLDAsKExQVk9JRCloRHJ2ciApOworCXJldHVybiAwOworICAgIH0KKyAgICBsc3RyY3B5MzJBKCBscG5ld2Rydi0+ZGlzLnN6QWxpYXNOYW1lLCBscERyaXZlck5hbWUgKTsKKyAgICBscG5ld2Rydi0+Y291bnQgPSAxOworICAgIGlmICghKGxwbmV3ZHJ2LT5kcml2ZXJwcm9jID0gKERSSVZFUlBST0MzMilHZXRQcm9jQWRkcmVzczMyKGxwbmV3ZHJ2LT5kaXMuaE1vZHVsZSwgIkRyaXZlclByb2MiICkpKQorICAgIHsKKyAgICAJRklYTUUoZHJpdmVyLCJubyAnRHJpdmVyUHJvYycgZm91bmQgaW4gJXNcbiIsRHJ2TmFtZSk7CisJRnJlZU1vZHVsZTMyKCBscG5ld2Rydi0+ZGlzLmhNb2R1bGUgKTsKKwlIZWFwRnJlZSggU3lzdGVtSGVhcCwwLCAoTFBWT0lEKWhEcnZyICk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgbHBuZXdkcnYtPm5leHQgPSBscERydkl0ZW1MaXN0MzI7CisgICAgbHBEcnZJdGVtTGlzdDMyID0gbHBuZXdkcnY7CisKKyAgICBTZW5kRHJpdmVyTWVzc2FnZTMyKCBoRHJ2ciwgRFJWX0xPQUQsIDBMLCBsUGFyYW0gKTsKKyAgICBTZW5kRHJpdmVyTWVzc2FnZTMyKCBoRHJ2ciwgRFJWX0VOQUJMRSwgMEwsIGxQYXJhbSApOworICAgIHRtcGJ1ZiA9IEhlYXBBbGxvYyhTeXN0ZW1IZWFwLDAsMjU2KTsKKyAgICBscG5ld2Rydi0+ZGlzLmhEcml2ZXI9U2VuZERyaXZlck1lc3NhZ2UzMihoRHJ2cixEUlZfT1BFTix0bXBidWYsbFBhcmFtKTsKKyAgICBIZWFwRnJlZShTeXN0ZW1IZWFwLDAsdG1wYnVmKTsKKyAgICBUUkFDRShkcml2ZXIsICJoRHJ2cj0lMDR4IGxvYWRlZCAhXG4iLCBoRHJ2ciApOworICAgIHJldHVybiBoRHJ2cjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlPcGVuRHJpdmVyCQkgICAgICAgIFtXSU5NTS4xNV0KKyAqLworSERSVlIzMiBXSU5BUEkgT3BlbkRyaXZlcjMyVygKKwlMUENXU1RSIGxwRHJpdmVyTmFtZSwgTFBDV1NUUiBscFNlY3Rpb25OYW1lLCBMUEFSQU0gbFBhcmFtCispIHsKKwlMUFNUUiBkbiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsbHBEcml2ZXJOYW1lKTsKKwlMUFNUUiBzbiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsbHBTZWN0aW9uTmFtZSk7CisJSERSVlIzMglyZXQgPSBPcGVuRHJpdmVyMzJBKGRuLHNuLGxQYXJhbSk7CisKKwlpZiAoZG4pIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxkbik7CisJaWYgKHNuKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc24pOworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlDbG9zZURyaXZlcgkJCQlbVVNFUi4yNTNdCisgKi8KK0xSRVNVTFQgV0lOQVBJIENsb3NlRHJpdmVyMTYoSERSVlIxNiBoRHJ2ciwgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKQogewogICAgIExQRFJJVkVSSVRFTSBscGRydjsKIApAQCAtMTY0LDExICsyNzYsMTEgQEAKICAgICBscGRydiA9IChMUERSSVZFUklURU0pR2xvYmFsTG9jazE2KCBoRHJ2ciApOwogICAgIGlmIChscGRydiAhPSBOVUxMICYmIGxwZHJ2LT5kaXMuaERyaXZlciA9PSBoRHJ2cikKICAgICB7Ci0JU2VuZERyaXZlck1lc3NhZ2UoIGhEcnZyLCBEUlZfQ0xPU0UsIGxQYXJhbTEsIGxQYXJhbTIgKTsKKwlTZW5kRHJpdmVyTWVzc2FnZTE2KCBoRHJ2ciwgRFJWX0NMT1NFLCBsUGFyYW0xLCBsUGFyYW0yICk7CiAJaWYgKC0tbHBkcnYtPmNvdW50ID09IDApCiAJewotCSAgICBTZW5kRHJpdmVyTWVzc2FnZSggaERydnIsIERSVl9ESVNBQkxFLCBsUGFyYW0xLCBsUGFyYW0yICk7Ci0JICAgIFNlbmREcml2ZXJNZXNzYWdlKCBoRHJ2ciwgRFJWX0ZSRUUsIGxQYXJhbTEsIGxQYXJhbTIgKTsKKwkgICAgU2VuZERyaXZlck1lc3NhZ2UxNiggaERydnIsIERSVl9ESVNBQkxFLCBsUGFyYW0xLCBsUGFyYW0yICk7CisJICAgIFNlbmREcml2ZXJNZXNzYWdlMTYoIGhEcnZyLCBEUlZfRlJFRSwgbFBhcmFtMSwgbFBhcmFtMiApOwogCiAJICAgIGlmIChscGRydi0+bHBQcmV2SXRlbSkKIAkgICAgICBscGRydi0+bHBQcmV2SXRlbS0+bHBOZXh0SXRlbSA9IGxwZHJ2LT5scE5leHRJdGVtOwpAQCAtMTkyLDcgKzMwNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCUdldERyaXZlck1vZHVsZUhhbmRsZQlbVVNFUi4yNTRdCiAgKi8KLUhNT0RVTEUxNiBXSU5BUEkgR2V0RHJpdmVyTW9kdWxlSGFuZGxlKEhEUlZSMTYgaERydnIpCitITU9EVUxFMTYgV0lOQVBJIEdldERyaXZlck1vZHVsZUhhbmRsZTE2KEhEUlZSMTYgaERydnIpCiB7CiAgICAgTFBEUklWRVJJVEVNIGxwZHJ2OwogICAgIEhNT0RVTEUxNiBoTW9kdWxlID0gMDsKQEAgLTIwOSw2ICszMjEsMTkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlHZXREcml2ZXJNb2R1bGVIYW5kbGUJW1VTRVIuMjU0XQorICovCitITU9EVUxFMzIgV0lOQVBJIEdldERyaXZlck1vZHVsZUhhbmRsZTMyKEhEUlZSMzIgaERydnIpCit7CisgICAgTFBEUklWRVJJVEVNMzJBIGxwZHJ2ID0gKExQRFJJVkVSSVRFTTMyQSloRHJ2cjsKKworICAgIFRSQUNFKGRyaXZlciwgIiglMDR4KTtcbiIsIGhEcnZyKTsKKyAgICBpZiAoIWxwZHJ2KQorICAgIAlyZXR1cm4gMDsKKyAgICByZXR1cm4gbHBkcnYtPmRpcy5oTW9kdWxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCURlZkRyaXZlclByb2MJCQlbVVNFUi4yNTVdCiAgKi8KIExSRVNVTFQgV0lOQVBJIERlZkRyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIxNiBoRHJpdiwgVUlOVDE2IHdNc2csIApkaWZmIC0tZ2l0IGEvd2luZG93cy9ncmFwaGljcy5jIGIvd2luZG93cy9ncmFwaGljcy5jCmluZGV4IGUzZTFkMjUuLmZjZGY4NTkgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZ3JhcGhpY3MuYworKysgYi93aW5kb3dzL2dyYXBoaWNzLmMKQEAgLTUyLDYgKzUyLDcgQEAKIAkgICAgYlJldCA9IFRSVUU7CiAJfQogCWlmKCBoUHJldlBlbiApIFNlbGVjdE9iamVjdDMyKCBoZGMsIGhQcmV2UGVuICk7CisJR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKICAgICB9CiAgICAgcmV0dXJuIGJSZXQ7CiB9CkBAIC02OSwxMCArNzAsMTQgQEAKIHsKICAgICBCSVRNQVBPQkogKmJtcDsKICAgICBEQyAqZGM7CisgICAgQk9PTDMyIHJldCA9IFRSVUU7CiAKICAgICBpZiAoIShkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKCEoYm1wID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKCBoYml0bWFwLCBCSVRNQVBfTUFHSUMgKSkpCisgICAgeworICAgICAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOwogICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogCiAgICAgeGRlc3QgKz0gZGMtPncuRENPcmdYOyB5ZGVzdCArPSBkYy0+dy5EQ09yZ1k7CiAKQEAgLTEwNCwxNyArMTA5LDE5IEBACiAJCQl4c3JjLCB5c3JjLCB3aWR0aCwgaGVpZ2h0LCB4ZGVzdCwgeWRlc3QsIHBsYW5lICk7CiAJfQogCWVsc2UgCisJewogCSAgICBUU1hDb3B5QXJlYSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguZHJhd2FibGUsIAogCQkgICAgICAgZGMtPnUueC5nYywgeHNyYywgeXNyYywgd2lkdGgsIGhlaWdodCwgeGRlc3QsIHlkZXN0ICk7CisJfQogICAgIH0KICAgICBlbHNlIAogICAgIHsKLSAgICAgIEdESV9IRUFQX1VOTE9DSyggaGJpdG1hcCApOwotICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgcmV0ID0gRkFMU0U7CiAgICAgfQogCisgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKICAgICBHRElfSEVBUF9VTkxPQ0soIGhiaXRtYXAgKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKQEAgLTE5NSw2ICsyMDIsNyBAQAogICAgIH0KIAogICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIGhQcmV2QnJ1c2ggKTsKKyAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOwogfQogCiAKQEAgLTIxNiw2ICsyMjQsNyBAQAogCSAgICBUU1hEcmF3UmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKIAkJCSAgICB4ICsgZGMtPncuRENPcmdYLCB5ICsgZGMtPncuRENPcmdZLCB3IC0gMSwgaCAtIDEpOwogCWlmKCBoUHJldlBlbiApIFNlbGVjdE9iamVjdDMyKCBoZGMsIGhQcmV2UGVuICk7CisJR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKICAgICB9CiB9CiAKQEAgLTIzMSwxMyArMjQwLDE3IEBACiAgICAgaWYgKCBoTW9ub0JpdG1hcCApIAogICAgIHsKICAgICAgICBpZiAoICEoYm1wID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKCBoTW9ub0JpdG1hcCwgQklUTUFQX01BR0lDKSkgCi0JICAgfHwgYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgIT0gMSApIHJldHVybiBGQUxTRTsKLQkgIAorCSAgIHx8IGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsICE9IDEgKSAKKyAgICAgICB7CisJICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKKwkgICByZXR1cm4gRkFMU0U7CisgICAgICAgfQogICAgICAgIFRTWFNldENsaXBPcmlnaW4oIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LkRDT3JnWCArIHgsIGRjLT53LkRDT3JnWSArIHkpOwogICAgIH0KIAogICAgIFRTWFNldENsaXBNYXNrKCBkaXNwbGF5LCBkYy0+dS54LmdjLCAoYm1wKSA/IGJtcC0+cGl4bWFwIDogTm9uZSApOwogCisgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKICAgICBHRElfSEVBUF9VTkxPQ0soIGhNb25vQml0bWFwICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL21kaS5jIGIvd2luZG93cy9tZGkuYwppbmRleCAxODVjN2NlLi40N2U3ZTA3IDEwMDY0NAotLS0gYS93aW5kb3dzL21kaS5jCisrKyBiL3dpbmRvd3MvbWRpLmMKQEAgLTE3MDgsMyArMTcwOCwzOSBAQAogCQkJU1dfSU5WQUxJREFURSB8IFNXX0VSQVNFIHwgU1dfU0NST0xMQ0hJTERSRU4gKTsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDYXNjYWRlV2luZG93cyBbVVNFUjMyLjIxXSBDYXNjYWRlcyBNREkgY2hpbGQgd2luZG93cworICoKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IE51bWJlciBvZiBjYXNjYWRlZCB3aW5kb3dzLgorICogICAgRmFpbHVyZTogMAorICovCitXT1JEIFdJTkFQSQorQ2FzY2FkZVdpbmRvd3MgKEhXTkQzMiBod25kUGFyZW50LCBVSU5UMzIgd0ZsYWdzLCBjb25zdCBMUFJFQ1QzMiBscFJlY3QsCisJCVVJTlQzMiBjS2lkcywgY29uc3QgSFdORDMyICpscEtpZHMpCit7CisgICAgRklYTUUgKG1kaSwgIigweCUwOHgsMHglMDh4LC4uLiwldSwuLi4pOiBzdHViXG4iLAorCSAgIGh3bmRQYXJlbnQsIHdGbGFncywgY0tpZHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGlsZVdpbmRvd3MgW1VTRVIzMi41NDVdIFRpbGVzIE1ESSBjaGlsZCB3aW5kb3dzCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogTnVtYmVyIG9mIHRpbGVkIHdpbmRvd3MuCisgKiAgICBGYWlsdXJlOiAwCisgKi8KK1dPUkQgV0lOQVBJCitUaWxlV2luZG93cyAoSFdORDMyIGh3bmRQYXJlbnQsIFVJTlQzMiB3RmxhZ3MsIGNvbnN0IExQUkVDVDMyIGxwUmVjdCwKKwkgICAgIFVJTlQzMiBjS2lkcywgY29uc3QgSFdORDMyICpscEtpZHMpCit7CisgICAgRklYTUUgKG1kaSwgIigweCUwOHgsMHglMDh4LC4uLiwldSwuLi4pOiBzdHViXG4iLAorCSAgIGh3bmRQYXJlbnQsIHdGbGFncywgY0tpZHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggZWU1NzY5Ni4uODI2MzhlZCAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTE3MzYsMyArMTczNiwxMyBAQAogCSk7CiAJcmV0dXJuIDA7CiB9CisKK0JPT0wzMiBXSU5BUEkgU2VuZE1lc3NhZ2VDYWxsQmFjazMyQSgKKwlIV05EMzIgaFduZCxVSU5UMzIgTXNnLFdQQVJBTTMyIHdQYXJhbSxMUEFSQU0gbFBhcmFtLAorCS8qU0VOREFTWU5DUFJPQyovRkFSUFJPQzMyIGxwUmVzdWx0Q2FsbEJhY2ssRFdPUkQgZHdEYXRhCispIHsKKwlGSVhNRShtc2csIigweCUwNHgsMHglMDR4LDB4JTA4bHgsMHglMDhseCwlcCwweCUwOGx4KSxzdHViIVxuIiwKKwkJaFduZCxNc2csd1BhcmFtLGxQYXJhbSxscFJlc3VsdENhbGxCYWNrLGR3RGF0YQorCSk7CisJcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9ub25jbGllbnQuYyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKaW5kZXggOGVhNDBjMi4uNTIxYzBiMSAxMDA2NDQKLS0tIGEvd2luZG93cy9ub25jbGllbnQuYworKysgYi93aW5kb3dzL25vbmNsaWVudC5jCkBAIC05OCw4ICs5OCwxNyBAQAogICAgIH0KICAgICBpZiAobWVudSkgcmVjdC0+dG9wIC09IFNZU01FVFJJQ1NfQ1lNRU5VICsgU1lTTUVUUklDU19DWUJPUkRFUjsKIAotICAgIGlmIChzdHlsZSAmIFdTX1ZTQ1JPTEwpIHJlY3QtPnJpZ2h0ICArPSBTWVNNRVRSSUNTX0NYVlNDUk9MTCAtIDE7Ci0gICAgaWYgKHN0eWxlICYgV1NfSFNDUk9MTCkgcmVjdC0+Ym90dG9tICs9IFNZU01FVFJJQ1NfQ1lIU0NST0xMIC0gMTsKKyAgICBpZiAoc3R5bGUgJiBXU19WU0NST0xMKSB7CisgICAgICByZWN0LT5yaWdodCAgKz0gU1lTTUVUUklDU19DWFZTQ1JPTEwgLSAxOworICAgICAgaWYoIShzdHlsZSAmIFdTX0JPUkRFUikpCisJIHJlY3QtPnJpZ2h0Kys7CisgICAgfQorCisgICAgaWYgKHN0eWxlICYgV1NfSFNDUk9MTCkgeworICAgICAgcmVjdC0+Ym90dG9tICs9IFNZU01FVFJJQ1NfQ1lIU0NST0xMIC0gMTsKKyAgICAgIGlmKCEoc3R5bGUgJiBXU19CT1JERVIpKQorCSByZWN0LT5ib3R0b20rKzsKKyAgICB9CiB9CiAKIApAQCAtMTQ5LDcgKzE1OCw3IEBACiAgICAgICAgICAgICByZWN0LT50b3AgLT0gU1lTTUVUUklDU19DWUNBUFRJT04gLSBTWVNNRVRSSUNTX0NZQk9SREVSOwogICAgIH0KICAgICBpZiAobWVudSkgcmVjdC0+dG9wIC09IFNZU01FVFJJQ1NfQ1lNRU5VICsgU1lTTUVUUklDU19DWUJPUkRFUiArIDI7Ci0gICAgZWxzZSAgaWYgKCEoc3R5bGUgJiBXU19DSElMRCkpIHJlY3QtPnRvcCArPSBTWVNNRVRSSUNTX0NZQk9SREVSOworICAgIGVsc2UgaWYgKCEoc3R5bGUgJiBXU19DSElMRCkpIHJlY3QtPnRvcCArPSBTWVNNRVRSSUNTX0NZQk9SREVSOwogCiAgICAgaWYgKHN0eWxlICYgV1NfVlNDUk9MTCkgcmVjdC0+cmlnaHQgICs9IFNZU01FVFJJQ1NfQ1hWU0NST0xMOwogICAgIGlmIChzdHlsZSAmIFdTX0hTQ1JPTEwpIHJlY3QtPmJvdHRvbSArPSBTWVNNRVRSSUNTX0NZSFNDUk9MTDsKQEAgLTE1OSw3ICsxNjgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRHJhd0NhcHRpb25UZW1wQSAgICAoVVNFUjMyLjU5OSkKICAqLwotRFdPUkQgRHJhd0NhcHRpb25UZW1wMzJBKEhXTkQzMiBod25kLEhEQzMyIGhkYyxMUFJFQ1QzMiByZWN0LAorRFdPUkQgV0lOQVBJIERyYXdDYXB0aW9uVGVtcDMyQShIV05EMzIgaHduZCxIREMzMiBoZGMsTFBSRUNUMzIgcmVjdCwKICAgICBIRk9OVDMyIGhmb250LERXT1JEIHgxLExQQ1NUUiBzdHIsRFdPUkQgeDIpCiB7CiAgICAgRklYTUUobm9uY2xpZW50LCIoJTA4eCwlMDh4LCVwLCUwOHgsJTA4bHgsXCIlc1wiLCUwOGx4KTogc3R1YlxuIiwKQEAgLTE5Nyw3ICsyMDYsNyBAQAogICAgIGlmICghKHN0eWxlICYgKFdTX1BPUFVQIHwgV1NfQ0hJTEQpKSkgIC8qIE92ZXJsYXBwZWQgd2luZG93ICovCiAJc3R5bGUgfD0gV1NfQ0FQVElPTjsKICAgICBzdHlsZSAmPSAoV1NfRExHRlJBTUUgfCBXU19CT1JERVIgfCBXU19USElDS0ZSQU1FIHwgV1NfQ0hJTEQpOwotICAgIGV4U3R5bGUgJj0gV1NfRVhfRExHTU9EQUxGUkFNRTsKKyAgICBleFN0eWxlICY9IChXU19FWF9ETEdNT0RBTEZSQU1FIHwgV1NfRVhfQ0xJRU5URURHRSk7CiAgICAgaWYgKGV4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSBzdHlsZSAmPSB+V1NfVEhJQ0tGUkFNRTsKIAogICAgIFRSQUNFKG5vbmNsaWVudCwgIiglZCwlZCktKCVkLCVkKSAlMDhseCAlZCAlMDhseFxuIiwKQEAgLTI3Niw4ICsyODUsNiBAQAogICogR2V0IHRoZSAnaW5zaWRlJyByZWN0YW5nbGUgb2YgYSB3aW5kb3csIGkuZS4gdGhlIHdob2xlIHdpbmRvdyByZWN0YW5nbGUKICAqIGJ1dCB3aXRob3V0IHRoZSBib3JkZXJzIChpZiBhbnkpLgogICogVGhlIHJlY3RhbmdsZSBpcyBpbiB3aW5kb3cgY29vcmRpbmF0ZXMgKGZvciBkcmF3aW5nIHdpdGggR2V0V2luZG93REMoKSkuCi0gKgotICogRklYTUU6ICBBIFdpbjk1IHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQuCiAgKi8KIHN0YXRpYyB2b2lkIE5DX0dldEluc2lkZVJlY3QoIEhXTkQzMiBod25kLCBSRUNUMzIgKnJlY3QgKQogewpAQCAtMzA5LDYgKzMxNiw0MiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE5DX0dldEluc2lkZVJlY3Q5NQorICoKKyAqIEdldCB0aGUgJ2luc2lkZScgcmVjdGFuZ2xlIG9mIGEgd2luZG93LCBpLmUuIHRoZSB3aG9sZSB3aW5kb3cgcmVjdGFuZ2xlCisgKiBidXQgd2l0aG91dCB0aGUgYm9yZGVycyAoaWYgYW55KS4KKyAqIFRoZSByZWN0YW5nbGUgaXMgaW4gd2luZG93IGNvb3JkaW5hdGVzIChmb3IgZHJhd2luZyB3aXRoIEdldFdpbmRvd0RDKCkpLgorICovCisKK3N0YXRpYyB2b2lkCitOQ19HZXRJbnNpZGVSZWN0OTUgKEhXTkQzMiBod25kLCBSRUNUMzIgKnJlY3QpCit7CisgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKworICAgIHJlY3QtPnRvcCAgICA9IHJlY3QtPmxlZnQgPSAwOworICAgIHJlY3QtPnJpZ2h0ICA9IHduZFB0ci0+cmVjdFdpbmRvdy5yaWdodCAtIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0OworICAgIHJlY3QtPmJvdHRvbSA9IHduZFB0ci0+cmVjdFdpbmRvdy5ib3R0b20gLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wOworCisgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19JQ09OSUMpIHx8ICh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpKSByZXR1cm47CisKKyAgICAgIC8qIFJlbW92ZSBmcmFtZSBmcm9tIHJlY3RhbmdsZSAqLworICAgIGlmIChIQVNfRExHRlJBTUUgKHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5kd0V4U3R5bGUgKSkKKyAgICB7CisJSW5mbGF0ZVJlY3QzMiggcmVjdCwgLVNZU01FVFJJQ1NfQ1hGSVhFREZSQU1FLCAtU1lTTUVUUklDU19DWUZJWEVERlJBTUUpOworICAgIH0KKyAgICBlbHNlIGlmIChIQVNfVEhJQ0tGUkFNRSAod25kUHRyLT5kd1N0eWxlKSkKKyAgICB7CisJSW5mbGF0ZVJlY3QzMiggcmVjdCwgLVNZU01FVFJJQ1NfQ1hTSVpFRlJBTUUsIC1TWVNNRVRSSUNTX0NZU0laRUZSQU1FICk7CisKKwlpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfQk9SREVSKQorCSAgICBJbmZsYXRlUmVjdDMyKCByZWN0LCAtU1lTTUVUUklDU19DWEJPUkRFUiwgLVNZU01FVFJJQ1NfQ1lCT1JERVIgKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTkNfSGFuZGxlTkNIaXRUZXN0CiAgKgogICogSGFuZGxlIGEgV01fTkNISVRURVNUIG1lc3NhZ2UuIENhbGxlZCBmcm9tIERlZldpbmRvd1Byb2MoKS4KQEAgLTUyNiwyOSArNTY5LDI4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICBOQ19EcmF3U3lzQnV0dG9uOTUoCi0gICAgSFdORDMyICBod25kLAotICAgIEhEQzMyICBoZGMsCi0gICAgQk9PTDMyICBkb3duICkKK3ZvaWQKK05DX0RyYXdTeXNCdXR0b245NSAoSFdORDMyIGh3bmQsIEhEQzMyIGhkYywgQk9PTDMyIGRvd24pCiB7CiAgICAgUkVDVDMyIHJlY3Q7CiAgICAgSERDMzIgaGRjTWVtOwogICAgIEhCSVRNQVAzMiBoYml0bWFwOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLSAgICBTSVpFMzIgIGJtc3o7CiAKICAgICBpZiggISh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpICkKICAgICB7Ci0JTkNfR2V0SW5zaWRlUmVjdCggaHduZCwgJnJlY3QgKTsKKwlCSVRNQVAzMiBibXA7CisKKwlOQ19HZXRJbnNpZGVSZWN0OTUoIGh3bmQsICZyZWN0ICk7CiAJaGRjTWVtID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIoIGhkYyApOwogCWhiaXRtYXAgPSBTZWxlY3RPYmplY3QzMiggaGRjTWVtLCBoYml0bWFwQ2xvc2UgKTsKLQlpZihHZXRCaXRtYXBEaW1lbnNpb25FeDMyKCBoYml0bWFwQ2xvc2UsICZibXN6ICkpIHsKLQkgICAgQml0Qmx0MzIoaGRjLCByZWN0LmxlZnQgKyAoc3lzTWV0cmljc1tTTV9DWFNJWkVdIC0gYm1zei5jeCkgLyAyICsKKwlHZXRPYmplY3QzMkEgKGhiaXRtYXBDbG9zZSwgc2l6ZW9mKEJJVE1BUDMyKSwgJmJtcCk7CisJQml0Qmx0MzIgKGhkYywgcmVjdC5sZWZ0ICsgKHN5c01ldHJpY3NbU01fQ1hTSVpFXSAtIGJtcC5ibVdpZHRoKSAvIDIgKwogCQkgICAgIE5DX1N5c0NvbnRyb2xOdWRnZSwKLQkJICAgICByZWN0LnRvcCArIChzeXNNZXRyaWNzW1NNX0NZU0laRV0gLSBibXN6LmN5IC0gMSkgLyAyLAotCQkgICAgIGJtc3ouY3gsIGJtc3ouY3ksCisJCSAgICAgcmVjdC50b3AgKyAoc3lzTWV0cmljc1tTTV9DWVNJWkVdIC0gYm1wLmJtSGVpZ2h0IC0gMSkgLyAyLAorCQkgICAgIGJtcC5ibVdpZHRoLCBibXAuYm1IZWlnaHQsCiAJCSAgICAgaGRjTWVtLCAwLCAwLCBkb3duID8gTk9UU1JDQ09QWSA6IFNSQ0NPUFkgKTsKLQl9CisKIAlTZWxlY3RPYmplY3QzMiggaGRjTWVtLCBoYml0bWFwICk7CiAJRGVsZXRlREMzMiggaGRjTWVtICk7CiAJCkBAIC01OTQsNyArNjM2LDcgQEAKIAkJCQkoZG93biA/IGhiaXRtYXBNYXhpbWl6ZUQgOiBoYml0bWFwTWF4aW1pemUpKSwKIAkJCSAgICAgICAmYm1zeikpIHsKIAotCU5DX0dldEluc2lkZVJlY3QoIGh3bmQsICZyZWN0ICk7CisJTkNfR2V0SW5zaWRlUmVjdDk1KCBod25kLCAmcmVjdCApOwogCQogCUdSQVBIX0RyYXdCaXRtYXAoIGhkYywgYm0sCiAJCQkgIHJlY3QucmlnaHQgKyBOQ19NYXhDb250cm9sTnVkZ2UgLQpAQCAtNjQwLDcgKzY4Miw3IEBACiAJR2V0Qml0bWFwRGltZW5zaW9uRXgzMigoYm0gPSBkb3duID8gaGJpdG1hcE1pbmltaXplRCA6CiAJCQkJaGJpdG1hcE1pbmltaXplKSwgJmJtc3opKSB7CiAJCi0JTkNfR2V0SW5zaWRlUmVjdCggaHduZCwgJnJlY3QgKTsKKwlOQ19HZXRJbnNpZGVSZWN0OTUoIGh3bmQsICZyZWN0ICk7CiAKIAlpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUFYSU1JWkVCT1gpCiAJICAgIHJlY3QucmlnaHQgKz0gLTEgKyBOQ19NYXhDb250cm9sTnVkZ2UgLQpAQCAtNzY0LDYgKzgwNiw4IEBACiAgKiAgIFJldmlzaW9uIGhpc3RvcnkKICAqICAgICAgICAwNi1KdWwtMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKICAqICAgICAgICAgICAgIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uIChiYXNlZCBvbiBOQ19EcmF3RnJhbWUpCisgKiAgICAgICAgMDItSnVuLTE5OTggRXJpYyBLb2hsIChla29obEBhYm8ucmhlaW4temVpdHVuZy5kZSkKKyAqICAgICAgICAgICAgIFNvbWUgbWlub3IgZml4ZXMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC03NzcsMTkgKzgyMSwxOCBAQAogCiAgICAgaWYgKGRsZ0ZyYW1lKQogICAgIHsKLQl3aWR0aCA9IFNZU01FVFJJQ1NfQ1hETEdGUkFNRSAtIDE7Ci0JaGVpZ2h0ID0gU1lTTUVUUklDU19DWURMR0ZSQU1FIC0gMTsKLSAgICAgICAgU2VsZWN0T2JqZWN0MzIoIGhkYywgR2V0U3lzQ29sb3JCcnVzaDMyKGFjdGl2ZSA/IENPTE9SX0FDVElWRUNBUFRJT04gOgotCQkJCQkJQ09MT1JfSU5BQ1RJVkVDQVBUSU9OKSApOworCXdpZHRoID0gc3lzTWV0cmljc1tTTV9DWERMR0ZSQU1FXSAtIHN5c01ldHJpY3NbU01fQ1hFREdFXTsKKwloZWlnaHQgPSBzeXNNZXRyaWNzW1NNX0NZRExHRlJBTUVdIC0gc3lzTWV0cmljc1tTTV9DWUVER0VdOwogICAgIH0KICAgICBlbHNlCiAgICAgewogCXdpZHRoID0gc3lzTWV0cmljc1tTTV9DWEZSQU1FXSAtIHN5c01ldHJpY3NbU01fQ1hFREdFXSAtIDE7CiAJaGVpZ2h0ID0gc3lzTWV0cmljc1tTTV9DWUZSQU1FXSAtIHN5c01ldHJpY3NbU01fQ1lFREdFXSAtIDE7Ci0gICAgICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihhY3RpdmUgPyBDT0xPUl9BQ1RJVkVCT1JERVIgOgotCQkJCQkJQ09MT1JfSU5BQ1RJVkVCT1JERVIpICk7CiAgICAgfQogCisgICAgU2VsZWN0T2JqZWN0MzIoIGhkYywgR2V0U3lzQ29sb3JCcnVzaDMyKGFjdGl2ZSA/IENPTE9SX0FDVElWRUJPUkRFUiA6CisJCUNPTE9SX0lOQUNUSVZFQk9SREVSKSApOworCiAgICAgLyogRHJhdyBmcmFtZSAqLwogICAgIFBhdEJsdDMyKCBoZGMsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKICAgICAgICAgICAgICAgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LCBoZWlnaHQsIFBBVENPUFkgKTsKQEAgLTkyMSwxMyArOTY0LDE0IEBACiAgKiAgIFRoZSBjb3JyZWN0IHBlbiBmb3IgdGhlIHdpbmRvdyBmcmFtZSBtdXN0IGJlIHNlbGVjdGVkIGluIHRoZSBEQy4KICAqCiAgKiAgIEJ1Z3MKLSAqICAgICAgICBIZXksIGEgZnVuY3Rpb24gdGhhdCBmaW5hbGx5IHdvcmtzISAgV2VsbCwgYWxtb3N0LiAgSW4gV2luOTUsIHRoZQotICogICAgICAgIHRpdGxlIGhhcyBpdHMgb3duIGZvbnQgLS0gbm90IHRoZSBzeXN0ZW0gZm9udC4gIEl0J3MgYmVpbmcgd29ya2VkCi0gKiAgICAgICAgb24uCisgKiAgICAgICAgSGV5LCBhIGZ1bmN0aW9uIHRoYXQgZmluYWxseSB3b3JrcyEgIFdlbGwsIGFsbW9zdC4KKyAqICAgICAgICBJdCdzIGJlaW5nIHdvcmtlZCBvbi4KICAqCiAgKiAgIFJldmlzaW9uIGhpc3RvcnkKICAqICAgICAgICAwNS1KdWwtMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKICAqICAgICAgICAgICAgIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uLgorICogICAgICAgIDAyLUp1bi0xOTk4IEVyaWMgS29obCAoZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGUpCisgKiAgICAgICAgICAgICBTb21lIG1pbm9yIGZpeGVzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtOTU3LDE2ICsxMDAxLDYgQEAKIAloYml0bWFwUmVzdG9yZSAgID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQk1fUkVTVE9SRSkgKTsKIAloYml0bWFwUmVzdG9yZUQgID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQk1fUkVTVE9SRUQpICk7CiAgICAgfQotICAgIAotICAgIGlmICh3bmRQdHItPmR3RXhTdHlsZSAmIFdTX0VYX0RMR01PREFMRlJBTUUpIHsKLQlIQlJVU0gzMiBoYnJ1c2hPbGQgPSBTZWxlY3RPYmplY3QzMihoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9XSU5ET1cpICk7Ci0JUGF0Qmx0MzIoIGhkYywgci5sZWZ0LCByLnRvcCwgMSwgci5ib3R0b20tci50b3ArMSxQQVRDT1BZICk7Ci0JUGF0Qmx0MzIoIGhkYywgci5yaWdodC0xLCByLnRvcCwgMSwgci5ib3R0b20tci50b3ArMSwgUEFUQ09QWSApOwotCVBhdEJsdDMyKCBoZGMsIHIubGVmdCwgci50b3AtMSwgci5yaWdodC1yLmxlZnQsIDEsIFBBVENPUFkgKTsKLQlyLmxlZnQrKzsKLQlyLnJpZ2h0LS07Ci0JU2VsZWN0T2JqZWN0MzIoIGhkYywgaGJydXNoT2xkICk7Ci0gICAgfQogCiAgICAgaWYgKHN0eWxlICYgV1NfU1lTTUVOVSkgewogCU5DX0RyYXdTeXNCdXR0b245NSggaHduZCwgaGRjLCBGQUxTRSApOwpAQCAtOTgyLDEyICsxMDE2LDE4IEBACiAgICAgfQogCiAgICAgaWYgKEdldFdpbmRvd1RleHQzMkEoIGh3bmQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKSkgeworCU5PTkNMSUVOVE1FVFJJQ1MzMkEgbmNsbTsKKwlIRk9OVDMyIGhGb250LCBoT2xkRm9udDsKKwluY2xtLmNiU2l6ZSA9IHNpemVvZihOT05DTElFTlRNRVRSSUNTMzJBKTsKKwlTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyQSAoU1BJX0dFVE5PTkNMSUVOVE1FVFJJQ1MsIDAsICZuY2xtLCAwKTsKKwloRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdDMyQSAoJm5jbG0ubGZDYXB0aW9uRm9udCk7CisJaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QzMiAoaGRjLCBoRm9udCk7CiAJaWYgKGFjdGl2ZSkgU2V0VGV4dENvbG9yMzIoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfQ0FQVElPTlRFWFQgKSApOwogCWVsc2UgU2V0VGV4dENvbG9yMzIoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfSU5BQ1RJVkVDQVBUSU9OVEVYVCApICk7CiAJU2V0QmtNb2RlMzIoIGhkYywgVFJBTlNQQVJFTlQgKTsKLQlyLnRvcCArPSBOQ19DYXB0aW9uVG9wTnVkZ2UgLSAyOwotCXIubGVmdCArPSBOQ19DYXB0aW9uTGVmdE51ZGdlOworCXIubGVmdCArPSAyOwogCURyYXdUZXh0MzJBKCBoZGMsIGJ1ZmZlciwgLTEsICZyLCBOQ19DYXB0aW9uVGV4dEZsYWdzICk7CisJRGVsZXRlT2JqZWN0MzIgKFNlbGVjdE9iamVjdDMyIChoZGMsIGhPbGRGb250KSk7CiAgICAgfQogfQogCkBAIC0xMDc1LDYgKzExMTUsMTAgQEAKICAgICAgICAgUkVDVDMyIHIgPSByZWN0OwogICAgICAgICByLmxlZnQgPSByLnJpZ2h0IC0gU1lTTUVUUklDU19DWFZTQ1JPTEwgKyAxOwogICAgICAgICByLnRvcCAgPSByLmJvdHRvbSAtIFNZU01FVFJJQ1NfQ1lIU0NST0xMICsgMTsKKwlpZih3bmRQdHItPmR3U3R5bGUgJiBXU19CT1JERVIpIHsKKwkgIHIubGVmdCsrOworCSAgci50b3ArKzsKKwl9CiAgICAgICAgIEZpbGxSZWN0MzIoIGhkYywgJnIsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9TQ1JPTExCQVIpICk7CiAgICAgfSAgICAKIApAQCAtMTA5OSw2ICsxMTQzLDggQEAKICAqICAgUmV2aXNpb24gaGlzdG9yeQogICogICAgICAgIDAzLUp1bC0xOTk3IERhdmUgQ3V0aGJlcnQgKGRhY3V0QGVjZS5jbXUuZWR1KQogICogICAgICAgICAgICAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24KKyAqICAgICAgICAxMC1KdW4tMTk5OCBFcmljIEtvaGwgKGVrb2hsQGFiby5yaGVpbi16ZWl0dW5nLmRlKQorICogICAgICAgICAgICAgRml4ZWQgc29tZSBidWdzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTE0MCw4ICsxMTg2LDcgQEAKICAgICBpZighKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTUFOQUdFRCkpIHsKICAgICAgICAgaWYoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0JPUkRFUikgfHwgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0RMR0ZSQU1FKSB8fAogCSAgICh3bmRQdHItPmR3RXhTdHlsZSAmIFdTX0VYX0RMR01PREFMRlJBTUUpKSB7Ci0JICAgIFRXRUFLX0RyYXdSZWxpZWZSZWN0OTUoaGRjLCAmcmVjdCk7Ci0JICAgIEluZmxhdGVSZWN0MzIoJnJlY3QsIC0yLCAtMik7CisgICAgICAgICAgICBEcmF3RWRnZTMyIChoZGMsICZyZWN0LCBFREdFX1JBSVNFRCwgQkZfUkVDVCB8IEJGX0FESlVTVCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoSEFTX0RMR0ZSQU1FKCB3bmRQdHItPmR3U3R5bGUsIHduZFB0ci0+ZHdFeFN0eWxlICkpIApAQCAtMTE4OSw2ICsxMjM0LDcgQEAKIAogICAgIEluZmxhdGVSZWN0MzIoJnJlY3QsIC0xLCAtMSk7CiAKKwogICAgIC8qIERyYXcgdGhlIHNjcm9sbC1iYXJzICovCiAKICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfVlNDUk9MTCkKQEAgLTEzMjUsNyArMTM3MSwxMCBAQAogCSAgR2V0V2luZG93UmVjdDMyKCB3bmRQdHItPmh3bmRTZWxmLCByZWN0ICk7CiAgICAgICBlbHNlCiAgICAgICB7Ci0gIAkgIE5DX0dldEluc2lkZVJlY3QoIHduZFB0ci0+aHduZFNlbGYsIHJlY3QgKTsKKyAgICAgICAgICBpZihUV0VBS19XaW45NUxvb2spCisgICAgICAgICAgICAgIE5DX0dldEluc2lkZVJlY3Q5NSggd25kUHRyLT5od25kU2VsZiwgcmVjdCApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgTkNfR2V0SW5zaWRlUmVjdCggd25kUHRyLT5od25kU2VsZiwgcmVjdCApOwogICAJICBPZmZzZXRSZWN0MzIoIHJlY3QsIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0LCB3bmRQdHItPnJlY3RXaW5kb3cudG9wKTsKICAgCSAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQogICAgICAJICAgICAgQ2xpZW50VG9TY3JlZW4zMiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAoUE9JTlQzMiAqKXJlY3QgKTsKQEAgLTEzNTQsNyArMTQwMywxMCBAQAogICAgIHsKIAkgIC8qIE1vdmUgcG9pbnRlciBhdCB0aGUgY2VudGVyIG9mIHRoZSBjYXB0aW9uICovCiAJUkVDVDMyIHJlY3Q7Ci0JTkNfR2V0SW5zaWRlUmVjdCggd25kUHRyLT5od25kU2VsZiwgJnJlY3QgKTsKKyAgICAgICAgaWYoVFdFQUtfV2luOTVMb29rKQorICAgICAgICAgICAgTkNfR2V0SW5zaWRlUmVjdDk1KCB3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBOQ19HZXRJbnNpZGVSZWN0KCB3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCApOwogCWlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19TWVNNRU5VKQogCSAgICByZWN0LmxlZnQgKz0gU1lTTUVUUklDU19DWFNJWkUgKyAxOwogCWlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRUJPWCkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcGFpbnRpbmcuYyBiL3dpbmRvd3MvcGFpbnRpbmcuYwppbmRleCBkMzVlOTkxLi5jOTdkYWQxIDEwMDY0NAotLS0gYS93aW5kb3dzL3BhaW50aW5nLmMKKysrIGIvd2luZG93cy9wYWludGluZy5jCkBAIC0zMDAsOCArMzAwLDcgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgVFJBQ0Uod2luLCAiJTA0eCBOVUxMICUwNHggZmxhZ3M9JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGh3bmQsIGhyZ25VcGRhdGUsIGZsYWdzKTsKKyAgICAgICAgVFJBQ0Uod2luLCAiJTA0eCBOVUxMICUwNHggZmxhZ3M9JTA0eFxuIiwgaHduZCwgaHJnblVwZGF0ZSwgZmxhZ3MpOwogICAgIH0KIAogICAgIEdldENsaWVudFJlY3QzMiggaHduZCwgJnJlY3RDbGllbnQgKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvc2Nyb2xsLmMgYi93aW5kb3dzL3Njcm9sbC5jCmluZGV4IDNhY2VmNDguLmQ4YjA2YjMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvc2Nyb2xsLmMKKysrIGIvd2luZG93cy9zY3JvbGwuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjbGFzcy5oIgorI2luY2x1ZGUgImRjLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAiZGNlLmgiCkBAIC0xOTMsNyArMTk0LDEwIEBACiAgICAgfQogCiAgICAgaWYoIHJEQ2xpcC5sZWZ0ID49IHJEQ2xpcC5yaWdodCB8fCByRENsaXAudG9wID49IHJEQ2xpcC5ib3R0b20gKQorICAgIHsKKyAgICAgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKIAlyZXR1cm4gRkFMU0U7CisgICAgfQogICAgIAogICAgIGhyZ25DbGlwID0gR2V0Q2xpcFJnbjE2KGhkYyk7CiAgICAgaHJnblNjcm9sbENsaXAgPSBDcmVhdGVSZWN0UmduSW5kaXJlY3QzMigmckRDbGlwKTsKQEAgLTIzNiw3ICsyNDAsMTAgQEAKIAogCWlmICghQml0Qmx0MzIoIGhkYywgZGVzdC54LCBkZXN0LnksIGxkeCwgbGR5LAogCQkgICAgICAgaGRjLCBzcmMueCwgc3JjLnksIFNSQ0NPUFkpKQorCXsKKwkgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKIAkgICAgcmV0dXJuIEZBTFNFOworCX0KICAgICB9CiAKICAgICAvKiByZXN0b3JlIGNsaXBwaW5nIHJlZ2lvbiAqLwpAQCAtMjg3LDYgKzI5NCw3IEBACiAgICAgfQogCiAgICAgRGVsZXRlT2JqZWN0MzIoIGhyZ25TY3JvbGxDbGlwICk7ICAgICAKKyAgICBHRElfSEVBUF9VTkxPQ0soIGhkYyApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC00MTUsNiArNDIzLDcgQEAKIAkJaWYoIHJjVXBkYXRlICkgR2V0UmduQm94MzIoIGhyZ25VcGRhdGUsIHJjVXBkYXRlICk7CiAJICAgIH0KIAkgICAgUmVsZWFzZURDMzIoaHduZCwgaERDKTsKKwkgICAgR0RJX0hFQVBfVU5MT0NLKCBoREMgKTsKIAl9CiAKIAlpZiggd25kLT5ocmduVXBkYXRlID4gMSApCmRpZmYgLS1naXQgYS93aW5kb3dzL3N5c21ldHJpY3MuYyBiL3dpbmRvd3Mvc3lzbWV0cmljcy5jCmluZGV4IGIxZjRlYTkuLmIwMmY2MjkgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvc3lzbWV0cmljcy5jCisrKyBiL3dpbmRvd3Mvc3lzbWV0cmljcy5jCkBAIC0zMyw3ICszMyw3IEBACiAgICAgc3lzTWV0cmljc1tTTV9DWUJPUkRFUl0gPSBzeXNNZXRyaWNzW1NNX0NYQk9SREVSXTsKICAgICBzeXNNZXRyaWNzW1NNX0NYRExHRlJBTUVdID0KIAlQUk9GSUxFX0dldFdpbmVJbmlJbnQoIlR3ZWFrLkxheW91dCIsICJEaWFsb2dGcmFtZVdpZHRoIiwKLQkJCSAgICAgIFRXRUFLX1dpbjk1TG9vayA/IDIgOiA0KTsKKwkJCSAgICAgIFRXRUFLX1dpbjk1TG9vayA/IDMgOiA0KTsKICAgICBzeXNNZXRyaWNzW1NNX0NZRExHRlJBTUVdID0gc3lzTWV0cmljc1tTTV9DWERMR0ZSQU1FXTsKICAgICBzeXNNZXRyaWNzW1NNX0NZVlRIVU1CXSA9IHN5c01ldHJpY3NbU01fQ1hWU0NST0xMXSAtIDE7CiAgICAgc3lzTWV0cmljc1tTTV9DWEhUSFVNQl0gPSBzeXNNZXRyaWNzW1NNX0NZVlRIVU1CXTsKQEAgLTExOCw4ICsxMTgsOCBAQAogICAgIC8qIEZvciB0aGUgZm9sbG93aW5nOiAwID0gb2ssIDEgPSBmYWlsc2FmZSwgMiA9IGZhaWxzYWZlICsgbmV0d29yayAqLwogICAgIHN5c01ldHJpY3NbU01fQ0xFQU5CT09UXSA9IDA7CiAKLSAgICBzeXNNZXRyaWNzW1NNX0NYRFJBR10gPSAwOwotICAgIHN5c01ldHJpY3NbU01fQ1lEUkFHXSA9IDA7CisgICAgc3lzTWV0cmljc1tTTV9DWERSQUddID0gMjsKKyAgICBzeXNNZXRyaWNzW1NNX0NZRFJBR10gPSAyOwogICAgIHN5c01ldHJpY3NbU01fU0hPV1NPVU5EU10gPSAwOwogICAgIHN5c01ldHJpY3NbU01fQ1hNRU5VQ0hFQ0tdID0gMjsKICAgICBzeXNNZXRyaWNzW1NNX0NZTUVOVUNIRUNLXSA9IDI7CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCBhZjI5MTdkLi5lMTQ2ZTg5IDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTE2NDcsNiArMTY0NywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pbHBTdHJpbmcgKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgSW50ZXJuYWxHZXRXaW5kb3dUZXh0ICAgIChVU0VSMzIuMzI2KQorICovCitJTlQzMiBXSU5BUEkgSW50ZXJuYWxHZXRXaW5kb3dUZXh0KEhXTkQzMiBod25kLExQV1NUUiBscFN0cmluZyxJTlQzMiBuTWF4Q291bnQgKQoreworCUZJWE1FKHdpbiwiKDB4JTA4bHgsMHglMDhseCwlbGQpLHN0dWIhXG4iLGh3bmQsbHBTdHJpbmcsbk1heENvdW50KTsKKwlyZXR1cm4gR2V0V2luZG93VGV4dDMyVyhod25kLGxwU3RyaW5nLG5NYXhDb3VudCk7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICAgR2V0V2luZG93VGV4dDMyVyAgICAoVVNFUjMyLjMxMikKQEAgLTI1NTcsNCArMjU2NiwzIEBACiAKICAgICByZXR1cm4gKERXT1JEKShtc2cubFBhcmFtKTsKIH0KLQo=