LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaW5jbHVkZSAic2VydnJlcy5ocmMiCiNpbmNsdWRlICJzZXJ2dWlkLmh4eCIKTW9kYWxEaWFsb2cgR1JPU1NFUl9URVNUX0RMRwp7CglPdXRwdXRTaXplID0gVFJVRSA7CglTVkxvb2sgPSBUUlVFIDsKCUhlbHBJRCA9IFVJRF9HUk9TU0VSX1RFU1RfRExHIDsKCVBvcyA9IE1BUF9BUFBGT05UICggMTQgLCA3ICkgOwoJU2l6ZSA9IE1BUF9BUFBGT05UICggMjczICwgMTEwICkgOwoJVGV4dCA9ICJHcm/fZXIgVGVzdGRpYWxvZyIgOwoJTW92ZWFibGUgPSBUUlVFIDsKCUNsb3NlYWJsZSA9IFRSVUUgOwoJQ2hlY2tCb3ggMQoJewoJCUhlbHBJRCA9IFVJRF9DaGVja0JveCA7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCA5ICwgMTcgKSA7CgkJU2l6ZSA9IE1BUF9BUFBGT05UICggNTUgLCAxMiApIDsKCQlUZXh0ID0gIkNoZWNrQm94IiA7CgkJVGFiU3RvcCA9IFRSVUUgOwoJfTsKCVRyaVN0YXRlQm94IDEKCXsKCQlIZWxwSUQgPSBVSURfVHJpU3RhdGVCb3ggOwoJCVBvcyA9IE1BUF9BUFBGT05UICggOSAsIDI5ICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDYyICwgMTIgKSA7CgkJVGV4dCA9ICJUcmlTdGF0ZUJveCIgOwoJCVRhYlN0b3AgPSBUUlVFIDsKCX07CglPS0J1dHRvbiAxCgl7CgkJSGVscElEID0gImhpZDEiIDsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDEzMiAsIDkyICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDY0ICwgMTIgKSA7CgkJVGFiU3RvcCA9IFRSVUUgOwoJfTsKCVRpbWVGaWVsZCAxCgl7CgkJQm9yZGVyID0gVFJVRSA7CgkJSGVscElEID0gVUlEX1RpbWVGaWVsZCA7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCA5ICwgOTIgKSA7CgkJU2l6ZSA9IE1BUF9BUFBGT05UICggNDAgLCAxMiApIDsKCQlUYWJTdG9wID0gVFJVRSA7CgkJU3BpbiA9IFRSVUUgOwoJfTsKCU11bHRpTGluZUVkaXQgMQoJewoJCUJvcmRlciA9IFRSVUUgOwoJCUhlbHBJRCA9IFVJRF9NdWx0aUxpbmVFZGl0IDsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDE3MiAsIDYgKSA7CgkJU2l6ZSA9IE1BUF9BUFBGT05UICggOTQgLCA0OCApIDsKCQlUZXh0ID0gIk11bHRpTGluZUVkaXQiIDsKCQlUYWJTdG9wID0gVFJVRSA7CgkJVlNjcm9sbCA9IFRSVUUgOwoJfTsKCUdyb3VwQm94IDEKCXsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDkgLCA0MiApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA1OCAsIDQ0ICkgOwoJCVRleHQgPSAiR3JvdXBCb3giIDsKCQlHcm91cCA9IFRSVUUgOwoJfTsKCVJhZGlvQnV0dG9uIDIKCXsKCQlIZWxwSUQgPSBVSURfUmFkaW9CdXR0b24yIDsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDE2ICwgNjggKSA7CgkJU2l6ZSA9IE1BUF9BUFBGT05UICggNDAgLCAxMiApIDsKCQlUZXh0ID0gIlJhZGlvMiIgOwoJCVRhYlN0b3AgPSBUUlVFIDsKCX07CglSYWRpb0J1dHRvbiAxCgl7CgkJSGVscElEID0gVUlEX1JhZGlvQnV0dG9uMSA7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCAxNiAsIDU0ICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDQyICwgMTIgKSA7CgkJVGV4dCA9ICJSYWRpbzEiIDsKCQlUYWJTdG9wID0gVFJVRSA7Cgl9OwoJTXVsdGlMaXN0Qm94IDEKCXsKCQlCb3JkZXIgPSBUUlVFIDsKCQlIZWxwSUQgPSBVSURfTXVsdGlMaXN0Qm94IDsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDc2ICwgNiApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA4NiAsIDQ4ICkgOwoJCVRhYlN0b3AgPSBUUlVFIDsKCQlTdHJpbmdMaXN0ID0KCQl7CgkJCTwgIk11bHRpTGlzdEJveCIgOyBEZWZhdWx0IDsgPiA7CgkJCTwgIlplaWxlIDIiIDsgRGVmYXVsdCA7ID4gOwoJCQk8ICJaZWlsZSAzIiA7IERlZmF1bHQgOyA+IDsKCQkJPCAiWmVpbGUgNCIgOyBEZWZhdWx0IDsgPiA7CgkJCTwgIlplaWxlIDUiIDsgRGVmYXVsdCA7ID4gOwoJCQk8ICJaZWlsZSA2IiA7IERlZmF1bHQgOyA+IDsKCQkJPCAiWmVpbGUgNyIgOyBEZWZhdWx0IDsgPiA7CgkJCTwgIlplaWxlIDgiIDsgRGVmYXVsdCA7ID4gOwoJCQk8ICJaZWlsZSA5IiA7IERlZmF1bHQgOyA+IDsKCQkJPCAiWmVpbGUgMTAiIDsgRGVmYXVsdCA7ID4gOwoJCX07Cgl9OwoJQ29tYm9Cb3ggMQoJewoJCUhlbHBJRCA9IFVJRF9Db21ib0JveCA7CgkJUG9zID0gTUFQX0FQUEZPTlQgKCA3NiAsIDU4ICkgOwoJCVNpemUgPSBNQVBfQVBQRk9OVCAoIDg2ICwgNTUgKSA7CgkJVGV4dCA9ICJDb21ib0JveCIgOwoJCVRhYlN0b3AgPSBUUlVFIDsKCQlEcm9wRG93biA9IFRSVUUgOwoJCUF1dG9IU2Nyb2xsID0gVFJVRSA7CgkJU3RyaW5nTGlzdCA9CgkJewoJCQkiQ29tYm9Cb3giIDsKCQkJIkVyc3RlciIgOwoJCQkiWndlaXRlciIgOwoJCQkiRHJpdHRlciIgOwoJCX07Cgl9OwoJRGF0ZUJveCAxCgl7CgkJSGVscElEID0gVUlEX0RhdGVCb3ggOwoJCVBvcyA9IE1BUF9BUFBGT05UICggNzYgLCA3MiApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCA4NiAsIDU0ICkgOwoJCVRhYlN0b3AgPSBUUlVFIDsKCQlEcm9wRG93biA9IFRSVUUgOwoJCUF1dG9IU2Nyb2xsID0gVFJVRSA7CgkJU3RyaW5nTGlzdCA9CgkJewoJCQkiMS4xLjkxIiA7CgkJCSIyLjIuOTIiIDsKCQkJIjMuMy45MyIgOwoJCX07Cgl9OwoJRml4ZWRUZXh0IDEKCXsKCQlTVkxvb2sgPSBUUlVFIDsKCQlQb3MgPSBNQVBfQVBQRk9OVCAoIDE5ICwgNiApIDsKCQlTaXplID0gTUFQX0FQUEZPTlQgKCAzOSAsIDkgKSA7CgkJVGV4dCA9ICJGaXhlZFRleHQiIDsKCQlDZW50ZXIgPSBUUlVFIDsKCX07CglDYW5jZWxCdXR0b24gMQoJewoJCVBvcyA9IE1BUF9BUFBGT05UICggMjAyICwgOTIgKSA7CgkJU2l6ZSA9IE1BUF9BUFBGT05UICggNjQgLCAxMiApIDsKCQlUYWJTdG9wID0gVFJVRSA7Cgl9Owp9OwpNZW51IE1FTlVfQ0xJRU5UCnsKCUl0ZW1MaXN0ID0KCXsKCQlNZW51SXRlbQoJCXsKCQkJSWRlbnRpZmllciA9IElETV9GSUxFIDsKCQkJSGVscElEID0gSURNX0ZJTEVfSEVMUCA7CgkJCVRleHQgPSAifkZpbGUiIDsKCQkJU3ViTWVudSA9IE1lbnUKCQkJewoJCQkJSXRlbUxpc3QgPQoJCQkJewoJCQkJCU1lbnVJdGVtCgkJCQkJewoJCQkJCQlJZGVudGlmaWVyID0gSURNX0ZJTEVfT1BFTl9URVNUIDsKCQkJCQkJSGVscElEID0gSURNX0ZJTEVfT1BFTl9URVNUX0hFTFAgOwoJCQkJCQlUZXh0ID0gIn5PcGVuIFRlc3QgV2luZG93IiA7CgkJCQkJfTsKCQkJCQlNZW51SXRlbQoJCQkJCXsKCQkJCQkJSWRlbnRpZmllciA9IDQgOwoJCQkJCQlTZXBhcmF0b3IgPSBUUlVFIDsKCQkJCQl9OwoJCQkJCU1lbnVJdGVtCgkJCQkJewoJCQkJCQlJZGVudGlmaWVyID0gSURNX0ZJTEVfRVhJVCA7CgkJCQkJCUhlbHBJRCA9IElETV9GSUxFX0VYSVRfSEVMUCA7CgkJCQkJCVRleHQgPSAifkJlZW5kZW4iIDsKCQkJCQkJQWNjZWxLZXkgPSBLZXlDb2RlCgkJCQkJCXsKCQkJCQkJCUNvZGUgPSBLRVlfRjQgOwoJCQkJCQkJTW9kaWZpZXIyID0gVFJVRSA7CgkJCQkJCX07CgkJCQkJfTsKCQkJCX07CgkJCX07CgkJfTsKCQlNZW51SXRlbQoJCXsKCQkJSWRlbnRpZmllciA9IElETV9URVNUIDsKCQkJVGV4dCA9ICJ+VGVzdCIgOwoJCQlTdWJNZW51ID0gTWVudQoJCQl7CgkJCQlJdGVtTGlzdCA9CgkJCQl7CgkJCQkJTWVudUl0ZW0KCQkJCQl7CgkJCQkJCUlkZW50aWZpZXIgPSBJRE1fVEVTVF9HUk9TUyA7CgkJCQkJCVRleHQgPSAifkdyb99lciBUZXN0ZGlhbG9nIiA7CgkJCQkJfTsKCQkJCQlNZW51SXRlbQoJCQkJCXsKCQkJCQkJSWRlbnRpZmllciA9IElETV9TWVNfRExHIDsKCQkJCQkJVGV4dCA9ICJ+U3lzZGlhbG9nZSIgOwoJCQkJCX07CgkJCQl9OwoJCQl9OwoJCX07Cgl9Owp9OwoK