LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSBpbml0aWFsIElEb2N1bWVudEV4dGVuc2lvbjQgc3VwcG9ydCAtICMxMDI4MjIKICogICAgIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwoKaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwppbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CgoKcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIHsKCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZkZvcm1hdENvbnRyYWludHMgPSBudWxsOwoJcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7CglwdWJsaWMgYm9vbGVhbiByZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMgPSB0cnVlOyAvLyBzcGVjaWFsIGZsYWcgZm9yIEpVbml0CgoJcHJvdGVjdGVkIHZvaWQgZW5zdXJlQ2xvc2VkKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7CgoJCXRyeSB7CgkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CgkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwoJCQl9CgkJfQoJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCgkJfQoJCXRyeSB7CgkJCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewoJCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7CgkJCX0KCQl9CgkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsgLy8gaG9wZWxlc3MKCQl9Cgl9CgoJcHVibGljIFN0cmluZyBmb3JtYXRDb250ZW50KFN0cmluZyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKCQlpZiAoaW5wdXQgPT0gbnVsbCkKCQkJcmV0dXJuIGlucHV0OwoKCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7CgkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwoJCXRyeSB7CgkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAoJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgcmVhZC4gV2lsbCByZXR1cm4gZm9ybWF0dGVkCgkJCS8vIHN0cmluZyBhbmQgTk9UIHNhdmUgbW9kZWwuCgkJCWlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCJVVEY4IikpOyAvLyROT04tTkxTLTEkCgkJCVN0cmluZyBpZCA9IGlucHV0U3RyZWFtLnRvU3RyaW5nKCkgKyAiLiIgKyBnZXRGaWxlRXh0ZW5zaW9uKCk7IC8vJE5PTi1OTFMtMSQKCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGlucHV0U3RyZWFtLCBudWxsKTsKCgkJCS8vIGZvcm1hdAoJCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwoKCQkJLy8gcmV0dXJuIG91dHB1dAoJCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpOwoJCX0KCQlmaW5hbGx5IHsKCQkJZW5zdXJlQ2xvc2VkKG51bGwsIGlucHV0U3RyZWFtKTsKCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQoJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwoJCX0KCX0KCglwdWJsaWMgU3RyaW5nIGZvcm1hdENvbnRlbnQoU3RyaW5nIGlucHV0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CgkJaWYgKGlucHV0ID09IG51bGwpCgkJCXJldHVybiBpbnB1dDsKCgkJaWYgKChzdGFydCA+PSAwKSAmJiAobGVuZ3RoID49IDApICYmIChzdGFydCArIGxlbmd0aCA8PSBpbnB1dC5sZW5ndGgoKSkpIHsKCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwoJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CgkJCXRyeSB7CgkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKCQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciByZWFkLiBXaWxsIHJldHVybiBmb3JtYXR0ZWQKCQkJCS8vIHN0cmluZyBhbmQgTk9UIHNhdmUgbW9kZWwuCgkJCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAoJCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArICIuIiArIGdldEZpbGVFeHRlbnNpb24oKTsgLy8kTk9OLU5MUy0xJAoJCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGlucHV0U3RyZWFtLCBudWxsKTsKCgkJCQkvLyBmb3JtYXQKCQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7CgoJCQkJLy8gcmV0dXJuIG91dHB1dAoJCQkJcmV0dXJuIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoKTsKCQkJfQoJCQlmaW5hbGx5IHsKCQkJCWVuc3VyZUNsb3NlZChudWxsLCBpbnB1dFN0cmVhbSk7CgkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgoJCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQoJCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKCQkJfQoJCX0KCQllbHNlCgkJCXJldHVybiBpbnB1dDsKCX0KCglwdWJsaWMgdm9pZCBmb3JtYXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CgkJaWYgKGRvY3VtZW50ID09IG51bGwpCgkJCXJldHVybjsKCgkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwoJCS8vIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwoJCXRyeSB7CgkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAoJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmIG1vZGVsCgkJCS8vIGNoYW5nZWQuCgkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwoKCQkJLy8gZm9ybWF0CgkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7CgoJCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAoJCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCgkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwoJCX0KCQlmaW5hbGx5IHsKCQkJLy8gZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7CgkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCgkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKCQl9Cgl9CgoJcHVibGljIHZvaWQgZm9ybWF0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CgkJaWYgKGRvY3VtZW50ID09IG51bGwpCgkJCXJldHVybjsKCgkJaWYgKChzdGFydCA+PSAwKSAmJiAobGVuZ3RoID49IDApICYmIChzdGFydCArIGxlbmd0aCA8PSBkb2N1bWVudC5nZXRMZW5ndGgoKSkpIHsKCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwoJCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKCQkJdHJ5IHsKCQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAoJCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZgoJCQkJLy8gbW9kZWwgY2hhbmdlZC4KCQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwoKCQkJCS8vIGZvcm1hdAoJCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKCgkJCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAoJCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQoJCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7CgkJCX0KCQkJZmluYWxseSB7CgkJCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKCQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCgkJCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCgkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKCQlpZiAoZmlsZSA9PSBudWxsKQoJCQlyZXR1cm47CgoJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKCQl0cnkgewoJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAoJCQkvLyBjaGFuZ2VkLgoJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKCgkJCS8vIGZvcm1hdAoJCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwoKCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQoJCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKCQl9CgkJZmluYWxseSB7CgkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwoJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgoJCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKCQkJfQoKCQl9Cgl9CgoJcHVibGljIHZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CgkJaWYgKGZpbGUgPT0gbnVsbCkKCQkJcmV0dXJuOwoKCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7CgkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7CgkJdHJ5IHsKCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCgkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKCQkJLy8gY2hhbmdlZC4KCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZSk7CgoJCQkvLyBmb3JtYXQKCQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKCgkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCgkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7CgkJfQoJCWZpbmFsbHkgewoJCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQoJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwoJCX0KCX0KCglwdWJsaWMgdm9pZCBmb3JtYXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CgkJaWYgKGZpbGVOYW1lID09IG51bGwpCgkJCXJldHVybjsKCgkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwoJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKCQl0cnkgewoJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAoJCQkvLyBjaGFuZ2VkLgoJCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwoJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIG51bGwpOwoKCQkJLy8gZm9ybWF0CgkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7CgoJCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAoJCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCgkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwoJCX0KCQlmaW5hbGx5IHsKCQkJLy8gZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgaW5wdXRTdHJlYW0pOwoJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgoJCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCgkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7CgkJfQoJfQoKCXB1YmxpYyB2b2lkIGZvcm1hdEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewoJCWlmIChmaWxlTmFtZSA9PSBudWxsKQoJCQlyZXR1cm47CgoJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CgkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7CgkJdHJ5IHsKCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCgkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKCQkJLy8gY2hhbmdlZC4KCQkJaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVOYW1lKTsKCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKCgkJCS8vIGZvcm1hdAoJCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwoKCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQoJCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKCQl9CgkJZmluYWxseSB7CgkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIGlucHV0U3RyZWFtKTsKCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQoJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwoJCX0KCX0KCglwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewoJCWludCBzdGFydCA9IDA7CgkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKCgkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKCX0KCglwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7CgkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7CgkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7CgkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7CgkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKCQkJfQoJCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKCgkJCXRyeSB7CgkJCQkvLyB3aGVuZXZlciBmb3JtYXR0aW5nIG1vZGVsLCBmaXJlIGFib3V0dG9jaGFuZ2UvbW9kZWxjaGFuZ2VkCgkJCQlzdHJ1Y3R1cmVkTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7CgkJCQlyZXdyaXRlU2Vzc2lvbiA9IChkb2NFeHQ0ID09IG51bGwpID8gbnVsbCA6IGRvY0V4dDQuc3RhcnRSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5VTlJFU1RSSUNURUQpOwoKCQkJCWlmICgoc3RhcnQgPT0gMCkgJiYgKGxlbmd0aCA9PSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpKQoJCQkJCXNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KHN0cnVjdHVyZWRNb2RlbCwgZmFsc2UpOwoJCQkJZWxzZQoJCQkJCXNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KHN0cnVjdHVyZWRNb2RlbCwgdHJ1ZSk7CgoJCQkJaWYgKChzdGFydCA+PSAwKSAmJiAobGVuZ3RoID49IDApICYmIChzdGFydCArIGxlbmd0aCA8PSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpKSB7CgkJCQkJTGlzdCBhY3RpdmVOb2RlcyA9IGdldEFsbEFjdGl2ZU5vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7CgkJCQkJaWYgKGFjdGl2ZU5vZGVzLnNpemUoKSA+IDApIHsKCQkJCQkJTm9kZSBmaXJzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMuZ2V0KDApOwoJCQkJCQlOb2RlIGxhc3ROb2RlID0gKE5vZGUpIGFjdGl2ZU5vZGVzLmdldChhY3RpdmVOb2Rlcy5zaXplKCkgLSAxKTsKCgkJCQkJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwoJCQkJCQlOb2RlIGVhY2hOb2RlID0gZmlyc3ROb2RlOwoJCQkJCQlOb2RlIG5leHROb2RlID0gbnVsbDsKCQkJCQkJd2hpbGUgKCFkb25lKSB7CgkJCQkJCQkvLyB1cGRhdGUgImRvbmUiCgkJCQkJCQlkb25lID0gKGVhY2hOb2RlID09IGxhc3ROb2RlKTsKCgkJCQkJCQkvKgoJCQkJCQkJICogZ2V0IG5leHQgc2libGluZyBiZWZvcmUgZm9ybWF0IGJlY2F1c2UgZWFjaE5vZGUKCQkJCQkJCSAqIG1heSBiZSBkZWxldGVkLCBmb3IgZXhhbXBsZSB3aGVuIGl0J3MgYW4gZW1wdHkKCQkJCQkJCSAqIHRleHQgbm9kZQoJCQkJCQkJICovCgkJCQkJCQluZXh0Tm9kZSA9IGVhY2hOb2RlLmdldE5leHRTaWJsaW5nKCk7CgoJCQkJCQkJLy8gZm9ybWF0IGVhY2ggbm9kZQoJCQkJCQkJZm9ybWF0Tm9kZShlYWNoTm9kZSk7CgoJCQkJCQkJLy8gdXBkYXRlIGVhY2ggbm9kZQoJCQkJCQkJaWYgKChuZXh0Tm9kZSAhPSBudWxsKSAmJiAobmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpKQoJCQkJCQkJCS8vIG5leHROb2RlIGlzIGRlbGV0ZWQgZHVyaW5nIGZvcm1hdAoJCQkJCQkJCWVhY2hOb2RlID0gZWFjaE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKCQkJCQkJCWVsc2UKCQkJCQkJCQllYWNoTm9kZSA9IG5leHROb2RlOwoKCQkJCQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UKCQkJCQkJCS8vIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggd2l0aCBlYWNoTm9kZS4KCQkJCQkJCS8vIFdlIGRvbid0IHdhbnQgYW4gaW5maW5pdGUgbG9vcCBoZXJlLgoJCQkJCQkJaWYgKGVhY2hOb2RlID09IG51bGwpCgkJCQkJCQkJZG9uZSA9IHRydWU7CgkJCQkJCX0KCgkJCQkJfQoJCQkJfQoJCQl9CgkJCWZpbmFsbHkgewoJCQkJLy8gd2UgbmVlZCB0d28gZmluYWxseSdzLCBqdXN0IGluIGNhc2UgZmlyc3QgZmFpbHMKCQkJCXRyeSB7CgkJCQkJaWYgKChkb2NFeHQ0ICE9IG51bGwpICYmIChyZXdyaXRlU2Vzc2lvbiAhPSBudWxsKSkKCQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwoJCQkJfQoJCQkJZmluYWxseSB7CgkJCQkJLy8gYWx3YXlzIG1ha2Ugc3VyZSB0byBmaXJlIGNoYW5nZWRtb2RlbCB3aGVuIGRvbmUKCQkJCQlzdHJ1Y3R1cmVkTW9kZWwuY2hhbmdlZE1vZGVsKCk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJcHVibGljIHZvaWQgZm9ybWF0Tm9kZShOb2RlIG5vZGUpIHsKCQlpZiAobm9kZSAhPSBudWxsKSB7CgkJCU5vZGUgbmV3Tm9kZSA9IG5vZGU7CgoJCQkvLyBmb3JtYXQgdGhlIG93bmVyIG5vZGUgaWYgaXQncyBhbiBhdHRyaWJ1dGUgbm9kZQoJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCgkJCQluZXdOb2RlID0gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKCgkJCS8vIHJlZnJlc2ggZm9ybWF0IHByZWZlcmVuY2VzIGJlZm9yZSBnZXR0aW5nIGZvcm1hdHRlcgoJCQlpZiAocmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKQoJCQkJcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCk7CgoJCQkvLyBnZXQgZm9ybWF0dGVyIGFuZCBmb3JtYXQgY29udHJhaW50cwoJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBnZXRGb3JtYXR0ZXIobmV3Tm9kZSk7CgkJCS8vIFRPRE9fZnV0dXJlOiBhZGRlZCBhc3NlcnQgdG8gcmVwbGFjZSAicmVkdW5kYW50IG51bGwgY2hlY2siLgoJCQkvLyBpZiBmb3JtYXR0ZXIgaXMgZXZlciBudWxsLCB3ZSBzaG91bGQgcHJvdmlkZSBzb21lCgkJCS8vIGRlZmF1bHQgZm9ybWF0dGVyIHRvIHNlcnZlIGFzIHBsYWNlIGhvbGRlci4KCQkJQXNzZXJ0LmlzTm90TnVsbChmb3JtYXR0ZXIsICJmb3JtYXR0ZXIgd2FzIG51bGwgZm9yIGEgbm9kZSwgIik7IC8vJE5PTi1OTFMtMSQKCQkJSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMgPSBmb3JtYXR0ZXIuZ2V0Rm9ybWF0Q29udHJhaW50cygpOwoJCQlmb3JtYXRDb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KHRydWUpOwoJCQkvLyBmb3JtYXQgZWFjaCBub2RlCgkJCWZvcm1hdHRlci5mb3JtYXQobmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7CgkJfQoJfQoKCS8qKgoJICogQGRlcHJlY2F0ZWQgVXNlIGdldEFsbEFjdGl2ZU5vZGVzIGluc3RlYWQKCSAqLwoJcHJvdGVjdGVkIFZlY3RvciBnZXRBY3RpdmVOb2RlcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0Tm9kZU9mZnNldCwgaW50IGxlbmd0aCkgewoJCUxpc3QgYWxsQWN0aXZlTm9kZXMgPSBnZXRBbGxBY3RpdmVOb2RlcyhzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0Tm9kZU9mZnNldCwgbGVuZ3RoKTsKCQlyZXR1cm4gbmV3IFZlY3RvcihhbGxBY3RpdmVOb2Rlcyk7Cgl9CgoJcHJvdGVjdGVkIExpc3QgZ2V0QWxsQWN0aXZlTm9kZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydE5vZGVPZmZzZXQsIGludCBsZW5ndGgpIHsKCQlMaXN0IGFjdGl2ZU5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwoKCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKCQkJTm9kZSBzdGFydE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0KTsKCQkJLy8gc2VlIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00NzExCgkJCS8vCgkJCS8vIFdlIGhhdmUgdG8gd2F0Y2ggZm9yIHNlbGVjdGlvbiBib3VuZGFyeSBjb25kaXRpb25zLiBVc2UgdGhpcyBhcwoJCQkvLyBhbiBleGFtcGxlOiA8YT50ZXh0PC9hPjxiPnRleHQ8L2I+LAoJCQkvLyBJZiB0aGUgd2hvbGUgPGE+IG5vZGUgaXMgc2VsZWN0ZWQsIGxpa2U6CgkJCS8vIHw8YT50ZXh0PC9hPnw8Yj50ZXh0PC9iPiwgd2UgbmVlZCB0byBzdWJzdHJhY3QgdGhlIGxlbmd0aCBieSAxCgkJCS8vIHRvIGZpbmQKCQkJLy8gdGhlIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uOgoJCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGggLSAxKSwKCQkJLy8gb3IgZWxzZQoJCQkvLyB3ZSdkIGZpbmQgdGhlIG5leHQgYWRqYWNlbnQgbm9kZS4KCQkJLy8KCQkJLy8gSG93ZXZlciwgd2hlbiB0aGUgc2VsZWN0aW9uIGxlbmd0aCBpcyAwIChtZWFuaW5nIG5vIHRleHQgaXMKCQkJLy8gc2VsZWN0ZWQpLCB0aGUgY3Vyc29yIGlzIGF0IHRoZSBiZWdpbm5pbmcKCQkJLy8gb2YgdGhlIG5vZGUgd2Ugd2FudCB0byBmb3JtYXQ6IHw8YT50ZXh0PC9hPjxiPnRleHQ8L2I+LCB0aGUKCQkJLy8gbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gaXM6CgkJCS8vIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCkuCgkJCWludCBlbmROb2RlT2Zmc2V0ID0gbGVuZ3RoID4gMCA/IHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCAtIDEgOiBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGg7CgkJCU5vZGUgZW5kTm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihlbmROb2RlT2Zmc2V0KTsKCgkJCS8vIG1ha2Ugc3VyZSBpdCdzIGFuIG5vbi1lbXB0eSBkb2N1bWVudAoJCQlpZiAoc3RhcnROb2RlICE9IG51bGwpIHsKCQkJCXdoaWxlIChpc1NpYmxpbmdPZihzdGFydE5vZGUsIGVuZE5vZGUpID09IGZhbHNlKSB7CgkJCQkJaWYgKGVuZE5vZGUgIT0gbnVsbCkKCQkJCQkJZW5kTm9kZSA9IGVuZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwoJCQkJCWlmIChlbmROb2RlID09IG51bGwpIHsKCQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldFBhcmVudE5vZGUoKTsKCQkJCQkJLy8gc2VlCgkJCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00NzExCgkJCQkJCS8vIGFuZCBub3RlcyBhYm92ZQoJCQkJCQllbmROb2RlT2Zmc2V0ID0gbGVuZ3RoID4gMCA/IHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCAtIDEgOiBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGg7CgkJCQkJCWVuZE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oZW5kTm9kZU9mZnNldCk7CgkJCQkJfQoJCQkJfQoKCQkJCXdoaWxlIChzdGFydE5vZGUgIT0gZW5kTm9kZSkgewoJCQkJCWFjdGl2ZU5vZGVzLmFkZChzdGFydE5vZGUpOwoJCQkJCXN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5nZXROZXh0U2libGluZygpOwoJCQkJfQoJCQkJaWYgKHN0YXJ0Tm9kZSAhPSBudWxsKQoJCQkJCWFjdGl2ZU5vZGVzLmFkZChzdGFydE5vZGUpOwoJCQl9CgkJfQoKCQlyZXR1cm4gYWN0aXZlTm9kZXM7Cgl9CgoJYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCk7CgoJcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBnZXRGb3JtYXRDb250cmFpbnRzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7CgkJLy8gMjYyMTM1IC0gTlBFIGR1cmluZyBmb3JtYXQgb2YgZW1wdHkgZG9jdW1lbnQKCQlpZiAoKGZGb3JtYXRDb250cmFpbnRzID09IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkpIHsKCQkJTm9kZSBub2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKDApOwoKCQkJaWYgKG5vZGUgIT0gbnVsbCkgewoJCQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gZ2V0Rm9ybWF0dGVyKG5vZGUpOwoJCQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7CgkJCQkJZkZvcm1hdENvbnRyYWludHMgPSBmb3JtYXR0ZXIuZ2V0Rm9ybWF0Q29udHJhaW50cygpOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Cgl9CgoJYWJzdHJhY3QgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpOwoKCXByb3RlY3RlZCBib29sZWFuIGlzU2libGluZ09mKE5vZGUgbm9kZSwgTm9kZSBlbmROb2RlKSB7CgkJaWYgKGVuZE5vZGUgPT0gbnVsbCkKCQkJcmV0dXJuIHRydWU7CgkJZWxzZSB7CgkJCU5vZGUgc2libGluZ05vZGUgPSBub2RlOwoJCQl3aGlsZSAoc2libGluZ05vZGUgIT0gbnVsbCkgewoJCQkJaWYgKHNpYmxpbmdOb2RlID09IGVuZE5vZGUpCgkJCQkJcmV0dXJuIHRydWU7CgkJCQllbHNlCgkJCQkJc2libGluZ05vZGUgPSBzaWJsaW5nTm9kZS5nZXROZXh0U2libGluZygpOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCk7CgoJcHJvdGVjdGVkIHZvaWQgc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGJvb2xlYW4gZm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQpIHsKCQkvLyAyNjIxMzUgLSBOUEUgZHVyaW5nIGZvcm1hdCBvZiBlbXB0eSBkb2N1bWVudAoJCUlTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzID0gZ2V0Rm9ybWF0Q29udHJhaW50cyhzdHJ1Y3R1cmVkTW9kZWwpOwoKCQlpZiAoZm9ybWF0Q29udHJhaW50cyAhPSBudWxsKQoJCQlmb3JtYXRDb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KTsKCX0KCglwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CgkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Cgl9Cn0K