From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mslow2.mail.gandi.net (mslow2.mail.gandi.net [217.70.178.242]) by gabe.freedesktop.org (Postfix) with ESMTPS id B663F6E6AC for ; Tue, 5 Feb 2019 13:04:49 +0000 (UTC) Received: from relay10.mail.gandi.net (unknown [217.70.178.230]) by mslow2.mail.gandi.net (Postfix) with ESMTP id 95DE83A2B0D for ; Tue, 5 Feb 2019 13:53:27 +0100 (CET) Message-ID: From: Paul Kocialkowski Date: Tue, 05 Feb 2019 13:53:02 +0100 In-Reply-To: <20190125145842.15738-4-maxime.ripard@bootlin.com> References: <20190125145842.15738-1-maxime.ripard@bootlin.com> <20190125145842.15738-4-maxime.ripard@bootlin.com> MIME-Version: 1.0 Subject: Re: [igt-dev] [PATCH i-g-t v5 03/13] igt: fb: generic YUV convertion function List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: Maxime Ripard , igt-dev@lists.freedesktop.org Cc: Petri Latvala , eben@raspberrypi.org, Thomas Petazzoni List-ID: SGksCgpPbiBGcmksIDIwMTktMDEtMjUgYXQgMTU6NTggKzAxMDAsIE1heGltZSBSaXBhcmQgd3Jv dGU6Cj4gVGhlIGN1cnJlbnQgd2F5IHdlIHdvcmsgd2hlbiB3ZSB3YW50IHRvIHN1cHBvcnQgYSBu ZXcgWVVWIGZvcm1hdCB0byBJR1QsIHdlCj4gYWxzbyBuZWVkIHRvIGFkZCBuZXcgZnVuY3Rpb24g dG8gY29udmVydCB0byBhbmQgZnJvbSBYUkdCODg4OC4KPiAKPiBUaGlzIGRvZXNuJ3QgcmVhbGx5 IHNjYWxlIGhvd2V2ZXIsIGFuZCBjcmVhdGVzIGEgbG90IG9mIGNvZGUgdG8gbWFpbnRhaW4uCj4g SW4gb3JkZXIgdG8gd29yayBhcm91bmQgdGhpcywgY3JlYXRlIGEgZ2VuZXJpYyBmdW5jdGlvbiB0 byBjb252ZXJ0IHRvIFJHQgo+IGFuZCBvbmUgdG8gY29udmVydCBmcm9tIFJHQi4KPiAKPiBUaGUg b25seSB0aGluZyB0aGF0IGlzIG5lZWRlZCBub3cgaXMgdG8gYWRkIG5ldyBwYXJhbWV0ZXJzLCBh bmQgdGhhdCdzIGl0LgoKUHVzaGVkLCB0aGFua3MhCgpDaGVlcnMsCgpQYXVsCgo+IFJldmlld2Vk LWJ5OiBQYXVsIEtvY2lhbGtvd3NraSA8cGF1bC5rb2NpYWxrb3dza2lAYm9vdGxpbi5jb20+Cj4g U2lnbmVkLW9mZi1ieTogTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBib290bGluLmNvbT4K PiAtLS0KPiAgbGliL2lndF9mYi5jIHwgNTM3ICsrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICAxIGZpbGUgY2hhbmdlZCwgMTcxIGluc2VydGlvbnMo KyksIDM2NiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvbGliL2lndF9mYi5jIGIvbGli L2lndF9mYi5jCj4gaW5kZXggMWE1YzMzOGVhNTMyLi40NTY5MWZkNDQxZDkgMTAwNjQ0Cj4gLS0t IGEvbGliL2lndF9mYi5jCj4gKysrIGIvbGliL2lndF9mYi5jCj4gQEAgLTE1NzcsNDI0ICsxNTc3 LDIzNyBAQCBzdGF0aWMgdm9pZCBjb252ZXJ0X3NyY19wdXQoY29uc3Qgc3RydWN0IGZiX2NvbnZl cnQgKmN2dCwKPiAgCQlmcmVlKHNyY19idWYpOwo+ICB9Cj4gIAo+IC1zdGF0aWMgdm9pZCBjb252 ZXJ0X252MTJfdG9fcmdiMjQoc3RydWN0IGZiX2NvbnZlcnQgKmN2dCkKPiArc3RydWN0IHl1dl9w YXJhbWV0ZXJzIHsKPiArCXVuc2lnbmVkCXlfaW5jOwo+ICsJdW5zaWduZWQJdXZfaW5jOwo+ICsJ dW5zaWduZWQJeV9zdHJpZGU7Cj4gKwl1bnNpZ25lZAl1dl9zdHJpZGU7Cj4gKwl1bnNpZ25lZAl5 X29mZnNldDsKPiArCXVuc2lnbmVkCXVfb2Zmc2V0Owo+ICsJdW5zaWduZWQJdl9vZmZzZXQ7Cj4g K307Cj4gKwo+ICtzdGF0aWMgdm9pZCBnZXRfeXV2X3BhcmFtZXRlcnMoc3RydWN0IGlndF9mYiAq ZmIsIHN0cnVjdCB5dXZfcGFyYW1ldGVycyAqcGFyYW1zKQo+ICB7Cj4gLQlpbnQgaSwgajsKPiAt CWNvbnN0IHVpbnQ4X3QgKnksICp1djsKPiAtCXVpbnQ4X3QgKnJnYjI0ID0gY3Z0LT5kc3QucHRy Owo+IC0JdW5zaWduZWQgaW50IHJnYjI0X3N0cmlkZSA9IGN2dC0+ZHN0LmZiLT5zdHJpZGVzWzBd Owo+IC0JdW5zaWduZWQgaW50IHBsYW5hcl9zdHJpZGUgPSBjdnQtPnNyYy5mYi0+c3RyaWRlc1sw XTsKPiAtCXN0cnVjdCBpZ3RfbWF0NCBtID0gaWd0X3ljYmNyX3RvX3JnYl9tYXRyaXgoY3Z0LT5z cmMuZmItPmNvbG9yX2VuY29kaW5nLAo+IC0JCQkJCQkgICAgY3Z0LT5zcmMuZmItPmNvbG9yX3Jh bmdlKTsKPiAtCXVpbnQ4X3QgKmJ1ZjsKPiAtCj4gLQlpZ3RfYXNzZXJ0KGN2dC0+c3JjLmZiLT5k cm1fZm9ybWF0ID09IERSTV9GT1JNQVRfTlYxMiAmJgo+IC0JCSAgIGN2dC0+ZHN0LmZiLT5kcm1f Zm9ybWF0ID09IERSTV9GT1JNQVRfWFJHQjg4ODgpOwo+IC0KPiAtCWJ1ZiA9IGNvbnZlcnRfc3Jj X2dldChjdnQpOwo+IC0JeSA9IGJ1ZiArIGN2dC0+c3JjLmZiLT5vZmZzZXRzWzBdOwo+IC0JdXYg PSBidWYgKyBjdnQtPnNyYy5mYi0+b2Zmc2V0c1sxXTsKPiAtCj4gLQlmb3IgKGkgPSAwOyBpIDwg Y3Z0LT5kc3QuZmItPmhlaWdodCAvIDI7IGkrKykgewo+IC0JCWZvciAoaiA9IDA7IGogPCBjdnQt PmRzdC5mYi0+d2lkdGggLyAyOyBqKyspIHsKPiAtCQkJLyogQ29udmVydCAyeDIgcGl4ZWwgYmxv Y2tzICovCj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbNF07Cj4gLQkJCXN0cnVjdCBpZ3RfdmVj NCByZ2JbNF07Cj4gLQo+IC0JCQl5dXZbMF0uZFswXSA9IHlbaiAqIDIgKyAwXTsKPiAtCQkJeXV2 WzFdLmRbMF0gPSB5W2ogKiAyICsgMV07Cj4gLQkJCXl1dlsyXS5kWzBdID0geVtqICogMiArIDAg KyBwbGFuYXJfc3RyaWRlXTsKPiAtCQkJeXV2WzNdLmRbMF0gPSB5W2ogKiAyICsgMSArIHBsYW5h cl9zdHJpZGVdOwo+IC0KPiAtCQkJeXV2WzBdLmRbMV0gPSB5dXZbMV0uZFsxXSA9IHl1dlsyXS5k WzFdID0geXV2WzNdLmRbMV0gPSB1dltqICogMiArIDBdOwo+IC0JCQl5dXZbMF0uZFsyXSA9IHl1 dlsxXS5kWzJdID0geXV2WzJdLmRbMl0gPSB5dXZbM10uZFsyXSA9IHV2W2ogKiAyICsgMV07Cj4g LQkJCXl1dlswXS5kWzNdID0geXV2WzFdLmRbM10gPSB5dXZbMl0uZFszXSA9IHl1dlszXS5kWzNd ID0gMS4wZjsKPiAtCj4gLQkJCXJnYlswXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2 WzBdKTsKPiAtCQkJcmdiWzFdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZ5dXZbMV0pOwo+ IC0JCQlyZ2JbMl0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlsyXSk7Cj4gLQkJCXJn YlszXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2WzNdKTsKPiAtCj4gLQkJCXdyaXRl X3JnYigmcmdiMjRbaiAqIDggKyAwXSwgJnJnYlswXSk7Cj4gLQkJCXdyaXRlX3JnYigmcmdiMjRb aiAqIDggKyA0XSwgJnJnYlsxXSk7Cj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyAwICsg cmdiMjRfc3RyaWRlXSwgJnJnYlsyXSk7Cj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyA0 ICsgcmdiMjRfc3RyaWRlXSwgJnJnYlszXSk7Cj4gLQkJfQo+IC0KPiAtCQlpZiAoY3Z0LT5kc3Qu ZmItPndpZHRoICYgMSkgewo+IC0JCQkvKiBDb252ZXJ0IDF4MiBwaXhlbCBibG9jayAqLwo+IC0J CQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzJdOwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiWzJdOwo+ IC0KPiAtCQkJeXV2WzBdLmRbMF0gPSB5W2ogKiAyICsgMF07Cj4gLQkJCXl1dlsxXS5kWzBdID0g eVtqICogMiArIDAgKyBwbGFuYXJfc3RyaWRlXTsKPiArCWlndF9hc3NlcnQoaWd0X2Zvcm1hdF9p c195dXYoZmItPmRybV9mb3JtYXQpKTsKPiAgCj4gLQkJCXl1dlswXS5kWzFdID0geXV2WzFdLmRb MV0gPSB1dltqICogMiArIDBdOwo+IC0JCQl5dXZbMF0uZFsyXSA9IHl1dlsxXS5kWzJdID0gdXZb aiAqIDIgKyAxXTsKPiAtCQkJeXV2WzBdLmRbM10gPSB5dXZbMV0uZFszXSA9IDEuMGY7Cj4gKwlz d2l0Y2ggKGZiLT5kcm1fZm9ybWF0KSB7Cj4gKwljYXNlIERSTV9GT1JNQVRfTlYxMjoKPiArCQlw YXJhbXMtPnlfaW5jID0gMTsKPiArCQlwYXJhbXMtPnV2X2luYyA9IDI7Cj4gKwkJYnJlYWs7Cj4g IAo+IC0JCQlyZ2JbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlswXSk7Cj4gLQkJ CXJnYlsxXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2WzFdKTsKPiAtCj4gLQkJCXdy aXRlX3JnYigmcmdiMjRbaiAqIDggKyAwXSwgJnJnYlswXSk7Cj4gLQkJCXdyaXRlX3JnYigmcmdi MjRbaiAqIDggKyAwICsgcmdiMjRfc3RyaWRlXSwgJnJnYlsxXSk7Cj4gLQkJfQo+IC0KPiAtCQly Z2IyNCArPSAyICogcmdiMjRfc3RyaWRlOwo+IC0JCXkgKz0gMiAqIHBsYW5hcl9zdHJpZGU7Cj4g LQkJdXYgKz0gcGxhbmFyX3N0cmlkZTsKPiArCWNhc2UgRFJNX0ZPUk1BVF9ZVVlWOgo+ICsJY2Fz ZSBEUk1fRk9STUFUX1lWWVU6Cj4gKwljYXNlIERSTV9GT1JNQVRfVVlWWToKPiArCWNhc2UgRFJN X0ZPUk1BVF9WWVVZOgo+ICsJCXBhcmFtcy0+eV9pbmMgPSAyOwo+ICsJCXBhcmFtcy0+dXZfaW5j ID0gNDsKPiArCQlicmVhazsKPiArCj4gKwljYXNlIERSTV9GT1JNQVRfWFlVVjg4ODg6Cj4gKwkJ cGFyYW1zLT55X2luYyA9IDQ7Cj4gKwkJcGFyYW1zLT51dl9pbmMgPSA0Owo+ICsJCWJyZWFrOwo+ ICAJfQo+ICAKPiAtCWlmIChjdnQtPmRzdC5mYi0+aGVpZ2h0ICYgMSkgewo+IC0JCS8qIENvbnZl cnQgbGFzdCByb3cgKi8KPiAtCQlmb3IgKGogPSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRoIC8g MjsgaisrKSB7Cj4gLQkJCS8qIENvbnZlcnQgMngxIHBpeGVsIGJsb2NrcyAqLwo+IC0JCQlzdHJ1 Y3QgaWd0X3ZlYzQgeXV2WzJdOwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiWzJdOwo+IC0KPiAt CQkJeXV2WzBdLmRbMF0gPSB5W2ogKiAyICsgMF07Cj4gLQkJCXl1dlsxXS5kWzBdID0geVtqICog MiArIDFdOwo+IC0JCQl5dXZbMF0uZFsxXSA9IHl1dlsxXS5kWzFdID0gdXZbaiAqIDIgKyAwXTsK PiAtCQkJeXV2WzBdLmRbMl0gPSB5dXZbMV0uZFsyXSA9IHV2W2ogKiAyICsgMV07Cj4gLQkJCXl1 dlswXS5kWzNdID0geXV2WzFdLmRbM10gPSAxLjBmOwo+ICsJc3dpdGNoIChmYi0+ZHJtX2Zvcm1h dCkgewo+ICsJY2FzZSBEUk1fRk9STUFUX05WMTI6Cj4gKwkJcGFyYW1zLT55X3N0cmlkZSA9IGZi LT5zdHJpZGVzWzBdOwo+ICsJCXBhcmFtcy0+dXZfc3RyaWRlID0gZmItPnN0cmlkZXNbMV07Cj4g KwkJYnJlYWs7Cj4gIAo+IC0JCQlyZ2JbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1 dlswXSk7Cj4gLQkJCXJnYlsxXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2WzFdKTsK PiArCWNhc2UgRFJNX0ZPUk1BVF9ZVVlWOgo+ICsJY2FzZSBEUk1fRk9STUFUX1lWWVU6Cj4gKwlj YXNlIERSTV9GT1JNQVRfVVlWWToKPiArCWNhc2UgRFJNX0ZPUk1BVF9WWVVZOgo+ICsJY2FzZSBE Uk1fRk9STUFUX1hZVVY4ODg4Ogo+ICsJCXBhcmFtcy0+eV9zdHJpZGUgPSBmYi0+c3RyaWRlc1sw XTsKPiArCQlwYXJhbXMtPnV2X3N0cmlkZSA9IGZiLT5zdHJpZGVzWzBdOwo+ICsJCWJyZWFrOwo+ ICsJfQo+ICAKPiAtCQkJd3JpdGVfcmdiKCZyZ2IyNFtqICogOCArIDBdLCAmcmdiWzBdKTsKPiAt CQkJd3JpdGVfcmdiKCZyZ2IyNFtqICogOCArIDRdLCAmcmdiWzBdKTsKPiAtCQl9Cj4gKwlzd2l0 Y2ggKGZiLT5kcm1fZm9ybWF0KSB7Cj4gKwljYXNlIERSTV9GT1JNQVRfTlYxMjoKPiArCQlwYXJh bXMtPnlfb2Zmc2V0ID0gZmItPm9mZnNldHNbMF07Cj4gKwkJcGFyYW1zLT51X29mZnNldCA9IGZi LT5vZmZzZXRzWzFdOwo+ICsJCXBhcmFtcy0+dl9vZmZzZXQgPSBmYi0+b2Zmc2V0c1sxXSArIDE7 Cj4gKwkJYnJlYWs7Cj4gIAo+IC0JCWlmIChjdnQtPmRzdC5mYi0+d2lkdGggJiAxKSB7Cj4gLQkJ CS8qIENvbnZlcnQgc2luZ2xlIHBpeGVsICovCj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXY7Cj4g LQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2I7Cj4gKwljYXNlIERSTV9GT1JNQVRfWVVZVjoKPiArCQlw YXJhbXMtPnlfb2Zmc2V0ID0gZmItPm9mZnNldHNbMF07Cj4gKwkJcGFyYW1zLT51X29mZnNldCA9 IGZiLT5vZmZzZXRzWzBdICsgMTsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9mZnNldHNb MF0gKyAzOwo+ICsJCWJyZWFrOwo+ICAKPiAtCQkJeXV2LmRbMF0gPSB5W2ogKiAyICsgMF07Cj4g LQkJCXl1di5kWzFdID0gdXZbaiAqIDIgKyAwXTsKPiAtCQkJeXV2LmRbMl0gPSB1dltqICogMiAr IDFdOwo+IC0JCQl5dXYuZFszXSA9IDEuMGY7Cj4gKwljYXNlIERSTV9GT1JNQVRfWVZZVToKPiAr CQlwYXJhbXMtPnlfb2Zmc2V0ID0gZmItPm9mZnNldHNbMF07Cj4gKwkJcGFyYW1zLT51X29mZnNl dCA9IGZiLT5vZmZzZXRzWzBdICsgMzsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9mZnNl dHNbMF0gKyAxOwo+ICsJCWJyZWFrOwo+ICAKPiAtCQkJcmdiID0gaWd0X21hdHJpeF90cmFuc2Zv cm0oJm0sICZ5dXYpOwo+ICsJY2FzZSBEUk1fRk9STUFUX1VZVlk6Cj4gKwkJcGFyYW1zLT55X29m ZnNldCA9IGZiLT5vZmZzZXRzWzBdICsgMTsKPiArCQlwYXJhbXMtPnVfb2Zmc2V0ID0gZmItPm9m ZnNldHNbMF07Cj4gKwkJcGFyYW1zLT52X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdICsgMjsKPiAr CQlicmVhazsKPiAgCj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyAwXSwgJnJnYik7Cj4g LQkJfQo+ICsJY2FzZSBEUk1fRk9STUFUX1ZZVVk6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9IGZi LT5vZmZzZXRzWzBdICsgMTsKPiArCQlwYXJhbXMtPnVfb2Zmc2V0ID0gZmItPm9mZnNldHNbMF0g KyAyOwo+ICsJCXBhcmFtcy0+dl9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXTsKPiArCQlicmVhazsK PiArCj4gKwljYXNlIERSTV9GT1JNQVRfWFlVVjg4ODg6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9 IGZiLT5vZmZzZXRzWzBdICsgMTsKPiArCQlwYXJhbXMtPnVfb2Zmc2V0ID0gZmItPm9mZnNldHNb MF0gKyAyOwo+ICsJCXBhcmFtcy0+dl9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDM7Cj4gKwkJ YnJlYWs7Cj4gIAl9Cj4gLQo+IC0JY29udmVydF9zcmNfcHV0KGN2dCwgYnVmKTsKPiAgfQo+ICAK PiAtc3RhdGljIHZvaWQgY29udmVydF95dXY0NDRfdG9fcmdiMjQoc3RydWN0IGZiX2NvbnZlcnQg KmN2dCkKPiArc3RhdGljIHZvaWQgY29udmVydF95dXZfdG9fcmdiMjQoc3RydWN0IGZiX2NvbnZl cnQgKmN2dCkKPiAgewo+ICsJY29uc3Qgc3RydWN0IGZvcm1hdF9kZXNjX3N0cnVjdCAqc3JjX2Zt dCA9Cj4gKwkJbG9va3VwX2RybV9mb3JtYXQoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQpOwo+ICAJ aW50IGksIGo7Cj4gLQl1aW50OF90ICp5dXYyNDsKPiArCXVpbnQ4X3QgYnBwID0gNDsKPiArCXVp bnQ4X3QgKnksICp1LCAqdjsKPiAgCXVpbnQ4X3QgKnJnYjI0ID0gY3Z0LT5kc3QucHRyOwo+IC0J dW5zaWduZWQgcmdiMjRfc3RyaWRlID0gY3Z0LT5kc3QuZmItPnN0cmlkZXNbMF0sIHh5dXZfc3Ry aWRlID0gY3Z0LT5zcmMuZmItPnN0cmlkZXNbMF07Cj4gLQl1aW50OF90ICpidWYgPSBtYWxsb2Mo Y3Z0LT5zcmMuZmItPnNpemUpOwo+ICsJdW5zaWduZWQgaW50IHJnYjI0X3N0cmlkZSA9IGN2dC0+ ZHN0LmZiLT5zdHJpZGVzWzBdOwo+ICAJc3RydWN0IGlndF9tYXQ0IG0gPSBpZ3RfeWNiY3JfdG9f cmdiX21hdHJpeChjdnQtPnNyYy5mYi0+Y29sb3JfZW5jb2RpbmcsCj4gIAkJCQkJCSAgICBjdnQt PnNyYy5mYi0+Y29sb3JfcmFuZ2UpOwo+ICsJdWludDhfdCAqYnVmOwo+ICsJc3RydWN0IHl1dl9w YXJhbWV0ZXJzIHBhcmFtcyA9IHsgfTsKPiAgCj4gLQkvKgo+IC0JICogUmVhZGluZyBmcm9tIHRo ZSBCTyBpcyBhd2Z1bGx5IHNsb3cgYmVjYXVzZSBvZiBsYWNrIG9mIHJlYWQgY2FjaGluZywKPiAt CSAqIGl0J3MgZmFzdGVyIHRvIGNvcHkgdGhlIHdob2xlIEJPIHRvIGEgdGVtcG9yYXJ5IGJ1ZmZl ciBhbmQgY29udmVydAo+IC0JICogZnJvbSB0aGVyZS4KPiAtCSAqLwo+IC0JaWd0X21lbWNweV9m cm9tX3djKGJ1ZiwgY3Z0LT5zcmMucHRyICsgY3Z0LT5zcmMuZmItPm9mZnNldHNbMF0sIGN2dC0+ c3JjLmZiLT5zaXplKTsKPiAtCXl1djI0ID0gYnVmOwo+ICsJaWd0X2Fzc2VydChjdnQtPmRzdC5m Yi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1hSR0I4ODg4ICYmCj4gKwkJICAgaWd0X2Zvcm1h dF9pc195dXYoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQpKTsKPiArCj4gKwlidWYgPSBjb252ZXJ0 X3NyY19nZXQoY3Z0KTsKPiArCWdldF95dXZfcGFyYW1ldGVycyhjdnQtPnNyYy5mYiwgJnBhcmFt cyk7Cj4gKwl5ID0gYnVmICsgcGFyYW1zLnlfb2Zmc2V0Owo+ICsJdSA9IGJ1ZiArIHBhcmFtcy51 X29mZnNldDsKPiArCXYgPSBidWYgKyBwYXJhbXMudl9vZmZzZXQ7Cj4gIAo+ICAJZm9yIChpID0g MDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQ7IGkrKykgewo+ICsJCWNvbnN0IHVpbnQ4X3QgKnlf dG1wID0geTsKPiArCQljb25zdCB1aW50OF90ICp1X3RtcCA9IHU7Cj4gKwkJY29uc3QgdWludDhf dCAqdl90bXAgPSB2Owo+ICsJCXVpbnQ4X3QgKnJnYl90bXAgPSByZ2IyNDsKPiArCj4gIAkJZm9y IChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aDsgaisrKSB7Cj4gLQkJCWZsb2F0IHksIHUs IHY7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXY7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2I7 Cj4gLQo+IC0JCQl2ID0geXV2MjRbaSAqIHh5dXZfc3RyaWRlICsgaiAqIDRdOwo+IC0JCQl1ID0g eXV2MjRbaSAqIHh5dXZfc3RyaWRlICsgaiAqIDQgKyAxXTsKPiAtCQkJeSA9IHl1djI0W2kgKiB4 eXV2X3N0cmlkZSArIGogKiA0ICsgMl07Cj4gLQkJCXl1di5kWzBdID0geTsKPiAtCQkJeXV2LmRb MV0gPSB1Owo+IC0JCQl5dXYuZFsyXSA9IHY7Cj4gKwkJCXN0cnVjdCBpZ3RfdmVjNCByZ2IsIHl1 djsKPiArCj4gKwkJCXl1di5kWzBdID0gKnlfdG1wOwo+ICsJCQl5dXYuZFsxXSA9ICp1X3RtcDsK PiArCQkJeXV2LmRbMl0gPSAqdl90bXA7Cj4gIAkJCXl1di5kWzNdID0gMS4wZjsKPiAgCj4gIAkJ CXJnYiA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2KTsKPiArCQkJd3JpdGVfcmdiKHJn Yl90bXAsICZyZ2IpOwo+ICAKPiAtCQkJd3JpdGVfcmdiKCZyZ2IyNFtpICogcmdiMjRfc3RyaWRl ICsgaiAqIDRdLCAmcmdiKTsKPiAtCQl9Cj4gLQl9Cj4gLQo+IC0JZnJlZShidWYpOwo+IC19Cj4g LQo+IC0KPiAtc3RhdGljIHZvaWQgY29udmVydF9yZ2IyNF90b195dXY0NDQoc3RydWN0IGZiX2Nv bnZlcnQgKmN2dCkKPiAtewo+IC0JaW50IGksIGo7Cj4gLQl1aW50OF90ICpyZ2IyNDsKPiAtCXVp bnQ4X3QgKnl1djQ0NCA9IGN2dC0+ZHN0LnB0ciArIGN2dC0+ZHN0LmZiLT5vZmZzZXRzWzBdOwo+ IC0JdW5zaWduZWQgaW50IHJnYjI0X3N0cmlkZSA9IGN2dC0+c3JjLmZiLT5zdHJpZGVzWzBdLCB4 eXV2X3N0cmlkZSA9IGN2dC0+ZHN0LmZiLT5zdHJpZGVzWzBdOwo+IC0Jc3RydWN0IGlndF9tYXQ0 IG0gPSBpZ3RfcmdiX3RvX3ljYmNyX21hdHJpeChjdnQtPmRzdC5mYi0+Y29sb3JfZW5jb2Rpbmcs Cj4gLQkJCQkJCSAgICBjdnQtPmRzdC5mYi0+Y29sb3JfcmFuZ2UpOwo+IC0KPiAtCXJnYjI0ID0g Y3Z0LT5zcmMucHRyOwo+ICsJCQlyZ2JfdG1wICs9IGJwcDsKPiArCQkJeV90bXAgKz0gcGFyYW1z LnlfaW5jOwo+ICAKPiAtCWlndF9hc3NlcnRfZihjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBE Uk1fRk9STUFUX1hZVVY4ODg4LAo+IC0JCSAgICAgIkNvbnZlcnNpb24gbm90IGltcGxlbWVudGVk IGZvciAhWFlVViBwYWNrZWQgZm9ybWF0c1xuIik7Cj4gLQo+IC0JZm9yIChpID0gMDsgaSA8IGN2 dC0+ZHN0LmZiLT5oZWlnaHQ7IGkrKykgewo+IC0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5m Yi0+d2lkdGg7IGorKykgewo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiOwo+IC0JCQlzdHJ1Y3Qg aWd0X3ZlYzQgeXV2Owo+IC0KPiAtCQkJcmVhZF9yZ2IoJnJnYiwgJnJnYjI0W2kgKiByZ2IyNF9z dHJpZGUgKyBqICogNF0pOwo+ICsJCQlpZiAoKHNyY19mbXQtPmhzdWIgPT0gMSkgfHwgKGogJSBz cmNfZm10LT5oc3ViKSkgewo+ICsJCQkJdV90bXAgKz0gcGFyYW1zLnV2X2luYzsKPiArCQkJCXZf dG1wICs9IHBhcmFtcy51dl9pbmM7Cj4gKwkJCX0KPiArCQl9Cj4gIAo+IC0JCQl5dXYgPSBpZ3Rf bWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYik7Cj4gKwkJcmdiMjQgKz0gcmdiMjRfc3RyaWRlOwo+ ICsJCXkgKz0gcGFyYW1zLnlfc3RyaWRlOwo+ICAKPiAtCQkJeXV2NDQ0W2kgKiB4eXV2X3N0cmlk ZSArIGogKiA0XSA9IHl1di5kWzJdOwo+IC0JCQl5dXY0NDRbaSAqIHh5dXZfc3RyaWRlICsgaiAq IDQgKyAxXSA9IHl1di5kWzFdOwo+IC0JCQl5dXY0NDRbaSAqIHh5dXZfc3RyaWRlICsgaiAqIDQg KyAyXSA9IHl1di5kWzBdOwo+ICsJCWlmICgoc3JjX2ZtdC0+dnN1YiA9PSAxKSB8fCAoaSAlIHNy Y19mbXQtPnZzdWIpKSB7Cj4gKwkJCXUgKz0gcGFyYW1zLnV2X3N0cmlkZTsKPiArCQkJdiArPSBw YXJhbXMudXZfc3RyaWRlOwo+ICAJCX0KPiAgCX0KPiArCj4gKwljb252ZXJ0X3NyY19wdXQoY3Z0 LCBidWYpOwo+ICB9Cj4gIAo+IC1zdGF0aWMgdm9pZCBjb252ZXJ0X3JnYjI0X3RvX252MTIoc3Ry dWN0IGZiX2NvbnZlcnQgKmN2dCkKPiArc3RhdGljIHZvaWQgY29udmVydF9yZ2IyNF90b195dXYo c3RydWN0IGZiX2NvbnZlcnQgKmN2dCkKPiAgewo+ICsJY29uc3Qgc3RydWN0IGZvcm1hdF9kZXNj X3N0cnVjdCAqZHN0X2ZtdCA9Cj4gKwkJbG9va3VwX2RybV9mb3JtYXQoY3Z0LT5kc3QuZmItPmRy bV9mb3JtYXQpOwo+ICAJaW50IGksIGo7Cj4gLQl1aW50OF90ICp5ID0gY3Z0LT5kc3QucHRyICsg Y3Z0LT5kc3QuZmItPm9mZnNldHNbMF07Cj4gLQl1aW50OF90ICp1diA9IGN2dC0+ZHN0LnB0ciAr IGN2dC0+ZHN0LmZiLT5vZmZzZXRzWzFdOwo+ICsJdWludDhfdCAqeSwgKnUsICp2Owo+ICAJY29u c3QgdWludDhfdCAqcmdiMjQgPSBjdnQtPnNyYy5wdHI7Cj4gKwl1aW50OF90IGJwcCA9IDQ7Cj4g IAl1bnNpZ25lZCByZ2IyNF9zdHJpZGUgPSBjdnQtPnNyYy5mYi0+c3RyaWRlc1swXTsKPiAtCXVu c2lnbmVkIHBsYW5hcl9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXTsKPiAgCXN0cnVj dCBpZ3RfbWF0NCBtID0gaWd0X3JnYl90b195Y2Jjcl9tYXRyaXgoY3Z0LT5kc3QuZmItPmNvbG9y X2VuY29kaW5nLAo+ICAJCQkJCQkgICAgY3Z0LT5kc3QuZmItPmNvbG9yX3JhbmdlKTsKPiArCXN0 cnVjdCB5dXZfcGFyYW1ldGVycyBwYXJhbXMgPSB7IH07Cj4gIAo+ICAJaWd0X2Fzc2VydChjdnQt PnNyYy5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1hSR0I4ODg4ICYmCj4gLQkJICAgY3Z0 LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9OVjEyKTsKPiArCQkgICBpZ3RfZm9y bWF0X2lzX3l1dihjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCkpOwo+ICAKPiAtCWZvciAoaSA9IDA7 IGkgPCBjdnQtPmRzdC5mYi0+aGVpZ2h0IC8gMjsgaSsrKSB7Cj4gLQkJZm9yIChqID0gMDsgaiA8 IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewo+IC0JCQkvKiBDb252ZXJ0IDJ4MiBwaXhl bCBibG9ja3MgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYls0XTsKPiAtCQkJc3RydWN0IGln dF92ZWM0IHl1dls0XTsKPiArCWdldF95dXZfcGFyYW1ldGVycyhjdnQtPmRzdC5mYiwgJnBhcmFt cyk7Cj4gKwl5ID0gY3Z0LT5kc3QucHRyICsgcGFyYW1zLnlfb2Zmc2V0Owo+ICsJdSA9IGN2dC0+ ZHN0LnB0ciArIHBhcmFtcy51X29mZnNldDsKPiArCXYgPSBjdnQtPmRzdC5wdHIgKyBwYXJhbXMu dl9vZmZzZXQ7Cj4gIAo+IC0JCQlyZWFkX3JnYigmcmdiWzBdLCAmcmdiMjRbaiAqIDggKyAwXSk7 Cj4gLQkJCXJlYWRfcmdiKCZyZ2JbMV0sICZyZ2IyNFtqICogOCArIDRdKTsKPiAtCQkJcmVhZF9y Z2IoJnJnYlsyXSwgJnJnYjI0W2ogKiA4ICsgMCArIHJnYjI0X3N0cmlkZV0pOwo+IC0JCQlyZWFk X3JnYigmcmdiWzNdLCAmcmdiMjRbaiAqIDggKyA0ICsgcmdiMjRfc3RyaWRlXSk7Cj4gLQo+IC0J CQl5dXZbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlswXSk7Cj4gLQkJCXl1dlsx XSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzFdKTsKPiAtCQkJeXV2WzJdID0gaWd0 X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbMl0pOwo+IC0JCQl5dXZbM10gPSBpZ3RfbWF0cml4 X3RyYW5zZm9ybSgmbSwgJnJnYlszXSk7Cj4gLQo+IC0JCQl5W2ogKiAyICsgMF0gPSB5dXZbMF0u ZFswXTsKPiAtCQkJeVtqICogMiArIDFdID0geXV2WzFdLmRbMF07Cj4gLQkJCXlbaiAqIDIgKyAw ICsgcGxhbmFyX3N0cmlkZV0gPSB5dXZbMl0uZFswXTsKPiAtCQkJeVtqICogMiArIDEgKyBwbGFu YXJfc3RyaWRlXSA9IHl1dlszXS5kWzBdOwo+ICsJZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZi LT5oZWlnaHQ7IGkrKykgewo+ICsJCWNvbnN0IHVpbnQ4X3QgKnJnYl90bXAgPSByZ2IyNDsKPiAr CQl1aW50OF90ICp5X3RtcCA9IHk7Cj4gKwkJdWludDhfdCAqdV90bXAgPSB1Owo+ICsJCXVpbnQ4 X3QgKnZfdG1wID0gdjsKPiAgCj4gLQkJCS8qCj4gLQkJCSAqIFdlIGFzc3VtZSB0aGUgTVBFRzIg Y2hyb21hIHNpdGluZyBjb252ZW50aW9uLCB3aGVyZQo+IC0JCQkgKiBwaXhlbCBjZW50ZXIgZm9y IENiJ0NyJyBpcyBiZXR3ZWVuIHRoZSBsZWZ0IHRvcCBhbmQKPiAtCQkJICogYm90dG9tIHBpeGVs IGluIGEgMngyIGJsb2NrLCBzbyB0YWtlIHRoZSBhdmVyYWdlLgo+IC0JCQkgKi8KPiAtCQkJdXZb aiAqIDIgKyAwXSA9ICh5dXZbMF0uZFsxXSArIHl1dlsyXS5kWzFdKSAvIDIuMGY7Cj4gLQkJCXV2 W2ogKiAyICsgMV0gPSAoeXV2WzBdLmRbMl0gKyB5dXZbMl0uZFsyXSkgLyAyLjBmOwo+IC0JCX0K PiArCQlmb3IgKGogPSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRoOyBqKyspIHsKPiArCQkJY29u c3QgdWludDhfdCAqcGFpcl9yZ2IyNCA9IHJnYl90bXA7Cj4gKwkJCXN0cnVjdCBpZ3RfdmVjNCBw YWlyX3JnYiwgcmdiOwo+ICsJCQlzdHJ1Y3QgaWd0X3ZlYzQgcGFpcl95dXYsIHl1djsKPiAgCj4g LQkJaWYgKGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEpIHsKPiAtCQkJLyogQ29udmVydCAxeDIgcGl4 ZWwgYmxvY2sgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYlsyXTsKPiAtCQkJc3RydWN0IGln dF92ZWM0IHl1dlsyXTsKPiArCQkJcmVhZF9yZ2IoJnJnYiwgcmdiX3RtcCk7Cj4gKwkJCXl1diA9 IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiKTsKPiAgCj4gLQkJCXJlYWRfcmdiKCZyZ2Jb MF0sICZyZ2IyNFtqICogOCArIDBdKTsKPiAtCQkJcmVhZF9yZ2IoJnJnYlsxXSwgJnJnYjI0W2og KiA4ICsgMCArIHJnYjI0X3N0cmlkZV0pOwo+ICsJCQlyZ2JfdG1wICs9IGJwcDsKPiAgCj4gLQkJ CXl1dlswXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzBdKTsKPiAtCQkJeXV2WzFd ID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbMV0pOwo+ICsJCQkqeV90bXAgPSB5dXYu ZFswXTsKPiArCQkJeV90bXAgKz0gcGFyYW1zLnlfaW5jOwo+ICAKPiAtCQkJeVtqICogMiArIDBd ID0geXV2WzBdLmRbMF07Cj4gLQkJCXlbaiAqIDIgKyAwICsgcGxhbmFyX3N0cmlkZV0gPSB5dXZb MV0uZFswXTsKPiArCQkJaWYgKChpICUgZHN0X2ZtdC0+dnN1YikgfHwgKGogJSBkc3RfZm10LT5o c3ViKSkKPiArCQkJCWNvbnRpbnVlOwo+ICAKPiAgCQkJLyoKPiAgCQkJICogV2UgYXNzdW1lIHRo ZSBNUEVHMiBjaHJvbWEgc2l0aW5nIGNvbnZlbnRpb24sIHdoZXJlCj4gIAkJCSAqIHBpeGVsIGNl bnRlciBmb3IgQ2InQ3InIGlzIGJldHdlZW4gdGhlIGxlZnQgdG9wIGFuZAo+ICAJCQkgKiBib3R0 b20gcGl4ZWwgaW4gYSAyeDIgYmxvY2ssIHNvIHRha2UgdGhlIGF2ZXJhZ2UuCj4gKwkJCSAqCj4g KwkJCSAqIFRoZXJlZm9yZSwgaWYgd2UgdXNlIHN1YnNhbXBsaW5nLCB3ZSBvbmx5IHJlYWxseSBj YXJlCj4gKwkJCSAqIGFib3V0IHR3byBwaXhlbHMgYWxsIHRoZSB0aW1lLCBlaXRoZXIgdGhlIHR3 bwo+ICsJCQkgKiBzdWJzZXF1ZW50IHBpeGVscyBob3Jpem9udGFsbHksIHZlcnRpY2FsbHksIG9y IHRoZQo+ICsJCQkgKiB0d28gY29ybmVycyBpbiBhIDJ4MiBibG9jay4KPiArCQkJICoKPiArCQkJ ICogVGhlIG9ubHkgY29ybmVyIGNhc2UgaXMgd2hlbiB3ZSBoYXZlIGFuIG9kZCBudW1iZXIgb2YK PiArCQkJICogcGl4ZWxzLCBidXQgdGhpcyBjYW4gYmUgaGFuZGxlZCBwcmV0dHkgZWFzaWx5IGJ5 IG5vdAo+ICsJCQkgKiBpbmNyZW1lbnRpbmcgdGhlIHBhaXJlZCBwaXhlbCBwb2ludGVyIGluIHRo ZQo+ICsJCQkgKiBkaXJlY3Rpb24gaXQncyBvZGQgaW4uCj4gIAkJCSAqLwo+IC0JCQl1dltqICog MiArIDBdID0gKHl1dlswXS5kWzFdICsgeXV2WzFdLmRbMV0pIC8gMi4wZjsKPiAtCQkJdXZbaiAq IDIgKyAxXSA9ICh5dXZbMF0uZFsyXSArIHl1dlsxXS5kWzJdKSAvIDIuMGY7Cj4gLQkJfQo+IC0K PiAtCQlyZ2IyNCArPSAyICogcmdiMjRfc3RyaWRlOwo+IC0JCXkgKz0gMiAqIHBsYW5hcl9zdHJp ZGU7Cj4gLQkJdXYgKz0gcGxhbmFyX3N0cmlkZTsKPiAtCX0KPiAtCj4gLQkvKiBMYXN0IHJvdyBj YW5ub3QgYmUgaW50ZXJwb2xhdGVkIGJldHdlZW4gMiBwaXhlbHMsIHRha2UgdGhlIHNpbmdsZSB2 YWx1ZSAqLwo+IC0JaWYgKGN2dC0+ZHN0LmZiLT5oZWlnaHQgJiAxKSB7Cj4gLQkJZm9yIChqID0g MDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewo+IC0JCQkvKiBDb252ZXJ0IDJ4 MSBwaXhlbCBibG9ja3MgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYlsyXTsKPiAtCQkJc3Ry dWN0IGlndF92ZWM0IHl1dlsyXTsKPiAtCj4gLQkJCXJlYWRfcmdiKCZyZ2JbMF0sICZyZ2IyNFtq ICogOCArIDBdKTsKPiAtCQkJcmVhZF9yZ2IoJnJnYlsxXSwgJnJnYjI0W2ogKiA4ICsgNF0pOwo+ IC0KPiAtCQkJeXV2WzBdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbMF0pOwo+IC0J CQl5dXZbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlsxXSk7Cj4gKwkJCWlmIChq ICE9IChjdnQtPmRzdC5mYi0+d2lkdGggLSAxKSkKPiArCQkJCXBhaXJfcmdiMjQgKz0gKGRzdF9m bXQtPmhzdWIgLSAxKSAqIGJwcDsKPiAgCj4gLQkJCXlbaiAqIDIgKyAwXSA9IHl1dlswXS5kWzBd Owo+IC0JCQl5W2ogKiAyICsgMV0gPSB5dXZbMV0uZFswXTsKPiAtCQkJdXZbaiAqIDIgKyAwXSA9 IHl1dlswXS5kWzFdOwo+IC0JCQl1dltqICogMiArIDFdID0geXV2WzBdLmRbMl07Cj4gLQkJfQo+ IC0KPiAtCQlpZiAoY3Z0LT5kc3QuZmItPndpZHRoICYgMSkgewo+IC0JCQkvKiBDb252ZXJ0IHNp bmdsZSBwaXhlbCAqLwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiOwo+IC0JCQlzdHJ1Y3QgaWd0 X3ZlYzQgeXV2Owo+ICsJCQlpZiAoaSAhPSAoY3Z0LT5kc3QuZmItPmhlaWdodCAtIDEpKQo+ICsJ CQkJcGFpcl9yZ2IyNCArPSByZ2IyNF9zdHJpZGUgKiAoZHN0X2ZtdC0+dnN1YiAtIDEpOwo+ICAK PiAtCQkJcmVhZF9yZ2IoJnJnYiwgJnJnYjI0W2ogKiA4ICsgMF0pOwo+ICsJCQlyZWFkX3JnYigm cGFpcl9yZ2IsIHBhaXJfcmdiMjQpOwo+ICsJCQlwYWlyX3l1diA9IGlndF9tYXRyaXhfdHJhbnNm b3JtKCZtLCAmcGFpcl9yZ2IpOwo+ICAKPiAtCQkJeXV2ID0gaWd0X21hdHJpeF90cmFuc2Zvcm0o Jm0sICZyZ2IpOwo+ICsJCQkqdV90bXAgPSAoeXV2LmRbMV0gKyBwYWlyX3l1di5kWzFdKSAvIDIu MGY7Cj4gKwkJCSp2X3RtcCA9ICh5dXYuZFsyXSArIHBhaXJfeXV2LmRbMl0pIC8gMi4wZjsKPiAg Cj4gLQkJCXlbaiAqIDIgKyAwXSA9IHl1di5kWzBdOwo+IC0JCQl1dltqICogMiArIDBdID0geXV2 LmRbMV07Cj4gLQkJCXV2W2ogKiAyICsgMV0gPSB5dXYuZFsyXTsKPiAtCQl9Cj4gLQl9Cj4gLX0K PiAtCj4gLS8qIHsgWTAsIFUsIFkxLCBWIH0gKi8KPiAtc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNo YXIgc3dpenpsZV95dXl2W10gPSB7IDAsIDEsIDIsIDMgfTsKPiAtc3RhdGljIGNvbnN0IHVuc2ln bmVkIGNoYXIgc3dpenpsZV95dnl1W10gPSB7IDAsIDMsIDIsIDEgfTsKPiAtc3RhdGljIGNvbnN0 IHVuc2lnbmVkIGNoYXIgc3dpenpsZV91eXZ5W10gPSB7IDEsIDAsIDMsIDIgfTsKPiAtc3RhdGlj IGNvbnN0IHVuc2lnbmVkIGNoYXIgc3dpenpsZV92eXV5W10gPSB7IDEsIDIsIDMsIDAgfTsKPiAt Cj4gLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICp5dXl2X3N3aXp6bGUodWludDMyX3QgZm9y bWF0KQo+IC17Cj4gLQlzd2l0Y2ggKGZvcm1hdCkgewo+IC0JZGVmYXVsdDoKPiAtCWNhc2UgRFJN X0ZPUk1BVF9ZVVlWOgo+IC0JCXJldHVybiBzd2l6emxlX3l1eXY7Cj4gLQljYXNlIERSTV9GT1JN QVRfWVZZVToKPiAtCQlyZXR1cm4gc3dpenpsZV95dnl1Owo+IC0JY2FzZSBEUk1fRk9STUFUX1VZ Vlk6Cj4gLQkJcmV0dXJuIHN3aXp6bGVfdXl2eTsKPiAtCWNhc2UgRFJNX0ZPUk1BVF9WWVVZOgo+ IC0JCXJldHVybiBzd2l6emxlX3Z5dXk7Cj4gLQl9Cj4gLX0KPiAtCj4gLXN0YXRpYyB2b2lkIGNv bnZlcnRfeXV5dl90b19yZ2IyNChzdHJ1Y3QgZmJfY29udmVydCAqY3Z0KQo+IC17Cj4gLQlpbnQg aSwgajsKPiAtCWNvbnN0IHVpbnQ4X3QgKnl1eXY7Cj4gLQl1aW50OF90ICpyZ2IyNCA9IGN2dC0+ ZHN0LnB0cjsKPiAtCXVuc2lnbmVkIGludCByZ2IyNF9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3Ry aWRlc1swXTsKPiAtCXVuc2lnbmVkIGludCB5dXl2X3N0cmlkZSA9IGN2dC0+c3JjLmZiLT5zdHJp ZGVzWzBdOwo+IC0Jc3RydWN0IGlndF9tYXQ0IG0gPSBpZ3RfeWNiY3JfdG9fcmdiX21hdHJpeChj dnQtPnNyYy5mYi0+Y29sb3JfZW5jb2RpbmcsCj4gLQkJCQkJCSAgICBjdnQtPnNyYy5mYi0+Y29s b3JfcmFuZ2UpOwo+IC0JY29uc3QgdW5zaWduZWQgY2hhciAqc3d6ID0geXV5dl9zd2l6emxlKGN2 dC0+c3JjLmZiLT5kcm1fZm9ybWF0KTsKPiAtCXVpbnQ4X3QgKmJ1ZjsKPiAtCj4gLQlpZ3RfYXNz ZXJ0KChjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1lVWVYgfHwKPiAtCQkg ICAgY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9VWVZZIHx8Cj4gLQkJICAg IGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfWVZZVSB8fAo+IC0JCSAgICBj dnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1ZZVVkpICYmCj4gLQkJICAgY3Z0 LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YUkdCODg4OCk7Cj4gLQo+IC0JYnVm ID0gY29udmVydF9zcmNfZ2V0KGN2dCk7Cj4gLQl5dXl2ID0gYnVmOwo+IC0KPiAtCWZvciAoaSA9 IDA7IGkgPCBjdnQtPmRzdC5mYi0+aGVpZ2h0OyBpKyspIHsKPiAtCQlmb3IgKGogPSAwOyBqIDwg Y3Z0LT5kc3QuZmItPndpZHRoIC8gMjsgaisrKSB7Cj4gLQkJCS8qIENvbnZlcnQgMngxIHBpeGVs IGJsb2NrcyAqLwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzJdOwo+IC0JCQlzdHJ1Y3QgaWd0 X3ZlYzQgcmdiWzJdOwo+IC0KPiAtCQkJeXV2WzBdLmRbMF0gPSB5dXl2W2ogKiA0ICsgc3d6WzBd XTsKPiAtCQkJeXV2WzFdLmRbMF0gPSB5dXl2W2ogKiA0ICsgc3d6WzJdXTsKPiAtCQkJeXV2WzBd LmRbMV0gPSB5dXZbMV0uZFsxXSA9IHl1eXZbaiAqIDQgKyBzd3pbMV1dOwo+IC0JCQl5dXZbMF0u ZFsyXSA9IHl1dlsxXS5kWzJdID0geXV5dltqICogNCArIHN3elszXV07Cj4gLQkJCXl1dlswXS5k WzNdID0geXV2WzFdLmRbM10gPSAxLjBmOwo+IC0KPiAtCQkJcmdiWzBdID0gaWd0X21hdHJpeF90 cmFuc2Zvcm0oJm0sICZ5dXZbMF0pOwo+IC0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9y bSgmbSwgJnl1dlsxXSk7Cj4gLQo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZy Z2JbMF0pOwo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgNF0sICZyZ2JbMV0pOwo+IC0J CX0KPiAtCj4gLQkJaWYgKGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEpIHsKPiAtCQkJc3RydWN0IGln dF92ZWM0IHl1djsKPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYjsKPiAtCj4gLQkJCXl1di5kWzBd ID0geXV5dltqICogNCArIHN3elswXV07Cj4gLQkJCXl1di5kWzFdID0geXV5dltqICogNCArIHN3 elsxXV07Cj4gLQkJCXl1di5kWzJdID0geXV5dltqICogNCArIHN3elszXV07Cj4gLQkJCXl1di5k WzNdID0gMS4wZjsKPiAtCj4gLQkJCXJnYiA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2 KTsKPiAtCj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyAwXSwgJnJnYik7Cj4gKwkJCXVf dG1wICs9IHBhcmFtcy51dl9pbmM7Cj4gKwkJCXZfdG1wICs9IHBhcmFtcy51dl9pbmM7Cj4gIAkJ fQo+ICAKPiAgCQlyZ2IyNCArPSByZ2IyNF9zdHJpZGU7Cj4gLQkJeXV5diArPSB5dXl2X3N0cmlk ZTsKPiAtCX0KPiAtCj4gLQljb252ZXJ0X3NyY19wdXQoY3Z0LCBidWYpOwo+IC19Cj4gLQo+IC1z dGF0aWMgdm9pZCBjb252ZXJ0X3JnYjI0X3RvX3l1eXYoc3RydWN0IGZiX2NvbnZlcnQgKmN2dCkK PiAtewo+IC0JaW50IGksIGo7Cj4gLQl1aW50OF90ICp5dXl2ID0gY3Z0LT5kc3QucHRyOwo+IC0J Y29uc3QgdWludDhfdCAqcmdiMjQgPSBjdnQtPnNyYy5wdHI7Cj4gLQl1bnNpZ25lZCByZ2IyNF9z dHJpZGUgPSBjdnQtPnNyYy5mYi0+c3RyaWRlc1swXTsKPiAtCXVuc2lnbmVkIHl1eXZfc3RyaWRl ID0gY3Z0LT5kc3QuZmItPnN0cmlkZXNbMF07Cj4gLQlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF9y Z2JfdG9feWNiY3JfbWF0cml4KGN2dC0+ZHN0LmZiLT5jb2xvcl9lbmNvZGluZywKPiAtCQkJCQkJ ICAgIGN2dC0+ZHN0LmZiLT5jb2xvcl9yYW5nZSk7Cj4gLQljb25zdCB1bnNpZ25lZCBjaGFyICpz d3ogPSB5dXl2X3N3aXp6bGUoY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQpOwo+IC0KPiAtCWlndF9h c3NlcnQoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YUkdCODg4OCAmJgo+ IC0JCSAgIChjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1lVWVYgfHwKPiAt CQkgICAgY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9VWVZZIHx8Cj4gLQkJ ICAgIGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfWVZZVSB8fAo+IC0JCSAg ICBjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1ZZVVkpKTsKPiAtCj4gLQlm b3IgKGkgPSAwOyBpIDwgY3Z0LT5kc3QuZmItPmhlaWdodDsgaSsrKSB7Cj4gLQkJZm9yIChqID0g MDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewo+IC0JCQkvKiBDb252ZXJ0IDJ4 MSBwaXhlbCBibG9ja3MgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYlsyXTsKPiAtCQkJc3Ry dWN0IGlndF92ZWM0IHl1dlsyXTsKPiAtCj4gLQkJCXJlYWRfcmdiKCZyZ2JbMF0sICZyZ2IyNFtq ICogOCArIDBdKTsKPiAtCQkJcmVhZF9yZ2IoJnJnYlsxXSwgJnJnYjI0W2ogKiA4ICsgNF0pOwo+ IC0KPiAtCQkJeXV2WzBdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbMF0pOwo+IC0J CQl5dXZbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlsxXSk7Cj4gKwkJeSArPSBw YXJhbXMueV9zdHJpZGU7Cj4gIAo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzBdXSA9IHl1dlswXS5k WzBdOwo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzJdXSA9IHl1dlsxXS5kWzBdOwo+IC0JCQl5dXl2 W2ogKiA0ICsgc3d6WzFdXSA9ICh5dXZbMF0uZFsxXSArIHl1dlsxXS5kWzFdKSAvIDIuMGY7Cj4g LQkJCXl1eXZbaiAqIDQgKyBzd3pbM11dID0gKHl1dlswXS5kWzJdICsgeXV2WzFdLmRbMl0pIC8g Mi4wZjsKPiArCQlpZiAoKGkgJSBkc3RfZm10LT52c3ViKSA9PSAoZHN0X2ZtdC0+dnN1YiAtIDEp KSB7Cj4gKwkJCXUgKz0gcGFyYW1zLnV2X3N0cmlkZTsKPiArCQkJdiArPSBwYXJhbXMudXZfc3Ry aWRlOwo+ICAJCX0KPiAtCj4gLQkJaWYgKGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEpIHsKPiAtCQkJ c3RydWN0IGlndF92ZWM0IHJnYjsKPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1djsKPiAtCj4gLQkJ CXJlYWRfcmdiKCZyZ2IsICZyZ2IyNFtqICogOCArIDBdKTsKPiAtCj4gLQkJCXl1diA9IGlndF9t YXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiKTsKPiAtCj4gLQkJCXl1eXZbaiAqIDQgKyBzd3pbMF1d ID0geXV2LmRbMF07Cj4gLQkJCXl1eXZbaiAqIDQgKyBzd3pbMV1dID0geXV2LmRbMV07Cj4gLQkJ CXl1eXZbaiAqIDQgKyBzd3pbM11dID0geXV2LmRbMl07Cj4gLQkJfQo+IC0KPiAtCQlyZ2IyNCAr PSByZ2IyNF9zdHJpZGU7Cj4gLQkJeXV5diArPSB5dXl2X3N0cmlkZTsKPiAgCX0KPiAgfQo+ICAK PiBAQCAtMjA0NiwzMSArMTg1OSwyMyBAQCBzdGF0aWMgdm9pZCBmYl9jb252ZXJ0KHN0cnVjdCBm Yl9jb252ZXJ0ICpjdnQpCj4gIAl9IGVsc2UgaWYgKGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09 IERSTV9GT1JNQVRfWFJHQjg4ODgpIHsKPiAgCQlzd2l0Y2ggKGN2dC0+c3JjLmZiLT5kcm1fZm9y bWF0KSB7Cj4gIAkJY2FzZSBEUk1fRk9STUFUX1hZVVY4ODg4Ogo+IC0JCQljb252ZXJ0X3l1djQ0 NF90b19yZ2IyNChjdnQpOwo+IC0JCQlyZXR1cm47Cj4gIAkJY2FzZSBEUk1fRk9STUFUX05WMTI6 Cj4gLQkJCWNvbnZlcnRfbnYxMl90b19yZ2IyNChjdnQpOwo+IC0JCQlyZXR1cm47Cj4gLQkJY2Fz ZSBEUk1fRk9STUFUX1lVWVY6Cj4gLQkJY2FzZSBEUk1fRk9STUFUX1lWWVU6Cj4gIAkJY2FzZSBE Uk1fRk9STUFUX1VZVlk6Cj4gIAkJY2FzZSBEUk1fRk9STUFUX1ZZVVk6Cj4gLQkJCWNvbnZlcnRf eXV5dl90b19yZ2IyNChjdnQpOwo+ICsJCWNhc2UgRFJNX0ZPUk1BVF9ZVVlWOgo+ICsJCWNhc2Ug RFJNX0ZPUk1BVF9ZVllVOgo+ICsJCQljb252ZXJ0X3l1dl90b19yZ2IyNChjdnQpOwo+ICAJCQly ZXR1cm47Cj4gIAkJfQo+ICAJfSBlbHNlIGlmIChjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCA9PSBE Uk1fRk9STUFUX1hSR0I4ODg4KSB7Cj4gIAkJc3dpdGNoIChjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1h dCkgewo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9YWVVWODg4ODoKPiAtCQkJY29udmVydF9yZ2IyNF90 b195dXY0NDQoY3Z0KTsKPiAtCQkJcmV0dXJuOwo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9OVjEyOgo+ IC0JCQljb252ZXJ0X3JnYjI0X3RvX252MTIoY3Z0KTsKPiAtCQkJcmV0dXJuOwo+ICAJCWNhc2Ug RFJNX0ZPUk1BVF9ZVVlWOgo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9ZVllVOgo+ICAJCWNhc2UgRFJN X0ZPUk1BVF9VWVZZOgo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9WWVVZOgo+IC0JCQljb252ZXJ0X3Jn YjI0X3RvX3l1eXYoY3Z0KTsKPiArCQkJY29udmVydF9yZ2IyNF90b195dXYoY3Z0KTsKPiAgCQkJ cmV0dXJuOwo+ICAJCX0KPiAgCX0KLS0gClBhdWwgS29jaWFsa293c2tpLCBCb290bGluCkVtYmVk ZGVkIExpbnV4IGFuZCBrZXJuZWwgZW5naW5lZXJpbmcKaHR0cHM6Ly9ib290bGluLmNvbQoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KaWd0LWRldiBtYWls aW5nIGxpc3QKaWd0LWRldkBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pZ3QtZGV2Cg==