LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAgQ29weXJpZ2h0IKkgMTk5NSwgMTk5NiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBNYXluYXJkLCBNYXNzYWNodXNldHRzLgoKICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIApkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkICAKdGhhdCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyAgCm9mIHNvZnR3YXJlIGFuZCBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIERpZ2l0YWwgbm90ICAKYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIAp3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIERpZ2l0YWwgZ3JhbnRzIHRoaXMgcGVybWlzc2lvbiAKcHJvdmlkZWQgdGhhdCB5b3UgcHJvbWluZW50bHkgbWFyaywgYXMgbm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsLCBhbnkgCm1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGlzIHNvZnR3YXJlIG9yIGRvY3VtZW50YXRpb24uCgpEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiBkaXNjbGFpbXMgYWxsIHdhcnJhbnRpZXMgYW5kL29yIGd1YXJhbnRlZXMgIAp3aXRoIHJlZ2FyZCB0byB0aGlzIHNvZnR3YXJlLCBpbmNsdWRpbmcgYWxsIGltcGxpZWQgd2FycmFudGllcyBvZiBmaXRuZXNzIGZvciAKYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYW5kIG1lcmNoYW50YWJpbGl0eSwgYW5kIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyAKcmVnYXJkaW5nIHRoZSB1c2Ugb2YsIG9yIHRoZSByZXN1bHRzIG9mIHRoZSB1c2Ugb2YsIHRoZSBzb2Z0d2FyZSBhbmQgCmRvY3VtZW50YXRpb24gaW4gdGVybXMgb2YgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCByZWxpYWJpbGl0eSwgY3VycmVudG5lc3Mgb3IKb3RoZXJ3aXNlOyBhbmQgeW91IHJlbHkgb24gdGhlIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uIGFuZCByZXN1bHRzIHNvbGVseSBhdCAKeW91ciBvd24gcmlzay4gCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBkYXZpZC5ydXNsaW5nQHJlby5tdHMuZGVjLmNvbQogKgogKiBNb2RpZmllZCBmb3IgUUVNVSBQQUxjb2RlIGJ5IHJ0aEB0d2lkZGxlLm5ldC4KICovCgojaW5jbHVkZSAiaW8uaCIKI2luY2x1ZGUgInVhcnQuaCIKCiNpZm5kZWYgU0VSSUFMX1NQRUVECiNkZWZpbmUgU0VSSUFMX1NQRUVEIDk2MDAKI2VuZGlmCgppbnQKdWFydF9jaGFyYXYoaW50IG9mZnNldCkKewoJcmV0dXJuIGluYihjb20yTHNyICsgb2Zmc2V0KSAmIDE7Cn0KCmludAp1YXJ0X2dldGNoYXIoaW50IG9mZnNldCkKewoJd2hpbGUgKCF1YXJ0X2NoYXJhdihvZmZzZXQpKQoJCWNvbnRpbnVlOwoJcmV0dXJuIGluYihjb20yUmJyICsgb2Zmc2V0KTsKfQoKc3RhdGljIHZvaWQKdWFydF9wdXRjaGFyX3JhdyhpbnQgb2Zmc2V0LCBjaGFyIGMpCnsKCXdoaWxlICgoaW5iKGNvbTJMc3IgKyBvZmZzZXQpICYgMHgyMCkgPT0gMCkKCQljb250aW51ZTsKCW91dGIoYywgY29tMlRociArIG9mZnNldCk7Cn0KCnZvaWQKdWFydF9wdXRjaGFyKGludCBvZmZzZXQsIGNoYXIgYykKewoJaWYgKGMgPT0gJ1xuJykKCQl1YXJ0X3B1dGNoYXJfcmF3KG9mZnNldCwgJ1xyJyk7Cgl1YXJ0X3B1dGNoYXJfcmF3KG9mZnNldCwgYyk7Cn0KCnZvaWQKdWFydF9wdXRzKGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKnMpCnsKCXdoaWxlICgqcyAhPSAnXDAnKQoJCXVhcnRfcHV0Y2hhcihvZmZzZXQsICpzKyspOwp9CgpzdGF0aWMgdm9pZAp1YXJ0X2luaXRfbGluZShpbnQgb2Zmc2V0LCBpbnQgYmF1ZCkKewoJaW50IGk7CglpbnQgYmF1ZGNvbnN0OwoKCXN3aXRjaCAoYmF1ZCkgewoJY2FzZSA1NjAwMDoKCQliYXVkY29uc3QgPSAyOwoJCWJyZWFrOwoJY2FzZSAzODQwMDoKCQliYXVkY29uc3QgPSAzOwoJCWJyZWFrOwoJY2FzZSAxOTIwMDoKCQliYXVkY29uc3QgPSA2OwoJCWJyZWFrOwoJY2FzZSA5NjAwOgoJCWJhdWRjb25zdCA9IDEyOwoJCWJyZWFrOwoJY2FzZSA0ODAwOgoJCWJhdWRjb25zdCA9IDI0OwoJCWJyZWFrOwoJY2FzZSAyNDAwOgoJCWJhdWRjb25zdCA9IDQ4OwoJCWJyZWFrOwoJY2FzZSAxMjAwOgoJCWJhdWRjb25zdCA9IDk2OwoJCWJyZWFrOwoJY2FzZSAzMDA6CgkJYmF1ZGNvbnN0ID0gMzg0OwoJCWJyZWFrOwoJY2FzZSAxNTA6CgkJYmF1ZGNvbnN0ID0gNzY4OwoJCWJyZWFrOwoJZGVmYXVsdDoKCQliYXVkY29uc3QgPSAxMjsKCQlicmVhazsKCX0KCgoJb3V0YigweDg3LCBjb20yTGNyICsgb2Zmc2V0KTsKCW91dGIoMCwgY29tMkRsbSArIG9mZnNldCk7CglvdXRiKGJhdWRjb25zdCwgY29tMkRsbCArIG9mZnNldCk7CglvdXRiKDB4MDcsIGNvbTJMY3IgKyBvZmZzZXQpOwoJb3V0YigweDBGLCBjb20yTWNyICsgb2Zmc2V0KTsKCglmb3IgKGkgPSAxMDsgaSA+IDA7IGktLSkgewoJCWlmIChpbmIoY29tMkxzciArIG9mZnNldCkgPT0gMCkKCQkJYnJlYWs7CgkJaW5iKGNvbTJSYnIgKyBvZmZzZXQpOwoJfQp9Cgp2b2lkIHVhcnRfaW5pdCh2b2lkKQp7Cgl1YXJ0X2luaXRfbGluZShDT00xLCBTRVJJQUxfU1BFRUQpOwoJdWFydF9pbml0X2xpbmUoQ09NMiwgU0VSSUFMX1NQRUVEKTsKfQo=