From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: Re: [PATCH] tools/intel_guc_logger: Utility for capturing GuC firmware logs in a file Date: Wed, 7 Sep 2016 09:44:12 +0100 Message-ID: <20160907084412.GC16682@nuc-i3427.alporthouse.com> References: <1473158613-12006-1-git-send-email-akash.goel@intel.com> <57CEC1DA.6090009@linux.intel.com> <57CEE620.3090600@linux.intel.com> <2f260f3b-bf49-45e7-0a05-a1fa0b75461a@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id 299A96E92F for ; Wed, 7 Sep 2016 08:44:18 +0000 (UTC) Content-Disposition: inline In-Reply-To: <2f260f3b-bf49-45e7-0a05-a1fa0b75461a@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: "Goel, Akash" Cc: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gV2VkLCBTZXAgMDcsIDIwMTYgYXQgMDE6NDA6MjdQTSArMDUzMCwgR29lbCwgQWthc2ggd3Jv dGU6Cj4gCj4gCj4gT24gOS82LzIwMTYgOToyMiBQTSwgVHZydGtvIFVyc3VsaW4gd3JvdGU6Cj4g Pgo+ID5PbiAwNi8wOS8xNiAxNjozMywgR29lbCwgQWthc2ggd3JvdGU6Cj4gPj5PbiA5LzYvMjAx NiA2OjQ3IFBNLCBUdnJ0a28gVXJzdWxpbiB3cm90ZToKPiA+Pj5IaSwKPiA+Pj4KPiA+Pj5PbiAw Ni8wOS8xNiAxMTo0MywgYWthc2guZ29lbEBpbnRlbC5jb20gd3JvdGU6Cj4gPj4+PkZyb206IEFr YXNoIEdvZWwgPGFrYXNoLmdvZWxAaW50ZWwuY29tPgo+ID4+Pj4KPiA+Pj4+VGhpcyBwYXRjaCBw cm92aWRlcyBhIHRlc3QgdXRpbGl0eSB3aGljaCBoZWxwcyBjYXB0dXJlIEd1QyBmaXJtd2FyZQo+ ID4+Pj5sb2dzIGFuZAo+ID4+Pj50aGVuIGR1bXAgdGhlbSB0byBmaWxlLgo+ID4+Pj5UaGUgbG9n cyBhcmUgcHVsbGVkIGZyb20gYSBkZWJ1Z2ZzIGZpbGUKPiA+Pj4+Jy9zeXMva2VybmVsL2RlYnVn L2RyaS9ndWNfbG9nJyBhbmQKPiA+Pj4+c3RvcmVkIGludG8gYSBmaWxlICcvdG1wL2d1Y19sb2df ZHVtcC5kYXQnLCB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0Cj4gPj4+PmZpbGUgY2FuCj4gPj4+PmJl IGNoYW5nZWQgdGhyb3VnaCBhIGNvbW1hbmQgbGluZSBhcmd1bWVudC4KPiA+Pj4+Cj4gPj4+PlRo ZSB1dGlsaXR5IGdvZXMgaW50byBhbiBpbmZpbml0ZSBsb29wIHdoZXJlIGl0IHdhaXRzIGZvciB0 aGUgYXJyaXZhbAo+ID4+Pj5vZiBuZXcKPiA+Pj4+bG9ncyBhbmQgYXMgc29vbiBhcyBuZXcgc2V0 IG9mIGxvZ3MgYXJlIHByb2R1Y2VkIGl0IGNhcHR1cmVzIHRoZW0gaW4KPiA+Pj4+aXRzIGxvY2Fs Cj4gPj4+PmJ1ZmZlciB3aGljaCBpcyB0aGVuIGZsdXNoZWQgb3V0IHRvIHRoZSBmaWxlIG9uIGRp c2suCj4gPj4+PkFueSB0aW1lIHdoZW4gbG9nZ2luZyBuZWVkcyB0byBiZSBlbmRlZCwgVXNlciBj YW4gc3RvcCB0aGlzIHV0aWxpdHkKPiA+Pj4+KENUUkwrQykuCj4gPj4+Pgo+ID4+Pj5CZWZvcmUg ZW50ZXJpbmcgaW50byBhIGxvb3AsIGl0IGZpcnN0IGRpc2NhcmRzIHdoYXRldmVyIGxvZ3MgYXJl Cj4gPj4+PnByZXNlbnQgaW4KPiA+Pj4+dGhlIGRlYnVnZnMgZmlsZS4KPiA+Pj4+VGhpcyB3YXkg VXNlciBjYW4gZmlyc3QgbGF1bmNoIHRoaXMgdXRpbGl0eSBhbmQgdGhlbiBzdGFydCBhCj4gPj4+ Pndvcmtsb2FkL2FjdGl2aXR5Cj4gPj4+PmZvciB3aGljaCBHdUMgZmlybXdhcmUgbG9ncyBhcmUg dG8gYmUgYWN0dWFsbHkgY2FwdHVyZWQgYW5kIGtlZXAKPiA+Pj4+cnVubmluZyB0aGUKPiA+Pj4+ dXRpbGl0eSBmb3IgYXMgbG9uZyBhcyBpdHMgbmVlZGVkLCBsaWtlIG9uY2UgdGhlIHdvcmtsb2Fk IGlzIG92ZXIgdGhpcwo+ID4+Pj51dGlsaXR5Cj4gPj4+PmNhbiBiZSBmb3JjZWZ1bGx5IHN0b3Bw ZWQuCj4gPj4+Pgo+ID4+Pj5JZiB0aGUgbG9nZ2luZyB3YXNuJ3QgZW5hYmxlZCBvbiBHdUMgc2lk ZSBieSB0aGUgRHJpdmVyIGF0IGJvb3QgdGltZSwKPiA+Pj4+dXRpbGl0eQo+ID4+Pj53aWxsIGZp cnN0IGVuYWJsZSB0aGUgbG9nZ2luZyBhbmQgbGF0ZXIgb24gd2hlbiBpdCBpcyBzdG9wcGVkIChD VFJMK0MpCj4gPj4+Pml0IHdpbGwKPiA+Pj4+YWxzbyBwYXVzZSB0aGUgbG9nZ2luZyBvbiBHdUMg c2lkZS4KPiA+Pj4+Cj4gPj4+PlNpZ25lZC1vZmYtYnk6IEFrYXNoIEdvZWwgPGFrYXNoLmdvZWxA aW50ZWwuY29tPgo+ID4+Pj4tLS0KPiA+Pj4+ICB0b29scy9NYWtlZmlsZS5zb3VyY2VzICAgfCAg IDEgKwo+ID4+Pj4gIHRvb2xzL2ludGVsX2d1Y19sb2dnZXIuYyB8IDQ0MQo+ID4+Pj4rKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4+Pj4gIDIgZmlsZXMg Y2hhbmdlZCwgNDQyIGluc2VydGlvbnMoKykKPiA+Pj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQgdG9v bHMvaW50ZWxfZ3VjX2xvZ2dlci5jCj4gPj4+Pgo+ID4+Pj5kaWZmIC0tZ2l0IGEvdG9vbHMvTWFr ZWZpbGUuc291cmNlcyBiL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMKPiA+Pj4+aW5kZXggMmJiNmM4 ZS4uYmU1ODg3MSAxMDA2NDQKPiA+Pj4+LS0tIGEvdG9vbHMvTWFrZWZpbGUuc291cmNlcwo+ID4+ Pj4rKysgYi90b29scy9NYWtlZmlsZS5zb3VyY2VzCj4gPj4+PkBAIC0xOSw2ICsxOSw3IEBAIHRv b2xzX3Byb2dfbGlzdHMgPSAgICAgICAgXAo+ID4+Pj4gICAgICBpbnRlbF9ncHVfdGltZSAgICAg ICAgXAo+ID4+Pj4gICAgICBpbnRlbF9ncHVfdG9wICAgICAgICBcCj4gPj4+PiAgICAgIGludGVs X2d0dCAgICAgICAgXAo+ID4+Pj4rICAgIGludGVsX2d1Y19sb2dnZXIgICAgICAgIFwKPiA+Pj4+ ICAgICAgaW50ZWxfaW5mb2ZyYW1lcyAgICBcCj4gPj4+PiAgICAgIGludGVsX2wzX3Bhcml0eSAg ICAgICAgXAo+ID4+Pj4gICAgICBpbnRlbF9saWQgICAgICAgIFwKPiA+Pj4+ZGlmZiAtLWdpdCBh L3Rvb2xzL2ludGVsX2d1Y19sb2dnZXIuYyBiL3Rvb2xzL2ludGVsX2d1Y19sb2dnZXIuYwo+ID4+ Pj5uZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4+Pj5pbmRleCAwMDAwMDAwLi45MjE3MmZhCj4gPj4+ Pi0tLSAvZGV2L251bGwKPiA+Pj4+KysrIGIvdG9vbHMvaW50ZWxfZ3VjX2xvZ2dlci5jCj4gPj4+ PkBAIC0wLDAgKzEsNDQxIEBACj4gPj4+PisKPiA+Pj4+KyNkZWZpbmUgX0dOVV9TT1VSQ0UgIC8q IEZvciB1c2luZyBPX0RJUkVDVCAqLwo+ID4+Pj4rI2luY2x1ZGUgPGludHR5cGVzLmg+Cj4gPj4+ PisjaW5jbHVkZSA8c3RkaW8uaD4KPiA+Pj4+KyNpbmNsdWRlIDxmY250bC5oPgo+ID4+Pj4rI2lu Y2x1ZGUgPHNjaGVkLmg+Cj4gPj4+PisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+Cj4gPj4+PisjaW5j bHVkZSA8c3RyaW5nLmg+Cj4gPj4+PisjaW5jbHVkZSA8ZXJybm8uaD4KPiA+Pj4+KyNpbmNsdWRl IDxzaWduYWwuaD4KPiA+Pj4+KyNpbmNsdWRlIDxzdGRsaWIuaD4KPiA+Pj4+KyNpbmNsdWRlIDx1 bmlzdGQuaD4KPiA+Pj4+KyNpbmNsdWRlIDxzeXMvcG9sbC5oPgo+ID4+Pj4rI2luY2x1ZGUgPHN5 cy93YWl0Lmg+Cj4gPj4+PisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cj4gPj4+PisjaW5jbHVkZSA8 c3lzL3N5c2NhbGwuaD4KPiA+Pj4+KyNpbmNsdWRlIDxzeXMvbW1hbi5oPgo+ID4+Pj4rI2luY2x1 ZGUgPGFzc2VydC5oPgo+ID4+Pj4rI2luY2x1ZGUgPHB0aHJlYWQuaD4KPiA+Pj4+Kwo+ID4+Pj4r I2luY2x1ZGUgImlndC5oIgo+ID4+Pj4rCj4gPj4+PisjZGVmaW5lIE1CKHgpICgodWludDY0X3Qp KHgpICogMTAyNCAqIDEwMjQpCj4gPj4+PisjaWZuZGVmIFBBR0VfU0laRQo+ID4+Pj4rICAjZGVm aW5lIFBBR0VfU0laRSA0MDk2Cj4gPj4+PisjZW5kaWYKPiA+Pj4+KyNkZWZpbmUgU1VCQlVGX1NJ WkUgKDE5KlBBR0VfU0laRSkKPiA+Pj4+Ky8qIE5lZWQgbGFyZ2UgYnVmZmVyaW5nIGZyb20gbG9n Z2VyIHNpZGUgdG8gaGlkZSB0aGUgRElTSyBJTyBsYXRlbmN5LAo+ID4+Pj5Ecml2ZXIKPiA+Pj4+ KyAqIGNhbiBvbmx5IHN0b3JlIDggc25hcHNob3RzIG9mIEd1QyBsb2cgYnVmZmVyIGluIHJlbGF5 Lgo+ID4+Pj4rICovCj4gPj4+PisjZGVmaW5lIE5VTV9TVUJCVUZTIDEwMAo+ID4+Pj4rCj4gPj4+ PisjZGVmaW5lIFJFTEFZX0ZJTEVfTkFNRSAgImd1Y19sb2ciCj4gPj4+PisjZGVmaW5lIENPTlRS T0xfRklMRV9OQU1FICJpOTE1X2d1Y19sb2dfY29udHJvbCIKPiA+Pj4+Kwo+ID4+Pj4rY2hhciAq cmVhZF9idWZmZXI7Cj4gPj4+PitjaGFyICpvdXRfZmlsZW5hbWU7Cj4gPj4+PitpbnQgcG9sbF90 aW1lb3V0ID0gMjsgLyogYnkgZGVmYXVsdCAybXMgdGltZW91dCAqLwo+ID4+Pj4rcHRocmVhZF9t dXRleF90IG11dGV4Owo+ID4+Pj4rcHRocmVhZF90IGZsdXNoX3RocmVhZDsKPiA+Pj4+K2ludCB2 ZXJib3NpdHlfbGV2ZWwgPSAzOyAvKiBieSBkZWZhdWx0IGNhcHR1cmUgbG9ncyBhdCBtYXgKPiA+ Pj4+dmVyYm9zaXR5ICovCj4gPj4+Pit1aW50MzJfdCBwcm9kdWNlZCwgY29uc3VtZWQ7Cj4gPj4+ Pit1aW50NjRfdCB0b3RhbF9ieXRlc193cml0dGVuOwo+ID4+Pj4raW50IG51bV9idWZmZXJzID0g TlVNX1NVQkJVRlM7Cj4gPj4+PitpbnQgcmVsYXlfZmQsIG91dGZpbGVfZmQgPSAtMTsKPiA+Pj4+ K2Jvb2wgc3RvcF9sb2dnaW5nLCBkaXNjYXJkX29sZGxvZ3M7Cj4gPj4+Pit1aW50MzJfdCB0ZXN0 X2R1cmF0aW9uLCBtYXhfZmlsZXNpemU7Cj4gPj4+PitwdGhyZWFkX2NvbmRfdCB1bmRlcmZsb3df Y29uZCwgb3ZlcmZsb3dfY29uZDsKPiA+Pj4+Kwo+ID4+Pj4rc3RhdGljIHZvaWQgZ3VjX2xvZ19j b250cm9sKGJvb2wgZW5hYmxlX2xvZ2dpbmcpCj4gPj4+Pit7Cj4gPj4+PisgICAgaW50IGNvbnRy b2xfZmQ7Cj4gPj4+PisgICAgY2hhciBkYXRhWzE5XTsKPiA+Pj4+KyAgICB1aW50NjRfdCB2YWw7 Cj4gPj4+PisgICAgaW50IHJldDsKPiA+Pj4+Kwo+ID4+Pj4rICAgIGNvbnRyb2xfZmQgPSBpZ3Rf ZGVidWdmc19vcGVuKENPTlRST0xfRklMRV9OQU1FLCBPX1dST05MWSk7Cj4gPj4+PisgICAgaWYg KGNvbnRyb2xfZmQgPCAwKQo+ID4+Pj4rICAgICAgICBpZ3RfYXNzZXJ0X2YoMCwgIkNvdWxkbid0 IG9wZW4gdGhlIGd1YyBsb2cgY29udHJvbCBmaWxlIik7Cj4gPj4+PisKPiA+Pj4+KyAgICB2YWwg PSBlbmFibGVfbG9nZ2luZyA/ICgodmVyYm9zaXR5X2xldmVsIDw8IDQpIHwgMHgxKSA6IDA7Cj4g Pj4+PisKPiA+Pj4+KyAgICBzbnByaW50ZihkYXRhLCBzaXplb2YoZGF0YSksICIweCUiIFBSSXg2 NCwgdmFsKTsKPiA+Pj4+KyAgICByZXQgPSB3cml0ZShjb250cm9sX2ZkLCBkYXRhLCBzdHJsZW4o ZGF0YSkgKyAxKTsKPiA+Pj4KPiA+Pj5NaW5vcjogSXQgbG9va3Mgc2FmZSBsaWtlIGl0IGlzIGJ1 dCBzb21ldGhpbmcgbGlrZSBiZWxvdyB3b3VsZCBtYXliZSBiZQo+ID4+Pm1vcmUgcm9idXN0Pwo+ ID4+Pgo+ID4+PnJldCA9IHNucHJpbnRmKGRhdGEsIHNpemVvZihkYXRhKSwgIjB4JSIgUFJJeDY0 LCB2YWwpOwo+ID4+PmlndF9hc3NlcnQocmV0ID4gMiAmJiByZXQgPCBzaXplb2YoZGF0YSkpOwo+ ID4+Cj4gPj5vayB3aWxsIGFkZCwgYnV0IHBvc3NpYmlsaXR5IG9mIGZhaWx1cmUgd2lsbCBiZSBy ZWFsbHkgcmVtb3RlIGhlcmUuCj4gPj5idXQgaWd0X2Fzc2VydChyZXQgPiAwKSBzaG91bGQgc3Vm ZmljZS4KPiA+Cj4gPlllcyB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eSBmb3IgZmFpbHVyZSBhcyBp dCBzdGFuZHMsIGp1c3QgbW9yZSByb2J1c3QKPiA+aW1wbGVtZW50YXRpb24gc2hvdWxkIHNvbWVv bmUgY2hhbmdlIHNvbWV0aGluZyBpbiB0aGUgZnV0dXJlLiBUaGF0J3Mgd2h5Cj4gPkkgc2FpZCB5 b3UgY291bGQgYWxzbyBkZWNpZGUgdG8ga2VlcCBpdCBhcyBpcy4gTXkgdmVyc2lvbiBhbHNvIGF2 b2lkZWQKPiA+dGhlIHN0cmxlbiBzaW5jZSBzbnByaW50ZiBhbHJlYWR5IHRlbGxzIHlvdSB0aGF0 Lgo+ID4KPiAKPiBmaW5lLCB3aWxsIHVzZSB5b3VyIHZlcnNpb24gdGhlbi4KPiAKPiA+Pj5yZXQg PSB3cml0ZShjb250cm9sX2ZkLCBkYXRhLCByZXQpOwo+ID4+PmlndF9hc3NlcnQocmV0ID4gMCk7 IC8vIGFzc3VtaW5nIHNob3J0IHdyaXRlcyBjYW4ndCBoYXBwZW4KPiA+Pj4KPiA+Pj5VcCB0byB5 b3UuCj4gPj4+Cj4gPj4+PisgICAgaWYgKHJldCA8IDApCj4gPj4+PisgICAgICAgIGlndF9hc3Nl cnRfZigwLCAiQ291bGRuJ3Qgd3JpdGUgdG8gdGhlIGxvZyBjb250cm9sIGZpbGUiKTsKPiA+Pj4+ Kwo+ID4+Pj4rICAgIGNsb3NlKGNvbnRyb2xfZmQpOwo+ID4+Pj4rfQo+ID4+Pj4rCj4gPj4+Pitz dGF0aWMgdm9pZCBpbnRfc2lnX2hhbmRsZXIoaW50IHNpZykKPiA+Pj4+K3sKPiA+Pj4+KyAgICBp Z3RfaW5mbygiUmVjZWl2ZWQgc2lnbmFsICVkXG4iLCBzaWcpOwo+ID4+Pj4rCj4gPj4+PisgICAg c3RvcF9sb2dnaW5nID0gdHJ1ZTsKPiA+Pj4+K30KPiA+Pj4+Kwo+ID4+Pj4rc3RhdGljIHZvaWQg cHVsbF9sZWZ0b3Zlcl9kYXRhKHZvaWQpCj4gPj4+Pit7Cj4gPj4+PisgICAgdW5zaWduZWQgaW50 IGJ5dGVzX3JlYWQgPSAwOwo+ID4+Pj4rICAgIGludCByZXQ7Cj4gPj4+PisKPiA+Pj4+KyAgICB3 aGlsZSAoMSkgewo+ID4+Pj4rICAgICAgICAvKiBSZWFkIHRoZSBsb2dzIGZyb20gcmVsYXkgYnVm ZmVyICovCj4gPj4+PisgICAgICAgIHJldCA9IHJlYWQocmVsYXlfZmQsIHJlYWRfYnVmZmVyLCBT VUJCVUZfU0laRSk7Cj4gPj4+PisgICAgICAgIGlmICghcmV0KQo+ID4+Pj4rICAgICAgICAgICAg YnJlYWs7Cj4gPj4+PisgICAgICAgIGVsc2UgaWYgKHJldCA8IDApCj4gPj4+PisgICAgICAgICAg ICBpZ3RfYXNzZXJ0X2YoMCwgIkZhaWxlZCB0byByZWFkIGZyb20gdGhlIGd1YyBsb2cgZmlsZSIp Owo+ID4+Pj4rICAgICAgICBlbHNlIGlmIChyZXQgPCBTVUJCVUZfU0laRSkKPiA+Pj4+KyAgICAg ICAgICAgIGlndF9hc3NlcnRfZigwLCAiaW52YWxpZCByZWFkIGZyb20gcmVsYXkgZmlsZSIpOwo+ ID4+Pj4rCj4gPj4+PisgICAgICAgIGJ5dGVzX3JlYWQgKz0gcmV0Owo+ID4+Pj4rCj4gPj4+Pisg ICAgICAgIGlmIChvdXRmaWxlX2ZkID4gMCkgewo+ID4+Pgo+ID4+Pj49IDAgSSB0aGluay4gT3Ig aXMgaXQgZXZlbiBuZWVkZWQgc2luY2Ugb3Blbl9vdXRwdXRfZmlsZSBhc3NlcnRzIGlmIGl0Cj4g Pj4+ZmFpbHMgdG8gb3Blbj8KPiA+Pj4KPiA+PkFjdHVhbGx5IHB1bGxfbGVmdG92ZXJfZGF0YSgp IHdpbGwgYmUgY2FsbGVkIHR3aWNlLCBvbmNlIGJlZm9yZSBvcGVuaW5nCj4gPj50aGUgb3V0Zmls ZS4gVGhpcyBpcyBmb3IgcHVyZ2luZyB0aGUgb2xkIGxvZ3MsIGlmIGVuYWJsZWQuCj4gPgo+ID5P aCByaWdodCwgT0sgdGhlbi4KPiA+Cj4gPj4KPiA+Pj4+KyAgICAgICAgICAgIHJldCA9IHdyaXRl KG91dGZpbGVfZmQsIHJlYWRfYnVmZmVyLCBTVUJCVUZfU0laRSk7Cj4gPj4+PisgICAgICAgICAg ICBpZiAocmV0IDwgMCkKPiA+Pj4+KyAgICAgICAgICAgICAgICBpZ3RfYXNzZXJ0X2YoMCwgIkNv dWxkbid0IGR1bXAgdGhlIGxvZ3MgaW4gYSBmaWxlIik7Cj4gPj4+Cj4gPj4+RG8geW91IG5lZWQg dG8gY2hlY2sgZm9yIHNob3J0IHdyaXRlcyBhcyB3ZWxsIGhlcmU/IE1hbiBwYWdlIGZvciB3cml0 ZQo+ID4+PnNheXMgaXQgY2FuIGhhcHBlbiB3aXRoIG91dCBvZiBkaXNrIHNwYWNlIG9yIHNpZ25h bHMuCj4gPj4+Cj4gPj5UbyBrZWVwIHRoaW5ncyBzaW1wbGUgY2FuIGp1c3QgY2hlY2sgJ3JldCA8 IFNVQkJVRl9TSVpFJyBjb25zaWRlcmluZwo+ID4+b3V0IG9mIGRpc2sgc3BhY2UgYXMgYSBzZXJp b3VzIGZhaWx1cmUgb3IgYWRkIGEgbG9vcCBoZXJlIHdoaWNoIHdpbGwgcnVuCj4gPj51bnRpbCBT VUJCVUZfU0laRSBieXRlcyBoYXZlIGJlZW4gd3JpdHRlbi4KPiA+Cj4gPkp1c3QgYXNzZXJ0LCBu byBwb2ludCBpbiBjb21wbGljYXRpbmcgdGhpbmdzLgo+ID4KPiBGaW5lIHdpbGwgYXNzZXJ0IG9u IChyZXQgPCBTVUJCVUZfU0laRSkKPiAKPiA+Pj4+KyAgICAgICAgICAgIHRvdGFsX2J5dGVzX3dy aXR0ZW4gKz0gcmV0Owo+ID4+Pj4rICAgICAgICB9Cj4gPj4+PisgICAgfTsKPiA+Pj4+Kwo+ID4+ Pj4rICAgIGlndF9kZWJ1ZygiJXUgYnl0ZXMgZmx1c2hlZFxuIiwgYnl0ZXNfcmVhZCk7Cj4gPj4+ Pit9Cj4gPj4+PisKPiA+Pj4+K3N0YXRpYyBpbnQgbnVtX2ZpbGxlZF9idWZzKHZvaWQpCj4gPj4+ Pit7Cj4gPj4+PisgICAgcmV0dXJuIChwcm9kdWNlZCAtIGNvbnN1bWVkKTsKPiA+Pj4+K30KPiA+ Pj4+Kwo+ID4+Pj4rc3RhdGljIHZvaWQgcHVsbF9kYXRhKHZvaWQpCj4gPj4+Pit7Cj4gPj4+Pisg ICAgY2hhciAqcHRyOwo+ID4+Pj4rICAgIGludCByZXQ7Cj4gPj4+PisKPiA+Pj4+KyAgICBwdGhy ZWFkX211dGV4X2xvY2soJm11dGV4KTsKPiA+Pj4+KyAgICB3aGlsZSAobnVtX2ZpbGxlZF9idWZz KCkgPj0gbnVtX2J1ZmZlcnMpIHsKPiA+Pj4+KyAgICAgICAgaWd0X2RlYnVnKCJvdmVyZmxvdywg d2lsbCB3YWl0LCBwcm9kdWNlZCAldSwgY29uc3VtZWQgJXVcbiIsCj4gPj4+PnByb2R1Y2VkLCBj b25zdW1lZCk7Cj4gPj4+PisgICAgICAgIC8qIFN0YWxsIHRoZSBtYWluIHRocmVhZCBpbiBjYXNl IG9mIG92ZXJmbG93LCBhcyB0aGVyZSBhcmUgbm8KPiA+Pj4+KyAgICAgICAgICogYnVmZmVycyBh dmFpbGFibGUgdG8gc3RvcmUgdGhlIG5ldyBsb2dzLCBvdGhlcndpc2UgdGhlcmUKPiA+Pj4+KyAg ICAgICAgICogY291bGQgYmUgY29ycnVwdGlvbiBpZiBib3RoIHRocmVhZHMgd29yayBvbiB0aGUg c2FtZQo+ID4+Pj5idWZmZXIuCj4gPj4+PisgICAgICAgICAqLwo+ID4+Pj4rICAgICAgICBwdGhy ZWFkX2NvbmRfd2FpdCgmb3ZlcmZsb3dfY29uZCwgJm11dGV4KTsKPiA+Pj4+KyAgICB9Owo+ID4+ Pj4rICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Cj4gPj4+PisKPiA+Pj4+KyAgICBw dHIgPSByZWFkX2J1ZmZlciArIChwcm9kdWNlZCAlIG51bV9idWZmZXJzKSAqIFNVQkJVRl9TSVpF Owo+ID4+Pj4rCj4gPj4+PisgICAgLyogUmVhZCB0aGUgbG9ncyBmcm9tIHJlbGF5IGJ1ZmZlciAq Lwo+ID4+Pj4rICAgIHJldCA9IHJlYWQocmVsYXlfZmQsIHB0ciwgU1VCQlVGX1NJWkUpOwo+ID4+ Pj4rICAgIGlmIChyZXQgPCAwKQo+ID4+Pj4rICAgICAgICBpZ3RfYXNzZXJ0X2YoMCwgIkZhaWxl ZCB0byByZWFkIGZyb20gdGhlIGd1YyBsb2cgZmlsZSIpOwo+ID4+Pj4rICAgIGVsc2UgaWYgKHJl dCAmJiAocmV0IDwgU1VCQlVGX1NJWkUpKQo+ID4+Pj4rICAgICAgICBpZ3RfYXNzZXJ0X2YoMCwg ImludmFsaWQgcmVhZCBmcm9tIHJlbGF5IGZpbGUiKTsKPiA+Pj4+Kwo+ID4+Pj4rICAgIHB0aHJl YWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwo+ID4+Pj4rICAgIGlmIChyZXQpIHsKPiA+Pj4+KyAgICAg ICAgcHJvZHVjZWQrKzsKPiA+Pj4+KyAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmdW5kZXJm bG93X2NvbmQpOwo+ID4+Pj4rICAgIH0KPiA+Pj4+KyAgICBwdGhyZWFkX211dGV4X3VubG9jaygm bXV0ZXgpOwo+ID4+Pgo+ID4+PlZlcnkgbWlub3I6IGNhbiBtb3ZlIHRoZSBtdXRleCB1bmRlciB0 aGUgaWYuCj4gPj4+Cj4gPj5GaW5lIHdpbGwgbW92ZSB1bmRlciB0aGUgJ2lmJy4KPiA+Pgo+ID4+ Pj4rfQo+ID4+Pj4rCj4gPj4+PitzdGF0aWMgdm9pZCAqZmx1c2hlcih2b2lkICphcmcpCj4gPj4+ Pit7Cj4gPj4+PisgICAgY2hhciAqcHRyOwo+ID4+Pj4rICAgIGludCByZXQ7Cj4gPj4+PisKPiA+ Pj4+KyAgICBpZ3RfZGVidWcoIkV4ZWN1dGlvbiBzdGFydGVkIG9mIGZsdXNoZXIgdGhyZWFkXG4i KTsKPiA+Pj4+Kwo+ID4+Pj4rICAgIGRvIHsKPiA+Pj4+KyAgICAgICAgcHRocmVhZF9tdXRleF9s b2NrKCZtdXRleCk7Cj4gPj4+PisgICAgICAgIHdoaWxlICghbnVtX2ZpbGxlZF9idWZzKCkpIHsK PiA+Pj4+KyAgICAgICAgICAgIC8qIEV4aXQgb25seSBhZnRlciBjb21wbGV0aW5nIHRoZSBmbHVz aCBvZiBhbGwgdGhlIGZpbGxlZAo+ID4+Pj4rICAgICAgICAgICAgICogYnVmZmVycyBhcyBVc2Vy IHdvdWxkIGV4cGVjdCB0aGF0IGFsbCBsb2dzIGNhcHR1cmVkIHVwCj4gPj4+PisgICAgICAgICAg ICAgKiB0aWxsIHRoZSBwb2ludCBvZiBpbnRlcnJ1cHRpb24vZXhpdCBhcmUgd3JpdHRlbiBvdXQg dG8KPiA+Pj4+KyAgICAgICAgICAgICAqIHRoZSBkaXNrIGZpbGUuCj4gPj4+PisgICAgICAgICAg ICAgKi8KPiA+Pj4+KyAgICAgICAgICAgIGlmIChzdG9wX2xvZ2dpbmcpIHsKPiA+Pj4+KyAgICAg ICAgICAgICAgICBpZ3RfZGVidWcoImZsdXNoZXIgdG8gZXhpdCBub3dcbiIpOwo+ID4+Pj4rICAg ICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Cj4gPj4+PisgICAgICAg ICAgICAgICAgcmV0dXJuIE5VTEw7Cj4gPj4+PisgICAgICAgICAgICB9Cj4gPj4+PisgICAgICAg ICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmdW5kZXJmbG93X2NvbmQsICZtdXRleCk7Cj4gPj4+Pisg ICAgICAgIH07Cj4gPj4+PisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Cj4g Pj4+PisKPiA+Pj4+KyAgICAgICAgcHRyID0gcmVhZF9idWZmZXIgKyAoY29uc3VtZWQgJSBudW1f YnVmZmVycykgKiBTVUJCVUZfU0laRTsKPiA+Pj4+Kwo+ID4+Pj4rICAgICAgICByZXQgPSB3cml0 ZShvdXRmaWxlX2ZkLCBwdHIsIFNVQkJVRl9TSVpFKTsKPiA+Pj4+KyAgICAgICAgaWYgKHJldCA8 IDApCj4gPj4+PisgICAgICAgICAgICBpZ3RfYXNzZXJ0X2YoMCwgIkNvdWxkbid0IGR1bXAgdGhl IGxvZ3MgaW4gYSBmaWxlIik7Cj4gPj4+Cj4gPj4+UXVlc3Rpb24gYWJvdXQgc2hvcnQgd3JpdGVz IGFwcGxpZXMgaGVyZSBhcyB3ZWxsLgo+ID4+Pgo+ID4+RmluZSB3aWxsIGRvIHRoZSBzYW1lIGhl cmUgd2hhdGV2ZXIgaXMgZGVjaWRlZCBmb3IgYWJvdmUuCj4gPj4KPiA+Pj4+Kwo+ID4+Pj4rICAg ICAgICB0b3RhbF9ieXRlc193cml0dGVuICs9IHJldDsKPiA+Pj4+KyAgICAgICAgaWYgKG1heF9m aWxlc2l6ZSAmJiAodG90YWxfYnl0ZXNfd3JpdHRlbiA+Cj4gPj4+Pk1CKG1heF9maWxlc2l6ZSkp KSB7Cj4gPj4+PisgICAgICAgICAgICBpZ3RfZGVidWcoIlJlYWNoZWQgdGhlIHRhcmdldCBvZiAl IiBQUkl1NjQgIiBieXRlc1xuIiwKPiA+Pj4+TUIobWF4X2ZpbGVzaXplKSk7Cj4gPj4+PisgICAg ICAgICAgICBzdG9wX2xvZ2dpbmcgPSB0cnVlOwo+ID4+Pj4rICAgICAgICB9Cj4gPj4+PisKPiA+ Pj4+KyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7Cj4gPj4+PisgICAgICAgIGNv bnN1bWVkKys7Cj4gPj4+PisgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm92ZXJmbG93X2Nv bmQpOwo+ID4+Pj4rICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwo+ID4+Pj4r ICAgIH0gd2hpbGUoMSk7Cj4gPj4+Cj4gPj4+TWlub3IgYWdhaW46IFlvdSB1c2UgYm90aCAid2hp bGUoMSkge30iIGFuZCAiZG8geyB9IHdoaWxlKDEpIiBpbiBoZXJlLgo+ID4+Pk1heWJlIHN0aWNr IHdpdGggb25lPyA6RCAoSSB0aGluayAiZm9yICg7OykiIGlzIHByZWZlcnJlZCwgYnV0IG1heWJl IEkKPiA+Pj5hbSBtaXNyZW1lbWJlcmluZyB0aGluZ3MuKQo+ID4+Pgo+ID4+U29ycnkgZm9yIHRo ZSBpbmNvbnNpc3RlbmN5LCB3aWxsIGNsZWFuIHRoaXMgdXAuCj4gPj4KPiA+Pj4+Kwo+ID4+Pj4r ICAgIHJldHVybiBOVUxMOwo+ID4+Pj4rfQo+ID4+Pj4rCj4gPj4+PitzdGF0aWMgdm9pZCBpbml0 X2ZsdXNoZXJfdGhyZWFkKHZvaWQpCj4gPj4+Pit7Cj4gPj4+PisgICAgc3RydWN0IHNjaGVkX3Bh cmFtICAgIHRocmVhZF9zY2hlZDsKPiA+Pj4+KyAgICBwdGhyZWFkX2F0dHJfdCAgICAgICAgcF9h dHRyOwo+ID4+Pj4rCj4gPj4+PisgICAgcHRocmVhZF9jb25kX2luaXQoJnVuZGVyZmxvd19jb25k LCBOVUxMKTsKPiA+Pj4+KyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmb3ZlcmZsb3dfY29uZCwgTlVM TCk7Cj4gPj4+PisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtdXRleCwgTlVMTCk7Cj4gPj4+PisK PiA+Pj4+KyAgICBpZiAocHRocmVhZF9hdHRyX2luaXQoJnBfYXR0cikpCj4gPj4+PisgICAgICAg IGlndF9hc3NlcnRfZigwLCAiRXJyb3Igb2J0YWluaW5nIGRlZmF1bHQgdGhyZWFkIGF0dHJpYnV0 ZXMiKTsKPiA+Pj4+Kwo+ID4+Pj4rICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0aW5oZXJpdHNjaGVk KCZwX2F0dHIsIFBUSFJFQURfRVhQTElDSVRfU0NIRUQpKQo+ID4+Pj4rICAgICAgICBpZ3RfYXNz ZXJ0X2YoMCwgIkNvdWxkbid0IHNldCBpbmhlcml0c2NoZWQiKTsKPiA+Pj4+Kwo+ID4+Pj4rICAg IGlmIChwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koJnBfYXR0ciwgU0NIRURfUlIpKQo+ID4+ Pj4rICAgICAgICBpZ3RfYXNzZXJ0X2YoMCwgIkNvdWxkbid0IHNldCB0aHJlYWQgc2NoZWR1bGlu ZyBwb2xpY3kiKTsKPiA+Pj4+Kwo+ID4+Pj4rICAgIC8qIEtlZXAgdGhlIGZsdXNoZXIgdGFzayBh bHNvIGF0IHJ0IHByaW9yaXR5LCBzbyB0aGF0IGl0IGRvZXNuJ3QKPiA+Pj4+Z2V0Cj4gPj4+Pisg ICAgICogdG9vIGxhdGUgaW4gZmx1c2hpbmcgdGhlIGNvbGxlY3RlZCBsb2dzIGluIGxvY2FsIGJ1 ZmZlcnMgdG8KPiA+Pj4+dGhlIGRpc2ssCj4gPj4+PisgICAgICogYW5kIHNvIG1haW4gdGhyZWFk IGFsd2F5cyBoYXZlIHNwYXJlIGJ1ZmZlcnMgdG8gY29sbGVjdCB0aGUKPiA+Pj4+bG9ncy4KPiA+ Pj4+KyAgICAgKi8KPiA+Pj4+KyAgICB0aHJlYWRfc2NoZWQuc2NoZWRfcHJpb3JpdHkgPSA1Owo+ ID4+Pj4rICAgIGlmIChwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSgmcF9hdHRyLCAmdGhyZWFk X3NjaGVkKSkKPiA+Pj4+KyAgICAgICAgaWd0X2Fzc2VydF9mKDAsICJDb3VsZG4ndCBzZXQgdGhy ZWFkIHByaW9yaXR5Iik7Cj4gPj4+PisKPiA+Pj4+KyAgICBpZiAocHRocmVhZF9jcmVhdGUoJmZs dXNoX3RocmVhZCwgJnBfYXR0ciwgZmx1c2hlciwgTlVMTCkpCj4gPj4+PisgICAgICAgIGlndF9h c3NlcnRfZigwLCAidGhyZWFkIGNyZWF0aW9uIGZhaWxlZCIpOwo+ID4+Pgo+ID4+Pk1vcmUgbml0 cGlja3M6IFlvdSBtaXggc3RhcnRpbmcgZXJyb3IgbWVzc2FnZXMgd2l0aCB1cHBlciBjYXNlIGFu ZCBsb3dlcgo+ID4+PmNhc2UuCj4gPj4KPiA+PldpbGwgdXNlIHRoZSBsb3dlciBjYXNlIGZvciBh bGwgZXJyb3IgbWVzc2FnZXMuIGZpbmUgPwo+ID4KPiA+RmluZSB3aXRoIG1lLgo+ID4KPiAKPiBU aGFua3MKPiA+Pj4KPiA+Pj4+Kwo+ID4+Pj4rICAgIGlmIChwdGhyZWFkX2F0dHJfZGVzdHJveSgm cF9hdHRyKSkKPiA+Pj4+KyAgICAgICAgaWd0X2Fzc2VydF9mKDAsICJFcnJvciBkZXN0cm95aW5n IHRocmVhZCBhdHRyaWJ1dGVzIik7Cj4gPj4+Pit9Cj4gPj4+PisKPiA+Pj4+K3N0YXRpYyB2b2lk IG9wZW5fcmVsYXlfZmlsZSh2b2lkKQo+ID4+Pj4rewo+ID4+Pj4rICAgIHJlbGF5X2ZkID0gaWd0 X2RlYnVnZnNfb3BlbihSRUxBWV9GSUxFX05BTUUsIE9fUkRPTkxZKTsKPiA+Pj4+KyAgICBpZiAo cmVsYXlfZmQgPCAwKQo+ID4+Pj4rICAgICAgICBpZ3RfYXNzZXJ0X2YoMCwgIkNvdWxkbid0IG9w ZW4gdGhlIGd1YyBsb2cgZmlsZSIpOwo+ID4+Pj4rCj4gPj4+PisgICAgLyogUHVyZ2UgdGhlIG9s ZC9ib290LXRpbWUgbG9ncyBmcm9tIHRoZSByZWxheSBidWZmZXIuCj4gPj4+PisgICAgICogVGhp cyBpcyBtb3JlIGZvciBWYWwgdGVhbSdzIHJlcXVpcmVtZW50LCB3aGVyZSB0aGV5IGhhdmUgdG8K PiA+Pj4+Zmlyc3QKPiA+Pj4+KyAgICAgKiBwdXJnZSB0aGUgZXhpc3RpbmcgbG9ncyBiZWZvcmUg c3RhcnRpbmcgdGhlIHRlc3RzIGZvciB3aGljaAo+ID4+Pj50aGUgbG9ncwo+ID4+Pj4rICAgICAq IGFyZSBhY3R1YWxseSBuZWVkZWQuIEFmdGVyIHRoaXMgbG9nZ2VyIHdpbGwgZW50ZXIgaW50byBh IGxvb3AKPiA+Pj4+YW5kCj4gPj4+PisgICAgICogd2FpdCBmb3IgdGhlIG5ldyBkYXRhLCBhdCB0 aGF0IHBvaW50IGJlbmNobWFyayBjYW4gYmUgbGF1bmNoZWQKPiA+Pj4+ZnJvbQo+ID4+Pj4rICAg ICAqIGEgZGlmZmVyZW50IHNoZWxsLgo+ID4+Pj4rICAgICAqLwo+ID4+Pj4rICAgIGlmIChkaXNj YXJkX29sZGxvZ3MpCj4gPj4+PisgICAgICAgIHB1bGxfbGVmdG92ZXJfZGF0YSgpOwo+ID4+Pj4r fQo+ID4+Pj4rCj4gPj4+PitzdGF0aWMgdm9pZCBvcGVuX291dHB1dF9maWxlKHZvaWQpCj4gPj4+ Pit7Cj4gPj4+PisgICAgY2hhciAqZmlsZW5hbWU7Cj4gPj4+PisKPiA+Pj4+KyAgICBpZiAoYXNw cmludGYoJmZpbGVuYW1lLCAiL3RtcC8lcyIsIG91dF9maWxlbmFtZSA/IDoKPiA+Pj4+Imd1Y19s b2dfZHVtcC5kYXQiKSA8IDApCj4gPj4+PisgICAgICAgIGlndF9hc3NlcnRfZigwLCAiQ291bGRu J3QgYWxsb2NhdGUgdGhlIGZpbGVuYW1lIik7Cj4gPj4+Cj4gPj4+SSB0aGluayB5b3UgbmVlZCB0 byB0YWtlIHRoZSBvdXRfZmlsZW5hbWUgd2hlbiBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKPiA+Pj5h cy1pcyBhbmQgbm90IHN0aWNrIGl0IGluIC90bXAuIEl0IGlzIHBlcmZlY3RseSByZWFzb25hYmxl IHRoYXQgc29tZW9uZQo+ID4+PndvdWxkIHdhbnQgdG8gcHV0IGl0IHNvbWV3aGVyZSBlbHNlLgo+ ID4+Pgo+ID4+T2sgc28gVXNlciBzaG91bGQgcHJvdmlkZSB0aGUgZnVsbCBwYXRoLgo+ID4KPiA+ SXQgY2FuIGJlIHJlbGF0aXZlLCBhYnNvbHV0ZSwgb3IganVzdCBhIGZpbGVuYW1lLiBNeSBzdWdn ZXN0aW9uIHdhcyB0bwo+ID5qdXN0IHVzZSB3aGF0IHRoZSB1c2VyIHByb3ZpZGVkIGZvciB0aGUg b3BlbigyKSBjYWxsLgo+ID4KPiBZZXMgdGhlIHBhdGggcHJvdmlkZWQgY2FuIGJlIGFic29sdXRl L3JlbGF0aXZlLCB3aWxsIGRvIHRoZSBvcGVuKCkKPiBjYWxsIHdpdGggd2hhdGV2ZXIgc3RyaW5n IGlzIHByb3ZpZGVkIGFzIGEgY29tbWFuZCBsaW5lLgo+IAo+ID4+Cj4gPj4+QWxzbyBiZXR0ZXIg dG8gbW92ZSB0aGUgZGVmYXVsdCBuYW1lIG9mICJndWNfbG9nX2R1bXAuZGF0IiB0byB3aGVyZQo+ ID4+PmRlZmF1bHRzIGxpa2UgUkVMQVlfRklMRV9OQU1FIGFuZCBzdWNoIGFyZSBkZWZpbmVkLgo+ ID4+Pgo+ID4+ZmluZS4KPiA+Pgo+ID4+PkFuZCBJIHdvdWxkIG5vdCBkZWZhdWx0IHRvIC90bXAg YnV0IHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KPiA+Pj4KPiA+PkNocmlzIGhhZCBzdWdnZXN0ZWQg dG8gdXNlIC90bXAuIEZpbmUgd2lsbCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5Lgo+ID4+Cj4g Pj4+PisKPiA+Pj4+KyAgICAvKiBVc2UgRGlyZWN0IElPIG1vZGUgZm9yIHRoZSBvdXRwdXQgZmls ZSwgYXMgdGhlIGRhdGEgd3JpdHRlbiBpcwo+ID4+Pj5ub3QKPiA+Pj4+KyAgICAgKiBzdXBwb3Nl ZCB0byBiZSBhY2Nlc3NlZCBhZ2FpbiwgdGhpcyBzYXZlcyBhIGNvcHkgb2YgZGF0YSBmcm9tCj4g Pj4+PkFwcCdzCj4gPj4+PisgICAgICogYnVmZmVyIHRvIGtlcm5lbCBidWZmZXIgKFBhZ2UgY2Fj aGUpLiBEdWUgdG8gbm8gYnVmZmVyaW5nIG9uCj4gPj4+Pmtlcm5lbAo+ID4+Pj4rICAgICAqIHNp ZGUsIGRhdGEgaXMgZmx1c2hlZCBvdXQgdG8gZGlzayBmYXN0ZXIgYW5kIG1vcmUgYnVmZmVyaW5n Cj4gPj4+PmNhbiBiZQo+ID4+Pj4rICAgICAqIGRvbmUgb24gdGhlIGxvZ2dlciBzaWRlIHRvIGhp ZGUgdGhlIGRpc2sgSU8gbGF0ZW5jeS4KPiA+Pj4+KyAgICAgKi8KPiA+Pj4+KyAgICBvdXRmaWxl X2ZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQyB8Cj4gPj4+ Pk9fRElSRUNULCAwNDQ0KTsKPiA+Pj4KPiA+Pj4wNDAwIG9yIDA0NDAgd291bGQgYmUgYmV0dGVy IEkgdGhpbmsuCj4gPj4KPiA+PmZpbmUsIHRoaXMgbWlnaHQgbWFrZSB0aGUgZmlsZSBpbmFjY2Vz c2libGUgdG8gUm9vdCBVc2VyIGluIGNhc2UgdGhlCj4gPj5sb2dnZXIgd2Fzbid0IHJ1bm5pbmcg YXMgYSBSb290ID8KPiA+Cj4gPkkgYXNzdW1lZCBsb2dnZXIgd2lsbCBydW4gYXMgcm9vdCBhbmQg aXQgd291bGQgYmUgcHJlZmVyYWJsZSBub3QgdG8gaGF2ZQo+ID5sb2cgZmlsZXMgYWNjZXNzaWJs ZSBieSBhbnlvbmUuIEVpdGhlciB3YXkgcm9vdCBjYW4gcmVhZCBhbnl0aGluZwo+ID5yZWdhcmRs ZXNzIG9mIHBlcm1pc3Npb25zLCBubz8KPiA+Cj4gU29ycnkgYWZ0ZXIgd29ya2luZyBvbiBzZWxp bnV4IGVuYWJsZWQgc2V0dXBzIChpbiBBbmRyb2lkLCB3aGVyZQo+IHRoZXJlIGFyZSBjZXJ0YWlu IHJlc3RyaWN0aW9ucyBvbiBSb290IGFsc28pLCBmb3Jnb3QgdGhhdCBSb290IGNhbgo+IGRvIGFu eXRoaW5nLgo+IAo+ID4+Pgo+ID4+Pj4rICAgIGlmIChvdXRmaWxlX2ZkIDwgMCkKPiA+Pj4+KyAg ICAgICAgaWd0X2Fzc2VydF9mKDAsICJDb3VsZG4ndCBvcGVuIHRoZSBvdXRwdXQgZmlsZSIpOwo+ ID4+Pj4rCj4gPj4+PisgICAgZnJlZShvdXRfZmlsZW5hbWUpOwo+ID4+Pj4rICAgIGZyZWUoZmls ZW5hbWUpOwo+ID4+Pj4rfQo+ID4+Pj4rCj4gPj4+PitzdGF0aWMgdm9pZCBpbml0X21haW5fdGhy ZWFkKHZvaWQpCj4gPj4+Pit7Cj4gPj4+PisgICAgc3RydWN0IHNjaGVkX3BhcmFtICAgIHRocmVh ZF9zY2hlZDsKPiA+Pj4+KyAgICAvKiBSdW4gdGhlIG1haW4gdGhyZWFkIGF0IGhpZ2hlc3QgcHJp b3JpdHkgdG8gZW5zdXJlIHRoYXQgaXQKPiA+Pj4+YWx3YXlzCj4gPj4+PisgICAgICogZ2V0cyB3 b2tlbi11cCBhdCBlYXJsaWVzdCBvbiBhcnJpdmFsIG9mIG5ldyBkYXRhIGFuZCBzbyBpcwo+ID4+ Pj5hbHdheXMKPiA+Pj4+KyAgICAgKiByZWFkeSB0byBwdWxsIHRoZSBsb2dzLCBvdGhlcndpc2Ug dGhlcmUgY291bGQgYmUgbG9zcyBsb2dzIGlmCj4gPj4+PisgICAgICogR3VDIGZpcm13YXJlIGlz IGdlbmVyYXRpbmcgbG9ncyBhdCBhIHZlcnkgaGlnaCByYXRlLgo+ID4+Pj4rICAgICAqLwo+ID4+ Pj4rICAgIHRocmVhZF9zY2hlZC5zY2hlZF9wcmlvcml0eSA9IDE7Cj4gPj4+PisgICAgaWYgKHNj aGVkX3NldHNjaGVkdWxlcihnZXRwaWQoKSwgU0NIRURfRklGTywgJnRocmVhZF9zY2hlZCkpCj4g Pj4+PisgICAgICAgIGlndF9hc3NlcnRfZigwLCAiQ291bGRuJ3Qgc2V0IHRoZSBwcmlvcml0eSIp Owo+ID4+Pj4rCj4gPj4+PisgICAgaWYgKHNpZ25hbChTSUdJTlQsIGludF9zaWdfaGFuZGxlcikg PT0gU0lHX0VSUikKPiA+Pj4+KyAgICAgICAgaWd0X2Fzc2VydF9mKDAsICJTSUdJTlQgaGFuZGxl ciByZWdpc3RyYXRpb24gZmFpbGVkIik7Cj4gPj4+PisKPiA+Pj4+KyAgICAvKiBOZWVkIGFuIGFs aWduZWQgcG9pbnRlciBmb3IgZGlyZWN0IElPICovCj4gPj4+PisgICAgaWYgKHBvc2l4X21lbWFs aWduKCh2b2lkICoqKSZyZWFkX2J1ZmZlciwgUEFHRV9TSVpFLCBudW1fYnVmZmVycwo+ID4+Pj4q IFNVQkJVRl9TSVpFKSkKPiA+Pj4+KyAgICAgICAgaWd0X2Fzc2VydF9mKDAsICJDb3VsZG4ndCBh bGxvY2F0ZSB0aGUgcmVhZCBidWZmZXIiKTsKPiA+Pj4+Kwo+ID4+Pj4rICAgIC8qIEtlZXAgdGhl IHBhZ2VzIGxvY2tlZCBpbiBSQU0sIGF2b2lkIHBhZ2UgZmF1bHQgb3ZlcmhlYWQgKi8KPiA+Pj4+ KyAgICBpZiAobWxvY2socmVhZF9idWZmZXIsIG51bV9idWZmZXJzICogU1VCQlVGX1NJWkUpKQo+ ID4+Pj4rICAgICAgICBpZ3RfYXNzZXJ0X2YoMCwgIkZhaWxlZCB0byBsb2NrIG1lbW9yeSIpOwo+ ID4+Pj4rCj4gPj4+PisgICAgLyogRW5hYmxlIHRoZSBsb2dnaW5nLCBpdCBtYXkgbm90IGhhdmUg YmVlbiBlbmFibGVkIGZyb20gYm9vdAo+ID4+Pj5hbmQgc28KPiA+Pj4+KyAgICAgKiB0aGUgcmVs YXkgZmlsZSBhbHNvIHdvdWxkbid0IGhhdmUgYmVlbiBjcmVhdGVkLgo+ID4+Pj4rICAgICAqLwo+ ID4+Pj4rICAgIGd1Y19sb2dfY29udHJvbCh0cnVlKTsKPiA+Pj4+Kwo+ID4+Pj4rICAgIG9wZW5f cmVsYXlfZmlsZSgpOwo+ID4+Pj4rICAgIG9wZW5fb3V0cHV0X2ZpbGUoKTsKPiA+Pj4+K30KPiA+ Pj4+Kwo+ID4+Pj4rc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGludCBvcHQsIGludCBvcHRfaW5k ZXgsIHZvaWQgKmRhdGEpCj4gPj4+Pit7Cj4gPj4+PisgICAgaWd0X2RlYnVnKCJvcHQgJWMgb3B0 YXJnICVzXG4iLCBvcHQsIG9wdGFyZyk7Cj4gPj4+PisKPiA+Pj4+KyAgICBzd2l0Y2gob3B0KSB7 Cj4gPj4+PisgICAgY2FzZSAndic6Cj4gPj4+PisgICAgICAgIHZlcmJvc2l0eV9sZXZlbCA9IGF0 b2kob3B0YXJnKTsKPiA+Pj4+KyAgICAgICAgaWYgKHZlcmJvc2l0eV9sZXZlbCA8IDApCj4gPj4+ PisgICAgICAgICAgICB2ZXJib3NpdHlfbGV2ZWwgPSAwOwo+ID4+Pj4rICAgICAgICBlbHNlIGlm ICh2ZXJib3NpdHlfbGV2ZWwgPiAzKQo+ID4+Pj4rICAgICAgICAgICAgdmVyYm9zaXR5X2xldmVs ID0gMzsKPiA+Pj4KPiA+Pj5Ob3RpZnkgdXNlciBpZiBpbnZhbGlkIHZhbHVlIHdhcyBwcm92aWRl ZD8KPiA+Pj4KPiA+Pkp1c3Qgbm90aWZ5IGJ1dCBkb24ndCBhYm9ydCBhbmQgY29udGludWUgYnkg dXNpbmcgYSB2YWxpZCB2YWx1ZSA/Cj4gPgo+ID5ObyBzdHJvbmcgb3Bpbmlvbi4gRWl0aGVyIGlz IG11Y2ggYmV0dGVyIHRoYW4gc2lsZW50bHkgdXNpbmcgYSBkaWZmZXJlbnQKPiA+dmFsdWUgb3Ig aWdub3JpbmcgdGhlIGZhY3QgdXNlciBoYXMgdHlwZWQgaW4gZ2FyYmFnZSBvbiB0aGUgY29tbWFu ZCBsaW5lLgo+ID4KPiBPayB3aWxsIHJlcG9ydC9ub3RpZnkgYW5kIHRoZW4gYWJvcnQuCj4gV2ls bCBkbyB0aGUgc2FtZSBmb3Igb3RoZXIgYXJndW1lbnRzLgo+IAo+IElzIGl0IGZpbmUgPwo+IAo+ ID4+Cj4gPj4+PisKPiA+Pj4+KyAgICAgICAgaWd0X2RlYnVnKCJ2ZXJib3NpdHkgbGV2ZWwgdG8g YmUgdXNlZCBpcyAlZFxuIiwKPiA+Pj4+dmVyYm9zaXR5X2xldmVsKTsKPiA+Pj4+KyAgICAgICAg YnJlYWs7Cj4gPj4+PisgICAgY2FzZSAnbyc6Cj4gPj4+PisgICAgICAgIGlmIChhc3ByaW50Zigm b3V0X2ZpbGVuYW1lLCAiJXMiLCBvcHRhcmcpIDwgMCkKPiA+Pj4KPiA+Pj5zdHJkdXA/Cj4gPj5v ayB3aWxsIHRyeSB0byB1c2Ugc3RyZHVwLgo+ID4+Pgo+ID4+Pj4rICAgICAgICAgICAgaWd0X2Fz c2VydF9mKDAsICJDb3VsZG4ndCBhbGxvY2F0ZSB0aGUgby9wIGZpbGVuYW1lIik7Cj4gPj4+Pisg ICAgICAgIGlndF9kZWJ1ZygibG9ncyB0byBiZSBzdG9yZWQgaW4gZmlsZSAvdG1wLyVzXG4iLAo+ ID4+Pj5vdXRfZmlsZW5hbWUpOwo+ID4+Pj4rICAgICAgICBicmVhazsKPiA+Pj4+KyAgICBjYXNl ICdiJzoKPiA+Pj4+KyAgICAgICAgbnVtX2J1ZmZlcnMgPSBhdG9pKG9wdGFyZyk7Cj4gPj4+Pisg ICAgICAgIGlmIChudW1fYnVmZmVycyA9PSAwKQo+ID4+Pj4rICAgICAgICAgICAgbnVtX2J1ZmZl cnMgPSBOVU1fU1VCQlVGUzsKPiA+Pj4KPiA+Pj5BZ2FpbiBub3RpZnkgaWYgaW52YWxpZCBudW1i ZXIvdmFsdWUuCj4gPj4+Cj4gPj5zYW1lIGRvdWJ0IGFzIGFib3ZlLgo+ID4+Cj4gPj4+PisgICAg ICAgIGlndF9kZWJ1ZygibnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgdXNlZCBpcyAlZFxuIiwKPiA+ Pj4+bnVtX2J1ZmZlcnMpOwo+ID4+Pj4rICAgICAgICBicmVhazsKPiA+Pj4+KyAgICBjYXNlICd0 JzoKPiA+Pj4+KyAgICAgICAgdGVzdF9kdXJhdGlvbiA9IGF0b2kob3B0YXJnKTsKPiA+Pj4+KyAg ICAgICAgaWYgKHRlc3RfZHVyYXRpb24gPiAwKQo+ID4+Pgo+ID4+PklmIHN3aXRjaCB3YXMgc3Bl Y2lmaWVkIGl0IHNob3VsZCBoYXZlIGEgdmFsaWQgb3B0YXJnIG9yIGVycm9yIHJlcG9ydGVkLgo+ ID4+Pgo+ID4+Pj4rICAgICAgICAgICAgaWd0X2RlYnVnKCJsb2dnZXIgdG8gcnVuIGZvciAlZCBz ZWNvbmRzXG4iLAo+ID4+Pj50ZXN0X2R1cmF0aW9uKTsKPiA+Pj4+KyAgICAgICAgYnJlYWs7Cj4g Pj4+PisgICAgY2FzZSAncCc6Cj4gPj4+PisgICAgICAgIHBvbGxfdGltZW91dCA9IGF0b2kob3B0 YXJnKTsKPiA+Pj4+KyAgICAgICAgaWYgKHBvbGxfdGltZW91dCA9PSAwKQo+ID4+Pj4rICAgICAg ICAgICAgcG9sbF90aW1lb3V0ID0gMjsgLyogYXQgbGVhc3QgdXNlIDJtcyBwb2xsIHRpbWVvdXQg Ki8KPiA+Pj4KPiA+Pj5IbSBJIHdvdWxkIHByZWZlciBpZiB5b3UgYWxsb3dlZCBubyBwb2xsIHBl cmlvZC4KPiA+Pgo+ID4+Ynkgbm8gcG9sbCBwZXJpb2QsIGRvIHlvdSBtZWFuIGluZGVmaW5pdGUg d2FpdCA/Cj4gPj4KPiA+PlRoYXQgY2FuIGJlIGRvbmUgYnkgc3BlY2lmeWluZyAtMSBhcyBhIHRp bWVvdXQgdmFsdWUgaW4gdGhlIGNvbW1hbmQgbGluZSwKPiA+Pgo+ID4+Ii1wIC0tcG9sbHRpbWVv dXQ9bXMgcG9sbGluZyB0aW1lb3V0IGluIG1zLCAtMSA9PSBpbmRlZmluaXRlIHdhaXQgZm9yCj4g Pj50aGUgbmV3IGRhdGFcbiIKPiA+Cj4gPk15IGJhZCwgSSBtaXNzZWQgdGhhdC4gQWxsIGdvb2Qg dGhlbi4KPiA+Cj4gPj4KPiA+Pj5JIGV2ZW4gdGhpbmsgaXQgc2hvdWxkIGJlIHRoZSBkZWZhdWx0 IGlmIHdlIHRoaW5rIHJlbGF5ZnMgd2lsbCBiZQo+ID4+PmRlZmluaXRlbHkgZml4ZWQgdG8gbm90 Cj4gPj4+cmVxdWlyZSBpdC4KPiA+Pj4KPiA+PkNhbiBrZWVwIHRoZSBpbmRlZmluaXRlIHdhaXQg YXMgYSBkZWZhdWx0Lgo+ID4+Cj4gPj4+SW4gYW55IGNhc2UsIGNvbW1lbmQgaXMgd3Jvbmcgc2lu Y2UgdXNlciBjYW4gc3BlY2lmeSAxbXMgYW5kIGdldCBhd2F5Cj4gPj4+d2l0aCBpdC4gOikKPiA+ Pj4KPiA+Pj4+KyAgICAgICAgaWYgKHBvbGxfdGltZW91dCA+IDApCj4gPj4+PisgICAgICAgICAg ICBpZ3RfZGVidWcoInBvbGxpbmcgdG8gYmUgZG9uZSB3aXRoICVkIG1pbGxpIHNlY29uZHMKPiA+ Pj4+dGltZW91dFxuIiwgcG9sbF90aW1lb3V0KTsKPiA+Pj4KPiA+Pj5taWxsaXNlY29uZHMKPiA+ Pj4KPiA+Pj4+KyAgICAgICAgYnJlYWs7Cj4gPj4+PisgICAgY2FzZSAncyc6Cj4gPj4+PisgICAg ICAgIG1heF9maWxlc2l6ZSA9IGF0b2kob3B0YXJnKTsKPiA+Pj4+KyAgICAgICAgaWYgKG1heF9m aWxlc2l6ZSA+IDApCj4gPj4+Cj4gPj4+U2FtZSBhcyBmb3IgLXQuCj4gPj4+Cj4gPj4+PisgICAg ICAgICAgICBpZ3RfZGVidWcoIm1heCBhbGxvd2VkIHNpemUgb2YgdGhlIG91dHB1dCBmaWxlIGlz ICVkCj4gPj4+Pk1Cc1xuIiwgbWF4X2ZpbGVzaXplKTsKPiA+Pj4+KyAgICAgICAgYnJlYWs7Cj4g Pj4+PisgICAgY2FzZSAnZCc6Cj4gPj4+PisgICAgICAgIGRpc2NhcmRfb2xkbG9ncyA9IHRydWU7 Cj4gPj4+PisgICAgICAgIGlndF9kZWJ1Zygib2xkL2Jvb3QtdGltZSBsb2dzIHdpbGwgYmUgZGlz Y2FyZGVkXG4iKTsKPiA+Pj4+KyAgICAgICAgYnJlYWs7Cj4gPj4+PisgICAgfQo+ID4+Pj4rCj4g Pj4+PisgICAgcmV0dXJuIDA7Cj4gPj4+Pit9Cj4gPj4+PisKPiA+Pj4+K3N0YXRpYyB2b2lkIHBy b2Nlc3NfY29tbWFuZF9saW5lKGludCBhcmdjLCBjaGFyICoqYXJndikKPiA+Pj4+K3sKPiA+Pj4+ KyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKPiA+Pj4+KyAgICAg ICAgeyJ2ZXJib3NpdHkiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3YnfSwKPiA+Pj4+KyAgICAg ICAgeyJvdXRwdXRmaWxlbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbyd9LAo+ID4+Pj4r ICAgICAgICB7ImJ1ZmZlcnMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2InfSwKPiA+Pj4+KyAg ICAgICAgeyJ0ZXN0ZHVyYXRpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3QnfSwKPiA+Pj4+ KyAgICAgICAgeyJwb2xsdGltZW91dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncCd9LAo+ID4+ Pj4rICAgICAgICB7InNpemUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3MnfSwKPiA+Pj4+KyAg ICAgICAgeyJkaXNjYXJkIiwgbm9fYXJndW1lbnQsIDAsICdkJ30sCj4gPj4+PisgICAgICAgIHsg MCwgMCwgMCwgMCB9Cj4gPj4+PisgICAgfTsKPiA+Pj4+Kwo+ID4+Pj4rICAgIGNvbnN0IGNoYXIg KmhlbHAgPQo+ID4+Pj4rICAgICAgICAiICAtdiAtLXZlcmJvc2l0eT1sZXZlbCAgIHZlcmJvc2l0 eSBsZXZlbCBvZiBHdUMgbG9nZ2luZwo+ID4+Pj4oMC0zKVxuIgo+ID4+Pj4rICAgICAgICAiICAt byAtLW91dGZpbGU9bmFtZSAgICAgIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIGluIC90bXAKPiA+ Pj4+ZGlyZWN0b3J5LCB3aGVyZSBsb2dzIHdpbGwgYmUgc3RvcmVkXG4iCj4gPj4+PisgICAgICAg ICIgIC1iIC0tYnVmZmVycz1udW0gICAgICAgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgbWFpbnRh aW5lZAo+ID4+Pj5vbiBsb2dnZXIgc2lkZSBmb3Igc3RvcmluZyBsb2dzXG4iCj4gPj4+PisgICAg ICAgICIgIC10IC0tdGVzdGR1cmF0aW9uPXNlYyAgbWF4IGR1cmF0aW9uIGluIHNlY29uZHMgZm9y IHdoaWNoCj4gPj4+PnRoZSBsb2dnZXIgc2hvdWxkIHJ1biwgMCA9PSBmb3JldmVyXG4iCj4gPj4+ PisgICAgICAgICIgIC1wIC0tcG9sbHRpbWVvdXQ9bXMgICAgcG9sbGluZyB0aW1lb3V0IGluIG1z LCAtMSA9PQo+ID4+Pj5pbmRlZmluaXRlIHdhaXQgZm9yIHRoZSBuZXcgZGF0YVxuIgo+ID4+Pj4r ICAgICAgICAiICAtcyAtLXNpemU9TUIgICAgICAgICAgIG1heCBzaXplIG9mIG91dHB1dCBmaWxl IGluIE1Ccwo+ID4+Pj5hZnRlciB3aGljaCBsb2dnaW5nIHdpbGwgYmUgc3RvcHBlZCwgMCA9PSBu byBsaW1pdFxuIgo+ID4+Pj4rICAgICAgICAiICAtZCAtLWRpc2NhcmQgICAgICAgICAgIGRpc2Nh cmQgdGhlIG9sZC9ib290LXRpbWUgbG9ncwo+ID4+Pj5iZWZvcmUgZW50ZXJpbmcgaW50byB0aGUg Y2FwdHVyZSBsb29wXG4iOwo+ID4+Pj4rCj4gPj4+PisgICAgaWd0X3NpbXBsZV9pbml0X3BhcnNl X29wdHMoJmFyZ2MsIGFyZ3YsICJ2Om86Yjp0OnA6czpkIiwKPiA+Pj4+bG9uZ19vcHRpb25zLAo+ ID4+Pj4rICAgICAgICAgICAgICAgICAgIGhlbHAsIHBhcnNlX29wdGlvbnMsIE5VTEwpOwo+ID4+ Pj4rfQo+ID4+Pj4rCj4gPj4+PitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCj4gPj4+ Pit7Cj4gPj4+PisgICAgc3RydWN0IHBvbGxmZCByZWxheV9wb2xsX2ZkOwo+ID4+Pj4rICAgIHN0 cnVjdCB0aW1lc3BlYyBzdGFydD17fTsKPiA+Pj4+KyAgICBpbnQgbmZkczsKPiA+Pj4+KyAgICBp bnQgcmV0Owo+ID4+Pj4rCj4gPj4+PisgICAgcHJvY2Vzc19jb21tYW5kX2xpbmUoYXJnYywgYXJn dik7Cj4gPj4+PisKPiA+Pj4+KyAgICBpbml0X21haW5fdGhyZWFkKCk7Cj4gPj4+PisKPiA+Pj4+ KyAgICAvKiBVc2UgYSBzZXBhcmF0ZSB0aHJlYWQgZm9yIGZsdXNoaW5nIHRoZSBsb2dzIHRvIGEg ZmlsZSBvbiBkaXNrLgo+ID4+Pj4rICAgICAqIE1haW4gdGhyZWFkIHdpbGwgYnVmZmVyIHRoZSBk YXRhIGZyb20gcmVsYXkgZmlsZSBpbiBpdHMgcG9vbCBvZgo+ID4+Pj4rICAgICAqIGJ1ZmZlcnMg YW5kIG90aGVyIHRocmVhZCB3aWxsIGZsdXNoIHRoZSBkYXRhIHRvIGRpc2sgaW4KPiA+Pj4+YmFj a2dyb3VuZC4KPiA+Pj4+KyAgICAgKiBUaGlzIGlzIG5lZWRlZCwgYWxiZWl0IGJ5IGRlZmF1bHQg ZGF0YSBpcyB3cml0dGVuIG91dCB0bwo+ID4+Pj5kaXNrIGluCj4gPj4+PisgICAgICogYXN5bmMg bW9kZSwgYXMgd2hlbiB0aGVyZSBhcmUgdG9vIG1hbnkgZGlydHkgcGFnZXMgaW4gdGhlIFJBTSwK PiA+Pj4+KyAgICAgKiAoL3Byb2Mvc3lzL3ZtL2RpcnR5X3JhdGlvKSwga2VybmVsIHN0YXJ0cyBi bG9ja2luZyB0aGUKPiA+Pj4+cHJvY2Vzc2VzCj4gPj4+PisgICAgICogZG9pbmcgdGhlIGZpbGUg d3JpdGVzLgo+ID4+Pj4rICAgICAqLwo+ID4+Pj4rICAgIGluaXRfZmx1c2hlcl90aHJlYWQoKTsK PiA+Pj4+Kwo+ID4+Pj4rICAgIHJlbGF5X3BvbGxfZmQuZmQgPSByZWxheV9mZDsKPiA+Pj4+KyAg ICByZWxheV9wb2xsX2ZkLmV2ZW50cyA9IFBPTExJTjsKPiA+Pj4+KyAgICByZWxheV9wb2xsX2Zk LnJldmVudHMgPSAwOwo+ID4+Pj4rCj4gPj4+PisgICAgbmZkcyA9IDE7IC8qIG9ubHkgb25lIGZk IHRvIHBvbGwgKi8KPiA+Pj4+Kwo+ID4+Pj4rICAgIHdoaWxlICghc3RvcF9sb2dnaW5nKQo+ID4+ Pj4rICAgIHsKPiA+Pj4+KyAgICAgICAgaWYgKHRlc3RfZHVyYXRpb24gJiYgKGlndF9zZWNvbmRz X2VsYXBzZWQoJnN0YXJ0KSA+Cj4gPj4+PnRlc3RfZHVyYXRpb24pKSB7Cj4gPj4+Cj4gPj4+SWYg eW91IGFncmVlIHRvIGFsbG93IG5vIHBvbGwgcGVyaW9kIHRoZSB0aGlzIHdvdWxkIG5vdCB3b3Jr IHJpZ2h0PyBJbgo+ID4+PnRoYXQgY2FzZSB5b3Ugd291bGQgbmVlZCB0byB1c2UgYWxhcm0oMikg b3Igc29tZXRoaW5nLgo+ID4+Pgo+ID4+Cj4gPj5DYW4gY2FsY3VsYXRlIHRoZSB0aW1lb3V0IHZh bHVlIGZvciBwb2xsIGNhbGwgYXMsCj4gPj4gICAgIGlmIChwb2xsX3RpbWVvdXQgPCAwKSB7Cj4g Pj4gICAgICAgICB0aW1lb3V0ID0gdGVzdF9kdXJhdGlvbiAtIGlndF9zZWNvbmRzX2VsYXBzZWQo JnN0YXJ0KSkKPiA+PiAgICAgfQo+ID4KPiA+TXkgcG9pbnQgd2FzIHRoYXQgd2l0aCBpbmRlZmlu aXRlIHBvbGwgbG9vcCB3aWxsIG5vdCBydW4gaWYgdGhlcmUgaXMgbm90Cj4gPmxvZyBkYXRhIHNv IHRpbWVvdXQgd2lsbCBub3Qgd29yayBpbXBsZW1lbnRlZCBsaWtlIHRoaXMuCj4gPgo+IEkgdW5k ZXJzdG9vZCB5b3VyIGNvbmNlcm4gaW4gZmlyc3QgcGxhY2UgYnV0IHByb2JhYmx5IGRpZG4ndCBw dXQKPiBmb3J0aCBteSBwb2ludCBjbGVhcmx5Lgo+IAo+IEZvciBtb3JlIGNsYXJpdHksIHRoaXMg aXMgaG93IHRoaW5rIGl0IGNhbiBiZSBhZGRyZXNzZWQuCj4gCj4gLS0tIGEvdG9vbHMvaW50ZWxf Z3VjX2xvZ2dlci5jCj4gKysrIGIvdG9vbHMvaW50ZWxfZ3VjX2xvZ2dlci5jCj4gQEAgLTM3MCw2 ICszNzAsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCj4gIHsKPiAgCXN0cnVj dCBwb2xsZmQgcmVsYXlfcG9sbF9mZDsKPiAgCXN0cnVjdCB0aW1lc3BlYyBzdGFydD17fTsKPiAr CXVpbnQzMl90IHRpbWVfZWxhcHNlZDsKPiArCWludCB0aW1lb3V0Owo+ICAJaW50IG5mZHM7Cj4g IAlpbnQgcmV0Owo+IAo+IEBAIC0zOTUsMTAgKzM5NywxNyBAQCBpbnQgbWFpbihpbnQgYXJnYywg Y2hhciAqKmFyZ3YpCj4gCj4gIAl3aGlsZSAoIXN0b3BfbG9nZ2luZykKPiAgCXsKPiAtCQlpZiAo dGVzdF9kdXJhdGlvbiAmJiAoaWd0X3NlY29uZHNfZWxhcHNlZCgmc3RhcnQpID4gdGVzdF9kdXJh dGlvbikpIHsKPiAtCQkJaWd0X2RlYnVnKCJSYW4gZm9yIHN0aXB1bGF0ZWQgJWQgc2Vjb25kcywg ZXhpdCBub3dcbiIsIHRlc3RfZHVyYXRpb24pOwo+IC0JCQlzdG9wX2xvZ2dpbmcgPSB0cnVlOwo+ IC0JCQlicmVhazsKPiArCQl0aW1lb3V0ID0gcG9sbF90aW1lb3V0Owo+ICsJCWlmICh0ZXN0X2R1 cmF0aW9uKSB7Cj4gKwkJCXRpbWVfZWxhcHNlZCA9IGlndF9zZWNvbmRzX2VsYXBzZWQoJnN0YXJ0 KTsKPiArCQkJaWYgKHRpbWVfZWxhcHNlZCA+PSB0ZXN0X2R1cmF0aW9uKSB7Cj4gKwkJCQlpZ3Rf ZGVidWcoIlJhbiBmb3Igc3RpcHVsYXRlZCAlZCBzZWNvbmRzLCBleGl0IG5vd1xuIiwgdGVzdF9k dXJhdGlvbik7Cj4gKwkJCQlzdG9wX2xvZ2dpbmcgPSB0cnVlOwo+ICsJCQkJYnJlYWs7Cj4gKwkJ CX0KPiArCQkJaWYgKHBvbGxfdGltZW91dCA8IDApCj4gKwkJCQl0aW1lb3V0ID0gKHRlc3RfZHVy YXRpb24gLSB0aW1lX2VsYXBzZWQpICogMTAwMDsKPiAJCX0KPiAKPiAgCQkvKiBXYWl0L3BvbGwg Zm9yIHRoZSBuZXcgZGF0YSB0byBiZSBhdmFpbGFibGUsIHJlbGF5IGRvZXNuJ3QKPiBAQCAtNDEy LDcgKzQyMSw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKPiAgCQkgKiB0aGFu IGEgamlmZnkgZ2FwIGJldHdlZW4gMiBmbHVzaCBpbnRlcnJ1cHRzKSBhbmQgcmVsYXkgcnVucwo+ ICAJCSAqIG91dCBvZiBzdWIgYnVmZmVycyB0byBzdG9yZSB0aGUgbmV3IGxvZ3MuCj4gIAkJICov Cj4gLQkJcmV0ID0gcG9sbCgmcmVsYXlfcG9sbF9mZCwgbmZkcywgcG9sbF90aW1lb3V0KTsKPiAr CQlyZXQgPSBwb2xsKCZyZWxheV9wb2xsX2ZkLCBuZmRzLCB0aW1lb3V0KTsKPiAgCQlpZiAocmV0 IDwgMCkgewo+ICAJCQlpZiAoZXJybm8gPT0gRUlOVFIpCj4gIAkJCQlicmVhazsKPiAKPiBTbyB3 aWxsIG5vdCBkbyBwb2xsaW5nIHdpdGggaW5kZWZpbml0ZSB0aW1lb3V0IGFuZCBhZGp1c3QgdGhl Cj4gdGltZW91dCB2YWx1ZSBhcyBwZXIgdGVzdCdzIGR1cmF0aW9uLgo+IERvZXMgaXQgbG9vayBv ayA/CgpTaW5jZSB0aGUgY29tbWVudCBzdGlsbCByZWZlcnMgdG8gYSBrZXJuZWwgYnVnIHRoYXQg eW91J3ZlIGZpeGVkLCBpdCBjYW4KanVzdCBnby4gVGhlIHRpbWVvdXQgY2FsY3VsYXRpb24gaXMg aW5kZWVkIG1vcmUgc2ltcGx5IGV4cHJlc3NlZCBhcwphbGFybSh0aW1lb3V0KS4KCkFuZCBmaXhp bmcgdGhlIGJsb2NraW5nIHJlYWQoKSBpcyBhYm91dCAxMCBsaW5lcyBpbiB0aGUga2VybmVsLi4u Ci1DaHJpcwoKLS0gCkNocmlzIFdpbHNvbiwgSW50ZWwgT3BlbiBTb3VyY2UgVGVjaG5vbG9neSBD ZW50cmUKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50 ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBz Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==