LyogCiAqIEltcGxlbWVudGF0aW9uIG9mIFZFUi5ETEwKICogCiAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogKi8KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlICJ3aW5kb3dzLmgiCiNpbmNsdWRlICJ3aW4uaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ2ZXIuaCIKI2luY2x1ZGUgImx6ZXhwYW5kLmgiCiNpbmNsdWRlICJtb2R1bGUuaCIKI2luY2x1ZGUgIm5lZXhlLmgiCiNpbmNsdWRlICJzdGRkZWJ1Zy5oIgojaW5jbHVkZSAiZGVidWcuaCIKI2luY2x1ZGUgInhtYWxsb2MuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAic3RyaW5nMzIuaCIKCiNkZWZpbmUgTFpSRUFEKHdoYXQpIFwKICBpZiAoc2l6ZW9mKCp3aGF0KSE9TFpSZWFkMzIobHpmZCx3aGF0LHNpemVvZigqd2hhdCkpKSByZXR1cm4gMDsKI2RlZmluZSBMWlRFTEwobHpmZCkgTFpTZWVrKGx6ZmQsIDAsIFNFRUtfQ1VSKTsKCiNkZWZpbmUgc3RyZHVwVzJBKHgpCVNUUklORzMyX0R1cFVuaVRvQW5zaSh4KQojZGVmaW5lIHN0cmR1cEEyVyh4KQlTVFJJTkczMl9EdXBBbnNpVG9VbmkoeCkKCmludApyZWFkX25lX2hlYWRlcihIRklMRSBsemZkLHN0cnVjdCBuZV9oZWFkZXJfcyAqbmVoZCkgewoJc3RydWN0CW16X2hlYWRlcl9zCW16aDsKCglMWlNlZWsobHpmZCwwLFNFRUtfU0VUKTsKCWlmIChzaXplb2YobXpoKSE9TFpSZWFkMzIobHpmZCwmbXpoLHNpemVvZihtemgpKSkKCQlyZXR1cm4gMDsKCWlmIChtemgubXpfbWFnaWMhPU1aX1NJR05BVFVSRSkKCQlyZXR1cm4gMDsKCUxaU2VlayhsemZkLG16aC5uZV9vZmZzZXQsU0VFS19TRVQpOwoJTFpSRUFEKG5laGQpOwoJaWYgKG5laGQtPm5lX21hZ2ljID09IE5FX1NJR05BVFVSRSkgewoJCUxaU2VlayhsemZkLG16aC5uZV9vZmZzZXQsU0VFS19TRVQpOwoJCXJldHVybiAxOwoJfQoJLyogbXVzdCBoYW5kbGUgUEUgZmlsZXMgdG9vLiBMYXRlci4gKi8KCXJldHVybiAwOwp9CgoKaW50CmZpbmRfbmVfcmVzb3VyY2UoCglIRklMRSBsemZkLHN0cnVjdCBuZV9oZWFkZXJfcyAqbmVoZCxTRUdQVFIgdHlwZWlkLFNFR1BUUiByZXNpZCwKCUJZVEUgKipyZXNkYXRhLGludCAqcmVzbGVuLERXT1JEICpvZmYKKSB7CglORV9UWVBFSU5GTwl0aTsKCU5FX05BTUVJTkZPCW5pOwoJaW50CQlpOwoJV09SRAkJc2hpZnRjb3VudDsKCURXT1JECQluZWhkb2Zmc2V0OwoKCW5laGRvZmZzZXQgPSBMWlRFTEwobHpmZCk7CglMWlNlZWsobHpmZCxuZWhkLT5yZXNvdXJjZV90YWJfb2Zmc2V0LFNFRUtfQ1VSKTsKCUxaUkVBRCgmc2hpZnRjb3VudCk7CglkcHJpbnRmX3ZlcihzdGRkZWIsInNoaWZ0Y291bnQgaXMgJWRcbiIsc2hpZnRjb3VudCk7CglkcHJpbnRmX3ZlcihzdGRkZWIsInJlYWRpbmcgcmVzb3VyY2UgdHlwZWluZm8gZGlyLlxuIik7CgoJaWYgKCFISVdPUkQodHlwZWlkKSkgdHlwZWlkID0gKFNFR1BUUikoTE9XT1JEKHR5cGVpZCkgfCAweDgwMDApOwoJaWYgKCFISVdPUkQocmVzaWQpKSAgcmVzaWQgID0gKFNFR1BUUikoTE9XT1JEKHJlc2lkKSB8IDB4ODAwMCk7Cgl3aGlsZSAoMSkgewoJCWludAlza2lwZmxhZzsKCgkJTFpSRUFEKCZ0aSk7CgkJaWYgKCF0aS50eXBlX2lkKQoJCQlyZXR1cm4gMDsKCQlkcHJpbnRmX3ZlcihzdGRkZWIsIiAgICB0aS50eXBlaWQgPSUwNHgsY291bnQ9JWRcbiIsdGkudHlwZV9pZCx0aS5jb3VudCk7CgkJc2tpcGZsYWc9MDsKCQlpZiAoIUhJV09SRCh0eXBlaWQpKSB7CgkJCWlmICgodGkudHlwZV9pZCYweDgwMDApJiYodHlwZWlkIT10aS50eXBlX2lkKSkKCQkJCXNraXBmbGFnPTE7CgkJfSBlbHNlIHsKCQkJaWYgKHRpLnR5cGVfaWQgJiAweDgwMDApIHsKCQkJCXNraXBmbGFnPTE7IAoJCQl9IGVsc2UgewoJCQkJQllURQlsZW47CgkJCQljaGFyCSpzdHI7CgkJCQlEV09SRAl3aGVyZWxlZnQ7CgoJCQkJd2hlcmVsZWZ0ID0gTFpURUxMKGx6ZmQpOwoJCQkJTFpTZWVrKAoJCQkJCWx6ZmQsCgkJCQkJbmVoZG9mZnNldCtuZWhkLT5yZXNvdXJjZV90YWJfb2Zmc2V0K3RpLnR5cGVfaWQsCgkJCQkJU0VFS19TRVQKCQkJCSk7CgkJCQlMWlJFQUQoJmxlbik7CgkJCQlzdHI9eG1hbGxvYyhsZW4pOwoJCQkJaWYgKGxlbiE9TFpSZWFkMzIobHpmZCxzdHIsbGVuKSkKCQkJCQlyZXR1cm4gMDsKCQkJCWRwcmludGZfdmVyKHN0ZGRlYiwicmVhZCAlcyB0byBjb21wYXJlIGl0IHdpdGggJXNcbiIsCgkJCQkJc3RyLChjaGFyKilQVFJfU0VHX1RPX0xJTih0eXBlaWQpCgkJCQkpOwoJCQkJaWYgKGxzdHJjbXBpMzJBKHN0ciwoY2hhciopUFRSX1NFR19UT19MSU4odHlwZWlkKSkpCgkJCQkJc2tpcGZsYWc9MTsKCQkJCWZyZWUoc3RyKTsKCQkJCUxaU2VlayhsemZkLHdoZXJlbGVmdCxTRUVLX1NFVCk7CgkJCX0KCQl9CgkJaWYgKHNraXBmbGFnKSB7CgkJCUxaU2VlayhsemZkLHRpLmNvdW50KnNpemVvZihuaSksU0VFS19DVVIpOwoJCQljb250aW51ZTsKCQl9CgkJZm9yIChpPTA7aTx0aS5jb3VudDtpKyspIHsKCQkJV09SRAkqcmRhdGE7CgkJCWludAlsZW47CgoJCQlMWlJFQUQoJm5pKTsKCQkJZHByaW50Zl92ZXIoc3RkZGViLCIJbmkuaWQ9JTR4LG9mZnNldD0lZCxsZW5ndGg9JWRcbiIsCgkJCQluaS5pZCxuaS5vZmZzZXQsbmkubGVuZ3RoCgkJCSk7CgkJCXNraXBmbGFnPTE7CgkJCWlmICghSElXT1JEKHJlc2lkKSkgewoJCQkJaWYgKG5pLmlkID09IHJlc2lkKQoJCQkJCXNraXBmbGFnPTA7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIShuaS5pZCAmIDB4ODAwMCkpIHsKCQkJCQlCWVRFCWxlbjsKCQkJCQljaGFyCSpzdHI7CgkJCQkJRFdPUkQJd2hlcmVsZWZ0OwoKCQkJCQl3aGVyZWxlZnQgPSBMWlRFTEwobHpmZCk7CgkJCQkJICBMWlNlZWsoCgkJCQkJCWx6ZmQsCgkJCQkJCW5laGRvZmZzZXQrbmVoZC0+cmVzb3VyY2VfdGFiX29mZnNldCtuaS5pZCwKCQkJCQkJU0VFS19TRVQKCQkJCQkpOwoJCQkJCUxaUkVBRCgmbGVuKTsKCQkJCQlzdHI9eG1hbGxvYyhsZW4pOwoJCQkJCWlmIChsZW4hPUxaUmVhZDMyKGx6ZmQsc3RyLGxlbikpCgkJCQkJCXJldHVybiAwOwoJCQkJCWRwcmludGZfdmVyKHN0ZGRlYiwicmVhZCAlcyB0byBjb21wYXJlIGl0IHdpdGggJXNcbiIsCgkJCQkJCXN0ciwoY2hhciopUFRSX1NFR19UT19MSU4odHlwZWlkKQoJCQkJCSk7CgkJCQkJaWYgKCFsc3RyY21waTMyQShzdHIsKGNoYXIqKVBUUl9TRUdfVE9fTElOKHR5cGVpZCkpKQoJCQkJCQlza2lwZmxhZz0wOwoJCQkJCWZyZWUoc3RyKTsKCQkJCQlMWlNlZWsobHpmZCx3aGVyZWxlZnQsU0VFS19TRVQpOwoJCQkJfQoJCQl9CgkJCWlmIChza2lwZmxhZykKCQkJCWNvbnRpbnVlOwoJCQlMWlNlZWsobHpmZCwoKGludCluaS5vZmZzZXQ8PHNoaWZ0Y291bnQpLFNFRUtfU0VUKTsKCQkJKm9mZgk9IChpbnQpbmkub2Zmc2V0PDxzaGlmdGNvdW50OwoJCQlsZW4JPSBuaS5sZW5ndGg8PHNoaWZ0Y291bnQ7CgkJCXJkYXRhPShXT1JEKil4bWFsbG9jKGxlbik7CgkJCWlmIChsZW4hPUxaUmVhZDMyKGx6ZmQscmRhdGEsbGVuKSkgewoJCQkJZnJlZShyZGF0YSk7CgkJCQlyZXR1cm4gMDsKCQkJfQoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsInJlc291cmNlIGZvdW5kLlxuIik7CgkJCSpyZXNkYXRhPSAoQllURSopcmRhdGE7CgkJCSpyZXNsZW4JPSBsZW47CgkJCXJldHVybiAxOwoJCX0KCX0KfQoKLyogR2V0RmlsZVJlc291cmNlU2l6ZQkJCQlbVkVSLjJdICovCkRXT1JECkdldEZpbGVSZXNvdXJjZVNpemUoTFBDU1RSIGZpbGVuYW1lLFNFR1BUUiByZXN0eXBlLFNFR1BUUiByZXNpZCxMUERXT1JEIG9mZikgewoJSEZJTEUJbHpmZDsKCU9GU1RSVUNUCW9mczsKCUJZVEUJKnJlc2RhdGE7CglpbnQJcmVzbGVuOwoJc3RydWN0CW5lX2hlYWRlcl9zCW5laGQ7CgoJZHByaW50Zl92ZXIoc3RkZGViLCJHZXRGaWxlUmVzb3VyY2VTaXplKCVzLCVseCwlbHgsJXApXG4iLAoJCWZpbGVuYW1lLChMT05HKXJlc3R5cGUsKExPTkcpcmVzaWQsb2ZmCgkpOwoJbHpmZD1MWk9wZW5GaWxlMTYoZmlsZW5hbWUsJm9mcyxPRl9SRUFEKTsKCWlmIChsemZkPT0wKQoJCXJldHVybiAwOwoJaWYgKCFyZWFkX25lX2hlYWRlcihsemZkLCZuZWhkKSkgewoJCUxaQ2xvc2UobHpmZCk7CgkJcmV0dXJuIDA7Cgl9CglpZiAoIWZpbmRfbmVfcmVzb3VyY2UobHpmZCwmbmVoZCxyZXN0eXBlLHJlc2lkLCZyZXNkYXRhLCZyZXNsZW4sb2ZmKSkgewoJCUxaQ2xvc2UobHpmZCk7CgkJcmV0dXJuIDA7Cgl9CglmcmVlKHJlc2RhdGEpOwoJTFpDbG9zZShsemZkKTsKCXJldHVybiByZXNsZW47Cn0KCi8qIEdldEZpbGVSZXNvdXJjZQkJCQlbVkVSLjNdICovCkRXT1JECkdldEZpbGVSZXNvdXJjZShMUENTVFIgZmlsZW5hbWUsU0VHUFRSIHJlc3R5cGUsU0VHUFRSIHJlc2lkLAoJCURXT1JEIG9mZixEV09SRCBkYXRhbGVuLExQVk9JRCBkYXRhCikgewoJSEZJTEUJbHpmZDsKCU9GU1RSVUNUCW9mczsKCUJZVEUJKnJlc2RhdGE7CglpbnQJcmVzbGVuPWRhdGFsZW47CglzdHJ1Y3QJbmVfaGVhZGVyX3MJbmVoZDsKCWRwcmludGZfdmVyKHN0ZGRlYiwiR2V0RmlsZVJlc291cmNlKCVzLCVseCwlbHgsJWxkLCVsZCwlcClcbiIsCgkJZmlsZW5hbWUsKExPTkcpcmVzdHlwZSwoTE9ORylyZXNpZCxvZmYsZGF0YWxlbixkYXRhCgkpOwoKCWx6ZmQ9TFpPcGVuRmlsZTE2KGZpbGVuYW1lLCZvZnMsT0ZfUkVBRCk7CglpZiAobHpmZD09MCkKCQlyZXR1cm4gMDsKCWlmICghb2ZmKSB7CgkJaWYgKCFyZWFkX25lX2hlYWRlcihsemZkLCZuZWhkKSkgewoJCQlMWkNsb3NlKGx6ZmQpOwoJCQlyZXR1cm4gMDsKCQl9CgkJaWYgKCFmaW5kX25lX3Jlc291cmNlKGx6ZmQsJm5laGQscmVzdHlwZSxyZXNpZCwmcmVzZGF0YSwmcmVzbGVuLCZvZmYpKSB7CgkJCUxaQ2xvc2UobHpmZCk7CgkJCXJldHVybiAwOwoJCX0KCQlmcmVlKHJlc2RhdGEpOwoJfQoJTFpTZWVrKGx6ZmQsb2ZmLFNFRUtfU0VUKTsKCWlmIChyZXNsZW4+ZGF0YWxlbikKCQlyZXNsZW49ZGF0YWxlbjsKCUxaUmVhZDMyKGx6ZmQsZGF0YSxyZXNsZW4pOwoJTFpDbG9zZShsemZkKTsKCXJldHVybiByZXNsZW47Cn0KCi8qIEdldEZpbGVWZXJzaW9uSW5mb1NpemUJCQlbVkVSLjZdICovCkRXT1JECkdldEZpbGVWZXJzaW9uSW5mb1NpemUxNihMUENTVFIgZmlsZW5hbWUsTFBEV09SRCBoYW5kbGUpIHsKCURXT1JECWxlbixyZXQ7CglCWVRFCWJ1Zls3Ml07CglWU19GSVhFREZJTEVJTkZPICp2ZmZpOwoKCWRwcmludGZfdmVyKHN0ZGRlYiwiR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTE2KCVzLCVwKVxuIixmaWxlbmFtZSxoYW5kbGUpOwoJbGVuPUdldEZpbGVSZXNvdXJjZVNpemUoZmlsZW5hbWUsVlNfRklMRV9JTkZPLFZTX1ZFUlNJT05fSU5GTyxoYW5kbGUpOwoJaWYgKCFsZW4pCgkJcmV0dXJuIDA7CglyZXQ9R2V0RmlsZVJlc291cmNlKAoJCWZpbGVuYW1lLFZTX0ZJTEVfSU5GTyxWU19WRVJTSU9OX0lORk8sKmhhbmRsZSxzaXplb2YoYnVmKSxidWYKCSk7CglpZiAoIXJldCkKCQlyZXR1cm4gMDsKCgl2ZmZpPShWU19GSVhFREZJTEVJTkZPKikoYnVmKzB4MTQpOwoJaWYgKHZmZmktPmR3U2lnbmF0dXJlICE9IFZTX0ZGSV9TSUdOQVRVUkUpCgkJcmV0dXJuIDA7CglpZiAoKihXT1JEKilidWYgPCBsZW4pCgkJbGVuID0gKihXT1JEKilidWY7CglkcHJpbnRmX3ZlcihzdGRkZWIsIi0+c3RydWN2ZXI9JWxkLiVsZCxmaWxldmVyPSVsZC4lbGQscHJvZHVjdHZlcj0lbGQuJWxkLGZsYWdtYXNrPSVseCxmbGFncz0lbHgsT1M9IiwKCQkodmZmaS0+ZHdTdHJ1Y1ZlcnNpb24+PjE2KSx2ZmZpLT5kd1N0cnVjVmVyc2lvbiYweEZGRkYsCgkJdmZmaS0+ZHdGaWxlVmVyc2lvbk1TLHZmZmktPmR3RmlsZVZlcnNpb25MUywKCQl2ZmZpLT5kd1Byb2R1Y3RWZXJzaW9uTVMsdmZmaS0+ZHdQcm9kdWN0VmVyc2lvbkxTLAoJCXZmZmktPmR3RmlsZUZsYWdzTWFzayx2ZmZpLT5kd0ZpbGVGbGFncwoJKTsKCXN3aXRjaCAodmZmaS0+ZHdGaWxlT1MmMHhGRkZGMDAwMCkgewoJY2FzZSBWT1NfRE9TOmRwcmludGZfdmVyKHN0ZGRlYiwiRE9TLCIpO2JyZWFrOwoJY2FzZSBWT1NfT1MyMTY6ZHByaW50Zl92ZXIoc3RkZGViLCJPUy8yLTE2LCIpO2JyZWFrOwoJY2FzZSBWT1NfT1MyMzI6ZHByaW50Zl92ZXIoc3RkZGViLCJPUy8yLTMyLCIpO2JyZWFrOwoJY2FzZSBWT1NfTlQ6ZHByaW50Zl92ZXIoc3RkZGViLCJOVCwiKTticmVhazsKCWNhc2UgVk9TX1VOS05PV046CglkZWZhdWx0OgoJCWRwcmludGZfdmVyKHN0ZGRlYiwiVU5LTk9XTiglbGQpLCIsdmZmaS0+ZHdGaWxlT1MmMHhGRkZGMDAwMCk7YnJlYWs7Cgl9Cglzd2l0Y2ggKHZmZmktPmR3RmlsZU9TICYgMHhGRkZGKSB7CgljYXNlIFZPU19fQkFTRTpkcHJpbnRmX3ZlcihzdGRkZWIsIkJBU0UiKTticmVhazsKCWNhc2UgVk9TX19XSU5ET1dTMTY6ZHByaW50Zl92ZXIoc3RkZGViLCJXSU4xNiIpO2JyZWFrOwoJY2FzZSBWT1NfX1dJTkRPV1MzMjpkcHJpbnRmX3ZlcihzdGRkZWIsIldJTjMyIik7YnJlYWs7CgljYXNlIFZPU19fUE0xNjpkcHJpbnRmX3ZlcihzdGRkZWIsIlBNMTYiKTticmVhazsKCWNhc2UgVk9TX19QTTMyOmRwcmludGZfdmVyKHN0ZGRlYiwiUE0zMiIpO2JyZWFrOwoJZGVmYXVsdDpkcHJpbnRmX3ZlcihzdGRkZWIsIlVOS05PV04oJWxkKSIsdmZmaS0+ZHdGaWxlT1MmMHhGRkZGKTticmVhazsKCX0KCXN3aXRjaCAodmZmaS0+ZHdGaWxlVHlwZSkgewoJZGVmYXVsdDoKCWNhc2UgVkZUX1VOS05PV046CgkJZHByaW50Zl92ZXIoc3RkZGViLCJmaWxldHlwZT1Vbmtub3duKCVsZCkiLHZmZmktPmR3RmlsZVR5cGUpOwoJCWJyZWFrOwoJY2FzZSBWRlRfQVBQOmRwcmludGZfdmVyKHN0ZGRlYiwiZmlsZXR5cGU9QVBQIik7YnJlYWs7CgljYXNlIFZGVF9ETEw6ZHByaW50Zl92ZXIoc3RkZGViLCJmaWxldHlwZT1ETEwiKTticmVhazsKCWNhc2UgVkZUX0RSVjoKCQlkcHJpbnRmX3ZlcihzdGRkZWIsImZpbGV0eXBlPURSViwiKTsKCQlzd2l0Y2godmZmaS0+ZHdGaWxlU3VidHlwZSkgewoJCWRlZmF1bHQ6CgkJY2FzZSBWRlQyX1VOS05PV046CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiVU5LTk9XTiglbGQpIix2ZmZpLT5kd0ZpbGVTdWJ0eXBlKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9QUklOVEVSOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIlBSSU5URVIiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9LRVlCT0FSRDoKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJLRVlCT0FSRCIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX0xBTkdVQUdFOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIkxBTkdVQUdFIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfRElTUExBWToKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJESVNQTEFZIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfTU9VU0U6CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiTU9VU0UiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9ORVRXT1JLOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIk5FVFdPUksiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9TWVNURU06CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiU1lTVEVNIik7CgkJCWJyZWFrOwoJCWNhc2UgVkZUMl9EUlZfSU5TVEFMTEFCTEU6CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiSU5TVEFMTEFCTEUiKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0RSVl9TT1VORDoKCQkJZHByaW50Zl92ZXIoc3RkZGViLCJTT1VORCIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX0NPTU06CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiQ09NTSIpOwoJCQlicmVhazsKCQljYXNlIFZGVDJfRFJWX0lOUFVUTUVUSE9EOgoJCQlkcHJpbnRmX3ZlcihzdGRkZWIsIklOUFVUTUVUSE9EIik7CgkJCWJyZWFrOwoJCX0KCQlicmVhazsKCWNhc2UgVkZUX0ZPTlQ6CgkJZHByaW50Zl92ZXIoc3RkZGViLCJmaWxldHlwZT1GT05ULiIpOwoJCXN3aXRjaCAodmZmaS0+ZHdGaWxlU3VidHlwZSkgewoJCWRlZmF1bHQ6CgkJCWRwcmludGZfdmVyKHN0ZGRlYiwiVU5LTk9XTiglbGQpIix2ZmZpLT5kd0ZpbGVTdWJ0eXBlKTsKCQkJYnJlYWs7CgkJY2FzZSBWRlQyX0ZPTlRfUkFTVEVSOmRwcmludGZfdmVyKHN0ZGRlYiwiUkFTVEVSIik7YnJlYWs7CgkJY2FzZSBWRlQyX0ZPTlRfVkVDVE9SOmRwcmludGZfdmVyKHN0ZGRlYiwiVkVDVE9SIik7YnJlYWs7CgkJY2FzZSBWRlQyX0ZPTlRfVFJVRVRZUEU6ZHByaW50Zl92ZXIoc3RkZGViLCJUUlVFVFlQRSIpO2JyZWFrOwoJCX0KCQlicmVhazsKCWNhc2UgVkZUX1ZYRDpkcHJpbnRmX3ZlcihzdGRkZWIsImZpbGV0eXBlPVZYRCIpO2JyZWFrOwoJY2FzZSBWRlRfU1RBVElDX0xJQjpkcHJpbnRmX3ZlcihzdGRkZWIsImZpbGV0eXBlPVNUQVRJQ19MSUIiKTticmVhazsKCX0KCWRwcmludGZfdmVyKHN0ZGRlYiwiZmlsZWRhdGE9JWx4LiVseFxuIix2ZmZpLT5kd0ZpbGVEYXRlTVMsdmZmaS0+ZHdGaWxlRGF0ZUxTKTsKCXJldHVybiBsZW47Cn0KCi8qIEdldEZpbGVWZXJzaW9uSW5mb1NpemUzMkEJCQlbVkVSU0lPTi4xXSAqLwpEV09SRApHZXRGaWxlVmVyc2lvbkluZm9TaXplMzJBKExQQ1NUUiBmaWxlbmFtZSxMUERXT1JEIGhhbmRsZSkgewoJZHByaW50Zl92ZXIoc3RkZGViLCJHZXRGaWxlVmVyc2lvbkluZm9TaXplMzJBKCVzLCVwKVxuIixmaWxlbmFtZSxoYW5kbGUpOwoJcmV0dXJuIEdldEZpbGVWZXJzaW9uSW5mb1NpemUxNihmaWxlbmFtZSxoYW5kbGUpOwp9CgovKiBHZXRGaWxlVmVyc2lvbkluZm9TaXplMzJXCQkJW1ZFUlNJT04uMl0gKi8KRFdPUkQKR2V0RmlsZVZlcnNpb25JbmZvU2l6ZTMyVyhMUENXU1RSIGZpbGVuYW1lLExQRFdPUkQgaGFuZGxlKSB7CglMUFNUUgl4Zm47CglEV09SRAlyZXQ7CgoJeGZuCT0gc3RyZHVwVzJBKGZpbGVuYW1lKTsKCXJldD1HZXRGaWxlVmVyc2lvbkluZm9TaXplMTYoeGZuLGhhbmRsZSk7CglmcmVlKHhmbik7CglyZXR1cm4JcmV0Owp9CgovKiBHZXRGaWxlVmVyc2lvbkluZm8JCQkJW1ZFUi43XSAqLwpEV09SRCAKR2V0RmlsZVZlcnNpb25JbmZvMTYoTFBDU1RSIGZpbGVuYW1lLERXT1JEIGhhbmRsZSxEV09SRCBkYXRhc2l6ZSxMUFZPSUQgZGF0YSkgewoJZHByaW50Zl92ZXIoc3RkZGViLCJHZXRGaWxlVmVyc2lvbkluZm8xNiglcywlbGQsJWxkLCVwKVxuLT4iLAoJCWZpbGVuYW1lLGhhbmRsZSxkYXRhc2l6ZSxkYXRhCgkpOwoJcmV0dXJuIEdldEZpbGVSZXNvdXJjZSgKCQlmaWxlbmFtZSxWU19GSUxFX0lORk8sVlNfVkVSU0lPTl9JTkZPLGhhbmRsZSxkYXRhc2l6ZSxkYXRhCgkpOwp9CgovKiBHZXRGaWxlVmVyc2lvbkluZm9BCQkJCVtWRVJTSU9OLjBdICovCkRXT1JEIApHZXRGaWxlVmVyc2lvbkluZm8zMkEoTFBDU1RSIGZpbGVuYW1lLERXT1JEIGhhbmRsZSxEV09SRCBkYXRhc2l6ZSxMUFZPSUQgZGF0YSkgewoJcmV0dXJuIEdldEZpbGVWZXJzaW9uSW5mbzE2KGZpbGVuYW1lLGhhbmRsZSxkYXRhc2l6ZSxkYXRhKTsKfQoKLyogR2V0RmlsZVZlcnNpb25JbmZvVwkJCQlbVkVSU0lPTi4zXSAqLwpEV09SRCAKR2V0RmlsZVZlcnNpb25JbmZvMzJXKExQQ1dTVFIgZmlsZW5hbWUsRFdPUkQgaGFuZGxlLERXT1JEIGRhdGFzaXplLExQVk9JRCBkYXRhKXsKCURXT1JECXJldDsKCUxQU1RSCWZuOwoKCWZuCT0gc3RyZHVwVzJBKGZpbGVuYW1lKTsKCXJldAk9IEdldEZpbGVWZXJzaW9uSW5mbzE2KGZuLGhhbmRsZSxkYXRhc2l6ZSxkYXRhKTsKCWZyZWUoZm4pOwoJcmV0dXJuCXJldDsKfQoKLyogVmVyRmluZEZpbGUJCQkJW1ZFUi44XSAqLwpEV09SRApWZXJGaW5kRmlsZTE2KAoJVUlOVDE2IGZsYWdzLExQQ1NUUiBmaWxlbmFtZSxMUENTVFIgd2luZGlyLExQQ1NUUiBhcHBkaXIsCglMUFNUUiBjdXJkaXIsVUlOVDE2ICpjdXJkaXJsZW4sTFBTVFIgZGVzdGRpcixVSU5UMTYgKmRlc3RkaXJsZW4KKSB7CglkcHJpbnRmX3ZlcihzdGRkZWIsIlZlckZpbmRGaWxlKCV4LCVzLCVzLCVzLCVwLCVkLCVwLCVkKVxuIiwKCQlmbGFncyxmaWxlbmFtZSx3aW5kaXIsYXBwZGlyLGN1cmRpciwqY3VyZGlybGVuLGRlc3RkaXIsKmRlc3RkaXJsZW4KCSk7CglzdHJjcHkoY3VyZGlyLCJaOlxcUk9PVFxcLldJTkVcXCIpOy8qRklYTUUqLwoJKmN1cmRpcmxlbj1zdHJsZW4oY3VyZGlyKTsKCXN0cmNweShkZXN0ZGlyLCJaOlxcUk9PVFxcLldJTkVcXCIpOy8qRklYTUUqLwoJKmRlc3RkaXJsZW49c3RybGVuKGRlc3RkaXIpOwoJcmV0dXJuIDA7Cn0KCi8qIFZlckZpbmRGaWxlQQkJCQkJCVtWRVJTSU9OLjVdICovCkRXT1JEClZlckZpbmRGaWxlMzJBKAoJVUlOVDMyIGZsYWdzLExQQ1NUUiBmaWxlbmFtZSxMUENTVFIgd2luZGlyLExQQ1NUUiBhcHBkaXIsCglMUFNUUiBjdXJkaXIsVUlOVDMyICpjdXJkaXJsZW4sTFBTVFIgZGVzdGRpcixVSU5UMzIgKmRlc3RkaXJsZW4KKSB7CglyZXR1cm4gVmVyRmluZEZpbGUxNihmbGFncyxmaWxlbmFtZSx3aW5kaXIsYXBwZGlyLGN1cmRpcixjdXJkaXJsZW4sZGVzdGRpcixkZXN0ZGlybGVuKTsKfQoKLyogVmVyRmluZEZpbGVXCQkJCQkJW1ZFUlNJT04uNl0gKi8KRFdPUkQKVmVyRmluZEZpbGUzMlcoCglVSU5UMzIgZmxhZ3MsTFBDV1NUUiBmaWxlbmFtZSxMUENXU1RSIHdpbmRpcixMUENXU1RSIGFwcGRpciwKCUxQV1NUUiBjdXJkaXIsVUlOVDMyICpjdXJkaXJsZW4sTFBXU1RSIGRlc3RkaXIsVUlOVDMyICpkZXN0ZGlybGVuCikgewoJTFBTVFIJd2ZuLHd3ZCx3YWQsd2RkLHdjZDsKCURXT1JECXJldDsKCgl3Zm4gPSBzdHJkdXBXMkEoZmlsZW5hbWUpOwoJd3dkID0gc3RyZHVwVzJBKHdpbmRpcik7Cgl3YWQgPSBzdHJkdXBXMkEoYXBwZGlyKTsKCXdjZCA9IChMUFNUUiltYWxsb2MoKmN1cmRpcmxlbik7Cgl3ZGQgPSAoTFBTVFIpbWFsbG9jKCpkZXN0ZGlybGVuKTsKCXJldD1WZXJGaW5kRmlsZTE2KGZsYWdzLHdmbix3d2Qsd2FkLHdjZCxjdXJkaXJsZW4sd2RkLGRlc3RkaXJsZW4pOwoJU1RSSU5HMzJfQW5zaVRvVW5pKGN1cmRpcix3Y2QpOwoJU1RSSU5HMzJfQW5zaVRvVW5pKGRlc3RkaXIsd2RkKTsKCSpjdXJkaXJsZW4JPSBzdHJsZW4od2NkKTsKCSpkZXN0ZGlybGVuCT0gc3RybGVuKHdkZCk7CglyZXR1cm4gcmV0Owp9CgovKiBWZXJJbnN0YWxsRmlsZQkJCQkJW1ZFUi45XSAqLwpEV09SRApWZXJJbnN0YWxsRmlsZTE2KAoJVUlOVDE2IGZsYWdzLExQQ1NUUiBzcmNmaWxlbmFtZSxMUENTVFIgZGVzdGZpbGVuYW1lLExQQ1NUUiBzcmNkaXIsCglMUENTVFIgZGVzdGRpcixMUFNUUiB0bXBmaWxlLFVJTlQxNiAqdG1wZmlsZWxlbgopIHsKCWRwcmludGZfdmVyKHN0ZGRlYiwiVmVySW5zdGFsbEZpbGUoJXgsJXMsJXMsJXMsJXMsJXAsJWQpXG4iLAoJCWZsYWdzLHNyY2ZpbGVuYW1lLGRlc3RmaWxlbmFtZSxzcmNkaXIsZGVzdGRpcix0bXBmaWxlLCp0bXBmaWxlbGVuCgkpOwoKCS8qIEZJWE1FOiBJbXBsZW1lbnRhdGlvbiBzdGlsbCBtaXNzaW5nIC4uLi4gKi8KCglyZXR1cm4gVklGX1NSQ09MRDsKfQoKLyogVmVyRmluZEZpbGVBCQkJCQlbVkVSU0lPTi41XSAqLwpEV09SRApWZXJJbnN0YWxsRmlsZTMyQSgKCVVJTlQzMiBmbGFncyxMUENTVFIgc3JjZmlsZW5hbWUsTFBDU1RSIGRlc3RmaWxlbmFtZSxMUENTVFIgc3JjZGlyLAoJTFBDU1RSIGRlc3RkaXIsTFBTVFIgdG1wZmlsZSxVSU5UMzIgKnRtcGZpbGVsZW4KKSB7CglyZXR1cm4gVmVySW5zdGFsbEZpbGUxNihmbGFncyxzcmNmaWxlbmFtZSxkZXN0ZmlsZW5hbWUsc3JjZGlyLGRlc3RkaXIsdG1wZmlsZSx0bXBmaWxlbGVuKTsKfQoKLyogVmVyRmluZEZpbGVXCQkJCQlbVkVSU0lPTi42XSAqLwpEV09SRApWZXJJbnN0YWxsRmlsZTMyVygKCVVJTlQzMiBmbGFncyxMUENXU1RSIHNyY2ZpbGVuYW1lLExQQ1dTVFIgZGVzdGZpbGVuYW1lLExQQ1dTVFIgc3JjZGlyLAoJTFBDV1NUUiBkZXN0ZGlyLExQV1NUUiB0bXBmaWxlLFVJTlQzMiAqdG1wZmlsZWxlbgopIHsKCUxQU1RSCXdzcmNmLHdzcmNkLHdkZXN0Zix3ZGVzdGQsd3RtcGY7CglEV09SRAlyZXQ7CgoJd3NyY2YJPSBzdHJkdXBXMkEoc3JjZmlsZW5hbWUpOwoJd3NyY2QJPSBzdHJkdXBXMkEoc3JjZGlyKTsKCXdkZXN0Zgk9IHN0cmR1cFcyQShkZXN0ZmlsZW5hbWUpOwoJd2Rlc3RkCT0gc3RyZHVwVzJBKGRlc3RkaXIpOwoJd3RtcGYJPSBzdHJkdXBXMkEodG1wZmlsZSk7CglyZXQ9VmVySW5zdGFsbEZpbGUzMkEoZmxhZ3Msd3NyY2Ysd2Rlc3RmLHdzcmNkLHdkZXN0ZCx3dG1wZix0bXBmaWxlbGVuKTsKCWZyZWUod3NyY2YpOwoJZnJlZSh3c3JjZCk7CglmcmVlKHdkZXN0Zik7CglmcmVlKHdkZXN0ZCk7CglmcmVlKHd0bXBmKTsKCXJldHVybiByZXQ7Cn0KCi8qIEZJWE1FOiBUaGlzIHRhYmxlIHNob3VsZCwgb2YgY291cnNlLCBiZSBsYW5ndWFnZSBkZXBlbmRlbmQgKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCBtYXBfaWQyc3RyIHsKCVVJTlQJbGFuZ2lkOwoJY29uc3QgY2hhciAqbGFuZ25hbWU7Cn0gbGFuZ3VhZ2VzW109ewoJezB4MDQwMSwiQXJhYmlzY2gifSwKCXsweDA0MDIsIkJ1bGdhcmlzY2gifSwKCXsweDA0MDMsIkthdGFsYW5pc2NoIn0sCgl7MHgwNDA0LCJUcmFkaXRpb25hbGVzIENoaW5lc2lzY2gifSwKCXsweDA0MDUsIlRzY2hlY2lzY2gifSwKCXsweDA0MDYsIkTkbmlzY2gifSwKCXsweDA0MDcsIkRldXRzY2gifSwKCXsweDA0MDgsIkdyaWVjaGlzY2gifSwKCXsweDA0MDksIkFtZXJpa2FuaXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwNDBBLCJLYXN0aWxpc2NoZXMgU3BhbmlzY2gifSwKCXsweDA0MEIsIkZpbm5pc2NoIn0sCgl7MHgwNDBDLCJGcmFuevZzaXNjaCJ9LAoJezB4MDQwRCwiSGVicuRpc2NoIn0sCgl7MHgwNDBFLCJVbmdhcmlzY2gifSwKCXsweDA0MEYsIklzbORuZGlzY2gifSwKCXsweDA0MTAsIkl0YWxpZW5pc2NoIn0sCgl7MHgwNDExLCJKYXBhbmlzY2gifSwKCXsweDA0MTIsIktvcmVhbmlzY2gifSwKCXsweDA0MTMsIk5pZWRlcmzkbmRpc2NoIn0sCgl7MHgwNDE0LCJOb3J3ZWdpc2NoLUJva21hbCJ9LAoJezB4MDQxNSwiUG9sbmlzY2gifSwKCXsweDA0MTYsIkJyYXNpbGlhbmlzY2hlcyBQb3J0dWdpZXNpc2NoIn0sCgl7MHgwNDE3LCJS5HRvcm9tYW5pc2NoIn0sCgl7MHgwNDE4LCJSdW3kbmlzY2gifSwKCXsweDA0MTksIlJ1c3Npc2NoIn0sCgl7MHgwNDFBLCJLcm9hdG9zZXJiaXNjaCAobGF0ZWluaXNjaCkifSwKCXsweDA0MUIsIlNsb3dlbmlzY2gifSwKCXsweDA0MUMsIkFsYmFuaXNjaCJ9LAoJezB4MDQxRCwiU2Nod2VkaXNjaCJ9LAoJezB4MDQxRSwiVGhhaSJ9LAoJezB4MDQxRiwiVPxya2lzY2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkJhaGFzYSJ9LAoJezB4MDgwNCwiVmVyZWluZmFjaHRlcyBDaGluZXNpc2NoIn0sCgl7MHgwODA3LCJTY2h3ZWl6ZXJkZXV0c2NoIn0sCgl7MHgwODA5LCJCcml0aXNjaGVzIEVuZ2xpc2NoIn0sCgl7MHgwODBBLCJNZXhpa2FuaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwODBDLCJCZWxnaXNjaGVzIEZyYW569nNpc2NoIn0sCgl7MHgwODEwLCJTY2h3ZWl6ZXJpc2NoZXMgSXRhbGllbmlzY2gifSwKCXsweDA4MTMsIkJlbGdpc2NoZXMgTmllZGVybORuZGlzY2gifSwKCXsweDA4MTQsIk5vcmd3ZWdpc2NoLU55bm9yc2sifSwKCXsweDA4MTYsIlBvcnR1Z2llc2lzY2gifSwKCXsweDA4MUEsIlNlcmJva3JhdGlzY2ggKGt5cmlsbGlzY2gpIn0sCgl7MHgwQzFDLCJLYW5hZGlzY2hlcyBGcmFuevZzaXNjaCJ9LAoJezB4MTAwQywiU2Nod2VpemVyaXNjaGVzIEZyYW569nNpc2NoIn0sCgl7MHgwMDAwLCJVbmJla2FubnQifSwKfTsKCi8qIFZlckxhbmd1YWdlTmFtZQkJCQlbVkVSLjEwXSAqLwpEV09SRApWZXJMYW5ndWFnZU5hbWUxNihVSU5UMTYgbGFuZ2lkLExQU1RSIGxhbmduYW1lLFVJTlQxNiBsYW5nbmFtZWxlbikgewoJaW50CWk7CgljaGFyCSpidWY7CgoJZHByaW50Zl92ZXIoc3RkZGViLCJWZXJMYW5ndWFnZU5hbWUoJWQsJXAsJWQpXG4iLGxhbmdpZCxsYW5nbmFtZSxsYW5nbmFtZWxlbik7CgkvKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KCSAqIGZyb20gdGhlIHJlZ2lzdHJ5LiAKCSAqLwoJYnVmPShjaGFyKiltYWxsb2Moc3RybGVuKCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiKSs5KTsKCXNwcmludGYoYnVmLCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwlMDh4IixsYW5naWQpOwoJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ1F1ZXJ5VmFsdWUxNihIS0VZX0xPQ0FMX01BQ0hJTkUsYnVmLGxhbmduYW1lLChMUERXT1JEKSZsYW5nbmFtZWxlbikpIHsKCQlsYW5nbmFtZVtsYW5nbmFtZWxlbi0xXT0nXDAnOwoJCXJldHVybiBsYW5nbmFtZWxlbjsKCX0KCS8qIGlmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJhbCB0YWJsZSAqLwoJZm9yIChpPTA7bGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MDtpKyspCgkJaWYgKGxhbmdpZD09bGFuZ3VhZ2VzW2ldLmxhbmdpZCkKCQkJYnJlYWs7CglzdHJuY3B5KGxhbmduYW1lLGxhbmd1YWdlc1tpXS5sYW5nbmFtZSxsYW5nbmFtZWxlbik7CglsYW5nbmFtZVtsYW5nbmFtZWxlbi0xXT0nXDAnOwoJcmV0dXJuIHN0cmxlbihsYW5ndWFnZXNbaV0ubGFuZ25hbWUpOwp9CgovKiBWZXJMYW5ndWFnZU5hbWVBCQkJCVtWRVJTSU9OLjldICovCkRXT1JEClZlckxhbmd1YWdlTmFtZTMyQShVSU5UMzIgbGFuZ2lkLExQU1RSIGxhbmduYW1lLFVJTlQzMiBsYW5nbmFtZWxlbikgewoJcmV0dXJuIFZlckxhbmd1YWdlTmFtZTE2KGxhbmdpZCxsYW5nbmFtZSxsYW5nbmFtZWxlbik7Cn0KCi8qIFZlckxhbmd1YWdlTmFtZVcJCQkJW1ZFUlNJT04uMTBdICovCkRXT1JEClZlckxhbmd1YWdlTmFtZTMyVyhVSU5UMzIgbGFuZ2lkLExQV1NUUiBsYW5nbmFtZSxVSU5UMzIgbGFuZ25hbWVsZW4pIHsKCWludAlpOwoJY2hhcgkqYnVmOwoJTFBXU1RSCWtleW5hbWUscmVzdWx0OwoKCS8qIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgoJICogZnJvbSB0aGUgcmVnaXN0cnkuIAoJICovCglidWY9KGNoYXIqKW1hbGxvYyhzdHJsZW4oIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIpKzkpOwoJc3ByaW50ZihidWYsIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLGxhbmdpZCk7CglrZXluYW1lPXN0cmR1cEEyVyhidWYpO2ZyZWUoYnVmKTsKCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdRdWVyeVZhbHVlMzJXKEhLRVlfTE9DQUxfTUFDSElORSxrZXluYW1lLGxhbmduYW1lLChMUERXT1JEKSZsYW5nbmFtZWxlbikpIHsKCQlmcmVlKGtleW5hbWUpOwoJCXJldHVybiBsYW5nbmFtZWxlbjsKCX0KCWZyZWUoa2V5bmFtZSk7CgkvKiBpZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVyYWwgdGFibGUgKi8KCWZvciAoaT0wO2xhbmd1YWdlc1tpXS5sYW5naWQhPTA7aSsrKQoJCWlmIChsYW5naWQ9PWxhbmd1YWdlc1tpXS5sYW5naWQpCgkJCWJyZWFrOwoJcmVzdWx0PXN0cmR1cEEyVyhsYW5ndWFnZXNbaV0ubGFuZ25hbWUpOwoJaT1sc3RybGVuMzJXKHJlc3VsdCkqc2l6ZW9mKFdDSEFSKTsKCWlmIChpPmxhbmduYW1lbGVuKQoJCWk9bGFuZ25hbWVsZW47CgltZW1jcHkobGFuZ25hbWUscmVzdWx0LGkpOwoJbGFuZ25hbWVbbGFuZ25hbWVsZW4tMV09J1wwJzsKCWZyZWUocmVzdWx0KTsKCXJldHVybiBzdHJsZW4obGFuZ3VhZ2VzW2ldLmxhbmduYW1lKTsgLyogc2FtZSBhcyBzdHJsZW5XKHJlc3VsdCk7ICovCn0KCi8qIEZJWE1FOiBVTklDT0RFPyAqLwpzdHJ1Y3QgZGIgewoJV09SRAluZXh0b2ZmOwoJV09SRAlkYXRhbGVuOwovKiBpbiBtZW1vcnkgc3RydWN0dXJlLi4uICovCgljaGFyCW5hbWVbMV07IAkvKiBwYWRkZWQgdG8gZHdvcmQgYWxpZ25tZW50ICovCi8qIC4uLi4gCgljaGFyCWRhdGFbZGF0YWxlbl07ICAgICBwYWRkZWQgdG8gZHdvcmQgYWxpZ25lbW50CglCWVRFCXN1YmRpcmRhdGFbXTsgICAgICB1bnRpbCBuZXh0b2ZmCiAqLwp9OwoKc3RhdGljIEJZVEUqCl9maW5kX2RhdGEoQllURSAqYmxvY2ssTFBDU1RSIHN0cikgewoJY2hhcgkqbmV4dHNsYXNoOwoJaW50CXN1YnN0cmxlbjsKCXN0cnVjdAlkYgkqZGI7CgoJd2hpbGUgKCpzdHIgJiYgKnN0cj09J1xcJykKCQlzdHIrKzsKCWlmIChOVUxMIT0obmV4dHNsYXNoPXN0cmNocihzdHIsJ1xcJykpKQoJCXN1YnN0cmxlbj1uZXh0c2xhc2gtc3RyOwoJZWxzZQoJCXN1YnN0cmxlbj1zdHJsZW4oc3RyKTsKCWlmIChuZXh0c2xhc2ghPU5VTEwpIHsKCQl3aGlsZSAoKm5leHRzbGFzaCAmJiAqbmV4dHNsYXNoPT0nXFwnKQoJCQluZXh0c2xhc2grKzsKCQlpZiAoISpuZXh0c2xhc2gpCgkJCW5leHRzbGFzaD1OVUxMOwoJfQoKCgl3aGlsZSAoMSkgewoJCWRiPShzdHJ1Y3QgZGIqKWJsb2NrOwoJCWRwcmludGZfdmVyKHN0ZGRlYiwiZGI9JXAsZGItPm5leHRvZmY9JWQsZGItPmRhdGFsZW49JWQsZGItPm5hbWU9JXMsZGItPmRhdGE9JXNcbiIsCgkJCWRiLGRiLT5uZXh0b2ZmLGRiLT5kYXRhbGVuLGRiLT5uYW1lLChjaGFyKikoKGNoYXIqKWRiKzQrKChzdHJsZW4oZGItPm5hbWUpKzQpJn4zKSkKCQkpOwoJCWlmICghZGItPm5leHRvZmYpCgkJCXJldHVybiBOVUxMOwoKCQlkcHJpbnRmX3ZlcihzdGRkZWIsImNvbXBhcmluZyB3aXRoICVzXG4iLGRiLT5uYW1lKTsKCQlpZiAoIXN0cm5jbXAoZGItPm5hbWUsc3RyLHN1YnN0cmxlbikpIHsKCQkJaWYgKG5leHRzbGFzaCkKCQkJCXJldHVybiBfZmluZF9kYXRhKAoJCQkJCWJsb2NrKzQrKChzdHJsZW4oZGItPm5hbWUpKzQpJn4zKSsoKGRiLT5kYXRhbGVuKzMpJn4zKQoJCQkJCSxuZXh0c2xhc2gKCQkJCSk7CgkJCWVsc2UKCQkJCXJldHVybiBibG9jazsKCQl9CgkJYmxvY2s9YmxvY2srKChkYi0+bmV4dG9mZiszKSZ+Myk7Cgl9Cn0KCi8qIFZlclF1ZXJ5VmFsdWUgCQkJW1ZFUi4xMV0gKi8KLyogdGFrZSBjYXJlLCAnYnVmZmVyJyBpcyBOT1QgYSBTRUdQVFIsIGl0IGp1c3QgcG9pbnRzIHRvIG9uZSAqLwpEV09SRApWZXJRdWVyeVZhbHVlMTYoU0VHUFRSIHNlZ2Jsb2NrLExQQ1NUUiBzdWJibG9jayxTRUdQVFIgKmJ1ZmZlcixVSU5UMTYgKmJ1ZmxlbikKewoJQllURQkqYmxvY2s9UFRSX1NFR19UT19MSU4oc2VnYmxvY2spLCpiOwoJc3RydWN0CWRiCSpkYjsKCWNoYXIJKnM7CgoJZHByaW50Zl92ZXIoc3RkZGViLCJWZXJRdWVyeVZhbHVlMTYoJXAsJXMsJXAsJWQpXG4iLAoJCWJsb2NrLHN1YmJsb2NrLGJ1ZmZlciwqYnVmbGVuCgkpOwoJcz0oY2hhciopeG1hbGxvYyhzdHJsZW4oIlZTX1ZFUlNJT05fSU5GTyIpK3N0cmxlbihzdWJibG9jaykrMSk7CglzdHJjcHkocywiVlNfVkVSU0lPTl9JTkZPIik7c3RyY2F0KHMsc3ViYmxvY2spOwoJYj1fZmluZF9kYXRhKGJsb2NrLHMpOwoJaWYgKGI9PU5VTEwpIHsKCQkqYnVmbGVuPTA7CgkJcmV0dXJuIDA7Cgl9CglkYj0oc3RydWN0IGRiKiliOwoJKmJ1Zmxlbgk9IGRiLT5kYXRhbGVuOwoJLyogbGV0IGIgcG9pbnQgdG8gZGF0YSBhcmVhICovCgliCT0gYis0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSZ+Myk7CgkvKiBub3cgbG9vayB1cCB3aGF0IHRoZSByZXNwLiBTRUdQVFIgd291bGQgYmUgLi4uICovCgkqYnVmZmVyCT0gKGItYmxvY2spK3NlZ2Jsb2NrOwoJZHByaW50Zl92ZXIoc3RkZGViLCIJLT4gJXM9JXNcbiIsc3ViYmxvY2ssYik7CglyZXR1cm4gMTsKfQoKRFdPUkQKVmVyUXVlcnlWYWx1ZTMyQShMUFZPSUQgdmJsb2NrLExQQ1NUUiBzdWJibG9jayxMUFZPSUQgKnZidWZmZXIsVUlOVDMyICpidWZsZW4pCnsKCUJZVEUJKmIsKmJsb2NrPShMUEJZVEUpdmJsb2NrLCoqYnVmZmVyPShMUEJZVEUqKXZidWZmZXI7CglzdHJ1Y3QJZGIJKmRiOwoJY2hhcgkqczsKCglkcHJpbnRmX3ZlcihzdGRkZWIsIlZlclF1ZXJ5VmFsdWUzMkEoJXAsJXMsJXAsJWQpXG4iLAoJCWJsb2NrLHN1YmJsb2NrLGJ1ZmZlciwqYnVmbGVuCgkpOwoJcz0oY2hhciopeG1hbGxvYyhzdHJsZW4oIlZTX1ZFUlNJT05fSU5GTyIpK3N0cmxlbihzdWJibG9jaykrMSk7CglzdHJjcHkocywiVlNfVkVSU0lPTl9JTkZPIik7c3RyY2F0KHMsc3ViYmxvY2spOwoJYj1fZmluZF9kYXRhKGJsb2NrLHMpOwoJaWYgKGI9PU5VTEwpIHsKCQkqYnVmbGVuPTA7CgkJcmV0dXJuIDA7Cgl9CglkYj0oc3RydWN0IGRiKiliOwoJKmJ1Zmxlbgk9IGRiLT5kYXRhbGVuOwoJLyogbGV0IGIgcG9pbnQgdG8gZGF0YSBhcmVhICovCgliCT0gYis0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSZ+Myk7CgkqYnVmZmVyCT0gYjsKCWRwcmludGZfdmVyKHN0ZGRlYiwiCS0+ICVzPSVzXG4iLHN1YmJsb2NrLGIpOwoJcmV0dXJuIDE7Cn0KCkRXT1JEClZlclF1ZXJ5VmFsdWUzMlcoTFBWT0lEIHZibG9jayxMUENXU1RSIHN1YmJsb2NrLExQVk9JRCAqdmJ1ZmZlcixVSU5UMzIgKmJ1ZmxlbikKewoJLyogRklYTUU6IGhtbSwgd2Ugbm90IG9ubHkgbmVlZCB0byBjb252ZXJ0IHN1YmJsb2NrLCBidXQgYWxzbyAKCSAqICAgICAgICB0aGUgY29udGVudC4uLm9yPwoJICogQW5kIHdoYXQgYWJvdXQgVU5JQ09ERSB2ZXJzaW9uIGluZm8/CgkgKiBBbmQgdGhlIE5BTUVTIG9mIHRoZSB2YWx1ZXM/CgkgKi8KCUJZVEUJCSpiLCoqYnVmZmVyPShMUEJZVEUqKXZidWZmZXIsKmJsb2NrPShMUEJZVEUpdmJsb2NrOwoJc3RydWN0CWRiCSpkYjsKCWNoYXIJCSpzLCpzYjsKCglzYj1zdHJkdXBXMkEoc3ViYmxvY2spOwoJcz0oY2hhciopeG1hbGxvYyhzdHJsZW4oIlZTX1ZFUlNJT05fSU5GTyIpK3N0cmxlbihzYikrMSk7CglzdHJjcHkocywiVlNfVkVSU0lPTl9JTkZPIik7c3RyY2F0KHMsc2IpOwoJYj1fZmluZF9kYXRhKGJsb2NrLHMpOwoJaWYgKGI9PU5VTEwpIHsKCQkqYnVmbGVuPTA7CgkJZnJlZShzYik7CgkJcmV0dXJuIDA7Cgl9CglkYj0oc3RydWN0IGRiKiliOwoJKmJ1Zmxlbgk9IGRiLT5kYXRhbGVuOwoJLyogbGV0IGIgcG9pbnQgdG8gZGF0YSBhcmVhICovCgliCT0gYis0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSZ+Myk7CgkqYnVmZmVyCT0gYjsKCWRwcmludGZfdmVyKHN0ZGRlYiwiCS0+ICVzPSVzXG4iLHNiLGIpOwoJZnJlZShzYik7CglyZXR1cm4gMTsKfQovKiAyMCBHRVRGSUxFVkVSU0lPTklORk9SQVcgKi8K