From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paulo Zanoni Subject: [PATCH 7/7] lib: add igt_draw Date: Tue, 31 Mar 2015 18:52:08 -0300 Message-ID: <1427838728-5224-1-git-send-email-przanoni@gmail.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qc0-f177.google.com (mail-qc0-f177.google.com [209.85.216.177]) by gabe.freedesktop.org (Postfix) with ESMTP id 2511F6E786 for ; Tue, 31 Mar 2015 14:52:54 -0700 (PDT) Received: by qcbii10 with SMTP id ii10so3470615qcb.2 for ; Tue, 31 Mar 2015 14:52:53 -0700 (PDT) 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: intel-gfx@lists.freedesktop.org Cc: Paulo Zanoni List-Id: intel-gfx@lists.freedesktop.org RnJvbTogUGF1bG8gWmFub25pIDxwYXVsby5yLnphbm9uaUBpbnRlbC5jb20+CgpGb3IgYWxsIHRo b3NlIElHVCB0ZXN0cyB0aGF0IG5lZWQgYW4gZWFzeSB3YXkgdG8gZHJhdyByZWN0YW5nbGVzIG9u CmJ1ZmZlcnMgdXNpbmcgZGlmZmVyZW50IG1ldGhvZHMuIEN1cnJlbnQgcGxhbm5lZCB1c2Vyczog RkJDIGFuZCBQU1IKQ1JDIHRlc3RzLgoKVGhlcmUgaXMgYWxzbyBhIHRlc3RzL2ttc19kcmF3X2Ny YyBwcm9ncmFtIHRvIGNoZWNrIGlmIHRoZSBsaWJyYXJ5IGlzCnNhbmUuCgp2MjogLSBNb3ZlIHRo ZSB0ZXN0IGZyb20gbGliL3Rlc3RzIHRvIHRlc3RzLyAoRGFuaWVsKS4KICAgIC0gQWRkIGlndF9y ZXF1aXJlKCkgdG8gZmlsdGVyIG91dCB0aGUgc3dpenpsaW5nL3RpbGluZyBtZXRob2RzIHdlCiAg ICAgIGRvbid0IHN1cHBvcnQgKERhbmllbCkuCiAgICAtIFNpbXBsaWZ5IHJlbG9jIGhhbmRsaW5n IG9uIHRoZSBCTFQgY2FzZSAoRGFuaWVsKS4KICAgIC0gRG9jdW1lbnQgZW51bSBpZ3RfZHJhd19t ZXRob2QgKERhbmllbCkuCiAgICAtIERvY3VtZW50IGlndF9kcmF3X2dldF9tZXRob2RfbmFtZSgp IChQYXVsbykuCgpTaWduZWQtb2ZmLWJ5OiBQYXVsbyBaYW5vbmkgPHBhdWxvLnIuemFub25pQGlu dGVsLmNvbT4KLS0tCiBsaWIvTWFrZWZpbGUuc291cmNlcyAgIHwgICAyICsKIGxpYi9pZ3RfZHJh dy5jICAgICAgICAgfCA1MDAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKwogbGliL2lndF9kcmF3LmggICAgICAgICB8ICA2MyArKysrKysrCiB0ZXN0cy8u Z2l0aWdub3JlICAgICAgIHwgICAxICsKIHRlc3RzL01ha2VmaWxlLnNvdXJjZXMgfCAgIDEgKwog dGVzdHMva21zX2RyYXdfY3JjLmMgICB8IDI0NyArKysrKysrKysrKysrKysrKysrKysrKysKIDYg ZmlsZXMgY2hhbmdlZCwgODE0IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIv aWd0X2RyYXcuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9pZ3RfZHJhdy5oCiBjcmVhdGUgbW9k ZSAxMDA2NDQgdGVzdHMva21zX2RyYXdfY3JjLmMKClRoZSBvbmx5IHRoaW5ncyBzdWdnZXN0ZWQg YnkgRGFuaWVsIGFuZCBub3QgYWRkcmVzc2VkIGFyZToKIC0gTW92aW5nIHRoZSBpZ3RfZGVidWdf d2FpdF9mb3Jfa2V5cHJlc3MoKSBjYWxscyBpbnRvIHRoZSBDUkMgY29kZS4gVGhpcyBzaG91bGQK ICAgYmUgYSBzZXBhcmF0ZSBwYXRjaC4KIC0gU3VwcG9ydCBmb3IgYSBmYWxsYmFjayBmdW5jdGlv biBmb3Igd2hlbiB0aWxpbmcvc3dpenpsaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCiAgIEZ1bmN0aW9u IGlndF9kcmF3X2ZpbGxfZmIoKSB3YXMgYWxyZWFkeSB0aGVyZSBhbmQgc2hvdWxkIGJlIGVub3Vn aCBmb3IgdGhlc2UKICAgY2FzZXMsIHNpbmNlIGl0IHVzZXMgdGhlIHNpbXBsZSBHVFQgbW1hcCBp bXBsZW1lbnRhdGlvbi4KCmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUuc291cmNlcyBiL2xpYi9N YWtlZmlsZS5zb3VyY2VzCmluZGV4IDNkOTM2MjkuLjg1ZGMzMjEgMTAwNjQ0Ci0tLSBhL2xpYi9N YWtlZmlsZS5zb3VyY2VzCisrKyBiL2xpYi9NYWtlZmlsZS5zb3VyY2VzCkBAIC01Miw2ICs1Miw4 IEBAIGxpYmludGVsX3Rvb2xzX2xhX1NPVVJDRVMgPSAJXAogCWlndF9mYi5oCQlcCiAJaWd0X2Nv cmUuYwkJXAogCWlndF9jb3JlLmgJCVwKKwlpZ3RfZHJhdy5jCQlcCisJaWd0X2RyYXcuaAkJXAog CSQoTlVMTCkKIAogLlBIT05ZOiB2ZXJzaW9uLmgudG1wCmRpZmYgLS1naXQgYS9saWIvaWd0X2Ry YXcuYyBiL2xpYi9pZ3RfZHJhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LjJkYmJlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaWd0X2RyYXcuYwpAQCAtMCwwICsxLDUw MCBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE1IEludGVsIENvcnBvcmF0aW9uCisgKgorICog UGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJz b24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBk b2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBT b2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9u CisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlz dHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdh cmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVy bmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAq CisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGlj ZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGlu IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4K KyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5U WSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1Qg TElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZF TlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBG T1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g QU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJP TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBP UiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVk ZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgImlndF9kcmF3LmgiCisKKyNpbmNsdWRlICJkcm10 ZXN0LmgiCisjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgorI2luY2x1ZGUgImlndF9jb3JlLmgi CisjaW5jbHVkZSAiaWd0X2ZiLmgiCisjaW5jbHVkZSAiaW9jdGxfd3JhcHBlcnMuaCIKKworLyoq CisgKiBTRUNUSU9OOmlndF9kcmF3CisgKiBAc2hvcnRfZGVzY3JpcHRpb246IGRyYXdpbmcgaGVs cGVycyBmb3IgdGVzdHMKKyAqIEB0aXRsZTogaS1nLXQgZHJhdworICogQGluY2x1ZGU6IGlndF9k cmF3LmgKKyAqCisgKiBUaGlzIGxpYnJhcnkgY29udGFpbnMgc29tZSBmdW5jdGlvbnMgZm9yIGRy YXdpbmcgcmVjdGFuZ2xlcyBvbiBidWZmZXJzIHVzaW5nCisgKiB0aGUgbWFueSBkaWZmZXJlbnQg ZHJhd2luZyBtZXRob2RzIHdlIGhhdmUuIEl0IGFsc28gY29udGFpbnMgc29tZSB3cmFwcGVycwor ICogdGhhdCBtYWtlIHRoZSBwcm9jZXNzIGVhc2llciBpZiB5b3UgaGF2ZSB0aGUgYWJzdHJhY3Qg b2JqZWN0cyBpbiBoYW5kLgorICoKKyAqIEFsbCBmdW5jdGlvbnMgYXNzdW1lIHRoZSBidWZmZXJz IGFyZSBpbiB0aGUgWFJHQiA4Ojg6OCBmb3JtYXQuCisgKgorICovCisKKy8qIFNvbWUgaW50ZXJu YWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIGF2b2lkIGhhdmluZyB0byBwYXNzIHRvbnMgb2YgcGFyYW1l dGVycworICogYXJvdW5kIGV2ZXJ5dGhpbmcuICovCitzdHJ1Y3QgY21kX2RhdGEgeworCWRybV9p bnRlbF9idWZtZ3IgKmJ1Zm1ncjsKKwlkcm1faW50ZWxfY29udGV4dCAqY29udGV4dDsKK307CisK K3N0cnVjdCBidWZfZGF0YSB7CisJdWludDMyX3QgaGFuZGxlOworCXVpbnQzMl90IHNpemU7CisJ dWludDMyX3Qgc3RyaWRlOworfTsKKworc3RydWN0IHJlY3QgeworCWludCB4OworCWludCB5Owor CWludCB3OworCWludCBoOworfTsKKworLyoqCisgKiBpZ3RfZHJhd19nZXRfbWV0aG9kX25hbWU6 CisgKgorICogU2ltcGxlIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgZW51bSBpbnRvIGEgc3Ry aW5nLiBVc2VmdWwgd2hlbiBuYW1pbmcKKyAqIHN1YnRlc3RzIGFuZCBwcmludGluZyBkZWJ1ZyBt ZXNzYWdlcy4KKyAqLworY29uc3QgY2hhciAqaWd0X2RyYXdfZ2V0X21ldGhvZF9uYW1lKGVudW0g aWd0X2RyYXdfbWV0aG9kIG1ldGhvZCkKK3sKKwlzd2l0Y2ggKG1ldGhvZCkgeworCWNhc2UgSUdU X0RSQVdfTU1BUF9DUFU6CisJCXJldHVybiAibW1hcC1jcHUiOworCWNhc2UgSUdUX0RSQVdfTU1B UF9HVFQ6CisJCXJldHVybiAibW1hcC1ndHQiOworCWNhc2UgSUdUX0RSQVdfUFdSSVRFOgorCQly ZXR1cm4gInB3cml0ZSI7CisJY2FzZSBJR1RfRFJBV19CTFQ6CisJCXJldHVybiAiYmx0IjsKKwlj YXNlIElHVF9EUkFXX1JFTkRFUjoKKwkJcmV0dXJuICJyZW5kZXIiOworCWRlZmF1bHQ6CisJCWln dF9hc3NlcnQoZmFsc2UpOworCX0KK30KKworc3RhdGljIGludCBzd2l6emxlX2FkZHIoaW50IGFk ZHIsIGludCBzd2l6emxlKQoreworCWludCBiaXQ2OworCisJc3dpdGNoIChzd2l6emxlKSB7CisJ Y2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORToKKwkJYnJlYWs7CisJY2FzZSBJOTE1X0JJVF82 X1NXSVpaTEVfOV8xMDoKKwkJYml0NiA9ICgoYWRkciA+PiA2KSAmIDEpIF4gKChhZGRyID4+IDkp ICYgMSkgXgorCQkgICAgICAgKChhZGRyID4+IDEwKSAmIDEpOworCQlhZGRyICY9IH4oMSA8PCA2 KTsKKwkJYWRkciB8PSAoYml0NiA8PCA2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogSWYg d2UgaGl0IHRoaXMgY2FzZSwgd2UgbmVlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgdGhlCisJ CSAqIGFwcHJvcHJpYXRlIHN3aXp6bGluZyBtZXRob2QuICovCisJCWlndF9yZXF1aXJlKGZhbHNl KTsKKwl9CisKKwlyZXR1cm4gYWRkcjsKK30KKworLyogSXQncyBhbGwgaW4gInBpeGVsIGNvb3Jk aW5hdGVzIiwgc28gbWFrZSBzdXJlIHlvdSBtdWx0aXBseS9kaXZpZGUgYnkgdGhlIGJwcAorICog aWYgeW91IG5lZWQgdG8uICovCitzdGF0aWMgaW50IGxpbmVhcl94X3lfdG9fdGlsZWRfcG9zKGlu dCB4LCBpbnQgeSwgdWludDMyX3Qgc3RyaWRlLCBpbnQgc3dpenpsZSkKK3sKKwlpbnQgeF90aWxl X3NpemUsIHlfdGlsZV9zaXplOworCWludCB4X3RpbGVfbiwgeV90aWxlX24sIHhfdGlsZV9vZmYs IHlfdGlsZV9vZmY7CisJaW50IGxpbmVfc2l6ZSwgdGlsZV9zaXplOworCWludCB0aWxlX24sIHRp bGVfb2ZmOworCWludCB0aWxlZF9wb3MsIHRpbGVzX3Blcl9saW5lOworCWludCBicHA7CisKKwls aW5lX3NpemUgPSBzdHJpZGU7CisJeF90aWxlX3NpemUgPSA1MTI7CisJeV90aWxlX3NpemUgPSA4 OworCXRpbGVfc2l6ZSA9IHhfdGlsZV9zaXplICogeV90aWxlX3NpemU7CisJdGlsZXNfcGVyX2xp bmUgPSBsaW5lX3NpemUgLyB4X3RpbGVfc2l6ZTsKKwlicHAgPSBzaXplb2YodWludDMyX3QpOwor CisJeV90aWxlX24gPSB5IC8geV90aWxlX3NpemU7CisJeV90aWxlX29mZiA9IHkgJSB5X3RpbGVf c2l6ZTsKKworCXhfdGlsZV9uID0gKHggKiBicHApIC8geF90aWxlX3NpemU7CisJeF90aWxlX29m ZiA9ICh4ICogYnBwKSAlIHhfdGlsZV9zaXplOworCisJdGlsZV9uID0geV90aWxlX24gKiB0aWxl c19wZXJfbGluZSArIHhfdGlsZV9uOworCXRpbGVfb2ZmID0geV90aWxlX29mZiAqIHhfdGlsZV9z aXplICsgeF90aWxlX29mZjsKKwl0aWxlZF9wb3MgPSB0aWxlX24gKiB0aWxlX3NpemUgKyB0aWxl X29mZjsKKworCXRpbGVkX3BvcyA9IHN3aXp6bGVfYWRkcih0aWxlZF9wb3MsIHN3aXp6bGUpOwor CisJcmV0dXJuIHRpbGVkX3BvcyAvIGJwcDsKK30KKworLyogSXQncyBhbGwgaW4gInBpeGVsIGNv b3JkaW5hdGVzIiwgc28gbWFrZSBzdXJlIHlvdSBtdWx0aXBseS9kaXZpZGUgYnkgdGhlIGJwcAor ICogaWYgeW91IG5lZWQgdG8uICovCitzdGF0aWMgdm9pZCB0aWxlZF9wb3NfdG9feF95X2xpbmVh cihpbnQgdGlsZWRfcG9zLCB1aW50MzJfdCBzdHJpZGUsCisJCQkJICAgIGludCBzd2l6emxlLCBp bnQgKngsIGludCAqeSkKK3sKKwlpbnQgdGlsZV9uLCB0aWxlX29mZiwgdGlsZXNfcGVyX2xpbmUs IGxpbmVfc2l6ZTsKKwlpbnQgeF90aWxlX29mZiwgeV90aWxlX29mZjsKKwlpbnQgeF90aWxlX24s IHlfdGlsZV9uOworCWludCB4X3RpbGVfc2l6ZSwgeV90aWxlX3NpemUsIHRpbGVfc2l6ZTsKKwlp bnQgYnBwOworCisJdGlsZWRfcG9zID0gc3dpenpsZV9hZGRyKHRpbGVkX3Bvcywgc3dpenpsZSk7 CisKKwlsaW5lX3NpemUgPSBzdHJpZGU7CisJeF90aWxlX3NpemUgPSA1MTI7CisJeV90aWxlX3Np emUgPSA4OworCXRpbGVfc2l6ZSA9IHhfdGlsZV9zaXplICogeV90aWxlX3NpemU7CisJdGlsZXNf cGVyX2xpbmUgPSBsaW5lX3NpemUgLyB4X3RpbGVfc2l6ZTsKKwlicHAgPSBzaXplb2YodWludDMy X3QpOworCisJdGlsZV9uID0gdGlsZWRfcG9zIC8gdGlsZV9zaXplOworCXRpbGVfb2ZmID0gdGls ZWRfcG9zICUgdGlsZV9zaXplOworCisJeV90aWxlX29mZiA9IHRpbGVfb2ZmIC8geF90aWxlX3Np emU7CisJeF90aWxlX29mZiA9IHRpbGVfb2ZmICUgeF90aWxlX3NpemU7CisKKwl4X3RpbGVfbiA9 IHRpbGVfbiAlIHRpbGVzX3Blcl9saW5lOworCXlfdGlsZV9uID0gdGlsZV9uIC8gdGlsZXNfcGVy X2xpbmU7CisKKwkqeCA9ICh4X3RpbGVfbiAqIHhfdGlsZV9zaXplICsgeF90aWxlX29mZikgLyBi cHA7CisJKnkgPSB5X3RpbGVfbiAqIHlfdGlsZV9zaXplICsgeV90aWxlX29mZjsKK30KKworc3Rh dGljIHZvaWQgZHJhd19yZWN0X21tYXBfY3B1KGludCBmZCwgc3RydWN0IGJ1Zl9kYXRhICpidWYs IHN0cnVjdCByZWN0ICpyZWN0LAorCQkJICAgICAgIHVpbnQzMl90IGNvbG9yKQoreworCXVpbnQz Ml90ICpwdHI7CisJaW50IHgsIHksIHBvczsKKwl1aW50MzJfdCB0aWxpbmcsIHN3aXp6bGU7CisK KwlnZW1fc2V0X2RvbWFpbihmZCwgYnVmLT5oYW5kbGUsIEk5MTVfR0VNX0RPTUFJTl9DUFUsCisJ CSAgICAgICBJOTE1X0dFTV9ET01BSU5fQ1BVKTsKKwlnZW1fZ2V0X3RpbGluZyhmZCwgYnVmLT5o YW5kbGUsICZ0aWxpbmcsICZzd2l6emxlKTsKKworCS8qIFdlIGRpZG4ndCBpbXBsZW1lbnQgc3Vw b3J0IGZvciB0aGUgb2xkZXIgdGlsaW5nIG1ldGhvZHMgeWV0LiAqLworCWlmICh0aWxpbmcgIT0g STkxNV9USUxJTkdfTk9ORSkKKwkJaWd0X3JlcXVpcmUoaW50ZWxfZ2VuKGludGVsX2dldF9kcm1f ZGV2aWQoZmQpKSA+PSA1KTsKKworCXB0ciA9IGdlbV9tbWFwX19jcHUoZmQsIGJ1Zi0+aGFuZGxl LCAwLCBidWYtPnNpemUsIDApOworCWlndF9hc3NlcnQocHRyKTsKKworCisJZm9yICh5ID0gcmVj dC0+eTsgeSA8IHJlY3QtPnkgKyByZWN0LT5oOyB5KyspIHsKKwkJZm9yICh4ID0gcmVjdC0+eDsg eCA8IHJlY3QtPnggKyByZWN0LT53OyB4KyspIHsKKwkJCXN3aXRjaCAodGlsaW5nKSB7CisJCQlj YXNlIEk5MTVfVElMSU5HX05PTkU6CisJCQkJcG9zID0gKHkgKiBidWYtPnN0cmlkZSAvIHNpemVv Zih1aW50MzJfdCkpICsgeDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSTkxNV9USUxJTkdfWDoKKwkJ CQlwb3MgPSBsaW5lYXJfeF95X3RvX3RpbGVkX3Bvcyh4LCB5LCBidWYtPnN0cmlkZSwKKwkJCQkJ CQkgICAgICBzd2l6emxlKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWd0X2Fzc2Vy dChmYWxzZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwdHJbcG9zXSA9IGNvbG9yOworCQl9CisJ fQorCisJZ2VtX3N3X2ZpbmlzaChmZCwgYnVmLT5oYW5kbGUpOworCisJaWd0X2Fzc2VydChtdW5t YXAocHRyLCBidWYtPnNpemUpID09IDApOworfQorCitzdGF0aWMgdm9pZCBkcmF3X3JlY3RfbW1h cF9ndHQoaW50IGZkLCBzdHJ1Y3QgYnVmX2RhdGEgKmJ1Ziwgc3RydWN0IHJlY3QgKnJlY3QsCisJ CQkgICAgICAgdWludDMyX3QgY29sb3IpCit7CisJdWludDMyX3QgKnB0cjsKKwlpbnQgeCwgeTsK KworCXB0ciA9IGdlbV9tbWFwX19ndHQoZmQsIGJ1Zi0+aGFuZGxlLCBidWYtPnNpemUsCisJCQkg ICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisJaWd0X2Fzc2VydChwdHIpOworCisJZm9yICh5 ID0gcmVjdC0+eTsgeSA8IHJlY3QtPnkgKyByZWN0LT5oOyB5KyspIHsKKwkJaW50IGxpbmVfYmVn aW4gPSB5ICogYnVmLT5zdHJpZGUgLyBzaXplb2YodWludDMyX3QpOworCQlmb3IgKHggPSByZWN0 LT54OyB4IDwgcmVjdC0+eCArIHJlY3QtPnc7IHgrKykKKwkJCXB0cltsaW5lX2JlZ2luICsgeF0g PSBjb2xvcjsKKwl9CisKKwlpZ3RfYXNzZXJ0KG11bm1hcChwdHIsIGJ1Zi0+c2l6ZSkgPT0gMCk7 Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfcmVjdF9wd3JpdGVfdW50aWxlZChpbnQgZmQsIHN0cnVj dCBidWZfZGF0YSAqYnVmLAorCQkJCSAgICAgc3RydWN0IHJlY3QgKnJlY3QsIHVpbnQzMl90IGNv bG9yKQoreworCXVpbnQzMl90IHRtcFtyZWN0LT53XTsKKwlpbnQgaSwgeSwgb2Zmc2V0LCBicHA7 CisKKwlicHAgPSBzaXplb2YodWludDMyX3QpOworCisJZm9yIChpID0gMDsgaSA8IHJlY3QtPnc7 IGkrKykKKwkJdG1wW2ldID0gY29sb3I7CisKKwlmb3IgKHkgPSByZWN0LT55OyB5IDwgcmVjdC0+ eSArIHJlY3QtPmg7IHkrKykgeworCQlvZmZzZXQgPSAoeSAqIGJ1Zi0+c3RyaWRlKSArIChyZWN0 LT54ICogYnBwKTsKKwkJZ2VtX3dyaXRlKGZkLCBidWYtPmhhbmRsZSwgb2Zmc2V0LCB0bXAsIHJl Y3QtPncgKiBicHApOworCX0KK30KKworc3RhdGljIHZvaWQgZHJhd19yZWN0X3B3cml0ZV90aWxl ZChpbnQgZmQsIHN0cnVjdCBidWZfZGF0YSAqYnVmLAorCQkJCSAgIHN0cnVjdCByZWN0ICpyZWN0 LCB1aW50MzJfdCBjb2xvciwKKwkJCQkgICB1aW50MzJfdCBzd2l6emxlKQoreworCWludCBpOwor CWludCB0aWxlZF9wb3MsIGJwcCwgeCwgeTsKKwl1aW50MzJfdCB0bXBbMTAyNF07CisJaW50IHRt cF91c2VkID0gMCwgdG1wX3NpemUgPSBBUlJBWV9TSVpFKHRtcCk7CisJYm9vbCBmbHVzaF90bXAg PSBmYWxzZTsKKwlpbnQgdG1wX3N0YXJ0X3BvcyA9IDA7CisKKwkvKiBXZSBkaWRuJ3QgaW1wbGVt ZW50IHN1cG9ydCBmb3IgdGhlIG9sZGVyIHRpbGluZyBtZXRob2RzIHlldC4gKi8KKwlpZ3RfcmVx dWlyZShpbnRlbF9nZW4oaW50ZWxfZ2V0X2RybV9kZXZpZChmZCkpID49IDUpOworCisJYnBwID0g c2l6ZW9mKHVpbnQzMl90KTsKKworCS8qIEluc3RlYWQgb2YgZG9pbmcgb25lIHB3cml0ZSBwZXIg cGl4ZWwsIHdlIHRyeSB0byBncm91cCB0aGUgbWF4aW11bQorCSAqIGFtb3VudCBvZiBjb25zZWN1 dGl2ZSBwaXhlbHMgd2UgY2FuIGluIGEgc2luZ2xlIHB3cml0ZTogdGhhdCdzIHdoeSB3ZQorCSAq IHVzZSB0aGUgInRtcCIgdmFyaWFibGVzLiAqLworCWZvciAoaSA9IDA7IGkgPCB0bXBfc2l6ZTsg aSsrKQorCQl0bXBbaV0gPSBjb2xvcjsKKworCWZvciAodGlsZWRfcG9zID0gMDsgdGlsZWRfcG9z IDwgYnVmLT5zaXplOyB0aWxlZF9wb3MgKz0gYnBwKSB7CisJCXRpbGVkX3Bvc190b194X3lfbGlu ZWFyKHRpbGVkX3BvcywgYnVmLT5zdHJpZGUsIHN3aXp6bGUsICZ4LCAmeSk7CisKKwkJaWYgKHgg Pj0gcmVjdC0+eCAmJiB4IDwgcmVjdC0+eCArIHJlY3QtPncgJiYKKwkJICAgIHkgPj0gcmVjdC0+ eSAmJiB5IDwgcmVjdC0+eSArIHJlY3QtPmgpIHsKKwkJCWlmICh0bXBfdXNlZCA9PSAwKQorCQkJ CXRtcF9zdGFydF9wb3MgPSB0aWxlZF9wb3M7CisJCQl0bXBfdXNlZCsrOworCQl9IGVsc2Ugewor CQkJZmx1c2hfdG1wID0gdHJ1ZTsKKwkJfQorCisJCWlmICh0bXBfdXNlZCA9PSB0bXBfc2l6ZSB8 fCAoZmx1c2hfdG1wICYmIHRtcF91c2VkID4gMCkpIHsKKwkJCWdlbV93cml0ZShmZCwgYnVmLT5o YW5kbGUsIHRtcF9zdGFydF9wb3MsIHRtcCwKKwkJCQkgIHRtcF91c2VkICogYnBwKTsKKwkJCWZs dXNoX3RtcCA9IGZhbHNlOworCQkJdG1wX3VzZWQgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMg dm9pZCBkcmF3X3JlY3RfcHdyaXRlKGludCBmZCwgc3RydWN0IGJ1Zl9kYXRhICpidWYsCisJCQkg ICAgIHN0cnVjdCByZWN0ICpyZWN0LCB1aW50MzJfdCBjb2xvcikKK3sKKwl1aW50MzJfdCB0aWxp bmcsIHN3aXp6bGU7CisKKwlnZW1fZ2V0X3RpbGluZyhmZCwgYnVmLT5oYW5kbGUsICZ0aWxpbmcs ICZzd2l6emxlKTsKKworCXN3aXRjaCAodGlsaW5nKSB7CisJY2FzZSBJOTE1X1RJTElOR19OT05F OgorCQlkcmF3X3JlY3RfcHdyaXRlX3VudGlsZWQoZmQsIGJ1ZiwgcmVjdCwgY29sb3IpOworCQli cmVhazsKKwljYXNlIEk5MTVfVElMSU5HX1g6CisJCWRyYXdfcmVjdF9wd3JpdGVfdGlsZWQoZmQs IGJ1ZiwgcmVjdCwgY29sb3IsIHN3aXp6bGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZ3Rf YXNzZXJ0KGZhbHNlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBkcmF3X3JlY3Rf Ymx0KGludCBmZCwgc3RydWN0IGNtZF9kYXRhICpjbWRfZGF0YSwKKwkJCSAgc3RydWN0IGJ1Zl9k YXRhICpidWYsIHN0cnVjdCByZWN0ICpyZWN0LAorCQkJICB1aW50MzJfdCBjb2xvcikKK3sKKwlk cm1faW50ZWxfYm8gKmRzdDsKKwlzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIgKmJhdGNoOworCWlu dCBibHRfY21kX2xlbiwgYmx0X2NtZF90aWxpbmc7CisJdWludDMyX3QgZGV2aWQgPSBpbnRlbF9n ZXRfZHJtX2RldmlkKGZkKTsKKwlpbnQgZ2VuID0gaW50ZWxfZ2VuKGRldmlkKTsKKwl1aW50MzJf dCB0aWxpbmcsIHN3aXp6bGU7CisJaW50IHBpdGNoOworCisJZ2VtX2dldF90aWxpbmcoZmQsIGJ1 Zi0+aGFuZGxlLCAmdGlsaW5nLCAmc3dpenpsZSk7CisKKwlkc3QgPSBnZW1faGFuZGxlX3RvX2xp YmRybV9ibyhjbWRfZGF0YS0+YnVmbWdyLCBmZCwgIiIsIGJ1Zi0+aGFuZGxlKTsKKwlpZ3RfYXNz ZXJ0KGRzdCk7CisKKwliYXRjaCA9IGludGVsX2JhdGNoYnVmZmVyX2FsbG9jKGNtZF9kYXRhLT5i dWZtZ3IsIGRldmlkKTsKKwlpZ3RfYXNzZXJ0KGJhdGNoKTsKKworCWJsdF9jbWRfbGVuID0gKGdl biA+PSA4KSA/ICAweDUgOiAweDQ7CisJYmx0X2NtZF90aWxpbmcgPSAodGlsaW5nKSA/IFhZX0NP TE9SX0JMVF9USUxFRCA6IDA7CisJcGl0Y2ggPSAodGlsaW5nKSA/IGJ1Zi0+c3RyaWRlIC8gNCA6 IGJ1Zi0+c3RyaWRlOworCisJQkVHSU5fQkFUQ0goNiwgMSk7CisJT1VUX0JBVENIKFhZX0NPTE9S X0JMVF9DTURfTk9MRU4gfCBYWV9DT0xPUl9CTFRfV1JJVEVfQUxQSEEgfAorCQkgIFhZX0NPTE9S X0JMVF9XUklURV9SR0IgfCBibHRfY21kX3RpbGluZyB8IGJsdF9jbWRfbGVuKTsKKwlPVVRfQkFU Q0goKDMgPDwgMjQpIHwgKDB4RjAgPDwgMTYpIHwgcGl0Y2gpOworCU9VVF9CQVRDSCgocmVjdC0+ eSA8PCAxNikgfCByZWN0LT54KTsKKwlPVVRfQkFUQ0goKChyZWN0LT55ICsgcmVjdC0+aCkgPDwg MTYpIHwgKHJlY3QtPnggKyByZWN0LT53KSk7CisJT1VUX1JFTE9DX0ZFTkNFRChkc3QsIDAsIEk5 MTVfR0VNX0RPTUFJTl9SRU5ERVIsIDApOworCU9VVF9CQVRDSChjb2xvcik7CisJQURWQU5DRV9C QVRDSCgpOworCisJaW50ZWxfYmF0Y2hidWZmZXJfZmx1c2goYmF0Y2gpOworCWdlbV9zeW5jKGZk LCBidWYtPmhhbmRsZSk7CisJaW50ZWxfYmF0Y2hidWZmZXJfZnJlZShiYXRjaCk7Cit9CisKK3N0 YXRpYyB2b2lkIGRyYXdfcmVjdF9yZW5kZXIoaW50IGZkLCBzdHJ1Y3QgY21kX2RhdGEgKmNtZF9k YXRhLAorCQkJICAgICBzdHJ1Y3QgYnVmX2RhdGEgKmJ1Ziwgc3RydWN0IHJlY3QgKnJlY3QsCisJ CQkgICAgIHVpbnQzMl90IGNvbG9yKQoreworCWRybV9pbnRlbF9ibyAqc3JjLCAqZHN0OworCXVp bnQzMl90IGRldmlkID0gaW50ZWxfZ2V0X2RybV9kZXZpZChmZCk7CisJaWd0X3JlbmRlcl9jb3B5 ZnVuY190IHJlbmRlcmNvcHkgPSBpZ3RfZ2V0X3JlbmRlcl9jb3B5ZnVuYyhkZXZpZCk7CisJc3Ry dWN0IGlndF9idWYgc3JjX2J1ZiwgZHN0X2J1ZjsKKwlzdHJ1Y3QgaW50ZWxfYmF0Y2hidWZmZXIg KmJhdGNoOworCXVpbnQzMl90IHRpbGluZywgc3dpenpsZTsKKwlzdHJ1Y3QgYnVmX2RhdGEgdG1w OworCisJaWd0X3NraXBfb24oIXJlbmRlcmNvcHkpOworCisJZ2VtX2dldF90aWxpbmcoZmQsIGJ1 Zi0+aGFuZGxlLCAmdGlsaW5nLCAmc3dpenpsZSk7CisKKwkvKiBXZSBjcmVhdGUgYSB0ZW1wb3Jh cnkgYnVmZmVyIGFuZCBjb3B5IGZyb20gaXQgdXNpbmcgcmVuZGVyY29weS4gKi8KKwl0bXAuc2l6 ZSA9IHJlY3QtPncgKiByZWN0LT5oICogc2l6ZW9mKHVpbnQzMl90KTsKKwl0bXAuaGFuZGxlID0g Z2VtX2NyZWF0ZShmZCwgdG1wLnNpemUpOworCXRtcC5zdHJpZGUgPSByZWN0LT53ICogc2l6ZW9m KHVpbnQzMl90KTsKKwlkcmF3X3JlY3RfbW1hcF9jcHUoZmQsICZ0bXAsICYoc3RydWN0IHJlY3Qp ezAsIDAsIHJlY3QtPncsIHJlY3QtPmh9LAorCQkJICAgY29sb3IpOworCisJc3JjID0gZ2VtX2hh bmRsZV90b19saWJkcm1fYm8oY21kX2RhdGEtPmJ1Zm1nciwgZmQsICIiLCB0bXAuaGFuZGxlKTsK KwlpZ3RfYXNzZXJ0KHNyYyk7CisJZHN0ID0gZ2VtX2hhbmRsZV90b19saWJkcm1fYm8oY21kX2Rh dGEtPmJ1Zm1nciwgZmQsICIiLCBidWYtPmhhbmRsZSk7CisJaWd0X2Fzc2VydChkc3QpOworCisJ c3JjX2J1Zi5ibyA9IHNyYzsKKwlzcmNfYnVmLnN0cmlkZSA9IHRtcC5zdHJpZGU7CisJc3JjX2J1 Zi50aWxpbmcgPSBJOTE1X1RJTElOR19OT05FOworCXNyY19idWYuc2l6ZSA9IHRtcC5zaXplOwor CWRzdF9idWYuYm8gPSBkc3Q7CisJZHN0X2J1Zi5zdHJpZGUgPSBidWYtPnN0cmlkZTsKKwlkc3Rf YnVmLnRpbGluZyA9IHRpbGluZzsKKwlkc3RfYnVmLnNpemUgPSBidWYtPnNpemU7CisKKwliYXRj aCA9IGludGVsX2JhdGNoYnVmZmVyX2FsbG9jKGNtZF9kYXRhLT5idWZtZ3IsIGRldmlkKTsKKwlp Z3RfYXNzZXJ0KGJhdGNoKTsKKworCXJlbmRlcmNvcHkoYmF0Y2gsIGNtZF9kYXRhLT5jb250ZXh0 LCAmc3JjX2J1ZiwgMCwgMCwgcmVjdC0+dywgcmVjdC0+aCwKKwkJICAgJmRzdF9idWYsIHJlY3Qt PngsIHJlY3QtPnkpOworCisJZ2VtX3N5bmMoZmQsIGJ1Zi0+aGFuZGxlKTsKKwlpbnRlbF9iYXRj aGJ1ZmZlcl9mcmVlKGJhdGNoKTsKKwlnZW1fY2xvc2UoZmQsIHRtcC5oYW5kbGUpOworfQorCisv KioKKyAqIGlndF9kcmF3X3JlY3Q6CisgKiBAZmQ6IHRoZSBEUk0gZmlsZSBkZXNjcmlwdG9yCisg KiBAYnVmbWdyOiB0aGUgbGliZHJtIGJ1Zm1nciwgb25seSByZXF1aXJlZCBmb3IgSUdUX0RSQVdf QkxUIGFuZAorICogICAgICAgICAgSUdUX0RSQVdfUkVOREVSCisgKiBAY29udGV4dDogdGhlIGNv bnRleHQsIGNhbiBiZSBOVUxMIGlmIHlvdSBkb24ndCB3YW50IHRvIHRoaW5rIGFib3V0IGl0Cisg KiBAYnVmX2hhbmRsZTogdGhlIGhhbmRsZSBvZiB0aGUgYnVmZmVyIHdoZXJlIHlvdSdyZSBnb2lu ZyB0byBkcmF3IHRvCisgKiBAYnVmX3NpemU6IHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAqIEBi dWZfc3RyaWRlOiB0aGUgc3RyaWRlIG9mIHRoZSBidWZmZXIKKyAqIEBtZXRob2Q6IG1ldGhvZCB5 b3UncmUgZ29pbmcgdG8gdXNlIHRvIHdyaXRlIHRvIHRoZSBidWZmZXIKKyAqIEByZWN0X3g6IGhv cml6b250YWwgcG9zaXRpb24gb24gdGhlIGJ1ZmZlciB3aGVyZSB5b3VyIHJlY3RhbmdsZSBzdGFy dHMKKyAqIEByZWN0X3k6IHZlcnRpY2FsIHBvc2l0aW9uIG9uIHRoZSBidWZmZXIgd2hlcmUgeW91 ciByZWN0YW5nbGUgc3RhcnRzCisgKiBAcmVjdF93OiB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlCisg KiBAcmVjdF9oOiBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZQorICogQGNvbG9yOiBjb2xvciBvZiB0 aGUgcmVjdGFuZ2xlCisgKgorICogVGhpcyBmdW5jdGlvbiBkcmF3cyBhIGNvbG9yZWQgcmVjdGFu Z2xlIG9uIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFsbG93aW5nCisgKiB5b3UgdG8gc3BlY2lm eSB0aGUgbWV0aG9kIHVzZWQgdG8gZHJhdyB0aGUgcmVjdGFuZ2xlLiBXZSBhc3N1bWUgMzIgYml0 IHBpeGVscworICogd2l0aCA4IGJpdHMgcGVyIGNvbG9yLgorICovCit2b2lkIGlndF9kcmF3X3Jl Y3QoaW50IGZkLCBkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGRybV9pbnRlbF9jb250ZXh0ICpj b250ZXh0LAorCQkgICB1aW50MzJfdCBidWZfaGFuZGxlLCB1aW50MzJfdCBidWZfc2l6ZSwgdWlu dDMyX3QgYnVmX3N0cmlkZSwKKwkJICAgZW51bSBpZ3RfZHJhd19tZXRob2QgbWV0aG9kLCBpbnQg cmVjdF94LCBpbnQgcmVjdF95LAorCQkgICBpbnQgcmVjdF93LCBpbnQgcmVjdF9oLCB1aW50MzJf dCBjb2xvcikKK3sKKwlzdHJ1Y3QgY21kX2RhdGEgY21kX2RhdGEgPSB7CisJCS5idWZtZ3IgPSBi dWZtZ3IsCisJCS5jb250ZXh0ID0gY29udGV4dCwKKwl9OworCXN0cnVjdCBidWZfZGF0YSBidWYg PSB7CisJCS5oYW5kbGUgPSBidWZfaGFuZGxlLAorCQkuc2l6ZSA9IGJ1Zl9zaXplLAorCQkuc3Ry aWRlID0gYnVmX3N0cmlkZSwKKwl9OworCXN0cnVjdCByZWN0IHJlY3QgPSB7CisJCS54ID0gcmVj dF94LAorCQkueSA9IHJlY3RfeSwKKwkJLncgPSByZWN0X3csCisJCS5oID0gcmVjdF9oLAorCX07 CisKKwlzd2l0Y2ggKG1ldGhvZCkgeworCWNhc2UgSUdUX0RSQVdfTU1BUF9DUFU6CisJCWRyYXdf cmVjdF9tbWFwX2NwdShmZCwgJmJ1ZiwgJnJlY3QsIGNvbG9yKTsKKwkJYnJlYWs7CisJY2FzZSBJ R1RfRFJBV19NTUFQX0dUVDoKKwkJZHJhd19yZWN0X21tYXBfZ3R0KGZkLCAmYnVmLCAmcmVjdCwg Y29sb3IpOworCQlicmVhazsKKwljYXNlIElHVF9EUkFXX1BXUklURToKKwkJZHJhd19yZWN0X3B3 cml0ZShmZCwgJmJ1ZiwgJnJlY3QsIGNvbG9yKTsKKwkJYnJlYWs7CisJY2FzZSBJR1RfRFJBV19C TFQ6CisJCWRyYXdfcmVjdF9ibHQoZmQsICZjbWRfZGF0YSwgJmJ1ZiwgJnJlY3QsIGNvbG9yKTsK KwkJYnJlYWs7CisJY2FzZSBJR1RfRFJBV19SRU5ERVI6CisJCWRyYXdfcmVjdF9yZW5kZXIoZmQs ICZjbWRfZGF0YSwgJmJ1ZiwgJnJlY3QsIGNvbG9yKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJ aWd0X2Fzc2VydChmYWxzZSk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBpZ3RfZHJhd19y ZWN0X2ZiOgorICoKKyAqIFRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBpZ3RfZHJhd19yZWN0 LCBidXQgeW91IGNhbiBwYXNzIGFuIGlndF9mYiBpbnN0ZWFkCisgKiBvZiBtYW51YWxseSBwcm92 aWRpbmcgaXRzIGRldGFpbHMuIFNlZSBpZ3RfZHJhd19yZWN0LgorICovCit2b2lkIGlndF9kcmF3 X3JlY3RfZmIoaW50IGZkLCBkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsCisJCSAgICAgIGRybV9p bnRlbF9jb250ZXh0ICpjb250ZXh0LCBzdHJ1Y3QgaWd0X2ZiICpmYiwKKwkJICAgICAgZW51bSBp Z3RfZHJhd19tZXRob2QgbWV0aG9kLCBpbnQgcmVjdF94LCBpbnQgcmVjdF95LAorCQkgICAgICBp bnQgcmVjdF93LCBpbnQgcmVjdF9oLCB1aW50MzJfdCBjb2xvcikKK3sKKwlpZ3RfZHJhd19yZWN0 KGZkLCBidWZtZ3IsIGNvbnRleHQsIGZiLT5nZW1faGFuZGxlLCBmYi0+c2l6ZSwgZmItPnN0cmlk ZSwKKwkJICAgICAgbWV0aG9kLCByZWN0X3gsIHJlY3RfeSwgcmVjdF93LCByZWN0X2gsIGNvbG9y KTsKK30KKworLyoqCisgKiBpZ3RfZHJhd19maWxsX2ZiOgorICogQGZkOiB0aGUgRFJNIGZpbGUg ZGVzY3JpcHRvcgorICogQGZiOiB0aGUgRkIgdGhhdCBpcyBnb2luZyB0byBiZSBmaWxsZWQKKyAq IEBjb2xvcjogdGhlIGNvbG9yIHlvdSdyZSBnb2luZyB0byBwYWludCBpdAorICoKKyAqIFRoaXMg ZnVuY3Rpb24ganVzdCBwYWludHMgYW4gaWd0X2ZiIHVzaW5nIHRoZSBwcm92aWRlZCBjb2xvci4g SXQgYXNzdW1lcyAzMgorICogYml0IHBpeGVscyB3aXRoIDggYml0IGNvbG9ycy4KKyAqLwordm9p ZCBpZ3RfZHJhd19maWxsX2ZiKGludCBmZCwgc3RydWN0IGlndF9mYiAqZmIsIHVpbnQzMl90IGNv bG9yKQoreworCWlndF9kcmF3X3JlY3RfZmIoZmQsIE5VTEwsIE5VTEwsIGZiLCBJR1RfRFJBV19N TUFQX0dUVCwKKwkJCSAwLCAwLCBmYi0+d2lkdGgsIGZiLT5oZWlnaHQsIGNvbG9yKTsKK30KZGlm ZiAtLWdpdCBhL2xpYi9pZ3RfZHJhdy5oIGIvbGliL2lndF9kcmF3LmgKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhOTk2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9pZ3Rf ZHJhdy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNSBJbnRlbCBD b3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2Yg Y2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdh cmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAor ICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5n IHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwg bWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBj b3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUK KyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRo aXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBz aGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9m IHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJ UyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQs IElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB QklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJ TkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQg SE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElB QklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJ U0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNP RlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4K KyAqCisgKi8KKworI2lmbmRlZiBfX0lHVF9EUkFXX0hfXworI2RlZmluZSBfX0lHVF9EUkFXX0hf XworCisjaW5jbHVkZSA8aW50ZWxfYnVmbWdyLmg+CisjaW5jbHVkZSAiaWd0X2ZiLmgiCisKKy8q KgorICppZ3RfZHJhd19tZXRob2Q6CisgKiBASUdUX0RSQVdfTU1BUF9DUFU6IGRyYXcgdXNpbmcg YSBDUFUgbW1hcC4KKyAqIEBJR1RfRFJBV19NTUFQX0dUVDogZHJhdyB1c2luZyBhIEdUVCBtbWFw LgorICogQElHVF9EUkFXX1BXUklURTogZHJhdyB1c2luZyB0aGUgcHdyaXRlIGlvY3RsLgorICog QElHVF9EUkFXX0JMVDogZHJhdyB1c2luZyB0aGUgQkxUIHJpbmcuCisgKiBASUdUX0RSQVdfUkVO REVSOiBkcmF3IHVzaW5nIHRoZSByZW5kZXIgcmluZy4KKyAqIEBJR1RfRFJBV19NRVRIT0RfQ09V TlQ6IHVzZWZ1bCBmb3IgaXRlcmF0aW5nIHRocm91Z2ggZXZlcnl0aGluZy4KKyAqLworZW51bSBp Z3RfZHJhd19tZXRob2QgeworCUlHVF9EUkFXX01NQVBfQ1BVLAorCUlHVF9EUkFXX01NQVBfR1RU LAorCUlHVF9EUkFXX1BXUklURSwKKwlJR1RfRFJBV19CTFQsCisJSUdUX0RSQVdfUkVOREVSLAor CUlHVF9EUkFXX01FVEhPRF9DT1VOVCwKK307CisKK2NvbnN0IGNoYXIgKmlndF9kcmF3X2dldF9t ZXRob2RfbmFtZShlbnVtIGlndF9kcmF3X21ldGhvZCBtZXRob2QpOworCit2b2lkIGlndF9kcmF3 X3JlY3QoaW50IGZkLCBkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGRybV9pbnRlbF9jb250ZXh0 ICpjb250ZXh0LAorCQkgICB1aW50MzJfdCBidWZfaGFuZGxlLCB1aW50MzJfdCBidWZfc2l6ZSwg dWludDMyX3QgYnVmX3N0cmlkZSwKKwkJICAgZW51bSBpZ3RfZHJhd19tZXRob2QgbWV0aG9kLCBp bnQgcmVjdF94LCBpbnQgcmVjdF95LAorCQkgICBpbnQgcmVjdF93LCBpbnQgcmVjdF9oLCB1aW50 MzJfdCBjb2xvcik7CisKK3ZvaWQgaWd0X2RyYXdfcmVjdF9mYihpbnQgZmQsIGRybV9pbnRlbF9i dWZtZ3IgKmJ1Zm1nciwKKwkJICAgICAgZHJtX2ludGVsX2NvbnRleHQgKmNvbnRleHQsIHN0cnVj dCBpZ3RfZmIgKmZiLAorCQkgICAgICBlbnVtIGlndF9kcmF3X21ldGhvZCBtZXRob2QsIGludCBy ZWN0X3gsIGludCByZWN0X3ksCisJCSAgICAgIGludCByZWN0X3csIGludCByZWN0X2gsIHVpbnQz Ml90IGNvbG9yKTsKKwordm9pZCBpZ3RfZHJhd19maWxsX2ZiKGludCBmZCwgc3RydWN0IGlndF9m YiAqZmIsIHVpbnQzMl90IGNvbG9yKTsKKworI2VuZGlmIC8qIF9fSUdUX0RSQVdfSF9fICovCmRp ZmYgLS1naXQgYS90ZXN0cy8uZ2l0aWdub3JlIGIvdGVzdHMvLmdpdGlnbm9yZQppbmRleCAxZjBl MmQxLi5hZTlkZTI5IDEwMDY0NAotLS0gYS90ZXN0cy8uZ2l0aWdub3JlCisrKyBiL3Rlc3RzLy5n aXRpZ25vcmUKQEAgLTEyNSw2ICsxMjUsNyBAQCBnZW43X2ZvcmNld2FrZV9tdAoga21zXzNkCiBr bXNfYWRkZmIKIGttc19jdXJzb3JfY3JjCitrbXNfZHJhd19jcmMKIGttc19mYmNfY3JjCiBrbXNf ZmVuY2VfcGluX2xlYWsKIGttc19mbGlwCmRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5zb3Vy Y2VzIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwppbmRleCA5M2UwNWU0Li5iODk0MWIwIDEwMDY0 NAotLS0gYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzCisrKyBiL3Rlc3RzL01ha2VmaWxlLnNvdXJj ZXMKQEAgLTY5LDYgKzY5LDcgQEAgVEVTVFNfcHJvZ3NfTSA9IFwKIAlnZW1fd3JpdGVfcmVhZF9y aW5nX3N3aXRjaCBcCiAJa21zX2FkZGZiIFwKIAlrbXNfY3Vyc29yX2NyYyBcCisJa21zX2RyYXdf Y3JjIFwKIAlrbXNfZmJjX2NyYyBcCiAJa21zX2ZsaXAgXAogCWttc19mbGlwX2V2ZW50X2xlYWsg XApkaWZmIC0tZ2l0IGEvdGVzdHMva21zX2RyYXdfY3JjLmMgYi90ZXN0cy9rbXNfZHJhd19jcmMu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjMwY2MyCi0tLSAvZGV2L251 bGwKKysrIGIvdGVzdHMva21zX2RyYXdfY3JjLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBD b3B5cmlnaHQgwqkgMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMg aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBh CisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBm aWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91 dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0 cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1Ymxp Y2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVy bWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBz bywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3Zl IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0 aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9y IHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNP RlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQs IEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhF IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBU SEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwg REFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBD T05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElO R1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyogVGhpcyBwcm9ncmFtIHRlc3Rz IHdoZXRoZXIgdGhlIGlndF9kcmF3IGxpYnJhcnkgYWN0dWFsbHkgd29ya3MuICovCisKKyNpbmNs dWRlICJkcm10ZXN0LmgiCisjaW5jbHVkZSAiaWd0X2F1eC5oIgorI2luY2x1ZGUgImlndF9kcmF3 LmgiCisjaW5jbHVkZSAiaWd0X2RlYnVnZnMuaCIKKyNpbmNsdWRlICJpZ3RfZmIuaCIKKyNpbmNs dWRlICJpZ3Rfa21zLmgiCisKKyNkZWZpbmUgTUFYX0NPTk5FQ1RPUlMgMzIKKworc3RydWN0IG1v ZGVzZXRfcGFyYW1zIHsKKwl1aW50MzJfdCBjcnRjX2lkOworCXVpbnQzMl90IGNvbm5lY3Rvcl9p ZDsKKwlkcm1Nb2RlTW9kZUluZm9QdHIgbW9kZTsKK307CisKK2ludCBkcm1fZmQ7Citkcm1Nb2Rl UmVzUHRyIGRybV9yZXM7Citkcm1Nb2RlQ29ubmVjdG9yUHRyIGRybV9jb25uZWN0b3JzW01BWF9D T05ORUNUT1JTXTsKK2RybV9pbnRlbF9idWZtZ3IgKmJ1Zm1ncjsKK2lndF9waXBlX2NyY190ICpw aXBlX2NyYzsKKworYm9vbCBoYXNfbWV0aG9kX2Jhc2VfY3JjID0gZmFsc2U7CitpZ3RfY3JjX3Qg bWV0aG9kX2Jhc2VfY3JjOworCitzdHJ1Y3QgbW9kZXNldF9wYXJhbXMgbXM7CisKK3N0YXRpYyB2 b2lkIGZpbmRfbW9kZXNldF9wYXJhbXModm9pZCkKK3sKKwlpbnQgaTsKKwl1aW50MzJfdCBjb25u ZWN0b3JfaWQgPSAwLCBjcnRjX2lkOworCWRybU1vZGVNb2RlSW5mb1B0ciBtb2RlID0gTlVMTDsK KworCWZvciAoaSA9IDA7IGkgPCBkcm1fcmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJ ZHJtTW9kZUNvbm5lY3RvclB0ciBjID0gZHJtX2Nvbm5lY3RvcnNbaV07CisKKwkJaWYgKGMtPmNv dW50X21vZGVzKSB7CisJCQljb25uZWN0b3JfaWQgPSBjLT5jb25uZWN0b3JfaWQ7CisJCQltb2Rl ID0gJmMtPm1vZGVzWzBdOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWd0X3JlcXVpcmUoY29ubmVj dG9yX2lkKTsKKworCWNydGNfaWQgPSBkcm1fcmVzLT5jcnRjc1swXTsKKwlpZ3RfYXNzZXJ0KGNy dGNfaWQpOworCWlndF9hc3NlcnQobW9kZSk7CisKKwltcy5jb25uZWN0b3JfaWQgPSBjb25uZWN0 b3JfaWQ7CisJbXMuY3J0Y19pZCA9IGNydGNfaWQ7CisJbXMubW9kZSA9IG1vZGU7CisKK30KKwor c3RhdGljIHZvaWQgZ2V0X21ldGhvZF9jcmMoZW51bSBpZ3RfZHJhd19tZXRob2QgbWV0aG9kLCB1 aW50NjRfdCB0aWxpbmcsCisJCQkgICBpZ3RfY3JjX3QgKmNyYykKK3sKKwlzdHJ1Y3QgaWd0X2Zi IGZiOworCWludCByYzsKKworCWlndF9jcmVhdGVfZmIoZHJtX2ZkLCBtcy5tb2RlLT5oZGlzcGxh eSwgbXMubW9kZS0+dmRpc3BsYXksCisJCSAgICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsIHRpbGlu ZywgJmZiKTsKKwlpZ3RfZHJhd19yZWN0X2ZiKGRybV9mZCwgYnVmbWdyLCBOVUxMLCAmZmIsIG1l dGhvZCwKKwkJCSAwLCAwLCBmYi53aWR0aCwgZmIuaGVpZ2h0LCAweEZGKTsKKworCWlndF9kcmF3 X3JlY3RfZmIoZHJtX2ZkLCBidWZtZ3IsIE5VTEwsICZmYiwgbWV0aG9kLAorCQkJIGZiLndpZHRo IC8gNCwgZmIuaGVpZ2h0IC8gNCwKKwkJCSBmYi53aWR0aCAvIDIsIGZiLmhlaWdodCAvIDIsIDB4 RkYwMCk7CisJaWd0X2RyYXdfcmVjdF9mYihkcm1fZmQsIGJ1Zm1nciwgTlVMTCwgJmZiLCBtZXRo b2QsCisJCQkgZmIud2lkdGggLyA4LCBmYi5oZWlnaHQgLyA4LAorCQkJIGZiLndpZHRoIC8gNCwg ZmIuaGVpZ2h0IC8gNCwgMHhGRjAwMDApOworCWlndF9kcmF3X3JlY3RfZmIoZHJtX2ZkLCBidWZt Z3IsIE5VTEwsICZmYiwgbWV0aG9kLAorCQkJIGZiLndpZHRoIC8gMiwgZmIuaGVpZ2h0IC8gMiwK KwkJCSBmYi53aWR0aCAvIDMsIGZiLmhlaWdodCAvIDMsIDB4RkYwMEZGKTsKKworCXJjID0gZHJt TW9kZVNldENydGMoZHJtX2ZkLCBtcy5jcnRjX2lkLCBmYi5mYl9pZCwgMCwgMCwKKwkJCSAgICAm bXMuY29ubmVjdG9yX2lkLCAxLCBtcy5tb2RlKTsKKwlpZ3RfYXNzZXJ0KHJjID09IDApOworCisJ aWd0X2RlYnVnX3dhaXRfZm9yX2tleXByZXNzKCJjcmMiKTsKKwlpZ3RfcGlwZV9jcmNfY29sbGVj dF9jcmMocGlwZV9jcmMsIGNyYyk7CisKKwlrbXN0ZXN0X3Vuc2V0X2FsbF9jcnRjcyhkcm1fZmQs IGRybV9yZXMpOworCWlndF9yZW1vdmVfZmIoZHJtX2ZkLCAmZmIpOworfQorCitzdGF0aWMgdm9p ZCBkcmF3X21ldGhvZF9zdWJ0ZXN0KGVudW0gaWd0X2RyYXdfbWV0aG9kIG1ldGhvZCwgdWludDY0 X3QgdGlsaW5nKQoreworCWlndF9jcmNfdCBjcmM7CisKKwlrbXN0ZXN0X3Vuc2V0X2FsbF9jcnRj cyhkcm1fZmQsIGRybV9yZXMpOworCisJZmluZF9tb2Rlc2V0X3BhcmFtcygpOworCisJLyogVXNl IElHVF9EUkFXX01NQVBfR1RUIG9uIGFuIHVudGlsZWQgYnVmZmVyIGFzIHRoZSBwYXJhbWV0ZXIg Zm9yCisJICogY29tcGFyaXNvbi4gQ2FjaGUgdGhlIHZhbHVlIHNvIHdlIGRvbid0IHJlY29tcHV0 ZSBpdCBmb3IgZXZlcnkgc2luZ2xlCisJICogc3VidGVzdC4gKi8KKwlpZiAoIWhhc19tZXRob2Rf YmFzZV9jcmMpIHsKKwkJZ2V0X21ldGhvZF9jcmMoSUdUX0RSQVdfTU1BUF9HVFQsIExPQ0FMX0RS TV9GT1JNQVRfTU9EX05PTkUsCisJCQkgICAgICAgJm1ldGhvZF9iYXNlX2NyYyk7CisJCWhhc19t ZXRob2RfYmFzZV9jcmMgPSB0cnVlOworCX0KKworCWdldF9tZXRob2RfY3JjKG1ldGhvZCwgdGls aW5nLCAmY3JjKTsKKwlpZ3RfYXNzZXJ0X2NyY19lcXVhbCgmY3JjLCAmbWV0aG9kX2Jhc2VfY3Jj KTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2ZpbGxfY3JjKHVpbnQ2NF90IHRpbGluZywgaWd0X2Ny Y190ICpjcmMpCit7CisJc3RydWN0IGlndF9mYiBmYjsKKwlpbnQgcmM7CisKKwlpZ3RfY3JlYXRl X2ZiKGRybV9mZCwgbXMubW9kZS0+aGRpc3BsYXksIG1zLm1vZGUtPnZkaXNwbGF5LAorCQkgICAg ICBEUk1fRk9STUFUX1hSR0I4ODg4LCB0aWxpbmcsICZmYik7CisKKwlpZ3RfZHJhd19maWxsX2Zi KGRybV9mZCwgJmZiLCAweEZGKTsKKworCXJjID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCBtcy5j cnRjX2lkLCBmYi5mYl9pZCwgMCwgMCwKKwkJCSAgICAmbXMuY29ubmVjdG9yX2lkLCAxLCBtcy5t b2RlKTsKKwlpZ3RfYXNzZXJ0KHJjID09IDApOworCisJaWd0X2RlYnVnX3dhaXRfZm9yX2tleXBy ZXNzKCJjcmMiKTsKKwlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMocGlwZV9jcmMsIGNyYyk7CisK KwlrbXN0ZXN0X3Vuc2V0X2FsbF9jcnRjcyhkcm1fZmQsIGRybV9yZXMpOworCWlndF9yZW1vdmVf ZmIoZHJtX2ZkLCAmZmIpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2ZiX3N1YnRlc3Qodm9pZCkK K3sKKwlpbnQgcmM7CisJc3RydWN0IGlndF9mYiBmYjsKKwlpZ3RfY3JjX3QgYmFzZV9jcmMsIGNy YzsKKworCWttc3Rlc3RfdW5zZXRfYWxsX2NydGNzKGRybV9mZCwgZHJtX3Jlcyk7CisKKwlmaW5k X21vZGVzZXRfcGFyYW1zKCk7CisKKwlpZ3RfY3JlYXRlX2ZiKGRybV9mZCwgbXMubW9kZS0+aGRp c3BsYXksIG1zLm1vZGUtPnZkaXNwbGF5LAorCQkgICAgICBEUk1fRk9STUFUX1hSR0I4ODg4LCBM T0NBTF9EUk1fRk9STUFUX01PRF9OT05FLCAmZmIpOworCisJaWd0X2RyYXdfcmVjdF9mYihkcm1f ZmQsIGJ1Zm1nciwgTlVMTCwgJmZiLCBJR1RfRFJBV19NTUFQX0dUVCwKKwkJCSAwLCAwLCBmYi53 aWR0aCwgZmIuaGVpZ2h0LCAweEZGKTsKKworCXJjID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCBt cy5jcnRjX2lkLCBmYi5mYl9pZCwgMCwgMCwKKwkJCSAgICAmbXMuY29ubmVjdG9yX2lkLCAxLCBt cy5tb2RlKTsKKwlpZ3RfYXNzZXJ0KHJjID09IDApOworCisJaWd0X2RlYnVnX3dhaXRfZm9yX2tl eXByZXNzKCJjcmMiKTsKKwlpZ3RfcGlwZV9jcmNfY29sbGVjdF9jcmMocGlwZV9jcmMsICZiYXNl X2NyYyk7CisKKwlnZXRfZmlsbF9jcmMoTE9DQUxfRFJNX0ZPUk1BVF9NT0RfTk9ORSwgJmNyYyk7 CisJaWd0X2Fzc2VydF9jcmNfZXF1YWwoJmNyYywgJmJhc2VfY3JjKTsKKworCWdldF9maWxsX2Ny YyhMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWF9USUxFRCwgJmNyYyk7CisJaWd0X2Fzc2VydF9jcmNf ZXF1YWwoJmNyYywgJmJhc2VfY3JjKTsKKworCWttc3Rlc3RfdW5zZXRfYWxsX2NydGNzKGRybV9m ZCwgZHJtX3Jlcyk7CisJaWd0X3JlbW92ZV9mYihkcm1fZmQsICZmYik7Cit9CisKK3N0YXRpYyB2 b2lkIHNldHVwX2Vudmlyb25tZW50KHZvaWQpCit7CisJaW50IGk7CisKKwlkcm1fZmQgPSBkcm1f b3Blbl9hbnlfbWFzdGVyKCk7CisJaWd0X3JlcXVpcmUoZHJtX2ZkID49IDApOworCisJZHJtX3Jl cyA9IGRybU1vZGVHZXRSZXNvdXJjZXMoZHJtX2ZkKTsKKwlpZ3RfYXNzZXJ0KGRybV9yZXMtPmNv dW50X2Nvbm5lY3RvcnMgPD0gTUFYX0NPTk5FQ1RPUlMpOworCisJZm9yIChpID0gMDsgaSA8IGRy bV9yZXMtPmNvdW50X2Nvbm5lY3RvcnM7IGkrKykKKwkJZHJtX2Nvbm5lY3RvcnNbaV0gPSBkcm1N b2RlR2V0Q29ubmVjdG9yKGRybV9mZCwKKwkJCQkJCQlkcm1fcmVzLT5jb25uZWN0b3JzW2ldKTsK KworCWttc3Rlc3Rfc2V0X3Z0X2dyYXBoaWNzX21vZGUoKTsKKworCWJ1Zm1nciA9IGRybV9pbnRl bF9idWZtZ3JfZ2VtX2luaXQoZHJtX2ZkLCA0MDk2KTsKKwlpZ3RfYXNzZXJ0KGJ1Zm1ncik7CisJ ZHJtX2ludGVsX2J1Zm1ncl9nZW1fZW5hYmxlX3JldXNlKGJ1Zm1ncik7CisKKwlwaXBlX2NyYyA9 IGlndF9waXBlX2NyY19uZXcoMCwgSU5URUxfUElQRV9DUkNfU09VUkNFX0FVVE8pOworfQorCitz dGF0aWMgdm9pZCB0ZWFyZG93bl9lbnZpcm9ubWVudCh2b2lkKQoreworCWludCBpOworCisJaWd0 X3BpcGVfY3JjX2ZyZWUocGlwZV9jcmMpOworCisJZHJtX2ludGVsX2J1Zm1ncl9kZXN0cm95KGJ1 Zm1ncik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHJtX3Jlcy0+Y291bnRfY29ubmVjdG9yczsgaSsr KQorCQlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihkcm1fY29ubmVjdG9yc1tpXSk7CisKKwlkcm1Nb2Rl RnJlZVJlc291cmNlcyhkcm1fcmVzKTsKKwljbG9zZShkcm1fZmQpOworfQorCitpZ3RfbWFpbgor eworCWVudW0gaWd0X2RyYXdfbWV0aG9kIG1ldGhvZDsKKworCWlndF9maXh0dXJlCisJCXNldHVw X2Vudmlyb25tZW50KCk7CisKKwlmb3IgKG1ldGhvZCA9IDA7IG1ldGhvZCA8IElHVF9EUkFXX01F VEhPRF9DT1VOVDsgbWV0aG9kKyspIHsKKwkJaWd0X3N1YnRlc3RfZigiZHJhdy1tZXRob2QtJXMt dW50aWxlZCIsCisJCQkgICAgICBpZ3RfZHJhd19nZXRfbWV0aG9kX25hbWUobWV0aG9kKSkKKwkJ CWRyYXdfbWV0aG9kX3N1YnRlc3QobWV0aG9kLCBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FKTsK KwkJaWd0X3N1YnRlc3RfZigiZHJhdy1tZXRob2QtJXMtdGlsZWQiLAorCQkJICAgICAgaWd0X2Ry YXdfZ2V0X21ldGhvZF9uYW1lKG1ldGhvZCkpCisJCQlkcmF3X21ldGhvZF9zdWJ0ZXN0KG1ldGhv ZCwKKwkJCQkJICAgIExPQ0FMX0k5MTVfRk9STUFUX01PRF9YX1RJTEVEKTsKKwl9CisKKwlpZ3Rf c3VidGVzdCgiZmlsbC1mYiIpCisJCWZpbGxfZmJfc3VidGVzdCgpOworCisJaWd0X2ZpeHR1cmUK KwkJdGVhcmRvd25fZW52aXJvbm1lbnQoKTsKK30KLS0gCjIuMS40CgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0Cklu dGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=