ZGlmZiAtLWdpdCBhL2FwL2FwcC96dGVfYW10L2FtdC5jIGIvYXAvYXBwL3p0ZV9hbXQvYW10LmMKaW5kZXggOGNkODg4Yy4uNDM4YzZjMSAxMDA3NTUKLS0tIGEvYXAvYXBwL3p0ZV9hbXQvYW10LmMKKysrIGIvYXAvYXBwL3p0ZV9hbXQvYW10LmMKQEAgLTkyLDggKzkyLDExIEBACiAjaWZkZWYgVVNFX0NBUF9TVVBQT1JUDQogc3RhdGljIGludCBnX2FtdF9mZF9jYXAgPSAtMTsNCiAjZW5kaWYNCi0NCi0NCitzdGF0aWMgdW5zaWduZWQgaW50IHJhdCA9IDA7DQorc3RhdGljIHVuc2lnbmVkIGludCBhbnRfbnVtID0gMDsNCitzdGF0aWMgdm9pZCBzZW5kX29rKGludCBmZCk7DQorc3RhdGljIHZvaWQgc2VuZF9lcnJvcihpbnQgZmQpOw0KK3N0YXRpYyB2b2lkIHNlbmRfcXVlcnlfcmVzdWx0KGludCBmZCxjaGFyKiBjbWQsIGNoYXIqIHBhcmFtKTsNCiANCiANCiAvKioNCkBAIC0zMDgsNiArMzExLDE2MCBAQAogfQ0KICNlbmRpZg0KIA0KKy8qKg0KKyAqIEBicmllZiC94s72QU1Uz/vPotequ6/OqkFU19a3+7Sut6LLzbj4UEMNCisgKiBAcGFyYW1baW5dIGZkIM7EvP7D6Mr2t/sNCisgKiBAcGFyYW1baW5dIGJ1ZiC908rVyv2+3WJ1ZmZlcg0KKyAqIEBwYXJhbVtpbl0gYnVmX2xlbiC908rVyv2+3WJ1ZmZlcrOktsgNCisgKiBAcmV0dXJuILe1u9i3osvNtcTK/b7ds6S2yA0KKyAqIEBub3RlDQorICogQHNlZSANCisgKi8NCitzdGF0aWMgaW50IEF0X1NlbmREYXRhKGludCBmZCwgdW5zaWduZWQgY2hhciogYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbikNCit7DQorCXVuc2lnbmVkIGNoYXIgKnBTVFggPSBOVUxMOw0KKyAgICB1bnNpZ25lZCBjaGFyICpwRVRYID0gTlVMTDsNCisgICAgdW5zaWduZWQgY2hhciAqcFRJRCA9IE5VTEw7DQorICAgIHVuc2lnbmVkIGNoYXIgKnBGSUQgPSBOVUxMOw0KKyAgICB1bnNpZ25lZCBjaGFyICpwQ2hlY2sgPSBOVUxMOw0KKyAgICB1bnNpZ25lZCBjaGFyICpwRGF0YSA9IE5VTEw7DQorICAgIHVuc2lnbmVkIGNoYXIgQ2hlY2tTdW0gPSAwOw0KKyAgICB1bnNpZ25lZCBpbnQgbXNnX2lkOw0KKyAgICB1bnNpZ25lZCBpbnQgaSA9IDA7DQorCXVuc2lnbmVkIGludCBwaHlfbXNnX2lkOw0KKwl1bnNpZ25lZCBpbnQgcGh5X3JldDsNCisgICAgcFRJRCA9IHBUSUQ7DQorICAgIHBDaGVjayA9IHBDaGVjazsNCisgICAgcERhdGEgPSBwRGF0YTsNCisNCisgICAgcFNUWCA9ICZidWZbMF07DQorICAgIHBFVFggPSAmYnVmW2J1Zl9sZW4gLSAxXTsNCisgICAgcFRJRCA9ICZidWZbMV07DQorICAgIHBGSUQgPSAmYnVmWzEgKyAxXTsNCisgICAgcENoZWNrID0gJmJ1ZltidWZfbGVuIC0gMl07DQorICAgIHBEYXRhID0gJmJ1ZlsxICsgMSArIDFdOw0KKw0KKyAgICBpZiAoISgoMHgwMiA9PSAqcFNUWCkgJiYgKDB4MDIgPT0gKnBFVFgpKSkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorDQorICAgIENoZWNrU3VtID0gMDsNCisNCisgICAgZm9yIChpID0gMDsgaSA8IChidWZfbGVuIC0gMik7IGkrKykNCisgICAgICAgIENoZWNrU3VtIF49IGJ1ZlsxICsgaV07DQorDQorICAgIGlmIChDaGVja1N1bSAhPSAwKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgLy8gVElE0+tGSUTX6brPyrnTw9LRwKnVubmmxNy6xQ0KKyAgICBtc2dfaWQgPSAoKnBUSUQgPDwgOCkgfCAqcEZJRDsNCisNCisgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogbXNnX2lkID0gJSMwNHgsIGJ1Zl9sZW4gPSAlZC5cbiIsIF9fRlVOQ1RJT05fXywgbXNnX2lkLCBidWZfbGVuKTsNCisNCisJc3dpdGNoKG1zZ19pZCkNCisJew0KKwkgICAgLy9MVEXO78DtsuNBTVTP+8+iDQorCQljYXNlIEZJRF9MVEVBX1BIWV9NU0c6DQorCQl7DQorCQkJbWVtY3B5KCZwaHlfbXNnX2lkLCBwRGF0YSwgNCk7DQorCQkJbWVtY3B5KCZwaHlfcmV0LCBwRGF0YSArIDQsIDQpOw0KKwkJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGx0ZV9waHlfbXNnX2lkID0gJSMwNHgsIGx0ZV9waHlfcmV0ID0gJWQuXG4iLCBfX0ZVTkNUSU9OX18sIHBoeV9tc2dfaWQscGh5X3JldCk7DQorCQkJc3dpdGNoKHBoeV9tc2dfaWQpDQorCQkJew0KKwkJCQljYXNlIDB4NTA1Oi8vWkFNVF9MVEVBX0dFVF9OU1RfUlNSUA0KKwkJCQl7DQorCQkJCSAgICB0eXBlZGVmIHN0cnVjdA0KKwkJCQkgICAgew0KKwkJCQkJCVVJTlQzMiAgZHdNc2dJZDsgIC8veDA1MDUNCisJCQkJCQlVSU5UMzIgIGR3UmV0OyAgICAvLz0wLLHqyrazybmmOyDG5Mv71rWx6sq2yqew3A0KKwkJICAgIAkJCVVJTlQxNiB3QW50UnNycFs0XTsgICAvLyDX7rbgNLj2zOzP373TytVSU1JQ1rUNCisJCSAgICAJCQlVSU5UMTYgd0FudFJzc2lbMl07ICAgLy8g1ve4qMzsz9+908rVUlNTSda1tcTV+8r9sr+31g0KKwkJICAgIAkJCVVJTlQxNiB3QW50UnNzaURlY1syXTsgICAvLyDW97iozOzP373TytVSU1NJ1rW1xNChyv2yv7fWDQorCQkJCQl9VF96QU1UX0xURUFfR2V0UnNycF9Sc3A7IA0KKwkJCQkJCQ0KKwkJCSAgICAgICAgVF96QU1UX0xURUFfR2V0UnNycF9Sc3Agc3RHZXRSc3JwX1JzcCA9IHswfTsNCisJCQkJCQ0KKwkJCQkgICAgaWYocGh5X3JldCA9PSAwKQ0KKwkJCQkgICAgew0KKwkJCQkgICAgCW1lbWNweSgmc3RHZXRSc3JwX1JzcCwgcERhdGEsc2l6ZW9mKHN0R2V0UnNycF9Sc3ApKTsNCisJCQkJCQlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBSU1JQWzBdID0gJWQsIFJTUlBbMV0gPSAlZCxSU1NJWzBdID0gJWQsIFJTU0lbMV0gPSAlZCxSU1NJRGVjWzBdID0gJWQsIFJTU0lEZWNbMV0gPSAlZFxuIiwgXA0KKwkJCQkJCQlfX0ZVTkNUSU9OX18sIHN0R2V0UnNycF9Sc3Aud0FudFJzcnBbMF0sc3RHZXRSc3JwX1JzcC53QW50UnNycFsxXSxcDQorCQkJCQkJCXN0R2V0UnNycF9Sc3Aud0FudFJzc2lbMF0sc3RHZXRSc3JwX1JzcC53QW50UnNzaVsxXSxcDQorCQkJCQkJCXN0R2V0UnNycF9Sc3Aud0FudFJzc2lEZWNbMF0sc3RHZXRSc3JwX1JzcC53QW50UnNzaURlY1sxXSk7XA0KKwkJCQkJCWNoYXIgc3RyUlNTSVsxMDBdID0gezB9Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiB3QW50MFJTU0kgPSBzdEdldFJzcnBfUnNwLndBbnRSc3NpWzBdOw0KKwkJCQkJCVVJTlQxNiB3QW50MFJTU0lEZWMgPSBzdEdldFJzcnBfUnNwLndBbnRSc3NpRGVjWzBdOw0KKwkJCQkJCWRvdWJsZSBkQW50MFJTU0kgPSAoZG91YmxlKSh3QW50MFJTU0kgKyAod0FudDBSU1NJRGVjLzEyOC4wKSAtIDY1NTM1KTsNCisJCQkJCQlVSU5UMTYgd0FudDFSU1NJID0gc3RHZXRSc3JwX1JzcC53QW50UnNzaVsxXTsNCisJCQkJCQlVSU5UMTYgd0FudDFSU1NJRGVjID0gc3RHZXRSc3JwX1JzcC53QW50UnNzaURlY1sxXTsNCisJCQkJCQlkb3VibGUgZEFudDFSU1NJID0gKGRvdWJsZSkod0FudDFSU1NJICsgKHdBbnQxUlNTSURlYy8xMjguMCkgLSA2NTUzNSk7DQorCQkJCQkJDQorCQkJCQkJc3dpdGNoKGFudF9udW0pDQorCQkJCQkJew0KKwkJCQkJCSAgICAvL7vxyKHW98K3cnNzaQ0KKwkJCQkJCQljYXNlIDEwOg0KKwkJCQkJCQl7IA0KKwkJCQkJCQkgICAgc3ByaW50ZihzdHJSU1NJLCIlLjJmIixkQW50MFJTU0kpOw0KKwkJCQkJCSAgICAgICAgc2VuZF9xdWVyeV9yZXN1bHQoZmQsICJSU1NJIixzdHJSU1NJKTsNCisJCQkJCQkJCWJyZWFrOw0KKwkJCQkJCQl9DQorCQkJCQkJCS8vu/HIobiowrdyc3NpDQorCQkJCQkJCWNhc2UgMTE6DQorCQkJCQkJCXsNCisJCQkJCQkJICAgIHNwcmludGYoc3RyUlNTSSwiJS4yZiIsZEFudDFSU1NJKTsNCisJCQkJCQkgICAgICAgIHNlbmRfcXVlcnlfcmVzdWx0KGZkLCAiUlNTSSIsc3RyUlNTSSk7DQorCQkJCQkJCQlicmVhazsNCisJCQkJCQkJfQ0KKwkJCQkJCQkvL7vxyKHW97iowrdyc3NpDQorCQkJCQkJCWRlZmF1bHQ6DQorCQkJCQkJCXsNCisJCQkJCQkJICAgIHNwcmludGYoc3RyUlNTSSwiJS4yZiwlLjJmIixkQW50MFJTU0ksZEFudDFSU1NJKTsNCisJCQkJCQkgICAgICAgIHNlbmRfcXVlcnlfcmVzdWx0KGZkLCAiUlNTSSIsc3RyUlNTSSk7DQorCQkJCQkJCQlicmVhazsNCisJCQkJCQkJfQ0KKwkJCQkJICAgIH0NCisJCQkJCX0NCisJCQkJCWVsc2UNCisJCQkJCXsNCisJCQkJCQlzZW5kX2Vycm9yKGZkKTsNCisJCQkJCX0NCisJCQkJICAgIA0KKwkJCQkJYnJlYWs7DQorCQkJCX0NCisJCQkJY2FzZSAweDUwMDovL1pBTVRfTFRFQV9TRVRfTlNUX0lOSVQNCisJCQkJew0KKwkJCQkgICAgaWYocGh5X3JldCA9PSAwKQ0KKwkJCQkgICAgew0KKwkJCQkgICAgCXNlbmRfb2soZmQpOw0KKwkJCQkgICAgfQ0KKwkJCQkJZWxzZQ0KKwkJCQkJew0KKwkJCQkJCXNlbmRfZXJyb3IoZmQpOw0KKwkJCQkJfQ0KKwkJCQkJYnJlYWs7DQorCQkJCX0NCisJCQkJZGVmYXVsdDoNCisJCQkJew0KKwkJCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogbHRlX3BoeV9tc2dfaWQgPSAlIzA0eFxuIiwgX19GVU5DVElPTl9fLCBwaHlfbXNnX2lkKTsJCQ0KKwkJCQkJYnJlYWs7DQorCQkJCX0NCisJCQl9DQorCQkJDQorCQkJYnJlYWs7DQorCQl9DQorCQlkZWZhdWx0Og0KKwkJew0KKwkJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHVua25vd24gbXNnX2lkID0gJSMwNHhcbiIsIF9fRlVOQ1RJT05fXywgbXNnX2lkKTsJCQ0KKwkgICAgCWJyZWFrOw0KKwkJfQ0KKwl9DQorDQorCXJldHVybiAxOw0KKyAgICANCit9DQogDQogLyoqDQogICogQGJyaWVmILbByKFjcLLgtcS3tMChz/vPos/fs8y6r8r9DQpAQCAtMzQ1LDE3ICs1MDIsMjMgQEAKICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICBBbXRfU2VuZERhdGEoKmdfYW10X2ZkX2N1cnJlbnQsICh1bnNpZ25lZCBjaGFyICopcmVjZWl2ZV9idWZmZXIsIHJlYWRfbGVuKTsNCiAgICAgICAgICAgICAgICAgfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCQ0KKyAgICAgICAgICAgICAgICAgICBBdF9TZW5kRGF0YSgqZ19hbXRfZmRfY3VycmVudCwgKHVuc2lnbmVkIGNoYXIgKilyZWNlaXZlX2J1ZmZlciwgcmVhZF9sZW4pOw0KKwkJCQl9DQogICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBDdXJyZW50IGZkIGlzIHdyb25nLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgICB9DQogDQotICAgICAgICAgICAgDQorI2lmIDAgICAgICAgICAgICANCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3RhdHVzID0gY3Budl9Gc0djV2FpdChGU19OVlJPRlMpOw0KICAgICAgICAgICAgIGlmKHN0YXR1cyAhPSBDUE5WX09LKQ0KICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBjcG52X0ZzR2NXYWl0IGZhaWwsIGVyciA9ICVkLlxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOw0KLSAgICAgICAgfQ0KKyNlbmRpZg0KKwkJfQ0KICAgICB9DQogDQogICAgIGZyZWUocmVjZWl2ZV9idWZmZXIpOw0KQEAgLTE2OTYsNiArMTg1OSwxNjYgQEAKIA0KIH0NCiANCitzdGF0aWMgZG91YmxlIGx0ZV9jaGFubmVsX3RvX2ZyZXEodW5zaWduZWQgaW50IGJhbmQsdW5zaWduZWQgaW50IGNoYW5uZWwsdW5zaWduZWQgaW50IGxpbmspDQorew0KKyAgICBkb3VibGUgZnJlcSA9IDA7DQorCXR5cGVkZWYgc3RydWN0DQorCXsNCisJCWludCBiYW5kOw0KKwkJZG91YmxlIGRsX2ZfbG93Ow0KKwkJaW50IGRsX25fb2Zmc2V0Ow0KKwkJZG91YmxlIHVsX2ZfbG93Ow0KKwkJaW50IHVsX25fb2Zmc2V0Ow0KKwkJfXN0THRlQ2hhbm5lbEFycmFuZ2VtZW50OyANCisNCisJc3RMdGVDaGFubmVsQXJyYW5nZW1lbnQgaW5mb1s2NF0gPSB7DQorDQorCXsgMSwgMjExMCwgMCwgMTkyMCwgMTgwMDAgfSwNCisJeyAyLCAxOTMwLCA2MDAsIDE4NTAsIDE4NjAwIH0sDQorCXsgMywgMTgwNSwgMTIwMCwgMTcxMCwgMTkyMDAgfSwNCisJeyA0LCAyMTEwLCAxOTUwLCAxNzEwLCAxOTk1MCB9LA0KKwl7IDUsIDg2OSwgMjQwMCwgODI0LCAyMDQwMCB9LA0KKwl7IDYsIDg3NSwgMjY1MCwgODMwLCAyMDY1MCB9LA0KKwl7IDcsIDI2MjAsIDI3NTAsIDI1MDAsIDIwNzUwIH0sDQorCXsgOCwgOTI1LCAzNDUwLCA4ODAsIDIxNDUwIH0sDQorCXsgOSwgMTg0NC45LCAzODAwLCAxNzQ5LjksIDIxODAwIH0sDQorCXsgMTAsIDIxMTAsIDQxNTAsIDE3MTAsIDIyMTUwIH0sDQorCXsgMTEsIDE0NzUuOSwgNDc1MCwgMTQyNy45LCAyMjc1MCB9LA0KKwl7IDEyLCA3MjksIDUwMTAsIDY5OSwgMjMwMTAgfSwNCisJeyAxMywgNzQ2LCA1MTgwLCA3NzcsIDIzMTgwIH0sDQorCXsgMTQsIDc1OCwgNTI4MCwgNzg4LCAyMzI4MCB9LA0KKwl7IDE1LCAwLCAwLCAwLCAwIH0sDQorCXsgMTYsIDAsIDAsIDAsIDAgfSwNCisJeyAxNywgNzM0LCA1NzMwLCA3MDQsIDIzNzMwIH0sDQorCXsgMTgsIDg2MCwgNTg1MCwgODE1LCAyMzg1MCB9LA0KKwl7IDE5LCA4NzUsIDYwMDAsIDgzMCwgMjQwMDAgfSwNCisJeyAyMCwgNzkxLCA2MTUwLCA4MzIsIDI0MTUwIH0sDQorCXsgMjEsIDE0OTUuOSwgNjQ1MCwgMTQ0Ny45LCAyNDQ1MCB9LA0KKwl7IDIyLCAzNTEwLCA2NjAwLCAzNDEwLCAyNDYwMCB9LA0KKwl7IDIzLCAyMTgwLCA3NTAwLCAyMDAwLCAyNTUwMCB9LA0KKwl7IDI0LCAxNTI1LCA3NzAwLCAxNjI2LjUsIDI1NzAwIH0sDQorCXsgMjUsIDE5MzAsIDgwNDAsIDE4NTAsIDI2MDQwIH0sDQorCXsgMjYsIDg1OSwgODY5MCwgODE0LCAyNjY5MCB9LA0KKwl7IDI3LCA4NTIsIDkwNDAsIDgwNywgMjcwNDAgfSwNCisJeyAyOCwgNzU4LCA5MjEwLCA3MDMsIDI3MjEwIH0sDQorCXsgMjksIDAsIDAsIDAsIDAgfSwNCisgICAgeyAzMCwgMjM1MCwgOTc3MCwgMjMwNSwgMjc2NjAgfSwNCisgICAgeyAzMSwgNDYyLjUsIDk4NzAsIDQ1Mi41LCAyNzc2MCB9LA0KKwl7IDMyLCAwLCAwLCAwLCAwIH0sDQorCXsgMzMsIDE5MDAsIDM2MDAwLCAxOTAwLCAzNjAwMCB9LA0KKwl7IDM0LCAyMDEwLCAzNjIwMCwgMjAxMCwgMzYyMDAgfSwNCisJeyAzNSwgMTg1MCwgMzYzNTAsIDE4NTAsIDM2MzUwIH0sDQorCXsgMzYsIDE5MzAsIDM2OTUwLCAxOTMwLCAzNjk1MCB9LA0KKwl7IDM3LCAxOTEwLCAzNzU1MCwgMTkxMCwgMzc1NTAgfSwNCisJeyAzOCwgMjU3MCwgMzc3NTAsIDI1NzAsIDM3NzUwIH0sDQorCXsgMzksIDE4ODAsIDM4MjUwLCAxODgwLCAzODI1MCB9LA0KKwl7IDQwLCAyMzAwLCAzODY1MCwgMjMwMCwgMzg2NTAgfSwNCisJeyA0MSwgMjQ5NiwgMzk2NTAsIDI0OTYsIDM5NjUwIH0sDQorCXsgNDIsIDM0MDAsIDQxNTkwLCAzNDAwLCA0MTU5MCB9LA0KKwl7IDQzLCAzNjAwLCA0MzU5MCwgMzYwMCwgNDM1OTAgfSwNCisJeyA0NCwgNzAzLCA0NTU5MCwgNzAzLCA0NTU5MCB9LA0KKwl7IDQ1LCAwLCAwLCAwLCAwIH0sDQorCXsgNDYsIDAsIDAsIDAsIDAgfSwNCisJeyA0NywgMCwgMCwgMCwgMCB9LA0KKwl7IDQ4LCAwLCAwLCAwLCAwIH0sDQorCXsgNDksIDAsIDAsIDAsIDAgfSwNCisJeyA1MCwgMCwgMCwgMCwgMCB9LA0KKwl7IDUxLCAwLCAwLCAwLCAwIH0sDQorCXsgNTIsIDAsIDAsIDAsIDAgfSwNCisJeyA1MywgMCwgMCwgMCwgMCB9LA0KKwl7IDU0LCAwLCAwLCAwLCAwIH0sDQorCXsgNTUsIDAsIDAsIDAsIDAgfSwNCisJeyA1NiwgMCwgMCwgMCwgMCB9LA0KKwl7IDU3LCAwLCAwLCAwLCAwIH0sDQorCXsgNTgsIDAsIDAsIDAsIDAgfSwNCisJeyA1OSwgMCwgMCwgMCwgMCB9LA0KKwl7IDYwLCAwLCAwLCAwLCAwIH0sDQorCXsgNjEsIDAsIDAsIDAsIDAgfSwNCisJeyA2MiwgMCwgMCwgMCwgMCB9LA0KKwl7IDYzLCAwLCAwLCAwLCAwIH0sDQorCXsgNjQsIDAsIDAsIDAsIDAgfSwNCisNCisJfTsNCisNCisJQW10UHJpbnRmKEFNVF9JTkZPICIlczogYmVvcmUgdHJhbnNmb3JtIGJhbmQ9JWQsY2hhbm5lbD0lZCxsaW5rPSVkLGZyZXE9JWZcbiIsIF9fRlVOQ1RJT05fXywgYmFuZCxjaGFubmVsLGxpbmssZnJlcSk7DQorDQorCWlmIChiYW5kID4gMCAmJiBiYW5kIDw9IDY0KQ0KKwl7DQorCQlmcmVxID0gaW5mb1tiYW5kIC0gMV0udWxfZl9sb3cgKyAwLjEgKiAoY2hhbm5lbCAtIGluZm9bYmFuZCAtIDFdLnVsX25fb2Zmc2V0KTsNCisgICAgICAgIGlmKGxpbmspDQorCSAgICB7DQorCSAgICAJZnJlcSA9IGluZm9bYmFuZCAtMV0uZGxfZl9sb3cgKyAwLjEgKiAoY2hhbm5lbCAtIGluZm9bYmFuZCAtIDFdLmRsX25fb2Zmc2V0KTsNCisgICAgICAgIH0NCisJfQ0KKwlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBhZnRlciB0cmFuc2Zvcm0gZnJlcT0lZlxuIiwgX19GVU5DVElPTl9fLCBmcmVxKTsNCisJcmV0dXJuIGZyZXE7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHNlbmRfbHRlX25zdF9pbml0X3BhY2tldCh1bnNpZ25lZCBpbnQgYmFuZCx1bnNpZ25lZCBpbnQgY2hhbm5lbCx1bnNpZ25lZCBpbnQgYmFuZF93aWR0aCkNCit7DQorCXR5cGVkZWYgc3RydWN0IA0KKwl7DQorICAgICAgICB1MzIgTXNnSWQ7DQorICAgICAgICB1bnNpZ25lZCBzaG9ydCB3QmFuZE51bVsyXTsgIC8vIMa1ts4NCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHdGcmVxWzJdOyAgLy8g1tDQxMa1teOjrDEwMGtIes6qtaXOuw0KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgd0JhbmRXaWR0aFsyXTsgIC8vILT4v+0NCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHdBbnRlbm5hUG9ydFsyXTsgIC8vIMzsz9+2y7/aDQorICAgICAgICB1bnNpZ25lZCBzaG9ydCB3TW9kdWxhdGlvblsyXTsgIC8vILX31sa3vcq9o6wwo7pRUFNLo6wxo7oxNlFBTaOsMqO6NjRRQU0NCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHdSYk51bVsyXTsgIC8vIHJiIG51bQ0KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgd1JiU3RhcnRQb3N0aW9uWzJdOyAgLy8gcmIgc3RhcnQNCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHdTaW5nbGVDYXJyaWVyWzJdOyAgIC8vMDq3orX31sbQxbrFIDE6t6K1pdTYsqgNCisgICAgfVRfekFNVF9MVEVBX05TVF9JTklUOw0KKwkNCisJdW5zaWduZWQgc2hvcnQgZnJlcSA9IDA7DQorICAgIGZyZXEgPSAodW5zaWduZWQgc2hvcnQpKGx0ZV9jaGFubmVsX3RvX2ZyZXEoYmFuZCxjaGFubmVsLDEpKjEwKTsNCisJDQorCQ0KKwlUX3pBTVRfTFRFQV9OU1RfSU5JVCBzdE5TVEluaXRSZXEgPSB7MH07DQorCXN0TlNUSW5pdFJlcS5Nc2dJZCA9IDB4MDUwMDsNCisJc3ROU1RJbml0UmVxLndCYW5kTnVtWzBdID0gYmFuZDsNCisJc3ROU1RJbml0UmVxLndGcmVxWzBdID0gZnJlcTsNCisJc3ROU1RJbml0UmVxLndCYW5kV2lkdGhbMF0gPSBiYW5kX3dpZHRoOw0KKwlzdE5TVEluaXRSZXEud0FudGVubmFQb3J0WzBdID0gMTsNCisJc3ROU1RJbml0UmVxLndNb2R1bGF0aW9uWzBdID0gMDsNCisJc3ROU1RJbml0UmVxLndSYk51bVswXSA9IDUwOw0KKwlzdE5TVEluaXRSZXEud1JiU3RhcnRQb3N0aW9uWzBdID0gMDsNCisJc3ROU1RJbml0UmVxLndTaW5nbGVDYXJyaWVyWzBdID0gMDsNCisNCisJQW10UHJpbnRmKEFNVF9JTkZPICIlczogc3ROU1RJbml0UmVxOk1zZ0lkPSVkLHdCYW5kTnVtWzBdPSVkLHdGcmVxWzBdPSVkLHdCYW5kV2lkdGhbMF09JWRcbiIsXA0KKwkJX19GVU5DVElPTl9fLCBzdE5TVEluaXRSZXEuTXNnSWQsc3ROU1RJbml0UmVxLndCYW5kTnVtWzBdLHN0TlNUSW5pdFJlcS53RnJlcVswXSxzdE5TVEluaXRSZXEud0JhbmRXaWR0aFswXSk7DQorCQ0KKwlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBzdE5TVEluaXRSZXE6d0FudGVubmFQb3J0WzBdPSVkLHdNb2R1bGF0aW9uWzBdPSVkLHdSYk51bVswXT0lZFxuIixcDQorCQlfX0ZVTkNUSU9OX18sIHN0TlNUSW5pdFJlcS53QW50ZW5uYVBvcnRbMF0sc3ROU1RJbml0UmVxLndNb2R1bGF0aW9uWzBdLHN0TlNUSW5pdFJlcS53UmJOdW1bMF0pOw0KKwkNCisJQW10UHJpbnRmKEFNVF9JTkZPICIlczogd1JiU3RhcnRQb3N0aW9uWzBdPSVkLHdTaW5nbGVDYXJyaWVyWzBdPSVkXG4iLFwNCisJCV9fRlVOQ1RJT05fXywgc3ROU1RJbml0UmVxLndSYlN0YXJ0UG9zdGlvblswXSxzdE5TVEluaXRSZXEud1NpbmdsZUNhcnJpZXJbMF0pOw0KKwkNCisJdW5zaWduZWQgY2hhciBsdGVfbnN0X2luaXRfcGFja2V0W3NpemVvZihzdE5TVEluaXRSZXEpKzVdID0gezB9Ow0KKwl1bnNpZ25lZCBzaG9ydCBmaWQgPSAweDAwNWY7DQorCUNyZWF0ZVNlbmRQYWNrZXQoZmlkLCh1bnNpZ25lZCBjaGFyKikmc3ROU1RJbml0UmVxLHNpemVvZihzdE5TVEluaXRSZXEpLGx0ZV9uc3RfaW5pdF9wYWNrZXQpOw0KKwlBbXRfQ29tcG9zZUFuZFByb2Nlc3MobHRlX25zdF9pbml0X3BhY2tldCwgc2l6ZW9mKGx0ZV9uc3RfaW5pdF9wYWNrZXQpKTsNCisNCit9DQorDQorc3RhdGljIHZvaWQgc2VuZF9sdGVfZ2V0X3Jzc2lfcGFja2V0KCkNCit7DQorCXUzMiBsdGVfZ2V0X3Jzc2lfcmVxWzFdID0gezB9Ow0KKwlsdGVfZ2V0X3Jzc2lfcmVxWzBdID0gMHgwNTA1Ow0KKwl1bnNpZ25lZCBjaGFyIGx0ZV9nZXRfcnNzaV9wYWNrZXRbMSo0KzVdID0gezB9Ow0KKwl1bnNpZ25lZCBzaG9ydCBmaWQgPSAweDAwNWY7DQorCUNyZWF0ZVNlbmRQYWNrZXQoZmlkLCh1bnNpZ25lZCBjaGFyKilsdGVfZ2V0X3Jzc2lfcmVxLHNpemVvZihsdGVfZ2V0X3Jzc2lfcmVxKSxsdGVfZ2V0X3Jzc2lfcGFja2V0KTsNCisJQW10X0NvbXBvc2VBbmRQcm9jZXNzKGx0ZV9nZXRfcnNzaV9wYWNrZXQsIHNpemVvZihsdGVfZ2V0X3Jzc2lfcGFja2V0KSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHNlbmRfbHRlX3J4X2Nsb3NlX3BhY2tldCgpDQorew0KKwl1MzIgbHRlX3J4X2Nsb3NlX3JlcVsxXSA9IHswfTsNCisJbHRlX3J4X2Nsb3NlX3JlcVswXSA9IDB4MDMwMTsNCisJdW5zaWduZWQgY2hhciBsdGVfcnhfY2xvc2VfcGFja2V0WzEqNCs1XSA9IHswfTsNCisJdW5zaWduZWQgc2hvcnQgZmlkID0gMHgwMDVmOw0KKwlDcmVhdGVTZW5kUGFja2V0KGZpZCwodW5zaWduZWQgY2hhciopbHRlX3J4X2Nsb3NlX3JlcSxzaXplb2YobHRlX3J4X2Nsb3NlX3JlcSksbHRlX3J4X2Nsb3NlX3BhY2tldCk7DQorCUFtdF9Db21wb3NlQW5kUHJvY2VzcyhsdGVfcnhfY2xvc2VfcGFja2V0LCBzaXplb2YobHRlX3J4X2Nsb3NlX3BhY2tldCkpOw0KK30NCiBzdGF0aWMgdm9pZCBzZW5kX3N3aXRjaF90b191c2VyX21vZGVfcGFja2V0KCkNCiB7DQogICAgIHVuc2lnbmVkIGNoYXIgYm9vdG1vZGVbXSA9IHsweDU0LCAweDAwfTsNCkBAIC0xNzExLDYgKzIwMzQsMzcgQEAKIAlQb3J0U2VuZChmZCwgKHVuc2lnbmVkIGNoYXIqKXJlcF9vaywgc3RybGVuKHJlcF9vayksIFdBSVRfQUxMKTsNCiB9DQogDQorc3RhdGljIHZvaWQgc2VuZF9lcnJvcihpbnQgZmQpDQorew0KKyAgICBjaGFyIHJlcF9va1tdID0gIkVSUk9SXHJcbiI7DQorCVBvcnRTZW5kKGZkLCAodW5zaWduZWQgY2hhciopcmVwX29rLCBzdHJsZW4ocmVwX29rKSwgV0FJVF9BTEwpOw0KK30NCisNCitzdGF0aWMgdm9pZCBzZW5kX3F1ZXJ5X3Jlc3VsdChpbnQgZmQsY2hhciogY21kLCBjaGFyKiBwYXJhbSkNCit7DQorICAgIGNoYXIgKiBhdF9zdHIgPSBOVUxMOw0KKwlpbnQgbGVuID0gMDsNCisNCisJaWYocGFyYW0pDQorCXsNCisJICAgIGxlbiA9IDMyICsgc3RybGVuKGNtZCkgKyBzdHJsZW4ocGFyYW0pOw0KKyAgICAJYXRfc3RyID0gbWFsbG9jKGxlbik7DQorCX0NCisJZWxzZQ0KKwl7DQorCSAgICBsZW4gPSAzMiArIHN0cmxlbihjbWQpOw0KKyAgICAJYXRfc3RyID0gbWFsbG9jKGxlbik7DQorCX0NCisJYXNzZXJ0KGF0X3N0cik7DQorCW1lbXNldChhdF9zdHIsIDAsIGxlbik7DQorICAgIGlmKCFwYXJhbSkNCisgICAgICAgIHNwcmludGYoYXRfc3RyLCJcclxuKyVzXHJcblxyXG5PS1xyXG4iLGNtZCk7DQorICAgIGVsc2UNCisgICAgICAgIHNwcmludGYoYXRfc3RyLCJcclxuKyVzOiAlc1xyXG5cclxuT0tcclxuIixjbWQscGFyYW0pOw0KKw0KKwlQb3J0U2VuZChmZCwgKHVuc2lnbmVkIGNoYXIqKWF0X3N0ciwgc3RybGVuKGF0X3N0ciksIFdBSVRfQUxMKTsNCisJZnJlZShhdF9zdHIpOw0KK30NCiAvKioNCiAgKiBAYnJpZWYgQVTD/MHuvdPK1Q0KICAqIEBwYXJhbVtpbl0gZmQgzsS8/sPoyva3+w0KQEAgLTE3OTAsNiArMjE0NCwxNDkgQEAKIAkJCXNlbmRfc3dpdGNoX3RvX3VzZXJfbW9kZV9wYWNrZXQoKTsNCiAJCQlzZW5kX29rKGZkKTsNCiAJCX0NCisJCWVsc2UgaWYoc3Ryc3RyKGJ1ZiwiYXQrcnhzdGFydCIpICE9IE5VTEwpDQorCQl7DQorCQkgICAgLy+94s72QVTD/MHuYXQrcnhzdGFydD1yYXQsYmFuZCxjaGFubmVsLGJhbmR3aWR0aCxhbnRudW0sZXhwZWN0X2xldmVsDQorCQkgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVjZWl2ZSBhdCtyeHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOw0KKwkJCWludCBkYXRhWzZdID0gezB9Ow0KKwkJCS8vdW5zaWduZWQgaW50IHJhdCA9IDA7DQorCQkJdW5zaWduZWQgaW50IGJhbmQgPSAwOw0KKwkJCXVuc2lnbmVkIGludCBjaGFubmVsID0gMDsNCisJCQl1bnNpZ25lZCBpbnQgYmFuZF93aWR0aCA9IDA7DQorCQkJLy91bnNpZ25lZCBpbnQgYW50X251bSA9IDA7DQorCQkJaW50IGV4cGVjdF9sZXZlbCA9IDA7DQorCQkJaW50IHJldCA9IDA7DQorDQorCQkJLy+78cihss7K/Q0KKwkJCWJ1ZiA9IGJ1ZiArIHN0cmxlbigiYXQrcnhzdGFydD0iKTsNCisJCQlpZihidWYgIT0gTlVMTCkNCisJCQl7DQorCQkJICAgIHJldCA9IHNzY2FuZihidWYsICIlZCwlZCwlZCwlZCwlZCwlZCIsICZkYXRhWzBdLCAmZGF0YVsxXSwgJmRhdGFbMl0sICZkYXRhWzNdLCZkYXRhWzRdLCZkYXRhWzVdKTsNCisJCQkJaWYocmV0ID09IDYpDQorCQkJCXsNCisJCQkJICAgIHJhdCA9IGRhdGFbMF07DQorCQkJCQliYW5kID0gZGF0YVsxXTsNCisJCQkJCWNoYW5uZWwgPSBkYXRhWzJdOw0KKwkJCQkJYmFuZF93aWR0aCA9IGRhdGFbM107DQorCQkJCQlhbnRfbnVtID0gZGF0YVs0XTsNCisJCQkJCWV4cGVjdF9sZXZlbCA9IGRhdGFbNV07DQorCQkJCQlBbXRQcmludGYoQU1UX0lORk8gIiVzOiByYXQ9JWQsYmFuZD0lZCxjaGFubmVsPSVkLGJhbmRfd2lkdGg9JWQsYW50X251bT0lZCxleHBlY3RfbGV2ZWw9JWRcbiIsIF9fRlVOQ1RJT05fXywgcmF0LGJhbmQsY2hhbm5lbCxiYW5kX3dpZHRoLGFudF9udW0sZXhwZWN0X2xldmVsKTsNCisJCQkJICAgIC8vcmF0KNbGyr0pyKHWtbe2zqdbMCwyXSAwOkdTTSAxOldDRE1BIDI6TFRFDQorCQkJCQlpZigocmF0IDwgMCkgfHwgKHJhdCA+IDIpKQ0KKwkJCQkJew0KKwkJCQkgICAJCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBpbnZhbGlkIHJhdD0lZFswLDJdIVxuIiwgX19GVU5DVElPTl9fLHJhdCk7DQorCQkJCSAgIAkJcmV0dXJuIHJlYWRfbGVuOw0KKwkJCQkJfQ0KKwkJCQkJaWYoYmFuZCA9PSAwKQ0KKwkJCQkJew0KKwkJCQkgICAJCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBpbnZhbGlkIGJhbmQhXG4iLCBfX0ZVTkNUSU9OX18pOw0KKwkJCQkgICAJCXJldHVybiByZWFkX2xlbjsNCisJCQkJICAgCQ0KKwkJCQkJfQ0KKwkJCQkJaWYoY2hhbm5lbCA9PSAwICkNCisJCQkJCXsNCisJCQkJICAgCQlBbXRQcmludGYoQU1UX0VSUk9SICIlczogaW52YWxpZCBjaGFubmVsIVxuIiwgX19GVU5DVElPTl9fKTsNCisJCQkJICAgCQlyZXR1cm4gcmVhZF9sZW47DQorCQkJCQl9DQorCQkJCQkvL2FudF9udW23ts6nWzAsMTAwMF0NCisJCQkJCWlmKChhbnRfbnVtIDwgMCkgfHwgKGFudF9udW0gPiAxMDAwKSkNCisJCQkJCXsNCisJCQkJICAgCQlBbXRQcmludGYoQU1UX0VSUk9SICIlczogaW52YWxpZCBhbnRfbnVtPSVkWzAsMTAwMF0hXG4iLCBfX0ZVTkNUSU9OX18sYW50X251bSk7DQorCQkJCSAgIAkJcmV0dXJuIHJlYWRfbGVuOwkNCisJCQkJCX0NCisNCisJCQkJCXN3aXRjaChyYXQpDQorCQkJCQl7DQorCQkJCQkgICAgLy9MVEUNCisJCQkJCQljYXNlIDI6DQorCQkJCQkJew0KKwkJCQkJCQkvL0xURbT4v+23ts6nDQorCQkJCQkJCS8qDQorCQkJCQkJCXR5cGVkZWYgZW51bSBURERMVEVfYmFuZFcNCisJCQkJCQkJew0KKwkJCQkJCQkgICAgUlgxcG9pbnQ3NU0gPSAwLA0KKwkJCQkJCQkgICAgUlgycG9pbnQyNU0sDQorCQkJCQkJCSAgICBSWDNwb2ludDVNLA0KKwkJCQkJCQkgICAgUlg1TSwNCisJCQkJCQkJICAgIFJYNXBvaW50NU0sDQorCQkJCQkJCSAgICBSWDZNLA0KKwkJCQkJCQkgICAgUlg3TSwNCisJCQkJCQkJICAgIFJYOE0sDQorCQkJCQkJCSAgICBSWDlNLA0KKwkJCQkJCQkgICAgUlgxME0sDQorCQkJCQkJCSAgICBSWDEyTSwNCisJCQkJCQkJICAgIFJYMTRNLA0KKwkJCQkJCQkgICAgUlgxNU0sDQorCQkJCQkJCSAgICBSWDIwTSwNCisJCQkJCQkJICAgIFJYMjRNLA0KKwkJCQkJCQkgICAgUlgyOE0NCisJCQkJCQkJICAgIFJYMXBvaW50NE0NCisJCQkJCQkJfSBURERMVEVfQmFuZFdpZHRoOyovDQorCQkJCQkJCWlmKChiYW5kX3dpZHRoIDwgMCkgfHwgKGJhbmRfd2lkdGggPiAxNikpDQorCQkJCQkJCXsNCisJCQkJCQkgICAJCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBpbnZhbGlkIExURSBiYW5kX3dpZHRoPSVkWzAsMTZdIVxuIiwgX19GVU5DVElPTl9fLGJhbmRfd2lkdGgpOw0KKwkJCQkJCSAgIAkJcmV0dXJuIHJlYWRfbGVuOw0KKwkJCQkJCQl9DQorCQkJCQkJCS8v16q7r86qvfjI62FtdMSjyr26zW5zdGluaXTBvcz1QU1U1rjB7g0KKwkJCQkJCQlzZW5kX2VudGVyX2FtdF9tb2RlX3BhY2tldCgpOw0KKwkJCQkJCQlzbGVlcCgxKTsNCisJCQkJCQkJc2VuZF9sdGVfbnN0X2luaXRfcGFja2V0KGJhbmQsY2hhbm5lbCxiYW5kX3dpZHRoKTsNCisJCQkJCQkgICAgYnJlYWs7DQorCQkJCQkJfQ0KKwkJCQkJCWNhc2UgMDoNCisJCQkJCQljYXNlIDE6DQorCQkJCQkJZGVmYXVsdDoNCisJCQkJCQl7DQorCQkJCQkJICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiByYXQ9JWQgbm90IHN1cHBvcnRcbiIsIF9fRlVOQ1RJT05fXyxyYXQpOw0KKwkJCQkJCQlzZW5kX2Vycm9yKGZkKTsNCisJCQkJCQkJYnJlYWs7DQorCQkJCQkJfQ0KKwkJCQkJfQ0KKwkJCQkJDQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQkgQW10UHJpbnRmKEFNVF9JTkZPICIlczogYXQrcnhzdGFydCBwYXJhbSBwYXJzZSBlcnJvciFcbiIsIF9fRlVOQ1RJT05fXyk7DQorCQkJCQkgcmV0dXJuIHJlYWRfbGVuOw0KKwkJCQl9DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGF0K3J4c3RhcnQgcGFyYW0gc3RyIGlzIGVtcHR5IVxuIiwgX19GVU5DVElPTl9fKTsNCisJCQkgICAgcmV0dXJuIHJlYWRfbGVuOw0KKwkJCX0NCisJCX0NCisJCWVsc2UgaWYoc3Ryc3RyKGJ1ZiwiYXQrcnNzaSIpICE9IE5VTEwpDQorCQl7DQorCQkgICAgLy+94s72QVTD/MHuYXQrcnNzaQ0KKwkJICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHJlY2VpdmUgYXQrcnNzaVxuIiwgX19GVU5DVElPTl9fKTsNCisgICAgICAgICAgICBzd2l0Y2gocmF0KQ0KKwkJCXsNCisJCQkJLy9MVEUNCisJCQkJY2FzZSAyOg0KKwkJCQl7DQorCQkJCSAgICAvL9equ6/OqrvxyKFSU1NJtcRBTVTWuMHuDQorCQkJCQlzZW5kX2x0ZV9nZXRfcnNzaV9wYWNrZXQoKTsNCisJCQkJCWJyZWFrOw0KKwkJCQl9DQorCQkJICAgIGNhc2UgMDoNCisJCQkJY2FzZSAxOg0KKwkJCQlkZWZhdWx0Og0KKwkJCQl7DQorCQkJCSAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiByYXQ9JWQgbm90IHN1cHBvcnRcbiIsIF9fRlVOQ1RJT05fXyxyYXQpOw0KKwkJCQkgICBzZW5kX2Vycm9yKGZkKTsNCisJCQkJICAgYnJlYWs7DQorCQkJCX0NCisJCSAgICB9DQorCQl9DQorCQllbHNlIGlmKHN0cnN0cihidWYsImF0K3J4c3RvcCIpICE9IE5VTEwpDQorCQl7DQorCQkgICAgLy/Xqruvzqq52LHVvdPK1bv6us3Ny7P2YW10xKPKvcG9zPVBTVTWuMHuDQorCQkJc2VuZF9sdGVfcnhfY2xvc2VfcGFja2V0KCk7DQorCQkgICAgc2xlZXAoMSk7DQorCQkJc2VuZF9leGl0X2FtdF9tb2RlX3BhY2tldCgpOw0KKwkJCXNlbmRfb2soZmQpOw0KKwkJfQ0KIAkJZWxzZQ0KIAkJew0KIAkJICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiB1bmtub3duIGF0ICVzLlxuIiwgX19GVU5DVElPTl9fLCBidWYpOw0K