LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqCioqICAgSVRVLVQgRy43MjIuMSAoMjAwNS0wNSkgLSBGaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBmb3IgbWFpbiBib2R5IGFuZCBBbm5leCBDCioqICAgPiBTb2Z0d2FyZSBSZWxlYXNlIDIuMSAoMjAwOC0wNikKKiogICAgIChTaW1wbGUgcmVwYWNrYWdpbmc7IG5vIGNoYW5nZSBmcm9tIDIwMDUtMDUgUmVsZWFzZSAyLjAgY29kZSkKKioKKiogICCpIDIwMDQgUG9seWNvbSwgSW5jLgoqKgoqKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogRmlsZW5hbWU6IGRjdF90eXBlX2l2X3MuYwoqCiogUHVycG9zZTogIERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0sIFR5cGUgSVYgdXNlZCBmb3IgaW52ZXJzZSBNTFQKKgoqIFRoZSBiYXNpcyBmdW5jdGlvbnMgYXJlCioKKgkgY29zKFBJKih0KzAuNSkqKGsrMC41KS9ibG9ja19sZW5ndGgpCioKKiBmb3IgdGltZSB0IGFuZCBiYXNpcyBmdW5jdGlvbiBudW1iZXIgay4gIER1ZSB0byB0aGUgc3ltbWV0cnkgb2YgdGhlIGV4cHJlc3Npb24KKiBpbiB0IGFuZCBrLCBpdCBpcyBjbGVhciB0aGF0IHRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIHRyYW5zZm9ybXMgYXJlIHRoZSBzYW1lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlICJkZWZzLmgiCiNpbmNsdWRlICJjb3VudC5oIgojaW5jbHVkZSAiZGN0NF9zLmgiCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFeHRlcm5hbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpleHRlcm4gV29yZDE2ICAgIHN5bl9iaWFzXzdraHpbRENUX0xFTkdUSF07CmV4dGVybiBXb3JkMTYgICAgZGl0aGVyW0RDVF9MRU5HVEhdOwpleHRlcm4gV29yZDE2ICAgIG1heF9kaXRoZXJbTUFYX0RDVF9MRU5HVEhdOwoKZXh0ZXJuIFdvcmQxNiAgICAgICBkY3RfY29yZV9zW0RDVF9MRU5HVEhfRElWXzMyXVtEQ1RfTEVOR1RIX0RJVl8zMl07CmV4dGVybiBjb3NfbXNpbl90CXNfY29zX21zaW5fMltEQ1RfTEVOR1RIX0RJVl8zMl07CmV4dGVybiBjb3NfbXNpbl90CXNfY29zX21zaW5fNFtEQ1RfTEVOR1RIX0RJVl8xNl07CmV4dGVybiBjb3NfbXNpbl90CXNfY29zX21zaW5fOFtEQ1RfTEVOR1RIX0RJVl84XTsKZXh0ZXJuIGNvc19tc2luX3QJc19jb3NfbXNpbl8xNltEQ1RfTEVOR1RIX0RJVl80XTsKZXh0ZXJuIGNvc19tc2luX3QJc19jb3NfbXNpbl8zMltEQ1RfTEVOR1RIX0RJVl8yXTsKZXh0ZXJuIGNvc19tc2luX3QJc19jb3NfbXNpbl82NFtEQ1RfTEVOR1RIXTsKZXh0ZXJuIGNvc19tc2luX3QJKnNfY29zX21zaW5fdGFibGVbXTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb246ICAgIGRjdF90eXBlX2l2X3MKCiBTeW50YXg6ICAgICAgdm9pZCBkY3RfdHlwZV9pdl9zIChXb3JkMTYgKmlucHV0LFdvcmQxNiAqb3V0cHV0LFdvcmQxNiBkY3RfbGVuZ3RoKQogICAgICAgICAgICAgIAoKIERlc2NyaXB0aW9uOiBEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtLCBUeXBlIElWIHVzZWQgZm9yIGludmVyc2UgTUxUCgogRGVzaWduIE5vdGVzOgogCiBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgIDEuNzQgICAgIHwgICAgIDEuNzQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCiAgICAgICAgICAgIE1BWCAgfCAgICAgMS43NCAgICAgfCAgICAgMS43NAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAoJCQkJCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQgICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAgMy42MiAgICAgfCAgICAgMy42MiAgICAgICB8ICAgICAgMy42MiAgIAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgICAzLjYyICAgICB8ICAgICAzLjYyICAgICAgIHwgICAgICAzLjYyICAgCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIGRjdF90eXBlX2l2X3MgKFdvcmQxNiAqaW5wdXQsV29yZDE2ICpvdXRwdXQsV29yZDE2IGRjdF9sZW5ndGgpCnsKICAgIFdvcmQxNiAgIGJ1ZmZlcl9hW01BWF9EQ1RfTEVOR1RIXSwgYnVmZmVyX2JbTUFYX0RDVF9MRU5HVEhdLCBidWZmZXJfY1tNQVhfRENUX0xFTkdUSF07CiAgICBXb3JkMTYgICAqaW5fcHRyLCAqaW5fcHRyX2xvdywgKmluX3B0cl9oaWdoLCAqbmV4dF9pbl9iYXNlOwogICAgV29yZDE2ICAgKm91dF9wdHJfbG93LCAqb3V0X3B0cl9oaWdoLCAqbmV4dF9vdXRfYmFzZTsKICAgIFdvcmQxNiAgICpvdXRfYnVmZmVyLCAqaW5fYnVmZmVyLCAqYnVmZmVyX3N3YXA7CiAgICBXb3JkMTYgICBpbl92YWxfbG93LCBpbl92YWxfaGlnaDsKICAgIFdvcmQxNiAgIG91dF92YWxfbG93LCBvdXRfdmFsX2hpZ2g7CiAgICBXb3JkMTYgICBpbl9sb3dfZXZlbiwgaW5fbG93X29kZDsKICAgIFdvcmQxNiAgIGluX2hpZ2hfZXZlbiwgaW5faGlnaF9vZGQ7CiAgICBXb3JkMTYgICBvdXRfbG93X2V2ZW4sIG91dF9sb3dfb2RkOwogICAgV29yZDE2ICAgb3V0X2hpZ2hfZXZlbiwgb3V0X2hpZ2hfb2RkOwogICAgV29yZDE2ICAgKnBhaXJfcHRyOwogICAgV29yZDE2ICAgY29zX2V2ZW4sIGNvc19vZGQsIG1zaW5fZXZlbiwgbXNpbl9vZGQ7CiAgICBXb3JkMTYgICBzZXRfc3Bhbiwgc2V0X2NvdW50LCBzZXRfY291bnRfbG9nLCBwYWlyc19sZWZ0LCBzZXRzX2xlZnQ7CiAgICBXb3JkMTYgICBpLGs7CiAgICBXb3JkMTYgICBpbmRleDsKICAgIFdvcmQxNiAgIGR1bW15OwogICAgV29yZDMyIAkgc3VtOwogICAgY29zX21zaW5fdAkqKnRhYmxlX3B0cl9wdHIsICpjb3NfbXNpbl9wdHI7CgogICAgV29yZDMyIGFjY2E7CiAgICBXb3JkMTYgdGVtcDsKCiAgICBXb3JkMTYgICBkY3RfbGVuZ3RoX2xvZzsKICAgIFdvcmQxNiAgICpkaXRoZXJfcHRyOwogICAgCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyovCiAgICAvKiBEbyB0aGUgc3VtL2RpZmZlcmVuY2UgYnV0dGVyZmxpZXMsIHRoZSBmaXJzdCBwYXJ0IG9mICovCiAgICAvKiBjb252ZXJ0aW5nIG9uZSBOLXBvaW50IHRyYW5zZm9ybSBpbnRvIDMyIC0gMTAgcG9pbnQgdHJhbnNmb3JtcyAgKi8KICAgIC8qIHRyYW5zZm9ybXMsIHdoZXJlIE4gPSAxIDw8IERDVF9MRU5HVEhfTE9HLiAgICAgICAgICAgKi8KICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIHRlc3QoKTsKICAgIGlmIChkY3RfbGVuZ3RoPT1EQ1RfTEVOR1RIKQogICAgewogICAgICAgIGRjdF9sZW5ndGhfbG9nID0gRENUX0xFTkdUSF9MT0c7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgZGl0aGVyX3B0ciA9IGRpdGhlcjsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBkY3RfbGVuZ3RoX2xvZyA9IE1BWF9EQ1RfTEVOR1RIX0xPRzsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICBkaXRoZXJfcHRyID0gbWF4X2RpdGhlcjsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KICAgIAogICAgaW5fYnVmZmVyICA9IGlucHV0OwogICAgbW92ZTE2KCk7CiAgICBvdXRfYnVmZmVyID0gYnVmZmVyX2E7CiAgICBtb3ZlMTYoKTsKICAgIAogICAgaW5kZXg9MDsKICAgIG1vdmUxNigpOwogICAgCiAgICBpPTA7CiAgICBtb3ZlMTYoKTsKCiAgICBmb3IgKHNldF9jb3VudF9sb2cgPSAwOyAgICBzZXRfY291bnRfbG9nIDw9IGRjdF9sZW5ndGhfbG9nIC0gMjsgICAgc2V0X2NvdW50X2xvZysrKSAKICAgIHsKCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gZm9yIHRoZSBsb29wIG92ZXIgc2V0cyBhdCB0aGUgY3VycmVudCBzaXplICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgCiAgICAgICAgLyogICAgc2V0X3NwYW4gICAgICA9IDEgPDwgKERDVF9MRU5HVEhfTE9HIC0gc2V0X2NvdW50X2xvZyk7ICovCiAgICAgICAgc2V0X3NwYW4gPSBzaHJfbm9jaGVjayhkY3RfbGVuZ3RoLHNldF9jb3VudF9sb2cpOwogICAgICAgICAgIAogICAgICAgIHNldF9jb3VudCAgICAgPSBzaGxfbm9jaGVjaygxLHNldF9jb3VudF9sb2cpOwogICAgICAgIGluX3B0ciAgICAgICAgPSBpbl9idWZmZXI7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgbmV4dF9vdXRfYmFzZSA9IG91dF9idWZmZXI7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICAvKiBMb29wIG92ZXIgYWxsIHRoZSBzZXRzIG9mIHRoaXMgc2l6ZSAqLwogICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgdGVtcCA9IHN1YihpbmRleCwxKTsKICAgICAgICB0ZXN0KCk7CiAgICAgICAgaWYodGVtcCA8IDApCiAgICAgICAgewogICAgICAgICAgICBmb3IgKHNldHNfbGVmdCA9IHNldF9jb3VudDtzZXRzX2xlZnQgPiAwO3NldHNfbGVmdC0tKSAKICAgICAgICAgICAgewogICAgCiAgICAgICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KICAgICAgICAgICAgICAgIC8qIFNldCB1cCBvdXRwdXQgcG9pbnRlcnMgZm9yIHRoZSBjdXJyZW50IHNldCAqLwogICAgICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgICAgICAvKiBwb2ludGVyIGFyaXRobWV0aWMgKi8KICAgICAgICAgICAgICAgIG91dF9wdHJfbG93ICAgID0gbmV4dF9vdXRfYmFzZTsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgbmV4dF9vdXRfYmFzZSArPSBzZXRfc3BhbjsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgb3V0X3B0cl9oaWdoICAgPSBuZXh0X291dF9iYXNlOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CgogICAgICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgICAgICAvKiBMb29wIG92ZXIgYWxsIHRoZSBidXR0ZXJmbGllcyBpbiB0aGUgY3VycmVudCBzZXQgKi8KICAgICAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZG8gCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW5fdmFsX2xvdyAgICAgID0gKmluX3B0cisrOwogICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgICAgIGluX3ZhbF9oaWdoICAgICA9ICppbl9wdHIrKzsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgICAgICAgICAgICAgLyogQkVTVCBNRVRIT0QgT0YgR0VUVElORyBSSUQgT0YgQklBUywgQlVUIENPTVBVVEFUSU9OQUxMWSBVTlBMRUFTQU5UICovCiAgICAgICAgICAgICAgICAgICAgLyogQUxURVJOQVRJVkUgTUVUSE9ELCBTTUVBUlMgQklBUyBPVkVSIFRIRSBFTlRJUkUgRlJBTUUsIENPTVBVVEFUSU9OQUxMWSBTSU1QTEVTVC4gKi8KICAgICAgICAgICAgICAgICAgICAvKiBJRiBUSElTIFdPUktTLCBJVCdTIFBSRUZFUkFCTEUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZHVtbXkgPSBhZGQoaW5fdmFsX2xvdyxkaXRoZXJfcHRyW2krK10pOwoJCSAgICAvLyBibHA6IGFkZGl0aW9uIG9mIHR3byAxNmJpdHMgdmFycywgdGhlcmUncyBubyB3YXkKCQkgICAgLy8gICAgICB0aGV5J2xsIG92ZXJmbG93IGEgMzJiaXQgdmFyCiAgICAgICAgICAgICAgICAgICAgLy9hY2NhID0gTF9hZGQoZHVtbXksaW5fdmFsX2hpZ2gpOwoJCSAgICBhY2NhID0gZHVtbXkgKyBpbl92YWxfaGlnaDsKICAgICAgICAgICAgICAgICAgICBvdXRfdmFsX2xvdyA9IGV4dHJhY3RfbChMX3Nocl9ub2NoZWNrKGFjY2EsMSkpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGR1bW15ID0gYWRkKGluX3ZhbF9sb3csZGl0aGVyX3B0cltpKytdKTsKCQkgICAgLy8gYmxwOiBhZGRpdGlvbiBvZiB0d28gMTZiaXRzIHZhcnMsIHRoZXJlJ3Mgbm8gd2F5CgkJICAgIC8vICAgICAgdGhleSdsbCBvdmVyZmxvdyBhIDMyYml0IHZhcgogICAgICAgICAgICAgICAgICAgIC8vYWNjYSA9IExfYWRkKGR1bW15LC1pbl92YWxfaGlnaCk7CgkJICAgIGFjY2EgPSBkdW1teSAtIGluX3ZhbF9oaWdoOwogICAgICAgICAgICAgICAgICAgIG91dF92YWxfaGlnaCA9IGV4dHJhY3RfbChMX3Nocl9ub2NoZWNrKGFjY2EsMSkpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICpvdXRfcHRyX2xvdysrICA9IG91dF92YWxfbG93OwogICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgICAgICotLW91dF9wdHJfaGlnaCA9IG91dF92YWxfaGlnaDsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaW52b2x2ZXMgY29tcGFyaXNvbiBvZiBwb2ludGVycyAqLwogICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgYXJpdGhtZXRpYyAqLwoKICAgICAgICAgICAgICAgIH0gd2hpbGUgKG91dF9wdHJfbG93IDwgb3V0X3B0cl9oaWdoKTsKICAgIAogICAgICAgICAgICB9IC8qIEVuZCBvZiBsb29wIG92ZXIgc2V0cyBvZiB0aGUgY3VycmVudCBzaXplICovCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoc2V0c19sZWZ0ID0gc2V0X2NvdW50OyAgICBzZXRzX2xlZnQgPiAwOyAgICBzZXRzX2xlZnQtLSkgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwogICAgICAgICAgICAgICAgLyogU2V0IHVwIG91dHB1dCBwb2ludGVycyBmb3IgdGhlIGN1cnJlbnQgc2V0ICovCiAgICAgICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgb3V0X3B0cl9sb3cgICAgPSBuZXh0X291dF9iYXNlOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBuZXh0X291dF9iYXNlICs9IHNldF9zcGFuOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBvdXRfcHRyX2hpZ2ggICA9IG5leHRfb3V0X2Jhc2U7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgICAgIAkvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KICAgICAgICAgICAgCS8qIExvb3Agb3ZlciBhbGwgdGhlIGJ1dHRlcmZsaWVzIGluIHRoZSBjdXJyZW50IHNldCAqLwogICAgICAgICAgICAJLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRvIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGluX3ZhbF9sb3cgICAgICA9ICppbl9wdHIrKzsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgICAgICBpbl92YWxfaGlnaCAgICAgPSAqaW5fcHRyKys7CiAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CgogICAgICAgICAgICAgICAgICAgIG91dF92YWxfbG93ICAgICA9IGFkZChpbl92YWxfbG93LGluX3ZhbF9oaWdoKTsKICAgICAgICAgICAgICAgICAgICBvdXRfdmFsX2hpZ2ggICAgPSBhZGQoaW5fdmFsX2xvdyxuZWdhdGUoaW5fdmFsX2hpZ2gpKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAqb3V0X3B0cl9sb3crKyAgPSBvdXRfdmFsX2xvdzsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgICAgICAqLS1vdXRfcHRyX2hpZ2ggPSBvdXRfdmFsX2hpZ2g7CiAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CgogICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKG91dF9wdHJfbG93IDwgb3V0X3B0cl9oaWdoKTsKICAgIAogICAgICAgICAgICB9IC8qIEVuZCBvZiBsb29wIG92ZXIgc2V0cyBvZiB0aGUgY3VycmVudCBzaXplICovCiAgICAgICAgfQoKICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgLyogRGVjaWRlIHdoaWNoIGJ1ZmZlcnMgdG8gdXNlIGFzIGlucHV0IGFuZCBvdXRwdXQgbmV4dCB0aW1lLiAqLwogICAgICAgIC8qIEV4Y2VwdCBmb3IgdGhlIGZpcnN0IHRpbWUgKHdoZW4gdGhlIGlucHV0IGJ1ZmZlciBpcyB0aGUgICAgKi8KICAgICAgICAvKiBzdWJyb3V0aW5lIGlucHV0KSB3ZSBqdXN0IGFsdGVybmF0ZSB0aGUgbG9jYWwgYnVmZmVycy4gICAgICovCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgICAgIAogICAgICAgIGluX2J1ZmZlciA9IG91dF9idWZmZXI7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmIChvdXRfYnVmZmVyID09IGJ1ZmZlcl9hKQogICAgICAgIHsKICAgICAgICAgICAgb3V0X2J1ZmZlciA9IGJ1ZmZlcl9iOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgb3V0X2J1ZmZlciA9IGJ1ZmZlcl9hOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaW5kZXggPSBhZGQoaW5kZXgsMSk7CiAgICB9IC8qIEVuZCBvZiBsb29wIG92ZXIgc2V0IHNpemVzICovCgoKICAgIC8qKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgLyogRG8gMzIgLSAxMCBwb2ludCB0cmFuc2Zvcm1zICovCiAgICAvKisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKi8KICAgIAogICAgcGFpcl9wdHIgPSBpbl9idWZmZXI7CiAgICBtb3ZlMTYoKTsKICAgIGJ1ZmZlcl9zd2FwID0gYnVmZmVyX2M7CiAgICBtb3ZlMTYoKTsKCiAgICBmb3IgKHBhaXJzX2xlZnQgPSAxIDw8IChkY3RfbGVuZ3RoX2xvZyAtIDEpOyAgICBwYWlyc19sZWZ0ID4gMDsgICAgcGFpcnNfbGVmdC0tKSAKICAgIHsKICAgICAgICBmb3IgKCBrPTA7IGs8Q09SRV9TSVpFOyBrKysgKQogICAgICAgIHsKI2lmIFBKX0hBU19JTlQ2NAoJICAgIC8qIGJscDogZGFuZ2VyIGRhbmdlciEgbm90IHJlYWxseSBjb21wYXRpYmxlIGJ1dCBmYXN0ZXIgKi8KCSAgICBwal9pbnQ2NF90IHN1bTY0PTA7CiAgICAgICAgICAgIG1vdmUzMigpOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yICggaT0wOyBpPENPUkVfU0laRTsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VtNjQgKz0gTF9tdWx0KHBhaXJfcHRyW2ldLCBkY3RfY29yZV9zW2ldW2tdKTsKICAgICAgICAgICAgfQoJICAgIHN1bSA9IExfc2F0dXJhdGUoc3VtNjQpOwojZWxzZQogICAgICAgICAgICBzdW09MEw7CiAgICAgICAgICAgIG1vdmUzMigpOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yICggaT0wOyBpPENPUkVfU0laRTsgaSsrICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3VtID0gTF9tYWMoc3VtLCBwYWlyX3B0cltpXSxkY3RfY29yZV9zW2ldW2tdKTsKICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgYnVmZmVyX3N3YXBba10gPSBpdHVfcm91bmQoc3VtKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcGFpcl9wdHIgICArPSBDT1JFX1NJWkU7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgYnVmZmVyX3N3YXAgKz0gQ09SRV9TSVpFOwogICAgICAgIG1vdmUxNigpOwogICAgfQogICAgCiAgICBmb3IgKGk9MDtpPGRjdF9sZW5ndGg7aSsrKQogICAgewogICAgICAgIGluX2J1ZmZlcltpXSA9IGJ1ZmZlcl9jW2ldOwogICAgICAgIG1vdmUxNigpOwogICAgfQoKICAgIHRhYmxlX3B0cl9wdHIgPSBzX2Nvc19tc2luX3RhYmxlOwogICAgbW92ZTE2KCk7CgogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgLyogUGVyZm9ybSByb3RhdGlvbiBidXR0ZXJmbGllcyAqLwogICAgLyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysqLwogICAgaW5kZXg9MDsKICAgIG1vdmUxNigpOwogICAgCiAgICBmb3IgKHNldF9jb3VudF9sb2cgPSBkY3RfbGVuZ3RoX2xvZyAtIDIgOyAgICBzZXRfY291bnRfbG9nID49IDA7ICAgIHNldF9jb3VudF9sb2ctLSkgCiAgICB7CgogICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgICAgIC8qIEluaXRpYWxpemF0aW9uIGZvciB0aGUgbG9vcCBvdmVyIHNldHMgYXQgdGhlIGN1cnJlbnQgc2l6ZSAqLwogICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgICAgIAogICAgICAgIC8qICAgIHNldF9zcGFuICAgICAgPSAxIDw8IChEQ1RfTEVOR1RIX0xPRyAtIHNldF9jb3VudF9sb2cpOyAqLwogICAgICAgIHNldF9zcGFuID0gc2hyX25vY2hlY2soZGN0X2xlbmd0aCxzZXRfY291bnRfbG9nKTsKICAgICAgICAKICAgICAgICBzZXRfY291bnQgICAgID0gc2hsX25vY2hlY2soMSxzZXRfY291bnRfbG9nKTsKICAgICAgICBuZXh0X2luX2Jhc2UgID0gaW5fYnVmZmVyOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBpZiAoc2V0X2NvdW50X2xvZyA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dF9vdXRfYmFzZSA9IG91dHB1dDsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIG5leHRfb3V0X2Jhc2UgPSBvdXRfYnVmZmVyOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgICAgICAvKiBMb29wIG92ZXIgYWxsIHRoZSBzZXRzIG9mIHRoaXMgc2l6ZSAqLwogICAgICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgogICAgICAgIGZvciAoc2V0c19sZWZ0ID0gc2V0X2NvdW50OyAgICBzZXRzX2xlZnQgPiAwOyAgICBzZXRzX2xlZnQtLSkgCiAgICAgICAgewoKICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fCovCiAgICAgICAgICAgIC8qIFNldCB1cCB0aGUgcG9pbnRlcnMgZm9yIHRoZSBjdXJyZW50IHNldCAqLwogICAgICAgICAgICAvKnx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KICAgICAgICAgICAgCiAgICAgICAgICAgIGluX3B0cl9sb3cgICAgID0gbmV4dF9pbl9iYXNlOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRlbXAgPSBzaHJfbm9jaGVjayhzZXRfc3BhbiwxKTsKICAgICAgICAgICAgaW5fcHRyX2hpZ2ggICAgPSBpbl9wdHJfbG93ICsgdGVtcDsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBuZXh0X2luX2Jhc2UgICs9IHNldF9zcGFuOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG91dF9wdHJfbG93ICAgID0gbmV4dF9vdXRfYmFzZTsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBuZXh0X291dF9iYXNlICs9IHNldF9zcGFuOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgb3V0X3B0cl9oaWdoICAgPSBuZXh0X291dF9iYXNlOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGNvc19tc2luX3B0ciAgID0gKnRhYmxlX3B0cl9wdHI7CiAgICAgICAgICAgIG1vdmUxNigpOwoKICAgICAgICAgICAgLyp8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHwqLwogICAgICAgICAgICAvKiBMb29wIG92ZXIgYWxsIHRoZSBidXR0ZXJmbHkgcGFpcnMgaW4gdGhlIGN1cnJlbnQgc2V0ICovCiAgICAgICAgICAgIC8qfHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8Ki8KCgkgICAgICAgIGRvIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbl9sb3dfZXZlbiAgICAgPSAqaW5fcHRyX2xvdysrOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBpbl9sb3dfb2RkICAgICAgPSAqaW5fcHRyX2xvdysrOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBpbl9oaWdoX2V2ZW4gICAgPSAqaW5fcHRyX2hpZ2grKzsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgaW5faGlnaF9vZGQgICAgID0gKmluX3B0cl9oaWdoKys7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIGNvc19ldmVuICAgICAgICA9IGNvc19tc2luX3B0clswXS5jb3NpbmU7CiAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgICAgIG1zaW5fZXZlbiAgICAgICA9IGNvc19tc2luX3B0clswXS5taW51c19zaW5lOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBjb3Nfb2RkICAgICAgICAgPSBjb3NfbXNpbl9wdHJbMV0uY29zaW5lOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICBtc2luX29kZCAgICAgICAgPSBjb3NfbXNpbl9wdHJbMV0ubWludXNfc2luZTsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgY29zX21zaW5fcHRyICAgKz0gMjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3VtID0gMEw7CiAgICAgICAgICAgICAgICBtb3ZlMzIoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3VtID0gTF9tYWMoc3VtLGNvc19ldmVuLGluX2xvd19ldmVuKTsKICAgICAgICAgICAgICAgIHN1bSA9IExfbWFjKHN1bSxuZWdhdGUobXNpbl9ldmVuKSxpbl9oaWdoX2V2ZW4pOwogICAgICAgICAgICAgICAgb3V0X2xvd19ldmVuID0gaXR1X3JvdW5kKExfc2hsX25vY2hlY2soc3VtLDEpKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3VtID0gMEw7CiAgICAgICAgICAgICAgICBtb3ZlMzIoKTsKICAgICAgICAgICAgICAgIHN1bSA9IExfbWFjKHN1bSxtc2luX2V2ZW4saW5fbG93X2V2ZW4pOwogICAgICAgICAgICAgICAgc3VtID0gTF9tYWMoc3VtLGNvc19ldmVuLGluX2hpZ2hfZXZlbik7CiAgICAgICAgICAgICAgICBvdXRfaGlnaF9ldmVuID0gaXR1X3JvdW5kKExfc2hsX25vY2hlY2soc3VtLDEpKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3VtID0gMEw7CiAgICAgICAgICAgICAgICBtb3ZlMzIoKTsKICAgICAgICAgICAgICAgIHN1bSA9IExfbWFjKHN1bSxjb3Nfb2RkLGluX2xvd19vZGQpOwogICAgICAgICAgICAgICAgc3VtID0gTF9tYWMoc3VtLG1zaW5fb2RkLGluX2hpZ2hfb2RkKTsKICAgICAgICAgICAgICAgIG91dF9sb3dfb2RkID0gaXR1X3JvdW5kKExfc2hsX25vY2hlY2soc3VtLDEpKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3VtID0gMEw7CiAgICAgICAgICAgICAgICBtb3ZlMzIoKTsKICAgICAgICAgICAgICAgIHN1bSA9IExfbWFjKHN1bSxtc2luX29kZCxpbl9sb3dfb2RkKTsKICAgICAgICAgICAgICAgIHN1bSA9IExfbWFjKHN1bSxuZWdhdGUoY29zX29kZCksaW5faGlnaF9vZGQpOwogICAgICAgICAgICAgICAgb3V0X2hpZ2hfb2RkID0gaXR1X3JvdW5kKExfc2hsX25vY2hlY2soc3VtLDEpKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgKm91dF9wdHJfbG93KysgID0gb3V0X2xvd19ldmVuOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICAqLS1vdXRfcHRyX2hpZ2ggPSBvdXRfaGlnaF9ldmVuOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICAqb3V0X3B0cl9sb3crKyAgPSBvdXRfbG93X29kZDsKICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgKi0tb3V0X3B0cl9oaWdoID0gb3V0X2hpZ2hfb2RkOwogICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICB9IHdoaWxlIChvdXRfcHRyX2xvdyA8IG91dF9wdHJfaGlnaCk7CgoJICAgIH0gLyogRW5kIG9mIGxvb3Agb3ZlciBzZXRzIG9mIHRoZSBjdXJyZW50IHNpemUgKi8KCiAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgICAgIC8qIFN3YXAgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGZvciBuZXh0IHRpbWUgKi8KICAgICAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAgICAgCiAgICAgICAgYnVmZmVyX3N3YXAgPSBpbl9idWZmZXI7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgaW5fYnVmZmVyICAgPSBvdXRfYnVmZmVyOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIG91dF9idWZmZXIgID0gYnVmZmVyX3N3YXA7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCiAgICAgICAgaW5kZXggPSBhZGQoaW5kZXgsMSk7CiAgICAgICAgdGFibGVfcHRyX3B0cisrOwogICAgfQogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgICAgICBBREQgSU4gQklBUyBGT1IgT1VUUFVUCiAgICAgICAgIAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgaWYgKGRjdF9sZW5ndGg9PURDVF9MRU5HVEgpCiAgICB7CiAgICAgICAgZm9yKGk9MDtpPDMyMDtpKyspIAogICAgICAgIHsKCSAgIC8vIGJscDogYWRkaXRpb24gb2YgdHdvIDE2Yml0cyB2YXJzLCB0aGVyZSdzIG5vIHdheQoJICAgLy8gICAgICB0aGV5J2xsIG92ZXJmbG93IGEgMzJiaXQgdmFyCiAgICAgICAgICAgLy9zdW0gPSBMX2FkZChvdXRwdXRbaV0sc3luX2JpYXNfN2toeltpXSk7CgkgICBzdW0gPSBvdXRwdXRbaV0gKyBzeW5fYmlhc183a2h6W2ldOwogICAgICAgICAgIGFjY2EgPSBMX3N1YihzdW0sMzI3NjcpOwogICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICBpZiAoYWNjYSA+IDApIAogICAgICAgICAgIHsKICAgICAgICAgICAgICAgc3VtID0gMzI3NjdMOwogICAgICAgICAgICAgICBtb3ZlMzIoKTsKICAgICAgICAgICB9CgkgICAvLyBibHA6IGFkZGl0aW9uIG9mIHR3byAxNmJpdHMgdmFycywgdGhlcmUncyBubyB3YXkKCSAgIC8vICAgICAgdGhleSdsbCBvdmVyZmxvdyAzMmJpdCB2YXIKICAgICAgICAgICAvL2FjY2EgPSBMX2FkZChzdW0sMzI3NjhMKTsKCSAgIGFjY2EgPSBzdW0gKyAzMjc2ODsKICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgaWYgKGFjY2EgPCAwKSAKICAgICAgICAgICB7CiAgICAgICAgICAgICAgIHN1bSA9IC0zMjc2OEw7CiAgICAgICAgICAgICAgIG1vdmUzMigpOwogICAgICAgICAgIH0KICAgICAgICAgICBvdXRwdXRbaV0gPSBleHRyYWN0X2woc3VtKTsKICAgICAgICB9CiAgICB9Cn0KCg==