From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mika Kahola Subject: Re: [PATCH i-g-t v5] tests/kms_plane_multiple: CRC based atomic correctness test Date: Mon, 07 Nov 2016 17:00:52 +0200 Message-ID: <1478530852.26172.25.camel@intel.com> References: <1478079128-23491-1-git-send-email-mika.kahola@intel.com> <92e32929-1607-2c0a-1b1b-86a0dbb63f0e@linux.intel.com> Reply-To: mika.kahola@intel.com Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 BB92B6E39D for ; Mon, 7 Nov 2016 15:02:50 +0000 (UTC) In-Reply-To: <92e32929-1607-2c0a-1b1b-86a0dbb63f0e@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Maarten Lankhorst , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org VGhhbmtzIGZvciB0aGUgcmV2aWV3LsKgCgpPbiBNb24sIDIwMTYtMTEtMDcgYXQgMTQ6MDQgKzAx MDAsIE1hYXJ0ZW4gTGFua2hvcnN0IHdyb3RlOgo+IE9wIDAyLTExLTE2IG9tIDEwOjMyIHNjaHJl ZWYgTWlrYSBLYWhvbGE6Cj4gPiAKPiA+IFRoaXMgaXMgYSB0ZXN0Y2FzZSB3aXRoIG11bHRpcGxl IHBsYW5lcy4gVGhlIGlkZWEgaGVyZSBpcyB0aGUKPiA+IGZvbGxvd2luZwo+ID4gCj4gPiDCoC0g ZHJhdyBhIHVuaWZvcm0gZnJhbWUgd2l0aCBibHVlIGNvbG9yCj4gPiDCoC0gZ3JhYiBjcmMgZm9y IHJlZmVyZW5jZQo+ID4gwqAtIHB1dCBwbGFuZXMgcmFuZG9tbHkgb24gdG9wIHdpdGggdGhlIHNh bWUgYmx1ZSBjb2xvcgo+ID4gwqAtIHB1bmNoIGhvbGVzIHdpdGggYmxhY2sgY29sb3IgaW50byB0 aGUgcHJpbWFyeSBmcmFtZWJ1ZmZlcgo+ID4gwqAtIGlkZWFsbHkgdGhlIHBsYW5lcyBzaG91bGQg Y292ZXIgdGhlc2UgaG9sZXMgc28gdGhhdCB0aGUgb3V0cHV0Cj4gPiBpcyB0aGUKPiA+IMKgwqDC oGlkZW50aWNhbCB0byByZWZlcmVuY2UgY3JjCj4gPiDCoC0gY29tcG9zaXRlIGFsbCB3aXRoIG9u ZSBpb2N0bCBjYWxsCj4gPiDCoC0gZ3JhYiBjcmMgYW5kIHZlcmlmeSB0aGF0IHRoZSByZWZlcmVu Y2UgY3JjIGlzIGVxdWFsCj4gPiDCoC0gcmVwZWF0IHRoaXMgZm9yIGRvemVuIGl0ZXJhdGlvbnMg dG8gbWF4aW1pemUgY292ZXJhZ2UKPiA+IAo+ID4gdjU6IFJlbW92ZSBsaW1pdCBmb3IgbWF4IG51 bWJlciBvZiBpdGVyYXRpb25zIGFuZCBhZGQgcG9zc2liaWxpdHkKPiA+IHRvCj4gPiDCoMKgwqDC oGxvb3AgZm9yZXZlciAoRGFuaWVsKQo+ID4gwqDCoMKgwqBSZW1vdmUgSU5fUkFOR0UoKSBtYWNy byAoTWFhcnRlbikKPiA+IMKgwqDCoMKgUmVtb3ZlIGxvZyBmaWxlIGFuZCBzaG93IHJhbmRvbSBu dW1iZXIgc2VlZCBvbiBzY3JlZW4gaW5zdGVhZAo+ID4gKE1hYXJ0ZW4pCj4gPiDCoMKgwqDCoFNw bGl0IGxlZ2FjeSBhbmQgYXRvbWljIHBsYW5lIHRlc3RzIG9uIG93biBmdW5jdGlvbnMgKE1hYXJ0 ZW4pCj4gPiDCoMKgwqDCoHJlbW92ZSB0ZXN0X2F0b21pYygpIGZ1bmN0aW9uIGFuZCBwYXNzIHRl c3QgbW9kZSBpbmZvIGFzCj4gPiDCoMKgwqDCoHBhcmFtZXRlciAoTWFhcnRlbikKPiA+IMKgwqDC oMKgVXNlIGJpZ2dlciByZWN0YW5nbGUgc2l6ZSAoMjU2eDI1NikgZm9yIG5vbi1jdXJzb3IgcGxh bmVzIGFuZAo+ID4gwqDCoMKgwqBzbWFsbGVyICgxMjh4MTI4KSBzaXplIGZvciBjdXJzb3IgcGxh bmUgKE1hYXJ0ZW4pCj4gPiAKPiA+IHY0OiBGb3IgYXRvbWljIHRlc3QgZW5hYmxlIGNyYyBjYXB0 dXJpbmcgYmVmb3JlIGVudGVyaW5nIGludG8gYQo+ID4gwqDCoMKgwqBpdGVyYXRpb24gbG9vcC4g QWZ0ZXIgZWFjaCBpdGVyYXRpb24sIGNoZWNrIHRoYXQgcGFnZSBmbGlwCj4gPiDCoMKgwqDCoGRp ZG4ndCB0YWtlIG5vIG1vcmUgdGhhbiAxIHZibGFuaywgZmV0Y2ggYWxsIGNyYydzIGFuZCBjaGVj awo+ID4gwqDCoMKgwqB0aGUgdmFsdWVzLgo+ID4gCj4gPiDCoMKgwqDCoEludHJvZHVjZSBuZXcg Y29tbWFuZCBsaW5lIHBhcmFtZXRlciBmb3IgdGhlIG51bWJlciBvZgo+ID4gaXRlcmF0aW9ucy4K PiA+IMKgwqDCoMKgVGhlIHRlc3QgcnVuIGZyb20gMSB0byAyNTYgaXRlcmF0aW9ucy4KPiA+IAo+ ID4gdjM6IENsZWFudXAgYnkgcmVtb3Zpbmcgc2VwYXJhdGUgcGxhbmUgYXJyYXkKPiA+IMKgwqDC oMKgRm9yIGF0b21pYywgcGFzcyBEUk1fTU9ERV9QQUdFX0ZMSVBfRVZFTlQKPiA+IMKgwqDCoMKg R3JhYiBjcmMgYnkgdXNpbmcgaWd0X3BpcGVfY3JjX2dldF9jcmMgaW5zdGVhZCBvZgo+ID4gaWd0 X3BpcGVfY3JjX2NvbGxlY3RfY3JjCj4gPiDCoMKgwqDCoFJlbmFtZSBucGxhbmVzIHZhcmlhYmxl IHRvIG1heF9wbGFuZXMKPiA+IMKgwqDCoMKgVG8gb3B0aW1pemUgdGVzdCBleGVjdXRpb24sIHJ1 biBpdGVyYXRpb25zIGFmdGVyIHRoZSBtb2Rlc2V0Cj4gPiAKPiA+IHYyOiBLZWVwIGEgbG9nZmls ZSBvbiByYW5kb20gbnVtYmVyIHNlZWRzIHBlciBzdWJ0ZXN0IHRoYXQgYXJlIG5vdAo+ID4gc2tp cHBlZAo+ID4gwqDCoMKgwqBkdWUgdG8gdW5tZXQgdGVzdCByZXF1aXJlbWVudHMKPiA+IAo+ID4g U2lnbmVkLW9mZi1ieTogTWlrYSBLYWhvbGEgPG1pa2Eua2Fob2xhQGludGVsLmNvbT4KPiA+IC0t LQo+ID4gwqB0ZXN0cy9NYWtlZmlsZS5zb3VyY2VzwqDCoMKgwqDCoHzCoMKgwqAxICsKPiA+IMKg dGVzdHMva21zX3BsYW5lX211bHRpcGxlLmMgfCA1MDYKPiA+ICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4gwqAyIGZpbGVzIGNoYW5nZWQsIDUwNyBpbnNl cnRpb25zKCspCj4gPiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9rbXNfcGxhbmVfbXVsdGlw bGUuYwo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3Rz L01ha2VmaWxlLnNvdXJjZXMKPiA+IGluZGV4IDZkMDgxYzMuLmZmZDU5YzEgMTAwNjQ0Cj4gPiAt LS0gYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCj4gPiArKysgYi90ZXN0cy9NYWtlZmlsZS5zb3Vy Y2VzCj4gPiBAQCAtMTA1LDYgKzEwNSw3IEBAIFRFU1RTX3Byb2dzX00gPSBcCj4gPiDCoAlrbXNf cGlwZV9jb2xvciBcCj4gPiDCoAlrbXNfcGlwZV9jcmNfYmFzaWMgXAo+ID4gwqAJa21zX3BsYW5l IFwKPiA+ICsJa21zX3BsYW5lX211bHRpcGxlIFwKPiA+IMKgCWttc19wcm9wZXJ0aWVzIFwKPiA+ IMKgCWttc19wc3Jfc2lua19jcmMgXAo+ID4gwqAJa21zX3JlbmRlciBcCj4gPiBkaWZmIC0tZ2l0 IGEvdGVzdHMva21zX3BsYW5lX211bHRpcGxlLmMKPiA+IGIvdGVzdHMva21zX3BsYW5lX211bHRp cGxlLmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwLi5kMTNjZTFj Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi90ZXN0cy9rbXNfcGxhbmVfbXVsdGlwbGUuYwo+ ID4gQEAgLTAsMCArMSw1MDYgQEAKPiA+ICsvKgo+ID4gKyAqIENvcHlyaWdodCDCqSAyMDE2IElu dGVsIENvcnBvcmF0aW9uCj4gPiArICoKPiA+ICsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFu dGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+ID4gb2J0YWluaW5nIGEKPiA+ICsg KiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxl cyAodGhlCj4gPiAiU29mdHdhcmUiKSwKPiA+ICsgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3 aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dAo+ID4gbGltaXRhdGlvbgo+ID4g KyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0 cmlidXRlLAo+ID4gc3VibGljZW5zZSwKPiA+ICsgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhl IFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8KPiA+IHdob20gdGhlCj4gPiArICog U29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcK PiA+IGNvbmRpdGlvbnM6Cj4gPiArICoKPiA+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGlj ZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQo+ID4gKGluY2x1ZGluZyB0aGUgbmV4dAo+ID4g KyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFu dGlhbAo+ID4gcG9ydGlvbnMgb2YgdGhlCj4gPiArICogU29mdHdhcmUuCj4gPiArICoKPiA+ICsg KiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBB TlkgS0lORCwKPiA+IEVYUFJFU1MgT1IKPiA+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5P VCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gPiBNRVJDSEFOVEFCSUxJVFksCj4gPiAr ICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC7C oMKgSU4gTk8KPiA+IEVWRU5UIFNIQUxMCj4gPiArICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hU IEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCj4gPiBEQU1BR0VTIE9SIE9USEVSCj4g PiArICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBP UiBPVEhFUldJU0UsCj4gPiBBUklTSU5HCj4gPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5F Q1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgo+ID4gT1RIRVIgREVBTElOR1MK PiA+ICsgKiBJTiBUSEUgU09GVFdBUkUuCj4gPiArICoKPiA+ICsgKi8KPiA+ICsKPiA+ICsjaW5j bHVkZSAiaWd0LmgiCj4gPiArI2luY2x1ZGUgImRybXRlc3QuaCIKPiA+ICsjaW5jbHVkZSA8ZXJy bm8uaD4KPiA+ICsjaW5jbHVkZSA8c3RkYm9vbC5oPgo+ID4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ ID4gKyNpbmNsdWRlIDxzdHJpbmcuaD4KPiA+ICsjaW5jbHVkZSA8dGltZS5oPgo+ID4gKwo+ID4g K0lHVF9URVNUX0RFU0NSSVBUSU9OKCJUZXN0IGF0b21pYyBtb2RlIHNldHRpbmcgd2l0aCBtdWx0 aXBsZQo+ID4gcGxhbmVzICIpOwo+ID4gKwo+ID4gKyNkZWZpbmUgTUFYX0NSQ1PCoMKgwqDCoMKg wqDCoMKgwqDCoDEKPiA+ICsjZGVmaW5lIFNJWkVfUExBTkXCoMKgwqDCoMKgwqAyNTYKPiA+ICsj ZGVmaW5lIFNJWkVfQ1VSU09SwqDCoMKgwqDCoDEyOAo+ID4gKyNkZWZpbmUgTE9PUF9GT1JFVkVS wqDCoMKgwqDCoC0xCj4gPiArCj4gPiArdHlwZWRlZiBzdHJ1Y3Qgewo+ID4gKwlmbG9hdCByZWQ7 Cj4gPiArCWZsb2F0IGdyZWVuOwo+ID4gKwlmbG9hdCBibHVlOwo+ID4gK30gY29sb3JfdDsKPiA+ ICsKPiA+ICt0eXBlZGVmIHN0cnVjdCB7Cj4gPiArCWludCBkcm1fZmQ7Cj4gPiArCWlndF9kaXNw bGF5X3QgZGlzcGxheTsKPiA+ICsJaWd0X3BpcGVfY3JjX3QgKnBpcGVfY3JjOwo+ID4gKwlpZ3Rf cGxhbmVfdCAqcGxhbmVbSUdUX01BWF9QTEFORVNdOwo+ID4gKwlzdHJ1Y3QgaWd0X2ZiIGZiW0lH VF9NQVhfUExBTkVTXTsKPiA+ICt9IGRhdGFfdDsKPiA+ICsKPiA+ICt0eXBlZGVmIHN0cnVjdCB7 Cj4gPiArCWRhdGFfdCAqZGF0YTsKPiA+ICsJaWd0X2NyY190IHJlZmVyZW5jZV9jcmM7Cj4gPiAr fSB0ZXN0X3Bvc2l0aW9uX3Q7Cj4gPiArCj4gPiArLyogQ29tbWFuZCBsaW5lIHBhcmFtZXRlcnMu ICovCj4gPiArc3RydWN0IHsKPiA+ICsJaW50IGl0ZXJhdGlvbnM7Cj4gPiArCWJvb2wgdXNlcl9z ZWVkOwo+ID4gKwlpbnQgc2VlZDsKPiA+ICt9IG9wdCA9IHsKPiA+ICsJLml0ZXJhdGlvbnMgPSA2 NCwKPiA+ICsJLnVzZXJfc2VlZCA9IGZhbHNlLAo+ID4gKwkuc2VlZCA9IDEsCj4gPiArfTsKPiA+ ICsKPiA+ICtzdGF0aWMgaW5saW5lIHVpbnQzMl90IHBpcGVfc2VsZWN0KGludCBwaXBlKQo+ID4g K3sKPiA+ICsJaWYgKHBpcGUgPiAxKQo+ID4gKwkJcmV0dXJuIHBpcGUgPDwgRFJNX1ZCTEFOS19I SUdIX0NSVENfU0hJRlQ7Cj4gPiArCWVsc2UgaWYgKHBpcGUgPiAwKQo+ID4gKwkJcmV0dXJuIERS TV9WQkxBTktfU0VDT05EQVJZOwo+ID4gKwllbHNlCj4gPiArCQlyZXR1cm4gMDsKPiA+ICt9Cj4g PiArCj4gPiArc3RhdGljIHVuc2lnbmVkIGludCBnZXRfdmJsYW5rKGludCBmZCwgaW50IHBpcGUs IHVuc2lnbmVkIGludAo+ID4gZmxhZ3MpCj4gPiArewo+ID4gKwl1bmlvbiBkcm1fd2FpdF92Ymxh bmsgdmJsOwo+ID4gKwo+ID4gKwltZW1zZXQoJnZibCwgMCwgc2l6ZW9mKHZibCkpOwo+ID4gKwl2 YmwucmVxdWVzdC50eXBlID0gRFJNX1ZCTEFOS19SRUxBVElWRSB8IHBpcGVfc2VsZWN0KHBpcGUp Cj4gPiB8IGZsYWdzOwo+ID4gKwlpZiAoZHJtSW9jdGwoZmQsIERSTV9JT0NUTF9XQUlUX1ZCTEFO SywgJnZibCkpCj4gPiArCQlyZXR1cm4gMDsKPiA+ICsKPiA+ICsJcmV0dXJuIHZibC5yZXBseS5z ZXF1ZW5jZTsKPiA+ICt9Cj4gPiArCj4gPiArLyoKPiA+ICsgKiBDb21tb24gY29kZSBhY3Jvc3Mg YWxsIHRlc3RzLCBhY3Rpbmcgb24gZGF0YV90Cj4gPiArICovCj4gPiArc3RhdGljIHZvaWQgdGVz dF9pbml0KGRhdGFfdCAqZGF0YSwgZW51bSBwaXBlIHBpcGUpCj4gPiArewo+ID4gKwlkYXRhLT5w aXBlX2NyYyA9IGlndF9waXBlX2NyY19uZXcocGlwZSwKPiA+IElOVEVMX1BJUEVfQ1JDX1NPVVJD RV9BVVRPKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgdGVzdF9maW5pKGRhdGFfdCAq ZGF0YSwgaWd0X291dHB1dF90ICpvdXRwdXQsIGludAo+ID4gbWF4X3BsYW5lcykKPiA+ICt7Cj4g PiArCWZvciAoaW50IGkgPSBJR1RfUExBTkVfUFJJTUFSWTsgaSA8PSBtYXhfcGxhbmVzOyBpKysp Cj4gPiArCQlpZ3RfcGxhbmVfc2V0X2ZiKGRhdGEtPnBsYW5lW2ldLCBOVUxMKTsKPiA+ICsKPiA+ ICsJLyogcmVzZXQgdGhlIGNvbnN0cmFpbnQgb24gdGhlIHBpcGUgKi8KPiA+ICsJaWd0X291dHB1 dF9zZXRfcGlwZShvdXRwdXQsIFBJUEVfQU5ZKTsKPiA+ICsKPiA+ICsJaWd0X3BpcGVfY3JjX2Zy ZWUoZGF0YS0+cGlwZV9jcmMpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZAo+ID4gK3Rl c3RfZ3JhYl9jcmMoZGF0YV90ICpkYXRhLCBpZ3Rfb3V0cHV0X3QgKm91dHB1dCwgZW51bSBwaXBl IHBpcGUsCj4gPiBib29sIGF0b21pYywKPiA+ICsJwqDCoMKgwqDCoMKgY29sb3JfdCAqY29sb3Is IHVpbnQ2NF90IHRpbGluZywgaWd0X2NyY190ICpjcmMgLyoKPiA+IG91dCAqLykKPiA+ICt7Cj4g PiArCXN0cnVjdCBpZ3RfZmIgZmI7Cj4gPiArCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKPiA+ICsJ aWd0X3BsYW5lX3QgKnByaW1hcnk7Cj4gPiArCWludCByZXQsIG47Cj4gPiArCj4gPiArCWlndF9v dXRwdXRfc2V0X3BpcGUob3V0cHV0LCBwaXBlKTsKPiA+ICsKPiA+ICsJcHJpbWFyeSA9IGlndF9v dXRwdXRfZ2V0X3BsYW5lKG91dHB1dCwgSUdUX1BMQU5FX1BSSU1BUlkpOwo+ID4gKwo+ID4gKwlt b2RlID0gaWd0X291dHB1dF9nZXRfbW9kZShvdXRwdXQpOwo+ID4gKwo+ID4gKwlpZ3RfY3JlYXRl X2NvbG9yX2ZiKGRhdGEtPmRybV9mZCwgbW9kZS0+aGRpc3BsYXksIG1vZGUtCj4gPiA+dmRpc3Bs YXksCj4gPiArCQkJwqDCoMKgwqBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ID4gKwkJCcKgwqDCoMKg TE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiA+ICsJCQnCoMKgwqDCoGNvbG9yLT5yZWQsIGNv bG9yLT5ncmVlbiwgY29sb3ItPmJsdWUsCj4gPiArCQkJwqDCoMKgwqAmZmIpOwo+ID4gKwo+ID4g KwlpZ3RfcGxhbmVfc2V0X2ZiKHByaW1hcnksICZmYik7Cj4gPiArCj4gPiArCXJldCA9IGlndF9k aXNwbGF5X3RyeV9jb21taXQyKCZkYXRhLT5kaXNwbGF5LAo+ID4gKwkJCQnCoMKgwqDCoMKgwqBh dG9taWMgPyBDT01NSVRfQVRPTUlDIDoKPiA+IENPTU1JVF9MRUdBQ1kpOwo+ID4gKwlpZ3Rfc2tp cF9vbihyZXQgIT0gMCk7Cj4gPiArCj4gPiArCWlndF9waXBlX2NyY19zdGFydChkYXRhLT5waXBl X2NyYyk7Cj4gPiArCW4gPSBpZ3RfcGlwZV9jcmNfZ2V0X2NyY3MoZGF0YS0+cGlwZV9jcmMsIDEs ICZjcmMpOwo+ID4gKwlpZ3RfYXNzZXJ0X2VxKG4sIDEpOwo+ID4gKwlpZ3RfcGlwZV9jcmNfc3Rv cChkYXRhLT5waXBlX2NyYyk7Cj4gPiArCj4gPiArCWlndF9wbGFuZV9zZXRfZmIocHJpbWFyeSwg TlVMTCk7Cj4gPiArCj4gPiArCXJldCA9IGlndF9kaXNwbGF5X3RyeV9jb21taXQyKCZkYXRhLT5k aXNwbGF5LAo+ID4gKwkJCQnCoMKgwqDCoMKgwqBhdG9taWMgPyBDT01NSVRfQVRPTUlDIDoKPiA+ IENPTU1JVF9MRUdBQ1kpOwo+ID4gKwlpZ3Rfc2tpcF9vbihyZXQgIT0gMCk7Cj4gPiArCj4gPiAr CWlndF9yZW1vdmVfZmIoZGF0YS0+ZHJtX2ZkLCAmZmIpOwo+ID4gK30KPiA+ICsKPiA+ICsvKgo+ ID4gKyAqIE11bHRpcGxlIHBsYW5lIHBvc2l0aW9uIHRlc3QuCj4gPiArICrCoMKgwqAtIFdlIHN0 YXJ0IGJ5IGdyYWJiaW5nIGEgcmVmZXJlbmNlIENSQyBvZiBhIGZ1bGwgYmx1ZSBmYgo+ID4gYmVp bmcgc2Nhbm5lZAo+ID4gKyAqwqDCoMKgwqDCoG91dCBvbiB0aGUgcHJpbWFyeSBwbGFuZQo+ID4g KyAqwqDCoMKgLSBUaGVuIHdlIHNjYW5ub3V0IG51bWJlciBvZiBwbGFuZXM6Cj4gPiArICrCoMKg wqDCoMKgwqAqIHRoZSBwcmltYXJ5IHBsYW5lIHVzZXMgYSBibHVlIGZiIHdpdGggYSBibGFjayBy ZWN0YW5nbGUKPiA+IGhvbGUKPiA+ICsgKsKgwqDCoMKgwqDCoCogcGxhbmVzLCBvbiB0b3Agb2Yg dGhlIHByaW1hcnkgcGxhbmUsIHdpdGggYSBibHVlIGZiIHRoYXQKPiA+IGlzIHNldC11cAo+ID4g KyAqwqDCoMKgwqDCoMKgwqDCoHRvIGNvdmVyIHRoZSBibGFjayByZWN0YW5nbGVzIG9mIHRoZSBw cmltYXJ5IHBsYW5lIGZiCj4gPiArICrCoMKgwqDCoMKgVGhlIHJlc3VsdGluZyBDUkMgc2hvdWxk IGJlIGlkZW50aWNhbCB0byB0aGUgcmVmZXJlbmNlIENSQwo+ID4gKyAqLwo+ID4gKwo+ID4gK3N0 YXRpYyB2b2lkCj4gPiArY3JlYXRlX2ZiX2Zvcl9tb2RlX3Bvc2l0aW9uKGRhdGFfdCAqZGF0YSwg ZHJtTW9kZU1vZGVJbmZvICptb2RlLAo+ID4gKwkJCcKgwqDCoMKgY29sb3JfdCAqY29sb3IsIGlu dCAqcmVjdF94LCBpbnQKPiA+ICpyZWN0X3ksCj4gPiArCQkJwqDCoMKgwqBpbnQgKnJlY3Rfdywg aW50ICpyZWN0X2gsIHVpbnQ2NF90Cj4gPiB0aWxpbmcsCj4gPiArCQkJwqDCoMKgwqBpbnQgbWF4 X3BsYW5lcykKPiA+ICt7Cj4gPiArCXVuc2lnbmVkIGludCBmYl9pZDsKPiA+ICsJY2Fpcm9fdCAq Y3I7Cj4gPiArCj4gPiArCWZiX2lkID0gaWd0X2NyZWF0ZV9mYihkYXRhLT5kcm1fZmQsCj4gPiAr CQkJwqDCoMKgwqDCoMKgbW9kZS0+aGRpc3BsYXksIG1vZGUtPnZkaXNwbGF5LAo+ID4gKwkJCcKg wqDCoMKgwqDCoERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gPiArCQkJwqDCoMKgwqDCoMKgdGlsaW5n LAo+ID4gKwkJCcKgwqDCoMKgwqDCoCZkYXRhLT5mYltJR1RfUExBTkVfUFJJTUFSWV0pOwo+ID4g KwlpZ3RfYXNzZXJ0KGZiX2lkKTsKPiA+ICsKPiA+ICsJY3IgPSBpZ3RfZ2V0X2NhaXJvX2N0eChk YXRhLT5kcm1fZmQsICZkYXRhLQo+ID4gPmZiW0lHVF9QTEFORV9QUklNQVJZXSk7Cj4gPiArCWln dF9wYWludF9jb2xvcihjciwgcmVjdF94WzBdLCByZWN0X3lbMF0sCj4gPiArCQkJbW9kZS0+aGRp c3BsYXksIG1vZGUtPnZkaXNwbGF5LAo+ID4gKwkJCWNvbG9yLT5yZWQsIGNvbG9yLT5ncmVlbiwg Y29sb3ItPmJsdWUpOwo+ID4gKwo+ID4gKwlmb3IgKGludCBpID0gSUdUX1BMQU5FXzI7IGkgPD0g bWF4X3BsYW5lczsgaSsrKQo+ID4gKwkJaWd0X3BhaW50X2NvbG9yKGNyLCByZWN0X3hbaV0sIHJl Y3RfeVtpXSwKPiA+ICsJCQkJcmVjdF93W2ldLCByZWN0X2hbaV0sIDAuMCwgMC4wLAo+ID4gMC4w KTsKPiA+ICsKPiA+ICsJaWd0X2Fzc2VydChjYWlyb19zdGF0dXMoY3IpID09IDApOwo+ID4gKwlj YWlyb19kZXN0cm95KGNyKTsKPiA+ICt9Cj4gPiArCj4gPiArCj4gPiArc3RhdGljIHZvaWQKPiA+ ICt0ZXN0X3BsYW5lcyhkYXRhX3QgKmRhdGEsIGVudW0gcGlwZSBwaXBlLCBjb2xvcl90ICpjb2xv ciwKPiA+ICsJwqDCoMKgwqB1aW50NjRfdCB0aWxpbmcsIGludCBtYXhfcGxhbmVzLCBpZ3Rfb3V0 cHV0X3QgKm91dHB1dCkKPiBecHJlcGFyZV9wbGFuZXM/ClRoaXMgY2FuIGJlIHJlbmFtZWQgdG8g YmV0dGVyIGRlc2NyaWJlIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMuCj4gPiAKPiA+ICt7Cj4gPiAr CWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKPiA+ICsJaW50IHhbSUdUX01BWF9QTEFORVNdOwo+ID4g KwlpbnQgeVtJR1RfTUFYX1BMQU5FU107Cj4gPiArCWludCBzaXplW0lHVF9NQVhfUExBTkVTXTsK PiA+ICsJaW50IGk7Cj4gPiArCj4gPiArCWlndF9vdXRwdXRfc2V0X3BpcGUob3V0cHV0LCBwaXBl KTsKPiA+ICsKPiA+ICsJbW9kZSA9IGlndF9vdXRwdXRfZ2V0X21vZGUob3V0cHV0KTsKPiA+ICsK PiA+ICsJLyogcGxhbmVzIHdpdGggcmFuZG9tIHBvc2l0aW9ucyAqLwo+ID4gKwl4W0lHVF9QTEFO RV9QUklNQVJZXSA9IDA7Cj4gPiArCXlbSUdUX1BMQU5FX1BSSU1BUlldID0gMDsKPiA+ICsJZm9y IChpID0gSUdUX1BMQU5FXzI7IGkgPD0gbWF4X3BsYW5lczsgaSsrKSB7Cj4gPiArCQlpZiAoaSA9 PSBJR1RfUExBTkVfQ1VSU09SKQo+ID4gKwkJCXNpemVbaV0gPSBTSVpFX0NVUlNPUjsKPiA+ICsJ CWVsc2UKPiA+ICsJCQlzaXplW2ldID0gU0laRV9QTEFORTsKPiA+ICsKPiA+ICsJCXhbaV0gPSBy YW5kKCkgJSAobW9kZS0+aGRpc3BsYXkgLSBzaXplW2ldKTsKPiA+ICsJCXlbaV0gPSByYW5kKCkg JSAobW9kZS0+dmRpc3BsYXkgLSBzaXplW2ldKTsKPiA+ICsKPiA+ICsJCWRhdGEtPnBsYW5lW2ld ID0gaWd0X291dHB1dF9nZXRfcGxhbmUob3V0cHV0LCBpKTsKPiA+ICsKPiA+ICsJCWlndF9jcmVh dGVfY29sb3JfZmIoZGF0YS0+ZHJtX2ZkLAo+ID4gKwkJCQnCoMKgwqDCoHNpemVbaV0sIHNpemVb aV0sCj4gPiArCQkJCcKgwqDCoMKgZGF0YS0+cGxhbmVbaV0tPmlzX2N1cnNvciA/Cj4gPiBEUk1f Rk9STUFUX0FSR0I4ODg4IDogRFJNX0ZPUk1BVF9YUkdCODg4OCwKPiA+ICsJCQkJwqDCoMKgwqB0 aWxpbmcsCj4gPiArCQkJCcKgwqDCoMKgY29sb3ItPnJlZCwgY29sb3ItPmdyZWVuLAo+ID4gY29s b3ItPmJsdWUsCj4gPiArCQkJCcKgwqDCoMKgJmRhdGEtPmZiW2ldKTsKPiA+ICsKPiA+ICsJCWln dF9wbGFuZV9zZXRfcG9zaXRpb24oZGF0YS0+cGxhbmVbaV0sIHhbaV0sCj4gPiB5W2ldKTsKPiA+ ICsJCWlndF9wbGFuZV9zZXRfZmIoZGF0YS0+cGxhbmVbaV0sICZkYXRhLT5mYltpXSk7Cj4gPiAr CX0KPiA+ICsKPiA+ICsJLyogcHJpbWFyeSBwbGFuZSAqLwo+ID4gKwlkYXRhLT5wbGFuZVtJR1Rf UExBTkVfUFJJTUFSWV0gPQo+ID4gaWd0X291dHB1dF9nZXRfcGxhbmUob3V0cHV0LCBJR1RfUExB TkVfUFJJTUFSWSk7Cj4gPiArCWNyZWF0ZV9mYl9mb3JfbW9kZV9wb3NpdGlvbihkYXRhLCBtb2Rl LCBjb2xvciwgeCwgeSwKPiA+ICsJCQkJwqDCoMKgwqBzaXplLCBzaXplLCB0aWxpbmcsCj4gPiBt YXhfcGxhbmVzKTsKPiA+ICsJaWd0X3BsYW5lX3NldF9mYihkYXRhLT5wbGFuZVtJR1RfUExBTkVf UFJJTUFSWV0sICZkYXRhLQo+ID4gPmZiW0lHVF9QTEFORV9QUklNQVJZXSk7Cj4gPiArfQo+ID4g Kwo+ID4gK3N0YXRpYyB2b2lkCj4gPiArdGVzdF9hdG9taWNfcGxhbmVfcG9zaXRpb25fd2l0aF9v dXRwdXQoZGF0YV90ICpkYXRhLCBlbnVtIHBpcGUKPiA+IHBpcGUsCj4gPiArCQkJCcKgwqDCoMKg wqDCoMKgaWd0X291dHB1dF90ICpvdXRwdXQsIGludAo+ID4gbWF4X3BsYW5lcywKPiA+ICsJCQkJ wqDCoMKgwqDCoMKgwqB1aW50NjRfdCB0aWxpbmcpCj4gPiArewo+ID4gKwljaGFyIGJ1ZlsyNTZd Owo+ID4gKwlzdHJ1Y3QgZHJtX2V2ZW50ICplID0gKHZvaWQgKilidWY7Cj4gPiArCXRlc3RfcG9z aXRpb25fdCB0ZXN0ID0geyAuZGF0YSA9IGRhdGEgfTsKPiA+ICsJY29sb3JfdCBibHVlwqDCoD0g eyAwLjBmLCAwLjBmLCAxLjBmIH07Cj4gPiArCWlndF9jcmNfdCAqY3JjID0gTlVMTDsKPiA+ICsJ dW5zaWduZWQgaW50IHZibGFua19zdGFydDsKPiA+ICsJaW50IGksIG4sIHJldDsKPiA+ICsJaW50 IGl0ZXJhdGlvbnMgPSBvcHQuaXRlcmF0aW9ucyA8IDEgPyAxIDogb3B0Lml0ZXJhdGlvbnM7Cj4g PiArCWJvb2wgbG9vcF9mb3JldmVyOwo+ID4gKwljaGFyIGluZm9bMjU2XTsKPiA+ICsKPiA+ICsJ aWYgKG9wdC5pdGVyYXRpb25zID09IExPT1BfRk9SRVZFUikgewo+ID4gKwkJbG9vcF9mb3JldmVy ID0gdHJ1ZTsKPiA+ICsJCXNwcmludGYoaW5mbywgImZvcmV2ZXIiKTsKPiA+ICsJfSBlbHNlIHsK PiA+ICsJCWxvb3BfZm9yZXZlciA9IGZhbHNlOwo+ID4gKwkJc3ByaW50ZihpbmZvLCAiZm9yICVk ICVzIiwKPiA+ICsJCQlpdGVyYXRpb25zLCBpdGVyYXRpb25zID4gMSA/ICJpdGVyYXRpb25zIgo+ ID4gOiAiaXRlcmF0aW9uIik7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWd0X2luZm8oIlRlc3Rpbmcg Y29ubmVjdG9yICVzIHVzaW5nIHBpcGUgJXMgd2l0aCAlZAo+ID4gcGxhbmVzICVzIHdpdGggc2Vl ZCAlZFxuIiwKPiA+ICsJCcKgaWd0X291dHB1dF9uYW1lKG91dHB1dCksIGttc3Rlc3RfcGlwZV9u YW1lKHBpcGUpLAo+ID4gbWF4X3BsYW5lcywKPiA+ICsJCcKgaW5mbywgb3B0LnNlZWQpOwo+ID4g Kwo+ID4gKwl0ZXN0X2luaXQoZGF0YSwgcGlwZSk7Cj4gPiArCj4gPiArCXRlc3RfZ3JhYl9jcmMo ZGF0YSwgb3V0cHV0LCBwaXBlLCB0cnVlLCAmYmx1ZSwgdGlsaW5nLAo+ID4gKwkJwqDCoMKgwqDC oMKgJnRlc3QucmVmZXJlbmNlX2NyYyk7Cj4gXlRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgb2xk IGZiIGFuZCB1bnNldHMgdGhlIGZiLiBZb3UgY291bGQKPiBwcmV2ZW50IGEgbGVnYWN5IG1vZGVz ZXQgaGVyZSBieSBwcmVzZXJ2aW5nIHRoZSBmYiB1bnRpbCBhZnRlciB0aGUKPiB0ZXN0IGxvb3Au Cj4gCj4gQ2FuIGFsc28ga2VlcCBjcmMgZW5hYmxlZCBoZXJlLgpJIGhhZCBhbiBpZGVhIHRoYXQg d2Ugc2hvdWxkIHRha2UgYSBzbmFwc2hvdCBhcyBhIHJlZmVyZW5jZSBhbmQgdGhlbgplbnRlciBp bnRvIGEgdGVzdCBsb29wLiBPZiBjb3Vyc2UsIEkgY2FuIHByZXNlcnZlIHRoZSBmYi4KCj4gPiAK PiA+ICsJaWd0X3BpcGVfY3JjX3N0YXJ0KGRhdGEtPnBpcGVfY3JjKTsKPiA+ICsgXAo+ID4gKwlp ID0gMDsKPiA+ICsJd2hpbGUgKGkgPCBpdGVyYXRpb25zIHx8IGxvb3BfZm9yZXZlcikgewo+ID4g KwkJdGVzdF9wbGFuZXMoZGF0YSwgcGlwZSwgJmJsdWUsIHRpbGluZywgbWF4X3BsYW5lcywKPiA+ IG91dHB1dCk7Cj4gPiArCj4gPiArCQl2Ymxhbmtfc3RhcnQgPSBnZXRfdmJsYW5rKGRhdGEtPmRp c3BsYXkuZHJtX2ZkLAo+ID4gcGlwZSwgRFJNX1ZCTEFOS19ORVhUT05NSVNTKTsKPiA+ICsKPiA+ ICsJCWlndF9kaXNwbGF5X2NvbW1pdF9hdG9taWMoJmRhdGEtPmRpc3BsYXksCj4gPiArCQkJCQnC oMKgRFJNX01PREVfUEFHRV9GTElQX0VWRU5UCj4gPiAsCj4gPiArCQkJCQnCoMKgJmRhdGEtPmRp c3BsYXkpOwo+ID4gKwo+ID4gKwkJaWd0X3NldF90aW1lb3V0KDEsICJTdHVjayBvbiBwYWdlIGZs aXAiKTsKPiA+ICsKPiA+ICsJCXJldCA9IHJlYWQoZGF0YS0+ZGlzcGxheS5kcm1fZmQsIGJ1ZiwK PiA+IHNpemVvZihidWYpKTsKPiA+ICsJCWlndF9hc3NlcnQocmV0ID49IDApOwo+ID4gKwo+ID4g KwkJaWd0X2Fzc2VydF9lcShnZXRfdmJsYW5rKGRhdGEtPmRpc3BsYXkuZHJtX2ZkLAo+ID4gcGlw ZSwgMCksIHZibGFua19zdGFydCArIDEpOwo+ID4gKwkJaWd0X2Fzc2VydF9lcShlLT50eXBlLCBE Uk1fRVZFTlRfRkxJUF9DT01QTEVURSk7Cj4gPiArCQlpZ3RfcmVzZXRfdGltZW91dCgpOwo+ID4g Kwo+ID4gKwkJbiA9IGlndF9waXBlX2NyY19nZXRfY3JjcyhkYXRhLT5waXBlX2NyYywKPiA+IE1B WF9DUkNTLCAmY3JjKTsKPiA+ICsKPiA+ICsJCWlndF9hc3NlcnRfZXEobiwgTUFYX0NSQ1MpOwo+ ID4gKwo+ID4gKwkJaWd0X2Fzc2VydF9jcmNfZXF1YWwoJnRlc3QucmVmZXJlbmNlX2NyYywgY3Jj KTsKPiA+ICsKPiA+ICsJCWkrKzsKPiA+ICsJfQo+ID4gKwo+ID4gKwlpZ3RfcGlwZV9jcmNfc3Rv cChkYXRhLT5waXBlX2NyYyk7Cj4gPiArCj4gPiArCXRlc3RfZmluaShkYXRhLCBvdXRwdXQsIG1h eF9wbGFuZXMpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZAo+ID4gK3Rlc3RfbGVnYWN5 X3BsYW5lX3Bvc2l0aW9uX3dpdGhfb3V0cHV0KGRhdGFfdCAqZGF0YSwgZW51bSBwaXBlCj4gPiBw aXBlLAo+ID4gKwkJCQnCoMKgwqDCoMKgwqDCoGlndF9vdXRwdXRfdCAqb3V0cHV0LCBpbnQKPiA+ IG1heF9wbGFuZXMsCj4gPiArCQkJCcKgwqDCoMKgwqDCoMKgdWludDY0X3QgdGlsaW5nKQo+ID4g K3sKPiA+ICsJdGVzdF9wb3NpdGlvbl90IHRlc3QgPSB7IC5kYXRhID0gZGF0YSB9Owo+ID4gKwlj b2xvcl90IGJsdWXCoMKgPSB7IDAuMGYsIDAuMGYsIDEuMGYgfTsKPiA+ICsJaWd0X2NyY190ICpj cmM7Cj4gPiArCWludCBpLCBuOwo+ID4gKwlpbnQgaXRlcmF0aW9ucyA9IG9wdC5pdGVyYXRpb25z IDwgMSA/IDEgOiBvcHQuaXRlcmF0aW9uczsKPiA+ICsJYm9vbCBsb29wX2ZvcmV2ZXI7Cj4gPiAr CWNoYXIgaW5mb1syNTZdOwo+ID4gKwo+ID4gKwlpZiAob3B0Lml0ZXJhdGlvbnMgPT0gTE9PUF9G T1JFVkVSKSB7Cj4gPiArCQlsb29wX2ZvcmV2ZXIgPSB0cnVlOwo+ID4gKwkJc3ByaW50ZihpbmZv LCAiZm9yZXZlciIpOwo+ID4gKwl9IGVsc2Ugewo+ID4gKwkJbG9vcF9mb3JldmVyID0gZmFsc2U7 Cj4gPiArCQlzcHJpbnRmKGluZm8sICJmb3IgJWQgJXMiLAo+ID4gKwkJCWl0ZXJhdGlvbnMsIGl0 ZXJhdGlvbnMgPiAxID8gIml0ZXJhdGlvbnMiCj4gPiA6ICJpdGVyYXRpb24iKTsKPiA+ICsJfQo+ ID4gKwo+ID4gKwlpZ3RfaW5mbygiVGVzdGluZyBjb25uZWN0b3IgJXMgdXNpbmcgcGlwZSAlcyB3 aXRoICVkCj4gPiBwbGFuZXMgJXMgd2l0aCBzZWVkICVkXG4iLAo+ID4gKwkJwqBpZ3Rfb3V0cHV0 X25hbWUob3V0cHV0KSwga21zdGVzdF9waXBlX25hbWUocGlwZSksCj4gPiBtYXhfcGxhbmVzLAo+ ID4gKwkJwqBpbmZvLCBvcHQuc2VlZCk7Cj4gPiArCj4gPiArCXRlc3RfaW5pdChkYXRhLCBwaXBl KTsKPiA+ICsKPiA+ICsJdGVzdF9ncmFiX2NyYyhkYXRhLCBvdXRwdXQsIHBpcGUsIGZhbHNlLCAm Ymx1ZSwgdGlsaW5nLAo+ID4gKwkJwqDCoMKgwqDCoMKgJnRlc3QucmVmZXJlbmNlX2NyYyk7Cj4g PiArCj4gPiArCWkgPSAwOwo+ID4gKwl3aGlsZSAoaSA8IGl0ZXJhdGlvbnMgfHwgbG9vcF9mb3Jl dmVyKSB7Cj4gPiArCQl0ZXN0X3BsYW5lcyhkYXRhLCBwaXBlLCAmYmx1ZSwgdGlsaW5nLCBtYXhf cGxhbmVzLAo+ID4gb3V0cHV0KTsKPiA+ICsKPiA+ICsJCWlndF9kaXNwbGF5X2NvbW1pdDIoJmRh dGEtPmRpc3BsYXksCj4gPiBDT01NSVRfTEVHQUNZKTsKPiA+ICsKPiA+ICsJCWlndF9waXBlX2Ny Y19zdGFydChkYXRhLT5waXBlX2NyYyk7Cj4gPiArCQluID0gaWd0X3BpcGVfY3JjX2dldF9jcmNz KGRhdGEtPnBpcGVfY3JjLCAxLAo+ID4gJmNyYyk7Cj4gPiArCQlpZ3RfYXNzZXJ0X2VxKG4sIDEp Owo+ID4gKwkJaWd0X3BpcGVfY3JjX3N0b3AoZGF0YS0+cGlwZV9jcmMpOwo+IF5XaHkgZG8geW91 IHN0aWxsIHN0YXJ0L3N0b3AgY3JjIHBlciB1cGRhdGUgaGVyZT8KPiA+IAo+ID4gKwkJaWd0X2Fz c2VydF9jcmNfZXF1YWwoJnRlc3QucmVmZXJlbmNlX2NyYywgY3JjKTsKPiA+ICsKPiA+ICsJCWkr KzsKPiA+ICsJfQo+ID4gKwo+ID4gKwl0ZXN0X2ZpbmkoZGF0YSwgb3V0cHV0LCBtYXhfcGxhbmVz KTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQKPiA+ICt0ZXN0X3BsYW5lX3Bvc2l0aW9u KGRhdGFfdCAqZGF0YSwgZW51bSBwaXBlIHBpcGUsIGJvb2wgYXRvbWljLCBpbnQKPiA+IG1heF9w bGFuZXMsCj4gPiArCQnCoMKgwqDCoHVpbnQ2NF90IHRpbGluZykKPiA+ICt7Cj4gPiArCWlndF9v dXRwdXRfdCAqb3V0cHV0Owo+ID4gKwlpbnQgY29ubmVjdGVkX291dHM7Cj4gPiArCj4gPiArCWlm IChhdG9taWMpCj4gPiArCQlpZ3RfcmVxdWlyZShkYXRhLT5kaXNwbGF5LmlzX2F0b21pYyk7Cj4g PiArCj4gPiArCWlndF9za2lwX29uKHBpcGUgPj0gZGF0YS0+ZGlzcGxheS5uX3BpcGVzKTsKPiA+ ICsJaWd0X3NraXBfb24obWF4X3BsYW5lcyA+PSBkYXRhLQo+ID4gPmRpc3BsYXkucGlwZXNbcGlw ZV0ubl9wbGFuZXMpOwo+ID4gKwo+ID4gKwlpZiAoIW9wdC51c2VyX3NlZWQpCj4gPiArCQlvcHQu c2VlZCA9IHRpbWUoTlVMTCk7Cj4gPiArCj4gPiArCXNyYW5kKG9wdC5zZWVkKTsKPiA+ICsKPiA+ ICsJY29ubmVjdGVkX291dHMgPSAwOwo+ID4gKwlmb3JfZWFjaF9jb25uZWN0ZWRfb3V0cHV0KCZk YXRhLT5kaXNwbGF5LCBvdXRwdXQpIHsKPiA+ICsJCWlmIChhdG9taWMpCj4gPiArCQkJdGVzdF9h dG9taWNfcGxhbmVfcG9zaXRpb25fd2l0aF9vdXRwdXQoZGF0Cj4gPiBhLCBwaXBlLAo+ID4gKwkJ CQkJCQnCoMKgwqDCoMKgwqDCoG91dAo+ID4gcHV0LAo+ID4gKwkJCQkJCQnCoMKgwqDCoMKgwqDC oG1heAo+ID4gX3BsYW5lcywKPiA+ICsJCQkJCQkJwqDCoMKgwqDCoMKgwqB0aWwKPiA+IGluZyk7 Cj4gPiArCQllbHNlCj4gPiArCQkJdGVzdF9sZWdhY3lfcGxhbmVfcG9zaXRpb25fd2l0aF9vdXRw dXQoZGF0Cj4gPiBhLCBwaXBlLAo+ID4gKwkJCQkJCQnCoMKgwqDCoMKgwqDCoG91dAo+ID4gcHV0 LAo+ID4gKwkJCQkJCQnCoMKgwqDCoMKgwqDCoG1heAo+ID4gX3BsYW5lcywKPiA+ICsJCQkJCQkJ wqDCoMKgwqDCoMKgwqB0aWwKPiA+IGluZyk7Cj4gPiArCj4gPiArCQljb25uZWN0ZWRfb3V0cysr Owo+ID4gKwl9Cj4gPiArCj4gPiArCWlndF9za2lwX29uKGNvbm5lY3RlZF9vdXRzID09IDApOwo+ ID4gKwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZAo+ID4gK3J1bl90ZXN0c19mb3JfcGlw ZV9wbGFuZShkYXRhX3QgKmRhdGEsIGVudW0gcGlwZSBwaXBlLCBpbnQKPiA+IG1heF9wbGFuZXMp Cj4gPiArewo+ID4gKwlpZ3Rfc3VidGVzdF9mKCJsZWdhY3ktcGlwZS0lcy10aWxpbmctbm9uZS1w bGFuZXMtJWQiLAo+ID4gKwkJwqDCoMKgwqDCoMKga21zdGVzdF9waXBlX25hbWUocGlwZSksIG1h eF9wbGFuZXMpCj4gPiArCQl0ZXN0X3BsYW5lX3Bvc2l0aW9uKGRhdGEsIHBpcGUsIGZhbHNlLCBt YXhfcGxhbmVzLAo+ID4gKwkJCQnCoMKgwqDCoExPQ0FMX0RSTV9GT1JNQVRfTU9EX05PTkUpOwo+ ID4gKwo+ID4gKwlpZ3Rfc3VidGVzdF9mKCJhdG9taWMtcGlwZS0lcy10aWxpbmctbm9uZS1wbGFu ZXMtJWQiLAo+ID4gKwkJwqDCoMKgwqDCoMKga21zdGVzdF9waXBlX25hbWUocGlwZSksIG1heF9w bGFuZXMpCj4gPiArCQl0ZXN0X3BsYW5lX3Bvc2l0aW9uKGRhdGEsIHBpcGUsIHRydWUsIG1heF9w bGFuZXMsCj4gPiArCQkJCcKgwqDCoMKgTE9DQUxfSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQpCj4g PiA7Cj4gPiArCj4gPiArCWlndF9zdWJ0ZXN0X2YoImxlZ2FjeS1waXBlLSVzLXRpbGluZy14LXBs YW5lcy0lZCIsCj4gPiArCQnCoMKgwqDCoMKgwqBrbXN0ZXN0X3BpcGVfbmFtZShwaXBlKSwgbWF4 X3BsYW5lcykKPiA+ICsJCXRlc3RfcGxhbmVfcG9zaXRpb24oZGF0YSwgcGlwZSwgZmFsc2UsIG1h eF9wbGFuZXMsCj4gPiArCQkJCcKgwqDCoMKgTE9DQUxfSTkxNV9GT1JNQVRfTU9EX1hfVElMRUQp Cj4gPiA7Cj4gPiArCj4gPiArCWlndF9zdWJ0ZXN0X2YoImF0b21pYy1waXBlLSVzLXRpbGluZy14 LXBsYW5lcy0lZCIsCj4gPiArCQnCoMKgwqDCoMKgwqBrbXN0ZXN0X3BpcGVfbmFtZShwaXBlKSwg bWF4X3BsYW5lcykKPiA+ICsJCXRlc3RfcGxhbmVfcG9zaXRpb24oZGF0YSwgcGlwZSwgdHJ1ZSwg bWF4X3BsYW5lcywKPiA+ICsJCQkJwqDCoMKgwqBMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWF9USUxF RCkKPiA+IDsKPiA+ICsKPiA+ICsJaWd0X3N1YnRlc3RfZigibGVnYWN5LXBpcGUtJXMtdGlsaW5n LXktcGxhbmVzLSVkIiwKPiA+ICsJCcKgwqDCoMKgwqDCoGttc3Rlc3RfcGlwZV9uYW1lKHBpcGUp LCBtYXhfcGxhbmVzKQo+ID4gKwkJdGVzdF9wbGFuZV9wb3NpdGlvbihkYXRhLCBwaXBlLCBmYWxz ZSwgbWF4X3BsYW5lcywKPiA+ICsJCQkJwqDCoMKgwqBMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWV9U SUxFRCkKPiA+IDsKPiA+ICsKPiA+ICsJaWd0X3N1YnRlc3RfZigiYXRvbWljLXBpcGUtJXMtdGls aW5nLXktcGxhbmVzLSVkIiwKPiA+ICsJCcKgwqDCoMKgwqDCoGttc3Rlc3RfcGlwZV9uYW1lKHBp cGUpLCBtYXhfcGxhbmVzKQo+ID4gKwkJdGVzdF9wbGFuZV9wb3NpdGlvbihkYXRhLCBwaXBlLCB0 cnVlLCBtYXhfcGxhbmVzLAo+ID4gKwkJCQnCoMKgwqDCoExPQ0FMX0k5MTVfRk9STUFUX01PRF9Z X1RJTEVEKQo+ID4gOwo+ID4gKwo+ID4gKwlpZ3Rfc3VidGVzdF9mKCJsZWdhY3ktcGlwZS0lcy10 aWxpbmcteWYtcGxhbmVzLSVkIiwKPiA+ICsJCcKgwqDCoMKgwqDCoGttc3Rlc3RfcGlwZV9uYW1l KHBpcGUpLCBtYXhfcGxhbmVzKQo+ID4gKwkJdGVzdF9wbGFuZV9wb3NpdGlvbihkYXRhLCBwaXBl LCBmYWxzZSwgbWF4X3BsYW5lcywKPiA+ICsJCQkJwqDCoMKgwqBMT0NBTF9JOTE1X0ZPUk1BVF9N T0RfWWZfVElMRUQKPiA+ICk7Cj4gPiArCj4gPiArCWlndF9zdWJ0ZXN0X2YoImF0b21pYy1waXBl LSVzLXRpbGluZy15Zi1wbGFuZXMtJWQiLAo+ID4gKwkJwqDCoMKgwqDCoMKga21zdGVzdF9waXBl X25hbWUocGlwZSksIG1heF9wbGFuZXMpCj4gPiArCQl0ZXN0X3BsYW5lX3Bvc2l0aW9uKGRhdGEs IHBpcGUsIHRydWUsIG1heF9wbGFuZXMsCj4gPiArCQkJCcKgwqDCoMKgTE9DQUxfSTkxNV9GT1JN QVRfTU9EX1lmX1RJTEVECj4gPiApOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZAo+ID4g K3J1bl90ZXN0c19mb3JfcGlwZShkYXRhX3QgKmRhdGEsIGVudW0gcGlwZSBwaXBlKQo+ID4gK3sK PiA+ICsJZm9yIChpbnQgcGxhbmVzID0gSUdUX1BMQU5FX1BSSU1BUlk7IHBsYW5lcyA8Cj4gPiBJ R1RfTUFYX1BMQU5FUzsgcGxhbmVzKyspCj4gPiArCQlydW5fdGVzdHNfZm9yX3BpcGVfcGxhbmUo ZGF0YSwgcGlwZSwgcGxhbmVzKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGRhdGFfdCBkYXRh Owo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgb3B0X2hhbmRsZXIoaW50IG9wdGlvbiwgaW50IG9wdGlv bl9pbmRleCwgdm9pZCAqaW5wdXQpCj4gPiArewo+ID4gKwlzd2l0Y2ggKG9wdGlvbikgewo+ID4g KwljYXNlICdpJzoKPiA+ICsJCW9wdC5pdGVyYXRpb25zID0gc3RydG9sKG9wdGFyZywgTlVMTCwg MCk7Cj4gPiArCj4gPiArCQlpZiAob3B0Lml0ZXJhdGlvbnMgPCBMT09QX0ZPUkVWRVIgfHwKPiA+ IG9wdC5pdGVyYXRpb25zID09IDApIHsKPiA+ICsJCQlpZ3RfaW5mbygiaW5jb3JyZWN0IG51bWJl ciBvZgo+ID4gaXRlcmF0aW9uc1xuIik7Cj4gPiArCQkJaWd0X2Fzc2VydChmYWxzZSk7Cj4gPiAr CQl9Cj4gPiArCj4gPiArCQlicmVhazsKPiA+ICsJY2FzZSAncyc6Cj4gPiArCQlvcHQudXNlcl9z ZWVkID0gdHJ1ZTsKPiA+ICsJCW9wdC5zZWVkID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMCk7Cj4g PiArCQlicmVhazsKPiA+ICsJZGVmYXVsdDoKPiA+ICsJCWlndF9hc3NlcnQoZmFsc2UpOwo+ID4g Kwl9Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gK30KPiA+ICsKPiA+ICtjb25zdCBjaGFyICpo ZWxwX3N0ciA9Cj4gPiArCSLCoMKgLS1pdGVyYXRpb25zIE51bWJlciBvZiBpdGVyYXRpb25zIGZv ciB0ZXN0IGNvdmVyYWdlLiAtMQo+ID4gbG9vcCBmb3JldmVyLCBkZWZhdWx0IDY0IGl0ZXJhdGlv bnNcbiIKPiA+ICsJIsKgwqAtLXNlZWTCoMKgwqDCoMKgwqDCoFNlZWQgZm9yIHJhbmRvbSBudW1i ZXIgZ2VuZXJhdG9yXG4iOwo+ID4gKwo+ID4gK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2 W10pCj4gPiArewo+ID4gKwlzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0gewo+ID4gKwkJ eyAiaXRlcmF0aW9ucyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnaSd9LAo+ID4gKwkJeyAi c2VlZCIswqDCoMKgwqByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3MnfSwKPiA+ICsJCXsgMCwg MCwgMCwgMCB9Cj4gPiArCX07Cj4gPiArCj4gPiArCWlndF9zdWJ0ZXN0X2luaXRfcGFyc2Vfb3B0 cygmYXJnYywgYXJndiwgIiIsIGxvbmdfb3B0aW9ucywKPiA+IGhlbHBfc3RyLAo+ID4gKwkJCQnC oMKgwqDCoG9wdF9oYW5kbGVyLCBOVUxMKTsKPiA+ICsKPiA+ICsJaWd0X3NraXBfb25fc2ltdWxh dGlvbigpOwo+ID4gKwo+ID4gKwlpZ3RfZml4dHVyZSB7Cj4gPiArCQlkYXRhLmRybV9mZCA9Cj4g PiBkcm1fb3Blbl9kcml2ZXJfbWFzdGVyKERSSVZFUl9JTlRFTCk7Cj4gPiArCj4gPiArCQlrbXN0 ZXN0X3NldF92dF9ncmFwaGljc19tb2RlKCk7Cj4gPiArCj4gPiArCQlpZ3RfcmVxdWlyZV9waXBl X2NyYygpOwo+ID4gKwkJaWd0X2Rpc3BsYXlfaW5pdCgmZGF0YS5kaXNwbGF5LCBkYXRhLmRybV9m ZCk7Cj4gPiArCX0KPiA+ICsKPiA+ICsJZm9yIChpbnQgcGlwZSA9IDA7IHBpcGUgPCBJOTE1X01B WF9QSVBFUzsgcGlwZSsrKQo+ID4gKwkJcnVuX3Rlc3RzX2Zvcl9waXBlKCZkYXRhLCBwaXBlKTsK PiA+ICsKPiA+ICsJaWd0X2ZpeHR1cmUgewo+ID4gKwkJaWd0X2Rpc3BsYXlfZmluaSgmZGF0YS5k aXNwbGF5KTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlpZ3RfZXhpdCgpOwo+ID4gK30KPiBSZXN0IGxv b2tzIG9rLgo+IAo+IH5NYWFydGVuCj4gCi0tIApNaWthIEthaG9sYSAtIEludGVsIE9UQwoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1h aWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==