From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH i-g-t v3] lib/igt_core.c: Expand --run-subtest functionality. Date: Thu, 18 Feb 2016 00:10:18 +0100 Message-ID: <20160217231018.GS32705@phenom.ffwll.local> References: <1454587617-33962-1-git-send-email-derek.j.morton@intel.com> <20160217171821.GQ32705@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-f45.google.com (mail-wm0-f45.google.com [74.125.82.45]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7BEA06E140 for ; Wed, 17 Feb 2016 23:09:53 +0000 (UTC) Received: by mail-wm0-f45.google.com with SMTP id g62so1642008wme.0 for ; Wed, 17 Feb 2016 15:09:53 -0800 (PST) Content-Disposition: inline In-Reply-To: <20160217171821.GQ32705@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Derek Morton Cc: daniel.vetter@ffwll.ch, intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gV2VkLCBGZWIgMTcsIDIwMTYgYXQgMDY6MTg6MjFQTSArMDEwMCwgRGFuaWVsIFZldHRlciB3 cm90ZToKPiBPbiBUaHUsIEZlYiAwNCwgMjAxNiBhdCAxMjowNjo1N1BNICswMDAwLCBEZXJlayBN b3J0b24gd3JvdGU6Cj4gPiBBZGRlZCBleHRlbmRlZCB3aWxkY2FyZCBzdXBwb3J0IHdoZW4gc3Bl Y2lmeWluZyAtLXJ1bi1zdWJ0ZXN0Lgo+ID4gCj4gPiBXaWxkY2FyZCBmb3JtYXQgaXMgYXMgc3Bl Y2lmaWVkIGluIHJmYzM5NzcgYW5kIHRoZSB1d2lsZG1hdCgpIGltcGxlbWVudGF0aW9uCj4gPiBp cyB0YWtlbiBmcm9tIGxpYmlubi4KPiA+IFNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwv cmZjMzk3NyNzZWN0aW9uLTQgZm9yIGEgZGVzY3JpcHRpb24gb2YKPiA+IGFsbG93ZWQgd2lsZGNh cmQgZXhwcmVzc2lvbnMuCj4gPiAKPiA+IHYyOiBVc2UgY29tbWEgYXMgbGlzdCBzZXBhcmF0b3Ig KFZpbGxlIFN5cmphbGEpCj4gPiBzdXBwb3J0IGJvdGggXiBhbmQgISBhcyBub3Qgb3BlcmF0b3Jz IChEYXZlIEdvcmRvbikKPiA+IAo+ID4gdjM6IFVwZGF0ZWQgdG8gdXNlIHV3aWxkbWF0KCkgKERh dmUgR29yZG9uKQo+ID4gCj4gPiBTaWduZWQtb2ZmLWJ5OiBEZXJlayBNb3J0b24gPGRlcmVrLmou bW9ydG9uQGludGVsLmNvbT4KPiAKPiBTbyByZWFsbHkgbm90IGhhcHB5IHRoYXQgd2UgcGVycGV0 dWF0ZSB0aGUgaW50ZXJmYWNlIGRpZmZlcmVuY2VzIGluIGhvdwo+IGlndCBpcyBydW4gYmV0d2Vl biBhbmRyb2lkIGFuZCBsaW51eC4gQnV0IG9oIHdlbGwsIG1heWJlIHRoaXMgaGVscHMgaW4KPiBn ZXR0aW5nIHRoZSBhbmRyb2lkIHRlYW0gbW9yZSBvbiBib2FyZCB3aXRoIHVwc3RyZWFtIGlndCB0 ZXN0cyB0aGFuIGFsc28KPiByZWludmVudGluZyB0aG9zZSB3aGVlbHMuCj4gCj4gQXBwbGllZCwg dGhhbmtzIGZvciB0aGUgcGF0Y2guCgpPaywgdGhpcyBicmVha3MgdGhlIG5vcm1hbCBwYXJ0aWFs IG1hdGNoIGZ1bmN0aW9uYWxpdHksIHdoaWNoIGlzIHByZXR0eQpoYW5keSBmb3IgcnVubmluZyBh IGZldyB0ZXN0cy4gTmV3IHdlIG5lZWQgKmZvbyogaW5zdGVhZCBvZiBmb28uIENhbiB5b3UKcGxz IGFkZCBhIHBhdGNoIG9uIHRvcCB0byByZXN0b3JlIHRoYXQ/CgpUaGFua3MsIERhbmllbAoKPiAt RGFuaWVsCj4gCj4gPiAtLS0KPiA+ICBDT1BZSU5HICAgICAgICAgICAgICAgICB8ICAyMSArKysK PiA+ICBsaWIvTWFrZWZpbGUuc291cmNlcyAgICB8ICAgMiArCj4gPiAgbGliL2lndF9jb3JlLmMg ICAgICAgICAgfCAgMTcgKy0KPiA+ICBsaWIvdXdpbGRtYXQvdXdpbGRtYXQuYyB8IDQ3NCArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiA+ICBsaWIvdXdp bGRtYXQvdXdpbGRtYXQuaCB8ICAyNCArKysKPiA+ICA1IGZpbGVzIGNoYW5nZWQsIDUzNiBpbnNl cnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQo+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvdXdp bGRtYXQvdXdpbGRtYXQuYwo+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvdXdpbGRtYXQvdXdp bGRtYXQuaAo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKPiA+IGluZGV4 IGI4ZjY3NTMuLjE2Mzc1ZjIgMTAwNjQ0Cj4gPiAtLS0gYS9DT1BZSU5HCj4gPiArKysgYi9DT1BZ SU5HCj4gPiBAQCAtMTA2LDMgKzEwNiwyNCBAQCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9M REVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+ID4gIExJQUJJ TElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNF LCBBUklTSU5HCj4gPiAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09G VFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ID4gIElOIFRIRSBTT0ZUV0FSRS4K PiA+ICsKPiA+ICtDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIw MDksIDIwMTAsIDIwMTEsIDIwMTIsCj4gPiArICAgIDIwMTMsIDIwMTQgYnkgSW50ZXJuZXQgU3lz dGVtcyBDb25zb3J0aXVtLCBJbmMuICgiSVNDIikKPiA+ICtDb3B5cmlnaHQgKGMpIDE5OTEsIDE5 OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCj4gPiArICAgIDIw MDIsIDIwMDMgYnkgVGhlIEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0gYW5kIFJpY2ggU2Fs ego+ID4gKwo+ID4gK1RoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0 ZWQgdG8gdGhlIEludGVybmV0IFNvZnR3YXJlCj4gPiArQ29uc29ydGl1bSBieSBSaWNoIFNhbHou Cj4gPiArCj4gPiArUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1 dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Cj4gPiArcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVl IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQo+ID4gK2NvcHlyaWdo dCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMu Cj4gPiArCj4gPiArVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElTQyBESVND TEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSAo+ID4gK1JFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElO Q0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCj4gPiArTUVSQ0hBTlRBQklMSVRZIEFO RCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IgQU5ZCj4gPiAr U1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFO WSBEQU1BR0VTCj4gPiArV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFU QSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCj4gPiArQUNUSU9OIE9GIENPTlRSQUNULCBORUdM SUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKPiA+ICtPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJF Lgo+ID4gKwo+ID4gZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZS5zb3VyY2VzIGIvbGliL01ha2Vm aWxlLnNvdXJjZXMKPiA+IGluZGV4IDQ5OTk4NjguLmUzMzg2MWUgMTAwNjQ0Cj4gPiAtLS0gYS9s aWIvTWFrZWZpbGUuc291cmNlcwo+ID4gKysrIGIvbGliL01ha2VmaWxlLnNvdXJjZXMKPiA+IEBA IC02MCw2ICs2MCw4IEBAIGxpYmludGVsX3Rvb2xzX2xhX1NPVVJDRVMgPSAJXAo+ID4gIAlpZ3Rf Y29yZS5oCQlcCj4gPiAgCWlndF9kcmF3LmMJCVwKPiA+ICAJaWd0X2RyYXcuaAkJXAo+ID4gKwl1 d2lsZG1hdC91d2lsZG1hdC5oCVwKPiA+ICsJdXdpbGRtYXQvdXdpbGRtYXQuYwlcCj4gPiAgCSQo TlVMTCkKPiA+ICAKPiA+ICAuUEhPTlk6IHZlcnNpb24uaC50bXAKPiA+IGRpZmYgLS1naXQgYS9s aWIvaWd0X2NvcmUuYyBiL2xpYi9pZ3RfY29yZS5jCj4gPiBpbmRleCA2YjY5YmI3Li44ZTBiZDJl IDEwMDY0NAo+ID4gLS0tIGEvbGliL2lndF9jb3JlLmMKPiA+ICsrKyBiL2xpYi9pZ3RfY29yZS5j Cj4gPiBAQCAtNTYsNyArNTYsNyBAQAo+ID4gICNpbmNsdWRlIDxjdHlwZS5oPgo+ID4gICNpbmNs dWRlIDxsaW1pdHMuaD4KPiA+ICAjaW5jbHVkZSA8bG9jYWxlLmg+Cj4gPiAtI2luY2x1ZGUgPGZu bWF0Y2guaD4KPiA+ICsjaW5jbHVkZSA8dXdpbGRtYXQvdXdpbGRtYXQuaD4KPiA+ICAKPiA+ICAj aW5jbHVkZSAiZHJtdGVzdC5oIgo+ID4gICNpbmNsdWRlICJpbnRlbF9jaGlwc2V0LmgiCj4gPiBA QCAtMjA5LDYgKzIwOSwxOSBAQAo+ID4gICAqIGludGVsIGdwdSB0byBiZSBwcmVzZW50KS4gVGhl biBpbmRpdmlkdWFsIHN1YnRlc3RzIGNhbiBiZSBydW4gd2l0aAo+ID4gICAqICItLXJ1bi1zdWJ0 ZXN0Ii4gVXNhZ2UgaGVscCBmb3IgdGVzdHMgd2l0aCBzdWJ0ZXN0cyBjYW4gYmUgb2J0YWluZWQg d2l0aCB0aGUKPiA+ICAgKiAiLS1oZWxwIiBjb21tYW5kIGxpbmUgb3B0aW9uLgo+ID4gKyAqCj4g PiArICogQSB3aWxkY2FyZCBleHByZXNzaW9uIGNhbiBiZSBnaXZlbiB0byAtLXJ1bi1zdWJ0ZXN0 IHRvIHNwZWNpZnkgYSBzdWJzZXQgb2YKPiA+ICsgKiBzdWJ0ZXN0cyB0byBydW4uIFNlZSBodHRw czovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk3NyNzZWN0aW9uLTQgZm9yIGEKPiA+ICsgKiBk ZXNjcmlwdGlvbiBvZiBhbGxvd2VkIHdpbGRjYXJkIGV4cHJlc3Npb25zLgo+ID4gKyAqIFNvbWUg ZXhhbXBsZXMgb2YgYWxsb3dlZCB3aWxkY2FyZCBleHByZXNzaW9ucyBhcmU6Cj4gPiArICoKPiA+ ICsgKiAtICcqYmFzaWMqJyBtYXRjaCBhbnkgc3VidGVzdCBjb250YWluaW5nIGJhc2ljCj4gPiAr ICogLSAnYmFzaWMtPz8/JyBtYXRjaCBhbnkgc3VidGVzdCBuYW1lZCBiYXNpYy0gd2l0aCAzIGNo YXJhY3RlcnMgYWZ0ZXIgLQo+ID4gKyAqIC0gJ2Jhc2ljLVswLTldJyBtYXRjaCBhbnkgc3VidGVz dCBuYW1lZCBiYXNpYy0gd2l0aCBhIHNpbmdsZSBudW1iZXIgYWZ0ZXIgLQo+ID4gKyAqIC0gJ2Jh c2ljLVteMC05XScgbWF0Y2ggYW55IHN1YnRlc3QgbmFtZWQgYmFzaWMtIHdpdGggYSBzaW5nbGUg bm9uIG51bWVyaWNhbCBjaGFyYWN0ZXIgYWZ0ZXIgLQo+ID4gKyAqIC0gJ2Jhc2ljKixhZHZhbmNl ZConIG1hdGNoIGFueSBzdWJ0ZXN0IHN0YXJ0aW5nIGJhc2ljIG9yIGFkdmFuY2VkCj4gPiArICog LSAnKiwhYmFzaWMqJyBtYXRjaCBhbnkgc3VidGVzdCBub3Qgc3RhcnRpbmcgYmFzaWMKPiA+ICsg KiAtICdiYXNpYyosIWJhc2ljLXJlbmRlcionIG1hdGNoIGFueSBzdWJ0ZXN0IHN0YXJ0aW5nIGJh c2ljIGJ1dCBub3Qgc3RhcnRpbmcgYmFzaWMtcmVuZGVyCj4gPiAgICovCj4gPiAgCj4gPiAgc3Rh dGljIHVuc2lnbmVkIGludCBleGl0X2hhbmRsZXJfY291bnQ7Cj4gPiBAQCAtODE0LDcgKzgyNyw3 IEBAIGJvb2wgX19pZ3RfcnVuX3N1YnRlc3QoY29uc3QgY2hhciAqc3VidGVzdF9uYW1lKQo+ID4g IAl9Cj4gPiAgCj4gPiAgCWlmIChydW5fc2luZ2xlX3N1YnRlc3QpIHsKPiA+IC0JCWlmIChmbm1h dGNoKHJ1bl9zaW5nbGVfc3VidGVzdCwgc3VidGVzdF9uYW1lLCAwKSAhPSAwKQo+ID4gKwkJaWYg KHV3aWxkbWF0KHN1YnRlc3RfbmFtZSwgcnVuX3NpbmdsZV9zdWJ0ZXN0KSA9PSAwKQo+ID4gIAkJ CXJldHVybiBmYWxzZTsKPiA+ICAJCWVsc2UKPiA+ICAJCQlydW5fc2luZ2xlX3N1YnRlc3RfZm91 bmQgPSB0cnVlOwo+ID4gZGlmZiAtLWdpdCBhL2xpYi91d2lsZG1hdC91d2lsZG1hdC5jIGIvbGli L3V3aWxkbWF0L3V3aWxkbWF0LmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAw MDAwMDAwLi4yZDM0NzQyCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9saWIvdXdpbGRtYXQv dXdpbGRtYXQuYwo+ID4gQEAgLTAsMCArMSw0NzQgQEAKPiA+ICsvKiB1d2lsZG1hdC5jIGlzIHJl dXNlZCBmcm9tIGxpYmlubiAtIGh0dHBzOi8vbGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9p bm4yLzIuNS40LTEKPiA+ICsKPiA+ICtUaGlzIHByb3ZpZGVzIHdpbGQgY2FyZCBtYXRjaGluZyBv cmlnaW5hbGx5IHVzZWQgaW4gSW50ZXJOZXROZXdzIGFuZCBpcwo+ID4gK2Rlc2NyaWJlZCBpbiBo dHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk3NyNzZWN0aW9uLTQKPiA+ICsKPiA+ICtJ Tk4gbGljZW5jZToKPiA+ICtJTk4gYXMgYSB3aG9sZSBhbmQgYWxsIGNvZGUgY29udGFpbmVkIGlu IGl0IG5vdCBvdGhlcndpc2UgbWFya2VkIHdpdGgKPiA+ICtkaWZmZXJlbnQgbGljZW5zZXMgYW5k L29yIGNvcHlyaWdodHMgaXMgY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodAo+ID4g K2FuZCBsaWNlbnNlOgo+ID4gKwo+ID4gKyAgIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSwgMjAw NiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiwKPiA+ICsgICAgICAgMjAxMywg MjAxNCBieSBJbnRlcm5ldCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQo+ID4gKyAg IENvcHlyaWdodCAoYykgMTk5MSwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwg MjAwMCwgMjAwMSwKPiA+ICsgICAgICAgMjAwMiwgMjAwMyBieSBUaGUgSW50ZXJuZXQgU29mdHdh cmUgQ29uc29ydGl1bSBhbmQgUmljaCBTYWx6Cj4gPiArCj4gPiArICAgVGhpcyBjb2RlIGlzIGRl cml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byB0aGUgSW50ZXJuZXQgU29mdHdhcmUK PiA+ICsgICBDb25zb3J0aXVtIGJ5IFJpY2ggU2Fsei4KPiA+ICsKPiA+ICsgICBQZXJtaXNzaW9u IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBh bnkKPiA+ICsgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQs IHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCj4gPiArICAgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhp cyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KPiA+ICsKPiA+ICsgICBU SEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NMQUlNUyBBTEwgV0FS UkFOVElFUyBXSVRICj4gPiArICAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFM TCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKPiA+ICsgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F U1MuICBJTiBOTyBFVkVOVCBTSEFMTCBJU0MgQkUgTElBQkxFIEZPUiBBTlkKPiA+ICsgICBTUEVD SUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERB TUFHRVMKPiA+ICsgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRB IE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KPiA+ICsgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5F R0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgo+ID4gKyAg IE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09G VFdBUkUuCj4gPiArCj4gPiArKi8KPiA+ICsKPiA+ICsvKiAgJElkOiB1d2lsZG1hdC5jIDg5MTgg MjAxMC0wMS0yMiAyMzoyODoyOFogaXVsaXVzICQKPiA+ICsqKgo+ID4gKyoqICB3aWxkbWF0IHBh dHRlcm4gbWF0Y2hpbmcgd2l0aCBVbmljb2RlIFVURi04IGV4dGVuc2lvbnMuCj4gPiArKioKPiA+ ICsqKiAgRG8gc2hlbGwtc3R5bGUgcGF0dGVybiBtYXRjaGluZyBmb3IgPywgXCwgW10sIGFuZCAq IGNoYXJhY3RlcnMuICBNaWdodCBub3QKPiA+ICsqKiAgYmUgcm9idXN0IGluIGZhY2Ugb2YgbWFs Zm9ybWVkIHBhdHRlcm5zOyBlLmcuLCAiZm9vW2EtIiBjb3VsZCBjYXVzZSBhCj4gPiArKiogIHNl Z21lbnRhdGlvbiB2aW9sYXRpb24uICBJdCBpcyA4LWJpdCBjbGVhbi4gIChSb2J1c3RuZXNzIGhv cGVmdWxseSBmaXhlZAo+ID4gKyoqICBKdWx5IDIwMDA7IGFsbCBtYWxmb3JtZWQgcGF0dGVybnMg c2hvdWxkIG5vdyBqdXN0IGZhaWwgdG8gbWF0Y2ggYW55dGhpbmcuKQo+ID4gKyoqCj4gPiArKiog IE9yaWdpbmFsIGJ5IFJpY2ggJGFseiwgbWlycm9yIXJzLCBXZWQgTm92IDI2IDE5OjAzOjE3IEVT VCAxOTg2Lgo+ID4gKyoqICBSaWNoICRhbHogaXMgbm93IDxyc2FsekBvc2Yub3JnPi4KPiA+ICsq Kgo+ID4gKyoqICBBcHJpbCwgMTk5MTogIFJlcGxhY2VkIG11dHVhbGx5LXJlY3Vyc2l2ZSBjYWxs cyB3aXRoIGluLWxpbmUgY29kZSBmb3IgdGhlCj4gPiArKiogIHN0YXIgY2hhcmFjdGVyLgo+ID4g KyoqCj4gPiArKiogIFNwZWNpYWwgdGhhbmtzIHRvIExhcnMgTWF0aGllc2VuIDx0aG9yaW5uQGRp a3UuZGs+IGZvciB0aGUgQUJPUlQgY29kZS4KPiA+ICsqKiAgVGhpcyBjYW4gZ3JlYXRseSBzcGVl ZCB1cCBmYWlsaW5nIHdpbGRjYXJkIHBhdHRlcm5zLiAgRm9yIGV4YW1wbGU6Cj4gPiArKioKPiA+ ICsqKglwYXR0ZXJuOiAtKi0qLSotKi0qLSotMTItKi0qLSotbS0qLSotKgo+ID4gKyoqCXRleHQg MToJIC1hZG9iZS1jb3VyaWVyLWJvbGQtby1ub3JtYWwtLTEyLTEyMC03NS03NS1tLTcwLWlzbzg4 NTktMQo+ID4gKyoqCXRleHQgMjoJIC1hZG9iZS1jb3VyaWVyLWJvbGQtby1ub3JtYWwtLTEyLTEy MC03NS03NS1YLTcwLWlzbzg4NTktMQo+ID4gKyoqCj4gPiArKiogIFRleHQgMSBtYXRjaGVzIHdp dGggNTEgY2FsbHMsIHdoaWxlIHRleHQgMiBmYWlscyB3aXRoIDU0IGNhbGxzLiAgV2l0aG91dAo+ ID4gKyoqICB0aGUgQUJPUlQgY29kZSwgaXQgdGFrZXMgMjIzMTAgY2FsbHMgdG8gZmFpbC4gIFVn aC4gIFRoZSBmb2xsb3dpbmcKPiA+ICsqKiAgZXhwbGFuYXRpb24gaXMgZnJvbSBMYXJzOgo+ID4g KyoqCj4gPiArKiogIFRoZSBwcmVjb25kaXRpb24gdGhhdCBtdXN0IGJlIGZ1bGZpbGxlZCBpcyB0 aGF0IERvTWF0Y2ggd2lsbCBjb25zdW1lIGF0Cj4gPiArKiogIGxlYXN0IG9uZSBjaGFyYWN0ZXIg aW4gdGV4dC4gIFRoaXMgaXMgdHJ1ZSBpZiAqcCBpcyBuZWl0aGVyICcqJyBub3IgJ1wwJy4pCj4g PiArKiogIFRoZSBsYXN0IHJldHVybiBoYXMgQUJPUlQgaW5zdGVhZCBvZiBmYWxzZSB0byBhdm9p ZCBxdWFkcmF0aWMgYmVoYXZpb3VyIGluCj4gPiArKiogIGNhc2VzIGxpa2UgcGF0dGVybiAiKmEq YipjKmQiIHdpdGggdGV4dCAiYWJjeHh4eHgiLiAgV2l0aCBmYWxzZSwgZWFjaAo+ID4gKyoqICBz dGFyLWxvb3AgaGFzIHRvIHJ1biB0byB0aGUgZW5kIG9mIHRoZSB0ZXh0OyB3aXRoIEFCT1JUIG9u bHkgdGhlIGxhc3Qgb25lCj4gPiArKiogIGRvZXMuCj4gPiArKioKPiA+ICsqKiAgT25jZSB0aGUg Y29udHJvbCBvZiBvbmUgaW5zdGFuY2Ugb2YgRG9NYXRjaCBlbnRlcnMgdGhlIHN0YXItbG9vcCwg dGhhdAo+ID4gKyoqICBpbnN0YW5jZSB3aWxsIHJldHVybiBlaXRoZXIgdHJ1ZSBvciBBQk9SVCwg YW5kIGFueSBjYWxsaW5nIGluc3RhbmNlIHdpbGwKPiA+ICsqKiAgdGhlcmVmb3JlIHJldHVybiBp bW1lZGlhdGVseSBhZnRlciAod2l0aG91dCBjYWxsaW5nIHJlY3Vyc2l2ZWx5IGFnYWluKS4KPiA+ ICsqKiAgSW4gZWZmZWN0LCBvbmx5IG9uZSBzdGFyLWxvb3AgaXMgZXZlciBhY3RpdmUuICBJdCB3 b3VsZCBiZSBwb3NzaWJsZSB0bwo+ID4gKyoqICBtb2RpZnkgdGhlIGNvZGUgdG8gbWFpbnRhaW4g dGhpcyBjb250ZXh0IGV4cGxpY2l0bHksIGVsaW1pbmF0aW5nIGFsbAo+ID4gKyoqICByZWN1cnNp dmUgY2FsbHMgYXQgdGhlIGNvc3Qgb2Ygc29tZSBjb21wbGljYXRpb24gYW5kIGxvc3Mgb2YgY2xh cml0eSAoYW5kCj4gPiArKiogIHRoZSBBQk9SVCBzdHVmZiBzZWVtcyB0byBiZSB1bmNsZWFyIGVu b3VnaCBieSBpdHNlbGYpLiAgSSB0aGluayBpdCB3b3VsZAo+ID4gKyoqICBiZSB1bndpc2UgdG8g dHJ5IHRvIGdldCB0aGlzIGludG8gYSByZWxlYXNlZCB2ZXJzaW9uIHVubGVzcyB5b3UgaGF2ZSBh Cj4gPiArKiogIGdvb2QgdGVzdCBkYXRhIGJhc2UgdG8gdHJ5IGl0IG91dCBvbi4KPiA+ICsqKgo+ ID4gKyoqICBKdW5lLCAxOTkxOiAgUm9iZXJ0IEVseiA8a3JlQG11bm5hcmkub3ouYXU+IGFkZGVk IG1pbnVzIGFuZCBjbG9zZSBicmFja2V0Cj4gPiArKiogIGhhbmRsaW5nIGZvciBjaGFyYWN0ZXIg c2V0cy4KPiA+ICsqKgo+ID4gKyoqICBKdWx5LCAyMDAwOiAgTGFyZ2VseSByZXdyaXR0ZW4gYnkg UnVzcyBBbGxiZXJ5IDxycmFAc3RhbmZvcmQuZWR1PiB0byBhZGQKPiA+ICsqKiAgc3VwcG9ydCBm b3IgJywnLCAnIScsIGFuZCBvcHRpb25hbGx5ICdAJyB0byB0aGUgY29yZSB3aWxkbWF0IHJvdXRp bmUuCj4gPiArKiogIEJyb2tlIHRoZSBjaGFyYWN0ZXIgY2xhc3MgbWF0Y2hpbmcgaW50byBhIHNl cGFyYXRlIGZ1bmN0aW9uIGZvciBjbGFyaXR5Cj4gPiArKiogIHNpbmNlIGl0J3MgaW5mcmVxdWVu dGx5IHVzZWQgaW4gcHJhY3RpY2UsIGFuZCBhZGRlZCBzb21lIHNpbXBsZSBsb29rYWhlYWQKPiA+ ICsqKiAgdG8gc2lnbmlmaWNhbnRseSBkZWNyZWFzZSB0aGUgcmVjdXJzaXZlIGNhbGxzIGluIHRo ZSAnKicgbWF0Y2hpbmcgY29kZS4KPiA+ICsqKiAgQWRkZWQgc3VwcG9ydCBmb3IgVVRGLTggYXMg dGhlIGRlZmF1bHQgY2hhcmFjdGVyIHNldCBmb3IgYW55IGhpZ2gtYml0Cj4gPiArKiogIGNoYXJh Y3RlcnMuCj4gPiArKioKPiA+ICsqKiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVVRGLTgsIHNl ZSBSRkMgMzYyOS4KPiA+ICsqKgo+ID4gKyoqICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgZmlsZSBp cyBpbnRlbnRpb25hbGx5IHdyaXR0ZW4gc28gdGhhdCBjb25kaXRpb25hbGx5Cj4gPiArKiogIGV4 ZWN1dGVkIGV4cHJlc3Npb25zIGFyZSBvbiBzZXBhcmF0ZSBsaW5lcyBmcm9tIHRoZSBjb25kaXRp b24gdG8KPiA+ICsqKiAgZmFjaWxpdGF0ZSBhbmFseXNpcyBvZiB0aGUgY292ZXJhZ2Ugb2YgdGhl IHRlc3Qgc3VpdGUgdXNpbmcgcHVyZWNvdi4KPiA+ICsqKiAgUGxlYXNlIHByZXNlcnZlIHRoaXMu ICBBcyBvZiBNYXJjaCAxMSwgMjAwMSwgcHVyZWNvdiByZXBvcnRzIHRoYXQgdGhlCj4gPiArKiog IGFjY29tcGFueWluZyB0ZXN0IHN1aXRlIGFjaGlldmVzIDEwMCUgY292ZXJhZ2Ugb2YgdGhpcyBm aWxlLgo+ID4gKyovCj4gPiArCj4gPiArI2luY2x1ZGUgPHN0cmluZy5oPgo+ID4gKyNpbmNsdWRl ICJ1d2lsZG1hdC5oIgo+ID4gKwo+ID4gKyNkZWZpbmUgQUJPUlQgLTEKPiA+ICsKPiA+ICsvKiBX aGV0aGVyIG9yIG5vdCBhbiBvY3RldCBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiBhIFVURi04IGNo YXJhY3Rlci4gKi8KPiA+ICsjZGVmaW5lIElTVVRGOChjKSAgICAgICAoKChjKSAmIDB4YzApID09 IDB4YzApCj4gPiArCj4gPiArCj4gPiArLyoKPiA+ICsqKiAgRGV0ZXJtaW5lIHRoZSBsZW5ndGgg b2YgYSBub24tQVNDSUkgY2hhcmFjdGVyIGluIG9jdGV0cyAoZm9yIGFkdmFuY2luZwo+ID4gKyoq ICBwb2ludGVycyB3aGVuIHNraXBwaW5nIG92ZXIgY2hhcmFjdGVycykuICBUYWtlcyBhIHBvaW50 ZXIgdG8gdGhlIHN0YXJ0IG9mCj4gPiArKiogIHRoZSBjaGFyYWN0ZXIgYW5kIHRvIHRoZSBsYXN0 IG9jdGV0IG9mIHRoZSBzdHJpbmcuICBJZiBlbmQgaXMgTlVMTCwgZXhwZWN0Cj4gPiArKiogIHRo ZSBzdHJpbmcgcG9pbnRlZCB0byBieSBzdGFydCB0byBiZSBudWwtdGVybWluYXRlZC4gIElmIHRo ZSBjaGFyYWN0ZXIgaXMKPiA+ICsqKiAgbWFsZm9ybWVkIFVURi04LCByZXR1cm4gMSB0byB0cmVh dCBpdCBsaWtlIGFuIGVpZ2h0LWJpdCBsb2NhbCBjaGFyYWN0ZXIuCj4gPiArKi8KPiA+ICtzdGF0 aWMgaW50Cj4gPiArdXRmOF9sZW5ndGgoY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnQsIGNvbnN0 IHVuc2lnbmVkIGNoYXIgKmVuZCkKPiA+ICt7Cj4gPiArICAgIHVuc2lnbmVkIGNoYXIgbWFzayA9 IDB4ODA7Cj4gPiArICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7Cj4gPiArICAgIGludCBsZW5n dGggPSAwOwo+ID4gKyAgICBpbnQgbGVmdDsKPiA+ICsKPiA+ICsgICAgZm9yICg7IG1hc2sgPiAw ICYmICgqc3RhcnQgJiBtYXNrKSA9PSBtYXNrOyBtYXNrID4+PSAxKQo+ID4gKyAgICAgICAgbGVu Z3RoKys7Cj4gPiArICAgIGlmIChsZW5ndGggPCAyIHx8IGxlbmd0aCA+IDYpCj4gPiArICAgICAg ICByZXR1cm4gMTsKPiA+ICsgICAgaWYgKGVuZCAhPSBOVUxMICYmIChlbmQgLSBzdGFydCArIDEp IDwgbGVuZ3RoKQo+ID4gKyAgICAgICAgcmV0dXJuIDE7Cj4gPiArICAgIGxlZnQgPSBsZW5ndGgg LSAxOwo+ID4gKyAgICBmb3IgKHAgPSBzdGFydCArIDE7IGxlZnQgPiAwICYmICgqcCAmIDB4YzAp ID09IDB4ODA7IHArKykKPiA+ICsgICAgICAgIGxlZnQtLTsKPiA+ICsgICAgcmV0dXJuIChsZWZ0 ID09IDApID8gbGVuZ3RoIDogMTsKPiA+ICt9Cj4gPiArCj4gPiArCj4gPiArLyoKPiA+ICsqKiAg Q2hlY2sgd2hldGhlciBhIHN0cmluZyBjb250YWlucyBvbmx5IHZhbGlkIFVURi04IGNoYXJhY3Rl cnMuCj4gPiArKi8KPiA+ICtib29sCj4gPiAraXNfdmFsaWRfdXRmOChjb25zdCBjaGFyICp0ZXh0 KQo+ID4gK3sKPiA+ICsgICAgdW5zaWduZWQgY2hhciBtYXNrOwo+ID4gKyAgICBjb25zdCB1bnNp Z25lZCBjaGFyICpwOwo+ID4gKyAgICBpbnQgbGVuZ3RoOwo+ID4gKyAgICBpbnQgbGVmdDsKPiA+ ICsKPiA+ICsgICAgZm9yIChwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKil0ZXh0OyAqcCAhPSAn XDAnOykgewo+ID4gKyAgICAgICAgbWFzayA9IDB4ODA7Cj4gPiArICAgICAgICBsZW5ndGggPSAw Owo+ID4gKwo+ID4gKyAgICAgICAgLyogRmluZCBvdXQgdGhlIGV4cGVjdGVkIGxlbmd0aCBvZiB0 aGUgY2hhcmFjdGVyLiAqLwo+ID4gKyAgICAgICAgZm9yICg7IG1hc2sgPiAwICYmICgqcCAmIG1h c2spID09IG1hc2s7IG1hc2sgPj49IDEpCj4gPiArICAgICAgICAgICAgbGVuZ3RoKys7Cj4gPiAr Cj4gPiArICAgICAgICBwKys7Cj4gPiArCj4gPiArICAgICAgICAvKiBWYWxpZCBBU0NJSS4gKi8K PiA+ICsgICAgICAgIGlmIChsZW5ndGggPT0gMCkKPiA+ICsgICAgICAgICAgICBjb250aW51ZTsK PiA+ICsgICAgICAgIAo+ID4gKyAgICAgICAgLyogSW52YWxpZCBsZW5ndGguICovCj4gPiArICAg ICAgICBpZiAobGVuZ3RoIDwgMiB8fCBsZW5ndGggPiA2KQo+ID4gKyAgICAgICAgICAgIHJldHVy biBmYWxzZTsKPiA+ICsKPiA+ICsgICAgICAgIC8qIENoZWNrIHRoYXQgZWFjaCBieXRlIGxvb2tz IGxpa2UgMTB4eHh4eHgsIGV4Y2VwdCBmb3IgdGhlIGZpcnN0LiAqLwo+ID4gKyAgICAgICAgbGVm dCA9IGxlbmd0aCAtIDE7Cj4gPiArICAgICAgICBmb3IgKDsgbGVmdCA+IDAgJiYgKCpwICYgMHhj MCkgPT0gMHg4MDsgcCsrKQo+ID4gKyAgICAgICAgICAgIGxlZnQtLTsKPiA+ICsKPiA+ICsgICAg ICAgIGlmIChsZWZ0ID4gMCkKPiA+ICsgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiArICAg IH0KPiA+ICsKPiA+ICsgICAgcmV0dXJuIHRydWU7Cj4gPiArfQo+ID4gKwo+ID4gKwo+ID4gKy8q Cj4gPiArKiogIENvbnZlcnQgYSBVVEYtOCBjaGFyYWN0ZXIgdG8gVUNTLTQuICBUYWtlcyBhIHBv aW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZQo+ID4gKyoqICBjaGFyYWN0ZXIgYW5kIHRvIHRoZSBs YXN0IG9jdGV0IG9mIHRoZSBzdHJpbmcsIGFuZCB0byBhIHVpbnQzMl90IGludG8KPiA+ICsqKiAg d2hpY2ggdG8gcHV0IHRoZSBkZWNvZGVkIFVDUy00IHZhbHVlLiAgSWYgZW5kIGlzIE5VTEwsIGV4 cGVjdCB0aGUgc3RyaW5nCj4gPiArKiogIHBvaW50ZWQgdG8gYnkgc3RhcnQgdG8gYmUgbnVsLXRl cm1pbmF0ZWQuICBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGluCj4gPiArKiogIHRoZSBV VEYtOCBlbmNvZGluZy4gIElmIHRoZSBVVEYtOCBjaGFyYWN0ZXIgaXMgbWFsZm9ybWVkLCBzZXQg cmVzdWx0IHRvCj4gPiArKiogIHRoZSBkZWNpbWFsIHZhbHVlIG9mIHRoZSBmaXJzdCBvY3RldDsg dGhpcyBpcyB3cm9uZywgYnV0IGl0IHdpbGwgZ2VuZXJhbGx5Cj4gPiArKiogIGNhdXNlIHRoZSBy ZXN0IG9mIHRoZSB3aWxkbWF0IG1hdGNoaW5nIHRvIGRvIHRoZSByaWdodCB0aGluZyBmb3Igbm9u LVVURi04Cj4gPiArKiogIGlucHV0Lgo+ID4gKyovCj4gPiArc3RhdGljIGludAo+ID4gK3V0Zjhf ZGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpl bmQsCj4gPiArICAgICAgICAgICAgdWludDMyX3QgKnJlc3VsdCkKPiA+ICt7Cj4gPiArICAgIHVp bnQzMl90IHZhbHVlID0gMDsKPiA+ICsgICAgaW50IGxlbmd0aCwgaTsKPiA+ICsgICAgY29uc3Qg dW5zaWduZWQgY2hhciAqcCA9IHN0YXJ0Owo+ID4gKyAgICB1bnNpZ25lZCBjaGFyIG1hc2s7Cj4g PiArCj4gPiArICAgIGxlbmd0aCA9IHV0ZjhfbGVuZ3RoKHN0YXJ0LCBlbmQpOwo+ID4gKyAgICBp ZiAobGVuZ3RoIDwgMikgewo+ID4gKyAgICAgICAgKnJlc3VsdCA9ICpzdGFydDsKPiA+ICsgICAg ICAgIHJldHVybiAxOwo+ID4gKyAgICB9Cj4gPiArICAgIG1hc2sgPSAoMSA8PCAoNyAtIGxlbmd0 aCkpIC0gMTsKPiA+ICsgICAgdmFsdWUgPSAqcCAmIG1hc2s7Cj4gPiArICAgIHArKzsKPiA+ICsg ICAgZm9yIChpID0gbGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkgewo+ID4gKyAgICAgICAgdmFsdWUg PSAodmFsdWUgPDwgNikgfCAoKnAgJiAweDNmKTsKPiA+ICsgICAgICAgIHArKzsKPiA+ICsgICAg fQo+ID4gKyAgICAqcmVzdWx0ID0gdmFsdWU7Cj4gPiArICAgIHJldHVybiBsZW5ndGg7Cj4gPiAr fQo+ID4gKwo+ID4gKwo+ID4gKy8qCj4gPiArKiogIE1hdGNoIGEgY2hhcmFjdGVyIGNsYXNzIGFn YWluc3QgdGV4dCwgYSBVQ1MtNCBjaGFyYWN0ZXIuICBzdGFydCBpcyBhCj4gPiArKiogIHBvaW50 ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgY2hhcmFjdGVyIGNsYXNzLCBlbmQgYSBw b2ludGVyIHRvCj4gPiArKiogIHRoZSBsYXN0LiAgUmV0dXJucyB3aGV0aGVyIHRoZSBjbGFzcyBt YXRjaGVzIHRoYXQgY2hhcmFjdGVyLgo+ID4gKyovCj4gPiArc3RhdGljIGJvb2wKPiA+ICttYXRj aF9jbGFzcyh1aW50MzJfdCB0ZXh0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzdGFydCwKPiA+ICsg ICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQpCj4gPiArewo+ID4gKyAgICBib29s IHJldmVyc2VkLCBhbGxvd3JhbmdlOwo+ID4gKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0g c3RhcnQ7Cj4gPiArICAgIHVpbnQzMl90IGZpcnN0ID0gMDsKPiA+ICsgICAgdWludDMyX3QgbGFz dDsKPiA+ICsKPiA+ICsgICAgLyogQ2hlY2sgZm9yIGFuIGludmVydGVkIGNoYXJhY3RlciBjbGFz cyAoc3RhcnRpbmcgd2l0aCBeKS4gIElmIHRoZQo+ID4gKyAgICAgICBjaGFyYWN0ZXIgbWF0Y2hl cyB0aGUgY2hhcmFjdGVyIGNsYXNzLCB3ZSByZXR1cm4gIXJldmVyc2VkOyB0aGF0IHdheSwKPiA+ ICsgICAgICAgd2UgcmV0dXJuIHRydWUgaWYgaXQncyBhIHJlZ3VsYXIgY2hhcmFjdGVyIGNsYXNz IGFuZCBmYWxzZSBpZiBpdCdzIGEKPiA+ICsgICAgICAgcmV2ZXJzZWQgb25lLiAgSWYgdGhlIGNo YXJhY3RlciBkb2Vzbid0IG1hdGNoLCB3ZSByZXR1cm4gcmV2ZXJzZWQuICovCj4gPiArICAgIHJl dmVyc2VkID0gKCpwID09ICdeJyk7Cj4gPiArICAgIGlmIChyZXZlcnNlZCkKPiA+ICsgICAgICAg IHArKzsKPiA+ICsKPiA+ICsgICAgLyogV2FsayB0aHJvdWdoIHRoZSBjaGFyYWN0ZXIgY2xhc3Mg dW50aWwgd2UgcmVhY2ggdGhlIGVuZCBvciBmaW5kIGEKPiA+ICsgICAgICAgbWF0Y2gsIGhhbmRs aW5nIGNoYXJhY3RlciByYW5nZXMgYXMgd2UgZ28uICBPbmx5IHBlcm1pdCBhIHJhbmdlIHRvCj4g PiArICAgICAgIHN0YXJ0IHdoZW4gYWxsb3dyYW5nZSBpcyB0cnVlOyB0aGlzIGFsbG93cyAtIHRv IGJlIHRyZWF0ZWQgbGlrZSBhCj4gPiArICAgICAgIG5vcm1hbCBjaGFyYWN0ZXIgYXMgdGhlIGZp cnN0IGNoYXJhY3RlciBvZiB0aGUgY2xhc3MgYW5kIGNhdGNoZXMKPiA+ICsgICAgICAgbWFsZm9y bWVkIHJhbmdlcyBsaWtlIGEtZS1uLiAgV2UgdHJlYXQgdGhlIGNoYXJhY3RlciBhdCB0aGUgYmVn aW5uaW5nCj4gPiArICAgICAgIG9mIGEgcmFuZ2UgYXMgYm90aCBhIHJlZ3VsYXIgbWVtYmVyIG9m IHRoZSBjbGFzcyBhbmQgdGhlIGJlZ2lubmluZyBvZgo+ID4gKyAgICAgICB0aGUgcmFuZ2U7IHRo aXMgaXMgaGFybWxlc3MgKGFsdGhvdWdoIGl0IG1lYW5zIHRoYXQgbWFsZm9ybWVkIHJhbmdlcwo+ ID4gKyAgICAgICBsaWtlIG0tYSB3aWxsIG1hdGNoIG0gYW5kIG5vdGhpbmcgZWxzZSkuICovCj4g PiArICAgIGFsbG93cmFuZ2UgPSBmYWxzZTsKPiA+ICsgICAgd2hpbGUgKHAgPD0gZW5kKSB7Cj4g PiArICAgICAgICBpZiAoYWxsb3dyYW5nZSAmJiAqcCA9PSAnLScgJiYgcCA8IGVuZCkgewo+ID4g KyAgICAgICAgICAgIHArKzsKPiA+ICsgICAgICAgICAgICBwICs9IHV0ZjhfZGVjb2RlKHAsIGVu ZCwgJmxhc3QpOwo+ID4gKyAgICAgICAgICAgIGlmICh0ZXh0ID49IGZpcnN0ICYmIHRleHQgPD0g bGFzdCkKPiA+ICsgICAgICAgICAgICAgICAgcmV0dXJuICFyZXZlcnNlZDsKPiA+ICsgICAgICAg ICAgICBhbGxvd3JhbmdlID0gZmFsc2U7Cj4gPiArICAgICAgICB9IGVsc2Ugewo+ID4gKyAgICAg ICAgICAgIHAgKz0gdXRmOF9kZWNvZGUocCwgZW5kLCAmZmlyc3QpOwo+ID4gKyAgICAgICAgICAg IGlmICh0ZXh0ID09IGZpcnN0KQo+ID4gKyAgICAgICAgICAgICAgICByZXR1cm4gIXJldmVyc2Vk Owo+ID4gKyAgICAgICAgICAgIGFsbG93cmFuZ2UgPSB0cnVlOwo+ID4gKyAgICAgICAgfQo+ID4g KyAgICB9Cj4gPiArICAgIHJldHVybiByZXZlcnNlZDsKPiA+ICt9Cj4gPiArCj4gPiArCj4gPiAr LyoKPiA+ICsqKiAgTWF0Y2ggdGhlIHRleHQgYWdhaW5zdCB0aGUgcGF0dGVybiBiZXR3ZWVuIHN0 YXJ0IGFuZCBlbmQuICBUaGlzIGlzIGEKPiA+ICsqKiAgc2luZ2xlIHBhdHRlcm47IGEgbGVhZGlu ZyAhIG9yIEAgbXVzdCBhbHJlYWR5IGJlIHRha2VuIGNhcmUgb2YsIGFuZAo+ID4gKyoqICBjb21t YXMgbXVzdCBiZSBkZWFsdCB3aXRoIG91dHNpZGUgb2YgdGhpcyByb3V0aW5lLgo+ID4gKyovCj4g PiArc3RhdGljIGludAo+ID4gK21hdGNoX3BhdHRlcm4oY29uc3QgdW5zaWduZWQgY2hhciAqdGV4 dCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RhcnQsCj4gPiArICAgICAgICAgICAgICBjb25zdCB1 bnNpZ25lZCBjaGFyICplbmQpCj4gPiArewo+ID4gKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpx LCAqZW5kY2xhc3M7Cj4gPiArICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBzdGFydDsKPiA+ ICsgICAgYm9vbCBpc21ldGE7Cj4gPiArICAgIGludCBtYXRjaGVkLCB3aWR0aDsKPiA+ICsgICAg dWludDMyX3QgYzsKPiA+ICsKPiA+ICsgICAgZm9yICg7IHAgPD0gZW5kOyBwKyspIHsKPiA+ICsg ICAgICAgIGlmICghKnRleHQgJiYgKnAgIT0gJyonKQo+ID4gKyAgICAgICAgICAgIHJldHVybiBB Qk9SVDsKPiA+ICsKPiA+ICsgICAgICAgIHN3aXRjaCAoKnApIHsKPiA+ICsgICAgICAgIGNhc2Ug J1xcJzoKPiA+ICsgICAgICAgICAgICBpZiAoISorK3ApCj4gPiArICAgICAgICAgICAgICAgIHJl dHVybiBBQk9SVDsKPiA+ICsgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2guICovCj4gPiArCj4g PiArICAgICAgICBkZWZhdWx0Ogo+ID4gKyAgICAgICAgICAgIGlmICgqdGV4dCsrICE9ICpwKQo+ ID4gKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiArICAgICAgICAgICAgYnJlYWs7 Cj4gPiArCj4gPiArICAgICAgICBjYXNlICc/JzoKPiA+ICsgICAgICAgICAgICB0ZXh0ICs9IElT VVRGOCgqdGV4dCkgPyB1dGY4X2xlbmd0aCh0ZXh0LCBOVUxMKSA6IDE7Cj4gPiArICAgICAgICAg ICAgYnJlYWs7Cj4gPiArCj4gPiArICAgICAgICBjYXNlICcqJzoKPiA+ICsgICAgICAgICAgICAv KiBDb25zZWN1dGl2ZSBzdGFycyBhcmUgZXF1aXZhbGVudCB0byBvbmUuICBBZHZhbmNlIHBhdHRl cm4gdG8KPiA+ICsgICAgICAgICAgICAgICB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBzdGFyLiAq Lwo+ID4gKyAgICAgICAgICAgIGZvciAoKytwOyAqcCA9PSAnKic7IHArKykKPiA+ICsgICAgICAg ICAgICAgICAgOwo+ID4gKwo+ID4gKyAgICAgICAgICAgIC8qIEEgdHJhaWxpbmcgc3RhciB3aWxs IG1hdGNoIGFueXRoaW5nLiAqLwo+ID4gKyAgICAgICAgICAgIGlmIChwID4gZW5kKQo+ID4gKyAg ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAvKiBCYXNp YyBhbGdvcml0aG06IFJlY3Vyc2UgYXQgZWFjaCBwb2ludCB3aGVyZSB0aGUgKiBjb3VsZAo+ID4g KyAgICAgICAgICAgICAgIHBvc3NpYmx5IG1hdGNoLiAgSWYgdGhlIG1hdGNoIHN1Y2NlZWRzIG9y IGFib3J0cywgcmV0dXJuCj4gPiArICAgICAgICAgICAgICAgaW1tZWRpYXRlbHk7IG90aGVyd2lz ZSwgdHJ5IHRoZSBuZXh0IHBvc2l0aW9uLgo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgIE9wdGlt aXphdGlvbjogSWYgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgKiBpbiB0aGUgcGF0dGVybgo+ID4g KyAgICAgICAgICAgICAgIGlzbid0IGEgbWV0YWNoYXJhY3RlciAodGhlIGNvbW1vbiBjYXNlKSwg dGhlbiB0aGUgKiBoYXMgdG8KPiA+ICsgICAgICAgICAgICAgICBjb25zdW1lIGNoYXJhY3RlcnMg YXQgbGVhc3QgdXAgdG8gdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGF0Cj4gPiArICAgICAgICAg ICAgICAgY2hhcmFjdGVyIGluIHRoZSB0ZXh0LiAgU2NhbiBmb3J3YXJkIGZvciB0aG9zZSBwb2lu dHMgcmF0aGVyCj4gPiArICAgICAgICAgICAgICAgdGhhbiByZWN1cnNpbmcgYXQgZXZlcnkgcG9z c2libGUgcG9pbnQgdG8gc2F2ZSB0aGUgZXh0cmEKPiA+ICsgICAgICAgICAgICAgICBmdW5jdGlv biBjYWxsIG92ZXJoZWFkLiAqLwo+ID4gKyAgICAgICAgICAgIGlzbWV0YSA9ICgqcCA9PSAnWycg fHwgKnAgPT0gJz8nIHx8ICpwID09ICdcXCcpOwo+ID4gKyAgICAgICAgICAgIHdoaWxlICgqdGV4 dCkgewo+ID4gKyAgICAgICAgICAgICAgICB3aWR0aCA9IElTVVRGOCgqdGV4dCkgPyB1dGY4X2xl bmd0aCh0ZXh0LCBOVUxMKSA6IDE7Cj4gPiArICAgICAgICAgICAgICAgIGlmIChpc21ldGEpIHsK PiA+ICsgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBtYXRjaF9wYXR0ZXJuKHRleHQsIHAs IGVuZCk7Cj4gPiArICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHdpZHRoOwo+ID4gKyAgICAg ICAgICAgICAgICB9IGVsc2Ugewo+ID4gKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCp0ZXh0 ICYmICp0ZXh0ICE9ICpwKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSB3 aWR0aDsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IElTVVRGOCgqdGV4dCkg PyB1dGY4X2xlbmd0aCh0ZXh0LCBOVUxMKSA6IDE7Cj4gPiArICAgICAgICAgICAgICAgICAgICB9 Cj4gPiArICAgICAgICAgICAgICAgICAgICBpZiAoISp0ZXh0KQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgIHJldHVybiBBQk9SVDsKPiA+ICsgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQg PSBtYXRjaF9wYXR0ZXJuKCsrdGV4dCwgcCArIDEsIGVuZCk7Cj4gPiArICAgICAgICAgICAgICAg IH0KPiA+ICsgICAgICAgICAgICAgICAgaWYgKG1hdGNoZWQgIT0gZmFsc2UpCj4gPiArICAgICAg ICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlZDsKPiA+ICsgICAgICAgICAgICB9Cj4gPiArICAg ICAgICAgICAgcmV0dXJuIEFCT1JUOwo+ID4gKwo+ID4gKyAgICAgICAgY2FzZSAnWyc6Cj4gPiAr ICAgICAgICAgICAgLyogRmluZCB0aGUgZW5kIG9mIHRoZSBjaGFyYWN0ZXIgY2xhc3MsIG1ha2lu ZyBzdXJlIG5vdCB0byBwaWNrCj4gPiArICAgICAgICAgICAgICAgdXAgYSBjbG9zZSBicmFja2V0 IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNsYXNzLiAqLwo+ID4gKyAgICAgICAgICAgIHArKzsK PiA+ICsgICAgICAgICAgICBxID0gcCArICgqcCA9PSAnXicpICsgMTsKPiA+ICsgICAgICAgICAg ICBpZiAocSA+IGVuZCkKPiA+ICsgICAgICAgICAgICAgICAgcmV0dXJuIEFCT1JUOwo+ID4gKyAg ICAgICAgICAgIGVuZGNsYXNzID0gbWVtY2hyKHEsICddJywgKHNpemVfdCkgKGVuZCAtIHEgKyAx KSk7Cj4gPiArICAgICAgICAgICAgaWYgKCFlbmRjbGFzcykKPiA+ICsgICAgICAgICAgICAgICAg cmV0dXJuIEFCT1JUOwo+ID4gKwo+ID4gKyAgICAgICAgICAgIC8qIERvIHRoZSBoZWF2eSBsaWZ0 aW5nIGluIGFub3RoZXIgZnVuY3Rpb24gZm9yIGNsYXJpdHksIHNpbmNlCj4gPiArICAgICAgICAg ICAgICAgY2hhcmFjdGVyIGNsYXNzZXMgYXJlIGFuIHVuY29tbW9uIGNhc2UuICovCj4gPiArICAg ICAgICAgICAgdGV4dCArPSB1dGY4X2RlY29kZSh0ZXh0LCBOVUxMLCAmYyk7Cj4gPiArICAgICAg ICAgICAgaWYgKCFtYXRjaF9jbGFzcyhjLCBwLCBlbmRjbGFzcyAtIDEpKQo+ID4gKyAgICAgICAg ICAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiArICAgICAgICAgICAgcCA9IGVuZGNsYXNzOwo+ID4g KyAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgICAgfQo+ID4gKyAgICB9Cj4gPiArCj4gPiAr ICAgIHJldHVybiAoKnRleHQgPT0gJ1wwJyk7Cj4gPiArfQo+ID4gKwo+ID4gKwo+ID4gKy8qCj4g PiArKiogIFRha2VzIHRleHQgYW5kIGEgd2lsZG1hdCBleHByZXNzaW9uOyBhIHdpbGRtYXQgZXhw cmVzc2lvbiBpcyBhCj4gPiArKiogIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdpbGRtYXQgcGF0 dGVybnMsIG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgISB0bwo+ID4gKyoqICBpbnZlcnQgdGhlIHNl bnNlIG9mIHRoZSBleHByZXNzaW9uLiAgUmV0dXJucyBVV0lMRE1BVF9NQVRDSCBpZiB0aGF0Cj4g PiArKiogIGV4cHJlc3Npb24gbWF0Y2hlcyB0aGUgdGV4dCwgVVdJTERNQVRfRkFJTCBvdGhlcndp c2UuICBJZiBhbGxvd3BvaXNvbiBpcwo+ID4gKyoqICBzZXQsIGFsbG93IEAgdG8gaW50cm9kdWNl IGEgcG9pc29uIGV4cHJlc3Npb24gKHRoZSBzYW1lIGFzICEsIGJ1dCBpZiBpdAo+ID4gKyoqICB0 cmlnZ2VycyB0aGUgZmFpbGVkIG1hdGNoIHRoZSByb3V0aW5lIHJldHVybnMgVVdJTERNQVRfUE9J U09OIGluc3RlYWQpLgo+ID4gKyovCj4gPiArc3RhdGljIGVudW0gdXdpbGRtYXQKPiA+ICttYXRj aF9leHByZXNzaW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRleHQsIGNvbnN0IHVuc2lnbmVkIGNo YXIgKnN0YXJ0LAo+ID4gKyAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd3BvaXNvbikKPiA+ICt7 Cj4gPiArICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCwgKnNwbGl0Owo+ID4gKyAgICBjb25z dCB1bnNpZ25lZCBjaGFyICpwID0gc3RhcnQ7Cj4gPiArICAgIGJvb2wgcmV2ZXJzZSwgZXNjYXBl ZDsKPiA+ICsgICAgYm9vbCBtYXRjaCA9IGZhbHNlOwo+ID4gKyAgICBib29sIHBvaXNvbiA9IGZh bHNlOwo+ID4gKyAgICBib29sIHBvaXNvbmVkID0gZmFsc2U7Cj4gPiArCj4gPiArICAgIC8qIEhh bmRsZSB0aGUgZW1wdHkgZXhwcmVzc2lvbiBzZXBhcmF0ZWx5LCBzaW5jZSBvdGhlcndpc2UgZW5k IHdpbGwgYmUKPiA+ICsgICAgICAgc2V0IHRvIGFuIGludmFsaWQgcG9pbnRlci4gKi8KPiA+ICsg ICAgaWYgKCEqcCkKPiA+ICsgICAgICAgIHJldHVybiAhKnRleHQgPyBVV0lMRE1BVF9NQVRDSCA6 IFVXSUxETUFUX0ZBSUw7Cj4gPiArICAgIGVuZCA9IHN0YXJ0ICsgc3RybGVuKChjb25zdCBjaGFy ICopIHN0YXJ0KSAtIDE7Cj4gPiArCj4gPiArICAgIC8qIE1haW4gbWF0Y2ggbG9vcC4gIEZpbmQg ZWFjaCBjb21tYSB0aGF0IHNlcGFyYXRlcyBwYXR0ZXJucywgYW5kIGF0dGVtcHQgCj4gPiArICAg ICAgIHRvIG1hdGNoIHRoZSB0ZXh0IHdpdGggZWFjaCBwYXR0ZXJuIGluIG9yZGVyLiAgVGhlIGxh c3QgbWF0Y2hpbmcKPiA+ICsgICAgICAgcGF0dGVybiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHdo b2xlIGV4cHJlc3Npb24gbWF0Y2hlcy4gKi8KPiA+ICsgICAgZm9yICg7IHAgPD0gZW5kICsgMTsg cCA9IHNwbGl0ICsgMSkgewo+ID4gKyAgICAgICAgaWYgKGFsbG93cG9pc29uKQo+ID4gKyAgICAg ICAgICAgIHBvaXNvbiA9ICgqcCA9PSAnQCcpOwo+ID4gKyAgICAgICAgcmV2ZXJzZSA9ICgqcCA9 PSAnIScpIHx8IHBvaXNvbjsKPiA+ICsgICAgICAgIGlmIChyZXZlcnNlKQo+ID4gKyAgICAgICAg ICAgIHArKzsKPiA+ICsKPiA+ICsgICAgICAgIC8qIEZpbmQgdGhlIGZpcnN0IHVuZXNjYXBlZCBj b21tYSwgaWYgYW55LiAgSWYgdGhlcmUgaXMgbm9uZSwgc3BsaXQKPiA+ICsgICAgICAgICAgIHdp bGwgYmUgb25lIGdyZWF0ZXIgdGhhbiBlbmQgYW5kIHBvaW50IGF0IHRoZSBudWwgYXQgdGhlIGVu ZCBvZgo+ID4gKyAgICAgICAgICAgdGhlIHN0cmluZy4gKi8KPiA+ICsgICAgICAgIGZvciAoZXNj YXBlZCA9IGZhbHNlLCBzcGxpdCA9IHA7IHNwbGl0IDw9IGVuZDsgc3BsaXQrKykgewo+ID4gKyAg ICAgICAgICAgIGlmICgqc3BsaXQgPT0gJ1snKSB7Cj4gPiArICAgICAgICAgICAgICAgIHNwbGl0 Kys7Cj4gPiArICAgICAgICAgICAgICAgIGlmICgqc3BsaXQgPT0gJ10nKQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgc3BsaXQrKzsKPiA+ICsgICAgICAgICAgICAgICAgd2hpbGUgKHNwbGl0IDw9 IGVuZCAmJiAqc3BsaXQgIT0gJ10nKQo+ID4gKyAgICAgICAgICAgICAgICAgICAgc3BsaXQrKzsK PiA+ICsgICAgICAgICAgICB9Cj4gPiArICAgICAgICAgICAgaWYgKCpzcGxpdCA9PSAnLCcgJiYg IWVzY2FwZWQpCj4gPiArICAgICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgICAgICAgIGVz Y2FwZWQgPSAoKnNwbGl0ID09ICdcXCcpID8gIWVzY2FwZWQgOiBmYWxzZTsKPiA+ICsgICAgICAg IH0KPiA+ICsKPiA+ICsgICAgICAgIC8qIE9wdGltaXphdGlvbjogSWYgbWF0Y2ggPT0gIXJldmVy c2UgYW5kIHBvaXNvbiA9PSBwb2lzb25lZCwgdGhpcwo+ID4gKyAgICAgICAgICAgcGF0dGVybiBj YW4ndCBjaGFuZ2UgdGhlIHJlc3VsdCwgc28gZG9uJ3QgZG8gYW55IHdvcmsuICovCj4gPiArICAg ICAgICBpZiAobWF0Y2ggPT0gIXJldmVyc2UgJiYgcG9pc29uID09IHBvaXNvbmVkKQo+ID4gKyAg ICAgICAgICAgIGNvbnRpbnVlOwo+ID4gKyAgICAgICAgaWYgKG1hdGNoX3BhdHRlcm4odGV4dCwg cCwgc3BsaXQgLSAxKSA9PSB0cnVlKSB7Cj4gPiArICAgICAgICAgICAgcG9pc29uZWQgPSBwb2lz b247Cj4gPiArICAgICAgICAgICAgbWF0Y2ggPSAhcmV2ZXJzZTsKPiA+ICsgICAgICAgIH0KPiA+ ICsgICAgfQo+ID4gKyAgICBpZiAocG9pc29uZWQpCj4gPiArICAgICAgICByZXR1cm4gVVdJTERN QVRfUE9JU09OOwo+ID4gKyAgICByZXR1cm4gbWF0Y2ggPyBVV0lMRE1BVF9NQVRDSCA6IFVXSUxE TUFUX0ZBSUw7Cj4gPiArfQo+ID4gKwo+ID4gKwo+ID4gKy8qCj4gPiArKiogIFVzZXItbGV2ZWwg cm91dGluZSB1c2VkIGZvciB3aWxkbWF0cyB3aGVyZSBAIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEK PiA+ICsqKiAgcmVndWxhciBjaGFyYWN0ZXIuCj4gPiArKi8KPiA+ICtib29sCj4gPiArdXdpbGRt YXQoY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqcGF0KQo+ID4gK3sKPiA+ICsgICAgY29u c3QgdW5zaWduZWQgY2hhciAqdXRleHQgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSB0ZXh0Owo+ ID4gKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1cGF0ID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIg KikgcGF0Owo+ID4gKwo+ID4gKyAgICBpZiAodXBhdFswXSA9PSAnKicgJiYgdXBhdFsxXSA9PSAn XDAnKQo+ID4gKyAgICAgICAgcmV0dXJuIHRydWU7Cj4gPiArICAgIGVsc2UKPiA+ICsgICAgICAg IHJldHVybiAobWF0Y2hfZXhwcmVzc2lvbih1dGV4dCwgdXBhdCwgZmFsc2UpID09IFVXSUxETUFU X01BVENIKTsKPiA+ICt9Cj4gPiArCj4gPiArCj4gPiArLyoKPiA+ICsqKiAgVXNlci1sZXZlbCBy b3V0aW5lIHVzZWQgZm9yIHdpbGRtYXRzIHRoYXQgc3VwcG9ydCBwb2lzb24gbWF0Y2hlcy4KPiA+ ICsqLwo+ID4gK2VudW0gdXdpbGRtYXQKPiA+ICt1d2lsZG1hdF9wb2lzb24oY29uc3QgY2hhciAq dGV4dCwgY29uc3QgY2hhciAqcGF0KQo+ID4gK3sKPiA+ICsgICAgY29uc3QgdW5zaWduZWQgY2hh ciAqdXRleHQgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSB0ZXh0Owo+ID4gKyAgICBjb25zdCB1 bnNpZ25lZCBjaGFyICp1cGF0ID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcGF0Owo+ID4gKwo+ ID4gKyAgICBpZiAodXBhdFswXSA9PSAnKicgJiYgdXBhdFsxXSA9PSAnXDAnKQo+ID4gKyAgICAg ICAgcmV0dXJuIFVXSUxETUFUX01BVENIOwo+ID4gKyAgICBlbHNlCj4gPiArICAgICAgICByZXR1 cm4gbWF0Y2hfZXhwcmVzc2lvbih1dGV4dCwgdXBhdCwgdHJ1ZSk7Cj4gPiArfQo+ID4gKwo+ID4g Kwo+ID4gKy8qCj4gPiArKiogIFVzZXItbGV2ZWwgcm91dGluZSBmb3Igc2ltcGxlIGV4cHJlc3Np b25zIChuZWl0aGVyICwgbm9yICEgYXJlIHNwZWNpYWwpLgo+ID4gKyovCj4gPiArYm9vbAo+ID4g K3V3aWxkbWF0X3NpbXBsZShjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICpwYXQpCj4gPiAr ewo+ID4gKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1dGV4dCA9IChjb25zdCB1bnNpZ25lZCBj aGFyICopIHRleHQ7Cj4gPiArICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVwYXQgPSAoY29uc3Qg dW5zaWduZWQgY2hhciAqKSBwYXQ7Cj4gPiArICAgIHNpemVfdCBsZW5ndGg7Cj4gPiArCj4gPiAr ICAgIGlmICh1cGF0WzBdID09ICcqJyAmJiB1cGF0WzFdID09ICdcMCcpCj4gPiArICAgICAgICBy ZXR1cm4gdHJ1ZTsKPiA+ICsgICAgZWxzZSB7Cj4gPiArICAgICAgICBsZW5ndGggPSBzdHJsZW4o cGF0KTsKPiA+ICsgICAgICAgIHJldHVybiAobWF0Y2hfcGF0dGVybih1dGV4dCwgdXBhdCwgdXBh dCArIGxlbmd0aCAtIDEpID09IHRydWUpOwo+ID4gKyAgICB9Cj4gPiArfQo+ID4gZGlmZiAtLWdp dCBhL2xpYi91d2lsZG1hdC91d2lsZG1hdC5oIGIvbGliL3V3aWxkbWF0L3V3aWxkbWF0LmgKPiA+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwLi4yZTQ3MTg5Cj4gPiAtLS0g L2Rldi9udWxsCj4gPiArKysgYi9saWIvdXdpbGRtYXQvdXdpbGRtYXQuaAo+ID4gQEAgLTAsMCAr MSwyNCBAQAo+ID4gKwo+ID4gKyNpZm5kZWYgVVdJTERNQVRfSAo+ID4gKyNkZWZpbmUgVVdJTERN QVRfSCAxCj4gPiArCj4gPiArI2luY2x1ZGUgPHN0ZGlvLmg+Cj4gPiArI2luY2x1ZGUgPHN5cy90 eXBlcy5oPgo+ID4gKyNpbmNsdWRlIDxzdGRib29sLmg+Cj4gPiArCj4gPiArLyoKPiA+ICsqKiAg V0lMRE1BVCBNQVRDSElORwo+ID4gKyovCj4gPiArZW51bSB1d2lsZG1hdCB7Cj4gPiArICAgIFVX SUxETUFUX0ZBSUwgICA9IDAsCj4gPiArICAgIFVXSUxETUFUX01BVENIICA9IDEsCj4gPiArICAg IFVXSUxETUFUX1BPSVNPTgo+ID4gK307Cj4gPiArCj4gPiArZXh0ZXJuIGJvb2wgICAgICAgICAg ICAgaXNfdmFsaWRfdXRmOChjb25zdCBjaGFyICpzdGFydCk7Cj4gPiArZXh0ZXJuIGJvb2wgICAg ICAgICAgICAgdXdpbGRtYXQoY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqcGF0KTsKPiA+ ICtleHRlcm4gYm9vbCAgICAgICAgICAgICB1d2lsZG1hdF9zaW1wbGUoY29uc3QgY2hhciAqdGV4 dCwgY29uc3QgY2hhciAqcGF0KTsKPiA+ICtleHRlcm4gZW51bSB1d2lsZG1hdCAgICB1d2lsZG1h dF9wb2lzb24oY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqcGF0KTsKPiA+ICsKPiA+ICsK PiA+ICsjZW5kaWYgLyogVVdJTERNQVRfSCAqLwo+ID4gLS0gCj4gPiAxLjkuMQo+ID4gCj4gCj4g LS0gCj4gRGFuaWVsIFZldHRlcgo+IFNvZnR3YXJlIEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlv bgo+IGh0dHA6Ly9ibG9nLmZmd2xsLmNoCgotLSAKRGFuaWVsIFZldHRlcgpTb2Z0d2FyZSBFbmdp bmVlciwgSW50ZWwgQ29ycG9yYXRpb24KaHR0cDovL2Jsb2cuZmZ3bGwuY2gKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlz dApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==