From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH igt] igt/gem_softpin: Remove false dependencies on esoteric features Date: Thu, 21 Jan 2016 09:08:14 +0100 Message-ID: <20160121080814.GI19130@phenom.ffwll.local> References: <1452769369-12802-1-git-send-email-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by gabe.freedesktop.org (Postfix) with ESMTPS id 664F26E8FF for ; Thu, 21 Jan 2016 00:08:09 -0800 (PST) Received: by mail-wm0-f66.google.com with SMTP id l65so9102701wmf.3 for ; Thu, 21 Jan 2016 00:08:09 -0800 (PST) Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: "Belgaumkar, Vinay" Cc: "intel-gfx@lists.freedesktop.org" , "Barnes, Jesse" List-Id: intel-gfx@lists.freedesktop.org T24gV2VkLCBKYW4gMjAsIDIwMTYgYXQgMDY6NDk6NDlQTSArMDAwMCwgQmVsZ2F1bWthciwgVmlu YXkgd3JvdGU6Cj4gSGkgQ2hyaXMsCj4gICAgIFRoZXNlIHRlc3RzIHdlcmUgZGV2ZWxvcGVkIGZv ciB0ZXN0aW5nIGJ1ZmZlcmVkIFNWTSh1c2luZyB1c2VycHRyCj4gICAgIGFuZCBzb2Z0IHBpbm5p bmcgQVBJKS4gSSB0aGluayBEYW4gd2FudGVkIG1lIHRvIHJlbmFtZSB0aGUgdGVzdHMgdG8KPiAg ICAgZ2VtX3NvZnRwaW4sIHNpbmNlIHRoZXkgd2VyZSBiZWluZyBjaGVja2VkIGluIGFzIHRlc3Rz IHdoaWNoCj4gICAgIHZhbGlkYXRlZCB0aGUgc29mdHBpbiBrZXJuZWwgcGF0Y2hlcy4gQ2FuIHdl IHJlbmFtZSB0aGUgZXhpc3RpbmcKPiAgICAgdGVzdHMgdG8gZ2VtX2J1ZmZlcmVkX3N2bSBvciBz b21ldGhpbmcgc2ltaWxhciwgYW5kIHRoZW4gcHVzaCBhbnkKPiAgICAgdGFyZ2V0ZWQgc29mdHBp biBvbmx5IHRlc3RzIGFzIGdlbV9zb2Z0cGluPyBXZSB3ZXJlIGhvcGluZyB0byB1c2UKPiAgICAg dGhlc2UgdXNlcnB0citzb2Z0cGluIHRlc3RzIGFzIEdGVCB0ZXN0cyBmb3IgU1ZNKEFuZHJvaWQp IGFzIHdlbGwsCj4gICAgIHNpbmNlIGJ1ZmZlcmVkIFNWTSBpcyBQT1IgZm9yIEJYVCBBbmRyb2lk LiAKCkkgYWdyZWUgd2l0aCBDaHJpcywgdGhlcmUncyBubyBuZWVkIHRvIHVuZWNlc3NhcmlseSBt aXggdG9nZXRoZXIgZmVhdHVyZXMuCldoZW4gdGhlIGFwaSBpcyBkZXNpZ25lZCBpbiBhbiBvcnRo b2dvbmFsIHdheSwgc28gc2hvdWxkIGJlIHRoZSB0ZXN0aW5nLgppOTE1LmtvIGlzIGFscmVhZHkg YSBtaW5kYm9nZ2xpbmcgY29tcGxleCBiZWFzdCwgbm8gbmVlZCB0byBtYWtlIG91ciBsaXZlcwpo YXJkZXIgYnkgbWFraW5nIHRoZSB0ZXN0cyB1c2UgZmVhdHVyZXMgdGhhdCBhcmVuJ3Qgc3RyaWN0 bHkgbmVlZGVkLgoKSW4gdGhlIGVuZCBhcHBsaWNhdGlvbnMgYW5kIFVNRHMgd2lsbCBvZiBjb3Vy c2UgdXNlIGFsbCB0aGVzZSBmZWF0dXJlcwp0b2dldGhlciwgYnV0IHRoYXQncyB3aHkgd2UgZG8g aW50ZWdyYXRpb24gdGVzdGluZyBvbiB0b3Agb2YganVzdCBydW5uaW5nCmlndC4KCkNhbiB5b3Ug cGxlYXNlIHJldmlldyBDaHJpcycgcGF0Y2g/CgpUaGFua3MsIERhbmllbAoKPiAKPiBUaGFua3Ms Cj4gVmluYXkuICAgCj4gCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiBGcm9tOiBJbnRl bC1nZnggW21haWx0bzppbnRlbC1nZngtYm91bmNlc0BsaXN0cy5mcmVlZGVza3RvcC5vcmddIE9u IEJlaGFsZiBPZiBDaHJpcyBXaWxzb24KPiBTZW50OiBUaHVyc2RheSwgSmFudWFyeSAxNCwgMjAx NiAzOjAzIEFNCj4gVG86IGludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiBTdWJqZWN0 OiBbSW50ZWwtZ2Z4XSBbUEFUQ0ggaWd0XSBpZ3QvZ2VtX3NvZnRwaW46IFJlbW92ZSBmYWxzZSBk ZXBlbmRlbmNpZXMgb24gZXNvdGVyaWMgZmVhdHVyZXMKPiAKPiBGb3Igc29mdHBpbm5pbmcsIHdl IGRvIG5vdCByZXF1aXJlIGVpdGhlciB1c2VycHRyIG9yIGV4dGVuZGVkIHBwZ3R0LCBzbyByZW1v dmUgdGhvc2UgcmVxdWlyZW1lbnRzIGFuZCBtYWtlIHRoZSB0ZXN0cyB3b3JrIHVuaXZlcnNhbGx5 LiAoQ2VydGFpbiBBQkkgdGVzdHMgcmVxdWlyZSBsYXJnZSBHVFQsIG9yIHBlci1wcm9jZXNzIEdU VC4pCj4gCj4gSW4gdGhlIHByb2Nlc3MsIG1ha2UgdGhlIHRlc3RzIG1vcmUgZXh0ZW5zaXZlIC0g dmFsaWRhdGUgb3ZlcmxhcHBpbmcgaGFuZGxpbmcgbW9yZSBjYXJlZnVsLCBleHBsaWNpdGx5IHRl c3Qgbm8tcmVsb2NhdGlvbiBzdXBwb3J0LCB2YWxpZGF0ZSBtb3JlIEFCSSBoYW5kbGluZy4gQW5k IGZvciBmdW4sIGNhdXNlIGEga2VybmVsIEdQRi4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBDaHJpcyBX aWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4KPiAtLS0KPiAgdGVzdHMvZ2VtX3NvZnRw aW4uYyB8IDEzMTMgKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCj4gIDEgZmlsZSBjaGFuZ2VkLCAzMjQgaW5zZXJ0aW9ucygrKSwgOTg5IGRlbGV0aW9u cygtKQo+IAo+IGRpZmYgLS1naXQgYS90ZXN0cy9nZW1fc29mdHBpbi5jIGIvdGVzdHMvZ2VtX3Nv ZnRwaW4uYyBpbmRleCAxY2JkZTRlLi5mMTg4NTU5IDEwMDY0NAo+IC0tLSBhL3Rlc3RzL2dlbV9z b2Z0cGluLmMKPiArKysgYi90ZXN0cy9nZW1fc29mdHBpbi5jCj4gQEAgLTI2LDgwICsyNiwxMCBA QAo+ICAgKgo+ICAgKi8KPiAgCj4gLSNpbmNsdWRlIDx1bmlzdGQuaD4KPiAtI2luY2x1ZGUgPHN0 ZGxpYi5oPgo+IC0jaW5jbHVkZSA8c3RkaW50Lmg+Cj4gLSNpbmNsdWRlIDxzdGRpby5oPgo+IC0j aW5jbHVkZSA8c3RyaW5nLmg+Cj4gLSNpbmNsdWRlIDxmY250bC5oPgo+IC0jaW5jbHVkZSA8aW50 dHlwZXMuaD4KPiAtI2luY2x1ZGUgPGVycm5vLmg+Cj4gLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgo+ IC0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Cj4gLSNpbmNsdWRlIDxzeXMvdGltZS5oPgo+IC0jaW5j bHVkZSA8bWFsbG9jLmg+Cj4gLSNpbmNsdWRlICJkcm0uaCIKPiAtI2luY2x1ZGUgImlvY3RsX3dy YXBwZXJzLmgiCj4gLSNpbmNsdWRlICJkcm10ZXN0LmgiCj4gLSNpbmNsdWRlICJpbnRlbF9jaGlw c2V0LmgiCj4gLSNpbmNsdWRlICJpbnRlbF9pby5oIgo+IC0jaW5jbHVkZSAiaTkxNV9kcm0uaCIK PiAtI2luY2x1ZGUgPGFzc2VydC5oPgo+IC0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KPiAtI2luY2x1 ZGUgPHN5cy9pcGMuaD4KPiAtI2luY2x1ZGUgPHN5cy9zaG0uaD4KPiAtI2luY2x1ZGUgImlndF9r bXMuaCIKPiAtI2luY2x1ZGUgPGludHR5cGVzLmg+Cj4gLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4K PiAtI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Cj4gLQo+IC0jZGVmaW5lIEJPX1NJWkUgNDA5Ngo+IC0j ZGVmaW5lIE1VTFRJUEFHRV9CT19TSVpFIDIgKiBCT19TSVpFCj4gLSNkZWZpbmUgU1RPUkVfQkFU Q0hfQlVGRkVSX1NJWkUgNAo+ICsjaW5jbHVkZSAiaWd0LmgiCj4gKwo+ICAjZGVmaW5lIEVYRUNf T0JKRUNUX1BJTk5FRAkoMTw8NCkKPiAgI2RlZmluZSBFWEVDX09CSkVDVF9TVVBQT1JUU180OEJf QUREUkVTUyAoMTw8MykgLSNkZWZpbmUgU0hBUkVEX0JVRkZFUl9TSVpFIDQwOTYKPiAtCj4gLXR5 cGVkZWYgc3RydWN0IGRybV9pOTE1X2dlbV91c2VycHRyIGk5MTVfZ2VtX3VzZXJwdHI7Cj4gLQo+ IC1zdGF0aWMgdWludDMyX3QgaW5pdF91c2VycHRyKGludCBmZCwgaTkxNV9nZW1fdXNlcnB0ciAq LCB2b2lkICpwdHIsIHVpbnQ2NF90IHNpemUpOyAtc3RhdGljIHZvaWQgKmNyZWF0ZV9tZW1fYnVm ZmVyKHVpbnQ2NF90IHNpemUpOyAtc3RhdGljIGludCBnZW1fY2FsbF91c2VycHRyX2lvY3RsKGlu dCBmZCwgaTkxNV9nZW1fdXNlcnB0ciAqdXNlcnB0cik7IC1zdGF0aWMgdm9pZCBnZW1fcGluX3Vz ZXJwdHJfdGVzdCh2b2lkKTsgLXN0YXRpYyB2b2lkIGdlbV9waW5fYm9fdGVzdCh2b2lkKTsgLXN0 YXRpYyB2b2lkIGdlbV9waW5faW52YWxpZF92bWFfdGVzdChib29sIHRlc3RfZGVjb3VwbGVfZmxh Z3MsIGJvb2wgdGVzdF9jYW5vbmljYWxfb2Zmc2V0KTsgLXN0YXRpYyB2b2lkIGdlbV9waW5fb3Zl cmxhcF90ZXN0KHZvaWQpOyAtc3RhdGljIHZvaWQgZ2VtX3Bpbl9oaWdoX2FkZHJlc3NfdGVzdCh2 b2lkKTsKPiAtCj4gLSNkZWZpbmUgTk9fUFBHVFQgMAo+IC0jZGVmaW5lIEFMSUFTSU5HX1BQR1RU IDEKPiAtI2RlZmluZSBGVUxMXzMyX0JJVF9QUEdUVCAyCj4gLSNkZWZpbmUgRlVMTF80OF9CSVRf UFBHVFQgMwo+IC0vKiB1c2VzX2Z1bGxfcHBndHQKPiAtICogRmluZHMgc3VwcG9ydGVkIFBQR1RU IGRldGFpbHMuCj4gLSAqIEBmZCBEUk0gZmQKPiAtICogQG1pbiBjYW4gYmUKPiAtICogMCAtIE5v IFBQR1RUCj4gLSAqIDEgLSBBbGlhc2luZyBQUEdUVAo+IC0gKiAyIC0gRnVsbCBQUEdUVCAoMzJi KQo+IC0gKiAzIC0gRnVsbCBQUEdUVCAoNDhiKQo+IC0gKiBSRVRVUk5TIHRydWUvZmFsc2UgaWYg bWluIHN1cHBvcnQgaXMgcHJlc2VudCAtKi8gLXN0YXRpYyBib29sIHVzZXNfZnVsbF9wcGd0dChp bnQgZmQsIGludCBtaW4pIC17Cj4gLQlzdHJ1Y3QgZHJtX2k5MTVfZ2V0cGFyYW0gZ3A7Cj4gLQlp bnQgdmFsID0gMDsKPiAtCj4gLQltZW1zZXQoJmdwLCAwLCBzaXplb2YoZ3ApKTsKPiAtCWdwLnBh cmFtID0gMTg7IC8qIEhBU19BTElBU0lOR19QUEdUVCAqLwo+IC0JZ3AudmFsdWUgPSAmdmFsOwo+ IC0KPiAtCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VUUEFSQU0sICZncCkpCj4g LQkJcmV0dXJuIDA7Cj4gLQo+IC0JZXJybm8gPSAwOwo+IC0JcmV0dXJuIHZhbCA+PSBtaW47Cj4g LX0KPiAgCj4gIC8qIGhhc19zb2Z0cGluX3N1cHBvcnQKPiAgICogRmluZHMgaWYgc29mdHBpbiBm ZWF0dXJlIGlzIHN1cHBvcnRlZCBAQCAtMTIxLDgzICs1MSw2IEBAIHN0YXRpYyBib29sIGhhc19z b2Z0cGluX3N1cHBvcnQoaW50IGZkKQo+ICAJcmV0dXJuICh2YWwgPT0gMSk7Cj4gIH0KPiAgCj4g LS8qIGdlbV9jYWxsX3VzZXJwdHJfaW9jdGwKPiAtICogSGVscGVyIHRvIGNhbGwgaW9jdGwgLSBU T0RPOiBtb3ZlIHRvIGxpYgo+IC0gKiBAZmQgLSBkcm0gZmQKPiAtICogQHVzZXJwdHIgLSBwb2lu dGVyIHRvIGluaXRpYWxpc2VkIHVzZXJwdHIKPiAtICogUkVUVVJOUyBzdGF0dXMgb2YgaW9jdGwg Y2FsbAo+IC0qLwo+IC1zdGF0aWMgaW50IGdlbV9jYWxsX3VzZXJwdHJfaW9jdGwoaW50IGZkLCBp OTE1X2dlbV91c2VycHRyICp1c2VycHRyKSAtewo+IC0JaW50IHJldDsKPiAtCj4gLQlyZXQgPSBk cm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX1VTRVJQVFIsIHVzZXJwdHIpOwo+IC0KPiAt CWlmIChyZXQpCj4gLQkJcmV0ID0gZXJybm87Cj4gLQo+IC0JcmV0dXJuIHJldDsKPiAtfQo+IC0K PiAtLyogaW5pdF91c2VycHRyCj4gLSAqIEhlbHBlciB0aGF0IGluaXRzIHVzZXJwdHIgYW4gcmV0 dXJucyBoYW5kbGUKPiAtICogQGZkIC0gZHJtIGZkCj4gLSAqIEB1c2VycHRyIC0gcG9pbnRlciB0 byBlbXB0eSB1c2VycHRyCj4gLSAqIEBwdHIgLSBidWZmZXIgdG8gYmUgc2hhcmVkCj4gLSAqIEBz aXplIC0gc2l6ZSBvZiBidWZmZXIKPiAtICogQHJvIC0gcmVhZCBvbmx5IGZsYWcKPiAtICogUkVU VVJOUyBoYW5kbGUgdG8gc2hhcmVkIGJ1ZmZlcgo+IC0qLwo+IC1zdGF0aWMgdWludDMyX3QgaW5p dF91c2VycHRyKGludCBmZCwgaTkxNV9nZW1fdXNlcnB0ciAqdXNlcnB0ciwgdm9pZCAqcHRyLAo+ IC0JCQkgICAgIHVpbnQ2NF90IHNpemUpCj4gLXsKPiAtCWludCByZXQ7Cj4gLQo+IC0JbWVtc2V0 KCh2b2lkKil1c2VycHRyLCAwLCBzaXplb2YoaTkxNV9nZW1fdXNlcnB0cikpOwo+IC0KPiAtCXVz ZXJwdHItPnVzZXJfcHRyID0gKHVuc2lnbmVkIGxvbmcpcHRyOyAvKiBOZWVkIHRoZSBjYXN0IHRv IG92ZXJjb21lIGNvbXBpbGVyIHdhcm5pbmcgKi8KPiAtCXVzZXJwdHItPnVzZXJfc2l6ZSA9IHNp emU7Cj4gLQl1c2VycHRyLT5mbGFncyA9IDA7IC8qIHVzZSBzeW5jaHJvbml6ZWQgb3BlcmF0aW9u ICovCj4gLQo+IC0JcmV0ID0gZ2VtX2NhbGxfdXNlcnB0cl9pb2N0bChmZCwgdXNlcnB0cik7Cj4g LQlpZ3RfYXNzZXJ0X2VxKHJldCwgMCk7Cj4gLQo+IC0JcmV0dXJuIHVzZXJwdHItPmhhbmRsZTsK PiAtfQo+IC0KPiAtLyogY3JlYXRlX21lbV9idWZmZXIKPiAtICogQ3JlYXRlcyBhIDRLIGFsaWdu ZWQgQ1BVIGJ1ZmZlcgo+IC0gKiBAc2l6ZSAtIHNpemUgb2YgYnVmZmVyCj4gLSAqIFJFVFVSTlMg cG9pbnRlciB0byBidWZmZXIgb2YgQHNpemUKPiAtKi8KPiAtc3RhdGljIHZvaWQgKmNyZWF0ZV9t ZW1fYnVmZmVyKHVpbnQ2NF90IHNpemUpIC17Cj4gLQl2b2lkICphZGRyOwo+IC0JaW50IHJldDsK PiAtCj4gLQlyZXQgPSBwb3NpeF9tZW1hbGlnbigmYWRkciwgNDA5Niwgc2l6ZSk7Cj4gLQlpZ3Rf YXNzZXJ0KHJldCA9PSAwKTsKPiAtCj4gLQlyZXR1cm4gYWRkcjsKPiAtfQo+IC0KPiAtLyogc2V0 dXBfZXhlY19vYmoKPiAtICogcG9wdWxhdGUgZXhlYyBvYmplY3QKPiAtICogQGV4ZWMgLSBleGVj IG9iamVjdAo+IC0gKiBAaGFuZGxlIC0gaGFuZGxlIHRvIGdlbSBidWZmZXIKPiAtICogQGZsYWdz IC0gYW55IGZsYWdzCj4gLSAqIEBvZmZzZXQgLSByZXF1ZXN0ZWQgVk1BCj4gLSovCj4gLXN0YXRp YyB2b2lkIHNldHVwX2V4ZWNfb2JqKHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpl eGVjLAo+IC0JCQkgICB1aW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IGZsYWdzLAo+IC0JCQkgICB1 aW50NjRfdCBvZmZzZXQpCj4gLXsKPiAtCW1lbXNldChleGVjLCAwLCBzaXplb2Yoc3RydWN0IGRy bV9pOTE1X2dlbV9leGVjX29iamVjdDIpKTsKPiAtCWV4ZWMtPmhhbmRsZSA9IGhhbmRsZTsKPiAt CWV4ZWMtPmZsYWdzID0gZmxhZ3M7Cj4gLQlleGVjLT5vZmZzZXQgPSBvZmZzZXQ7Cj4gLX0KPiAt Cj4gIC8qIGdlbjhfY2Fub25pY2FsX2FkZHIKPiAgICogVXNlZCB0byBjb252ZXJ0IGFueSBhZGRy ZXNzIGludG8gY2Fub25pY2FsIGZvcm0sIGkuZS4gWzYzOjQ4XSA9PSBbNDddLgo+ICAgKiBCYXNl ZCBvbiBrZXJuZWwncyBzaWduX2V4dGVuZDY0IGltcGxlbWVudGF0aW9uLgo+IEBAIC0yMTAsOTA0 ICs2MywzODYgQEAgc3RhdGljIHVpbnQ2NF90IGdlbjhfY2Fub25pY2FsX2FkZHIodWludDY0X3Qg YWRkcmVzcykKPiAgCXJldHVybiAoX19zNjQpKGFkZHJlc3MgPDwgc2hpZnQpID4+IHNoaWZ0OyAg fQo+ICAKPiAtLyogZ2VtX3N0b3JlX2RhdGFfc3ZtCj4gLSAqIHBvcHVsYXRlIGJhdGNoIGJ1ZmZl ciB3aXRoIE1JX1NUT1JFX0RXT1JEX0lNTSBjb21tYW5kCj4gLSAqIEBmZDogZHJtIGZpbGUgZGVz Y3JpcHRvcgo+IC0gKiBAY21kX2J1ZjogYmF0Y2ggYnVmZmVyCj4gLSAqIEB2YWRkcjogZGVzdGlu YXRpb24gVmlydHVhbCBhZGRyZXNzCj4gLSAqIEBkYXRhOiBkYXRhIHRvIGJlIHN0b3JlIGF0IGRl c3RpbmF0aW9uCj4gLSAqIEBlbmQ6IHdoZXRoZXIgdG8gZW5kIGJhdGNoIGJ1ZmZlciBvciBub3Qg LSovIC1zdGF0aWMgaW50IGdlbV9zdG9yZV9kYXRhX3N2bShpbnQgZmQsIHVpbnQzMl90ICpjbWRf YnVmLCB1aW50NjRfdCB2YWRkciwKPiAtCQkJICAgICAgdWludDMyX3QgZGF0YSwgYm9vbCBlbmQp Cj4gK3N0YXRpYyBpbnQgX19nZW1fZXhlY2J1ZihpbnQgZmQsIHN0cnVjdCBkcm1faTkxNV9nZW1f ZXhlY2J1ZmZlcjIgKmViKQo+ICB7Cj4gLQlpbnQgaSA9IDA7Cj4gLQo+IC0JY21kX2J1ZltpKytd ID0gTUlfU1RPUkVfRFdPUkRfSU1NOwo+IC0JY21kX2J1ZltpKytdID0gdmFkZHIgJiAweEZGRkZG RkZDOwo+IC0JY21kX2J1ZltpKytdID0gKHZhZGRyID4+IDMyKSAmIDB4RkZGRjsgLyogYml0cyAz Mjo0NyAqLwo+IC0KPiAtCWNtZF9idWZbaSsrXSA9IGRhdGE7Cj4gLQlpZiAoZW5kKSB7Cj4gLQkJ Y21kX2J1ZltpKytdID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKPiAtCQljbWRfYnVmW2krK10gPSAw Owo+IC0JfQo+IC0KPiAtCXJldHVybihpICogc2l6ZW9mKHVpbnQzMl90KSk7Cj4gKwlpbnQgZXJy ID0gMDsKPiArCWlmIChkcm1Jb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0VYRUNCVUZGRVIy LCBlYikpCj4gKwkJZXJyID0gLWVycm5vOwo+ICsJcmV0dXJuIGVycjsKPiAgfQo+ICAKPiAtLyog Z2VtX3N0b3JlX2RhdGEKPiAtICogcG9wdWxhdGUgYmF0Y2ggYnVmZmVyIHdpdGggTUlfU1RPUkVf RFdPUkRfSU1NIGNvbW1hbmQKPiAtICogVGhpcyBvbmUgZmlsbHMgdXAgcmVsb2MgYnVmZmVyIGFz IHdlbGwKPiAtICogQGZkOiBkcm0gZmlsZSBkZXNjcmlwdG9yCj4gLSAqIEBjbWRfYnVmOiBiYXRj aCBidWZmZXIKPiAtICogQGRhdGE6IGRhdGEgdG8gYmUgc3RvcmUgYXQgZGVzdGluYXRpb24KPiAt ICogQHJlbG9jIC0gcmVsb2NhdGlvbiBlbnRyeQo+IC0gKiBAZW5kOiB3aGV0aGVyIHRvIGVuZCBi YXRjaCBidWZmZXIgb3Igbm90IC0qLyAtc3RhdGljIGludCBnZW1fc3RvcmVfZGF0YShpbnQgZmQs IHVpbnQzMl90ICpjbWRfYnVmLAo+IC0JCQkgIHVpbnQzMl90IGhhbmRsZSwgdWludDMyX3QgZGF0 YSwKPiAtCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkgKnJlbG9jLAo+ IC0JCQkgIGJvb2wgZW5kKQo+ICtzdGF0aWMgdm9pZCB0ZXN0X2ludmFsaWQoaW50IGZkKQo+ICB7 Cj4gLQlpbnQgaSA9IDA7Cj4gLQo+IC0JY21kX2J1ZltpKytdID0gTUlfU1RPUkVfRFdPUkRfSU1N Owo+IC0JY21kX2J1ZltpKytdID0gMDsgLyogbG93ZXIgMzEgYml0cyBvZiA0OCBiaXQgYWRkcmVz cyAtIDAgcmVsb2MgbmVlZGVkICovCj4gLQljbWRfYnVmW2krK10gPSAwOyAvKiB1cHBlciAxNSBi aXRzIG9mIDQ4IGJpdCBhZGRyZXNzIC0gMCByZWxvYyBuZWVkZWQgKi8KPiAtCXJlbG9jLT5vZmZz ZXQgPSAxICogc2l6ZW9mKHVpbnQzMl90KTsKPiAtCXJlbG9jLT5kZWx0YSA9IDA7Cj4gLQlyZWxv Yy0+dGFyZ2V0X2hhbmRsZSA9IGhhbmRsZTsKPiAtCXJlbG9jLT5yZWFkX2RvbWFpbnMgPSBJOTE1 X0dFTV9ET01BSU5fUkVOREVSOwo+IC0JcmVsb2MtPndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RP TUFJTl9SRU5ERVI7Cj4gLQlyZWxvYy0+cHJlc3VtZWRfb2Zmc2V0ID0gMDsKPiAtCWNtZF9idWZb aSsrXSA9IGRhdGE7Cj4gLQlpZiAoZW5kKSB7Cj4gLQkJY21kX2J1ZltpKytdID0gTUlfQkFUQ0hf QlVGRkVSX0VORDsKPiAtCQljbWRfYnVmW2krK10gPSAwOwo+ICsJY29uc3QgdWludDMyX3QgYmJl ID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZl cjIgZXhlY2J1ZjsKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIG9iamVjdDsK PiArCj4gKwltZW1zZXQoJmV4ZWNidWYsIDAsIHNpemVvZihleGVjYnVmKSk7Cj4gKwlleGVjYnVm LmJ1ZmZlcnNfcHRyID0gKHVuc2lnbmVkIGxvbmcpJm9iamVjdDsKPiArCWV4ZWNidWYuYnVmZmVy X2NvdW50ID0gMTsKPiArCj4gKwltZW1zZXQoJm9iamVjdCwgMCwgc2l6ZW9mKG9iamVjdCkpOwo+ ICsJb2JqZWN0LmhhbmRsZSA9IGdlbV9jcmVhdGUoZmQsIDIqNDA5Nik7Cj4gKwlvYmplY3QuZmxh Z3MgPSBFWEVDX09CSkVDVF9TVVBQT1JUU180OEJfQUREUkVTUyB8IEVYRUNfT0JKRUNUX1BJTk5F RDsKPiArCWdlbV93cml0ZShmZCwgb2JqZWN0LmhhbmRsZSwgMCwgJmJiZSwgc2l6ZW9mKGJiZSkp Owo+ICsKPiArCS8qIENoZWNrIGludmFsaWQgYWxpZ25tZW50ICovCj4gKwlvYmplY3Qub2Zmc2V0 ID0gNDA5NjsKPiArCW9iamVjdC5hbGlnbm1lbnQgPSA2NCoxMDI0Owo+ICsJaWd0X2Fzc2VydF9l cShfX2dlbV9leGVjYnVmKGZkLCAmZXhlY2J1ZiksIC1FSU5WQUwpOwo+ICsJb2JqZWN0LmFsaWdu bWVudCA9IDA7Cj4gKwo+ICsJLyogQ2hlY2sgd3JhcGFyb3VuZCAqLwo+ICsJb2JqZWN0Lm9mZnNl dCA9IC00MDk2VUxMOwo+ICsJaWd0X2Fzc2VydF9lcShfX2dlbV9leGVjYnVmKGZkLCAmZXhlY2J1 ZiksIC1FSU5WQUwpOwo+ICsKPiArCS8qIENoZWNrIGJleW9uZCBib3VuZHMgb2YgYXBlcnR1cmUg Ki8KPiArCW9iamVjdC5vZmZzZXQgPSBnZW1fYXBlcnR1cmVfc2l6ZShmZCkgLSA0MDk2Owo+ICsJ b2JqZWN0Lm9mZnNldCA9IGdlbjhfY2Fub25pY2FsX2FkZHIob2JqZWN0Lm9mZnNldCk7Cj4gKwlp Z3RfYXNzZXJ0X2VxKF9fZ2VtX2V4ZWNidWYoZmQsICZleGVjYnVmKSwgLUVJTlZBTCk7Cj4gKwo+ ICsJLyogQ2hlY2sgZ2VuOCBjYW5vbmljYWwgYWRkcmVzc2luZyAqLwo+ICsJaWYgKGdlbV9hcGVy dHVyZV9zaXplKGZkKSA+IDF1bGw8PEdFTjhfSElHSF9BRERSRVNTX0JJVCkgewo+ICsJCW9iamVj dC5vZmZzZXQgPSAxdWxsIDw8IEdFTjhfSElHSF9BRERSRVNTX0JJVDsKPiArCQlpZ3RfYXNzZXJ0 X2VxKF9fZ2VtX2V4ZWNidWYoZmQsICZleGVjYnVmKSwgLUVJTlZBTCk7Cj4gKwo+ICsJCW9iamVj dC5vZmZzZXQgPSBnZW44X2Nhbm9uaWNhbF9hZGRyKG9iamVjdC5vZmZzZXQpOwo+ICsJCWlndF9h c3NlcnRfZXEoX19nZW1fZXhlY2J1ZihmZCwgJmV4ZWNidWYpLCAwKTsKPiAgCX0KPiAgCj4gLQly ZXR1cm4gKGkgKiBzaXplb2YodWludDMyX3QpKTsKPiAtfQo+ICsJLyogQ2hlY2sgZXh0ZW5kZWQg cmFuZ2UgKi8KPiArCWlmIChnZW1fYXBlcnR1cmVfc2l6ZShmZCkgPiAxdWxsPDwzMikgewo+ICsJ CW9iamVjdC5mbGFncyA9IEVYRUNfT0JKRUNUX1BJTk5FRDsKPiArCQlvYmplY3Qub2Zmc2V0ID0g MXVsbDw8MzI7Cj4gKwkJaWd0X2Fzc2VydF9lcShfX2dlbV9leGVjYnVmKGZkLCAmZXhlY2J1Ziks IC1FSU5WQUwpOwo+ICAKPiAtLyogc2V0dXBfZXhlY2J1ZmZlcgo+IC0gKiBoZWxwZXIgZm9yIGJ1 ZmZlciBleGVjdXRpb24KPiAtICogQGV4ZWNidWYgLSBwb2ludGVyIHRvIGV4ZWNidWZmZXIKPiAt ICogQGV4ZWNfb2JqZWN0IC0gcG9pbnRlciB0byBleGVjIG9iamVjdDIgc3RydWN0Cj4gLSAqIEBy aW5nIC0gcmluZyB0byBiZSB1c2VkCj4gLSAqIEBidWZmZXJfY291bnQgLSBob3cgbWFudSBidWZm ZXJzIHRvIHN1Ym1pdAo+IC0gKiBAYmF0Y2hfbGVuZ3RoIC0gbGVuZ3RoIG9mIGJhdGNoIGJ1ZmZl ciAtKi8gLXN0YXRpYyB2b2lkIHNldHVwX2V4ZWNidWZmZXIoc3RydWN0IGRybV9pOTE1X2dlbV9l eGVjYnVmZmVyMiAqZXhlY2J1ZiwKPiAtCQkJICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNf b2JqZWN0MiAqZXhlY19vYmplY3QsCj4gLQkJCSAgICAgaW50IHJpbmcsIGludCBidWZmZXJfY291 bnQsIGludCBiYXRjaF9sZW5ndGgpCj4gLXsKPiAtCWV4ZWNidWYtPmJ1ZmZlcnNfcHRyID0gKHVu c2lnbmVkIGxvbmcpZXhlY19vYmplY3Q7Cj4gLQlleGVjYnVmLT5idWZmZXJfY291bnQgPSBidWZm ZXJfY291bnQ7Cj4gLQlleGVjYnVmLT5iYXRjaF9zdGFydF9vZmZzZXQgPSAwOwo+IC0JZXhlY2J1 Zi0+YmF0Y2hfbGVuID0gYmF0Y2hfbGVuZ3RoOwo+IC0JZXhlY2J1Zi0+Y2xpcHJlY3RzX3B0ciA9 IDA7Cj4gLQlleGVjYnVmLT5udW1fY2xpcHJlY3RzID0gMDsKPiAtCWV4ZWNidWYtPkRSMSA9IDA7 Cj4gLQlleGVjYnVmLT5EUjQgPSAwOwo+IC0JZXhlY2J1Zi0+ZmxhZ3MgPSByaW5nOwo+IC0JaTkx NV9leGVjYnVmZmVyMl9zZXRfY29udGV4dF9pZCgqZXhlY2J1ZiwgMCk7Cj4gLQlleGVjYnVmLT5y c3ZkMiA9IDA7Cj4gLX0KPiAtCj4gLS8qIHN1Ym1pdF9hbmRfc3luYwo+IC0gKiBIZWxwZXIgZnVu Y3Rpb24gZm9yIGV4ZWMgYW5kIHN5bmMgZnVuY3Rpb25zCj4gLSAqIEBmZCAtIGRybSBmZAo+IC0g KiBAZXhlY2J1ZiAtIHBvaW50ZXIgdG8gZXhlY2J1ZmZlcgo+IC0gKiBAYmF0Y2hfYnVmX2hhbmRs ZSAtIGJhdGNoIGJ1ZmZlciBoYW5kbGUgLSovIC1zdGF0aWMgdm9pZCBzdWJtaXRfYW5kX3N5bmMo aW50IGZkLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyICpleGVjYnVmLAo+IC0JCQkg ICAgdWludDMyX3QgYmF0Y2hfYnVmX2hhbmRsZSkKPiAtewo+IC0JZ2VtX2V4ZWNidWYoZmQsIGV4 ZWNidWYpOwo+IC0JZ2VtX3N5bmMoZmQsIGJhdGNoX2J1Zl9oYW5kbGUpOwo+IC19Cj4gLQo+IC0v KiBnZW1fdXNlcnB0cl9zeW5jCj4gLSAqIGhlbHBlciBmb3Igc3luY2luZyB0byBDUFUgZG9tYWlu IC0gY29weS9wYXN0ZSBmcm9tIHVzZXJibGl0Cj4gLSAqIEBmZCAtIGRybSBmZAo+IC0gKiBAaGFu ZGxlIC0gYnVmZmVyIGhhbmRsZSB0byBzeW5jCj4gLSovCj4gLXN0YXRpYyB2b2lkIGdlbV91c2Vy cHRyX3N5bmMoaW50IGZkLCB1aW50MzJfdCBoYW5kbGUpIC17Cj4gLQlnZW1fc2V0X2RvbWFpbihm ZCwgaGFuZGxlLCBJOTE1X0dFTV9ET01BSU5fQ1BVLCBJOTE1X0dFTV9ET01BSU5fQ1BVKTsKPiAt fQo+IC0KPiAtCj4gLS8qIGdlbV9waW5fdXNlcnB0cl90ZXN0Cj4gLSAqIFRoaXMgdGVzdCB3aWxs IGNyZWF0ZSBhIHNoYXJlZCBidWZmZXIsIGFuZCBjcmVhdGUgYSBjb21tYW5kCj4gLSAqIGZvciBH UFUgdG8gd3JpdGUgZGF0YSBpbiBpdAo+IC0gKiBDUFUgd2lsbCByZWFkIGFuZCBtYWtlIHN1cmUg ZXhwZWN0ZWQgdmFsdWUgaXMgb2J0YWluZWQKPiAtICogTWFsbG9jIGEgNEsgYnVmZmVyCj4gLSAq IFNoYXJlIGJ1ZmZlciB3aXRoIHdpdGggR1BVIGJ5IHVzaW5nIHVzZXJwdHIgaW9jdGwKPiAtICog Q3JlYXRlIGJhdGNoIGJ1ZmZlciB0byB3cml0ZSBEQVRBIHRvIGZpcnN0IGR3b3JkIG9mIGJ1ZmZl cgo+IC0gKiBVc2UgMHgxMDAwIGFkZHJlc3MgYXMgZGVzdGluYXRpb24gYWRkcmVzcyBpbiBiYXRj aCBidWZmZXIKPiAtICogU2V0IEVYRUNfT0JKRUNUX1BJTk5FRCBmbGFnIGluIGV4ZWMgb2JqZWN0 Cj4gLSAqIFNldCAnb2Zmc2V0JyBpbiBleGVjIG9iamVjdCB0byAweDEwMDAKPiAtICogU3VibWl0 IGV4ZWNidWZmZXIKPiAtICogVmVyaWZ5IHZhbHVlIG9mIGZpcnN0IERXT1JEIGluIHNoYXJlZCBi dWZmZXIgbWF0Y2hlcyBEQVRBIC0qLyAtc3RhdGljIHZvaWQgZ2VtX3Bpbl91c2VycHRyX3Rlc3Qo dm9pZCkgLXsKPiAtCWk5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKPiAtCWludCBmZDsKPiAtCXVp bnQzMl90ICpzaGFyZWRfYnVmZmVyOwo+IC0Jc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVy MiBleGVjYnVmOwo+IC0Jc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgZXhlY19vYmpl Y3QyWzJdOwo+IC0JdWludDMyX3QgYmF0Y2hfYnVmZmVyW1NUT1JFX0JBVENIX0JVRkZFUl9TSVpF ICsgMl07Cj4gLQl1aW50MzJfdCBiYXRjaF9idWZfaGFuZGxlLCBzaGFyZWRfYnVmX2hhbmRsZTsK PiAtCWludCByaW5nLCBsZW47Cj4gLQljb25zdCB1aW50MzJfdCBkYXRhID0gMHgxMjM0NTY3ODsK PiAtCXVpbnQ2NF90IHBpbm5pbmdfb2Zmc2V0ID0gMHgxMDAwOwo+IC0KPiAtCWZkID0gZHJtX29w ZW5fZHJpdmVyKERSSVZFUl9JTlRFTCk7Cj4gLQlpZ3RfcmVxdWlyZSh1c2VzX2Z1bGxfcHBndHQo ZmQsIEFMSUFTSU5HX1BQR1RUKSk7Cj4gLQlpZ3RfcmVxdWlyZShoYXNfc29mdHBpbl9zdXBwb3J0 KGZkKSk7Cj4gLQliYXRjaF9idWZfaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgQk9fU0laRSk7Cj4g LQo+IC0JLyogY3JlYXRlIGNwdSBidWZmZXIgKi8KPiAtCXNoYXJlZF9idWZmZXIgPSBjcmVhdGVf bWVtX2J1ZmZlcihCT19TSVpFKTsKPiAtCj4gLQkvKiBzaGFyZSB3aXRoIEdQVSAqLwo+IC0Jc2hh cmVkX2J1Zl9oYW5kbGUgPSBpbml0X3VzZXJwdHIoZmQsICZ1c2VycHRyLCBzaGFyZWRfYnVmZmVy LAo+IC0JCQkJCSBCT19TSVpFKTsKPiAtCj4gLQkvKiBjcmVhdGUgY29tbWFuZCBidWZmZXIgd2l0 aCB3cml0ZSBjb21tYW5kICovCj4gLQlsZW4gPSBnZW1fc3RvcmVfZGF0YV9zdm0oZmQsIGJhdGNo X2J1ZmZlciwgcGlubmluZ19vZmZzZXQsIGRhdGEsIHRydWUpOwo+IC0JZ2VtX3dyaXRlKGZkLCBi YXRjaF9idWZfaGFuZGxlLCAwLCBiYXRjaF9idWZmZXIsIGxlbik7Cj4gLQo+IC0JLyogc3VibWl0 IGNvbW1hbmQgYnVmZmVyICovCj4gLQlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzBdLCBz aGFyZWRfYnVmX2hhbmRsZSwKPiAtCQkgICAgICAgRVhFQ19PQkpFQ1RfUElOTkVELCBwaW5uaW5n X29mZnNldCk7Cj4gLQlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzFdLCBiYXRjaF9idWZf aGFuZGxlLCAwLCAwKTsKPiAtCj4gLQlyaW5nID0gSTkxNV9FWEVDX1JFTkRFUjsKPiAtCj4gLQlz ZXR1cF9leGVjYnVmZmVyKCZleGVjYnVmLCBleGVjX29iamVjdDIsIHJpbmcsIDIsIGxlbik7Cj4g LQlzdWJtaXRfYW5kX3N5bmMoZmQsICZleGVjYnVmLCBiYXRjaF9idWZfaGFuZGxlKTsKPiAtCWdl bV91c2VycHRyX3N5bmMoZmQsIHNoYXJlZF9idWZfaGFuZGxlKTsKPiAtCj4gLQkvKiBDaGVjayBp ZiBkcml2ZXIgcGlubmVkIHRoZSBidWZmZXIgYXMgcmVxdWVzdGVkICovCj4gLQlpZ3RfZmFpbF9v bl9mKGV4ZWNfb2JqZWN0MlswXS5vZmZzZXQgIT0gcGlubmluZ19vZmZzZXQsCj4gLQkJCSJcbkZh aWxlZCB0byBwaW4gYXQgcmVxdWVzdGVkIG9mZnNldCIpOwo+IC0JLyogY2hlY2sgb24gQ1BVIHRv IHNlZSBpZiB2YWx1ZSBjaGFuZ2VzICovCj4gLQlpZ3RfZmFpbF9vbl9mKHNoYXJlZF9idWZmZXJb MF0gIT0gZGF0YSwKPiAtCQkgICAgICAiXG5DUFUgcmVhZCBkb2VzIG5vdCBtYXRjaCBHUFUgd3Jp dGUsXAo+IC0JCQlleHBlY3RlZDogMHgleCwgZ290OiAweCV4XG4iLAo+IC0JCQlkYXRhLCBzaGFy ZWRfYnVmZmVyWzBdKTsKPiAtCj4gLQlnZW1fY2xvc2UoZmQsIGJhdGNoX2J1Zl9oYW5kbGUpOwo+ IC0JZ2VtX2Nsb3NlKGZkLCBzaGFyZWRfYnVmX2hhbmRsZSk7Cj4gLQljbG9zZShmZCk7Cj4gLQlm cmVlKHNoYXJlZF9idWZmZXIpOwo+ICsJCW9iamVjdC5vZmZzZXQgPSBnZW44X2Nhbm9uaWNhbF9h ZGRyKG9iamVjdC5vZmZzZXQpOwo+ICsJCW9iamVjdC5mbGFncyB8PSBFWEVDX09CSkVDVF9TVVBQ T1JUU180OEJfQUREUkVTUzsKPiArCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2V4ZWNidWYoZmQsICZl eGVjYnVmKSwgMCk7Cj4gKwl9Cj4gIH0KPiAgCj4gLS8qIGdlbV9waW5fYm8KPiAtICogVGhpcyB0 ZXN0IHdpbGwgdGVzdCBzb2Z0cGlubmluZyBvZiBhIGdlbSBidWZmZXIgb2JqZWN0Cj4gLSAqIE1h bGxvYyBhIDRLIGJ1ZmZlcgo+IC0gKiBDcmVhdGUgYmF0Y2ggYnVmZmVyIHRvIHdyaXRlIERBVEEg dG8gZmlyc3QgZHdvcmQgb2YgYnVmZmVyCj4gLSAqIFVzZSAweDEwMDAgYWRkcmVzcyBhcyBkZXN0 aW5hdGlvbiBhZGRyZXNzIGluIGJhdGNoIGJ1ZmZlcgo+IC0gKiBTZXQgRVhFQ19PQkpFQ1RfUElO TkVEIGZsYWcgaW4gZXhlYyBvYmplY3QKPiAtICogU2V0ICdvZmZzZXQnIGluIGV4ZWMgb2JqZWN0 IHRvIDB4MTAwMAo+IC0gKiBTdWJtaXQgZXhlY2J1ZmZlcgo+IC0gKiBWZXJpZnkgdmFsdWUgcGlu bmVkIG9mZnNldCBtYXRjaGVzIHRoZSByZXF1ZXN0IC0qLyAtc3RhdGljIHZvaWQgZ2VtX3Bpbl9i b190ZXN0KHZvaWQpCj4gK3N0YXRpYyB2b2lkIHRlc3Rfc29mdHBpbihpbnQgZmQpCj4gIHsKPiAt CWludCBmZDsKPiArCWNvbnN0IHVpbnQzMl90IHNpemUgPSAxMDI0ICogMTAyNDsKPiArCWNvbnN0 IHVpbnQzMl90IGJiZSA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7Cj4gIAlzdHJ1Y3QgZHJtX2k5MTVf Z2VtX2V4ZWNidWZmZXIyIGV4ZWNidWY7Cj4gLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2Jq ZWN0MiBleGVjX29iamVjdDJbMl07Cj4gLQl1aW50MzJfdCBiYXRjaF9idWZmZXJbU1RPUkVfQkFU Q0hfQlVGRkVSX1NJWkUgKyAyXTsKPiAtCXVpbnQzMl90IGJhdGNoX2J1Zl9oYW5kbGUsIHVuc2hh cmVkX2J1Zl9oYW5kbGU7Cj4gLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRpb25fZW50cnkg cmVsb2NbNF07Cj4gLQlpbnQgcmluZywgbGVuOwo+IC0JdWludDMyX3QgdmFsdWU7Cj4gLQljb25z dCB1aW50MzJfdCBkYXRhID0gMHgxMjM0NTY3ODsKPiAtCXVpbnQ2NF90IHBpbm5pbmdfb2Zmc2V0 ID0gMHgxMDAwOwo+IC0KPiAtCWZkID0gZHJtX29wZW5fZHJpdmVyKERSSVZFUl9JTlRFTCk7Cj4g LQlpZ3RfcmVxdWlyZSh1c2VzX2Z1bGxfcHBndHQoZmQsIEFMSUFTSU5HX1BQR1RUKSk7Cj4gLQlp Z3RfcmVxdWlyZShoYXNfc29mdHBpbl9zdXBwb3J0KGZkKSk7Cj4gLQo+IC0JYmF0Y2hfYnVmX2hh bmRsZSA9IGdlbV9jcmVhdGUoZmQsIEJPX1NJWkUpOwo+IC0KPiAtCS8qIGNyZWF0ZSBnZW0gYnVm ZmVyICovCj4gLQl1bnNoYXJlZF9idWZfaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgQk9fU0laRSk7 Cj4gLQo+IC0JLyogY3JlYXRlIGNvbW1hbmQgYnVmZmVyIHdpdGggd3JpdGUgY29tbWFuZCAqLwo+ IC0JbGVuID0gZ2VtX3N0b3JlX2RhdGEoZmQsIGJhdGNoX2J1ZmZlciwgdW5zaGFyZWRfYnVmX2hh bmRsZSwgZGF0YSwKPiAtCQkJCXJlbG9jLCB0cnVlKTsKPiAtCWdlbV93cml0ZShmZCwgYmF0Y2hf YnVmX2hhbmRsZSwgMCwgYmF0Y2hfYnVmZmVyLCBsZW4pOwo+IC0KPiAtCS8qIHN1Ym1pdCBjb21t YW5kIGJ1ZmZlciAqLwo+IC0Jc2V0dXBfZXhlY19vYmooJmV4ZWNfb2JqZWN0MlswXSwgdW5zaGFy ZWRfYnVmX2hhbmRsZSwKPiAtCQkgICAgICAgRVhFQ19PQkpFQ1RfUElOTkVELCBwaW5uaW5nX29m ZnNldCk7Cj4gLQlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzFdLCBiYXRjaF9idWZfaGFu ZGxlLCAwLCAwKTsKPiAtCWV4ZWNfb2JqZWN0MlsxXS5yZWxvY2F0aW9uX2NvdW50ID0gMTsKPiAt CWV4ZWNfb2JqZWN0MlsxXS5yZWxvY3NfcHRyID0gKHVuc2lnbmVkIGxvbmcpcmVsb2M7Cj4gLQo+ IC0JcmluZyA9IEk5MTVfRVhFQ19SRU5ERVI7Cj4gLQo+IC0Jc2V0dXBfZXhlY2J1ZmZlcigmZXhl Y2J1ZiwgZXhlY19vYmplY3QyLCByaW5nLCAyLCBsZW4pOwo+IC0Jc3VibWl0X2FuZF9zeW5jKGZk LCAmZXhlY2J1ZiwgYmF0Y2hfYnVmX2hhbmRsZSk7Cj4gLQo+IC0JLyogQ2hlY2sgaWYgZHJpdmVy IHBpbm5lZCB0aGUgYnVmZmVyIGFzIHJlcXVlc3RlZCAqLwo+IC0JaWd0X2ZhaWxfb25fZihleGVj X29iamVjdDJbMF0ub2Zmc2V0ICE9IHBpbm5pbmdfb2Zmc2V0LAo+IC0JCQkiXG5GYWlsZWQgdG8g cGluIGF0IHJlcXVlc3RlZCBvZmZzZXQiKTsKPiAtCWdlbV9yZWFkKGZkLCB1bnNoYXJlZF9idWZf aGFuZGxlLCAwLCAodm9pZCopJnZhbHVlLCA0KTsKPiAtCWlndF9hc3NlcnQodmFsdWUgPT0gZGF0 YSk7Cj4gLQo+IC0JZ2VtX2Nsb3NlKGZkLCBiYXRjaF9idWZfaGFuZGxlKTsKPiAtCWdlbV9jbG9z ZShmZCwgdW5zaGFyZWRfYnVmX2hhbmRsZSk7Cj4gLQljbG9zZShmZCk7Cj4gLX0KPiAtCj4gLQo+ IC0vKiBnZW1fbXVsdGlwbGVfcHJvY2Vzc190ZXN0Cj4gLSAqIFJ1biBiYXNpYyB0ZXN0IHNpbXVs dGFuZW91c2x5IHdpdGggbXVsdGlwbGUgcHJvY2Vzc2VzCj4gLSAqIFRoaXMgd2lsbCB0ZXN0IHBp bm5pbmcgc2FtZSBWQSBzZXBhcmF0ZWx5IGluIGVhY2ggcHJvY2Vzcwo+IC0KPiAtICogZm9yaygp Owo+IC0gKiBFeGVjdXRlIGJhc2ljIHRlc3QgaW4gcGFyZW50L2NoaWxkIHByb2Nlc3NlcyAtKi8g LSNkZWZpbmUgTUFYX05VTV9QUk9DRVNTRVMgMTAKPiAtCj4gLXN0YXRpYyB2b2lkIGdlbV9tdWx0 aXBsZV9wcm9jZXNzX3Rlc3Qodm9pZCkgLXsKPiAtCWludCBmZDsKPiAtCj4gLQlmZCA9IGRybV9v cGVuX2RyaXZlcihEUklWRVJfSU5URUwpOwo+IC0JaWd0X3JlcXVpcmUodXNlc19mdWxsX3BwZ3R0 KGZkLCBBTElBU0lOR19QUEdUVCkpOwo+IC0JaWd0X3JlcXVpcmUoaGFzX3NvZnRwaW5fc3VwcG9y dChmZCkpOwo+ICsJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgb2JqZWN0Owo+ICsJ dWludDY0X3Qgb2Zmc2V0LCBlbmQ7Cj4gKwlpbnQgbG9vcDsKPiArCj4gKwltZW1zZXQoJmV4ZWNi dWYsIDAsIHNpemVvZihleGVjYnVmKSk7Cj4gKwlleGVjYnVmLmJ1ZmZlcnNfcHRyID0gKHVuc2ln bmVkIGxvbmcpJm9iamVjdDsKPiArCWV4ZWNidWYuYnVmZmVyX2NvdW50ID0gMTsKPiArCWZvciAo bG9vcCA9IDA7IGxvb3AgPCAxMDI0OyBsb29wKyspIHsKPiArCQltZW1zZXQoJm9iamVjdCwgMCwg c2l6ZW9mKG9iamVjdCkpOwo+ICsJCW9iamVjdC5oYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCAyKnNp emUpOwo+ICsJCWdlbV93cml0ZShmZCwgb2JqZWN0LmhhbmRsZSwgMCwgJmJiZSwgc2l6ZW9mKGJi ZSkpOwo+ICsKPiArCQkvKiBGaW5kIGEgaG9sZSAqLwo+ICsJCWdlbV9leGVjYnVmKGZkLCAmZXhl Y2J1Zik7Cj4gKwkJZ2VtX2Nsb3NlKGZkLCBvYmplY3QuaGFuZGxlKTsKPiArCj4gKwkJaWd0X2Rl YnVnKCJNYWRlIGEgMiBNaUIgaG9sZTogJTA4bGx4XG4iLAo+ICsJCQkgIG9iamVjdC5vZmZzZXQp Owo+ICsKPiArCQlvYmplY3QuaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgc2l6ZSk7Cj4gKwkJZ2Vt X3dyaXRlKGZkLCBvYmplY3QuaGFuZGxlLCAwLCAmYmJlLCBzaXplb2YoYmJlKSk7Cj4gKwkJb2Jq ZWN0LmZsYWdzIHw9IEVYRUNfT0JKRUNUX1BJTk5FRDsKPiArCj4gKwkJZW5kID0gb2JqZWN0Lm9m ZnNldCArIHNpemU7Cj4gKwkJZm9yIChvZmZzZXQgPSBvYmplY3Qub2Zmc2V0OyBvZmZzZXQgPD0g ZW5kOyBvZmZzZXQgKz0gNDA5Nikgewo+ICsJCQlvYmplY3Qub2Zmc2V0ID0gb2Zmc2V0Owo+ICsJ CQlnZW1fZXhlY2J1ZihmZCwgJmV4ZWNidWYpOwo+ICsJCQlpZ3RfYXNzZXJ0X2VxX3U2NChvYmpl Y3Qub2Zmc2V0LCBvZmZzZXQpOwo+ICsJCX0KPiAgCj4gLQlpZ3RfZm9yayhjaGlsZCwgTUFYX05V TV9QUk9DRVNTRVMpIHsKPiAtCQlnZW1fcGluX3VzZXJwdHJfdGVzdCgpOwo+ICsJCWdlbV9jbG9z ZShmZCwgb2JqZWN0LmhhbmRsZSk7Cj4gIAl9Cj4gLQlpZ3Rfd2FpdGNoaWxkcmVuKCk7Cj4gLQo+ IC0JY2xvc2UoZmQpOwo+IC19Cj4gLQo+IC0KPiAtLyogZ2VtX3JlcGluX3Rlc3QKPiAtICogVGhp cyB0ZXN0IHRyaWVzIHRvIHJlcGluIGEgYnVmZmVyIGF0IGEgcHJldmlvdXNseSBwaW5uZWQgdm1h Cj4gLSAqIGZyb20gYSBkaWZmZXJlbnQgZXhlY2J1Zi4KPiAtICogTWFsbG9jIGEgNEsgYnVmZmVy Cj4gLSAqIFNoYXJlIGJ1ZmZlciB3aXRoIHdpdGggR1BVIGJ5IHVzaW5nIHVzZXJwdHIgaW9jdGwK PiAtICogQ3JlYXRlIGJhdGNoIGJ1ZmZlciB0byB3cml0ZSBEQVRBIHRvIGZpcnN0IGR3b3JkIG9m IGJ1ZmZlcgo+IC0gKiBVc2UgMHgxMDAwIGFkZHJlc3MgYXMgZGVzdGluYXRpb24gYWRkcmVzcyBp biBiYXRjaCBidWZmZXIKPiAtICogU2V0IEVYRUNfT0JKRUNUX1BJTk5FRCBmbGFnIGluIGV4ZWMg b2JqZWN0Cj4gLSAqIFNldCAnb2Zmc2V0JyBpbiBleGVjIG9iamVjdCB0byAweDEwMDAgVk1BCj4g LSAqIFN1Ym1pdCBleGVjYnVmZmVyCj4gLSAqIFZlcmlmeSB2YWx1ZSBvZiBmaXJzdCBEV09SRCBp biBzaGFyZWQgYnVmZmVyIG1hdGNoZXMgREFUQQo+IC0KPiAtICogQ3JlYXRlIHNlY29uZCBzaGFy ZWQgYnVmZmVyCj4gLSAqIEZvbGxvdyBhbGwgc3RlcHMgYWJvdmUKPiAtICogRXhlY3B0LCBmb3Ig b2Zmc2V0LCB1c2UgVk1BIG9mIGZpcnN0IGJ1ZmZlciBhYm92ZQo+IC0gKiBTdWJtaXQgZXhlY2J1 ZmZlcgo+IC0gKiBWZXJpZnkgdmFsdWUgb2YgZmlyc3QgRFdPUkQgaW4gc2Vjb25kIHNoYXJlZCBi dWZmZXIgbWF0Y2hlcyBEQVRBIC0qLyAtc3RhdGljIHZvaWQgZ2VtX3JlcGluX3Rlc3Qodm9pZCkg LXsKPiAtCWk5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKPiAtCWk5MTVfZ2VtX3VzZXJwdHIgdXNl cnB0cjE7Cj4gLQlpbnQgZmQ7Cj4gLQl1aW50MzJfdCAqc2hhcmVkX2J1ZmZlcjsKPiAtCXVpbnQz Ml90ICpzaGFyZWRfYnVmZmVyMTsKPiAtCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIg ZXhlY2J1ZjsKPiAtCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIGV4ZWNfb2JqZWN0 MlsyXTsKPiAtCXVpbnQzMl90IGJhdGNoX2J1ZmZlcltTVE9SRV9CQVRDSF9CVUZGRVJfU0laRSAr IDJdOwo+IC0JdWludDMyX3QgYmF0Y2hfYnVmX2hhbmRsZSwgc2hhcmVkX2J1Zl9oYW5kbGUsIHNo YXJlZF9idWZfaGFuZGxlMTsKPiAtCWludCByaW5nLCBsZW47Cj4gLQljb25zdCB1aW50MzJfdCBk YXRhID0gMHgxMjM0NTY3ODsKPiAtCXVpbnQ2NF90IHBpbm5pbmdfb2Zmc2V0ID0gMHgxMDAwOwo+ IC0KPiAtCS8qIENyZWF0ZSBnZW0gb2JqZWN0ICovCj4gLQlmZCA9IGRybV9vcGVuX2RyaXZlcihE UklWRVJfSU5URUwpOwo+IC0JaWd0X3JlcXVpcmUodXNlc19mdWxsX3BwZ3R0KGZkLCBBTElBU0lO R19QUEdUVCkpOwo+IC0JaWd0X3JlcXVpcmUoaGFzX3NvZnRwaW5fc3VwcG9ydChmZCkpOwo+IC0K PiAtCWJhdGNoX2J1Zl9oYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCBCT19TSVpFKTsKPiAtCj4gLQkv KiBjcmVhdGUgY3B1IGJ1ZmZlciwgc2V0IGZpcnN0IGVsZW1lbnRzIHRvIDB4MCAqLwo+IC0Jc2hh cmVkX2J1ZmZlciA9IGNyZWF0ZV9tZW1fYnVmZmVyKEJPX1NJWkUpOwo+IC0Jc2hhcmVkX2J1ZmZl cjEgPSBjcmVhdGVfbWVtX2J1ZmZlcihCT19TSVpFKTsKPiAtCXNoYXJlZF9idWZmZXJbMF0gPSAw eDA7Cj4gLQlzaGFyZWRfYnVmZmVyMVswXSA9IDB4MDsKPiAtCj4gLQkvKiBzaGFyZSB3aXRoIEdQ VSBhbmQgZ2V0IGhhbmRsZXMgKi8KPiAtCXNoYXJlZF9idWZfaGFuZGxlID0gaW5pdF91c2VycHRy KGZkLCAmdXNlcnB0ciwgc2hhcmVkX2J1ZmZlciwKPiAtCQkJCQkgQk9fU0laRSk7Cj4gLQlzaGFy ZWRfYnVmX2hhbmRsZTEgPSBpbml0X3VzZXJwdHIoZmQsICZ1c2VycHRyMSwgc2hhcmVkX2J1ZmZl cjEsCj4gLQkJCQkJICBCT19TSVpFKTsKPiAtCj4gLQkvKiBjcmVhdGUgY29tbWFuZCBidWZmZXIg d2l0aCB3cml0ZSBjb21tYW5kICovCj4gLQlsZW4gPSBnZW1fc3RvcmVfZGF0YV9zdm0oZmQsIGJh dGNoX2J1ZmZlciwgcGlubmluZ19vZmZzZXQsIGRhdGEsIHRydWUpOwo+IC0JZ2VtX3dyaXRlKGZk LCBiYXRjaF9idWZfaGFuZGxlLCAwLCBiYXRjaF9idWZmZXIsIGxlbik7Cj4gLQo+IC0JLyogc3Vi bWl0IGNvbW1hbmQgYnVmZmVyICovCj4gLQlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzBd LCBzaGFyZWRfYnVmX2hhbmRsZSwKPiAtCQkgICAgICAgRVhFQ19PQkpFQ1RfUElOTkVELCBwaW5u aW5nX29mZnNldCk7Cj4gLQlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzFdLCBiYXRjaF9i dWZfaGFuZGxlLCAwLCAwKTsKPiAtCj4gLQlyaW5nID0gSTkxNV9FWEVDX1JFTkRFUjsKPiAtCj4g LQlzZXR1cF9leGVjYnVmZmVyKCZleGVjYnVmLCBleGVjX29iamVjdDIsIHJpbmcsIDIsIGxlbik7 Cj4gLQlzdWJtaXRfYW5kX3N5bmMoZmQsICZleGVjYnVmLCBiYXRjaF9idWZfaGFuZGxlKTsKPiAt CWdlbV91c2VycHRyX3N5bmMoZmQsIHNoYXJlZF9idWZfaGFuZGxlKTsKPiAtCj4gLQlpZ3RfYXNz ZXJ0KGV4ZWNfb2JqZWN0MlswXS5vZmZzZXQgPT0gcGlubmluZ19vZmZzZXQpOwo+IC0JaWd0X2Fz c2VydCgqc2hhcmVkX2J1ZmZlciA9PSBkYXRhKTsKPiAtCj4gLQkvKiBTZWNvbmQgYnVmZmVyICov Cj4gLQkvKiBjcmVhdGUgY29tbWFuZCBidWZmZXIgd2l0aCB3cml0ZSBjb21tYW5kICovCj4gLQlw aW5uaW5nX29mZnNldCA9IGV4ZWNfb2JqZWN0MlswXS5vZmZzZXQ7Cj4gLQlsZW4gPSBnZW1fc3Rv cmVfZGF0YV9zdm0oZmQsIGJhdGNoX2J1ZmZlciwgcGlubmluZ19vZmZzZXQsIGRhdGEsIHRydWUp Owo+IC0JZ2VtX3dyaXRlKGZkLCBiYXRjaF9idWZfaGFuZGxlLCAwLCBiYXRjaF9idWZmZXIsIGxl bik7Cj4gLQo+IC0JLyogc3VibWl0IGNvbW1hbmQgYnVmZmVyICovCj4gLQkvKiBQaW4gYXQgc2hh cmVkX2J1ZmZlciwgbm90IHNoYXJlZF9idWZmZXIxICovCj4gLQkvKiBXZSBhcmUgcmVxdWVzdGlu ZyBhZGRyZXNzIHdoZXJlIGFub3RoZXIgYnVmZmVyIHdhcyBwaW5uZWQgcHJldmlvdXNseSAqLwo+ IC0Jc2V0dXBfZXhlY19vYmooJmV4ZWNfb2JqZWN0MlswXSwgc2hhcmVkX2J1Zl9oYW5kbGUxLAo+ IC0JCSAgICAgICBFWEVDX09CSkVDVF9QSU5ORUQsIHBpbm5pbmdfb2Zmc2V0KTsKPiAtCXNldHVw X2V4ZWNfb2JqKCZleGVjX29iamVjdDJbMV0sIGJhdGNoX2J1Zl9oYW5kbGUsIDAsIDApOwo+IC0K PiAtCXJpbmcgPSBJOTE1X0VYRUNfUkVOREVSOwo+IC0KPiAtCXNldHVwX2V4ZWNidWZmZXIoJmV4 ZWNidWYsIGV4ZWNfb2JqZWN0MiwgcmluZywgMiwgbGVuKTsKPiAtCXN1Ym1pdF9hbmRfc3luYyhm ZCwgJmV4ZWNidWYsIGJhdGNoX2J1Zl9oYW5kbGUpOwo+IC0JZ2VtX3VzZXJwdHJfc3luYyhmZCwg c2hhcmVkX2J1Zl9oYW5kbGUxKTsKPiAtCj4gLQlpZ3RfYXNzZXJ0KGV4ZWNfb2JqZWN0MlswXS5v ZmZzZXQgPT0gcGlubmluZ19vZmZzZXQpOwo+IC0JaWd0X2Fzc2VydCgqc2hhcmVkX2J1ZmZlcjEg PT0gZGF0YSk7Cj4gLQo+IC0JZ2VtX2Nsb3NlKGZkLCBiYXRjaF9idWZfaGFuZGxlKTsKPiAtCWdl bV9jbG9zZShmZCwgc2hhcmVkX2J1Zl9oYW5kbGUpOwo+IC0JY2xvc2UoZmQpOwo+IC0KPiAtCWZy ZWUoc2hhcmVkX2J1ZmZlcik7Cj4gLQlmcmVlKHNoYXJlZF9idWZmZXIxKTsKPiAgfQo+ICAKPiAt Cj4gLS8qIGdlbV9yZXBpbl9vdmVybGFwX3Rlc3QKPiAtICogVGhpcyB0ZXN0IHdpbGwgYXR0ZW1w dCB0byBwaW4gdHdvIGJ1ZmZlcnMgYXQgdGhlIHNhbWUgVk1BIGFzIHBhcnQgb2YgdGhlIHNhbWUK PiAtICAgZXhlY2J1ZmZlciBvYmplY3QKPiAtCj4gLSAqIE1hbGxvYyBhIDRLIGJ1ZmZlcgo+IC0g KiBTaGFyZSBidWZmZXIgd2l0aCB3aXRoIEdQVSBieSB1c2luZyB1c2VycHRyIGlvY3RsCj4gLSAq IENyZWF0ZSBzZWNvbmQgc2hhcmVkIGJ1ZmZlcgo+IC0gKiBDcmVhdGUgYmF0Y2ggYnVmZmVyIHRv IHdyaXRlIERBVEEgdG8gZmlyc3QgZHdvcmQgb2YgZWFjaCBidWZmZXIKPiAtICogVXNlIHNhbWUg dmlydHVhbCBhZGRyZXNzIGFzIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBpbiBiYXRjaCBidWZmZXIK PiAtICogU2V0IEVYRUNfT0JKRUNUX1BJTk5FRCBmbGFnIGluIGJvdGggZXhlYyBvYmplY3RzCj4g LSAqIFNldCAnb2Zmc2V0JyBpbiBib3RoIGV4ZWMgb2JqZWN0cyB0byBzYW1lIFZNQQo+IC0gKiBT dWJtaXQgZXhlY2J1ZmZlcgo+IC0gKiBDb21tYW5kIHNob3VsZCByZXR1cm4gRUlOVkFMLCBzaW5j ZSB3ZSBhcmUgdHJ5aW5nIHRvIHBpbiB0byBzYW1lIFZNQSAtKi8gLXN0YXRpYyB2b2lkIGdlbV9w aW5fb3ZlcmxhcF90ZXN0KHZvaWQpCj4gK3N0YXRpYyB2b2lkIHRlc3Rfb3ZlcmxhcChpbnQgZmQp Cj4gIHsKPiAtCWk5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKPiAtCWk5MTVfZ2VtX3VzZXJwdHIg dXNlcnB0cjE7Cj4gLQlpbnQgZmQsIHJldDsKPiAtCXVpbnQzMl90ICpzaGFyZWRfYnVmZmVyOwo+ IC0JdWludDMyX3QgKnNoYXJlZF9idWZmZXIxOwo+ICsJY29uc3QgdWludDMyX3Qgc2l6ZSA9IDEw MjQgKiAxMDI0Owo+ICsJY29uc3QgdWludDMyX3QgYmJlID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsK PiAgCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZXhlY2J1ZjsKPiAtCXN0cnVjdCBk cm1faTkxNV9nZW1fZXhlY19vYmplY3QyIGV4ZWNfb2JqZWN0MlszXTsKPiAtCXVpbnQzMl90IHNo YXJlZF9idWZfaGFuZGxlLCBzaGFyZWRfYnVmX2hhbmRsZTE7Cj4gLQlpbnQgcmluZywgbGVuOwo+ IC0JdWludDY0X3QgcGlubmluZ19vZmZzZXQgPSAweDEwMDA7Cj4gLQo+IC0JZmQgPSBkcm1fb3Bl bl9kcml2ZXIoRFJJVkVSX0lOVEVMKTsKPiAtCWlndF9yZXF1aXJlKHVzZXNfZnVsbF9wcGd0dChm ZCwgQUxJQVNJTkdfUFBHVFQpKTsKPiAtCWlndF9yZXF1aXJlKGhhc19zb2Z0cGluX3N1cHBvcnQo ZmQpKTsKPiAtCj4gLQlzaGFyZWRfYnVmZmVyID0gY3JlYXRlX21lbV9idWZmZXIoQk9fU0laRSk7 Cj4gLQlzaGFyZWRfYnVmZmVyMSA9IGNyZWF0ZV9tZW1fYnVmZmVyKEJPX1NJWkUgKiAyKTsKPiAt Cj4gLQkvKiBzaGFyZSB3aXRoIEdQVSAqLwo+IC0Jc2hhcmVkX2J1Zl9oYW5kbGUgPSBpbml0X3Vz ZXJwdHIoZmQsICZ1c2VycHRyLCBzaGFyZWRfYnVmZmVyLAo+IC0JCQkJCSBCT19TSVpFKTsKPiAt CXNoYXJlZF9idWZfaGFuZGxlMSA9IGluaXRfdXNlcnB0cihmZCwgJnVzZXJwdHIxLCBzaGFyZWRf YnVmZmVyMSwKPiAtCQkJCQkgIEJPX1NJWkUgKiAyKTsKPiAtCj4gLQkvKiBzdWJtaXQgY29tbWFu ZCBidWZmZXIgKi8KPiAtCXNldHVwX2V4ZWNfb2JqKCZleGVjX29iamVjdDJbMF0sIHNoYXJlZF9i dWZfaGFuZGxlLAo+IC0JCSAgICAgICBFWEVDX09CSkVDVF9QSU5ORUQsIHBpbm5pbmdfb2Zmc2V0 KTsKPiAtCXNldHVwX2V4ZWNfb2JqKCZleGVjX29iamVjdDJbMV0sIHNoYXJlZF9idWZfaGFuZGxl MSwKPiAtCQkgICAgICAgRVhFQ19PQkpFQ1RfUElOTkVELCBwaW5uaW5nX29mZnNldCk7Cj4gLQo+ IC0JcmluZyA9IEk5MTVfRVhFQ19SRU5ERVI7Cj4gLQo+IC0Jc2V0dXBfZXhlY2J1ZmZlcigmZXhl Y2J1ZiwgZXhlY19vYmplY3QyLCByaW5nLCAyLCBsZW4pOwo+IC0KPiAtCXJldCA9IGRybUlvY3Rs KGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKTsKPiAtCj4gLQkv KiBleHBlY3QgdG8gZmFpbCAqLwo+IC0JaWd0X2Fzc2VydF9uZXEocmV0LCAwKTsKPiAtCWlndF9h c3NlcnQoZXJybm8gPT0gRUlOVkFMKTsKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmpl Y3QyIG9iamVjdFsyXTsKPiArCXVpbnQ2NF90IG9mZnNldDsKPiArCXVpbnQzMl90IGhhbmRsZTsK PiArCj4gKwloYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCAzKnNpemUpOwo+ICsJZ2VtX3dyaXRlKGZk LCBoYW5kbGUsIDAsICZiYmUsIHNpemVvZihiYmUpKTsKPiArCj4gKwltZW1zZXQob2JqZWN0LCAw LCBzaXplb2Yob2JqZWN0KSk7Cj4gKwlvYmplY3RbMF0uaGFuZGxlID0gaGFuZGxlOwo+ICsKPiAr CS8qIEZpbmQgYSBob2xlICovCj4gKwltZW1zZXQoJmV4ZWNidWYsIDAsIHNpemVvZihleGVjYnVm KSk7Cj4gKwlleGVjYnVmLmJ1ZmZlcnNfcHRyID0gKHVuc2lnbmVkIGxvbmcpb2JqZWN0Owo+ICsJ ZXhlY2J1Zi5idWZmZXJfY291bnQgPSAxOwo+ICsJZ2VtX2V4ZWNidWYoZmQsICZleGVjYnVmKTsK PiArCj4gKwlpZ3RfZGVidWcoIk1hZGUgYSAzeDEgTWlCIGhvbGU6ICUwOGxseFxuIiwKPiArCQkg IG9iamVjdFswXS5vZmZzZXQpOwo+ICsKPiArCW9iamVjdFswXS5oYW5kbGUgPSBnZW1fY3JlYXRl KGZkLCBzaXplKTsKPiArCW9iamVjdFswXS5vZmZzZXQgKz0gc2l6ZTsKPiArCW9iamVjdFswXS5m bGFncyB8PSBFWEVDX09CSkVDVF9QSU5ORUQ7Cj4gKwlvYmplY3RbMV0uaGFuZGxlID0gZ2VtX2Ny ZWF0ZShmZCwgc2l6ZSk7Cj4gKwlvYmplY3RbMV0uZmxhZ3MgfD0gRVhFQ19PQkpFQ1RfUElOTkVE Owo+ICsJZ2VtX3dyaXRlKGZkLCBvYmplY3RbMV0uaGFuZGxlLCAwLCAmYmJlLCBzaXplb2YoYmJl KSk7Cj4gKwlleGVjYnVmLmJ1ZmZlcl9jb3VudCA9IDI7Cj4gKwo+ICsJLyogQ2hlY2sgdGhhdCB3 ZSBmaXQgaW50byBvdXIgaG9sZSAqLwo+ICsJb2JqZWN0WzFdLm9mZnNldCA9IG9iamVjdFswXS5v ZmZzZXQgLSBzaXplOwo+ICsJZ2VtX2V4ZWNidWYoZmQsICZleGVjYnVmKTsKPiArCWlndF9hc3Nl cnRfZXFfdTY0KG9iamVjdFsxXS5vZmZzZXQgKyBzaXplLCBvYmplY3RbMF0ub2Zmc2V0KTsKPiAr Cj4gKwlvYmplY3RbMV0ub2Zmc2V0ID0gb2JqZWN0WzBdLm9mZnNldCArIHNpemU7Cj4gKwlnZW1f ZXhlY2J1ZihmZCwgJmV4ZWNidWYpOwo+ICsJaWd0X2Fzc2VydF9lcV91NjQob2JqZWN0WzFdLm9m ZnNldCAtIHNpemUsIG9iamVjdFswXS5vZmZzZXQpOwo+ICsKPiArCS8qIFRyeSBhbGwgcG9zc2li bGUgcGFnZS1hbGlnbmVkIG92ZXJsYXBzICovCj4gKwlmb3IgKG9mZnNldCA9IG9iamVjdFswXS5v ZmZzZXQgLSBzaXplICsgNDA5NjsKPiArCSAgICAgb2Zmc2V0IDwgb2JqZWN0WzBdLm9mZnNldCAr IHNpemU7Cj4gKwkgICAgIG9mZnNldCArPSA0MDk2KSB7Cj4gKwkJb2JqZWN0WzFdLm9mZnNldCA9 IG9mZnNldDsKPiArCQlpZ3RfZGVidWcoIlswXT1bJTA4bGx4IC0gJTA4bGx4XSBbMV09WyUwOGxs eCAtICUwOGxseF1cbiIsCj4gKwkJCSAgKGxvbmcgbG9uZylvYmplY3RbMF0ub2Zmc2V0LAo+ICsJ CQkgIChsb25nIGxvbmcpb2JqZWN0WzBdLm9mZnNldCArIHNpemUsCj4gKwkJCSAgKGxvbmcgbG9u ZylvYmplY3RbMV0ub2Zmc2V0LAo+ICsJCQkgIChsb25nIGxvbmcpb2JqZWN0WzFdLm9mZnNldCAr IHNpemUpOwo+ICsJCWlndF9hc3NlcnRfZXEoX19nZW1fZXhlY2J1ZihmZCwgJmV4ZWNidWYpLCAt RUlOVkFMKTsKPiArCQlpZ3RfYXNzZXJ0X2VxX3U2NChvYmplY3RbMV0ub2Zmc2V0LCBvZmZzZXQp Owo+ICsJfQo+ICAKPiAtCWNsb3NlKGZkKTsKPiAtCWZyZWUoc2hhcmVkX2J1ZmZlcik7Cj4gLQlm cmVlKHNoYXJlZF9idWZmZXIxKTsKPiArCWdlbV9jbG9zZShmZCwgb2JqZWN0WzFdLmhhbmRsZSk7 Cj4gKwlnZW1fY2xvc2UoZmQsIG9iamVjdFswXS5oYW5kbGUpOwo+ICsJZ2VtX2Nsb3NlKGZkLCBo YW5kbGUpOwo+ICB9Cj4gIAo+IC0vKiBnZW1fc29mdHBpbl9zdHJlc3NfdGVzdAo+IC0gKiBTdHJl c3MgdGVzdCB3aGljaCBjcmVhdGVzIDEwSyBidWZmZXJzIGFuZCBzaGFyZXMgd2l0aCBHUFUKPiAt ICogQ3JlYXRlIDEwMEsgdWludDMyIGJ1ZmZlcnMgb2Ygc2l6ZSA0SyBlYWNoCj4gLSAqIFNoYXJl IHdpdGggR1BVIHVzaW5nIHVzZXJwdHIgaW9jdGwKPiAtICogQ3JlYXRlIGJhdGNoIGJ1ZmZlciB0 byB3cml0ZSBEQVRBIGluIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCBidWZmZXIKPiAtICogUGluIGVh Y2ggYnVmZmVyIHRvIHZhcnlpbmcgYWRkcmVzc2VzIHN0YXJ0aW5nIGZyb20gMHg4MDAwMDAwMDAw MDAgZ29pbmcgYmVsb3cKPiAtICogKHJlcXVpcmVzIG9mZnNldHMgaW4gY2Fub25pY2FsIGZvcm0p Cj4gLSAqIEV4ZWN1dGUgQmF0Y2ggQnVmZmVyIG9uIEJsaXQgcmluZyBTVFJFU1NfTlVNX0xPT1BT IHRpbWVzCj4gLSAqIFZhbGlkYXRlIGV2ZXJ5IGJ1ZmZlciBoYXMgREFUQSBpbiBmaXJzdCBlbGVt ZW50Cj4gLSAqIFJpbnNlIGFuZCBSZXBlYXQgb24gUmVuZGVyIHJpbmcKPiAtKi8KPiAtI2RlZmlu ZSBTVFJFU1NfTlVNX0JVRkZFUlMgMTAwMDAwCj4gLSNkZWZpbmUgU1RSRVNTX05VTV9MT09QUyAx MDAKPiAtI2RlZmluZSBTVFJFU1NfU1RPUkVfQ09NTUFORFMgNCAqIFNUUkVTU19OVU1fQlVGRkVS UyAtI2RlZmluZSBTVFJFU1NfU1RBUlRfQUREUkVTUyAweDgwMDAwMDAwMDAwMCAtc3RhdGljIHZv aWQgZ2VtX3NvZnRwaW5fc3RyZXNzX3Rlc3Qodm9pZCkKPiArc3RhdGljIHVpbnQ2NF90IGJ1c3lf YmF0Y2goaW50IGZkKQo+ICB7Cj4gLQlpOTE1X2dlbV91c2VycHRyIHVzZXJwdHI7Cj4gLQlpbnQg ZmQ7Cj4gLQl1aW50MzJfdCAqKnNoYXJlZF9idWZmZXI7Cj4gLQl1aW50MzJfdCAqc2hhcmVkX2hh bmRsZTsKPiArCWNvbnN0IGludCBnZW4gPSBpbnRlbF9nZW4oaW50ZWxfZ2V0X2RybV9kZXZpZChm ZCkpOwo+ICsJY29uc3QgaW50IGhhc182NGJpdF9yZWxvYyA9IGdlbiA+PSA4Owo+ICAJc3RydWN0 IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjYnVmOwo+IC0Jc3RydWN0IGRybV9pOTE1X2dl bV9leGVjX29iamVjdDIgKmV4ZWNfb2JqZWN0MjsKPiAtCXVpbnQzMl90ICpiYXRjaF9idWZmZXI7 Cj4gLQl1aW50MzJfdCBiYXRjaF9idWZfaGFuZGxlOwo+IC0JaW50IHJpbmcsIGxlbjsKPiAtCWlu dCBidWYsIGxvb3A7Cj4gLQl1aW50NjRfdCBwaW5uaW5nX29mZnNldCA9IFNUUkVTU19TVEFSVF9B RERSRVNTOwo+IC0KPiAtCWZkID0gZHJtX29wZW5fZHJpdmVyKERSSVZFUl9JTlRFTCk7Cj4gLQlp Z3RfcmVxdWlyZSh1c2VzX2Z1bGxfcHBndHQoZmQsIEZVTExfNDhfQklUX1BQR1RUKSk7Cj4gLQlp Z3RfcmVxdWlyZShoYXNfc29mdHBpbl9zdXBwb3J0KGZkKSk7Cj4gLQo+IC0KPiAtCS8qIEFsbG9j YXRlIGJsb2JzIGZvciBhbGwgZGF0YSBzdHJ1Y3R1cmVzICovCj4gLQlzaGFyZWRfaGFuZGxlID0g Y2FsbG9jKFNUUkVTU19OVU1fQlVGRkVSUywgc2l6ZW9mKHVpbnQzMl90KSk7Cj4gLQlzaGFyZWRf YnVmZmVyID0gY2FsbG9jKFNUUkVTU19OVU1fQlVGRkVSUywgc2l6ZW9mKHVpbnQzMl90ICopKTsK PiAtCWV4ZWNfb2JqZWN0MiA9IGNhbGxvYyhTVFJFU1NfTlVNX0JVRkZFUlMgKyAxLAo+IC0JCQkJ c2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyKSk7Cj4gLQkvKiA0IGR3b3Jk cyBwZXIgYnVmZmVyICsgMiBmb3IgdGhlIGVuZCBvZiBiYXRjaGJ1ZmZlciAqLwo+IC0JYmF0Y2hf YnVmZmVyID0gY2FsbG9jKFNUUkVTU19TVE9SRV9DT01NQU5EUyArIDIsIHNpemVvZih1aW50MzJf dCkpOwo+IC0JYmF0Y2hfYnVmX2hhbmRsZSA9IGdlbV9jcmVhdGUoZmQsIChTVFJFU1NfU1RPUkVf Q09NTUFORFMgKyAyKSo0KTsKPiAtCj4gLQkvKiBjcmVhdGUgY29tbWFuZCBidWZmZXIgd2l0aCB3 cml0ZSBjb21tYW5kcyAqLwo+IC0JbGVuID0gMDsKPiAtCWZvcihidWYgPSAwOyBidWYgPCBTVFJF U1NfTlVNX0JVRkZFUlM7IGJ1ZisrKSB7Cj4gLQkJc2hhcmVkX2J1ZmZlcltidWZdID0gY3JlYXRl X21lbV9idWZmZXIoQk9fU0laRSk7Cj4gLQkJKnNoYXJlZF9idWZmZXJbYnVmXSA9IDB4RkZGRkZG RkY7Cj4gLQo+IC0JCS8qIHNoYXJlIHdpdGggR1BVICovCj4gLQkJc2hhcmVkX2hhbmRsZVtidWZd ID0gaW5pdF91c2VycHRyKGZkLCAmdXNlcnB0ciwKPiAtCQkJCQkJICBzaGFyZWRfYnVmZmVyW2J1 Zl0sCj4gLQkJCQkJCSAgQk9fU0laRSk7Cj4gLQo+IC0JCXNldHVwX2V4ZWNfb2JqKCZleGVjX29i amVjdDJbYnVmXSwgc2hhcmVkX2hhbmRsZVtidWZdLAo+IC0JCQkgICAgICAgRVhFQ19PQkpFQ1Rf UElOTkVEIHwKPiAtCQkJICAgICAgIEVYRUNfT0JKRUNUX1NVUFBPUlRTXzQ4Ql9BRERSRVNTLAo+ IC0JCQkgICAgICAgZ2VuOF9jYW5vbmljYWxfYWRkcihwaW5uaW5nX29mZnNldCkpOwo+IC0JCWxl biArPSBnZW1fc3RvcmVfZGF0YV9zdm0oZmQsIGJhdGNoX2J1ZmZlciArIChsZW4vNCksCj4gLQkJ CQkJICBnZW44X2Nhbm9uaWNhbF9hZGRyKHBpbm5pbmdfb2Zmc2V0KSwKPiAtCQkJCQkgIGJ1Ziwg KGJ1ZiA9PSBTVFJFU1NfTlVNX0JVRkZFUlMtMSk/IFwKPiAtCQkJCQkgIHRydWU6ZmFsc2UpOwo+ IC0KPiAtCQkvKiBkZWNyZW1lbnRhbCA0SyBhbGlnbmVkIGFkZHJlc3MgKi8KPiAtCQlwaW5uaW5n X29mZnNldCAtPSBBTElHTihCT19TSVpFLCA0MDk2KTsKPiAtCX0KPiArCXN0cnVjdCBkcm1faTkx NV9nZW1fZXhlY19vYmplY3QyIG9iamVjdFsyXTsKPiArCXVpbnQzMl90ICptYXA7Cj4gKwlpbnQg ZmFjdG9yID0gMTA7Cj4gKwlpbnQgaSA9IDA7Cj4gIAo+IC0JLyogc2V0dXAgY29tbWFuZCBidWZm ZXIgKi8KPiAtCWdlbV93cml0ZShmZCwgYmF0Y2hfYnVmX2hhbmRsZSwgMCwgYmF0Y2hfYnVmZmVy LCBsZW4pOwo+IC0Jc2V0dXBfZXhlY19vYmooJmV4ZWNfb2JqZWN0MltTVFJFU1NfTlVNX0JVRkZF UlNdLCBiYXRjaF9idWZfaGFuZGxlLAo+IC0JCSAgICAgICAwLCAwKTsKPiAtCj4gLQkvKiBXZSB3 YW50IHRvIHJ1biB0aGlzIG9uIEJMVCByaW5nIGlmIHBvc3NpYmxlICovCj4gLQlpZiAoSEFTX0JM VF9SSU5HKGludGVsX2dldF9kcm1fZGV2aWQoZmQpKSkgewo+IC0JCXJpbmcgPSBJOTE1X0VYRUNf QkxUOwo+IC0KPiAtCQlzZXR1cF9leGVjYnVmZmVyKCZleGVjYnVmLCBleGVjX29iamVjdDIsIHJp bmcsCj4gLQkJCQkgU1RSRVNTX05VTV9CVUZGRVJTICsgMSwgbGVuKTsKPiAtCj4gLQkJZm9yIChs b29wID0gMDsgbG9vcCA8IFNUUkVTU19OVU1fTE9PUFM7IGxvb3ArKykgewo+IC0JCQlzdWJtaXRf YW5kX3N5bmMoZmQsICZleGVjYnVmLCBiYXRjaF9idWZfaGFuZGxlKTsKPiAtCQkJLyogU2V0IHBp bm5pbmcgb2Zmc2V0IGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KPiAtCQkJcGlubmluZ19vZmZz ZXQgPSBTVFJFU1NfU1RBUlRfQUREUkVTUzsKPiAtCQkJZm9yKGJ1ZiA9IDA7IGJ1ZiA8IFNUUkVT U19OVU1fQlVGRkVSUzsgYnVmKyspIHsKPiAtCQkJCWdlbV91c2VycHRyX3N5bmMoZmQsIHNoYXJl ZF9oYW5kbGVbYnVmXSk7Cj4gLQkJCQlpZ3RfYXNzZXJ0KGV4ZWNfb2JqZWN0MltidWZdLm9mZnNl dCA9PQo+IC0JCQkJCWdlbjhfY2Fub25pY2FsX2FkZHIocGlubmluZ19vZmZzZXQpKTsKPiAtCQkJ CWlndF9mYWlsX29uX2YoKnNoYXJlZF9idWZmZXJbYnVmXSAhPSBidWYsIFwKPiAtCQkJCSJNaXNt YXRjaCBpbiBidWZmZXIgJWQsIGl0ZXJhdGlvbiAlZDogMHglMDhYXG4iLCBcCj4gLQkJCQlidWYs IGxvb3AsICpzaGFyZWRfYnVmZmVyW2J1Zl0pOwo+IC0JCQkJcGlubmluZ19vZmZzZXQgLT0gQUxJ R04oQk9fU0laRSwgNDA5Nik7Cj4gLQkJCX0KPiAtCQkJLyogUmVzZXQgdGhlIGJ1ZmZlciBlbnRy aWVzIGZvciBuZXh0IGl0ZXJhdGlvbiAqLwo+IC0JCQlmb3IoYnVmID0gMDsgYnVmIDwgU1RSRVNT X05VTV9CVUZGRVJTOyBidWYrKykgewo+IC0JCQkJKnNoYXJlZF9idWZmZXJbYnVmXSA9IDB4RkZG RkZGRkY7Cj4gLQkJCX0KPiAtCQl9Cj4gKwltZW1zZXQob2JqZWN0LCAwLCBzaXplb2Yob2JqZWN0 KSk7Cj4gKwlvYmplY3RbMF0uaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgMTAyNCoxMDI0KTsKPiAr CW9iamVjdFsxXS5oYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCA0MDk2KTsKPiArCW1hcCA9IGdlbV9t bWFwX19jcHUoZmQsIG9iamVjdFsxXS5oYW5kbGUsIDAsIDQwOTYsIFBST1RfV1JJVEUpOwo+ICsJ Z2VtX3NldF9kb21haW4oZmQsIG9iamVjdFsxXS5oYW5kbGUsCj4gKwkJICAgICAgIEk5MTVfR0VN X0RPTUFJTl9DUFUsIEk5MTVfR0VNX0RPTUFJTl9DUFUpOwo+ICsKPiArCSptYXAgPSBNSV9CQVRD SF9CVUZGRVJfRU5EOwo+ICsKPiArCW1lbXNldCgmZXhlY2J1ZiwgMCwgc2l6ZW9mKGV4ZWNidWYp KTsKPiArCWV4ZWNidWYuYnVmZmVyc19wdHIgPSAodW5zaWduZWQgbG9uZylvYmplY3Q7Cj4gKwll eGVjYnVmLmJ1ZmZlcl9jb3VudCA9IDI7Cj4gKwlpZiAoZ2VuID49IDYpCj4gKwkJZXhlY2J1Zi5m bGFncyA9IEk5MTVfRVhFQ19CTFQ7Cj4gKwlnZW1fZXhlY2J1ZihmZCwgJmV4ZWNidWYpOwo+ICsK PiArCWlndF9kZWJ1ZygiQWN0aXZlIG9mZnNldHMgPSBbJTA4bGx4LCAlMDhsbHhdXG4iLAo+ICsJ CSAgb2JqZWN0WzBdLm9mZnNldCwgb2JqZWN0WzFdLm9mZnNldCk7Cj4gKwo+ICsjZGVmaW5lIENP UFlfQkxUX0NNRAkJKDI8PDI5fDB4NTM8PDIyfDB4NikKPiArI2RlZmluZSBCTFRfV1JJVEVfQUxQ SEEJCSgxPDwyMSkKPiArI2RlZmluZSBCTFRfV1JJVEVfUkdCCQkoMTw8MjApCj4gKwlnZW1fc2V0 X2RvbWFpbihmZCwgb2JqZWN0WzFdLmhhbmRsZSwKPiArCQkgICAgICAgSTkxNV9HRU1fRE9NQUlO X0NQVSwgSTkxNV9HRU1fRE9NQUlOX0NQVSk7Cj4gKwl3aGlsZSAoZmFjdG9yLS0pIHsKPiArCQkv KiBYWV9TUkNfQ09QWSAqLwo+ICsJCW1hcFtpKytdID0gQ09QWV9CTFRfQ01EIHwgQkxUX1dSSVRF X0FMUEhBIHwgQkxUX1dSSVRFX1JHQjsKPiArCQlpZiAoaGFzXzY0Yml0X3JlbG9jKQo+ICsJCQlt YXBbaS0xXSArPSAyOwo+ICsJCW1hcFtpKytdID0gMHhjYyA8PCAxNiB8IDEgPDwgMjUgfCAxIDw8 IDI0IHwgKDQqMTAyNCk7Cj4gKwkJbWFwW2krK10gPSAwOwo+ICsJCW1hcFtpKytdID0gMjU2IDw8 IDE2IHwgMTAyNDsKPiArCQltYXBbaSsrXSA9IG9iamVjdFswXS5vZmZzZXQ7Cj4gKwkJaWYgKGhh c182NGJpdF9yZWxvYykKPiArCQkJbWFwW2krK10gPSBvYmplY3RbMF0ub2Zmc2V0ID4+IDMyOwo+ ICsJCW1hcFtpKytdID0gMDsKPiArCQltYXBbaSsrXSA9IDQwOTY7Cj4gKwkJbWFwW2krK10gPSBv YmplY3RbMF0ub2Zmc2V0Owo+ICsJCWlmIChoYXNfNjRiaXRfcmVsb2MpCj4gKwkJCW1hcFtpKytd ID0gb2JqZWN0WzBdLm9mZnNldCA+PiAzMjsKPiAgCX0KPiArCW1hcFtpKytdID0gTUlfQkFUQ0hf QlVGRkVSX0VORDsKPiArCW11bm1hcChtYXAsIDQwOTYpOwo+ICAKPiAtCS8qIE5vdyBSZW5kZXIg UmluZyAqLwo+IC0JcmluZyA9IEk5MTVfRVhFQ19SRU5ERVI7Cj4gLQlzZXR1cF9leGVjYnVmZmVy KCZleGVjYnVmLCBleGVjX29iamVjdDIsIHJpbmcsCj4gLQkJCSBTVFJFU1NfTlVNX0JVRkZFUlMg KyAxLCBsZW4pOwo+IC0JZm9yIChsb29wID0gMDsgbG9vcCA8IFNUUkVTU19OVU1fTE9PUFM7IGxv b3ArKykgewo+IC0JCXN1Ym1pdF9hbmRfc3luYyhmZCwgJmV4ZWNidWYsIGJhdGNoX2J1Zl9oYW5k bGUpOwo+IC0JCXBpbm5pbmdfb2Zmc2V0ID0gU1RSRVNTX1NUQVJUX0FERFJFU1M7Cj4gLQkJZm9y KGJ1ZiA9IDA7IGJ1ZiA8IFNUUkVTU19OVU1fQlVGRkVSUzsgYnVmKyspIHsKPiAtCQkJZ2VtX3Vz ZXJwdHJfc3luYyhmZCwgc2hhcmVkX2hhbmRsZVtidWZdKTsKPiAtCQkJaWd0X2Fzc2VydChleGVj X29iamVjdDJbYnVmXS5vZmZzZXQgPT0KPiAtCQkJCWdlbjhfY2Fub25pY2FsX2FkZHIocGlubmlu Z19vZmZzZXQpKTsKPiAtCQkJaWd0X2ZhaWxfb25fZigqc2hhcmVkX2J1ZmZlcltidWZdICE9IGJ1 ZiwgXAo+IC0JCQkiTWlzbWF0Y2ggaW4gYnVmZmVyICVkLCBcCj4gLQkJCWl0ZXJhdGlvbiAlZDog MHglMDhYXG4iLCBidWYsIGxvb3AsICpzaGFyZWRfYnVmZmVyW2J1Zl0pOwo+IC0JCQlwaW5uaW5n X29mZnNldCAtPSBBTElHTihCT19TSVpFLCA0MDk2KTsKPiAtCQl9Cj4gLQkJLyogUmVzZXQgdGhl IGJ1ZmZlciBlbnRyaWVzIGZvciBuZXh0IGl0ZXJhdGlvbiAqLwo+IC0JCWZvcihidWYgPSAwOyBi dWYgPCBTVFJFU1NfTlVNX0JVRkZFUlM7IGJ1ZisrKSB7Cj4gLQkJCSpzaGFyZWRfYnVmZmVyW2J1 Zl0gPSAweEZGRkZGRkZGOwo+IC0JCX0KPiAtCX0KPiAtCj4gLQlmb3IoYnVmID0gMDsgYnVmIDwg U1RSRVNTX05VTV9CVUZGRVJTOyBidWYrKykgewo+IC0JCWdlbV9jbG9zZShmZCwgc2hhcmVkX2hh bmRsZVtidWZdKTsKPiAtCQlmcmVlKHNoYXJlZF9idWZmZXJbYnVmXSk7Cj4gLQl9Cj4gLQlnZW1f Y2xvc2UoZmQsIGJhdGNoX2J1Zl9oYW5kbGUpOwo+IC0JY2xvc2UoZmQpOwo+ICsJb2JqZWN0WzBd LmZsYWdzID0gRVhFQ19PQkpFQ1RfUElOTkVEIHwgRVhFQ19PQkpFQ1RfV1JJVEU7Cj4gKwlvYmpl Y3RbMV0uZmxhZ3MgPSBFWEVDX09CSkVDVF9QSU5ORUQ7Cj4gKwlnZW1fZXhlY2J1ZihmZCwgJmV4 ZWNidWYpOwo+ICsJZ2VtX2Nsb3NlKGZkLCBvYmplY3RbMF0uaGFuZGxlKTsKPiArCWdlbV9jbG9z ZShmZCwgb2JqZWN0WzFdLmhhbmRsZSk7Cj4gIAo+IC0JZnJlZShzaGFyZWRfaGFuZGxlKTsKPiAt CWZyZWUoc2hhcmVkX2J1ZmZlcik7Cj4gLQlmcmVlKGV4ZWNfb2JqZWN0Mik7Cj4gLQlmcmVlKGJh dGNoX2J1ZmZlcik7Cj4gKwlyZXR1cm4gb2JqZWN0WzFdLm9mZnNldDsKPiAgfQo+ICAKPiAtLyog Z2VtX3dyaXRlX211bHRpcGFnZV9idWZmZXIKPiAtICogQ3JlYXRlIGEgYnVmZmVyIHNwYW5uaW5n IG11bHRpcGxlIHBhZ2VzLCBhbmQgc2hhcmUgd2l0aCBHUFUuCj4gLSAqIFdyaXRlIHRvIGV2ZXJ5 IGVsZW1lbnQgb2YgdGhlIGJ1ZmZlcgo+IC0gKiBhbmQgdmVyaWZ5IGNvcnJlY3QgY29udGVudHMu Cj4gLQo+IC0gKiBDcmVhdGUgOEsgYnVmZmVyCj4gLSAqIFNoYXJlIHdpdGggR1BVIHVzaW5nIHVz ZXJwdHIgaW9jdGwKPiAtICogQ3JlYXRlIGJhdGNoIGJ1ZmZlciB0byB3cml0ZSBEQVRBIGluIGFs bCBlbGVtZW50cyBvZiBidWZmZXIKPiAtICogRXhlY3V0ZSBCYXRjaCBCdWZmZXIKPiAtICogVmFs aWRhdGUgZXZlcnkgZWxlbWVudCBoYXMgREFUQQo+IC0qLwo+IC0KPiAtI2RlZmluZSBEV09SRF9T SVpFIHNpemVvZih1aW50MzJfdCkKPiAtI2RlZmluZSBCQl9TSVpFICgoTVVMVElQQUdFX0JPX1NJ WkUgLyBEV09SRF9TSVpFKSAqIFNUT1JFX0JBVENIX0JVRkZFUl9TSVpFKSArIDIgLSNkZWZpbmUg TlVNX0RXT1JEUyAoTVVMVElQQUdFX0JPX1NJWkUvc2l6ZW9mKHVpbnQzMl90KSkKPiAtc3RhdGlj IHZvaWQgZ2VtX3dyaXRlX211bHRpcGFnZV9idWZmZXJfdGVzdCh2b2lkKQo+ICtzdGF0aWMgdm9p ZCB0ZXN0X2V2aWN0X2FjdGl2ZShpbnQgZmQpCj4gIHsKPiAtCWk5MTVfZ2VtX3VzZXJwdHIgdXNl cnB0cjsKPiAtCWludCBmZDsKPiAtCXVpbnQzMl90ICpzaGFyZWRfYnVmZmVyOwo+IC0JdWludDMy X3Qgc2hhcmVkX2hhbmRsZTsKPiArCWNvbnN0IHVpbnQzMl90IGJiZSA9IE1JX0JBVENIX0JVRkZF Ul9FTkQ7Cj4gIAlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGV4ZWNidWY7Cj4gLQlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBleGVjX29iamVjdDJbMl07Cj4gLQl1aW50 MzJfdCBiYXRjaF9idWZmZXJbQkJfU0laRV07Cj4gLQl1aW50MzJfdCBiYXRjaF9idWZfaGFuZGxl Owo+IC0JaW50IHJpbmcsIGxlbiwgajsKPiAtCXVpbnQ2NF90IHBpbm5pbmdfb2Zmc2V0PTB4MTAw MDsKPiAtCXVpbnQ2NF90IHZhZGRyOwo+IC0KPiAtCWZkID0gZHJtX29wZW5fZHJpdmVyKERSSVZF Ul9JTlRFTCk7Cj4gLQlpZ3RfcmVxdWlyZSh1c2VzX2Z1bGxfcHBndHQoZmQsIEFMSUFTSU5HX1BQ R1RUKSk7Cj4gLQlpZ3RfcmVxdWlyZShoYXNfc29mdHBpbl9zdXBwb3J0KGZkKSk7Cj4gLQo+IC0J YmF0Y2hfYnVmX2hhbmRsZSA9IGdlbV9jcmVhdGUoZmQsIHNpemVvZihiYXRjaF9idWZmZXIpKTsK PiAtCXNoYXJlZF9idWZmZXIgPSBjcmVhdGVfbWVtX2J1ZmZlcihNVUxUSVBBR0VfQk9fU0laRSk7 Cj4gLQo+IC0JbGVuID0gMDsKPiAtCW1lbXNldChiYXRjaF9idWZmZXIsIDAsIHNpemVvZihiYXRj aF9idWZmZXIpKTsKPiAtCW1lbXNldChzaGFyZWRfYnVmZmVyLCAwLCBNVUxUSVBBR0VfQk9fU0la RSk7Cj4gLQo+IC0JLyogc2hhcmUgd2l0aCBHUFUgKi8KPiAtCXNoYXJlZF9oYW5kbGUgPSBpbml0 X3VzZXJwdHIoZmQsICZ1c2VycHRyLCBzaGFyZWRfYnVmZmVyLAo+IC0JCQkJICAgICBNVUxUSVBB R0VfQk9fU0laRSk7Cj4gLQlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzBdLCBzaGFyZWRf aGFuZGxlLAo+IC0JCSAgICAgICBFWEVDX09CSkVDVF9QSU5ORUQsIHBpbm5pbmdfb2Zmc2V0KTsK PiAtCj4gLQkvKiBjcmVhdGUgY29tbWFuZCBidWZmZXIgd2l0aCB3cml0ZSBjb21tYW5kcyAqLwo+ IC0JdmFkZHIgPSBwaW5uaW5nX29mZnNldDsKPiAtCWZvcihqPTA7IGo8IE5VTV9EV09SRFM7IGor Kykgewo+IC0JCWxlbiArPSBnZW1fc3RvcmVfZGF0YV9zdm0oZmQsIGJhdGNoX2J1ZmZlciArIChs ZW4vNCksIHZhZGRyLAo+IC0JCQkJCSAgaiwKPiAtCQkJCQkgIChqID09IE5VTV9EV09SRFMgLSAx KSA/IHRydWU6ZmFsc2UpOwo+IC0JCXZhZGRyICs9IHNpemVvZihzaGFyZWRfYnVmZmVyWzBdKTsg IC8qIDQgYnl0ZXMgKi8KPiAtCX0KPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3Qy IG9iamVjdDsKPiArCXVpbnQ2NF90IGV4cGVjdGVkOwo+ICAKPiAtCWdlbV93cml0ZShmZCwgYmF0 Y2hfYnVmX2hhbmRsZSwgMCwgYmF0Y2hfYnVmZmVyLCBsZW4pOwo+ICsJbWVtc2V0KCZvYmplY3Qs IDAsIHNpemVvZihvYmplY3QpKTsKPiArCW9iamVjdC5oYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCA0 MDk2KTsKPiArCWdlbV93cml0ZShmZCwgb2JqZWN0LmhhbmRsZSwgMCwgJmJiZSwgc2l6ZW9mKGJi ZSkpOwo+ICAKPiAtCS8qIHN1Ym1pdCBjb21tYW5kIGJ1ZmZlciAqLwo+IC0Jc2V0dXBfZXhlY19v YmooJmV4ZWNfb2JqZWN0MlsxXSwgYmF0Y2hfYnVmX2hhbmRsZSwgMCwgMCk7Cj4gKwlleHBlY3Rl ZCA9IGJ1c3lfYmF0Y2goZmQpOwo+ICsJb2JqZWN0Lm9mZnNldCA9IGV4cGVjdGVkOwo+ICsJb2Jq ZWN0LmZsYWdzID0gRVhFQ19PQkpFQ1RfUElOTkVEOwo+ICAKPiAtCXJpbmcgPSBJOTE1X0VYRUNf UkVOREVSOwo+IC0Jc2V0dXBfZXhlY2J1ZmZlcigmZXhlY2J1ZiwgZXhlY19vYmplY3QyLCByaW5n LCAyLCBsZW4pOwo+IC0Jc3VibWl0X2FuZF9zeW5jKGZkLCAmZXhlY2J1ZiwgYmF0Y2hfYnVmX2hh bmRsZSk7Cj4gLQlnZW1fdXNlcnB0cl9zeW5jKGZkLCBzaGFyZWRfaGFuZGxlKTsKPiAtCj4gLQlp Z3RfYXNzZXJ0KGV4ZWNfb2JqZWN0MlswXS5vZmZzZXQgPT0gcGlubmluZ19vZmZzZXQpOwo+IC0J Zm9yKGogPSAwOyBqIDwgKE1VTFRJUEFHRV9CT19TSVpFL3NpemVvZih1aW50MzJfdCkpOyBqKysp IHsKPiAtCQlpZ3RfZmFpbF9vbl9mKHNoYXJlZF9idWZmZXJbal0gIT0gaiwKPiAtCQkiTWlzbWF0 Y2ggaW4gaW5kZXggJWQ6IDB4JTA4WFxuIiwgaiwgc2hhcmVkX2J1ZmZlcltqXSk7Cj4gLQl9Cj4g KwkvKiBSZXBsYWNlIHRoZSBhY3RpdmUgYmF0Y2ggd2l0aCBvdXJzZWx2ZXMsIGZvcmNpbmcgYW4g ZXZpY3Rpb24gKi8KPiArCW1lbXNldCgmZXhlY2J1ZiwgMCwgc2l6ZW9mKGV4ZWNidWYpKTsKPiAr CWV4ZWNidWYuYnVmZmVyc19wdHIgPSAodW5zaWduZWQgbG9uZykmb2JqZWN0Owo+ICsJZXhlY2J1 Zi5idWZmZXJfY291bnQgPSAxOwo+ICAKPiAtCWdlbV9jbG9zZShmZCwgYmF0Y2hfYnVmX2hhbmRs ZSk7Cj4gLQlnZW1fY2xvc2UoZmQsIHNoYXJlZF9oYW5kbGUpOwo+IC0JY2xvc2UoZmQpOwo+ICsJ Z2VtX2V4ZWNidWYoZmQsICZleGVjYnVmKTsKPiArCWdlbV9jbG9zZShmZCwgb2JqZWN0LmhhbmRs ZSk7Cj4gIAo+IC0JZnJlZShzaGFyZWRfYnVmZmVyKTsKPiArCWlndF9hc3NlcnRfZXFfdTY0KG9i amVjdC5vZmZzZXQsIGV4cGVjdGVkKTsKPiAgfQo+ICAKPiAtLyogZ2VtX3Bpbl9pbnZhbGlkX3Zt YV90ZXN0Cj4gLSAqIFRoaXMgdGVzdCB3aWxsIHJlcXVlc3QgdG8gcGluIGEgc2hhcmVkIGJ1ZmZl ciB0byBhbiBpbnZhbGlkCj4gLSAqIFZNQSAgPiA0OC1iaXQgYWRkcmVzcyBpZiBzeXN0ZW0gc3Vw cG9ydHMgNDhCIFBQR1RUOyBpdCBhbHNvCj4gLSAqIHdpbGwgdGVzdCB0aGF0IGFueSBhdHRlbXB0 IG9mIHVzaW5nIGEgNDgtYml0IGFkZHJlc3MgcmVxdWlyZXMKPiAtICogdGhlIFNVUFBPUlRTXzQ4 Ql9BRERSRVNTIGZsYWcsIGFuZCB0aGF0IDQ4LWJpdCBhZGRyZXNzIG5lZWQgdG8gYmUKPiAtICog aW4gY2Fub25pY2FsIGZvcm0gKGJpdHMgWzYzOjQ4XSA9PSBbNDddKS4KPiAtICogSWYgc3lzdGVt IHN1cHBvcnRzIDMyQiBQUEdUVCwgaXQgd2lsbCB0ZXN0IHRoZSBlcXVpdmFsZW50IGludmFsaWQg Vk1BCj4gLSAqIENyZWF0ZSBzaGFyZWQgYnVmZmVyIG9mIHNpemUgNEsKPiAtICogVHJ5IGFuZCBQ aW4gb2JqZWN0IHRvIGludmFsaWQgYWRkcmVzcyAtKi8gLXN0YXRpYyB2b2lkIGdlbV9waW5faW52 YWxpZF92bWFfdGVzdChib29sIHRlc3RfZGVjb3VwbGVfZmxhZ3MsCj4gLQkJCQkgICAgIGJvb2wg dGVzdF9jYW5vbmljYWxfb2Zmc2V0KQo+ICtzdGF0aWMgdm9pZCB0ZXN0X2V2aWN0X2hhbmcoaW50 IGZkKQo+ICB7Cj4gLQlpOTE1X2dlbV91c2VycHRyIHVzZXJwdHI7Cj4gLQlpbnQgZmQsIHJldDsK PiAtCXVpbnQzMl90ICpzaGFyZWRfYnVmZmVyOwo+ICsJY29uc3QgdWludDMyX3QgYmJlID0gTUlf QkFUQ0hfQlVGRkVSX0VORDsKPiAgCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZXhl Y2J1ZjsKPiAtCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIGV4ZWNfb2JqZWN0Mlsx XTsKPiAtCXVpbnQzMl90IHNoYXJlZF9idWZfaGFuZGxlOwo+IC0JaW50IHJpbmc7Cj4gLQl1aW50 NjRfdCBpbnZhbGlkX2FkZHJlc3NfZm9yXzQ4YiA9IDB4OTAwMDAwMDAwMDAwMDsgLyogNTIgYml0 IGFkZHJlc3MgKi8KPiAtCXVpbnQ2NF90IG5vbmNhbm9uaWNhbF9hZGRyZXNzX2Zvcl80OGIgPSAw eEZGMDAwMDAwMDAwMDsgLyogNDggYml0IGFkZHJlc3MgaW4gbm9uY2Fub25pY2FsIGZvcm0gKi8K PiAtCXVpbnQ2NF90IGludmFsaWRfYWRkcmVzc19mb3JfMzJiID0gMHg5MDAwMDAwMDA7IC8qIDM2 IGJpdCBhZGRyZXNzICovCj4gLQo+IC0JZmQgPSBkcm1fb3Blbl9kcml2ZXIoRFJJVkVSX0lOVEVM KTsKPiAtCWlndF9yZXF1aXJlKHVzZXNfZnVsbF9wcGd0dChmZCwgRlVMTF80OF9CSVRfUFBHVFQp IHx8Cj4gLQkJICAgIHVzZXNfZnVsbF9wcGd0dChmZCwgRlVMTF8zMl9CSVRfUFBHVFQpKTsKPiAt CWlndF9yZXF1aXJlKGhhc19zb2Z0cGluX3N1cHBvcnQoZmQpKTsKPiAtCj4gLQlzaGFyZWRfYnVm ZmVyID0gY3JlYXRlX21lbV9idWZmZXIoQk9fU0laRSk7Cj4gLQkqc2hhcmVkX2J1ZmZlciA9IDB4 RkZGRkZGRkY7Cj4gLQo+IC0JLyogc2hhcmUgd2l0aCBHUFUgKi8KPiAtCXNoYXJlZF9idWZfaGFu ZGxlID0gaW5pdF91c2VycHRyKGZkLCAmdXNlcnB0ciwgc2hhcmVkX2J1ZmZlciwgQk9fU0laRSk7 Cj4gLQo+IC0JaWYgKHVzZXNfZnVsbF9wcGd0dChmZCwgRlVMTF80OF9CSVRfUFBHVFQpICYmIHRl c3RfY2Fub25pY2FsX29mZnNldCkgewo+IC0JCXNldHVwX2V4ZWNfb2JqKCZleGVjX29iamVjdDJb MF0sIHNoYXJlZF9idWZfaGFuZGxlLAo+IC0JCQkgICAgICAgRVhFQ19PQkpFQ1RfUElOTkVEIHwg RVhFQ19PQkpFQ1RfU1VQUE9SVFNfNDhCX0FERFJFU1MsCj4gLQkJCSAgICAgICBub25jYW5vbmlj YWxfYWRkcmVzc19mb3JfNDhiKTsKPiAtCX0gZWxzZSBpZiAodXNlc19mdWxsX3BwZ3R0KGZkLCBG VUxMXzQ4X0JJVF9QUEdUVCkgJiYgIXRlc3RfZGVjb3VwbGVfZmxhZ3MpIHsKPiAtCQlzZXR1cF9l eGVjX29iaigmZXhlY19vYmplY3QyWzBdLCBzaGFyZWRfYnVmX2hhbmRsZSwKPiAtCQkJICAgICAg IEVYRUNfT0JKRUNUX1BJTk5FRCB8IEVYRUNfT0JKRUNUX1NVUFBPUlRTXzQ4Ql9BRERSRVNTLAo+ IC0JCQkgICAgICAgaW52YWxpZF9hZGRyZXNzX2Zvcl80OGIpOwo+IC0JfSBlbHNlIHsKPiAtCQkv KiBUaGlzIGFsc28gZmFpbHMgaW4gNDhiIHdpdGhvdXQgNDhCX0FERFJFU1Mgc3VwcG9ydCBmbGFn ICovCj4gLQkJc2V0dXBfZXhlY19vYmooJmV4ZWNfb2JqZWN0MlswXSwgc2hhcmVkX2J1Zl9oYW5k bGUsCj4gLQkJCSAgICAgICBFWEVDX09CSkVDVF9QSU5ORUQsIGludmFsaWRfYWRkcmVzc19mb3Jf MzJiKTsKPiAtCX0KPiAtCj4gLQlyaW5nID0gSTkxNV9FWEVDX1JFTkRFUjsKPiAtCj4gLQlzZXR1 cF9leGVjYnVmZmVyKCZleGVjYnVmLCBleGVjX29iamVjdDIsIHJpbmcsIDEsIDApOwo+ICsJc3Ry dWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgb2JqZWN0Owo+ICsJdWludDY0X3QgZXhwZWN0 ZWQ7Cj4gKwlpZ3RfaGFuZ19yaW5nX3QgaGFuZzsKPiAgCj4gLQkvKiBFeHBlY3QgZXhlY2J1ZiB0 byBmYWlsICovCj4gLQlyZXQgPSBkcm1Jb2N0bChmZCwKPiAtCQkgICAgICAgRFJNX0lPQ1RMX0k5 MTVfR0VNX0VYRUNCVUZGRVIyLAo+IC0JCSAgICAgICAmZXhlY2J1Zik7Cj4gKwltZW1zZXQoJm9i amVjdCwgMCwgc2l6ZW9mKG9iamVjdCkpOwo+ICsJb2JqZWN0LmhhbmRsZSA9IGdlbV9jcmVhdGUo ZmQsIDQwOTYpOwo+ICsJZ2VtX3dyaXRlKGZkLCBvYmplY3QuaGFuZGxlLCAwLCAmYmJlLCBzaXpl b2YoYmJlKSk7Cj4gIAo+IC0JaWd0X2Fzc2VydChlcnJubyA9PSBFSU5WQUwpOwo+IC0JaWd0X2Fz c2VydF9uZXEocmV0LCAwKTsKPiArCWhhbmcgPSBpZ3RfaGFuZ19jdHgoZmQsIDAsIDAsIDAsICh1 aW50NjRfdCAqKSZleHBlY3RlZCk7Cj4gKwlvYmplY3Qub2Zmc2V0ID0gZXhwZWN0ZWQ7Cj4gKwlv YmplY3QuZmxhZ3MgPSBFWEVDX09CSkVDVF9QSU5ORUQ7Cj4gIAo+IC0JZ2VtX2Nsb3NlKGZkLCBz aGFyZWRfYnVmX2hhbmRsZSk7Cj4gLQljbG9zZShmZCk7Cj4gLQlmcmVlKHNoYXJlZF9idWZmZXIp Owo+IC19Cj4gKwkvKiBSZXBsYWNlIHRoZSBoYW5naW5nIGJhdGNoIHdpdGggb3Vyc2VsdmVzLCBm b3JjaW5nIGFuIGV2aWN0aW9uICovCj4gKwltZW1zZXQoJmV4ZWNidWYsIDAsIHNpemVvZihleGVj YnVmKSk7Cj4gKwlleGVjYnVmLmJ1ZmZlcnNfcHRyID0gKHVuc2lnbmVkIGxvbmcpJm9iamVjdDsK PiArCWV4ZWNidWYuYnVmZmVyX2NvdW50ID0gMTsKPiAgCj4gKwlnZW1fZXhlY2J1ZihmZCwgJmV4 ZWNidWYpOwo+ICsJZ2VtX2Nsb3NlKGZkLCBvYmplY3QuaGFuZGxlKTsKPiAgCj4gLS8qIGdlbV9w aW5faGlnaF9hZGRyZXNzX3Rlc3QKPiAtICogVGhpcyB0ZXN0IHdpbGwgY3JlYXRlIGEgc2hhcmVk IGJ1ZmZlciwgYW5kIGNyZWF0ZSBhIGNvbW1hbmQKPiAtICogZm9yIEdQVSB0byB3cml0ZSBkYXRh IGluIGl0LiBJdCB3aWxsIGF0dGVtcHQgdG8gcGluIHRoZSBidWZmZXIgYXQgYWRkcmVzcyA+IDMy IGJpdHMuCj4gLSAqIENQVSB3aWxsIHJlYWQgYW5kIG1ha2Ugc3VyZSBleHBlY3RlZCB2YWx1ZSBp cyBvYnRhaW5lZAo+ICsJaWd0X2Fzc2VydF9lcV91NjQob2JqZWN0Lm9mZnNldCwgZXhwZWN0ZWQp Owo+ICAKPiAtICogTWFsbG9jIGEgNEsgYnVmZmVyCj4gLSAqIFNoYXJlIGJ1ZmZlciB3aXRoIHdp dGggR1BVIGJ5IHVzaW5nIHVzZXJwdHIgaW9jdGwKPiAtICogQ3JlYXRlIGJhdGNoIGJ1ZmZlciB0 byB3cml0ZSBEQVRBIHRvIGZpcnN0IGR3b3JkIG9mIGJ1ZmZlcgo+IC0gKiBVc2UgdmlydHVhbCBh ZGRyZXNzIG9mIGJ1ZmZlciBhcyAweDExMDAwMDAwMDAgKD4gMzIgYml0KQo+IC0gKiBTZXQgRVhF Q19PQkpFQ1RfUElOTkVEIGZsYWcgaW4gZXhlYyBvYmplY3QKPiAtICogU2V0ICdvZmZzZXQnIGlu IGV4ZWMgb2JqZWN0IHRvIHNoYXJlZCBidWZmZXIgVk1BCj4gLSAqIFN1Ym1pdCBleGVjYnVmZmVy Cj4gLSAqIFZlcmlmeSB2YWx1ZSBvZiBmaXJzdCBEV09SRCBpbiBzaGFyZWQgYnVmZmVyIG1hdGNo ZXMgREFUQSAtKi8KPiArCWlndF9wb3N0X2hhbmdfcmluZyhmZCwgaGFuZyk7Cj4gK30KPiAgCj4g LXN0YXRpYyB2b2lkIGdlbV9waW5faGlnaF9hZGRyZXNzX3Rlc3Qodm9pZCkKPiArc3RhdGljIHZv aWQgeGNoZ19vZmZzZXQodm9pZCAqYXJyYXksIHVuc2lnbmVkIGksIHVuc2lnbmVkIGopCj4gIHsK PiAtCWk5MTVfZ2VtX3VzZXJwdHIgdXNlcnB0cjsKPiAtCWludCBmZDsKPiAtCXVpbnQzMl90ICpz aGFyZWRfYnVmZmVyOwo+IC0Jc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjYnVm Owo+IC0Jc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgZXhlY19vYmplY3QyWzJdOwo+ IC0JdWludDMyX3QgYmF0Y2hfYnVmZmVyW1NUT1JFX0JBVENIX0JVRkZFUl9TSVpFICsgMl07Cj4g LQl1aW50MzJfdCBiYXRjaF9idWZfaGFuZGxlLCBzaGFyZWRfYnVmX2hhbmRsZTsKPiAtCWludCBy aW5nLCBsZW47Cj4gLQljb25zdCB1aW50MzJfdCBkYXRhID0gMHgxMjM0NTY3ODsKPiAtCXVpbnQ2 NF90IGhpZ2hfYWRkcmVzcyA9IDB4MTExMUZGRkYwMDA7IC8qIDQ0IGJpdCBhZGRyZXNzICovCj4g LQo+IC0JZmQgPSBkcm1fb3Blbl9kcml2ZXIoRFJJVkVSX0lOVEVMKTsKPiAtCWlndF9yZXF1aXJl KHVzZXNfZnVsbF9wcGd0dChmZCwgRlVMTF80OF9CSVRfUFBHVFQpKTsKPiAtCWlndF9yZXF1aXJl KGhhc19zb2Z0cGluX3N1cHBvcnQoZmQpKTsKPiAtCj4gLQliYXRjaF9idWZfaGFuZGxlID0gZ2Vt X2NyZWF0ZShmZCwgQk9fU0laRSk7Cj4gLQo+IC0JLyogY3JlYXRlIGNwdSBidWZmZXIsIHNldCB0 byBhbGwgMHhGJ3MgKi8KPiAtCXNoYXJlZF9idWZmZXIgPSBjcmVhdGVfbWVtX2J1ZmZlcihCT19T SVpFKTsKPiAtCSpzaGFyZWRfYnVmZmVyID0gMHhGRkZGRkZGRjsKPiAtCj4gLQkvKiBzaGFyZSB3 aXRoIEdQVSAqLwo+IC0Jc2hhcmVkX2J1Zl9oYW5kbGUgPSBpbml0X3VzZXJwdHIoZmQsICZ1c2Vy cHRyLCBzaGFyZWRfYnVmZmVyLCBCT19TSVpFKTsKPiAtCj4gLQkvKiBjcmVhdGUgY29tbWFuZCBi dWZmZXIgd2l0aCB3cml0ZSBjb21tYW5kICovCj4gLQlsZW4gPSBnZW1fc3RvcmVfZGF0YV9zdm0o ZmQsIGJhdGNoX2J1ZmZlciwgaGlnaF9hZGRyZXNzLCBkYXRhLCB0cnVlKTsKPiAtCWdlbV93cml0 ZShmZCwgYmF0Y2hfYnVmX2hhbmRsZSwgMCwgYmF0Y2hfYnVmZmVyLCBsZW4pOwo+IC0KPiAtCS8q IHN1Ym1pdCBjb21tYW5kIGJ1ZmZlciAqLwo+IC0Jc2V0dXBfZXhlY19vYmooJmV4ZWNfb2JqZWN0 MlswXSwgc2hhcmVkX2J1Zl9oYW5kbGUsCj4gLQkJICAgICAgIEVYRUNfT0JKRUNUX1BJTk5FRCB8 IEVYRUNfT0JKRUNUX1NVUFBPUlRTXzQ4Ql9BRERSRVNTLCBoaWdoX2FkZHJlc3MpOwo+IC0Jc2V0 dXBfZXhlY19vYmooJmV4ZWNfb2JqZWN0MlsxXSwgYmF0Y2hfYnVmX2hhbmRsZSwgMCwgMCk7Cj4g LQo+IC0JcmluZyA9IEk5MTVfRVhFQ19SRU5ERVI7Cj4gLQo+IC0Jc2V0dXBfZXhlY2J1ZmZlcigm ZXhlY2J1ZiwgZXhlY19vYmplY3QyLCByaW5nLCAyLCBsZW4pOwo+IC0Jc3VibWl0X2FuZF9zeW5j KGZkLCAmZXhlY2J1ZiwgYmF0Y2hfYnVmX2hhbmRsZSk7Cj4gLQlnZW1fdXNlcnB0cl9zeW5jKGZk LCBzaGFyZWRfYnVmX2hhbmRsZSk7Cj4gLQo+IC0JaWd0X2Fzc2VydChleGVjX29iamVjdDJbMF0u b2Zmc2V0ID09IGhpZ2hfYWRkcmVzcyk7Cj4gLQkvKiBjaGVjayBvbiBDUFUgdG8gc2VlIGlmIHZh bHVlIGNoYW5nZXMgKi8KPiAtCWlndF9mYWlsX29uX2Yoc2hhcmVkX2J1ZmZlclswXSAhPSBkYXRh LAo+IC0JCSJcbkNQVSByZWFkIGRvZXMgbm90IG1hdGNoIEdQVSB3cml0ZSwgXAo+IC0JCWV4cGVj dGVkOiAweCV4LCBnb3Q6IDB4JXhcbiIsIGRhdGEsIHNoYXJlZF9idWZmZXJbMF0pOwo+IC0KPiAt CWdlbV9jbG9zZShmZCwgYmF0Y2hfYnVmX2hhbmRsZSk7Cj4gLQlnZW1fY2xvc2UoZmQsIHNoYXJl ZF9idWZfaGFuZGxlKTsKPiAtCWNsb3NlKGZkKTsKPiAtCWZyZWUoc2hhcmVkX2J1ZmZlcik7Cj4g KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiAqb2JqZWN0ID0gYXJyYXk7Cj4gKwl1 aW50NjRfdCB0bXAgPSBvYmplY3RbaV0ub2Zmc2V0Owo+ICsJb2JqZWN0W2ldLm9mZnNldCA9IG9i amVjdFtqXS5vZmZzZXQ7Cj4gKwlvYmplY3Rbal0ub2Zmc2V0ID0gdG1wOwo+ICB9Cj4gIAo+IC0v KiBnZW1fcGluX25lYXJfNDhCaXRfdGVzdAo+IC0gKiBUaGlzIHRlc3Qgd2lsbCBjcmVhdGUgYSBz aGFyZWQgYnVmZmVyLAo+IC0gKiBhbmQgY3JlYXRlIGEgY29tbWFuZCBmb3IgR1BVIHRvIHdyaXRl IGRhdGEgaW4gaXQuIEl0IHdpbGwgYXR0ZW1wdAo+IC0gKiB0byBwaW4gdGhlIGJ1ZmZlciBhdCBh ZGRyZXNzID4gNDcgYml0cyA8PSA0OC1iaXQuCj4gLSAqIENQVSB3aWxsIHJlYWQgYW5kIG1ha2Ug c3VyZSBleHBlY3RlZCB2YWx1ZSBpcyBvYnRhaW5lZC4KPiAtICogTm90ZSB0aGF0IHdlIG11c3Qg c3VibWl0IGFkZHJlc3NlcyBpbiBjYW5vbmljYWwgZm9ybSwgbm90IG9ubHkKPiAtICogYmVjYXVz ZSB0aGUgYWRkcmVzc3Mgd2lsbCBiZSB2YWxpZGF0ZWQsIGJ1dCBhbHNvIHRoZSByZXR1cm5lZCBv ZmZzZXQKPiAtICogd2lsbCBiZSBpbiB0aGlzIGZvcm1hdC4KPiAtCj4gLSAqIE1hbGxvYyBhIDRL IGJ1ZmZlcgo+IC0gKiBTaGFyZSBidWZmZXIgd2l0aCB3aXRoIEdQVSBieSB1c2luZyB1c2VycHRy IGlvY3RsCj4gLSAqIENyZWF0ZSBiYXRjaCBidWZmZXIgdG8gd3JpdGUgREFUQSB0byBmaXJzdCBk d29yZCBvZiBidWZmZXIKPiAtICogVXNlIHZpcnR1YWwgYWRkcmVzcyBvZiBidWZmZXIgYXMgcmFu Z2UgYmV0d2VlbiA0Ny1iaXQgYW5kIDQ4LWJpdAo+IC0gKiBTZXQgRVhFQ19PQkpFQ1RfUElOTkVE IGZsYWcgaW4gZXhlYyBvYmplY3QKPiAtICogU2V0ICdvZmZzZXQnIGluIGV4ZWMgb2JqZWN0IHRv IHNoYXJlZCBidWZmZXIgVk1BCj4gLSAqIFN1Ym1pdCBleGVjYnVmZmVyCj4gLSAqIFZlcmlmeSB2 YWx1ZSBvZiBmaXJzdCBEV09SRCBpbiBzaGFyZWQgYnVmZmVyIG1hdGNoZXMgREFUQSAtKi8gLSNk ZWZpbmUgQkVHSU5fSElHSF9BRERSRVNTIDB4N0ZGRkZGRkZGMDAwIC0jZGVmaW5lIEVORF9ISUdI X0FERFJFU1MgMHhGRkZGRkZGRkMwMDAgLSNkZWZpbmUgQUREUkVTU19JTkNSRU1FTlQgMHgyMDAw MDAwMDAwIC1zdGF0aWMgdm9pZCBnZW1fcGluX25lYXJfNDhCaXRfdGVzdCh2b2lkKQo+ICtzdGF0 aWMgdm9pZCB0ZXN0X25vcmVsb2MoaW50IGZkKQo+ICB7Cj4gLQlpOTE1X2dlbV91c2VycHRyIHVz ZXJwdHI7Cj4gLQlpbnQgZmQ7Cj4gLQl1aW50MzJfdCAqc2hhcmVkX2J1ZmZlcjsKPiArCWNvbnN0 IGludCBnZW4gPSBpbnRlbF9nZW4oaW50ZWxfZ2V0X2RybV9kZXZpZChmZCkpOwo+ICsJY29uc3Qg dWludDMyX3Qgc2l6ZSA9IDQwOTY7Cj4gKwljb25zdCB1aW50MzJfdCBiYmUgPSBNSV9CQVRDSF9C VUZGRVJfRU5EOwo+ICAJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjYnVmOwo+ IC0Jc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgZXhlY19vYmplY3QyWzJdOwo+IC0J dWludDMyX3QgYmF0Y2hfYnVmZmVyW0JPX1NJWkVdOwo+IC0JdWludDMyX3QgYmF0Y2hfYnVmX2hh bmRsZSwgc2hhcmVkX2J1Zl9oYW5kbGU7Cj4gLQlpbnQgcmluZywgbGVuOwo+IC0JY29uc3QgdWlu dDMyX3QgZGF0YSA9IDB4MTIzNDU2Nzg7Cj4gLQl1aW50NjRfdCBoaWdoX2FkZHJlc3MsIGNhbl9o aWdoX2FkZHJlc3M7Cj4gLQo+IC0JZmQgPSBkcm1fb3Blbl9kcml2ZXIoRFJJVkVSX0lOVEVMKTsK PiAtCWlndF9yZXF1aXJlKHVzZXNfZnVsbF9wcGd0dChmZCwgRlVMTF80OF9CSVRfUFBHVFQpKTsK PiAtCWlndF9yZXF1aXJlKGhhc19zb2Z0cGluX3N1cHBvcnQoZmQpKTsKPiAtCj4gLQliYXRjaF9i dWZfaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgQk9fU0laRSk7Cj4gLQo+IC0JLyogY3JlYXRlIGNw dSBidWZmZXIsIHNldCB0byBhbGwgMHhGJ3MgKi8KPiAtCXNoYXJlZF9idWZmZXIgPSBjcmVhdGVf bWVtX2J1ZmZlcihCT19TSVpFKTsKPiAtCSpzaGFyZWRfYnVmZmVyID0gMHhGRkZGRkZGRjsKPiAt Cj4gLQkvKiBzaGFyZSB3aXRoIEdQVSAqLwo+IC0Jc2hhcmVkX2J1Zl9oYW5kbGUgPSBpbml0X3Vz ZXJwdHIoZmQsICZ1c2VycHRyLCBzaGFyZWRfYnVmZmVyLCBCT19TSVpFKTsKPiAtCj4gLQlmb3Ig KGhpZ2hfYWRkcmVzcyA9IEJFR0lOX0hJR0hfQUREUkVTUzsgaGlnaF9hZGRyZXNzIDw9IEVORF9I SUdIX0FERFJFU1M7Cj4gLQkJCQkJCWhpZ2hfYWRkcmVzcys9QUREUkVTU19JTkNSRU1FTlQpIHsK PiAtCQljYW5faGlnaF9hZGRyZXNzID0gZ2VuOF9jYW5vbmljYWxfYWRkcihoaWdoX2FkZHJlc3Mp Owo+IC0JCS8qIGNyZWF0ZSBjb21tYW5kIGJ1ZmZlciB3aXRoIHdyaXRlIGNvbW1hbmQgKi8KPiAt CQlsZW4gPSBnZW1fc3RvcmVfZGF0YV9zdm0oZmQsIGJhdGNoX2J1ZmZlciwgY2FuX2hpZ2hfYWRk cmVzcywKPiAtCQkJCQlkYXRhLCB0cnVlKTsKPiAtCQlnZW1fd3JpdGUoZmQsIGJhdGNoX2J1Zl9o YW5kbGUsIDAsIGJhdGNoX2J1ZmZlciwgbGVuKTsKPiAtCQkvKiBzdWJtaXQgY29tbWFuZCBidWZm ZXIgKi8KPiAtCQlzZXR1cF9leGVjX29iaigmZXhlY19vYmplY3QyWzBdLCBzaGFyZWRfYnVmX2hh bmRsZSwKPiAtCQkJICAgICAgIEVYRUNfT0JKRUNUX1BJTk5FRCB8IEVYRUNfT0JKRUNUX1NVUFBP UlRTXzQ4Ql9BRERSRVNTLAo+IC0JCQkgICAgICAgY2FuX2hpZ2hfYWRkcmVzcyk7Cj4gLQkJc2V0 dXBfZXhlY19vYmooJmV4ZWNfb2JqZWN0MlsxXSwgYmF0Y2hfYnVmX2hhbmRsZSwgMCwgMCk7Cj4g LQo+IC0JCXJpbmcgPSBJOTE1X0VYRUNfUkVOREVSOwo+IC0JCXNldHVwX2V4ZWNidWZmZXIoJmV4 ZWNidWYsIGV4ZWNfb2JqZWN0MiwgcmluZywgMiwgbGVuKTsKPiAtCQlzdWJtaXRfYW5kX3N5bmMo ZmQsICZleGVjYnVmLCBiYXRjaF9idWZfaGFuZGxlKTsKPiAtCQlnZW1fdXNlcnB0cl9zeW5jKGZk LCBzaGFyZWRfYnVmX2hhbmRsZSk7Cj4gLQo+IC0JCWlndF9hc3NlcnQoZXhlY19vYmplY3QyWzBd Lm9mZnNldCA9PSBjYW5faGlnaF9hZGRyZXNzKTsKPiAtCQkvKiBjaGVjayBvbiBDUFUgdG8gc2Vl IGlmIHZhbHVlIGNoYW5nZXMgKi8KPiAtCQlpZ3RfZmFpbF9vbl9mKHNoYXJlZF9idWZmZXJbMF0g IT0gZGF0YSwKPiAtCQkiXG5DUFUgcmVhZCBkb2VzIG5vdCBtYXRjaCBHUFUgd3JpdGUsIGV4cGVj dGVkOiAweCV4LCBcCj4gLQkJZ290OiAweCV4XG4sIDB4JSJQUkl4NjQiIiwgZGF0YSwgc2hhcmVk X2J1ZmZlclswXSwgaGlnaF9hZGRyZXNzKTsKPiArCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19v YmplY3QyIG9iamVjdFsyNTddOwo+ICsJdWludDY0X3Qgb2Zmc2V0Owo+ICsJdWludDMyX3QgaGFu ZGxlOwo+ICsJdWludDMyX3QgKmJhdGNoLCAqYjsKPiArCWludCBpLCBsb29wOwo+ICsKPiArCWhh bmRsZSA9IGdlbV9jcmVhdGUoZmQsIChBUlJBWV9TSVpFKG9iamVjdCkrMSkqc2l6ZSk7Cj4gKwln ZW1fd3JpdGUoZmQsIGhhbmRsZSwgMCwgJmJiZSwgc2l6ZW9mKGJiZSkpOwo+ICsKPiArCW1lbXNl dChvYmplY3QsIDAsIHNpemVvZihvYmplY3QpKTsKPiArCW9iamVjdFswXS5oYW5kbGUgPSBoYW5k bGU7Cj4gKwo+ICsJLyogRmluZCBhIGhvbGUgKi8KPiArCW1lbXNldCgmZXhlY2J1ZiwgMCwgc2l6 ZW9mKGV4ZWNidWYpKTsKPiArCWV4ZWNidWYuYnVmZmVyc19wdHIgPSAodW5zaWduZWQgbG9uZylv YmplY3Q7Cj4gKwlleGVjYnVmLmJ1ZmZlcl9jb3VudCA9IDE7Cj4gKwlnZW1fZXhlY2J1ZihmZCwg JmV4ZWNidWYpOwo+ICsJZ2VtX2Nsb3NlKGZkLCBvYmplY3RbMF0uaGFuZGxlKTsKPiArCj4gKwlp Z3RfZGVidWcoIk1hZGUgYSAlZHglZCBLaUIgaG9sZTogJTA4bGx4XG4iLAo+ICsJCSAgKGludClB UlJBWV9TSVpFKG9iamVjdCksIHNpemUvMTAyNCwgb2JqZWN0WzBdLm9mZnNldCk7Cj4gKwo+ICsJ b2Zmc2V0ID0gb2JqZWN0WzBdLm9mZnNldDsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KG9iamVjdCkgLSAxOyBpKyspIHsKPiArCQlvYmplY3RbaV0uaGFuZGxlID0gZ2VtX2NyZWF0ZShm ZCwgc2l6ZSk7Cj4gKwkJb2JqZWN0W2ldLm9mZnNldCA9IG9mZnNldCArIGkqc2l6ZTsKPiArCQlv YmplY3RbaV0uZmxhZ3MgPSBFWEVDX09CSkVDVF9QSU5ORUQgfCBFWEVDX09CSkVDVF9XUklURTsK PiAgCX0KPiArCW9iamVjdFtpXS5oYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCAyKnNpemUpOwo+ICsJ b2JqZWN0W2ldLm9mZnNldCA9IG9mZnNldCArIGkqc2l6ZTsKPiArCW9iamVjdFtpXS5mbGFncyA9 IEVYRUNfT0JKRUNUX1BJTk5FRDsKPiArCj4gKwliID0gYmF0Y2ggPSBnZW1fbW1hcF9fY3B1KGZk LCBvYmplY3RbaV0uaGFuZGxlLCAwLCAyKnNpemUsIFBST1RfV1JJVEUpOwo+ICsJZ2VtX3NldF9k b21haW4oZmQsIG9iamVjdFtpXS5oYW5kbGUsCj4gKwkJICAgICAgIEk5MTVfR0VNX0RPTUFJTl9D UFUsIEk5MTVfR0VNX0RPTUFJTl9DUFUpOwo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUo b2JqZWN0KSAtIDE7IGkrKykgewo+ICsJCSpiKysgPSBNSV9TVE9SRV9EV09SRF9JTU07Cj4gKwkJ aWYgKGdlbiA8IDgpIHsKPiArCQkJKmIrKyA9IDA7Cj4gKwkJCSpiKysgPSBvYmplY3RbaV0ub2Zm c2V0Owo+ICsJCX0gZWxzZSB7Cj4gKwkJCSpiKysgPSBvYmplY3RbaV0ub2Zmc2V0Owo+ICsJCQkq YisrID0gb2JqZWN0W2ldLm9mZnNldCA+PiAzMjsKPiArCQl9Cj4gKwkJKmIrKyA9IGk7Cj4gKwl9 Cj4gKwkqYisrID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKPiArCWlndF9hc3NlcnQoYiAtIGJhdGNo IDw9IDIqc2l6ZS9zaXplb2YodWludDMyX3QpKTsKPiArCW11bm1hcChiYXRjaCwgc2l6ZSk7Cj4g IAo+IC0JZ2VtX2Nsb3NlKGZkLCBiYXRjaF9idWZfaGFuZGxlKTsKPiAtCWdlbV9jbG9zZShmZCwg c2hhcmVkX2J1Zl9oYW5kbGUpOwo+IC0JY2xvc2UoZmQpOwo+IC0JZnJlZShzaGFyZWRfYnVmZmVy KTsKPiAtfQo+ICsJZXhlY2J1Zi5idWZmZXJfY291bnQgPSBBUlJBWV9TSVpFKG9iamVjdCk7Cj4g Kwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgMTAyNDsgbG9vcCsrKSB7Cj4gKwkJaWd0X3Blcm11dGVf YXJyYXkob2JqZWN0LCBBUlJBWV9TSVpFKG9iamVjdCktMSwgeGNoZ19vZmZzZXQpOwo+ICsJCWdl bV9leGVjYnVmKGZkLCAmZXhlY2J1Zik7Cj4gIAo+ICsJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9T SVpFKG9iamVjdCkgLSAxOyBpKyspIHsKPiArCQkJdWludDMyX3QgdmFsOwo+ICAKPiAtaW50IG1h aW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKPiAtewo+IC0JaWd0X3N1YnRlc3RfaW5pdChhcmdj LCBhcmd2KTsKPiAtCWlndF9za2lwX29uX3NpbXVsYXRpb24oKTsKPiAtCj4gLQkvKiBBbGwgdGVz dHMgbmVlZCBQUEdUVCBzdXBwb3J0ICovCj4gLQlpZ3Rfc3VidGVzdCgiZ2VtX3Bpbl91c2VycHRy Iikgewo+IC0JCWdlbV9waW5fdXNlcnB0cl90ZXN0KCk7Cj4gLQl9Cj4gLQlpZ3Rfc3VidGVzdCgi Z2VtX3Bpbl9ibyIpIHsKPiAtCQlnZW1fcGluX2JvX3Rlc3QoKTsKPiAtCX0KPiAtCWlndF9zdWJ0 ZXN0KCJnZW1fbXVsdGlwbGVfcHJvY2VzcyIpIHsKPiAtCQlnZW1fbXVsdGlwbGVfcHJvY2Vzc190 ZXN0KCk7Cj4gLQl9Cj4gLQlpZ3Rfc3VidGVzdCgiZ2VtX3JlcGluIikgewo+IC0JCWdlbV9yZXBp bl90ZXN0KCk7Cj4gLQl9Cj4gLQlpZ3Rfc3VidGVzdCgiZ2VtX3Bpbl9vdmVybGFwIikgewo+IC0J CWdlbV9waW5fb3ZlcmxhcF90ZXN0KCk7Cj4gLQl9Cj4gLQlpZ3Rfc3VidGVzdCgiZ2VtX3dyaXRl X211bHRpcGFnZV9idWZmZXIiKSB7Cj4gLQkJZ2VtX3dyaXRlX211bHRpcGFnZV9idWZmZXJfdGVz dCgpOwo+ICsJCQlnZW1fcmVhZChmZCwgb2JqZWN0W2ldLmhhbmRsZSwgMCwgJnZhbCwgc2l6ZW9m KHZhbCkpOwo+ICsJCQlpZ3RfYXNzZXJ0X2VxKHZhbCwgKG9iamVjdFtpXS5vZmZzZXQgLSBvZmZz ZXQpLyBzaXplKTsKPiArCQl9Cj4gIAl9Cj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShv YmplY3QpOyBpKyspCj4gKwkJZ2VtX2Nsb3NlKGZkLCBvYmplY3RbaV0uaGFuZGxlKTsKPiArfQo+ ICAKPiAtCS8qIEZvbGxvd2luZyB0ZXN0cyBuZWVkIDMyLzQ4IEJpdCBQUEdUVCBzdXBwb3J0ICov Cj4gLQlpZ3Rfc3VidGVzdCgiZ2VtX3Bpbl9pbnZhbGlkX3ZtYSIpIHsKPiAtCQlnZW1fcGluX2lu dmFsaWRfdm1hX3Rlc3QoZmFsc2UsIGZhbHNlKTsKPiAtCX0KPiAraWd0X21haW4KPiArewo+ICsJ aW50IGZkID0gLTE7Cj4gIAo+IC0JLyogRm9sbG93aW5nIHRlc3RzIG5lZWQgNDggQml0IFBQR1RU IHN1cHBvcnQgKi8KPiAtCWlndF9zdWJ0ZXN0KCJnZW5fcGluX25vbmNhbm9uaWNhbF9oaWdoX2Fk ZHJlc3MiKSB7Cj4gLQkJZ2VtX3Bpbl9pbnZhbGlkX3ZtYV90ZXN0KGZhbHNlLCB0cnVlKTsKPiAt CX0KPiAtCWlndF9zdWJ0ZXN0KCJnZW1fcGluX2hpZ2hfYWRkcmVzc193aXRob3V0X2NvcnJlY3Rf ZmxhZyIpIHsKPiAtCQlnZW1fcGluX2ludmFsaWRfdm1hX3Rlc3QodHJ1ZSwgZmFsc2UpOwo+IC0J fQo+IC0JaWd0X3N1YnRlc3QoImdlbV9zb2Z0cGluX3N0cmVzcyIpIHsKPiAtCQlnZW1fc29mdHBp bl9zdHJlc3NfdGVzdCgpOwo+IC0JfQo+IC0JaWd0X3N1YnRlc3QoImdlbV9waW5faGlnaF9hZGRy ZXNzIikgewo+IC0JCWdlbV9waW5faGlnaF9hZGRyZXNzX3Rlc3QoKTsKPiAtCX0KPiAtCWlndF9z dWJ0ZXN0KCJnZW1fcGluX25lYXJfNDhCaXQiKSB7Cj4gLQkJZ2VtX3Bpbl9uZWFyXzQ4Qml0X3Rl c3QoKTsKPiArCWlndF9za2lwX29uX3NpbXVsYXRpb24oKTsKPiArCj4gKwlpZ3RfZml4dHVyZSB7 Cj4gKwkJZmQgPSBkcm1fb3Blbl9kcml2ZXIoRFJJVkVSX0lOVEVMKTsKPiArCQlpZ3RfcmVxdWly ZShoYXNfc29mdHBpbl9zdXBwb3J0KGZkKSk7Cj4gIAl9Cj4gIAo+IC0JaWd0X2V4aXQoKTsKPiAr CWlndF9zdWJ0ZXN0KCJpbnZhbGlkIikKPiArCQl0ZXN0X2ludmFsaWQoZmQpOwo+ICsJaWd0X3N1 YnRlc3QoInNvZnRwaW4iKQo+ICsJCXRlc3Rfc29mdHBpbihmZCk7Cj4gKwlpZ3Rfc3VidGVzdCgi b3ZlcmxhcCIpCj4gKwkJdGVzdF9vdmVybGFwKGZkKTsKPiArCWlndF9zdWJ0ZXN0KCJub3JlbG9j IikKPiArCQl0ZXN0X25vcmVsb2MoZmQpOwo+ICsJaWd0X3N1YnRlc3QoImV2aWN0LWFjdGl2ZSIp Cj4gKwkJdGVzdF9ldmljdF9hY3RpdmUoZmQpOwo+ICsJaWd0X3N1YnRlc3QoImV2aWN0LWhhbmci KQo+ICsJCXRlc3RfZXZpY3RfaGFuZyhmZCk7Cj4gKwo+ICsJaWd0X2ZpeHR1cmUKPiArCQljbG9z ZShmZCk7Cj4gIH0KPiAtLQo+IDIuNy4wLnJjMwo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCj4gSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdAo+IEludGVs LWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiBodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3Jn L21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cj4gX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KPiBJbnRlbC1nZnggbWFpbGluZyBsaXN0Cj4gSW50ZWwtZ2Z4 QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+IGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9pbnRlbC1nZngKCi0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVuZ2lu ZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgpodHRwOi8vYmxvZy5mZndsbC5jaApfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0 CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=