LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKgoqKiAgIElUVS1UIEcuNzIyLjEgKDIwMDUtMDUpIC0gRml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gZm9yIG1haW4gYm9keSBhbmQgQW5uZXggQwoqKiAgID4gU29mdHdhcmUgUmVsZWFzZSAyLjEgKDIwMDgtMDYpCioqICAgICAoU2ltcGxlIHJlcGFja2FnaW5nOyBubyBjaGFuZ2UgZnJvbSAyMDA1LTA1IFJlbGVhc2UgMi4wIGNvZGUpCioqCioqICAgqSAyMDA0IFBvbHljb20sIEluYy4KKioKKioJIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGaWxlbmFtZTogc2FtcGxlc190b19ybWx0X2NvZWZzLmMKKgoqIFB1cnBvc2U6ICBDb252ZXJ0IFNhbXBsZXMgdG8gUmV2ZXJzZWQgTUxUIChNb2R1bGF0ZWQgTGFwcGVkIFRyYW5zZm9ybSkgCiogICAgICAgICAgIENvZWZmaWNpZW50cwoqCiogICAgIFRoZSAiUmV2ZXJzZWQgTUxUIiBpcyBhbiBvdmVybGFwcGVkIGJsb2NrIHRyYW5zZm9ybSB3aGljaCB1c2VzCiogICAgIGV2ZW4gc3ltbWV0cnkgKiBvbiB0aGUgbGVmdCwgb2RkIHN5bW1ldHJ5IG9uIHRoZSByaWdodCBhbmQgYQoqICAgICBUeXBlIElWIERDVCBhcyB0aGUgYmxvY2sgdHJhbnNmb3JtLiAgKiBJdCBpcyB0aHVzIHNpbWlsYXIgdG8gYQoqICAgICBNTFQgd2hpY2ggdXNlcyBvZGQgc3ltbWV0cnkgb24gdGhlIGxlZnQsIGV2ZW4gc3ltbWV0cnkgKiBvbiB0aGUKKiAgICAgcmlnaHQgYW5kIGEgVHlwZSBJViBEU1QgYXMgdGhlIGJsb2NrIHRyYW5zZm9ybS4gIEluIGZhY3QsIGl0IGlzCiogICAgIGVxdWl2YWxlbnQgKiB0byByZXZlcnNpbmcgdGhlIG9yZGVyIG9mIHRoZSBzYW1wbGVzLCBwZXJmb3JtaW5nCiogICAgIGFuIE1MVCBhbmQgdGhlbiBuZWdhdGluZyBhbGwgKiB0aGUgZXZlbi1udW1iZXJlZCBjb2VmZmljaWVudHMuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgImRlZnMuaCIKI2luY2x1ZGUgInRhYmxlcy5oIgojaW5jbHVkZSAiY291bnQuaCIKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICBzYW1wbGVzX3RvX3JtbHRfY29lZnMgCgogU3ludGF4OiAgICAgIFdvcmQxNiBzYW1wbGVzX3RvX3JtbHRfY29lZnMobmV3X3NhbXBsZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3NhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjdF9sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpuZXdfc2FtcGxlczsgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqb2xkX3NhbXBsZXM7ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmNvZWZzOyAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgV29yZDE2IGRjdF9sZW5ndGg7CgogRGVzY3JpcHRpb246IENvbnZlcnQgc2FtcGxlcyB0byBNTFQgY29lZmZpY2llbnRzCgogRGVzaWduIE5vdGVzOgoKIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMS40MCAgICAgIHwgICAgIDEuNDAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgICAgICAgIE1BWCAgfCAgICAxLjQwICAgICAgfCAgICAgMS40MAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAoJCQkJCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAzLjA3ICAgICAgfCAgICAgMy4wNyAgICAgICB8ICAgICAzLjA3CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgMy4xMCAgICAgIHwgICAgIDMuMTAgICAgICAgfCAgICAgMy4xMAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCQkJCQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpXb3JkMTYgc2FtcGxlc190b19ybWx0X2NvZWZzKFdvcmQxNiAqbmV3X3NhbXBsZXMsV29yZDE2ICpvbGRfc2FtcGxlcyxXb3JkMTYgKmNvZWZzLFdvcmQxNiBkY3RfbGVuZ3RoKQp7CgogICAgV29yZDE2CWluZGV4LCB2YWxzX2xlZnQsbWFnX3NoaWZ0LG47CiAgICBXb3JkMTYJd2luZG93ZWRfZGF0YVtNQVhfRENUX0xFTkdUSF07CiAgICBXb3JkMTYJKm5ld19wdHIsICpvbGRfcHRyLCAqc2FtX2xvdywgKnNhbV9oaWdoOwogICAgV29yZDE2CSp3aW5fbG93LCAqd2luX2hpZ2g7CiAgICBXb3JkMTYJKmRzdF9wdHI7CiAgICBXb3JkMTYgIG5lZ193aW5fbG93OwogICAgV29yZDE2ICBzYW1wX2hpZ2g7CiAgICBXb3JkMTYgIGhhbGZfZGN0X3NpemU7CiAgICAKICAgIFdvcmQzMglhY2NhOwogICAgV29yZDMyCWFjY2I7CiAgICBXb3JkMTYJdGVtcDsKICAgIFdvcmQxNgl0ZW1wMTsKICAgIFdvcmQxNgl0ZW1wMjsKICAgIFdvcmQxNgl0ZW1wNTsKICAgCiAgICBoYWxmX2RjdF9zaXplID0gc2hyKGRjdF9sZW5ndGgsMSk7CiAgIAogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCiAgICAvKiBHZXQgdGhlIGZpcnN0IGhhbGYgb2YgdGhlIHdpbmRvd2VkIHNhbXBsZXMgKi8KICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgCiAgICBkc3RfcHRyICA9IHdpbmRvd2VkX2RhdGE7CiAgICBtb3ZlMTYoKTsKICAgIAogICAgLyogYWRkcmVzcyBhcml0aG1ldGljICovCiAgICB0ZXN0KCk7CiAgICBpZiAoZGN0X2xlbmd0aD09RENUX0xFTkdUSCkKICAgIHsKICAgICAgICB3aW5faGlnaCA9IHNhbXBsZXNfdG9fcm1sdF93aW5kb3cgKyBoYWxmX2RjdF9zaXplOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHdpbl9oaWdoID0gbWF4X3NhbXBsZXNfdG9fcm1sdF93aW5kb3cgKyBoYWxmX2RjdF9zaXplOwogICAgfQogICAgCiAgICB3aW5fbG93ICA9IHdpbl9oaWdoOwogICAgbW92ZTE2KCk7CiAgICAKICAgIC8qIGFkZHJlc3MgYXJpdGhtZXRpYyAqLwogICAgc2FtX2hpZ2ggPSBvbGRfc2FtcGxlcyArIGhhbGZfZGN0X3NpemU7CiAgICAKICAgIHNhbV9sb3cgID0gc2FtX2hpZ2g7CiAgICBtb3ZlMTYoKTsKICAgIAogICAgZm9yICh2YWxzX2xlZnQgPSBoYWxmX2RjdF9zaXplO3ZhbHNfbGVmdCA+IDA7dmFsc19sZWZ0LS0pCiAgICB7CiAgICAgICAgYWNjYSA9IDBMOwogICAgICAgIG1vdmUzMigpOwogICAgICAgIAogICAgICAgIGFjY2EgPSBMX21hYyhhY2NhLCotLXdpbl9sb3csICotLXNhbV9sb3cpOwogICAgICAgIGFjY2EgPSBMX21hYyhhY2NhLCp3aW5faGlnaCsrLCAqc2FtX2hpZ2grKyk7CiAgICAgICAgdGVtcCA9IGl0dV9yb3VuZChhY2NhKTsgCiAgICAgICAgCiAgICAgICAgKmRzdF9wdHIrKyA9IHRlbXA7CiAgICAgICAgbW92ZTE2KCk7CiAgICB9ICAgICAgICAgICAKICAgIAogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgLyogR2V0IHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93ZWQgc2FtcGxlcyAqLwogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgCiAgICBzYW1fbG93ICA9IG5ld19zYW1wbGVzOwogICAgbW92ZTE2KCk7CgogICAgLyogYWRkcmVzcyBhcml0aG1ldGljICovCiAgICBzYW1faGlnaCA9IG5ld19zYW1wbGVzICsgZGN0X2xlbmd0aDsKICAgIAogICAgZm9yICh2YWxzX2xlZnQgPSBoYWxmX2RjdF9zaXplOyAgICB2YWxzX2xlZnQgPiAwOyAgICB2YWxzX2xlZnQtLSkKICAgIHsKICAgICAgICBhY2NhID0gMEw7CiAgICAgICAgbW92ZTMyKCk7CgogICAgICAgIGFjY2EgPSBMX21hYyhhY2NhLCotLXdpbl9oaWdoLCAqc2FtX2xvdysrKTsKICAgICAgICBuZWdfd2luX2xvdyA9IG5lZ2F0ZSgqd2luX2xvdysrKTsKICAgICAgICBzYW1wX2hpZ2ggPSAqLS1zYW1faGlnaDsKICAgICAgICBhY2NhID0gTF9tYWMoYWNjYSwgbmVnX3dpbl9sb3csIHNhbXBfaGlnaCk7CiAgICAgICAgdGVtcCA9IGl0dV9yb3VuZChhY2NhKTsgCiAgICAgICAgCiAgICAgICAgKmRzdF9wdHIrKz10ZW1wOwogICAgICAgIG1vdmUxNigpOwogICAgfQogICAgICAgCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIC8qIFNhdmUgdGhlIG5ldyBzYW1wbGVzIGZvciBuZXh0IHRpbWUsIHdoZW4gdGhleSB3aWxsIGJlIHRoZSBvbGQgc2FtcGxlcyAqLwogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCiAgICAKICAgIG5ld19wdHIgPSBuZXdfc2FtcGxlczsKICAgIG1vdmUxNigpOwoKICAgIG9sZF9wdHIgPSBvbGRfc2FtcGxlczsKICAgIG1vdmUxNigpOwoKICAgIGZvciAodmFsc19sZWZ0ID0gZGN0X2xlbmd0aDt2YWxzX2xlZnQgPiAwO3ZhbHNfbGVmdC0tKQogICAgewogICAgICAgICpvbGRfcHRyKysgPSAqbmV3X3B0cisrOwogICAgICAgIG1vdmUxNigpOwogICAgfQogICAgCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIC8qIENhbGN1bGF0ZSBob3cgbWFueSBiaXRzIHRvIHNoaWZ0IHVwIHRoZSBpbnB1dCB0byB0aGUgRENULiAgICAgICAgICAgICAqLwogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCiAgICAKICAgIHRlbXAxPTA7CiAgICBtb3ZlMTYoKTsKCiAgICBmb3IoaW5kZXg9MDtpbmRleDxkY3RfbGVuZ3RoO2luZGV4KyspCiAgICB7CiAgICAgICAgdGVtcDIgPSBhYnNfcyh3aW5kb3dlZF9kYXRhW2luZGV4XSk7CiAgICAgICAgdGVtcCA9IHN1Yih0ZW1wMix0ZW1wMSk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmKHRlbXAgPiAwKQogICAgICAgIHsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIHRlbXAxID0gdGVtcDI7CiAgICAgICAgfQogICAgfQogICAgCiAgICBtYWdfc2hpZnQ9MDsKICAgIG1vdmUxNigpOwoKICAgIHRlbXAgPSBzdWIodGVtcDEsMTQwMDApOwogICAgdGVzdCgpOwogICAgaWYgKHRlbXAgPj0gMCkKICAgIHsKICAgICAgICBtYWdfc2hpZnQgPSAwOwogICAgICAgIG1vdmUxNigpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRlbXAgPSBzdWIodGVtcDEsNDM4KTsKICAgICAgICB0ZXN0KCk7CiAgICAgICAgaWYodGVtcCA8IDApCiAgICAgICAgICAgIHRlbXAgPSBhZGQodGVtcDEsMSk7CiAgICAgICAgZWxzZSAKICAgICAgICB7CiAgICAgICAgICAgIHRlbXAgPSB0ZW1wMTsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgfQogICAgICAgIGFjY2IgPSBMX211bHQodGVtcCw5NTg3KTsKICAgICAgICBhY2NhID0gTF9zaHIoYWNjYiwyMCk7CiAgICAgICAgdGVtcDUgPSBleHRyYWN0X2woYWNjYSk7CiAgICAgICAgdGVtcCA9IG5vcm1fcyh0ZW1wNSk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmICh0ZW1wID09IDApCiAgICAgICAgewogICAgICAgICAgICBtYWdfc2hpZnQgPSA5OwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBtYWdfc2hpZnQgPSBzdWIodGVtcCw2KTsKICAgICAgICAKICAgIH0KCiAgICBhY2NhID0gMEw7CiAgICBtb3ZlMzIoKTsKICAgIGZvcihpbmRleD0wOyBpbmRleDxkY3RfbGVuZ3RoOyBpbmRleCsrKQogICAgewogICAgICAgIHRlbXAgPSBhYnNfcyggd2luZG93ZWRfZGF0YVtpbmRleF0pOwogICAgICAgIGFjY2EgPSBMX2FkZChhY2NhLHRlbXApOwogICAgfQogICAgCiAgICBhY2NhID0gTF9zaHIoYWNjYSw3KTsKICAgIAogICAgdGVzdCgpOwogICAgaWYgKHRlbXAxIDwgYWNjYSkKICAgIHsKICAgICAgICBtYWdfc2hpZnQgPSBzdWIobWFnX3NoaWZ0LDEpOwogICAgfQoKICAgIHRlc3QoKTsKICAgIGlmIChtYWdfc2hpZnQgPiAwKSAKICAgIHsKICAgICAgICBmb3IoaW5kZXg9MDtpbmRleDxkY3RfbGVuZ3RoO2luZGV4KyspCiAgICAgICAgewogICAgICAgICAgICB3aW5kb3dlZF9kYXRhW2luZGV4XSA9IHNobCh3aW5kb3dlZF9kYXRhW2luZGV4XSxtYWdfc2hpZnQpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgCiAgICB7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmIChtYWdfc2hpZnQgPCAwKSAKICAgICAgICB7CiAgICAgICAgICAgIG4gPSBuZWdhdGUobWFnX3NoaWZ0KTsKICAgICAgICAgICAgZm9yKGluZGV4PTA7aW5kZXg8ZGN0X2xlbmd0aDtpbmRleCsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB3aW5kb3dlZF9kYXRhW2luZGV4XSA9IHNocih3aW5kb3dlZF9kYXRhW2luZGV4XSxuKTsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgLyogUGVyZm9ybSBhIFR5cGUgSVYgRENUIG9uIHRoZSB3aW5kb3dlZCBkYXRhIHRvIGdldCB0aGUgY29lZmZpY2llbnRzICovCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KCiAgICBkY3RfdHlwZV9pdl9hKHdpbmRvd2VkX2RhdGEsIGNvZWZzLCBkY3RfbGVuZ3RoKTsKCiAgICByZXR1cm4obWFnX3NoaWZ0KTsKfQo=