From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Weinehall Subject: [PATCH i-g-t v4 3/3] tests/gem_concurrent_all: Remove gem_concurrent_all.c Date: Thu, 11 Feb 2016 13:09:34 +0200 Message-ID: <1455188974-17801-4-git-send-email-david.weinehall@linux.intel.com> References: <1455188974-17801-1-git-send-email-david.weinehall@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTP id C46E76E1FB for ; Thu, 11 Feb 2016 03:13:42 -0800 (PST) In-Reply-To: <1455188974-17801-1-git-send-email-david.weinehall@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org V2hlbiBnZW1fY29uY3VycmVudF9ibGl0IHdhcyBjb252ZXJ0ZWQgdG8gdXNlIHRoZSBuZXcgY29t bW9uIGZyYW1ld29yawpmb3IgY2hvb3Npbmcgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBzbG93 L2NvbWJpbmF0b3JpYWwgdGVzdHMsCmdlbV9jb25jdXJyZW50X2FsbCBiZWNhbWUgc3VwZXJmbHVv dXMuICBUaGlzIHBhdGNoIHJlbW92ZXMgaXQuCgpTaWduZWQtb2ZmLWJ5OiBEYXZpZCBXZWluZWhh bGwgPGRhdmlkLndlaW5laGFsbEBsaW51eC5pbnRlbC5jb20+Ci0tLQogdGVzdHMvTWFrZWZpbGUu c291cmNlcyAgICAgfCAgICAxIC0KIHRlc3RzL2dlbV9jb25jdXJyZW50X2FsbC5jIHwgMTU0MCAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMiBmaWxlcyBjaGFu Z2VkLCAxNTQxIGRlbGV0aW9ucygtKQogZGVsZXRlIG1vZGUgMTAwNjQ0IHRlc3RzL2dlbV9jb25j dXJyZW50X2FsbC5jCgpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3Rz L01ha2VmaWxlLnNvdXJjZXMKaW5kZXggZGY5MjU4NmE1NmZjLi4wNWNhNjAzYWE3NjggMTAwNjQ0 Ci0tLSBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKKysrIGIvdGVzdHMvTWFrZWZpbGUuc291cmNl cwpAQCAtMjEsNyArMjEsNiBAQCBURVNUU19wcm9nc19NID0gXAogCWdlbV9jYWNoaW5nIFwKIAln ZW1fY2xvc2VfcmFjZSBcCiAJZ2VtX2NvbmN1cnJlbnRfYmxpdCBcCi0JZ2VtX2NvbmN1cnJlbnRf YWxsIFwKIAlnZW1fY3JlYXRlIFwKIAlnZW1fY3NfdGxiIFwKIAlnZW1fY3R4X3BhcmFtX2Jhc2lj IFwKZGlmZiAtLWdpdCBhL3Rlc3RzL2dlbV9jb25jdXJyZW50X2FsbC5jIGIvdGVzdHMvZ2VtX2Nv bmN1cnJlbnRfYWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliN2VmODcwMGUz MS4uMDAwMDAwMDAwMDAwCi0tLSBhL3Rlc3RzL2dlbV9jb25jdXJyZW50X2FsbC5jCisrKyAvZGV2 L251bGwKQEAgLTEsMTU0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IMKpIDIwMDksMjAxMiwy MDEzIEludGVsIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRl ZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2Yg dGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNv ZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9u LCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29w eSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFu ZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0 byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5v dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Ci0gKiBw YXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwg cG9ydGlvbnMgb2YgdGhlCi0gKiBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJP VklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgot ICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBP RiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB TkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFRIRSBBVVRIT1JTIE9S IENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9U SEVSCi0gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JU IE9SIE9USEVSV0lTRSwgQVJJU0lORwotICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04g V0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwotICogSU4gVEhF IFNPRlRXQVJFLgotICoKLSAqIEF1dGhvcnM6Ci0gKiAgICBFcmljIEFuaG9sdCA8ZXJpY0Bhbmhv bHQubmV0PgotICogICAgQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+Ci0g KiAgICBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0dGVyQGZmd2xsLmNoPgotICoKLSAqLwotCi0v KiogQGZpbGUgZ2VtX2NvbmN1cnJlbnQuYwotICoKLSAqIFRoaXMgaXMgYSB0ZXN0IG9mIHByZWFk L3B3cml0ZS9tbWFwIGJlaGF2aW9yIHdoZW4gd3JpdGluZyB0byBhY3RpdmUKLSAqIGJ1ZmZlcnMu Ci0gKgotICogQmFzZWQgb24gZ2VtX2d0dF9jb25jdXJyZW50X2JsdC4KLSAqLwotCi0jaW5jbHVk ZSAiaWd0LmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNs dWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+ Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5 cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLQotI2luY2x1ZGUgPGRybS5oPgotCi0j aW5jbHVkZSAiaW50ZWxfYnVmbWdyLmgiCi0KLUlHVF9URVNUX0RFU0NSSVBUSU9OKCJUZXN0IG9m IHByZWFkL3B3cml0ZS9tbWFwIGJlaGF2aW9yIHdoZW4gd3JpdGluZyB0byBhY3RpdmUiCi0JCSAg ICAgIiBidWZmZXJzLiIpOwotCi0jZGVmaW5lIExPQ0FMX0k5MTVfR0VNX1VTRVJQVFIgICAgICAg MHgzMwotI2RlZmluZSBMT0NBTF9JT0NUTF9JOTE1X0dFTV9VU0VSUFRSIERSTV9JT1dSIChEUk1f Q09NTUFORF9CQVNFICsgTE9DQUxfSTkxNV9HRU1fVVNFUlBUUiwgc3RydWN0IGxvY2FsX2k5MTVf Z2VtX3VzZXJwdHIpCi1zdHJ1Y3QgbG9jYWxfaTkxNV9nZW1fdXNlcnB0ciB7Ci0JdWludDY0X3Qg dXNlcl9wdHI7Ci0JdWludDY0X3QgdXNlcl9zaXplOwotCXVpbnQzMl90IGZsYWdzOwotCXVpbnQz Ml90IGhhbmRsZTsKLX07Ci0KLWludCBmZCwgZGV2aWQsIGdlbjsKLXN0cnVjdCBpbnRlbF9iYXRj aGJ1ZmZlciAqYmF0Y2g7Ci1pbnQgYWxsOwotaW50IHBhc3M7Ci0KLXN0cnVjdCBidWZmZXJzIHsK LQljb25zdCBzdHJ1Y3QgYWNjZXNzX21vZGUgKm1vZGU7Ci0JZHJtX2ludGVsX2J1Zm1nciAqYnVm bWdyOwotCWRybV9pbnRlbF9ibyAqKnNyYywgKipkc3Q7Ci0JZHJtX2ludGVsX2JvICpzbm9vcCwg KnNwYXJlOwotCXVpbnQzMl90ICp0bXA7Ci0JaW50IHdpZHRoLCBoZWlnaHQsIHNpemU7Ci0JaW50 IGNvdW50OwotfTsKLQotI2RlZmluZSBNSU5fQlVGRkVSUyAzCi0KLXN0YXRpYyB2b2lkIGJsdF9j b3B5X2JvKHN0cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmRzdCwgZHJtX2ludGVsX2Jv ICpzcmMpOwotCi1zdGF0aWMgdm9pZAotbm9wX3JlbGVhc2VfYm8oZHJtX2ludGVsX2JvICpibykK LXsKLQlkcm1faW50ZWxfYm9fdW5yZWZlcmVuY2UoYm8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJ3 X3NldF9ibyhzdHJ1Y3QgYnVmZmVycyAqYiwgZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgdmFs KQotewotCWZvciAoaW50IGkgPSAwOyBpIDwgYi0+c2l6ZTsgaSsrKQotCQliLT50bXBbaV0gPSB2 YWw7Ci0JZHJtX2ludGVsX2JvX3N1YmRhdGEoYm8sIDAsIDQqYi0+c2l6ZSwgYi0+dG1wKTsKLX0K LQotc3RhdGljIHZvaWQKLXByd19jbXBfYm8oc3RydWN0IGJ1ZmZlcnMgKmIsIGRybV9pbnRlbF9i byAqYm8sIHVpbnQzMl90IHZhbCkKLXsKLQl1aW50MzJfdCAqdmFkZHI7Ci0KLQl2YWRkciA9IGIt PnRtcDsKLQlkb19vcl9kaWUoZHJtX2ludGVsX2JvX2dldF9zdWJkYXRhKGJvLCAwLCA0KmItPnNp emUsIHZhZGRyKSk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBiLT5zaXplOyBpKyspCi0JCWlndF9h c3NlcnRfZXFfdTMyKHZhZGRyW2ldLCB2YWwpOwotfQotCi0jZGVmaW5lIHBpeGVsKHksIHdpZHRo KSAoKHkpKih3aWR0aCkgKyAoKCh5KSArIHBhc3MpJSh3aWR0aCkpKQotCi1zdGF0aWMgdm9pZAot cGFydGlhbF9zZXRfYm8oc3RydWN0IGJ1ZmZlcnMgKmIsIGRybV9pbnRlbF9ibyAqYm8sIHVpbnQz Ml90IHZhbCkKLXsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGItPmhlaWdodDsgeSsrKQotCQlkb19v cl9kaWUoZHJtX2ludGVsX2JvX3N1YmRhdGEoYm8sIDQqcGl4ZWwoeSwgYi0+d2lkdGgpLCA0LCAm dmFsKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYXJ0aWFsX2NtcF9ibyhzdHJ1Y3QgYnVmZmVycyAq YiwgZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgdmFsKQotewotCWZvciAoaW50IHkgPSAwOyB5 IDwgYi0+aGVpZ2h0OyB5KyspIHsKLQkJdWludDMyX3QgYnVmOwotCQlkb19vcl9kaWUoZHJtX2lu dGVsX2JvX2dldF9zdWJkYXRhKGJvLCA0KnBpeGVsKHksIGItPndpZHRoKSwgNCwgJmJ1ZikpOwot CQlpZ3RfYXNzZXJ0X2VxX3UzMihidWYsIHZhbCk7Ci0JfQotfQotCi1zdGF0aWMgZHJtX2ludGVs X2JvICoKLWNyZWF0ZV9ub3JtYWxfYm8oZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCB1aW50NjRf dCBzaXplKQotewotCWRybV9pbnRlbF9ibyAqYm87Ci0KLQlibyA9IGRybV9pbnRlbF9ib19hbGxv YyhidWZtZ3IsICJibyIsIHNpemUsIDApOwotCWlndF9hc3NlcnQoYm8pOwotCi0JcmV0dXJuIGJv OwotfQotCi1zdGF0aWMgYm9vbCBjYW5fY3JlYXRlX25vcm1hbCh2b2lkKQotewotCXJldHVybiB0 cnVlOwotfQotCi1zdGF0aWMgZHJtX2ludGVsX2JvICoKLWNyZWF0ZV9wcml2YXRlX2JvKGRybV9p bnRlbF9idWZtZ3IgKmJ1Zm1nciwgdWludDY0X3Qgc2l6ZSkKLXsKLQlkcm1faW50ZWxfYm8gKmJv OwotCXVpbnQzMl90IGhhbmRsZTsKLQotCS8qIFhYWCBnZW1fY3JlYXRlX3dpdGhfZmxhZ3MoZmQs IHNpemUsIEk5MTVfQ1JFQVRFX1BSSVZBVEUpOyAqLwotCi0JaGFuZGxlID0gZ2VtX2NyZWF0ZShm ZCwgc2l6ZSk7Ci0JYm8gPSBnZW1faGFuZGxlX3RvX2xpYmRybV9ibyhidWZtZ3IsIGZkLCAic3Rv bGVuIiwgaGFuZGxlKTsKLQlnZW1fY2xvc2UoZmQsIGhhbmRsZSk7Ci0KLQlyZXR1cm4gYm87Ci19 Ci0KLXN0YXRpYyBib29sIGNhbl9jcmVhdGVfcHJpdmF0ZSh2b2lkKQotewotCXJldHVybiBmYWxz ZTsKLX0KLQotc3RhdGljIGRybV9pbnRlbF9ibyAqCi1jcmVhdGVfc3RvbGVuX2JvKGRybV9pbnRl bF9idWZtZ3IgKmJ1Zm1nciwgdWludDY0X3Qgc2l6ZSkKLXsKLQlkcm1faW50ZWxfYm8gKmJvOwot CXVpbnQzMl90IGhhbmRsZTsKLQotCS8qIFhYWCBnZW1fY3JlYXRlX3dpdGhfZmxhZ3MoZmQsIHNp emUsIEk5MTVfQ1JFQVRFX1NUT0xFTik7ICovCi0KLQloYW5kbGUgPSBnZW1fY3JlYXRlKGZkLCBz aXplKTsKLQlibyA9IGdlbV9oYW5kbGVfdG9fbGliZHJtX2JvKGJ1Zm1nciwgZmQsICJzdG9sZW4i LCBoYW5kbGUpOwotCWdlbV9jbG9zZShmZCwgaGFuZGxlKTsKLQotCXJldHVybiBibzsKLX0KLQot c3RhdGljIGJvb2wgY2FuX2NyZWF0ZV9zdG9sZW4odm9pZCkKLXsKLQkvKiBYWFggY2hlY2sgbnVt X2J1ZmZlcnMgYWdhaW5zdCBhdmFpbGFibGUgc3RvbGVuICovCi0JcmV0dXJuIGZhbHNlOwotfQot Ci1zdGF0aWMgZHJtX2ludGVsX2JvICoKLSgqY3JlYXRlX2Z1bmMpKGRybV9pbnRlbF9idWZtZ3Ig KmJ1Zm1nciwgdWludDY0X3Qgc2l6ZSk7Ci0KLXN0YXRpYyBib29sIGNyZWF0ZV9jcHVfcmVxdWly ZSh2b2lkKQotewotCXJldHVybiBjcmVhdGVfZnVuYyAhPSBjcmVhdGVfc3RvbGVuX2JvOwotfQot Ci1zdGF0aWMgZHJtX2ludGVsX2JvICoKLXVubWFwcGVkX2NyZWF0ZV9ibyhkcm1faW50ZWxfYnVm bWdyICpidWZtZ3IsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLQlyZXR1cm4gY3JlYXRlX2Z1 bmMoYnVmbWdyLCAodWludDY0X3QpNCp3aWR0aCpoZWlnaHQpOwotfQotCi1zdGF0aWMgYm9vbCBj cmVhdGVfc25vb3BfcmVxdWlyZSh2b2lkKQotewotCWlmICghY3JlYXRlX2NwdV9yZXF1aXJlKCkp Ci0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiAhZ2VtX2hhc19sbGMoZmQpOwotfQotCi1zdGF0 aWMgZHJtX2ludGVsX2JvICoKLXNub29wX2NyZWF0ZV9ibyhkcm1faW50ZWxfYnVmbWdyICpidWZt Z3IsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLQlkcm1faW50ZWxfYm8gKmJvOwotCi0JYm8g PSB1bm1hcHBlZF9jcmVhdGVfYm8oYnVmbWdyLCB3aWR0aCwgaGVpZ2h0KTsKLQlnZW1fc2V0X2Nh Y2hpbmcoZmQsIGJvLT5oYW5kbGUsIEk5MTVfQ0FDSElOR19DQUNIRUQpOwotCWRybV9pbnRlbF9i b19kaXNhYmxlX3JldXNlKGJvKTsKLQotCXJldHVybiBibzsKLX0KLQotc3RhdGljIGJvb2wgY3Jl YXRlX3VzZXJwdHJfcmVxdWlyZSh2b2lkKQotewotCXN0YXRpYyBpbnQgZm91bmQgPSAtMTsKLQlp ZiAoZm91bmQgPCAwKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9nZW1fdXNlcnB0ciBhcmc7Ci0KLQkJ Zm91bmQgPSAwOwotCi0JCW1lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7Ci0JCWFyZy51c2Vy X3B0ciA9IC00MDk2VUxMOwotCQlhcmcudXNlcl9zaXplID0gODE5MjsKLQkJZXJybm8gPSAwOwot CQlkcm1Jb2N0bChmZCwgTE9DQUxfSU9DVExfSTkxNV9HRU1fVVNFUlBUUiwgJmFyZyk7Ci0JCWlm IChlcnJubyA9PSBFRkFVTFQpIHsKLQkJCWlndF9hc3NlcnQocG9zaXhfbWVtYWxpZ24oKHZvaWQg KiopJmFyZy51c2VyX3B0ciwKLQkJCQkJCSAgNDA5NiwgYXJnLnVzZXJfc2l6ZSkgPT0gMCk7Ci0J CQlmb3VuZCA9IGRybUlvY3RsKGZkLAotCQkJCQkgTE9DQUxfSU9DVExfSTkxNV9HRU1fVVNFUlBU UiwKLQkJCQkJICZhcmcpID09IDA7Ci0JCQlmcmVlKCh2b2lkICopKHVpbnRwdHJfdClhcmcudXNl cl9wdHIpOwotCQl9Ci0KLQl9Ci0JcmV0dXJuIGZvdW5kOwotfQotCi1zdGF0aWMgZHJtX2ludGVs X2JvICoKLXVzZXJwdHJfY3JlYXRlX2JvKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IHdp ZHRoLCBpbnQgaGVpZ2h0KQotewotCXN0cnVjdCBsb2NhbF9pOTE1X2dlbV91c2VycHRyIHVzZXJw dHI7Ci0JZHJtX2ludGVsX2JvICpibzsKLQl2b2lkICpwdHI7Ci0KLQltZW1zZXQoJnVzZXJwdHIs IDAsIHNpemVvZih1c2VycHRyKSk7Ci0JdXNlcnB0ci51c2VyX3NpemUgPSB3aWR0aCAqIGhlaWdo dCAqIDQ7Ci0JdXNlcnB0ci51c2VyX3NpemUgPSAodXNlcnB0ci51c2VyX3NpemUgKyA0MDk1KSAm IC00MDk2OwotCi0JcHRyID0gbW1hcChOVUxMLCB1c2VycHRyLnVzZXJfc2l6ZSwKLQkJICAgUFJP VF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT04gfCBNQVBfU0hBUkVELCAtMSwgMCk7Ci0JaWd0 X2Fzc2VydChwdHIgIT0gKHZvaWQgKiktMSk7Ci0JdXNlcnB0ci51c2VyX3B0ciA9ICh1aW50cHRy X3QpcHRyOwotCi0JZG9fb3JfZGllKGRybUlvY3RsKGZkLCBMT0NBTF9JT0NUTF9JOTE1X0dFTV9V U0VSUFRSLCAmdXNlcnB0cikpOwotCWJvID0gZ2VtX2hhbmRsZV90b19saWJkcm1fYm8oYnVmbWdy LCBmZCwgInVzZXJwdHIiLCB1c2VycHRyLmhhbmRsZSk7Ci0JYm8tPnZpcnR1YWwgPSAodm9pZCAq KSh1aW50cHRyX3QpdXNlcnB0ci51c2VyX3B0cjsKLQlnZW1fY2xvc2UoZmQsIHVzZXJwdHIuaGFu ZGxlKTsKLQotCXJldHVybiBibzsKLX0KLQotc3RhdGljIHZvaWQKLXVzZXJwdHJfc2V0X2JvKHN0 cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB2YWwpCi17Ci0JaW50 IHNpemUgPSBiLT5zaXplOwotCXVpbnQzMl90ICp2YWRkciA9IGJvLT52aXJ0dWFsOwotCi0JZ2Vt X3NldF9kb21haW4oZmQsIGJvLT5oYW5kbGUsCi0JCSAgICAgICBJOTE1X0dFTV9ET01BSU5fQ1BV LCBJOTE1X0dFTV9ET01BSU5fQ1BVKTsKLQl3aGlsZSAoc2l6ZS0tKQotCQkqdmFkZHIrKyA9IHZh bDsKLX0KLQotc3RhdGljIHZvaWQKLXVzZXJwdHJfY21wX2JvKHN0cnVjdCBidWZmZXJzICpiLCBk cm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB2YWwpCi17Ci0JaW50IHNpemUgPSAgYi0+c2l6ZTsK LQl1aW50MzJfdCAqdmFkZHIgPSBiby0+dmlydHVhbDsKLQotCWdlbV9zZXRfZG9tYWluKGZkLCBi by0+aGFuZGxlLAotCQkgICAgICAgSTkxNV9HRU1fRE9NQUlOX0NQVSwgMCk7Ci0Jd2hpbGUgKHNp emUtLSkKLQkJaWd0X2Fzc2VydF9lcV91MzIoKnZhZGRyKyssIHZhbCk7Ci19Ci0KLXN0YXRpYyB2 b2lkCi11c2VycHRyX3JlbGVhc2VfYm8oZHJtX2ludGVsX2JvICpibykKLXsKLQltdW5tYXAoYm8t PnZpcnR1YWwsIGJvLT5zaXplKTsKLQliby0+dmlydHVhbCA9IE5VTEw7Ci0KLQlkcm1faW50ZWxf Ym9fdW5yZWZlcmVuY2UoYm8pOwotfQotCi1zdGF0aWMgdm9pZAotZ3R0X3NldF9ibyhzdHJ1Y3Qg YnVmZmVycyAqYiwgZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgdmFsKQotewotCXVpbnQzMl90 ICp2YWRkciA9IGJvLT52aXJ0dWFsOwotCWludCBzaXplID0gYi0+c2l6ZTsKLQotCWRybV9pbnRl bF9nZW1fYm9fc3RhcnRfZ3R0X2FjY2VzcyhibywgdHJ1ZSk7Ci0Jd2hpbGUgKHNpemUtLSkKLQkJ KnZhZGRyKysgPSB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ndHRfY21wX2JvKHN0cnVjdCBidWZm ZXJzICpiLCBkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB2YWwpCi17Ci0JdWludDMyX3QgKnZh ZGRyID0gYm8tPnZpcnR1YWw7Ci0KLQkvKiBHVFQgYWNjZXNzIGlzIHNsb3cuIFNvIHdlIGp1c3Qg Y29tcGFyZSBhIGZldyBwb2ludHMgKi8KLQlkcm1faW50ZWxfZ2VtX2JvX3N0YXJ0X2d0dF9hY2Nl c3MoYm8sIGZhbHNlKTsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGItPmhlaWdodDsgeSsrKQotCQlp Z3RfYXNzZXJ0X2VxX3UzMih2YWRkcltwaXhlbCh5LCBiLT53aWR0aCldLCB2YWwpOwotfQotCi1z dGF0aWMgZHJtX2ludGVsX2JvICoKLW1hcF9ibyhkcm1faW50ZWxfYm8gKmJvKQotewotCS8qIGd0 dCBtYXAgZG9lc24ndCBoYXZlIGEgd3JpdGUgcGFyYW1ldGVyLCBzbyBqdXN0IGtlZXAgdGhlIG1h cHBpbmcKLQkgKiBhcm91bmQgKHRvIGF2b2lkIHRoZSBzZXRfZG9tYWluIHdpdGggdGhlIGd0dCB3 cml0ZSBkb21haW4gc2V0KSBhbmQKLQkgKiBtYW51YWxseSB0ZWxsIHRoZSBrZXJuZWwgd2hlbiB3 ZSBzdGFydCBhY2Nlc3MgdGhlIGd0dC4gKi8KLQlkb19vcl9kaWUoZHJtX2ludGVsX2dlbV9ib19t YXBfZ3R0KGJvKSk7Ci0KLQlyZXR1cm4gYm87Ci19Ci0KLXN0YXRpYyBkcm1faW50ZWxfYm8gKgot dGlsZV9ibyhkcm1faW50ZWxfYm8gKmJvLCBpbnQgd2lkdGgpCi17Ci0JdWludDMyX3QgdGlsaW5n ID0gSTkxNV9USUxJTkdfWDsKLQl1aW50MzJfdCBzdHJpZGUgPSB3aWR0aCAqIDQ7Ci0KLQlkb19v cl9kaWUoZHJtX2ludGVsX2JvX3NldF90aWxpbmcoYm8sICZ0aWxpbmcsIHN0cmlkZSkpOwotCi0J cmV0dXJuIGJvOwotfQotCi1zdGF0aWMgZHJtX2ludGVsX2JvICoKLWd0dF9jcmVhdGVfYm8oZHJt X2ludGVsX2J1Zm1nciAqYnVmbWdyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0JcmV0dXJu IG1hcF9ibyh1bm1hcHBlZF9jcmVhdGVfYm8oYnVmbWdyLCB3aWR0aCwgaGVpZ2h0KSk7Ci19Ci0K LXN0YXRpYyBkcm1faW50ZWxfYm8gKgotZ3R0WF9jcmVhdGVfYm8oZHJtX2ludGVsX2J1Zm1nciAq YnVmbWdyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0JcmV0dXJuIHRpbGVfYm8oZ3R0X2Ny ZWF0ZV9ibyhidWZtZ3IsIHdpZHRoLCBoZWlnaHQpLCB3aWR0aCk7Ci19Ci0KLXN0YXRpYyBkcm1f aW50ZWxfYm8gKgotd2NfY3JlYXRlX2JvKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IHdp ZHRoLCBpbnQgaGVpZ2h0KQotewotCWRybV9pbnRlbF9ibyAqYm87Ci0KLQlnZW1fcmVxdWlyZV9t bWFwX3djKGZkKTsKLQotCWJvID0gdW5tYXBwZWRfY3JlYXRlX2JvKGJ1Zm1nciwgd2lkdGgsIGhl aWdodCk7Ci0JYm8tPnZpcnR1YWwgPSBfX2dlbV9tbWFwX193YyhmZCwgYm8tPmhhbmRsZSwgMCwg Ym8tPnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOwotCXJldHVybiBibzsKLX0KLQotc3Rh dGljIHZvaWQKLXdjX3JlbGVhc2VfYm8oZHJtX2ludGVsX2JvICpibykKLXsKLQltdW5tYXAoYm8t PnZpcnR1YWwsIGJvLT5zaXplKTsKLQliby0+dmlydHVhbCA9IE5VTEw7Ci0KLQlub3BfcmVsZWFz ZV9ibyhibyk7Ci19Ci0KLXN0YXRpYyBkcm1faW50ZWxfYm8gKgotZ3B1X2NyZWF0ZV9ibyhkcm1f aW50ZWxfYnVmbWdyICpidWZtZ3IsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLQlyZXR1cm4g dW5tYXBwZWRfY3JlYXRlX2JvKGJ1Zm1nciwgd2lkdGgsIGhlaWdodCk7Ci19Ci0KLXN0YXRpYyBk cm1faW50ZWxfYm8gKgotZ3B1WF9jcmVhdGVfYm8oZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCBp bnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0JcmV0dXJuIHRpbGVfYm8oZ3B1X2NyZWF0ZV9ibyhi dWZtZ3IsIHdpZHRoLCBoZWlnaHQpLCB3aWR0aCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jcHVfc2V0 X2JvKHN0cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB2YWwpCi17 Ci0JaW50IHNpemUgPSBiLT5zaXplOwotCXVpbnQzMl90ICp2YWRkcjsKLQotCWRvX29yX2RpZShk cm1faW50ZWxfYm9fbWFwKGJvLCB0cnVlKSk7Ci0JdmFkZHIgPSBiby0+dmlydHVhbDsKLQl3aGls ZSAoc2l6ZS0tKQotCQkqdmFkZHIrKyA9IHZhbDsKLQlkcm1faW50ZWxfYm9fdW5tYXAoYm8pOwot fQotCi1zdGF0aWMgdm9pZAotY3B1X2NtcF9ibyhzdHJ1Y3QgYnVmZmVycyAqYiwgZHJtX2ludGVs X2JvICpibywgdWludDMyX3QgdmFsKQotewotCWludCBzaXplID0gYi0+c2l6ZTsKLQl1aW50MzJf dCAqdmFkZHI7Ci0KLQlkb19vcl9kaWUoZHJtX2ludGVsX2JvX21hcChibywgZmFsc2UpKTsKLQl2 YWRkciA9IGJvLT52aXJ0dWFsOwotCXdoaWxlIChzaXplLS0pCi0JCWlndF9hc3NlcnRfZXFfdTMy KCp2YWRkcisrLCB2YWwpOwotCWRybV9pbnRlbF9ib191bm1hcChibyk7Ci19Ci0KLXN0YXRpYyB2 b2lkCi1ncHVfc2V0X2JvKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLCBkcm1faW50ZWxfYm8gKmJv LCB1aW50MzJfdCB2YWwpCi17Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5 IHJlbG9jWzFdOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIGdlbV9leGVjWzJd OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZXhlY2J1ZjsKLQl1aW50MzJfdCBi dWZbMTBdLCAqYjsKLQl1aW50MzJfdCB0aWxpbmcsIHN3aXp6bGU7Ci0KLQlkcm1faW50ZWxfYm9f Z2V0X3RpbGluZyhibywgJnRpbGluZywgJnN3aXp6bGUpOwotCi0JbWVtc2V0KHJlbG9jLCAwLCBz aXplb2YocmVsb2MpKTsKLQltZW1zZXQoZ2VtX2V4ZWMsIDAsIHNpemVvZihnZW1fZXhlYykpOwot CW1lbXNldCgmZXhlY2J1ZiwgMCwgc2l6ZW9mKGV4ZWNidWYpKTsKLQotCWIgPSBidWY7Ci0JKmIr KyA9IFhZX0NPTE9SX0JMVF9DTURfTk9MRU4gfAotCQkoKGdlbiA+PSA4KSA/IDUgOiA0KSB8Ci0J CUNPTE9SX0JMVF9XUklURV9BTFBIQSB8IFhZX0NPTE9SX0JMVF9XUklURV9SR0I7Ci0JaWYgKGdl biA+PSA0ICYmIHRpbGluZykgewotCQliWy0xXSB8PSBYWV9DT0xPUl9CTFRfVElMRUQ7Ci0JCSpi ID0gYnVmZmVycy0+d2lkdGg7Ci0JfSBlbHNlCi0JCSpiID0gYnVmZmVycy0+d2lkdGggPDwgMjsK LQkqYisrIHw9IDB4ZjAgPDwgMTYgfCAxIDw8IDI1IHwgMSA8PCAyNDsKLQkqYisrID0gMDsKLQkq YisrID0gYnVmZmVycy0+aGVpZ2h0IDw8IDE2IHwgYnVmZmVycy0+d2lkdGg7Ci0JcmVsb2NbMF0u b2Zmc2V0ID0gKGIgLSBidWYpICogc2l6ZW9mKHVpbnQzMl90KTsKLQlyZWxvY1swXS50YXJnZXRf aGFuZGxlID0gYm8tPmhhbmRsZTsKLQlyZWxvY1swXS5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9E T01BSU5fUkVOREVSOwotCXJlbG9jWzBdLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9S RU5ERVI7Ci0JKmIrKyA9IDA7Ci0JaWYgKGdlbiA+PSA4KQotCQkqYisrID0gMDsKLQkqYisrID0g dmFsOwotCSpiKysgPSBNSV9CQVRDSF9CVUZGRVJfRU5EOwotCWlmICgoYiAtIGJ1ZikgJiAxKQot CQkqYisrID0gMDsKLQotCWdlbV9leGVjWzBdLmhhbmRsZSA9IGJvLT5oYW5kbGU7Ci0JZ2VtX2V4 ZWNbMF0uZmxhZ3MgPSBFWEVDX09CSkVDVF9ORUVEU19GRU5DRTsKLQotCWdlbV9leGVjWzFdLmhh bmRsZSA9IGdlbV9jcmVhdGUoZmQsIDQwOTYpOwotCWdlbV9leGVjWzFdLnJlbG9jYXRpb25fY291 bnQgPSAxOwotCWdlbV9leGVjWzFdLnJlbG9jc19wdHIgPSAodWludHB0cl90KXJlbG9jOwotCi0J ZXhlY2J1Zi5idWZmZXJzX3B0ciA9ICh1aW50cHRyX3QpZ2VtX2V4ZWM7Ci0JZXhlY2J1Zi5idWZm ZXJfY291bnQgPSAyOwotCWV4ZWNidWYuYmF0Y2hfbGVuID0gKGIgLSBidWYpICogc2l6ZW9mKGJ1 ZlswXSk7Ci0JaWYgKGdlbiA+PSA2KQotCQlleGVjYnVmLmZsYWdzID0gSTkxNV9FWEVDX0JMVDsK LQotCWdlbV93cml0ZShmZCwgZ2VtX2V4ZWNbMV0uaGFuZGxlLCAwLCBidWYsIGV4ZWNidWYuYmF0 Y2hfbGVuKTsKLQlnZW1fZXhlY2J1ZihmZCwgJmV4ZWNidWYpOwotCi0JZ2VtX2Nsb3NlKGZkLCBn ZW1fZXhlY1sxXS5oYW5kbGUpOwotfQotCi1zdGF0aWMgdm9pZAotZ3B1X2NtcF9ibyhzdHJ1Y3Qg YnVmZmVycyAqYiwgZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgdmFsKQotewotCWJsdF9jb3B5 X2JvKGIsIGItPnNub29wLCBibyk7Ci0JY3B1X2NtcF9ibyhiLCBiLT5zbm9vcCwgdmFsKTsKLX0K LQotY29uc3Qgc3RydWN0IGFjY2Vzc19tb2RlIHsKLQljb25zdCBjaGFyICpuYW1lOwotCWJvb2wg KCpyZXF1aXJlKSh2b2lkKTsKLQl2b2lkICgqc2V0X2JvKShzdHJ1Y3QgYnVmZmVycyAqYiwgZHJt X2ludGVsX2JvICpibywgdWludDMyX3QgdmFsKTsKLQl2b2lkICgqY21wX2JvKShzdHJ1Y3QgYnVm ZmVycyAqYiwgZHJtX2ludGVsX2JvICpibywgdWludDMyX3QgdmFsKTsKLQlkcm1faW50ZWxfYm8g KigqY3JlYXRlX2JvKShkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGludCB3aWR0aCwgaW50IGhl aWdodCk7Ci0Jdm9pZCAoKnJlbGVhc2VfYm8pKGRybV9pbnRlbF9ibyAqYm8pOwotfSBhY2Nlc3Nf bW9kZXNbXSA9IHsKLQl7Ci0JCS5uYW1lID0gInBydyIsCi0JCS5zZXRfYm8gPSBwcndfc2V0X2Jv LAotCQkuY21wX2JvID0gcHJ3X2NtcF9ibywKLQkJLmNyZWF0ZV9ibyA9IHVubWFwcGVkX2NyZWF0 ZV9ibywKLQkJLnJlbGVhc2VfYm8gPSBub3BfcmVsZWFzZV9ibywKLQl9LAotCXsKLQkJLm5hbWUg PSAicGFydGlhbCIsCi0JCS5zZXRfYm8gPSBwYXJ0aWFsX3NldF9ibywKLQkJLmNtcF9ibyA9IHBh cnRpYWxfY21wX2JvLAotCQkuY3JlYXRlX2JvID0gdW5tYXBwZWRfY3JlYXRlX2JvLAotCQkucmVs ZWFzZV9ibyA9IG5vcF9yZWxlYXNlX2JvLAotCX0sCi0JewotCQkubmFtZSA9ICJjcHUiLAotCQku cmVxdWlyZSA9IGNyZWF0ZV9jcHVfcmVxdWlyZSwKLQkJLnNldF9ibyA9IGNwdV9zZXRfYm8sCi0J CS5jbXBfYm8gPSBjcHVfY21wX2JvLAotCQkuY3JlYXRlX2JvID0gdW5tYXBwZWRfY3JlYXRlX2Jv LAotCQkucmVsZWFzZV9ibyA9IG5vcF9yZWxlYXNlX2JvLAotCX0sCi0JewotCQkubmFtZSA9ICJz bm9vcCIsCi0JCS5yZXF1aXJlID0gY3JlYXRlX3Nub29wX3JlcXVpcmUsCi0JCS5zZXRfYm8gPSBj cHVfc2V0X2JvLAotCQkuY21wX2JvID0gY3B1X2NtcF9ibywKLQkJLmNyZWF0ZV9ibyA9IHNub29w X2NyZWF0ZV9ibywKLQkJLnJlbGVhc2VfYm8gPSBub3BfcmVsZWFzZV9ibywKLQl9LAotCXsKLQkJ Lm5hbWUgPSAidXNlcnB0ciIsCi0JCS5yZXF1aXJlID0gY3JlYXRlX3VzZXJwdHJfcmVxdWlyZSwK LQkJLnNldF9ibyA9IHVzZXJwdHJfc2V0X2JvLAotCQkuY21wX2JvID0gdXNlcnB0cl9jbXBfYm8s Ci0JCS5jcmVhdGVfYm8gPSB1c2VycHRyX2NyZWF0ZV9ibywKLQkJLnJlbGVhc2VfYm8gPSB1c2Vy cHRyX3JlbGVhc2VfYm8sCi0JfSwKLQl7Ci0JCS5uYW1lID0gImd0dCIsCi0JCS5zZXRfYm8gPSBn dHRfc2V0X2JvLAotCQkuY21wX2JvID0gZ3R0X2NtcF9ibywKLQkJLmNyZWF0ZV9ibyA9IGd0dF9j cmVhdGVfYm8sCi0JCS5yZWxlYXNlX2JvID0gbm9wX3JlbGVhc2VfYm8sCi0JfSwKLQl7Ci0JCS5u YW1lID0gImd0dFgiLAotCQkuc2V0X2JvID0gZ3R0X3NldF9ibywKLQkJLmNtcF9ibyA9IGd0dF9j bXBfYm8sCi0JCS5jcmVhdGVfYm8gPSBndHRYX2NyZWF0ZV9ibywKLQkJLnJlbGVhc2VfYm8gPSBu b3BfcmVsZWFzZV9ibywKLQl9LAotCXsKLQkJLm5hbWUgPSAid2MiLAotCQkuc2V0X2JvID0gZ3R0 X3NldF9ibywKLQkJLmNtcF9ibyA9IGd0dF9jbXBfYm8sCi0JCS5jcmVhdGVfYm8gPSB3Y19jcmVh dGVfYm8sCi0JCS5yZWxlYXNlX2JvID0gd2NfcmVsZWFzZV9ibywKLQl9LAotCXsKLQkJLm5hbWUg PSAiZ3B1IiwKLQkJLnNldF9ibyA9IGdwdV9zZXRfYm8sCi0JCS5jbXBfYm8gPSBncHVfY21wX2Jv LAotCQkuY3JlYXRlX2JvID0gZ3B1X2NyZWF0ZV9ibywKLQkJLnJlbGVhc2VfYm8gPSBub3BfcmVs ZWFzZV9ibywKLQl9LAotCXsKLQkJLm5hbWUgPSAiZ3B1WCIsCi0JCS5zZXRfYm8gPSBncHVfc2V0 X2JvLAotCQkuY21wX2JvID0gZ3B1X2NtcF9ibywKLQkJLmNyZWF0ZV9ibyA9IGdwdVhfY3JlYXRl X2JvLAotCQkucmVsZWFzZV9ibyA9IG5vcF9yZWxlYXNlX2JvLAotCX0sCi19OwotCi1pbnQgbnVt X2J1ZmZlcnM7Ci1pZ3RfcmVuZGVyX2NvcHlmdW5jX3QgcmVuZGVyY29weTsKLQotc3RhdGljIHZv aWQgKmJ1ZmZlcnNfaW5pdChzdHJ1Y3QgYnVmZmVycyAqZGF0YSwKLQkJCSAgY29uc3Qgc3RydWN0 IGFjY2Vzc19tb2RlICptb2RlLAotCQkJICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0JCQkgIGlu dCBfZmQsIGludCBlbmFibGVfcmV1c2UpCi17Ci0JZGF0YS0+bW9kZSA9IG1vZGU7Ci0JZGF0YS0+ Y291bnQgPSAwOwotCi0JZGF0YS0+d2lkdGggPSB3aWR0aDsKLQlkYXRhLT5oZWlnaHQgPSBoZWln aHQ7Ci0JZGF0YS0+c2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotCWRhdGEtPnRtcCA9IG1hbGxvYyg0 KmRhdGEtPnNpemUpOwotCWlndF9hc3NlcnQoZGF0YS0+dG1wKTsKLQotCWRhdGEtPmJ1Zm1nciA9 IGRybV9pbnRlbF9idWZtZ3JfZ2VtX2luaXQoX2ZkLCA0MDk2KTsKLQlpZ3RfYXNzZXJ0KGRhdGEt PmJ1Zm1ncik7Ci0KLQlkYXRhLT5zcmMgPSBtYWxsb2MoMipzaXplb2YoZHJtX2ludGVsX2JvICop Km51bV9idWZmZXJzKTsKLQlpZ3RfYXNzZXJ0KGRhdGEtPnNyYyk7Ci0JZGF0YS0+ZHN0ID0gZGF0 YS0+c3JjICsgbnVtX2J1ZmZlcnM7Ci0KLQlpZiAoZW5hYmxlX3JldXNlKQotCQlkcm1faW50ZWxf YnVmbWdyX2dlbV9lbmFibGVfcmV1c2UoZGF0YS0+YnVmbWdyKTsKLQlyZXR1cm4gaW50ZWxfYmF0 Y2hidWZmZXJfYWxsb2MoZGF0YS0+YnVmbWdyLCBkZXZpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ1 ZmZlcnNfZGVzdHJveShzdHJ1Y3QgYnVmZmVycyAqZGF0YSkKLXsKLQlpZiAoZGF0YS0+Y291bnQg PT0gMCkKLQkJcmV0dXJuOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLT5jb3VudDsgaSsr KSB7Ci0JCWRhdGEtPm1vZGUtPnJlbGVhc2VfYm8oZGF0YS0+c3JjW2ldKTsKLQkJZGF0YS0+bW9k ZS0+cmVsZWFzZV9ibyhkYXRhLT5kc3RbaV0pOwotCX0KLQlkYXRhLT5tb2RlLT5yZWxlYXNlX2Jv KGRhdGEtPnNub29wKTsKLQlkYXRhLT5tb2RlLT5yZWxlYXNlX2JvKGRhdGEtPnNwYXJlKTsKLQlk YXRhLT5jb3VudCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ1ZmZlcnNfY3JlYXRlKHN0cnVjdCBi dWZmZXJzICpkYXRhLAotCQkJICAgaW50IGNvdW50KQotewotCWludCB3aWR0aCA9IGRhdGEtPndp ZHRoLCBoZWlnaHQgPSBkYXRhLT5oZWlnaHQ7Ci0JaWd0X2Fzc2VydChkYXRhLT5idWZtZ3IpOwot Ci0JYnVmZmVyc19kZXN0cm95KGRhdGEpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsg aSsrKSB7Ci0JCWRhdGEtPnNyY1tpXSA9Ci0JCQlkYXRhLT5tb2RlLT5jcmVhdGVfYm8oZGF0YS0+ YnVmbWdyLCB3aWR0aCwgaGVpZ2h0KTsKLQkJZGF0YS0+ZHN0W2ldID0KLQkJCWRhdGEtPm1vZGUt PmNyZWF0ZV9ibyhkYXRhLT5idWZtZ3IsIHdpZHRoLCBoZWlnaHQpOwotCX0KLQlkYXRhLT5zcGFy ZSA9IGRhdGEtPm1vZGUtPmNyZWF0ZV9ibyhkYXRhLT5idWZtZ3IsIHdpZHRoLCBoZWlnaHQpOwot CWRhdGEtPnNub29wID0gc25vb3BfY3JlYXRlX2JvKGRhdGEtPmJ1Zm1nciwgd2lkdGgsIGhlaWdo dCk7Ci0JZGF0YS0+Y291bnQgPSBjb3VudDsKLX0KLQotc3RhdGljIHZvaWQgYnVmZmVyc19maW5p KHN0cnVjdCBidWZmZXJzICpkYXRhKQotewotCWlmIChkYXRhLT5idWZtZ3IgPT0gTlVMTCkKLQkJ cmV0dXJuOwotCi0JYnVmZmVyc19kZXN0cm95KGRhdGEpOwotCi0JZnJlZShkYXRhLT50bXApOwot CWZyZWUoZGF0YS0+c3JjKTsKLQlkYXRhLT5zcmMgPSBOVUxMOwotCWRhdGEtPmRzdCA9IE5VTEw7 Ci0KLQlpbnRlbF9iYXRjaGJ1ZmZlcl9mcmVlKGJhdGNoKTsKLQlkcm1faW50ZWxfYnVmbWdyX2Rl c3Ryb3koZGF0YS0+YnVmbWdyKTsKLQlkYXRhLT5idWZtZ3IgPSBOVUxMOwotfQotCi10eXBlZGVm IHZvaWQgKCpkb19jb3B5KShzdHJ1Y3QgYnVmZmVycyAqYiwgZHJtX2ludGVsX2JvICpkc3QsIGRy bV9pbnRlbF9ibyAqc3JjKTsKLXR5cGVkZWYgc3RydWN0IGlndF9oYW5nX3JpbmcgKCpkb19oYW5n KSh2b2lkKTsKLQotc3RhdGljIHZvaWQgcmVuZGVyX2NvcHlfYm8oc3RydWN0IGJ1ZmZlcnMgKmIs IGRybV9pbnRlbF9ibyAqZHN0LCBkcm1faW50ZWxfYm8gKnNyYykKLXsKLQlzdHJ1Y3QgaWd0X2J1 ZiBkID0gewotCQkuYm8gPSBkc3QsCi0JCS5zaXplID0gYi0+c2l6ZSAqIDQsCi0JCS5udW1fdGls ZXMgPSBiLT5zaXplICogNCwKLQkJLnN0cmlkZSA9IGItPndpZHRoICogNCwKLQl9LCBzID0gewot CQkuYm8gPSBzcmMsCi0JCS5zaXplID0gYi0+c2l6ZSAqIDQsCi0JCS5udW1fdGlsZXMgPSBiLT5z aXplICogNCwKLQkJLnN0cmlkZSA9IGItPndpZHRoICogNCwKLQl9OwotCXVpbnQzMl90IHN3aXp6 bGU7Ci0KLQlkcm1faW50ZWxfYm9fZ2V0X3RpbGluZyhkc3QsICZkLnRpbGluZywgJnN3aXp6bGUp OwotCWRybV9pbnRlbF9ib19nZXRfdGlsaW5nKHNyYywgJnMudGlsaW5nLCAmc3dpenpsZSk7Ci0K LQlyZW5kZXJjb3B5KGJhdGNoLCBOVUxMLAotCQkgICAmcywgMCwgMCwKLQkJICAgYi0+d2lkdGgs IGItPmhlaWdodCwKLQkJICAgJmQsIDAsIDApOwotfQotCi1zdGF0aWMgdm9pZCBibHRfY29weV9i byhzdHJ1Y3QgYnVmZmVycyAqYiwgZHJtX2ludGVsX2JvICpkc3QsIGRybV9pbnRlbF9ibyAqc3Jj KQotewotCWludGVsX2JsdF9jb3B5KGJhdGNoLAotCQkgICAgICAgc3JjLCAwLCAwLCA0KmItPndp ZHRoLAotCQkgICAgICAgZHN0LCAwLCAwLCA0KmItPndpZHRoLAotCQkgICAgICAgYi0+d2lkdGgs IGItPmhlaWdodCwgMzIpOwotfQotCi1zdGF0aWMgdm9pZCBjcHVfY29weV9ibyhzdHJ1Y3QgYnVm ZmVycyAqYiwgZHJtX2ludGVsX2JvICpkc3QsIGRybV9pbnRlbF9ibyAqc3JjKQotewotCWNvbnN0 IGludCBzaXplID0gYi0+c2l6ZSAqIHNpemVvZih1aW50MzJfdCk7Ci0Jdm9pZCAqZCwgKnM7Ci0K LQlnZW1fc2V0X2RvbWFpbihmZCwgc3JjLT5oYW5kbGUsIEk5MTVfR0VNX0RPTUFJTl9DUFUsIDAp OwotCWdlbV9zZXRfZG9tYWluKGZkLCBkc3QtPmhhbmRsZSwgSTkxNV9HRU1fRE9NQUlOX0NQVSwg STkxNV9HRU1fRE9NQUlOX0NQVSk7Ci0JcyA9IGdlbV9tbWFwX19jcHUoZmQsIHNyYy0+aGFuZGxl LCAwLCBzaXplLCBQUk9UX1JFQUQpOwotCWQgPSBnZW1fbW1hcF9fY3B1KGZkLCBkc3QtPmhhbmRs ZSwgMCwgc2l6ZSwgUFJPVF9XUklURSk7Ci0KLQltZW1jcHkoZCwgcywgc2l6ZSk7Ci0KLQltdW5t YXAoZCwgc2l6ZSk7Ci0JbXVubWFwKHMsIHNpemUpOwotfQotCi1zdGF0aWMgdm9pZCBndHRfY29w eV9ibyhzdHJ1Y3QgYnVmZmVycyAqYiwgZHJtX2ludGVsX2JvICpkc3QsIGRybV9pbnRlbF9ibyAq c3JjKQotewotCWNvbnN0IGludCBzaXplID0gYi0+c2l6ZSAqIHNpemVvZih1aW50MzJfdCk7Ci0J dm9pZCAqZCwgKnM7Ci0KLQlnZW1fc2V0X2RvbWFpbihmZCwgc3JjLT5oYW5kbGUsIEk5MTVfR0VN X0RPTUFJTl9HVFQsIDApOwotCWdlbV9zZXRfZG9tYWluKGZkLCBkc3QtPmhhbmRsZSwgSTkxNV9H RU1fRE9NQUlOX0dUVCwgSTkxNV9HRU1fRE9NQUlOX0dUVCk7Ci0KLQlzID0gZ2VtX21tYXBfX2d0 dChmZCwgc3JjLT5oYW5kbGUsIHNpemUsIFBST1RfUkVBRCk7Ci0JZCA9IGdlbV9tbWFwX19ndHQo ZmQsIGRzdC0+aGFuZGxlLCBzaXplLCBQUk9UX1dSSVRFKTsKLQotCW1lbWNweShkLCBzLCBzaXpl KTsKLQotCW11bm1hcChkLCBzaXplKTsKLQltdW5tYXAocywgc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2 b2lkIHdjX2NvcHlfYm8oc3RydWN0IGJ1ZmZlcnMgKmIsIGRybV9pbnRlbF9ibyAqZHN0LCBkcm1f aW50ZWxfYm8gKnNyYykKLXsKLQljb25zdCBpbnQgc2l6ZSA9IGItPndpZHRoICogc2l6ZW9mKHVp bnQzMl90KTsKLQl2b2lkICpkLCAqczsKLQotCWdlbV9zZXRfZG9tYWluKGZkLCBzcmMtPmhhbmRs ZSwgSTkxNV9HRU1fRE9NQUlOX0dUVCwgMCk7Ci0JZ2VtX3NldF9kb21haW4oZmQsIGRzdC0+aGFu ZGxlLCBJOTE1X0dFTV9ET01BSU5fR1RULCBJOTE1X0dFTV9ET01BSU5fR1RUKTsKLQotCXMgPSBn ZW1fbW1hcF9fd2MoZmQsIHNyYy0+aGFuZGxlLCAwLCBzaXplLCBQUk9UX1JFQUQpOwotCWQgPSBn ZW1fbW1hcF9fd2MoZmQsIGRzdC0+aGFuZGxlLCAwLCBzaXplLCBQUk9UX1dSSVRFKTsKLQotCW1l bWNweShkLCBzLCBzaXplKTsKLQotCW11bm1hcChkLCBzaXplKTsKLQltdW5tYXAocywgc2l6ZSk7 Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaWd0X2hhbmdfcmluZyBub19oYW5nKHZvaWQpCi17Ci0JcmV0 dXJuIChzdHJ1Y3QgaWd0X2hhbmdfcmluZyl7MCwgMH07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaWd0 X2hhbmdfcmluZyBiY3NfaGFuZyh2b2lkKQotewotCXJldHVybiBpZ3RfaGFuZ19yaW5nKGZkLCBJ OTE1X0VYRUNfQkxUKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpZ3RfaGFuZ19yaW5nIHJjc19oYW5n KHZvaWQpCi17Ci0JcmV0dXJuIGlndF9oYW5nX3JpbmcoZmQsIEk5MTVfRVhFQ19SRU5ERVIpOwot fQotCi1zdGF0aWMgdm9pZCBkb19iYXNpYzAoc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCi0JCSAg ICAgIGRvX2NvcHkgZG9fY29weV9mdW5jLAotCQkgICAgICBkb19oYW5nIGRvX2hhbmdfZnVuYykK LXsKLQlnZW1fcXVpZXNjZW50X2dwdShmZCk7Ci0KLQlidWZmZXJzLT5tb2RlLT5zZXRfYm8oYnVm ZmVycywgYnVmZmVycy0+c3JjWzBdLCAweGRlYWRiZWVmKTsKLQlmb3IgKGludCBpID0gMDsgaSA8 IGJ1ZmZlcnMtPmNvdW50OyBpKyspIHsKLQkJc3RydWN0IGlndF9oYW5nX3JpbmcgaGFuZyA9IGRv X2hhbmdfZnVuYygpOwotCi0JCWRvX2NvcHlfZnVuYyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaV0s IGJ1ZmZlcnMtPnNyY1swXSk7Ci0JCWJ1ZmZlcnMtPm1vZGUtPmNtcF9ibyhidWZmZXJzLCBidWZm ZXJzLT5kc3RbaV0sIDB4ZGVhZGJlZWYpOwotCi0JCWlndF9wb3N0X2hhbmdfcmluZyhmZCwgaGFu Zyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkb19iYXNpYzEoc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZl cnMsCi0JCSAgICAgIGRvX2NvcHkgZG9fY29weV9mdW5jLAotCQkgICAgICBkb19oYW5nIGRvX2hh bmdfZnVuYykKLXsKLQlnZW1fcXVpZXNjZW50X2dwdShmZCk7Ci0KLQlmb3IgKGludCBpID0gMDsg aSA8IGJ1ZmZlcnMtPmNvdW50OyBpKyspIHsKLQkJc3RydWN0IGlndF9oYW5nX3JpbmcgaGFuZyA9 IGRvX2hhbmdfZnVuYygpOwotCi0JCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZm ZXJzLT5zcmNbaV0sIGkpOwotCQlidWZmZXJzLT5tb2RlLT5zZXRfYm8oYnVmZmVycywgYnVmZmVy cy0+ZHN0W2ldLCB+aSk7Ci0KLQkJZG9fY29weV9mdW5jKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtp XSwgYnVmZmVycy0+c3JjW2ldKTsKLQkJdXNsZWVwKDApOyAvKiBsZXQgc29tZW9uZSBlbHNlIGNs YWltIHRoZSBtdXRleCAqLwotCQlidWZmZXJzLT5tb2RlLT5jbXBfYm8oYnVmZmVycywgYnVmZmVy cy0+ZHN0W2ldLCBpKTsKLQotCQlpZ3RfcG9zdF9oYW5nX3JpbmcoZmQsIGhhbmcpOwotCX0KLX0K LQotc3RhdGljIHZvaWQgZG9fYmFzaWNOKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAotCQkgICAg ICBkb19jb3B5IGRvX2NvcHlfZnVuYywKLQkJICAgICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCi17 Ci0Jc3RydWN0IGlndF9oYW5nX3JpbmcgaGFuZzsKLQotCWdlbV9xdWllc2NlbnRfZ3B1KGZkKTsK LQotCWZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVycy0+Y291bnQ7IGkrKykgewotCQlidWZmZXJz LT5tb2RlLT5zZXRfYm8oYnVmZmVycywgYnVmZmVycy0+c3JjW2ldLCBpKTsKLQkJYnVmZmVycy0+ bW9kZS0+c2V0X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgfmkpOwotCX0KLQotCWhhbmcg PSBkb19oYW5nX2Z1bmMoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVycy0+Y291bnQ7 IGkrKykgewotCQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCBidWZmZXJz LT5zcmNbaV0pOwotCQl1c2xlZXAoMCk7IC8qIGxldCBzb21lb25lIGVsc2UgY2xhaW0gdGhlIG11 dGV4ICovCi0JfQotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXJzLT5jb3VudDsgaSsrKQot CQlidWZmZXJzLT5tb2RlLT5jbXBfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCBpKTsKLQot CWlndF9wb3N0X2hhbmdfcmluZyhmZCwgaGFuZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX292ZXJ3 cml0ZV9zb3VyY2Uoc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCi0JCQkJZG9fY29weSBkb19jb3B5 X2Z1bmMsCi0JCQkJZG9faGFuZyBkb19oYW5nX2Z1bmMpCi17Ci0Jc3RydWN0IGlndF9oYW5nX3Jp bmcgaGFuZzsKLQlpbnQgaTsKLQotCWdlbV9xdWllc2NlbnRfZ3B1KGZkKTsKLQlmb3IgKGkgPSAw OyBpIDwgYnVmZmVycy0+Y291bnQ7IGkrKykgewotCQlidWZmZXJzLT5tb2RlLT5zZXRfYm8oYnVm ZmVycywgYnVmZmVycy0+c3JjW2ldLCBpKTsKLQkJYnVmZmVycy0+bW9kZS0+c2V0X2JvKGJ1ZmZl cnMsIGJ1ZmZlcnMtPmRzdFtpXSwgfmkpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgYnVmZmVycy0+ Y291bnQ7IGkrKykKLQkJZG9fY29weV9mdW5jKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgYnVm ZmVycy0+c3JjW2ldKTsKLQloYW5nID0gZG9faGFuZ19mdW5jKCk7Ci0JZm9yIChpID0gYnVmZmVy cy0+Y291bnQ7IGktLTsgKQotCQlidWZmZXJzLT5tb2RlLT5zZXRfYm8oYnVmZmVycywgYnVmZmVy cy0+c3JjW2ldLCAweGRlYWRiZWVmKTsKLQlmb3IgKGkgPSAwOyBpIDwgYnVmZmVycy0+Y291bnQ7 IGkrKykKLQkJYnVmZmVycy0+bW9kZS0+Y21wX2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwg aSk7Ci0JaWd0X3Bvc3RfaGFuZ19yaW5nKGZkLCBoYW5nKTsKLX0KLQotc3RhdGljIHZvaWQgZG9f b3ZlcndyaXRlX3NvdXJjZV9yZWFkKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAotCQkJCSAgICAg ZG9fY29weSBkb19jb3B5X2Z1bmMsCi0JCQkJICAgICBkb19oYW5nIGRvX2hhbmdfZnVuYywKLQkJ CQkgICAgIGludCBkb19yY3MpCi17Ci0JY29uc3QgaW50IGhhbGYgPSBidWZmZXJzLT5jb3VudC8y OwotCXN0cnVjdCBpZ3RfaGFuZ19yaW5nIGhhbmc7Ci0JaW50IGk7Ci0KLQlnZW1fcXVpZXNjZW50 X2dwdShmZCk7Ci0JZm9yIChpID0gMDsgaSA8IGhhbGY7IGkrKykgewotCQlidWZmZXJzLT5tb2Rl LT5zZXRfYm8oYnVmZmVycywgYnVmZmVycy0+c3JjW2ldLCBpKTsKLQkJYnVmZmVycy0+bW9kZS0+ c2V0X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgfmkpOwotCQlidWZmZXJzLT5tb2RlLT5z ZXRfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2kraGFsZl0sIH5pKTsKLQl9Ci0JZm9yIChpID0g MDsgaSA8IGhhbGY7IGkrKykgewotCQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVmZmVycy0+ZHN0 W2ldLCBidWZmZXJzLT5zcmNbaV0pOwotCQlpZiAoZG9fcmNzKQotCQkJcmVuZGVyX2NvcHlfYm8o YnVmZmVycywgYnVmZmVycy0+ZHN0W2kraGFsZl0sIGJ1ZmZlcnMtPnNyY1tpXSk7Ci0JCWVsc2UK LQkJCWJsdF9jb3B5X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpK2hhbGZdLCBidWZmZXJzLT5z cmNbaV0pOwotCX0KLQloYW5nID0gZG9faGFuZ19mdW5jKCk7Ci0JZm9yIChpID0gaGFsZjsgaS0t OyApCi0JCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcmNbaV0sIDB4 ZGVhZGJlZWYpOwotCWZvciAoaSA9IDA7IGkgPCBoYWxmOyBpKyspIHsKLQkJYnVmZmVycy0+bW9k ZS0+Y21wX2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgaSk7Ci0JCWJ1ZmZlcnMtPm1vZGUt PmNtcF9ibyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaStoYWxmXSwgaSk7Ci0JfQotCWlndF9wb3N0 X2hhbmdfcmluZyhmZCwgaGFuZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX292ZXJ3cml0ZV9zb3Vy Y2VfcmVhZF9iY3Moc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCi0JCQkJCSBkb19jb3B5IGRvX2Nv cHlfZnVuYywKLQkJCQkJIGRvX2hhbmcgZG9faGFuZ19mdW5jKQotewotCWRvX292ZXJ3cml0ZV9z b3VyY2VfcmVhZChidWZmZXJzLCBkb19jb3B5X2Z1bmMsIGRvX2hhbmdfZnVuYywgMCk7Ci19Ci0K LXN0YXRpYyB2b2lkIGRvX292ZXJ3cml0ZV9zb3VyY2VfcmVhZF9yY3Moc3RydWN0IGJ1ZmZlcnMg KmJ1ZmZlcnMsCi0JCQkJCSBkb19jb3B5IGRvX2NvcHlfZnVuYywKLQkJCQkJIGRvX2hhbmcgZG9f aGFuZ19mdW5jKQotewotCWRvX292ZXJ3cml0ZV9zb3VyY2VfcmVhZChidWZmZXJzLCBkb19jb3B5 X2Z1bmMsIGRvX2hhbmdfZnVuYywgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX292ZXJ3cml0ZV9z b3VyY2VfX3JldihzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKLQkJCQkgICAgIGRvX2NvcHkgZG9f Y29weV9mdW5jLAotCQkJCSAgICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCi17Ci0Jc3RydWN0IGln dF9oYW5nX3JpbmcgaGFuZzsKLQlpbnQgaTsKLQotCWdlbV9xdWllc2NlbnRfZ3B1KGZkKTsKLQlm b3IgKGkgPSAwOyBpIDwgYnVmZmVycy0+Y291bnQ7IGkrKykgewotCQlidWZmZXJzLT5tb2RlLT5z ZXRfYm8oYnVmZmVycywgYnVmZmVycy0+c3JjW2ldLCBpKTsKLQkJYnVmZmVycy0+bW9kZS0+c2V0 X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgfmkpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwg YnVmZmVycy0+Y291bnQ7IGkrKykKLQkJZG9fY29weV9mdW5jKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRz dFtpXSwgYnVmZmVycy0+c3JjW2ldKTsKLQloYW5nID0gZG9faGFuZ19mdW5jKCk7Ci0JZm9yIChp ID0gMDsgaSA8IGJ1ZmZlcnMtPmNvdW50OyBpKyspCi0JCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhi dWZmZXJzLCBidWZmZXJzLT5zcmNbaV0sIDB4ZGVhZGJlZWYpOwotCWZvciAoaSA9IGJ1ZmZlcnMt PmNvdW50OyBpLS07ICkKLQkJYnVmZmVycy0+bW9kZS0+Y21wX2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMt PmRzdFtpXSwgaSk7Ci0JaWd0X3Bvc3RfaGFuZ19yaW5nKGZkLCBoYW5nKTsKLX0KLQotc3RhdGlj IHZvaWQgZG9fb3ZlcndyaXRlX3NvdXJjZV9fb25lKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAot CQkJCSAgICAgZG9fY29weSBkb19jb3B5X2Z1bmMsCi0JCQkJICAgICBkb19oYW5nIGRvX2hhbmdf ZnVuYykKLXsKLQlzdHJ1Y3QgaWd0X2hhbmdfcmluZyBoYW5nOwotCi0JZ2VtX3F1aWVzY2VudF9n cHUoZmQpOwotCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcmNbMF0s IDApOwotCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5kc3RbMF0sIH4w KTsKLQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVmZmVycy0+ZHN0WzBdLCBidWZmZXJzLT5zcmNb MF0pOwotCWhhbmcgPSBkb19oYW5nX2Z1bmMoKTsKLQlidWZmZXJzLT5tb2RlLT5zZXRfYm8oYnVm ZmVycywgYnVmZmVycy0+c3JjWzBdLCAweGRlYWRiZWVmKTsKLQlidWZmZXJzLT5tb2RlLT5jbXBf Ym8oYnVmZmVycywgYnVmZmVycy0+ZHN0WzBdLCAwKTsKLQlpZ3RfcG9zdF9oYW5nX3JpbmcoZmQs IGhhbmcpOwotfQotCi1zdGF0aWMgdm9pZCBkb19pbnRlcm1peChzdHJ1Y3QgYnVmZmVycyAqYnVm ZmVycywKLQkJCWRvX2NvcHkgZG9fY29weV9mdW5jLAotCQkJZG9faGFuZyBkb19oYW5nX2Z1bmMs Ci0JCQlpbnQgZG9fcmNzKQotewotCWNvbnN0IGludCBoYWxmID0gYnVmZmVycy0+Y291bnQvMjsK LQlzdHJ1Y3QgaWd0X2hhbmdfcmluZyBoYW5nOwotCWludCBpOwotCi0JZ2VtX3F1aWVzY2VudF9n cHUoZmQpOwotCWZvciAoaSA9IDA7IGkgPCBidWZmZXJzLT5jb3VudDsgaSsrKSB7Ci0JCWJ1ZmZl cnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcmNbaV0sIDB4ZGVhZGJlZWZefmkp OwotCQlidWZmZXJzLT5tb2RlLT5zZXRfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCBpKTsK LQl9Ci0JZm9yIChpID0gMDsgaSA8IGhhbGY7IGkrKykgewotCQlpZiAoZG9fcmNzID09IDEgfHwg KGRvX3JjcyA9PSAtMSAmJiBpICYgMSkpCi0JCQlyZW5kZXJfY29weV9ibyhidWZmZXJzLCBidWZm ZXJzLT5kc3RbaV0sIGJ1ZmZlcnMtPnNyY1tpXSk7Ci0JCWVsc2UKLQkJCWJsdF9jb3B5X2JvKGJ1 ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgYnVmZmVycy0+c3JjW2ldKTsKLQotCQlkb19jb3B5X2Z1 bmMoYnVmZmVycywgYnVmZmVycy0+ZHN0W2kraGFsZl0sIGJ1ZmZlcnMtPnNyY1tpXSk7Ci0KLQkJ aWYgKGRvX3JjcyA9PSAxIHx8IChkb19yY3MgPT0gLTEgJiYgKGkgJiAxKSA9PSAwKSkKLQkJCXJl bmRlcl9jb3B5X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgYnVmZmVycy0+ZHN0W2kraGFs Zl0pOwotCQllbHNlCi0JCQlibHRfY29weV9ibyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaV0sIGJ1 ZmZlcnMtPmRzdFtpK2hhbGZdKTsKLQotCQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVmZmVycy0+ ZHN0W2kraGFsZl0sIGJ1ZmZlcnMtPnNyY1tpK2hhbGZdKTsKLQl9Ci0JaGFuZyA9IGRvX2hhbmdf ZnVuYygpOwotCWZvciAoaSA9IDA7IGkgPCAyKmhhbGY7IGkrKykKLQkJYnVmZmVycy0+bW9kZS0+ Y21wX2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgMHhkZWFkYmVlZl5+aSk7Ci0JaWd0X3Bv c3RfaGFuZ19yaW5nKGZkLCBoYW5nKTsKLX0KLQotc3RhdGljIHZvaWQgZG9faW50ZXJtaXhfcmNz KHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAotCQkJICAgIGRvX2NvcHkgZG9fY29weV9mdW5jLAot CQkJICAgIGRvX2hhbmcgZG9faGFuZ19mdW5jKQotewotCWRvX2ludGVybWl4KGJ1ZmZlcnMsIGRv X2NvcHlfZnVuYywgZG9faGFuZ19mdW5jLCAxKTsKLX0KLQotc3RhdGljIHZvaWQgZG9faW50ZXJt aXhfYmNzKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAotCQkJICAgIGRvX2NvcHkgZG9fY29weV9m dW5jLAotCQkJICAgIGRvX2hhbmcgZG9faGFuZ19mdW5jKQotewotCWRvX2ludGVybWl4KGJ1ZmZl cnMsIGRvX2NvcHlfZnVuYywgZG9faGFuZ19mdW5jLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgZG9f aW50ZXJtaXhfYm90aChzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKLQkJCSAgICAgZG9fY29weSBk b19jb3B5X2Z1bmMsCi0JCQkgICAgIGRvX2hhbmcgZG9faGFuZ19mdW5jKQotewotCWRvX2ludGVy bWl4KGJ1ZmZlcnMsIGRvX2NvcHlfZnVuYywgZG9faGFuZ19mdW5jLCAtMSk7Ci19Ci0KLXN0YXRp YyB2b2lkIGRvX2Vhcmx5X3JlYWQoc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCi0JCQkgIGRvX2Nv cHkgZG9fY29weV9mdW5jLAotCQkJICBkb19oYW5nIGRvX2hhbmdfZnVuYykKLXsKLQlzdHJ1Y3Qg aWd0X2hhbmdfcmluZyBoYW5nOwotCWludCBpOwotCi0JZ2VtX3F1aWVzY2VudF9ncHUoZmQpOwot CWZvciAoaSA9IGJ1ZmZlcnMtPmNvdW50OyBpLS07ICkKLQkJYnVmZmVycy0+bW9kZS0+c2V0X2Jv KGJ1ZmZlcnMsIGJ1ZmZlcnMtPnNyY1tpXSwgMHhkZWFkYmVlZik7Ci0JZm9yIChpID0gMDsgaSA8 IGJ1ZmZlcnMtPmNvdW50OyBpKyspCi0JCWRvX2NvcHlfZnVuYyhidWZmZXJzLCBidWZmZXJzLT5k c3RbaV0sIGJ1ZmZlcnMtPnNyY1tpXSk7Ci0JaGFuZyA9IGRvX2hhbmdfZnVuYygpOwotCWZvciAo aSA9IGJ1ZmZlcnMtPmNvdW50OyBpLS07ICkKLQkJYnVmZmVycy0+bW9kZS0+Y21wX2JvKGJ1ZmZl cnMsIGJ1ZmZlcnMtPmRzdFtpXSwgMHhkZWFkYmVlZik7Ci0JaWd0X3Bvc3RfaGFuZ19yaW5nKGZk LCBoYW5nKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fcmVhZF9yZWFkX2JjcyhzdHJ1Y3QgYnVmZmVy cyAqYnVmZmVycywKLQkJCSAgICAgZG9fY29weSBkb19jb3B5X2Z1bmMsCi0JCQkgICAgIGRvX2hh bmcgZG9faGFuZ19mdW5jKQotewotCXN0cnVjdCBpZ3RfaGFuZ19yaW5nIGhhbmc7Ci0JaW50IGk7 Ci0KLQlnZW1fcXVpZXNjZW50X2dwdShmZCk7Ci0JZm9yIChpID0gYnVmZmVycy0+Y291bnQ7IGkt LTsgKQotCQlidWZmZXJzLT5tb2RlLT5zZXRfYm8oYnVmZmVycywgYnVmZmVycy0+c3JjW2ldLCAw eGRlYWRiZWVmIF4gaSk7Ci0JZm9yIChpID0gMDsgaSA8IGJ1ZmZlcnMtPmNvdW50OyBpKyspIHsK LQkJZG9fY29weV9mdW5jKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgYnVmZmVycy0+c3JjW2ld KTsKLQkJYmx0X2NvcHlfYm8oYnVmZmVycywgYnVmZmVycy0+c3BhcmUsIGJ1ZmZlcnMtPnNyY1tp XSk7Ci0JfQotCWJ1ZmZlcnMtPm1vZGUtPmNtcF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcGFyZSwg MHhkZWFkYmVlZl4oYnVmZmVycy0+Y291bnQtMSkpOwotCWhhbmcgPSBkb19oYW5nX2Z1bmMoKTsK LQlmb3IgKGkgPSBidWZmZXJzLT5jb3VudDsgaS0tOyApCi0JCWJ1ZmZlcnMtPm1vZGUtPmNtcF9i byhidWZmZXJzLCBidWZmZXJzLT5kc3RbaV0sIDB4ZGVhZGJlZWYgXiBpKTsKLQlpZ3RfcG9zdF9o YW5nX3JpbmcoZmQsIGhhbmcpOwotfQotCi1zdGF0aWMgdm9pZCBkb193cml0ZV9yZWFkX2Jjcyhz dHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKLQkJCSAgICAgIGRvX2NvcHkgZG9fY29weV9mdW5jLAot CQkJICAgICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCi17Ci0Jc3RydWN0IGlndF9oYW5nX3Jpbmcg aGFuZzsKLQlpbnQgaTsKLQotCWdlbV9xdWllc2NlbnRfZ3B1KGZkKTsKLQlmb3IgKGkgPSBidWZm ZXJzLT5jb3VudDsgaS0tOyApCi0JCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZm ZXJzLT5zcmNbaV0sIDB4ZGVhZGJlZWYgXiBpKTsKLQlmb3IgKGkgPSAwOyBpIDwgYnVmZmVycy0+ Y291bnQ7IGkrKykgewotCQlibHRfY29weV9ibyhidWZmZXJzLCBidWZmZXJzLT5zcGFyZSwgYnVm ZmVycy0+c3JjW2ldKTsKLQkJZG9fY29weV9mdW5jKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwg YnVmZmVycy0+c3BhcmUpOwotCX0KLQloYW5nID0gZG9faGFuZ19mdW5jKCk7Ci0JZm9yIChpID0g YnVmZmVycy0+Y291bnQ7IGktLTsgKQotCQlidWZmZXJzLT5tb2RlLT5jbXBfYm8oYnVmZmVycywg YnVmZmVycy0+ZHN0W2ldLCAweGRlYWRiZWVmIF4gaSk7Ci0JaWd0X3Bvc3RfaGFuZ19yaW5nKGZk LCBoYW5nKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fcmVhZF9yZWFkX3JjcyhzdHJ1Y3QgYnVmZmVy cyAqYnVmZmVycywKLQkJCSAgICAgZG9fY29weSBkb19jb3B5X2Z1bmMsCi0JCQkgICAgIGRvX2hh bmcgZG9faGFuZ19mdW5jKQotewotCXN0cnVjdCBpZ3RfaGFuZ19yaW5nIGhhbmc7Ci0JaW50IGk7 Ci0KLQlnZW1fcXVpZXNjZW50X2dwdShmZCk7Ci0JZm9yIChpID0gYnVmZmVycy0+Y291bnQ7IGkt LTsgKQotCQlidWZmZXJzLT5tb2RlLT5zZXRfYm8oYnVmZmVycywgYnVmZmVycy0+c3JjW2ldLCAw eGRlYWRiZWVmIF4gaSk7Ci0JZm9yIChpID0gMDsgaSA8IGJ1ZmZlcnMtPmNvdW50OyBpKyspIHsK LQkJZG9fY29weV9mdW5jKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgYnVmZmVycy0+c3JjW2ld KTsKLQkJcmVuZGVyX2NvcHlfYm8oYnVmZmVycywgYnVmZmVycy0+c3BhcmUsIGJ1ZmZlcnMtPnNy Y1tpXSk7Ci0JfQotCWJ1ZmZlcnMtPm1vZGUtPmNtcF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcGFy ZSwgMHhkZWFkYmVlZl4oYnVmZmVycy0+Y291bnQtMSkpOwotCWhhbmcgPSBkb19oYW5nX2Z1bmMo KTsKLQlmb3IgKGkgPSBidWZmZXJzLT5jb3VudDsgaS0tOyApCi0JCWJ1ZmZlcnMtPm1vZGUtPmNt cF9ibyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaV0sIDB4ZGVhZGJlZWYgXiBpKTsKLQlpZ3RfcG9z dF9oYW5nX3JpbmcoZmQsIGhhbmcpOwotfQotCi1zdGF0aWMgdm9pZCBkb193cml0ZV9yZWFkX3Jj cyhzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKLQkJCSAgICAgIGRvX2NvcHkgZG9fY29weV9mdW5j LAotCQkJICAgICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCi17Ci0Jc3RydWN0IGlndF9oYW5nX3Jp bmcgaGFuZzsKLQlpbnQgaTsKLQotCWdlbV9xdWllc2NlbnRfZ3B1KGZkKTsKLQlmb3IgKGkgPSBi dWZmZXJzLT5jb3VudDsgaS0tOyApCi0JCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBi dWZmZXJzLT5zcmNbaV0sIDB4ZGVhZGJlZWYgXiBpKTsKLQlmb3IgKGkgPSAwOyBpIDwgYnVmZmVy cy0+Y291bnQ7IGkrKykgewotCQlyZW5kZXJfY29weV9ibyhidWZmZXJzLCBidWZmZXJzLT5zcGFy ZSwgYnVmZmVycy0+c3JjW2ldKTsKLQkJZG9fY29weV9mdW5jKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRz dFtpXSwgYnVmZmVycy0+c3BhcmUpOwotCX0KLQloYW5nID0gZG9faGFuZ19mdW5jKCk7Ci0JZm9y IChpID0gYnVmZmVycy0+Y291bnQ7IGktLTsgKQotCQlidWZmZXJzLT5tb2RlLT5jbXBfYm8oYnVm ZmVycywgYnVmZmVycy0+ZHN0W2ldLCAweGRlYWRiZWVmIF4gaSk7Ci0JaWd0X3Bvc3RfaGFuZ19y aW5nKGZkLCBoYW5nKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fZ3B1X3JlYWRfYWZ0ZXJfd3JpdGUo c3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCi0JCQkJICAgIGRvX2NvcHkgZG9fY29weV9mdW5jLAot CQkJCSAgICBkb19oYW5nIGRvX2hhbmdfZnVuYykKLXsKLQlzdHJ1Y3QgaWd0X2hhbmdfcmluZyBo YW5nOwotCWludCBpOwotCi0JZ2VtX3F1aWVzY2VudF9ncHUoZmQpOwotCWZvciAoaSA9IGJ1ZmZl cnMtPmNvdW50OyBpLS07ICkKLQkJYnVmZmVycy0+bW9kZS0+c2V0X2JvKGJ1ZmZlcnMsIGJ1ZmZl cnMtPnNyY1tpXSwgMHhhYmNkYWJjZCk7Ci0JZm9yIChpID0gMDsgaSA8IGJ1ZmZlcnMtPmNvdW50 OyBpKyspCi0JCWRvX2NvcHlfZnVuYyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaV0sIGJ1ZmZlcnMt PnNyY1tpXSk7Ci0JZm9yIChpID0gYnVmZmVycy0+Y291bnQ7IGktLTsgKQotCQlkb19jb3B5X2Z1 bmMoYnVmZmVycywgYnVmZmVycy0+c3BhcmUsIGJ1ZmZlcnMtPmRzdFtpXSk7Ci0JaGFuZyA9IGRv X2hhbmdfZnVuYygpOwotCWZvciAoaSA9IGJ1ZmZlcnMtPmNvdW50OyBpLS07ICkKLQkJYnVmZmVy cy0+bW9kZS0+Y21wX2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgMHhhYmNkYWJjZCk7Ci0J aWd0X3Bvc3RfaGFuZ19yaW5nKGZkLCBoYW5nKTsKLX0KLQotdHlwZWRlZiB2b2lkICgqZG9fdGVz dCkoc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCi0JCQlkb19jb3B5IGRvX2NvcHlfZnVuYywKLQkJ CWRvX2hhbmcgZG9faGFuZ19mdW5jKTsKLQotdHlwZWRlZiB2b2lkICgqcnVuX3dyYXApKHN0cnVj dCBidWZmZXJzICpidWZmZXJzLAotCQkJIGRvX3Rlc3QgZG9fdGVzdF9mdW5jLAotCQkJIGRvX2Nv cHkgZG9fY29weV9mdW5jLAotCQkJIGRvX2hhbmcgZG9faGFuZ19mdW5jKTsKLQotc3RhdGljIHZv aWQgcnVuX3NpbmdsZShzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKLQkJICAgICAgIGRvX3Rlc3Qg ZG9fdGVzdF9mdW5jLAotCQkgICAgICAgZG9fY29weSBkb19jb3B5X2Z1bmMsCi0JCSAgICAgICBk b19oYW5nIGRvX2hhbmdfZnVuYykKLXsKLQlkb190ZXN0X2Z1bmMoYnVmZmVycywgZG9fY29weV9m dW5jLCBkb19oYW5nX2Z1bmMpOwotCWlndF9hc3NlcnRfZXEoaW50ZWxfZGV0ZWN0X2FuZF9jbGVh cl9taXNzZWRfaW50ZXJydXB0cyhmZCksIDApOwotfQotCi1zdGF0aWMgdm9pZCBydW5faW50ZXJy dXB0aWJsZShzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKLQkJCSAgICAgIGRvX3Rlc3QgZG9fdGVz dF9mdW5jLAotCQkJICAgICAgZG9fY29weSBkb19jb3B5X2Z1bmMsCi0JCQkgICAgICBkb19oYW5n IGRvX2hhbmdfZnVuYykKLXsKLQlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMTA7IHBhc3MrKykKLQkJ ZG9fdGVzdF9mdW5jKGJ1ZmZlcnMsIGRvX2NvcHlfZnVuYywgZG9faGFuZ19mdW5jKTsKLQlwYXNz ID0gMDsKLQlpZ3RfYXNzZXJ0X2VxKGludGVsX2RldGVjdF9hbmRfY2xlYXJfbWlzc2VkX2ludGVy cnVwdHMoZmQpLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgcnVuX2NoaWxkKHN0cnVjdCBidWZmZXJz ICpidWZmZXJzLAotCQkgICAgICBkb190ZXN0IGRvX3Rlc3RfZnVuYywKLQkJICAgICAgZG9fY29w eSBkb19jb3B5X2Z1bmMsCi0JCSAgICAgIGRvX2hhbmcgZG9faGFuZ19mdW5jKQotCi17Ci0JLyog V2UgaW5oZXJpdCB0aGUgYnVmZmVycyBmcm9tIHRoZSBwYXJlbnQsIGJ1dCB0aGUgYnVmbWdyL2Jh dGNoCi0JICogbmVlZHMgdG8gYmUgbG9jYWwgYXMgdGhlIGNhY2hlIG9mIHJldXNhYmxlIGl0c2Vs ZiB3aWxsIGJlIENPV2VkLAotCSAqIGxlYWRpbmcgdG8gdGhlIGNoaWxkIGNsb3NpbmcgYW4gb2Jq ZWN0IHdpdGhvdXQgdGhlIHBhcmVudCBrbm93aW5nLgotCSAqLwotCWlndF9mb3JrKGNoaWxkLCAx KQotCQlkb190ZXN0X2Z1bmMoYnVmZmVycywgZG9fY29weV9mdW5jLCBkb19oYW5nX2Z1bmMpOwot CWlndF93YWl0Y2hpbGRyZW4oKTsKLQlpZ3RfYXNzZXJ0X2VxKGludGVsX2RldGVjdF9hbmRfY2xl YXJfbWlzc2VkX2ludGVycnVwdHMoZmQpLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgX19ydW5fZm9y a2VkKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAotCQkJIGludCBudW1fY2hpbGRyZW4sIGludCBs b29wcywKLQkJCSBkb190ZXN0IGRvX3Rlc3RfZnVuYywKLQkJCSBkb19jb3B5IGRvX2NvcHlfZnVu YywKLQkJCSBkb19oYW5nIGRvX2hhbmdfZnVuYykKLQotewotCWNvbnN0IGludCBvbGRfbnVtX2J1 ZmZlcnMgPSBudW1fYnVmZmVyczsKLQotCW51bV9idWZmZXJzIC89IG51bV9jaGlsZHJlbjsKLQlu dW1fYnVmZmVycyArPSBNSU5fQlVGRkVSUzsKLQotCWlndF9mb3JrKGNoaWxkLCBudW1fY2hpbGRy ZW4pIHsKLQkJLyogcmVjcmVhdGUgcHJvY2VzcyBsb2NhbCB2YXJpYWJsZXMgKi8KLQkJYnVmZmVy cy0+Y291bnQgPSAwOwotCQlmZCA9IGRybV9vcGVuX2RyaXZlcihEUklWRVJfSU5URUwpOwotCi0J CWJhdGNoID0gYnVmZmVyc19pbml0KGJ1ZmZlcnMsIGJ1ZmZlcnMtPm1vZGUsCi0JCQkJICAgICBi dWZmZXJzLT53aWR0aCwgYnVmZmVycy0+aGVpZ2h0LAotCQkJCSAgICAgZmQsIHRydWUpOwotCi0J CWJ1ZmZlcnNfY3JlYXRlKGJ1ZmZlcnMsIG51bV9idWZmZXJzKTsKLQkJZm9yIChwYXNzID0gMDsg cGFzcyA8IGxvb3BzOyBwYXNzKyspCi0JCQlkb190ZXN0X2Z1bmMoYnVmZmVycywgZG9fY29weV9m dW5jLCBkb19oYW5nX2Z1bmMpOwotCQlwYXNzID0gMDsKLQotCQlidWZmZXJzX2ZpbmkoYnVmZmVy cyk7Ci0JfQotCi0JaWd0X3dhaXRjaGlsZHJlbigpOwotCWlndF9hc3NlcnRfZXEoaW50ZWxfZGV0 ZWN0X2FuZF9jbGVhcl9taXNzZWRfaW50ZXJydXB0cyhmZCksIDApOwotCi0JbnVtX2J1ZmZlcnMg PSBvbGRfbnVtX2J1ZmZlcnM7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ1bl9mb3JrZWQoc3RydWN0IGJ1 ZmZlcnMgKmJ1ZmZlcnMsCi0JCSAgICAgICBkb190ZXN0IGRvX3Rlc3RfZnVuYywKLQkJICAgICAg IGRvX2NvcHkgZG9fY29weV9mdW5jLAotCQkgICAgICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCi17 Ci0JX19ydW5fZm9ya2VkKGJ1ZmZlcnMsIHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pLCAx MCwKLQkJICAgICBkb190ZXN0X2Z1bmMsIGRvX2NvcHlfZnVuYywgZG9faGFuZ19mdW5jKTsKLX0K LQotc3RhdGljIHZvaWQgcnVuX2JvbWIoc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCi0JCSAgICAg ZG9fdGVzdCBkb190ZXN0X2Z1bmMsCi0JCSAgICAgZG9fY29weSBkb19jb3B5X2Z1bmMsCi0JCSAg ICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCi17Ci0JX19ydW5fZm9ya2VkKGJ1ZmZlcnMsIDgqc3lz Y29uZihfU0NfTlBST0NFU1NPUlNfT05MTiksIDEwLAotCQkgICAgIGRvX3Rlc3RfZnVuYywgZG9f Y29weV9mdW5jLCBkb19oYW5nX2Z1bmMpOwotfQotCi1zdGF0aWMgdm9pZCBiaXQxN19yZXF1aXJl KHZvaWQpCi17Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9nZXRfdGlsaW5nMiB7Ci0JCXVpbnQzMl90 IGhhbmRsZTsKLQkJdWludDMyX3QgdGlsaW5nX21vZGU7Ci0JCXVpbnQzMl90IHN3aXp6bGVfbW9k ZTsKLQkJdWludDMyX3QgcGh5c19zd2l6emxlX21vZGU7Ci0JfSBhcmc7Ci0jZGVmaW5lIERSTV9J T0NUTF9JOTE1X0dFTV9HRVRfVElMSU5HMglEUk1fSU9XUiAoRFJNX0NPTU1BTkRfQkFTRSArIERS TV9JOTE1X0dFTV9HRVRfVElMSU5HLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF90aWxpbmcyKQot Ci0JbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKLQlhcmcuaGFuZGxlID0gZ2VtX2NyZWF0 ZShmZCwgNDA5Nik7Ci0JZ2VtX3NldF90aWxpbmcoZmQsIGFyZy5oYW5kbGUsIEk5MTVfVElMSU5H X1gsIDUxMik7Ci0KLQlkb19pb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9USUxJTkcy LCAmYXJnKTsKLQlnZW1fY2xvc2UoZmQsIGFyZy5oYW5kbGUpOwotCWlndF9yZXF1aXJlKGFyZy5w aHlzX3N3aXp6bGVfbW9kZSA9PSBhcmcuc3dpenpsZV9tb2RlKTsKLX0KLQotc3RhdGljIHZvaWQg Y3B1X3JlcXVpcmUodm9pZCkKLXsKLQliaXQxN19yZXF1aXJlKCk7Ci19Ci0KLXN0YXRpYyB2b2lk IGd0dF9yZXF1aXJlKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHdjX3JlcXVpcmUodm9pZCkK LXsKLQliaXQxN19yZXF1aXJlKCk7Ci0JZ2VtX3JlcXVpcmVfbW1hcF93YyhmZCk7Ci19Ci0KLXN0 YXRpYyB2b2lkIGJjc19yZXF1aXJlKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHJjc19yZXF1 aXJlKHZvaWQpCi17Ci0JaWd0X3JlcXVpcmUocmVuZGVyY29weSk7Ci19Ci0KLXN0YXRpYyB2b2lk Ci1ydW5fYmFzaWNfbW9kZXMoY29uc3QgY2hhciAqcHJlZml4LAotCQljb25zdCBzdHJ1Y3QgYWNj ZXNzX21vZGUgKm1vZGUsCi0JCWNvbnN0IGNoYXIgKnN1ZmZpeCwKLQkJcnVuX3dyYXAgcnVuX3dy YXBfZnVuYykKLXsKLQljb25zdCBzdHJ1Y3QgewotCQljb25zdCBjaGFyICpwcmVmaXg7Ci0JCWRv X2NvcHkgY29weTsKLQkJdm9pZCAoKnJlcXVpcmUpKHZvaWQpOwotCX0gcGlwZWxpbmVzW10gPSB7 Ci0JCXsgImNwdSIsIGNwdV9jb3B5X2JvLCBjcHVfcmVxdWlyZSB9LAotCQl7ICJndHQiLCBndHRf Y29weV9ibywgZ3R0X3JlcXVpcmUgfSwKLQkJeyAid2MiLCB3Y19jb3B5X2JvLCB3Y19yZXF1aXJl IH0sCi0JCXsgImJsdCIsIGJsdF9jb3B5X2JvLCBiY3NfcmVxdWlyZSB9LAotCQl7ICJyZW5kZXIi LCByZW5kZXJfY29weV9ibywgcmNzX3JlcXVpcmUgfSwKLQkJeyBOVUxMLCBOVUxMIH0KLQl9LCAq cHNraXAgPSBwaXBlbGluZXMgKyAzLCAqcDsKLQljb25zdCBzdHJ1Y3QgewotCQljb25zdCBjaGFy ICpzdWZmaXg7Ci0JCWRvX2hhbmcgaGFuZzsKLQl9IGhhbmdzW10gPSB7Ci0JCXsgIiIsIG5vX2hh bmcgfSwKLQkJeyAiLWhhbmctYmx0IiwgYmNzX2hhbmcgfSwKLQkJeyAiLWhhbmctcmVuZGVyIiwg cmNzX2hhbmcgfSwKLQkJeyBOVUxMLCBOVUxMIH0sCi0JfSwgKmg7Ci0KLQlmb3IgKGggPSBoYW5n czsgaC0+c3VmZml4OyBoKyspIHsKLQkJaWYgKCFhbGwgJiYgKmgtPnN1ZmZpeCkKLQkJCWNvbnRp bnVlOwotCi0JCWZvciAocCA9IGFsbCA/IHBpcGVsaW5lcyA6IHBza2lwOyBwLT5wcmVmaXg7IHAr KykgewotCQkJc3RydWN0IGJ1ZmZlcnMgYnVmZmVyczsKLQotCQkJaWd0X2ZpeHR1cmUKLQkJCQli YXRjaCA9IGJ1ZmZlcnNfaW5pdCgmYnVmZmVycywgbW9kZSwKLQkJCQkJCSAgICAgNTEyLCA1MTIs IGZkLAotCQkJCQkJICAgICBydW5fd3JhcF9mdW5jICE9IHJ1bl9jaGlsZCk7Ci0KLQkJCWlndF9z dWJ0ZXN0X2YoIiVzLSVzLSVzLXNhbml0eWNoZWNrMCVzJXMiLCBwcmVmaXgsIG1vZGUtPm5hbWUs IHAtPnByZWZpeCwgc3VmZml4LCBoLT5zdWZmaXgpIHsKLQkJCQlwLT5yZXF1aXJlKCk7Ci0JCQkJ YnVmZmVyc19jcmVhdGUoJmJ1ZmZlcnMsIG51bV9idWZmZXJzKTsKLQkJCQlydW5fd3JhcF9mdW5j KCZidWZmZXJzLCBkb19iYXNpYzAsCi0JCQkJCSAgICAgIHAtPmNvcHksIGgtPmhhbmcpOwotCQkJ fQotCi0JCQlpZ3Rfc3VidGVzdF9mKCIlcy0lcy0lcy1zYW5pdHljaGVjazElcyVzIiwgcHJlZml4 LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgsIHN1ZmZpeCwgaC0+c3VmZml4KSB7Ci0JCQkJcC0+cmVx dWlyZSgpOwotCQkJCWJ1ZmZlcnNfY3JlYXRlKCZidWZmZXJzLCBudW1fYnVmZmVycyk7Ci0JCQkJ cnVuX3dyYXBfZnVuYygmYnVmZmVycywgZG9fYmFzaWMxLAotCQkJCQkgICAgICBwLT5jb3B5LCBo LT5oYW5nKTsKLQkJCX0KLQotCQkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtc2FuaXR5Y2hlY2tO JXMlcyIsIHByZWZpeCwgbW9kZS0+bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgsIGgtPnN1ZmZpeCkg ewotCQkJCXAtPnJlcXVpcmUoKTsKLQkJCQlidWZmZXJzX2NyZWF0ZSgmYnVmZmVycywgbnVtX2J1 ZmZlcnMpOwotCQkJCXJ1bl93cmFwX2Z1bmMoJmJ1ZmZlcnMsIGRvX2Jhc2ljTiwKLQkJCQkJICAg ICAgcC0+Y29weSwgaC0+aGFuZyk7Ci0JCQl9Ci0KLQkJCS8qIHRyeSB0byBvdmVyd3JpdGUgdGhl IHNvdXJjZSB2YWx1ZXMgKi8KLQkJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLW92ZXJ3cml0ZS1z b3VyY2Utb25lJXMlcyIsIHByZWZpeCwgbW9kZS0+bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgsIGgt PnN1ZmZpeCkgewotCQkJCXAtPnJlcXVpcmUoKTsKLQkJCQlidWZmZXJzX2NyZWF0ZSgmYnVmZmVy cywgbnVtX2J1ZmZlcnMpOwotCQkJCXJ1bl93cmFwX2Z1bmMoJmJ1ZmZlcnMsCi0JCQkJCSAgICAg IGRvX292ZXJ3cml0ZV9zb3VyY2VfX29uZSwKLQkJCQkJICAgICAgcC0+Y29weSwgaC0+aGFuZyk7 Ci0JCQl9Ci0KLQkJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLW92ZXJ3cml0ZS1zb3VyY2UlcyVz IiwgcHJlZml4LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgsIHN1ZmZpeCwgaC0+c3VmZml4KSB7Ci0J CQkJcC0+cmVxdWlyZSgpOwotCQkJCWJ1ZmZlcnNfY3JlYXRlKCZidWZmZXJzLCBudW1fYnVmZmVy cyk7Ci0JCQkJcnVuX3dyYXBfZnVuYygmYnVmZmVycywKLQkJCQkJICAgICAgZG9fb3ZlcndyaXRl X3NvdXJjZSwKLQkJCQkJICAgICAgcC0+Y29weSwgaC0+aGFuZyk7Ci0JCQl9Ci0KLQkJCWlndF9z dWJ0ZXN0X2YoIiVzLSVzLSVzLW92ZXJ3cml0ZS1zb3VyY2UtcmVhZC1iY3MlcyVzIiwgcHJlZml4 LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgsIHN1ZmZpeCwgaC0+c3VmZml4KSB7Ci0JCQkJcC0+cmVx dWlyZSgpOwotCQkJCWJ1ZmZlcnNfY3JlYXRlKCZidWZmZXJzLCBudW1fYnVmZmVycyk7Ci0JCQkJ cnVuX3dyYXBfZnVuYygmYnVmZmVycywKLQkJCQkJICAgICAgZG9fb3ZlcndyaXRlX3NvdXJjZV9y ZWFkX2JjcywKLQkJCQkJICAgICAgcC0+Y29weSwgaC0+aGFuZyk7Ci0JCQl9Ci0KLQkJCWlndF9z dWJ0ZXN0X2YoIiVzLSVzLSVzLW92ZXJ3cml0ZS1zb3VyY2UtcmVhZC1yY3MlcyVzIiwgcHJlZml4 LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgsIHN1ZmZpeCwgaC0+c3VmZml4KSB7Ci0JCQkJcC0+cmVx dWlyZSgpOwotCQkJCWlndF9yZXF1aXJlKHJlbmRlcmNvcHkpOwotCQkJCWJ1ZmZlcnNfY3JlYXRl KCZidWZmZXJzLCBudW1fYnVmZmVycyk7Ci0JCQkJcnVuX3dyYXBfZnVuYygmYnVmZmVycywKLQkJ CQkJICAgICAgZG9fb3ZlcndyaXRlX3NvdXJjZV9yZWFkX3JjcywKLQkJCQkJICAgICAgcC0+Y29w eSwgaC0+aGFuZyk7Ci0JCQl9Ci0KLQkJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLW92ZXJ3cml0 ZS1zb3VyY2UtcmV2JXMlcyIsIHByZWZpeCwgbW9kZS0+bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgs IGgtPnN1ZmZpeCkgewotCQkJCXAtPnJlcXVpcmUoKTsKLQkJCQlidWZmZXJzX2NyZWF0ZSgmYnVm ZmVycywgbnVtX2J1ZmZlcnMpOwotCQkJCXJ1bl93cmFwX2Z1bmMoJmJ1ZmZlcnMsCi0JCQkJCSAg ICAgIGRvX292ZXJ3cml0ZV9zb3VyY2VfX3JldiwKLQkJCQkJICAgICAgcC0+Y29weSwgaC0+aGFu Zyk7Ci0JCQl9Ci0KLQkJCS8qIHRyeSB0byBpbnRlcm1peCBjb3BpZXMgd2l0aCBHUFUgY29waWVz Ki8KLQkJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLWludGVybWl4LXJjcyVzJXMiLCBwcmVmaXgs IG1vZGUtPm5hbWUsIHAtPnByZWZpeCwgc3VmZml4LCBoLT5zdWZmaXgpIHsKLQkJCQlwLT5yZXF1 aXJlKCk7Ci0JCQkJaWd0X3JlcXVpcmUocmVuZGVyY29weSk7Ci0JCQkJYnVmZmVyc19jcmVhdGUo JmJ1ZmZlcnMsIG51bV9idWZmZXJzKTsKLQkJCQlydW5fd3JhcF9mdW5jKCZidWZmZXJzLAotCQkJ CQkgICAgICBkb19pbnRlcm1peF9yY3MsCi0JCQkJCSAgICAgIHAtPmNvcHksIGgtPmhhbmcpOwot CQkJfQotCQkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtaW50ZXJtaXgtYmNzJXMlcyIsIHByZWZp eCwgbW9kZS0+bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgsIGgtPnN1ZmZpeCkgewotCQkJCXAtPnJl cXVpcmUoKTsKLQkJCQlpZ3RfcmVxdWlyZShyZW5kZXJjb3B5KTsKLQkJCQlidWZmZXJzX2NyZWF0 ZSgmYnVmZmVycywgbnVtX2J1ZmZlcnMpOwotCQkJCXJ1bl93cmFwX2Z1bmMoJmJ1ZmZlcnMsCi0J CQkJCSAgICAgIGRvX2ludGVybWl4X2JjcywKLQkJCQkJICAgICAgcC0+Y29weSwgaC0+aGFuZyk7 Ci0JCQl9Ci0JCQlpZ3Rfc3VidGVzdF9mKCIlcy0lcy0lcy1pbnRlcm1peC1ib3RoJXMlcyIsIHBy ZWZpeCwgbW9kZS0+bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgsIGgtPnN1ZmZpeCkgewotCQkJCXAt PnJlcXVpcmUoKTsKLQkJCQlpZ3RfcmVxdWlyZShyZW5kZXJjb3B5KTsKLQkJCQlidWZmZXJzX2Ny ZWF0ZSgmYnVmZmVycywgbnVtX2J1ZmZlcnMpOwotCQkJCXJ1bl93cmFwX2Z1bmMoJmJ1ZmZlcnMs Ci0JCQkJCSAgICAgIGRvX2ludGVybWl4X2JvdGgsCi0JCQkJCSAgICAgIHAtPmNvcHksIGgtPmhh bmcpOwotCQkJfQotCi0JCQkvKiB0cnkgdG8gcmVhZCB0aGUgcmVzdWx0cyBiZWZvcmUgdGhlIGNv cHkgY29tcGxldGVzICovCi0JCQlpZ3Rfc3VidGVzdF9mKCIlcy0lcy0lcy1lYXJseS1yZWFkJXMl cyIsIHByZWZpeCwgbW9kZS0+bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgsIGgtPnN1ZmZpeCkgewot CQkJCXAtPnJlcXVpcmUoKTsKLQkJCQlidWZmZXJzX2NyZWF0ZSgmYnVmZmVycywgbnVtX2J1ZmZl cnMpOwotCQkJCXJ1bl93cmFwX2Z1bmMoJmJ1ZmZlcnMsCi0JCQkJCSAgICAgIGRvX2Vhcmx5X3Jl YWQsCi0JCQkJCSAgICAgIHAtPmNvcHksIGgtPmhhbmcpOwotCQkJfQotCi0JCQkvKiBjb25jdXJy ZW50IHJlYWRzICovCi0JCQlpZ3Rfc3VidGVzdF9mKCIlcy0lcy0lcy1yZWFkLXJlYWQtYmNzJXMl cyIsIHByZWZpeCwgbW9kZS0+bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgsIGgtPnN1ZmZpeCkgewot CQkJCXAtPnJlcXVpcmUoKTsKLQkJCQlidWZmZXJzX2NyZWF0ZSgmYnVmZmVycywgbnVtX2J1ZmZl cnMpOwotCQkJCXJ1bl93cmFwX2Z1bmMoJmJ1ZmZlcnMsCi0JCQkJCSAgICAgIGRvX3JlYWRfcmVh ZF9iY3MsCi0JCQkJCSAgICAgIHAtPmNvcHksIGgtPmhhbmcpOwotCQkJfQotCQkJaWd0X3N1YnRl c3RfZigiJXMtJXMtJXMtcmVhZC1yZWFkLXJjcyVzJXMiLCBwcmVmaXgsIG1vZGUtPm5hbWUsIHAt PnByZWZpeCwgc3VmZml4LCBoLT5zdWZmaXgpIHsKLQkJCQlwLT5yZXF1aXJlKCk7Ci0JCQkJaWd0 X3JlcXVpcmUocmVuZGVyY29weSk7Ci0JCQkJYnVmZmVyc19jcmVhdGUoJmJ1ZmZlcnMsIG51bV9i dWZmZXJzKTsKLQkJCQlydW5fd3JhcF9mdW5jKCZidWZmZXJzLAotCQkJCQkgICAgICBkb19yZWFk X3JlYWRfcmNzLAotCQkJCQkgICAgICBwLT5jb3B5LCBoLT5oYW5nKTsKLQkJCX0KLQotCQkJLyog c3BsaXQgY29weWluZyBiZXR3ZWVuIHJpbmdzICovCi0JCQlpZ3Rfc3VidGVzdF9mKCIlcy0lcy0l cy13cml0ZS1yZWFkLWJjcyVzJXMiLCBwcmVmaXgsIG1vZGUtPm5hbWUsIHAtPnByZWZpeCwgc3Vm Zml4LCBoLT5zdWZmaXgpIHsKLQkJCQlwLT5yZXF1aXJlKCk7Ci0JCQkJYnVmZmVyc19jcmVhdGUo JmJ1ZmZlcnMsIG51bV9idWZmZXJzKTsKLQkJCQlydW5fd3JhcF9mdW5jKCZidWZmZXJzLAotCQkJ CQkgICAgICBkb193cml0ZV9yZWFkX2JjcywKLQkJCQkJICAgICAgcC0+Y29weSwgaC0+aGFuZyk7 Ci0JCQl9Ci0JCQlpZ3Rfc3VidGVzdF9mKCIlcy0lcy0lcy13cml0ZS1yZWFkLXJjcyVzJXMiLCBw cmVmaXgsIG1vZGUtPm5hbWUsIHAtPnByZWZpeCwgc3VmZml4LCBoLT5zdWZmaXgpIHsKLQkJCQlw LT5yZXF1aXJlKCk7Ci0JCQkJaWd0X3JlcXVpcmUocmVuZGVyY29weSk7Ci0JCQkJYnVmZmVyc19j cmVhdGUoJmJ1ZmZlcnMsIG51bV9idWZmZXJzKTsKLQkJCQlydW5fd3JhcF9mdW5jKCZidWZmZXJz LAotCQkJCQkgICAgICBkb193cml0ZV9yZWFkX3JjcywKLQkJCQkJICAgICAgcC0+Y29weSwgaC0+ aGFuZyk7Ci0JCQl9Ci0KLQkJCS8qIGFuZCBmaW5hbGx5IHRyeSB0byB0cmljayB0aGUga2VybmVs IGludG8gbG9vc2luZyB0aGUgcGVuZGluZyB3cml0ZSAqLwotCQkJaWd0X3N1YnRlc3RfZigiJXMt JXMtJXMtZ3B1LXJlYWQtYWZ0ZXItd3JpdGUlcyVzIiwgcHJlZml4LCBtb2RlLT5uYW1lLCBwLT5w cmVmaXgsIHN1ZmZpeCwgaC0+c3VmZml4KSB7Ci0JCQkJcC0+cmVxdWlyZSgpOwotCQkJCWJ1ZmZl cnNfY3JlYXRlKCZidWZmZXJzLCBudW1fYnVmZmVycyk7Ci0JCQkJcnVuX3dyYXBfZnVuYygmYnVm ZmVycywKLQkJCQkJICAgICAgZG9fZ3B1X3JlYWRfYWZ0ZXJfd3JpdGUsCi0JCQkJCSAgICAgIHAt PmNvcHksIGgtPmhhbmcpOwotCQkJfQotCi0JCQlpZ3RfZml4dHVyZQotCQkJCWJ1ZmZlcnNfZmlu aSgmYnVmZmVycyk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1ydW5fbW9kZXMoY29uc3Qg Y2hhciAqc3R5bGUsIGNvbnN0IHN0cnVjdCBhY2Nlc3NfbW9kZSAqbW9kZSwgdW5zaWduZWQgYWxs b3dfbWVtKQotewotCWlmIChtb2RlLT5yZXF1aXJlICYmICFtb2RlLT5yZXF1aXJlKCkpCi0JCXJl dHVybjsKLQotCWlndF9kZWJ1ZygiJXM6IHVzaW5nIDJ4JWQgYnVmZmVycywgZWFjaCAxTWlCXG4i LAotCQkJc3R5bGUsIG51bV9idWZmZXJzKTsKLQlpZiAoIV9faW50ZWxfY2hlY2tfbWVtb3J5KDIq bnVtX2J1ZmZlcnMsIDEwMjQqMTAyNCwgYWxsb3dfbWVtLAotCQkJCSAgTlVMTCwgTlVMTCkpCi0J CXJldHVybjsKLQotCXJ1bl9iYXNpY19tb2RlcyhzdHlsZSwgbW9kZSwgIiIsIHJ1bl9zaW5nbGUp OwotCXJ1bl9iYXNpY19tb2RlcyhzdHlsZSwgbW9kZSwgIi1jaGlsZCIsIHJ1bl9jaGlsZCk7Ci0J cnVuX2Jhc2ljX21vZGVzKHN0eWxlLCBtb2RlLCAiLWZvcmtlZCIsIHJ1bl9mb3JrZWQpOwotCi0J aWd0X2Zvcmtfc2lnbmFsX2hlbHBlcigpOwotCXJ1bl9iYXNpY19tb2RlcyhzdHlsZSwgbW9kZSwg Ii1pbnRlcnJ1cHRpYmxlIiwgcnVuX2ludGVycnVwdGlibGUpOwotCXJ1bl9iYXNpY19tb2Rlcyhz dHlsZSwgbW9kZSwgIi1ib21iIiwgcnVuX2JvbWIpOwotCWlndF9zdG9wX3NpZ25hbF9oZWxwZXIo KTsKLX0KLQotaWd0X21haW4KLXsKLQljb25zdCBzdHJ1Y3QgewotCQljb25zdCBjaGFyICpuYW1l OwotCQlkcm1faW50ZWxfYm8gKigqY3JlYXRlKShkcm1faW50ZWxfYnVmbWdyICosIHVpbnQ2NF90 IHNpemUpOwotCQlib29sICgqcmVxdWlyZSkodm9pZCk7Ci0JfSBjcmVhdGVbXSA9IHsKLQkJeyAi IiwgY3JlYXRlX25vcm1hbF9ibywgY2FuX2NyZWF0ZV9ub3JtYWx9LAotCQl7ICJwcml2YXRlLSIs IGNyZWF0ZV9wcml2YXRlX2JvLCBjYW5fY3JlYXRlX3ByaXZhdGUgfSwKLQkJeyAic3RvbGVuLSIs IGNyZWF0ZV9zdG9sZW5fYm8sIGNhbl9jcmVhdGVfc3RvbGVuIH0sCi0JCXsgTlVMTCwgTlVMTCB9 Ci0JfSwgKmM7Ci0JdWludDY0X3QgcGluX3N6ID0gMDsKLQl2b2lkICpwaW5uZWQgPSBOVUxMOwot CWludCBpOwotCi0JaWd0X3NraXBfb25fc2ltdWxhdGlvbigpOwotCi0JaWYgKHN0cnN0cihpZ3Rf dGVzdF9uYW1lKCksICJhbGwiKSkKLQkJYWxsID0gdHJ1ZTsKLQotCWlndF9maXh0dXJlIHsKLQkJ ZmQgPSBkcm1fb3Blbl9kcml2ZXIoRFJJVkVSX0lOVEVMKTsKLQkJaW50ZWxfZGV0ZWN0X2FuZF9j bGVhcl9taXNzZWRfaW50ZXJydXB0cyhmZCk7Ci0JCWRldmlkID0gaW50ZWxfZ2V0X2RybV9kZXZp ZChmZCk7Ci0JCWdlbiA9IGludGVsX2dlbihkZXZpZCk7Ci0JCXJlbmRlcmNvcHkgPSBpZ3RfZ2V0 X3JlbmRlcl9jb3B5ZnVuYyhkZXZpZCk7Ci0JfQotCi0JZm9yIChjID0gY3JlYXRlOyBjLT5uYW1l OyBjKyspIHsKLQkJY2hhciBuYW1lWzgwXTsKLQotCQljcmVhdGVfZnVuYyA9IGMtPmNyZWF0ZTsK LQotCQludW1fYnVmZmVycyA9IE1JTl9CVUZGRVJTOwotCQlpZiAoYy0+cmVxdWlyZSgpKSB7Ci0J CQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyVzIiwgYy0+bmFtZSwgInRpbnkiKTsK LQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFjY2Vzc19tb2Rlcyk7IGkrKykKLQkJCQly dW5fbW9kZXMobmFtZSwgJmFjY2Vzc19tb2Rlc1tpXSwgQ0hFQ0tfUkFNKTsKLQkJfQotCi0JCWln dF9maXh0dXJlIHsKLQkJCW51bV9idWZmZXJzID0gZ2VtX21hcHBhYmxlX2FwZXJ0dXJlX3NpemUo KSAvICgxMDI0ICogMTAyNCkgLyA0OwotCQl9Ci0KLQkJaWYgKGMtPnJlcXVpcmUoKSkgewotCQkJ c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMlcyIsIGMtPm5hbWUsICJzbWFsbCIpOwot CQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWNjZXNzX21vZGVzKTsgaSsrKQotCQkJCXJ1 bl9tb2RlcyhuYW1lLCAmYWNjZXNzX21vZGVzW2ldLCBDSEVDS19SQU0pOwotCQl9Ci0KLQkJaWd0 X2ZpeHR1cmUgewotCQkJbnVtX2J1ZmZlcnMgPSBnZW1fbWFwcGFibGVfYXBlcnR1cmVfc2l6ZSgp IC8gKDEwMjQgKiAxMDI0KTsKLQkJfQotCi0JCWlmIChjLT5yZXF1aXJlKCkpIHsKLQkJCXNucHJp bnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzJXMiLCBjLT5uYW1lLCAidGhyYXNoIik7Ci0JCQlm b3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhY2Nlc3NfbW9kZXMpOyBpKyspCi0JCQkJcnVuX21v ZGVzKG5hbWUsICZhY2Nlc3NfbW9kZXNbaV0sIENIRUNLX1JBTSk7Ci0JCX0KLQotCQlpZ3RfZml4 dHVyZSB7Ci0JCQludW1fYnVmZmVycyA9IGdlbV9hcGVydHVyZV9zaXplKGZkKSAvICgxMDI0ICog MTAyNCk7Ci0JCX0KLQotCQlpZiAoYy0+cmVxdWlyZSgpKSB7Ci0JCQlzbnByaW50ZihuYW1lLCBz aXplb2YobmFtZSksICIlcyVzIiwgYy0+bmFtZSwgImZ1bGwiKTsKLQkJCWZvciAoaSA9IDA7IGkg PCBBUlJBWV9TSVpFKGFjY2Vzc19tb2Rlcyk7IGkrKykKLQkJCQlydW5fbW9kZXMobmFtZSwgJmFj Y2Vzc19tb2Rlc1tpXSwgQ0hFQ0tfUkFNKTsKLQkJfQotCi0JCWlndF9maXh0dXJlIHsKLQkJCW51 bV9idWZmZXJzID0gZ2VtX21hcHBhYmxlX2FwZXJ0dXJlX3NpemUoKSAvICgxMDI0ICogMTAyNCk7 Ci0JCQlwaW5fc3ogPSBpbnRlbF9nZXRfYXZhaWxfcmFtX21iKCkgLSBudW1fYnVmZmVyczsKLQot CQkJaWd0X2RlYnVnKCJQaW5uaW5nICVsZCBNaUJcbiIsIHBpbl9zeik7Ci0JCQlwaW5fc3ogKj0g MTAyNCAqIDEwMjQ7Ci0KLQkJCWlmIChwb3NpeF9tZW1hbGlnbigmcGlubmVkLCA0MDk2LCBwaW5f c3opIHx8Ci0JCQkgICAgbWxvY2socGlubmVkLCBwaW5fc3opIHx8Ci0JCQkgICAgbWFkdmlzZShw aW5uZWQsIHBpbl9zeiwgTUFEVl9ET05URk9SSykpIHsKLQkJCQlmcmVlKHBpbm5lZCk7Ci0JCQkJ cGlubmVkID0gTlVMTDsKLQkJCX0KLQkJCWlndF9yZXF1aXJlKHBpbm5lZCk7Ci0JCX0KLQotCQlp ZiAoYy0+cmVxdWlyZSgpKSB7Ci0JCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyVz IiwgYy0+bmFtZSwgInN3YXAiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFjY2Vz c19tb2Rlcyk7IGkrKykKLQkJCQlydW5fbW9kZXMobmFtZSwgJmFjY2Vzc19tb2Rlc1tpXSwgQ0hF Q0tfUkFNIHwgQ0hFQ0tfU1dBUCk7Ci0JCX0KLQotCQlpZ3RfZml4dHVyZSB7Ci0JCQlpZiAocGlu bmVkKSB7Ci0JCQkJbXVubG9jayhwaW5uZWQsIHBpbl9zeik7Ci0JCQkJZnJlZShwaW5uZWQpOwot CQkJCXBpbm5lZCA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0tIAoyLjcuMAoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcg bGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRl c2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==