LyoKICogVGhlIHBhcmFtZXRlcnMgb2YgbWFueSBmdW5jdGlvbnMgY2hhbmdlcyBiZXR3ZWVuIGRpZmZlcmVudCBPUyB2ZXJzaW9ucwogKiAoTlQgdXNlcyBVbmljb2RlIHN0cmluZ3MsIDk1IHVzZXMgQVNDSUkgc3RyaW5ncykKICogCiAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogKiAgICAgICAgICAgMTk5OCBK/HJnZW4gU2NobWllZAogKi8KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAiZGVidWcuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2ludmVyc2lvbi5oIgojaW5jbHVkZSAiaGVhcC5oIgoKI2luY2x1ZGUgInNobG9iai5oIgojaW5jbHVkZSAic2hlbGwzMl9tYWluLmgiCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENoYW5nZU5vdGlmeVJlZ2lzdGVyCQkJW1NIRUxMMzIuMl0KICoKICogTk9URVMKICogICBJZGxpc3QgaXMgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcyBhbmQgQ291bnQgc3BlY2lmaWVzIGhvdyBtYW55IGl0ZW1zIGluIHRoZSBhcnJheQogKiAgICh1c3VhbGx5IGp1c3Qgb25lIEkgdGhpbmspLgogKi8KRFdPUkQgV0lOQVBJClNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIoCiAgICBIV05EIGh3bmQsCiAgICBMT05HIGV2ZW50czEsCiAgICBMT05HIGV2ZW50czIsCiAgICBEV09SRCBtc2csCiAgICBpbnQgY291bnQsCiAgICBJRFNUUlVDVCAqaWRsaXN0KQp7CUZJWE1FKHNoZWxsLCIoMHglMDR4LDB4JTA4bHgsMHglMDhseCwweCUwOGx4LDB4JTA4eCwlcCk6c3R1Yi5cbiIsCgkJaHduZCxldmVudHMxLGV2ZW50czIsbXNnLGNvdW50LGlkbGlzdCk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSENoYW5nZU5vdGlmeURlcmVnaXN0ZXIJCQlbU0hFTEwzMi40XQogKi8KRFdPUkQgV0lOQVBJClNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlcihMT05HIHgxKQp7CUZJWE1FKHNoZWxsLCIoMHglMDhseCk6c3R1Yi5cbiIseDEpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTlRTSENoYW5nZU5vdGlmeVJlZ2lzdGVyCQkJW1NIRUxMMzIuNjQwXQogKiBOT1RFUwogKiAgIElkbGlzdCBpcyBhbiBhcnJheSBvZiBzdHJ1Y3R1cmVzIGFuZCBDb3VudCBzcGVjaWZpZXMgaG93IG1hbnkgaXRlbXMgaW4gdGhlIGFycmF5CiAqICAgKHVzdWFsbHkganVzdCBvbmUgSSB0aGluaykuCiAqLwpEV09SRCBXSU5BUEkgTlRTSENoYW5nZU5vdGlmeVJlZ2lzdGVyKAogICAgSFdORCBod25kLAogICAgTE9ORyBldmVudHMxLAogICAgTE9ORyBldmVudHMyLAogICAgRFdPUkQgbXNnLAogICAgaW50IGNvdW50LAogICAgSURTVFJVQ1QgKmlkbGlzdCkKewlGSVhNRShzaGVsbCwiKDB4JTA0eCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCwweCUwOHgsJXApOnN0dWIuXG4iLAoJCWh3bmQsZXZlbnRzMSxldmVudHMyLG1zZyxjb3VudCxpZGxpc3QpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTlRTSENoYW5nZU5vdGlmeURlcmVnaXN0ZXIJCQlbU0hFTEwzMi42NDFdCiAqLwpEV09SRCBXSU5BUEkgTlRTSENoYW5nZU5vdGlmeURlcmVnaXN0ZXIoTE9ORyB4MSkKewlGSVhNRShzaGVsbCwiKDB4JTA4bHgpOnN0dWIuXG4iLHgxKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQYXJzZUZpZWxkCQkJCQlbU0hFTEwzMi41OF0KICoKICovCkRXT1JEIFdJTkFQSSBQYXJzZUZpZWxkQShMUENTVFIgc3JjLCBEV09SRCBmaWVsZCwgTFBTVFIgZHN0LCBEV09SRCBsZW4pIAp7CVdBUk4oc2hlbGwsIignJXMnLDB4JTA4bHgsJXAsJWxkKSBzZW1pLXN0dWIuXG4iLHNyYyxmaWVsZCxkc3QsbGVuKTsKCglpZiAoIXNyYyB8fCAhc3JjWzBdIHx8ICFkc3QgfHwgIWxlbikKCSAgcmV0dXJuIDA7CgoJaWYgKGZpZWxkID4xKQoJeyBmaWVsZC0tOwkKCSAgd2hpbGUgKGZpZWxkKQoJICB7IGlmICgqc3JjPT0weDApIHJldHVybiBGQUxTRTsKCSAgICBpZiAoKnNyYz09JywnKSBmaWVsZC0tOwoJICAgIHNyYysrOwoJICB9Cgl9CgoJd2hpbGUgKCpzcmMhPTB4MDAgJiYgKnNyYyE9JywnICYmIGxlbj4wKSAKCXsgKmRzdD0qc3JjOyBkc3QrKywgc3JjKys7IGxlbi0tOwoJfQoJKmRzdD0weDA7CgkKCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQaWNrSWNvbkRsZwkJCQkJW1NIRUxMMzIuNjJdCiAqIAogKi8KRFdPUkQgV0lOQVBJIFBpY2tJY29uRGxnKERXT1JEIHgsRFdPUkQgeSxEV09SRCB6LERXT1JEIGEpIAp7CUZJWE1FKHNoZWxsLCIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgpOnN0dWIuXG4iLHgseSx6LGEpOwoJcmV0dXJuIDB4ZmZmZmZmZmY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldEZpbGVOYW1lRnJvbUJyb3dzZQkJCVtTSEVMTDMyLjYzXQogKiAKICovCkRXT1JEIFdJTkFQSSBHZXRGaWxlTmFtZUZyb21Ccm93c2UoSFdORCBob3duZXIsIExQU1RSIHRhcmdldGJ1ZiwgRFdPUkQgbGVuLCBEV09SRCB4LCBMUENTVFIgc3VmZml4LCBMUENTVFIgeSwgTFBDU1RSIGNtZCkgCnsJRklYTUUoc2hlbGwsIiglMDR4LCVwLCVsZCwlMDhseCwlcywlcywlcyk6c3R1Yi5cbiIsCgkgICAgaG93bmVyLHRhcmdldGJ1ZixsZW4seCxzdWZmaXgseSxjbWQpOwogICAgLyogcHV0cyB1cCBhIE9wZW4gRGlhbG9nIGFuZCByZXF1ZXN0cyBpbnB1dCBpbnRvIHRhcmdldGJ1ZiAqLwogICAgLyogT0ZOX0hJREVSRUFET05MWXxPRk5fTk9DSEFOR0VESVJ8T0ZOX0ZJTEVNVVNURVhJU1R8T0ZOX3Vua25vd24gKi8KICAgIGxzdHJjcHlBKHRhcmdldGJ1ZiwieDpcXGR1bW15LmV4ZSIpOwogICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0U2V0dGluZ3MJCQkJW1NIRUxMMzIuNjhdCiAqIAogKi8KRFdPUkQgV0lOQVBJIFNIR2V0U2V0dGluZ3MoRFdPUkQgeCxEV09SRCB5LERXT1JEIHopIAp7CUZJWE1FKHNoZWxsLCIoMHglMDhseCwweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLHgseSx6KTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFNoZWxsRm9sZGVyVmlld19NZXNzYWdlCQkJW1NIRUxMMzIuNzNdCiAqCiAqIFBBUkFNRVRFUlMKICogIGh3bmRDYWJpbmV0IGRlZmluZXMgdGhlIGV4cGxvcmVyIGNhYmluZXQgd2luZG93IHRoYXQgY29udGFpbnMgdGhlIAogKiAgICAgICAgICAgICAgc2hlbGx2aWV3IHlvdSBuZWVkIHRvIGNvbW11bmljYXRlIHdpdGgKICogIHVNc2cgICAgICAgIGlkZW50aWZ5aW5nIHRoZSBTRlZNIGVudW0gdG8gcGVyZm9ybQogKiAgbFBhcmFtCiAqCiAqIE5PVEVTCiAqICBNZXNzYWdlIFNGVk1fUkVBUlJBTkdFID0gMQogKiAgICBUaGlzIG1lc3NhZ2UgZ2V0cyBzZW50IHdoZW4gYSBjb2x1bW4gZ2V0cyBjbGlja2VkIHRvIGluc3RydWN0IHRoZQogKiAgICBzaGVsbCB2aWV3IHRvIHJlLXNvcnQgdGhlIGl0ZW0gbGlzdC4gbFBhcmFtIGlkZW50aWZpZXMgdGhlIGNvbHVtbgogKiAgICB0aGF0IHdhcyBjbGlja2VkLgogKi8KaW50IFdJTkFQSSBTSFNoZWxsRm9sZGVyVmlld19NZXNzYWdlKEhXTkQgaHduZENhYmluZXQsVUlOVCB1TXNnLExQQVJBTSBsUGFyYW0pCnsgRklYTUUoc2hlbGwsIiUwNHggJTA4dXggJTA4bHggc3R1YlxuIixod25kQ2FiaW5ldCx1TXNnLGxQYXJhbSk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9sZVN0clRvU3RyTgkJCQkJW1NIRUxMMzIuNzhdCiAqLwpCT09MIFdJTkFQSSBPbGVTdHJUb1N0ck4gKExQU1RSIGxwTXVsdGksIElOVCBuTXVsdGksIExQQ1dTVFIgbHBXaWRlLCBJTlQgbldpZGUpIAp7CglUUkFDRShzaGVsbCwiJXMgJXggJXMgJXhcbiIsIGxwTXVsdGksIG5NdWx0aSwgZGVidWdzdHJfdyhscFdpZGUpLCBuV2lkZSk7CglyZXR1cm4gV2lkZUNoYXJUb011bHRpQnl0ZSAoMCwgMCwgbHBXaWRlLCBuV2lkZSwgbHBNdWx0aSwgbk11bHRpLCBOVUxMLCBOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RyVG9PbGVTdHJOCQkJCQlbU0hFTEwzMi43OV0KICovCkJPT0wgV0lOQVBJIFN0clRvT2xlU3RyTiAoTFBXU1RSIGxwV2lkZSwgSU5UIG5XaWRlLCBMUENTVFIgbHBNdWx0aSwgSU5UIG5NdWx0aSkgCnsKCVRSQUNFKHNoZWxsLCIlcyAleCAlcyAleFxuIiwgZGVidWdzdHJfdyhscFdpZGUpLCBuV2lkZSwgbHBNdWx0aSwgbk11bHRpKTsKCXJldHVybiBNdWx0aUJ5dGVUb1dpZGVDaGFyICgwLCAwLCBscE11bHRpLCBuTXVsdGksIGxwV2lkZSwgbldpZGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZWdpc3RlclNoZWxsSG9vawkJCQlbU0hFTEwzMi4xODFdCiAqCiAqIFBBUkFNUwogKiAgICAgIGh3bmQgW0ldICB3aW5kb3cgaGFuZGxlCiAqICAgICAgeSAgICBbSV0gIGZsYWcgPz8/PwogKiAKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCnZvaWQgV0lOQVBJIFJlZ2lzdGVyU2hlbGxIb29rKEhXTkQgaHduZCwgRFdPUkQgeSkgewogICAgRklYTUUoc2hlbGwsIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsaHduZCx5KTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hXCQkJCVtTSEVMTDMyLjE4Ml0KICoKICogRm9ybWF0IGFuZCBvdXRwdXQgZXJyb3JtZXNzYWdlLgogKgogKiBpZFRleHQJcmVzb3VyY2UgSUQgb2YgdGl0bGUgb3IgTFBTVFIKICogaWRUaXRsZQlyZXNvdXJjZSBJRCBvZiB0aXRsZSBvciBMUFNUUgogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KSU5UIF9fY2RlY2wKU2hlbGxNZXNzYWdlQm94VyhITU9EVUxFIGhtb2QsSFdORCBod25kLERXT1JEIGlkVGV4dCxEV09SRCBpZFRpdGxlLERXT1JEIHVUeXBlLExQQ1ZPSUQgYXJnbGlzdCkgCnsJV0NIQVIJc3pUZXh0WzEwMF0sc3pUaXRsZVsxMDBdLHN6VGVtcFsyNTZdOwoJTFBXU1RSICAgcHN6VGV4dCA9ICZzelRleHRbMF0sIHBzelRpdGxlID0gJnN6VGl0bGVbMF07CglMUFZPSUQJYXJncyA9ICZhcmdsaXN0OwoKCVRSQUNFKHNoZWxsLCIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJXApXG4iLChEV09SRClobW9kLChEV09SRClod25kLGlkVGV4dCxpZFRpdGxlLHVUeXBlLGFyZ2xpc3QpOwoKCWlmICghSElXT1JEIChpZFRpdGxlKSkKCSAgTG9hZFN0cmluZ1coaG1vZCxpZFRpdGxlLHBzelRpdGxlLDEwMCk7CgllbHNlCgkgIHBzelRpdGxlID0gKExQV1NUUilpZFRpdGxlOwoKCWlmICghIEhJV09SRCAoaWRUZXh0KSkKCSAgTG9hZFN0cmluZ1coaG1vZCxpZFRleHQscHN6VGV4dCwxMDApOwoJZWxzZQoJICBwc3pUZXh0ID0gKExQV1NUUilpZFRleHQ7CgoJRm9ybWF0TWVzc2FnZVcoRk9STUFUX01FU1NBR0VfRlJPTV9TVFJJTkcgfCBGT1JNQVRfTUVTU0FHRV9BUkdVTUVOVF9BUlJBWSAsc3pUZXh0LDAsMCxzelRlbXAsMjU2LGFyZ3MpOwoJcmV0dXJuIE1lc3NhZ2VCb3hXKGh3bmQsc3pUZW1wLHN6VGl0bGUsdVR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbE1lc3NhZ2VCb3hBCQkJCVtTSEVMTDMyLjE4M10KICovCklOVCBfX2NkZWNsClNoZWxsTWVzc2FnZUJveEEoSE1PRFVMRSBobW9kLEhXTkQgaHduZCxEV09SRCBpZFRleHQsRFdPUkQgaWRUaXRsZSxEV09SRCB1VHlwZSxMUENWT0lEIGFyZ2xpc3QpIAp7CWNoYXIJc3pUZXh0WzEwMF0sc3pUaXRsZVsxMDBdLHN6VGVtcFsyNTZdOwoJTFBTVFIgICBwc3pUZXh0ID0gJnN6VGV4dFswXSwgcHN6VGl0bGUgPSAmc3pUaXRsZVswXTsKCUxQVk9JRAlhcmdzID0gJmFyZ2xpc3Q7CgoJVFJBQ0Uoc2hlbGwsIiglMDhseCwlMDhseCwlMDhseCwlMDhseCwlMDhseCwlcClcbiIsIChEV09SRClobW9kLChEV09SRClod25kLGlkVGV4dCxpZFRpdGxlLHVUeXBlLGFyZ2xpc3QpOwoKCWlmICghSElXT1JEIChpZFRpdGxlKSkKCSAgTG9hZFN0cmluZ0EoaG1vZCxpZFRpdGxlLHBzelRpdGxlLDEwMCk7CgllbHNlCgkgIHBzelRpdGxlID0gKExQU1RSKWlkVGl0bGU7CgoJaWYgKCEgSElXT1JEIChpZFRleHQpKQoJICBMb2FkU3RyaW5nQShobW9kLGlkVGV4dCxwc3pUZXh0LDEwMCk7CgllbHNlCgkgIHBzelRleHQgPSAoTFBTVFIpaWRUZXh0OwoKCUZvcm1hdE1lc3NhZ2VBKEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HIHwgRk9STUFUX01FU1NBR0VfQVJHVU1FTlRfQVJSQVkgLHBzelRleHQsMCwwLHN6VGVtcCwyNTYsYXJncyk7CglyZXR1cm4gTWVzc2FnZUJveEEoaHduZCxzelRlbXAscHN6VGl0bGUsdVR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlc3RyaWN0ZWQJCQkJW1NIRUxMMzIuMTAwXQogKgogKiB3YWxrcyB0aHJvdWdoIHBvbGljeSB0YWJsZSwgcXVlcmllcyA8YXBwPiBrZXksIDx0eXBlPiB2YWx1ZSwgcmV0dXJucyAKICogcXVlcmllZCAoRFdPUkQpIHZhbHVlLgogKiB7MHgwMDAwMSxFeHBsb3JlcixOb1J1bn0KICogezB4MDAwMDIsRXhwbG9yZXIsTm9DbG9zZX0KICogezB4MDAwMDQsRXhwbG9yZXIsTm9TYXZlU2V0dGluZ3N9CiAqIHsweDAwMDA4LEV4cGxvcmVyLE5vRmlsZU1lbnV9CiAqIHsweDAwMDEwLEV4cGxvcmVyLE5vU2V0Rm9sZGVyc30KICogezB4MDAwMjAsRXhwbG9yZXIsTm9TZXRUYXNrYmFyfQogKiB7MHgwMDA0MCxFeHBsb3JlcixOb0Rlc2t0b3B9CiAqIHsweDAwMDgwLEV4cGxvcmVyLE5vRmluZH0KICogezB4MDAxMDAsRXhwbG9yZXIsTm9Ecml2ZXN9CiAqIHsweDAwMjAwLEV4cGxvcmVyLE5vRHJpdmVBdXRvUnVufQogKiB7MHgwMDQwMCxFeHBsb3JlcixOb0RyaXZlVHlwZUF1dG9SdW59CiAqIHsweDAwODAwLEV4cGxvcmVyLE5vTmV0SG9vZH0KICogezB4MDEwMDAsRXhwbG9yZXIsTm9TdGFydEJhbm5lcn0KICogezB4MDIwMDAsRXhwbG9yZXIsUmVzdHJpY3RSdW59CiAqIHsweDA0MDAwLEV4cGxvcmVyLE5vUHJpbnRlclRhYnN9CiAqIHsweDA4MDAwLEV4cGxvcmVyLE5vRGVsZXRlUHJpbnRlcn0KICogezB4MTAwMDAsRXhwbG9yZXIsTm9BZGRQcmludGVyfQogKiB7MHgyMDAwMCxFeHBsb3JlcixOb1N0YXJ0TWVudVN1YkZvbGRlcnN9CiAqIHsweDQwMDAwLEV4cGxvcmVyLE15RG9jc09uTmV0fQogKiB7MHg4MDAwMCxXaW5PbGRBcHAsTm9SZWFsTW9kZX0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSSBTSFJlc3RyaWN0ZWQgKERXT1JEIHBvbCkgewoJSEtFWQl4aGtleTsKCglGSVhNRShzaGVsbCwiKCUwOGx4KTpzdHViLlxuIixwb2wpOwoJaWYgKFJlZ09wZW5LZXlBKEhLRVlfQ1VSUkVOVF9VU0VSLCJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcUG9saWNpZXMiLCZ4aGtleSkpCgkJcmV0dXJuIDA7CgkvKiBGSVhNRTogZG8gbm90aGluZyBmb3Igbm93LCBqdXN0IHJldHVybiAwICg9PSAiYWxsb3dlZCIpICovCglSZWdDbG9zZUtleSh4aGtleSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVEaXJlY3RvcnkJCQkJW1NIRUxMMzIuMTY1XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKiAgbm90IHN1cmUgYWJvdXQgTFBTRUNVUklUWV9BVFRSSUJVVEVTCiAqLwpEV09SRCBXSU5BUEkgU0hDcmVhdGVEaXJlY3RvcnkoTFBTRUNVUklUWV9BVFRSSUJVVEVTIHNlYyxMUENTVFIgcGF0aCkgewoJVFJBQ0Uoc2hlbGwsIiglcCwlcyk6c3R1Yi5cbiIsc2VjLHBhdGgpOwoJaWYgKENyZWF0ZURpcmVjdG9yeUEocGF0aCxzZWMpKQoJCXJldHVybiBUUlVFOwoJLyogU0hDaGFuZ2VOb3RpZnkoOCwxLHBhdGgsMCk7ICovCglyZXR1cm4gRkFMU0U7CiNpZiAwCglpZiAoU0hFTEwzMl83OShwYXRoLChMUFZPSUQpeCkpCgkJcmV0dXJuIDA7CglGSVhNRShzaGVsbCwiKCUwOGx4LCVzKTpzdHViLlxuIix4LHBhdGgpOwoJcmV0dXJuIDA7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWUJCQkJCVtTSEVMTDMyLjE5NV0KICoKICogTk9URVMKICogICAgIGZyZWVfcHRyKCkgLSBmcmVlcyBtZW1vcnkgdXNpbmcgSU1hbGxvYwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIRnJlZShMUFZPSUQgeCkgewogIFRSQUNFKHNoZWxsLCIlcFxuIix4KTsKICBpZiAoIUhJV09SRCh4KSkKICB7ICooTFBEV09SRCkweGRlYWYwMDAwID0gMDsKICB9CiAgcmV0dXJuIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBbGxvYwkJCQkJW1NIRUxMMzIuMTk2XQogKgogKiBOT1RFUwogKiAgICAgdm9pZCAqdGFza19hbGxvYyhEV09SRCBsZW4pLCB1c2VzIFNITWFsbG9jIGFsbG9jYXRvcgogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KTFBWT0lEIFdJTkFQSSBTSEFsbG9jKERXT1JEIGxlbikgewogLyogdm9pZCAqIHJldCA9IChMUFZPSUQpTG9jYWxBbGxvYzMyKGxlbixMTUVNX1pFUk9JTklUKTsqLyAvKiBjaHJhc2hlcyAqLwogdm9pZCAqIHJldCA9IChMUFZPSUQpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKICBUUkFDRShzaGVsbCwiJWx1IGJ5dGVzIGF0ICVwXG4iLGxlbiwgcmV0KTsKICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPcGVuUmVnU3RyZWFtCQkJCVtTSEVMTDMyLjg1XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIE9wZW5SZWdTdHJlYW0oRFdPUkQgeDEsRFdPUkQgeDIsRFdPUkQgeDMsRFdPUkQgeDQpIHsKICAgIEZJWE1FKHNoZWxsLCIoMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIsCiAgICAJeDEseDIseDMseDQKICAgICk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdpc3RlckRyYWdEcm9wCQkJCVtTSEVMTDMyLjg2XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIUmVnaXN0ZXJEcmFnRHJvcChIV05EIGh3bmQsRFdPUkQgeDIpIHsKICAgIEZJWE1FIChzaGVsbCwgIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsIGh3bmQsIHgyKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJldm9rZURyYWdEcm9wCQkJCVtTSEVMTDMyLjg3XQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJIFNIUmV2b2tlRHJhZ0Ryb3AoRFdPUkQgeCkgewogICAgRklYTUUoc2hlbGwsIigweCUwOGx4KTpzdHViLlxuIix4KTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSdW5GaWxlRGxnCQkJCQlbU0hFTEwzMi42MV0KICoKICogTk9URVMKICogICAgIE9yaWdpbmFsIG5hbWU6IFJ1bkZpbGVEbGcgKGV4cG9ydGVkIGJ5IG9yZGluYWwpCiAqLwpEV09SRCBXSU5BUEkKUnVuRmlsZURsZyAoSFdORCBod25kT3duZXIsIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMiwKCSAgICBMUFNUUiBscHN6VGl0bGUsIExQU1RSIGxwc3pQcm9tcHQsIFVJTlQgdUZsYWdzKQp7CiAgICBGSVhNRSAoc2hlbGwsIigweCUwOHggMHglbHggMHglbHggXCIlc1wiIFwiJXNcIiAweCV4KTpzdHViLlxuIiwKCSAgIGh3bmRPd25lciwgZHdQYXJhbTEsIGR3UGFyYW0yLCBscHN6VGl0bGUsIGxwc3pQcm9tcHQsIHVGbGFncyk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRXhpdFdpbmRvd3NEaWFsb2cJCQkJW1NIRUxMMzIuNjBdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCiAqLwpEV09SRCBXSU5BUEkKRXhpdFdpbmRvd3NEaWFsb2cgKEhXTkQgaHduZE93bmVyKQp7CiAgICBGSVhNRSAoc2hlbGwsIigweCUwOHgpOnN0dWIuXG4iLCBod25kT3duZXIpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEFycmFuZ2VXaW5kb3dzCQkJCVtTSEVMTDMyLjE4NF0KICogCiAqLwpEV09SRCBXSU5BUEkKQXJyYW5nZVdpbmRvd3MgKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMiwgRFdPUkQgZHdQYXJhbTMsCgkJRFdPUkQgZHdQYXJhbTQsIERXT1JEIGR3UGFyYW01KQp7CiAgICBGSVhNRSAoc2hlbGwsIigweCVseCAweCVseCAweCVseCAweCVseCAweCVseCk6c3R1Yi5cbiIsCgkgICBkd1BhcmFtMSwgZHdQYXJhbTIsIGR3UGFyYW0zLCBkd1BhcmFtNCwgZHdQYXJhbTUpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ0xTSURGcm9tU3RyaW5nCQkJCVtTSEVMTDMyLjE0N10KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICovCkRXT1JEIFdJTkFQSQpTSENMU0lERnJvbVN0cmluZyAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQp7CiAgICBGSVhNRSAoc2hlbGwsIigweCVseCAweCVseCk6c3R1Yi5cbiIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAgICBGSVhNRSAoc2hlbGwsIihcIiVzXCIgXCIlc1wiKTpzdHViLlxuIiwgKExQU1RSKWR3UGFyYW0xLCAoTFBTVFIpZHdQYXJhbTIpOwoKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2lnbmFsRmlsZU9wZW4JCQkJW1NIRUxMMzIuMTAzXQogKgogKiBOT1RFUwogKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogKi8KRFdPUkQgV0lOQVBJClNpZ25hbEZpbGVPcGVuIChEV09SRCBkd1BhcmFtMSkKewogICAgRklYTUUgKHNoZWxsLCIoMHglMDhseCk6c3R1Yi5cbiIsIGR3UGFyYW0xKTsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hBZGRUb1JlY2VudERvY3MJCQkJW1NIRUxMMzIuMjM0XQogKgogKiBQQVJBTUVURVJTCiAqICAgdUZsYWdzICBbSU5dIFNIQVJEX1BBVEggb3IgU0hBUkRfUElETAogKiAgIHB2ICAgICAgW0lOXSBzdHJpbmcgb3IgcGlkbCwgTlVMTCBjbGVhcnMgdGhlIGxpc3QKICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKICovCkRXT1JEIFdJTkFQSSBTSEFkZFRvUmVjZW50RG9jcyAoVUlOVCB1RmxhZ3MsTFBDVk9JRCBwdikgICAKeyBpZiAoU0hBUkRfUElETD09dUZsYWdzKQogIHsgRklYTUUgKHNoZWxsLCIoMHglMDh4LHBpZGw9JXApOnN0dWIuXG4iLCB1RmxhZ3MscHYpOwoJfQoJZWxzZQoJeyBGSVhNRSAoc2hlbGwsIigweCUwOHgsJXMpOnN0dWIuXG4iLCB1RmxhZ3MsKGNoYXIqKXB2KTsKCX0KICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZpbGVPcGVyYXRpb24JCQkJW1NIRUxMMzIuMjQyXQogKgogKi8KRFdPUkQgV0lOQVBJIFNIRmlsZU9wZXJhdGlvbkFXKERXT1JEIHgpCnsJRklYTUUoc2hlbGwsIjB4JTA4bHggc3R1YlxuIix4KTsKCXJldHVybiAwOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGaWxlT3BlcmF0aW9uQQkJCQlbU0hFTEwzMi4yNDNdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hGaWxlT3BlcmF0aW9uQSAoTFBTSEZJTEVPUFNUUlVDVEEgbHBGaWxlT3ApICAgCnsgRklYTUUgKHNoZWxsLCIoJXApOnN0dWIuXG4iLCBscEZpbGVPcCk7CiAgcmV0dXJuIDE7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGaWxlT3BlcmF0aW9uVwkJCQlbU0hFTEwzMi4yNDRdCiAqCiAqIE5PVEVTCiAqICAgICBleHBvcnRlZCBieSBuYW1lCiAqLwpEV09SRCBXSU5BUEkgU0hGaWxlT3BlcmF0aW9uVyAoTFBTSEZJTEVPUFNUUlVDVFcgbHBGaWxlT3ApICAgCnsgRklYTUUgKHNoZWxsLCIoJXApOnN0dWIuXG4iLCBscEZpbGVPcCk7CiAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIQ2hhbmdlTm90aWZ5CQkJCVtTSEVMTDMyLjIzOV0KICoKICogTk9URVMKICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKICovCkRXT1JEIFdJTkFQSSBTSENoYW5nZU5vdGlmeSAoCiAgICBJTlQgICB3RXZlbnRJZCwgIC8qIFtJTl0gZmxhZ3MgdGhhdCBzcGVjaWZpZXMgdGhlIGV2ZW50Ki8KICAgIFVJTlQgIHVGbGFncywgICAvKiBbSU5dIHRoZSBtZWFuaW5nIG9mIGR3SXRlbVsxfDJdKi8KCQlMUENWT0lEIGR3SXRlbTEsCgkJTFBDVk9JRCBkd0l0ZW0yKQp7IEZJWE1FIChzaGVsbCwiKDB4JTA4eCwweCUwOHV4LCVwLCVwKTpzdHViLlxuIiwgd0V2ZW50SWQsdUZsYWdzLGR3SXRlbTEsZHdJdGVtMik7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeAkJCVtTSEVMTDMyLjE3NF0KICoKICogTk9URVMKICogIHNlZSBJU2hlbGxGb2xkZXI6OkNyZWF0ZVZpZXdPYmplY3QKICovCkhSRVNVTFQgV0lOQVBJIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXgoCiAgTFBTSEVMTFZJRVdEQVRBIHBzdmNiaSwgLypbaW4gXSBzaGVsbHRlbXBsYXRlIHN0cnVjdCovCiAgTFBWT0lEKiBwcHYpICAgICAgICAgICAgLypbb3V0XSBJU2hlbGxWaWV3IHBvaW50ZXIqLwp7IEZJWE1FIChzaGVsbCwiKCVwLCVwKTpzdHViLlxuIiwgcHN2Y2JpLHBwdik7CiAgcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hGaW5kX0luaXRNZW51UG9wdXAJCQkJW1NIRUxMMzIuMTQ5XQogKgogKiBOT1RFUwogKiAgUmVnaXN0ZXJzIHRoZSBtZW51IGJlaGluZCB0aGUgIlN0YXJ0IiBidXR0b24KICoKICogUEFSQU1FVEVSUwogKiAgaE1lbnUJCVtpbl0gaGFuZGVsIG9mIG1lbnUgcHJldmlvdXNseSBjcmVhdGVkCiAqICBoV25kUGFyZW50CVtpbl0gcGFyZW50IHdpbmRvdwogKiAgdwkJCVtpbl0gbm8gcG9pbnRlcgogKiAgeAkJCVtpbl0gbm8gcG9pbnRlcgogKi8KSFJFU1VMVCBXSU5BUEkgU0hGaW5kX0luaXRNZW51UG9wdXAgKEhNRU5VIGhNZW51LCBIV05EIGhXbmRQYXJlbnQsIERXT1JEIHcsIERXT1JEIHgpCnsJRklYTUUoc2hlbGwsImhtZW51PTB4JTA4eCBod25kPTB4JTA4eCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIiwKCQloTWVudSxoV25kUGFyZW50LHcseCk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGaWxlTWVudV9Jbml0TWVudVBvcHVwCQkJW1NIRUxMMzIuMTA5XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfSW5pdE1lbnVQb3B1cCAoRFdPUkQgaG1lbnUpCnsJRklYTUUoc2hlbGwsImhtZW51PTB4JWx4IHN0dWJcbiIsaG1lbnUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZU1lbnVfQ3JlYXRlCQkJCVtTSEVMTDMyLjExNF0KICoKICogdyByZXR2YWwgZnJvbSBMb2FkQml0bWFwQQogKgogKgogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfQ3JlYXRlIChEV09SRCB1LCBEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB6KQp7IEZJWE1FKHNoZWxsLCIweCUwOGx4IDB4JTA4bHggaGJtcD0weCVseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix1LHYsdyx4LHopOwogIHJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEZpbGVNZW51X1RyYWNrUG9wdXBNZW51RXgJCQlbU0hFTEwzMi4xMTZdCiAqCiAqIFBBUkFNRVRFUlMKICogIHVGbGFncwkJW2luXQlhY2NvcmRpbmcgdG8gVHJhY2tQb3B1cE1lbnVFeAogKiAgcG9zWAkJW2luXQogKiAgcG9zWQkJW2luXQogKiAgaFduZFBhcmVudAkJW2luXQogKiAgegljb3VsZCBiZSByZWN0ICh0cmFjZSkgb3IgVFBNUEFSQU1TIChUcmFja1BvcHVwTWVudUV4KQogKi8KSFJFU1VMVCBXSU5BUEkgRmlsZU1lbnVfVHJhY2tQb3B1cE1lbnVFeCAoRFdPUkQgdCwgRFdPUkQgdUZsYWdzLCBEV09SRCBwb3NYLCBEV09SRCBwb3NZLCBIV05EIGhXbmRQYXJlbnQsIERXT1JEIHopCnsJRklYTUUoc2hlbGwsIjB4JWx4IGZsYWdzPTB4JWx4IHBvc3g9MHglbHggcG9zeT0weCVseCBod25kcD0weCV4IDB4JWx4IHN0dWJcbiIsCgkJdCx1RmxhZ3MscG9zWCxwb3NZLCBoV25kUGFyZW50LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIFNIV2luSGVscAkJCQkJW1NIRUxMMzIuMTI3XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hXaW5IZWxwIChEV09SRCB2LCBEV09SRCB3LCBEV09SRCB4LCBEV09SRCB6KQp7CUZJWE1FKHNoZWxsLCIweCUwOGx4IDB4JTA4bHggMHglMDhseCAweCUwOGx4IHN0dWJcbiIsdix3LHgseik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU0hSdW5Db250cm9sUGFuZWwgW1NIRUxMMzIuMTYxXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSdW5Db250cm9sUGFuZWwgKERXT1JEIHgsIERXT1JEIHopCnsJRklYTUUoc2hlbGwsIjB4JTA4bHggMHglMDhseCBzdHViXG4iLHgseik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeAkJCQlbU0hFTEwzMi4yOTFdCiAqCiAqLwpCT09MIFdJTkFQSSBTaGVsbEV4ZWN1dGVFeEFXIChMUFZPSUQgc2VpKQp7CWlmIChWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgIHJldHVybiBTaGVsbEV4ZWN1dGVFeFcgKHNlaSk7CglyZXR1cm4gU2hlbGxFeGVjdXRlRXhBIChzZWkpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNoZWxsRXhlY3V0ZUV4QQkJCQlbU0hFTEwzMi4yOTJdCiAqCiAqLwpCT09MIFdJTkFQSSBTaGVsbEV4ZWN1dGVFeEEgKExQU0hFTExFWEVDVVRFSU5GT0Egc2VpKQp7IAlDSEFSIHN6QXBwbGljYXRpb25OYW1lW01BWF9QQVRIXSxzekNvbW1hbmRsaW5lW01BWF9QQVRIXSxzelBpZGxbMjBdOwoJTFBTVFIgcG9zOwoJaW50IGdhcCwgbGVuOwoJU1RBUlRVUElORk9BICBzdGFydHVwaW5mbzsKCVBST0NFU1NfSU5GT1JNQVRJT04gcHJvY2Vzc2luZm9ybWF0aW9uOwoJCQkKICAJV0FSTihzaGVsbCwibWFzaz0weCUwOGx4IGh3bmQ9MHglMDR4IHZlcmI9JXMgZmlsZT0lcyBwYXJtPSVzIGRpcj0lcyBzaG93PTB4JTA4eCBjbGFzcz0lcyBpbmNvbXBsZXRlXG4iLAoJCXNlaS0+Zk1hc2ssIHNlaS0+aHduZCwgc2VpLT5scFZlcmIsIHNlaS0+bHBGaWxlLAoJCXNlaS0+bHBQYXJhbWV0ZXJzLCBzZWktPmxwRGlyZWN0b3J5LCBzZWktPm5TaG93LCBzZWktPmxwQ2xhc3MpOwoKCVplcm9NZW1vcnkoc3pBcHBsaWNhdGlvbk5hbWUsTUFYX1BBVEgpOwoJaWYgKHNlaS0+bHBGaWxlKQoJICBzdHJjcHkoc3pBcHBsaWNhdGlvbk5hbWUsIHNlaS0+bHBGaWxlKTsKCQoJWmVyb01lbW9yeShzekNvbW1hbmRsaW5lLE1BWF9QQVRIKTsKCWlmIChzZWktPmxwUGFyYW1ldGVycykKCSAgc3RyY3B5KHN6Q29tbWFuZGxpbmUsIHNlaS0+bHBQYXJhbWV0ZXJzKTsKCQkJCglpZiAoc2VpLT5mTWFzayAmIChTRUVfTUFTS19DTEFTU0tFWSB8IFNFRV9NQVNLX0lOVk9LRUlETElTVCB8IFNFRV9NQVNLX0lDT04gfCBTRUVfTUFTS19IT1RLRVkgfAoJCQkgIFNFRV9NQVNLX05PQ0xPU0VQUk9DRVNTIHwgU0VFX01BU0tfQ09OTkVDVE5FVERSViB8IFNFRV9NQVNLX0ZMQUdfRERFV0FJVCB8CgkJCSAgU0VFX01BU0tfRE9FTlZTVUJTVCB8IFNFRV9NQVNLX0ZMQUdfTk9fVUkgfCBTRUVfTUFTS19VTklDT0RFIHwgCgkJCSAgU0VFX01BU0tfTk9fQ09OU09MRSB8IFNFRV9NQVNLX0FTWU5DT0sgfCBTRUVfTUFTS19ITU9OSVRPUiApKQoJeyBGSVhNRSAoc2hlbGwsImZsYWdzIGlnbm9yZWQ6IDB4JTA4bHhcbiIsIHNlaS0+Zk1hc2spOwoJfQoKCWlmIChzZWktPmZNYXNrICYgU0VFX01BU0tfQ0xBU1NOQU1FKQoJeyBIQ1JfR2V0RXhlY3V0ZUNvbW1hbmQoc2VpLT5scENsYXNzLCAoc2VpLT5scFZlcmIpID8gc2VpLT5scFZlcmIgOiAib3BlbiIsIHN6Q29tbWFuZGxpbmUsIDI1Nik7CSAgICAKCX0KCgkvKiBwcm9jZXNzIHRoZSBJRExpc3QgKi8KCWlmICggKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19JTlZPS0VJRExJU1QpID09IFNFRV9NQVNLX0lOVk9LRUlETElTVCkgLyoweDBjKi8KCXsgU0hHZXRQYXRoRnJvbUlETGlzdEEgKHNlaS0+bHBJRExpc3Qsc3pBcHBsaWNhdGlvbk5hbWUpOwoJICBUUkFDRShzaGVsbCwiLS0gaWRsaXN0PSVwICglcylcbiIsIHNlaS0+bHBJRExpc3QsIHN6QXBwbGljYXRpb25OYW1lKTsKCX0KCWVsc2UKCXsgaWYgKHNlaS0+Zk1hc2sgJiBTRUVfTUFTS19JRExJU1QgKQoJICB7IC8qICVJIGlzIHRoZSBhZHJlc3Mgb2YgYSBnbG9iYWwgaXRlbSBJRCovCgkgICAgcG9zID0gc3Ryc3RyKHN6Q29tbWFuZGxpbmUsICIlSSIpOwoJICAgIGlmIChwb3MpCgkgICAgeyBIR0xPQkFMIGhtZW0gPSBTSEFsbG9jU2hhcmVkICggc2VpLT5scElETGlzdCwgSUxHZXRTaXplKHNlaS0+bHBJRExpc3QpLCAwKTsKCSAgICAgIHNwcmludGYoc3pQaWRsLCI6JWxpIiwoRFdPUkQpU0hMb2NrU2hhcmVkKGhtZW0sMCkgKTsKCSAgICAgIFNIVW5sb2NrU2hhcmVkKGhtZW0pOwoJICAgIAoJICAgICAgZ2FwID0gc3RybGVuKHN6UGlkbCk7CgkgICAgICBsZW4gPSBzdHJsZW4ocG9zKS0yOwoJICAgICAgbWVtbW92ZShwb3MrZ2FwLHBvcysyLGxlbik7CgkgICAgICBtZW1jcHkocG9zLHN6UGlkbCxnYXApOwoKCSAgICB9CgkgIH0KCX0KCglwb3MgPSBzdHJzdHIoc3pDb21tYW5kbGluZSwgIiwlTCIpOwkvKiBkdW5ubyB3aGF0IGl0IG1lYW5zOiBraWxsIGl0Ki8KCWlmIChwb3MpCgl7IGxlbiA9IHN0cmxlbihwb3MpLTI7CgkgICpwb3M9MHgwOwoJICBtZW1tb3ZlKHBvcyxwb3MrMyxsZW4pOwoJfQoKCVRSQUNFKHNoZWxsLCJleGVjdXRlOiAlcyAlc1xuIixzekFwcGxpY2F0aW9uTmFtZSwgc3pDb21tYW5kbGluZSk7CgoJWmVyb01lbW9yeSgmc3RhcnR1cGluZm8sc2l6ZW9mKFNUQVJUVVBJTkZPQSkpOwoJc3RhcnR1cGluZm8uY2IgPSBzaXplb2YoU1RBUlRVUElORk9BKTsKCglyZXR1cm4gQ3JlYXRlUHJvY2Vzc0Eoc3pBcHBsaWNhdGlvbk5hbWVbMF0gPyBzekFwcGxpY2F0aW9uTmFtZTpOVUxMLAoJCQkgc3pDb21tYW5kbGluZVswXSA/IHN6Q29tbWFuZGxpbmUgOiBOVUxMLAoJCQkgTlVMTCwgTlVMTCwgRkFMU0UsIDAsIAoJCQkgTlVMTCwgTlVMTCwgJnN0YXJ0dXBpbmZvLCAmcHJvY2Vzc2luZm9ybWF0aW9uKTsKCSAgCgkKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbEV4ZWN1dGVFeFcJCQkJW1NIRUxMMzIuMjkzXQogKgogKi8KQk9PTCBXSU5BUEkgU2hlbGxFeGVjdXRlRXhXIChMUFNIRUxMRVhFQ1VURUlORk9XIHNlaSkKewlTSEVMTEVYRUNVVEVJTkZPQSBzZWlBOwoJRFdPUkQgcmV0OwoKCVRSQUNFIChzaGVsbCwiJXBcbiIsIHNlaSk7CgoJbWVtY3B5KCZzZWlBLCBzZWksIHNpemVvZihTSEVMTEVYRUNVVEVJTkZPQSkpOwoJCiAgICAgICAgaWYgKHNlaS0+bHBWZXJiKQoJICBzZWlBLmxwVmVyYiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scFZlcmIpOwoKICAgICAgICBpZiAoc2VpLT5scEZpbGUpCgkgIHNlaUEubHBGaWxlID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzZWktPmxwRmlsZSk7CgogICAgICAgIGlmIChzZWktPmxwUGFyYW1ldGVycykKCSAgc2VpQS5scFBhcmFtZXRlcnMgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBQYXJhbWV0ZXJzKTsKCglpZiAoc2VpLT5scERpcmVjdG9yeSkKCSAgc2VpQS5scERpcmVjdG9yeSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2VpLT5scERpcmVjdG9yeSk7CgogICAgICAgIGlmICgoc2VpLT5mTWFzayAmIFNFRV9NQVNLX0NMQVNTTkFNRSkgJiYgc2VpLT5scENsYXNzKQoJICBzZWlBLmxwQ2xhc3MgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNlaS0+bHBDbGFzcyk7CgllbHNlCgkgIHNlaUEubHBDbGFzcyA9IE5VTEw7CgkgIAkgIAoJcmV0ID0gU2hlbGxFeGVjdXRlRXhBKCZzZWlBKTsKCiAgICAgICAgaWYgKHNlaUEubHBWZXJiKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwVmVyYiApOwoJaWYgKHNlaUEubHBGaWxlKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwRmlsZSApOwoJaWYgKHNlaUEubHBQYXJhbWV0ZXJzKQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKSBzZWlBLmxwUGFyYW1ldGVycyApOwoJaWYgKHNlaUEubHBEaXJlY3RvcnkpCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpIHNlaUEubHBEaXJlY3RvcnkgKTsKCWlmIChzZWlBLmxwQ2xhc3MpCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCAoTFBTVFIpIHNlaUEubHBDbGFzcyApOwoKIAlyZXR1cm4gcmV0Owp9CgpzdGF0aWMgTFBVTktOT1dOIFNIRUxMMzJfSUV4cGxvcmVySW50ZXJmYWNlPTA7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIU2V0SW5zdGFuY2VFeHBsb3JlcgkJCVtTSEVMTDMyLjE3Nl0KICoKICogTk9URVMKICogIFNldHMgdGhlIGludGVyZmFjZQogKi8KSFJFU1VMVCBXSU5BUEkgU0hTZXRJbnN0YW5jZUV4cGxvcmVyIChMUFVOS05PV04gbHBVbmtub3duKQp7CVRSQUNFIChzaGVsbCwiJXBcbiIsIGxwVW5rbm93bik7CglTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSA9IGxwVW5rbm93bjsKCXJldHVybiAoSFJFU1VMVCkgbHBVbmtub3duOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIR2V0SW5zdGFuY2VFeHBsb3JlcgkJCVtTSEVMTDMyLjI1Nl0KICoKICogTk9URVMKICogIGdldHMgdGhlIGludGVyZmFjZSBwb2ludGVyIG9mIHRoZSBleHBsb3JlciBhbmQgYSByZWZlcmVuY2UKICovCkhSRVNVTFQgV0lOQVBJIFNIR2V0SW5zdGFuY2VFeHBsb3JlciAoTFBVTktOT1dOICogbHBVbmtub3duKQp7CVRSQUNFKHNoZWxsLCIlcFxuIiwgbHBVbmtub3duKTsKCgkqbHBVbmtub3duID0gU0hFTEwzMl9JRXhwbG9yZXJJbnRlcmZhY2U7CgoJaWYgKCFTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSkKCSAgcmV0dXJuIEVfRkFJTDsKCglTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZS0+bHB2dGJsLT5mbkFkZFJlZihTSEVMTDMyX0lFeHBsb3JlckludGVyZmFjZSk7CglyZXR1cm4gTk9FUlJPUjsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWVVbnVzZWRMaWJyYXJpZXMJCQlbU0hFTEwzMi4xMjNdCiAqCiAqIE5PVEVTCiAqICBleHBvcnRlZCBieSBuYW1lCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEZyZWVVbnVzZWRMaWJyYXJpZXMgKHZvaWQpCnsJRklYTUUoc2hlbGwsInN0dWJcbiIpOwoJcmV0dXJuIFRSVUU7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREFEX1Nob3dEcmFnSW1hZ2UJCQkJW1NIRUxMMzIuMTM3XQogKgogKiBOT1RFUwogKiAgZXhwb3J0ZWQgYnkgbmFtZQogKi8KSFJFU1VMVCBXSU5BUEkgREFEX1Nob3dEcmFnSW1hZ2UgKERXT1JEIHUpCnsgRklYTUUoc2hlbGwsIjB4JTA4bHggc3R1YlxuIix1KTsKICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGaWxlTWVudV9EZXN0cm95CQkJCVtTSEVMTDMyLjExOF0KICoKICogTk9URVMKICogIGV4cG9ydGVkIGJ5IG5hbWUKICovCkhSRVNVTFQgV0lOQVBJIEZpbGVNZW51X0Rlc3Ryb3kgKERXT1JEIHUpCnsgRklYTUUoc2hlbGwsIjB4JTA4bHggc3R1YlxuIix1KTsKICByZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ0Nsb3NlS2V5CQkJW05UNC4wOlNIRUxMMzIuNTA1XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hSZWdDbG9zZUtleSAoSEtFWSBoa2V5KQp7CVRSQUNFKHNoZWxsLCIweCUwNHhcbiIsaGtleSk7CglyZXR1cm4gUmVnQ2xvc2VLZXkoIGhrZXkgKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ09wZW5LZXlBCQkJCVtTSEVMTDMyLjUwNl0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnT3BlbktleUEoSEtFWSBoS2V5LCBMUFNUUiBscFN1YktleSwgTFBIS0VZIHBoa1Jlc3VsdCkKewlGSVhNRShzaGVsbCwiKDB4JTA4eCwgJXMsICVwKVxuIiwgaEtleSwgZGVidWdzdHJfYShscFN1YktleSksCgkgICAgICBwaGtSZXN1bHQpOwoJcmV0dXJuIFJlZ09wZW5LZXlBKGhLZXksIGxwU3ViS2V5LCBwaGtSZXN1bHQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFJlZ09wZW5LZXlXCQkJCVtOVDQuMDpTSEVMTDMyLjUwN10KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnT3BlbktleVcgKEhLRVkgaGtleSwgTFBDV1NUUiBscHN6U3ViS2V5LCBMUEhLRVkgcmV0a2V5KQp7CVdBUk4oc2hlbGwsIjB4JTA0eCAlcyAlcFxuIixoa2V5LGRlYnVnc3RyX3cobHBzelN1YktleSkscmV0a2V5KTsKCXJldHVybiBSZWdPcGVuS2V5VyggaGtleSwgbHBzelN1YktleSwgcmV0a2V5ICk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdRdWVyeVZhbHVlRXhBCQkJCVtTSEVMTDMyLjUwOV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIUmVnUXVlcnlWYWx1ZUV4QShEV09SRCB1LCBMUFNUUiB2LCBEV09SRCB3LCBEV09SRCB4LAoJCQkJICBEV09SRCB5LCBEV09SRCB6KQp7CUZJWE1FKHNoZWxsLCIweCUwNGx4ICVzIDB4JTA0bHggMHglMDRseCAweCUwNGx4ICAweCUwNGx4IHN0dWJcbiIsCgkJdSxkZWJ1Z3N0cl9hKHYpLHcseCx5LHopOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdRdWVyeVZhbHVlVwkJCQlbTlQ0LjA6U0hFTEwzMi41MTBdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ1F1ZXJ5VmFsdWVXIChIS0VZIGhrZXksIExQV1NUUiBscHN6U3ViS2V5LAoJCQkJIExQV1NUUiBscHN6RGF0YSwgTFBEV09SRCBscGNiRGF0YSApCnsJV0FSTihzaGVsbCwiMHglMDR4ICVzICVwICVwIHNlbWktc3R1YlxuIiwKCQloa2V5LCBkZWJ1Z3N0cl93KGxwc3pTdWJLZXkpLCBscHN6RGF0YSwgbHBjYkRhdGEpOwoJcmV0dXJuIFJlZ1F1ZXJ5VmFsdWVXKCBoa2V5LCBscHN6U3ViS2V5LCBscHN6RGF0YSwgbHBjYkRhdGEgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hSZWdRdWVyeVZhbHVlRXhXCQkJCVtOVDQuMDpTSEVMTDMyLjUxMV0KICoKICogRklYTUUgCiAqICBpZiB0aGUgZGF0YXR5cGUgUkVHX0VYUEFORF9TWiB0aGVuIGV4cGFuZCB0aGUgc3RyaW5nIGFuZCBjaGFuZ2UKICogICpwZHdUeXBlIHRvIFJFR19TWi4gCiAqLwpIUkVTVUxUIFdJTkFQSSBTSFJlZ1F1ZXJ5VmFsdWVFeFcgKEhLRVkgaGtleSwgTFBXU1RSIHBzelZhbHVlLCBMUERXT1JEIHBkd1Jlc2VydmVkLAoJCSBMUERXT1JEIHBkd1R5cGUsIExQVk9JRCBwdkRhdGEsIExQRFdPUkQgcGNiRGF0YSkKewlEV09SRCByZXQ7CglXQVJOKHNoZWxsLCIweCUwNHggJXMgJXAgJXAgJXAgJXAgc2VtaS1zdHViXG4iLAoJCWhrZXksIGRlYnVnc3RyX3cocHN6VmFsdWUpLCBwZHdSZXNlcnZlZCwgcGR3VHlwZSwgcHZEYXRhLCBwY2JEYXRhKTsKCXJldCA9IFJlZ1F1ZXJ5VmFsdWVFeFcgKCBoa2V5LCBwc3pWYWx1ZSwgcGR3UmVzZXJ2ZWQsIHBkd1R5cGUsIHB2RGF0YSwgcGNiRGF0YSk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZWFkQ2FiaW5ldFN0YXRlCQkJCVtOVCA0LjA6U0hFTEwzMi42NTFdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBSZWFkQ2FiaW5ldFN0YXRlKERXT1JEIHUsIERXT1JEIHYpCnsJRklYTUUoc2hlbGwsIjB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdik7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBXcml0ZUNhYmluZXRTdGF0ZQkJCQlbTlQgNC4wOlNIRUxMMzIuNjUyXQogKgogKi8KSFJFU1VMVCBXSU5BUEkgV3JpdGVDYWJpbmV0U3RhdGUoRFdPUkQgdSkKewlGSVhNRShzaGVsbCwiMHglMDRseCBzdHViXG4iLHUpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRmlsZUljb25Jbml0IAkJCQlbU0hFTEwzMi42NjBdCiAqCiAqLwpCT09MIFdJTkFQSSBGaWxlSWNvbkluaXQoQk9PTCBiRnVsbEluaXQpCnsJRklYTUUoc2hlbGwsIiglcylcbiIsIGJGdWxsSW5pdCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwoJcmV0dXJuIDA7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSXNVc2VyQWRtaW4JCQkJCVtOVCA0LjA6U0hFTEwzMi42ODBdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBJc1VzZXJBZG1pbih2b2lkKQp7CUZJWE1FKHNoZWxsLCJzdHViXG4iKTsKCXJldHVybiBUUlVFOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0clJldFRvU3RyTgkJCQkJW1NIRUxMMzIuOTZdCiAqIAogKiBjb252ZXJ0cyBhIFNUUlJFVCB0byBhIG5vcm1hbCBzdHJpbmcKICoKICogTk9URVMKICogIHRoZSBwaWRsIGlzIGZvciBTVFJSRVQgT0ZGU0VUCiAqLwpIUkVTVUxUIFdJTkFQSSBTdHJSZXRUb1N0ck4gKExQVk9JRCBkZXN0LCBEV09SRCBsZW4sIExQU1RSUkVUIHNyYywgTFBJVEVNSURMSVNUIHBpZGwpCnsJVFJBQ0Uoc2hlbGwsImRlc3Q9MHglcCBsZW49MHglbHggc3RycmV0PTB4JXAgcGlkbD0lcCBzdHViXG4iLGRlc3QsbGVuLHNyYyxwaWRsKTsKCglzd2l0Y2ggKHNyYy0+dVR5cGUpCgl7IGNhc2UgU1RSUkVUX1dTVFI6CgkgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHNyYy0+dS5wT2xlU3RyLCAtMSwgKExQU1RSKWRlc3QsIGxlbiwgTlVMTCwgTlVMTCk7CgkgICAgU0hGcmVlKHNyYy0+dS5wT2xlU3RyKTsKCSAgICBicmVhazsKCgkgIGNhc2UgU1RSUkVUX0NTVFJBOgoJICAgIGlmIChWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgICAgICBsc3RyY3B5bkF0b1coKExQV1NUUilkZXN0LCBzcmMtPnUuY1N0ciwgbGVuKTsKCSAgICBlbHNlCgkgICAgICBzdHJuY3B5KChMUFNUUilkZXN0LCBzcmMtPnUuY1N0ciwgbGVuKTsKCSAgICBicmVhazsKCgkgIGNhc2UgU1RSUkVUX09GRlNFVEE6CgkgICAgaWYgKHBpZGwpCgkgICAgeyBpZihWRVJTSU9OX09zSXNVbmljb2RlKCkpCgkgICAgICAgIGxzdHJjcHluQXRvVygoTFBXU1RSKWRlc3QsICgoTFBDU1RSKSZwaWRsLT5ta2lkKStzcmMtPnUudU9mZnNldCwgbGVuKTsKCSAgICAgIGVsc2UKCSAgICAgICAgc3RybmNweSgoTFBTVFIpZGVzdCwgKChMUENTVFIpJnBpZGwtPm1raWQpK3NyYy0+dS51T2Zmc2V0LCBsZW4pOwoJICAgICAgYnJlYWs7CgkgICAgfQoKCSAgZGVmYXVsdDoKCSAgICBGSVhNRShzaGVsbCwidW5rbm93biB0eXBlIVxuIik7CgkgICAgaWYgKGxlbikKCSAgICB7ICooTFBTVFIpZGVzdCA9ICdcMCc7CgkgICAgfQoJICAgIHJldHVybihGQUxTRSk7Cgl9CglyZXR1cm4oVFJVRSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0ckNoclcJCQkJCVtOVCA0LjA6U0hFTEwzMi42NTFdCiAqCiAqLwpMUFdTVFIgV0lOQVBJIFN0ckNoclcgKExQV1NUUiBzdHIsIFdDSEFSIHggKQp7CUxQV1NUUiBwdHI9c3RyOwoJCglUUkFDRShzaGVsbCwiJXMgMHglMDR4XG4iLGRlYnVnc3RyX3coc3RyKSx4KTsKCWRvIAoJeyAgaWYgKCpwdHI9PXgpCgkgICB7IHJldHVybiBwdHI7CgkgICB9CgkgICBwdHIrKzsKCX0gd2hpbGUgKCpwdHIpOwoJcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFN0ckNtcE5JVwkJCQkJW05UIDQuMDpTSEVMTDMyLipdCiAqCiAqLwpJTlQgV0lOQVBJIFN0ckNtcE5JVyAoIExQV1NUUiB3c3RyMSwgTFBXU1RSIHdzdHIyLCBJTlQgbGVuKQp7CUZJWE1FKCBzaGVsbCwiJXMgJXMgJWkgc3R1YlxuIiwgZGVidWdzdHJfdyh3c3RyMSksZGVidWdzdHJfdyh3c3RyMiksbGVuKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFsbG9jU2hhcmVkCQkJCVtTSEVMTDMyLjUyMF0KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gSGVhcEFsbG9jCiAqICBwYXJhbWV0ZXIyIGlzIGVxdWFsIHRvIHRoZSBzaXplIGFsbG9jYXRlZCB3aXRoIEhlYXBBbGxvYwogKiAgcGFyYW1ldGVyMyBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqCiAqICB0aGUgcmV0dXJuIHZhbHVlIGlzIHBvc3RlZCBhcyBsUGFyYW0gd2l0aCAweDQwMiAoV01fVVNFUisyKSB0byBzb21ld2hlcmUKICogIFdNX1VTRVIrMiBjb3VsZCBiZSB0aGUgdW5kb2N1bWVudGVkIENXTV9TRVRQQVRICiAqICB0aGUgYWxsb2NhdGVkIG1lbW9yeSBjb250YWlucyBhIHBpZGwKICovCkhHTE9CQUwgV0lOQVBJIFNIQWxsb2NTaGFyZWQoTFBWT0lEIHBzcmMsIERXT1JEIHNpemUsIERXT1JEIHByb2NJRCkKewlIR0xPQkFMIGhtZW07CglMUFZPSUQgcG1lbTsKCQoJVFJBQ0Uoc2hlbGwsInB0cj0lcCBzaXplPTB4JTA0bHggcHJvY0lEPTB4JTA0bHhcbiIscHNyYyxzaXplLHByb2NJRCk7CglobWVtID0gR2xvYmFsQWxsb2MoR01FTV9GSVhFRCwgc2l6ZSk7CglpZiAoIWhtZW0pCgkgIHJldHVybiAwOwoJCglwbWVtID0gIEdsb2JhbExvY2sgKGhtZW0pOwoKCWlmICghIHBtZW0pCgkgIHJldHVybiAwOwoJICAKCW1lbWNweSAocG1lbSwgcHNyYywgc2l6ZSk7CglHbG9iYWxVbmxvY2soaG1lbSk7IAoJcmV0dXJuIGhtZW07Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU0hMb2NrU2hhcmVkCQkJCQlbU0hFTEwzMi41MjFdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIFNIQWxsb2NTaGFyZWQKICogIHBhcmFtZXRlcjIgaXMgcmV0dXJuIHZhbHVlIGZyb20gR2V0Q3VycmVudFByb2Nlc3NJZAogKiAgdGhlIHJlY2VpdmVyIG9mIChXTV9VU0VSKzIpIHRyeXMgdG8gbG9jayB0aGUgSEFORExFICg/KSAKICogIHRoZSByZXR1cm52YWx1ZSBzZWVtcyB0byBiZSBhIG1lbW9yeWFkcmVzcwogKi8KTFBWT0lEIFdJTkFQSSBTSExvY2tTaGFyZWQoSEFORExFIGhtZW0sIERXT1JEIHByb2NJRCkKewlUUkFDRShzaGVsbCwiaGFuZGxlPTB4JTA0eCBwcm9jSUQ9MHglMDRseFxuIixobWVtLHByb2NJRCk7CglyZXR1cm4gR2xvYmFsTG9jayhobWVtKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFVubG9ja1NoYXJlZAkJCQlbU0hFTEwzMi41MjJdCiAqCiAqIE5PVEVTCiAqICBwYXJhbWV0ZXIxIGlzIHJldHVybiB2YWx1ZSBmcm9tIFNITG9ja1NoYXJlZAogKi8KQk9PTCBXSU5BUEkgU0hVbmxvY2tTaGFyZWQoSEFORExFIHBtZW0pCnsJVFJBQ0Uoc2hlbGwsImhhbmRsZT0weCUwNHhcbiIscG1lbSk7CglyZXR1cm4gR2xvYmFsVW5sb2NrKHBtZW0pOyAKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZyZWVTaGFyZWQJCQkJCVtTSEVMTDMyLjUyM10KICoKICogTk9URVMKICogIHBhcmFtZXRlcjEgaXMgcmV0dXJuIHZhbHVlIGZyb20gU0hBbGxvY1NoYXJlZAogKiAgcGFyYW1ldGVyMiBpcyByZXR1cm4gdmFsdWUgZnJvbSBHZXRDdXJyZW50UHJvY2Vzc0lkCiAqLwpIQU5ETEUgV0lOQVBJIFNIRnJlZVNoYXJlZChIQU5ETEUgaG1lbSwgRFdPUkQgcHJvY0lEKQp7CVRSQUNFKHNoZWxsLCJoYW5kbGU9MHglMDR4IDB4JTA0bHhcbiIsaG1lbSxwcm9jSUQpOwoJcmV0dXJuIEdsb2JhbEZyZWUoaG1lbSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNldEFwcFN0YXJ0aW5nQ3Vyc29yCQkJCVtTSEVMTDMyLjk5XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU2V0QXBwU3RhcnRpbmdDdXJzb3IoSFdORCB1LCBEV09SRCB2KQp7CUZJWE1FKHNoZWxsLCJod25kPTB4JTA0eCAweCUwNGx4IHN0dWJcbiIsdSx2ICk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSExvYWRPTEUJCQkJCVtTSEVMTDMyLjE1MV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNITG9hZE9MRShEV09SRCB1KQp7CUZJWE1FKHNoZWxsLCIweCUwNGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gU19PSzsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTaGVsbF9NZXJnZU1lbnVzCQkJCVtTSEVMTDMyLjY3XQogKgogKi8KQk9PTCBfU0hJc01lbnVTZXBhcmF0b3IoSE1FTlUgaG0sIGludCBpKQp7CglNRU5VSVRFTUlORk9BIG1paTsKCgltaWkuY2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5GT0EpOwoJbWlpLmZNYXNrID0gTUlJTV9UWVBFOwoJbWlpLmNjaCA9IDA7ICAgIC8qIFdBUk5JTkc6IFdlIE1VU1QgaW5pdGlhbGl6ZSBpdCB0byAwKi8KCWlmICghR2V0TWVudUl0ZW1JbmZvQShobSwgaSwgVFJVRSwgJm1paSkpCgl7IHJldHVybihGQUxTRSk7Cgl9CgoJaWYgKG1paS5mVHlwZSAmIE1GVF9TRVBBUkFUT1IpCgl7IHJldHVybihUUlVFKTsKCX0KCiAgICAgICAgcmV0dXJuKEZBTFNFKTsKfQojZGVmaW5lIE1NX0FERFNFUEFSQVRPUiAgICAgICAgIDB4MDAwMDAwMDFMCiNkZWZpbmUgTU1fU1VCTUVOVVNIQVZFSURTICAgICAgMHgwMDAwMDAwMkwKSFJFU1VMVCBXSU5BUEkgU2hlbGxfTWVyZ2VNZW51cyAoSE1FTlUgaG1Ec3QsIEhNRU5VIGhtU3JjLCBVSU5UIHVJbnNlcnQsIFVJTlQgdUlEQWRqdXN0LCBVSU5UIHVJREFkanVzdE1heCwgVUxPTkcgdUZsYWdzKQp7CWludAkJbkl0ZW07CglITUVOVQkJaG1TdWJNZW51OwoJQk9PTAkJYkFscmVhZHlTZXBhcmF0ZWQ7CglNRU5VSVRFTUlORk9BIG1paVNyYzsKCWNoYXIJCXN6TmFtZVsyNTZdOwoJVUlOVAkJdVRlbXAsIHVJRE1heCA9IHVJREFkanVzdDsKCglGSVhNRShzaGVsbCwiaG1lbnUxPTB4JTA0eCBobWVudTI9MHglMDR4IDB4JTA0eCAweCUwNHggMHglMDR4ICAweCUwNGx4IHN0dWJcbiIsCgkJIGhtRHN0LCBobVNyYywgdUluc2VydCwgdUlEQWRqdXN0LCB1SURBZGp1c3RNYXgsIHVGbGFncyk7CgoJaWYgKCFobURzdCB8fCAhaG1TcmMpCgl7IHJldHVybiB1SURNYXg7Cgl9CgoJbkl0ZW0gPSBHZXRNZW51SXRlbUNvdW50KGhtRHN0KTsKCWlmICh1SW5zZXJ0ID49IChVSU5UKW5JdGVtKQoJeyB1SW5zZXJ0ID0gKFVJTlQpbkl0ZW07CgkgIGJBbHJlYWR5U2VwYXJhdGVkID0gVFJVRTsKCX0KCWVsc2UKCXsgYkFscmVhZHlTZXBhcmF0ZWQgPSBfU0hJc01lbnVTZXBhcmF0b3IoaG1Ec3QsIHVJbnNlcnQpOzsKCX0KCWlmICgodUZsYWdzICYgTU1fQUREU0VQQVJBVE9SKSAmJiAhYkFscmVhZHlTZXBhcmF0ZWQpCgl7IC8qIEFkZCBhIHNlcGFyYXRvciBiZXR3ZWVuIHRoZSBtZW51cyAqLwoJICBJbnNlcnRNZW51QShobURzdCwgdUluc2VydCwgTUZfQllQT1NJVElPTiB8IE1GX1NFUEFSQVRPUiwgMCwgTlVMTCk7CgkgIGJBbHJlYWR5U2VwYXJhdGVkID0gVFJVRTsKICAgICAgICB9CgoKICAgICAgICAvKiBHbyB0aHJvdWdoIHRoZSBtZW51IGl0ZW1zIGFuZCBjbG9uZSB0aGVtKi8KICAgICAgICBmb3IgKG5JdGVtID0gR2V0TWVudUl0ZW1Db3VudChobVNyYykgLSAxOyBuSXRlbSA+PSAwOyBuSXRlbS0tKQogICAgICAgIHsgbWlpU3JjLmNiU2l6ZSA9IHNpemVvZihNRU5VSVRFTUlORk9BKTsKCSAgbWlpU3JjLmZNYXNrID0gTUlJTV9TVEFURSB8IE1JSU1fSUQgfCBNSUlNX1NVQk1FTlUgfCBNSUlNX0NIRUNLTUFSS1MgfCBNSUlNX1RZUEUgfCBNSUlNX0RBVEE7CgkgIC8qIFdlIG5lZWQgdG8gcmVzZXQgdGhpcyBldmVyeSB0aW1lIHRocm91Z2ggdGhlIGxvb3AgaW4gY2FzZQoJICBtZW51cyBET04nVCBoYXZlIElEcyovCgkgIG1paVNyYy5mVHlwZSA9IE1GVF9TVFJJTkc7CgkgIG1paVNyYy5kd1R5cGVEYXRhID0gc3pOYW1lOwoJICBtaWlTcmMuZHdJdGVtRGF0YSA9IDA7CgkgIG1paVNyYy5jY2ggPSBzaXplb2Yoc3pOYW1lKTsKCgkgIGlmICghR2V0TWVudUl0ZW1JbmZvQShobVNyYywgbkl0ZW0sIFRSVUUsICZtaWlTcmMpKQoJICB7IGNvbnRpbnVlOwoJICB9CgkgIGlmIChtaWlTcmMuZlR5cGUgJiBNRlRfU0VQQVJBVE9SKQoJICB7IC8qIFRoaXMgaXMgYSBzZXBhcmF0b3I7IGRvbid0IHB1dCB0d28gb2YgdGhlbSBpbiBhIHJvdyovCgkgICAgaWYgKGJBbHJlYWR5U2VwYXJhdGVkKQoJICAgIHsgY29udGludWU7CgkgICAgfQoJICAgIGJBbHJlYWR5U2VwYXJhdGVkID0gVFJVRTsKCSAgfQoJICBlbHNlIGlmIChtaWlTcmMuaFN1Yk1lbnUpCgkgIHsgaWYgKHVGbGFncyAmIE1NX1NVQk1FTlVTSEFWRUlEUykKCSAgICB7IC8qIEFkanVzdCB0aGUgSUQgYW5kIGNoZWNrIGl0Ki8KCSAgICAgIG1paVNyYy53SUQgKz0gdUlEQWRqdXN0OwoJICAgICAgaWYgKG1paVNyYy53SUQgPiB1SURBZGp1c3RNYXgpCgkgICAgICB7IGNvbnRpbnVlOwoJICAgICAgfQoJICAgICAgaWYgKHVJRE1heCA8PSBtaWlTcmMud0lEKQoJICAgICAgeyB1SURNYXggPSBtaWlTcmMud0lEICsgMTsKCSAgICAgIH0KCSAgICB9CgkgICAgZWxzZQoJICAgIHsgLyogRG9uJ3Qgc2V0IElEcyBmb3Igc3VibWVudXMgdGhhdCBkaWRuJ3QgaGF2ZSB0aGVtIGFscmVhZHkgKi8KCSAgICAgIG1paVNyYy5mTWFzayAmPSB+TUlJTV9JRDsKCSAgICB9CgkgICAgaG1TdWJNZW51ID0gbWlpU3JjLmhTdWJNZW51OwoJICAgIG1paVNyYy5oU3ViTWVudSA9IENyZWF0ZVBvcHVwTWVudSgpOwoJICAgIGlmICghbWlpU3JjLmhTdWJNZW51KQoJICAgIHsgcmV0dXJuKHVJRE1heCk7CgkgICAgfQoJICAgIHVUZW1wID0gU2hlbGxfTWVyZ2VNZW51cyhtaWlTcmMuaFN1Yk1lbnUsIGhtU3ViTWVudSwgMCwgdUlEQWRqdXN0LCB1SURBZGp1c3RNYXgsIHVGbGFncyZNTV9TVUJNRU5VU0hBVkVJRFMpOwoJICAgIGlmICh1SURNYXggPD0gdVRlbXApCgkgICAgeyB1SURNYXggPSB1VGVtcDsKCSAgICB9CgkgICAgYkFscmVhZHlTZXBhcmF0ZWQgPSBGQUxTRTsKCSAgfQoJICBlbHNlCgkgIHsgLyogQWRqdXN0IHRoZSBJRCBhbmQgY2hlY2sgaXQqLwoJICAgIG1paVNyYy53SUQgKz0gdUlEQWRqdXN0OwoJICAgIGlmIChtaWlTcmMud0lEID4gdUlEQWRqdXN0TWF4KQoJICAgIHsgY29udGludWU7CgkgICAgfQoJICAgIGlmICh1SURNYXggPD0gbWlpU3JjLndJRCkKCSAgICB7IHVJRE1heCA9IG1paVNyYy53SUQgKyAxOwoJICAgIH0KCSAgICBiQWxyZWFkeVNlcGFyYXRlZCA9IEZBTFNFOwoJICB9CgkgIGlmICghSW5zZXJ0TWVudUl0ZW1BKGhtRHN0LCB1SW5zZXJ0LCBUUlVFLCAmbWlpU3JjKSkKCSAgeyByZXR1cm4odUlETWF4KTsKCSAgfQoJfQoKCS8qIEVuc3VyZSB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc2VwYXJhdG9ycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQogICAgICAgIGluc2VydGVkIG1lbnUgaXRlbXMqLwogICAgICAgIGlmICh1SW5zZXJ0ID09IDApCiAgICAgICAgeyBpZiAoYkFscmVhZHlTZXBhcmF0ZWQpCgkgIHsgRGVsZXRlTWVudShobURzdCwgdUluc2VydCwgTUZfQllQT1NJVElPTik7CgkgIH0KCX0KCWVsc2UKCXsgaWYgKF9TSElzTWVudVNlcGFyYXRvcihobURzdCwgdUluc2VydC0xKSkKCSAgeyBpZiAoYkFscmVhZHlTZXBhcmF0ZWQpCgkgICAgeyBEZWxldGVNZW51KGhtRHN0LCB1SW5zZXJ0LCBNRl9CWVBPU0lUSU9OKTsKCSAgICB9CgkgIH0KCSAgZWxzZQoJICB7IGlmICgodUZsYWdzICYgTU1fQUREU0VQQVJBVE9SKSAmJiAhYkFscmVhZHlTZXBhcmF0ZWQpCgkgICAgeyAvKiBBZGQgYSBzZXBhcmF0b3IgYmV0d2VlbiB0aGUgbWVudXMqLwoJICAgICAgSW5zZXJ0TWVudUEoaG1Ec3QsIHVJbnNlcnQsIE1GX0JZUE9TSVRJT04gfCBNRl9TRVBBUkFUT1IsIDAsIE5VTEwpOwoJICAgIH0KCSAgfQoJfQoJcmV0dXJuKHVJRE1heCk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRHJpdmVUeXBlCQkJCQlbU0hFTEwzMi42NF0KICoKICovCkhSRVNVTFQgV0lOQVBJIERyaXZlVHlwZShEV09SRCB1KQp7CUZJWE1FKHNoZWxsLCIweCUwNGx4IHN0dWJcbiIsdSk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEFib3J0SW52b2tlQ29tbWFuZAkJCQlbU0hFTEwzMi4xOThdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBTSEFib3J0SW52b2tlQ29tbWFuZCh2b2lkKQp7CUZJWE1FKHNoZWxsLCJzdHViXG4iKTsKCXJldHVybiAxOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNIT3V0T2ZNZW1vcnlNZXNzYWdlQm94CQkJW1NIRUxMMzIuMTI2XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hPdXRPZk1lbW9yeU1lc3NhZ2VCb3goRFdPUkQgdSwgRFdPUkQgdiwgRFdPUkQgdykKewlGSVhNRShzaGVsbCwiMHglMDRseCAweCUwNGx4IDB4JTA0bHggc3R1YlxuIix1LHYsdyk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSEZsdXNoQ2xpcGJvYXJkCQkJCVtTSEVMTDMyLjEyMV0KICoKICovCkhSRVNVTFQgV0lOQVBJIFNIRmx1c2hDbGlwYm9hcmQodm9pZCkKewlGSVhNRShzaGVsbCwic3R1YlxuIik7CglyZXR1cm4gMTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJSQ2hyVwkJCQkJW1NIRUxMMzIuMzIwXQogKgogKi8KTFBXU1RSIFdJTkFQSSBTdHJSQ2hyVyhMUFdTVFIgbHBTdGFydCwgTFBXU1RSIGxwRW5kLCBEV09SRCB3TWF0Y2gpCnsJTFBXU1RSIHdwdHI9TlVMTDsKCVRSQUNFKHNoZWxsLCIlcyAlcyAweCUwNHhcbiIsZGVidWdzdHJfdyhscFN0YXJ0KSxkZWJ1Z3N0cl93KGxwRW5kKSwgKFdDSEFSKXdNYXRjaCApOwoKCS8qIGlmIHRoZSBlbmQgbm90IGdpdmVuLCBzZWFyY2gqLwoJaWYgKCFscEVuZCkKCXsgbHBFbmQ9bHBTdGFydDsKCSAgd2hpbGUgKCpscEVuZCkgCgkgICAgbHBFbmQrKzsKCX0KCglkbyAKCXsgaWYgKCpscFN0YXJ0PT0oV0NIQVIpd01hdGNoKQoJICAgIHdwdHIgPSBscFN0YXJ0OwoJICBscFN0YXJ0Kys7ICAKCX0gd2hpbGUgKCBscFN0YXJ0PD1scEVuZCApOyAKCXJldHVybiB3cHRyOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogU3RyRm9ybWF0Qnl0ZVNpemUJCQkJW1NITFdBUEldCiovCkxQU1RSIFdJTkFQSSBTdHJGb3JtYXRCeXRlU2l6ZUEgKCBEV09SRCBkdywgTFBTVFIgcHN6QnVmLCBVSU5UIGNjaEJ1ZiApCnsJY2hhciBidWZbNjRdOwoJVFJBQ0Uoc2hlbGwsIiVseCAlcCAlaVxuIiwgZHcsIHBzekJ1ZiwgY2NoQnVmKTsKCWlmICggZHc8MTAyNEwgKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIGJ5dGVzIiwgKEZMT0FUKWR3KTsKCX0KCWVsc2UgaWYgKCBkdzwxMDQ4NTc2TCkKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBLQiIsIChGTE9BVClkdy8xMDI0KTsKCX0KCWVsc2UgaWYgKCBkdyA8IDEwNzM3NDE4MjRMKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIE1CIiwgKEZMT0FUKWR3LzEwNDg1NzZMKTsKCX0KCWVsc2UKCXsgc3ByaW50ZiAoYnVmLCIlMy4xZiBHQiIsIChGTE9BVClkdy8xMDczNzQxODI0TCk7Cgl9CglzdHJuY3B5IChwc3pCdWYsIGJ1ZiwgY2NoQnVmKTsKCXJldHVybiBwc3pCdWY7CQp9CkxQV1NUUiBXSU5BUEkgU3RyRm9ybWF0Qnl0ZVNpemVXICggRFdPUkQgZHcsIExQV1NUUiBwc3pCdWYsIFVJTlQgY2NoQnVmICkKewljaGFyIGJ1Zls2NF07CglUUkFDRShzaGVsbCwiJWx4ICVwICVpXG4iLCBkdywgcHN6QnVmLCBjY2hCdWYpOwoJaWYgKCBkdzwxMDI0TCApCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgYnl0ZXMiLCAoRkxPQVQpZHcpOwoJfQoJZWxzZSBpZiAoIGR3PDEwNDg1NzZMKQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIEtCIiwgKEZMT0FUKWR3LzEwMjQpOwoJfQoJZWxzZSBpZiAoIGR3IDwgMTA3Mzc0MTgyNEwpCgl7IHNwcmludGYgKGJ1ZiwiJTMuMWYgTUIiLCAoRkxPQVQpZHcvMTA0ODU3NkwpOwoJfQoJZWxzZQoJeyBzcHJpbnRmIChidWYsIiUzLjFmIEdCIiwgKEZMT0FUKWR3LzEwNzM3NDE4MjRMKTsKCX0KCWxzdHJjcHluQXRvVyAocHN6QnVmLCBidWYsIGNjaEJ1Zik7CglyZXR1cm4gcHN6QnVmOwkKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTSFdhaXRGb3JGaWxlVG9PcGVuCQkJCVtTSEVMTDMyLjk3XQogKgogKi8KSFJFU1VMVCBXSU5BUEkgU0hXYWl0Rm9yRmlsZVRvT3BlbihEV09SRCB1LCBEV09SRCB2LCBEV09SRCB3KQp7CUZJWE1FKHNoZWxsLCIweCUwNGx4IDB4JTA0bHggMHglMDRseCBzdHViXG4iLHUsdix3KTsKCXJldHVybiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvbnRyb2xfRmlsbENhY2hlX1J1bkRMTAkJCVtTSEVMTDMyLjhdCiAqCiAqLwpIUkVTVUxUIFdJTkFQSSBDb250cm9sX0ZpbGxDYWNoZV9SdW5ETEwoSFdORCBoV25kLCBIQU5ETEUgaE1vZHVsZSwgRFdPUkQgdywgRFdPUkQgeCkKewlGSVhNRShzaGVsbCwiMHglMDR4IDB4JTA0eCAweCUwNGx4IDB4JTA0bHggc3R1YlxuIixoV25kLCBoTW9kdWxlLHcseCk7CglyZXR1cm4gMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSdW5ETExfQ2FsbEVudHJ5MTYJCQkJW1NIRUxMMzIuMTIyXQogKiB0aGUgbmFtZSBpcyBwcm9wYWJseSB3cm9uZwogKi8KSFJFU1VMVCBXSU5BUEkgUnVuRExMX0NhbGxFbnRyeTE2KERXT1JEIHYsIERXT1JEIHcsIERXT1JEIHgsIERXT1JEIHksIERXT1JEIHopCnsJRklYTUUoc2hlbGwsIjB4JTA0bHggMHglMDRseCAweCUwNGx4IDB4JTA0bHggMHglMDRseCBzdHViXG4iLHYsdyx4LHkseik7CglyZXR1cm4gMDsKfQo=