ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kLmMgYi9zcmMvYmFja2VuZC5jCmluZGV4IGU3ZWUzZTQuLmQ4ZDdlMmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kLmMKKysrIGIvc3JjL2JhY2tlbmQuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBCYWNrZW5kIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLgogICoKLSAqIENvcHlyaWdodCAyMDAwLTIwMDggV2lsbHkgVGFycmVhdSA8d0Axd3QuZXU+CisgKiBDb3B5cmlnaHQgMjAwMC0yMDA5IFdpbGx5IFRhcnJlYXUgPHdAMXd0LmV1PgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8Y29tbW9uL2NvbXBhdC5oPgogI2luY2x1ZGUgPGNvbW1vbi9jb25maWcuaD4KICNpbmNsdWRlIDxjb21tb24vZGVidWcuaD4KLSNpbmNsdWRlIDxjb21tb24vZWIzMnRyZWUuaD4KICNpbmNsdWRlIDxjb21tb24vdGlja3MuaD4KICNpbmNsdWRlIDxjb21tb24vdGltZS5oPgogCkBAIC0zMSw2ICszMCw5IEBACiAjaW5jbHVkZSA8cHJvdG8vYWNsLmg+CiAjaW5jbHVkZSA8cHJvdG8vYmFja2VuZC5oPgogI2luY2x1ZGUgPHByb3RvL2NsaWVudC5oPgorI2luY2x1ZGUgPHByb3RvL2xiX2Z3bGMuaD4KKyNpbmNsdWRlIDxwcm90by9sYl9md3JyLmg+CisjaW5jbHVkZSA8cHJvdG8vbGJfbWFwLmg+CiAjaW5jbHVkZSA8cHJvdG8vcHJvdG9faHR0cC5oPgogI2luY2x1ZGUgPHByb3RvL3Byb3RvX3RjcC5oPgogI2luY2x1ZGUgPHByb3RvL3F1ZXVlLmg+CkBAIC0zOCwxMiArNDAsNiBAQAogI2luY2x1ZGUgPHByb3RvL3Nlc3Npb24uaD4KICNpbmNsdWRlIDxwcm90by90YXNrLmg+CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3JlbW92ZV9mcm9tX3RyZWUoc3RydWN0IHNlcnZlciAqcyk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9xdWV1ZV9ieV93ZWlnaHQoc3RydWN0IGViX3Jvb3QgKnJvb3QsIHN0cnVjdCBzZXJ2ZXIgKnMpOwotc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfZGVxdWV1ZV9zcnYoc3RydWN0IHNlcnZlciAqcyk7Ci1zdGF0aWMgdm9pZCBmd3JyX2dldF9zcnYoc3RydWN0IHNlcnZlciAqcyk7Ci1zdGF0aWMgdm9pZCBmd3JyX3F1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKTsKLQogLyoKICAqIFRoaXMgZnVuY3Rpb24gcmVjb3VudHMgdGhlIG51bWJlciBvZiB1c2FibGUgYWN0aXZlIGFuZCBiYWNrdXAgc2VydmVycyBmb3IKICAqIHByb3h5IDxwPi4gVGhlc2UgbnVtYmVycyBhcmUgcmV0dXJuZWQgaW50byB0aGUgcC0+c3J2X2FjdCBhbmQgcC0+c3J2X2Jjay4KQEAgLTk0LDEwMTcgKzkwLDggQEAKIAkJcHgtPmxicHJtLnRvdF93ZWlnaHQgPSBweC0+bGJwcm0udG90X3diY2s7CiAJCXB4LT5sYnBybS50b3RfdXNlZCAgID0gcHgtPnNydl9iY2s7CiAJfQotfQotCi0vKiB0aGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIG1hcCBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3IHN0YXRlICovCi1zdGF0aWMgdm9pZCBtYXBfc2V0X3NlcnZlcl9zdGF0dXNfZG93bihzdHJ1Y3Qgc2VydmVyICpzcnYpCi17Ci0Jc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKLQotCS8qIEZJWE1FOiBjb3VsZCBiZSBvcHRpbWl6ZWQgc2luY2Ugd2Uga25vdyB3aGF0IGNoYW5nZWQgKi8KLQlyZWNvdW50X3NlcnZlcnMocCk7Ci0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCXAtPmxicHJtLm1hcC5zdGF0ZSB8PSBQUl9NQVBfUkVDQUxDOwotIG91dF91cGRhdGVfc3RhdGU6Ci0Jc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBtYXAgYWNjb3JkaW5nIHRvIHNlcnZlciA8c3J2PidzIG5ldyBzdGF0ZSAqLwotc3RhdGljIHZvaWQgbWFwX3NldF9zZXJ2ZXJfc3RhdHVzX3VwKHN0cnVjdCBzZXJ2ZXIgKnNydikKLXsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OwotCi0JaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCi0JICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKLQkJcmV0dXJuOwotCi0JaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKLQotCS8qIEZJWE1FOiBjb3VsZCBiZSBvcHRpbWl6ZWQgc2luY2Ugd2Uga25vdyB3aGF0IGNoYW5nZWQgKi8KLQlyZWNvdW50X3NlcnZlcnMocCk7Ci0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCXAtPmxicHJtLm1hcC5zdGF0ZSB8PSBQUl9NQVBfUkVDQUxDOwotIG91dF91cGRhdGVfc3RhdGU6Ci0Jc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZWNvbXB1dGVzIHRoZSBzZXJ2ZXIgbWFwIGZvciBwcm94eSBweC4gSXQgcmVsaWVzIG9uCi0gKiBweC0+bGJwcm0udG90X3dhY3QsIHRvdF93YmNrLCB0b3RfdXNlZCwgdG90X3dlaWdodCwgc28gaXQgbXVzdCBiZQotICogY2FsbGVkIGFmdGVyIHJlY291bnRfc2VydmVycygpLiBJdCBhbHNvIGV4cGVjdHMgcHgtPmxicHJtLm1hcC5zcnYKLSAqIHRvIGJlIGFsbG9jYXRlZCB3aXRoIHRoZSBsYXJnZXN0IHNpemUgbmVlZGVkLiBJdCB1cGRhdGVzIHRvdF93ZWlnaHQuCi0gKi8KLXZvaWQgcmVjYWxjX3NlcnZlcl9tYXAoc3RydWN0IHByb3h5ICpweCkKLXsKLQlpbnQgbywgdG90LCBmbGFnOwotCXN0cnVjdCBzZXJ2ZXIgKmN1ciwgKmJlc3Q7Ci0KLQlzd2l0Y2ggKHB4LT5sYnBybS50b3RfdXNlZCkgewotCWNhc2UgMDoJLyogbm8gc2VydmVyICovCi0JCXB4LT5sYnBybS5tYXAuc3RhdGUgJj0gflBSX01BUF9SRUNBTEM7Ci0JCXJldHVybjsKLQljYXNlIDE6IC8qIG9ubHkgb25lIHNlcnZlciwganVzdCBmaWxsIGZpcnN0IGVudHJ5ICovCi0JCXRvdCA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXRvdCA9IHB4LT5sYnBybS50b3Rfd2VpZ2h0OwotCQlicmVhazsKLQl9Ci0KLQkvKiBoZXJlIHdlICprbm93KiB0aGF0IHdlIGhhdmUgc29tZSBzZXJ2ZXJzICovCi0JaWYgKHB4LT5zcnZfYWN0KQotCQlmbGFnID0gU1JWX1JVTk5JTkc7Ci0JZWxzZQotCQlmbGFnID0gU1JWX1JVTk5JTkcgfCBTUlZfQkFDS1VQOwotCi0JLyogdGhpcyBhbGdvcml0aG0gZ2l2ZXMgcHJpb3JpdHkgdG8gdGhlIGZpcnN0IHNlcnZlciwgd2hpY2ggbWVhbnMgdGhhdAotCSAqIGl0IHdpbGwgcmVzcGVjdCB0aGUgZGVjbGFyYXRpb24gb3JkZXIgZm9yIGVxdWl2YWxlbnQgd2VpZ2h0cywgYW5kCi0JICogdGhhdCB3aGF0ZXZlciB0aGUgd2VpZ2h0cywgdGhlIGZpcnN0IHNlcnZlciBjYWxsZWQgd2lsbCBhbHdheXMgYmUKLQkgKiB0aGUgZmlyc3QgZGVjbGFyZWQuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGFzdW1wdGlvbiBmb3IgdGhlIGJhY2t1cAotCSAqIGNhc2UsIHdoZXJlIHdlIHdhbnQgdGhlIGZpcnN0IHNlcnZlciBvbmx5LgotCSAqLwotCWZvciAoY3VyID0gcHgtPnNydjsgY3VyOyBjdXIgPSBjdXItPm5leHQpCi0JCWN1ci0+d3Njb3JlID0gMDsKLQotCWZvciAobyA9IDA7IG8gPCB0b3Q7IG8rKykgewotCQlpbnQgbWF4ID0gMDsKLQkJYmVzdCA9IE5VTEw7Ci0JCWZvciAoY3VyID0gcHgtPnNydjsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKLQkJCWlmIChjdXItPmV3ZWlnaHQgJiYKLQkJCSAgICBmbGFnID09IChjdXItPnN0YXRlICYKLQkJCQkgICAgIChTUlZfUlVOTklORyB8IFNSVl9HT0lOR0RPV04gfCBTUlZfQkFDS1VQKSkpIHsKLQkJCQlpbnQgdjsKLQotCQkJCS8qIElmIHdlIGFyZSBmb3JjZWQgdG8gcmV0dXJuIG9ubHkgb25lIHNlcnZlciwgd2UgZG9uJ3Qgd2FudCB0bwotCQkJCSAqIGdvIGZ1cnRoZXIsIGJlY2F1c2Ugd2Ugd291bGQgcmV0dXJuIHRoZSB3cm9uZyBvbmUgZHVlIHRvCi0JCQkJICogZGl2aWRlIG92ZXJmbG93LgotCQkJCSAqLwotCQkJCWlmICh0b3QgPT0gMSkgewotCQkJCQliZXN0ID0gY3VyOwotCQkJCQkvKiBub3RlIHRoYXQgYmVzdC0+d3Njb3JlIHdpbGwgYmUgd3JvbmcgYnV0IHdlIGRvbid0IGNhcmUgKi8KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY3VyLT53c2NvcmUgKz0gY3VyLT5ld2VpZ2h0OwotCQkJCXYgPSAoY3VyLT53c2NvcmUgKyB0b3QpIC8gdG90OyAvKiByZXN1bHQgYmV0d2VlbiAwIGFuZCAzICovCi0JCQkJaWYgKGJlc3QgPT0gTlVMTCB8fCB2ID4gbWF4KSB7Ci0JCQkJCW1heCA9IHY7Ci0JCQkJCWJlc3QgPSBjdXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXB4LT5sYnBybS5tYXAuc3J2W29dID0gYmVzdDsKLQkJYmVzdC0+d3Njb3JlIC09IHRvdDsKLQl9Ci0JcHgtPmxicHJtLm1hcC5zdGF0ZSAmPSB+UFJfTUFQX1JFQ0FMQzsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBvZiBidWlsZGluZyB0aGUgc2VydmVyIE1BUCBmb3IgbWFwLWJhc2VkIExCCi0gKiBhbGdvcml0aG1zLCBhbGxvY2F0aW5nIHRoZSBtYXAsIGFuZCBzZXR0aW5nIHAtPmxicHJtLndtdWx0IHRvIHRoZSBHQ0Qgb2YgdGhlCi0gKiB3ZWlnaHRzIGlmIGFwcGxpY2FibGUuIEl0IHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBwcm94eSwgYXQgY29uZmlnCi0gKiB0aW1lLgotICovCi12b2lkIGluaXRfc2VydmVyX21hcChzdHJ1Y3QgcHJveHkgKnApCi17Ci0Jc3RydWN0IHNlcnZlciAqc3J2OwotCWludCBwZ2NkOwotCWludCBhY3QsIGJjazsKLQotCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX3VwICAgPSBtYXBfc2V0X3NlcnZlcl9zdGF0dXNfdXA7Ci0JcC0+bGJwcm0uc2V0X3NlcnZlcl9zdGF0dXNfZG93biA9IG1hcF9zZXRfc2VydmVyX3N0YXR1c19kb3duOwotCXAtPmxicHJtLnVwZGF0ZV9zZXJ2ZXJfZXdlaWdodCA9IE5VTEw7Ci0gCi0JaWYgKCFwLT5zcnYpCi0JCXJldHVybjsKLQotCS8qIFdlIHdpbGwgZmFjdG9yIHRoZSB3ZWlnaHRzIHRvIHJlZHVjZSB0aGUgdGFibGUsCi0JICogdXNpbmcgRXVjbGlkZSdzIGxhcmdlc3QgY29tbW9uIGRpdmlzb3IgYWxnb3JpdGhtLgotCSAqIFNpbmNlIHdlIG1heSBoYXZlIHplcm8gd2VpZ2h0cywgd2UgaGF2ZSB0byBmaXJzdAotCSAqIGZpbmQgYSBub24temVybyB3ZWlnaHQgc2VydmVyLgotCSAqLwotCXBnY2QgPSAxOwotCXNydiA9IHAtPnNydjsKLQl3aGlsZSAoc3J2ICYmICFzcnYtPnV3ZWlnaHQpCi0JCXNydiA9IHNydi0+bmV4dDsKLQotCWlmIChzcnYpIHsKLQkJcGdjZCA9IHNydi0+dXdlaWdodDsgLyogbm90ZTogY2Fubm90IGJlIHplcm8gKi8KLQkJd2hpbGUgKHBnY2QgPiAxICYmIChzcnYgPSBzcnYtPm5leHQpKSB7Ci0JCQlpbnQgdyA9IHNydi0+dXdlaWdodDsKLQkJCXdoaWxlICh3KSB7Ci0JCQkJaW50IHQgPSBwZ2NkICUgdzsKLQkJCQlwZ2NkID0gdzsKLQkJCQl3ID0gdDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIEl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8ga25vdyB3aGF0IGZhY3RvciB0byBhcHBseQotCSAqIHRvIHRoZSBiYWNrZW5kJ3MgZWZmZWN0aXZlIHdlaWdodCB0byBrbm93IGl0cyByZWFsCi0JICogd2VpZ2h0LgotCSAqLwotCXAtPmxicHJtLndtdWx0ID0gcGdjZDsKLQotCWFjdCA9IGJjayA9IDA7Ci0JZm9yIChzcnYgPSBwLT5zcnY7IHNydjsgc3J2ID0gc3J2LT5uZXh0KSB7Ci0JCXNydi0+ZXdlaWdodCA9IHNydi0+dXdlaWdodCAvIHBnY2Q7Ci0JCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotCQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCQlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApCi0JCQliY2sgKz0gc3J2LT5ld2VpZ2h0OwotCQllbHNlCi0JCQlhY3QgKz0gc3J2LT5ld2VpZ2h0OwotCX0KLQotCS8qIHRoaXMgaXMgdGhlIGxhcmdlc3QgbWFwIHdlIHdpbGwgZXZlciBuZWVkIGZvciB0aGlzIHNlcnZlcnMgbGlzdCAqLwotCWlmIChhY3QgPCBiY2spCi0JCWFjdCA9IGJjazsKLQotCWlmICghYWN0KQotCQlhY3QgPSAxOwotCi0JcC0+bGJwcm0ubWFwLnNydiA9IChzdHJ1Y3Qgc2VydmVyICoqKWNhbGxvYyhhY3QsIHNpemVvZihzdHJ1Y3Qgc2VydmVyICopKTsKLQkvKiByZWNvdW50cyBzZXJ2ZXJzIGFuZCB0aGVpciB3ZWlnaHRzICovCi0JcC0+bGJwcm0ubWFwLnN0YXRlID0gUFJfTUFQX1JFQ0FMQzsKLQlyZWNvdW50X3NlcnZlcnMocCk7Ci0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCXJlY2FsY19zZXJ2ZXJfbWFwKHApOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHNlcnZlciB0cmVlcyBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3Ci0gKiBzdGF0ZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHNlcnZlciA8c3J2PidzIHN0YXR1cyBjaGFuZ2VzIHRvIGRvd24uCi0gKiBJdCBpcyBub3QgaW1wb3J0YW50IHdoZXRoZXIgdGhlIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duIG9yIG5vdC4gSXQgaXMgbm90Ci0gKiBpbXBvcnRhbnQgZWl0aGVyIHRoYXQgdGhlIG5ldyBzdGF0ZSBpcyBjb21wbGV0ZWx5IGRvd24gKHRoZSBjYWxsZXIgbWF5IG5vdAotICoga25vdyBhbGwgdGhlIHZhcmlhYmxlcyBvZiBhIHNlcnZlcidzIHN0YXRlKS4KLSAqLwotc3RhdGljIHZvaWQgZndycl9zZXRfc2VydmVyX3N0YXR1c19kb3duKHN0cnVjdCBzZXJ2ZXIgKnNydikKLXsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OwotCXN0cnVjdCBmd3JyX2dyb3VwICpncnA7Ci0KLQlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKLQkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQotCQlyZXR1cm47Ci0KLQlpZiAoc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQotCQlnb3RvIG91dF91cGRhdGVfc3RhdGU7Ci0KLQlpZiAoIXNydl9pc191c2FibGUoc3J2LT5wcmV2X3N0YXRlLCBzcnYtPnByZXZfZXdlaWdodCkpCi0JCS8qIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duICovCi0JCWdvdG8gb3V0X3VwZGF0ZV9iYWNrZW5kOwotCi0JZ3JwID0gKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/ICZwLT5sYnBybS5md3JyLmJjayA6ICZwLT5sYnBybS5md3JyLmFjdDsKLQlncnAtPm5leHRfd2VpZ2h0IC09IHNydi0+cHJldl9ld2VpZ2h0OwotCi0JaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7Ci0JCXAtPmxicHJtLnRvdF93YmNrID0gcC0+bGJwcm0uZndyci5iY2submV4dF93ZWlnaHQ7Ci0JCXAtPnNydl9iY2stLTsKLQotCQlpZiAoc3J2ID09IHAtPmxicHJtLmZiY2spIHsKLQkJCS8qIHdlIGxvc3QgdGhlIGZpcnN0IGJhY2t1cCBzZXJ2ZXIgaW4gYSBzaW5nbGUtYmFja3VwCi0JCQkgKiBjb25maWd1cmF0aW9uLCB3ZSBtdXN0IHNlYXJjaCBhbm90aGVyIG9uZS4KLQkJCSAqLwotCQkJc3RydWN0IHNlcnZlciAqc3J2MiA9IHAtPmxicHJtLmZiY2s7Ci0JCQlkbyB7Ci0JCQkJc3J2MiA9IHNydjItPm5leHQ7Ci0JCQl9IHdoaWxlIChzcnYyICYmCi0JCQkJICEoKHNydjItPnN0YXRlICYgU1JWX0JBQ0tVUCkgJiYKLQkJCQkgICBzcnZfaXNfdXNhYmxlKHNydjItPnN0YXRlLCBzcnYyLT5ld2VpZ2h0KSkpOwotCQkJcC0+bGJwcm0uZmJjayA9IHNydjI7Ci0JCX0KLQl9IGVsc2UgewotCQlwLT5sYnBybS50b3Rfd2FjdCA9IHAtPmxicHJtLmZ3cnIuYWN0Lm5leHRfd2VpZ2h0OwotCQlwLT5zcnZfYWN0LS07Ci0JfQotCi0JZndycl9kZXF1ZXVlX3NydihzcnYpOwotCWZ3cnJfcmVtb3ZlX2Zyb21fdHJlZShzcnYpOwotCi1vdXRfdXBkYXRlX2JhY2tlbmQ6Ci0JLyogY2hlY2svdXBkYXRlIHRvdF91c2VkLCB0b3Rfd2VpZ2h0ICovCi0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotIG91dF91cGRhdGVfc3RhdGU6Ci0Jc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBzZXJ2ZXIgdHJlZXMgYWNjb3JkaW5nIHRvIHNlcnZlciA8c3J2PidzIG5ldwotICogc3RhdGUuIEl0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBzZXJ2ZXIgPHNydj4ncyBzdGF0dXMgY2hhbmdlcyB0byB1cC4KLSAqIEl0IGlzIG5vdCBpbXBvcnRhbnQgd2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gb3Igbm90LiBJdCBpcyBub3QKLSAqIGltcG9ydGFudCBlaXRoZXIgdGhhdCB0aGUgbmV3IHN0YXRlIGlzIGNvbXBsZXRlbHkgVVAgKHRoZSBjYWxsZXIgbWF5IG5vdAotICoga25vdyBhbGwgdGhlIHZhcmlhYmxlcyBvZiBhIHNlcnZlcidzIHN0YXRlKS4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjaGFuZ2UKLSAqIHRoZSB3ZWlnaHQgb2YgYSBzZXJ2ZXIgd2hpY2ggd2FzIGFscmVhZHkgdXAuCi0gKi8KLXN0YXRpYyB2b2lkIGZ3cnJfc2V0X3NlcnZlcl9zdGF0dXNfdXAoc3RydWN0IHNlcnZlciAqc3J2KQotewotCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7Ci0Jc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQotCQlnb3RvIG91dF91cGRhdGVfc3RhdGU7Ci0KLQlpZiAoc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KSkKLQkJLyogc2VydmVyIHdhcyBhbHJlYWR5IHVwICovCi0JCWdvdG8gb3V0X3VwZGF0ZV9iYWNrZW5kOwotCi0JZ3JwID0gKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/ICZwLT5sYnBybS5md3JyLmJjayA6ICZwLT5sYnBybS5md3JyLmFjdDsKLQlncnAtPm5leHRfd2VpZ2h0ICs9IHNydi0+ZXdlaWdodDsKLQotCWlmIChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgewotCQlwLT5sYnBybS50b3Rfd2JjayA9IHAtPmxicHJtLmZ3cnIuYmNrLm5leHRfd2VpZ2h0OwotCQlwLT5zcnZfYmNrKys7Ci0KLQkJaWYgKCEocC0+b3B0aW9ucyAmIFBSX09fVVNFX0FMTF9CSykpIHsKLQkJCWlmICghcC0+bGJwcm0uZmJjaykgewotCQkJCS8qIHRoZXJlIHdhcyBubyBiYWNrdXAgc2VydmVyIGFueW1vcmUgKi8KLQkJCQlwLT5sYnBybS5mYmNrID0gc3J2OwotCQkJfSBlbHNlIHsKLQkJCQkvKiB3ZSBtYXkgaGF2ZSByZXN0b3JlZCBhIGJhY2t1cCBzZXJ2ZXIgcHJpb3IgdG8gZmJjaywKLQkJCQkgKiBpbiB3aGljaCBjYXNlIGl0IHNob3VsZCByZXBsYWNlIGl0LgotCQkJCSAqLwotCQkJCXN0cnVjdCBzZXJ2ZXIgKnNydjIgPSBzcnY7Ci0JCQkJZG8gewotCQkJCQlzcnYyID0gc3J2Mi0+bmV4dDsKLQkJCQl9IHdoaWxlIChzcnYyICYmIChzcnYyICE9IHAtPmxicHJtLmZiY2spKTsKLQkJCQlpZiAoc3J2MikKLQkJCQkJcC0+bGJwcm0uZmJjayA9IHNydjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXAtPmxicHJtLnRvdF93YWN0ID0gcC0+bGJwcm0uZndyci5hY3QubmV4dF93ZWlnaHQ7Ci0JCXAtPnNydl9hY3QrKzsKLQl9Ci0KLQkvKiBub3RlIHRoYXQgZXdlaWdodCBjYW5ub3QgYmUgMCBoZXJlICovCi0JZndycl9nZXRfc3J2KHNydik7Ci0Jc3J2LT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIChncnAtPm5leHRfd2VpZ2h0ICsgZ3JwLT5jdXJyX3dlaWdodCAtIGdycC0+Y3Vycl9wb3MpIC8gc3J2LT5ld2VpZ2h0OwotCWZ3cnJfcXVldWVfc3J2KHNydik7Ci0KLW91dF91cGRhdGVfYmFja2VuZDoKLQkvKiBjaGVjay91cGRhdGUgdG90X3VzZWQsIHRvdF93ZWlnaHQgKi8KLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0gb3V0X3VwZGF0ZV9zdGF0ZToKLQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFuIHVwZGF0ZSB0byBzZXJ2ZXIgPHNydj4ncyBlZmZlY3RpdmUKLSAqIHdlaWdodC4gSXQgbWF5IGJlIGNhbGxlZCBhZnRlciBhIHN0YXRlIGNoYW5nZSB0b28uCi0gKi8KLXN0YXRpYyB2b2lkIGZ3cnJfdXBkYXRlX3NlcnZlcl93ZWlnaHQoc3RydWN0IHNlcnZlciAqc3J2KQotewotCWludCBvbGRfc3RhdGUsIG5ld19zdGF0ZTsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OwotCXN0cnVjdCBmd3JyX2dyb3VwICpncnA7Ci0KLQlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKLQkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQotCQlyZXR1cm47Ci0KLQkvKiBJZiBjaGFuZ2luZyB0aGUgc2VydmVyJ3Mgd2VpZ2h0IGNoYW5nZXMgaXRzIHN0YXRlLCB3ZSBzaW1wbHkgYXBwbHkKLQkgKiB0aGUgcHJvY2VkdXJlcyB3ZSBhbHJlYWR5IGhhdmUgZm9yIHN0YXR1cyBjaGFuZ2UuIElmIHRoZSBzdGF0ZQotCSAqIHJlbWFpbnMgZG93biwgdGhlIHNlcnZlciBpcyBub3QgaW4gYW55IHRyZWUsIHNvIGl0J3MgYXMgZWFzeSBhcwotCSAqIHVwZGF0aW5nIGl0cyB2YWx1ZXMuIElmIHRoZSBzdGF0ZSByZW1haW5zIHVwIHdpdGggZGlmZmVyZW50IHdlaWdodHMsCi0JICogdGhlcmUgYXJlIHNvbWUgY29tcHV0YXRpb25zIHRvIHBlcmZvcm0gdG8gZmluZCBhIG5ldyBwbGFjZSBhbmQKLQkgKiBwb3NzaWJseSBhIG5ldyB0cmVlIGZvciB0aGlzIHNlcnZlci4KLQkgKi8KLQkgCi0Jb2xkX3N0YXRlID0gc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KTsKLQluZXdfc3RhdGUgPSBzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCk7Ci0KLQlpZiAoIW9sZF9zdGF0ZSAmJiAhbmV3X3N0YXRlKSB7Ci0JCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0JCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYgKCFvbGRfc3RhdGUgJiYgbmV3X3N0YXRlKSB7Ci0JCWZ3cnJfc2V0X3NlcnZlcl9zdGF0dXNfdXAoc3J2KTsKLQkJcmV0dXJuOwotCX0KLQllbHNlIGlmIChvbGRfc3RhdGUgJiYgIW5ld19zdGF0ZSkgewotCQlmd3JyX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd24oc3J2KTsKLQkJcmV0dXJuOwotCX0KLQotCWdycCA9IChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPyAmcC0+bGJwcm0uZndyci5iY2sgOiAmcC0+bGJwcm0uZndyci5hY3Q7Ci0JZ3JwLT5uZXh0X3dlaWdodCA9IGdycC0+bmV4dF93ZWlnaHQgLSBzcnYtPnByZXZfZXdlaWdodCArIHNydi0+ZXdlaWdodDsKLQotCXAtPmxicHJtLnRvdF93YWN0ID0gcC0+bGJwcm0uZndyci5hY3QubmV4dF93ZWlnaHQ7Ci0JcC0+bGJwcm0udG90X3diY2sgPSBwLT5sYnBybS5md3JyLmJjay5uZXh0X3dlaWdodDsKLQotCWlmIChzcnYtPmxiX3RyZWUgPT0gZ3JwLT5pbml0KSB7Ci0JCWZ3cnJfZGVxdWV1ZV9zcnYoc3J2KTsKLQkJZndycl9xdWV1ZV9ieV93ZWlnaHQoZ3JwLT5pbml0LCBzcnYpOwotCX0KLQllbHNlIGlmICghc3J2LT5sYl90cmVlKSB7Ci0JCS8qIEZJWE1FOiBzZXJ2ZXIgd2FzIGRvd24uIFRoaXMgaXMgbm90IHBvc3NpYmxlIHJpZ2h0IG5vdyBidXQKLQkJICogbWF5IGJlIG5lZWRlZCBzb29uIGZvciBzbG93c3RhcnQgb3IgZ3JhY2VmdWwgc2h1dGRvd24uCi0JCSAqLwotCQlmd3JyX2RlcXVldWVfc3J2KHNydik7Ci0JCWZ3cnJfZ2V0X3NydihzcnYpOwotCQlzcnYtPm5wb3MgPSBncnAtPmN1cnJfcG9zICsgKGdycC0+bmV4dF93ZWlnaHQgKyBncnAtPmN1cnJfd2VpZ2h0IC0gZ3JwLT5jdXJyX3BvcykgLyBzcnYtPmV3ZWlnaHQ7Ci0JCWZ3cnJfcXVldWVfc3J2KHNydik7Ci0JfSBlbHNlIHsKLQkJLyogVGhlIHNlcnZlciBpcyBlaXRoZXIgYWN0aXZlIG9yIGluIHRoZSBuZXh0IHF1ZXVlLiBJZiBpdCdzCi0JCSAqIHN0aWxsIGluIHRoZSBhY3RpdmUgcXVldWUgYW5kIGl0IGhhcyBub3QgY29uc3VtZWQgYWxsIG9mIGl0cwotCQkgKiBwbGFjZXMsIGxldCdzIGFkanVzdCBpdHMgbmV4dCBwb3NpdGlvbi4KLQkJICovCi0JCWZ3cnJfZ2V0X3NydihzcnYpOwotCi0JCWlmIChzcnYtPmV3ZWlnaHQgPiAwKSB7Ci0JCQlpbnQgcHJldl9uZXh0ID0gc3J2LT5ucG9zOwotCQkJaW50IHN0ZXAgPSBncnAtPm5leHRfd2VpZ2h0IC8gc3J2LT5ld2VpZ2h0OwotCi0JCQlzcnYtPm5wb3MgPSBzcnYtPmxwb3MgKyBzdGVwOwotCQkJc3J2LT5yd2VpZ2h0ID0gMDsKLQotCQkJaWYgKHNydi0+bnBvcyA+IHByZXZfbmV4dCkKLQkJCQlzcnYtPm5wb3MgPSBwcmV2X25leHQ7Ci0JCQlpZiAoc3J2LT5ucG9zIDwgZ3JwLT5jdXJyX3BvcyArIDIpCi0JCQkJc3J2LT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIHN0ZXA7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBwdXNoIGl0IGludG8gdGhlIG5leHQgdHJlZSAqLwotCQkJc3J2LT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIGdycC0+Y3Vycl93ZWlnaHQ7Ci0JCX0KLQotCQlmd3JyX2RlcXVldWVfc3J2KHNydik7Ci0JCWZ3cnJfcXVldWVfc3J2KHNydik7Ci0JfQotCi0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0Jc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Ci19Ci0KLS8qIFJlbW92ZSBhIHNlcnZlciBmcm9tIGEgdHJlZS4gSXQgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiBkZXF1ZXVlZC4gVGhpcwotICogZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgY2FsbGVkIHdoZW4gYSBzZXJ2ZXIgaXMgZ29pbmcgZG93biBvciBoYXMgaXRzCi0gKiB3ZWlnaHQgZGlzYWJsZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3JlbW92ZV9mcm9tX3RyZWUoc3RydWN0IHNlcnZlciAqcykKLXsKLQlzLT5sYl90cmVlID0gTlVMTDsKLX0KLQotLyogUXVldWUgYSBzZXJ2ZXIgaW4gdGhlIHdlaWdodCB0cmVlIDxyb290PiwgYXNzdW1pbmcgdGhlIHdlaWdodCBpcyA+MC4KLSAqIFdlIHdhbnQgdG8gc29ydCB0aGVtIGJ5IGludmVydGVkIHdlaWdodHMsIGJlY2F1c2Ugd2UgbmVlZCB0byBwbGFjZQotICogaGVhdnkgc2VydmVycyBmaXJzdCBpbiBvcmRlciB0byBnZXQgYSBzbW9vdGggZGlzdHJpYnV0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9xdWV1ZV9ieV93ZWlnaHQoc3RydWN0IGViX3Jvb3QgKnJvb3QsIHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jcy0+bGJfbm9kZS5rZXkgPSBTUlZfRVdHSFRfTUFYIC0gcy0+ZXdlaWdodDsKLQllYjMyX2luc2VydChyb290LCAmcy0+bGJfbm9kZSk7Ci0Jcy0+bGJfdHJlZSA9IHJvb3Q7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSB3ZWlnaHQgdHJlZXMgaW4gY2FzZSBvZiBmYXN0Ci0gKiB3ZWlnaHRlZCByb3VuZC1yb2Jpbi4gSXQgYWxzbyBzZXRzIHAtPmxicHJtLndkaXYgdG8gdGhlIGV3ZWlnaHQgdG8gdXdlaWdodAotICogcmF0aW8uIEJvdGggYWN0aXZlIGFuZCBiYWNrdXAgZ3JvdXBzIGFyZSBpbml0aWFsaXplZC4KLSAqLwotdm9pZCBmd3JyX2luaXRfc2VydmVyX2dyb3VwcyhzdHJ1Y3QgcHJveHkgKnApCi17Ci0Jc3RydWN0IHNlcnZlciAqc3J2OwotCXN0cnVjdCBlYl9yb290IGluaXRfaGVhZCA9IEVCX1JPT1Q7Ci0KLQlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c191cCAgID0gZndycl9zZXRfc2VydmVyX3N0YXR1c191cDsKLQlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c19kb3duID0gZndycl9zZXRfc2VydmVyX3N0YXR1c19kb3duOwotCXAtPmxicHJtLnVwZGF0ZV9zZXJ2ZXJfZXdlaWdodCAgPSBmd3JyX3VwZGF0ZV9zZXJ2ZXJfd2VpZ2h0OwotCi0JcC0+bGJwcm0ud2RpdiA9IEJFX1dFSUdIVF9TQ0FMRTsKLQlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKLQkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQgPSBzcnYtPnV3ZWlnaHQgKiBCRV9XRUlHSFRfU0NBTEU7Ci0JCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0JfQotCi0JcmVjb3VudF9zZXJ2ZXJzKHApOwotCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKLQotCS8qIHByZXBhcmUgdGhlIGFjdGl2ZSBzZXJ2ZXJzIGdyb3VwICovCi0JcC0+bGJwcm0uZndyci5hY3QuY3Vycl9wb3MgPSBwLT5sYnBybS5md3JyLmFjdC5jdXJyX3dlaWdodCA9Ci0JCXAtPmxicHJtLmZ3cnIuYWN0Lm5leHRfd2VpZ2h0ID0gcC0+bGJwcm0udG90X3dhY3Q7Ci0JcC0+bGJwcm0uZndyci5hY3QuY3VyciA9IHAtPmxicHJtLmZ3cnIuYWN0LnQwID0KLQkJcC0+bGJwcm0uZndyci5hY3QudDEgPSBpbml0X2hlYWQ7Ci0JcC0+bGJwcm0uZndyci5hY3QuaW5pdCA9ICZwLT5sYnBybS5md3JyLmFjdC50MDsKLQlwLT5sYnBybS5md3JyLmFjdC5uZXh0ID0gJnAtPmxicHJtLmZ3cnIuYWN0LnQxOwotCi0JLyogcHJlcGFyZSB0aGUgYmFja3VwIHNlcnZlcnMgZ3JvdXAgKi8KLQlwLT5sYnBybS5md3JyLmJjay5jdXJyX3BvcyA9IHAtPmxicHJtLmZ3cnIuYmNrLmN1cnJfd2VpZ2h0ID0KLQkJcC0+bGJwcm0uZndyci5iY2submV4dF93ZWlnaHQgPSBwLT5sYnBybS50b3Rfd2JjazsKLQlwLT5sYnBybS5md3JyLmJjay5jdXJyID0gcC0+bGJwcm0uZndyci5iY2sudDAgPQotCQlwLT5sYnBybS5md3JyLmJjay50MSA9IGluaXRfaGVhZDsKLQlwLT5sYnBybS5md3JyLmJjay5pbml0ID0gJnAtPmxicHJtLmZ3cnIuYmNrLnQwOwotCXAtPmxicHJtLmZ3cnIuYmNrLm5leHQgPSAmcC0+bGJwcm0uZndyci5iY2sudDE7Ci0KLQkvKiBxdWV1ZSBhY3RpdmUgYW5kIGJhY2t1cCBzZXJ2ZXJzIGluIHR3byBkaXN0aW5jdCBncm91cHMgKi8KLQlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKLQkJaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCQljb250aW51ZTsKLQkJZndycl9xdWV1ZV9ieV93ZWlnaHQoKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/Ci0JCQkJcC0+bGJwcm0uZndyci5iY2suaW5pdCA6Ci0JCQkJcC0+bGJwcm0uZndyci5hY3QuaW5pdCwKLQkJCQlzcnYpOwotCX0KLX0KLQotLyogc2ltcGx5IHJlbW92ZXMgYSBzZXJ2ZXIgZnJvbSBhIHdlaWdodCB0cmVlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9kZXF1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKQotewotCWViMzJfZGVsZXRlKCZzLT5sYl9ub2RlKTsKLX0KLQotLyogcXVldWVzIGEgc2VydmVyIGludG8gdGhlIGFwcHJvcHJpYXRlIGdyb3VwIGFuZCB0cmVlIGRlcGVuZGluZyBvbiBpdHMKLSAqIGJhY2t1cCBzdGF0dXMsIGFuZCAtPm5wb3MuIElmIHRoZSBzZXJ2ZXIgaXMgZGlzYWJsZWQsIHNpbXBseSBhc3NpZ24KLSAqIGl0IHRvIHRoZSBOVUxMIHRyZWUuCi0gKi8KLXN0YXRpYyB2b2lkIGZ3cnJfcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jc3RydWN0IHByb3h5ICpwID0gcy0+cHJveHk7Ci0Jc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKLQotCWdycCA9IChzLT5zdGF0ZSAmIFNSVl9CQUNLVVApID8gJnAtPmxicHJtLmZ3cnIuYmNrIDogJnAtPmxicHJtLmZ3cnIuYWN0OwotCQotCS8qIERlbGF5IGV2ZXJ5dGhpbmcgd2hpY2ggZG9lcyBub3QgZml0IGludG8gdGhlIHdpbmRvdyBhbmQgZXZlcnl0aGluZwotCSAqIHdoaWNoIGRvZXMgbm90IGZpdCBpbnRvIHRoZSB0aGVvcmljYWwgbmV3IHdpbmRvdy4KLQkgKi8KLQlpZiAoIXNydl9pc191c2FibGUocy0+c3RhdGUsIHMtPmV3ZWlnaHQpKSB7Ci0JCWZ3cnJfcmVtb3ZlX2Zyb21fdHJlZShzKTsKLQl9Ci0JZWxzZSBpZiAocy0+ZXdlaWdodCA8PSAwIHx8Ci0JCSBzLT5ucG9zID49IDIgKiBncnAtPmN1cnJfd2VpZ2h0IHx8Ci0JCSBzLT5ucG9zID49IGdycC0+Y3Vycl93ZWlnaHQgKyBncnAtPm5leHRfd2VpZ2h0KSB7Ci0JCS8qIHB1dCBpbnRvIG5leHQgdHJlZSwgYW5kIHJlYWRqdXN0IG5wb3MgaW4gY2FzZSB3ZSBjb3VsZAotCQkgKiBmaW5hbGx5IHRha2UgdGhpcyBiYWNrIHRvIGN1cnJlbnQuICovCi0JCXMtPm5wb3MgLT0gZ3JwLT5jdXJyX3dlaWdodDsKLQkJZndycl9xdWV1ZV9ieV93ZWlnaHQoZ3JwLT5uZXh0LCBzKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIFRoZSBzb3J0aW5nIGtleSBpcyBzdG9yZWQgaW4gdW5pdHMgb2Ygcy0+bnBvcyAqIHVzZXJfd2VpZ2h0Ci0JCSAqIGluIG9yZGVyIHRvIGF2b2lkIG92ZXJmbG93cy4gQXMgc3RhdGVkIGluIGJhY2tlbmQuaCwgdGhlCi0JCSAqIGxvd2VyIHRoZSBzY2FsZSwgdGhlIHJvdWdoZXIgdGhlIHdlaWdodHMgbW9kdWxhdGlvbiwgYW5kIHRoZQotCQkgKiBoaWdoZXIgdGhlIHNjYWxlLCB0aGUgbG93ZXIgdGhlIG51bWJlciBvZiBzZXJ2ZXJzIHdpdGhvdXQKLQkJICogb3ZlcmZsb3cuIFdpdGggdGhpcyBmb3JtdWxhLCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBwb3NpdGl2ZSwKLQkJICogc28gd2UgY2FuIHVzZSBlYjPpX2luc2VydCgpLgotCQkgKi8KLQkJcy0+bGJfbm9kZS5rZXkgPSBTUlZfVVdHSFRfUkFOR0UgKiBzLT5ucG9zICsKLQkJCSh1bnNpZ25lZCkoU1JWX0VXR0hUX01BWCArIHMtPnJ3ZWlnaHQgLSBzLT5ld2VpZ2h0KSAvIEJFX1dFSUdIVF9TQ0FMRTsKLQotCQllYjMyX2luc2VydCgmZ3JwLT5jdXJyLCAmcy0+bGJfbm9kZSk7Ci0JCXMtPmxiX3RyZWUgPSAmZ3JwLT5jdXJyOwotCX0KLX0KLQotLyogcHJlcGFyZXMgYSBzZXJ2ZXIgd2hlbiBleHRyYWN0aW5nIGl0IGZyb20gdGhlICJpbml0IiB0cmVlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9nZXRfc3J2X2luaXQoc3RydWN0IHNlcnZlciAqcykKLXsKLQlzLT5ucG9zID0gcy0+cndlaWdodCA9IDA7Ci19Ci0KLS8qIHByZXBhcmVzIGEgc2VydmVyIHdoZW4gZXh0cmFjdGluZyBpdCBmcm9tIHRoZSAibmV4dCIgdHJlZSAqLwotc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfZ2V0X3Nydl9uZXh0KHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jc3RydWN0IGZ3cnJfZ3JvdXAgKmdycCA9IChzLT5zdGF0ZSAmIFNSVl9CQUNLVVApID8KLQkJJnMtPnByb3h5LT5sYnBybS5md3JyLmJjayA6Ci0JCSZzLT5wcm94eS0+bGJwcm0uZndyci5hY3Q7Ci0KLQlzLT5ucG9zICs9IGdycC0+Y3Vycl93ZWlnaHQ7Ci19Ci0KLS8qIHByZXBhcmVzIGEgc2VydmVyIHdoZW4gaXQgd2FzIG1hcmtlZCBkb3duICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9nZXRfc3J2X2Rvd24oc3RydWN0IHNlcnZlciAqcykKLXsKLQlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwID0gKHMtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPwotCQkmcy0+cHJveHktPmxicHJtLmZ3cnIuYmNrIDoKLQkJJnMtPnByb3h5LT5sYnBybS5md3JyLmFjdDsKLQotCXMtPm5wb3MgPSBncnAtPmN1cnJfcG9zOwotfQotCi0vKiBwcmVwYXJlcyBhIHNlcnZlciB3aGVuIGV4dHJhY3RpbmcgaXQgZnJvbSBpdHMgdHJlZSAqLwotc3RhdGljIHZvaWQgZndycl9nZXRfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jc3RydWN0IHByb3h5ICpwID0gcy0+cHJveHk7Ci0Jc3RydWN0IGZ3cnJfZ3JvdXAgKmdycCA9IChzLT5zdGF0ZSAmIFNSVl9CQUNLVVApID8KLQkJJnAtPmxicHJtLmZ3cnIuYmNrIDoKLQkJJnAtPmxicHJtLmZ3cnIuYWN0OwotCi0JaWYgKHMtPmxiX3RyZWUgPT0gZ3JwLT5pbml0KSB7Ci0JCWZ3cnJfZ2V0X3Nydl9pbml0KHMpOwotCX0KLQllbHNlIGlmIChzLT5sYl90cmVlID09IGdycC0+bmV4dCkgewotCQlmd3JyX2dldF9zcnZfbmV4dChzKTsKLQl9Ci0JZWxzZSBpZiAocy0+bGJfdHJlZSA9PSBOVUxMKSB7Ci0JCWZ3cnJfZ2V0X3Nydl9kb3duKHMpOwotCX0KLX0KLQotLyogc3dpdGNoZXMgdHJlZXMgImluaXQiIGFuZCAibmV4dCIgZm9yIEZXUlIgZ3JvdXAgPGdycD4uICJpbml0IiBzaG91bGQgYmUgZW1wdHkKLSAqIHdoZW4gdGhpcyBoYXBwZW5zLCBhbmQgIm5leHQiIGZpbGxlZCB3aXRoIHNlcnZlcnMgc29ydGVkIGJ5IHdlaWdodHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3N3aXRjaF90cmVlcyhzdHJ1Y3QgZndycl9ncm91cCAqZ3JwKQotewotCXN0cnVjdCBlYl9yb290ICpzd2FwOwotCXN3YXAgPSBncnAtPmluaXQ7Ci0JZ3JwLT5pbml0ID0gZ3JwLT5uZXh0OwotCWdycC0+bmV4dCA9IHN3YXA7Ci0JZ3JwLT5jdXJyX3dlaWdodCA9IGdycC0+bmV4dF93ZWlnaHQ7Ci0JZ3JwLT5jdXJyX3BvcyA9IGdycC0+Y3Vycl93ZWlnaHQ7Ci19Ci0KLS8qIHJldHVybiBuZXh0IHNlcnZlciBmcm9tIHRoZSBjdXJyZW50IHRyZWUgaW4gRldSUiBncm91cCA8Z3JwPiwgb3IgYSBzZXJ2ZXIKLSAqIGZyb20gdGhlICJpbml0IiB0cmVlIGlmIGFwcHJvcHJpYXRlLiBJZiBib3RoIHRyZWVzIGFyZSBlbXB0eSwgcmV0dXJuIE5VTEwuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2VydmVyICpmd3JyX2dldF9zZXJ2ZXJfZnJvbV9ncm91cChzdHJ1Y3QgZndycl9ncm91cCAqZ3JwKQotewotCXN0cnVjdCBlYjMyX25vZGUgKm5vZGU7Ci0Jc3RydWN0IHNlcnZlciAqczsKLQotCW5vZGUgPSBlYjMyX2ZpcnN0KCZncnAtPmN1cnIpOwotCXMgPSBlYjMyX2VudHJ5KG5vZGUsIHN0cnVjdCBzZXJ2ZXIsIGxiX25vZGUpOwotCQotCWlmICghbm9kZSB8fCBzLT5ucG9zID4gZ3JwLT5jdXJyX3BvcykgewotCQkvKiBlaXRoZXIgd2UgaGF2ZSBubyBzZXJ2ZXIgbGVmdCwgb3Igd2UgaGF2ZSBhIGhvbGUgKi8KLQkJc3RydWN0IGViMzJfbm9kZSAqbm9kZTI7Ci0JCW5vZGUyID0gZWIzMl9maXJzdChncnAtPmluaXQpOwotCQlpZiAobm9kZTIpIHsKLQkJCW5vZGUgPSBub2RlMjsKLQkJCXMgPSBlYjMyX2VudHJ5KG5vZGUsIHN0cnVjdCBzZXJ2ZXIsIGxiX25vZGUpOwotCQkJZndycl9nZXRfc3J2X2luaXQocyk7Ci0JCQlpZiAocy0+ZXdlaWdodCA9PSAwKSAvKiBGSVhNRTogaXMgaXQgcG9zc2libGUgYXQgYWxsID8gKi8KLQkJCQlub2RlID0gTlVMTDsKLQkJfQotCX0KLQlpZiAobm9kZSkKLQkJcmV0dXJuIHM7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLQotLyogQ29tcHV0ZXMgbmV4dCBwb3NpdGlvbiBvZiBzZXJ2ZXIgPHM+IGluIHRoZSBncm91cC4gSXQgaXMgbWFuZGF0b3J5IGZvciA8cz4KLSAqIHRvIGhhdmUgYSBub24temVybywgcG9zaXRpdmUgZXdlaWdodC4KLSovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl91cGRhdGVfcG9zaXRpb24oc3RydWN0IGZ3cnJfZ3JvdXAgKmdycCwgc3RydWN0IHNlcnZlciAqcykKLXsKLQlpZiAoIXMtPm5wb3MpIHsKLQkJLyogZmlyc3QgdGltZSBldmVyIGZvciB0aGlzIHNlcnZlciAqLwotCQlzLT5scG9zID0gZ3JwLT5jdXJyX3BvczsKLQkJcy0+bnBvcyA9IGdycC0+Y3Vycl9wb3MgKyBncnAtPm5leHRfd2VpZ2h0IC8gcy0+ZXdlaWdodDsKLQkJcy0+cndlaWdodCArPSBncnAtPm5leHRfd2VpZ2h0ICUgcy0+ZXdlaWdodDsKLQotCQlpZiAocy0+cndlaWdodCA+PSBzLT5ld2VpZ2h0KSB7Ci0JCQlzLT5yd2VpZ2h0IC09IHMtPmV3ZWlnaHQ7Ci0JCQlzLT5ucG9zKys7Ci0JCX0KLQl9IGVsc2UgewotCQlzLT5scG9zID0gcy0+bnBvczsKLQkJcy0+bnBvcyArPSBncnAtPm5leHRfd2VpZ2h0IC8gcy0+ZXdlaWdodDsKLQkJcy0+cndlaWdodCArPSBncnAtPm5leHRfd2VpZ2h0ICUgcy0+ZXdlaWdodDsKLQotCQlpZiAocy0+cndlaWdodCA+PSBzLT5ld2VpZ2h0KSB7Ci0JCQlzLT5yd2VpZ2h0IC09IHMtPmV3ZWlnaHQ7Ci0JCQlzLT5ucG9zKys7Ci0JCX0KLQl9Ci19Ci0KLS8qIFJldHVybiBuZXh0IHNlcnZlciBmcm9tIHRoZSBjdXJyZW50IHRyZWUgaW4gYmFja2VuZCA8cD4sIG9yIGEgc2VydmVyIGZyb20KLSAqIHRoZSBpbml0IHRyZWUgaWYgYXBwcm9wcmlhdGUuIElmIGJvdGggdHJlZXMgYXJlIGVtcHR5LCByZXR1cm4gTlVMTC4KLSAqIFNhdHVyYXRlZCBzZXJ2ZXJzIGFyZSBza2lwcGVkIGFuZCByZXF1ZXVlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBzZXJ2ZXIgKmZ3cnJfZ2V0X25leHRfc2VydmVyKHN0cnVjdCBwcm94eSAqcCwgc3RydWN0IHNlcnZlciAqc3J2dG9hdm9pZCkKLXsKLQlzdHJ1Y3Qgc2VydmVyICpzcnYsICpmdWxsLCAqYXZvaWRlZDsKLQlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwOwotCWludCBzd2l0Y2hlZDsKLQotCWlmIChwLT5zcnZfYWN0KQotCQlncnAgPSAmcC0+bGJwcm0uZndyci5hY3Q7Ci0JZWxzZSBpZiAocC0+bGJwcm0uZmJjaykKLQkJcmV0dXJuIHAtPmxicHJtLmZiY2s7Ci0JZWxzZSBpZiAocC0+c3J2X2JjaykKLQkJZ3JwID0gJnAtPmxicHJtLmZ3cnIuYmNrOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzd2l0Y2hlZCA9IDA7Ci0JYXZvaWRlZCA9IE5VTEw7Ci0JZnVsbCA9IE5VTEw7IC8qIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIHNhdHVyYXRlZCBzZXJ2ZXJzICovCi0Jd2hpbGUgKDEpIHsKLQkJLyogaWYgd2Ugc2VlIGFuIGVtcHR5IGdyb3VwLCBsZXQncyBmaXJzdCB0cnkgdG8gY29sbGVjdCB3ZWlnaHRzCi0JCSAqIHdoaWNoIG1pZ2h0IGhhdmUgcmVjZW50bHkgY2hhbmdlZC4KLQkJICovCi0JCWlmICghZ3JwLT5jdXJyX3dlaWdodCkKLQkJCWdycC0+Y3Vycl9wb3MgPSBncnAtPmN1cnJfd2VpZ2h0ID0gZ3JwLT5uZXh0X3dlaWdodDsKLQotCQkvKiBnZXQgZmlyc3Qgc2VydmVyIGZyb20gdGhlICJjdXJyZW50IiB0cmVlLiBXaGVuIHRoZSBlbmQgb2YKLQkJICogdGhlIHRyZWUgaXMgcmVhY2hlZCwgd2UgbWF5IGhhdmUgdG8gc3dpdGNoLCBidXQgb25seSBvbmNlLgotCQkgKi8KLQkJd2hpbGUgKDEpIHsKLQkJCXNydiA9IGZ3cnJfZ2V0X3NlcnZlcl9mcm9tX2dyb3VwKGdycCk7Ci0JCQlpZiAoc3J2KQotCQkJCWJyZWFrOwotCQkJaWYgKHN3aXRjaGVkKSB7Ci0JCQkJaWYgKGF2b2lkZWQpIHsKLQkJCQkJc3J2ID0gYXZvaWRlZDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWdvdG8gcmVxdWV1ZV9zZXJ2ZXJzOwotCQkJfQotCQkJc3dpdGNoZWQgPSAxOwotCQkJZndycl9zd2l0Y2hfdHJlZXMoZ3JwKTsKLQotCQl9Ci0KLQkJLyogT0ssIHdlIGhhdmUgYSBzZXJ2ZXIuIEhvd2V2ZXIsIGl0IG1heSBiZSBzYXR1cmF0ZWQsIGluIHdoaWNoCi0JCSAqIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvbnNpZGVyIGl0IGZvciBub3cuIFdlJ2xsIHVwZGF0ZQotCQkgKiBpdHMgcG9zaXRpb24gYW5kIGRlcXVldWUgaXQgYW55d2F5LCBzbyB0aGF0IHdlIGNhbiBtb3ZlIGl0Ci0JCSAqIHRvIGEgYmV0dGVyIHBsYWNlIGFmdGVyd2FyZHMuCi0JCSAqLwotCQlmd3JyX3VwZGF0ZV9wb3NpdGlvbihncnAsIHNydik7Ci0JCWZ3cnJfZGVxdWV1ZV9zcnYoc3J2KTsKLQkJZ3JwLT5jdXJyX3BvcysrOwotCQlpZiAoIXNydi0+bWF4Y29ubiB8fCAoIXNydi0+bmJwZW5kICYmIHNydi0+c2VydmVkIDwgc3J2X2R5bmFtaWNfbWF4Y29ubihzcnYpKSkgewotCQkJLyogbWFrZSBzdXJlIGl0IGlzIG5vdCB0aGUgc2VydmVyIHdlIGFyZSB0cnlpbmcgdG8gZXhjbHVkZS4uLiAqLwotCQkJaWYgKHNydiAhPSBzcnZ0b2F2b2lkIHx8IGF2b2lkZWQpCi0JCQkJYnJlYWs7Ci0KLQkJCWF2b2lkZWQgPSBzcnY7IC8qIC4uLmJ1dCByZW1lbWJlciB0aGF0IGlzIHdhcyBzZWxlY3RlZCB5ZXQgYXZvaWRlZCAqLwotCQl9Ci0KLQkJLyogdGhlIHNlcnZlciBpcyBzYXR1cmF0ZWQgb3IgYXZvaWRlZCwgbGV0J3MgY2hhaW4gaXQgZm9yIGxhdGVyIHJlaW5zZXJ0aW9uICovCi0JCXNydi0+bmV4dF9mdWxsID0gZnVsbDsKLQkJZnVsbCA9IHNydjsKLQl9Ci0KLQkvKiBPSywgd2UgZ290IHRoZSBiZXN0IHNlcnZlciwgbGV0J3MgdXBkYXRlIGl0ICovCi0JZndycl9xdWV1ZV9zcnYoc3J2KTsKLQotIHJlcXVldWVfc2VydmVyczoKLQkvKiBSZXF1ZXVlIGFsbCBleHRyYWN0ZWQgc2VydmVycy4gSWYgZnVsbD09c3J2IHRoZW4gaXQgd2FzCi0JICogYXZvaWRlZCAodW5zdWNlc3NmdWxseSkgYW5kIGNoYWluZWQsIG9taXQgaXQgbm93LgotCSAqLwotCWlmICh1bmxpa2VseShmdWxsICE9IE5VTEwpKSB7Ci0JCWlmIChzd2l0Y2hlZCkgewotCQkJLyogdGhlIHRyZWUgaGFzIHN3aXRjaGVkLCByZXF1ZXVlIGFsbCBleHRyYWN0ZWQgc2VydmVycwotCQkJICogaW50byAiaW5pdCIsIGJlY2F1c2UgdGhlaXIgcGxhY2Ugd2FzIGxvc3QsIGFuZCBvbmx5Ci0JCQkgKiB0aGVpciB3ZWlnaHQgbWF0dGVycy4KLQkJCSAqLwotCQkJZG8gewotCQkJCWlmIChsaWtlbHkoZnVsbCAhPSBzcnYpKQotCQkJCQlmd3JyX3F1ZXVlX2J5X3dlaWdodChncnAtPmluaXQsIGZ1bGwpOwotCQkJCWZ1bGwgPSBmdWxsLT5uZXh0X2Z1bGw7Ci0JCQl9IHdoaWxlIChmdWxsKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHJlcXVldWUgYWxsIGV4dHJhY3RlZCBzZXJ2ZXJzIGp1c3QgYXMgaWYgdGhleSB3ZXJlIGNvbnN1bWVkCi0JCQkgKiBzbyB0aGF0IHRoZXkgcmVnYWluIHRoZWlyIGV4cGVjdGVkIHBsYWNlLgotCQkJICovCi0JCQlkbyB7Ci0JCQkJaWYgKGxpa2VseShmdWxsICE9IHNydikpCi0JCQkJCWZ3cnJfcXVldWVfc3J2KGZ1bGwpOwotCQkJCWZ1bGwgPSBmdWxsLT5uZXh0X2Z1bGw7Ci0JCQl9IHdoaWxlIChmdWxsKTsKLQkJfQotCX0KLQlyZXR1cm4gc3J2OwogfQogCi0vKiBSZW1vdmUgYSBzZXJ2ZXIgZnJvbSBhIHRyZWUuIEl0IG11c3QgaGF2ZSBwcmV2aW91c2x5IGJlZW4gZGVxdWV1ZWQuIFRoaXMKLSAqIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGNhbGxlZCB3aGVuIGEgc2VydmVyIGlzIGdvaW5nIGRvd24gb3IgaGFzIGl0cwotICogd2VpZ2h0IGRpc2FibGVkLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndsY19yZW1vdmVfZnJvbV90cmVlKHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jcy0+bGJfdHJlZSA9IE5VTEw7Ci19Ci0KLS8qIHNpbXBseSByZW1vdmVzIGEgc2VydmVyIGZyb20gYSB0cmVlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndsY19kZXF1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKQotewotCWViMzJfZGVsZXRlKCZzLT5sYl9ub2RlKTsKLX0KLQotLyogUXVldWUgYSBzZXJ2ZXIgaW4gaXRzIGFzc29jaWF0ZWQgdHJlZSwgYXNzdW1pbmcgdGhlIHdlaWdodCBpcyA+MC4KLSAqIFNlcnZlcnMgYXJlIHNvcnRlZCBieSAjY29ubnMvd2VpZ2h0LiBUbyBlbnN1cmUgbWF4aW11bSBhY2N1cmFjeSwKLSAqIHdlIHVzZSAjY29ubnMqU1JWX0VXR0hUX01BWC9ld2VpZ2h0IGFzIHRoZSBzb3J0aW5nIGtleS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGZ3bGNfcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jcy0+bGJfbm9kZS5rZXkgPSBzLT5zZXJ2ZWQgKiBTUlZfRVdHSFRfTUFYIC8gcy0+ZXdlaWdodDsKLQllYjMyX2luc2VydChzLT5sYl90cmVlLCAmcy0+bGJfbm9kZSk7Ci19Ci0KLS8qIFJlLXBvc2l0aW9uIHRoZSBzZXJ2ZXIgaW4gdGhlIEZXTEMgdHJlZSBhZnRlciBpdCBoYXMgYmVlbiBhc3NpZ25lZCBvbmUKLSAqIGNvbm5lY3Rpb24gb3IgYWZ0ZXIgaXQgaGFzIHJlbGVhc2VkIG9uZS4gTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRoYXQKLSAqIHRoZSBzZXJ2ZXIgaGFzIGJlZW4gbW92ZWQgb3V0IG9mIHRoZSB0cmVlIGR1ZSB0byBmYWlsZWQgaGVhbHRoLWNoZWNrcy4KLSAqLwotc3RhdGljIHZvaWQgZndsY19zcnZfcmVwb3NpdGlvbihzdHJ1Y3Qgc2VydmVyICpzKQotewotCWlmICghcy0+bGJfdHJlZSkKLQkJcmV0dXJuOwotCWZ3bGNfZGVxdWV1ZV9zcnYocyk7Ci0JZndsY19xdWV1ZV9zcnYocyk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgc2VydmVyIHRyZWVzIGFjY29yZGluZyB0byBzZXJ2ZXIgPHNydj4ncyBuZXcKLSAqIHN0YXRlLiBJdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2VydmVyIDxzcnY+J3Mgc3RhdHVzIGNoYW5nZXMgdG8gZG93bi4KLSAqIEl0IGlzIG5vdCBpbXBvcnRhbnQgd2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gb3Igbm90LiBJdCBpcyBub3QKLSAqIGltcG9ydGFudCBlaXRoZXIgdGhhdCB0aGUgbmV3IHN0YXRlIGlzIGNvbXBsZXRlbHkgZG93biAodGhlIGNhbGxlciBtYXkgbm90Ci0gKiBrbm93IGFsbCB0aGUgdmFyaWFibGVzIG9mIGEgc2VydmVyJ3Mgc3RhdGUpLgotICovCi1zdGF0aWMgdm9pZCBmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd24oc3RydWN0IHNlcnZlciAqc3J2KQotewotCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7Ci0KLQlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKLQkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQotCQlyZXR1cm47Ci0KLQlpZiAoc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQotCQlnb3RvIG91dF91cGRhdGVfc3RhdGU7Ci0KLQlpZiAoIXNydl9pc191c2FibGUoc3J2LT5wcmV2X3N0YXRlLCBzcnYtPnByZXZfZXdlaWdodCkpCi0JCS8qIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duICovCi0JCWdvdG8gb3V0X3VwZGF0ZV9iYWNrZW5kOwotCi0JaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7Ci0JCXAtPmxicHJtLnRvdF93YmNrIC09IHNydi0+cHJldl9ld2VpZ2h0OwotCQlwLT5zcnZfYmNrLS07Ci0KLQkJaWYgKHNydiA9PSBwLT5sYnBybS5mYmNrKSB7Ci0JCQkvKiB3ZSBsb3N0IHRoZSBmaXJzdCBiYWNrdXAgc2VydmVyIGluIGEgc2luZ2xlLWJhY2t1cAotCQkJICogY29uZmlndXJhdGlvbiwgd2UgbXVzdCBzZWFyY2ggYW5vdGhlciBvbmUuCi0JCQkgKi8KLQkJCXN0cnVjdCBzZXJ2ZXIgKnNydjIgPSBwLT5sYnBybS5mYmNrOwotCQkJZG8gewotCQkJCXNydjIgPSBzcnYyLT5uZXh0OwotCQkJfSB3aGlsZSAoc3J2MiAmJgotCQkJCSAhKChzcnYyLT5zdGF0ZSAmIFNSVl9CQUNLVVApICYmCi0JCQkJICAgc3J2X2lzX3VzYWJsZShzcnYyLT5zdGF0ZSwgc3J2Mi0+ZXdlaWdodCkpKTsKLQkJCXAtPmxicHJtLmZiY2sgPSBzcnYyOwotCQl9Ci0JfSBlbHNlIHsKLQkJcC0+bGJwcm0udG90X3dhY3QgLT0gc3J2LT5wcmV2X2V3ZWlnaHQ7Ci0JCXAtPnNydl9hY3QtLTsKLQl9Ci0KLQlmd2xjX2RlcXVldWVfc3J2KHNydik7Ci0JZndsY19yZW1vdmVfZnJvbV90cmVlKHNydik7Ci0KLW91dF91cGRhdGVfYmFja2VuZDoKLQkvKiBjaGVjay91cGRhdGUgdG90X3VzZWQsIHRvdF93ZWlnaHQgKi8KLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0gb3V0X3VwZGF0ZV9zdGF0ZToKLQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHNlcnZlciB0cmVlcyBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3Ci0gKiBzdGF0ZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHNlcnZlciA8c3J2PidzIHN0YXR1cyBjaGFuZ2VzIHRvIHVwLgotICogSXQgaXMgbm90IGltcG9ydGFudCB3aGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgZG93biBvciBub3QuIEl0IGlzIG5vdAotICogaW1wb3J0YW50IGVpdGhlciB0aGF0IHRoZSBuZXcgc3RhdGUgaXMgY29tcGxldGVseSBVUCAodGhlIGNhbGxlciBtYXkgbm90Ci0gKiBrbm93IGFsbCB0aGUgdmFyaWFibGVzIG9mIGEgc2VydmVyJ3Mgc3RhdGUpLiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNoYW5nZQotICogdGhlIHdlaWdodCBvZiBhIHNlcnZlciB3aGljaCB3YXMgYWxyZWFkeSB1cC4KLSAqLwotc3RhdGljIHZvaWQgZndsY19zZXRfc2VydmVyX3N0YXR1c191cChzdHJ1Y3Qgc2VydmVyICpzcnYpCi17Ci0Jc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQotCQlnb3RvIG91dF91cGRhdGVfc3RhdGU7Ci0KLQlpZiAoc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KSkKLQkJLyogc2VydmVyIHdhcyBhbHJlYWR5IHVwICovCi0JCWdvdG8gb3V0X3VwZGF0ZV9iYWNrZW5kOwotCi0JaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7Ci0JCXNydi0+bGJfdHJlZSA9ICZwLT5sYnBybS5md2xjLmJjazsKLQkJcC0+bGJwcm0udG90X3diY2sgKz0gc3J2LT5ld2VpZ2h0OwotCQlwLT5zcnZfYmNrKys7Ci0KLQkJaWYgKCEocC0+b3B0aW9ucyAmIFBSX09fVVNFX0FMTF9CSykpIHsKLQkJCWlmICghcC0+bGJwcm0uZmJjaykgewotCQkJCS8qIHRoZXJlIHdhcyBubyBiYWNrdXAgc2VydmVyIGFueW1vcmUgKi8KLQkJCQlwLT5sYnBybS5mYmNrID0gc3J2OwotCQkJfSBlbHNlIHsKLQkJCQkvKiB3ZSBtYXkgaGF2ZSByZXN0b3JlZCBhIGJhY2t1cCBzZXJ2ZXIgcHJpb3IgdG8gZmJjaywKLQkJCQkgKiBpbiB3aGljaCBjYXNlIGl0IHNob3VsZCByZXBsYWNlIGl0LgotCQkJCSAqLwotCQkJCXN0cnVjdCBzZXJ2ZXIgKnNydjIgPSBzcnY7Ci0JCQkJZG8gewotCQkJCQlzcnYyID0gc3J2Mi0+bmV4dDsKLQkJCQl9IHdoaWxlIChzcnYyICYmIChzcnYyICE9IHAtPmxicHJtLmZiY2spKTsKLQkJCQlpZiAoc3J2MikKLQkJCQkJcC0+bGJwcm0uZmJjayA9IHNydjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXNydi0+bGJfdHJlZSA9ICZwLT5sYnBybS5md2xjLmFjdDsKLQkJcC0+bGJwcm0udG90X3dhY3QgKz0gc3J2LT5ld2VpZ2h0OwotCQlwLT5zcnZfYWN0Kys7Ci0JfQotCi0JLyogbm90ZSB0aGF0IGV3ZWlnaHQgY2Fubm90IGJlIDAgaGVyZSAqLwotCWZ3bGNfcXVldWVfc3J2KHNydik7Ci0KLSBvdXRfdXBkYXRlX2JhY2tlbmQ6Ci0JLyogY2hlY2svdXBkYXRlIHRvdF91c2VkLCB0b3Rfd2VpZ2h0ICovCi0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotIG91dF91cGRhdGVfc3RhdGU6Ci0Jc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBhbiB1cGRhdGUgdG8gc2VydmVyIDxzcnY+J3MgZWZmZWN0aXZlCi0gKiB3ZWlnaHQuIEl0IG1heSBiZSBjYWxsZWQgYWZ0ZXIgYSBzdGF0ZSBjaGFuZ2UgdG9vLgotICovCi1zdGF0aWMgdm9pZCBmd2xjX3VwZGF0ZV9zZXJ2ZXJfd2VpZ2h0KHN0cnVjdCBzZXJ2ZXIgKnNydikKLXsKLQlpbnQgb2xkX3N0YXRlLCBuZXdfc3RhdGU7Ci0Jc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCS8qIElmIGNoYW5naW5nIHRoZSBzZXJ2ZXIncyB3ZWlnaHQgY2hhbmdlcyBpdHMgc3RhdGUsIHdlIHNpbXBseSBhcHBseQotCSAqIHRoZSBwcm9jZWR1cmVzIHdlIGFscmVhZHkgaGF2ZSBmb3Igc3RhdHVzIGNoYW5nZS4gSWYgdGhlIHN0YXRlCi0JICogcmVtYWlucyBkb3duLCB0aGUgc2VydmVyIGlzIG5vdCBpbiBhbnkgdHJlZSwgc28gaXQncyBhcyBlYXN5IGFzCi0JICogdXBkYXRpbmcgaXRzIHZhbHVlcy4gSWYgdGhlIHN0YXRlIHJlbWFpbnMgdXAgd2l0aCBkaWZmZXJlbnQgd2VpZ2h0cywKLQkgKiB0aGVyZSBhcmUgc29tZSBjb21wdXRhdGlvbnMgdG8gcGVyZm9ybSB0byBmaW5kIGEgbmV3IHBsYWNlIGFuZAotCSAqIHBvc3NpYmx5IGEgbmV3IHRyZWUgZm9yIHRoaXMgc2VydmVyLgotCSAqLwotCSAKLQlvbGRfc3RhdGUgPSBzcnZfaXNfdXNhYmxlKHNydi0+cHJldl9zdGF0ZSwgc3J2LT5wcmV2X2V3ZWlnaHQpOwotCW5ld19zdGF0ZSA9IHNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KTsKLQotCWlmICghb2xkX3N0YXRlICYmICFuZXdfc3RhdGUpIHsKLQkJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAoIW9sZF9zdGF0ZSAmJiBuZXdfc3RhdGUpIHsKLQkJZndsY19zZXRfc2VydmVyX3N0YXR1c191cChzcnYpOwotCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYgKG9sZF9zdGF0ZSAmJiAhbmV3X3N0YXRlKSB7Ci0JCWZ3bGNfc2V0X3NlcnZlcl9zdGF0dXNfZG93bihzcnYpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHNydi0+bGJfdHJlZSkKLQkJZndsY19kZXF1ZXVlX3NydihzcnYpOwotCi0JaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7Ci0JCXAtPmxicHJtLnRvdF93YmNrICs9IHNydi0+ZXdlaWdodCAtIHNydi0+cHJldl9ld2VpZ2h0OwotCQlzcnYtPmxiX3RyZWUgPSAmcC0+bGJwcm0uZndsYy5iY2s7Ci0JfSBlbHNlIHsKLQkJcC0+bGJwcm0udG90X3dhY3QgKz0gc3J2LT5ld2VpZ2h0IC0gc3J2LT5wcmV2X2V3ZWlnaHQ7Ci0JCXNydi0+bGJfdHJlZSA9ICZwLT5sYnBybS5md2xjLmFjdDsKLQl9Ci0KLQlmd2xjX3F1ZXVlX3NydihzcnYpOwotCi0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0Jc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSB0cmVlcyBpbiBjYXNlIG9mIGZhc3QKLSAqIHdlaWdodGVkIGxlYXN0LWNvbm5zLiBJdCBhbHNvIHNldHMgcC0+bGJwcm0ud2RpdiB0byB0aGUgZXdlaWdodCB0bwotICogdXdlaWdodCByYXRpby4gQm90aCBhY3RpdmUgYW5kIGJhY2t1cCBncm91cHMgYXJlIGluaXRpYWxpemVkLgotICovCi12b2lkIGZ3bGNfaW5pdF9zZXJ2ZXJfdHJlZShzdHJ1Y3QgcHJveHkgKnApCi17Ci0Jc3RydWN0IHNlcnZlciAqc3J2OwotCXN0cnVjdCBlYl9yb290IGluaXRfaGVhZCA9IEVCX1JPT1Q7Ci0KLQlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c191cCAgID0gZndsY19zZXRfc2VydmVyX3N0YXR1c191cDsKLQlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c19kb3duID0gZndsY19zZXRfc2VydmVyX3N0YXR1c19kb3duOwotCXAtPmxicHJtLnVwZGF0ZV9zZXJ2ZXJfZXdlaWdodCAgPSBmd2xjX3VwZGF0ZV9zZXJ2ZXJfd2VpZ2h0OwotCXAtPmxicHJtLnNlcnZlcl90YWtlX2Nvbm4gPSBmd2xjX3Nydl9yZXBvc2l0aW9uOwotCXAtPmxicHJtLnNlcnZlcl9kcm9wX2Nvbm4gPSBmd2xjX3Nydl9yZXBvc2l0aW9uOwotCi0JcC0+bGJwcm0ud2RpdiA9IEJFX1dFSUdIVF9TQ0FMRTsKLQlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKLQkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQgPSBzcnYtPnV3ZWlnaHQgKiBCRV9XRUlHSFRfU0NBTEU7Ci0JCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0JfQotCi0JcmVjb3VudF9zZXJ2ZXJzKHApOwotCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKLQotCXAtPmxicHJtLmZ3bGMuYWN0ID0gaW5pdF9oZWFkOwotCXAtPmxicHJtLmZ3bGMuYmNrID0gaW5pdF9oZWFkOwotCi0JLyogcXVldWUgYWN0aXZlIGFuZCBiYWNrdXAgc2VydmVycyBpbiB0d28gZGlzdGluY3QgZ3JvdXBzICovCi0JZm9yIChzcnYgPSBwLT5zcnY7IHNydjsgc3J2ID0gc3J2LT5uZXh0KSB7Ci0JCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQotCQkJY29udGludWU7Ci0JCXNydi0+bGJfdHJlZSA9IChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPyAmcC0+bGJwcm0uZndsYy5iY2sgOiAmcC0+bGJwcm0uZndsYy5hY3Q7Ci0JCWZ3bGNfcXVldWVfc3J2KHNydik7Ci0JfQotfQotCi0vKiBSZXR1cm4gbmV4dCBzZXJ2ZXIgZnJvbSB0aGUgRldMQyB0cmVlIGluIGJhY2tlbmQgPHA+LiBJZiB0aGUgdHJlZSBpcyBlbXB0eSwKLSAqIHJldHVybiBOVUxMLiBTYXR1cmF0ZWQgc2VydmVycyBhcmUgc2tpcHBlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBzZXJ2ZXIgKmZ3bGNfZ2V0X25leHRfc2VydmVyKHN0cnVjdCBwcm94eSAqcCwgc3RydWN0IHNlcnZlciAqc3J2dG9hdm9pZCkKLXsKLQlzdHJ1Y3Qgc2VydmVyICpzcnYsICphdm9pZGVkOwotCXN0cnVjdCBlYjMyX25vZGUgKm5vZGU7Ci0KLQlzcnYgPSBhdm9pZGVkID0gTlVMTDsKLQotCWlmIChwLT5zcnZfYWN0KQotCQlub2RlID0gZWIzMl9maXJzdCgmcC0+bGJwcm0uZndsYy5hY3QpOwotCWVsc2UgaWYgKHAtPmxicHJtLmZiY2spCi0JCXJldHVybiBwLT5sYnBybS5mYmNrOwotCWVsc2UgaWYgKHAtPnNydl9iY2spCi0JCW5vZGUgPSBlYjMyX2ZpcnN0KCZwLT5sYnBybS5md2xjLmJjayk7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLQotCXdoaWxlIChub2RlKSB7Ci0JCS8qIE9LLCB3ZSBoYXZlIGEgc2VydmVyLiBIb3dldmVyLCBpdCBtYXkgYmUgc2F0dXJhdGVkLCBpbiB3aGljaAotCQkgKiBjYXNlIHdlIGRvbid0IHdhbnQgdG8gcmVjb25zaWRlciBpdCBmb3Igbm93LCBzbyB3ZSdsbCBzaW1wbHkKLQkJICogc2tpcCBpdC4gU2FtZSBpZiBpdCdzIHRoZSBzZXJ2ZXIgd2UgdHJ5IHRvIGF2b2lkLCBpbiB3aGljaAotCQkgKiBjYXNlIHdlIHNpbXBseSByZW1lbWJlciBpdCBmb3IgbGF0ZXIgdXNlIGlmIG5lZWRlZC4KLQkJICovCi0JCXN0cnVjdCBzZXJ2ZXIgKnM7Ci0KLQkJcyA9IGViMzJfZW50cnkobm9kZSwgc3RydWN0IHNlcnZlciwgbGJfbm9kZSk7Ci0JCWlmICghcy0+bWF4Y29ubiB8fCAoIXMtPm5icGVuZCAmJiBzLT5zZXJ2ZWQgPCBzcnZfZHluYW1pY19tYXhjb25uKHMpKSkgewotCQkJaWYgKHMgIT0gc3J2dG9hdm9pZCkgewotCQkJCXNydiA9IHM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhdm9pZGVkID0gczsKLQkJfQotCQlub2RlID0gZWIzMl9uZXh0KG5vZGUpOwotCX0KLQotCWlmICghc3J2KQotCQlzcnYgPSBhdm9pZGVkOwotCi0JcmV0dXJuIHNydjsKLX0KLQogLyogCiAgKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGZpbmQgYSBydW5uaW5nIHNlcnZlciBmb3IgdGhlIHByb3h5IDxweD4gZm9sbG93aW5nCiAgKiB0aGUgVVJMIHBhcmFtZXRlciBoYXNoIG1ldGhvZC4gSXQgbG9va3MgZm9yIGEgc3BlY2lmaWMgcGFyYW1ldGVyIGluIHRoZQpAQCAtMTQ5NSw3ICs0ODIsNyBAQAogCiAJCQlpZiAoIXMtPnNydikgewogCQkJCS8qIHBhcmFtZXRlciBub3QgZm91bmQsIGZhbGwgYmFjayB0byByb3VuZCByb2JpbiBvbiB0aGUgbWFwICovCi0JCQkJcy0+c3J2ID0gZ2V0X3NlcnZlcl9ycl93aXRoX2Nvbm5zKHMtPmJlLCBzLT5wcmV2X3Nydik7CisJCQkJcy0+c3J2ID0gbWFwX2dldF9zZXJ2ZXJfcnIocy0+YmUsIHMtPnByZXZfc3J2KTsKIAkJCQlpZiAoIXMtPnNydikgewogCQkJCQllcnIgPSBTUlZfU1RBVFVTX0ZVTEw7CiAJCQkJCWdvdG8gb3V0OwpAQCAtMTUwOCw3ICs0OTUsNyBAQAogCiAJCQlpZiAoIXMtPnNydikgewogCQkJCS8qIHBhcmFtZXRlciBub3QgZm91bmQsIGZhbGwgYmFjayB0byByb3VuZCByb2JpbiBvbiB0aGUgbWFwICovCi0JCQkJcy0+c3J2ID0gZ2V0X3NlcnZlcl9ycl93aXRoX2Nvbm5zKHMtPmJlLCBzLT5wcmV2X3Nydik7CisJCQkJcy0+c3J2ID0gbWFwX2dldF9zZXJ2ZXJfcnIocy0+YmUsIHMtPnByZXZfc3J2KTsKIAkJCQlpZiAoIXMtPnNydikgewogCQkJCQllcnIgPSBTUlZfU1RBVFVTX0ZVTEw7CiAJCQkJCWdvdG8gb3V0OwpAQCAtMTUyMSw3ICs1MDgsNyBAQAogCiAJCQlpZiAoIXMtPnNydikgewogCQkJCS8qIHBhcmFtZXRlciBub3QgZm91bmQsIGZhbGwgYmFjayB0byByb3VuZCByb2JpbiBvbiB0aGUgbWFwICovCi0JCQkJcy0+c3J2ID0gZ2V0X3NlcnZlcl9ycl93aXRoX2Nvbm5zKHMtPmJlLCBzLT5wcmV2X3Nydik7CisJCQkJcy0+c3J2ID0gbWFwX2dldF9zZXJ2ZXJfcnIocy0+YmUsIHMtPnByZXZfc3J2KTsKIAkJCQlpZiAoIXMtPnNydikgewogCQkJCQllcnIgPSBTUlZfU1RBVFVTX0ZVTEw7CiAJCQkJCWdvdG8gb3V0OwpAQCAtMjE2Niw1MyArMTE1Myw2IEBACiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGZpbmQgYSBydW5uaW5nIHNlcnZlciB3aXRoIGZyZWUgY29ubmVjdGlvbiBzbG90cyBmb3IKLSAqIHRoZSBwcm94eSA8cHg+IGZvbGxvd2luZyB0aGUgcm91bmQtcm9iaW4gbWV0aG9kLgotICogSWYgYW55IHNlcnZlciBpcyBmb3VuZCwgaXQgd2lsbCBiZSByZXR1cm5lZCBhbmQgcHgtPmxicHJtLm1hcC5ycl9pZHggd2lsbCBiZSB1cGRhdGVkCi0gKiB0byBwb2ludCB0byB0aGUgbmV4dCBzZXJ2ZXIuIElmIG5vIHZhbGlkIHNlcnZlciBpcyBmb3VuZCwgTlVMTCBpcyByZXR1cm5lZC4KLSAqLwotc3RydWN0IHNlcnZlciAqZ2V0X3NlcnZlcl9ycl93aXRoX2Nvbm5zKHN0cnVjdCBwcm94eSAqcHgsIHN0cnVjdCBzZXJ2ZXIgKnNydnRvYXZvaWQpCi17Ci0JaW50IG5ld2lkeCwgYXZvaWRpZHg7Ci0Jc3RydWN0IHNlcnZlciAqc3J2LCAqYXZvaWRlZDsKLQotCWlmIChweC0+bGJwcm0udG90X3dlaWdodCA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChweC0+bGJwcm0ubWFwLnN0YXRlICYgUFJfTUFQX1JFQ0FMQykKLQkJcmVjYWxjX3NlcnZlcl9tYXAocHgpOwotCi0JaWYgKHB4LT5sYnBybS5tYXAucnJfaWR4IDwgMCB8fCBweC0+bGJwcm0ubWFwLnJyX2lkeCA+PSBweC0+bGJwcm0udG90X3dlaWdodCkKLQkJcHgtPmxicHJtLm1hcC5ycl9pZHggPSAwOwotCW5ld2lkeCA9IHB4LT5sYnBybS5tYXAucnJfaWR4OwotCi0JYXZvaWRlZCA9IE5VTEw7Ci0JYXZvaWRpZHggPSAwOyAvKiBzaHV0IGEgZ2NjIHdhcm5pbmcgKi8KLQlkbyB7Ci0JCXNydiA9IHB4LT5sYnBybS5tYXAuc3J2W25ld2lkeCsrXTsKLQkJaWYgKCFzcnYtPm1heGNvbm4gfHwgc3J2LT5jdXJfc2VzcyA8IHNydl9keW5hbWljX21heGNvbm4oc3J2KSkgewotCQkJLyogbWFrZSBzdXJlIGl0IGlzIG5vdCB0aGUgc2VydmVyIHdlIGFyZSB0cnkgdG8gZXhjbHVkZS4uLiAqLwotCQkJaWYgKHNydiAhPSBzcnZ0b2F2b2lkKSB7Ci0JCQkJcHgtPmxicHJtLm1hcC5ycl9pZHggPSBuZXdpZHg7Ci0JCQkJcmV0dXJuIHNydjsKLQkJCX0KLQotCQkJYXZvaWRlZCA9IHNydjsJLyogLi4uYnV0IHJlbWVtYmVyIHRoYXQgaXMgd2FzIHNlbGVjdGVkIHlldCBhdm9pZGVkICovCi0JCQlhdm9pZGlkeCA9IG5ld2lkeDsKLQkJfQotCQlpZiAobmV3aWR4ID09IHB4LT5sYnBybS50b3Rfd2VpZ2h0KQotCQkJbmV3aWR4ID0gMDsKLQl9IHdoaWxlIChuZXdpZHggIT0gcHgtPmxicHJtLm1hcC5ycl9pZHgpOwotCi0JaWYgKGF2b2lkZWQpCi0JCXB4LT5sYnBybS5tYXAucnJfaWR4ID0gYXZvaWRpZHg7Ci0KLQkvKiByZXR1cm4gTlVMTCBvciBzcnZ0b2F2b2lkIGlmIGZvdW5kICovCi0JcmV0dXJuIGF2b2lkZWQ7Ci19Ci0KLQotLyoKICAqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gZmluZCBhIHJ1bm5pbmcgc2VydmVyIGZvciB0aGUgcHJveHkgPHB4PiBmb2xsb3dpbmcKICAqIHRoZSBzb3VyY2UgaGFzaCBtZXRob2QuIERlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIGFjdGl2ZS9iYWNrdXAgc2VydmVycywKICAqIGl0IHdpbGwgZWl0aGVyIGxvb2sgZm9yIGFjdGl2ZSBzZXJ2ZXJzLCBvciBmb3IgYmFja3VwIHNlcnZlcnMuCmRpZmYgLS1naXQgYS9zcmMvY2ZncGFyc2UuYyBiL3NyYy9jZmdwYXJzZS5jCmluZGV4IGZkMjczYjAuLjc5Mzg2NTQgMTAwNjQ0Ci0tLSBhL3NyYy9jZmdwYXJzZS5jCisrKyBiL3NyYy9jZmdwYXJzZS5jCkBAIC00Miw2ICs0Miw5IEBACiAjaW5jbHVkZSA8cHJvdG8vY2hlY2tzLmg+CiAjaW5jbHVkZSA8cHJvdG8vZHVtcHN0YXRzLmg+CiAjaW5jbHVkZSA8cHJvdG8vaHR0cGVyci5oPgorI2luY2x1ZGUgPHByb3RvL2xiX2Z3bGMuaD4KKyNpbmNsdWRlIDxwcm90by9sYl9md3JyLmg+CisjaW5jbHVkZSA8cHJvdG8vbGJfbWFwLmg+CiAjaW5jbHVkZSA8cHJvdG8vbG9nLmg+CiAjaW5jbHVkZSA8cHJvdG8vcG9ydF9yYW5nZS5oPgogI2luY2x1ZGUgPHByb3RvL3Byb3RvY29scy5oPgpkaWZmIC0tZ2l0IGEvc3JjL2xiX2Z3bGMuYyBiL3NyYy9sYl9md2xjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxYTMxYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYl9md2xjLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBGYXN0IFdlaWdodGVkIExlYXN0IENvbm5lY3Rpb24gbG9hZCBiYWxhbmNpbmcgYWxnb3JpdGhtLgorICoKKyAqIENvcHlyaWdodCAyMDAwLTIwMDkgV2lsbHkgVGFycmVhdSA8d0Axd3QuZXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi9jb21wYXQuaD4KKyNpbmNsdWRlIDxjb21tb24vY29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uL2RlYnVnLmg+CisjaW5jbHVkZSA8Y29tbW9uL2ViMzJ0cmVlLmg+CisKKyNpbmNsdWRlIDx0eXBlcy9nbG9iYWwuaD4KKyNpbmNsdWRlIDx0eXBlcy9zZXJ2ZXIuaD4KKworI2luY2x1ZGUgPHByb3RvL2JhY2tlbmQuaD4KKyNpbmNsdWRlIDxwcm90by9xdWV1ZS5oPgorCisKKy8qIFJlbW92ZSBhIHNlcnZlciBmcm9tIGEgdHJlZS4gSXQgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiBkZXF1ZXVlZC4gVGhpcworICogZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgY2FsbGVkIHdoZW4gYSBzZXJ2ZXIgaXMgZ29pbmcgZG93biBvciBoYXMgaXRzCisgKiB3ZWlnaHQgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmd2xjX3JlbW92ZV9mcm9tX3RyZWUoc3RydWN0IHNlcnZlciAqcykKK3sKKwlzLT5sYl90cmVlID0gTlVMTDsKK30KKworLyogc2ltcGx5IHJlbW92ZXMgYSBzZXJ2ZXIgZnJvbSBhIHRyZWUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmd2xjX2RlcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCit7CisJZWIzMl9kZWxldGUoJnMtPmxiX25vZGUpOworfQorCisvKiBRdWV1ZSBhIHNlcnZlciBpbiBpdHMgYXNzb2NpYXRlZCB0cmVlLCBhc3N1bWluZyB0aGUgd2VpZ2h0IGlzID4wLgorICogU2VydmVycyBhcmUgc29ydGVkIGJ5ICNjb25ucy93ZWlnaHQuIFRvIGVuc3VyZSBtYXhpbXVtIGFjY3VyYWN5LAorICogd2UgdXNlICNjb25ucypTUlZfRVdHSFRfTUFYL2V3ZWlnaHQgYXMgdGhlIHNvcnRpbmcga2V5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZndsY19xdWV1ZV9zcnYoc3RydWN0IHNlcnZlciAqcykKK3sKKwlzLT5sYl9ub2RlLmtleSA9IHMtPnNlcnZlZCAqIFNSVl9FV0dIVF9NQVggLyBzLT5ld2VpZ2h0OworCWViMzJfaW5zZXJ0KHMtPmxiX3RyZWUsICZzLT5sYl9ub2RlKTsKK30KKworLyogUmUtcG9zaXRpb24gdGhlIHNlcnZlciBpbiB0aGUgRldMQyB0cmVlIGFmdGVyIGl0IGhhcyBiZWVuIGFzc2lnbmVkIG9uZQorICogY29ubmVjdGlvbiBvciBhZnRlciBpdCBoYXMgcmVsZWFzZWQgb25lLiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdAorICogdGhlIHNlcnZlciBoYXMgYmVlbiBtb3ZlZCBvdXQgb2YgdGhlIHRyZWUgZHVlIHRvIGZhaWxlZCBoZWFsdGgtY2hlY2tzLgorICovCitzdGF0aWMgdm9pZCBmd2xjX3Nydl9yZXBvc2l0aW9uKHN0cnVjdCBzZXJ2ZXIgKnMpCit7CisJaWYgKCFzLT5sYl90cmVlKQorCQlyZXR1cm47CisJZndsY19kZXF1ZXVlX3NydihzKTsKKwlmd2xjX3F1ZXVlX3NydihzKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBzZXJ2ZXIgdHJlZXMgYWNjb3JkaW5nIHRvIHNlcnZlciA8c3J2PidzIG5ldworICogc3RhdGUuIEl0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBzZXJ2ZXIgPHNydj4ncyBzdGF0dXMgY2hhbmdlcyB0byBkb3duLgorICogSXQgaXMgbm90IGltcG9ydGFudCB3aGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgZG93biBvciBub3QuIEl0IGlzIG5vdAorICogaW1wb3J0YW50IGVpdGhlciB0aGF0IHRoZSBuZXcgc3RhdGUgaXMgY29tcGxldGVseSBkb3duICh0aGUgY2FsbGVyIG1heSBub3QKKyAqIGtub3cgYWxsIHRoZSB2YXJpYWJsZXMgb2YgYSBzZXJ2ZXIncyBzdGF0ZSkuCisgKi8KK3N0YXRpYyB2b2lkIGZ3bGNfc2V0X3NlcnZlcl9zdGF0dXNfZG93bihzdHJ1Y3Qgc2VydmVyICpzcnYpCit7CisJc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKKworCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgorCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCisJCXJldHVybjsKKworCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCisJCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKKworCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KSkKKwkJLyogc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gKi8KKwkJZ290byBvdXRfdXBkYXRlX2JhY2tlbmQ7CisKKwlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApIHsKKwkJcC0+bGJwcm0udG90X3diY2sgLT0gc3J2LT5wcmV2X2V3ZWlnaHQ7CisJCXAtPnNydl9iY2stLTsKKworCQlpZiAoc3J2ID09IHAtPmxicHJtLmZiY2spIHsKKwkJCS8qIHdlIGxvc3QgdGhlIGZpcnN0IGJhY2t1cCBzZXJ2ZXIgaW4gYSBzaW5nbGUtYmFja3VwCisJCQkgKiBjb25maWd1cmF0aW9uLCB3ZSBtdXN0IHNlYXJjaCBhbm90aGVyIG9uZS4KKwkJCSAqLworCQkJc3RydWN0IHNlcnZlciAqc3J2MiA9IHAtPmxicHJtLmZiY2s7CisJCQlkbyB7CisJCQkJc3J2MiA9IHNydjItPm5leHQ7CisJCQl9IHdoaWxlIChzcnYyICYmCisJCQkJICEoKHNydjItPnN0YXRlICYgU1JWX0JBQ0tVUCkgJiYKKwkJCQkgICBzcnZfaXNfdXNhYmxlKHNydjItPnN0YXRlLCBzcnYyLT5ld2VpZ2h0KSkpOworCQkJcC0+bGJwcm0uZmJjayA9IHNydjI7CisJCX0KKwl9IGVsc2UgeworCQlwLT5sYnBybS50b3Rfd2FjdCAtPSBzcnYtPnByZXZfZXdlaWdodDsKKwkJcC0+c3J2X2FjdC0tOworCX0KKworCWZ3bGNfZGVxdWV1ZV9zcnYoc3J2KTsKKwlmd2xjX3JlbW92ZV9mcm9tX3RyZWUoc3J2KTsKKworb3V0X3VwZGF0ZV9iYWNrZW5kOgorCS8qIGNoZWNrL3VwZGF0ZSB0b3RfdXNlZCwgdG90X3dlaWdodCAqLworCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKKyBvdXRfdXBkYXRlX3N0YXRlOgorCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7CisJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgc2VydmVyIHRyZWVzIGFjY29yZGluZyB0byBzZXJ2ZXIgPHNydj4ncyBuZXcKKyAqIHN0YXRlLiBJdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2VydmVyIDxzcnY+J3Mgc3RhdHVzIGNoYW5nZXMgdG8gdXAuCisgKiBJdCBpcyBub3QgaW1wb3J0YW50IHdoZXRoZXIgdGhlIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duIG9yIG5vdC4gSXQgaXMgbm90CisgKiBpbXBvcnRhbnQgZWl0aGVyIHRoYXQgdGhlIG5ldyBzdGF0ZSBpcyBjb21wbGV0ZWx5IFVQICh0aGUgY2FsbGVyIG1heSBub3QKKyAqIGtub3cgYWxsIHRoZSB2YXJpYWJsZXMgb2YgYSBzZXJ2ZXIncyBzdGF0ZSkuIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgY2hhbmdlCisgKiB0aGUgd2VpZ2h0IG9mIGEgc2VydmVyIHdoaWNoIHdhcyBhbHJlYWR5IHVwLgorICovCitzdGF0aWMgdm9pZCBmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX3VwKHN0cnVjdCBzZXJ2ZXIgKnNydikKK3sKKwlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OworCisJaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCisJICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKKwkJcmV0dXJuOworCisJaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCisJCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKKworCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+cHJldl9zdGF0ZSwgc3J2LT5wcmV2X2V3ZWlnaHQpKQorCQkvKiBzZXJ2ZXIgd2FzIGFscmVhZHkgdXAgKi8KKwkJZ290byBvdXRfdXBkYXRlX2JhY2tlbmQ7CisKKwlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApIHsKKwkJc3J2LT5sYl90cmVlID0gJnAtPmxicHJtLmZ3bGMuYmNrOworCQlwLT5sYnBybS50b3Rfd2JjayArPSBzcnYtPmV3ZWlnaHQ7CisJCXAtPnNydl9iY2srKzsKKworCQlpZiAoIShwLT5vcHRpb25zICYgUFJfT19VU0VfQUxMX0JLKSkgeworCQkJaWYgKCFwLT5sYnBybS5mYmNrKSB7CisJCQkJLyogdGhlcmUgd2FzIG5vIGJhY2t1cCBzZXJ2ZXIgYW55bW9yZSAqLworCQkJCXAtPmxicHJtLmZiY2sgPSBzcnY7CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIG1heSBoYXZlIHJlc3RvcmVkIGEgYmFja3VwIHNlcnZlciBwcmlvciB0byBmYmNrLAorCQkJCSAqIGluIHdoaWNoIGNhc2UgaXQgc2hvdWxkIHJlcGxhY2UgaXQuCisJCQkJICovCisJCQkJc3RydWN0IHNlcnZlciAqc3J2MiA9IHNydjsKKwkJCQlkbyB7CisJCQkJCXNydjIgPSBzcnYyLT5uZXh0OworCQkJCX0gd2hpbGUgKHNydjIgJiYgKHNydjIgIT0gcC0+bGJwcm0uZmJjaykpOworCQkJCWlmIChzcnYyKQorCQkJCQlwLT5sYnBybS5mYmNrID0gc3J2OworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc3J2LT5sYl90cmVlID0gJnAtPmxicHJtLmZ3bGMuYWN0OworCQlwLT5sYnBybS50b3Rfd2FjdCArPSBzcnYtPmV3ZWlnaHQ7CisJCXAtPnNydl9hY3QrKzsKKwl9CisKKwkvKiBub3RlIHRoYXQgZXdlaWdodCBjYW5ub3QgYmUgMCBoZXJlICovCisJZndsY19xdWV1ZV9zcnYoc3J2KTsKKworIG91dF91cGRhdGVfYmFja2VuZDoKKwkvKiBjaGVjay91cGRhdGUgdG90X3VzZWQsIHRvdF93ZWlnaHQgKi8KKwl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Cisgb3V0X3VwZGF0ZV9zdGF0ZToKKwlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOworCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFuIHVwZGF0ZSB0byBzZXJ2ZXIgPHNydj4ncyBlZmZlY3RpdmUKKyAqIHdlaWdodC4gSXQgbWF5IGJlIGNhbGxlZCBhZnRlciBhIHN0YXRlIGNoYW5nZSB0b28uCisgKi8KK3N0YXRpYyB2b2lkIGZ3bGNfdXBkYXRlX3NlcnZlcl93ZWlnaHQoc3RydWN0IHNlcnZlciAqc3J2KQoreworCWludCBvbGRfc3RhdGUsIG5ld19zdGF0ZTsKKwlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OworCisJaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCisJICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKKwkJcmV0dXJuOworCisJLyogSWYgY2hhbmdpbmcgdGhlIHNlcnZlcidzIHdlaWdodCBjaGFuZ2VzIGl0cyBzdGF0ZSwgd2Ugc2ltcGx5IGFwcGx5CisJICogdGhlIHByb2NlZHVyZXMgd2UgYWxyZWFkeSBoYXZlIGZvciBzdGF0dXMgY2hhbmdlLiBJZiB0aGUgc3RhdGUKKwkgKiByZW1haW5zIGRvd24sIHRoZSBzZXJ2ZXIgaXMgbm90IGluIGFueSB0cmVlLCBzbyBpdCdzIGFzIGVhc3kgYXMKKwkgKiB1cGRhdGluZyBpdHMgdmFsdWVzLiBJZiB0aGUgc3RhdGUgcmVtYWlucyB1cCB3aXRoIGRpZmZlcmVudCB3ZWlnaHRzLAorCSAqIHRoZXJlIGFyZSBzb21lIGNvbXB1dGF0aW9ucyB0byBwZXJmb3JtIHRvIGZpbmQgYSBuZXcgcGxhY2UgYW5kCisJICogcG9zc2libHkgYSBuZXcgdHJlZSBmb3IgdGhpcyBzZXJ2ZXIuCisJICovCisJIAorCW9sZF9zdGF0ZSA9IHNydl9pc191c2FibGUoc3J2LT5wcmV2X3N0YXRlLCBzcnYtPnByZXZfZXdlaWdodCk7CisJbmV3X3N0YXRlID0gc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpOworCisJaWYgKCFvbGRfc3RhdGUgJiYgIW5ld19zdGF0ZSkgeworCQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOworCQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmICghb2xkX3N0YXRlICYmIG5ld19zdGF0ZSkgeworCQlmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX3VwKHNydik7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAob2xkX3N0YXRlICYmICFuZXdfc3RhdGUpIHsKKwkJZndsY19zZXRfc2VydmVyX3N0YXR1c19kb3duKHNydik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3J2LT5sYl90cmVlKQorCQlmd2xjX2RlcXVldWVfc3J2KHNydik7CisKKwlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApIHsKKwkJcC0+bGJwcm0udG90X3diY2sgKz0gc3J2LT5ld2VpZ2h0IC0gc3J2LT5wcmV2X2V3ZWlnaHQ7CisJCXNydi0+bGJfdHJlZSA9ICZwLT5sYnBybS5md2xjLmJjazsKKwl9IGVsc2UgeworCQlwLT5sYnBybS50b3Rfd2FjdCArPSBzcnYtPmV3ZWlnaHQgLSBzcnYtPnByZXZfZXdlaWdodDsKKwkJc3J2LT5sYl90cmVlID0gJnAtPmxicHJtLmZ3bGMuYWN0OworCX0KKworCWZ3bGNfcXVldWVfc3J2KHNydik7CisKKwl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7CisJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKKwlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgdGhlIHRyZWVzIGluIGNhc2Ugb2YgZmFzdAorICogd2VpZ2h0ZWQgbGVhc3QtY29ubnMuIEl0IGFsc28gc2V0cyBwLT5sYnBybS53ZGl2IHRvIHRoZSBld2VpZ2h0IHRvCisgKiB1d2VpZ2h0IHJhdGlvLiBCb3RoIGFjdGl2ZSBhbmQgYmFja3VwIGdyb3VwcyBhcmUgaW5pdGlhbGl6ZWQuCisgKi8KK3ZvaWQgZndsY19pbml0X3NlcnZlcl90cmVlKHN0cnVjdCBwcm94eSAqcCkKK3sKKwlzdHJ1Y3Qgc2VydmVyICpzcnY7CisJc3RydWN0IGViX3Jvb3QgaW5pdF9oZWFkID0gRUJfUk9PVDsKKworCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX3VwICAgPSBmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX3VwOworCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX2Rvd24gPSBmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd247CisJcC0+bGJwcm0udXBkYXRlX3NlcnZlcl9ld2VpZ2h0ICA9IGZ3bGNfdXBkYXRlX3NlcnZlcl93ZWlnaHQ7CisJcC0+bGJwcm0uc2VydmVyX3Rha2VfY29ubiA9IGZ3bGNfc3J2X3JlcG9zaXRpb247CisJcC0+bGJwcm0uc2VydmVyX2Ryb3BfY29ubiA9IGZ3bGNfc3J2X3JlcG9zaXRpb247CisKKwlwLT5sYnBybS53ZGl2ID0gQkVfV0VJR0hUX1NDQUxFOworCWZvciAoc3J2ID0gcC0+c3J2OyBzcnY7IHNydiA9IHNydi0+bmV4dCkgeworCQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodCA9IHNydi0+dXdlaWdodCAqIEJFX1dFSUdIVF9TQ0FMRTsKKwkJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKKwl9CisKKwlyZWNvdW50X3NlcnZlcnMocCk7CisJdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOworCisJcC0+bGJwcm0uZndsYy5hY3QgPSBpbml0X2hlYWQ7CisJcC0+bGJwcm0uZndsYy5iY2sgPSBpbml0X2hlYWQ7CisKKwkvKiBxdWV1ZSBhY3RpdmUgYW5kIGJhY2t1cCBzZXJ2ZXJzIGluIHR3byBkaXN0aW5jdCBncm91cHMgKi8KKwlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKKwkJaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCisJCQljb250aW51ZTsKKwkJc3J2LT5sYl90cmVlID0gKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/ICZwLT5sYnBybS5md2xjLmJjayA6ICZwLT5sYnBybS5md2xjLmFjdDsKKwkJZndsY19xdWV1ZV9zcnYoc3J2KTsKKwl9Cit9CisKKy8qIFJldHVybiBuZXh0IHNlcnZlciBmcm9tIHRoZSBGV0xDIHRyZWUgaW4gYmFja2VuZCA8cD4uIElmIHRoZSB0cmVlIGlzIGVtcHR5LAorICogcmV0dXJuIE5VTEwuIFNhdHVyYXRlZCBzZXJ2ZXJzIGFyZSBza2lwcGVkLgorICovCitzdHJ1Y3Qgc2VydmVyICpmd2xjX2dldF9uZXh0X3NlcnZlcihzdHJ1Y3QgcHJveHkgKnAsIHN0cnVjdCBzZXJ2ZXIgKnNydnRvYXZvaWQpCit7CisJc3RydWN0IHNlcnZlciAqc3J2LCAqYXZvaWRlZDsKKwlzdHJ1Y3QgZWIzMl9ub2RlICpub2RlOworCisJc3J2ID0gYXZvaWRlZCA9IE5VTEw7CisKKwlpZiAocC0+c3J2X2FjdCkKKwkJbm9kZSA9IGViMzJfZmlyc3QoJnAtPmxicHJtLmZ3bGMuYWN0KTsKKwllbHNlIGlmIChwLT5sYnBybS5mYmNrKQorCQlyZXR1cm4gcC0+bGJwcm0uZmJjazsKKwllbHNlIGlmIChwLT5zcnZfYmNrKQorCQlub2RlID0gZWIzMl9maXJzdCgmcC0+bGJwcm0uZndsYy5iY2spOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAobm9kZSkgeworCQkvKiBPSywgd2UgaGF2ZSBhIHNlcnZlci4gSG93ZXZlciwgaXQgbWF5IGJlIHNhdHVyYXRlZCwgaW4gd2hpY2gKKwkJICogY2FzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29uc2lkZXIgaXQgZm9yIG5vdywgc28gd2UnbGwgc2ltcGx5CisJCSAqIHNraXAgaXQuIFNhbWUgaWYgaXQncyB0aGUgc2VydmVyIHdlIHRyeSB0byBhdm9pZCwgaW4gd2hpY2gKKwkJICogY2FzZSB3ZSBzaW1wbHkgcmVtZW1iZXIgaXQgZm9yIGxhdGVyIHVzZSBpZiBuZWVkZWQuCisJCSAqLworCQlzdHJ1Y3Qgc2VydmVyICpzOworCisJCXMgPSBlYjMyX2VudHJ5KG5vZGUsIHN0cnVjdCBzZXJ2ZXIsIGxiX25vZGUpOworCQlpZiAoIXMtPm1heGNvbm4gfHwgKCFzLT5uYnBlbmQgJiYgcy0+c2VydmVkIDwgc3J2X2R5bmFtaWNfbWF4Y29ubihzKSkpIHsKKwkJCWlmIChzICE9IHNydnRvYXZvaWQpIHsKKwkJCQlzcnYgPSBzOworCQkJCWJyZWFrOworCQkJfQorCQkJYXZvaWRlZCA9IHM7CisJCX0KKwkJbm9kZSA9IGViMzJfbmV4dChub2RlKTsKKwl9CisKKwlpZiAoIXNydikKKwkJc3J2ID0gYXZvaWRlZDsKKworCXJldHVybiBzcnY7Cit9CisKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3NyYy9sYl9md3JyLmMgYi9zcmMvbGJfZndyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDE3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGJfZndyci5jCkBAIC0wLDAgKzEsNTc2IEBACisvKgorICogRmFzdCBXZWlnaHRlZCBSb3VuZCBSb2JpbiBsb2FkIGJhbGFuY2luZyBhbGdvcml0aG0uCisgKgorICogQ29weXJpZ2h0IDIwMDAtMjAwOSBXaWxseSBUYXJyZWF1IDx3QDF3dC5ldT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uL2NvbXBhdC5oPgorI2luY2x1ZGUgPGNvbW1vbi9jb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24vZGVidWcuaD4KKyNpbmNsdWRlIDxjb21tb24vZWIzMnRyZWUuaD4KKworI2luY2x1ZGUgPHR5cGVzL2dsb2JhbC5oPgorI2luY2x1ZGUgPHR5cGVzL3NlcnZlci5oPgorCisjaW5jbHVkZSA8cHJvdG8vYmFja2VuZC5oPgorI2luY2x1ZGUgPHByb3RvL3F1ZXVlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3JlbW92ZV9mcm9tX3RyZWUoc3RydWN0IHNlcnZlciAqcyk7CitzdGF0aWMgaW5saW5lIHZvaWQgZndycl9xdWV1ZV9ieV93ZWlnaHQoc3RydWN0IGViX3Jvb3QgKnJvb3QsIHN0cnVjdCBzZXJ2ZXIgKnMpOworc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfZGVxdWV1ZV9zcnYoc3RydWN0IHNlcnZlciAqcyk7CitzdGF0aWMgdm9pZCBmd3JyX2dldF9zcnYoc3RydWN0IHNlcnZlciAqcyk7CitzdGF0aWMgdm9pZCBmd3JyX3F1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKTsKKworCisvKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHNlcnZlciB0cmVlcyBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3CisgKiBzdGF0ZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHNlcnZlciA8c3J2PidzIHN0YXR1cyBjaGFuZ2VzIHRvIGRvd24uCisgKiBJdCBpcyBub3QgaW1wb3J0YW50IHdoZXRoZXIgdGhlIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duIG9yIG5vdC4gSXQgaXMgbm90CisgKiBpbXBvcnRhbnQgZWl0aGVyIHRoYXQgdGhlIG5ldyBzdGF0ZSBpcyBjb21wbGV0ZWx5IGRvd24gKHRoZSBjYWxsZXIgbWF5IG5vdAorICoga25vdyBhbGwgdGhlIHZhcmlhYmxlcyBvZiBhIHNlcnZlcidzIHN0YXRlKS4KKyAqLworc3RhdGljIHZvaWQgZndycl9zZXRfc2VydmVyX3N0YXR1c19kb3duKHN0cnVjdCBzZXJ2ZXIgKnNydikKK3sKKwlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OworCXN0cnVjdCBmd3JyX2dyb3VwICpncnA7CisKKwlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKKwkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQorCQlyZXR1cm47CisKKwlpZiAoc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQorCQlnb3RvIG91dF91cGRhdGVfc3RhdGU7CisKKwlpZiAoIXNydl9pc191c2FibGUoc3J2LT5wcmV2X3N0YXRlLCBzcnYtPnByZXZfZXdlaWdodCkpCisJCS8qIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duICovCisJCWdvdG8gb3V0X3VwZGF0ZV9iYWNrZW5kOworCisJZ3JwID0gKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/ICZwLT5sYnBybS5md3JyLmJjayA6ICZwLT5sYnBybS5md3JyLmFjdDsKKwlncnAtPm5leHRfd2VpZ2h0IC09IHNydi0+cHJldl9ld2VpZ2h0OworCisJaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7CisJCXAtPmxicHJtLnRvdF93YmNrID0gcC0+bGJwcm0uZndyci5iY2submV4dF93ZWlnaHQ7CisJCXAtPnNydl9iY2stLTsKKworCQlpZiAoc3J2ID09IHAtPmxicHJtLmZiY2spIHsKKwkJCS8qIHdlIGxvc3QgdGhlIGZpcnN0IGJhY2t1cCBzZXJ2ZXIgaW4gYSBzaW5nbGUtYmFja3VwCisJCQkgKiBjb25maWd1cmF0aW9uLCB3ZSBtdXN0IHNlYXJjaCBhbm90aGVyIG9uZS4KKwkJCSAqLworCQkJc3RydWN0IHNlcnZlciAqc3J2MiA9IHAtPmxicHJtLmZiY2s7CisJCQlkbyB7CisJCQkJc3J2MiA9IHNydjItPm5leHQ7CisJCQl9IHdoaWxlIChzcnYyICYmCisJCQkJICEoKHNydjItPnN0YXRlICYgU1JWX0JBQ0tVUCkgJiYKKwkJCQkgICBzcnZfaXNfdXNhYmxlKHNydjItPnN0YXRlLCBzcnYyLT5ld2VpZ2h0KSkpOworCQkJcC0+bGJwcm0uZmJjayA9IHNydjI7CisJCX0KKwl9IGVsc2UgeworCQlwLT5sYnBybS50b3Rfd2FjdCA9IHAtPmxicHJtLmZ3cnIuYWN0Lm5leHRfd2VpZ2h0OworCQlwLT5zcnZfYWN0LS07CisJfQorCisJZndycl9kZXF1ZXVlX3NydihzcnYpOworCWZ3cnJfcmVtb3ZlX2Zyb21fdHJlZShzcnYpOworCitvdXRfdXBkYXRlX2JhY2tlbmQ6CisJLyogY2hlY2svdXBkYXRlIHRvdF91c2VkLCB0b3Rfd2VpZ2h0ICovCisJdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOworIG91dF91cGRhdGVfc3RhdGU6CisJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKKwlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKK30KKworLyogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBzZXJ2ZXIgdHJlZXMgYWNjb3JkaW5nIHRvIHNlcnZlciA8c3J2PidzIG5ldworICogc3RhdGUuIEl0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBzZXJ2ZXIgPHNydj4ncyBzdGF0dXMgY2hhbmdlcyB0byB1cC4KKyAqIEl0IGlzIG5vdCBpbXBvcnRhbnQgd2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gb3Igbm90LiBJdCBpcyBub3QKKyAqIGltcG9ydGFudCBlaXRoZXIgdGhhdCB0aGUgbmV3IHN0YXRlIGlzIGNvbXBsZXRlbHkgVVAgKHRoZSBjYWxsZXIgbWF5IG5vdAorICoga25vdyBhbGwgdGhlIHZhcmlhYmxlcyBvZiBhIHNlcnZlcidzIHN0YXRlKS4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjaGFuZ2UKKyAqIHRoZSB3ZWlnaHQgb2YgYSBzZXJ2ZXIgd2hpY2ggd2FzIGFscmVhZHkgdXAuCisgKi8KK3N0YXRpYyB2b2lkIGZ3cnJfc2V0X3NlcnZlcl9zdGF0dXNfdXAoc3RydWN0IHNlcnZlciAqc3J2KQoreworCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7CisJc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKKworCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgorCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCisJCXJldHVybjsKKworCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQorCQlnb3RvIG91dF91cGRhdGVfc3RhdGU7CisKKwlpZiAoc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KSkKKwkJLyogc2VydmVyIHdhcyBhbHJlYWR5IHVwICovCisJCWdvdG8gb3V0X3VwZGF0ZV9iYWNrZW5kOworCisJZ3JwID0gKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/ICZwLT5sYnBybS5md3JyLmJjayA6ICZwLT5sYnBybS5md3JyLmFjdDsKKwlncnAtPm5leHRfd2VpZ2h0ICs9IHNydi0+ZXdlaWdodDsKKworCWlmIChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgeworCQlwLT5sYnBybS50b3Rfd2JjayA9IHAtPmxicHJtLmZ3cnIuYmNrLm5leHRfd2VpZ2h0OworCQlwLT5zcnZfYmNrKys7CisKKwkJaWYgKCEocC0+b3B0aW9ucyAmIFBSX09fVVNFX0FMTF9CSykpIHsKKwkJCWlmICghcC0+bGJwcm0uZmJjaykgeworCQkJCS8qIHRoZXJlIHdhcyBubyBiYWNrdXAgc2VydmVyIGFueW1vcmUgKi8KKwkJCQlwLT5sYnBybS5mYmNrID0gc3J2OworCQkJfSBlbHNlIHsKKwkJCQkvKiB3ZSBtYXkgaGF2ZSByZXN0b3JlZCBhIGJhY2t1cCBzZXJ2ZXIgcHJpb3IgdG8gZmJjaywKKwkJCQkgKiBpbiB3aGljaCBjYXNlIGl0IHNob3VsZCByZXBsYWNlIGl0LgorCQkJCSAqLworCQkJCXN0cnVjdCBzZXJ2ZXIgKnNydjIgPSBzcnY7CisJCQkJZG8geworCQkJCQlzcnYyID0gc3J2Mi0+bmV4dDsKKwkJCQl9IHdoaWxlIChzcnYyICYmIChzcnYyICE9IHAtPmxicHJtLmZiY2spKTsKKwkJCQlpZiAoc3J2MikKKwkJCQkJcC0+bGJwcm0uZmJjayA9IHNydjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXAtPmxicHJtLnRvdF93YWN0ID0gcC0+bGJwcm0uZndyci5hY3QubmV4dF93ZWlnaHQ7CisJCXAtPnNydl9hY3QrKzsKKwl9CisKKwkvKiBub3RlIHRoYXQgZXdlaWdodCBjYW5ub3QgYmUgMCBoZXJlICovCisJZndycl9nZXRfc3J2KHNydik7CisJc3J2LT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIChncnAtPm5leHRfd2VpZ2h0ICsgZ3JwLT5jdXJyX3dlaWdodCAtIGdycC0+Y3Vycl9wb3MpIC8gc3J2LT5ld2VpZ2h0OworCWZ3cnJfcXVldWVfc3J2KHNydik7CisKK291dF91cGRhdGVfYmFja2VuZDoKKwkvKiBjaGVjay91cGRhdGUgdG90X3VzZWQsIHRvdF93ZWlnaHQgKi8KKwl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Cisgb3V0X3VwZGF0ZV9zdGF0ZToKKwlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOworCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OworfQorCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFuIHVwZGF0ZSB0byBzZXJ2ZXIgPHNydj4ncyBlZmZlY3RpdmUKKyAqIHdlaWdodC4gSXQgbWF5IGJlIGNhbGxlZCBhZnRlciBhIHN0YXRlIGNoYW5nZSB0b28uCisgKi8KK3N0YXRpYyB2b2lkIGZ3cnJfdXBkYXRlX3NlcnZlcl93ZWlnaHQoc3RydWN0IHNlcnZlciAqc3J2KQoreworCWludCBvbGRfc3RhdGUsIG5ld19zdGF0ZTsKKwlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OworCXN0cnVjdCBmd3JyX2dyb3VwICpncnA7CisKKwlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKKwkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQorCQlyZXR1cm47CisKKwkvKiBJZiBjaGFuZ2luZyB0aGUgc2VydmVyJ3Mgd2VpZ2h0IGNoYW5nZXMgaXRzIHN0YXRlLCB3ZSBzaW1wbHkgYXBwbHkKKwkgKiB0aGUgcHJvY2VkdXJlcyB3ZSBhbHJlYWR5IGhhdmUgZm9yIHN0YXR1cyBjaGFuZ2UuIElmIHRoZSBzdGF0ZQorCSAqIHJlbWFpbnMgZG93biwgdGhlIHNlcnZlciBpcyBub3QgaW4gYW55IHRyZWUsIHNvIGl0J3MgYXMgZWFzeSBhcworCSAqIHVwZGF0aW5nIGl0cyB2YWx1ZXMuIElmIHRoZSBzdGF0ZSByZW1haW5zIHVwIHdpdGggZGlmZmVyZW50IHdlaWdodHMsCisJICogdGhlcmUgYXJlIHNvbWUgY29tcHV0YXRpb25zIHRvIHBlcmZvcm0gdG8gZmluZCBhIG5ldyBwbGFjZSBhbmQKKwkgKiBwb3NzaWJseSBhIG5ldyB0cmVlIGZvciB0aGlzIHNlcnZlci4KKwkgKi8KKwkgCisJb2xkX3N0YXRlID0gc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KTsKKwluZXdfc3RhdGUgPSBzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCk7CisKKwlpZiAoIW9sZF9zdGF0ZSAmJiAhbmV3X3N0YXRlKSB7CisJCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7CisJCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OworCQlyZXR1cm47CisJfQorCWVsc2UgaWYgKCFvbGRfc3RhdGUgJiYgbmV3X3N0YXRlKSB7CisJCWZ3cnJfc2V0X3NlcnZlcl9zdGF0dXNfdXAoc3J2KTsKKwkJcmV0dXJuOworCX0KKwllbHNlIGlmIChvbGRfc3RhdGUgJiYgIW5ld19zdGF0ZSkgeworCQlmd3JyX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd24oc3J2KTsKKwkJcmV0dXJuOworCX0KKworCWdycCA9IChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPyAmcC0+bGJwcm0uZndyci5iY2sgOiAmcC0+bGJwcm0uZndyci5hY3Q7CisJZ3JwLT5uZXh0X3dlaWdodCA9IGdycC0+bmV4dF93ZWlnaHQgLSBzcnYtPnByZXZfZXdlaWdodCArIHNydi0+ZXdlaWdodDsKKworCXAtPmxicHJtLnRvdF93YWN0ID0gcC0+bGJwcm0uZndyci5hY3QubmV4dF93ZWlnaHQ7CisJcC0+bGJwcm0udG90X3diY2sgPSBwLT5sYnBybS5md3JyLmJjay5uZXh0X3dlaWdodDsKKworCWlmIChzcnYtPmxiX3RyZWUgPT0gZ3JwLT5pbml0KSB7CisJCWZ3cnJfZGVxdWV1ZV9zcnYoc3J2KTsKKwkJZndycl9xdWV1ZV9ieV93ZWlnaHQoZ3JwLT5pbml0LCBzcnYpOworCX0KKwllbHNlIGlmICghc3J2LT5sYl90cmVlKSB7CisJCS8qIEZJWE1FOiBzZXJ2ZXIgd2FzIGRvd24uIFRoaXMgaXMgbm90IHBvc3NpYmxlIHJpZ2h0IG5vdyBidXQKKwkJICogbWF5IGJlIG5lZWRlZCBzb29uIGZvciBzbG93c3RhcnQgb3IgZ3JhY2VmdWwgc2h1dGRvd24uCisJCSAqLworCQlmd3JyX2RlcXVldWVfc3J2KHNydik7CisJCWZ3cnJfZ2V0X3NydihzcnYpOworCQlzcnYtPm5wb3MgPSBncnAtPmN1cnJfcG9zICsgKGdycC0+bmV4dF93ZWlnaHQgKyBncnAtPmN1cnJfd2VpZ2h0IC0gZ3JwLT5jdXJyX3BvcykgLyBzcnYtPmV3ZWlnaHQ7CisJCWZ3cnJfcXVldWVfc3J2KHNydik7CisJfSBlbHNlIHsKKwkJLyogVGhlIHNlcnZlciBpcyBlaXRoZXIgYWN0aXZlIG9yIGluIHRoZSBuZXh0IHF1ZXVlLiBJZiBpdCdzCisJCSAqIHN0aWxsIGluIHRoZSBhY3RpdmUgcXVldWUgYW5kIGl0IGhhcyBub3QgY29uc3VtZWQgYWxsIG9mIGl0cworCQkgKiBwbGFjZXMsIGxldCdzIGFkanVzdCBpdHMgbmV4dCBwb3NpdGlvbi4KKwkJICovCisJCWZ3cnJfZ2V0X3NydihzcnYpOworCisJCWlmIChzcnYtPmV3ZWlnaHQgPiAwKSB7CisJCQlpbnQgcHJldl9uZXh0ID0gc3J2LT5ucG9zOworCQkJaW50IHN0ZXAgPSBncnAtPm5leHRfd2VpZ2h0IC8gc3J2LT5ld2VpZ2h0OworCisJCQlzcnYtPm5wb3MgPSBzcnYtPmxwb3MgKyBzdGVwOworCQkJc3J2LT5yd2VpZ2h0ID0gMDsKKworCQkJaWYgKHNydi0+bnBvcyA+IHByZXZfbmV4dCkKKwkJCQlzcnYtPm5wb3MgPSBwcmV2X25leHQ7CisJCQlpZiAoc3J2LT5ucG9zIDwgZ3JwLT5jdXJyX3BvcyArIDIpCisJCQkJc3J2LT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIHN0ZXA7CisJCX0gZWxzZSB7CisJCQkvKiBwdXNoIGl0IGludG8gdGhlIG5leHQgdHJlZSAqLworCQkJc3J2LT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIGdycC0+Y3Vycl93ZWlnaHQ7CisJCX0KKworCQlmd3JyX2RlcXVldWVfc3J2KHNydik7CisJCWZ3cnJfcXVldWVfc3J2KHNydik7CisJfQorCisJdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOworCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7CisJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Cit9CisKKy8qIFJlbW92ZSBhIHNlcnZlciBmcm9tIGEgdHJlZS4gSXQgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiBkZXF1ZXVlZC4gVGhpcworICogZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgY2FsbGVkIHdoZW4gYSBzZXJ2ZXIgaXMgZ29pbmcgZG93biBvciBoYXMgaXRzCisgKiB3ZWlnaHQgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3JlbW92ZV9mcm9tX3RyZWUoc3RydWN0IHNlcnZlciAqcykKK3sKKwlzLT5sYl90cmVlID0gTlVMTDsKK30KKworLyogUXVldWUgYSBzZXJ2ZXIgaW4gdGhlIHdlaWdodCB0cmVlIDxyb290PiwgYXNzdW1pbmcgdGhlIHdlaWdodCBpcyA+MC4KKyAqIFdlIHdhbnQgdG8gc29ydCB0aGVtIGJ5IGludmVydGVkIHdlaWdodHMsIGJlY2F1c2Ugd2UgbmVlZCB0byBwbGFjZQorICogaGVhdnkgc2VydmVycyBmaXJzdCBpbiBvcmRlciB0byBnZXQgYSBzbW9vdGggZGlzdHJpYnV0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZndycl9xdWV1ZV9ieV93ZWlnaHQoc3RydWN0IGViX3Jvb3QgKnJvb3QsIHN0cnVjdCBzZXJ2ZXIgKnMpCit7CisJcy0+bGJfbm9kZS5rZXkgPSBTUlZfRVdHSFRfTUFYIC0gcy0+ZXdlaWdodDsKKwllYjMyX2luc2VydChyb290LCAmcy0+bGJfbm9kZSk7CisJcy0+bGJfdHJlZSA9IHJvb3Q7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSB3ZWlnaHQgdHJlZXMgaW4gY2FzZSBvZiBmYXN0CisgKiB3ZWlnaHRlZCByb3VuZC1yb2Jpbi4gSXQgYWxzbyBzZXRzIHAtPmxicHJtLndkaXYgdG8gdGhlIGV3ZWlnaHQgdG8gdXdlaWdodAorICogcmF0aW8uIEJvdGggYWN0aXZlIGFuZCBiYWNrdXAgZ3JvdXBzIGFyZSBpbml0aWFsaXplZC4KKyAqLwordm9pZCBmd3JyX2luaXRfc2VydmVyX2dyb3VwcyhzdHJ1Y3QgcHJveHkgKnApCit7CisJc3RydWN0IHNlcnZlciAqc3J2OworCXN0cnVjdCBlYl9yb290IGluaXRfaGVhZCA9IEVCX1JPT1Q7CisKKwlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c191cCAgID0gZndycl9zZXRfc2VydmVyX3N0YXR1c191cDsKKwlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c19kb3duID0gZndycl9zZXRfc2VydmVyX3N0YXR1c19kb3duOworCXAtPmxicHJtLnVwZGF0ZV9zZXJ2ZXJfZXdlaWdodCAgPSBmd3JyX3VwZGF0ZV9zZXJ2ZXJfd2VpZ2h0OworCisJcC0+bGJwcm0ud2RpdiA9IEJFX1dFSUdIVF9TQ0FMRTsKKwlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKKwkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQgPSBzcnYtPnV3ZWlnaHQgKiBCRV9XRUlHSFRfU0NBTEU7CisJCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7CisJfQorCisJcmVjb3VudF9zZXJ2ZXJzKHApOworCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKKworCS8qIHByZXBhcmUgdGhlIGFjdGl2ZSBzZXJ2ZXJzIGdyb3VwICovCisJcC0+bGJwcm0uZndyci5hY3QuY3Vycl9wb3MgPSBwLT5sYnBybS5md3JyLmFjdC5jdXJyX3dlaWdodCA9CisJCXAtPmxicHJtLmZ3cnIuYWN0Lm5leHRfd2VpZ2h0ID0gcC0+bGJwcm0udG90X3dhY3Q7CisJcC0+bGJwcm0uZndyci5hY3QuY3VyciA9IHAtPmxicHJtLmZ3cnIuYWN0LnQwID0KKwkJcC0+bGJwcm0uZndyci5hY3QudDEgPSBpbml0X2hlYWQ7CisJcC0+bGJwcm0uZndyci5hY3QuaW5pdCA9ICZwLT5sYnBybS5md3JyLmFjdC50MDsKKwlwLT5sYnBybS5md3JyLmFjdC5uZXh0ID0gJnAtPmxicHJtLmZ3cnIuYWN0LnQxOworCisJLyogcHJlcGFyZSB0aGUgYmFja3VwIHNlcnZlcnMgZ3JvdXAgKi8KKwlwLT5sYnBybS5md3JyLmJjay5jdXJyX3BvcyA9IHAtPmxicHJtLmZ3cnIuYmNrLmN1cnJfd2VpZ2h0ID0KKwkJcC0+bGJwcm0uZndyci5iY2submV4dF93ZWlnaHQgPSBwLT5sYnBybS50b3Rfd2JjazsKKwlwLT5sYnBybS5md3JyLmJjay5jdXJyID0gcC0+bGJwcm0uZndyci5iY2sudDAgPQorCQlwLT5sYnBybS5md3JyLmJjay50MSA9IGluaXRfaGVhZDsKKwlwLT5sYnBybS5md3JyLmJjay5pbml0ID0gJnAtPmxicHJtLmZ3cnIuYmNrLnQwOworCXAtPmxicHJtLmZ3cnIuYmNrLm5leHQgPSAmcC0+bGJwcm0uZndyci5iY2sudDE7CisKKwkvKiBxdWV1ZSBhY3RpdmUgYW5kIGJhY2t1cCBzZXJ2ZXJzIGluIHR3byBkaXN0aW5jdCBncm91cHMgKi8KKwlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKKwkJaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCisJCQljb250aW51ZTsKKwkJZndycl9xdWV1ZV9ieV93ZWlnaHQoKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/CisJCQkJcC0+bGJwcm0uZndyci5iY2suaW5pdCA6CisJCQkJcC0+bGJwcm0uZndyci5hY3QuaW5pdCwKKwkJCQlzcnYpOworCX0KK30KKworLyogc2ltcGx5IHJlbW92ZXMgYSBzZXJ2ZXIgZnJvbSBhIHdlaWdodCB0cmVlICovCitzdGF0aWMgaW5saW5lIHZvaWQgZndycl9kZXF1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKQoreworCWViMzJfZGVsZXRlKCZzLT5sYl9ub2RlKTsKK30KKworLyogcXVldWVzIGEgc2VydmVyIGludG8gdGhlIGFwcHJvcHJpYXRlIGdyb3VwIGFuZCB0cmVlIGRlcGVuZGluZyBvbiBpdHMKKyAqIGJhY2t1cCBzdGF0dXMsIGFuZCAtPm5wb3MuIElmIHRoZSBzZXJ2ZXIgaXMgZGlzYWJsZWQsIHNpbXBseSBhc3NpZ24KKyAqIGl0IHRvIHRoZSBOVUxMIHRyZWUuCisgKi8KK3N0YXRpYyB2b2lkIGZ3cnJfcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCit7CisJc3RydWN0IHByb3h5ICpwID0gcy0+cHJveHk7CisJc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKKworCWdycCA9IChzLT5zdGF0ZSAmIFNSVl9CQUNLVVApID8gJnAtPmxicHJtLmZ3cnIuYmNrIDogJnAtPmxicHJtLmZ3cnIuYWN0OworCQorCS8qIERlbGF5IGV2ZXJ5dGhpbmcgd2hpY2ggZG9lcyBub3QgZml0IGludG8gdGhlIHdpbmRvdyBhbmQgZXZlcnl0aGluZworCSAqIHdoaWNoIGRvZXMgbm90IGZpdCBpbnRvIHRoZSB0aGVvcmljYWwgbmV3IHdpbmRvdy4KKwkgKi8KKwlpZiAoIXNydl9pc191c2FibGUocy0+c3RhdGUsIHMtPmV3ZWlnaHQpKSB7CisJCWZ3cnJfcmVtb3ZlX2Zyb21fdHJlZShzKTsKKwl9CisJZWxzZSBpZiAocy0+ZXdlaWdodCA8PSAwIHx8CisJCSBzLT5ucG9zID49IDIgKiBncnAtPmN1cnJfd2VpZ2h0IHx8CisJCSBzLT5ucG9zID49IGdycC0+Y3Vycl93ZWlnaHQgKyBncnAtPm5leHRfd2VpZ2h0KSB7CisJCS8qIHB1dCBpbnRvIG5leHQgdHJlZSwgYW5kIHJlYWRqdXN0IG5wb3MgaW4gY2FzZSB3ZSBjb3VsZAorCQkgKiBmaW5hbGx5IHRha2UgdGhpcyBiYWNrIHRvIGN1cnJlbnQuICovCisJCXMtPm5wb3MgLT0gZ3JwLT5jdXJyX3dlaWdodDsKKwkJZndycl9xdWV1ZV9ieV93ZWlnaHQoZ3JwLT5uZXh0LCBzKTsKKwl9CisJZWxzZSB7CisJCS8qIFRoZSBzb3J0aW5nIGtleSBpcyBzdG9yZWQgaW4gdW5pdHMgb2Ygcy0+bnBvcyAqIHVzZXJfd2VpZ2h0CisJCSAqIGluIG9yZGVyIHRvIGF2b2lkIG92ZXJmbG93cy4gQXMgc3RhdGVkIGluIGJhY2tlbmQuaCwgdGhlCisJCSAqIGxvd2VyIHRoZSBzY2FsZSwgdGhlIHJvdWdoZXIgdGhlIHdlaWdodHMgbW9kdWxhdGlvbiwgYW5kIHRoZQorCQkgKiBoaWdoZXIgdGhlIHNjYWxlLCB0aGUgbG93ZXIgdGhlIG51bWJlciBvZiBzZXJ2ZXJzIHdpdGhvdXQKKwkJICogb3ZlcmZsb3cuIFdpdGggdGhpcyBmb3JtdWxhLCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBwb3NpdGl2ZSwKKwkJICogc28gd2UgY2FuIHVzZSBlYjPpX2luc2VydCgpLgorCQkgKi8KKwkJcy0+bGJfbm9kZS5rZXkgPSBTUlZfVVdHSFRfUkFOR0UgKiBzLT5ucG9zICsKKwkJCSh1bnNpZ25lZCkoU1JWX0VXR0hUX01BWCArIHMtPnJ3ZWlnaHQgLSBzLT5ld2VpZ2h0KSAvIEJFX1dFSUdIVF9TQ0FMRTsKKworCQllYjMyX2luc2VydCgmZ3JwLT5jdXJyLCAmcy0+bGJfbm9kZSk7CisJCXMtPmxiX3RyZWUgPSAmZ3JwLT5jdXJyOworCX0KK30KKworLyogcHJlcGFyZXMgYSBzZXJ2ZXIgd2hlbiBleHRyYWN0aW5nIGl0IGZyb20gdGhlICJpbml0IiB0cmVlICovCitzdGF0aWMgaW5saW5lIHZvaWQgZndycl9nZXRfc3J2X2luaXQoc3RydWN0IHNlcnZlciAqcykKK3sKKwlzLT5ucG9zID0gcy0+cndlaWdodCA9IDA7Cit9CisKKy8qIHByZXBhcmVzIGEgc2VydmVyIHdoZW4gZXh0cmFjdGluZyBpdCBmcm9tIHRoZSAibmV4dCIgdHJlZSAqLworc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfZ2V0X3Nydl9uZXh0KHN0cnVjdCBzZXJ2ZXIgKnMpCit7CisJc3RydWN0IGZ3cnJfZ3JvdXAgKmdycCA9IChzLT5zdGF0ZSAmIFNSVl9CQUNLVVApID8KKwkJJnMtPnByb3h5LT5sYnBybS5md3JyLmJjayA6CisJCSZzLT5wcm94eS0+bGJwcm0uZndyci5hY3Q7CisKKwlzLT5ucG9zICs9IGdycC0+Y3Vycl93ZWlnaHQ7Cit9CisKKy8qIHByZXBhcmVzIGEgc2VydmVyIHdoZW4gaXQgd2FzIG1hcmtlZCBkb3duICovCitzdGF0aWMgaW5saW5lIHZvaWQgZndycl9nZXRfc3J2X2Rvd24oc3RydWN0IHNlcnZlciAqcykKK3sKKwlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwID0gKHMtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPworCQkmcy0+cHJveHktPmxicHJtLmZ3cnIuYmNrIDoKKwkJJnMtPnByb3h5LT5sYnBybS5md3JyLmFjdDsKKworCXMtPm5wb3MgPSBncnAtPmN1cnJfcG9zOworfQorCisvKiBwcmVwYXJlcyBhIHNlcnZlciB3aGVuIGV4dHJhY3RpbmcgaXQgZnJvbSBpdHMgdHJlZSAqLworc3RhdGljIHZvaWQgZndycl9nZXRfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCit7CisJc3RydWN0IHByb3h5ICpwID0gcy0+cHJveHk7CisJc3RydWN0IGZ3cnJfZ3JvdXAgKmdycCA9IChzLT5zdGF0ZSAmIFNSVl9CQUNLVVApID8KKwkJJnAtPmxicHJtLmZ3cnIuYmNrIDoKKwkJJnAtPmxicHJtLmZ3cnIuYWN0OworCisJaWYgKHMtPmxiX3RyZWUgPT0gZ3JwLT5pbml0KSB7CisJCWZ3cnJfZ2V0X3Nydl9pbml0KHMpOworCX0KKwllbHNlIGlmIChzLT5sYl90cmVlID09IGdycC0+bmV4dCkgeworCQlmd3JyX2dldF9zcnZfbmV4dChzKTsKKwl9CisJZWxzZSBpZiAocy0+bGJfdHJlZSA9PSBOVUxMKSB7CisJCWZ3cnJfZ2V0X3Nydl9kb3duKHMpOworCX0KK30KKworLyogc3dpdGNoZXMgdHJlZXMgImluaXQiIGFuZCAibmV4dCIgZm9yIEZXUlIgZ3JvdXAgPGdycD4uICJpbml0IiBzaG91bGQgYmUgZW1wdHkKKyAqIHdoZW4gdGhpcyBoYXBwZW5zLCBhbmQgIm5leHQiIGZpbGxlZCB3aXRoIHNlcnZlcnMgc29ydGVkIGJ5IHdlaWdodHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3N3aXRjaF90cmVlcyhzdHJ1Y3QgZndycl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBlYl9yb290ICpzd2FwOworCXN3YXAgPSBncnAtPmluaXQ7CisJZ3JwLT5pbml0ID0gZ3JwLT5uZXh0OworCWdycC0+bmV4dCA9IHN3YXA7CisJZ3JwLT5jdXJyX3dlaWdodCA9IGdycC0+bmV4dF93ZWlnaHQ7CisJZ3JwLT5jdXJyX3BvcyA9IGdycC0+Y3Vycl93ZWlnaHQ7Cit9CisKKy8qIHJldHVybiBuZXh0IHNlcnZlciBmcm9tIHRoZSBjdXJyZW50IHRyZWUgaW4gRldSUiBncm91cCA8Z3JwPiwgb3IgYSBzZXJ2ZXIKKyAqIGZyb20gdGhlICJpbml0IiB0cmVlIGlmIGFwcHJvcHJpYXRlLiBJZiBib3RoIHRyZWVzIGFyZSBlbXB0eSwgcmV0dXJuIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VydmVyICpmd3JyX2dldF9zZXJ2ZXJfZnJvbV9ncm91cChzdHJ1Y3QgZndycl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBlYjMyX25vZGUgKm5vZGU7CisJc3RydWN0IHNlcnZlciAqczsKKworCW5vZGUgPSBlYjMyX2ZpcnN0KCZncnAtPmN1cnIpOworCXMgPSBlYjMyX2VudHJ5KG5vZGUsIHN0cnVjdCBzZXJ2ZXIsIGxiX25vZGUpOworCQorCWlmICghbm9kZSB8fCBzLT5ucG9zID4gZ3JwLT5jdXJyX3BvcykgeworCQkvKiBlaXRoZXIgd2UgaGF2ZSBubyBzZXJ2ZXIgbGVmdCwgb3Igd2UgaGF2ZSBhIGhvbGUgKi8KKwkJc3RydWN0IGViMzJfbm9kZSAqbm9kZTI7CisJCW5vZGUyID0gZWIzMl9maXJzdChncnAtPmluaXQpOworCQlpZiAobm9kZTIpIHsKKwkJCW5vZGUgPSBub2RlMjsKKwkJCXMgPSBlYjMyX2VudHJ5KG5vZGUsIHN0cnVjdCBzZXJ2ZXIsIGxiX25vZGUpOworCQkJZndycl9nZXRfc3J2X2luaXQocyk7CisJCQlpZiAocy0+ZXdlaWdodCA9PSAwKSAvKiBGSVhNRTogaXMgaXQgcG9zc2libGUgYXQgYWxsID8gKi8KKwkJCQlub2RlID0gTlVMTDsKKwkJfQorCX0KKwlpZiAobm9kZSkKKwkJcmV0dXJuIHM7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworLyogQ29tcHV0ZXMgbmV4dCBwb3NpdGlvbiBvZiBzZXJ2ZXIgPHM+IGluIHRoZSBncm91cC4gSXQgaXMgbWFuZGF0b3J5IGZvciA8cz4KKyAqIHRvIGhhdmUgYSBub24temVybywgcG9zaXRpdmUgZXdlaWdodC4KKyovCitzdGF0aWMgaW5saW5lIHZvaWQgZndycl91cGRhdGVfcG9zaXRpb24oc3RydWN0IGZ3cnJfZ3JvdXAgKmdycCwgc3RydWN0IHNlcnZlciAqcykKK3sKKwlpZiAoIXMtPm5wb3MpIHsKKwkJLyogZmlyc3QgdGltZSBldmVyIGZvciB0aGlzIHNlcnZlciAqLworCQlzLT5scG9zID0gZ3JwLT5jdXJyX3BvczsKKwkJcy0+bnBvcyA9IGdycC0+Y3Vycl9wb3MgKyBncnAtPm5leHRfd2VpZ2h0IC8gcy0+ZXdlaWdodDsKKwkJcy0+cndlaWdodCArPSBncnAtPm5leHRfd2VpZ2h0ICUgcy0+ZXdlaWdodDsKKworCQlpZiAocy0+cndlaWdodCA+PSBzLT5ld2VpZ2h0KSB7CisJCQlzLT5yd2VpZ2h0IC09IHMtPmV3ZWlnaHQ7CisJCQlzLT5ucG9zKys7CisJCX0KKwl9IGVsc2UgeworCQlzLT5scG9zID0gcy0+bnBvczsKKwkJcy0+bnBvcyArPSBncnAtPm5leHRfd2VpZ2h0IC8gcy0+ZXdlaWdodDsKKwkJcy0+cndlaWdodCArPSBncnAtPm5leHRfd2VpZ2h0ICUgcy0+ZXdlaWdodDsKKworCQlpZiAocy0+cndlaWdodCA+PSBzLT5ld2VpZ2h0KSB7CisJCQlzLT5yd2VpZ2h0IC09IHMtPmV3ZWlnaHQ7CisJCQlzLT5ucG9zKys7CisJCX0KKwl9Cit9CisKKy8qIFJldHVybiBuZXh0IHNlcnZlciBmcm9tIHRoZSBjdXJyZW50IHRyZWUgaW4gYmFja2VuZCA8cD4sIG9yIGEgc2VydmVyIGZyb20KKyAqIHRoZSBpbml0IHRyZWUgaWYgYXBwcm9wcmlhdGUuIElmIGJvdGggdHJlZXMgYXJlIGVtcHR5LCByZXR1cm4gTlVMTC4KKyAqIFNhdHVyYXRlZCBzZXJ2ZXJzIGFyZSBza2lwcGVkIGFuZCByZXF1ZXVlZC4KKyAqLworc3RydWN0IHNlcnZlciAqZndycl9nZXRfbmV4dF9zZXJ2ZXIoc3RydWN0IHByb3h5ICpwLCBzdHJ1Y3Qgc2VydmVyICpzcnZ0b2F2b2lkKQoreworCXN0cnVjdCBzZXJ2ZXIgKnNydiwgKmZ1bGwsICphdm9pZGVkOworCXN0cnVjdCBmd3JyX2dyb3VwICpncnA7CisJaW50IHN3aXRjaGVkOworCisJaWYgKHAtPnNydl9hY3QpCisJCWdycCA9ICZwLT5sYnBybS5md3JyLmFjdDsKKwllbHNlIGlmIChwLT5sYnBybS5mYmNrKQorCQlyZXR1cm4gcC0+bGJwcm0uZmJjazsKKwllbHNlIGlmIChwLT5zcnZfYmNrKQorCQlncnAgPSAmcC0+bGJwcm0uZndyci5iY2s7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKworCXN3aXRjaGVkID0gMDsKKwlhdm9pZGVkID0gTlVMTDsKKwlmdWxsID0gTlVMTDsgLyogTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2Ygc2F0dXJhdGVkIHNlcnZlcnMgKi8KKwl3aGlsZSAoMSkgeworCQkvKiBpZiB3ZSBzZWUgYW4gZW1wdHkgZ3JvdXAsIGxldCdzIGZpcnN0IHRyeSB0byBjb2xsZWN0IHdlaWdodHMKKwkJICogd2hpY2ggbWlnaHQgaGF2ZSByZWNlbnRseSBjaGFuZ2VkLgorCQkgKi8KKwkJaWYgKCFncnAtPmN1cnJfd2VpZ2h0KQorCQkJZ3JwLT5jdXJyX3BvcyA9IGdycC0+Y3Vycl93ZWlnaHQgPSBncnAtPm5leHRfd2VpZ2h0OworCisJCS8qIGdldCBmaXJzdCBzZXJ2ZXIgZnJvbSB0aGUgImN1cnJlbnQiIHRyZWUuIFdoZW4gdGhlIGVuZCBvZgorCQkgKiB0aGUgdHJlZSBpcyByZWFjaGVkLCB3ZSBtYXkgaGF2ZSB0byBzd2l0Y2gsIGJ1dCBvbmx5IG9uY2UuCisJCSAqLworCQl3aGlsZSAoMSkgeworCQkJc3J2ID0gZndycl9nZXRfc2VydmVyX2Zyb21fZ3JvdXAoZ3JwKTsKKwkJCWlmIChzcnYpCisJCQkJYnJlYWs7CisJCQlpZiAoc3dpdGNoZWQpIHsKKwkJCQlpZiAoYXZvaWRlZCkgeworCQkJCQlzcnYgPSBhdm9pZGVkOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZ290byByZXF1ZXVlX3NlcnZlcnM7CisJCQl9CisJCQlzd2l0Y2hlZCA9IDE7CisJCQlmd3JyX3N3aXRjaF90cmVlcyhncnApOworCisJCX0KKworCQkvKiBPSywgd2UgaGF2ZSBhIHNlcnZlci4gSG93ZXZlciwgaXQgbWF5IGJlIHNhdHVyYXRlZCwgaW4gd2hpY2gKKwkJICogY2FzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29uc2lkZXIgaXQgZm9yIG5vdy4gV2UnbGwgdXBkYXRlCisJCSAqIGl0cyBwb3NpdGlvbiBhbmQgZGVxdWV1ZSBpdCBhbnl3YXksIHNvIHRoYXQgd2UgY2FuIG1vdmUgaXQKKwkJICogdG8gYSBiZXR0ZXIgcGxhY2UgYWZ0ZXJ3YXJkcy4KKwkJICovCisJCWZ3cnJfdXBkYXRlX3Bvc2l0aW9uKGdycCwgc3J2KTsKKwkJZndycl9kZXF1ZXVlX3NydihzcnYpOworCQlncnAtPmN1cnJfcG9zKys7CisJCWlmICghc3J2LT5tYXhjb25uIHx8ICghc3J2LT5uYnBlbmQgJiYgc3J2LT5zZXJ2ZWQgPCBzcnZfZHluYW1pY19tYXhjb25uKHNydikpKSB7CisJCQkvKiBtYWtlIHN1cmUgaXQgaXMgbm90IHRoZSBzZXJ2ZXIgd2UgYXJlIHRyeWluZyB0byBleGNsdWRlLi4uICovCisJCQlpZiAoc3J2ICE9IHNydnRvYXZvaWQgfHwgYXZvaWRlZCkKKwkJCQlicmVhazsKKworCQkJYXZvaWRlZCA9IHNydjsgLyogLi4uYnV0IHJlbWVtYmVyIHRoYXQgaXMgd2FzIHNlbGVjdGVkIHlldCBhdm9pZGVkICovCisJCX0KKworCQkvKiB0aGUgc2VydmVyIGlzIHNhdHVyYXRlZCBvciBhdm9pZGVkLCBsZXQncyBjaGFpbiBpdCBmb3IgbGF0ZXIgcmVpbnNlcnRpb24gKi8KKwkJc3J2LT5uZXh0X2Z1bGwgPSBmdWxsOworCQlmdWxsID0gc3J2OworCX0KKworCS8qIE9LLCB3ZSBnb3QgdGhlIGJlc3Qgc2VydmVyLCBsZXQncyB1cGRhdGUgaXQgKi8KKwlmd3JyX3F1ZXVlX3NydihzcnYpOworCisgcmVxdWV1ZV9zZXJ2ZXJzOgorCS8qIFJlcXVldWUgYWxsIGV4dHJhY3RlZCBzZXJ2ZXJzLiBJZiBmdWxsPT1zcnYgdGhlbiBpdCB3YXMKKwkgKiBhdm9pZGVkICh1bnN1Y2Vzc2Z1bGx5KSBhbmQgY2hhaW5lZCwgb21pdCBpdCBub3cuCisJICovCisJaWYgKHVubGlrZWx5KGZ1bGwgIT0gTlVMTCkpIHsKKwkJaWYgKHN3aXRjaGVkKSB7CisJCQkvKiB0aGUgdHJlZSBoYXMgc3dpdGNoZWQsIHJlcXVldWUgYWxsIGV4dHJhY3RlZCBzZXJ2ZXJzCisJCQkgKiBpbnRvICJpbml0IiwgYmVjYXVzZSB0aGVpciBwbGFjZSB3YXMgbG9zdCwgYW5kIG9ubHkKKwkJCSAqIHRoZWlyIHdlaWdodCBtYXR0ZXJzLgorCQkJICovCisJCQlkbyB7CisJCQkJaWYgKGxpa2VseShmdWxsICE9IHNydikpCisJCQkJCWZ3cnJfcXVldWVfYnlfd2VpZ2h0KGdycC0+aW5pdCwgZnVsbCk7CisJCQkJZnVsbCA9IGZ1bGwtPm5leHRfZnVsbDsKKwkJCX0gd2hpbGUgKGZ1bGwpOworCQl9IGVsc2UgeworCQkJLyogcmVxdWV1ZSBhbGwgZXh0cmFjdGVkIHNlcnZlcnMganVzdCBhcyBpZiB0aGV5IHdlcmUgY29uc3VtZWQKKwkJCSAqIHNvIHRoYXQgdGhleSByZWdhaW4gdGhlaXIgZXhwZWN0ZWQgcGxhY2UuCisJCQkgKi8KKwkJCWRvIHsKKwkJCQlpZiAobGlrZWx5KGZ1bGwgIT0gc3J2KSkKKwkJCQkJZndycl9xdWV1ZV9zcnYoZnVsbCk7CisJCQkJZnVsbCA9IGZ1bGwtPm5leHRfZnVsbDsKKwkJCX0gd2hpbGUgKGZ1bGwpOworCQl9CisJfQorCXJldHVybiBzcnY7Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9zcmMvbGJfbWFwLmMgYi9zcmMvbGJfbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1MGEwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9sYl9tYXAuYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIE1hcC1iYXNlZCBsb2FkLWJhbGFuY2luZyAoUlIgYW5kIEhBU0gpCisgKgorICogQ29weXJpZ2h0IDIwMDAtMjAwOSBXaWxseSBUYXJyZWF1IDx3QDF3dC5ldT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uL2NvbXBhdC5oPgorI2luY2x1ZGUgPGNvbW1vbi9jb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24vZGVidWcuaD4KKyNpbmNsdWRlIDxjb21tb24vZWIzMnRyZWUuaD4KKworI2luY2x1ZGUgPHR5cGVzL2dsb2JhbC5oPgorI2luY2x1ZGUgPHR5cGVzL3NlcnZlci5oPgorCisjaW5jbHVkZSA8cHJvdG8vYmFja2VuZC5oPgorI2luY2x1ZGUgPHByb3RvL3Byb3RvX2h0dHAuaD4KKyNpbmNsdWRlIDxwcm90by9wcm90b190Y3AuaD4KKyNpbmNsdWRlIDxwcm90by9xdWV1ZS5oPgorCisvKiB0aGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIG1hcCBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3IHN0YXRlICovCitzdGF0aWMgdm9pZCBtYXBfc2V0X3NlcnZlcl9zdGF0dXNfZG93bihzdHJ1Y3Qgc2VydmVyICpzcnYpCit7CisJc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKKworCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgorCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCisJCXJldHVybjsKKworCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCisJCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKKworCS8qIEZJWE1FOiBjb3VsZCBiZSBvcHRpbWl6ZWQgc2luY2Ugd2Uga25vdyB3aGF0IGNoYW5nZWQgKi8KKwlyZWNvdW50X3NlcnZlcnMocCk7CisJdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOworCXAtPmxicHJtLm1hcC5zdGF0ZSB8PSBQUl9NQVBfUkVDQUxDOworIG91dF91cGRhdGVfc3RhdGU6CisJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKKwlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKK30KKworLyogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBtYXAgYWNjb3JkaW5nIHRvIHNlcnZlciA8c3J2PidzIG5ldyBzdGF0ZSAqLworc3RhdGljIHZvaWQgbWFwX3NldF9zZXJ2ZXJfc3RhdHVzX3VwKHN0cnVjdCBzZXJ2ZXIgKnNydikKK3sKKwlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OworCisJaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCisJICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKKwkJcmV0dXJuOworCisJaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCisJCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKKworCS8qIEZJWE1FOiBjb3VsZCBiZSBvcHRpbWl6ZWQgc2luY2Ugd2Uga25vdyB3aGF0IGNoYW5nZWQgKi8KKwlyZWNvdW50X3NlcnZlcnMocCk7CisJdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOworCXAtPmxicHJtLm1hcC5zdGF0ZSB8PSBQUl9NQVBfUkVDQUxDOworIG91dF91cGRhdGVfc3RhdGU6CisJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKKwlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZWNvbXB1dGVzIHRoZSBzZXJ2ZXIgbWFwIGZvciBwcm94eSBweC4gSXQgcmVsaWVzIG9uCisgKiBweC0+bGJwcm0udG90X3dhY3QsIHRvdF93YmNrLCB0b3RfdXNlZCwgdG90X3dlaWdodCwgc28gaXQgbXVzdCBiZQorICogY2FsbGVkIGFmdGVyIHJlY291bnRfc2VydmVycygpLiBJdCBhbHNvIGV4cGVjdHMgcHgtPmxicHJtLm1hcC5zcnYKKyAqIHRvIGJlIGFsbG9jYXRlZCB3aXRoIHRoZSBsYXJnZXN0IHNpemUgbmVlZGVkLiBJdCB1cGRhdGVzIHRvdF93ZWlnaHQuCisgKi8KK3ZvaWQgcmVjYWxjX3NlcnZlcl9tYXAoc3RydWN0IHByb3h5ICpweCkKK3sKKwlpbnQgbywgdG90LCBmbGFnOworCXN0cnVjdCBzZXJ2ZXIgKmN1ciwgKmJlc3Q7CisKKwlzd2l0Y2ggKHB4LT5sYnBybS50b3RfdXNlZCkgeworCWNhc2UgMDoJLyogbm8gc2VydmVyICovCisJCXB4LT5sYnBybS5tYXAuc3RhdGUgJj0gflBSX01BUF9SRUNBTEM7CisJCXJldHVybjsKKwljYXNlIDE6IC8qIG9ubHkgb25lIHNlcnZlciwganVzdCBmaWxsIGZpcnN0IGVudHJ5ICovCisJCXRvdCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRvdCA9IHB4LT5sYnBybS50b3Rfd2VpZ2h0OworCQlicmVhazsKKwl9CisKKwkvKiBoZXJlIHdlICprbm93KiB0aGF0IHdlIGhhdmUgc29tZSBzZXJ2ZXJzICovCisJaWYgKHB4LT5zcnZfYWN0KQorCQlmbGFnID0gU1JWX1JVTk5JTkc7CisJZWxzZQorCQlmbGFnID0gU1JWX1JVTk5JTkcgfCBTUlZfQkFDS1VQOworCisJLyogdGhpcyBhbGdvcml0aG0gZ2l2ZXMgcHJpb3JpdHkgdG8gdGhlIGZpcnN0IHNlcnZlciwgd2hpY2ggbWVhbnMgdGhhdAorCSAqIGl0IHdpbGwgcmVzcGVjdCB0aGUgZGVjbGFyYXRpb24gb3JkZXIgZm9yIGVxdWl2YWxlbnQgd2VpZ2h0cywgYW5kCisJICogdGhhdCB3aGF0ZXZlciB0aGUgd2VpZ2h0cywgdGhlIGZpcnN0IHNlcnZlciBjYWxsZWQgd2lsbCBhbHdheXMgYmUKKwkgKiB0aGUgZmlyc3QgZGVjbGFyZWQuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGFzdW1wdGlvbiBmb3IgdGhlIGJhY2t1cAorCSAqIGNhc2UsIHdoZXJlIHdlIHdhbnQgdGhlIGZpcnN0IHNlcnZlciBvbmx5LgorCSAqLworCWZvciAoY3VyID0gcHgtPnNydjsgY3VyOyBjdXIgPSBjdXItPm5leHQpCisJCWN1ci0+d3Njb3JlID0gMDsKKworCWZvciAobyA9IDA7IG8gPCB0b3Q7IG8rKykgeworCQlpbnQgbWF4ID0gMDsKKwkJYmVzdCA9IE5VTEw7CisJCWZvciAoY3VyID0gcHgtPnNydjsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKwkJCWlmIChjdXItPmV3ZWlnaHQgJiYKKwkJCSAgICBmbGFnID09IChjdXItPnN0YXRlICYKKwkJCQkgICAgIChTUlZfUlVOTklORyB8IFNSVl9HT0lOR0RPV04gfCBTUlZfQkFDS1VQKSkpIHsKKwkJCQlpbnQgdjsKKworCQkJCS8qIElmIHdlIGFyZSBmb3JjZWQgdG8gcmV0dXJuIG9ubHkgb25lIHNlcnZlciwgd2UgZG9uJ3Qgd2FudCB0bworCQkJCSAqIGdvIGZ1cnRoZXIsIGJlY2F1c2Ugd2Ugd291bGQgcmV0dXJuIHRoZSB3cm9uZyBvbmUgZHVlIHRvCisJCQkJICogZGl2aWRlIG92ZXJmbG93LgorCQkJCSAqLworCQkJCWlmICh0b3QgPT0gMSkgeworCQkJCQliZXN0ID0gY3VyOworCQkJCQkvKiBub3RlIHRoYXQgYmVzdC0+d3Njb3JlIHdpbGwgYmUgd3JvbmcgYnV0IHdlIGRvbid0IGNhcmUgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY3VyLT53c2NvcmUgKz0gY3VyLT5ld2VpZ2h0OworCQkJCXYgPSAoY3VyLT53c2NvcmUgKyB0b3QpIC8gdG90OyAvKiByZXN1bHQgYmV0d2VlbiAwIGFuZCAzICovCisJCQkJaWYgKGJlc3QgPT0gTlVMTCB8fCB2ID4gbWF4KSB7CisJCQkJCW1heCA9IHY7CisJCQkJCWJlc3QgPSBjdXI7CisJCQkJfQorCQkJfQorCQl9CisJCXB4LT5sYnBybS5tYXAuc3J2W29dID0gYmVzdDsKKwkJYmVzdC0+d3Njb3JlIC09IHRvdDsKKwl9CisJcHgtPmxicHJtLm1hcC5zdGF0ZSAmPSB+UFJfTUFQX1JFQ0FMQzsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBvZiBidWlsZGluZyB0aGUgc2VydmVyIE1BUCBmb3IgbWFwLWJhc2VkIExCCisgKiBhbGdvcml0aG1zLCBhbGxvY2F0aW5nIHRoZSBtYXAsIGFuZCBzZXR0aW5nIHAtPmxicHJtLndtdWx0IHRvIHRoZSBHQ0Qgb2YgdGhlCisgKiB3ZWlnaHRzIGlmIGFwcGxpY2FibGUuIEl0IHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBwcm94eSwgYXQgY29uZmlnCisgKiB0aW1lLgorICovCit2b2lkIGluaXRfc2VydmVyX21hcChzdHJ1Y3QgcHJveHkgKnApCit7CisJc3RydWN0IHNlcnZlciAqc3J2OworCWludCBwZ2NkOworCWludCBhY3QsIGJjazsKKworCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX3VwICAgPSBtYXBfc2V0X3NlcnZlcl9zdGF0dXNfdXA7CisJcC0+bGJwcm0uc2V0X3NlcnZlcl9zdGF0dXNfZG93biA9IG1hcF9zZXRfc2VydmVyX3N0YXR1c19kb3duOworCXAtPmxicHJtLnVwZGF0ZV9zZXJ2ZXJfZXdlaWdodCA9IE5VTEw7CisgCisJaWYgKCFwLT5zcnYpCisJCXJldHVybjsKKworCS8qIFdlIHdpbGwgZmFjdG9yIHRoZSB3ZWlnaHRzIHRvIHJlZHVjZSB0aGUgdGFibGUsCisJICogdXNpbmcgRXVjbGlkZSdzIGxhcmdlc3QgY29tbW9uIGRpdmlzb3IgYWxnb3JpdGhtLgorCSAqIFNpbmNlIHdlIG1heSBoYXZlIHplcm8gd2VpZ2h0cywgd2UgaGF2ZSB0byBmaXJzdAorCSAqIGZpbmQgYSBub24temVybyB3ZWlnaHQgc2VydmVyLgorCSAqLworCXBnY2QgPSAxOworCXNydiA9IHAtPnNydjsKKwl3aGlsZSAoc3J2ICYmICFzcnYtPnV3ZWlnaHQpCisJCXNydiA9IHNydi0+bmV4dDsKKworCWlmIChzcnYpIHsKKwkJcGdjZCA9IHNydi0+dXdlaWdodDsgLyogbm90ZTogY2Fubm90IGJlIHplcm8gKi8KKwkJd2hpbGUgKHBnY2QgPiAxICYmIChzcnYgPSBzcnYtPm5leHQpKSB7CisJCQlpbnQgdyA9IHNydi0+dXdlaWdodDsKKwkJCXdoaWxlICh3KSB7CisJCQkJaW50IHQgPSBwZ2NkICUgdzsKKwkJCQlwZ2NkID0gdzsKKwkJCQl3ID0gdDsKKwkJCX0KKwkJfQorCX0KKworCS8qIEl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8ga25vdyB3aGF0IGZhY3RvciB0byBhcHBseQorCSAqIHRvIHRoZSBiYWNrZW5kJ3MgZWZmZWN0aXZlIHdlaWdodCB0byBrbm93IGl0cyByZWFsCisJICogd2VpZ2h0LgorCSAqLworCXAtPmxicHJtLndtdWx0ID0gcGdjZDsKKworCWFjdCA9IGJjayA9IDA7CisJZm9yIChzcnYgPSBwLT5zcnY7IHNydjsgc3J2ID0gc3J2LT5uZXh0KSB7CisJCXNydi0+ZXdlaWdodCA9IHNydi0+dXdlaWdodCAvIHBnY2Q7CisJCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OworCQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOworCQlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApCisJCQliY2sgKz0gc3J2LT5ld2VpZ2h0OworCQllbHNlCisJCQlhY3QgKz0gc3J2LT5ld2VpZ2h0OworCX0KKworCS8qIHRoaXMgaXMgdGhlIGxhcmdlc3QgbWFwIHdlIHdpbGwgZXZlciBuZWVkIGZvciB0aGlzIHNlcnZlcnMgbGlzdCAqLworCWlmIChhY3QgPCBiY2spCisJCWFjdCA9IGJjazsKKworCWlmICghYWN0KQorCQlhY3QgPSAxOworCisJcC0+bGJwcm0ubWFwLnNydiA9IChzdHJ1Y3Qgc2VydmVyICoqKWNhbGxvYyhhY3QsIHNpemVvZihzdHJ1Y3Qgc2VydmVyICopKTsKKwkvKiByZWNvdW50cyBzZXJ2ZXJzIGFuZCB0aGVpciB3ZWlnaHRzICovCisJcC0+bGJwcm0ubWFwLnN0YXRlID0gUFJfTUFQX1JFQ0FMQzsKKwlyZWNvdW50X3NlcnZlcnMocCk7CisJdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOworCXJlY2FsY19zZXJ2ZXJfbWFwKHApOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBmaW5kIGEgcnVubmluZyBzZXJ2ZXIgd2l0aCBmcmVlIGNvbm5lY3Rpb24gc2xvdHMgZm9yCisgKiB0aGUgcHJveHkgPHB4PiBmb2xsb3dpbmcgdGhlIHJvdW5kLXJvYmluIG1ldGhvZC4KKyAqIElmIGFueSBzZXJ2ZXIgaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgYW5kIHB4LT5sYnBybS5tYXAucnJfaWR4IHdpbGwgYmUgdXBkYXRlZAorICogdG8gcG9pbnQgdG8gdGhlIG5leHQgc2VydmVyLiBJZiBubyB2YWxpZCBzZXJ2ZXIgaXMgZm91bmQsIE5VTEwgaXMgcmV0dXJuZWQuCisgKi8KK3N0cnVjdCBzZXJ2ZXIgKm1hcF9nZXRfc2VydmVyX3JyKHN0cnVjdCBwcm94eSAqcHgsIHN0cnVjdCBzZXJ2ZXIgKnNydnRvYXZvaWQpCit7CisJaW50IG5ld2lkeCwgYXZvaWRpZHg7CisJc3RydWN0IHNlcnZlciAqc3J2LCAqYXZvaWRlZDsKKworCWlmIChweC0+bGJwcm0udG90X3dlaWdodCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChweC0+bGJwcm0ubWFwLnN0YXRlICYgUFJfTUFQX1JFQ0FMQykKKwkJcmVjYWxjX3NlcnZlcl9tYXAocHgpOworCisJaWYgKHB4LT5sYnBybS5tYXAucnJfaWR4IDwgMCB8fCBweC0+bGJwcm0ubWFwLnJyX2lkeCA+PSBweC0+bGJwcm0udG90X3dlaWdodCkKKwkJcHgtPmxicHJtLm1hcC5ycl9pZHggPSAwOworCW5ld2lkeCA9IHB4LT5sYnBybS5tYXAucnJfaWR4OworCisJYXZvaWRlZCA9IE5VTEw7CisJYXZvaWRpZHggPSAwOyAvKiBzaHV0IGEgZ2NjIHdhcm5pbmcgKi8KKwlkbyB7CisJCXNydiA9IHB4LT5sYnBybS5tYXAuc3J2W25ld2lkeCsrXTsKKwkJaWYgKCFzcnYtPm1heGNvbm4gfHwgc3J2LT5jdXJfc2VzcyA8IHNydl9keW5hbWljX21heGNvbm4oc3J2KSkgeworCQkJLyogbWFrZSBzdXJlIGl0IGlzIG5vdCB0aGUgc2VydmVyIHdlIGFyZSB0cnkgdG8gZXhjbHVkZS4uLiAqLworCQkJaWYgKHNydiAhPSBzcnZ0b2F2b2lkKSB7CisJCQkJcHgtPmxicHJtLm1hcC5ycl9pZHggPSBuZXdpZHg7CisJCQkJcmV0dXJuIHNydjsKKwkJCX0KKworCQkJYXZvaWRlZCA9IHNydjsJLyogLi4uYnV0IHJlbWVtYmVyIHRoYXQgaXMgd2FzIHNlbGVjdGVkIHlldCBhdm9pZGVkICovCisJCQlhdm9pZGlkeCA9IG5ld2lkeDsKKwkJfQorCQlpZiAobmV3aWR4ID09IHB4LT5sYnBybS50b3Rfd2VpZ2h0KQorCQkJbmV3aWR4ID0gMDsKKwl9IHdoaWxlIChuZXdpZHggIT0gcHgtPmxicHJtLm1hcC5ycl9pZHgpOworCisJaWYgKGF2b2lkZWQpCisJCXB4LT5sYnBybS5tYXAucnJfaWR4ID0gYXZvaWRpZHg7CisKKwkvKiByZXR1cm4gTlVMTCBvciBzcnZ0b2F2b2lkIGlmIGZvdW5kICovCisJcmV0dXJuIGF2b2lkZWQ7Cit9CisKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8K