LyoKICogVGhlIHBhcmFtZXRlcnMgb2YgbWFueSBmdW5jdGlvbnMgY2hhbmdlcyBiZXR3ZWVuIGRpZmZlcmVudCBPUyB2ZXJzaW9ucwogKiAoTlQgdXNlcyBVbmljb2RlIHN0cmluZ3MsIDk1IHVzZXMgQVNDSUkgc3RyaW5ncykKICoKICogQ29weXJpZ2h0IDE5OTcgTWFyY3VzIE1laXNzbmVyCiAqICAgICAgICAgICAxOTk4IEr8cmdlbiBTY2htaWVkCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKCiNpbmNsdWRlICJzaGVsbGFwaS5oIgojaW5jbHVkZSAib2JqYmFzZS5oIgojaW5jbHVkZSAic2hsZ3VpZC5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJzaGxvYmouaCIKI2luY2x1ZGUgInNoZWxsMzJfbWFpbi5oIgojaW5jbHVkZSAidW5kb2NzaGVsbC5oIgojaW5jbHVkZSAicGlkbC5oIgojaW5jbHVkZSAic2hsd2FwaS5oIgojaW5jbHVkZSAiY29tbWRsZy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoc2hlbGwpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChwaWRsKTsKCi8qIEZJWE1FOiAhISEgbW92ZSBDUkVBVEVNUlVMSVNUIGFuZCBmbGFncyB0byBoZWFkZXIgZmlsZSAhISEgKi8KLyogICAgICAgICEhISBpdCBpcyBpbiBib3RoIGhlcmUgYW5kIGNvbWN0bDMydW5kb2MuYyAgICAgICEhISAqLwp0eXBlZGVmIHN0cnVjdCB0YWdDUkVBVEVNUlVMSVNUCnsKICAgIERXT1JEICBjYlNpemU7ICAgICAgICAvKiBzaXplIG9mIHN0cnVjdCAqLwogICAgRFdPUkQgIG5NYXhJdGVtczsgICAgIC8qIG1heCBuby4gb2YgaXRlbXMgaW4gbGlzdCAqLwogICAgRFdPUkQgIGR3RmxhZ3M7ICAgICAgIC8qIHNlZSBiZWxvdyAqLwogICAgSEtFWSAgIGhLZXk7ICAgICAgICAgIC8qIHJvb3QgcmVnLiBrZXkgdW5kZXIgd2hpY2ggbGlzdCBpcyBzYXZlZCAqLwogICAgTFBDU1RSIGxwc3pTdWJLZXk7ICAgIC8qIHJlZy4gc3Via2V5ICovCiAgICBQUk9DICAgbHBmbkNvbXBhcmU7ICAgLyogaXRlbSBjb21wYXJlIHByb2MgKi8KfSBDUkVBVEVNUlVMSVNUQSwgKkxQQ1JFQVRFTVJVTElTVEE7CgovKiBkd0ZsYWdzICovCiNkZWZpbmUgTVJVRl9TVFJJTkdfTElTVCAgMCAvKiBsaXN0IHdpbGwgY29udGFpbiBzdHJpbmdzICovCiNkZWZpbmUgTVJVRl9CSU5BUllfTElTVCAgMSAvKiBsaXN0IHdpbGwgY29udGFpbiBiaW5hcnkgZGF0YSAqLwojZGVmaW5lIE1SVUZfREVMQVlFRF9TQVZFIDIgLyogb25seSBzYXZlIGxpc3Qgb3JkZXIgdG8gcmVnLiBpcyBGcmVlTVJVTGlzdCAqLwoKZXh0ZXJuIEhBTkRMRSBXSU5BUEkgQ3JlYXRlTVJVTGlzdEEoTFBDUkVBVEVNUlVMSVNUQSBscGNtbCk7CmV4dGVybiBEV09SRCAgV0lOQVBJIEZyZWVNUlVMaXN0KEhBTkRMRSBoTVJVTGlzdCk7CmV4dGVybiBJTlQgICAgV0lOQVBJIEFkZE1SVURhdGEoSEFORExFIGhMaXN0LCBMUENWT0lEIGxwRGF0YSwgRFdPUkQgY2JEYXRhKTsKZXh0ZXJuIElOVCAgICBXSU5BUEkgRmluZE1SVURhdGEoSEFORExFIGhMaXN0LCBMUENWT0lEIGxwRGF0YSwgRFdPUkQgY2JEYXRhLCBMUElOVCBscFJlZ051bSk7CmV4dGVybiBJTlQgICAgV0lOQVBJIEVudW1NUlVMaXN0QShIQU5ETEUgaExpc3QsIElOVCBuSXRlbVBvcywgTFBWT0lEIGxwQnVmZmVyLCBEV09SRCBuQnVmZmVyU2l6ZSk7CgoKLyogR2V0IGEgZnVuY3Rpb24gcG9pbnRlciBmcm9tIGEgRExMIGhhbmRsZSAqLwojZGVmaW5lIEdFVF9GVU5DKGZ1bmMsIG1vZHVsZSwgbmFtZSwgZmFpbCkgXAogIGRvIHsgXAogICAgaWYgKCFmdW5jKSB7IFwKICAgICAgaWYgKCFTSEVMTDMyX2gjI21vZHVsZSAmJiAhKFNIRUxMMzJfaCMjbW9kdWxlID0gTG9hZExpYnJhcnlBKCNtb2R1bGUgIi5kbGwiKSkpIHJldHVybiBmYWlsOyBcCiAgICAgIGZ1bmMgPSAodm9pZCopR2V0UHJvY0FkZHJlc3MoU0hFTEwzMl9oIyNtb2R1bGUsIG5hbWUpOyBcCiAgICAgIGlmICghZnVuYykgcmV0dXJuIGZhaWw7IFwKICAgIH0gXAogIH0gd2hpbGUgKDApCgovKiBGdW5jdGlvbiBwb2ludGVycyBmb3IgR0VUX0ZVTkMgbWFjcm8gKi8Kc3RhdGljIEhNT0RVTEUgU0hFTEwzMl9oc2hsd2FwaT1OVUxMOwpzdGF0aWMgSEFORExFIChXSU5BUEkgKnBTSEFsbG9jU2hhcmVkKShMUENWT0lELERXT1JELERXT1JEKTsKc3RhdGljIExQVk9JRCAoV0lOQVBJICpwU0hMb2NrU2hhcmVkKShIQU5ETEUsRFdPUkQpOwpzdGF0aWMgQk9PTCAgIChXSU5BUEkgKnBTSFVubG9ja1NoYXJlZCkoTFBWT0lEKTsKc3RhdGljIEJPT0wgICAoV0lOQVBJICpwU0hGcmVlU2hhcmVkKShIQU5ETEUsRFdPUkQpOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhcnNlRmllbGRBCQkJCQlbaW50ZXJuYWxdCiAqCiAqIGNvcGllcyBhIGZpZWxkIGZyb20gYSAnLCcgZGVsaW1pdGVkIHN0cmluZwogKgogKiBmaXJzdCBmaWVsZCBpcyBuRmllbGQgPSAxCiAqLwpEV09SRCBXSU5BUEkgUGFyc2VGaWVsZEEoCglMUENTVFIgc3JjLAoJRFdPUkQgbkZpZWxkLAoJTFBTVFIgZHN0LAoJRFdPUkQgbGVuKQp7CglXQVJOKCIoJXMsMHglMDhseCwlcCwlbGQpIHNlbWktc3R1Yi5cbiIsZGVidWdzdHJfYShzcmMpLG5GaWVsZCxkc3QsbGVuKTsKCglpZiAoIXNyYyB8fCAhc3JjWzBdIHx8ICFkc3QgfHwgIWxlbikKCSAgcmV0dXJuIDA7CgoJLyogc2tpcCBuIGZpZWxkcyBkZWxpbWl0ZWQgYnkgJywnICovCgl3aGlsZSAobkZpZWxkID4gMSkKCXsKCSAgaWYgKCpzcmM9PSdcMCcpIHJldHVybiBGQUxTRTsKCSAgaWYgKCooc3JjKyspPT0nLCcpIG5GaWVsZC0tOwoJfQoKCS8qIGNvcHkgcGFydCB0aWxsIHRoZSBuZXh0ICcsJyB0byBkc3QgKi8KCXdoaWxlICggKnNyYyE9J1wwJyAmJiAqc3JjIT0nLCcgJiYgKGxlbi0tKT4wICkgKihkc3QrKyk9KihzcmMrKyk7CgoJLyogZmluYWxpemUgdGhlIHN0cmluZyAqLwoJKmRzdD0weDA7CgoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhcnNlRmllbGRXCQkJW2ludGVybmFsXQogKgogKiBjb3BpZXMgYSBmaWVsZCBmcm9tIGEgJywnIGRlbGltaXRlZCBzdHJpbmcKICoKICogZmlyc3QgZmllbGQgaXMgbkZpZWxkID0gMQogKi8KRFdPUkQgV0lOQVBJIFBhcnNlRmllbGRXKExQQ1dTVFIgc3JjLCBEV09SRCBuRmllbGQsIExQV1NUUiBkc3QsIERXT1JEIGxlbikKewoJV0FSTigiKCVzLDB4JTA4bHgsJXAsJWxkKSBzZW1pLXN0dWIuXG4iLCBkZWJ1Z3N0cl93KHNyYyksIG5GaWVsZCwgZHN0LCBsZW4pOwoKCWlmICghc3JjIHx8ICFzcmNbMF0gfHwgIWRzdCB8fCAhbGVuKQoJICByZXR1cm4gMDsKCgkvKiBza2lwIG4gZmllbGRzIGRlbGltaXRlZCBieSAnLCcgKi8KCXdoaWxlIChuRmllbGQgPiAxKQoJewoJICBpZiAoKnNyYyA9PSAweDApIHJldHVybiBGQUxTRTsKCSAgaWYgKCpzcmMrKyA9PSAnLCcpIG5GaWVsZC0tOwoJfQoKCS8qIGNvcHkgcGFydCB0aWxsIHRoZSBuZXh0ICcsJyB0byBkc3QgKi8KCXdoaWxlICggKnNyYyAhPSAweDAgJiYgKnNyYyAhPSAnLCcgJiYgKGxlbi0tKT4wICkgKihkc3QrKykgPSAqKHNyYysrKTsKCgkvKiBmaW5hbGl6ZSB0aGUgc3RyaW5nICovCgkqZHN0ID0gMHgwOwoKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXJzZUZpZWxkCQkJW1NIRUxMMzIuNThdCiAqLwpEV09SRCBXSU5BUEkgUGFyc2VGaWVsZEFXKExQQ1ZPSUQgc3JjLCBEV09SRCBuRmllbGQsIExQVk9JRCBkc3QsIERXT1JEIGxlbikKewoJaWYgKFNIRUxMX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBQYXJzZUZpZWxkVyhzcmMsIG5GaWVsZCwgZHN0LCBsZW4pOwoJcmV0dXJuIFBhcnNlRmllbGRBKHNyYywgbkZpZWxkLCBkc3QsIGxlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldEZpbGVOYW1lRnJvbUJyb3dzZQkJCVtTSEVMTDMyLjYzXQogKgogKi8KQk9PTCBXSU5BUEkgR2V0RmlsZU5hbWVGcm9tQnJvd3NlKAoJSFdORCBod25kT3duZXIsCglMUFNUUiBscHN0ckZpbGUsCglEV09SRCBuTWF4RmlsZSwKCUxQQ1NUUiBscHN0ckluaXRpYWxEaXIsCglMUENTVFIgbHBzdHJEZWZFeHQsCglMUENTVFIgbHBzdHJGaWx0ZXIsCglMUENTVFIgbHBzdHJUaXRsZSkKewogICAgSE1PRFVMRSBobW9kdWxlOwogICAgRkFSUFJPQyBwR2V0T3BlbkZpbGVOYW1lQTsKICAgIE9QRU5GSUxFTkFNRUEgb2ZuOwogICAgQk9PTCByZXQ7CgogICAgVFJBQ0UoIiVwLCAlcywgJWxkLCAlcywgJXMsICVzLCAlcylcbiIsCgkgIGh3bmRPd25lciwgbHBzdHJGaWxlLCBuTWF4RmlsZSwgbHBzdHJJbml0aWFsRGlyLCBscHN0ckRlZkV4dCwKCSAgbHBzdHJGaWx0ZXIsIGxwc3RyVGl0bGUpOwoKICAgIGhtb2R1bGUgPSBMb2FkTGlicmFyeUEoImNvbWRsZzMyLmRsbCIpOwogICAgaWYoIWhtb2R1bGUpIHJldHVybiBGQUxTRTsKICAgIHBHZXRPcGVuRmlsZU5hbWVBID0gR2V0UHJvY0FkZHJlc3MoaG1vZHVsZSwgIkdldE9wZW5GaWxlTmFtZUEiKTsKICAgIGlmKCFwR2V0T3BlbkZpbGVOYW1lQSkKICAgIHsKCUZyZWVMaWJyYXJ5KGhtb2R1bGUpOwoJcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIG1lbXNldCgmb2ZuLCAwLCBzaXplb2Yob2ZuKSk7CgogICAgb2ZuLmxTdHJ1Y3RTaXplID0gc2l6ZW9mKG9mbik7CiAgICBvZm4uaHduZE93bmVyID0gaHduZE93bmVyOwogICAgb2ZuLmxwc3RyRmlsdGVyID0gbHBzdHJGaWx0ZXI7CiAgICBvZm4ubHBzdHJGaWxlID0gbHBzdHJGaWxlOwogICAgb2ZuLm5NYXhGaWxlID0gbk1heEZpbGU7CiAgICBvZm4ubHBzdHJJbml0aWFsRGlyID0gbHBzdHJJbml0aWFsRGlyOwogICAgb2ZuLmxwc3RyVGl0bGUgPSBscHN0clRpdGxlOwogICAgb2ZuLmxwc3RyRGVmRXh0ID0gbHBzdHJEZWZFeHQ7CiAgICBvZm4uRmxhZ3MgPSBPRk5fRVhQTE9SRVIgfCBPRk5fSElERVJFQURPTkxZIHwgT0ZOX0ZJTEVNVVNURVhJU1Q7CiAgICByZXQgPSBwR2V0T3BlbkZpbGVOYW1lQSgmb2ZuKTsKCiAgICBGcmVlTGlicmFyeShobW9kdWxlKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0U2V0U2V0dGluZ3MJCQkJW1NIRUxMMzIuNjhdCiAqLwpWT0lEIFdJTkFQSSBTSEdldFNldFNldHRpbmdzKExQU0hFTExTVEFURSBscHNzLCBEV09SRCBkd01hc2ssIEJPT0wgYlNldCkKewogIGlmKGJTZXQpCiAgewogICAgRklYTUUoIiVwIDB4JTA4bHggVFJVRVxuIiwgbHBzcywgZHdNYXNrKTsKICB9CiAgZWxzZQogIHsKICAgIFNIR2V0U2V0dGluZ3MoKExQU0hFTExGTEFHU1RBVEUpbHBzcyxkd01hc2spOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRTZXR0aW5ncwkJCQlbU0hFTEwzMi5AXQogKgogKiBOT1RFUwogKiAgdGhlIHJlZ2lzdHJ5IHBhdGggYXJlIGZvciB3aW45OCAodGVzdGVkKQogKiAgYW5kIHBvc3NpYmx5IGFyZSB0aGUgc2FtZSBpbiBudDQwCiAqCiAqLwpWT0lEIFdJTkFQSSBTSEdldFNldHRpbmdzKExQU0hFTExGTEFHU1RBVEUgbHBzZnMsIERXT1JEIGR3TWFzaykKewoJSEtFWQloS2V5OwoJRFdPUkQJZHdEYXRhOwoJRFdPUkQJZHdEYXRhU2l6ZSA9IHNpemVvZiAoRFdPUkQpOwoKCVRSQUNFKCIoJXAgMHglMDhseClcbiIsbHBzZnMsZHdNYXNrKTsKCglpZiAoUmVnQ3JlYXRlS2V5RXhBKEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEV4cGxvcmVyXFxBZHZhbmNlZCIsCgkJCQkgMCwgMCwgMCwgS0VZX0FMTF9BQ0NFU1MsIDAsICZoS2V5LCAwKSkKCSAgcmV0dXJuOwoKCWlmICggKFNTRl9TSE9XRVhURU5TSU9OUyAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIkhpZGVGaWxlRXh0IiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mU2hvd0V4dGVuc2lvbnMgID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICggKFNTRl9TSE9XSU5GT1RJUCAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIlNob3dJbmZvVGlwIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mU2hvd0luZm9UaXAgID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICggKFNTRl9ET05UUFJFVFRZUEFUSCAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIkRvbnRQcmV0dHlQYXRoIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mRG9udFByZXR0eVBhdGggID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICggKFNTRl9ISURFSUNPTlMgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJIaWRlSWNvbnMiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZIaWRlSWNvbnMgID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICggKFNTRl9NQVBORVREUlZCVVRUT04gJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJNYXBOZXREcnZCdG4iLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZNYXBOZXREcnZCdG4gID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICggKFNTRl9TSE9XQVRUUklCQ09MICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiU2hvd0F0dHJpYkNvbCIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZlNob3dBdHRyaWJDb2wgID0gKChkd0RhdGEgPT0gMCkgPyAgMCA6IDEpOwoKCWlmICgoKFNTRl9TSE9XQUxMT0JKRUNUUyB8IFNTRl9TSE9XU1lTRklMRVMpICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiSGlkZGVuIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgl7IGlmIChkd0RhdGEgPT0gMCkKCSAgeyBpZiAoU1NGX1NIT1dBTExPQkpFQ1RTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dBbGxPYmplY3RzICA9IDA7CgkgICAgaWYgKFNTRl9TSE9XU1lTRklMRVMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd1N5c0ZpbGVzICA9IDA7CgkgIH0KCSAgZWxzZSBpZiAoZHdEYXRhID09IDEpCgkgIHsgaWYgKFNTRl9TSE9XQUxMT0JKRUNUUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93QWxsT2JqZWN0cyAgPSAxOwoJICAgIGlmIChTU0ZfU0hPV1NZU0ZJTEVTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dTeXNGaWxlcyAgPSAwOwoJICB9CgkgIGVsc2UgaWYgKGR3RGF0YSA9PSAyKQoJICB7IGlmIChTU0ZfU0hPV0FMTE9CSkVDVFMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd0FsbE9iamVjdHMgID0gMDsKCSAgICBpZiAoU1NGX1NIT1dTWVNGSUxFUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93U3lzRmlsZXMgID0gMTsKCSAgfQoJfQoJUmVnQ2xvc2VLZXkgKGhLZXkpOwoKCVRSQUNFKCItLSAweCUwNHhcbiIsICooV09SRCopbHBzZnMpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNoZWxsRm9sZGVyVmlld19NZXNzYWdlCQkJW1NIRUxMMzIuNzNdCiAqCiAqIFNlbmQgYSBtZXNzYWdlIHRvIGFuIGV4cGxvcmVyIGNhYmluZXQgd2luZG93LgogKgogKiBQQVJBTVMKICogIGh3bmRDYWJpbmV0IFtJXSBUaGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIHNoZWxsdmlldyB0byBjb21tdW5pY2F0ZSB3aXRoCiAqICBkd01lc3NhZ2UgICBbSV0gVGhlIFNGVk0gbWVzc2FnZSB0byBzZW5kCiAqICBkd1BhcmFtICAgICBbSV0gTWVzc2FnZSBwYXJhbWV0ZXIKICoKICogUkVUVVJOUwogKiAgZml4bWUuCiAqCiAqIE5PVEVTCiAqICBNZXNzYWdlIFNGVk1fUkVBUlJBTkdFID0gMQogKgogKiAgICBUaGlzIG1lc3NhZ2UgZ2V0cyBzZW50IHdoZW4gYSBjb2x1bW4gZ2V0cyBjbGlja2VkIHRvIGluc3RydWN0IHRoZQogKiAgICBzaGVsbCB2aWV3IHRvIHJlLXNvcnQgdGhlIGl0ZW0gbGlzdC4gZHdQYXJhbSBpZGVudGlmaWVzIHRoZSBjb2x1bW4KICogICAgdGhhdCB3YXMgY2xpY2tlZC4KICovCkxSRVNVTFQgV0lOQVBJIFNIU2hlbGxGb2xkZXJWaWV3X01lc3NhZ2UoCglIV05EIGh3bmRDYWJpbmV0LAoJVUlOVCB1TWVzc2FnZSwKCUxQQVJBTSBsUGFyYW0pCnsKCUZJWE1FKCIlcCAlMDh4ICUwOGx4IHN0dWJcbiIsaHduZENhYmluZXQsIHVNZXNzYWdlLCBsUGFyYW0pOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJlZ2lzdGVyU2hlbGxIb29rCQkJCVtTSEVMTDMyLjE4MV0KICoKICogUmVnaXN0ZXIgYSBzaGVsbCBob29rLgogKgogKiBQQVJBTVMKICogICAgICBod25kICAgW0ldICBXaW5kb3cgaGFuZGxlCiAqICAgICAgZHdUeXBlIFtJXSAgVHlwZSBvZiBob29rLgogKgogKiBOT1RFUwogKiAgICAgRXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KQk9PTCBXSU5BUEkgUmVnaXN0ZXJTaGVsbEhvb2soCglIV05EIGhXbmQsCglEV09SRCBkd1R5cGUpCnsKCUZJWE1FKCIoJXAsMHglMDhseCk6c3R1Yi5cbiIsaFduZCwgZHdUeXBlKTsKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hXCQkJCVtTSEVMTDMyLjE4Ml0KICoKICogU2VlIFNoZWxsTWVzc2FnZUJveEEuCiAqLwppbnQgV0lOQVBJViBTaGVsbE1lc3NhZ2VCb3hXKAoJSElOU1RBTkNFIGhJbnN0YW5jZSwKCUhXTkQgaFduZCwKCUxQQ1dTVFIgbHBUZXh0LAoJTFBDV1NUUiBscENhcHRpb24sCglVSU5UIHVUeXBlLAoJLi4uKQp7CglXQ0hBUglzelRleHRbMTAwXSxzelRpdGxlWzEwMF07CglMUENXU1RSIHBzelRleHQgPSBzelRleHQsIHBzelRpdGxlID0gc3pUaXRsZSwgcHN6VGVtcDsKCXZhX2xpc3QgYXJnczsKCWludAlyZXQ7CgoJdmFfc3RhcnQoYXJncywgdVR5cGUpOwoJLyogd3ZzcHJpbnRmQShidWYsZm10LCBhcmdzKTsgKi8KCglUUkFDRSgiKCUwOGx4LCUwOGx4LCVwLCVwLCUwOHgpXG4iLAoJKERXT1JEKWhJbnN0YW5jZSwoRFdPUkQpaFduZCxscFRleHQsbHBDYXB0aW9uLHVUeXBlKTsKCglpZiAoIUhJV09SRChscENhcHRpb24pKQoJICBMb2FkU3RyaW5nVyhoSW5zdGFuY2UsIChEV09SRClscENhcHRpb24sIHN6VGl0bGUsIHNpemVvZihzelRpdGxlKS9zaXplb2Yoc3pUaXRsZVswXSkpOwoJZWxzZQoJICBwc3pUaXRsZSA9IGxwQ2FwdGlvbjsKCglpZiAoIUhJV09SRChscFRleHQpKQoJICBMb2FkU3RyaW5nVyhoSW5zdGFuY2UsIChEV09SRClscFRleHQsIHN6VGV4dCwgc2l6ZW9mKHN6VGV4dCkvc2l6ZW9mKHN6VGV4dFswXSkpOwoJZWxzZQoJICBwc3pUZXh0ID0gbHBUZXh0OwoKCUZvcm1hdE1lc3NhZ2VXKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HLAoJCSAgICAgICBwc3pUZXh0LCAwLCAwLCAoTFBXU1RSKSZwc3pUZW1wLCAwLCAmYXJncyk7CgoJdmFfZW5kKGFyZ3MpOwoKCXJldCA9IE1lc3NhZ2VCb3hXKGhXbmQscHN6VGVtcCxwc3pUaXRsZSx1VHlwZSk7CglMb2NhbEZyZWUoKEhMT0NBTClwc3pUZW1wKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsTWVzc2FnZUJveEEJCQkJW1NIRUxMMzIuMTgzXQogKgogKiBGb3JtYXQgYW5kIG91dHB1dCBhbiBlcnJvciBtZXNzYWdlLgogKgogKiBQQVJBTVMKICogIGhJbnN0YW5jZSBbSV0gSW5zdGFuY2UgaGFuZGxlIG9mIG1lc3NhZ2UgY3JlYXRvcgogKiAgaFduZCAgICAgIFtJXSBXaW5kb3cgaGFuZGxlIG9mIG1lc3NhZ2UgY3JlYXRvcgogKiAgbHBUZXh0ICAgIFtJXSBSZXNvdXJjZSBJZCBvZiB0aXRsZSBvciBMUFNUUgogKiAgbHBDYXB0aW9uIFtJXSBSZXNvdXJjZSBJZCBvZiB0aXRsZSBvciBMUFNUUgogKiAgdVR5cGUgICAgIFtJXSBUeXBlIG9mIGVycm9yIG1lc3NhZ2UKICoKICogUkVUVVJOUwogKiAgQSByZXR1cm4gdmFsdWUgZnJvbSBNZXNzYWdlQm94QSgpLgogKgogKiBOT1RFUwogKiAgICAgRXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KaW50IFdJTkFQSVYgU2hlbGxNZXNzYWdlQm94QSgKCUhJTlNUQU5DRSBoSW5zdGFuY2UsCglIV05EIGhXbmQsCglMUENTVFIgbHBUZXh0LAoJTFBDU1RSIGxwQ2FwdGlvbiwKCVVJTlQgdVR5cGUsCgkuLi4pCnsKCWNoYXIJc3pUZXh0WzEwMF0sc3pUaXRsZVsxMDBdOwoJTFBDU1RSICBwc3pUZXh0ID0gc3pUZXh0LCBwc3pUaXRsZSA9IHN6VGl0bGUsIHBzelRlbXA7Cgl2YV9saXN0IGFyZ3M7CglpbnQJcmV0OwoKCXZhX3N0YXJ0KGFyZ3MsIHVUeXBlKTsKCS8qIHd2c3ByaW50ZkEoYnVmLGZtdCwgYXJncyk7ICovCgoJVFJBQ0UoIiglMDhseCwlMDhseCwlcCwlcCwlMDh4KVxuIiwKCShEV09SRCloSW5zdGFuY2UsKERXT1JEKWhXbmQsbHBUZXh0LGxwQ2FwdGlvbix1VHlwZSk7CgoJaWYgKCFISVdPUkQobHBDYXB0aW9uKSkKCSAgTG9hZFN0cmluZ0EoaEluc3RhbmNlLCAoRFdPUkQpbHBDYXB0aW9uLCBzelRpdGxlLCBzaXplb2Yoc3pUaXRsZSkpOwoJZWxzZQoJICBwc3pUaXRsZSA9IGxwQ2FwdGlvbjsKCglpZiAoIUhJV09SRChscFRleHQpKQoJICBMb2FkU3RyaW5nQShoSW5zdGFuY2UsIChEV09SRClscFRleHQsIHN6VGV4dCwgc2l6ZW9mKHN6VGV4dCkpOwoJZWxzZQoJICBwc3pUZXh0ID0gbHBUZXh0OwoKCUZvcm1hdE1lc3NhZ2VBKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HLAoJCSAgICAgICBwc3pUZXh0LCAwLCAwLCAoTFBTVFIpJnBzelRlbXAsIDAsICZhcmdzKTsKCgl2YV9lbmQoYXJncyk7CgoJcmV0ID0gTWVzc2FnZUJveEEoaFduZCxwc3pUZW1wLHBzelRpdGxlLHVUeXBlKTsKCUxvY2FsRnJlZSgoSExPQ0FMKXBzelRlbXApOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdpc3RlckRyYWdEcm9wCQkJCVtTSEVMTDMyLjg2XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdpc3RlckRyYWdEcm9wKAoJSFdORCBoV25kLAoJTFBEUk9QVEFSR0VUIHBEcm9wVGFyZ2V0KQp7CglGSVhNRSgiKCVwLCVwKTpzdHViLlxuIiwgaFduZCwgcERyb3BUYXJnZXQpOwoJcmV0dXJuIFJlZ2lzdGVyRHJhZ0Ryb3AoaFduZCwgcERyb3BUYXJnZXQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJldm9rZURyYWdEcm9wCQkJCVtTSEVMTDMyLjg3XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZXZva2VEcmFnRHJvcChIV05EIGhXbmQpCnsKICAgIEZJWE1FKCIoJXApOnN0dWIuXG4iLGhXbmQpOwogICAgcmV0dXJuIFJldm9rZURyYWdEcm9wKGhXbmQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSERvRHJhZ0Ryb3AJCQkJCVtTSEVMTDMyLjg4XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KSFJFU1VMVCBXSU5BUEkgU0hEb0RyYWdEcm9wKAoJSFdORCBoV25kLAoJTFBEQVRBT0JKRUNUIGxwRGF0YU9iamVjdCwKCUxQRFJPUFNPVVJDRSBscERyb3BTb3VyY2UsCglEV09SRCBkd09LRWZmZWN0LAoJTFBEV09SRCBwZHdFZmZlY3QpCnsKICAgIEZJWE1FKCIoJXAgJXAgJXAgMHglMDhseCAlcCk6c3R1Yi5cbiIsCiAgICBoV25kLCBscERhdGFPYmplY3QsIGxwRHJvcFNvdXJjZSwgZHdPS0VmZmVjdCwgcGR3RWZmZWN0KTsKCXJldHVybiBEb0RyYWdEcm9wKGxwRGF0YU9iamVjdCwgbHBEcm9wU291cmNlLCBkd09LRWZmZWN0LCBwZHdFZmZlY3QpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBBcnJhbmdlV2luZG93cwkJCQlbU0hFTEwzMi4xODRdCiAqCiAqLwpXT1JEIFdJTkFQSSBBcnJhbmdlV2luZG93cygKCUhXTkQgaHduZFBhcmVudCwKCURXT1JEIGR3UmVzZXJ2ZWQsCglMUENSRUNUIGxwUmVjdCwKCVdPUkQgY0tpZHMsCglDT05TVCBIV05EICogbHBLaWRzKQp7CiAgICBGSVhNRSgiKCVwIDB4JTA4bHggJXAgMHglMDR4ICVwKTpzdHViLlxuIiwKCSAgIGh3bmRQYXJlbnQsIGR3UmVzZXJ2ZWQsIGxwUmVjdCwgY0tpZHMsIGxwS2lkcyk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2lnbmFsRmlsZU9wZW4JCQkJW1NIRUxMMzIuMTAzXQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJClNpZ25hbEZpbGVPcGVuIChEV09SRCBkd1BhcmFtMSkKewogICAgRklYTUUoIigweCUwOGx4KTpzdHViLlxuIiwgZHdQYXJhbTEpOwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFERF9nZXRfcG9saWN5IC0gaGVscGVyIGZ1bmN0aW9uIGZvciBTSEFkZFRvUmVjZW50RG9jcwogKgogKiBQQVJBTUVURVJTCiAqICAgcG9saWN5ICAgIFtJTl0gIHBvbGljeSBuYW1lIChudWxsIHRlcm1lZCBzdHJpbmcpIHRvIGZpbmQKICogICB0eXBlICAgICAgW09VVF0gcHRyIHRvIERXT1JEIHRvIHJlY2VpdmUgdHlwZQogKiAgIGJ1ZmZlciAgICBbT1VUXSBwdHIgdG8gYXJlYSB0byBob2xkIGRhdGEgcmV0cmlldmVkCiAqICAgbGVuICAgICAgIFtJTi9PVVRdIHB0ciB0byBEV09SRCBob2xkaW5nIHNpemUgb2YgYnVmZmVyIGFuZCBnZXR0aW5nCiAqICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCBmaWxsZWQKICoKICogUkVUVVJOUwogKiAgIHJlc3VsdCBvZiB0aGUgU0hRdWVyeVZhbHVlRXggY2FsbAogKi8Kc3RhdGljIElOVCBTSEFERF9nZXRfcG9saWN5KExQU1RSIHBvbGljeSwgTFBEV09SRCB0eXBlLCBMUFZPSUQgYnVmZmVyLCBMUERXT1JEIGxlbikKewogICAgSEtFWSBQb2xpY3lfYmFzZWtleTsKICAgIElOVCByZXQ7CgogICAgLyogR2V0IHRoZSBrZXkgZm9yIHRoZSBwb2xpY2llcyBsb2NhdGlvbiBpbiB0aGUgcmVnaXN0cnkKICAgICAqLwogICAgaWYgKFJlZ09wZW5LZXlFeEEoSEtFWV9MT0NBTF9NQUNISU5FLAoJCSAgICAgICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcUG9saWNpZXNcXEV4cGxvcmVyIiwKCQkgICAgICAwLCBLRVlfUkVBRCwgJlBvbGljeV9iYXNla2V5KSkgewoKCWlmIChSZWdPcGVuS2V5RXhBKEhLRVlfQ1VSUkVOVF9VU0VSLAoJCQkgICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcUG9saWNpZXNcXEV4cGxvcmVyIiwKCQkJICAwLCBLRVlfUkVBRCwgJlBvbGljeV9iYXNla2V5KSkgewoJICAgIFRSQUNFKCJObyBFeHBsb3JlciBQb2xpY2llcyBsb2NhdGlvbiBleGlzdHMuIFBvbGljeSB3YW50ZWQ9JXNcbiIsCgkJICBwb2xpY3kpOwoJICAgICpsZW4gPSAwOwoJICAgIHJldHVybiBFUlJPUl9GSUxFX05PVF9GT1VORDsKCX0KICAgIH0KCiAgICAvKiBSZXRyaWV2ZSB0aGUgZGF0YSBpZiBpdCBleGlzdHMKICAgICAqLwogICAgcmV0ID0gU0hRdWVyeVZhbHVlRXhBKFBvbGljeV9iYXNla2V5LCBwb2xpY3ksIDAsIHR5cGUsIGJ1ZmZlciwgbGVuKTsKICAgIFJlZ0Nsb3NlS2V5KFBvbGljeV9iYXNla2V5KTsKICAgIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFERF9jb21wYXJlX21ydSAtIGhlbHBlciBmdW5jdGlvbiBmb3IgU0hBZGRUb1JlY2VudERvY3MKICoKICogUEFSQU1FVEVSUwogKiAgIGRhdGExICAgICBbSU5dIGRhdGEgYmVpbmcgbG9va2VkIGZvcgogKiAgIGRhdGEyICAgICBbSU5dIGRhdGEgaW4gTVJVCiAqICAgY2JkYXRhICAgIFtJTl0gbGVuZ3RoIGZyb20gRmluZE1SVURhdGEgY2FsbCAobm90IHVzZWQpCiAqCiAqIFJFVFVSTlMKICogICBwb3NpdGlvbiB3aXRoaW4gTVJVIGxpc3QgdGhhdCBkYXRhIHdhcyBhZGRlZC4KICovCnN0YXRpYyBJTlQgQ0FMTEJBQ0sgU0hBRERfY29tcGFyZV9tcnUoTFBDVk9JRCBkYXRhMSwgTFBDVk9JRCBkYXRhMiwgRFdPUkQgY2JEYXRhKQp7CiAgICByZXR1cm4gbHN0cmNtcGlBKGRhdGExLCBkYXRhMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQUREX2NyZWF0ZV9hZGRfbXJ1X2RhdGEgLSBoZWxwZXIgZnVuY3Rpb24gZm9yIFNIQWRkVG9SZWNlbnREb2NzCiAqCiAqIFBBUkFNRVRFUlMKICogICBtcnVoYW5kbGUgICAgW0lOXSBoYW5kbGUgZm9yIGNyZWF0ZWQgTVJVIGxpc3QKICogICBkb2NfbmFtZSAgICAgW0lOXSBudWxsIHRlcm1lZCBwdXJlIGRvYyBuYW1lCiAqICAgbmV3X2xua19uYW1lIFtJTl0gbnVsbCB0ZXJtZWQgcGF0aCBhbmQgZmlsZSBuYW1lIGZvciAubG5rIGZpbGUKICogICBidWZmZXIgICAgICAgW0lOL09VVF0gMjA0OCBieXRlIGFyZWEgdG8gY29uc3R1cmN0IE1SVSBkYXRhCiAqICAgbGVuICAgICAgICAgIFtPVVRdIHB0ciB0byBpbnQgdG8gcmVjZWl2ZSBzcGFjZSB1c2VkIGluIGJ1ZmZlcgogKgogKiBSRVRVUk5TCiAqICAgcG9zaXRpb24gd2l0aGluIE1SVSBsaXN0IHRoYXQgZGF0YSB3YXMgYWRkZWQuCiAqLwpzdGF0aWMgSU5UIFNIQUREX2NyZWF0ZV9hZGRfbXJ1X2RhdGEoSEFORExFIG1ydWhhbmRsZSwgTFBTVFIgZG9jX25hbWUsIExQU1RSIG5ld19sbmtfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgSU5UICpsZW4pCnsKICAgIExQU1RSIHB0cjsKICAgIElOVCB3bGVuOwoKICAgIC8qRklYTUU6IERvY3VtZW50OgogICAgICogIFJlY2VudERvY3MgTVJVIGRhdGEgc3RydWN0dXJlIHNlZW1zIHRvIGJlOgogICAgICogICAgKzBoICAgZG9jdW1lbnQgZmlsZSBuYW1lIHcvIHRlcm1pbmF0aW5nIDBoCiAgICAgKiAgICArbmggICBzaG9ydCBpbnQgdy8gc2l6ZSBvZiByZW1haW5pbmcKICAgICAqICAgICtuKzJoIDAyaCAzMGgsIG9yIDAxaCAzMGgsIG9yIDAwaCAzMGggIC0gIHVua25vd24KICAgICAqICAgICtuKzRoIDEwIGJ5dGVzIHplcm9zICAtICAgdW5rbm93bgogICAgICogICAgK24rZWggc2hvcnRjdXQgZmlsZSBuYW1lIHcvIHRlcm1pbmF0aW5nIDBoCiAgICAgKiAgICArbitlK25oIDMgemVybyBieXRlcyAgLSAgdW5rbm93bgogICAgICovCgogICAgLyogQ3JlYXRlIHRoZSBNUlUgZGF0YSBzdHJ1Y3R1cmUgZm9yICJSZWNlbnREb2NzIgoJICovCiAgICBwdHIgPSBidWZmZXI7CiAgICBsc3RyY3B5QShwdHIsIGRvY19uYW1lKTsKICAgIHB0ciArPSAobHN0cmxlbkEoYnVmZmVyKSArIDEpOwogICAgd2xlbj0gbHN0cmxlbkEobmV3X2xua19uYW1lKSArIDEgKyAxMjsKICAgICooKHNob3J0IGludCopcHRyKSA9IHdsZW47CiAgICBwdHIgKz0gMjsgICAvKiBzdGVwIHBhc3QgdGhlIGxlbmd0aCAqLwogICAgKihwdHIrKykgPSAweDMwOyAgLyogdW5rbm93biByZWFzb24gKi8KICAgICoocHRyKyspID0gMDsgICAgIC8qIHVua25vd24sIGJ1dCBjYW4gYmUgMHgwMCwgMHgwMSwgMHgwMiAqLwogICAgbWVtc2V0KHB0ciwgMCwgMTApOwogICAgcHRyICs9IDEwOwogICAgbHN0cmNweUEocHRyLCBuZXdfbG5rX25hbWUpOwogICAgcHRyICs9IChsc3RybGVuQShuZXdfbG5rX25hbWUpICsgMSk7CiAgICBtZW1zZXQocHRyLCAwLCAzKTsKICAgIHB0ciArPSAzOwogICAgKmxlbiA9IHB0ciAtIGJ1ZmZlcjsKCiAgICAvKiBBZGQgdGhlIG5ldyBlbnRyeSBpbnRvIHRoZSBNUlUgbGlzdAogICAgICovCiAgICByZXR1cm4gQWRkTVJVRGF0YShtcnVoYW5kbGUsIChMUENWT0lEKWJ1ZmZlciwgKmxlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWRkVG9SZWNlbnREb2NzCQkJCVtTSEVMTDMyLkBdCiAqCiAqIFBBUkFNRVRFUlMKICogICB1RmxhZ3MgIFtJTl0gU0hBUkRfUEFUSCBvciBTSEFSRF9QSURMCiAqICAgcHYgICAgICBbSU5dIHN0cmluZyBvciBwaWRsLCBOVUxMIGNsZWFycyB0aGUgbGlzdAogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgbmFtZQogKi8Kdm9pZCBXSU5BUEkgU0hBZGRUb1JlY2VudERvY3MgKFVJTlQgdUZsYWdzLExQQ1ZPSUQgcHYpCnsKLyogSWYgbGlzdCBpcyBhIHN0cmluZyBsaXN0IGxwZm5Db21wYXJlIGhhcyB0aGUgZm9sbG93aW5nIHByb3RvdHlwZQogKiBpbnQgQ0FMTEJBQ0sgTVJVQ29tcGFyZVN0cmluZyhMUENTVFIgczEsIExQQ1NUUiBzMikKICogZm9yIGJpbmFyeSBsaXN0cyB0aGUgcHJvdG90eXBlIGlzCiAqIGludCBDQUxMQkFDSyBNUlVDb21wYXJlQmluYXJ5KExQQ1ZPSUQgZGF0YTEsIExQQ1ZPSUQgZGF0YTIsIERXT1JEIGNiRGF0YSkKICogd2hlcmUgY2JEYXRhIGlzIHRoZSBuby4gb2YgYnl0ZXMgdG8gY29tcGFyZS4KICogTmVlZCB0byBjaGVjayB3aGF0IHJldHVybiB2YWx1ZSBtZWFucyBpZGVudGljYWwgLSAwPwogKi8KCgogICAgVUlOVCBvbGRlcnJvcm1vZGU7CiAgICBIS0VZIEhDVWJhc2VrZXk7CiAgICBDSEFSIGRvY19uYW1lW01BWF9QQVRIXTsKICAgIENIQVIgbGlua19kaXJbTUFYX1BBVEhdOwogICAgQ0hBUiBuZXdfbG5rX2ZpbGVwYXRoW01BWF9QQVRIXTsKICAgIENIQVIgbmV3X2xua19uYW1lW01BWF9QQVRIXTsKICAgIElNYWxsb2MgKnBwTTsKICAgIExQSVRFTUlETElTVCBwaWRsOwogICAgSFdORCBod25kID0gMDsgICAgICAgLyogRklYTUU6ICBnZXQgcmVhbCB3aW5kb3cgaGFuZGxlICovCiAgICBJTlQgcmV0OwogICAgRFdPUkQgZGF0YVs2NF0sIGRhdGFsZW4sIHR5cGU7CgogICAgLypGSVhNRTogRG9jdW1lbnQ6CiAgICAgKiAgUmVjZW50RG9jcyBNUlUgZGF0YSBzdHJ1Y3R1cmUgc2VlbXMgdG8gYmU6CiAgICAgKiAgICArMGggICBkb2N1bWVudCBmaWxlIG5hbWUgdy8gdGVybWluYXRpbmcgMGgKICAgICAqICAgICtuaCAgIHNob3J0IGludCB3LyBzaXplIG9mIHJlbWFpbmluZwogICAgICogICAgK24rMmggMDJoIDMwaCwgb3IgMDFoIDMwaCwgb3IgMDBoIDMwaCAgLSAgdW5rbm93bgogICAgICogICAgK24rNGggMTAgYnl0ZXMgemVyb3MgIC0gICB1bmtub3duCiAgICAgKiAgICArbitlaCBzaG9ydGN1dCBmaWxlIG5hbWUgdy8gdGVybWluYXRpbmcgMGgKICAgICAqICAgICtuK2UrbmggMyB6ZXJvIGJ5dGVzICAtICB1bmtub3duCiAgICAgKi8KCiAgICAvKiBTZWUgaWYgd2UgbmVlZCB0byBkbyBhbnl0aGluZy4KICAgICAqLwogICAgZGF0YWxlbiA9IDY0OwogICAgcmV0PVNIQUREX2dldF9wb2xpY3koICJOb1JlY2VudERvY3NIaXN0b3J5IiwgJnR5cGUsICZkYXRhLCAmZGF0YWxlbik7CiAgICBpZiAoKHJldCA+IDApICYmIChyZXQgIT0gRVJST1JfRklMRV9OT1RfRk9VTkQpKSB7CglFUlIoIkVycm9yICVkIGdldHRpbmcgcG9saWN5IFwiTm9SZWNlbnREb2NzSGlzdG9yeVwiXG4iLCByZXQpOwoJcmV0dXJuOwogICAgfQogICAgaWYgKHJldCA9PSBFUlJPUl9TVUNDRVNTKSB7CglpZiAoISggKHR5cGUgPT0gUkVHX0RXT1JEKSB8fAoJICAgICAgICgodHlwZSA9PSBSRUdfQklOQVJZKSAmJiAoZGF0YWxlbiA9PSA0KSkgKSkgewoJICAgIEVSUigiRXJyb3IgcG9saWN5IGRhdGEgZm9yIFwiTm9SZWNlbnREb2NzSGlzdG9yeVwiIG5vdCBmb3JtYXRlZCBjb3JyZWN0bHksIHR5cGU9JWxkLCBsZW49JWxkXG4iLAoJCXR5cGUsIGRhdGFsZW4pOwoJICAgIHJldHVybjsKCX0KCglUUkFDRSgicG9saWN5IHZhbHVlIGZvciBOb1JlY2VudERvY3NIaXN0b3J5ID0gJTA4bHhcbiIsIGRhdGFbMF0pOwoJLyogbm93IHRlc3QgdGhlIGFjdHVhbCBwb2xpY3kgdmFsdWUgKi8KCWlmICggZGF0YVswXSAhPSAwKQoJICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBPcGVuIGtleSB0byB3aGVyZSB0aGUgbmVjZXNzYXJ5IGluZm8gaXMKICAgICAqLwogICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGRvbmUgZHVyaW5nIERMTCBQUk9DRVNTX0FUVEFDSCAob3IgVEhSRUFEX0FUVEFDSCkKICAgICAqICAgICAgICBhbmQgdGhlIGNsb3NlIHNob3VsZCBiZSBkb25lIGR1cmluZyB0aGUgX0RFVEFDSC4gVGhlIHJlc3VsdGluZwogICAgICogICAgICAgIGtleSBpcyBzdG9yZWQgaW4gdGhlIERMTCBnbG9iYWwgZGF0YS4KICAgICAqLwogICAgaWYgKFJlZ0NyZWF0ZUtleUV4QShIS0VZX0NVUlJFTlRfVVNFUiwKCQkJIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxFeHBsb3JlciIsCgkJCTAsIDAsIDAsIEtFWV9SRUFELCAwLCAmSENVYmFzZWtleSwgMCkpIHsKCUVSUigiRmFpbGVkIHRvIGNyZWF0ZSAnU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEV4cGxvcmVyJ1xuIik7CglyZXR1cm47CiAgICB9CgogICAgLyogR2V0IHBhdGggdG8gdXNlcidzICJSZWNlbnQiIGRpcmVjdG9yeQogICAgICovCiAgICBpZihTVUNDRUVERUQoU0hHZXRNYWxsb2MoJnBwTSkpKSB7CglpZiAoU1VDQ0VFREVEKFNIR2V0U3BlY2lhbEZvbGRlckxvY2F0aW9uKGh3bmQsIENTSURMX1JFQ0VOVCwKCQkJCQkJICZwaWRsKSkpIHsKCSAgICBTSEdldFBhdGhGcm9tSURMaXN0QShwaWRsLCBsaW5rX2Rpcik7CgkgICAgSU1hbGxvY19GcmVlKHBwTSwgcGlkbCk7Cgl9CgllbHNlIHsKCSAgICAvKiBzZXJpb3VzIGlzc3VlcyAqLwoJICAgIGxpbmtfZGlyWzBdID0gMDsKCSAgICBFUlIoInNlcmlvdXMgaXNzdWVzIDFcbiIpOwoJfQoJSU1hbGxvY19SZWxlYXNlKHBwTSk7CiAgICB9CiAgICBlbHNlIHsKCS8qIHNlcmlvdXMgaXNzdWVzICovCglsaW5rX2RpclswXSA9IDA7CglFUlIoInNlcmlvdXMgaXNzdWVzIDJcbiIpOwogICAgfQogICAgVFJBQ0UoIlVzZXJzIFJlY2VudCBkaXIgJXNcbiIsIGxpbmtfZGlyKTsKCiAgICAvKiBJZiBubyBpbnB1dCwgdGhlbiBnbyBjbGVhciB0aGUgbGlzdHMgKi8KICAgIGlmICghcHYpIHsKCS8qIGNsZWFyIHVzZXIncyBSZWNlbnQgZGlyCgkgKi8KCgkvKiBGSVhNRTogZGVsZXRlIGFsbCBmaWxlcyBpbiAibGlua19kaXIiCgkgKgoJICogd2hpbGUoIG1vcmUgZmlsZXMgKSB7CgkgKiAgICBsc3RyY3B5QShvbGRfbG5rX25hbWUsIGxpbmtfZGlyKTsKCSAqICAgIFBhdGhBcHBlbmRBKG9sZF9sbmtfbmFtZSwgZmlsZW5hbSk7CgkgKiAgICBEZWxldGVGaWxlQShvbGRfbG5rX25hbWUpOwoJICogfQoJICovCglGSVhNRSgic2hvdWxkIGRlbGV0ZSBhbGwgZmlsZXMgaW4gJXNcXCBcbiIsIGxpbmtfZGlyKTsKCgkvKiBjbGVhciBNUlUgbGlzdAoJICovCgkvKiBNUyBCdWcgPz8gdjQuNzIuMzYxMi4xNzAwIG9mIHNoZWxsMzIgZG9lcyB0aGUgZGVsZXRlIGFnYWluc3QKCSAqICBIS0VZX0xPQ0FMX01BQ0hJTkUgdmVyc2lvbiBvZiAuLi5DdXJyZW50VmVyc2lvblxFeHBsb3JlcgoJICogIGFuZCBuYXR1cmFsbHkgaXQgZmFpbHMgdy8gcmM9Mi4gSXQgc2hvdWxkIGRvIGl0IGFnYWluc3QKCSAqICBIS0VZX0NVUlJFTlRfVVNFUiB3aGljaCBpcyB3aGVyZSBpdCBpcyBzdG9yZWQsIGFuZCB3aGVyZQoJICogIHRoZSBNUlUgcm91dGluZXMgZXhwZWN0IGl0ISEhIQoJICovCglSZWdEZWxldGVLZXlBKEhDVWJhc2VrZXksICJSZWNlbnREb2NzIik7CglSZWdDbG9zZUtleShIQ1ViYXNla2V5KTsKCXJldHVybjsKICAgIH0KCiAgICAvKiBIYXZlIGRhdGEgdG8gYWRkLCB0aGUgam9icyB0byBiZSBkb25lOgogICAgICogICAxLiBBZGQgZG9jdW1lbnQgdG8gTVJVIGxpc3QgaW4gcmVnaXN0cnkgIkhLQ1VcU29mdHdhcmVcCiAgICAgKiAgICAgIE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFJlY2VudERvY3MiLgogICAgICogICAyLiBBZGQgc2hvcnRjdXQgdG8gZG9jdW1lbnQgaW4gdGhlIHVzZXIncyBSZWNlbnQgZGlyZWN0b3J5CiAgICAgKiAgICAgIChDU0lETF9SRUNFTlQpLgogICAgICogICAzLiBBZGQgc2hvcnRjdXQgdG8gU3RhcnQgbWVudSdzIERvY3VtZW50cyBzdWJtZW51LgogICAgICovCgogICAgLyogR2V0IHRoZSBwdXJlIGRvY3VtZW50IG5hbWUgZnJvbSB0aGUgaW5wdXQKICAgICAqLwogICAgaWYgKHVGbGFncyAmIFNIQVJEX1BJREwpIHsKCVNIR2V0UGF0aEZyb21JRExpc3RBKChMUENJVEVNSURMSVNUKSBwdiwgZG9jX25hbWUpOwogICAgfQogICAgZWxzZSB7Cglsc3RyY3B5QShkb2NfbmFtZSwgKExQU1RSKSBwdik7CiAgICB9CiAgICBUUkFDRSgiZnVsbCBkb2N1bWVudCBuYW1lICVzXG4iLCBkb2NfbmFtZSk7CiAgICBQYXRoU3RyaXBQYXRoQShkb2NfbmFtZSk7CiAgICBUUkFDRSgic3RyaXBwZWQgZG9jdW1lbnQgbmFtZSAlc1xuIiwgZG9jX25hbWUpOwoKCiAgICAvKiAqKiogIEpPQiAxOiBVcGRhdGUgcmVnaXN0cnkgZm9yIC4uLlxFeHBsb3JlclxSZWNlbnREb2NzIGxpc3QgICoqKiAqLwoKICAgIHsgIC8qIG9uIGlucHV0IG5lZWRzOgoJKiAgICAgIGRvY19uYW1lICAgIC0gIHB1cmUgZmlsZS1zcGVjLCBubyBwYXRoCgkqICAgICAgbGlua19kaXIgICAgLSAgcGF0aCB0byB0aGUgdXNlcidzIFJlY2VudCBkaXJlY3RvcnkKCSogICAgICBIQ1ViYXNla2V5ICAtICBrZXkgb2YgLi4uV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlciIgbm9kZQoJKiBjcmVhdGVzOgoJKiAgICAgIG5ld19sbmtfbmFtZS0gIHB1cmUgZmlsZS1zcGVjLCBubyBwYXRoIGZvciBuZXcgLmxuayBmaWxlCgkqICAgICAgbmV3X2xua19maWxlcGF0aAoJKiAgICAgICAgICAgICAgICAgIC0gIHBhdGggYW5kIGZpbGUgbmFtZSBvZiBuZXcgLmxuayBmaWxlCgkqLwoJQ1JFQVRFTVJVTElTVEEgbXltcnU7CglIQU5ETEUgbXJ1aGFuZGxlOwoJSU5UIGxlbiwgcG9zLCBidWZ1c2VkLCBlcnI7CglJTlQgaTsKCURXT1JEIGF0dHI7CglDSEFSIGJ1ZmZlclsyMDQ4XTsKCUNIQVIgKnB0cjsKCUNIQVIgb2xkX2xua19uYW1lW01BWF9QQVRIXTsKCXNob3J0IGludCBzbGVuOwoKCW15bXJ1LmNiU2l6ZSA9IHNpemVvZihDUkVBVEVNUlVMSVNUQSk7CglteW1ydS5uTWF4SXRlbXMgPSAxNTsKCW15bXJ1LmR3RmxhZ3MgPSBNUlVGX0JJTkFSWV9MSVNUIHwgTVJVRl9ERUxBWUVEX1NBVkU7CglteW1ydS5oS2V5ID0gSENVYmFzZWtleTsKCW15bXJ1Lmxwc3pTdWJLZXkgPSAiUmVjZW50RG9jcyI7CglteW1ydS5scGZuQ29tcGFyZSA9ICZTSEFERF9jb21wYXJlX21ydTsKCW1ydWhhbmRsZSA9IENyZWF0ZU1SVUxpc3RBKCZteW1ydSk7CglpZiAoIW1ydWhhbmRsZSkgewoJICAgIC8qIE1SVSBmYWlsZWQgKi8KCSAgICBFUlIoIk1SVSBwcm9jZXNzaW5nIGZhaWxlZCwgaGFuZGxlIHplcm9cbiIpOwoJICAgIFJlZ0Nsb3NlS2V5KEhDVWJhc2VrZXkpOwoJICAgIHJldHVybjsKCX0KCWxlbiA9IGxzdHJsZW5BKGRvY19uYW1lKTsKCXBvcyA9IEZpbmRNUlVEYXRhKG1ydWhhbmRsZSwgZG9jX25hbWUsIGxlbiwgMCk7CgoJLyogTm93IGdldCB0aGUgTVJVIGVudHJ5IHRoYXQgd2lsbCBiZSByZXBsYWNlZAoJICogYW5kIGRlbGV0ZSB0aGUgLmxuayBmaWxlIGZvciBpdAoJICovCglpZiAoKGJ1ZnVzZWQgPSBFbnVtTVJVTGlzdEEobXJ1aGFuZGxlLCAocG9zID09IC0xKSA/IDE0IDogcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIDIwNDgpKSAhPSAtMSkgewoJICAgIHB0ciA9IGJ1ZmZlcjsKCSAgICBwdHIgKz0gKGxzdHJsZW5BKGJ1ZmZlcikgKyAxKTsKCSAgICBzbGVuID0gKigoc2hvcnQgaW50KilwdHIpOwoJICAgIHB0ciArPSAyOyAgLyogc2tpcCB0aGUgbGVuZ3RoIGFyZWEgKi8KCSAgICBpZiAoYnVmdXNlZCA+PSBzbGVuICsgKHB0ci1idWZmZXIpKSB7CgkJLyogYnVmZmVyIHNpemUgbG9va3MgZ29vZCAqLwoJCXB0ciArPSAxMjsgLyogZ2V0IHRvIHN0cmluZyAqLwoJCWxlbiA9IGJ1ZnVzZWQgLSAocHRyLWJ1ZmZlcik7ICAvKiBnZXQgbGVuZ3RoIG9mIGJ1ZiByZW1haW5pbmcgKi8KCQlpZiAoKGxzdHJsZW5BKHB0cikgPiAwKSAmJiAobHN0cmxlbkEocHRyKSA8PSBsZW4tMSkpIHsKCQkgICAgLyogYXBwZWFycyB0byBiZSBnb29kIHN0cmluZyAqLwoJCSAgICBsc3RyY3B5QShvbGRfbG5rX25hbWUsIGxpbmtfZGlyKTsKCQkgICAgUGF0aEFwcGVuZEEob2xkX2xua19uYW1lLCBwdHIpOwoJCSAgICBpZiAoIURlbGV0ZUZpbGVBKG9sZF9sbmtfbmFtZSkpIHsKCQkJaWYgKChhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXNBKG9sZF9sbmtfbmFtZSkpID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKSB7CgkJCSAgICBpZiAoKGVyciA9IEdldExhc3RFcnJvcigpKSAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkgewoJCQkJRVJSKCJEZWxldGUgZm9yICVzIGZhaWxlZCwgZXJyPSVkLCBhdHRyPSUwOGx4XG4iLAoJCQkJICAgIG9sZF9sbmtfbmFtZSwgZXJyLCBhdHRyKTsKCQkJICAgIH0KCQkJICAgIGVsc2UgewoJCQkJVFJBQ0UoIm9sZCAubG5rIGZpbGUgJXMgZGlkIG5vdCBleGlzdFxuIiwKCQkJCSAgICAgIG9sZF9sbmtfbmFtZSk7CgkJCSAgICB9CgkJCX0KCQkJZWxzZSB7CgkJCSAgICBFUlIoIkRlbGV0ZSBmb3IgJXMgZmFpbGVkLCBhdHRyPSUwOGx4XG4iLAoJCQkJb2xkX2xua19uYW1lLCBhdHRyKTsKCQkJfQoJCSAgICB9CgkJICAgIGVsc2UgewoJCQlUUkFDRSgiZGVsZXRlZCBvbGQgLmxuayBmaWxlICVzXG4iLCBvbGRfbG5rX25hbWUpOwoJCSAgICB9CgkJfQoJICAgIH0KCX0KCgkvKiBDcmVhdGUgdXNhYmxlIC5sbmsgZmlsZSBuYW1lIGZvciB0aGUgIlJlY2VudCIgZGlyZWN0b3J5CgkgKi8KCXdzcHJpbnRmQShuZXdfbG5rX25hbWUsICIlcy5sbmsiLCBkb2NfbmFtZSk7Cglsc3RyY3B5QShuZXdfbG5rX2ZpbGVwYXRoLCBsaW5rX2Rpcik7CglQYXRoQXBwZW5kQShuZXdfbG5rX2ZpbGVwYXRoLCBuZXdfbG5rX25hbWUpOwoJaSA9IDE7CglvbGRlcnJvcm1vZGUgPSBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyk7Cgl3aGlsZSAoR2V0RmlsZUF0dHJpYnV0ZXNBKG5ld19sbmtfZmlsZXBhdGgpICE9IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKSB7CgkgICAgaSsrOwoJICAgIHdzcHJpbnRmQShuZXdfbG5rX25hbWUsICIlcyAoJXUpLmxuayIsIGRvY19uYW1lLCBpKTsKCSAgICBsc3RyY3B5QShuZXdfbG5rX2ZpbGVwYXRoLCBsaW5rX2Rpcik7CgkgICAgUGF0aEFwcGVuZEEobmV3X2xua19maWxlcGF0aCwgbmV3X2xua19uYW1lKTsKCX0KCVNldEVycm9yTW9kZShvbGRlcnJvcm1vZGUpOwoJVFJBQ0UoIm5ldyBzaG9ydGN1dCB3aWxsIGJlICVzXG4iLCBuZXdfbG5rX2ZpbGVwYXRoKTsKCgkvKiBOb3cgYWRkIHRoZSBuZXcgTVJVIGVudHJ5IGFuZCBkYXRhCgkgKi8KCXBvcyA9IFNIQUREX2NyZWF0ZV9hZGRfbXJ1X2RhdGEobXJ1aGFuZGxlLCBkb2NfbmFtZSwgbmV3X2xua19uYW1lLAoJCQkJCWJ1ZmZlciwgJmxlbik7CglGcmVlTVJVTGlzdChtcnVoYW5kbGUpOwoJVFJBQ0UoIlVwZGF0ZWQgTVJVIGxpc3QsIG5ldyBkb2MgaXMgcG9zaXRpb24gJWRcbiIsIHBvcyk7CiAgICB9CgogICAgLyogKioqICBKT0IgMjogQ3JlYXRlIHNob3J0Y3V0IGluIHVzZXIncyAiUmVjZW50IiBkaXJlY3RvcnkgICoqKiAqLwoKICAgIHsgIC8qIG9uIGlucHV0IG5lZWRzOgoJKiAgICAgIGRvY19uYW1lICAgIC0gIHB1cmUgZmlsZS1zcGVjLCBubyBwYXRoCgkqICAgICAgbmV3X2xua19maWxlcGF0aAoJKiAgICAgICAgICAgICAgICAgIC0gIHBhdGggYW5kIGZpbGUgbmFtZSBvZiBuZXcgLmxuayBmaWxlCiAJKiAgICAgIHVGbGFnc1tpbl0gIC0gIGZsYWdzIG9uIGNhbGwgdG8gU0hBZGRUb1JlY2VudERvY3MKCSogICAgICBwdltpbl0gICAgICAtICBkb2N1bWVudCBwYXRoL3BpZGwgb24gY2FsbCB0byBTSEFkZFRvUmVjZW50RG9jcwoJKi8KCUlTaGVsbExpbmtBICpwc2wgPSBOVUxMOwoJSVBlcnNpc3RGaWxlICpwUGYgPSBOVUxMOwoJSFJFU1VMVCBocmVzOwoJQ0hBUiBkZXNjW01BWF9QQVRIXTsKCVdDSEFSIHdpZGVsaW5rW01BWF9QQVRIXTsKCglDb0luaXRpYWxpemUoMCk7CgoJaHJlcyA9IENvQ3JlYXRlSW5zdGFuY2UoICZDTFNJRF9TaGVsbExpbmssCgkJCQkgTlVMTCwKCQkJCSBDTFNDVFhfSU5QUk9DX1NFUlZFUiwKCQkJCSAmSUlEX0lTaGVsbExpbmtBLAoJCQkJIChMUFZPSUQgKSZwc2wpOwoJaWYoU1VDQ0VFREVEKGhyZXMpKSB7CgoJICAgIGhyZXMgPSBJU2hlbGxMaW5rQV9RdWVyeUludGVyZmFjZShwc2wsICZJSURfSVBlcnNpc3RGaWxlLAoJCQkJCSAgICAgKExQVk9JRCAqKSZwUGYpOwoJICAgIGlmKEZBSUxFRChocmVzKSkgewoJCS8qIGJvbWJlZCAqLwoJCUVSUigiZmFpbGVkIFF1ZXJ5SW50ZXJmYWNlIGZvciBJUGVyc2lzdEZpbGUgJTA4bHhcbiIsIGhyZXMpOwoJCWdvdG8gZmFpbDsKCSAgICB9CgoJICAgIC8qIFNldCB0aGUgZG9jdW1lbnQgcGF0aCBvciBwaWRsICovCgkgICAgaWYgKHVGbGFncyAmIFNIQVJEX1BJREwpIHsKCQlocmVzID0gSVNoZWxsTGlua0FfU2V0SURMaXN0KHBzbCwgKExQQ0lURU1JRExJU1QpIHB2KTsKCSAgICB9IGVsc2UgewoJCWhyZXMgPSBJU2hlbGxMaW5rQV9TZXRQYXRoKHBzbCwgKExQQ1NUUikgcHYpOwoJICAgIH0KCSAgICBpZihGQUlMRUQoaHJlcykpIHsKCQkvKiBib21iZWQgKi8KCQlFUlIoImZhaWxlZCBTZXR7SURMaXN0fFBhdGh9ICUwOGx4XG4iLCBocmVzKTsKCQlnb3RvIGZhaWw7CgkgICAgfQoKCSAgICBsc3RyY3B5QShkZXNjLCAiU2hvcnRjdXQgdG8gIik7CgkgICAgbHN0cmNhdEEoZGVzYywgZG9jX25hbWUpOwoJICAgIGhyZXMgPSBJU2hlbGxMaW5rQV9TZXREZXNjcmlwdGlvbihwc2wsIGRlc2MpOwoJICAgIGlmKEZBSUxFRChocmVzKSkgewoJCS8qIGJvbWJlZCAqLwoJCUVSUigiZmFpbGVkIFNldERlc2NyaXB0aW9uICUwOGx4XG4iLCBocmVzKTsKCQlnb3RvIGZhaWw7CgkgICAgfQoKCSAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgbmV3X2xua19maWxlcGF0aCwgLTEsCgkJCQl3aWRlbGluaywgTUFYX1BBVEgpOwoJICAgIC8qIGNyZWF0ZSB0aGUgc2hvcnQgY3V0ICovCgkgICAgaHJlcyA9IElQZXJzaXN0RmlsZV9TYXZlKHBQZiwgd2lkZWxpbmssIFRSVUUpOwoJICAgIGlmKEZBSUxFRChocmVzKSkgewoJCS8qIGJvbWJlZCAqLwoJCUVSUigiZmFpbGVkIElQZXJzaXN0RmlsZTo6U2F2ZSAlMDhseFxuIiwgaHJlcyk7CgkJSVBlcnNpc3RGaWxlX1JlbGVhc2UocFBmKTsKCQlJU2hlbGxMaW5rQV9SZWxlYXNlKHBzbCk7CgkJZ290byBmYWlsOwoJICAgIH0KCSAgICBocmVzID0gSVBlcnNpc3RGaWxlX1NhdmVDb21wbGV0ZWQocFBmLCB3aWRlbGluayk7CgkgICAgSVBlcnNpc3RGaWxlX1JlbGVhc2UocFBmKTsKCSAgICBJU2hlbGxMaW5rQV9SZWxlYXNlKHBzbCk7CgkgICAgVFJBQ0UoInNob3J0Y3V0ICVzIGhhcyBiZWVuIGNyZWF0ZWQsIHJlc3VsdD0lMDhseFxuIiwKCQkgIG5ld19sbmtfZmlsZXBhdGgsIGhyZXMpOwoJfQoJZWxzZSB7CgkgICAgRVJSKCJDb0NyZWF0ZUluc3RhbmNlIGZhaWxlZCwgaHJlcz0lMDhseFxuIiwgaHJlcyk7Cgl9CiAgICB9CgogZmFpbDoKICAgIENvVW5pbml0aWFsaXplKCk7CgogICAgLyogYWxsIGRvbmUgKi8KICAgIFJlZ0Nsb3NlS2V5KEhDVWJhc2VrZXkpOwogICAgcmV0dXJuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENyZWF0ZVNoZWxsRm9sZGVyVmlld0V4CQkJW1NIRUxMMzIuMTc0XQogKgogKiBOT1RFUwogKiAgc2VlIElTaGVsbEZvbGRlcjo6Q3JlYXRlVmlld09iamVjdAogKi8KSFJFU1VMVCBXSU5BUEkgU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeCgKCUxQQ1NGViBwc3ZjYmksICAgIC8qIFtpbl0gc2hlbGx0ZW1wbGF0ZSBzdHJ1Y3QgKi8KCUlTaGVsbFZpZXcgKipwcHYpIC8qIFtvdXRdIElTaGVsbFZpZXcgcG9pbnRlciAqLwp7CglJU2hlbGxWaWV3ICogcHNmOwoJSFJFU1VMVCBoUmVzOwoKCVRSQUNFKCJzZj0lcCBwaWRsPSVwIGNiPSVwIG1vZGU9MHglMDh4IHBhcm09JXBcbiIsCgkgIHBzdmNiaS0+cHNoZiwgcHN2Y2JpLT5waWRsLCBwc3ZjYmktPnBmbkNhbGxiYWNrLAoJICBwc3ZjYmktPmZ2bSwgcHN2Y2JpLT5wc3ZPdXRlcik7CgoJcHNmID0gSVNoZWxsVmlld19Db25zdHJ1Y3Rvcihwc3ZjYmktPnBzaGYpOwoKCWlmICghcHNmKQoJICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKCglJU2hlbGxWaWV3X0FkZFJlZihwc2YpOwoJaFJlcyA9IElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UocHNmLCAmSUlEX0lTaGVsbFZpZXcsIChMUFZPSUQgKilwcHYpOwoJSVNoZWxsVmlld19SZWxlYXNlKHBzZik7CgoJcmV0dXJuIGhSZXM7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFNIV2luSGVscAkJCQkJW1NIRUxMMzIuMTI3XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hXaW5IZWxwIChEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB6KQp7CUZJWE1FKCIweCUwOGx4IDB4JTA4bHggMHglMDhseCAweCUwOGx4IHN0dWJcbiIsdix3LHgseik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU0hSdW5Db250cm9sUGFuZWwgW1NIRUxMMzIuMTYxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSdW5Db250cm9sUGFuZWwgKERXT1JEIHgsIERXT1JEIHopCnsJRklYTUUoIjB4JTA4bHggMHglMDhseCBzdHViXG4iLHgseik7CglyZXR1cm4gMDsKfQoKc3RhdGljIExQVU5LTk9XTiBTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZT0wOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNldEluc3RhbmNlRXhwbG9yZXIJCQlbU0hFTEwzMi4xNzZdCiAqCiAqIE5PVEVTCiAqICBTZXRzIHRoZSBpbnRlcmZhY2UKICovCkhSRVNVTFQgV0lOQVBJIFNIU2V0SW5zdGFuY2VFeHBsb3JlciAoTFBVTktOT1dOIGxwVW5rbm93bikKewlUUkFDRSgiJXBcbiIsIGxwVW5rbm93bik7CglTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSA9IGxwVW5rbm93bjsKCXJldHVybiAoSFJFU1VMVCkgbHBVbmtub3duOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0SW5zdGFuY2VFeHBsb3JlcgkJCVtTSEVMTDMyLkBdCiAqCiAqIE5PVEVTCiAqICBnZXRzIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBvZiB0aGUgZXhwbG9yZXIgYW5kIGEgcmVmZXJlbmNlCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEdldEluc3RhbmNlRXhwbG9yZXIgKExQVU5LTk9XTiAqIGxwVW5rbm93bikKewlUUkFDRSgiJXBcbiIsIGxwVW5rbm93bik7CgoJKmxwVW5rbm93biA9IFNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlOwoKCWlmICghU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2UpCgkgIHJldHVybiBFX0ZBSUw7CgoJSVVua25vd25fQWRkUmVmKFNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlKTsKCXJldHVybiBOT0VSUk9SOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRnJlZVVudXNlZExpYnJhcmllcwkJCVtTSEVMTDMyLjEyM10KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCnZvaWQgV0lOQVBJIFNIRnJlZVVudXNlZExpYnJhcmllcyAodm9pZCkKewoJRklYTUUoInN0dWJcbiIpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERBRF9BdXRvU2Nyb2xsCQkJCVtTSEVMTDMyLjEyOV0KICoKICovCkJPT0wgV0lOQVBJIERBRF9BdXRvU2Nyb2xsKEhXTkQgaHduZCwgQVVUT19TQ1JPTExfREFUQSAqc2FtcGxlcywgTFBQT0lOVCBwdCkKewogICAgRklYTUUoImh3bmQgPSAlcCAlcCAlcFxuIixod25kLHNhbXBsZXMscHQpOwogICAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREFEX0RyYWdFbnRlcgkJCQlbU0hFTEwzMi4xMzBdCiAqCiAqLwpCT09MIFdJTkFQSSBEQURfRHJhZ0VudGVyKEhXTkQgaHduZCkKewogICAgRklYTUUoImh3bmQgPSAlcFxuIixod25kKTsKICAgIHJldHVybiBGQUxTRTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEQURfRHJhZ0VudGVyRXgJCQkJW1NIRUxMMzIuMTMxXQogKgogKi8KQk9PTCBXSU5BUEkgREFEX0RyYWdFbnRlckV4KEhXTkQgaHduZCwgUE9JTlQgcCkKewogICAgRklYTUUoImh3bmQgPSAlcCAoJWxkLCVsZClcbiIsaHduZCxwLngscC55KTsKICAgIHJldHVybiBGQUxTRTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEQURfRHJhZ01vdmUJCQkJW1NIRUxMMzIuMTM0XQogKgogKi8KQk9PTCBXSU5BUEkgREFEX0RyYWdNb3ZlKFBPSU5UIHApCnsKICAgIEZJWE1FKCIoJWxkLCVsZClcbiIscC54LHAueSk7CiAgICByZXR1cm4gRkFMU0U7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREFEX0RyYWdMZWF2ZQkJCQlbU0hFTEwzMi4xMzJdCiAqCiAqLwpCT09MIFdJTkFQSSBEQURfRHJhZ0xlYXZlKFZPSUQpCnsKICAgIEZJWE1FKCJcbiIpOwogICAgcmV0dXJuIEZBTFNFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERBRF9TZXREcmFnSW1hZ2UJCQkJW1NIRUxMMzIuMTM2XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KQk9PTCBXSU5BUEkgREFEX1NldERyYWdJbWFnZSgKCUhJTUFHRUxJU1QgaGltbFRyYWNrLAoJTFBQT0lOVCBscHB0KQp7CglGSVhNRSgiJXAgJXAgc3R1YlxuIixoaW1sVHJhY2ssIGxwcHQpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERBRF9TaG93RHJhZ0ltYWdlCQkJCVtTSEVMTDMyLjEzN10KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCkJPT0wgV0lOQVBJIERBRF9TaG93RHJhZ0ltYWdlKEJPT0wgYlNob3cpCnsKCUZJWE1FKCIweCUwOHggc3R1YlxuIixiU2hvdyk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGNvbnN0IFdDSEFSIHN6d0NhYkxvY2F0aW9uW10gPSB7CiAgJ1MnLCdvJywnZicsJ3QnLCd3JywnYScsJ3InLCdlJywnXFwnLAogICdNJywnaScsJ2MnLCdyJywnbycsJ3MnLCdvJywnZicsJ3QnLCdcXCcsCiAgJ1cnLCdpJywnbicsJ2QnLCdvJywndycsJ3MnLCdcXCcsCiAgJ0MnLCd1JywncicsJ3InLCdlJywnbicsJ3QnLCdWJywnZScsJ3InLCdzJywnaScsJ28nLCduJywnXFwnLAogICdFJywneCcsJ3AnLCdsJywnbycsJ3InLCdlJywncicsJ1xcJywKICAnQycsJ2EnLCdiJywnaScsJ24nLCdlJywndCcsJ1MnLCd0JywnYScsJ3QnLCdlJywwCn07CgpzdGF0aWMgY29uc3QgV0NIQVIgc3p3U2V0dGluZ3NbXSA9IHsgJ1MnLCdlJywndCcsJ3QnLCdpJywnbicsJ2cnLCdzJywwIH07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZWFkQ2FiaW5ldFN0YXRlCQkJCVtTSEVMTDMyLjY1MV0gTlQgNC4wCiAqCiAqLwpCT09MIFdJTkFQSSBSZWFkQ2FiaW5ldFN0YXRlKENBQklORVRTVEFURSAqY3MsIGludCBsZW5ndGgpCnsKCUhLRVkgaGtleSA9IDA7CglEV09SRCB0eXBlLCByOwoKCVRSQUNFKCIlcCAlZCBcbiIsY3MsbGVuZ3RoKTsKCglpZiggKGNzID09IE5VTEwpIHx8IChsZW5ndGggPCAoaW50KXNpemVvZigqY3MpKSAgKQoJCXJldHVybiBGQUxTRTsKCglyID0gUmVnT3BlbktleVcoIEhLRVlfQ1VSUkVOVF9VU0VSLCBzendDYWJMb2NhdGlvbiwgJmhrZXkgKTsKCWlmKCByID09IEVSUk9SX1NVQ0NFU1MgKQoJewoJCXR5cGUgPSBSRUdfQklOQVJZOwoJCXIgPSBSZWdRdWVyeVZhbHVlRXhXKCBoa2V5LCBzendTZXR0aW5ncywgCgkJCU5VTEwsICZ0eXBlLCAoTFBCWVRFKWNzLCAoTFBEV09SRCkmbGVuZ3RoICk7CgkJUmVnQ2xvc2VLZXkoIGhrZXkgKTsKCQkJCgl9CgoJLyogaWYgd2UgY2FuJ3QgcmVhZCBmcm9tIHRoZSByZWdpc3RyeSwgY3JlYXRlIGRlZmF1bHQgdmFsdWVzICovCglpZiAoIChyICE9IEVSUk9SX1NVQ0NFU1MpIHx8IChjcy0+Y0xlbmd0aCA8IHNpemVvZigqY3MpKSB8fAoJCShjcy0+Y0xlbmd0aCAhPSBsZW5ndGgpICkKCXsKCQlFUlIoIkluaXRpYWxpemluZyBzaGVsbCBjYWJpbmV0IHNldHRpbmdzXG4iKTsKCQltZW1zZXQoY3MsIDAsIHNpemVvZigqY3MpKTsKCQljcy0+Y0xlbmd0aCAgICAgICAgICA9IHNpemVvZigqY3MpOwoJCWNzLT5uVmVyc2lvbiAgICAgICAgID0gMjsKCQljcy0+ZkZ1bGxQYXRoVGl0bGUgICA9IEZBTFNFOwoJCWNzLT5mU2F2ZUxvY2FsVmlldyAgID0gVFJVRTsKCQljcy0+Zk5vdFNoZWxsICAgICAgICA9IEZBTFNFOwoJCWNzLT5mU2ltcGxlRGVmYXVsdCAgID0gVFJVRTsKCQljcy0+ZkRvbnRTaG93RGVzY0JhciA9IEZBTFNFOwoJCWNzLT5mTmV3V2luZG93TW9kZSAgID0gRkFMU0U7CgkJY3MtPmZTaG93Q29tcENvbG9yICAgPSBGQUxTRTsKCQljcy0+ZkRvbnRQcmV0dHlOYW1lcyA9IEZBTFNFOwoJCWNzLT5mQWRtaW5zQ3JlYXRlQ29tbW9uR3JvdXBzID0gVFJVRTsKCQljcy0+Zk1lbnVFbnVtRmlsdGVyICA9IDk2OwoJfQoJCglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogV3JpdGVDYWJpbmV0U3RhdGUJCQkJW1NIRUxMMzIuNjUyXSBOVCA0LjAKICoKICovCkJPT0wgV0lOQVBJIFdyaXRlQ2FiaW5ldFN0YXRlKENBQklORVRTVEFURSAqY3MpCnsKCURXT1JEIHI7CglIS0VZIGhrZXkgPSAwOwoKCVRSQUNFKCIlcFxuIixjcyk7CgoJaWYoIGNzID09IE5VTEwgKQoJCXJldHVybiBGQUxTRTsKCglyID0gUmVnQ3JlYXRlS2V5RXhXKCBIS0VZX0NVUlJFTlRfVVNFUiwgc3p3Q2FiTG9jYXRpb24sIDAsCgkJIE5VTEwsIDAsIEtFWV9BTExfQUNDRVNTLCBOVUxMLCAmaGtleSwgTlVMTCk7CglpZiggciA9PSBFUlJPUl9TVUNDRVNTICkKCXsKCQlyID0gUmVnU2V0VmFsdWVFeFcoIGhrZXksIHN6d1NldHRpbmdzLCAwLCAKCQkJUkVHX0JJTkFSWSwgKExQQllURSkgY3MsIGNzLT5jTGVuZ3RoKTsKCgkJUmVnQ2xvc2VLZXkoIGhrZXkgKTsKCX0KCglyZXR1cm4gKHI9PUVSUk9SX1NVQ0NFU1MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGaWxlSWNvbkluaXQgCQkJCVtTSEVMTDMyLjY2MF0KICoKICovCkJPT0wgV0lOQVBJIEZpbGVJY29uSW5pdChCT09MIGJGdWxsSW5pdCkKewlGSVhNRSgiKCVzKVxuIiwgYkZ1bGxJbml0ID8gInRydWUiIDogImZhbHNlIik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJc1VzZXJBZG1pbgkJCQkJW1NIRUxMMzIuNjgwXSBOVCA0LjAKICoKICovCkhSRVNVTFQgV0lOQVBJIElzVXNlckFkbWluKHZvaWQpCnsJRklYTUUoInN0dWJcbiIpOwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQWxsb2NTaGFyZWQJCQkJW1NIRUxMMzIuNTIwXQogKgogKiBTZWUgc2hsd2FwaS5TSEFsbG9jU2hhcmVkCiAqLwpIQU5ETEUgV0lOQVBJIFNIQWxsb2NTaGFyZWQoTFBWT0lEIGxwdkRhdGEsIERXT1JEIGR3U2l6ZSwgRFdPUkQgZHdQcm9jSWQpCnsKICAgIEdFVF9GVU5DKHBTSEFsbG9jU2hhcmVkLCBzaGx3YXBpLCAoY2hhciopNywgTlVMTCk7CiAgICByZXR1cm4gcFNIQWxsb2NTaGFyZWQobHB2RGF0YSwgZHdTaXplLCBkd1Byb2NJZCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNITG9ja1NoYXJlZAkJCQkJW1NIRUxMMzIuNTIxXQogKgogKiBTZWUgc2hsd2FwaS5TSExvY2tTaGFyZWQKICovCkxQVk9JRCBXSU5BUEkgU0hMb2NrU2hhcmVkKEhBTkRMRSBoU2hhcmVkLCBEV09SRCBkd1Byb2NJZCkKewogICAgR0VUX0ZVTkMocFNITG9ja1NoYXJlZCwgc2hsd2FwaSwgKGNoYXIqKTgsIE5VTEwpOwogICAgcmV0dXJuIHBTSExvY2tTaGFyZWQoaFNoYXJlZCwgZHdQcm9jSWQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFVubG9ja1NoYXJlZAkJCQlbU0hFTEwzMi41MjJdCiAqCiAqIFNlZSBzaGx3YXBpLlNIVW5sb2NrU2hhcmVkCiAqLwpCT09MIFdJTkFQSSBTSFVubG9ja1NoYXJlZChMUFZPSUQgbHBWaWV3KQp7CiAgICBHRVRfRlVOQyhwU0hVbmxvY2tTaGFyZWQsIHNobHdhcGksIChjaGFyKik5LCBGQUxTRSk7CiAgICByZXR1cm4gcFNIVW5sb2NrU2hhcmVkKGxwVmlldyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRnJlZVNoYXJlZAkJCQkJW1NIRUxMMzIuNTIzXQogKgogKiBTZWUgc2hsd2FwaS5TSEZyZWVTaGFyZWQKICovCkJPT0wgV0lOQVBJIFNIRnJlZVNoYXJlZChIQU5ETEUgaFNoYXJlZCwgRFdPUkQgZHdQcm9jSWQpCnsKICAgIEdFVF9GVU5DKHBTSEZyZWVTaGFyZWQsIHNobHdhcGksIChjaGFyKikxMCwgRkFMU0UpOwogICAgcmV0dXJuIHBTSEZyZWVTaGFyZWQoaFNoYXJlZCwgZHdQcm9jSWQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTZXRBcHBTdGFydGluZ0N1cnNvcgkJCQlbU0hFTEwzMi45OV0KICovCkhSRVNVTFQgV0lOQVBJIFNldEFwcFN0YXJ0aW5nQ3Vyc29yKEhXTkQgdSwgRFdPUkQgdikKewlGSVhNRSgiaHduZD0lcCAweCUwNGx4IHN0dWJcbiIsdSx2ICk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSExvYWRPTEUJCQkJCVtTSEVMTDMyLjE1MV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNITG9hZE9MRShMUEFSQU0gbFBhcmFtKQp7CUZJWE1FKCIweCUwNGx4IHN0dWJcbiIsbFBhcmFtKTsKCXJldHVybiBTX09LOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERyaXZlVHlwZQkJCQkJW1NIRUxMMzIuNjRdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEcml2ZVR5cGUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBYm9ydEludm9rZUNvbW1hbmQJCQkJW1NIRUxMMzIuMTk4XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hBYm9ydEludm9rZUNvbW1hbmQodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSE91dE9mTWVtb3J5TWVzc2FnZUJveAkJCVtTSEVMTDMyLjEyNl0KICoKICovCmludCBXSU5BUEkgU0hPdXRPZk1lbW9yeU1lc3NhZ2VCb3goCglIV05EIGh3bmRPd25lciwKCUxQQ1NUUiBscENhcHRpb24sCglVSU5UIHVUeXBlKQp7CglGSVhNRSgiJXAgJXMgMHglMDh4IHN0dWJcbiIsaHduZE93bmVyLCBscENhcHRpb24sIHVUeXBlKTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIRmx1c2hDbGlwYm9hcmQJCQkJW1NIRUxMMzIuMTIxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hGbHVzaENsaXBib2FyZCh2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFdhaXRGb3JGaWxlVG9PcGVuCQkJCVtTSEVMTDMyLjk3XQogKgogKi8KQk9PTCBXSU5BUEkgU0hXYWl0Rm9yRmlsZVRvT3BlbigKCUxQQ0lURU1JRExJU1QgcGlkbCwKCURXT1JEIGR3RmxhZ3MsCglEV09SRCBkd1RpbWVvdXQpCnsKCUZJWE1FKCIlcCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIiwgcGlkbCwgZHdGbGFncywgZHdUaW1lb3V0KTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCUAJCQkJW1NIRUxMMzIuNjU0XQogKgogKiBOT1RFUzogZmlyc3QgcGFyYW1ldGVyIHNlZW1zIHRvIGJlIGEgcG9pbnRlciAoc2FtZSBhcyBwYXNzZWQgdG8gV3JpdGVDYWJpbmV0U3RhdGUpCiAqIHNlY29uZCBvbmUgY291bGQgYmUgYSBzaXplICgweDBjKS4gVGhlIHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIHN0cnVjdHVyZSBzYXZlZCB0bwogKiBIQ1VcU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cRXhwbG9yZXJcQ2FiaW5ldFN0YXRlCiAqIEknbSAoanMpIGd1ZXNzaW5nOiB0aGlzIG9uZSBpcyBqdXN0IFJlYWRDYWJpbmV0U3RhdGUgOy0pCiAqLwpIUkVTVUxUIFdJTkFQSSBzaGVsbDMyXzY1NCAoQ0FCSU5FVFNUQVRFICpjcywgaW50IGxlbmd0aCkKewoJVFJBQ0UoIiVwICVkXG4iLGNzLGxlbmd0aCk7CglyZXR1cm4gUmVhZENhYmluZXRTdGF0ZShjcyxsZW5ndGgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVJMQnVpbGRMaXN0T2ZQYXRocwkJCVtTSEVMTDMyLjE0Nl0KICoKICogTk9URVMKICogICBidWlsZHMgYSBEUEEKICovCkRXT1JEIFdJTkFQSSBSTEJ1aWxkTGlzdE9mUGF0aHMgKHZvaWQpCnsJRklYTUUoInN0dWJcbiIpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglTSFZhbGlkYXRlVU5DCQkJCVtTSEVMTDMyLjE3M10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIVmFsaWRhdGVVTkMgKERXT1JEIHgsIERXT1JEIHksIERXT1JEIHopCnsKCUZJWE1FKCIweCUwOGx4IDB4JTA4bHggMHglMDhseCBzdHViXG4iLHgseSx6KTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCURvRW52aXJvbm1lbnRTdWJzdEEJCQlbU0hFTEwzMi5AXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRG9FbnZpcm9ubWVudFN1YnN0QShMUFNUUiB4LCBMUFNUUiB5KQp7CglGSVhNRSgiKCVzLCAlcykgc3R1YlxuIiwgZGVidWdzdHJfYSh4KSwgZGVidWdzdHJfYSh5KSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglEb0Vudmlyb25tZW50U3Vic3RXCQkJW1NIRUxMMzIuQF0KICoKICovCkhSRVNVTFQgV0lOQVBJIERvRW52aXJvbm1lbnRTdWJzdFcoTFBXU1RSIHgsIExQV1NUUiB5KQp7CglGSVhNRSgiKCVzLCAlcyk6IHN0dWJcbiIsIGRlYnVnc3RyX3coeCksIGRlYnVnc3RyX3coeSkpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRG9FbnZpcm9ubWVudFN1YnN0CQkJW1NIRUxMMzIuNTNdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBEb0Vudmlyb25tZW50U3Vic3RBVyhMUFZPSUQgeCwgTFBWT0lEIHkpCnsKCWlmIChTSEVMTF9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gRG9FbnZpcm9ubWVudFN1YnN0Vyh4LCB5KTsKCXJldHVybiBEb0Vudmlyb25tZW50U3Vic3RBKHgsIHkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTSEVMTDMyLjI0M10KICoKICogV2luOTgrIGJ5LW9yZGluYWwgcm91dGluZS4gIEluIFdpbjk4IHRoaXMgcm91dGluZSByZXR1cm5zIHplcm8gYW5kCiAqIGRvZXMgbm90aGluZyBlbHNlLiAgUG9zc2libHkgdGhpcyBkb2VzIHNvbWV0aGluZyBpbiBOVCBvciBTSEVMTDMyIDUuMD8KICoKICovCgpCT09MIFdJTkFQSSBzaGVsbDMyXzI0MyhEV09SRCBhLCBEV09SRCBiKQp7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NIRUxMMzIuNzE0XQogKi8KRFdPUkQgV0lOQVBJIFNIRUxMMzJfNzE0KExQVk9JRCB4KQp7CiAJRklYTUUoIiglcylzdHViXG4iLCBkZWJ1Z3N0cl93KHgpKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNIQWRkRnJvbVByb3BTaGVldEV4dEFycmF5CVtTSEVMTDMyLjE2N10KICovCkRXT1JEIFdJTkFQSSBTSEFkZEZyb21Qcm9wU2hlZXRFeHRBcnJheShEV09SRCBhLCBEV09SRCBiLCBEV09SRCBjKQp7CiAJRklYTUUoIiglMDhseCwlMDhseCwlMDhseClzdHViXG4iLCBhLCBiLCBjKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNIQ3JlYXRlUHJvcFNoZWV0RXh0QXJyYXkJW1NIRUxMMzIuMTY4XQogKi8KRFdPUkQgV0lOQVBJIFNIQ3JlYXRlUHJvcFNoZWV0RXh0QXJyYXkoRFdPUkQgYSwgTFBDU1RSIGIsIERXT1JEIGMpCnsKIAlGSVhNRSgiKCUwOGx4LCVzLCUwOGx4KXN0dWJcbiIsIGEsIGRlYnVnc3RyX2EoYiksIGMpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hSZXBsYWNlRnJvbVByb3BTaGVldEV4dEFycmF5CVtTSEVMTDMyLjE3MF0KICovCkRXT1JEIFdJTkFQSSBTSFJlcGxhY2VGcm9tUHJvcFNoZWV0RXh0QXJyYXkoRFdPUkQgYSwgRFdPUkQgYiwgRFdPUkQgYywgRFdPUkQgZCkKewogCUZJWE1FKCIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgpc3R1YlxuIiwgYSwgYiwgYywgZCk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSERlc3Ryb3lQcm9wU2hlZXRFeHRBcnJheQlbU0hFTEwzMi4xNjldCiAqLwpEV09SRCBXSU5BUEkgU0hEZXN0cm95UHJvcFNoZWV0RXh0QXJyYXkoRFdPUkQgYSkKewogCUZJWE1FKCIoJTA4bHgpc3R1YlxuIiwgYSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBDSURMRGF0YV9DcmVhdGVGcm9tSURBcnJheQlbU0hFTEwzMi44M10KICoKICogIENyZWF0ZSBJRGF0YU9iamVjdCBmcm9tIFBJRExzPz8KICovCkhSRVNVTFQgV0lOQVBJIENJRExEYXRhX0NyZWF0ZUZyb21JREFycmF5KAoJTFBDSVRFTUlETElTVCBwaWRsRm9sZGVyLAoJRFdPUkQgY3BpZGxGaWxlcywKCUxQQ0lURU1JRExJU1QgKmxwcGlkbEZpbGVzLAoJTFBEQVRBT0JKRUNUICpwcGRhdGFPYmplY3QpCnsKICAgIFVJTlQgaTsKICAgIEhXTkQgaHduZCA9IDA7ICAgLypGSVhNRTogd2hvIHNob3VsZCBiZSBod25kIG9mIG93bmVyPyBzZXQgdG8gZGVza3RvcCAqLwoKICAgIFRSQUNFKCIoJXAsICVsZCwgJXAsICVwKVxuIiwgcGlkbEZvbGRlciwgY3BpZGxGaWxlcywgbHBwaWRsRmlsZXMsIHBwZGF0YU9iamVjdCk7CiAgICBpZiAoVFJBQ0VfT04ocGlkbCkpCiAgICB7CglwZHVtcCAocGlkbEZvbGRlcik7Cglmb3IgKGk9MDsgaTxjcGlkbEZpbGVzOyBpKyspIHBkdW1wIChscHBpZGxGaWxlc1tpXSk7CiAgICB9CiAgICAqcHBkYXRhT2JqZWN0ID0gSURhdGFPYmplY3RfQ29uc3RydWN0b3IoIGh3bmQsIHBpZGxGb2xkZXIsCgkJCQkJICAgICBscHBpZGxGaWxlcywgY3BpZGxGaWxlcyk7CiAgICBpZiAoKnBwZGF0YU9iamVjdCkgcmV0dXJuIFNfT0s7CiAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVTdGRFbnVtRm10RXRjCQkJW1NIRUxMMzIuNzRdCiAqCiAqIE5PVEVTCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSENyZWF0ZVN0ZEVudW1GbXRFdGMoCglEV09SRCBjRm9ybWF0cywKCWNvbnN0IEZPUk1BVEVUQyAqbHBGb3JtYXRzLAoJTFBFTlVNRk9STUFURVRDICpwcGVudW1Gb3JtYXRldGMpCnsKCUlFbnVtRk9STUFURVRDICpwZWY7CglIUkVTVUxUIGhSZXM7CglUUkFDRSgiY2Y9JWxkIGZlPSVwIHBlZj0lcFxuIiwgY0Zvcm1hdHMsIGxwRm9ybWF0cywgcHBlbnVtRm9ybWF0ZXRjKTsKCglwZWYgPSBJRW51bUZPUk1BVEVUQ19Db25zdHJ1Y3RvcihjRm9ybWF0cywgbHBGb3JtYXRzKTsKCWlmICghcGVmKQoJICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKCglJRW51bUZPUk1BVEVUQ19BZGRSZWYocGVmKTsKCWhSZXMgPSBJRW51bUZPUk1BVEVUQ19RdWVyeUludGVyZmFjZShwZWYsICZJSURfSUVudW1GT1JNQVRFVEMsIChMUFZPSUQqKXBwZW51bUZvcm1hdGV0Yyk7CglJRW51bUZPUk1BVEVUQ19SZWxlYXNlKHBlZik7CgoJcmV0dXJuIGhSZXM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU0hFTEwzMl8yNTYgKFNIRUxMMzIuMjU2KQogKi8KSFJFU1VMVCBXSU5BUEkgU0hFTEwzMl8yNTYoTFBEV09SRCBscGR3MCwgTFBEV09SRCBscGR3MSkKewogICAgSFJFU1VMVCByZXQgPSBTX09LOwoKICAgIEZJWE1FKCJzdHViICVwIDB4JTA4bHggJXBcbiIsIGxwZHcwLCBscGR3MCA/ICpscGR3MCA6IDAsIGxwZHcxKTsKCiAgICBpZiAoIWxwZHcwIHx8ICpscGR3MCAhPSAweDEwKQogICAgICAgIHJldCA9IEVfSU5WQUxJREFSRzsKICAgIGVsc2UKICAgIHsKICAgICAgICBMUFZPSUQgbHBkYXRhID0gMDsvKkxvY2FsQWxsb2MoR01FTV9aRVJPSU5JVCwgMHg0RTQpOyovCgoJaWYgKCFscGRhdGEpCiAgICAgICAgICAgIHJldCA9IEVfT1VUT0ZNRU1PUlk7CgllbHNlCgl7CiAgICAgICAgICAgIC8qIEluaXRpYWxpemUgYW5kIHJldHVybiB1bmtub3duIGxwZGF0YSBzdHJ1Y3R1cmUgKi8KCX0KICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU0hGaW5kRmlsZXMgKFNIRUxMMzIuOTApCiAqLwpCT09MIFdJTkFQSSBTSEZpbmRGaWxlcyggTFBDSVRFTUlETElTVCBwaWRsRm9sZGVyLCBMUENJVEVNSURMSVNUIHBpZGxTYXZlRmlsZSApCnsKICAgIEZJWE1FKCIlcCAlcFxuIiwgcGlkbEZvbGRlciwgcGlkbFNhdmVGaWxlICk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTSFVwZGF0ZUltYWdlVyAoU0hFTEwzMi4xOTIpCiAqCiAqIE5vdGlmaWVzIHRoZSBzaGVsbCB0aGF0IGFuIGljb24gaW4gdGhlIHN5c3RlbSBpbWFnZSBsaXN0IGhhcyBiZWVuIGNoYW5nZWQuCiAqCiAqIFBBUkFNUwogKiAgcHN6SGFzaEl0ZW0gW0ldIFBhdGggdG8gZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBpY29uLgogKiAgaUluZGV4ICAgICAgW0ldIFplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGljb24gaW4gdGhlIGZpbGUuCiAqICB1RmxhZ3MgICAgICBbSV0gRmxhZ3MgZGV0ZXJtaW5pbmcgdGhlIGljb24gYXR0cmlidXRlcy4gU2VlIG5vdGVzLgogKiAgaUltYWdlSW5kZXggW0ldIEluZGV4IG9mIHRoZSBpY29uIGluIHRoZSBzeXN0ZW0gaW1hZ2UgbGlzdC4KICoKICogTk9URVMKICogIHVGbGFncyBjYW4gYmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKICogIEdJTF9OT1RGSUxFTkFNRSAtIHBzekhhc2hJdGVtIGlzIG5vdCBhIGZpbGUgbmFtZS4KICogIEdJTF9TSU1VTEFURURPQyAtIENyZWF0ZSBhIGRvY3VtZW50IGljb24gdXNpbmcgdGhlIHNwZWNpZmllZCBpY29uLgogKi8Kdm9pZCBXSU5BUEkgU0hVcGRhdGVJbWFnZVcoTFBDV1NUUiBwc3pIYXNoSXRlbSwgaW50IGlJbmRleCwgVUlOVCB1RmxhZ3MsIGludCBpSW1hZ2VJbmRleCkKewogICAgRklYTUUoIiVzLCAlZCwgMHgleCwgJWRcbiIsIGRlYnVnc3RyX3cocHN6SGFzaEl0ZW0pLCBpSW5kZXgsIHVGbGFncywgaUltYWdlSW5kZXgpOwp9Cg==