From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: Re: [PATCH v4] tools/intel_guc_logger: Utility for capturing GuC firmware logs in a file Date: Mon, 10 Oct 2016 14:52:08 +0100 Message-ID: References: <1473331461-21288-1-git-send-email-akash.goel@intel.com> <1476097172-24125-1-git-send-email-akash.goel@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTPS id 12F9E6E23E for ; Mon, 10 Oct 2016 13:52:57 +0000 (UTC) In-Reply-To: <1476097172-24125-1-git-send-email-akash.goel@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: akash.goel@intel.com, intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org Ck9uIDEwLzEwLzIwMTYgMTE6NTksIGFrYXNoLmdvZWxAaW50ZWwuY29tIHdyb3RlOgo+IEZyb206 IEFrYXNoIEdvZWwgPGFrYXNoLmdvZWxAaW50ZWwuY29tPgo+Cj4gVGhpcyBwYXRjaCBwcm92aWRl cyBhIHRlc3QgdXRpbGl0eSB3aGljaCBoZWxwcyBjYXB0dXJlIEd1QyBmaXJtd2FyZSBsb2dzIGFu ZAo+IHRoZW4gZHVtcCB0aGVtIHRvIGZpbGUuCj4gVGhlIGxvZ3MgYXJlIHB1bGxlZCBmcm9tIGEg ZGVidWdmcyBmaWxlICcvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvZ3VjX2xvZycgYW5kCj4gYnkgZGVm YXVsdCBzdG9yZWQgaW50byBhIGZpbGUgJ2d1Y19sb2dfZHVtcC5kYXQnLiBUaGUgbmFtZSwgaW5j bHVkaW5nIHRoZQo+IGxvY2F0aW9uLCBvZiB0aGUgb3V0cHV0IGZpbGUgY2FuIGJlIGNoYW5nZWQg dGhyb3VnaCBhIGNvbW1hbmQgbGluZSBhcmd1bWVudC4KPgo+IFRoZSB1dGlsaXR5IGdvZXMgaW50 byBhbiBpbmZpbml0ZSBsb29wIHdoZXJlIGl0IHdhaXRzIGZvciB0aGUgYXJyaXZhbCBvZiBuZXcK PiBsb2dzIGFuZCBhcyBzb29uIGFzIG5ldyBzZXQgb2YgbG9ncyBhcmUgcHJvZHVjZWQgaXQgY2Fw dHVyZXMgdGhlbSBpbiBpdHMgbG9jYWwKPiBidWZmZXIgd2hpY2ggaXMgdGhlbiBmbHVzaGVkIG91 dCB0byB0aGUgZmlsZSBvbiBkaXNrLgo+IEFueSB0aW1lIHdoZW4gbG9nZ2luZyBuZWVkcyB0byBi ZSBlbmRlZCwgVXNlciBjYW4gc3RvcCB0aGlzIHV0aWxpdHkgKENUUkwrQykuCj4KPiBCZWZvcmUg ZW50ZXJpbmcgaW50byBhIGxvb3AsIGl0IGZpcnN0IGRpc2NhcmRzIHdoYXRldmVyIGxvZ3MgYXJl IHByZXNlbnQgaW4KPiB0aGUgZGVidWdmcyBmaWxlLgo+IFRoaXMgd2F5IFVzZXIgY2FuIGZpcnN0 IGxhdW5jaCB0aGlzIHV0aWxpdHkgYW5kIHRoZW4gc3RhcnQgYSB3b3JrbG9hZC9hY3Rpdml0eQo+ IGZvciB3aGljaCBHdUMgZmlybXdhcmUgbG9ncyBhcmUgdG8gYmUgYWN0dWFsbHkgY2FwdHVyZWQg YW5kIGtlZXAgcnVubmluZyB0aGUKPiB1dGlsaXR5IGZvciBhcyBsb25nIGFzIGl0cyBuZWVkZWQs IGxpa2Ugb25jZSB0aGUgd29ya2xvYWQgaXMgb3ZlciB0aGlzIHV0aWxpdHkKPiBjYW4gYmUgZm9y Y2VmdWxseSBzdG9wcGVkLgo+Cj4gSWYgdGhlIGxvZ2dpbmcgd2Fzbid0IGVuYWJsZWQgb24gR3VD IHNpZGUgYnkgdGhlIERyaXZlciBhdCBib290IHRpbWUsIHV0aWxpdHkKPiB3aWxsIGZpcnN0IGVu YWJsZSB0aGUgbG9nZ2luZyBhbmQgbGF0ZXIgb24gd2hlbiBpdCBpcyBzdG9wcGVkIChDVFJMK0Mp IGl0IHdpbGwKPiBhbHNvIHBhdXNlIHRoZSBsb2dnaW5nIG9uIEd1QyBzaWRlLgo+Cj4gdjI6Cj4g LSBVc2UgY29tYmluYXRpb24gb2YgYWxhcm0gc3lzdGVtIGNhbGwgJiBTSUdBTFJNIHNpZ25hbCB0 byBydW4gdGhlIHV0aWxpdHkKPiAgICBmb3IgcmVxdWlyZWQgZHVyYXRpb24uIChUdnJ0a28pCj4g LSBGaXggaW5jb25zaXN0ZW5jaWVzLCBkbyBtaW5vciBjbGVhbnVwIGFuZCByZWZhY3RvcmluZy4g KFR2cnRrbykKPgo+IHYzOgo+IC0gRml4IGRpc2NyZXBhbmN5IGZvciB0aGUgb3V0cHV0IGZpbGUg Y29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgdXBkYXRlIHRoZQo+ICAgIFVzYWdlL2hlbHAgc3RyaW5n Lgo+Cj4gdjQ6Cj4gLSBVcGRhdGUgdGhlIGV4aXQgY29uZGl0aW9uIGZvciBmbHVzaGVyIHRocmVh ZCwgbm93IHdpbGwgZXhpdCBvbmx5IGFmdGVyCj4gICAgdGhlIGNhcHR1cmUgbG9vcCBpcyBvdmVy IGFuZCBub3Qgd2hlbiB0aGUgZmxhZyB0byBzdG9wIGxvZ2dpbmcgaXMgc2V0Lgo+ICAgIFRoaXMg aGFuZGxlcyBhIGNvcm5lciBjYXNlLCBkdWUgdG8gd2hpY2ggdGhlIGR1bXAgb2YgbGFzdCBjYXB0 dXJlZCBidWZmZXIKPiAgICB3YXMgZ2V0dGluZyBtaXNzZWQuCj4gLSBBZGQgYSBuZXdsaW5lIGNo YXJhY3RlciBhdCB0aGUgZW5kIG9mIGFzc2VydCBtZXNzYWdlcy4KPiAtIEF2b2lkIHRoZSBhc3Nl cnQgZm9yIHRoZSBjYXNlLCB3aGljaCBvY2N1cnMgdmVyeSByYXJlbHksIHdoZW4gdGhlcmUgYXJl IG5vCj4gICAgYnl0ZXMgcmVhZCBmcm9tIHRoZSByZWxheSBmaWxlLgo+Cj4gQ2M6IFR2cnRrbyBV cnN1bGluIDx0dnJ0a28udXJzdWxpbkBsaW51eC5pbnRlbC5jb20+Cj4gU2lnbmVkLW9mZi1ieTog QWthc2ggR29lbCA8YWthc2guZ29lbEBpbnRlbC5jb20+Cj4gUmV2aWV3ZWQtYnk6IFR2cnRrbyBV cnN1bGluIDx0dnJ0a28udXJzdWxpbkBpbnRlbC5jb20+ICh2MykKPiAtLS0KPiAgIHRvb2xzL01h a2VmaWxlLnNvdXJjZXMgICB8ICAgMSArCj4gICB0b29scy9pbnRlbF9ndWNfbG9nZ2VyLmMgfCA0 MzggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgIDIg ZmlsZXMgY2hhbmdlZCwgNDM5IGluc2VydGlvbnMoKykKPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCB0 b29scy9pbnRlbF9ndWNfbG9nZ2VyLmMKPgo+IGRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZS5z b3VyY2VzIGIvdG9vbHMvTWFrZWZpbGUuc291cmNlcwo+IGluZGV4IDJiYjZjOGUuLmJlNTg4NzEg MTAwNjQ0Cj4gLS0tIGEvdG9vbHMvTWFrZWZpbGUuc291cmNlcwo+ICsrKyBiL3Rvb2xzL01ha2Vm aWxlLnNvdXJjZXMKPiBAQCAtMTksNiArMTksNyBAQCB0b29sc19wcm9nX2xpc3RzID0JCVwKPiAg IAlpbnRlbF9ncHVfdGltZQkJXAo+ICAgCWludGVsX2dwdV90b3AJCVwKPiAgIAlpbnRlbF9ndHQJ CVwKPiArCWludGVsX2d1Y19sb2dnZXIgICAgICAgIFwKPiAgIAlpbnRlbF9pbmZvZnJhbWVzCVwK PiAgIAlpbnRlbF9sM19wYXJpdHkJCVwKPiAgIAlpbnRlbF9saWQJCVwKPiBkaWZmIC0tZ2l0IGEv dG9vbHMvaW50ZWxfZ3VjX2xvZ2dlci5jIGIvdG9vbHMvaW50ZWxfZ3VjX2xvZ2dlci5jCj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi4xNTlhNTRlCj4gLS0tIC9kZXYvbnVs bAo+ICsrKyBiL3Rvb2xzL2ludGVsX2d1Y19sb2dnZXIuYwo+IEBAIC0wLDAgKzEsNDM4IEBACj4g Kwo+ICsjZGVmaW5lIF9HTlVfU09VUkNFICAvKiBGb3IgdXNpbmcgT19ESVJFQ1QgKi8KPiArI2lu Y2x1ZGUgPGludHR5cGVzLmg+Cj4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ICsjaW5jbHVkZSA8ZmNu dGwuaD4KPiArI2luY2x1ZGUgPHNjaGVkLmg+Cj4gKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KPiAr I2luY2x1ZGUgPHN0cmluZy5oPgo+ICsjaW5jbHVkZSA8ZXJybm8uaD4KPiArI2luY2x1ZGUgPHNp Z25hbC5oPgo+ICsjaW5jbHVkZSA8c3RkbGliLmg+Cj4gKyNpbmNsdWRlIDx1bmlzdGQuaD4KPiAr I2luY2x1ZGUgPHN5cy9wb2xsLmg+Cj4gKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgo+ICsjaW5jbHVk ZSA8c3lzL3R5cGVzLmg+Cj4gKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgo+ICsjaW5jbHVkZSA8 c3lzL21tYW4uaD4KPiArI2luY2x1ZGUgPGFzc2VydC5oPgo+ICsjaW5jbHVkZSA8cHRocmVhZC5o Pgo+ICsKPiArI2luY2x1ZGUgImlndC5oIgo+ICsKPiArI2RlZmluZSBNQih4KSAoKHVpbnQ2NF90 KSh4KSAqIDEwMjQgKiAxMDI0KQo+ICsjaWZuZGVmIFBBR0VfU0laRQo+ICsgICNkZWZpbmUgUEFH RV9TSVpFIDQwOTYKPiArI2VuZGlmCj4gKy8qIEN1cnJlbnRseSB0aGUgc2l6ZSBvZiBHdUMgbG9n IGJ1ZmZlciBpcyAxOSBwYWdlcyAmIHNvIGlzIHRoZSBzaXplIG9mIHJlbGF5Cj4gKyAqIHN1YmJ1 ZmZlci4gSWYgdGhlIHNpemUgY2hhbmdlcyBpbiBmdXR1cmUsIHRoZW4gdGhpcyBkZWZpbmUgYWxz byBuZWVkcyB0byBiZQo+ICsgKiB1cGRhdGVkIGFjY29yZGluZ2x5Lgo+ICsgKi8KPiArI2RlZmlu ZSBTVUJCVUZfU0laRSAoMTkqUEFHRV9TSVpFKQo+ICsvKiBOZWVkIGxhcmdlIGJ1ZmZlcmluZyBm cm9tIGxvZ2dlciBzaWRlIHRvIGhpZGUgdGhlIERJU0sgSU8gbGF0ZW5jeSwgRHJpdmVyCj4gKyAq IGNhbiBvbmx5IHN0b3JlIDggc25hcHNob3RzIG9mIEd1QyBsb2cgYnVmZmVyIGluIHJlbGF5Lgo+ ICsgKi8KPiArI2RlZmluZSBOVU1fU1VCQlVGUyAxMDAKPiArCj4gKyNkZWZpbmUgUkVMQVlfRklM RV9OQU1FICAiZ3VjX2xvZyIKPiArI2RlZmluZSBERUZBVUxUX09VVFBVVF9GSUxFX05BTUUgICJn dWNfbG9nX2R1bXAuZGF0Igo+ICsjZGVmaW5lIENPTlRST0xfRklMRV9OQU1FICJpOTE1X2d1Y19s b2dfY29udHJvbCIKPiArCj4gK2NoYXIgKnJlYWRfYnVmZmVyOwo+ICtjaGFyICpvdXRfZmlsZW5h bWU7Cj4gK2ludCBwb2xsX3RpbWVvdXQgPSAyOyAvKiBieSBkZWZhdWx0IDJtcyB0aW1lb3V0ICov Cj4gK3B0aHJlYWRfbXV0ZXhfdCBtdXRleDsKPiArcHRocmVhZF90IGZsdXNoX3RocmVhZDsKPiAr aW50IHZlcmJvc2l0eV9sZXZlbCA9IDM7IC8qIGJ5IGRlZmF1bHQgY2FwdHVyZSBsb2dzIGF0IG1h eCB2ZXJib3NpdHkgKi8KPiArdWludDMyX3QgcHJvZHVjZWQsIGNvbnN1bWVkOwo+ICt1aW50NjRf dCB0b3RhbF9ieXRlc193cml0dGVuOwo+ICtpbnQgbnVtX2J1ZmZlcnMgPSBOVU1fU1VCQlVGUzsK PiAraW50IHJlbGF5X2ZkLCBvdXRmaWxlX2ZkID0gLTE7Cj4gK3VpbnQzMl90IHRlc3RfZHVyYXRp b24sIG1heF9maWxlc2l6ZTsKPiArcHRocmVhZF9jb25kX3QgdW5kZXJmbG93X2NvbmQsIG92ZXJm bG93X2NvbmQ7Cj4gK2Jvb2wgc3RvcF9sb2dnaW5nLCBkaXNjYXJkX29sZGxvZ3MsIGNhcHR1cmlu Z19zdG9wcGVkOwo+ICsKPiArc3RhdGljIHZvaWQgZ3VjX2xvZ19jb250cm9sKGJvb2wgZW5hYmxl X2xvZ2dpbmcpCj4gK3sKPiArCWludCBjb250cm9sX2ZkOwo+ICsJY2hhciBkYXRhWzE5XTsKPiAr CXVpbnQ2NF90IHZhbDsKPiArCWludCByZXQ7Cj4gKwo+ICsJY29udHJvbF9mZCA9IGlndF9kZWJ1 Z2ZzX29wZW4oQ09OVFJPTF9GSUxFX05BTUUsIE9fV1JPTkxZKTsKPiArCWlndF9hc3NlcnRfZihj b250cm9sX2ZkID49IDAsICJjb3VsZG4ndCBvcGVuIHRoZSBndWMgbG9nIGNvbnRyb2wgZmlsZVxu Iik7Cj4gKwo+ICsJdmFsID0gZW5hYmxlX2xvZ2dpbmcgPyAoKHZlcmJvc2l0eV9sZXZlbCA8PCA0 KSB8IDB4MSkgOiAwOwo+ICsKPiArCXJldCA9IHNucHJpbnRmKGRhdGEsIHNpemVvZihkYXRhKSwg IjB4JSIgUFJJeDY0LCB2YWwpOwo+ICsJaWd0X2Fzc2VydChyZXQgPiAyICYmIHJldCA8IHNpemVv ZihkYXRhKSk7Cj4gKwo+ICsJcmV0ID0gd3JpdGUoY29udHJvbF9mZCwgZGF0YSwgcmV0KTsKPiAr CWlndF9hc3NlcnRfZihyZXQgPiAwLCAiY291bGRuJ3Qgd3JpdGUgdG8gdGhlIGxvZyBjb250cm9s IGZpbGVcbiIpOwo+ICsKPiArCWNsb3NlKGNvbnRyb2xfZmQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCBpbnRfc2lnX2hhbmRsZXIoaW50IHNpZykKPiArewo+ICsJaWd0X2luZm8oInJlY2VpdmVk IHNpZ25hbCAlZFxuIiwgc2lnKTsKPiArCj4gKwlzdG9wX2xvZ2dpbmcgPSB0cnVlOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBwdWxsX2xlZnRvdmVyX2RhdGEodm9pZCkKPiArewo+ICsJdW5zaWdu ZWQgaW50IGJ5dGVzX3JlYWQgPSAwOwo+ICsJaW50IHJldDsKPiArCj4gKwlkbyB7Cj4gKwkJLyog UmVhZCB0aGUgbG9ncyBmcm9tIHJlbGF5IGJ1ZmZlciAqLwo+ICsJCXJldCA9IHJlYWQocmVsYXlf ZmQsIHJlYWRfYnVmZmVyLCBTVUJCVUZfU0laRSk7Cj4gKwkJaWYgKCFyZXQpCj4gKwkJCWJyZWFr Owo+ICsKPiArCQlpZ3RfYXNzZXJ0X2YocmV0ID4gMCwgImZhaWxlZCB0byByZWFkIGZyb20gdGhl IGd1YyBsb2cgZmlsZVxuIik7Cj4gKwkJaWd0X2Fzc2VydF9mKHJldCA9PSBTVUJCVUZfU0laRSwg ImludmFsaWQgcmVhZCBmcm9tIHJlbGF5IGZpbGVcbiIpOwo+ICsKPiArCQlieXRlc19yZWFkICs9 IHJldDsKPiArCj4gKwkJaWYgKG91dGZpbGVfZmQgPj0gMCkgewo+ICsJCQlyZXQgPSB3cml0ZShv dXRmaWxlX2ZkLCByZWFkX2J1ZmZlciwgU1VCQlVGX1NJWkUpOwo+ICsJCQlpZ3RfYXNzZXJ0X2Yo cmV0ID09IFNVQkJVRl9TSVpFLCAiY291bGRuJ3QgZHVtcCB0aGUgbG9ncyBpbiBhIGZpbGVcbiIp Owo+ICsJCQl0b3RhbF9ieXRlc193cml0dGVuICs9IHJldDsKPiArCQl9Cj4gKwl9IHdoaWxlKDEp Owo+ICsKPiArCWlndF9kZWJ1ZygiJXUgYnl0ZXMgZmx1c2hlZFxuIiwgYnl0ZXNfcmVhZCk7Cj4g K30KPiArCj4gK3N0YXRpYyBpbnQgbnVtX2ZpbGxlZF9idWZzKHZvaWQpCj4gK3sKPiArCXJldHVy biAocHJvZHVjZWQgLSBjb25zdW1lZCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHB1bGxfZGF0 YSh2b2lkKQo+ICt7Cj4gKwljaGFyICpwdHI7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXB0aHJlYWRf bXV0ZXhfbG9jaygmbXV0ZXgpOwo+ICsJd2hpbGUgKG51bV9maWxsZWRfYnVmcygpID49IG51bV9i dWZmZXJzKSB7Cj4gKwkJaWd0X2RlYnVnKCJvdmVyZmxvdywgd2lsbCB3YWl0LCBwcm9kdWNlZCAl dSwgY29uc3VtZWQgJXVcbiIsIHByb2R1Y2VkLCBjb25zdW1lZCk7Cj4gKwkJLyogU3RhbGwgdGhl IG1haW4gdGhyZWFkIGluIGNhc2Ugb2Ygb3ZlcmZsb3csIGFzIHRoZXJlIGFyZSBubwo+ICsJCSAq IGJ1ZmZlcnMgYXZhaWxhYmxlIHRvIHN0b3JlIHRoZSBuZXcgbG9ncywgb3RoZXJ3aXNlIHRoZXJl Cj4gKwkJICogY291bGQgYmUgY29ycnVwdGlvbiBpZiBib3RoIHRocmVhZHMgd29yayBvbiB0aGUg c2FtZSBidWZmZXIuCj4gKwkJICovCj4gKwkJcHRocmVhZF9jb25kX3dhaXQoJm92ZXJmbG93X2Nv bmQsICZtdXRleCk7Cj4gKwl9Owo+ICsJcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKPiAr Cj4gKwlwdHIgPSByZWFkX2J1ZmZlciArIChwcm9kdWNlZCAlIG51bV9idWZmZXJzKSAqIFNVQkJV Rl9TSVpFOwo+ICsKPiArCS8qIFJlYWQgdGhlIGxvZ3MgZnJvbSByZWxheSBidWZmZXIgKi8KPiAr CXJldCA9IHJlYWQocmVsYXlfZmQsIHB0ciwgU1VCQlVGX1NJWkUpOwo+ICsJaWd0X2Fzc2VydF9m KHJldCA+PSAwLCAiZmFpbGVkIHRvIHJlYWQgZnJvbSB0aGUgZ3VjIGxvZyBmaWxlXG4iKTsKPiAr CWlndF9hc3NlcnRfZighcmV0IHx8IHJldCA9PSBTVUJCVUZfU0laRSwgImludmFsaWQgcmVhZCBm cm9tIHJlbGF5IGZpbGVcbiIpOwo+ICsKPiArCWlmIChyZXQpIHsKPiArCQlwdGhyZWFkX211dGV4 X2xvY2soJm11dGV4KTsKPiArCQlwcm9kdWNlZCsrOwo+ICsJCXB0aHJlYWRfY29uZF9zaWduYWwo JnVuZGVyZmxvd19jb25kKTsKPiArCQlwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwo+ICsJ fSBlbHNlIHsKPiArCQkvKiBPY2Nhc2lvbmFsbHkgKHZlcnkgcmFyZSkgcmVhZCBmcm9tIHRoZSBy ZWxheSBmaWxlIHJldHVybnMgbm8KPiArCQkgKiBkYXRhLCBhbGJlaXQgdGhlIHBvbGxpbmcgZG9u ZSBwcmlvciB0byByZWFkIGNhbGwgaW5kaWNhdGVkCj4gKwkJICogYXZhaWxhYmlsaXR5IG9mIGRh dGEuCj4gKwkJICovCj4gKwkJaWd0X2RlYnVnKCJubyBkYXRhIHJlYWQgZnJvbSB0aGUgcmVsYXkg ZmlsZVxuIik7CgpUaGlzIHdvcnJpZXMgbWUuIFJlbGF5ZnMga2VybmVsIHNpZGUgaXMgcXVpdGUg c2ltcGxlIHdoaWNoIHdvdWxkIHN1Z2dlc3QgCnRoZXJlIGlzIG1heWJlIGEgYnVnIGluIHRoZSBs b2dnZXI/IEFuZCBpdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHdlIAp0cnVzdCBsb2dnZXIgY29y cmVjdGx5IGNhcHR1cmluZyBkYXRhLiBCZWNhdXNlIHBlb3BsZSB3aWxsIHNwZW5kIGEgbG90IApv ZiB0aW1lIGRlYnVnZ2luZyBpc3N1ZXMgZnJvbSB0aGUgbG9ncyBhbmQgaXQgd291bGQgYmUgYmFk IHRvIGhhdmUgdG8gCmNoYXNlIGlycmVndWxhcml0aWVzIGNhdXNlZCBieSBhIHByb2JsZW0gaW4g dGhlIGxvZ2dlci4KCkNvdWxkIHlvdSBwbGVhc2UgdHJ5IGFuZCBpZGVudGlmeSB3aHkgZXhhY3Rs eSBpcyB0aGlzIGhhcHBlbmluZz8KClJlZ2FyZHMsCgpUdnJ0a28KCj4gKwl9Cj4gK30KPiArCj4g K3N0YXRpYyB2b2lkICpmbHVzaGVyKHZvaWQgKmFyZykKPiArewo+ICsJY2hhciAqcHRyOwo+ICsJ aW50IHJldDsKPiArCj4gKwlpZ3RfZGVidWcoImV4ZWN1dGlvbiBzdGFydGVkIG9mIGZsdXNoZXIg dGhyZWFkXG4iKTsKPiArCj4gKwlkbyB7Cj4gKwkJcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7 Cj4gKwkJd2hpbGUgKCFudW1fZmlsbGVkX2J1ZnMoKSkgewo+ICsJCQkvKiBFeGl0IG9ubHkgYWZ0 ZXIgY29tcGxldGluZyB0aGUgZmx1c2ggb2YgYWxsIHRoZSBmaWxsZWQKPiArCQkJICogYnVmZmVy cyBhcyBVc2VyIHdvdWxkIGV4cGVjdCB0aGF0IGFsbCBsb2dzIGNhcHR1cmVkIHVwCj4gKwkJCSAq IHRpbGwgdGhlIHBvaW50IG9mIGludGVycnVwdGlvbi9leGl0IGFyZSB3cml0dGVuIG91dCB0bwo+ ICsJCQkgKiB0aGUgZGlzayBmaWxlLgo+ICsJCQkgKi8KPiArCQkJaWYgKGNhcHR1cmluZ19zdG9w cGVkKSB7Cj4gKwkJCQlpZ3RfZGVidWcoImZsdXNoZXIgdG8gZXhpdCBub3dcbiIpOwo+ICsJCQkJ cHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKPiArCQkJCXJldHVybiBOVUxMOwo+ICsJCQl9 Cj4gKwkJCXB0aHJlYWRfY29uZF93YWl0KCZ1bmRlcmZsb3dfY29uZCwgJm11dGV4KTsKPiArCQl9 Owo+ICsJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7Cj4gKwo+ICsJCXB0ciA9IHJlYWRf YnVmZmVyICsgKGNvbnN1bWVkICUgbnVtX2J1ZmZlcnMpICogU1VCQlVGX1NJWkU7Cj4gKwo+ICsJ CXJldCA9IHdyaXRlKG91dGZpbGVfZmQsIHB0ciwgU1VCQlVGX1NJWkUpOwo+ICsJCWlndF9hc3Nl cnRfZihyZXQgPT0gU1VCQlVGX1NJWkUsICJjb3VsZG4ndCBkdW1wIHRoZSBsb2dzIGluIGEgZmls ZVxuIik7Cj4gKwo+ICsJCXRvdGFsX2J5dGVzX3dyaXR0ZW4gKz0gcmV0Owo+ICsJCWlmIChtYXhf ZmlsZXNpemUgJiYgKHRvdGFsX2J5dGVzX3dyaXR0ZW4gPiBNQihtYXhfZmlsZXNpemUpKSkgewo+ ICsJCQlpZ3RfZGVidWcoInJlYWNoZWQgdGhlIHRhcmdldCBvZiAlIiBQUkl1NjQgIiBieXRlc1xu IiwgTUIobWF4X2ZpbGVzaXplKSk7Cj4gKwkJCXN0b3BfbG9nZ2luZyA9IHRydWU7Cj4gKwkJfQo+ ICsKPiArCQlwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKPiArCQljb25zdW1lZCsrOwo+ICsJ CXB0aHJlYWRfY29uZF9zaWduYWwoJm92ZXJmbG93X2NvbmQpOwo+ICsJCXB0aHJlYWRfbXV0ZXhf dW5sb2NrKCZtdXRleCk7Cj4gKwl9IHdoaWxlKDEpOwo+ICsKPiArCXJldHVybiBOVUxMOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBpbml0X2ZsdXNoZXJfdGhyZWFkKHZvaWQpCj4gK3sKPiArCXN0 cnVjdCBzY2hlZF9wYXJhbQl0aHJlYWRfc2NoZWQ7Cj4gKwlwdGhyZWFkX2F0dHJfdAkJcF9hdHRy Owo+ICsJaW50IHJldDsKPiArCj4gKwlwdGhyZWFkX2NvbmRfaW5pdCgmdW5kZXJmbG93X2NvbmQs IE5VTEwpOwo+ICsJcHRocmVhZF9jb25kX2luaXQoJm92ZXJmbG93X2NvbmQsIE5VTEwpOwo+ICsJ cHRocmVhZF9tdXRleF9pbml0KCZtdXRleCwgTlVMTCk7Cj4gKwo+ICsJcmV0ID0gcHRocmVhZF9h dHRyX2luaXQoJnBfYXR0cik7Cj4gKwlpZ3RfYXNzZXJ0X2YocmV0ID09IDAsICJlcnJvciBvYnRh aW5pbmcgZGVmYXVsdCB0aHJlYWQgYXR0cmlidXRlc1xuIik7Cj4gKwo+ICsJcmV0ID0gcHRocmVh ZF9hdHRyX3NldGluaGVyaXRzY2hlZCgmcF9hdHRyLCBQVEhSRUFEX0VYUExJQ0lUX1NDSEVEKTsK PiArCWlndF9hc3NlcnRfZihyZXQgPT0gMCwgImNvdWxkbid0IHNldCBpbmhlcml0c2NoZWRcbiIp Owo+ICsKPiArCXJldCA9IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSgmcF9hdHRyLCBTQ0hF RF9SUik7Cj4gKwlpZ3RfYXNzZXJ0X2YocmV0ID09IDAsICJjb3VsZG4ndCBzZXQgdGhyZWFkIHNj aGVkdWxpbmcgcG9saWN5XG4iKTsKPiArCj4gKwkvKiBLZWVwIHRoZSBmbHVzaGVyIHRhc2sgYWxz byBhdCBydCBwcmlvcml0eSwgc28gdGhhdCBpdCBkb2Vzbid0IGdldAo+ICsJICogdG9vIGxhdGUg aW4gZmx1c2hpbmcgdGhlIGNvbGxlY3RlZCBsb2dzIGluIGxvY2FsIGJ1ZmZlcnMgdG8gdGhlIGRp c2ssCj4gKwkgKiBhbmQgc28gbWFpbiB0aHJlYWQgYWx3YXlzIGhhdmUgc3BhcmUgYnVmZmVycyB0 byBjb2xsZWN0IHRoZSBsb2dzLgo+ICsJICovCj4gKwl0aHJlYWRfc2NoZWQuc2NoZWRfcHJpb3Jp dHkgPSA1Owo+ICsJcmV0ID0gcHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0oJnBfYXR0ciwgJnRo cmVhZF9zY2hlZCk7Cj4gKwlpZ3RfYXNzZXJ0X2YocmV0ID09IDAsICJjb3VsZG4ndCBzZXQgdGhy ZWFkIHByaW9yaXR5XG4iKTsKPiArCj4gKwlyZXQgPSBwdGhyZWFkX2NyZWF0ZSgmZmx1c2hfdGhy ZWFkLCAmcF9hdHRyLCBmbHVzaGVyLCBOVUxMKTsKPiArCWlndF9hc3NlcnRfZihyZXQgPT0gMCwg InRocmVhZCBjcmVhdGlvbiBmYWlsZWRcbiIpOwo+ICsKPiArCXJldCA9IHB0aHJlYWRfYXR0cl9k ZXN0cm95KCZwX2F0dHIpOwo+ICsJaWd0X2Fzc2VydF9mKHJldCA9PSAwLCAiZXJyb3IgZGVzdHJv eWluZyB0aHJlYWQgYXR0cmlidXRlc1xuIik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIG9wZW5f cmVsYXlfZmlsZSh2b2lkKQo+ICt7Cj4gKwlyZWxheV9mZCA9IGlndF9kZWJ1Z2ZzX29wZW4oUkVM QVlfRklMRV9OQU1FLCBPX1JET05MWSk7Cj4gKwlpZ3RfYXNzZXJ0X2YocmVsYXlfZmQgPj0gMCwg ImNvdWxkbid0IG9wZW4gdGhlIGd1YyBsb2cgZmlsZVxuIik7Cj4gKwo+ICsJLyogUHVyZ2UgdGhl IG9sZC9ib290LXRpbWUgbG9ncyBmcm9tIHRoZSByZWxheSBidWZmZXIuCj4gKwkgKiBUaGlzIGlz IG1vcmUgZm9yIFZhbCB0ZWFtJ3MgcmVxdWlyZW1lbnQsIHdoZXJlIHRoZXkgaGF2ZSB0byBmaXJz dAo+ICsJICogcHVyZ2UgdGhlIGV4aXN0aW5nIGxvZ3MgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0ZXN0 cyBmb3Igd2hpY2ggdGhlIGxvZ3MKPiArCSAqIGFyZSBhY3R1YWxseSBuZWVkZWQuIEFmdGVyIHRo aXMgbG9nZ2VyIHdpbGwgZW50ZXIgaW50byBhIGxvb3AgYW5kCj4gKwkgKiB3YWl0IGZvciB0aGUg bmV3IGRhdGEsIGF0IHRoYXQgcG9pbnQgYmVuY2htYXJrIGNhbiBiZSBsYXVuY2hlZCBmcm9tCj4g KwkgKiBhIGRpZmZlcmVudCBzaGVsbC4KPiArCSAqLwo+ICsJaWYgKGRpc2NhcmRfb2xkbG9ncykK PiArCQlwdWxsX2xlZnRvdmVyX2RhdGEoKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgb3Blbl9v dXRwdXRfZmlsZSh2b2lkKQo+ICt7Cj4gKwkvKiBVc2UgRGlyZWN0IElPIG1vZGUgZm9yIHRoZSBv dXRwdXQgZmlsZSwgYXMgdGhlIGRhdGEgd3JpdHRlbiBpcyBub3QKPiArCSAqIHN1cHBvc2VkIHRv IGJlIGFjY2Vzc2VkIGFnYWluLCB0aGlzIHNhdmVzIGEgY29weSBvZiBkYXRhIGZyb20gQXBwJ3MK PiArCSAqIGJ1ZmZlciB0byBrZXJuZWwgYnVmZmVyIChQYWdlIGNhY2hlKS4gRHVlIHRvIG5vIGJ1 ZmZlcmluZyBvbiBrZXJuZWwKPiArCSAqIHNpZGUsIGRhdGEgaXMgZmx1c2hlZCBvdXQgdG8gZGlz ayBmYXN0ZXIgYW5kIG1vcmUgYnVmZmVyaW5nIGNhbiBiZQo+ICsJICogZG9uZSBvbiB0aGUgbG9n Z2VyIHNpZGUgdG8gaGlkZSB0aGUgZGlzayBJTyBsYXRlbmN5Lgo+ICsJICovCj4gKwlvdXRmaWxl X2ZkID0gb3BlbihvdXRfZmlsZW5hbWUgPyA6IERFRkFVTFRfT1VUUFVUX0ZJTEVfTkFNRSwKPiAr CQkJICBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19ESVJFQ1QsCj4gKwkJCSAgMDQ0 MCk7Cj4gKwlpZ3RfYXNzZXJ0X2Yob3V0ZmlsZV9mZCA+PSAwLCAiY291bGRuJ3Qgb3BlbiB0aGUg b3V0cHV0IGZpbGVcbiIpOwo+ICsKPiArCWZyZWUob3V0X2ZpbGVuYW1lKTsKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgaW5pdF9tYWluX3RocmVhZCh2b2lkKQo+ICt7Cj4gKwlzdHJ1Y3Qgc2NoZWRf cGFyYW0JdGhyZWFkX3NjaGVkOwo+ICsJaW50IHJldDsKPiArCj4gKwkvKiBSdW4gdGhlIG1haW4g dGhyZWFkIGF0IGhpZ2hlc3QgcHJpb3JpdHkgdG8gZW5zdXJlIHRoYXQgaXQgYWx3YXlzCj4gKwkg KiBnZXRzIHdva2VuLXVwIGF0IGVhcmxpZXN0IG9uIGFycml2YWwgb2YgbmV3IGRhdGEgYW5kIHNv IGlzIGFsd2F5cwo+ICsJICogcmVhZHkgdG8gcHVsbCB0aGUgbG9ncywgb3RoZXJ3aXNlIHRoZXJl IGNvdWxkIGJlIGxvc3MgbG9ncyBpZgo+ICsJICogR3VDIGZpcm13YXJlIGlzIGdlbmVyYXRpbmcg bG9ncyBhdCBhIHZlcnkgaGlnaCByYXRlLgo+ICsJICovCj4gKwl0aHJlYWRfc2NoZWQuc2NoZWRf cHJpb3JpdHkgPSAxOwo+ICsJcmV0ID0gc2NoZWRfc2V0c2NoZWR1bGVyKGdldHBpZCgpLCBTQ0hF RF9GSUZPLCAmdGhyZWFkX3NjaGVkKTsKPiArCWlndF9hc3NlcnRfZihyZXQgPT0gMCwgImNvdWxk bid0IHNldCB0aGUgcHJpb3JpdHlcbiIpOwo+ICsKPiArCWlmIChzaWduYWwoU0lHSU5ULCBpbnRf c2lnX2hhbmRsZXIpID09IFNJR19FUlIpCj4gKwkJaWd0X2Fzc2VydF9mKDAsICJTSUdJTlQgaGFu ZGxlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKPiArCj4gKwlpZiAoc2lnbmFsKFNJR0FMUk0s IGludF9zaWdfaGFuZGxlcikgPT0gU0lHX0VSUikKPiArCQlpZ3RfYXNzZXJ0X2YoMCwgIlNJR0FM Uk0gaGFuZGxlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKPiArCj4gKwkvKiBOZWVkIGFuIGFs aWduZWQgcG9pbnRlciBmb3IgZGlyZWN0IElPICovCj4gKwlyZXQgPSBwb3NpeF9tZW1hbGlnbigo dm9pZCAqKikmcmVhZF9idWZmZXIsIFBBR0VfU0laRSwgbnVtX2J1ZmZlcnMgKiBTVUJCVUZfU0la RSk7Cj4gKwlpZ3RfYXNzZXJ0X2YocmV0ID09IDAsICJjb3VsZG4ndCBhbGxvY2F0ZSB0aGUgcmVh ZCBidWZmZXJcbiIpOwo+ICsKPiArCS8qIEtlZXAgdGhlIHBhZ2VzIGxvY2tlZCBpbiBSQU0sIGF2 b2lkIHBhZ2UgZmF1bHQgb3ZlcmhlYWQgKi8KPiArCXJldCA9IG1sb2NrKHJlYWRfYnVmZmVyLCBu dW1fYnVmZmVycyAqIFNVQkJVRl9TSVpFKTsKPiArCWlndF9hc3NlcnRfZihyZXQgPT0gMCwgImZh aWxlZCB0byBsb2NrIG1lbW9yeVxuIik7Cj4gKwo+ICsJLyogRW5hYmxlIHRoZSBsb2dnaW5nLCBp dCBtYXkgbm90IGhhdmUgYmVlbiBlbmFibGVkIGZyb20gYm9vdCBhbmQgc28KPiArCSAqIHRoZSBy ZWxheSBmaWxlIGFsc28gd291bGRuJ3QgaGF2ZSBiZWVuIGNyZWF0ZWQuCj4gKwkgKi8KPiArCWd1 Y19sb2dfY29udHJvbCh0cnVlKTsKPiArCj4gKwlvcGVuX3JlbGF5X2ZpbGUoKTsKPiArCW9wZW5f b3V0cHV0X2ZpbGUoKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGludCBv cHQsIGludCBvcHRfaW5kZXgsIHZvaWQgKmRhdGEpCj4gK3sKPiArCWlndF9kZWJ1Zygib3B0ICVj IG9wdGFyZyAlc1xuIiwgb3B0LCBvcHRhcmcpOwo+ICsKPiArCXN3aXRjaChvcHQpIHsKPiArCWNh c2UgJ3YnOgo+ICsJCXZlcmJvc2l0eV9sZXZlbCA9IGF0b2kob3B0YXJnKTsKPiArCQlpZ3RfYXNz ZXJ0X2YodmVyYm9zaXR5X2xldmVsIDwgMCB8fCB2ZXJib3NpdHlfbGV2ZWwgPiAzLCAiaW52YWxp ZCBpbnB1dCBmb3IgLXYgb3B0aW9uXG4iKTsKPiArCQlpZ3RfZGVidWcoInZlcmJvc2l0eSBsZXZl bCB0byBiZSB1c2VkIGlzICVkXG4iLCB2ZXJib3NpdHlfbGV2ZWwpOwo+ICsJCWJyZWFrOwo+ICsJ Y2FzZSAnbyc6Cj4gKwkJb3V0X2ZpbGVuYW1lID0gc3RyZHVwKG9wdGFyZyk7Cj4gKwkJaWd0X2Fz c2VydF9mKG91dF9maWxlbmFtZSwgIkNvdWxkbid0IGFsbG9jYXRlIHRoZSBvL3AgZmlsZW5hbWVc biIpOwo+ICsJCWlndF9kZWJ1ZygibG9ncyB0byBiZSBzdG9yZWQgaW4gZmlsZSAlc1xuIiwgb3V0 X2ZpbGVuYW1lKTsKPiArCQlicmVhazsKPiArCWNhc2UgJ2InOgo+ICsJCW51bV9idWZmZXJzID0g YXRvaShvcHRhcmcpOwo+ICsJCWlndF9hc3NlcnRfZihudW1fYnVmZmVycyA+IDAsICJpbnZhbGlk IGlucHV0IGZvciAtYiBvcHRpb25cbiIpOwo+ICsJCWlndF9kZWJ1ZygibnVtYmVyIG9mIGJ1ZmZl cnMgdG8gYmUgdXNlZCBpcyAlZFxuIiwgbnVtX2J1ZmZlcnMpOwo+ICsJCWJyZWFrOwo+ICsJY2Fz ZSAndCc6Cj4gKwkJdGVzdF9kdXJhdGlvbiA9IGF0b2kob3B0YXJnKTsKPiArCQlpZ3RfYXNzZXJ0 X2YodGVzdF9kdXJhdGlvbiA+IDAsICJpbnZhbGlkIGlucHV0IGZvciAtdCBvcHRpb25cbiIpOwo+ ICsJCWlndF9kZWJ1ZygibG9nZ2VyIHRvIHJ1biBmb3IgJWQgc2Vjb25kXG4iLCB0ZXN0X2R1cmF0 aW9uKTsKPiArCQlicmVhazsKPiArCWNhc2UgJ3AnOgo+ICsJCXBvbGxfdGltZW91dCA9IGF0b2ko b3B0YXJnKTsKPiArCQlpZ3RfYXNzZXJ0X2YocG9sbF90aW1lb3V0ICE9IDAsICJpbnZhbGlkIGlu cHV0IGZvciAtcCBvcHRpb25cbiIpOwo+ICsJCWlmIChwb2xsX3RpbWVvdXQgPiAwKQo+ICsJCQlp Z3RfZGVidWcoInBvbGxpbmcgdG8gYmUgZG9uZSB3aXRoICVkIG1pbGxpc2Vjb25kIHRpbWVvdXRc biIsIHBvbGxfdGltZW91dCk7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlICdzJzoKPiArCQltYXhfZmls ZXNpemUgPSBhdG9pKG9wdGFyZyk7Cj4gKwkJaWd0X2Fzc2VydF9mKG1heF9maWxlc2l6ZSA+IDAs ICJpbnZhbGlkIGlucHV0IGZvciAtcyBvcHRpb25cbiIpOwo+ICsJCWlndF9kZWJ1ZygibWF4IGFs bG93ZWQgc2l6ZSBvZiB0aGUgb3V0cHV0IGZpbGUgaXMgJWQgTUJcbiIsIG1heF9maWxlc2l6ZSk7 Cj4gKwkJYnJlYWs7Cj4gKwljYXNlICdkJzoKPiArCQlkaXNjYXJkX29sZGxvZ3MgPSB0cnVlOwo+ ICsJCWlndF9kZWJ1Zygib2xkL2Jvb3QtdGltZSBsb2dzIHdpbGwgYmUgZGlzY2FyZGVkXG4iKTsK PiArCQlicmVhazsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgcHJvY2Vzc19jb21tYW5kX2xpbmUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQo+ICt7Cj4gKwlz dGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKPiArCQl7InZlcmJvc2l0eSIs IHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndid9LAo+ICsJCXsib3V0cHV0ZmlsZSIsIHJlcXVpcmVk X2FyZ3VtZW50LCAwLCAnbyd9LAo+ICsJCXsiYnVmZmVycyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAw LCAnYid9LAo+ICsJCXsidGVzdGR1cmF0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0J30s Cj4gKwkJeyJwb2xsdGltZW91dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncCd9LAo+ICsJCXsi c2l6ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncyd9LAo+ICsJCXsiZGlzY2FyZCIsIG5vX2Fy Z3VtZW50LCAwLCAnZCd9LAo+ICsJCXsgMCwgMCwgMCwgMCB9Cj4gKwl9Owo+ICsKPiArCWNvbnN0 IGNoYXIgKmhlbHAgPQo+ICsJCSIgIC12IC0tdmVyYm9zaXR5PWxldmVsICAgdmVyYm9zaXR5IGxl dmVsIG9mIEd1QyBsb2dnaW5nICgwLTMpXG4iCj4gKwkJIiAgLW8gLS1vdXRwdXRmaWxlPW5hbWUg ICBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSwgaW5jbHVkaW5nIHRoZSBsb2NhdGlvbiwgd2hlcmUg bG9ncyB3aWxsIGJlIHN0b3JlZFxuIgo+ICsJCSIgIC1iIC0tYnVmZmVycz1udW0gICAgICAgbnVt YmVyIG9mIGJ1ZmZlcnMgdG8gYmUgbWFpbnRhaW5lZCBvbiBsb2dnZXIgc2lkZSBmb3Igc3Rvcmlu ZyBsb2dzXG4iCj4gKwkJIiAgLXQgLS10ZXN0ZHVyYXRpb249c2VjICBtYXggZHVyYXRpb24gaW4g c2Vjb25kcyBmb3Igd2hpY2ggdGhlIGxvZ2dlciBzaG91bGQgcnVuXG4iCj4gKwkJIiAgLXAgLS1w b2xsdGltZW91dD1tcyAgICBwb2xsaW5nIHRpbWVvdXQgaW4gbXMsIC0xID09IGluZGVmaW5pdGUg d2FpdCBmb3IgdGhlIG5ldyBkYXRhXG4iCj4gKwkJIiAgLXMgLS1zaXplPU1CICAgICAgICAgICBt YXggc2l6ZSBvZiBvdXRwdXQgZmlsZSBpbiBNQnMgYWZ0ZXIgd2hpY2ggbG9nZ2luZyB3aWxsIGJl IHN0b3BwZWRcbiIKPiArCQkiICAtZCAtLWRpc2NhcmQgICAgICAgICAgIGRpc2NhcmQgdGhlIG9s ZC9ib290LXRpbWUgbG9ncyBiZWZvcmUgZW50ZXJpbmcgaW50byB0aGUgY2FwdHVyZSBsb29wXG4i Owo+ICsKPiArCWlndF9zaW1wbGVfaW5pdF9wYXJzZV9vcHRzKCZhcmdjLCBhcmd2LCAidjpvOmI6 dDpwOnM6ZCIsIGxvbmdfb3B0aW9ucywKPiArCQkJCSAgIGhlbHAsIHBhcnNlX29wdGlvbnMsIE5V TEwpOwo+ICt9Cj4gKwo+ICtpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCj4gK3sKPiAr CXN0cnVjdCBwb2xsZmQgcmVsYXlfcG9sbF9mZDsKPiArCWludCBuZmRzOwo+ICsJaW50IHJldDsK PiArCj4gKwlwcm9jZXNzX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2KTsKPiArCj4gKwlpbml0X21h aW5fdGhyZWFkKCk7Cj4gKwo+ICsJLyogVXNlIGEgc2VwYXJhdGUgdGhyZWFkIGZvciBmbHVzaGlu ZyB0aGUgbG9ncyB0byBhIGZpbGUgb24gZGlzay4KPiArCSAqIE1haW4gdGhyZWFkIHdpbGwgYnVm ZmVyIHRoZSBkYXRhIGZyb20gcmVsYXkgZmlsZSBpbiBpdHMgcG9vbCBvZgo+ICsJICogYnVmZmVy cyBhbmQgb3RoZXIgdGhyZWFkIHdpbGwgZmx1c2ggdGhlIGRhdGEgdG8gZGlzayBpbiBiYWNrZ3Jv dW5kLgo+ICsJICogVGhpcyBpcyBuZWVkZWQsIGFsYmVpdCBieSBkZWZhdWx0IGRhdGEgaXMgd3Jp dHRlbiBvdXQgdG8gZGlzayBpbgo+ICsJICogYXN5bmMgbW9kZSwgYXMgd2hlbiB0aGVyZSBhcmUg dG9vIG1hbnkgZGlydHkgcGFnZXMgaW4gdGhlIFJBTSwKPiArCSAqICgvcHJvYy9zeXMvdm0vZGly dHlfcmF0aW8pLCBrZXJuZWwgc3RhcnRzIGJsb2NraW5nIHRoZSBwcm9jZXNzZXMKPiArCSAqIGRv aW5nIHRoZSBmaWxlIHdyaXRlcy4KPiArCSAqLwo+ICsJaW5pdF9mbHVzaGVyX3RocmVhZCgpOwo+ ICsKPiArCXJlbGF5X3BvbGxfZmQuZmQgPSByZWxheV9mZDsKPiArCXJlbGF5X3BvbGxfZmQuZXZl bnRzID0gUE9MTElOOwo+ICsJcmVsYXlfcG9sbF9mZC5yZXZlbnRzID0gMDsKPiArCj4gKwluZmRz ID0gMTsgLyogb25seSBvbmUgZmQgdG8gcG9sbCAqLwo+ICsKPiArCWFsYXJtKHRlc3RfZHVyYXRp b24pOyAvKiBTdGFydCB0aGUgYWxhcm0gKi8KPiArCj4gKwlkbyB7Cj4gKwkJLyogV2FpdC9wb2xs IGZvciB0aGUgbmV3IGRhdGEgdG8gYmUgYXZhaWxhYmxlLCByZWxheSBkb2Vzbid0Cj4gKwkJICog cHJvdmlkZSBhIGJsb2NraW5nIHJlYWQuCj4gKwkJICogT24gb2xkZXIga2VybmVscyBuZWVkIHRv IGRvIHBvbGxpbmcgd2l0aCBhIHRpbWVvdXQgaW5zdGVhZCBvZgo+ICsJCSAqIGluZGVmaW5pdGUg d2FpdCB0byBhdm9pZCByZWx5aW5nIG9uIHJlbGF5IGZvciB0aGUgd2FrZXVwLCBhcwo+ICsJCSAq IHJlbGF5IHVzZWQgdG8gZG8gdGhlIHdha2V1cCBpbiBhIGRlZmVycmVkIG1hbm5lciBvbiBqaWZm aWVzCj4gKwkJICogZ3JhbnVsYXJpdHkgYnkgc2NoZWR1bGluZyBhIHRpbWVyIGFuZCBtb3Jlb3Zl ciB0aGF0IHRpbWVyIHdhcwo+ICsJCSAqIHJlLXNjaGVkdWxlZCBvbiBldmVyeSBuZXdseSBwcm9k dWNlZCBidWZmZXIgYW5kIHNvIHdhcyBwdXNoZWQKPiArCQkgKiBvdXQgaWYgdGhlcmUgd2VyZSBt dWx0aXBsZSBmbHVzaCBpbnRlcnJ1cHRzIGluIGEgdmVyeSBxdWljawo+ICsJCSAqIHN1Y2Nlc3Np b24gKGxlc3MgdGhhbiBhIGppZmZ5IGdhcCBiZXR3ZWVuIDIgZmx1c2ggaW50ZXJydXB0cykKPiAr CQkgKiBjYXVzaW5nIHJlbGF5IHRvIHJ1biBvdXQgb2Ygc3ViIGJ1ZmZlcnMgdG8gc3RvcmUgbmV3 IGxvZ3MuCj4gKwkJICovCj4gKwkJcmV0ID0gcG9sbCgmcmVsYXlfcG9sbF9mZCwgbmZkcywgcG9s bF90aW1lb3V0KTsKPiArCQlpZiAocmV0IDwgMCkgewo+ICsJCQlpZiAoZXJybm8gPT0gRUlOVFIp Cj4gKwkJCQlicmVhazsKPiArCQkJaWd0X2Fzc2VydF9mKDAsICJwb2xsIGNhbGwgZmFpbGVkXG4i KTsKPiArCQl9Cj4gKwo+ICsJCS8qIE5vIGRhdGEgYXZhaWxhYmxlIHlldCwgcG9sbCBhZ2Fpbiwg aG9wZWZ1bGx5IG5ldyBkYXRhIGlzIHJvdW5kIHRoZSBjb3JuZXIgKi8KPiArCQlpZiAoIXJlbGF5 X3BvbGxfZmQucmV2ZW50cykKPiArCQkJY29udGludWU7Cj4gKwo+ICsJCXB1bGxfZGF0YSgpOwo+ ICsJfSB3aGlsZSAoIXN0b3BfbG9nZ2luZyk7Cj4gKwo+ICsJLyogUGF1c2UgbG9nZ2luZyBvbiB0 aGUgR3VDIHNpZGUgKi8KPiArCWd1Y19sb2dfY29udHJvbChmYWxzZSk7Cj4gKwo+ICsJLyogU2ln bmFsIGZsdXNoZXIgdGhyZWFkIHRvIG1ha2UgYW4gZXhpdCAqLwo+ICsJY2FwdHVyaW5nX3N0b3Bw ZWQgPSAxOwo+ICsJcHRocmVhZF9jb25kX3NpZ25hbCgmdW5kZXJmbG93X2NvbmQpOwo+ICsJcHRo cmVhZF9qb2luKGZsdXNoX3RocmVhZCwgTlVMTCk7Cj4gKwo+ICsJcHVsbF9sZWZ0b3Zlcl9kYXRh KCk7Cj4gKwlpZ3RfaW5mbygidG90YWwgYnl0ZXMgd3JpdHRlbiAlIiBQUkl1NjQgIlxuIiwgdG90 YWxfYnl0ZXNfd3JpdHRlbik7Cj4gKwo+ICsJZnJlZShyZWFkX2J1ZmZlcik7Cj4gKwljbG9zZShy ZWxheV9mZCk7Cj4gKwljbG9zZShvdXRmaWxlX2ZkKTsKPiArCWlndF9leGl0KCk7Cj4gK30KCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBt YWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=