From mboxrd@z Thu Jan 1 00:00:00 1970 From: stranche@codeaurora.org Subject: Re: [PATCH net] af_key: free SKBs under RCU protection Date: Fri, 21 Sep 2018 12:44:23 -0600 Message-ID: References: <1537402712-12875-1-git-send-email-stranche@codeaurora.org> <6d194ac2-15e8-76d7-31d0-b4c4eed68d5a@gmail.com> <357e28c3fa0c7bacaffde4e960f58a87@codeaurora.org> <82b2ac27-0f61-3be6-b09e-ec31cf95881f@gmail.com> <6f2e6b62-42dc-f2b3-3758-29f5338f1185@gmail.com> <56017947-4712-6014-4625-79dc7555c880@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=_7312e1fee1655bdb907677739ab76ca0" Cc: netdev@vger.kernel.org, steffen.klassert@secunet.com To: Eric Dumazet Return-path: Received: from smtp.codeaurora.org ([198.145.29.96]:56360 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732114AbeIVAeh (ORCPT ); Fri, 21 Sep 2018 20:34:37 -0400 In-Reply-To: <56017947-4712-6014-4625-79dc7555c880@gmail.com> Sender: netdev-owner@vger.kernel.org List-ID: --=_7312e1fee1655bdb907677739ab76ca0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On 2018-09-21 11:40, Eric Dumazet wrote: > On 09/21/2018 10:09 AM, stranche@codeaurora.org wrote: > >> I also tried reverting 7f6b9dbd5afb ("af_key: locking change") and >> running the >> test there and I still see the crash, so it doesn't seem to be an RCU >> specific >> issue. >> >> Is there anything else that could be causing this? > > What about you share your repro ? Sure. Syzkaller reproducer source is attached. --=_7312e1fee1655bdb907677739ab76ca0 Content-Transfer-Encoding: base64 Content-Type: text/x-c; name=KASAN_use-after-free_Read_in_sock_rfree.c Content-Disposition: attachment; filename=KASAN_use-after-free_Read_in_sock_rfree.c; size=32898 Ly8gYXV0b2dlbmVyYXRlZCBieSBzeXprYWxsZXIgKGh0dHA6Ly9naXRodWIuY29tL2dvb2dsZS9z eXprYWxsZXIpDQoNCiNkZWZpbmUgX0dOVV9TT1VSQ0UNCiNpbmNsdWRlIDxlbmRpYW4uaD4NCiNp bmNsdWRlIDxzeXMvc3lzY2FsbC5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KI2luY2x1ZGUgPGxp bnV4L2Z1dGV4Lmg+DQojaW5jbHVkZSA8cHRocmVhZC5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0K I2luY2x1ZGUgPGVycm5vLmg+DQojaW5jbHVkZSA8c2lnbmFsLmg+DQojaW5jbHVkZSA8c3RkYXJn Lmg+DQojaW5jbHVkZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxzeXMvdGltZS5oPg0KI2luY2x1ZGUg PHN5cy93YWl0Lmg+DQojaW5jbHVkZSA8dGltZS5oPg0KI2luY2x1ZGUgPHN5cy9wcmN0bC5oPg0K I2luY2x1ZGUgPGRpcmVudC5oPg0KI2luY2x1ZGUgPHN5cy9tb3VudC5oPg0KI2luY2x1ZGUgPGVy cm5vLmg+DQojaW5jbHVkZSA8c2NoZWQuaD4NCiNpbmNsdWRlIDxzaWduYWwuaD4NCiNpbmNsdWRl IDxzdGRhcmcuaD4NCiNpbmNsdWRlIDxzdGRib29sLmg+DQojaW5jbHVkZSA8c3RkaW8uaD4NCiNp bmNsdWRlIDxzeXMvcHJjdGwuaD4NCiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4NCiNpbmNsdWRl IDxzeXMvdGltZS5oPg0KI2luY2x1ZGUgPHN5cy93YWl0Lmg+DQojaW5jbHVkZSA8ZXJybm8uaD4N CiNpbmNsdWRlIDxmY250bC5oPg0KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+DQojaW5jbHVkZSA8c3lz L3R5cGVzLmg+DQojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+DQojaW5jbHVkZSA8ZXJybm8uaD4NCiNp bmNsdWRlIDxmY250bC5oPg0KI2luY2x1ZGUgPGxpbnV4L2lmLmg+DQojaW5jbHVkZSA8bGludXgv aWZfZXRoZXIuaD4NCiNpbmNsdWRlIDxsaW51eC9pZl90dW4uaD4NCiNpbmNsdWRlIDxsaW51eC9p cC5oPg0KI2luY2x1ZGUgPGxpbnV4L3RjcC5oPg0KI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4NCiNp bmNsdWRlIDxzdGRhcmcuaD4NCiNpbmNsdWRlIDxzdGRib29sLmg+DQojaW5jbHVkZSA8c3RkaW8u aD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4NCiNpbmNsdWRl IDxzeXMvc3RhdC5oPg0KI2luY2x1ZGUgPHN5cy91aW8uaD4NCiNpbmNsdWRlIDxsaW51eC9uZXQu aD4NCiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2lu Y2x1ZGUgPHN5cy9tb3VudC5oPg0KDQpfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIHN0YXRpYyB2 b2lkIGRvZXhpdChpbnQgc3RhdHVzKSB7DQogIHZvbGF0aWxlIHVuc2lnbmVkIGk7DQogIHN5c2Nh bGwoX19OUl9leGl0X2dyb3VwLCBzdGF0dXMpOw0KICBmb3IgKGkgPSAwOzsgaSsrKSB7DQogIH0N Cn0NCiNpbmNsdWRlIDxzdGRpbnQuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNsdWRlIDxl cnJuby5oPg0KI2luY2x1ZGUgPHN0ZGFyZy5oPg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVk ZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8c3lzL3N0YXQuaD4NCiNpbmNsdWRlIDxzZXRqbXAuaD4N CiNpbmNsdWRlIDxzaWduYWwuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCg0KY29uc3QgaW50IGtG YWlsU3RhdHVzID0gNjc7DQpjb25zdCBpbnQga1JldHJ5U3RhdHVzID0gNjk7DQoNCiAgc3RhdGlj IHZvaWQgZmFpbChjb25zdCBjaGFyKiBtc2csIC4uLikgew0KICBpbnQgZSA9IGVycm5vOw0KICB2 YV9saXN0IGFyZ3M7DQogIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7DQogIHZmcHJpbnRmKHN0ZGVyciwg bXNnLCBhcmdzKTsNCiAgdmFfZW5kKGFyZ3MpOw0KICBmcHJpbnRmKHN0ZGVyciwgIiAoZXJybm8g JWQpXG4iLCBlKTsNCiAgZG9leGl0KChlID09IEVOT01FTSB8fCBlID09IEVBR0FJTikgPyBrUmV0 cnlTdGF0dXMgOiBrRmFpbFN0YXR1cyk7DQp9DQoNCiAgc3RhdGljIHZvaWQgZXhpdGYoY29uc3Qg Y2hhciogbXNnLCAuLi4pIHsNCiAgaW50IGUgPSBlcnJubzsNCiAgdmFfbGlzdCBhcmdzOw0KICB2 YV9zdGFydChhcmdzLCBtc2cpOw0KICB2ZnByaW50ZihzdGRlcnIsIG1zZywgYXJncyk7DQogIHZh X2VuZChhcmdzKTsNCiAgZnByaW50ZihzdGRlcnIsICIgKGVycm5vICVkKVxuIiwgZSk7DQogIGRv ZXhpdChrUmV0cnlTdGF0dXMpOw0KfQ0KDQpzdGF0aWMgX190aHJlYWQgaW50IHNraXBfc2VndjsN CnN0YXRpYyBfX3RocmVhZCBqbXBfYnVmIHNlZ3ZfZW52Ow0KDQpzdGF0aWMgdm9pZCBzZWd2X2hh bmRsZXIoaW50IHNpZywgc2lnaW5mb190KiBpbmZvLCB2b2lkKiB1Y3R4KSB7DQogIHVpbnRwdHJf dCBhZGRyID0gKHVpbnRwdHJfdCkgaW5mby0+c2lfYWRkcjsNCiAgY29uc3QgdWludHB0cl90IHBy b2dfc3RhcnQgPSAxIDw8IDIwOw0KICBjb25zdCB1aW50cHRyX3QgcHJvZ19lbmQgPSAxMDAgPDwg MjA7DQogIGlmIChfX2F0b21pY19sb2FkX24oJnNraXBfc2VndiwgX19BVE9NSUNfUkVMQVhFRCkg JiYNCiAgICAgIChhZGRyIDwgcHJvZ19zdGFydCB8fCBhZGRyID4gcHJvZ19lbmQpKSB7DQogICAg ICAgIF9sb25nam1wKHNlZ3ZfZW52LCAxKTsNCiAgfQ0KICAgIGRvZXhpdChzaWcpOw0KfQ0KDQpz dGF0aWMgdm9pZCBpbnN0YWxsX3NlZ3ZfaGFuZGxlcigpIHsNCiAgc3RydWN0IHNpZ2FjdGlvbiBz YTsNCg0KICBtZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsNCiAgc2Euc2FfaGFuZGxlciA9IFNJ R19JR047DQogIHN5c2NhbGwoU1lTX3J0X3NpZ2FjdGlvbiwgMHgyMCwgJnNhLCBOVUxMLCA4KTsN CiAgc3lzY2FsbChTWVNfcnRfc2lnYWN0aW9uLCAweDIxLCAmc2EsIE5VTEwsIDgpOw0KDQogIG1l bXNldCgmc2EsIDAsIHNpemVvZihzYSkpOw0KICBzYS5zYV9zaWdhY3Rpb24gPSBzZWd2X2hhbmRs ZXI7DQogIHNhLnNhX2ZsYWdzID0gU0FfTk9ERUZFUiB8IFNBX1NJR0lORk87DQogIHNpZ2FjdGlv bihTSUdTRUdWLCAmc2EsIE5VTEwpOw0KICBzaWdhY3Rpb24oU0lHQlVTLCAmc2EsIE5VTEwpOw0K fQ0KDQojZGVmaW5lIE5PTkZBSUxJTkcoLi4uKSB7IF9fYXRvbWljX2ZldGNoX2FkZCgmc2tpcF9z ZWd2LCAxLCBfX0FUT01JQ19TRVFfQ1NUKTsgaWYgKF9zZXRqbXAoc2Vndl9lbnYpID09IDApIHsg X19WQV9BUkdTX187IH0gX19hdG9taWNfZmV0Y2hfc3ViKCZza2lwX3NlZ3YsIDEsIF9fQVRPTUlD X1NFUV9DU1QpOyB9DQoNCnN0YXRpYyB1aW50NjRfdCBjdXJyZW50X3RpbWVfbXMoKSB7DQogIHN0 cnVjdCB0aW1lc3BlYyB0czsNCg0KICBpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMs ICZ0cykpIGZhaWwoImNsb2NrX2dldHRpbWUgZmFpbGVkIik7DQogIHJldHVybiAodWludDY0X3Qp IHRzLnR2X3NlYyAqIDEwMDAgKyAodWludDY0X3QpIHRzLnR2X25zZWMgLyAxMDAwMDAwOw0KfQ0K DQpzdGF0aWMgdm9pZCB1c2VfdGVtcG9yYXJ5X2RpcigpIHsNCiAgY2hhciB0bXBkaXJfdGVtcGxh dGVbXSA9ICIuL3N5emthbGxlci5YWFhYWFgiOw0KICBjaGFyKiB0bXBkaXIgPSBta2R0ZW1wKHRt cGRpcl90ZW1wbGF0ZSk7DQogIGlmICghdG1wZGlyKSBmYWlsKCJmYWlsZWQgdG8gbWtkdGVtcCIp Ow0KICBpZiAoY2htb2QodG1wZGlyLCAwNzc3KSkgZmFpbCgiZmFpbGVkIHRvIGNobW9kIik7DQog IGlmIChjaGRpcih0bXBkaXIpKSBmYWlsKCJmYWlsZWQgdG8gY2hkaXIiKTsNCn0NCg0Kc3RhdGlj IHZvaWQgdnNucHJpbnRmX2NoZWNrKGNoYXIqIHN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIq IGZvcm1hdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsNCiAg aW50IHJ2Ow0KDQogIHJ2ID0gdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCBhcmdzKTsNCiAg aWYgKHJ2IDwgMCkgZmFpbCgidHVuOiBzbnByaW50ZiBmYWlsZWQiKTsNCiAgaWYgKChzaXplX3Qp IHJ2ID49IHNpemUpDQogICAgZmFpbCgidHVuOiBzdHJpbmcgJyVzLi4uJyBkb2Vzbid0IGZpdCBp bnRvIGJ1ZmZlciIsIHN0cik7DQp9DQoNCnN0YXRpYyB2b2lkIHNucHJpbnRmX2NoZWNrKGNoYXIq IHN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7DQogIHZhX2xpc3Qg YXJnczsNCg0KICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOw0KICB2c25wcmludGZfY2hlY2soc3Ry LCBzaXplLCBmb3JtYXQsIGFyZ3MpOw0KICB2YV9lbmQoYXJncyk7DQp9DQoNCiNkZWZpbmUgQ09N TUFORF9NQVhfTEVOIDEyOA0KI2RlZmluZSBQQVRIX1BSRUZJWCAiUEFUSD0vdXNyL2xvY2FsL3Ni aW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4gIg0KI2RlZmlu ZSBQQVRIX1BSRUZJWF9MRU4gKHNpemVvZihQQVRIX1BSRUZJWCkgLSAxKQ0KDQpzdGF0aWMgdm9p ZCBleGVjdXRlX2NvbW1hbmQoYm9vbCBwYW5pYywgY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsN CiAgdmFfbGlzdCBhcmdzOw0KICBjaGFyIGNvbW1hbmRbUEFUSF9QUkVGSVhfTEVOICsgQ09NTUFO RF9NQVhfTEVOXTsNCiAgaW50IHJ2Ow0KDQogIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7DQogIG1l bWNweShjb21tYW5kLCBQQVRIX1BSRUZJWCwgUEFUSF9QUkVGSVhfTEVOKTsNCiAgdnNucHJpbnRm X2NoZWNrKGNvbW1hbmQgKyBQQVRIX1BSRUZJWF9MRU4sIENPTU1BTkRfTUFYX0xFTiwgZm9ybWF0 LCBhcmdzKTsNCiAgdmFfZW5kKGFyZ3MpOw0KICBydiA9IHN5c3RlbShjb21tYW5kKTsNCiAgaWYg KHJ2KSB7DQogICAgaWYgKHBhbmljKSBmYWlsKCJjb21tYW5kICclcycgZmFpbGVkOiAlZCIsICZj b21tYW5kWzBdLCBydik7DQogICAgICB9DQp9DQoNCnN0YXRpYyBpbnQgdHVuZmQgPSAtMTsNCnN0 YXRpYyBpbnQgdHVuX2ZyYWdzX2VuYWJsZWQ7DQoNCiNkZWZpbmUgU1laX1RVTl9NQVhfUEFDS0VU X1NJWkUgMTAwMA0KDQojZGVmaW5lIFRVTl9JRkFDRSAic3l6X3R1biINCg0KI2RlZmluZSBMT0NB TF9NQUMgImFhOmFhOmFhOmFhOmFhOmFhIg0KI2RlZmluZSBSRU1PVEVfTUFDICJhYTphYTphYTph YTphYTpiYiINCg0KI2RlZmluZSBMT0NBTF9JUFY0ICIxNzIuMjAuMjAuMTcwIg0KI2RlZmluZSBS RU1PVEVfSVBWNCAiMTcyLjIwLjIwLjE4NyINCg0KI2RlZmluZSBMT0NBTF9JUFY2ICJmZTgwOjph YSINCiNkZWZpbmUgUkVNT1RFX0lQVjYgImZlODA6OmJiIg0KDQojZGVmaW5lIElGRl9OQVBJIDB4 MDAxMA0KI2RlZmluZSBJRkZfTkFQSV9GUkFHUyAweDAwMjANCg0Kc3RhdGljIHZvaWQgaW5pdGlh bGl6ZV90dW4odm9pZCkgew0KICB0dW5mZCA9IG9wZW4oIi9kZXYvbmV0L3R1biIsIE9fUkRXUiB8 IE9fTk9OQkxPQ0spOw0KICBpZiAodHVuZmQgPT0gLTEpIHsNCiAgICBwcmludGYoInR1bjogY2Fu J3Qgb3BlbiAvZGV2L25ldC90dW46IHBsZWFzZSBlbmFibGUgQ09ORklHX1RVTj15XG4iKTsNCiAg ICBwcmludGYoIm90aGVyd2lzZSBmdXp6aW5nIG9yIHJlcHJvZHVjaW5nIG1pZ2h0IG5vdCB3b3Jr IGFzIGludGVuZGVkXG4iKTsNCiAgICByZXR1cm47DQogIH0NCiAgY29uc3QgaW50IGtUdW5GZCA9 IDI1MjsNCiAgaWYgKGR1cDIodHVuZmQsIGtUdW5GZCkgPCAwKSBmYWlsKCJkdXAyKHR1bmZkLCBr VHVuRmQpIGZhaWxlZCIpOw0KICBjbG9zZSh0dW5mZCk7DQogIHR1bmZkID0ga1R1bkZkOw0KDQog IHN0cnVjdCBpZnJlcSBpZnI7DQogIG1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7DQogIHN0 cm5jcHkoaWZyLmlmcl9uYW1lLCBUVU5fSUZBQ0UsIElGTkFNU0laKTsNCiAgaWZyLmlmcl9mbGFn cyA9IElGRl9UQVAgfCBJRkZfTk9fUEkgfCBJRkZfTkFQSSB8IElGRl9OQVBJX0ZSQUdTOw0KICBp ZiAoaW9jdGwodHVuZmQsIFRVTlNFVElGRiwgKHZvaWQqKSZpZnIpIDwgMCkgew0KICAgIGlmci5p ZnJfZmxhZ3MgPSBJRkZfVEFQIHwgSUZGX05PX1BJOw0KICAgIGlmIChpb2N0bCh0dW5mZCwgVFVO U0VUSUZGLCAodm9pZCopJmlmcikgPCAwKQ0KICAgICAgZmFpbCgidHVuOiBpb2N0bChUVU5TRVRJ RkYpIGZhaWxlZCIpOw0KICB9DQogIGlmIChpb2N0bCh0dW5mZCwgVFVOR0VUSUZGLCAodm9pZCop JmlmcikgPCAwKQ0KICAgIGZhaWwoInR1bjogaW9jdGwoVFVOR0VUSUZGKSBmYWlsZWQiKTsNCiAg dHVuX2ZyYWdzX2VuYWJsZWQgPSAoaWZyLmlmcl9mbGFncyAmIElGRl9OQVBJX0ZSQUdTKSAhPSAw Ow0KDQogIGV4ZWN1dGVfY29tbWFuZCgxLCAic3lzY3RsIC13IG5ldC5pcHY2LmNvbmYuJXMuYWNj ZXB0X2RhZD0wIiwgVFVOX0lGQUNFKTsNCg0KICBleGVjdXRlX2NvbW1hbmQoMSwgInN5c2N0bCAt dyBuZXQuaXB2Ni5jb25mLiVzLnJvdXRlcl9zb2xpY2l0YXRpb25zPTAiLA0KICAgICAgICAgICAg ICAgICAgVFVOX0lGQUNFKTsNCg0KICBleGVjdXRlX2NvbW1hbmQoMSwgImlwIGxpbmsgc2V0IGRl diAlcyBhZGRyZXNzICVzIiwgVFVOX0lGQUNFLCBMT0NBTF9NQUMpOw0KICBleGVjdXRlX2NvbW1h bmQoMSwgImlwIGFkZHIgYWRkICVzLzI0IGRldiAlcyIsIExPQ0FMX0lQVjQsIFRVTl9JRkFDRSk7 DQogIGV4ZWN1dGVfY29tbWFuZCgxLCAiaXAgLTYgYWRkciBhZGQgJXMvMTIwIGRldiAlcyIsIExP Q0FMX0lQVjYsIFRVTl9JRkFDRSk7DQogIGV4ZWN1dGVfY29tbWFuZCgxLCAiaXAgbmVpZ2ggYWRk ICVzIGxsYWRkciAlcyBkZXYgJXMgbnVkIHBlcm1hbmVudCIsDQogICAgICAgICAgICAgICAgICBS RU1PVEVfSVBWNCwgUkVNT1RFX01BQywgVFVOX0lGQUNFKTsNCiAgZXhlY3V0ZV9jb21tYW5kKDEs ICJpcCAtNiBuZWlnaCBhZGQgJXMgbGxhZGRyICVzIGRldiAlcyBudWQgcGVybWFuZW50IiwNCiAg ICAgICAgICAgICAgICAgIFJFTU9URV9JUFY2LCBSRU1PVEVfTUFDLCBUVU5fSUZBQ0UpOw0KICBl eGVjdXRlX2NvbW1hbmQoMSwgImlwIGxpbmsgc2V0IGRldiAlcyB1cCIsIFRVTl9JRkFDRSk7DQp9 DQoNCiNkZWZpbmUgREVWX0lQVjQgIjE3Mi4yMC4yMC4lZCINCiNkZWZpbmUgREVWX0lQVjYgImZl ODA6OiUwMmh4Ig0KI2RlZmluZSBERVZfTUFDICJhYTphYTphYTphYTphYTolMDJoeCINCg0Kc3Rh dGljIHZvaWQgaW5pdGlhbGl6ZV9uZXRkZXZpY2VzKHZvaWQpIHsNCiAgdW5zaWduZWQgaTsNCiAg Y29uc3QgY2hhciogZGV2dHlwZXNbXSA9IHsgImlwNmdyZXRhcCIsICJicmlkZ2UiLCAidmNhbiIs ICJib25kIiwgInRlYW0iIH07DQogIGNvbnN0IGNoYXIqIGRldm5hbWVzW10gPSB7DQogICAgImxv IiwgInNpdDAiLCAiYnJpZGdlMCIsICJ2Y2FuMCIsICJ0dW5sMCIsICJncmUwIiwgImdyZXRhcDAi LCAiaXBfdnRpMCIsDQogICAgImlwNl92dGkwIiwgImlwNnRubDAiLCAiaXA2Z3JlMCIsICJpcDZn cmV0YXAwIiwgImVyc3BhbjAiLCAiYm9uZDAiLCAidmV0aDAiLA0KICAgICJ2ZXRoMSIsICJ0ZWFt MCIsICJ2ZXRoMF90b19icmlkZ2UiLCAidmV0aDFfdG9fYnJpZGdlIiwgInZldGgwX3RvX2JvbmQi LA0KICAgICJ2ZXRoMV90b19ib25kIiwgInZldGgwX3RvX3RlYW0iLCAidmV0aDFfdG9fdGVhbSIN CiAgfTsNCiAgY29uc3QgY2hhciogZGV2bWFzdGVyc1tdID0geyAiYnJpZGdlIiwgImJvbmQiLCAi dGVhbSIgfTsNCg0KICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRldnR5cGVzKSAvIChzaXplb2Yo ZGV2dHlwZXNbMF0pKTsgaSsrKQ0KICAgIGV4ZWN1dGVfY29tbWFuZCgwLCAiaXAgbGluayBhZGQg ZGV2ICVzMCB0eXBlICVzIiwgZGV2dHlwZXNbaV0sIGRldnR5cGVzW2ldKTsNCiAgZXhlY3V0ZV9j b21tYW5kKDAsICJpcCBsaW5rIGFkZCB0eXBlIHZldGgiKTsNCg0KICBmb3IgKGkgPSAwOyBpIDwg c2l6ZW9mKGRldm1hc3RlcnMpIC8gKHNpemVvZihkZXZtYXN0ZXJzWzBdKSk7IGkrKykgew0KICAg IGV4ZWN1dGVfY29tbWFuZCgNCiAgICAgICAgMCwgImlwIGxpbmsgYWRkIG5hbWUgJXNfc2xhdmVf MCB0eXBlIHZldGggcGVlciBuYW1lIHZldGgwX3RvXyVzIiwNCiAgICAgICAgZGV2bWFzdGVyc1tp XSwgZGV2bWFzdGVyc1tpXSk7DQogICAgZXhlY3V0ZV9jb21tYW5kKA0KICAgICAgICAwLCAiaXAg bGluayBhZGQgbmFtZSAlc19zbGF2ZV8xIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDFfdG9fJXMi LA0KICAgICAgICBkZXZtYXN0ZXJzW2ldLCBkZXZtYXN0ZXJzW2ldKTsNCiAgICBleGVjdXRlX2Nv bW1hbmQoMCwgImlwIGxpbmsgc2V0ICVzX3NsYXZlXzAgbWFzdGVyICVzMCIsIGRldm1hc3RlcnNb aV0sDQogICAgICAgICAgICAgICAgICAgIGRldm1hc3RlcnNbaV0pOw0KICAgIGV4ZWN1dGVfY29t bWFuZCgwLCAiaXAgbGluayBzZXQgJXNfc2xhdmVfMSBtYXN0ZXIgJXMwIiwgZGV2bWFzdGVyc1tp XSwNCiAgICAgICAgICAgICAgICAgICAgZGV2bWFzdGVyc1tpXSk7DQogICAgZXhlY3V0ZV9jb21t YW5kKDAsICJpcCBsaW5rIHNldCB2ZXRoMF90b18lcyB1cCIsIGRldm1hc3RlcnNbaV0pOw0KICAg IGV4ZWN1dGVfY29tbWFuZCgwLCAiaXAgbGluayBzZXQgdmV0aDFfdG9fJXMgdXAiLCBkZXZtYXN0 ZXJzW2ldKTsNCiAgfQ0KICBleGVjdXRlX2NvbW1hbmQoMCwgImlwIGxpbmsgc2V0IGJyaWRnZV9z bGF2ZV8wIHVwIik7DQogIGV4ZWN1dGVfY29tbWFuZCgwLCAiaXAgbGluayBzZXQgYnJpZGdlX3Ns YXZlXzEgdXAiKTsNCg0KICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRldm5hbWVzKSAvIChzaXpl b2YoZGV2bmFtZXNbMF0pKTsgaSsrKSB7DQogICAgY2hhciBhZGRyWzMyXTsNCiAgICBzbnByaW50 Zl9jaGVjayhhZGRyLCBzaXplb2YoYWRkciksIERFVl9JUFY0LCBpICsgMTApOw0KICAgIGV4ZWN1 dGVfY29tbWFuZCgwLCAiaXAgLTQgYWRkciBhZGQgJXMvMjQgZGV2ICVzIiwgYWRkciwgZGV2bmFt ZXNbaV0pOw0KICAgIHNucHJpbnRmX2NoZWNrKGFkZHIsIHNpemVvZihhZGRyKSwgREVWX0lQVjYs IGkgKyAxMCk7DQogICAgZXhlY3V0ZV9jb21tYW5kKDAsICJpcCAtNiBhZGRyIGFkZCAlcy8xMjAg ZGV2ICVzIiwgYWRkciwgZGV2bmFtZXNbaV0pOw0KICAgIHNucHJpbnRmX2NoZWNrKGFkZHIsIHNp emVvZihhZGRyKSwgREVWX01BQywgaSArIDEwKTsNCiAgICBleGVjdXRlX2NvbW1hbmQoMCwgImlw IGxpbmsgc2V0IGRldiAlcyBhZGRyZXNzICVzIiwgZGV2bmFtZXNbaV0sIGFkZHIpOw0KICAgIGV4 ZWN1dGVfY29tbWFuZCgwLCAiaXAgbGluayBzZXQgZGV2ICVzIHVwIiwgZGV2bmFtZXNbaV0pOw0K ICB9DQp9DQoNCnN0YXRpYyBpbnQgcmVhZF90dW4oY2hhciogZGF0YSwgaW50IHNpemUpIHsNCiAg aWYgKHR1bmZkIDwgMCkgcmV0dXJuIC0xOw0KDQogIGludCBydiA9IHJlYWQodHVuZmQsIGRhdGEs IHNpemUpOw0KICBpZiAocnYgPCAwKSB7DQogICAgaWYgKGVycm5vID09IEVBR0FJTikgcmV0dXJu IC0xOw0KICAgIGlmIChlcnJubyA9PSBFQkFERkQpIHJldHVybiAtMTsNCiAgICBmYWlsKCJ0dW46 IHJlYWQgZmFpbGVkIHdpdGggJWQiLCBydik7DQogIH0NCiAgcmV0dXJuIHJ2Ow0KfQ0KDQpzdGF0 aWMgdm9pZCBmbHVzaF90dW4oKSB7DQogIGNoYXIgZGF0YVtTWVpfVFVOX01BWF9QQUNLRVRfU0la RV07DQogIHdoaWxlIChyZWFkX3R1bigmZGF0YVswXSwgc2l6ZW9mKGRhdGEpKSAhPSAtMSkNCiAg ICA7DQp9DQoNCnN0YXRpYyBib29sIHdyaXRlX2ZpbGUoY29uc3QgY2hhciogZmlsZSwgY29uc3Qg Y2hhciogd2hhdCwgLi4uKSB7DQogIGNoYXIgYnVmWzEwMjRdOw0KICB2YV9saXN0IGFyZ3M7DQog IHZhX3N0YXJ0KGFyZ3MsIHdoYXQpOw0KICB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgd2hh dCwgYXJncyk7DQogIHZhX2VuZChhcmdzKTsNCiAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOw0K ICBpbnQgbGVuID0gc3RybGVuKGJ1Zik7DQoNCiAgaW50IGZkID0gb3BlbihmaWxlLCBPX1dST05M WSB8IE9fQ0xPRVhFQyk7DQogIGlmIChmZCA9PSAtMSkgcmV0dXJuIGZhbHNlOw0KICBpZiAod3Jp dGUoZmQsIGJ1ZiwgbGVuKSAhPSBsZW4pIHsNCiAgICBpbnQgZXJyID0gZXJybm87DQogICAgY2xv c2UoZmQpOw0KICAgIGVycm5vID0gZXJyOw0KICAgIHJldHVybiBmYWxzZTsNCiAgfQ0KICBjbG9z ZShmZCk7DQogIHJldHVybiB0cnVlOw0KfQ0KDQpzdGF0aWMgdm9pZCBzZXR1cF9jZ3JvdXBzKCkg ew0KICBpZiAobWtkaXIoIi9zeXpjZ3JvdXAiLCAwNzc3KSkgew0KICAgICAgfQ0KICBpZiAobWtk aXIoIi9zeXpjZ3JvdXAvdW5pZmllZCIsIDA3NzcpKSB7DQogICAgICB9DQogIGlmIChtb3VudCgi bm9uZSIsICIvc3l6Y2dyb3VwL3VuaWZpZWQiLCAiY2dyb3VwMiIsIDAsIE5VTEwpKSB7DQogICAg ICB9DQogIGlmIChjaG1vZCgiL3N5emNncm91cC91bmlmaWVkIiwgMDc3NykpIHsNCiAgICAgIH0N CiAgaWYgKCF3cml0ZV9maWxlKCIvc3l6Y2dyb3VwL3VuaWZpZWQvY2dyb3VwLnN1YnRyZWVfY29u dHJvbCIsDQogICAgICAgICAgICAgICAgICAiK2NwdSArbWVtb3J5ICtpbyArcGlkcyArcmRtYSIp KSB7DQogICAgICB9DQogIGlmIChta2RpcigiL3N5emNncm91cC9jcHUiLCAwNzc3KSkgew0KICAg ICAgfQ0KICBpZiAobW91bnQoIm5vbmUiLCAiL3N5emNncm91cC9jcHUiLCAiY2dyb3VwIiwgMCwN CiAgICAgICAgICAgICJjcHVzZXQsY3B1YWNjdCxwZXJmX2V2ZW50LGh1Z2V0bGIiKSkgew0KICAg ICAgfQ0KICBpZiAoIXdyaXRlX2ZpbGUoIi9zeXpjZ3JvdXAvY3B1L2Nncm91cC5jbG9uZV9jaGls ZHJlbiIsICIxIikpIHsNCiAgICAgIH0NCiAgaWYgKGNobW9kKCIvc3l6Y2dyb3VwL2NwdSIsIDA3 NzcpKSB7DQogICAgICB9DQogIGlmIChta2RpcigiL3N5emNncm91cC9uZXQiLCAwNzc3KSkgew0K ICAgICAgfQ0KICBpZiAobW91bnQoIm5vbmUiLCAiL3N5emNncm91cC9uZXQiLCAiY2dyb3VwIiwg MCwNCiAgICAgICAgICAgICJuZXRfY2xzLG5ldF9wcmlvLGRldmljZXMsZnJlZXplciIpKSB7DQog ICAgICB9DQogIGlmIChjaG1vZCgiL3N5emNncm91cC9uZXQiLCAwNzc3KSkgew0KICAgICAgfQ0K fQ0KDQpzdGF0aWMgdm9pZCBzZXR1cF9iaW5mbXRfbWlzYygpIHsNCiAgaWYgKCF3cml0ZV9maWxl KCIvcHJvYy9zeXMvZnMvYmluZm10X21pc2MvcmVnaXN0ZXIiLA0KICAgICAgICAgICAgICAgICAg IjpzeXowOk06MDpzeXowOjouL2ZpbGUwOiIpKSB7DQogICAgICB9DQogIGlmICghd3JpdGVfZmls ZSgiL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3JlZ2lzdGVyIiwNCiAgICAgICAgICAgICAgICAg ICI6c3l6MTpNOjE6eXoxOjouL2ZpbGUwOlBPQyIpKSB7DQogICAgICB9DQp9DQoNCnN0YXRpYyB2 b2lkIGxvb3AoKTsNCg0Kc3RhdGljIHZvaWQgc2FuZGJveF9jb21tb24oKSB7DQogIHByY3RsKFBS X1NFVF9QREVBVEhTSUcsIFNJR0tJTEwsIDAsIDAsIDApOw0KICBzZXRwZ3JwKCk7DQogIHNldHNp ZCgpOw0KDQogIHN0cnVjdCBybGltaXQgcmxpbTsNCiAgcmxpbS5ybGltX2N1ciA9IHJsaW0ucmxp bV9tYXggPSAxNjAgPDwgMjA7DQogIHNldHJsaW1pdChSTElNSVRfQVMsICZybGltKTsNCiAgcmxp bS5ybGltX2N1ciA9IHJsaW0ucmxpbV9tYXggPSA4IDw8IDIwOw0KICBzZXRybGltaXQoUkxJTUlU X01FTUxPQ0ssICZybGltKTsNCiAgcmxpbS5ybGltX2N1ciA9IHJsaW0ucmxpbV9tYXggPSAxMzYg PDwgMjA7DQogIHNldHJsaW1pdChSTElNSVRfRlNJWkUsICZybGltKTsNCiAgcmxpbS5ybGltX2N1 ciA9IHJsaW0ucmxpbV9tYXggPSAxIDw8IDIwOw0KICBzZXRybGltaXQoUkxJTUlUX1NUQUNLLCAm cmxpbSk7DQogIHJsaW0ucmxpbV9jdXIgPSBybGltLnJsaW1fbWF4ID0gMDsNCiAgc2V0cmxpbWl0 KFJMSU1JVF9DT1JFLCAmcmxpbSk7DQoNCiAgLyppZiAodW5zaGFyZShDTE9ORV9ORVdOUykpIHsN CiAgICAgIH0NCiAgaWYgKHVuc2hhcmUoQ0xPTkVfTkVXSVBDKSkgew0KICAgICAgfQ0KICBpZiAo dW5zaGFyZSgweDAyMDAwMDAwKSkgew0KICAgICAgfQ0KICBpZiAodW5zaGFyZShDTE9ORV9ORVdV VFMpKSB7DQogICAgICB9DQogIGlmICh1bnNoYXJlKENMT05FX1NZU1ZTRU0pKSB7DQogICAgICB9 Ki8NCn0NCg0Kc3RhdGljIGludCBkb19zYW5kYm94X25vbmUodm9pZCkgew0KICBpbnQgcGlkID0g Zm9yaygpOw0KICBpZiAocGlkIDwgMCkgZmFpbCgic2FuZGJveCBmb3JrIGZhaWxlZCIpOw0KICBp ZiAocGlkKSByZXR1cm4gcGlkOw0KDQogIHNhbmRib3hfY29tbW9uKCk7DQogIGluaXRpYWxpemVf dHVuKCk7DQoNCiAgbG9vcCgpOw0KICBkb2V4aXQoMSk7DQp9DQoNCiNkZWZpbmUgWFRfVEFCTEVf U0laRSAxNTM2DQojZGVmaW5lIFhUX01BWF9FTlRSSUVTIDEwDQoNCnN0cnVjdCB4dF9jb3VudGVy cyB7DQogIHVpbnQ2NF90IHBjbnQsIGJjbnQ7DQp9Ow0KDQpzdHJ1Y3QgaXB0X2dldGluZm8gew0K ICBjaGFyIG5hbWVbMzJdOw0KICB1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3M7DQogIHVuc2lnbmVk IGludCBob29rX2VudHJ5WzVdOw0KICB1bnNpZ25lZCBpbnQgdW5kZXJmbG93WzVdOw0KICB1bnNp Z25lZCBpbnQgbnVtX2VudHJpZXM7DQogIHVuc2lnbmVkIGludCBzaXplOw0KfTsNCg0Kc3RydWN0 IGlwdF9nZXRfZW50cmllcyB7DQogIGNoYXIgbmFtZVszMl07DQogIHVuc2lnbmVkIGludCBzaXpl Ow0KICB2b2lkKiBlbnRyeXRhYmxlW1hUX1RBQkxFX1NJWkUgLyBzaXplb2Yodm9pZCopXTsNCn07 DQoNCnN0cnVjdCBpcHRfcmVwbGFjZSB7DQogIGNoYXIgbmFtZVszMl07DQogIHVuc2lnbmVkIGlu dCB2YWxpZF9ob29rczsNCiAgdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOw0KICB1bnNpZ25lZCBp bnQgc2l6ZTsNCiAgdW5zaWduZWQgaW50IGhvb2tfZW50cnlbNV07DQogIHVuc2lnbmVkIGludCB1 bmRlcmZsb3dbNV07DQogIHVuc2lnbmVkIGludCBudW1fY291bnRlcnM7DQogIHN0cnVjdCB4dF9j b3VudGVycyogY291bnRlcnM7DQogIGNoYXIgZW50cnl0YWJsZVtYVF9UQUJMRV9TSVpFXTsNCn07 DQoNCnN0cnVjdCBpcHRfdGFibGVfZGVzYyB7DQogIGNvbnN0IGNoYXIqIG5hbWU7DQogIHN0cnVj dCBpcHRfZ2V0aW5mbyBpbmZvOw0KICBzdHJ1Y3QgaXB0X3JlcGxhY2UgcmVwbGFjZTsNCn07DQoN CnN0YXRpYyBzdHJ1Y3QgaXB0X3RhYmxlX2Rlc2MgaXB2NF90YWJsZXNbXSA9IHsNCiAgey5uYW1l ID0gImZpbHRlciIgfSwgey5uYW1lID0gIm5hdCIgfSwgey5uYW1lID0gIm1hbmdsZSIgfSwgey5u YW1lID0gInJhdyIgfSwNCiAgey5uYW1lID0gInNlY3VyaXR5IiB9LA0KfTsNCg0Kc3RhdGljIHN0 cnVjdCBpcHRfdGFibGVfZGVzYyBpcHY2X3RhYmxlc1tdID0gew0KICB7Lm5hbWUgPSAiZmlsdGVy IiB9LCB7Lm5hbWUgPSAibmF0IiB9LCB7Lm5hbWUgPSAibWFuZ2xlIiB9LCB7Lm5hbWUgPSAicmF3 IiB9LA0KICB7Lm5hbWUgPSAic2VjdXJpdHkiIH0sDQp9Ow0KDQojZGVmaW5lIElQVF9CQVNFX0NU TCA2NA0KI2RlZmluZSBJUFRfU09fU0VUX1JFUExBQ0UgKElQVF9CQVNFX0NUTCkNCiNkZWZpbmUg SVBUX1NPX0dFVF9JTkZPIChJUFRfQkFTRV9DVEwpDQojZGVmaW5lIElQVF9TT19HRVRfRU5UUklF UyAoSVBUX0JBU0VfQ1RMICsgMSkNCg0Kc3RydWN0IGFycHRfZ2V0aW5mbyB7DQogIGNoYXIgbmFt ZVszMl07DQogIHVuc2lnbmVkIGludCB2YWxpZF9ob29rczsNCiAgdW5zaWduZWQgaW50IGhvb2tf ZW50cnlbM107DQogIHVuc2lnbmVkIGludCB1bmRlcmZsb3dbM107DQogIHVuc2lnbmVkIGludCBu dW1fZW50cmllczsNCiAgdW5zaWduZWQgaW50IHNpemU7DQp9Ow0KDQpzdHJ1Y3QgYXJwdF9nZXRf ZW50cmllcyB7DQogIGNoYXIgbmFtZVszMl07DQogIHVuc2lnbmVkIGludCBzaXplOw0KICB2b2lk KiBlbnRyeXRhYmxlW1hUX1RBQkxFX1NJWkUgLyBzaXplb2Yodm9pZCopXTsNCn07DQoNCnN0cnVj dCBhcnB0X3JlcGxhY2Ugew0KICBjaGFyIG5hbWVbMzJdOw0KICB1bnNpZ25lZCBpbnQgdmFsaWRf aG9va3M7DQogIHVuc2lnbmVkIGludCBudW1fZW50cmllczsNCiAgdW5zaWduZWQgaW50IHNpemU7 DQogIHVuc2lnbmVkIGludCBob29rX2VudHJ5WzNdOw0KICB1bnNpZ25lZCBpbnQgdW5kZXJmbG93 WzNdOw0KICB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOw0KICBzdHJ1Y3QgeHRfY291bnRlcnMq IGNvdW50ZXJzOw0KICBjaGFyIGVudHJ5dGFibGVbWFRfVEFCTEVfU0laRV07DQp9Ow0KDQpzdHJ1 Y3QgYXJwdF90YWJsZV9kZXNjIHsNCiAgY29uc3QgY2hhciogbmFtZTsNCiAgc3RydWN0IGFycHRf Z2V0aW5mbyBpbmZvOw0KICBzdHJ1Y3QgYXJwdF9yZXBsYWNlIHJlcGxhY2U7DQp9Ow0KDQpzdGF0 aWMgc3RydWN0IGFycHRfdGFibGVfZGVzYyBhcnB0X3RhYmxlc1tdID0geyB7Lm5hbWUgPSAiZmls dGVyIiB9LCB9Ow0KDQojZGVmaW5lIEFSUFRfQkFTRV9DVEwgOTYNCiNkZWZpbmUgQVJQVF9TT19T RVRfUkVQTEFDRSAoQVJQVF9CQVNFX0NUTCkNCiNkZWZpbmUgQVJQVF9TT19HRVRfSU5GTyAoQVJQ VF9CQVNFX0NUTCkNCiNkZWZpbmUgQVJQVF9TT19HRVRfRU5UUklFUyAoQVJQVF9CQVNFX0NUTCAr IDEpDQoNCnN0YXRpYyB2b2lkIGNoZWNrcG9pbnRfaXB0YWJsZXMoc3RydWN0IGlwdF90YWJsZV9k ZXNjKiB0YWJsZXMsIGludCBudW1fdGFibGVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBpbnQgZmFtaWx5LCBpbnQgbGV2ZWwpIHsNCiAgc3RydWN0IGlwdF9nZXRfZW50cmllcyBl bnRyaWVzOw0KICBzb2NrbGVuX3Qgb3B0bGVuOw0KICBpbnQgZmQsIGk7DQoNCiAgZmQgPSBzb2Nr ZXQoZmFtaWx5LCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOw0KICBpZiAoZmQgPT0gLTEpIHsN CiAgICBzd2l0Y2ggKGVycm5vKSB7DQogICAgICBjYXNlIEVBRk5PU1VQUE9SVDoNCiAgICAgIGNh c2UgRU5PUFJPVE9PUFQ6DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgZmFpbCgic29ja2V0 KCVkLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIiwgZmFtaWx5KTsNCiAgfQ0KICBmb3IgKGkg PSAwOyBpIDwgbnVtX3RhYmxlczsgaSsrKSB7DQogICAgc3RydWN0IGlwdF90YWJsZV9kZXNjKiB0 YWJsZSA9ICZ0YWJsZXNbaV07DQogICAgc3RyY3B5KHRhYmxlLT5pbmZvLm5hbWUsIHRhYmxlLT5u YW1lKTsNCiAgICBzdHJjcHkodGFibGUtPnJlcGxhY2UubmFtZSwgdGFibGUtPm5hbWUpOw0KICAg IG9wdGxlbiA9IHNpemVvZih0YWJsZS0+aW5mbyk7DQogICAgaWYgKGdldHNvY2tvcHQoZmQsIGxl dmVsLCBJUFRfU09fR0VUX0lORk8sICZ0YWJsZS0+aW5mbywgJm9wdGxlbikpIHsNCiAgICAgIHN3 aXRjaCAoZXJybm8pIHsNCiAgICAgICAgY2FzZSBFUEVSTToNCiAgICAgICAgY2FzZSBFTk9FTlQ6 DQogICAgICAgIGNhc2UgRU5PUFJPVE9PUFQ6DQogICAgICAgICAgY29udGludWU7DQogICAgICB9 DQogICAgICBmYWlsKCJnZXRzb2Nrb3B0KElQVF9TT19HRVRfSU5GTykiKTsNCiAgICB9DQogIA0K ICAgIGlmICh0YWJsZS0+aW5mby5zaXplID4gc2l6ZW9mKHRhYmxlLT5yZXBsYWNlLmVudHJ5dGFi bGUpKQ0KICAgICAgZmFpbCgidGFibGUgc2l6ZSBpcyB0b28gbGFyZ2U6ICV1IiwgdGFibGUtPmlu Zm8uc2l6ZSk7DQogICAgaWYgKHRhYmxlLT5pbmZvLm51bV9lbnRyaWVzID4gWFRfTUFYX0VOVFJJ RVMpDQogICAgICBmYWlsKCJ0b28gbWFueSBjb3VudGVyczogJXUiLCB0YWJsZS0+aW5mby5udW1f ZW50cmllcyk7DQogICAgbWVtc2V0KCZlbnRyaWVzLCAwLCBzaXplb2YoZW50cmllcykpOw0KICAg IHN0cmNweShlbnRyaWVzLm5hbWUsIHRhYmxlLT5uYW1lKTsNCiAgICBlbnRyaWVzLnNpemUgPSB0 YWJsZS0+aW5mby5zaXplOw0KICAgIG9wdGxlbiA9IHNpemVvZihlbnRyaWVzKSAtIHNpemVvZihl bnRyaWVzLmVudHJ5dGFibGUpICsgdGFibGUtPmluZm8uc2l6ZTsNCiAgICBpZiAoZ2V0c29ja29w dChmZCwgbGV2ZWwsIElQVF9TT19HRVRfRU5UUklFUywgJmVudHJpZXMsICZvcHRsZW4pKQ0KICAg ICAgZmFpbCgiZ2V0c29ja29wdChJUFRfU09fR0VUX0VOVFJJRVMpIik7DQogICAgdGFibGUtPnJl cGxhY2UudmFsaWRfaG9va3MgPSB0YWJsZS0+aW5mby52YWxpZF9ob29rczsNCiAgICB0YWJsZS0+ cmVwbGFjZS5udW1fZW50cmllcyA9IHRhYmxlLT5pbmZvLm51bV9lbnRyaWVzOw0KICAgIHRhYmxl LT5yZXBsYWNlLnNpemUgPSB0YWJsZS0+aW5mby5zaXplOw0KICAgIG1lbWNweSh0YWJsZS0+cmVw bGFjZS5ob29rX2VudHJ5LCB0YWJsZS0+aW5mby5ob29rX2VudHJ5LA0KICAgICAgICAgICBzaXpl b2YodGFibGUtPnJlcGxhY2UuaG9va19lbnRyeSkpOw0KICAgIG1lbWNweSh0YWJsZS0+cmVwbGFj ZS51bmRlcmZsb3csIHRhYmxlLT5pbmZvLnVuZGVyZmxvdywNCiAgICAgICAgICAgc2l6ZW9mKHRh YmxlLT5yZXBsYWNlLnVuZGVyZmxvdykpOw0KICAgIG1lbWNweSh0YWJsZS0+cmVwbGFjZS5lbnRy eXRhYmxlLCBlbnRyaWVzLmVudHJ5dGFibGUsIHRhYmxlLT5pbmZvLnNpemUpOw0KICB9DQogIGNs b3NlKGZkKTsNCn0NCg0Kc3RhdGljIHZvaWQgcmVzZXRfaXB0YWJsZXMoc3RydWN0IGlwdF90YWJs ZV9kZXNjKiB0YWJsZXMsIGludCBudW1fdGFibGVzLA0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgaW50IGZhbWlseSwgaW50IGxldmVsKSB7DQogIHN0cnVjdCB4dF9jb3VudGVycyBjb3VudGVy c1tYVF9NQVhfRU5UUklFU107DQogIHN0cnVjdCBpcHRfZ2V0X2VudHJpZXMgZW50cmllczsNCiAg c3RydWN0IGlwdF9nZXRpbmZvIGluZm87DQogIHNvY2tsZW5fdCBvcHRsZW47DQogIGludCBmZCwg aTsNCg0KICBmZCA9IHNvY2tldChmYW1pbHksIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7DQog IGlmIChmZCA9PSAtMSkgew0KICAgIHN3aXRjaCAoZXJybm8pIHsNCiAgICAgIGNhc2UgRUFGTk9T VVBQT1JUOg0KICAgICAgY2FzZSBFTk9QUk9UT09QVDoNCiAgICAgICAgcmV0dXJuOw0KICAgIH0N CiAgICBmYWlsKCJzb2NrZXQoJWQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCkiLCBmYW1pbHkp Ow0KICB9DQogIGZvciAoaSA9IDA7IGkgPCBudW1fdGFibGVzOyBpKyspIHsNCiAgICBzdHJ1Y3Qg aXB0X3RhYmxlX2Rlc2MqIHRhYmxlID0gJnRhYmxlc1tpXTsNCiAgICBpZiAodGFibGUtPmluZm8u dmFsaWRfaG9va3MgPT0gMCkgY29udGludWU7DQogICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2Yo aW5mbykpOw0KICAgIHN0cmNweShpbmZvLm5hbWUsIHRhYmxlLT5uYW1lKTsNCiAgICBvcHRsZW4g PSBzaXplb2YoaW5mbyk7DQogICAgaWYgKGdldHNvY2tvcHQoZmQsIGxldmVsLCBJUFRfU09fR0VU X0lORk8sICZpbmZvLCAmb3B0bGVuKSkNCiAgICAgIGZhaWwoImdldHNvY2tvcHQoSVBUX1NPX0dF VF9JTkZPKSIpOw0KICAgIGlmIChtZW1jbXAoJnRhYmxlLT5pbmZvLCAmaW5mbywgc2l6ZW9mKHRh YmxlLT5pbmZvKSkgPT0gMCkgew0KICAgICAgbWVtc2V0KCZlbnRyaWVzLCAwLCBzaXplb2YoZW50 cmllcykpOw0KICAgICAgc3RyY3B5KGVudHJpZXMubmFtZSwgdGFibGUtPm5hbWUpOw0KICAgICAg ZW50cmllcy5zaXplID0gdGFibGUtPmluZm8uc2l6ZTsNCiAgICAgIG9wdGxlbiA9IHNpemVvZihl bnRyaWVzKSAtIHNpemVvZihlbnRyaWVzLmVudHJ5dGFibGUpICsgZW50cmllcy5zaXplOw0KICAg ICAgaWYgKGdldHNvY2tvcHQoZmQsIGxldmVsLCBJUFRfU09fR0VUX0VOVFJJRVMsICZlbnRyaWVz LCAmb3B0bGVuKSkNCiAgICAgICAgZmFpbCgiZ2V0c29ja29wdChJUFRfU09fR0VUX0VOVFJJRVMp Iik7DQogICAgICBpZiAobWVtY21wKHRhYmxlLT5yZXBsYWNlLmVudHJ5dGFibGUsIGVudHJpZXMu ZW50cnl0YWJsZSwNCiAgICAgICAgICAgICAgICAgdGFibGUtPmluZm8uc2l6ZSkgPT0gMCkNCiAg ICAgICAgY29udGludWU7DQogICAgfQ0KICAgICAgICB0YWJsZS0+cmVwbGFjZS5udW1fY291bnRl cnMgPSBpbmZvLm51bV9lbnRyaWVzOw0KICAgIHRhYmxlLT5yZXBsYWNlLmNvdW50ZXJzID0gY291 bnRlcnM7DQogICAgb3B0bGVuID0gc2l6ZW9mKHRhYmxlLT5yZXBsYWNlKSAtIHNpemVvZih0YWJs ZS0+cmVwbGFjZS5lbnRyeXRhYmxlKSArDQogICAgICAgICAgICAgdGFibGUtPnJlcGxhY2Uuc2l6 ZTsNCiAgICBpZiAoc2V0c29ja29wdChmZCwgbGV2ZWwsIElQVF9TT19TRVRfUkVQTEFDRSwgJnRh YmxlLT5yZXBsYWNlLCBvcHRsZW4pKQ0KICAgICAgZmFpbCgic2V0c29ja29wdChJUFRfU09fU0VU X1JFUExBQ0UpIik7DQogIH0NCiAgY2xvc2UoZmQpOw0KfQ0KDQpzdGF0aWMgdm9pZCBjaGVja3Bv aW50X2FycHRhYmxlcyh2b2lkKSB7DQogIHN0cnVjdCBhcnB0X2dldF9lbnRyaWVzIGVudHJpZXM7 DQogIHNvY2tsZW5fdCBvcHRsZW47DQogIHVuc2lnbmVkIGk7DQogIGludCBmZDsNCg0KICBmZCA9 IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOw0KICBpZiAoZmQgPT0g LTEpIGZhaWwoInNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIik7DQog IGZvciAoaSA9IDA7IGkgPCBzaXplb2YoYXJwdF90YWJsZXMpIC8gc2l6ZW9mKGFycHRfdGFibGVz WzBdKTsgaSsrKSB7DQogICAgc3RydWN0IGFycHRfdGFibGVfZGVzYyogdGFibGUgPSAmYXJwdF90 YWJsZXNbaV07DQogICAgc3RyY3B5KHRhYmxlLT5pbmZvLm5hbWUsIHRhYmxlLT5uYW1lKTsNCiAg ICBzdHJjcHkodGFibGUtPnJlcGxhY2UubmFtZSwgdGFibGUtPm5hbWUpOw0KICAgIG9wdGxlbiA9 IHNpemVvZih0YWJsZS0+aW5mbyk7DQogICAgaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9JUCwgQVJQ VF9TT19HRVRfSU5GTywgJnRhYmxlLT5pbmZvLCAmb3B0bGVuKSkgew0KICAgICAgc3dpdGNoIChl cnJubykgew0KICAgICAgICBjYXNlIEVQRVJNOg0KICAgICAgICBjYXNlIEVOT0VOVDoNCiAgICAg ICAgY2FzZSBFTk9QUk9UT09QVDoNCiAgICAgICAgICBjb250aW51ZTsNCiAgICAgIH0NCiAgICAg IGZhaWwoImdldHNvY2tvcHQoQVJQVF9TT19HRVRfSU5GTykiKTsNCiAgICB9DQogICAgaWYgKHRh YmxlLT5pbmZvLnNpemUgPiBzaXplb2YodGFibGUtPnJlcGxhY2UuZW50cnl0YWJsZSkpDQogICAg ICBmYWlsKCJ0YWJsZSBzaXplIGlzIHRvbyBsYXJnZTogJXUiLCB0YWJsZS0+aW5mby5zaXplKTsN CiAgICBpZiAodGFibGUtPmluZm8ubnVtX2VudHJpZXMgPiBYVF9NQVhfRU5UUklFUykNCiAgICAg IGZhaWwoInRvbyBtYW55IGNvdW50ZXJzOiAldSIsIHRhYmxlLT5pbmZvLm51bV9lbnRyaWVzKTsN CiAgICBtZW1zZXQoJmVudHJpZXMsIDAsIHNpemVvZihlbnRyaWVzKSk7DQogICAgc3RyY3B5KGVu dHJpZXMubmFtZSwgdGFibGUtPm5hbWUpOw0KICAgIGVudHJpZXMuc2l6ZSA9IHRhYmxlLT5pbmZv LnNpemU7DQogICAgb3B0bGVuID0gc2l6ZW9mKGVudHJpZXMpIC0gc2l6ZW9mKGVudHJpZXMuZW50 cnl0YWJsZSkgKyB0YWJsZS0+aW5mby5zaXplOw0KICAgIGlmIChnZXRzb2Nrb3B0KGZkLCBTT0xf SVAsIEFSUFRfU09fR0VUX0VOVFJJRVMsICZlbnRyaWVzLCAmb3B0bGVuKSkNCiAgICAgIGZhaWwo ImdldHNvY2tvcHQoQVJQVF9TT19HRVRfRU5UUklFUykiKTsNCiAgICB0YWJsZS0+cmVwbGFjZS52 YWxpZF9ob29rcyA9IHRhYmxlLT5pbmZvLnZhbGlkX2hvb2tzOw0KICAgIHRhYmxlLT5yZXBsYWNl Lm51bV9lbnRyaWVzID0gdGFibGUtPmluZm8ubnVtX2VudHJpZXM7DQogICAgdGFibGUtPnJlcGxh Y2Uuc2l6ZSA9IHRhYmxlLT5pbmZvLnNpemU7DQogICAgbWVtY3B5KHRhYmxlLT5yZXBsYWNlLmhv b2tfZW50cnksIHRhYmxlLT5pbmZvLmhvb2tfZW50cnksDQogICAgICAgICAgIHNpemVvZih0YWJs ZS0+cmVwbGFjZS5ob29rX2VudHJ5KSk7DQogICAgbWVtY3B5KHRhYmxlLT5yZXBsYWNlLnVuZGVy ZmxvdywgdGFibGUtPmluZm8udW5kZXJmbG93LA0KICAgICAgICAgICBzaXplb2YodGFibGUtPnJl cGxhY2UudW5kZXJmbG93KSk7DQogICAgbWVtY3B5KHRhYmxlLT5yZXBsYWNlLmVudHJ5dGFibGUs IGVudHJpZXMuZW50cnl0YWJsZSwgdGFibGUtPmluZm8uc2l6ZSk7DQogIH0NCiAgY2xvc2UoZmQp Ow0KfQ0KDQpzdGF0aWMgdm9pZCByZXNldF9hcnB0YWJsZXMoKSB7DQogIHN0cnVjdCB4dF9jb3Vu dGVycyBjb3VudGVyc1tYVF9NQVhfRU5UUklFU107DQogIHN0cnVjdCBhcnB0X2dldF9lbnRyaWVz IGVudHJpZXM7DQogIHN0cnVjdCBhcnB0X2dldGluZm8gaW5mbzsNCiAgc29ja2xlbl90IG9wdGxl bjsNCiAgdW5zaWduZWQgaTsNCiAgaW50IGZkOw0KDQogIGZkID0gc29ja2V0KEFGX0lORVQsIFNP Q0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7DQogIGlmIChmZCA9PSAtMSkgZmFpbCgic29ja2V0KEFG X0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCkiKTsNCiAgZm9yIChpID0gMDsgaSA8IHNp emVvZihhcnB0X3RhYmxlcykgLyBzaXplb2YoYXJwdF90YWJsZXNbMF0pOyBpKyspIHsNCiAgICBz dHJ1Y3QgYXJwdF90YWJsZV9kZXNjKiB0YWJsZSA9ICZhcnB0X3RhYmxlc1tpXTsNCiAgICBpZiAo dGFibGUtPmluZm8udmFsaWRfaG9va3MgPT0gMCkgY29udGludWU7DQogICAgbWVtc2V0KCZpbmZv LCAwLCBzaXplb2YoaW5mbykpOw0KICAgIHN0cmNweShpbmZvLm5hbWUsIHRhYmxlLT5uYW1lKTsN CiAgICBvcHRsZW4gPSBzaXplb2YoaW5mbyk7DQogICAgaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9J UCwgQVJQVF9TT19HRVRfSU5GTywgJmluZm8sICZvcHRsZW4pKQ0KICAgICAgZmFpbCgiZ2V0c29j a29wdChBUlBUX1NPX0dFVF9JTkZPKSIpOw0KICAgIGlmIChtZW1jbXAoJnRhYmxlLT5pbmZvLCAm aW5mbywgc2l6ZW9mKHRhYmxlLT5pbmZvKSkgPT0gMCkgew0KICAgICAgbWVtc2V0KCZlbnRyaWVz LCAwLCBzaXplb2YoZW50cmllcykpOw0KICAgICAgc3RyY3B5KGVudHJpZXMubmFtZSwgdGFibGUt Pm5hbWUpOw0KICAgICAgZW50cmllcy5zaXplID0gdGFibGUtPmluZm8uc2l6ZTsNCiAgICAgIG9w dGxlbiA9IHNpemVvZihlbnRyaWVzKSAtIHNpemVvZihlbnRyaWVzLmVudHJ5dGFibGUpICsgZW50 cmllcy5zaXplOw0KICAgICAgaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9JUCwgQVJQVF9TT19HRVRf RU5UUklFUywgJmVudHJpZXMsICZvcHRsZW4pKQ0KICAgICAgICBmYWlsKCJnZXRzb2Nrb3B0KEFS UFRfU09fR0VUX0VOVFJJRVMpIik7DQogICAgICBpZiAobWVtY21wKHRhYmxlLT5yZXBsYWNlLmVu dHJ5dGFibGUsIGVudHJpZXMuZW50cnl0YWJsZSwNCiAgICAgICAgICAgICAgICAgdGFibGUtPmlu Zm8uc2l6ZSkgPT0gMCkNCiAgICAgICAgY29udGludWU7DQogICAgfQ0KICAgICAgICB0YWJsZS0+ cmVwbGFjZS5udW1fY291bnRlcnMgPSBpbmZvLm51bV9lbnRyaWVzOw0KICAgIHRhYmxlLT5yZXBs YWNlLmNvdW50ZXJzID0gY291bnRlcnM7DQogICAgb3B0bGVuID0gc2l6ZW9mKHRhYmxlLT5yZXBs YWNlKSAtIHNpemVvZih0YWJsZS0+cmVwbGFjZS5lbnRyeXRhYmxlKSArDQogICAgICAgICAgICAg dGFibGUtPnJlcGxhY2Uuc2l6ZTsNCiAgICBpZiAoc2V0c29ja29wdChmZCwgU09MX0lQLCBBUlBU X1NPX1NFVF9SRVBMQUNFLCAmdGFibGUtPnJlcGxhY2UsIG9wdGxlbikpDQogICAgICBmYWlsKCJz ZXRzb2Nrb3B0KEFSUFRfU09fU0VUX1JFUExBQ0UpIik7DQogIH0NCiAgY2xvc2UoZmQpOw0KfQ0K I2luY2x1ZGUgPGxpbnV4L2lmLmg+DQojaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9l YnRhYmxlcy5oPg0KDQpzdHJ1Y3QgZWJ0X3RhYmxlX2Rlc2Mgew0KICBjb25zdCBjaGFyKiBuYW1l Ow0KICBzdHJ1Y3QgZWJ0X3JlcGxhY2UgcmVwbGFjZTsNCiAgY2hhciBlbnRyeXRhYmxlW1hUX1RB QkxFX1NJWkVdOw0KfTsNCg0Kc3RhdGljIHN0cnVjdCBlYnRfdGFibGVfZGVzYyBlYnRfdGFibGVz W10gPSB7DQogIHsubmFtZSA9ICJmaWx0ZXIiIH0sIHsubmFtZSA9ICJuYXQiIH0sIHsubmFtZSA9 ICJicm91dGUiIH0sDQp9Ow0KDQpzdGF0aWMgdm9pZCBjaGVja3BvaW50X2VidGFibGVzKHZvaWQp IHsNCiAgc29ja2xlbl90IG9wdGxlbjsNCiAgdW5zaWduZWQgaTsNCiAgaW50IGZkOw0KDQogIGZk ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7DQogIGlmIChmZCA9 PSAtMSkgZmFpbCgic29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCkiKTsN CiAgZm9yIChpID0gMDsgaSA8IHNpemVvZihlYnRfdGFibGVzKSAvIHNpemVvZihlYnRfdGFibGVz WzBdKTsgaSsrKSB7DQogICAgc3RydWN0IGVidF90YWJsZV9kZXNjKiB0YWJsZSA9ICZlYnRfdGFi bGVzW2ldOw0KICAgIHN0cmNweSh0YWJsZS0+cmVwbGFjZS5uYW1lLCB0YWJsZS0+bmFtZSk7DQog ICAgb3B0bGVuID0gc2l6ZW9mKHRhYmxlLT5yZXBsYWNlKTsNCiAgICBpZiAoZ2V0c29ja29wdChm ZCwgU09MX0lQLCBFQlRfU09fR0VUX0lOSVRfSU5GTywgJnRhYmxlLT5yZXBsYWNlLA0KICAgICAg ICAgICAgICAgICAgICZvcHRsZW4pKSB7DQogICAgICBzd2l0Y2ggKGVycm5vKSB7DQogICAgICAg IGNhc2UgRVBFUk06DQogICAgICAgIGNhc2UgRU5PRU5UOg0KICAgICAgICBjYXNlIEVOT1BST1RP T1BUOg0KICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgfQ0KICAgICAgZmFpbCgiZ2V0c29ja29w dChFQlRfU09fR0VUX0lOSVRfSU5GTykiKTsNCiAgICB9DQogICAgICBpZiAodGFibGUtPnJlcGxh Y2UuZW50cmllc19zaXplID4gc2l6ZW9mKHRhYmxlLT5lbnRyeXRhYmxlKSkNCiAgICAgIGZhaWwo InRhYmxlIHNpemUgaXMgdG9vIGxhcmdlOiAldSIsIHRhYmxlLT5yZXBsYWNlLmVudHJpZXNfc2l6 ZSk7DQogICAgdGFibGUtPnJlcGxhY2UubnVtX2NvdW50ZXJzID0gMDsNCiAgICB0YWJsZS0+cmVw bGFjZS5lbnRyaWVzID0gdGFibGUtPmVudHJ5dGFibGU7DQogICAgb3B0bGVuID0gc2l6ZW9mKHRh YmxlLT5yZXBsYWNlKSArIHRhYmxlLT5yZXBsYWNlLmVudHJpZXNfc2l6ZTsNCiAgICBpZiAoZ2V0 c29ja29wdChmZCwgU09MX0lQLCBFQlRfU09fR0VUX0lOSVRfRU5UUklFUywgJnRhYmxlLT5yZXBs YWNlLA0KICAgICAgICAgICAgICAgICAgICZvcHRsZW4pKQ0KICAgICAgZmFpbCgiZ2V0c29ja29w dChFQlRfU09fR0VUX0lOSVRfRU5UUklFUykiKTsNCiAgfQ0KICBjbG9zZShmZCk7DQp9DQoNCnN0 YXRpYyB2b2lkIHJlc2V0X2VidGFibGVzKCkgew0KICBzdHJ1Y3QgZWJ0X3JlcGxhY2UgcmVwbGFj ZTsNCiAgY2hhciBlbnRyeXRhYmxlW1hUX1RBQkxFX1NJWkVdOw0KICBzb2NrbGVuX3Qgb3B0bGVu Ow0KICB1bnNpZ25lZCBpLCBqLCBoOw0KICBpbnQgZmQ7DQoNCiAgZmQgPSBzb2NrZXQoQUZfSU5F VCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsNCiAgaWYgKGZkID09IC0xKSBmYWlsKCJzb2Nr ZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSIpOw0KICBmb3IgKGkgPSAwOyBp IDwgc2l6ZW9mKGVidF90YWJsZXMpIC8gc2l6ZW9mKGVidF90YWJsZXNbMF0pOyBpKyspIHsNCiAg ICBzdHJ1Y3QgZWJ0X3RhYmxlX2Rlc2MqIHRhYmxlID0gJmVidF90YWJsZXNbaV07DQogICAgaWYg KHRhYmxlLT5yZXBsYWNlLnZhbGlkX2hvb2tzID09IDApIGNvbnRpbnVlOw0KICAgIG1lbXNldCgm cmVwbGFjZSwgMCwgc2l6ZW9mKHJlcGxhY2UpKTsNCiAgICBzdHJjcHkocmVwbGFjZS5uYW1lLCB0 YWJsZS0+bmFtZSk7DQogICAgb3B0bGVuID0gc2l6ZW9mKHJlcGxhY2UpOw0KICAgIGlmIChnZXRz b2Nrb3B0KGZkLCBTT0xfSVAsIEVCVF9TT19HRVRfSU5GTywgJnJlcGxhY2UsICZvcHRsZW4pKQ0K ICAgICAgZmFpbCgiZ2V0c29ja29wdChFQlRfU09fR0VUX0lORk8pIik7DQogICAgcmVwbGFjZS5u dW1fY291bnRlcnMgPSAwOw0KICAgIHRhYmxlLT5yZXBsYWNlLmVudHJpZXMgPSAwOw0KICAgIGZv ciAoaCA9IDA7IGggPCBORl9CUl9OVU1IT09LUzsgaCsrKQ0KICAgICAgdGFibGUtPnJlcGxhY2Uu aG9va19lbnRyeVtoXSA9IDA7DQogICAgaWYgKG1lbWNtcCgmdGFibGUtPnJlcGxhY2UsICZyZXBs YWNlLCBzaXplb2YodGFibGUtPnJlcGxhY2UpKSA9PSAwKSB7DQogICAgICBtZW1zZXQoJmVudHJ5 dGFibGUsIDAsIHNpemVvZihlbnRyeXRhYmxlKSk7DQogICAgICByZXBsYWNlLmVudHJpZXMgPSBl bnRyeXRhYmxlOw0KICAgICAgb3B0bGVuID0gc2l6ZW9mKHJlcGxhY2UpICsgcmVwbGFjZS5lbnRy aWVzX3NpemU7DQogICAgICBpZiAoZ2V0c29ja29wdChmZCwgU09MX0lQLCBFQlRfU09fR0VUX0VO VFJJRVMsICZyZXBsYWNlLCAmb3B0bGVuKSkNCiAgICAgICAgZmFpbCgiZ2V0c29ja29wdChFQlRf U09fR0VUX0VOVFJJRVMpIik7DQogICAgICBpZiAobWVtY21wKHRhYmxlLT5lbnRyeXRhYmxlLCBl bnRyeXRhYmxlLCByZXBsYWNlLmVudHJpZXNfc2l6ZSkgPT0gMCkNCiAgICAgICAgY29udGludWU7 DQogICAgfQ0KICAgICAgICBmb3IgKGogPSAwLCBoID0gMDsgaCA8IE5GX0JSX05VTUhPT0tTOyBo KyspIHsNCiAgICAgIGlmICh0YWJsZS0+cmVwbGFjZS52YWxpZF9ob29rcyAmICgxIDw8IGgpKSB7 DQogICAgICAgIHRhYmxlLT5yZXBsYWNlLmhvb2tfZW50cnlbaF0gPQ0KICAgICAgICAgICAgKHN0 cnVjdCBlYnRfZW50cmllcyopdGFibGUtPmVudHJ5dGFibGUgKyBqOw0KICAgICAgICBqKys7DQog ICAgICB9DQogICAgfQ0KICAgIHRhYmxlLT5yZXBsYWNlLmVudHJpZXMgPSB0YWJsZS0+ZW50cnl0 YWJsZTsNCiAgICBvcHRsZW4gPSBzaXplb2YodGFibGUtPnJlcGxhY2UpICsgdGFibGUtPnJlcGxh Y2UuZW50cmllc19zaXplOw0KICAgIGlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfSVAsIEVCVF9TT19T RVRfRU5UUklFUywgJnRhYmxlLT5yZXBsYWNlLCBvcHRsZW4pKQ0KICAgICAgZmFpbCgic2V0c29j a29wdChFQlRfU09fU0VUX0VOVFJJRVMpIik7DQogIH0NCiAgY2xvc2UoZmQpOw0KfQ0KDQpzdGF0 aWMgdm9pZCBjaGVja3BvaW50X25ldF9uYW1lc3BhY2Uodm9pZCkgew0KICBjaGVja3BvaW50X2Vi dGFibGVzKCk7DQogIGNoZWNrcG9pbnRfYXJwdGFibGVzKCk7DQogIGNoZWNrcG9pbnRfaXB0YWJs ZXMoaXB2NF90YWJsZXMsIHNpemVvZihpcHY0X3RhYmxlcykgLyBzaXplb2YoaXB2NF90YWJsZXNb MF0pLA0KICAgICAgICAgICAgICAgICAgICAgIEFGX0lORVQsIFNPTF9JUCk7DQogIGNoZWNrcG9p bnRfaXB0YWJsZXMoaXB2Nl90YWJsZXMsIHNpemVvZihpcHY2X3RhYmxlcykgLyBzaXplb2YoaXB2 Nl90YWJsZXNbMF0pLA0KICAgICAgICAgICAgICAgICAgICAgIEFGX0lORVQ2LCBTT0xfSVBWNik7 DQp9DQoNCnN0YXRpYyB2b2lkIHJlc2V0X25ldF9uYW1lc3BhY2Uodm9pZCkgew0KICByZXNldF9l YnRhYmxlcygpOw0KICByZXNldF9hcnB0YWJsZXMoKTsNCiAgcmVzZXRfaXB0YWJsZXMoaXB2NF90 YWJsZXMsIHNpemVvZihpcHY0X3RhYmxlcykgLyBzaXplb2YoaXB2NF90YWJsZXNbMF0pLA0KICAg ICAgICAgICAgICAgICBBRl9JTkVULCBTT0xfSVApOw0KICByZXNldF9pcHRhYmxlcyhpcHY2X3Rh Ymxlcywgc2l6ZW9mKGlwdjZfdGFibGVzKSAvIHNpemVvZihpcHY2X3RhYmxlc1swXSksDQogICAg ICAgICAgICAgICAgIEFGX0lORVQ2LCBTT0xfSVBWNik7DQp9DQoNCnN0YXRpYyB2b2lkIHJlbW92 ZV9kaXIoY29uc3QgY2hhciogZGlyKSB7DQogIERJUiogZHA7DQogIHN0cnVjdCBkaXJlbnQqIGVw Ow0KICBpbnQgaXRlciA9IDA7DQpyZXRyeToNCiAgd2hpbGUgKHVtb3VudDIoZGlyLCBNTlRfREVU QUNIKSA9PSAwKSB7DQogICAgICB9DQogIGRwID0gb3BlbmRpcihkaXIpOw0KICBpZiAoZHAgPT0g TlVMTCkgew0KICAgIGlmIChlcnJubyA9PSBFTUZJTEUpIHsNCiAgICAgIGV4aXRmKCJvcGVuZGly KCVzKSBmYWlsZWQgZHVlIHRvIE5PRklMRSwgZXhpdGluZyIsIGRpcik7DQogICAgfQ0KICAgIGV4 aXRmKCJvcGVuZGlyKCVzKSBmYWlsZWQiLCBkaXIpOw0KICB9DQogIHdoaWxlICgoZXAgPSByZWFk ZGlyKGRwKSkpIHsNCiAgICBpZiAoc3RyY21wKGVwLT5kX25hbWUsICIuIikgPT0gMCB8fCBzdHJj bXAoZXAtPmRfbmFtZSwgIi4uIikgPT0gMCkgY29udGludWU7DQogICAgY2hhciBmaWxlbmFtZVtG SUxFTkFNRV9NQVhdOw0KICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAi JXMvJXMiLCBkaXIsIGVwLT5kX25hbWUpOw0KICAgIHN0cnVjdCBzdGF0IHN0Ow0KICAgIGlmIChs c3RhdChmaWxlbmFtZSwgJnN0KSkgZXhpdGYoImxzdGF0KCVzKSBmYWlsZWQiLCBmaWxlbmFtZSk7 DQogICAgaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpIHsNCiAgICAgIHJlbW92ZV9kaXIoZmlsZW5h bWUpOw0KICAgICAgY29udGludWU7DQogICAgfQ0KICAgIGludCBpOw0KICAgIGZvciAoaSA9IDA7 OyBpKyspIHsNCiAgICAgICAgICAgIGlmICh1bmxpbmsoZmlsZW5hbWUpID09IDApIGJyZWFrOw0K ICAgICAgaWYgKGVycm5vID09IEVST0ZTKSB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAg ICB9DQogICAgICBpZiAoZXJybm8gIT0gRUJVU1kgfHwgaSA+IDEwMCkgZXhpdGYoInVubGluaygl cykgZmFpbGVkIiwgZmlsZW5hbWUpOw0KICAgICAgICAgICAgaWYgKHVtb3VudDIoZmlsZW5hbWUs IE1OVF9ERVRBQ0gpKSBleGl0ZigidW1vdW50KCVzKSBmYWlsZWQiLCBmaWxlbmFtZSk7DQogICAg fQ0KICB9DQogIGNsb3NlZGlyKGRwKTsNCiAgaW50IGk7DQogIGZvciAoaSA9IDA7OyBpKyspIHsN CiAgICAgICAgaWYgKHJtZGlyKGRpcikgPT0gMCkgYnJlYWs7DQogICAgaWYgKGkgPCAxMDApIHsN CiAgICAgIGlmIChlcnJubyA9PSBFUk9GUykgew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAg ICAgfQ0KICAgICAgaWYgKGVycm5vID09IEVCVVNZKSB7DQogICAgICAgICAgICAgICAgaWYgKHVt b3VudDIoZGlyLCBNTlRfREVUQUNIKSkgZXhpdGYoInVtb3VudCglcykgZmFpbGVkIiwgZGlyKTsN CiAgICAgICAgY29udGludWU7DQogICAgICB9DQogICAgICBpZiAoZXJybm8gPT0gRU5PVEVNUFRZ KSB7DQogICAgICAgIGlmIChpdGVyIDwgMTAwKSB7DQogICAgICAgICAgaXRlcisrOw0KICAgICAg ICAgIGdvdG8gcmV0cnk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgZXhpdGYoInJt ZGlyKCVzKSBmYWlsZWQiLCBkaXIpOw0KICB9DQp9DQoNCnN0YXRpYyB2b2lkIGV4ZWN1dGVfb25l KCk7DQpleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIHByb2NpZDsNCg0Kc3RhdGljIHZvaWQgbG9v cCgpIHsNCiAgaWYoMCkNCiAgICAgICAgY2hlY2twb2ludF9uZXRfbmFtZXNwYWNlKCk7DQogIGNo YXIgY2dyb3VwZGlyWzY0XTsNCiAgc25wcmludGYoY2dyb3VwZGlyLCBzaXplb2YoY2dyb3VwZGly KSwgIi9zeXpjZ3JvdXAvdW5pZmllZC9zeXolbGx1IiwgcHJvY2lkKTsNCiAgY2hhciBjZ3JvdXBk aXJfY3B1WzY0XTsNCiAgc25wcmludGYoY2dyb3VwZGlyX2NwdSwgc2l6ZW9mKGNncm91cGRpcl9j cHUpLCAiL3N5emNncm91cC9jcHUvc3l6JWxsdSIsDQogICAgICAgICAgIHByb2NpZCk7DQogIGNo YXIgY2dyb3VwZGlyX25ldFs2NF07DQogIHNucHJpbnRmKGNncm91cGRpcl9uZXQsIHNpemVvZihj Z3JvdXBkaXJfbmV0KSwgIi9zeXpjZ3JvdXAvbmV0L3N5eiVsbHUiLA0KICAgICAgICAgICBwcm9j aWQpOw0KICBpZiAobWtkaXIoY2dyb3VwZGlyLCAwNzc3KSkgew0KICAgICAgfQ0KICBpZiAobWtk aXIoY2dyb3VwZGlyX2NwdSwgMDc3NykpIHsNCiAgICAgIH0NCiAgaWYgKG1rZGlyKGNncm91cGRp cl9uZXQsIDA3NzcpKSB7DQogICAgICB9DQogIGludCBwaWQgPSBnZXRwaWQoKTsNCiAgY2hhciBw cm9jc19maWxlWzEyOF07DQogIHNucHJpbnRmKHByb2NzX2ZpbGUsIHNpemVvZihwcm9jc19maWxl KSwgIiVzL2Nncm91cC5wcm9jcyIsIGNncm91cGRpcik7DQogIGlmICghd3JpdGVfZmlsZShwcm9j c19maWxlLCAiJWQiLCBwaWQpKSB7DQogICAgICB9DQogIHNucHJpbnRmKHByb2NzX2ZpbGUsIHNp emVvZihwcm9jc19maWxlKSwgIiVzL2Nncm91cC5wcm9jcyIsIGNncm91cGRpcl9jcHUpOw0KICBp ZiAoIXdyaXRlX2ZpbGUocHJvY3NfZmlsZSwgIiVkIiwgcGlkKSkgew0KICAgICAgfQ0KICBzbnBy aW50Zihwcm9jc19maWxlLCBzaXplb2YocHJvY3NfZmlsZSksICIlcy9jZ3JvdXAucHJvY3MiLCBj Z3JvdXBkaXJfbmV0KTsNCiAgaWYgKCF3cml0ZV9maWxlKHByb2NzX2ZpbGUsICIlZCIsIHBpZCkp IHsNCiAgICAgIH0NCiAgaW50IGl0ZXI7DQogIGZvciAoaXRlciA9IDA7OyBpdGVyKyspIHsNCiAg ICBjaGFyIGN3ZGJ1ZlszMl07DQogICAgc3ByaW50Zihjd2RidWYsICIuLyVkIiwgaXRlcik7DQog ICAgaWYgKG1rZGlyKGN3ZGJ1ZiwgMDc3NykpIGZhaWwoImZhaWxlZCB0byBta2RpciIpOw0KICAg IGludCBwaWQgPSBmb3JrKCk7DQogICAgaWYgKHBpZCA8IDApIGZhaWwoImNsb25lIGZhaWxlZCIp Ow0KICAgIGlmIChwaWQgPT0gMCkgew0KICAgICAgcHJjdGwoUFJfU0VUX1BERUFUSFNJRywgU0lH S0lMTCwgMCwgMCwgMCk7DQogICAgICBzZXRwZ3JwKCk7DQogICAgICBpZiAoY2hkaXIoY3dkYnVm KSkgZmFpbCgiZmFpbGVkIHRvIGNoZGlyIik7DQogICAgICBpZiAoc3ltbGluayhjZ3JvdXBkaXIs ICIuL2Nncm91cCIpKSB7DQogICAgICAgICAgICAgIH0NCiAgICAgIGlmIChzeW1saW5rKGNncm91 cGRpcl9jcHUsICIuL2Nncm91cC5jcHUiKSkgew0KICAgICAgICAgICAgICB9DQogICAgICBpZiAo c3ltbGluayhjZ3JvdXBkaXJfbmV0LCAiLi9jZ3JvdXAubmV0IikpIHsNCiAgICAgICAgICAgICAg fQ0KICAgICAgZmx1c2hfdHVuKCk7DQogICAgICBleGVjdXRlX29uZSgpOw0KICAgICAgICAgICAg ZG9leGl0KDApOw0KICAgIH0NCg0KICAgIGludCBzdGF0dXMgPSAwOw0KICAgIHVpbnQ2NF90IHN0 YXJ0ID0gY3VycmVudF90aW1lX21zKCk7DQogICAgZm9yICg7Oykgew0KICAgICAgaW50IHJlcyA9 IHdhaXRwaWQoLTEsICZzdGF0dXMsIF9fV0FMTCB8IFdOT0hBTkcpOw0KICAgICAgaWYgKHJlcyA9 PSBwaWQpIHsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICAgIHVzbGVlcCgx MDAwKTsNCiAgICAgIGlmIChjdXJyZW50X3RpbWVfbXMoKSAtIHN0YXJ0IDwgMyAqIDEwMDApIGNv bnRpbnVlOw0KICAgICAgICAgICAgICAgICAga2lsbCgtcGlkLCBTSUdLSUxMKTsNCiAgICAgIGtp bGwocGlkLCBTSUdLSUxMKTsNCiAgICAgIHdoaWxlICh3YWl0cGlkKC0xLCAmc3RhdHVzLCBfX1dB TEwpICE9IHBpZCkgew0KICAgICAgfQ0KICAgICAgYnJlYWs7DQogICAgfQ0KICAgIHJlbW92ZV9k aXIoY3dkYnVmKTsNCiAgICBpZigwKQ0KICAgICAgICByZXNldF9uZXRfbmFtZXNwYWNlKCk7DQog IH0NCn0NCg0Kc3RydWN0IHRocmVhZF90IHsNCiAgaW50IGNyZWF0ZWQsIHJ1bm5pbmcsIGNhbGw7 DQogIHB0aHJlYWRfdCB0aDsNCn07DQoNCnN0YXRpYyBzdHJ1Y3QgdGhyZWFkX3QgdGhyZWFkc1sx Nl07DQpzdGF0aWMgdm9pZCBleGVjdXRlX2NhbGwoaW50IGNhbGwpOw0Kc3RhdGljIGludCBydW5u aW5nOw0Kc3RhdGljIGludCBjb2xsaWRlOw0KDQpzdGF0aWMgdm9pZCogdGhyKHZvaWQqIGFyZykg ew0KICBzdHJ1Y3QgdGhyZWFkX3QqIHRoID0gKHN0cnVjdCB0aHJlYWRfdCopYXJnOw0KICBmb3Ig KDs7KSB7DQogICAgd2hpbGUgKCFfX2F0b21pY19sb2FkX24oJnRoLT5ydW5uaW5nLCBfX0FUT01J Q19BQ1FVSVJFKSkNCiAgICAgIHN5c2NhbGwoU1lTX2Z1dGV4LCAmdGgtPnJ1bm5pbmcsIEZVVEVY X1dBSVQsIDAsIDApOw0KICAgIGV4ZWN1dGVfY2FsbCh0aC0+Y2FsbCk7DQogICAgX19hdG9taWNf ZmV0Y2hfc3ViKCZydW5uaW5nLCAxLCBfX0FUT01JQ19SRUxBWEVEKTsNCiAgICBfX2F0b21pY19z dG9yZV9uKCZ0aC0+cnVubmluZywgMCwgX19BVE9NSUNfUkVMRUFTRSk7DQogICAgc3lzY2FsbChT WVNfZnV0ZXgsICZ0aC0+cnVubmluZywgRlVURVhfV0FLRSk7DQogIH0NCiAgcmV0dXJuIDA7DQp9 DQoNCnN0YXRpYyB2b2lkIGV4ZWN1dGUoaW50IG51bV9jYWxscykgew0KICBpbnQgY2FsbCwgdGhy ZWFkOw0KICBydW5uaW5nID0gMDsNCiAgZm9yIChjYWxsID0gMDsgY2FsbCA8IG51bV9jYWxsczsg Y2FsbCsrKSB7DQogICAgZm9yICh0aHJlYWQgPSAwOyB0aHJlYWQgPCBzaXplb2YodGhyZWFkcykg LyBzaXplb2YodGhyZWFkc1swXSk7IHRocmVhZCsrKSB7DQogICAgICBzdHJ1Y3QgdGhyZWFkX3Qq IHRoID0gJnRocmVhZHNbdGhyZWFkXTsNCiAgICAgIGlmICghdGgtPmNyZWF0ZWQpIHsNCiAgICAg ICAgdGgtPmNyZWF0ZWQgPSAxOw0KICAgICAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOw0KICAgICAg ICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7DQogICAgICAgIHB0aHJlYWRfYXR0cl9zZXRzdGFj a3NpemUoJmF0dHIsIDEyOCA8PCAxMCk7DQogICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aC0+dGgs ICZhdHRyLCB0aHIsIHRoKTsNCiAgICAgIH0NCiAgICAgIGlmICghX19hdG9taWNfbG9hZF9uKCZ0 aC0+cnVubmluZywgX19BVE9NSUNfQUNRVUlSRSkpIHsNCiAgICAgICAgdGgtPmNhbGwgPSBjYWxs Ow0KICAgICAgICBfX2F0b21pY19mZXRjaF9hZGQoJnJ1bm5pbmcsIDEsIF9fQVRPTUlDX1JFTEFY RUQpOw0KICAgICAgICBfX2F0b21pY19zdG9yZV9uKCZ0aC0+cnVubmluZywgMSwgX19BVE9NSUNf UkVMRUFTRSk7DQogICAgICAgIHN5c2NhbGwoU1lTX2Z1dGV4LCAmdGgtPnJ1bm5pbmcsIEZVVEVY X1dBS0UpOw0KICAgICAgICBpZiAoY29sbGlkZSAmJiBjYWxsICUgMikgYnJlYWs7DQogICAgICAg IHN0cnVjdCB0aW1lc3BlYyB0czsNCiAgICAgICAgdHMudHZfc2VjID0gMDsNCiAgICAgICAgdHMu dHZfbnNlYyA9IDIwICogMTAwMCAqIDEwMDA7DQogICAgICAgIHN5c2NhbGwoU1lTX2Z1dGV4LCAm dGgtPnJ1bm5pbmcsIEZVVEVYX1dBSVQsIDEsICZ0cyk7DQogICAgICAgIGlmIChydW5uaW5nKSB1 c2xlZXAoKGNhbGwgPT0gbnVtX2NhbGxzIC0gMSkgPyAxMDAwMCA6IDEwMDApOw0KICAgICAgICBi cmVhazsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KI2lmbmRlZiBfX05SX21tYXANCiNkZWZp bmUgX19OUl9tbWFwIDIyMg0KI2VuZGlmDQojaWZuZGVmIF9fTlJfc29ja2V0DQojZGVmaW5lIF9f TlJfc29ja2V0IDE5OA0KI2VuZGlmDQojaWZuZGVmIF9fTlJfc2VuZG1zZw0KI2RlZmluZSBfX05S X3NlbmRtc2cgMjExDQojZW5kaWYNCg0KdWludDY0X3QgclsxXSA9IHsweGZmZmZmZmZmZmZmZmZm ZmZ9Ow0KdW5zaWduZWQgbG9uZyBsb25nIHByb2NpZDsNCnZvaWQgZXhlY3V0ZV9jYWxsKGludCBj YWxsKQ0Kew0KICAgICAgICBsb25nIHJlczsgICAgICAgc3dpdGNoIChjYWxsKSB7DQogICAgICAg IGNhc2UgMDoNCiAgICAgICAgICAgICAgICByZXMgPSBzeXNjYWxsKF9fTlJfc29ja2V0LCAweGYs IDMsIDIpOw0KICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gLTEpDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJbMF0gPSByZXM7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAg ICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICBOT05GQUlMSU5HKCoodWludDY0X3QqKTB4MjAw MDAxODAgPSAwKTsNCiAgICAgICAgICAgICAgICBOT05GQUlMSU5HKCoodWludDMyX3QqKTB4MjAw MDAxODggPSAwKTsNCiAgICAgICAgICAgICAgICBOT05GQUlMSU5HKCoodWludDY0X3QqKTB4MjAw MDAxOTAgPSAweDIwMDAwMzQwKTsNCiAgICAgICAgICAgICAgICBOT05GQUlMSU5HKCoodWludDY0 X3QqKTB4MjAwMDAzNDAgPSAweDIwMDAwMDgwKTsNCiAgICAgICAgICAgICAgICBOT05GQUlMSU5H KG1lbWNweSgodm9pZCopMHgyMDAwMDA4MCwgIlx4MDJceDBiXHg4MFx4MDFceDAyXHgwMFx4MDBc eDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiLCAxNikpOw0KICAgICAgICAgICAg ICAgIE5PTkZBSUxJTkcoKih1aW50NjRfdCopMHgyMDAwMDM0OCA9IDB4MTApOw0KICAgICAgICAg ICAgICAgIE5PTkZBSUxJTkcoKih1aW50NjRfdCopMHgyMDAwMDE5OCA9IDEpOw0KICAgICAgICAg ICAgICAgIE5PTkZBSUxJTkcoKih1aW50NjRfdCopMHgyMDAwMDFhMCA9IDApOw0KICAgICAgICAg ICAgICAgIE5PTkZBSUxJTkcoKih1aW50NjRfdCopMHgyMDAwMDFhOCA9IDApOw0KICAgICAgICAg ICAgICAgIE5PTkZBSUxJTkcoKih1aW50MzJfdCopMHgyMDAwMDFiMCA9IDApOw0KICAgICAgICAg ICAgICAgIHN5c2NhbGwoX19OUl9zZW5kbXNnLCByWzBdLCAweDIwMDAwMTgwLCAwKTsNCiAgICAg ICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KfQ0KDQp2b2lkIGV4ZWN1dGVfb25lKCkNCnsN CiAgICAgICAgc3lzY2FsbChTWVNfd3JpdGUsIDEsICJleGVjdXRpbmcgcHJvZ3JhbVxuIiwgc3Ry bGVuKCJleGVjdXRpbmcgcHJvZ3JhbVxuIikpOw0KICAgICAgICBleGVjdXRlKDIpOw0KICAgICAg ICBjb2xsaWRlID0gMTsNCiAgICAgICAgZXhlY3V0ZSgyKTsNCn0NCg0KaW50IG1haW4oKQ0Kew0K ICAgICAgICBzeXNjYWxsKF9fTlJfbW1hcCwgMHgyMDAwMDAwMCwgMHgxMDAwMDAwLCAzLCAweDMy LCAtMSwgMCk7DQogICAgICAgIGNoYXIgKmN3ZCA9IGdldF9jdXJyZW50X2Rpcl9uYW1lKCk7DQog ICAgICAgIGZvciAocHJvY2lkID0gMDsgcHJvY2lkIDwgMTg7IHByb2NpZCsrKSB7DQogICAgICAg ICAgICAgICAgaWYgKGZvcmsoKSA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpbnN0 YWxsX3NlZ3ZfaGFuZGxlcigpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7Oykgew0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hkaXIoY3dkKSkNCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJmYWlsZWQgdG8gY2hkaXIiKTsN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX3RlbXBvcmFyeV9kaXIoKTsNCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpZCA9IGRvX3NhbmRib3hfbm9uZSgp Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gMDsNCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCBf X1dBTEwpICE9IHBpZCkge30NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAg ICAgICB9DQogICAgICAgIH0NCiAgICAgICAgc2xlZXAoMTAwMDAwMCk7DQogICAgICAgIHJldHVy biAwOw0KfQ0K --=_7312e1fee1655bdb907677739ab76ca0--