LyoKICogVGhlIHBhcmFtZXRlcnMgb2YgbWFueSBmdW5jdGlvbnMgY2hhbmdlcyBiZXR3ZWVuIGRpZmZlcmVudCBPUyB2ZXJzaW9ucwogKiAoTlQgdXNlcyBVbmljb2RlIHN0cmluZ3MsIDk1IHVzZXMgQVNDSUkgc3RyaW5ncykKICogCiAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogKiAgICAgICAgICAgMTk5OCBK/HJnZW4gU2NobWllZAogKi8KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW52ZXJzaW9uLmgiCiNpbmNsdWRlICJoZWFwLmgiCgojaW5jbHVkZSAic2hlbGxhcGkuaCIKI2luY2x1ZGUgInNobG9iai5oIgojaW5jbHVkZSAic2hlbGwzMl9tYWluLmgiCiNpbmNsdWRlICJ3aW5lL3VuZG9jc2hlbGwuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChzaGVsbCkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIJCQlbU0hFTEwzMi4yXQogKgogKiBOT1RFUwogKiAgIElkbGlzdCBpcyBhbiBhcnJheSBvZiBzdHJ1Y3R1cmVzIGFuZCBDb3VudCBzcGVjaWZpZXMgaG93IG1hbnkgaXRlbXMgaW4gdGhlIGFycmF5CiAqICAgKHVzdWFsbHkganVzdCBvbmUgSSB0aGluaykuCiAqLwpEV09SRCBXSU5BUEkKU0hDaGFuZ2VOb3RpZnlSZWdpc3RlcigKICAgIEhXTkQgaHduZCwKICAgIExPTkcgZXZlbnRzMSwKICAgIExPTkcgZXZlbnRzMiwKICAgIERXT1JEIG1zZywKICAgIGludCBjb3VudCwKICAgIElEU1RSVUNUICppZGxpc3QpCnsJRklYTUUoIigweCUwNHgsMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDh4LCVwKTpzdHViLlxuIiwKCQlod25kLGV2ZW50czEsZXZlbnRzMixtc2csY291bnQsaWRsaXN0KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlcgkJCVtTSEVMTDMyLjRdCiAqLwpEV09SRCBXSU5BUEkKU0hDaGFuZ2VOb3RpZnlEZXJlZ2lzdGVyKExPTkcgeDEpCnsJRklYTUUoIigweCUwOGx4KTpzdHViLlxuIix4MSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOVFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIJCQlbU0hFTEwzMi42NDBdCiAqIE5PVEVTCiAqICAgSWRsaXN0IGlzIGFuIGFycmF5IG9mIHN0cnVjdHVyZXMgYW5kIENvdW50IHNwZWNpZmllcyBob3cgbWFueSBpdGVtcyBpbiB0aGUgYXJyYXkKICogICAodXN1YWxseSBqdXN0IG9uZSBJIHRoaW5rKS4KICovCkRXT1JEIFdJTkFQSSBOVFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIoCiAgICBIV05EIGh3bmQsCiAgICBMT05HIGV2ZW50czEsCiAgICBMT05HIGV2ZW50czIsCiAgICBEV09SRCBtc2csCiAgICBpbnQgY291bnQsCiAgICBJRFNUUlVDVCAqaWRsaXN0KQp7CUZJWE1FKCIoMHglMDR4LDB4JTA4bHgsMHglMDhseCwweCUwOGx4LDB4JTA4eCwlcCk6c3R1Yi5cbiIsCgkJaHduZCxldmVudHMxLGV2ZW50czIsbXNnLGNvdW50LGlkbGlzdCk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOVFNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlcgkJCVtTSEVMTDMyLjY0MV0KICovCkRXT1JEIFdJTkFQSSBOVFNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlcihMT05HIHgxKQp7CUZJWE1FKCIoMHglMDhseCk6c3R1Yi5cbiIseDEpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBhcnNlRmllbGQJCQkJCVtTSEVMTDMyLjU4XQogKgogKi8KRFdPUkQgV0lOQVBJIFBhcnNlRmllbGRBKExQQ1NUUiBzcmMsIERXT1JEIGZpZWxkLCBMUFNUUiBkc3QsIERXT1JEIGxlbikgCnsJV0FSTigiKCclcycsMHglMDhseCwlcCwlbGQpIHNlbWktc3R1Yi5cbiIsc3JjLGZpZWxkLGRzdCxsZW4pOwoKCWlmICghc3JjIHx8ICFzcmNbMF0gfHwgIWRzdCB8fCAhbGVuKQoJICByZXR1cm4gMDsKCglpZiAoZmllbGQgPjEpCgl7IGZpZWxkLS07CQoJICB3aGlsZSAoZmllbGQpCgkgIHsgaWYgKCpzcmM9PTB4MCkgcmV0dXJuIEZBTFNFOwoJICAgIGlmICgqc3JjPT0nLCcpIGZpZWxkLS07CgkgICAgc3JjKys7CgkgIH0KCX0KCgl3aGlsZSAoKnNyYyE9MHgwMCAmJiAqc3JjIT0nLCcgJiYgbGVuPjApIAoJeyAqZHN0PSpzcmM7IGRzdCsrLCBzcmMrKzsgbGVuLS07Cgl9CgkqZHN0PTB4MDsKCQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBpY2tJY29uRGxnCQkJCQlbU0hFTEwzMi42Ml0KICogCiAqLwpEV09SRCBXSU5BUEkgUGlja0ljb25EbGcoRFdPUkQgeCxEV09SRCB5LERXT1JEIHosRFdPUkQgYSkgCnsJRklYTUUoIiglMDhseCwlMDhseCwlMDhseCwlMDhseCk6c3R1Yi5cbiIseCx5LHosYSk7CglyZXR1cm4gMHhmZmZmZmZmZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR2V0RmlsZU5hbWVGcm9tQnJvd3NlCQkJW1NIRUxMMzIuNjNdCiAqIAogKi8KRFdPUkQgV0lOQVBJIEdldEZpbGVOYW1lRnJvbUJyb3dzZShIV05EIGhvd25lciwgTFBTVFIgdGFyZ2V0YnVmLCBEV09SRCBsZW4sIERXT1JEIHgsIExQQ1NUUiBzdWZmaXgsIExQQ1NUUiB5LCBMUENTVFIgY21kKSAKewlGSVhNRSgiKCUwNHgsJXAsJWxkLCUwOGx4LCVzLCVzLCVzKTpzdHViLlxuIiwKCSAgICBob3duZXIsdGFyZ2V0YnVmLGxlbix4LHN1ZmZpeCx5LGNtZCk7CiAgICAvKiBwdXRzIHVwIGEgT3BlbiBEaWFsb2cgYW5kIHJlcXVlc3RzIGlucHV0IGludG8gdGFyZ2V0YnVmICovCiAgICAvKiBPRk5fSElERVJFQURPTkxZfE9GTl9OT0NIQU5HRURJUnxPRk5fRklMRU1VU1RFWElTVHxPRk5fdW5rbm93biAqLwogICAgbHN0cmNweUEodGFyZ2V0YnVmLCJ4OlxcZHVtbXkuZXhlIik7CiAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hHZXRTZXR0aW5ncwkJCQlbU0hFTEwzMi42OF0KICogCiAqIE5PVEVTCiAqICB0aGUgcmVnaXN0cnkgcGF0aCBhcmUgZm9yIHdpbjk4ICh0ZXN0ZWQpCiAqICBhbmQgcG9zc2libHkgYXJlIHRoZSBzYW1lIGluIG50NDAKICovCnZvaWQgV0lOQVBJIFNIR2V0U2V0dGluZ3MoTFBTSEVMTEZMQUdTVEFURSBscHNmcywgRFdPUkQgZHdNYXNrLCBEV09SRCBkd3gpCnsKCUhLRVkJaEtleTsKCURXT1JECWR3RGF0YTsKCURXT1JECWR3RGF0YVNpemUgPSBzaXplb2YgKERXT1JEKTsKCglUUkFDRSgiKCVwIDB4JTA4bHggMHglMDhseClcbiIsbHBzZnMsZHdNYXNrLCBkd3gpOwoJCglpZiAoUmVnQ3JlYXRlS2V5RXhBKEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEV4cGxvcmVyXFxBZHZhbmNlZCIsCgkJCQkgMCwgMCwgMCwgS0VZX0FMTF9BQ0NFU1MsIDAsICZoS2V5LCAwKSkKCSAgcmV0dXJuOwoJCglpZiAoIChTU0ZfU0hPV0VYVEVOU0lPTlMgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJIaWRlRmlsZUV4dCIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZlNob3dFeHRlbnNpb25zICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoIChTU0ZfU0hPV0lORk9USVAgJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJTaG93SW5mb1RpcCIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZlNob3dJbmZvVGlwICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoIChTU0ZfRE9OVFBSRVRUWVBBVEggJiBkd01hc2spICYmICFSZWdRdWVyeVZhbHVlRXhBKGhLZXksICJEb250UHJldHR5UGF0aCIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJICBscHNmcy0+ZkRvbnRQcmV0dHlQYXRoICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoIChTU0ZfSElERUlDT05TICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiSGlkZUljb25zIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mSGlkZUljb25zICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoIChTU0ZfTUFQTkVURFJWQlVUVE9OICYgZHdNYXNrKSAmJiAhUmVnUXVlcnlWYWx1ZUV4QShoS2V5LCAiTWFwTmV0RHJ2QnRuIiwgMCwgMCwgKExQQllURSkmZHdEYXRhLCAmZHdEYXRhU2l6ZSkpCgkgIGxwc2ZzLT5mTWFwTmV0RHJ2QnRuICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoIChTU0ZfU0hPV0FUVFJJQkNPTCAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIlNob3dBdHRyaWJDb2wiLCAwLCAwLCAoTFBCWVRFKSZkd0RhdGEsICZkd0RhdGFTaXplKSkKCSAgbHBzZnMtPmZTaG93QXR0cmliQ29sICA9ICgoZHdEYXRhID09IDApID8gIDAgOiAxKTsKCglpZiAoKChTU0ZfU0hPV0FMTE9CSkVDVFMgfCBTU0ZfU0hPV1NZU0ZJTEVTKSAmIGR3TWFzaykgJiYgIVJlZ1F1ZXJ5VmFsdWVFeEEoaEtleSwgIkhpZGRlbiIsIDAsIDAsIChMUEJZVEUpJmR3RGF0YSwgJmR3RGF0YVNpemUpKQoJeyBpZiAoZHdEYXRhID09IDApCgkgIHsgaWYgKFNTRl9TSE9XQUxMT0JKRUNUUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93QWxsT2JqZWN0cyAgPSAwOwoJICAgIGlmIChTU0ZfU0hPV1NZU0ZJTEVTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dTeXNGaWxlcyAgPSAwOwoJICB9CgkgIGVsc2UgaWYgKGR3RGF0YSA9PSAxKQoJICB7IGlmIChTU0ZfU0hPV0FMTE9CSkVDVFMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd0FsbE9iamVjdHMgID0gMTsKCSAgICBpZiAoU1NGX1NIT1dTWVNGSUxFUyAmIGR3TWFzaykJbHBzZnMtPmZTaG93U3lzRmlsZXMgID0gMDsKCSAgfQoJICBlbHNlIGlmIChkd0RhdGEgPT0gMikKCSAgeyBpZiAoU1NGX1NIT1dBTExPQkpFQ1RTICYgZHdNYXNrKQlscHNmcy0+ZlNob3dBbGxPYmplY3RzICA9IDA7CgkgICAgaWYgKFNTRl9TSE9XU1lTRklMRVMgJiBkd01hc2spCWxwc2ZzLT5mU2hvd1N5c0ZpbGVzICA9IDE7CgkgIH0KCX0KCVJlZ0Nsb3NlS2V5IChoS2V5KTsKCglUUkFDRSgiLS0gMHglMDR4XG4iLCAqKFdPUkQqKWxwc2ZzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZQkJCVtTSEVMTDMyLjczXQogKgogKiBQQVJBTUVURVJTCiAqICBod25kQ2FiaW5ldCBkZWZpbmVzIHRoZSBleHBsb3JlciBjYWJpbmV0IHdpbmRvdyB0aGF0IGNvbnRhaW5zIHRoZSAKICogICAgICAgICAgICAgIHNoZWxsdmlldyB5b3UgbmVlZCB0byBjb21tdW5pY2F0ZSB3aXRoCiAqICB1TXNnICAgICAgICBpZGVudGlmeWluZyB0aGUgU0ZWTSBlbnVtIHRvIHBlcmZvcm0KICogIGxQYXJhbQogKgogKiBOT1RFUwogKiAgTWVzc2FnZSBTRlZNX1JFQVJSQU5HRSA9IDEKICogICAgVGhpcyBtZXNzYWdlIGdldHMgc2VudCB3aGVuIGEgY29sdW1uIGdldHMgY2xpY2tlZCB0byBpbnN0cnVjdCB0aGUKICogICAgc2hlbGwgdmlldyB0byByZS1zb3J0IHRoZSBpdGVtIGxpc3QuIGxQYXJhbSBpZGVudGlmaWVzIHRoZSBjb2x1bW4KICogICAgdGhhdCB3YXMgY2xpY2tlZC4KICovCmludCBXSU5BUEkgU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZShIV05EIGh3bmRDYWJpbmV0LFVJTlQgdU1zZyxMUEFSQU0gbFBhcmFtKQp7IEZJWE1FKCIlMDR4ICUwOHV4ICUwOGx4IHN0dWJcbiIsaHduZENhYmluZXQsdU1zZyxsUGFyYW0pOwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPbGVTdHJUb1N0ck4JCQkJCVtTSEVMTDMyLjc4XQogKi8KQk9PTCBXSU5BUEkgT2xlU3RyVG9TdHJOQSAoTFBTVFIgbHBTdHIsIElOVCBuU3RyLCBMUENXU1RSIGxwT2xlLCBJTlQgbk9sZSkgCnsKCVRSQUNFKCIlcCAleCAlcyAleFxuIiwgbHBTdHIsIG5TdHIsIGRlYnVnc3RyX3cobHBPbGUpLCBuT2xlKTsKCXJldHVybiBXaWRlQ2hhclRvTXVsdGlCeXRlICgwLCAwLCBscE9sZSwgbk9sZSwgbHBTdHIsIG5TdHIsIE5VTEwsIE5VTEwpOwp9CgpCT09MIFdJTkFQSSBPbGVTdHJUb1N0ck5XIChMUFdTVFIgbHB3U3RyLCBJTlQgbndTdHIsIExQQ1dTVFIgbHBPbGUsIElOVCBuT2xlKSAKewoJVFJBQ0UoIiVwICV4ICVzICV4XG4iLCBscHdTdHIsIG53U3RyLCBkZWJ1Z3N0cl93KGxwT2xlKSwgbk9sZSk7CgoJaWYgKGxzdHJjcHluVyAoIGxwd1N0ciwgbHBPbGUsIG53U3RyKSkKCXsgcmV0dXJuIGxzdHJsZW5XIChscHdTdHIpOwoJfQoJcmV0dXJuIDA7Cn0KCkJPT0wgV0lOQVBJIE9sZVN0clRvU3RyTkFXIChMUFZPSUQgbHBPdXQsIElOVCBuT3V0LCBMUENWT0lEIGxwSW4sIElOVCBuSW4pIAp7CglpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gT2xlU3RyVG9TdHJOVyAobHBPdXQsIG5PdXQsIGxwSW4sIG5Jbik7CglyZXR1cm4gT2xlU3RyVG9TdHJOQSAobHBPdXQsIG5PdXQsIGxwSW4sIG5Jbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0clRvT2xlU3RyTgkJCQkJW1NIRUxMMzIuNzldCiAqICBscE11bHRpLCBuTXVsdGksIG5XaWRlIFtJTl0KICogIGxwV2lkZSBbT1VUXQogKi8KQk9PTCBXSU5BUEkgU3RyVG9PbGVTdHJOQSAoTFBXU1RSIGxwV2lkZSwgSU5UIG5XaWRlLCBMUENTVFIgbHBTdHJBLCBJTlQgblN0cikgCnsKCVRSQUNFKCIlcCAleCAlcyAleFxuIiwgbHBXaWRlLCBuV2lkZSwgbHBTdHJBLCBuU3RyKTsKCXJldHVybiBNdWx0aUJ5dGVUb1dpZGVDaGFyICgwLCAwLCBscFN0ckEsIG5TdHIsIGxwV2lkZSwgbldpZGUpOwp9CkJPT0wgV0lOQVBJIFN0clRvT2xlU3RyTlcgKExQV1NUUiBscFdpZGUsIElOVCBuV2lkZSwgTFBDV1NUUiBscFN0clcsIElOVCBuU3RyKSAKewoJVFJBQ0UoIiVwICV4ICVzICV4XG4iLCBscFdpZGUsIG5XaWRlLCBkZWJ1Z3N0cl93KGxwU3RyVyksIG5TdHIpOwoKCWlmIChsc3RyY3B5blcgKGxwV2lkZSwgbHBTdHJXLCBuV2lkZSkpCgl7IHJldHVybiBsc3RybGVuVyAobHBXaWRlKTsKCX0KCXJldHVybiAwOwp9CgpCT09MIFdJTkFQSSBTdHJUb09sZVN0ck5BVyAoTFBXU1RSIGxwV2lkZSwgSU5UIG5XaWRlLCBMUENWT0lEIGxwU3RyLCBJTlQgblN0cikgCnsKCWlmIChWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBTdHJUb09sZVN0ck5XIChscFdpZGUsIG5XaWRlLCBscFN0ciwgblN0cik7CglyZXR1cm4gU3RyVG9PbGVTdHJOQSAobHBXaWRlLCBuV2lkZSwgbHBTdHIsIG5TdHIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZWdpc3RlclNoZWxsSG9vawkJCQlbU0hFTEwzMi4xODFdCiAqCiAqIFBBUkFNUwogKiAgICAgIGh3bmQgW0ldICB3aW5kb3cgaGFuZGxlCiAqICAgICAgeSAgICBbSV0gIGZsYWcgPz8/PwogKiAKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCnZvaWQgV0lOQVBJIFJlZ2lzdGVyU2hlbGxIb29rKEhXTkQgaHduZCwgRFdPUkQgeSkgewogICAgRklYTUUoIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsaHduZCx5KTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hXCQkJCVtTSEVMTDMyLjE4Ml0KICoKICogRm9ybWF0IGFuZCBvdXRwdXQgZXJyb3JtZXNzYWdlLgogKgogKiBpZFRleHQJcmVzb3VyY2UgSUQgb2YgdGl0bGUgb3IgTFBTVFIKICogaWRUaXRsZQlyZXNvdXJjZSBJRCBvZiB0aXRsZSBvciBMUFNUUgogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KSU5UIF9fY2RlY2wKU2hlbGxNZXNzYWdlQm94VyhITU9EVUxFIGhtb2QsSFdORCBod25kLERXT1JEIGlkVGV4dCxEV09SRCBpZFRpdGxlLERXT1JEIHVUeXBlLExQQ1ZPSUQgYXJnbGlzdCkgCnsJV0NIQVIJc3pUZXh0WzEwMF0sc3pUaXRsZVsxMDBdLHN6VGVtcFsyNTZdOwoJTFBXU1RSICAgcHN6VGV4dCA9ICZzelRleHRbMF0sIHBzelRpdGxlID0gJnN6VGl0bGVbMF07CglMUFZPSUQJYXJncyA9ICZhcmdsaXN0OwoKCVRSQUNFKCIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJXApXG4iLChEV09SRClobW9kLChEV09SRClod25kLGlkVGV4dCxpZFRpdGxlLHVUeXBlLGFyZ2xpc3QpOwoKCWlmICghSElXT1JEIChpZFRpdGxlKSkKCSAgTG9hZFN0cmluZ1coaG1vZCxpZFRpdGxlLHBzelRpdGxlLDEwMCk7CgllbHNlCgkgIHBzelRpdGxlID0gKExQV1NUUilpZFRpdGxlOwoKCWlmICghIEhJV09SRCAoaWRUZXh0KSkKCSAgTG9hZFN0cmluZ1coaG1vZCxpZFRleHQscHN6VGV4dCwxMDApOwoJZWxzZQoJICBwc3pUZXh0ID0gKExQV1NUUilpZFRleHQ7CgoJRm9ybWF0TWVzc2FnZVcoRk9STUFUX01FU1NBR0VfRlJPTV9TVFJJTkcgfCBGT1JNQVRfTUVTU0FHRV9BUkdVTUVOVF9BUlJBWSAsc3pUZXh0LDAsMCxzelRlbXAsMjU2LGFyZ3MpOwoJcmV0dXJuIE1lc3NhZ2VCb3hXKGh3bmQsc3pUZW1wLHN6VGl0bGUsdVR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hBCQkJCVtTSEVMTDMyLjE4M10KICovCklOVCBfX2NkZWNsClNoZWxsTWVzc2FnZUJveEEoSE1PRFVMRSBobW9kLEhXTkQgaHduZCxEV09SRCBpZFRleHQsRFdPUkQgaWRUaXRsZSxEV09SRCB1VHlwZSxMUENWT0lEIGFyZ2xpc3QpIAp7CWNoYXIJc3pUZXh0WzEwMF0sc3pUaXRsZVsxMDBdLHN6VGVtcFsyNTZdOwoJTFBTVFIgICBwc3pUZXh0ID0gJnN6VGV4dFswXSwgcHN6VGl0bGUgPSAmc3pUaXRsZVswXTsKCUxQVk9JRAlhcmdzID0gJmFyZ2xpc3Q7CgoJVFJBQ0UoIiglMDhseCwlMDhseCwlMDhseCwlMDhseCwlMDhseCwlcClcbiIsIChEV09SRClobW9kLChEV09SRClod25kLGlkVGV4dCxpZFRpdGxlLHVUeXBlLGFyZ2xpc3QpOwoKCWlmICghSElXT1JEIChpZFRpdGxlKSkKCSAgTG9hZFN0cmluZ0EoaG1vZCxpZFRpdGxlLHBzelRpdGxlLDEwMCk7CgllbHNlCgkgIHBzelRpdGxlID0gKExQU1RSKWlkVGl0bGU7CgoJaWYgKCEgSElXT1JEIChpZFRleHQpKQoJICBMb2FkU3RyaW5nQShobW9kLGlkVGV4dCxwc3pUZXh0LDEwMCk7CgllbHNlCgkgIHBzelRleHQgPSAoTFBTVFIpaWRUZXh0OwoKCUZvcm1hdE1lc3NhZ2VBKEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HIHwgRk9STUFUX01FU1NBR0VfQVJHVU1FTlRfQVJSQVkgLHBzelRleHQsMCwwLHN6VGVtcCwyNTYsYXJncyk7CglyZXR1cm4gTWVzc2FnZUJveEEoaHduZCxzelRlbXAscHN6VGl0bGUsdVR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlc3RyaWN0ZWQJCQkJW1NIRUxMMzIuMTAwXQogKgogKiB3YWxrcyB0aHJvdWdoIHBvbGljeSB0YWJsZSwgcXVlcmllcyA8YXBwPiBrZXksIDx0eXBlPiB2YWx1ZSwgcmV0dXJucyAKICogcXVlcmllZCAoRFdPUkQpIHZhbHVlLgogKiB7MHgwMDAwMSxFeHBsb3JlcixOb1J1bn0KICogezB4MDAwMDIsRXhwbG9yZXIsTm9DbG9zZX0KICogezB4MDAwMDQsRXhwbG9yZXIsTm9TYXZlU2V0dGluZ3N9CiAqIHsweDAwMDA4LEV4cGxvcmVyLE5vRmlsZU1lbnV9CiAqIHsweDAwMDEwLEV4cGxvcmVyLE5vU2V0Rm9sZGVyc30KICogezB4MDAwMjAsRXhwbG9yZXIsTm9TZXRUYXNrYmFyfQogKiB7MHgwMDA0MCxFeHBsb3JlcixOb0Rlc2t0b3B9CiAqIHsweDAwMDgwLEV4cGxvcmVyLE5vRmluZH0KICogezB4MDAxMDAsRXhwbG9yZXIsTm9Ecml2ZXN9CiAqIHsweDAwMjAwLEV4cGxvcmVyLE5vRHJpdmVBdXRvUnVufQogKiB7MHgwMDQwMCxFeHBsb3JlcixOb0RyaXZlVHlwZUF1dG9SdW59CiAqIHsweDAwODAwLEV4cGxvcmVyLE5vTmV0SG9vZH0KICogezB4MDEwMDAsRXhwbG9yZXIsTm9TdGFydEJhbm5lcn0KICogezB4MDIwMDAsRXhwbG9yZXIsUmVzdHJpY3RSdW59CiAqIHsweDA0MDAwLEV4cGxvcmVyLE5vUHJpbnRlclRhYnN9CiAqIHsweDA4MDAwLEV4cGxvcmVyLE5vRGVsZXRlUHJpbnRlcn0KICogezB4MTAwMDAsRXhwbG9yZXIsTm9BZGRQcmludGVyfQogKiB7MHgyMDAwMCxFeHBsb3JlcixOb1N0YXJ0TWVudVN1YkZvbGRlcnN9CiAqIHsweDQwMDAwLEV4cGxvcmVyLE15RG9jc09uTmV0fQogKiB7MHg4MDAwMCxXaW5PbGRBcHAsTm9SZWFsTW9kZX0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSFJlc3RyaWN0ZWQgKERXT1JEIHBvbCkgewoJSEtFWQl4aGtleTsKCglGSVhNRSgiKCUwOGx4KTpzdHViLlxuIixwb2wpOwoJaWYgKFJlZ09wZW5LZXlBKEhLRVlfQ1VSUkVOVF9VU0VSLCJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcUG9saWNpZXMiLCZ4aGtleSkpCgkJcmV0dXJuIDA7CgkvKiBGSVhNRTogZG8gbm90aGluZyBmb3Igbm93LCBqdXN0IHJldHVybiAwICg9PSAiYWxsb3dlZCIpICovCglSZWdDbG9zZUtleSh4aGtleSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVEaXJlY3RvcnkJCQkJW1NIRUxMMzIuMTY1XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKiAgbm90IHN1cmUgYWJvdXQgTFBTRUNVUklUWV9BVFRSSUJVVEVTCiAqLwpEV09SRCBXSU5BUEkgU0hDcmVhdGVEaXJlY3RvcnkoTFBTRUNVUklUWV9BVFRSSUJVVEVTIHNlYyxMUENTVFIgcGF0aCkgewoJVFJBQ0UoIiglcCwlcyk6c3R1Yi5cbiIsc2VjLHBhdGgpOwoJaWYgKENyZWF0ZURpcmVjdG9yeUEocGF0aCxzZWMpKQoJCXJldHVybiBUUlVFOwoJLyogU0hDaGFuZ2VOb3RpZnkoOCwxLHBhdGgsMCk7ICovCglyZXR1cm4gRkFMU0U7CiNpZiAwCglpZiAoU0hFTEwzMl83OShwYXRoLChMUFZPSUQpeCkpCgkJcmV0dXJuIDA7CglGSVhNRSgiKCUwOGx4LCVzKTpzdHViLlxuIix4LHBhdGgpOwoJcmV0dXJuIDA7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWUJCQkJCVtTSEVMTDMyLjE5NV0KICoKICogTk9URVMKICogICAgIGZyZWVfcHRyKCkgLSBmcmVlcyBtZW1vcnkgdXNpbmcgSU1hbGxvYwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KLyojZGVmaW5lIE1FTV9ERUJVRyAxKi8KRFdPUkQgV0lOQVBJIFNIRnJlZShMUFZPSUQgeCkgCnsKI2lmZGVmIE1FTV9ERUJVRwoJV09SRCBsZW4gPSAqKExQV09SRCkoeC0yKTsKCglpZiAoICooTFBXT1JEKSh4K2xlbikgIT0gMHg3Mzg0KQoJICBFUlIoIk1BR0lDMiFcbiIpOwoKCWlmICggKCooTFBXT1JEKSh4LTQpKSAhPSAweDgyNzEpCgkgIEVSUigiTUFHSUMxIVxuIik7CgllbHNlCgkgIG1lbXNldCh4LTQsIDB4ZGUsIGxlbis2KTsKCglUUkFDRSgiJXAgbGVuPSV1XG4iLHgsIGxlbik7CgoJeCAtPSA0OwojZWxzZQoJVFJBQ0UoIiVwXG4iLHgpOwojZW5kaWYKCXJldHVybiBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBbGxvYwkJCQkJW1NIRUxMMzIuMTk2XQogKgogKiBOT1RFUwogKiAgICAgdm9pZCAqdGFza19hbGxvYyhEV09SRCBsZW4pLCB1c2VzIFNITWFsbG9jIGFsbG9jYXRvcgogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KTFBWT0lEIFdJTkFQSSBTSEFsbG9jKERXT1JEIGxlbikgCnsKCUxQQllURSByZXQ7CgojaWZkZWYgTUVNX0RFQlVHCglyZXQgPSAoTFBWT0lEKSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbis2KTsKI2Vsc2UKCXJldCA9IChMUFZPSUQpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKI2VuZGlmCgojaWZkZWYgTUVNX0RFQlVHCgkqKExQV09SRCkocmV0KSA9IDB4ODI3MTsKCSooTFBXT1JEKShyZXQrMikgPSAoV09SRClsZW47CgkqKExQV09SRCkocmV0KzQrbGVuKSA9IDB4NzM4NDsKCXJldCArPSA0OwoJbWVtc2V0KHJldCwgMHhkZiwgbGVuKTsKI2VuZGlmCglUUkFDRSgiJWx1IGJ5dGVzIGF0ICVwXG4iLGxlbiwgcmV0KTsKCXJldHVybiAoTFBWT0lEKXJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdpc3RlckRyYWdEcm9wCQkJCVtTSEVMTDMyLjg2XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIUmVnaXN0ZXJEcmFnRHJvcChIV05EIGhXbmQsSURyb3BUYXJnZXQgKiBwRHJvcFRhcmdldCkgCnsKCUZJWE1FKCIoMHglMDh4LCVwKTpzdHViLlxuIiwgaFduZCwgcERyb3BUYXJnZXQpOwoJcmV0dXJuICAgICBSZWdpc3RlckRyYWdEcm9wKGhXbmQsIHBEcm9wVGFyZ2V0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZXZva2VEcmFnRHJvcAkJCQlbU0hFTEwzMi44N10KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSFJldm9rZURyYWdEcm9wKERXT1JEIHgpIHsKICAgIEZJWE1FKCIoMHglMDhseCk6c3R1Yi5cbiIseCk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hEb0RyYWdEcm9wCQkJCQlbU0hFTEwzMi44OF0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSERvRHJhZ0Ryb3AoRFdPUkQgdSwgRFdPUkQgdiwgRFdPUkQgdywgRFdPUkQgeCwgRFdPUkQgeSwgRFdPUkQgeikgewogICAgRklYTUUoIigweCUwOGx4IDB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggMHglMDhseCk6c3R1Yi5cbiIsdSx2LHcseCx5LHopOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJ1bkZpbGVEbGcJCQkJCVtTSEVMTDMyLjYxXQogKgogKiBOT1RFUwogKiAgICAgT3JpZ2luYWwgbmFtZTogUnVuRmlsZURsZyAoZXhwb3J0ZWQgYnkgb3JkaW5hbCkKICovCkRXT1JEIFdJTkFQSQpSdW5GaWxlRGxnIChIV05EIGh3bmRPd25lciwgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLAoJICAgIExQU1RSIGxwc3pUaXRsZSwgTFBTVFIgbHBzelByb21wdCwgVUlOVCB1RmxhZ3MpCnsKICAgIEZJWE1FKCIoMHglMDh4IDB4JWx4IDB4JWx4IFwiJXNcIiBcIiVzXCIgMHgleCk6c3R1Yi5cbiIsCgkgICBod25kT3duZXIsIGR3UGFyYW0xLCBkd1BhcmFtMiwgbHBzelRpdGxlLCBscHN6UHJvbXB0LCB1RmxhZ3MpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEV4aXRXaW5kb3dzRGlhbG9nCQkJCVtTSEVMTDMyLjYwXQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8Kdm9pZCBXSU5BUEkgRXhpdFdpbmRvd3NEaWFsb2cgKEhXTkQgaFduZE93bmVyKQp7CglUUkFDRSgiKDB4JTA4eClcbiIsIGhXbmRPd25lcik7CglpZiAoTWVzc2FnZUJveEEoIGhXbmRPd25lciwgIkRvIHlvdSB3YW50IHRvIGV4aXQgV0lORT8iLCAiU2h1dGRvd24iLCBNQl9ZRVNOT3xNQl9JQ09OUVVFU1RJT04pID09IElET0spCgl7IFNlbmRNZXNzYWdlQSAoIGhXbmRPd25lciwgV01fUVVJVCwgMCwgMCk7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEFycmFuZ2VXaW5kb3dzCQkJCVtTSEVMTDMyLjE4NF0KICogCiAqLwpEV09SRCBXSU5BUEkKQXJyYW5nZVdpbmRvd3MgKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMiwgRFdPUkQgZHdQYXJhbTMsCgkJRFdPUkQgZHdQYXJhbTQsIERXT1JEIGR3UGFyYW01KQp7CiAgICBGSVhNRSgiKDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4KTpzdHViLlxuIiwKCSAgIGR3UGFyYW0xLCBkd1BhcmFtMiwgZHdQYXJhbTMsIGR3UGFyYW00LCBkd1BhcmFtNSk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2lnbmFsRmlsZU9wZW4JCQkJW1NIRUxMMzIuMTAzXQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJClNpZ25hbEZpbGVPcGVuIChEV09SRCBkd1BhcmFtMSkKewogICAgRklYTUUoIigweCUwOGx4KTpzdHViLlxuIiwgZHdQYXJhbTEpOwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFkZFRvUmVjZW50RG9jcwkJCQlbU0hFTEwzMi4yMzRdCiAqCiAqIFBBUkFNRVRFUlMKICogICB1RmxhZ3MgIFtJTl0gU0hBUkRfUEFUSCBvciBTSEFSRF9QSURMCiAqICAgcHYgICAgICBbSU5dIHN0cmluZyBvciBwaWRsLCBOVUxMIGNsZWFycyB0aGUgbGlzdAogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KRFdPUkQgV0lOQVBJIFNIQWRkVG9SZWNlbnREb2NzIChVSU5UIHVGbGFncyxMUENWT0lEIHB2KSAgIAp7IGlmIChTSEFSRF9QSURMPT11RmxhZ3MpCiAgeyBGSVhNRSgiKDB4JTA4eCxwaWRsPSVwKTpzdHViLlxuIiwgdUZsYWdzLHB2KTsKCX0KCWVsc2UKCXsgRklYTUUoIigweCUwOHgsJXMpOnN0dWIuXG4iLCB1RmxhZ3MsKGNoYXIqKXB2KTsKCX0KICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZpbGVPcGVyYXRpb24JCQkJW1NIRUxMMzIuMjQyXQogKgogKi8KRFdPUkQgV0lOQVBJIFNIRmlsZU9wZXJhdGlvbkFXKERXT1JEIHgpCnsJRklYTUUoIjB4JTA4bHggc3R1YlxuIix4KTsKCXJldHVybiAwOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGaWxlT3BlcmF0aW9uQQkJCQlbU0hFTEwzMi4yNDNdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hGaWxlT3BlcmF0aW9uQSAoTFBTSEZJTEVPUFNUUlVDVEEgbHBGaWxlT3ApICAgCnsgRklYTUUoIiglcCk6c3R1Yi5cbiIsIGxwRmlsZU9wKTsKICByZXR1cm4gMTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZpbGVPcGVyYXRpb25XCQkJCVtTSEVMTDMyLjI0NF0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKICovCkRXT1JEIFdJTkFQSSBTSEZpbGVPcGVyYXRpb25XIChMUFNIRklMRU9QU1RSVUNUVyBscEZpbGVPcCkgICAKeyBGSVhNRSgiKCVwKTpzdHViLlxuIiwgbHBGaWxlT3ApOwogIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENoYW5nZU5vdGlmeQkJCQlbU0hFTEwzMi4yMzldCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hDaGFuZ2VOb3RpZnkgKAogICAgSU5UICAgd0V2ZW50SWQsICAvKiBbSU5dIGZsYWdzIHRoYXQgc3BlY2lmaWVzIHRoZSBldmVudCovCiAgICBVSU5UICB1RmxhZ3MsICAgLyogW0lOXSB0aGUgbWVhbmluZyBvZiBkd0l0ZW1bMXwyXSovCgkJTFBDVk9JRCBkd0l0ZW0xLAoJCUxQQ1ZPSUQgZHdJdGVtMikKeyBGSVhNRSgiKDB4JTA4eCwweCUwOHV4LCVwLCVwKTpzdHViLlxuIiwgd0V2ZW50SWQsdUZsYWdzLGR3SXRlbTEsZHdJdGVtMik7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeAkJCVtTSEVMTDMyLjE3NF0KICoKICogTk9URVMKICogIHNlZSBJU2hlbGxGb2xkZXI6OkNyZWF0ZVZpZXdPYmplY3QKICovCkhSRVNVTFQgV0lOQVBJIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXgoCiAgTFBTSEVMTFZJRVdEQVRBIHBzdmNiaSwgLypbaW4gXSBzaGVsbHRlbXBsYXRlIHN0cnVjdCovCiAgTFBWT0lEKiBwcHYpICAgICAgICAgICAgLypbb3V0XSBJU2hlbGxWaWV3IHBvaW50ZXIqLwp7CglJU2hlbGxWaWV3ICogcHNmOwoJSFJFU1VMVCBoUmVzOwoJCglUUkFDRSgic2Y9JXAgcGlkbD0lcCBjYj0lcCBtb2RlPTB4JTA4bHggcGFybT0weCUwOGx4XG4iLCAKCSAgcHN2Y2JpLT5wU2hlbGxGb2xkZXIsIHBzdmNiaS0+cGlkbCwgcHN2Y2JpLT5wQ2FsbEJhY2ssIHBzdmNiaS0+dmlld21vZGUsIHBzdmNiaS0+ZHdVc2VyUGFyYW0pOwoKCXBzZiA9IElTaGVsbFZpZXdfQ29uc3RydWN0b3IocHN2Y2JpLT5wU2hlbGxGb2xkZXIpOwoJCglpZiAoIXBzZikKCSAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CgoJSVNoZWxsVmlld19BZGRSZWYocHNmKTsKCWhSZXMgPSBJU2hlbGxWaWV3X1F1ZXJ5SW50ZXJmYWNlKHBzZiwgJklJRF9JU2hlbGxWaWV3LCAoTFBWT0lEICopcHB2KTsKCUlTaGVsbFZpZXdfUmVsZWFzZShwc2YpOwoKCXJldHVybiBoUmVzOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBTSFdpbkhlbHAJCQkJCVtTSEVMTDMyLjEyN10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIV2luSGVscCAoRFdPUkQgdiwgRFdPUkQgdywgRFdPUkQgeCwgRFdPUkQgeikKewlGSVhNRSgiMHglMDhseCAweCUwOGx4IDB4JTA4bHggMHglMDhseCBzdHViXG4iLHYsdyx4LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFNIUnVuQ29udHJvbFBhbmVsIFtTSEVMTDMyLjE2MV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUnVuQ29udHJvbFBhbmVsIChEV09SRCB4LCBEV09SRCB6KQp7CUZJWE1FKCIweCUwOGx4IDB4JTA4bHggc3R1YlxuIix4LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hlbGxFeGVjdXRlRXgJCQkJW1NIRUxMMzIuMjkxXQogKgogKi8KQk9PTCBXSU5BUEkgU2hlbGxFeGVjdXRlRXhBVyAoTFBWT0lEIHNlaSkKewlpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gU2hlbGxFeGVjdXRlRXhXIChzZWkpOwoJcmV0dXJuIFNoZWxsRXhlY3V0ZUV4QSAoc2VpKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeEEJCQkJW1NIRUxMMzIuMjkyXQogKgogKi8KQk9PTCBXSU5BUEkgU2hlbGxFeGVjdXRlRXhBIChMUFNIRUxMRVhFQ1VURUlORk9BIHNlaSkKeyAJQ0hBUiBzekFwcGxpY2F0aW9uTmFtZVtNQVhfUEFUSF0sc3pDb21tYW5kbGluZVtNQVhfUEFUSF0sc3pQaWRsWzIwXTsKCUxQU1RSIHBvczsKCWludCBnYXAsIGxlbjsKCVNUQVJUVVBJTkZPQSAgc3RhcnR1cGluZm87CglQUk9DRVNTX0lORk9STUFUSU9OIHByb2Nlc3NpbmZvcm1hdGlvbjsKCQkJCglXQVJOKCJtYXNrPTB4JTA4bHggaHduZD0weCUwNHggdmVyYj0lcyBmaWxlPSVzIHBhcm09JXMgZGlyPSVzIHNob3c9MHglMDh4IGNsYXNzPSVzIGluY29tcGxldGVcbiIsCgkJc2VpLT5mTWFzaywgc2VpLT5od25kLCBzZWktPmxwVmVyYiwgc2VpLT5scEZpbGUsCgkJc2VpLT5scFBhcmFtZXRlcnMsIHNlaS0+bHBEaXJlY3RvcnksIHNlaS0+blNob3csIAoJCShzZWktPmZNYXNrICYgU0VFX01BU0tfQ0xBU1NOQU1FKSA/IHNlaS0+bHBDbGFzcyA6ICJub3QgdXNlZCIpOwoKCVplcm9NZW1vcnkoc3pBcHBsaWNhdGlvbk5hbWUsTUFYX1BBVEgpOwoJaWYgKHNlaS0+bHBGaWxlKQoJICBzdHJjcHkoc3pBcHBsaWNhdGlvbk5hbWUsIHNlaS0+bHBGaWxlKTsKCQoJWmVyb01lbW9yeShzekNvbW1hbmRsaW5lLE1BWF9QQVRIKTsKCWlmIChzZWktPmxwUGFyYW1ldGVycykKCSAgc3RyY3B5KHN6Q29tbWFuZGxpbmUsIHNlaS0+bHBQYXJhbWV0ZXJzKTsKCQkJCglpZiAoc2VpLT5mTWFzayAmIChTRUVfTUFTS19DTEFTU0tFWSB8IFNFRV9NQVNLX0lOVk9LRUlETElTVCB8IFNFRV9NQVNLX0lDT04gfCBTRUVfTUFTS19IT1RLRVkgfAoJCQkgIFNFRV9NQVNLX05PQ0xPU0VQUk9DRVNTIHwgU0VFX01BU0tfQ09OTkVDVE5FVERSViB8IFNFRV9NQVNLX0ZMQUdfRERFV0FJVCB8CgkJCSAgU0VFX01BU0tfRE9FTlZTVUJTVCB8IFNFRV9NQVNLX0ZMQUdfTk9fVUkgfCBTRUVfTUFTS19VTklDT0RFIHwgCgkJCSAgU0VFX01BU0tfTk9fQ09OU09MRSB8IFNFRV9NQVNLX0FTWU5DT0sgfCBTRUVfTUFTS19ITU9OSVRPUiApKQoJeyBGSVhNRSgiZmxhZ3MgaWdub3JlZDogMHglMDhseFxuIiwgc2VpLT5mTWFzayk7Cgl9CgoJaWYgKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpCgl7IEhDUl9HZXRFeGVjdXRlQ29tbWFuZChzZWktPmxwQ2xhc3MsIChzZWktPmxwVmVyYikgPyBzZWktPmxwVmVyYiA6ICJvcGVuIiwgc3pDb21tYW5kbGluZSwgMjU2KTsJICAgIAoJfQoKCS8qIHByb2Nlc3MgdGhlIElETGlzdCAqLwoJaWYgKCAoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0lOVk9LRUlETElTVCkgPT0gU0VFX01BU0tfSU5WT0tFSURMSVNUKSAvKjB4MGMqLwoJeyBTSEdldFBhdGhGcm9tSURMaXN0QSAoc2VpLT5scElETGlzdCxzekFwcGxpY2F0aW9uTmFtZSk7CgkgIFRSQUNFKCItLSBpZGxpc3Q9JXAgKCVzKVxuIiwgc2VpLT5scElETGlzdCwgc3pBcHBsaWNhdGlvbk5hbWUpOwoJfQoJZWxzZQoJeyBpZiAoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0lETElTVCApCgkgIHsgLyogJUkgaXMgdGhlIGFkcmVzcyBvZiBhIGdsb2JhbCBpdGVtIElEKi8KCSAgICBwb3MgPSBzdHJzdHIoc3pDb21tYW5kbGluZSwgIiVJIik7CgkgICAgaWYgKHBvcykKCSAgICB7IEhHTE9CQUwgaG1lbSA9IFNIQWxsb2NTaGFyZWQgKCBzZWktPmxwSURMaXN0LCBJTEdldFNpemUoc2VpLT5scElETGlzdCksIDApOwoJICAgICAgc3ByaW50ZihzelBpZGwsIjolbGkiLChEV09SRClTSExvY2tTaGFyZWQoaG1lbSwwKSApOwoJICAgICAgU0hVbmxvY2tTaGFyZWQoaG1lbSk7CgkgICAgCgkgICAgICBnYXAgPSBzdHJsZW4oc3pQaWRsKTsKCSAgICAgIGxlbiA9IHN0cmxlbihwb3MpLTI7CgkgICAgICBtZW1tb3ZlKHBvcytnYXAscG9zKzIsbGVuKTsKCSAgICAgIG1lbWNweShwb3Msc3pQaWRsLGdhcCk7CgoJICAgIH0KCSAgfQoJfQoKCXBvcyA9IHN0cnN0cihzekNvbW1hbmRsaW5lLCAiLCVMIik7CS8qIGR1bm5vIHdoYXQgaXQgbWVhbnM6IGtpbGwgaXQqLwoJaWYgKHBvcykKCXsgbGVuID0gc3RybGVuKHBvcyktMjsKCSAgKnBvcz0weDA7CgkgIG1lbW1vdmUocG9zLHBvcyszLGxlbik7Cgl9CgoJVFJBQ0UoImV4ZWN1dGU6ICVzICVzXG4iLHN6QXBwbGljYXRpb25OYW1lLCBzekNvbW1hbmRsaW5lKTsKCglaZXJvTWVtb3J5KCZzdGFydHVwaW5mbyxzaXplb2YoU1RBUlRVUElORk9BKSk7CglzdGFydHVwaW5mby5jYiA9IHNpemVvZihTVEFSVFVQSU5GT0EpOwoKCXJldHVybiBDcmVhdGVQcm9jZXNzQShzekFwcGxpY2F0aW9uTmFtZVswXSA/IHN6QXBwbGljYXRpb25OYW1lOk5VTEwsCgkJCSBzekNvbW1hbmRsaW5lWzBdID8gc3pDb21tYW5kbGluZSA6IE5VTEwsCgkJCSBOVUxMLCBOVUxMLCBGQUxTRSwgMCwgCgkJCSBOVUxMLCBOVUxMLCAmc3RhcnR1cGluZm8sICZwcm9jZXNzaW5mb3JtYXRpb24pOwoJICAKCQp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4VwkJCQlbU0hFTEwzMi4yOTNdCiAqCiAqLwpCT09MIFdJTkFQSSBTaGVsbEV4ZWN1dGVFeFcgKExQU0hFTExFWEVDVVRFSU5GT1cgc2VpKQp7CVNIRUxMRVhFQ1VURUlORk9BIHNlaUE7CglEV09SRCByZXQ7CgoJVFJBQ0UoIiVwXG4iLCBzZWkpOwoKCW1lbWNweSgmc2VpQSwgc2VpLCBzaXplb2YoU0hFTExFWEVDVVRFSU5GT0EpKTsKCQogICAgICAgIGlmIChzZWktPmxwVmVyYikKCSAgc2VpQS5scFZlcmIgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBWZXJiKTsKCiAgICAgICAgaWYgKHNlaS0+bHBGaWxlKQoJICBzZWlBLmxwRmlsZSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scEZpbGUpOwoKICAgICAgICBpZiAoc2VpLT5scFBhcmFtZXRlcnMpCgkgIHNlaUEubHBQYXJhbWV0ZXJzID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwUGFyYW1ldGVycyk7CgoJaWYgKHNlaS0+bHBEaXJlY3RvcnkpCgkgIHNlaUEubHBEaXJlY3RvcnkgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBEaXJlY3RvcnkpOwoKICAgICAgICBpZiAoKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19DTEFTU05BTUUpICYmIHNlaS0+bHBDbGFzcykKCSAgc2VpQS5scENsYXNzID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwQ2xhc3MpOwoJZWxzZQoJICBzZWlBLmxwQ2xhc3MgPSBOVUxMOwoJICAJICAKCXJldCA9IFNoZWxsRXhlY3V0ZUV4QSgmc2VpQSk7CgogICAgICAgIGlmIChzZWlBLmxwVmVyYikJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scFZlcmIgKTsKCWlmIChzZWlBLmxwRmlsZSkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scEZpbGUgKTsKCWlmIChzZWlBLmxwUGFyYW1ldGVycykJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUikgc2VpQS5scFBhcmFtZXRlcnMgKTsKCWlmIChzZWlBLmxwRGlyZWN0b3J5KQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwRGlyZWN0b3J5ICk7CglpZiAoc2VpQS5scENsYXNzKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwQ2xhc3MgKTsKCiAJcmV0dXJuIHJldDsKfQoKc3RhdGljIExQVU5LTk9XTiBTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZT0wOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNldEluc3RhbmNlRXhwbG9yZXIJCQlbU0hFTEwzMi4xNzZdCiAqCiAqIE5PVEVTCiAqICBTZXRzIHRoZSBpbnRlcmZhY2UKICovCkhSRVNVTFQgV0lOQVBJIFNIU2V0SW5zdGFuY2VFeHBsb3JlciAoTFBVTktOT1dOIGxwVW5rbm93bikKewlUUkFDRSgiJXBcbiIsIGxwVW5rbm93bik7CglTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSA9IGxwVW5rbm93bjsKCXJldHVybiAoSFJFU1VMVCkgbHBVbmtub3duOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0SW5zdGFuY2VFeHBsb3JlcgkJCVtTSEVMTDMyLjI1Nl0KICoKICogTk9URVMKICogIGdldHMgdGhlIGludGVyZmFjZSBwb2ludGVyIG9mIHRoZSBleHBsb3JlciBhbmQgYSByZWZlcmVuY2UKICovCkhSRVNVTFQgV0lOQVBJIFNIR2V0SW5zdGFuY2VFeHBsb3JlciAoTFBVTktOT1dOICogbHBVbmtub3duKQp7CVRSQUNFKCIlcFxuIiwgbHBVbmtub3duKTsKCgkqbHBVbmtub3duID0gU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2U7CgoJaWYgKCFTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSkKCSAgcmV0dXJuIEVfRkFJTDsKCglTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZS0+bHB2dGJsLT5mbkFkZFJlZihTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSk7CglyZXR1cm4gTk9FUlJPUjsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWVVbnVzZWRMaWJyYXJpZXMJCQlbU0hFTEwzMi4xMjNdCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEZyZWVVbnVzZWRMaWJyYXJpZXMgKHZvaWQpCnsJRklYTUUoInN0dWJcbiIpOwoJcmV0dXJuIFRSVUU7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREFEX1NldERyYWdJbWFnZQkJCQlbU0hFTEwzMi4xMzZdCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpIUkVTVUxUIFdJTkFQSSBEQURfU2V0RHJhZ0ltYWdlIChEV09SRCB1LCBEV09SRCB2KQp7IEZJWE1FKCIweCUwOGx4IDB4JTA4bHggc3R1YlxuIix1LCB2KTsKICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEQURfU2hvd0RyYWdJbWFnZQkJCQlbU0hFTEwzMi4xMzddCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpIUkVTVUxUIFdJTkFQSSBEQURfU2hvd0RyYWdJbWFnZSAoRFdPUkQgdSkKeyBGSVhNRSgiMHglMDhseCBzdHViXG4iLHUpOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnQ2xvc2VLZXkJCQlbTlQ0LjA6U0hFTEwzMi41MDVdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ0Nsb3NlS2V5IChIS0VZIGhrZXkpCnsJVFJBQ0UoIjB4JTA0eFxuIixoa2V5KTsKCXJldHVybiBSZWdDbG9zZUtleSggaGtleSApOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnT3BlbktleUEJCQkJW1NIRUxMMzIuNTA2XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdPcGVuS2V5QShIS0VZIGhLZXksIExQU1RSIGxwU3ViS2V5LCBMUEhLRVkgcGhrUmVzdWx0KQp7CglUUkFDRSgiKDB4JTA4eCwgJXMsICVwKVxuIiwgaEtleSwgZGVidWdzdHJfYShscFN1YktleSksIHBoa1Jlc3VsdCk7CglyZXR1cm4gUmVnT3BlbktleUEoaEtleSwgbHBTdWJLZXksIHBoa1Jlc3VsdCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIUmVnT3BlbktleVcJCQkJW05UNC4wOlNIRUxMMzIuNTA3XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdPcGVuS2V5VyAoSEtFWSBoa2V5LCBMUENXU1RSIGxwc3pTdWJLZXksIExQSEtFWSByZXRrZXkpCnsJV0FSTigiMHglMDR4ICVzICVwXG4iLGhrZXksZGVidWdzdHJfdyhscHN6U3ViS2V5KSxyZXRrZXkpOwoJcmV0dXJuIFJlZ09wZW5LZXlXKCBoa2V5LCBscHN6U3ViS2V5LCByZXRrZXkgKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ1F1ZXJ5VmFsdWVFeEEJCQkJW1NIRUxMMzIuNTA5XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdRdWVyeVZhbHVlRXhBKAoJSEtFWSBoa2V5LAoJTFBTVFIgbHBWYWx1ZU5hbWUsCglMUERXT1JEIGxwUmVzZXJ2ZWQsCglMUERXT1JEIGxwVHlwZSwKCUxQQllURSBscERhdGEsCglMUERXT1JEIGxwY2JEYXRhKQp7CglUUkFDRSgiMHglMDR4ICVzICVwICVwICVwICVwXG4iLCBoa2V5LCBscFZhbHVlTmFtZSwgbHBSZXNlcnZlZCwgbHBUeXBlLCBscERhdGEsIGxwY2JEYXRhKTsKCXJldHVybiBSZWdRdWVyeVZhbHVlRXhBIChoa2V5LCBscFZhbHVlTmFtZSwgbHBSZXNlcnZlZCwgbHBUeXBlLCBscERhdGEsIGxwY2JEYXRhKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ1F1ZXJ5VmFsdWVXCQkJCVtOVDQuMDpTSEVMTDMyLjUxMF0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnUXVlcnlWYWx1ZVcgKEhLRVkgaGtleSwgTFBXU1RSIGxwc3pTdWJLZXksCgkJCQkgTFBXU1RSIGxwc3pEYXRhLCBMUERXT1JEIGxwY2JEYXRhICkKewlXQVJOKCIweCUwNHggJXMgJXAgJXAgc2VtaS1zdHViXG4iLAoJCWhrZXksIGRlYnVnc3RyX3cobHBzelN1YktleSksIGxwc3pEYXRhLCBscGNiRGF0YSk7CglyZXR1cm4gUmVnUXVlcnlWYWx1ZVcoIGhrZXksIGxwc3pTdWJLZXksIGxwc3pEYXRhLCBscGNiRGF0YSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ1F1ZXJ5VmFsdWVFeFcJCQkJW05UNC4wOlNIRUxMMzIuNTExXQogKgogKiBGSVhNRSAKICogIGlmIHRoZSBkYXRhdHlwZSBSRUdfRVhQQU5EX1NaIHRoZW4gZXhwYW5kIHRoZSBzdHJpbmcgYW5kIGNoYW5nZQogKiAgKnBkd1R5cGUgdG8gUkVHX1NaLiAKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnUXVlcnlWYWx1ZUV4VyAoSEtFWSBoa2V5LCBMUFdTVFIgcHN6VmFsdWUsIExQRFdPUkQgcGR3UmVzZXJ2ZWQsCgkJIExQRFdPUkQgcGR3VHlwZSwgTFBWT0lEIHB2RGF0YSwgTFBEV09SRCBwY2JEYXRhKQp7CURXT1JEIHJldDsKCVdBUk4oIjB4JTA0eCAlcyAlcCAlcCAlcCAlcCBzZW1pLXN0dWJcbiIsCgkJaGtleSwgZGVidWdzdHJfdyhwc3pWYWx1ZSksIHBkd1Jlc2VydmVkLCBwZHdUeXBlLCBwdkRhdGEsIHBjYkRhdGEpOwoJcmV0ID0gUmVnUXVlcnlWYWx1ZUV4VyAoIGhrZXksIHBzelZhbHVlLCBwZHdSZXNlcnZlZCwgcGR3VHlwZSwgcHZEYXRhLCBwY2JEYXRhKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJlYWRDYWJpbmV0U3RhdGUJCQkJW05UIDQuMDpTSEVMTDMyLjY1MV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFJlYWRDYWJpbmV0U3RhdGUoRFdPUkQgdSwgRFdPUkQgdikKewlGSVhNRSgiMHglMDRseCAweCUwNGx4IHN0dWJcbiIsdSx2KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFdyaXRlQ2FiaW5ldFN0YXRlCQkJCVtOVCA0LjA6U0hFTEwzMi42NTJdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBXcml0ZUNhYmluZXRTdGF0ZShEV09SRCB1KQp7CUZJWE1FKCIweCUwNGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGaWxlSWNvbkluaXQgCQkJCVtTSEVMTDMyLjY2MF0KICoKICovCkJPT0wgV0lOQVBJIEZpbGVJY29uSW5pdChCT09MIGJGdWxsSW5pdCkKewlGSVhNRSgiKCVzKVxuIiwgYkZ1bGxJbml0ID8gInRydWUiIDogImZhbHNlIik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJc1VzZXJBZG1pbgkJCQkJW05UIDQuMDpTSEVMTDMyLjY4MF0KICoKICovCkhSRVNVTFQgV0lOQVBJIElzVXNlckFkbWluKHZvaWQpCnsJRklYTUUoInN0dWJcbiIpOwoJcmV0dXJuIFRSVUU7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyUmV0VG9TdHJOCQkJCQlbU0hFTEwzMi45Nl0KICogCiAqIGNvbnZlcnRzIGEgU1RSUkVUIHRvIGEgbm9ybWFsIHN0cmluZwogKgogKiBOT1RFUwogKiAgdGhlIHBpZGwgaXMgZm9yIFNUUlJFVCBPRkZTRVQKICovCkhSRVNVTFQgV0lOQVBJIFN0clJldFRvQnVmQSAoTFBTVFJSRVQgc3JjLCBMUElURU1JRExJU1QgcGlkbCwgTFBTVFIgZGVzdCwgRFdPUkQgbGVuKQp7CglyZXR1cm4gU3RyUmV0VG9TdHJOQShkZXN0LCBsZW4sIHNyYywgcGlkbCk7Cn0KCkhSRVNVTFQgV0lOQVBJIFN0clJldFRvU3RyTkEgKExQVk9JRCBkZXN0LCBEV09SRCBsZW4sIExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwpCnsKCVRSQUNFKCJkZXN0PTB4JXAgbGVuPTB4JWx4IHN0cnJldD0weCVwIHBpZGw9JXAgc3R1YlxuIixkZXN0LGxlbixzcmMscGlkbCk7CgoJc3dpdGNoIChzcmMtPnVUeXBlKQoJewoJICBjYXNlIFNUUlJFVF9XU1RSOgoJICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBzcmMtPnUucE9sZVN0ciwgLTEsIChMUFNUUilkZXN0LCBsZW4sIE5VTEwsIE5VTEwpOwoJICAgIFNIRnJlZShzcmMtPnUucE9sZVN0cik7CgkgICAgYnJlYWs7CgoJICBjYXNlIFNUUlJFVF9DU1RSQToKCSAgICBsc3RyY3B5bkEoKExQU1RSKWRlc3QsIHNyYy0+dS5jU3RyLCBsZW4pOwoJICAgIGJyZWFrOwoKCSAgY2FzZSBTVFJSRVRfT0ZGU0VUQToKCSAgICBsc3RyY3B5bkEoKExQU1RSKWRlc3QsICgoTFBDU1RSKSZwaWRsLT5ta2lkKStzcmMtPnUudU9mZnNldCwgbGVuKTsKCSAgICBicmVhazsKCgkgIGRlZmF1bHQ6CgkgICAgRklYTUUoInVua25vd24gdHlwZSFcbiIpOwoJICAgIGlmIChsZW4pCgkgICAgewoJICAgICAgKihMUFNUUilkZXN0ID0gJ1wwJzsKCSAgICB9CgkgICAgcmV0dXJuKEZBTFNFKTsKCX0KCXJldHVybiBTX09LOwp9CgpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb0J1ZlcgKExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwsIExQV1NUUiBkZXN0LCBEV09SRCBsZW4pCnsKCXJldHVybiBTdHJSZXRUb1N0ck5XKGRlc3QsIGxlbiwgc3JjLCBwaWRsKTsKfQoKSFJFU1VMVCBXSU5BUEkgU3RyUmV0VG9TdHJOVyAoTFBWT0lEIGRlc3QsIERXT1JEIGxlbiwgTFBTVFJSRVQgc3JjLCBMUElURU1JRExJU1QgcGlkbCkKewoJVFJBQ0UoImRlc3Q9MHglcCBsZW49MHglbHggc3RycmV0PTB4JXAgcGlkbD0lcCBzdHViXG4iLGRlc3QsbGVuLHNyYyxwaWRsKTsKCglzd2l0Y2ggKHNyYy0+dVR5cGUpCgl7CgkgIGNhc2UgU1RSUkVUX1dTVFI6CgkgICAgbHN0cmNweW5XKChMUFdTVFIpZGVzdCwgc3JjLT51LnBPbGVTdHIsIGxlbik7CgkgICAgU0hGcmVlKHNyYy0+dS5wT2xlU3RyKTsKCSAgICBicmVhazsKCgkgIGNhc2UgU1RSUkVUX0NTVFJBOgoJICAgIGxzdHJjcHluQXRvVygoTFBXU1RSKWRlc3QsIHNyYy0+dS5jU3RyLCBsZW4pOwoJICAgIGJyZWFrOwoKCSAgY2FzZSBTVFJSRVRfT0ZGU0VUQToKCSAgICBpZiAocGlkbCkKCSAgICB7CgkgICAgICBsc3RyY3B5bkF0b1coKExQV1NUUilkZXN0LCAoKExQQ1NUUikmcGlkbC0+bWtpZCkrc3JjLT51LnVPZmZzZXQsIGxlbik7CgkgICAgfQoJICAgIGJyZWFrOwoKCSAgZGVmYXVsdDoKCSAgICBGSVhNRSgidW5rbm93biB0eXBlIVxuIik7CgkgICAgaWYgKGxlbikKCSAgICB7ICooTFBTVFIpZGVzdCA9ICdcMCc7CgkgICAgfQoJICAgIHJldHVybihGQUxTRSk7Cgl9CglyZXR1cm4gU19PSzsKfQpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb1N0ck5BVyAoTFBWT0lEIGRlc3QsIERXT1JEIGxlbiwgTFBTVFJSRVQgc3JjLCBMUElURU1JRExJU1QgcGlkbCkKewoJaWYoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gU3RyUmV0VG9TdHJOVyAoZGVzdCwgbGVuLCBzcmMsIHBpZGwpOwoJcmV0dXJuIFN0clJldFRvU3RyTkEgKGRlc3QsIGxlbiwgc3JjLCBwaWRsKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyQ2hyVwkJCQkJW05UIDQuMDpTSEVMTDMyLjY1MV0KICoKICovCkxQV1NUUiBXSU5BUEkgU3RyQ2hyVyAoTFBXU1RSIHN0ciwgV0NIQVIgeCApCnsJTFBXU1RSIHB0cj1zdHI7CgkKCVRSQUNFKCIlcyAweCUwNHhcbiIsZGVidWdzdHJfdyhzdHIpLHgpOwoJZG8gCgl7ICBpZiAoKnB0cj09eCkKCSAgIHsgcmV0dXJuIHB0cjsKCSAgIH0KCSAgIHB0cisrOwoJfSB3aGlsZSAoKnB0cik7CglyZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyQ21wTklXCQkJCQlbTlQgNC4wOlNIRUxMMzIuKl0KICoKICovCklOVCBXSU5BUEkgU3RyQ21wTklXICggTFBXU1RSIHdzdHIxLCBMUFdTVFIgd3N0cjIsIElOVCBsZW4pCnsJRklYTUUoIiVzICVzICVpIHN0dWJcbiIsIGRlYnVnc3RyX3cod3N0cjEpLGRlYnVnc3RyX3cod3N0cjIpLGxlbik7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBbGxvY1NoYXJlZAkJCQlbU0hFTEwzMi41MjBdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIEhlYXBBbGxvYwogKiAgcGFyYW1ldGVyMiBpcyBlcXVhbCB0byB0aGUgc2l6ZSBhbGxvY2F0ZWQgd2l0aCBIZWFwQWxsb2MKICogIHBhcmFtZXRlcjMgaXMgcmV0dXJuIHZhbHVlIGZyb20gR2V0Q3VycmVudFByb2Nlc3NJZAogKgogKiAgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3N0ZWQgYXMgbFBhcmFtIHdpdGggMHg0MDIgKFdNX1VTRVIrMikgdG8gc29tZXdoZXJlCiAqICBXTV9VU0VSKzIgY291bGQgYmUgdGhlIHVuZG9jdW1lbnRlZCBDV01fU0VUUEFUSAogKiAgdGhlIGFsbG9jYXRlZCBtZW1vcnkgY29udGFpbnMgYSBwaWRsCiAqLwpIR0xPQkFMIFdJTkFQSSBTSEFsbG9jU2hhcmVkKExQVk9JRCBwc3JjLCBEV09SRCBzaXplLCBEV09SRCBwcm9jSUQpCnsJSEdMT0JBTCBobWVtOwoJTFBWT0lEIHBtZW07CgkKCVRSQUNFKCJwdHI9JXAgc2l6ZT0weCUwNGx4IHByb2NJRD0weCUwNGx4XG4iLHBzcmMsc2l6ZSxwcm9jSUQpOwoJaG1lbSA9IEdsb2JhbEFsbG9jKEdNRU1fRklYRUQsIHNpemUpOwoJaWYgKCFobWVtKQoJICByZXR1cm4gMDsKCQoJcG1lbSA9ICBHbG9iYWxMb2NrIChobWVtKTsKCglpZiAoISBwbWVtKQoJICByZXR1cm4gMDsKCSAgCgltZW1jcHkgKHBtZW0sIHBzcmMsIHNpemUpOwoJR2xvYmFsVW5sb2NrKGhtZW0pOyAKCXJldHVybiBobWVtOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNITG9ja1NoYXJlZAkJCQkJW1NIRUxMMzIuNTIxXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBTSEFsbG9jU2hhcmVkCiAqICBwYXJhbWV0ZXIyIGlzIHJldHVybiB2YWx1ZSBmcm9tIEdldEN1cnJlbnRQcm9jZXNzSWQKICogIHRoZSByZWNlaXZlciBvZiAoV01fVVNFUisyKSB0cnlzIHRvIGxvY2sgdGhlIEhBTkRMRSAoPykgCiAqICB0aGUgcmV0dXJudmFsdWUgc2VlbXMgdG8gYmUgYSBtZW1vcnlhZHJlc3MKICovCkxQVk9JRCBXSU5BUEkgU0hMb2NrU2hhcmVkKEhBTkRMRSBobWVtLCBEV09SRCBwcm9jSUQpCnsJVFJBQ0UoImhhbmRsZT0weCUwNHggcHJvY0lEPTB4JTA0bHhcbiIsaG1lbSxwcm9jSUQpOwoJcmV0dXJuIEdsb2JhbExvY2soaG1lbSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hVbmxvY2tTaGFyZWQJCQkJW1NIRUxMMzIuNTIyXQogKgogKiBOT1RFUwogKiAgcGFyYW1ldGVyMSBpcyByZXR1cm4gdmFsdWUgZnJvbSBTSExvY2tTaGFyZWQKICovCkJPT0wgV0lOQVBJIFNIVW5sb2NrU2hhcmVkKEhBTkRMRSBwbWVtKQp7CVRSQUNFKCJoYW5kbGU9MHglMDR4XG4iLHBtZW0pOwoJcmV0dXJuIEdsb2JhbFVubG9jayhwbWVtKTsgCn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGcmVlU2hhcmVkCQkJCQlbU0hFTEwzMi41MjNdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIFNIQWxsb2NTaGFyZWQKICogIHBhcmFtZXRlcjIgaXMgcmV0dXJuIHZhbHVlIGZyb20gR2V0Q3VycmVudFByb2Nlc3NJZAogKi8KSEFORExFIFdJTkFQSSBTSEZyZWVTaGFyZWQoSEFORExFIGhtZW0sIERXT1JEIHByb2NJRCkKewlUUkFDRSgiaGFuZGxlPTB4JTA0eCAweCUwNGx4XG4iLGhtZW0scHJvY0lEKTsKCXJldHVybiBHbG9iYWxGcmVlKGhtZW0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTZXRBcHBTdGFydGluZ0N1cnNvcgkJCQlbU0hFTEwzMi45OV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNldEFwcFN0YXJ0aW5nQ3Vyc29yKEhXTkQgdSwgRFdPUkQgdikKewlGSVhNRSgiaHduZD0weCUwNHggMHglMDRseCBzdHViXG4iLHUsdiApOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hMb2FkT0xFCQkJCQlbU0hFTEwzMi4xNTFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExvYWRPTEUoRFdPUkQgdSkKewlGSVhNRSgiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIFNfT0s7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRHJpdmVUeXBlCQkJCQlbU0hFTEwzMi42NF0KICoKICovCkhSRVNVTFQgV0lOQVBJIERyaXZlVHlwZShEV09SRCB1KQp7CUZJWE1FKCIweCUwNGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFib3J0SW52b2tlQ29tbWFuZAkJCQlbU0hFTEwzMi4xOThdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEFib3J0SW52b2tlQ29tbWFuZCh2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiAxOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIT3V0T2ZNZW1vcnlNZXNzYWdlQm94CQkJW1NIRUxMMzIuMTI2XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hPdXRPZk1lbW9yeU1lc3NhZ2VCb3goRFdPUkQgdSwgRFdPUkQgdiwgRFdPUkQgdykKewlGSVhNRSgiMHglMDRseCAweCUwNGx4IDB4JTA0bHggc3R1YlxuIix1LHYsdyk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZsdXNoQ2xpcGJvYXJkCQkJCVtTSEVMTDMyLjEyMV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIRmx1c2hDbGlwYm9hcmQodm9pZCkKewlGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gMTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJSQ2hyVwkJCQkJW1NIRUxMMzIuMzIwXQogKgogKi8KTFBXU1RSIFdJTkFQSSBTdHJSQ2hyVyhMUFdTVFIgbHBTdGFydCwgTFBXU1RSIGxwRW5kLCBEV09SRCB3TWF0Y2gpCnsJTFBXU1RSIHdwdHI9TlVMTDsKCVRSQUNFKCIlcyAlcyAweCUwNHhcbiIsZGVidWdzdHJfdyhscFN0YXJ0KSxkZWJ1Z3N0cl93KGxwRW5kKSwgKFdDSEFSKXdNYXRjaCApOwoKCS8qIGlmIHRoZSBlbmQgbm90IGdpdmVuLCBzZWFyY2gqLwoJaWYgKCFscEVuZCkKCXsgbHBFbmQ9bHBTdGFydDsKCSAgd2hpbGUgKCpscEVuZCkgCgkgICAgbHBFbmQrKzsKCX0KCglkbyAKCXsgaWYgKCpscFN0YXJ0PT0oV0NIQVIpd01hdGNoKQoJICAgIHdwdHIgPSBscFN0YXJ0OwoJICBscFN0YXJ0Kys7ICAKCX0gd2hpbGUgKCBscFN0YXJ0PD1scEVuZCApOyAKCXJldHVybiB3cHRyOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogU3RyRm9ybWF0Qnl0ZVNpemUJCQkJW1NITFdBUEldCiovCkxQU1RSIFdJTkFQSSBTdHJGb3JtYXRCeXRlU2l6ZUEgKCBEV09SRCBkdywgTFBTVFIgcHN6QnVmLCBVSU5UIGNjaEJ1ZiApCnsJY2hhciBidWZbNjRdOwoJVFJBQ0UoIiVseCAlcCAlaVxuIiwgZHcsIHBzekJ1ZiwgY2NoQnVmKTsKCWlmICggZHc8MTAyNEwgKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIGJ5dGVzIiwgKEZMT0FUKWR3KTsKCX0KCWVsc2UgaWYgKCBkdzwxMDQ4NTc2TCkKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBLQiIsIChGTE9BVClkdy8xMDI0KTsKCX0KCWVsc2UgaWYgKCBkdyA8IDEwNzM3NDE4MjRMKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIE1CIiwgKEZMT0FUKWR3LzEwNDg1NzZMKTsKCX0KCWVsc2UKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBHQiIsIChGTE9BVClkdy8xMDczNzQxODI0TCk7Cgl9Cglsc3RyY3B5bkEgKHBzekJ1ZiwgYnVmLCBjY2hCdWYpOwoJcmV0dXJuIHBzekJ1ZjsJCn0KTFBXU1RSIFdJTkFQSSBTdHJGb3JtYXRCeXRlU2l6ZVcgKCBEV09SRCBkdywgTFBXU1RSIHBzekJ1ZiwgVUlOVCBjY2hCdWYgKQp7CWNoYXIgYnVmWzY0XTsKCVRSQUNFKCIlbHggJXAgJWlcbiIsIGR3LCBwc3pCdWYsIGNjaEJ1Zik7CglpZiAoIGR3PDEwMjRMICkKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBieXRlcyIsIChGTE9BVClkdyk7Cgl9CgllbHNlIGlmICggZHc8MTA0ODU3NkwpCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgS0IiLCAoRkxPQVQpZHcvMTAyNCk7Cgl9CgllbHNlIGlmICggZHcgPCAxMDczNzQxODI0TCkKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBNQiIsIChGTE9BVClkdy8xMDQ4NTc2TCk7Cgl9CgllbHNlCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgR0IiLCAoRkxPQVQpZHcvMTA3Mzc0MTgyNEwpOwoJfQoJbHN0cmNweW5BdG9XIChwc3pCdWYsIGJ1ZiwgY2NoQnVmKTsKCXJldHVybiBwc3pCdWY7CQp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIV2FpdEZvckZpbGVUb09wZW4JCQkJW1NIRUxMMzIuOTddCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFdhaXRGb3JGaWxlVG9PcGVuKERXT1JEIHUsIERXT1JEIHYsIERXT1JEIHcpCnsJRklYTUUoIjB4JTA0bHggMHglMDRseCAweCUwNGx4IHN0dWJcbiIsdSx2LHcpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29udHJvbF9GaWxsQ2FjaGVfUnVuRExMCQkJW1NIRUxMMzIuOF0KICoKICovCkhSRVNVTFQgV0lOQVBJIENvbnRyb2xfRmlsbENhY2hlX1J1bkRMTChIV05EIGhXbmQsIEhBTkRMRSBoTW9kdWxlLCBEV09SRCB3LCBEV09SRCB4KQp7CUZJWE1FKCIweCUwNHggMHglMDR4IDB4JTA0bHggMHglMDRseCBzdHViXG4iLGhXbmQsIGhNb2R1bGUsdyx4KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJ1bkRMTF9DYWxsRW50cnkxNgkJCQlbU0hFTEwzMi4xMjJdCiAqIHRoZSBuYW1lIGlzIHByb3BhYmx5IHdyb25nCiAqLwpIUkVTVUxUIFdJTkFQSSBSdW5ETExfQ2FsbEVudHJ5MTYoRFdPUkQgdiwgRFdPUkQgdywgRFdPUkQgeCwgRFdPUkQgeSwgRFdPUkQgeikKewlGSVhNRSgiMHglMDRseCAweCUwNGx4IDB4JTA0bHggMHglMDRseCAweCUwNGx4IHN0dWJcbiIsdix3LHgseSx6KTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXNoZWxsMzJfNjU0CQkJCVtTSEVMTDMyLjY1NF0KICoKICogTk9URVM6IGZpcnN0IHBhcmFtZXRlciBzZWVtcyB0byBiZSBhIHBvaW50ZXIgKHNhbWUgYXMgcGFzc2VkIHRvIFdyaXRlQ2FiaW5ldFN0YXRlKQogKiBzZWNvbmQgb25lIGNvdWxkIGJlIGEgc2l6ZSAoMHgwYykuIFRoZSBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBzdHJ1Y3R1cmUgc2F2ZWQgdG8KICogSENVXFNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXENhYmluZXRTdGF0ZQogKiBJJ20gKGpzKSBndWVzc2luZzogdGhpcyBvbmUgaXMganVzdCBSZWFkQ2FiaW5ldFN0YXRlIDstKQogKi8KSFJFU1VMVCBXSU5BUEkgc2hlbGwzMl82NTQgKERXT1JEIHgsIERXT1JEIHkpCnsJRklYTUUoIjB4JTA4bHggMHglMDhseCBzdHViXG4iLHgseSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglSTEJ1aWxkTGlzdE9mUGF0aHMJCQlbU0hFTEwzMi4xNDZdCiAqCiAqIE5PVEVTCiAqICAgYnVpbGRzIGEgRFBBCiAqLwpEV09SRCBXSU5BUEkgUkxCdWlsZExpc3RPZlBhdGhzICh2b2lkKQp7CUZJWE1FKCJzdHViXG4iKTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU3RyVG9PbGVTdHIJCQlbU0hFTEwzMi4xNjNdCiAqCiAqLwppbnQgV0lOQVBJIFN0clRvT2xlU3RyQSAoTFBXU1RSIGxwV2lkZUNoYXJTdHIsIExQQ1NUUiBscE11bHRpQnl0ZVN0cmluZykKewoJVFJBQ0UoIiVwICVwKCVzKVxuIiwKCWxwV2lkZUNoYXJTdHIsIGxwTXVsdGlCeXRlU3RyaW5nLCBscE11bHRpQnl0ZVN0cmluZyk7CgoJcmV0dXJuIE11bHRpQnl0ZVRvV2lkZUNoYXIoMCwgMCwgbHBNdWx0aUJ5dGVTdHJpbmcsIC0xLCBscFdpZGVDaGFyU3RyLCBNQVhfUEFUSCk7Cgp9CmludCBXSU5BUEkgU3RyVG9PbGVTdHJXIChMUFdTVFIgbHBXaWRlQ2hhclN0ciwgTFBDV1NUUiBscFdTdHJpbmcpCnsKCVRSQUNFKCIlcCAlcCglcylcbiIsCglscFdpZGVDaGFyU3RyLCBscFdTdHJpbmcsIGRlYnVnc3RyX3cobHBXU3RyaW5nKSk7CgoJaWYgKGxzdHJjcHlXIChscFdpZGVDaGFyU3RyLCBscFdTdHJpbmcgKSkKCXsgcmV0dXJuIGxzdHJsZW5XIChscFdpZGVDaGFyU3RyKTsKCX0KCXJldHVybiAwOwp9CgpCT09MIFdJTkFQSSBTdHJUb09sZVN0ckFXIChMUFdTVFIgbHBXaWRlQ2hhclN0ciwgTFBDVk9JRCBscFN0cmluZykKewoJaWYgKFZFUlNJT05fT3NJc1VuaWNvZGUoKSkKCSAgcmV0dXJuIFN0clRvT2xlU3RyVyAobHBXaWRlQ2hhclN0ciwgbHBTdHJpbmcpOwoJcmV0dXJuIFN0clRvT2xlU3RyQSAobHBXaWRlQ2hhclN0ciwgbHBTdHJpbmcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNIVmFsaWRhdGVVTkMJCQkJW1NIRUxMMzIuMTczXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hWYWxpZGF0ZVVOQyAoRFdPUkQgeCwgRFdPUkQgeSwgRFdPUkQgeikKewoJRklYTUUoIjB4JTA4bHggMHglMDhseCAweCUwOGx4IHN0dWJcbiIseCx5LHopOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJRG9FbnZpcm9ubWVudFN1YnN0VwkJCVtTSEVMTDMyLjUzXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRG9FbnZpcm9ubWVudFN1YnN0QShMUFNUUiB4LCBMUFNUUiB5KQp7CglGSVhNRSgiJXAoJXMpICVwKCVzKSBzdHViXG4iLCB4LCB4LCB5LCB5KTsKCXJldHVybiAwOwp9CgpIUkVTVUxUIFdJTkFQSSBEb0Vudmlyb25tZW50U3Vic3RXKExQV1NUUiB4LCBMUFdTVFIgeSkKewoJRklYTUUoIiVwKCVzKSAlcCglcykgc3R1YlxuIiwgeCwgZGVidWdzdHJfdyh4KSwgeSwgZGVidWdzdHJfdyh5KSk7CglyZXR1cm4gMDsKfQoKSFJFU1VMVCBXSU5BUEkgRG9FbnZpcm9ubWVudFN1YnN0QVcoTFBWT0lEIHgsIExQVk9JRCB5KQp7CglpZiAoVkVSU0lPTl9Pc0lzVW5pY29kZSgpKQoJICByZXR1cm4gRG9FbnZpcm9ubWVudFN1YnN0Vyh4LCB5KTsKCXJldHVybiBEb0Vudmlyb25tZW50U3Vic3RBKHgsIHkpOwp9Cgo=