LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiAgSG9zdCBSZXNvdXJjZXMgTUlCIC0gUnVubmluZyBTb2Z0d2FyZSBncm91cCBpbXBsZW1lbnRhdGlvbiAtIGhyX3N3cnVuLmMKICogICAgICAoYWxzbyBpbmNsdWRlcyBSdW5uaW5nIFNvZnR3YXJlIFBlcmZvcm1hbmNlIGdyb3VwICkKICoKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpbmNsdWRlIDxmY250bC5oPgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2lmIEhBVkVfU1lTX1BTVEFUX0gKI2luY2x1ZGUgPHN5cy9wc3RhdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1VTRVJfSAojaWZkZWYgc29sYXJpczIKI2luY2x1ZGUgPGxpYmdlbi5oPgojZGVmaW5lIF9LTUVNVVNFUgojZW5kaWYKI2luY2x1ZGUgPHN5cy91c2VyLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfUFJPQ19ICiNpbmNsdWRlIDxzeXMvcHJvYy5oPgojZW5kaWYKI2lmIEhBVkVfS1ZNX0gKI2luY2x1ZGUgPGt2bS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiNlbmRpZgojaWYgSEFWRV9ESVJFTlRfSCAmJiAhZGVmaW5lZChjeWd3aW4pCiNpbmNsdWRlIDxkaXJlbnQuaD4KI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGlmIEhBVkVfU1lTX05ESVJfSAojICBpbmNsdWRlIDxzeXMvbmRpci5oPgojIGVuZGlmCiMgaWYgSEFWRV9TWVNfRElSX0gKIyAgaW5jbHVkZSA8c3lzL2Rpci5oPgojIGVuZGlmCiMgaWYgSEFWRV9ORElSX0gKIyAgaW5jbHVkZSA8bmRpci5oPgojIGVuZGlmCiNlbmRpZgojaWZkZWYgY3lnd2luCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxzeXMvY3lnd2luLmg+CiNpbmNsdWRlIDx0bGhlbHAzMi5oPgojaW5jbHVkZSA8cHNhcGkuaD4KI2VuZGlmCgojaWYgX1NMQVNIX1BST0NfTUVUSE9EXwojaW5jbHVkZSA8cHJvY2ZzLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgImhvc3RfcmVzLmgiCiNpbmNsdWRlICJocl9zd3J1bi5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgojaW5jbHVkZSAia2VybmVsLmgiCiNpZmRlZiBzb2xhcmlzMgojaWYgX1NMQVNIX1BST0NfTUVUSE9EXyAmJiBkZWZpbmVkIF9JTFAzMgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvY2FjaGVfaGFuZGxlci5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvaGFyZHdhcmUvbWVtb3J5Lmg+CiNlbmRpZgoKI2luY2x1ZGUgImtlcm5lbF9zdW5vczUuaCIKI2VuZGlmCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQojaW5jbHVkZSA8cHJvY2luZm8uaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbml0aWFsaXNhdGlvbiAmIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwp2b2lkICAgICAgICAgICAgSW5pdF9IUl9TV1J1bih2b2lkKTsKaW50ICAgICAgICAgICAgIEdldF9OZXh0X0hSX1NXUnVuKHZvaWQpOwp2b2lkICAgICAgICAgICAgRW5kX0hSX1NXUnVuKHZvaWQpOwppbnQgICAgICAgICAgICAgaGVhZGVyX2hyc3dydW4oc3RydWN0IHZhcmlhYmxlICosIG9pZCAqLCBzaXplX3QgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICosIFdyaXRlTWV0aG9kICoqKTsKaW50ICAgICAgICAgICAgIGhlYWRlcl9ocnN3cnVuRW50cnkoc3RydWN0IHZhcmlhYmxlICosIG9pZCAqLCBzaXplX3QgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBzaXplX3QgKiwgV3JpdGVNZXRob2QgKiopOwoKI2lmZGVmIGR5bml4CnBpZF90ICAgICAgICAgICBuZXh0cHJvYzsKc3RhdGljIHBycHNpbmZvX3QgbG93cHNpbmZvLCBteXBzaW5mbzsKI2VuZGlmCiNpZmRlZiBjeWd3aW4Kc3RhdGljIHN0cnVjdCBleHRlcm5hbF9waW5mbyAqY3VycHJvYzsKc3RhdGljIHN0cnVjdCBleHRlcm5hbF9waW5mbyBsb3dwcm9jOwojZWxpZiAhZGVmaW5lZChsaW51eCkKc3RhdGljIGludCAgICAgIExvd1Byb2NJbmRleDsKI2VuZGlmCiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCnN0cnVjdCBwc3Rfc3RhdHVzICpwcm9jX3RhYmxlOwpzdHJ1Y3QgcHN0X2R5bmFtaWMgcHN0X2R5bjsKI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MKc3RydWN0IGtpbmZvX3Byb2MgKnByb2NfdGFibGU7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCmludCAgICAgICAgICAgICpwcm9jX3RhYmxlOwojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQpzdHJ1Y3QgcHJvY3NpbmZvICpwcm9jX3RhYmxlOwojZWxzZQpzdHJ1Y3QgcHJvYyAgICAqcHJvY190YWJsZTsKI2VuZGlmCiNpZm5kZWYgZHluaXgKaW50ICAgICAgICAgICAgIGN1cnJlbnRfcHJvY19lbnRyeTsKI2VuZGlmCgoKI2RlZmluZQlIUlNXUlVOX09TSU5ERVgJCTEKCiNkZWZpbmUJSFJTV1JVTl9JTkRFWAkJMgojZGVmaW5lCUhSU1dSVU5fTkFNRQkJMwojZGVmaW5lCUhSU1dSVU5fSUQJCTQKI2RlZmluZQlIUlNXUlVOX1BBVEgJCTUKI2RlZmluZQlIUlNXUlVOX1BBUkFNUwkJNgojZGVmaW5lCUhSU1dSVU5fVFlQRQkJNwojZGVmaW5lCUhSU1dSVU5fU1RBVFVTCQk4CgojZGVmaW5lCUhSU1dSVU5QRVJGX0NQVQkJOQojZGVmaW5lCUhSU1dSVU5QRVJGX01FTQkJMTAKCnN0cnVjdCB2YXJpYWJsZTQgaHJzd3J1bl92YXJpYWJsZXNbXSA9IHsKICAgIHtIUlNXUlVOX09TSU5ERVgsIEFTTl9JTlRFR0VSLCBST05MWSwgdmFyX2hyc3dydW4sIDEsIHsxfX0sCiAgICB7SFJTV1JVTl9JTkRFWCwgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfaHJzd3J1biwgMywgezIsIDEsIDF9fSwKICAgIHtIUlNXUlVOX05BTUUsIEFTTl9PQ1RFVF9TVFIsIFJPTkxZLCB2YXJfaHJzd3J1biwgMywgezIsIDEsIDJ9fSwKICAgIHtIUlNXUlVOX0lELCBBU05fT0JKRUNUX0lELCBST05MWSwgdmFyX2hyc3dydW4sIDMsIHsyLCAxLCAzfX0sCiAgICB7SFJTV1JVTl9QQVRILCBBU05fT0NURVRfU1RSLCBST05MWSwgdmFyX2hyc3dydW4sIDMsIHsyLCAxLCA0fX0sCiAgICB7SFJTV1JVTl9QQVJBTVMsIEFTTl9PQ1RFVF9TVFIsIFJPTkxZLCB2YXJfaHJzd3J1biwgMywgezIsIDEsIDV9fSwKICAgIHtIUlNXUlVOX1RZUEUsIEFTTl9JTlRFR0VSLCBST05MWSwgdmFyX2hyc3dydW4sIDMsIHsyLCAxLCA2fX0sCiAgICB7SFJTV1JVTl9TVEFUVVMsIEFTTl9JTlRFR0VSLCBST05MWSwgdmFyX2hyc3dydW4sIDMsIHsyLCAxLCA3fX0KfTsKCnN0cnVjdCB2YXJpYWJsZTQgaHJzd3J1bnBlcmZfdmFyaWFibGVzW10gPSB7CiAgICB7SFJTV1JVTlBFUkZfQ1BVLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9ocnN3cnVuLCAzLCB7MSwgMSwgMX19LAogICAge0hSU1dSVU5QRVJGX01FTSwgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfaHJzd3J1biwgMywgezEsIDEsIDJ9fQp9OwoKb2lkICAgICAgICAgICAgIGhyc3dydW5fdmFyaWFibGVzX29pZFtdID0geyAxLCAzLCA2LCAxLCAyLCAxLCAyNSwgNCB9OwpvaWQgICAgICAgICAgICAgaHJzd3J1bnBlcmZfdmFyaWFibGVzX29pZFtdID0geyAxLCAzLCA2LCAxLCAyLCAxLCAyNSwgNSB9OwoKI2lmZGVmIGN5Z3dpbgoKLyoKICogYSBsb3Qgb2YgdGhpcyBpcyAic3RvbGVuIiBmcm9tIGN5Z3dpbiBwcy5jYwogKi8KCnR5cGVkZWYgICAgICAgICBCT09MKFdJTkFQSSAqIEVOVU1QUk9DRVNTTU9EVUxFUykgKEhBTkRMRSBoUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1PRFVMRSAqIGxwaE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBjYk5lZWRlZCk7Cgp0eXBlZGVmICAgICAgICAgRFdPUkQoV0lOQVBJICogR0VUTU9EVUxFRklMRU5BTUUpIChIQU5ETEUgaFByb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhNT0RVTEUgaE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUU1RSIGxwc3RyRklsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIG5TaXplKTsKCnR5cGVkZWYgICAgICAgICBEV09SRChXSU5BUEkgKiBHRVRQUk9DRVNTTUVNT1JZSU5GTykgKEhBTkRMRSBoUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBST0NFU1NfTUVNT1JZX0NPVU5URVJTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtYywgRFdPUkQgblNpemUpOwoKdHlwZWRlZiAgICAgICAgIEhBTkRMRShXSU5BUEkgKiBDUkVBVEVTTkFQU0hPVCkgKERXT1JEIGR3RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCB0aDMyUHJvY2Vzc0lEKTsKCnR5cGVkZWYgICAgICAgICBCT09MKFdJTkFQSSAqIFBST0NFU1NXQUxLKSAoSEFORExFIGhTbmFwc2hvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFBST0NFU1NFTlRSWTMyIGxwcGUpOwoKRU5VTVBST0NFU1NNT0RVTEVTIG15RW51bVByb2Nlc3NNb2R1bGVzOwpHRVRNT0RVTEVGSUxFTkFNRSBteUdldE1vZHVsZUZpbGVOYW1lRXg7CkNSRUFURVNOQVBTSE9UICBteUNyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdDsKUFJPQ0VTU1dBTEsgICAgIG15UHJvY2VzczMyRmlyc3Q7ClBST0NFU1NXQUxLICAgICBteVByb2Nlc3MzMk5leHQ7CkdFVFBST0NFU1NNRU1PUllJTkZPIG15R2V0UHJvY2Vzc01lbW9yeUluZm8gPSBOVUxMOwpjeWd3aW5fZ2V0aW5mb190eXBlcyBxdWVyeSA9IENXX0dFVFBJTkZPOwoKc3RhdGljIEJPT0wgV0lOQVBJCmR1bW15cHJvY2Vzc21vZHVsZXMoSEFORExFIGhQcm9jZXNzLAogICAgICAgICAgICAgICAgICAgIEhNT0RVTEUgKiBscGhNb2R1bGUsIERXT1JEIGNiLCBMUERXT1JEIGxwY2JOZWVkZWQpCnsKICAgIGxwaE1vZHVsZVswXSA9IChITU9EVUxFKSAqIGxwY2JOZWVkZWQ7CiAgICAqbHBjYk5lZWRlZCA9IDE7CiAgICByZXR1cm4gMTsKfQoKc3RhdGljIERXT1JEIFdJTkFQSQpHZXRNb2R1bGVGaWxlTmFtZUV4OTUoSEFORExFIGhQcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgSE1PRFVMRSBoTW9kdWxlLCBMUFRTVFIgbHBzdHJGaWxlTmFtZSwgRFdPUkQgbikKewogICAgSEFORExFICAgICAgICAgIGg7CiAgICBEV09SRCAgICAgICAgICAgcGlkID0gKERXT1JEKSBoTW9kdWxlOwogICAgUFJPQ0VTU0VOVFJZMzIgIHByb2M7CgogICAgaCA9IG15Q3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90KFRIMzJDU19TTkFQUFJPQ0VTUywgMCk7CiAgICBpZiAoIWgpCiAgICAgICAgcmV0dXJuIDA7CiAgICBwcm9jLmR3U2l6ZSA9IHNpemVvZihwcm9jKTsKICAgIGlmIChteVByb2Nlc3MzMkZpcnN0KGgsICZwcm9jKSkKICAgICAgICBkbwogICAgICAgICAgICBpZiAocHJvYy50aDMyUHJvY2Vzc0lEID09IHBpZCkgewogICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaCk7CiAgICAgICAgICAgICAgICBzdHJjcHkobHBzdHJGaWxlTmFtZSwgcHJvYy5zekV4ZUZpbGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICB3aGlsZSAobXlQcm9jZXNzMzJOZXh0KGgsICZwcm9jKSk7CiAgICBDbG9zZUhhbmRsZShoKTsKICAgIHJldHVybiAwOwp9CgojZGVmaW5lIEZBQ1RPUiAoMHgxOWRiMWRlZDUzZWE3MTBMTCkKI2RlZmluZSBOU1BFUlNFQyAxMDAwMDAwMExMCiNkZWZpbmUgTlNQRVJNU0VDIDEwMDAwTEwKCnN0YXRpYyB0aW1lX3QgICBfX3N0ZGNhbGwKdG9fdGltZV90KFBGSUxFVElNRSBwdHIpCnsKICAgIGxvbmcgICAgICAgICAgICByZW07CiAgICBsb25nIGxvbmcgICAgICAgeCA9CiAgICAgICAgKChsb25nIGxvbmcpIHB0ci0+ZHdIaWdoRGF0ZVRpbWUgPDwgMzIpICsKICAgICAgICAoKHVuc2lnbmVkKSBwdHItPmR3TG93RGF0ZVRpbWUpOwogICAgeCAtPSBGQUNUT1I7CiAgICByZW0gPSB4ICUgTlNQRVJTRUM7CiAgICByZW0gKz0gTlNQRVJTRUMgLyAyOwogICAgeCAvPSBOU1BFUlNFQzsKICAgIHggKz0gcmVtIC8gTlNQRVJTRUM7CiAgICByZXR1cm4geDsKfQoKc3RhdGljIGxvbmcKdG9fbXNlYyhQRklMRVRJTUUgcHRyKQp7CiAgICBsb25nIGxvbmcgICAgICAgeCA9CiAgICAgICAgKChsb25nIGxvbmcpIHB0ci0+ZHdIaWdoRGF0ZVRpbWUgPDwgMzIpICsKICAgICAgICAodW5zaWduZWQpIHB0ci0+ZHdMb3dEYXRlVGltZTsKICAgIHggLz0gTlNQRVJNU0VDOwogICAgcmV0dXJuIHg7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3lnd2luICovCgoKdm9pZAppbml0X2hyX3N3cnVuKHZvaWQpCnsKI2lmZGVmIGN5Z3dpbgogICAgT1NWRVJTSU9OSU5GTyAgIHZlcjsKICAgIEhNT0RVTEUgICAgICAgICBoOwoKICAgIG1lbXNldCgmdmVyLCAwLCBzaXplb2YgdmVyKTsKICAgIHZlci5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mIHZlcjsKICAgIEdldFZlcnNpb25FeCgmdmVyKTsKCiAgICBpZiAodmVyLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQpIHsKICAgICAgICBoID0gTG9hZExpYnJhcnkoInBzYXBpLmRsbCIpOwogICAgICAgIGlmIChoKSB7CiAgICAgICAgICAgIG15RW51bVByb2Nlc3NNb2R1bGVzID0KICAgICAgICAgICAgICAgIChFTlVNUFJPQ0VTU01PRFVMRVMpIEdldFByb2NBZGRyZXNzKGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW51bVByb2Nlc3NNb2R1bGVzIik7CiAgICAgICAgICAgIG15R2V0TW9kdWxlRmlsZU5hbWVFeCA9CiAgICAgICAgICAgICAgICAoR0VUTU9EVUxFRklMRU5BTUUpIEdldFByb2NBZGRyZXNzKGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRNb2R1bGVGaWxlTmFtZUV4QSIpOwogICAgICAgICAgICBteUdldFByb2Nlc3NNZW1vcnlJbmZvID0KICAgICAgICAgICAgICAgIChHRVRQUk9DRVNTTUVNT1JZSU5GTykgR2V0UHJvY0FkZHJlc3MoaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldFByb2Nlc3NNZW1vcnlJbmZvIik7CiAgICAgICAgICAgIGlmIChteUVudW1Qcm9jZXNzTW9kdWxlcyAmJiBteUdldE1vZHVsZUZpbGVOYW1lRXgpCiAgICAgICAgICAgICAgICBxdWVyeSA9IENXX0dFVFBJTkZPX0ZVTEw7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJocl9zd3J1biBmYWlsZWQgTlQgaW5pdFxuIik7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJocl9zd3J1biBmYWlsZWQgdG8gbG9hZCBwc2FwaS5kbGxcbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBoID0gR2V0TW9kdWxlSGFuZGxlKCJLRVJORUwzMi5ETEwiKTsKICAgICAgICBteUNyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdCA9CiAgICAgICAgICAgIChDUkVBVEVTTkFQU0hPVCkgR2V0UHJvY0FkZHJlc3MoaCwgIkNyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdCIpOwogICAgICAgIG15UHJvY2VzczMyRmlyc3QgPQogICAgICAgICAgICAoUFJPQ0VTU1dBTEspIEdldFByb2NBZGRyZXNzKGgsICJQcm9jZXNzMzJGaXJzdCIpOwogICAgICAgIG15UHJvY2VzczMyTmV4dCA9IChQUk9DRVNTV0FMSykgR2V0UHJvY0FkZHJlc3MoaCwgIlByb2Nlc3MzMk5leHQiKTsKICAgICAgICBteUVudW1Qcm9jZXNzTW9kdWxlcyA9IGR1bW15cHJvY2Vzc21vZHVsZXM7CiAgICAgICAgbXlHZXRNb2R1bGVGaWxlTmFtZUV4ID0gR2V0TW9kdWxlRmlsZU5hbWVFeDk1OwogICAgICAgIGlmIChteUNyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdCAmJiBteVByb2Nlc3MzMkZpcnN0CiAgICAgICAgICAgICYmIG15UHJvY2VzczMyTmV4dCkKI2lmIDAKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogVGhpcyBkb2Vzbid0IHdvcmsgYWZ0ZXIgYWxsIG9uIFdpbjk4IFNFIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcXVlcnkgPSBDV19HRVRQSU5GT19GVUxMOwojZWxzZQogICAgICAgICAgICBxdWVyeSA9IENXX0dFVFBJTkZPOwojZW5kaWYKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJocl9zd3J1biBmYWlsZWQgbm9uLU5UIGluaXRcbiIpOwogICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN5Z3dpbiAqLwojaWZkZWYgUFJPQ19TWU1CT0wKICAgIGF1dG9fbmxpc3QoUFJPQ19TWU1CT0wsIDAsIDApOwojZW5kaWYKI2lmZGVmIE5QUk9DX1NZTUJPTAogICAgYXV0b19ubGlzdChOUFJPQ19TWU1CT0wsIDAsIDApOwojZW5kaWYKCiAgICBwcm9jX3RhYmxlID0gMDsKCiAgICBSRUdJU1RFUl9NSUIoImhvc3QvaHJfc3dydW4iLCBocnN3cnVuX3ZhcmlhYmxlcywgdmFyaWFibGU0LAogICAgICAgICAgICAgICAgIGhyc3dydW5fdmFyaWFibGVzX29pZCk7CiAgICBSRUdJU1RFUl9NSUIoImhvc3QvaHJfc3dydW4iLCBocnN3cnVucGVyZl92YXJpYWJsZXMsIHZhcmlhYmxlNCwKICAgICAgICAgICAgICAgICBocnN3cnVucGVyZl92YXJpYWJsZXNfb2lkKTsKfQoKLyoKICogaGVhZGVyX2hyc3dydW4oLi4uCiAqIEFyZ3VtZW50czoKICogdnAgICAgIElOICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIGVudHJ5IHRoYXQgcG9pbnRzIGhlcmUKICogbmFtZSAgICBJTi9PVVQgIC0gSU4vbmFtZSByZXF1ZXN0ZWQsIE9VVC9uYW1lIGZvdW5kCiAqIGxlbmd0aCAgSU4vT1VUICAtIGxlbmd0aCBvZiBJTi9PVVQgb2lkJ3MgCiAqIGV4YWN0ICAgSU4gICAgICAtIFRSVUUgaWYgYW4gZXhhY3QgbWF0Y2ggd2FzIHJlcXVlc3RlZAogKiB2YXJfbGVuIE9VVCAgICAgLSBsZW5ndGggb2YgdmFyaWFibGUgb3IgMCBpZiBmdW5jdGlvbiByZXR1cm5lZAogKiB3cml0ZV9tZXRob2QKICogCiAqLwoKaW50CmhlYWRlcl9ocnN3cnVuKHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKI2RlZmluZSBIUlNXUlVOX05BTUVfTEVOR1RICTkKICAgIG9pZCAgICAgICAgICAgICBuZXduYW1lW01BWF9PSURfTEVOXTsKICAgIGludCAgICAgICAgICAgICByZXN1bHQ7CgogICAgREVCVUdNU0dUTCgoImhvc3QvaHJfc3dydW4iLCAidmFyX2hyc3dydW46ICIpKTsKICAgIERFQlVHTVNHT0lEKCgiaG9zdC9ocl9zd3J1biIsIG5hbWUsICpsZW5ndGgpKTsKICAgIERFQlVHTVNHKCgiaG9zdC9ocl9zd3J1biIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtY3B5KChjaGFyICopIG5ld25hbWUsIChjaGFyICopIHZwLT5uYW1lLCB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIG5ld25hbWVbSFJTV1JVTl9OQU1FX0xFTkdUSF0gPSAwOwogICAgcmVzdWx0ID0gc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBuZXduYW1lLCB2cC0+bmFtZWxlbiArIDEpOwogICAgaWYgKChleGFjdCAmJiAocmVzdWx0ICE9IDApKSB8fCAoIWV4YWN0ICYmIChyZXN1bHQgPj0gMCkpKQogICAgICAgIHJldHVybiAoTUFUQ0hfRkFJTEVEKTsKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBuZXduYW1lLAogICAgICAgICAgICh2cC0+bmFtZWxlbiArIDEpICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IHZwLT5uYW1lbGVuICsgMTsKCiAgICAqd3JpdGVfbWV0aG9kID0gMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmcpOyAgICAvKiBkZWZhdWx0IHRvICdsb25nJyByZXN1bHRzICovCiAgICByZXR1cm4gKE1BVENIX1NVQ0NFRURFRCk7Cn0KCmludApoZWFkZXJfaHJzd3J1bkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgaW50IGV4YWN0LAogICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewojZGVmaW5lIEhSU1dSVU5fRU5UUllfTkFNRV9MRU5HVEgJMTEKICAgIG9pZCAgICAgICAgICAgICBuZXduYW1lW01BWF9PSURfTEVOXTsKICAgIGludCAgICAgICAgICAgICBwaWQsIExvd1BpZCA9IC0xOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdDsKCiAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zd3J1biIsICJ2YXJfaHJzd3J1bkVudHJ5OiAiKSk7CiAgICBERUJVR01TR09JRCgoImhvc3QvaHJfc3dydW4iLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoImhvc3QvaHJfc3dydW4iLCAiICVkXG4iLCBleGFjdCkpOwoKICAgIG1lbWNweSgoY2hhciAqKSBuZXduYW1lLCAoY2hhciAqKSB2cC0+bmFtZSwgdnAtPm5hbWVsZW4gKiBzaXplb2Yob2lkKSk7CgogICAgLyoKICAgICAqICBGaW5kIHRoZSAibmV4dCIgcnVubmluZyBwcm9jZXNzCiAgICAgKi8KICAgIEluaXRfSFJfU1dSdW4oKTsKICAgIGZvciAoOzspIHsKICAgICAgICBwaWQgPSBHZXRfTmV4dF9IUl9TV1J1bigpOwojaWZuZGVmIGxpbnV4CiNpZm5kZWYgZHluaXgKICAgICAgICBERUJVR01TRygoImhvc3QvaHJfc3dydW4iLAogICAgICAgICAgICAgICAgICAiKGluZGV4ICVkIChlbnRyeSAjJWQpIC4uLi4iLCBwaWQsIGN1cnJlbnRfcHJvY19lbnRyeSkpOwojZWxzZQogICAgICAgIERFQlVHTVNHKCgiaG9zdC9ocl9zd3J1biIsICJwaWQgJWQ7IG5leHRwcm9jICVkIC4uLi4iLCBwaWQsCiAgICAgICAgICAgICAgICAgIG5leHRwcm9jKSk7CiNlbmRpZgojZW5kaWYKICAgICAgICBpZiAocGlkID09IC0xKQogICAgICAgICAgICBicmVhazsKICAgICAgICBuZXduYW1lW0hSU1dSVU5fRU5UUllfTkFNRV9MRU5HVEhdID0gcGlkOwogICAgICAgIERFQlVHTVNHT0lEKCgiaG9zdC9ocl9zd3J1biIsIG5ld25hbWUsICpsZW5ndGgpKTsKICAgICAgICBERUJVR01TRygoImhvc3QvaHJfc3dydW4iLCAiXG4iKSk7CiAgICAgICAgcmVzdWx0ID0gc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBuZXduYW1lLCB2cC0+bmFtZWxlbiArIDEpOwogICAgICAgIGlmIChleGFjdCAmJiAocmVzdWx0ID09IDApKSB7CiAgICAgICAgICAgIExvd1BpZCA9IHBpZDsKI2lmZGVmIGN5Z3dpbgogICAgICAgICAgICBsb3dwcm9jID0gKmN1cnByb2M7CiNlbGlmICBkeW5peAogICAgICAgICAgICBtZW1jcHkoJmxvd3BzaW5mbywgJm15cHNpbmZvLCBzaXplb2YocHJwc2luZm9fdCkpOwojZWxpZiAhZGVmaW5lZChsaW51eCkKICAgICAgICAgICAgTG93UHJvY0luZGV4ID0gY3VycmVudF9wcm9jX2VudHJ5IC0gMTsKI2VuZGlmCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJob3N0L2hyX3N3cnVuIiwgIiBzYXZlZFxuIikpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBTYXZlIHByb2Nlc3Mgc3RhdHVzIGluZm9ybWF0aW9uIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICgoIWV4YWN0ICYmIChyZXN1bHQgPCAwKSkgJiYgKExvd1BpZCA9PSAtMSB8fCBwaWQgPCBMb3dQaWQpKSB7CiAgICAgICAgICAgIExvd1BpZCA9IHBpZDsKI2lmZGVmIGN5Z3dpbgogICAgICAgICAgICBsb3dwcm9jID0gKmN1cnByb2M7CiNlbGlmICFkZWZpbmVkKGxpbnV4KQogICAgICAgICAgICBMb3dQcm9jSW5kZXggPSBjdXJyZW50X3Byb2NfZW50cnkgLSAxOwojZW5kaWYKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogU2F2ZSBwcm9jZXNzIHN0YXR1cyBpbmZvcm1hdGlvbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIERFQlVHTVNHKCgiaG9zdC9ocl9zd3J1biIsICIgc2F2ZWQiKSk7CiAgICAgICAgfQogICAgICAgIERFQlVHTVNHKCgiaG9zdC9ocl9zd3J1biIsICJcbiIpKTsKICAgIH0KICAgIEVuZF9IUl9TV1J1bigpOwoKICAgIGlmIChMb3dQaWQgPT0gLTEpIHsKICAgICAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zd3J1biIsICIuLi4gaW5kZXggb3V0IG9mIHJhbmdlXG4iKSk7CiAgICAgICAgcmV0dXJuIChNQVRDSF9GQUlMRUQpOwogICAgfQoKICAgIG5ld25hbWVbSFJTV1JVTl9FTlRSWV9OQU1FX0xFTkdUSF0gPSBMb3dQaWQ7CiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAodnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CiAgICAqd3JpdGVfbWV0aG9kID0gMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmcpOyAgICAvKiBkZWZhdWx0IHRvICdsb25nJyByZXN1bHRzICovCgogICAgREVCVUdNU0dUTCgoImhvc3QvaHJfc3dydW4iLCAiLi4uIGdldCBwcm9jZXNzIHN0YXRzICIpKTsKICAgIERFQlVHTVNHT0lEKCgiaG9zdC9ocl9zd3J1biIsIG5hbWUsICpsZW5ndGgpKTsKICAgIERFQlVHTVNHKCgiaG9zdC9ocl9zd3J1biIsICJcbiIpKTsKICAgIHJldHVybiBMb3dQaWQ7Cn0KCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBTeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCiNpZiBkZWZpbmVkKGxpbnV4KQpzdGF0aWMgY2hhciAgICAgKgpza2lwX3RvX25leHRfZmllbGQoY2hhciAqY3ApCnsKICAgIHdoaWxlICgqY3AgJiYgISBpc3NwYWNlKCpjcCkpIC8qIHNraXAgcGFzdCBub24tc3BhY2UgKi8KCSsrY3A7CiAgICB3aGlsZSAoKmNwICYmIGlzc3BhY2UoKmNwKSkgLyogc2tpcCBwYXN0IHNwYWNlICovCgkrK2NwOwogICAgcmV0dXJuIGNwOwoKfQoKc3RhdGljIGNoYXIgICAgICoKZ2V0X3Byb2NfZmlsZV9saW5lKGNoYXIgKmZtdCwKCQkgICAgaW50IHBpZCwKCQkgICAgY2hhciAqYnVmLAoJCSAgICBpbnQgYnVmbGVuICkKewogICAgc3RhdGljIGNoYXIgICAgIHN0cmluZ1sxMDI0XTsKICAgIEZJTEUgKmZwOwogICAgKmJ1ZiA9ICdcMCc7CiAgICBzcHJpbnRmKHN0cmluZyxmbXQscGlkKTsKICAgIGlmICggICAoKGZwID0gZm9wZW4oc3RyaW5nLCAiciIpKSA9PSBOVUxMKQoJfHwgKGZnZXRzKGJ1ZiwgYnVmbGVuLCBmcCkgPT0gTlVMTCkgKSB7CglpZiAoZnApCgkgICAgZmNsb3NlKGZwKTsKCXJldHVybiBOVUxMOwogICAgfQogICAgZmNsb3NlKGZwKTsKICAgIHJldHVybiBidWY7Cn0KCnN0YXRpYyBjaGFyICAgICAqCmdldF9wcm9jX3N0YXRfZmllbGQoaW50IHBpZCwKCQkgICAgY2hhciAqYnVmLAoJCSAgICBpbnQgYnVmbGVuLAoJCSAgICBpbnQgc2tpcCApCnsKICAgIGludCBpOwogICAgY2hhciAqY3A7CgogICAgaWYgKChjcCA9IGdldF9wcm9jX2ZpbGVfbGluZSgiL3Byb2MvJWQvc3RhdCIsIHBpZCwgYnVmLCBidWZsZW4pKSA9PSBOVUxMICkKCXJldHVybiBOVUxMOwogICAgZm9yIChpID0gMDsgKmNwICYmIGkgPCBza2lwOyArK2kpIHsKCWNwID0gc2tpcF90b19uZXh0X2ZpZWxkKGNwKTsKICAgIH0KICAgIHJldHVybiBjcDsKfQoKc3RhdGljIGNoYXIgKgpnZXRfcHJvY19uYW1lX2Zyb21fY21kbGluZShpbnQgcGlkLAoJCQkgICAgY2hhciAqYnVmLAoJCQkgICAgaW50IGJ1ZmxlbiApCnsKICAgIHJldHVybiBnZXRfcHJvY19maWxlX2xpbmUoIi9wcm9jLyVkL2NtZGxpbmUiLCBwaWQsIGJ1ZiwgYnVmbGVuKTsKfQoKc3RhdGljIGNoYXIgKgpnZXRfcHJvY19uYW1lX2Zyb21fc3RhdHVzKGludCBwaWQsCgkgICAgY2hhciAqYnVmLAoJICAgIGludCBidWZsZW4gKQp7CiAgICBjaGFyICpjcCwqY3AyOwogICAgaWYgKChjcCA9IGdldF9wcm9jX2ZpbGVfbGluZSgiL3Byb2MvJWQvc3RhdHVzIiwgcGlkLCBidWYsIGJ1ZmxlbikpID09IE5VTEwgKQoJcmV0dXJuIE5VTEw7CiAgICBjcCA9IHN0cmNocihjcCwgJzonKTsKICAgIGlmICggY3AgPT0gTlVMTCApIHsKCXJldHVybiBOVUxMOyAgICAvKiB0aGUgcHJvY2VzcyBmaWxlIGlzIG1hbGZvcm1lZCAqLwogICAgfQogICAgY3AgPSBza2lwX3RvX25leHRfZmllbGQoY3ApOwogICAgY3AyID0gc3RyY2hyKGNwLCAnXG4nKTsKICAgIGlmIChjcDIpCgkqY3AyID0gMDsKICAgIHJldHVybiBjcDsKfQojZW5kaWYKCnVfY2hhciAgICAgICAgICoKdmFyX2hyc3dydW4oc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIGludCAgICAgICAgICAgICBwaWQgPSAwOwogICAgc3RhdGljIGNoYXIgICAgIHN0cmluZ1sxMDI0XTsKI2lmZGVmIEhBVkVfU1lTX1BTVEFUX0gKICAgIHN0cnVjdCBwc3Rfc3RhdHVzIHByb2NfYnVmOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQojaWYgX1NMQVNIX1BST0NfTUVUSE9EXwogICAgc3RhdGljIHBzaW5mb190IHBzaW5mbzsKICAgIHN0YXRpYyBwc2luZm9fdCAqcHJvY19idWY7CiAgICBpbnQgICAgICAgICAgICAgcHJvY2ZkOwogICAgaW50ICAgICAgICAgICAgIHJldDsKICAgIGNoYXIgICAgICAgICAgICBwcm9jZm5bc2l6ZW9mICIvcHJvYy8wMDAwMC9wc2luZm8iXTsKI2Vsc2UKICAgIHN0YXRpYyBzdHJ1Y3QgcHJvYyAqcHJvY19idWY7CiAgICBjaGFyICAgICAgICAgICAqY3AxOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9TTEFTSF9QUk9DX01FVEhPRF8gKi8KICAgIHN0YXRpYyB0aW1lX3QgICB3aGVuID0gMDsKICAgIHRpbWVfdCAgICAgICAgICBub3c7CiAgICBzdGF0aWMgaW50ICAgICAgb2xkcGlkID0gLTE7CiNlbmRpZgojaWYgSEFWRV9LVk1fR0VUUFJPQ1MKICAgIGNoYXIgICAgICAgICAgKiphcmd2OwojZW5kaWYKI2lmZGVmIGxpbnV4CiAgICBGSUxFICAgICAgICAgICAqZnA7CiAgICBjaGFyICAgICAgICAgICAgYnVmWzEwMjRdOwogICAgaW50ICAgICAgICAgICAgIGk7CiNlbmRpZgogICAgY2hhciAgICAgICAgICAgKmNwOwoKICAgIGlmICh2cC0+bWFnaWMgPT0gSFJTV1JVTl9PU0lOREVYKSB7CiAgICAgICAgaWYgKGhlYWRlcl9ocnN3cnVuKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpCiAgICAgICAgICAgID09IE1BVENIX0ZBSUxFRCkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewoKICAgICAgICBwaWQgPQogICAgICAgICAgICBoZWFkZXJfaHJzd3J1bkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX21ldGhvZCk7CiAgICAgICAgaWYgKHBpZCA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKI2lmZGVmIEhBVkVfU1lTX1BTVEFUX0gKICAgIGlmIChwc3RhdF9nZXRwcm9jKCZwcm9jX2J1Ziwgc2l6ZW9mKHN0cnVjdCBwc3Rfc3RhdHVzKSwgMCwgcGlkKSA9PSAtMSkKICAgICAgICByZXR1cm4gTlVMTDsKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKICAgIHRpbWUoJm5vdyk7CiAgICBpZiAocGlkID09IG9sZHBpZCkgewogICAgICAgIGlmIChub3cgIT0gd2hlbikKICAgICAgICAgICAgb2xkcGlkID0gLTE7CiAgICB9CiAgICBpZiAob2xkcGlkICE9IHBpZCB8fCBwcm9jX2J1ZiA9PSBOVUxMKSB7CiNpZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiAgICAgICAgcHJvY19idWYgPSAmcHNpbmZvOwogICAgICAgIHNwcmludGYocHJvY2ZuLCAiL3Byb2MvJS41ZC9wc2luZm8iLCBwaWQpOwogICAgICAgIGlmICgocHJvY2ZkID0gb3Blbihwcm9jZm4sIE9fUkRPTkxZKSkgIT0gLTEpIHsKICAgICAgICAgICAgcmV0ID0gIHJlYWQocHJvY2ZkLCBwcm9jX2J1Ziwgc2l6ZW9mKCpwcm9jX2J1ZikpOwogICAgICAgICAgICBjbG9zZShwcm9jZmQpOwogICAgICAgICAgICBpZiAocmV0ICE9IHNpemVvZigqcHJvY19idWYpKQogICAgICAgICAgICAgICAgcHJvY19idWYgPSBOVUxMOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBwcm9jX2J1ZiA9ICBOVUxMOwojZWxzZQogICAgICAgIGlmIChrZCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICBpZiAoKHByb2NfYnVmID0ga3ZtX2dldHByb2Moa2QsIHBpZCkpID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBvbGRwaWQgPSBwaWQ7CiAgICAgICAgd2hlbiA9IG5vdzsKICAgIH0KI2VuZGlmCgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSFJTV1JVTl9PU0lOREVYOgojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2Vsc2UKICAgICAgICAvKiAKICAgICAgICAgKiBwZXIgZHRzLCBvbiBjb2RlcnM6CiAgICAgICAgICogY29zIChpbiBnZW5lcmFsKSB3ZSB3b24ndCBrbm93IHdoaWNoIHByb2Nlc3Mgc2hvdWxkCiAgICAgICAgICogYmUgcmVnYXJkZWQgYXMgInRoZSBwcmltYXJ5IE8vUyBwcm9jZXNzIi4KICAgICAgICAgKiBUaGUgbW9zdCBvYnZpb3VzIGNhbmRpZGF0ZSBvbiBhIFVuaXggYm94IGlzIHByb2JhYmx5ICdpbml0JwogICAgICAgICAqIHdoaWNoIGlzIHR5cGljYWxseSAoYWx3YXlzPykgcHJvY2VzcyAjMS4KICAgICAgICAgKi8KICAgICAgICBsb25nX3JldHVybiA9IDE7ICAgICAgICAvKiBQcm9iYWJseSEgKi8KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwojZW5kaWYKCiAgICBjYXNlIEhSU1dSVU5fSU5ERVg6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwaWQ7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTV1JVTl9OQU1FOgojaWZkZWYgSEFWRV9TWVNfUFNUQVRfSAogICAgICAgIHN0cmxjcHkoc3RyaW5nLCBwcm9jX2J1Zi5wc3RfY21kLCBzaXplb2Yoc3RyaW5nKSk7CiAgICAgICAgY3AgPSBzdHJjaHIoc3RyaW5nLCAnICcpOwogICAgICAgIGlmIChjcCAhPSBOVUxMKQogICAgICAgICAgICAqY3AgPSAnXDAnOwojZWxpZiBkZWZpbmVkKGR5bml4KQogICAgICAgIHN0cmxjcHkoc3RyaW5nLCBsb3dwc2luZm8ucHJfZm5hbWUsIHNpemVvZihzdHJpbmcpKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICpjcCA9ICdcMCc7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiAgICAgICAgaWYgKHByb2NfYnVmKSB7IAogICAgICAgICAgICBjaGFyICpwb3M9c3RyY2hyKHByb2NfYnVmLT5wcl9wc2FyZ3MsJyAnKTsKICAgICAgICAgICAgaWYgKHBvcyAhPSBOVUxMKSAqcG9zID0gJ1wwJzsKICAgICAgICAgICAgc3RybGNweShzdHJpbmcsIGJhc2VuYW1lKHByb2NfYnVmLT5wcl9wc2FyZ3MpLCBzaXplb2Yoc3RyaW5nKSk7CiAgICAgICAgICAgIGlmIChwb3MgIT0gTlVMTCkgKnBvcz0nICc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RybGNweShzdHJpbmcsICI8ZXhpdGVkPiIsIHNpemVvZihzdHJpbmcpKTsKICAgICAgICB9CiNlbHNlCiAgICAgICAgc3RybGNweShzdHJpbmcsIHByb2NfYnVmLT5wX3VzZXIudV9jb21tLCBzaXplb2Yoc3RyaW5nKSk7CiNlbmRpZgojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIHN0cmxjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucGlfY29tbSwgc2l6ZW9mKHN0cmluZykpOwogICAgICAgIGNwID0gc3RyY2hyKHN0cmluZywgJyAnKTsKICAgICAgICBpZiAoY3AgIT0gTlVMTCkKICAgICAgICAgICAgKmNwID0gJ1wwJzsKI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MKICAgICNpZiBkZWZpbmVkKGZyZWVic2Q1KSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMTQKICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfY29tbSk7CiAgICAjZWxpZiBkZWZpbmVkKGRyYWdvbmZseSkgJiYgX19EcmFnb25GbHlfdmVyc2lvbiA+PSAxOTAwMDAKICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfY29tbSk7CiAgICAjZWxpZiBkZWZpbmVkKG9wZW5ic2Q1KQogICAgICAgIHN0cmNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX2NvbW0pOwogICAgI2Vsc2UKICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfcHJvYy5wX2NvbW0pOwogICAgI2VuZGlmCiNlbGlmIGRlZmluZWQobGludXgpCglpZiggKGNwPWdldF9wcm9jX25hbWVfZnJvbV9zdGF0dXMocGlkLGJ1ZixzaXplb2YoYnVmKSkpID09IE5VTEwgKSB7CiAgICAgICAgICAgIHN0cmNweShzdHJpbmcsICI8ZXhpdGVkPiIpOwogICAgICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihzdHJpbmcpOwogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBzdHJpbmc7CiAgICAgICAgfQogICAgICAgIHN0cmNweShzdHJpbmcsIGNwKTsKI2VsaWYgZGVmaW5lZChjeWd3aW4pCiAgICAgICAgLyogaWYgKGxvd3Byb2MucHJvY2Vzc19zdGF0ZSAmIChQSURfWk9NQklFIHwgUElEX0VYSVRFRCkpICovCiAgICAgICAgaWYgKGxvd3Byb2MucHJvY2Vzc19zdGF0ZSAmIFBJRF9FWElURUQgfHwgKGxvd3Byb2MuZXhpdGNvZGUgJiB+MHhmZmZmKSkKICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIjxkZWZ1bmN0PiIpOwogICAgICAgIGVsc2UgaWYgKGxvd3Byb2MucHBpZCkgewogICAgICAgICAgICBjeWd3aW5fY29udl90b19wb3NpeF9wYXRoKGxvd3Byb2MucHJvZ25hbWUsIHN0cmluZyk7CiAgICAgICAgICAgIGNwID0gc3RycmNocihzdHJpbmcsICcvJyk7CiAgICAgICAgICAgIGlmIChjcCkKICAgICAgICAgICAgICAgIHN0cmNweShzdHJpbmcsIGNwICsgMSk7CiAgICAgICAgfSBlbHNlIGlmIChxdWVyeSA9PSBDV19HRVRQSU5GT19GVUxMKSB7CiAgICAgICAgICAgIERXT1JEICAgICAgICAgICBuID0gbG93cHJvYy5kd1Byb2Nlc3NJZCAmIDB4ZmZmZjsKICAgICAgICAgICAgSEFORExFICAgICAgICAgIGggPQogICAgICAgICAgICAgICAgT3BlblByb2Nlc3MoUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiB8IFBST0NFU1NfVk1fUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBuKTsKCiAgICAgICAgICAgIGlmIChoKSB7CiAgICAgICAgICAgICAgICBITU9EVUxFICAgICAgICAgaG1bMTAwMF07CiAgICAgICAgICAgICAgICBpZiAoIW15RW51bVByb2Nlc3NNb2R1bGVzKGgsIGhtLCBzaXplb2YgaG0sICZuKSkgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19ERUJVRywgIm5vIG1vZHVsZSBoYW5kbGUgZm9yICVsdVxuIiwgbik7CiAgICAgICAgICAgICAgICAgICAgbiA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobgogICAgICAgICAgICAgICAgICAgICYmIG15R2V0TW9kdWxlRmlsZU5hbWVFeChoLCBobVswXSwgc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Ygc3RyaW5nKSkgewogICAgICAgICAgICAgICAgICAgIGNwID0gc3RycmNocihzdHJpbmcsICdcXCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChjcCkKICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgY3AgKyAxKTsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIHN0cmNweShzdHJpbmcsICIqKiogdW5rbm93biIpOwogICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIm5vIHByb2Nlc3MgaGFuZGxlIGZvciAlbHVcbiIsIG4pOwogICAgICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIioqIHVua25vd24iKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZQogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiKiB1bmtub3duIik7CiAgICAgICAgY3AgPSBzdHJjaHIoc3RyaW5nLCAnXDAnKSAtIDQ7CiAgICAgICAgaWYgKGNwID4gc3RyaW5nICYmIHN0cmNhc2VjbXAoY3AsICIuZXhlIikgPT0gMCkKICAgICAgICAgICAgKmNwID0gJ1wwJzsKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIHNwcmludGYoc3RyaW5nLCAicHJvY2VzcyBuYW1lIik7CiNlbmRpZgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKHN0cmluZyk7CiAgICAgICAgLyoKICAgICAgICAgKiByZW1vdmUgdHJhaWxpbmcgbmV3bGluZSAKICAgICAgICAgKi8KICAgICAgICBpZiAoKnZhcl9sZW4pIHsKICAgICAgICAgICAgY3AgPSBzdHJpbmcgKyAqdmFyX2xlbiAtIDE7CiAgICAgICAgICAgIGlmICgqY3AgPT0gJ1xuJykKICAgICAgICAgICAgICAgIC0tKCp2YXJfbGVuKTsKICAgICAgICB9CiAgICAgICAgaWYgKCp2YXJfbGVuID4gNjQpIHsgLyogTUlCIGxpbWl0ICovCiAgICAgICAgICAgICp2YXJfbGVuID0gNjQ7CiAgICAgICAgICAgIHN0cmluZ1s2NF0gPSAnXDAnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBzdHJpbmc7CiAgICBjYXNlIEhSU1dSVU5fSUQ6CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBjYXNlIEhSU1dSVU5fUEFUSDoKI2lmZGVmIEhBVkVfU1lTX1BTVEFUX0gKICAgICAgICAvKgogICAgICAgICAqIFBhdGggbm90IGF2YWlsYWJsZSAtIHVzZSBhcmd2WzBdIAogICAgICAgICAqLwogICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMiLCBwcm9jX2J1Zi5wc3RfY21kKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICpjcCA9ICdcMCc7CiNlbGlmIGRlZmluZWQoZHluaXgpCiAgICAgICAgLyoKICAgICAgICAgKiBQYXRoIG5vdCBhdmFpbGFibGUgLSB1c2UgYXJndlswXSAKICAgICAgICAgKi8KICAgICAgICBzcHJpbnRmKHN0cmluZywgIiVzIiwgbG93cHNpbmZvLnByX3BzYXJncyk7CiAgICAgICAgY3AgPSBzdHJjaHIoc3RyaW5nLCAnICcpOwogICAgICAgIGlmIChjcCAhPSBOVUxMKQogICAgICAgICAgICAqY3AgPSAnXDAnOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQojaWZkZWYgX1NMQVNIX1BST0NfTUVUSE9EXwogICAgICAgIGlmIChwcm9jX2J1ZikKICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgcHJvY19idWYtPnByX3BzYXJncyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBzcHJpbnRmKHN0cmluZywgIjxleGl0ZWQ+Iik7CiAgICAgICAgY3AgPSBzdHJjaHIoc3RyaW5nLCAnICcpOwogICAgICAgIGlmIChjcCkKICAgICAgICAgICAgKmNwID0gMDsKI2Vsc2UKICAgICAgICBjcCA9IHByb2NfYnVmLT5wX3VzZXIudV9wc2FyZ3M7CiAgICAgICAgY3AxID0gc3RyaW5nOwogICAgICAgIHdoaWxlICgqY3AgJiYgKmNwICE9ICcgJykKICAgICAgICAgICAgKmNwMSsrID0gKmNwKys7CiAgICAgICAgKmNwMSA9IDA7CiNlbmRpZgojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIHN0cmxjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucGlfY29tbSwgc2l6ZW9mKHN0cmluZykpOwogICAgICAgIGNwID0gc3RyY2hyKHN0cmluZywgJyAnKTsKICAgICAgICBpZiAoY3AgIT0gTlVMTCkKICAgICAgICAgICAgKmNwID0gJ1wwJzsKI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MKICAgICNpZiBkZWZpbmVkKGZyZWVic2Q1KSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMTQKICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfY29tbSk7CiAgICAjZWxpZiBkZWZpbmVkKGRyYWdvbmZseSkgJiYgX19EcmFnb25GbHlfdmVyc2lvbiA+PSAxOTAwMDAKICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfY29tbSk7CiAgICAjZWxpZiBkZWZpbmVkKG9wZW5ic2Q1KQogICAgICAgIHN0cmNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX2NvbW0pOwogICAgI2Vsc2UKICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfcHJvYy5wX2NvbW0pOwogICAgI2VuZGlmCiNlbGlmIGRlZmluZWQobGludXgpCiAgICAgICAgY3AgPSBnZXRfcHJvY19uYW1lX2Zyb21fY21kbGluZShwaWQsYnVmLHNpemVvZihidWYpLTEpOwogICAgICAgIGlmIChjcCAhPSBOVUxMICYmICpjcCkgICAgLyogYXJndlswXSAnXDAnIGFyZ3ZbMV0gJ1wwJyAuLi4uICovCiAgICAgICAgICAgIHN0cmNweShzdHJpbmcsIGNwKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogc3dhcHBlZCBvdXQgLSBubyBjbWRsaW5lIAogICAgICAgICAgICAgKi8KCSAgICBpZiggKGNwPWdldF9wcm9jX25hbWVfZnJvbV9zdGF0dXMocGlkLGJ1ZixzaXplb2YoYnVmKS0xKSkgPT0gTlVMTCApIHsKCQlzdHJjcHkoc3RyaW5nLCAiPGV4aXRlZD4iKTsKCQkqdmFyX2xlbiA9IHN0cmxlbihzdHJpbmcpOwoJCXJldHVybiAodV9jaGFyICopIHN0cmluZzsKCSAgICB9CiAgICAgICAgICAgIHN0cmNweShzdHJpbmcsIGNwKTsKICAgICAgICB9CiNlbGlmIGRlZmluZWQoY3lnd2luKQogICAgICAgIC8qIGlmIChsb3dwcm9jLnByb2Nlc3Nfc3RhdGUgJiAoUElEX1pPTUJJRSB8IFBJRF9FWElURUQpKSAqLwogICAgICAgIGlmIChsb3dwcm9jLnByb2Nlc3Nfc3RhdGUgJiBQSURfRVhJVEVEIHx8IChsb3dwcm9jLmV4aXRjb2RlICYgfjB4ZmZmZikpCiAgICAgICAgICAgIHN0cmNweShzdHJpbmcsICI8ZGVmdW5jdD4iKTsKICAgICAgICBlbHNlIGlmIChsb3dwcm9jLnBwaWQpCiAgICAgICAgICAgIGN5Z3dpbl9jb252X3RvX3Bvc2l4X3BhdGgobG93cHJvYy5wcm9nbmFtZSwgc3RyaW5nKTsKICAgICAgICBlbHNlIGlmIChxdWVyeSA9PSBDV19HRVRQSU5GT19GVUxMKSB7CiAgICAgICAgICAgIERXT1JEICAgICAgICAgICBuID0gbG93cHJvYy5kd1Byb2Nlc3NJZCAmIDB4RkZGRjsKICAgICAgICAgICAgSEFORExFICAgICAgICAgIGggPQogICAgICAgICAgICAgICAgT3BlblByb2Nlc3MoUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiB8IFBST0NFU1NfVk1fUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBuKTsKICAgICAgICAgICAgaWYgKGgpIHsKICAgICAgICAgICAgICAgIEhNT0RVTEUgICAgICAgICBobVsxMDAwXTsKICAgICAgICAgICAgICAgIGlmICghbXlFbnVtUHJvY2Vzc01vZHVsZXMoaCwgaG0sIHNpemVvZiBobSwgJm4pKQogICAgICAgICAgICAgICAgICAgIG4gPSAwOwogICAgICAgICAgICAgICAgaWYgKCFuCiAgICAgICAgICAgICAgICAgICAgfHwgIW15R2V0TW9kdWxlRmlsZU5hbWVFeChoLCBobVswXSwgc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIHN0cmluZykpCiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIioqKiB1bmtub3duIik7CiAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZShoKTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiKiogdW5rbm93biIpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiKiB1bmtub3duIik7CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBzcHJpbnRmKHN0cmluZywgIi9iaW4vd29tYmF0Iik7CiNlbmRpZgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKHN0cmluZyk7CiAgICAgICAgaWYgKCp2YXJfbGVuID4gMTI4KSB7IC8qIE1JQiBsaW1pdCAqLwogICAgICAgICAgICAqdmFyX2xlbiA9IDEyODsKICAgICAgICAgICAgc3RyaW5nWzEyOF0gPSAnXDAnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBzdHJpbmc7CiAgICBjYXNlIEhSU1dSVU5fUEFSQU1TOgojaWZkZWYgSEFWRV9TWVNfUFNUQVRfSAogICAgICAgIGNwID0gc3RyY2hyKHByb2NfYnVmLnBzdF9jbWQsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpIHsKICAgICAgICAgICAgY3ArKzsKICAgICAgICAgICAgc3ByaW50ZihzdHJpbmcsICIlcyIsIGNwKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgc3RyaW5nWzBdID0gJ1wwJzsKI2VsaWYgZGVmaW5lZChkeW5peCkKICAgICAgICBjcCA9IHN0cmNocihsb3dwc2luZm8ucHJfcHNhcmdzLCAnICcpOwogICAgICAgIGlmIChjcCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGNwKys7CiAgICAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMiLCBjcCk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHN0cmluZ1swXSA9ICdcMCc7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZmRlZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiAgICAgICAgaWYgKHByb2NfYnVmKSB7CiAgICAgICAgICAgIGNwID0gc3RyY2hyKHByb2NfYnVmLT5wcl9wc2FyZ3MsICcgJyk7CiAgICAgICAgICAgIGlmIChjcCkKICAgICAgICAgICAgICAgIHN0cmNweShzdHJpbmcsIGNwICsgMSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHN0cmluZ1swXSA9IDA7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHN0cmluZ1swXSA9IDA7CiNlbHNlCiAgICAgICAgY3AgPSBwcm9jX2J1Zi0+cF91c2VyLnVfcHNhcmdzOwogICAgICAgIHdoaWxlICgqY3AgJiYgKmNwICE9ICcgJykKICAgICAgICAgICAgY3ArKzsKICAgICAgICBpZiAoKmNwID09ICcgJykKICAgICAgICAgICAgY3ArKzsKICAgICAgICBzdHJjcHkoc3RyaW5nLCBjcCk7CiNlbmRpZgojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGNwID0gc3RyY2hyKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5waV9jb21tLCAnICcpOwogICAgICAgIGlmIChjcCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGNwKys7CiAgICAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMiLCBjcCk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHN0cmluZ1swXSA9ICdcMCc7CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0NTCiAgICAgICAgc3RyaW5nWzBdID0gMDsKICAgICAgICBhcmd2ID0ga3ZtX2dldGFyZ3Yoa2QsIHByb2NfdGFibGUgKyBMb3dQcm9jSW5kZXgsIHNpemVvZihzdHJpbmcpKTsKICAgICAgICBpZiAoYXJndikKICAgICAgICAgICAgYXJndisrOwogICAgICAgIHdoaWxlIChhcmd2ICYmICphcmd2KSB7CiAgICAgICAgICAgIGlmIChzdHJpbmdbMF0gIT0gMCkKICAgICAgICAgICAgICAgIHN0cmNhdChzdHJpbmcsICIgIik7CiAgICAgICAgICAgIHN0cmNhdChzdHJpbmcsICphcmd2KTsKICAgICAgICAgICAgYXJndisrOwogICAgICAgIH0KI2VsaWYgZGVmaW5lZChsaW51eCkKICAgICAgICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CiAgICAgICAgaWYoIChjcD1nZXRfcHJvY19uYW1lX2Zyb21fY21kbGluZShwaWQsYnVmLHNpemVvZihidWYpLTIpKSA9PSBOVUxMICkgewogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiIik7CiAgICAgICAgICAgICp2YXJfbGVuID0gMDsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgc3RyaW5nOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBTa2lwIG92ZXIgYXJndlswXSAKICAgICAgICAgKi8KICAgICAgICBjcCA9IGJ1ZjsKICAgICAgICB3aGlsZSAoKmNwKQogICAgICAgICAgICArK2NwOwogICAgICAgICsrY3A7CiAgICAgICAgLyoKICAgICAgICAgKiBOb3cgam9pbiB0b2dldGhlciBzZXBhcmF0ZSBhcmd1bWVudHMuIAogICAgICAgICAqLwogICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIHdoaWxlICgqY3ApCiAgICAgICAgICAgICAgICArK2NwOwogICAgICAgICAgICBpZiAoKihjcCArIDEpID09ICdcMCcpCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogJ1wwJydcMCcgPT4gRW5kIG9mIGNvbW1hbmQgbGluZSAqLwogICAgICAgICAgICAqY3AgPSAnICc7CiAgICAgICAgfQoKICAgICAgICBjcCA9IGJ1ZjsKICAgICAgICB3aGlsZSAoKmNwKQogICAgICAgICAgICArK2NwOwogICAgICAgICsrY3A7CiAgICAgICAgc3RyY3B5KHN0cmluZywgY3ApOwojZWxpZiBkZWZpbmVkKGN5Z3dpbikKICAgICAgICBzdHJpbmdbMF0gPSAwOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgc3ByaW50ZihzdHJpbmcsICItaCAtcSAtdiIpOwojZW5kaWYKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihzdHJpbmcpOwogICAgICAgIGlmICgqdmFyX2xlbiA+IDEyOCkgeyAvKiBNSUIgbGltaXQgKi8KICAgICAgICAgICAgKnZhcl9sZW4gPSAxMjg7CiAgICAgICAgICAgIHN0cmluZ1sxMjhdID0gJ1wwJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgc3RyaW5nOwogICAgY2FzZSBIUlNXUlVOX1RZUEU6CiNpZmRlZiBQSURfTUFYU1lTCiAgICAgICAgaWYgKHBpZCA8IFBJRF9NQVhTWVMpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMjsgICAgLyogb3BlcmF0aW5nU3lzdGVtICovCiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgIC8qIGFwcGxpY2F0aW9uICovCiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCgkJaWYgKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5waV9mbGFncyAmIFNLUFJPQykgewoJCQlsb25nX3JldHVybiA9IDI7CS8qIGtlcm5lbCBwcm9jZXNzICovCgkJfSBlbHNlCgkJCWxvbmdfcmV0dXJuID0gNDsJLyogYXBwbGljYXRpb24gKi8KI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MKICAgICNpZiBkZWZpbmVkKGZyZWVic2Q1KSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMTQKCWlmIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfZmxhZyAmIFBfU1lTVEVNKSB7CgkgICAgaWYgKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV9wcmkucHJpX2NsYXNzID09IFBSSV9JVEhEKQoJCWxvbmdfcmV0dXJuID0gMzsvKiBkZXZpY2VEcml2ZXIgKi8KCSAgICBlbHNlCgkJbG9uZ19yZXR1cm4gPSAyOy8qIG9wZXJhdGluZ1N5c3RlbSAqLwoJfSBlbHNlCgkgICAgbG9uZ19yZXR1cm4gPSA0OwkvKiBhcHBsaWNhdGlvbiAqLwogICAgI2VsaWYgZGVmaW5lZChvcGVuYnNkNSkKICAgICAgICBpZiAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfZmxhZyAmIFBfU1lTVEVNKQoJICAgIGxvbmdfcmV0dXJuID0gMjsJLyogb3BlcmF0aW5nU3lzdGVtICovCgllbHNlCgkgICAgbG9uZ19yZXR1cm4gPSA0OwkvKiBhcHBsaWNhdGlvbiAqLwogICAgI2Vsc2UKICAgICAgI2lmIGRlZmluZWQoZHJhZ29uZmx5KSAmJiBfX0RyYWdvbkZseV92ZXJzaW9uID49IDE5MDAwMAogICAgICAgIGlmIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfZmxhZ3MgJiBQX1NZU1RFTSkKICAgICAgI2Vsc2UKICAgICAgICBpZiAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX3Byb2MucF9mbGFnICYgUF9TWVNURU0pCiAgICAgICNlbmRpZgoJICAgIGxvbmdfcmV0dXJuID0gMjsJLyogb3BlcmF0aW5nU3lzdGVtICovCgllbHNlCgkgICAgbG9uZ19yZXR1cm4gPSA0OwkvKiBhcHBsaWNhdGlvbiAqLwogICAgI2VuZGlmCiNlbHNlCglsb25nX3JldHVybiA9IDQ7CS8qIGFwcGxpY2F0aW9uICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIEhSU1dSVU5fU1RBVFVTOgojaWYgZGVmaW5lZChjeWd3aW4pCiAgICAgICAgaWYgKGxvd3Byb2MucHJvY2Vzc19zdGF0ZSAmIFBJRF9TVE9QUEVEKQogICAgICAgICAgICBsb25nX3JldHVybiA9IDM7ICAgIC8qIG5vdFJ1bm5hYmxlICovCiAgICAgICAgLyogZWxzZSBpZiAobG93cHJvYy5wcm9jZXNzX3N0YXRlICYgUElEX1pPTUJJRSkgKi8KICAgICAgICBlbHNlIGlmIChsb3dwcm9jLmV4aXRjb2RlICYgfjB4ZmZmZikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA0OyAgICAvKiBpbnZhbGlkICovCiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IDE7ICAgIC8qIHJ1bm5pbmcgKi8KI2VsaWYgIWRlZmluZWQobGludXgpCiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucHN0X3N0YXQpIHsKICAgICAgICBjYXNlIFBTX1NUT1A6CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMzsgICAgLyogbm90UnVubmFibGUgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBQU19TTEVFUDoKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAyOyAgICAvKiBydW5uYWJsZSAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFBTX1JVTjoKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAxOyAgICAvKiBydW5uaW5nICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUFNfWk9NQklFOgogICAgICAgIGNhc2UgUFNfSURMRToKICAgICAgICBjYXNlIFBTX09USEVSOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNDsgICAgLyogaW52YWxpZCAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiNlbHNlCiNpZiBIQVZFX0tWTV9HRVRQUk9DUwogICAgI2lmIGRlZmluZWQoZnJlZWJzZDUpICYmIF9fRnJlZUJTRF92ZXJzaW9uID49IDUwMDAxNAogICAgICAgIHN3aXRjaCAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3N0YXQpIHsKICAgICNlbGlmIGRlZmluZWQoZHJhZ29uZmx5KSAmJiBfX0RyYWdvbkZseV92ZXJzaW9uID49IDE5MDAwMAogICAgICAgIHN3aXRjaCAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX3N0YXQpIHsKICAgICNlbGlmIGRlZmluZWQob3BlbmJzZDUpCiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF9zdGF0KSB7CiAgICAjZWxzZQogICAgICAgIHN3aXRjaCAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX3Byb2MucF9zdGF0KSB7CiAgICAjZW5kaWYKI2VsaWYgZGVmaW5lZChkeW5peCkKICAgICAgICBzd2l0Y2ggKGxvd3BzaW5mby5wcl9zdGF0ZSkgewojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQojaWYgX1NMQVNIX1BST0NfTUVUSE9EXwogICAgICAgIHN3aXRjaCAocHJvY19idWYgPyBwcm9jX2J1Zi0+cHJfbHdwLnByX3N0YXRlIDogU0lETCkgewojZWxzZQogICAgICAgIHN3aXRjaCAocHJvY19idWYtPnBfc3RhdCkgewojZW5kaWYKI2VsaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBzd2l0Y2ggKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5waV9zdGF0ZSkgewojZWxzZQogICAgICAgIHN3aXRjaCAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfc3RhdCkgewojZW5kaWYKICAgICAgICBjYXNlIFNTVE9QOgogICAgICAgICAgICBsb25nX3JldHVybiA9IDM7ICAgIC8qIG5vdFJ1bm5hYmxlICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMDoKI2lmZGVmIFNTV0FQCiAgICAgICAgY2FzZSBTU1dBUDoKI2VuZGlmCiNpZmRlZiBTU0xFRVAKICAgICAgICBjYXNlIFNTTEVFUDoKI2VuZGlmCiNpZmRlZiBTV0FJVAogICAgICAgIGNhc2UgU1dBSVQ6CiNlbmRpZgogICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgIC8qIHJ1bm5hYmxlICovCiAgICAgICAgICAgIGJyZWFrOwojaWZkZWYgU0FDVElWRQogICAgICAgIGNhc2UgU0FDVElWRToKI2VuZGlmCiNpZmRlZiBTUlVOCiAgICAgICAgY2FzZSBTUlVOOgojZW5kaWYKI2lmZGVmIFNPTlBST0MKICAgICAgICBjYXNlIFNPTlBST0M6CiNlbmRpZgogICAgICAgICAgICBsb25nX3JldHVybiA9IDE7ICAgIC8qIHJ1bm5pbmcgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTSURMOgogICAgICAgIGNhc2UgU1pPTUI6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA0OyAgICAvKiBpbnZhbGlkICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KI2VuZGlmCiNlbHNlCglpZiAoKGNwID0gZ2V0X3Byb2Nfc3RhdF9maWVsZChwaWQsYnVmLHNpemVvZihidWYpLDIpKSAhPSBOVUxMICkgewogICAgICAgICAgICBzd2l0Y2ggKCpjcCkgewogICAgICAgICAgICBjYXNlICdSJzoKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMTsgICAgICAgIC8qIHJ1bm5pbmcgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdTJzoKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMjsgICAgICAgIC8qIHJ1bm5hYmxlICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnRCc6CiAgICAgICAgICAgIGNhc2UgJ1QnOgogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAzOyAgICAgICAgLyogbm90UnVubmFibGUgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdaJzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNDsgICAgICAgIC8qIGludmFsaWQgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNDsgICAgLyogaW52YWxpZCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwoKICAgIGNhc2UgSFJTV1JVTlBFUkZfQ1BVOgojaWZkZWYgSEFWRV9TWVNfUFNUQVRfSAogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY19idWYucHN0X2NwdGlja3N0b3RhbDsKICAgICAgICAvKgogICAgICAgICAqIE5vdCBjb252aW5jZWQgdGhpcyBpcyByaWdodCwgYnV0Li4uLgogICAgICAgICAqLwojZWxpZiBkZWZpbmVkKGR5bml4KQogICAgICAgIGxvbmdfcmV0dXJuID0gbG93cHNpbmZvLnByX3RpbWUudHZfc2VjICogMTAwICsKICAgICAgICAgICAgbG93cHNpbmZvLnByX3RpbWUudHZfbnNlYyAvIDEwMDAwMDAwOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQojaWYgX1NMQVNIX1BST0NfTUVUSE9EXwogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY19idWYgPyBwcm9jX2J1Zi0+cHJfdGltZS50dl9zZWMgKiAxMDAgKwogICAgICAgICAgICBwcm9jX2J1Zi0+cHJfdGltZS50dl9uc2VjIC8gMTAwMDAwMDAgOiAwOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY19idWYtPnBfdXRpbWUgKiAxMDAgKyBwcm9jX2J1Zi0+cF9zdGltZSAqIDEwMDsKI2VuZGlmCiNlbGlmIEhBVkVfS1ZNX0dFVFBST0NTCiAgICAjaWYgZGVmaW5lZChOT1RfREVGSU5FRCkgJiYgZGVmaW5lZChmcmVlYnNkNSkgJiYgX19GcmVlQlNEX3ZlcnNpb24gPj0gNTAwMDE0CiAgICAgICAgLyogWFhYOiBBY2Nlc3Npbmcga2lfcGFkZHIgY2F1c2VzIHNpZzEwIC4uLgogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3BhZGRyLT5wX3V0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV9wYWRkci0+cF9zdGlja3MgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfcGFkZHItPnBfaXRpY2tzOyAqLwogICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICNlbGlmIGRlZmluZWQoZnJlZWJzZDUpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfcnVudGltZSAvIDEwMDAwMDsKICAgICNlbGlmIGRlZmluZWQoZHJhZ29uZmx5KSAmJiBfX0RyYWdvbkZseV92ZXJzaW9uID49IDE5MDAwMAogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2x3cC5rbF91dGlja3MgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfbHdwLmtsX3N0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9sd3Aua2xfaXRpY2tzOwogICAgI2VsaWYgZGVmaW5lZChvcGVuYnNkNSkKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3V0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3N0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX2l0aWNrczsKICAgICNlbGlmIGRlZmluZWQoZHJhZ29uZmx5KQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2Vwcm9jLmVfdXRpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2Vwcm9jLmVfc3RpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2Vwcm9jLmVfaXRpY2tzOwogICAgI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9wcm9jLnBfdXRpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX3Byb2MucF9zdGlja3MgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfcHJvYy5wX2l0aWNrczsKICAgICNlbmRpZgojZWxpZiBkZWZpbmVkKGxpbnV4KQoJaWYgKChjcCA9IGdldF9wcm9jX3N0YXRfZmllbGQocGlkLGJ1ZixzaXplb2YoYnVmKSwxMykpID09IE5VTEwgKSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgICAgICB9CgogICAgICAgIGxvbmdfcmV0dXJuID0gYXRvaShjcCk7IC8qIHV0aW1lICovCgogICAgICAgIGNwID0gc2tpcF90b19uZXh0X2ZpZWxkKGNwKTsKCiAgICAgICAgbG9uZ19yZXR1cm4gKz0gYXRvaShjcCk7ICAgICAgICAvKiArIHN0aW1lICovCiNlbGlmIGRlZmluZWQoc3Vub3M0KQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfdGltZTsKI2VsaWYgZGVmaW5lZChjeWd3aW4pCiAgICAgICAgewogICAgICAgICAgICBEV09SRCAgICAgICAgICAgbiA9IGxvd3Byb2MuZHdQcm9jZXNzSWQ7CiAgICAgICAgICAgIEhBTkRMRSAgICAgICAgICBoID0KICAgICAgICAgICAgICAgIE9wZW5Qcm9jZXNzKFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT04gfCBQUk9DRVNTX1ZNX1JFQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgbik7CiAgICAgICAgICAgIEZJTEVUSU1FICAgICAgICBjdCwgZXQsIGt0LCB1dDsKCiAgICAgICAgICAgIGlmIChoKSB7CiAgICAgICAgICAgICAgICBpZiAoR2V0UHJvY2Vzc1RpbWVzKGgsICZjdCwgJmV0LCAma3QsICZ1dCkpCiAgICAgICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodG9fbXNlYygma3QpICsgdG9fbXNlYygmdXQpKSAvIDEwOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0lORk8sICJubyBwcm9jZXNzIHRpbWVzIGZvciAlbHUgKCVsdSlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93cHJvYy5waWQsIG4pOwogICAgICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIENsb3NlSGFuZGxlKGgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0lORk8sICJubyBwcm9jZXNzIGhhbmRsZSBmb3IgJWx1ICglbHUpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbG93cHJvYy5waWQsIG4pOwogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX3J1LnJ1X3V0aW1lLnR2X3NlYyAqIDEwMCArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5waV9ydS5ydV91dGltZS50dl91c2VjIC8gMTAwMDAwMDAgKyAvKiBuYW5vc2Vjb25kcyAqLwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucGlfcnUucnVfc3RpbWUudHZfc2VjICogMTAwICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX3J1LnJ1X3N0aW1lLnR2X3VzZWMgLyAxMDAwMDAwMDsgLyogbmFub3NlY29uZHMgKi8KI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3V0aW1lLnR2X3NlYyAqIDEwMCArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3V0aW1lLnR2X3VzZWMgLyAxMDAwMCArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3N0aW1lLnR2X3NlYyAqIDEwMCArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3N0aW1lLnR2X3VzZWMgLyAxMDAwMDsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTV1JVTlBFUkZfTUVNOgojaWZkZWYgSEFWRV9TWVNfUFNUQVRfSAojIGlmZGVmIFBHU0hJRlQKICAgICAgICBsb25nX3JldHVybiA9IChwcm9jX2J1Zi5wc3RfcnNzaXplIDw8IFBHU0hJRlQpIC8gMTAyNDsKIyBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX2J1Zi5wc3RfcnNzaXplICogZ2V0cGFnZXNpemUoKSAvIDEwMjQ7CiMgZW5kaWYKI2VsaWYgZGVmaW5lZChkeW5peCkKICAgICAgICBsb25nX3JldHVybiA9IChsb3dwc2luZm8ucHJfcnNzaXplICogTU1VX1BBR0VTSVpFKSAvIDEwMjQ7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiNpZmRlZiBfSUxQMzIKICAgICAgICBpZihOVUxMICE9IHByb2NfYnVmICYmIDAgPT0gcHJvY19idWYtPnByX3Jzc2l6ZSkKICAgICAgICB7IC8qIE9kZHMgb24gdGhhdCB3ZSBhcmUgbG9va2luZyB3aXRoIGEgMzIgYml0IGFwcCBhdCBhIDY0IGJpdCBwc2luZm8uKi8KICAgICAgICAgICAgbmV0c25tcF9tZW1vcnlfaW5mbyAqbWVtOwogICAgICAgICAgICBuZXRzbm1wX21lbW9yeV9sb2FkKCk7CiAgICAgICAgICAgIG1lbSA9IG5ldHNubXBfbWVtb3J5X2dldF9ieUlkeCggTkVUU05NUF9NRU1fVFlQRV9QSFlTTUVNLCAwICk7CiAgICAgICAgICAgIGlmICghbWVtKSAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0lORk8sICJuZXRzbm1wX21lbW9yeV9nZXRfYnlJZHggcmV0dXJuZWQgTlVMTCBwb2ludGVyXG4iKTsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsvKiBUcmllZCBteSBiZXN0LCBnaXZpbmcgdXAuKi8KICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgey8qIDB4ODAwMCBpcyB0aGUgbWF4aW11bSByYW5nZSBvZiBwcl9wY3RtZW0uIGRldmlzaW9uIG9mIDEwMjQgaXMgdG8gZ28gZnJvbSBCIHRvIGtCKi8KICAgICAgICAgICAgICAgIHVpbnQzMl90IHBjdF91bml0ID0gKG1lbS0+c2l6ZS8weDgwMDApICogKG1lbS0+dW5pdHMvMTAyNCk7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IHByb2NfYnVmID8gcHJvY19idWYtPnByX3BjdG1lbSAqIHBjdF91bml0IDogMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgeyAgICAKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX2J1ZiA/IHByb2NfYnVmLT5wcl9yc3NpemUgOiAwOwogICAgICAgIAogICAgICAgIH0KI2Vsc2UgLypfTFA2NCovCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX2J1ZiA/IHByb2NfYnVmLT5wcl9yc3NpemUgOiAwOwojZW5kaWYgLypfTFA2NCovCgojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY19idWYtPnBfc3dyc3M7CiNlbmRpZgojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX3NpemUgKiBnZXRwYWdlc2l6ZSgpIC8gMTAyNDsKI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MgJiYgIWRlZmluZWQoZGFyd2luOCkKICAjaWYgZGVmaW5lZChOT1RfREVGSU5FRCkgJiYgZGVmaW5lZChmcmVlYnNkNSkgJiYgX19GcmVlQlNEX3ZlcnNpb24gPj0gNTAwMDE0CgkgICAgLyogWFhYCgkgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfdm1zcGFjZS0+dm1fdHNpemUgKwoJCQkgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV92bXNwYWNlLT52bV9zc2l6ZSArCgkJCSAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3Ztc3BhY2UtPnZtX2RzaXplOwoJICAgIGxvbmdfcmV0dXJuID0gbG9uZ19yZXR1cm4gKiAoZ2V0cGFnZXNpemUoKSAvIDEwMjQpOyAqLwoJICAgIGxvbmdfcmV0dXJuID0gMDsKICAjZWxpZiBkZWZpbmVkKGZyZWVic2QzKSAmJiAhZGVmaW5lZChkYXJ3aW4pCiAgICAgICAgbG9uZ19yZXR1cm4gPQogICAgI2lmIGRlZmluZWQoZnJlZWJzZDUpCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV9zaXplIC8gMTAyNDsKICAgICNlbGlmIGRlZmluZWQoZHJhZ29uZmx5KSAmJiBfX0RyYWdvbkZseV92ZXJzaW9uID49IDE5MDAwMAogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3Bfdm1fbWFwX3NpemUgLyAxMDI0OwogICAgI2Vsc2UKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2Vwcm9jLmVfdm0udm1fbWFwLnNpemUgLyAxMDI0OwogICAgI2VuZGlmCiAgI2VsaWYgZGVmaW5lZChvcGVuYnNkNSkKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3ZtX3RzaXplICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfdm1fc3NpemUgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF92bV9kc2l6ZTsKICAgICAgICBsb25nX3JldHVybiA9IGxvbmdfcmV0dXJuICogKGdldHBhZ2VzaXplKCkgLyAxMDI0KTsKICAjZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2Vwcm9jLmVfdm0udm1fdHNpemUgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfZXByb2MuZV92bS52bV9zc2l6ZSArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9lcHJvYy5lX3ZtLnZtX2RzaXplOwogICAgICAgIGxvbmdfcmV0dXJuID0gbG9uZ19yZXR1cm4gKiAoZ2V0cGFnZXNpemUoKSAvIDEwMjQpOwogICNlbmRpZgojZWxpZiBkZWZpbmVkKGxpbnV4KQoJaWYgKChjcCA9IGdldF9wcm9jX3N0YXRfZmllbGQocGlkLGJ1ZixzaXplb2YoYnVmKSwyMykpID09IE5VTEwgKSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgICAgICB9CiAgICAgICAgbG9uZ19yZXR1cm4gPSBhdG9pKGNwKSAqIChnZXRwYWdlc2l6ZSgpIC8gMTAyNCk7ICAgICAgICAvKiByc3MgKi8KI2VsaWYgZGVmaW5lZChjeWd3aW4pCiAgICAgICAgewogICAgICAgICAgICBEV09SRCAgICAgICAgICAgbiA9IGxvd3Byb2MuZHdQcm9jZXNzSWQ7CiAgICAgICAgICAgIEhBTkRMRSAgICAgICAgICBoID0KICAgICAgICAgICAgICAgIE9wZW5Qcm9jZXNzKFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT04gfCBQUk9DRVNTX1ZNX1JFQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgbik7CiAgICAgICAgICAgIFBST0NFU1NfTUVNT1JZX0NPVU5URVJTIHBtYzsKCiAgICAgICAgICAgIGlmIChoKSB7CiAgICAgICAgICAgICAgICBpZiAobXlHZXRQcm9jZXNzTWVtb3J5SW5mbwogICAgICAgICAgICAgICAgICAgICYmIG15R2V0UHJvY2Vzc01lbW9yeUluZm8oaCwgJnBtYywgc2l6ZW9mIHBtYykpCiAgICAgICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBwbWMuV29ya2luZ1NldFNpemUgLyAxMDI0OwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0lORk8sICJubyBwcm9jZXNzIHRpbWVzIGZvciAlbHUgKCVsdSlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93cHJvYy5waWQsIG4pOwogICAgICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIENsb3NlSGFuZGxlKGgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0lORk8sICJubyBwcm9jZXNzIGhhbmRsZSBmb3IgJWx1ICglbHUpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbG93cHJvYy5waWQsIG4pOwogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAxNiAqIDEwMjQ7ICAgICAgICAvKiBYWFggLSAxNk0hICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaHJzd3J1blxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEludGVybmFsIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojaWYgZGVmaW5lZChsaW51eCkKCkRJUiAgICAgICAgICAgICpwcm9jZGlyID0gTlVMTDsKc3RydWN0IGRpcmVudCAgKnByb2NlbnRyeV9wOwoKdm9pZApJbml0X0hSX1NXUnVuKHZvaWQpCnsKICAgIGlmIChwcm9jZGlyICE9IE5VTEwpCiAgICAgICAgY2xvc2VkaXIocHJvY2Rpcik7CiAgICBwcm9jZGlyID0gb3BlbmRpcigiL3Byb2MiKTsKfQoKaW50CkdldF9OZXh0X0hSX1NXUnVuKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBwaWQ7CiAgICBpZiAocHJvY2RpciA9PSBOVUxMKQogICAgICByZXR1cm4gLTE7CiAgICBwcm9jZW50cnlfcCA9IHJlYWRkaXIocHJvY2Rpcik7CgogICAgaWYgKHByb2NlbnRyeV9wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgIHBpZCA9IGF0b2kocHJvY2VudHJ5X3AtPmRfbmFtZSk7CiAgICBpZiAocGlkID09IDApCiAgICAgICAgcmV0dXJuIChHZXRfTmV4dF9IUl9TV1J1bigpKTsKICAgIHJldHVybiBwaWQ7Cn0KCnZvaWQKRW5kX0hSX1NXUnVuKHZvaWQpCnsKICAgIGlmIChwcm9jZGlyKQogICAgICAgIGNsb3NlZGlyKHByb2NkaXIpOwogICAgcHJvY2RpciA9IE5VTEw7Cn0KCiNlbGlmIGRlZmluZWQoY3lnd2luKQoKc3RhdGljIHBpZF90ICAgIGN1cnBpZDsKCnZvaWQKSW5pdF9IUl9TV1J1bih2b2lkKQp7CiAgICBjeWd3aW5faW50ZXJuYWwoQ1dfTE9DS19QSU5GTywgMTAwMCk7CiAgICBjdXJwaWQgPSAwOwp9CgppbnQKR2V0X05leHRfSFJfU1dSdW4odm9pZCkKewogICAgY3VycHJvYyA9CiAgICAgICAgKHN0cnVjdCBleHRlcm5hbF9waW5mbyAqKSBjeWd3aW5faW50ZXJuYWwocXVlcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycGlkIHwgQ1dfTkVYVFBJRCk7CiAgICBpZiAoY3VycHJvYykKICAgICAgICBjdXJwaWQgPSBjdXJwcm9jLT5waWQ7CiAgICBlbHNlIHsKICAgICAgICBjdXJwaWQgPSAtMTsKICAgIH0KICAgIHJldHVybiBjdXJwaWQ7Cn0KCnZvaWQKRW5kX0hSX1NXUnVuKHZvaWQpCnsKICAgIGN5Z3dpbl9pbnRlcm5hbChDV19VTkxPQ0tfUElORk8pOwp9CgojZWxpZiBkZWZpbmVkKGR5bml4KQoKdm9pZApJbml0X0hSX1NXUnVuKHZvaWQpCnsKICAgIG5leHRwcm9jID0gMDsKfQoKaW50CkdldF9OZXh0X0hSX1NXUnVuKHZvaWQpCnsKICAgIGdldHBycHNpbmZvX3QgICpzZWxlY3QgPSAwOwoKICAgIERFQlVHTVNHVEwoKCJob3N0L2hyX3N3cnVuOjpHZXROZXh0SFJfU1dSdW4iLAogICAgICAgICAgICAgICAgIm5leHRwcm9jID09ICVkLi4uICZuZXh0cHJvYyA9ICV1XG4iLCBuZXh0cHJvYywKICAgICAgICAgICAgICAgICZuZXh0cHJvYykpOwogICAgaWYgKChuZXh0cHJvYyA9IGdldHBycHNpbmZvKG5leHRwcm9jLCBzZWxlY3QsICZteXBzaW5mbykpIDwgMCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0dUTCgoImhvc3QvaHJfc3dydW46OkdldE5leHRIUl9TV1J1biIsCiAgICAgICAgICAgICAgICAgICAgImdldHBycHNpbmZvIHJldHVybmVkICVkXG4iLCBuZXh0cHJvYykpOwogICAgICAgIHJldHVybiBteXBzaW5mby5wcl9waWQ7CiAgICB9Cgp9Cgp2b2lkCkVuZF9IUl9TV1J1bih2b2lkKQp7CiAgICAvKgogICAgICoganVzdCBhIHN0dWIuLi4gYmVjYXVzZSBpdCdzIGRlY2xhcmVkIAogICAgICovCn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KCnN0YXRpYyBpbnQgICAgICBucHJvYzsKCnZvaWQKSW5pdF9IUl9TV1J1bih2b2lkKQp7CiAgICBzaXplX3QgICAgICAgICAgYnl0ZXM7CiAgICBzdGF0aWMgdGltZV90ICAgaXdoZW4gPSAwOwogICAgdGltZV90ICAgICAgICAgIG5vdzsKCiAgICB0aW1lKCZub3cpOwogICAgaWYgKG5vdyA9PSBpd2hlbikgewogICAgICAgIGN1cnJlbnRfcHJvY19lbnRyeSA9IDA7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaXdoZW4gPSBub3c7CgojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgcHN0YXRfZ2V0ZHluYW1pYygmcHN0X2R5biwgc2l6ZW9mKHN0cnVjdCBwc3RfZHluYW1pYyksIDEsIDApOwogICAgbnByb2MgPSBwc3RfZHluLnBzZF9hY3RpdmVwcm9jczsKICAgIGJ5dGVzID0gbnByb2MgKiBzaXplb2Yoc3RydWN0IHBzdF9zdGF0dXMpOwogICAgaWYgKChwcm9jX3RhYmxlID0KICAgICAgICAgKHN0cnVjdCBwc3Rfc3RhdHVzICopIHJlYWxsb2MocHJvY190YWJsZSwgYnl0ZXMpKSA9PSBOVUxMKSB7CiAgICAgICAgY3VycmVudF9wcm9jX2VudHJ5ID0gbnByb2MgKyAxOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHBzdGF0X2dldHByb2MocHJvY190YWJsZSwgc2l6ZW9mKHN0cnVjdCBwc3Rfc3RhdHVzKSwgbnByb2MsIDApOwoKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKICAgIGlmIChnZXRLc3RhdEludCgidW5peCIsICJzeXN0ZW1fbWlzYyIsICJucHJvYyIsICZucHJvYykpIHsKICAgICAgICBjdXJyZW50X3Byb2NfZW50cnkgPSBucHJvYyArIDE7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgYnl0ZXMgPSBucHJvYyAqIHNpemVvZihpbnQpOwogICAgaWYgKChwcm9jX3RhYmxlID0gKGludCAqKSByZWFsbG9jKHByb2NfdGFibGUsIGJ5dGVzKSkgPT0gTlVMTCkgewogICAgICAgIGN1cnJlbnRfcHJvY19lbnRyeSA9IG5wcm9jICsgMTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB7CiAgICAgICAgRElSICAgICAgICAgICAgKmY7CiAgICAgICAgc3RydWN0IGRpcmVudCAgKmRwOwojaWYgX1NMQVNIX1BST0NfTUVUSE9EXyA9PSAwCiAgICAgICAgaWYgKGtkID09IE5VTEwpIHsKICAgICAgICAgICAgY3VycmVudF9wcm9jX2VudHJ5ID0gbnByb2MgKyAxOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQojZW5kaWYKICAgICAgICBmID0gb3BlbmRpcigiL3Byb2MiKTsKICAgICAgICBjdXJyZW50X3Byb2NfZW50cnkgPSAwOwogICAgICAgIHdoaWxlICgoZHAgPSByZWFkZGlyKGYpKSAhPSBOVUxMICYmIGN1cnJlbnRfcHJvY19lbnRyeSA8IG5wcm9jKQogICAgICAgICAgICBpZiAoZHAtPmRfbmFtZVswXSAhPSAnLicpCiAgICAgICAgICAgICAgICBwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeSsrXSA9IGF0b2koZHAtPmRfbmFtZSk7CiAgICAgICAgLyoKICAgICAgICAgKiBpZiB3ZSBhcmUgaW4gYSBTb2xhcmlzIHpvbmUsIG5wcm9jID4gY3VycmVudF9wcm9jX2VudHJ5ICEKICAgICAgICAgKiBidXQgd2Ugb25seSB3YW50IHRoZSBwcm9jZXNzZXMgZnJvbSB0aGUgbG9jYWwgem9uZQogICAgICAgICAqLwogICAgICAgIGlmIChjdXJyZW50X3Byb2NfZW50cnkgIT0gbnByb2MpCiAgICAgICAgICAgIG5wcm9jID0gY3VycmVudF9wcm9jX2VudHJ5OwogICAgICAgIGNsb3NlZGlyKGYpOwogICAgfQojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgewoJCXBpZF90IHByb2NfaW5kZXggPSAwOwoJCWludCBhdmFpbCA9IDEwMjQ7CgkJaWYgKHByb2NfdGFibGUpIHsKCQkJZnJlZShwcm9jX3RhYmxlKTsKCQl9CgkJbnByb2MgPSAwOwoJCXByb2NfdGFibGUgPSBtYWxsb2Moc2l6ZW9mKHByb2NfdGFibGVbMF0pICogYXZhaWwpOwoJCWZvciAoOzspIHsKCQkJaW50IGdvdDsKCQkJaWYgKCFwcm9jX3RhYmxlKSB7CgkJCQlucHJvYyA9IDA7CgkJCQlzbm1wX2xvZ19wZXJyb3IoIkluaXRfSFJfU1dSdW4tbWFsbG9jIik7CgkJCQlyZXR1cm47CgkJCX0KCQkJZ290ID0gZ2V0cHJvY3MocHJvY190YWJsZSArIG5wcm9jLCBzaXplb2YocHJvY190YWJsZVswXSksCgkJCQkJCSAgIDAsIHNpemVvZihzdHJ1Y3QgZmRzaW5mbyksCgkJCQkJCSAgICZwcm9jX2luZGV4LCBhdmFpbCAtIG5wcm9jKTsKCQkJbnByb2MgKz0gZ290OwoJCQlpZiAobnByb2MgPCBhdmFpbCkgewoJCQkJYnJlYWs7CgkJCX0KCQkJYXZhaWwgKz0gMTAyNDsKCQkJcHJvY190YWJsZSA9IHJlYWxsb2MocHJvY190YWJsZSwgYXZhaWwgKiBzaXplb2YocHJvY190YWJsZVswXSkpOwoJCX0KICAgIH0KI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MKICAgIHsKICAgICAgICBpZiAoa2QgPT0gTlVMTCkgewogICAgICAgICAgICBucHJvYyA9IDA7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgI2lmIGRlZmluZWQob3BlbmJzZDUpCiAgICAgICAgcHJvY190YWJsZSA9IGt2bV9nZXRwcm9jcyhrZCwgS0VSTl9QUk9DX0FMTCwgMCwgc2l6ZW9mIChzdHJ1Y3Qga2luZm9fcHJvYyksICZucHJvYyk7CiAgI2Vsc2UKICAgICAgICBwcm9jX3RhYmxlID0ga3ZtX2dldHByb2NzKGtkLCBLRVJOX1BST0NfQUxMLCAwLCAmbnByb2MpOwogICNlbmRpZgogICAgfQojZWxzZQoKICAgIGN1cnJlbnRfcHJvY19lbnRyeSA9IDE7CiNpZm5kZWYgYnNkaTIKICAgIG5wcm9jID0gMDsKCiAgICBpZiAoYXV0b19ubGlzdChOUFJPQ19TWU1CT0wsIChjaGFyICopICZucHJvYywgc2l6ZW9mKGludCkpID09IDApIHsKICAgICAgICBzbm1wX2xvZ19wZXJyb3IoIkluaXRfSFJfU1dSdW4tYXV0b19ubGlzdCBOUFJPQyIpOwogICAgICAgIHJldHVybjsKICAgIH0KI2VuZGlmCiAgICBieXRlcyA9IG5wcm9jICogc2l6ZW9mKHN0cnVjdCBwcm9jKTsKCiAgICBpZiAocHJvY190YWJsZSkKICAgICAgICBmcmVlKChjaGFyICopIHByb2NfdGFibGUpOwogICAgaWYgKChwcm9jX3RhYmxlID0gKHN0cnVjdCBwcm9jICopIG1hbGxvYyhieXRlcykpID09IE5VTEwpIHsKICAgICAgICBucHJvYyA9IDA7CiAgICAgICAgc25tcF9sb2dfcGVycm9yKCJJbml0X0hSX1NXUnVuLW1hbGxvYyIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHByb2NfdGFibGVfYmFzZTsKICAgICAgICBpZiAoYXV0b19ubGlzdAogICAgICAgICAgICAoUFJPQ19TWU1CT0wsIChjaGFyICopICZwcm9jX3RhYmxlX2Jhc2UsCiAgICAgICAgICAgICBzaXplb2YocHJvY190YWJsZV9iYXNlKSkgPT0gMCkgewogICAgICAgICAgICBucHJvYyA9IDA7CiAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigiSW5pdF9IUl9TV1J1bi1hdXRvX25saXN0IFBST0MiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoTkVUU05NUF9LTE9PS1VQKHByb2NfdGFibGVfYmFzZSwgKGNoYXIgKikgcHJvY190YWJsZSwgYnl0ZXMpID09IDApIHsKICAgICAgICAgICAgbnByb2MgPSAwOwogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoIkluaXRfSFJfU1dSdW4ta2xvb2t1cCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojZW5kaWYKICAgIGN1cnJlbnRfcHJvY19lbnRyeSA9IDA7Cn0KCmludApHZXRfTmV4dF9IUl9TV1J1bih2b2lkKQp7CiAgICB3aGlsZSAoY3VycmVudF9wcm9jX2VudHJ5IDwgbnByb2MpIHsKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK10ucHN0X3BpZDsKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK107CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0NTCiAgICAjaWYgZGVmaW5lZChmcmVlYnNkNSkgJiYgX19GcmVlQlNEX3ZlcnNpb24gPj0gNTAwMDE0CiAgICAgICAgaWYgKHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5XS5raV9zdGF0ICE9IDApCiAgICAgICAgICAgIHJldHVybiBwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeSsrXS5raV9waWQ7CiAgICAjZWxpZiBkZWZpbmVkKGRyYWdvbmZseSkgJiYgX19EcmFnb25GbHlfdmVyc2lvbiA+PSAxOTAwMDAKICAgICAgICBpZiAocHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnldLmtwX3N0YXQgIT0gMCkKICAgICAgICAgICAgcmV0dXJuIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdLmtwX3BpZDsKICAgICNlbGlmIGRlZmluZWQob3BlbmJzZDUpCiAgICAgICAgaWYgKHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5XS5wX3N0YXQgIT0gMCkKICAgICAgICAgICAgcmV0dXJuIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdLnBfcGlkOwogICAgI2Vsc2UKICAgICAgICBpZiAocHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnldLmtwX3Byb2MucF9zdGF0ICE9IDApCiAgICAgICAgICAgIHJldHVybiBwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeSsrXS5rcF9wcm9jLnBfcGlkOwogICAgI2VuZGlmCiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgaWYgKHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5XS5waV9zdGF0ZSAhPSAwKQogICAgICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK10ucGlfcGlkOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKytjdXJyZW50X3Byb2NfZW50cnk7CiNlbHNlCiAgICAgICAgaWYgKHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5XS5wX3N0YXQgIT0gMCkKICAgICAgICAgICAgcmV0dXJuIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdLnBfcGlkOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKytjdXJyZW50X3Byb2NfZW50cnk7CiNlbmRpZgoKICAgIH0KICAgIHJldHVybiAtMTsKfQoKdm9pZApFbmRfSFJfU1dSdW4odm9pZCkKewogICAgY3VycmVudF9wcm9jX2VudHJ5ID0gbnByb2MgKyAxOwp9CiNlbmRpZgoKaW50CmNvdW50X3Byb2Nlc3Nlcyh2b2lkKQp7CiNpZiAhKGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoY3lnd2luKSB8fCBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpIHx8IGRlZmluZWQoc29sYXJpczIpIHx8IEhBVkVfS1ZNX0dFVFBST0NTIHx8IGRlZmluZWQoZHluaXgpKQogICAgaW50ICAgICAgICAgICAgIGk7CiNlbmRpZgogICAgaW50ICAgICAgICAgICAgIHRvdGFsID0gMDsKCiAgICBJbml0X0hSX1NXUnVuKCk7CiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpIHx8IEhBVkVfS1ZNX0dFVFBST0NTIHx8IGRlZmluZWQoc29sYXJpczIpCiAgICB0b3RhbCA9IG5wcm9jOwojZWxzZQojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgKytpKSB7CiAgICAgICAgaWYgKHByb2NfdGFibGVbaV0ucGlfc3RhdGUgIT0gMCkKI2VsaWYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKGN5Z3dpbikgJiYgIWRlZmluZWQoZHluaXgpCiAgICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7ICsraSkgewogICAgICAgIGlmIChwcm9jX3RhYmxlW2ldLnBfc3RhdCAhPSAwKQojZWxzZQogICAgd2hpbGUgKEdldF9OZXh0X0hSX1NXUnVuKCkgIT0gLTEpIHsKI2VuZGlmCiAgICAgICAgKyt0b3RhbDsKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhaHB1eDEwICYmICFocHV4MTEgJiYgIUhBVkVfS1ZNX0dFVFBST0NTICYmICFzb2xhcmlzMiAqLwogICAgRW5kX0hSX1NXUnVuKCk7CiAgICByZXR1cm4gdG90YWw7Cn0K