LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKgoqKiAgIElUVS1UIEcuNzIyLjEgKDIwMDUtMDUpIC0gRml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gZm9yIG1haW4gYm9keSBhbmQgQW5uZXggQwoqKiAgID4gU29mdHdhcmUgUmVsZWFzZSAyLjEgKDIwMDgtMDYpCioqICAgICAoU2ltcGxlIHJlcGFja2FnaW5nOyBubyBjaGFuZ2UgZnJvbSAyMDA1LTA1IFJlbGVhc2UgMi4wIGNvZGUpCioqCioqICAgqSAyMDA0IFBvbHljb20sIEluYy4KKioKKiogICBBbGwgcmlnaHRzIHJlc2VydmVkLgoqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgRmlsZW5hbWU6ICAgIGVuY29kZXIuYyAgICAKCiAgUHVycG9zZTogICAgIENvbnRhaW5zIGZpbGVzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBHLjcyMi4xIEFubmV4IEMgZW5jb2RlcgoKICBEZXNpZ24gTm90ZXM6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlICJkZWZzLmgiCiNpbmNsdWRlICJodWZmX2RlZi5oIgojaW5jbHVkZSAidGFibGVzLmgiCiNpbmNsdWRlICJjb3VudC5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb246ICAgIGVuY29kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBTeW50YXg6ICAgICAgdm9pZCBlbmNvZGVyKFdvcmQxNiBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1sdF9jb2VmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYWdfc2hpZnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgb3V0X3dvcmRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAKICAgICAgICAgICAgICBpbnB1dHM6ICAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzCiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIG1hZ19zaGlmdAogICAgICAgICAgICAgICAgICAgICAgICBtbHRfY29lZnNbRENUX0xFTkdUSF0KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgb3V0cHV0czogIG91dF93b3Jkc1tNQVhfQklUU19QRVJfRlJBTUUvMTZdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogRGVzY3JpcHRpb246IEVuY29kZXMgdGhlIG1sdCBjb2VmcyBpbnRvIG91dF93b3JkcyB1c2luZyBHLjcyMi4xIEFubmV4IEMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjkzICAgICAgfCAgICAgMS4wNAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKICAgICAgICAgICAgTUFYICB8ICAgIDEuMjAgICAgICB8ICAgICAxLjI4CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMS4zOSAgICAgIHwgICAgIDEuNzEgICAgICAgfCAgICAgMi4wMQogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgIDIuMDAgICAgICB8ICAgICAyLjMwICAgICAgIHwgICAgIDIuNTIKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBlbmNvZGVyKFdvcmQxNiAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLAogICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgIFdvcmQxNiAgKm1sdF9jb2VmcywKICAgICAgICAgICAgIFdvcmQxNiAgbWFnX3NoaWZ0LAogICAgICAgICAgICAgV29yZDE2ICAqb3V0X3dvcmRzKQp7CgogICAgV29yZDE2ICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzOwogICAgV29yZDE2ICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzOwogICAgV29yZDE2ICBudW1iZXJfb2ZfYml0c19wZXJfZnJhbWU7CiAgICBXb3JkMTYgIG51bWJlcl9vZl9lbnZlbG9wZV9iaXRzOwogICAgV29yZDE2ICBjYXRlZ29yaXphdGlvbl9jb250cm9sOwogICAgV29yZDE2ICByZWdpb247CiAgICBXb3JkMTYgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtNQVhfTlVNQkVSX09GX1JFR0lPTlNdOwogICAgV29yZDE2ICBwb3dlcl9jYXRlZ29yaWVzW01BWF9OVU1CRVJfT0ZfUkVHSU9OU107CiAgICBXb3JkMTYgIGNhdGVnb3J5X2JhbGFuY2VzW01BWF9OVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9QT1NTSUJJTElUSUVTLTFdOwogICAgV29yZDE2ICBkcnBfbnVtX2JpdHNbTUFYX05VTUJFUl9PRl9SRUdJT05TKzFdOwogICAgVVdvcmQxNiBkcnBfY29kZV9iaXRzW01BWF9OVU1CRVJfT0ZfUkVHSU9OUysxXTsKICAgIFdvcmQxNiAgcmVnaW9uX21sdF9iaXRfY291bnRzW01BWF9OVU1CRVJfT0ZfUkVHSU9OU107CiAgICBVV29yZDMyIHJlZ2lvbl9tbHRfYml0c1s0Kk1BWF9OVU1CRVJfT0ZfUkVHSU9OU107CiAgICBXb3JkMTYgIG1hZ19zaGlmdF9vZmZzZXQ7CgogICAgV29yZDE2IHRlbXA7CgogICAgLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KICAgIHRlc3QoKTsKICAgIGlmIChudW1iZXJfb2ZfcmVnaW9ucyA9PSBOVU1CRVJfT0ZfUkVHSU9OUykKICAgIHsKICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzID0gTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfQklUUzsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzID0gTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFUzsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0gCiAgICBlbHNlCiAgICB7CiAgICAgICAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0cyA9IE1BWF9OVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9CSVRTOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMgPSBNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFUzsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KCiAgICBudW1iZXJfb2ZfYml0c19wZXJfZnJhbWUgPSBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHM7CiAgICBtb3ZlMTYoKTsKCiAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKQogICAgewogICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dID0gMDsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KICAgIAogICAgLyogRXN0aW1hdGUgcG93ZXIgZW52ZWxvcGUuICovCiAgICBudW1iZXJfb2ZfZW52ZWxvcGVfYml0cyA9IGNvbXB1dGVfcmVnaW9uX3Bvd2VycyhtbHRfY29lZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdfc2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnBfbnVtX2JpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnBfY29kZV9iaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMpOwoKICAgIC8qIEFkanVzdCBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdHMgYmFzZWQgb24gcG93ZXIgZW52ZWxvcGUgZXN0aW1hdGUgKi8KICAgIHRlbXAgPSBzdWIobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLG51bWJlcl9vZl9lbnZlbG9wZV9iaXRzKTsKICAgIG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyA9IHN1Yih0ZW1wLG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHMpOwoKICAgIC8qIGdldCBjYXRlZ29yaXphdGlvbnMgKi8KICAgIGNhdGVnb3JpemUobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLAogICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKICAgICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAogICAgICAgICAgICAgICBwb3dlcl9jYXRlZ29yaWVzLAogICAgICAgICAgICAgICBjYXRlZ29yeV9iYWxhbmNlcyk7CgogICAgLyogQWRqdXN0IGFic29sdXRlX3JlZ2lvbl9jYXRlZ29yeV9pbmRleFtdIGZvciBtYWdfc2hpZnQuCiAgICAgICBUaGlzIGFzc3VtZXMgdGhhdCBSRUdJT05fUE9XRVJfU1RFUFNJWkVfREIgaXMgZGVmaW5lZAogICAgICAgdG8gYmUgZXhhY3RseSAzLjAxMDI5OTk1NyBvciAyMC4wIHRpbWVzIGxvZyBiYXNlIDEwCiAgICAgICBvZiBzcXVhcmUgcm9vdCBvZiAyLiAqLwogICAgdGVtcCA9IHNobF9ub2NoZWNrKG1hZ19zaGlmdCwxKTsKICAgIG1hZ19zaGlmdF9vZmZzZXQgPSBhZGQodGVtcCxSRUdJT05fUE9XRVJfVEFCTEVfTlVNX05FR0FUSVZFUyk7CiAgICAKICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCiAgICB7CiAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSBhZGQoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sbWFnX3NoaWZ0X29mZnNldCk7CiAgICAgICAgbW92ZTE2KCk7CiAgICB9CgogICAgLyogYWRqdXN0IHRoZSBhYnNvbHV0ZSBwb3dlciByZWdpb24gaW5kZXggYmFzZWQgb24gdGhlIG1sdCBjb2VmcyAqLwogICAgYWRqdXN0X2Fic19yZWdpb25fcG93ZXJfaW5kZXgoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LG1sdF9jb2VmcyxudW1iZXJfb2ZfcmVnaW9ucyk7CgoKICAgIC8qIHF1YW50aXplIGFuZCBjb2RlIHRoZSBtbHQgY29lZmZpY2llbnRzIGJhc2VkIG9uIGNhdGVnb3JpemF0aW9ucyAqLwogICAgdmVjdG9yX3F1YW50aXplX21sdHMobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgbWx0X2NvZWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJfY2F0ZWdvcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2JhbGFuY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGVnb3JpemF0aW9uX2NvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fbWx0X2JpdHMpOwoKICAgIC8qIHN0dWZmIGJpdHMgaW50byB3b3JkcyAqLwogICAgYml0c190b193b3JkcyhyZWdpb25fbWx0X2JpdHMsCiAgICAgICAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50cywKICAgICAgICAgICAgICAgICAgZHJwX251bV9iaXRzLAogICAgICAgICAgICAgICAgICBkcnBfY29kZV9iaXRzLAogICAgICAgICAgICAgICAgICBvdXRfd29yZHMsCiAgICAgICAgICAgICAgICAgIGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsCiAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zLAogICAgICAgICAgICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzLAogICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfYml0c19wZXJfZnJhbWUpOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb246ICAgIGJpdHNfdG9fd29yZHMKCiBTeW50YXg6ICAgICAgYml0c190b193b3JkcyhVV29yZDMyICpyZWdpb25fbWx0X2JpdHMsICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKnJlZ2lvbl9tbHRfYml0X2NvdW50cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICpkcnBfbnVtX2JpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQxNiAqZHJwX2NvZGVfYml0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKm91dF93b3JkcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtYmVyX29mX2JpdHNfcGVyX2ZyYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogRGVzY3JpcHRpb246IFN0dWZmcyB0aGUgYml0cyBpbnRvIHdvcmRzIGZvciBvdXRwdXQKCiBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAgIDMya2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjA5ICAgICAgfCAgICAgMC4xMgogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKICAgICAgICAgICAgTUFYICB8ICAgIDAuMTAgICAgICB8ICAgICAwLjEzCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAKICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQgICAgIHwgICAgIDQ4a2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgIDAuMTIgICAgICB8ICAgICAwLjE1ICAgICAgIHwgICAgIDAuMTkKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIE1BWCAgfCAgICAwLjE0ICAgICAgfCAgICAgMC4xNyAgICAgICB8ICAgICAwLjIxCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIGJpdHNfdG9fd29yZHMoVVdvcmQzMiAqcmVnaW9uX21sdF9iaXRzLAogICAgICAgICAgICAgICAgICAgV29yZDE2ICAqcmVnaW9uX21sdF9iaXRfY291bnRzLAogICAgICAgICAgICAgICAgICAgV29yZDE2ICAqZHJwX251bV9iaXRzLAogICAgICAgICAgICAgICAgICAgVVdvcmQxNiAqZHJwX2NvZGVfYml0cywKICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKm91dF93b3JkcywKICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgY2F0ZWdvcml6YXRpb25fY29udHJvbCwKICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtYmVyX29mX3JlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHMsCiAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSkKewogICAgV29yZDE2ICBvdXRfd29yZF9pbmRleCA9IDA7CiAgICBXb3JkMTYgIGo7CiAgICBXb3JkMTYgIHJlZ2lvbjsKICAgIFdvcmQxNiAgb3V0X3dvcmQ7CiAgICBXb3JkMTYgIHJlZ2lvbl9iaXRfY291bnQ7CiAgICBXb3JkMTYgIGN1cnJlbnRfd29yZF9iaXRzX2xlZnQ7CiAgICBVV29yZDE2IHNsaWNlOwogICAgV29yZDE2ICBvdXRfd29yZF9iaXRzX2ZyZWUgPSAxNjsKICAgIFVXb3JkMzIgKmluX3dvcmRfcHRyOwogICAgVVdvcmQzMiBjdXJyZW50X3dvcmQ7CiAgICAKICAgIFdvcmQzMiAgYWNjYSA9IDA7CiAgICBXb3JkMzIgIGFjY2I7CiAgICBXb3JkMTYgIHRlbXA7CgogICAgLyogRmlyc3Qgc2V0IHVwIHRoZSBjYXRlZ29yaXphdGlvbiBjb250cm9sIGJpdHMgdG8gbG9vayBsaWtlIG9uZSBtb3JlIHNldCBvZiByZWdpb24gcG93ZXIgYml0cy4gKi8KICAgIG91dF93b3JkID0gMDsKICAgIG1vdmUxNigpOwoKICAgIGRycF9udW1fYml0c1tudW1iZXJfb2ZfcmVnaW9uc10gPSBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzOwogICAgbW92ZTE2KCk7CiAgICAKICAgIGRycF9jb2RlX2JpdHNbbnVtYmVyX29mX3JlZ2lvbnNdID0gKFVXb3JkMTYpY2F0ZWdvcml6YXRpb25fY29udHJvbDsKICAgIG1vdmUxNigpOwoKICAgIC8qIFRoZXNlIGNvZGUgYml0cyBhcmUgcmlnaHQganVzdGlmaWVkLiAqLwogICAgZm9yIChyZWdpb249MDsgcmVnaW9uIDw9IG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKICAgIHsKICAgICAgICBjdXJyZW50X3dvcmRfYml0c19sZWZ0ID0gZHJwX251bV9iaXRzW3JlZ2lvbl07CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCiAgICAgICAgY3VycmVudF93b3JkID0gKFVXb3JkMzIpZHJwX2NvZGVfYml0c1tyZWdpb25dOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIAogICAgICAgIGogPSBzdWIoY3VycmVudF93b3JkX2JpdHNfbGVmdCxvdXRfd29yZF9iaXRzX2ZyZWUpOwoKICAgICAgICB0ZXN0KCk7CiAgICAgICAgaWYgKGogPj0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHRlbXAgPSBleHRyYWN0X2woTF9zaHJfbm9jaGVjayhjdXJyZW50X3dvcmQsaikpOwogICAgICAgICAgICBvdXRfd29yZCA9IGFkZChvdXRfd29yZCx0ZW1wKTsKCiAgICAgICAgICAgIG91dF93b3Jkc1tvdXRfd29yZF9pbmRleCsrXSA9IG91dF93b3JkOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG91dF93b3JkX2JpdHNfZnJlZSA9IDE2OwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG91dF93b3JkX2JpdHNfZnJlZSA9IHN1YihvdXRfd29yZF9iaXRzX2ZyZWUsaik7CiAgICAgICAgICAgIAogICAgICAgICAgICBhY2NhID0gKGN1cnJlbnRfd29yZCA8PCBvdXRfd29yZF9iaXRzX2ZyZWUpOwogICAgICAgICAgICBvdXRfd29yZCA9IGV4dHJhY3RfbChhY2NhKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaiA9IG5lZ2F0ZShqKTsKCiAgICAgICAgICAgIGFjY2EgPSAoY3VycmVudF93b3JkIDw8IGopOwogICAgICAgICAgICBhY2NiID0gTF9kZXBvc2l0X2wob3V0X3dvcmQpOwogICAgICAgICAgICBhY2NhID0gTF9hZGQoYWNjYixhY2NhKTsKICAgICAgICAgICAgb3V0X3dvcmQgPSBleHRyYWN0X2woYWNjYSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBvdXRfd29yZF9iaXRzX2ZyZWUgPSBzdWIob3V0X3dvcmRfYml0c19mcmVlLGN1cnJlbnRfd29yZF9iaXRzX2xlZnQpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBUaGVzZSBjb2RlIGJpdHMgYXJlIGxlZnQganVzdGlmaWVkLiAqLwogICAgCiAgICBmb3IgKHJlZ2lvbj0wO3JlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCiAgICB7CiAgICAgICAgYWNjYiA9IExfZGVwb3NpdF9sKG91dF93b3JkX2luZGV4KTsKICAgICAgICBhY2NiID0gTF9zaGxfbm9jaGVjayhhY2NiLDQpOwogICAgICAgIGFjY2IgPSBMX3N1YihhY2NiLG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmKGFjY2IgPCAwKSAgICAgICAgCiAgICAgICAgewogICAgICAgICAgICB0ZW1wID0gc2hsX25vY2hlY2socmVnaW9uLDIpOwogICAgICAgICAgICBpbl93b3JkX3B0ciA9ICZyZWdpb25fbWx0X2JpdHNbdGVtcF07CiAgICAgICAgICAgIHJlZ2lvbl9iaXRfY291bnQgPSByZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXTsKICAgICAgICAgICAgbW92ZTE2KCk7CgogICAgICAgICAgICB0ZW1wID0gc3ViKDMyLHJlZ2lvbl9iaXRfY291bnQpOwogICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgIGlmKHRlbXAgPiAwKQogICAgICAgICAgICAgICAgY3VycmVudF93b3JkX2JpdHNfbGVmdCA9IHJlZ2lvbl9iaXRfY291bnQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGN1cnJlbnRfd29yZF9iaXRzX2xlZnQgPSAzMjsKCiAgICAgICAgICAgIGN1cnJlbnRfd29yZCA9ICppbl93b3JkX3B0cisrOwogICAgCiAgICAgICAgICAgIGFjY2EgPSBMX2RlcG9zaXRfbChvdXRfd29yZF9pbmRleCk7CiAgICAgICAgICAgIGFjY2EgPSBMX3NobF9ub2NoZWNrKGFjY2EsNCk7CiAgICAgICAgICAgIGFjY2EgPSBMX3N1YihhY2NhLG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvKiBmcm9tIHdoaWxlIGxvb3AgKi8KICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgIGxvZ2ljMTYoKTsgCiAgICAgICAgICAgIHdoaWxlICgocmVnaW9uX2JpdF9jb3VudCA+IDApICYmIChhY2NhIDwgMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGZyb20gd2hpbGUgbG9vcCAqLwogICAgICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICAgICAgbG9naWMxNigpOyAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGVtcCA9IHN1YihjdXJyZW50X3dvcmRfYml0c19sZWZ0LG91dF93b3JkX2JpdHNfZnJlZSk7CiAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICBpZiAodGVtcCA+PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzdWIoMzIsb3V0X3dvcmRfYml0c19mcmVlKTsKICAgICAgICAgICAgICAgICAgICBhY2NiID0gTFVfc2hyKGN1cnJlbnRfd29yZCx0ZW1wKTsKICAgICAgICAgICAgICAgICAgICBzbGljZSA9IChVV29yZDE2KWV4dHJhY3RfbChhY2NiKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBvdXRfd29yZCA9IGFkZChvdXRfd29yZCxzbGljZSk7CiAgICAKICAgICAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudF93b3JkIDw8PSBvdXRfd29yZF9iaXRzX2ZyZWU7CgogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfd29yZF9iaXRzX2xlZnQgPSBzdWIoY3VycmVudF93b3JkX2JpdHNfbGVmdCxvdXRfd29yZF9iaXRzX2ZyZWUpOwogICAgICAgICAgICAgICAgICAgIG91dF93b3Jkc1tvdXRfd29yZF9pbmRleCsrXSA9IGV4dHJhY3RfbChvdXRfd29yZCk7CiAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CgogICAgICAgICAgICAgICAgICAgIG91dF93b3JkID0gMDsKICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgICAgICAgICAgICAgb3V0X3dvcmRfYml0c19mcmVlID0gMTY7CiAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHN1YigzMixjdXJyZW50X3dvcmRfYml0c19sZWZ0KTsKICAgICAgICAgICAgICAgICAgICBhY2NiID0gTFVfc2hyKGN1cnJlbnRfd29yZCx0ZW1wKTsKICAgICAgICAgICAgICAgICAgICBzbGljZSA9IChVV29yZDE2KWV4dHJhY3RfbChhY2NiKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKG91dF93b3JkX2JpdHNfZnJlZSxjdXJyZW50X3dvcmRfYml0c19sZWZ0KTsKICAgICAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgYWNjYiA9IHNsaWNlIDw8IHRlbXA7CiAgICAgICAgICAgICAgICAgICAgYWNjYSA9IExfZGVwb3NpdF9sKG91dF93b3JkKTsKICAgICAgICAgICAgICAgICAgICBhY2NhID0gTF9hZGQoYWNjYSxhY2NiKTsKICAgICAgICAgICAgICAgICAgICBvdXRfd29yZCA9IGV4dHJhY3RfbChhY2NhKTsKICAgICAgICAgICAgICAgICAgICBvdXRfd29yZF9iaXRzX2ZyZWUgPSBzdWIob3V0X3dvcmRfYml0c19mcmVlLGN1cnJlbnRfd29yZF9iaXRzX2xlZnQpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfd29yZF9iaXRzX2xlZnQgPSAwOwogICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF93b3JkX2JpdHNfbGVmdCA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfd29yZCA9ICppbl93b3JkX3B0cisrOwogICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9iaXRfY291bnQgPSBzdWIocmVnaW9uX2JpdF9jb3VudCwzMik7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudF93b3JkX2JpdHNfbGVmdCA9IE1JTigzMixyZWdpb25fYml0X2NvdW50KTsgKi8KICAgICAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKDMyLHJlZ2lvbl9iaXRfY291bnQpOwogICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgICAgICAgICBpZih0ZW1wID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF93b3JkX2JpdHNfbGVmdCA9IHJlZ2lvbl9iaXRfY291bnQ7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3dvcmRfYml0c19sZWZ0ID0gMzI7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhY2NhID0gTF9kZXBvc2l0X2wob3V0X3dvcmRfaW5kZXgpOwogICAgICAgICAgICAgICAgYWNjYSA9IExfc2hsX25vY2hlY2soYWNjYSw0KTsKICAgICAgICAgICAgICAgIGFjY2EgPSBMX3N1YihhY2NhLG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWNjYiA9IExfZGVwb3NpdF9sKG91dF93b3JkX2luZGV4KTsKICAgICAgICAgICAgYWNjYiA9IExfc2hsX25vY2hlY2soYWNjYiw0KTsKICAgICAgICAgICAgYWNjYiA9IExfc3ViKGFjY2IsbnVtYmVyX29mX2JpdHNfcGVyX2ZyYW1lKTsKICAgICAgICB9CiAgICB9CgogICAgLyogRmlsbCBvdXQgd2l0aCAxJ3MuICovCgogICAgdGVzdCgpOwogICAgd2hpbGUgKGFjY2EgPCAwKQogICAgewogICAgICAgIHRlc3QoKTsKICAgICAgICBjdXJyZW50X3dvcmQgPSAweDAwMDBmZmZmOwogICAgICAgIG1vdmUzMigpOwoKICAgICAgICB0ZW1wID0gc3ViKDE2LG91dF93b3JkX2JpdHNfZnJlZSk7CiAgICAgICAgYWNjYSA9IExVX3NocihjdXJyZW50X3dvcmQsdGVtcCk7CiAgICAgICAgc2xpY2UgPSAoVVdvcmQxNilleHRyYWN0X2woYWNjYSk7CgogICAgICAgIG91dF93b3JkID0gYWRkKG91dF93b3JkLHNsaWNlKTsKICAgICAgICBvdXRfd29yZHNbb3V0X3dvcmRfaW5kZXgrK10gPSBvdXRfd29yZDsKICAgICAgICBtb3ZlMTYoKTsKCiAgICAgICAgb3V0X3dvcmQgPSAwOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIAogICAgICAgIG91dF93b3JkX2JpdHNfZnJlZSA9IDE2OwogICAgICAgIG1vdmUxNigpOwogICAgICAgIAogICAgICAgIGFjY2EgPSBMX2RlcG9zaXRfbChvdXRfd29yZF9pbmRleCk7CiAgICAgICAgYWNjYSA9IExfc2hsX25vY2hlY2soYWNjYSw0KTsKICAgICAgICBhY2NhID0gTF9zdWIoYWNjYSxudW1iZXJfb2ZfYml0c19wZXJfZnJhbWUpOwogICAgfQp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICBhZGp1c3RfYWJzX3JlZ2lvbl9wb3dlcl9pbmRleAoKIFN5bnRheDogICAgICBhZGp1c3RfYWJzX3JlZ2lvbl9wb3dlcl9pbmRleChXb3JkMTYgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm1sdF9jb2VmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMpCgogICAgICAgICAgICAgIGlucHV0czogICAqbWx0X2NvZWZzCiAgICAgICAgICAgICAgICAgICAgICAgICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMKICAgICAgICAgICAgCiAgICAgICAgICAgICAgb3V0cHV0czogICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgKIAogRGVzY3JpcHRpb246IEFkanVzdHMgdGhlIGFic29sdXRlIHBvd2VyIGluZGV4CiAKIAogV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgICAzMmtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4wMyAgICAgIHwgICAgICAwLjAzCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAogICAgICAgICAgICBNQVggIHwgICAgMC4xMiAgICAgIHwgICAgICAwLjEyCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCgogICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBBVkcgIHwgICAgMC4wMyAgICAgIHwgICAgIDAuMDMgICAgICAgfCAgICAgMC4wMwogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgTUFYICB8ICAgIDAuMTQgICAgICB8ICAgICAwLjE0ICAgICAgIHwgICAgIDAuMTQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgYWRqdXN0X2Fic19yZWdpb25fcG93ZXJfaW5kZXgoV29yZDE2ICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsV29yZDE2ICptbHRfY29lZnMsV29yZDE2IG51bWJlcl9vZl9yZWdpb25zKQp7CiAgICBXb3JkMTYgbixpOwogICAgV29yZDE2IHJlZ2lvbjsKICAgIFdvcmQxNiAqcmF3X21sdF9wdHI7CiAgICAKICAgIFdvcmQzMiBhY2NhOwogICAgV29yZDE2IHRlbXA7CgogICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKICAgIHsKICAgICAgICBuID0gc3ViKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLDM5KTsKICAgICAgICBuID0gc2hyX25vY2hlY2sobiwxKTsKICAgICAgICAKICAgICAgICB0ZXN0KCk7CiAgICAgICAgaWYgKG4gPiAwKQogICAgICAgIHsKICAgICAgICAgICAgdGVtcCA9IGV4dHJhY3RfbChMX211bHQwKHJlZ2lvbixSRUdJT05fU0laRSkpOwoKICAgICAgICAgICAgcmF3X21sdF9wdHIgPSAmbWx0X2NvZWZzW3RlbXBdOwoKICAgICAgICAgICAgZm9yIChpPTA7IGk8UkVHSU9OX1NJWkU7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWNjYSA9IExfc2hsX25vY2hlY2soKnJhd19tbHRfcHRyLDE2KTsKICAgICAgICAgICAgICAgIGFjY2EgPSBMX2FkZChhY2NhLDMyNzY4TCk7CiAgICAgICAgICAgICAgICBhY2NhID0gTF9zaHJfbm9jaGVjayhhY2NhLG4pOwogICAgICAgICAgICAgICAgYWNjYSA9IExfc2hyX25vY2hlY2soYWNjYSwxNik7CiAgICAgICAgICAgICAgICAqcmF3X21sdF9wdHIrKyA9IGV4dHJhY3RfbChhY2NhKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGVtcCA9IHNobF9ub2NoZWNrKG4sMSk7CiAgICAgICAgICAgIHRlbXAgPSBzdWIoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sdGVtcCk7CiAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dID0gdGVtcDsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgfQogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbjogICAgY29tcHV0ZV9yZWdpb25fcG93ZXJzCgogU3ludGF4OiAgICAgIFdvcmQxNiBjb21wdXRlX3JlZ2lvbl9wb3dlcnMoV29yZDE2ICAqbWx0X2NvZWZzLCAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWFnX3NoaWZ0LCAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKmRycF9udW1fYml0cywgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDE2ICpkcnBfY29kZV9iaXRzLCAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LCAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtYmVyX29mX3JlZ2lvbnMpCiAgICAgICAgICAgICAgICBtbHRfY29lZnNbRENUX0xFTkdUSF07ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgbWFnX3NoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZHJwX251bV9iaXRzW01BWF9OVU1CRVJfT0ZfUkVHSU9OU107ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZHJwX2NvZGVfYml0c1tNQVhfTlVNQkVSX09GX1JFR0lPTlNdOyAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W01BWF9OVU1CRVJfT0ZfUkVHSU9OU107ICAgICAgIAogICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIERlc2NyaXB0aW9uOiBDb21wdXRlcyB0aGUgcG93ZXIgZm9yIGVhY2ggb2YgdGhlIHJlZ2lvbnMKCiAKIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgIDMya2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjA5ICAgICAgfCAgICAwLjA5CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAogICAgICAgICAgICBNQVggIHwgICAgMC4xMyAgICAgIHwgICAgMC4xMwogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAoKICAgICAgICAgICAxNGtIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQgICAgIHwgICAgIDQ4a2JpdAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgIDAuMjAgICAgICB8ICAgICAwLjIwICAgICAgIHwgICAgIDAuMjAKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIE1BWCAgfCAgICAwLjI5ICAgICAgfCAgICAgMC4yOSAgICAgICB8ICAgICAwLjI5CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKV29yZDE2IGNvbXB1dGVfcmVnaW9uX3Bvd2VycyhXb3JkMTYgICptbHRfY29lZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtYWdfc2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqZHJwX251bV9iaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMTYgKmRycF9jb2RlX2JpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtYmVyX29mX3JlZ2lvbnMpCnsKCiAgICBXb3JkMTYgKmlucHV0X3B0cjsKICAgIFdvcmQzMiBsb25nX2FjY3VtdWxhdG9yOwogICAgV29yZDE2IGl0ZW1wMTsKICAgIFdvcmQxNiBwb3dlcl9zaGlmdDsKICAgIFdvcmQxNiByZWdpb247CiAgICBXb3JkMTYgajsKICAgIFdvcmQxNiBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2luZGV4W01BWF9OVU1CRVJfT0ZfUkVHSU9OU107CiAgICBXb3JkMTYgbnVtYmVyX29mX2JpdHM7CiAgICAKICAgIFdvcmQzMiBhY2NhOwogICAgV29yZDE2IHRlbXA7CiAgICBXb3JkMTYgdGVtcDE7CiAgICBXb3JkMTYgdGVtcDI7CgoKICAgIGlucHV0X3B0ciA9IG1sdF9jb2VmczsKICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCiAgICB7CiAgICAgICAgbG9uZ19hY2N1bXVsYXRvciA9IExfZGVwb3NpdF9sKDApOwoKICAgICAgICBmb3IgKGo9MDsgajxSRUdJT05fU0laRTsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaXRlbXAxID0gKmlucHV0X3B0cisrOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAgICAgbG9uZ19hY2N1bXVsYXRvciA9IExfbWFjMChsb25nX2FjY3VtdWxhdG9yLGl0ZW1wMSxpdGVtcDEpOwogICAgICAgIH0KCiAgICAgICAgcG93ZXJfc2hpZnQgPSAwOwogICAgICAgIG1vdmUxNigpOwoKICAgICAgICBhY2NhID0gKGxvbmdfYWNjdW11bGF0b3IgJiAweDdmZmYwMDAwTCk7CiAgICAgICAgbG9naWMzMigpOwoKICAgICAgICB0ZXN0KCk7CiAgICAgICAgd2hpbGUgKGFjY2EgPiAwKQogICAgICAgIHsKICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICBsb25nX2FjY3VtdWxhdG9yID0gTF9zaHJfbm9jaGVjayhsb25nX2FjY3VtdWxhdG9yLDEpOwogICAgICAgICAgICAKICAgICAgICAgICAgYWNjYSA9IChsb25nX2FjY3VtdWxhdG9yICYgMHg3ZmZmMDAwMEwpOwogICAgICAgICAgICBsb2dpYzMyKCk7CgogICAgICAgICAgICBwb3dlcl9zaGlmdCA9IGFkZChwb3dlcl9zaGlmdCwxKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYWNjYSA9IExfc3ViKGxvbmdfYWNjdW11bGF0b3IsMzI3NjcpOwogICAgICAgIAogICAgICAgIHRlbXAgPSBhZGQocG93ZXJfc2hpZnQsMTUpOwogICAgICAgIHRlc3QoKTsKICAgICAgICB0ZXN0KCk7CiAgICAgICAgbG9naWMxNigpOwogICAgICAgIHdoaWxlICgoYWNjYSA8PSAwKSAmJiAodGVtcCA+PSAwKSkKICAgICAgICB7CiAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICBsb2dpYzE2KCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBsb25nX2FjY3VtdWxhdG9yID0gTF9zaGxfbm9jaGVjayhsb25nX2FjY3VtdWxhdG9yLDEpOwogICAgICAgICAgICBhY2NhID0gTF9zdWIobG9uZ19hY2N1bXVsYXRvciwzMjc2Nyk7CiAgICAgICAgICAgIHBvd2VyX3NoaWZ0LS07CiAgICAgICAgICAgIHRlbXAgPSBhZGQocG93ZXJfc2hpZnQsMTUpOwogICAgICAgIH0KICAgICAgICBsb25nX2FjY3VtdWxhdG9yID0gTF9zaHJfbm9jaGVjayhsb25nX2FjY3VtdWxhdG9yLDEpOwogICAgICAgIC8qIDI4OTYzIGNvcnJlc3BvbmRzIHRvIHNxdWFyZSByb290IG9mIDIgdGltZXMgUkVHSU9OX1NJWkUoMjApLiAqLwogICAgICAgIGFjY2EgPSBMX3N1Yihsb25nX2FjY3VtdWxhdG9yLDI4OTYzKTsKICAgICAgICAKICAgICAgICB0ZXN0KCk7CiAgICAgICAgaWYgKGFjY2EgPj0gMCkKICAgICAgICAgICAgcG93ZXJfc2hpZnQgPSBhZGQocG93ZXJfc2hpZnQsMSk7CiAgICAgICAgCiAgICAgICAgYWNjYSA9IExfZGVwb3NpdF9sKG1hZ19zaGlmdCk7CiAgICAgICAgYWNjYSA9IExfc2hsX25vY2hlY2soYWNjYSwxKTsKICAgICAgICBhY2NhID0gTF9zdWIocG93ZXJfc2hpZnQsYWNjYSk7CiAgICAgICAgYWNjYSA9IExfYWRkKDM1LGFjY2EpOwogICAgICAgIGFjY2EgPSBMX3N1YihhY2NhLFJFR0lPTl9QT1dFUl9UQUJMRV9OVU1fTkVHQVRJVkVTKTsKICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA9IGV4dHJhY3RfbChhY2NhKTsKICAgIH0KCgogICAgLyogQmVmb3JlIHdlIGRpZmZlcmVudGlhbGx5IGVuY29kZSB0aGUgcXVhbnRpemVkIHJlZ2lvbiBwb3dlcnMsIGFkanVzdCB1cHdhcmQgdGhlCiAgICB2YWxsZXlzIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIHBlYWtzIGNhbiBiZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkLiAqLwogICAgdGVtcCA9IHN1YihudW1iZXJfb2ZfcmVnaW9ucywyKTsKCiAgICBmb3IgKHJlZ2lvbiA9IHRlbXA7IHJlZ2lvbiA+PSAwOyByZWdpb24tLSkKICAgIHsKICAgICAgICB0ZW1wMSA9IHN1YihhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uKzFdLERSUF9ESUZGX01BWCk7CiAgICAgICAgdGVtcDIgPSBzdWIoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sdGVtcDEpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBpZiAodGVtcDIgPCAwKQogICAgICAgIHsKICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSB0ZW1wMTsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIFRoZSBNTFQgaXMgY3VycmVudGx5IHNjYWxlZCB0b28gbG93IGJ5IHRoZSBmYWN0b3IKICAgICAgIEVOQ09ERVJfU0NBTEVfRkFDVE9SKD0xODMxOCkvMzI3NjggKiAoMS4vc3FydCgxNjApLgogICAgICAgVGhpcyBpcyB0aGUgbmludGggcG93ZXIgb2YgMSBvdmVyIHRoZSBzcXVhcmUgcm9vdCBvZiAyLgogICAgICAgU28gbGF0ZXIgd2Ugd2lsbCBhZGQgRVNGX0FESlVTVE1FTlRfVE9fUk1TX0lOREVYIChub3cgOSkKICAgICAgIHRvIGRycF9jb2RlX2JpdHNbMF0uICovCgogICAgLyogZHJwX2NvZGVfYml0c1swXSBjYW4gcmFuZ2UgZnJvbSAxIHRvIDMxLiAwIHdpbGwgYmUgdXNlZCBvbmx5IGFzIGFuIGVzY2FwZSBzZXF1ZW5jZS4gKi8KICAgIHRlbXAxID0gc3ViKDEsRVNGX0FESlVTVE1FTlRfVE9fUk1TX0lOREVYKTsKICAgIHRlbXAyID0gc3ViKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFswXSx0ZW1wMSk7CiAgICB0ZXN0KCk7CiAgICBpZiAodGVtcDIgPCAwKQogICAgewogICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFswXSA9IHRlbXAxOwogICAgICAgIG1vdmUxNigpOwogICAgfQogICAgCiAgICB0ZW1wMSA9IHN1YigzMSxFU0ZfQURKVVNUTUVOVF9UT19STVNfSU5ERVgpOwoKCS8qCgkgKiBUaGUgbmV4dCBsaW5lIHdhcyBjb3JyZWN0ZWQgaW4gUmVsZWFzZSAxLjIgCgkgKi8KCiAgICB0ZW1wMiA9IHN1YihhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbMF0sIHRlbXAxKTsgIAogICAgdGVzdCgpOwogICAgaWYgKHRlbXAyID4gMCkKICAgIHsKICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbMF0gPSB0ZW1wMTsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KCiAgICBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2luZGV4WzBdID0gYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4WzBdOwogICAgbW92ZTE2KCk7CiAgICAKICAgIG51bWJlcl9vZl9iaXRzID0gNTsKICAgIG1vdmUxNigpOwogICAgCiAgICBkcnBfbnVtX2JpdHNbMF0gPSA1OwogICAgbW92ZTE2KCk7CiAgICAKICAgIGRycF9jb2RlX2JpdHNbMF0gPSAoVVdvcmQxNilhZGQoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4WzBdLEVTRl9BREpVU1RNRU5UX1RPX1JNU19JTkRFWCk7CiAgICBtb3ZlMTYoKTsKCiAgICAvKiBMb3dlciBsaW1pdCB0aGUgYWJzb2x1dGUgcmVnaW9uIHBvd2VyIGluZGljZXMgdG8gLTggYW5kIHVwcGVyIGxpbWl0IHRoZW0gdG8gMzEuIFN1Y2ggZXh0cmVtZXMKICAgICBtYXkgYmUgbWF0aGVtYXRpY2FsbHkgaW1wb3NzaWJsZSBhbnl3YXkuKi8KICAgIGZvciAocmVnaW9uPTE7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCiAgICB7CiAgICAgICAgdGVtcDEgPSBzdWIoLTgsRVNGX0FESlVTVE1FTlRfVE9fUk1TX0lOREVYKTsKICAgICAgICB0ZW1wMiA9IHN1YihhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSx0ZW1wMSk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmICh0ZW1wMiA8IDApCiAgICAgICAgewogICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA9IHRlbXAxOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CgogICAgICAgIHRlbXAxID0gc3ViKDMxLEVTRl9BREpVU1RNRU5UX1RPX1JNU19JTkRFWCk7CiAgICAgICAgdGVtcDIgPSBzdWIoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sdGVtcDEpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBpZiAodGVtcDIgPiAwKQogICAgICAgIHsKICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSB0ZW1wMTsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAocmVnaW9uPTE7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCiAgICB7CiAgICAgICAgaiA9IHN1YihhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSxhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uLTFdKTsKICAgICAgICB0ZW1wID0gc3ViKGosRFJQX0RJRkZfTUlOKTsKICAgICAgICB0ZXN0KCk7CiAgICAgICAgaWYgKHRlbXAgPCAwKQogICAgICAgIHsKICAgICAgICAgICAgaiA9IERSUF9ESUZGX01JTjsKICAgICAgICB9CiAgICAgICAgaiA9IHN1YihqLERSUF9ESUZGX01JTik7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgZGlmZmVyZW50aWFsX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dID0gajsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAKICAgICAgICB0ZW1wID0gYWRkKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb24tMV0sZGlmZmVyZW50aWFsX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dKTsKICAgICAgICB0ZW1wID0gYWRkKHRlbXAsRFJQX0RJRkZfTUlOKTsKICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA9IHRlbXA7CiAgICAgICAgbW92ZTE2KCk7CgogICAgICAgIG51bWJlcl9vZl9iaXRzID0gYWRkKG51bWJlcl9vZl9iaXRzLGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfYml0c1tyZWdpb25dW2pdKTsKICAgICAgICBkcnBfbnVtX2JpdHNbcmVnaW9uXSA9IGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfYml0c1tyZWdpb25dW2pdOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIGRycF9jb2RlX2JpdHNbcmVnaW9uXSA9IGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfY29kZXNbcmVnaW9uXVtqXTsKICAgICAgICBtb3ZlMTYoKTsKICAgIH0KCiAgICByZXR1cm4gKG51bWJlcl9vZl9iaXRzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb246ICAgIHZlY3Rvcl9xdWFudGl6ZV9tbHRzCgogU3ludGF4OiAgICAgIHZvaWQgdmVjdG9yX3F1YW50aXplX21sdHMobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMsICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWx0X2NvZWZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LCAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJfY2F0ZWdvcmllcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfYmFsYW5jZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jYXRlZ29yaXphdGlvbl9jb250cm9sLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50cywgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9yZWdpb25zOwogICAgICAgICAgICAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzOwogICAgICAgICAgICAgIFdvcmQxNiBtbHRfY29lZnNbRENUX0xFTkdUSF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICBXb3JkMTYgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W01BWF9OVU1CRVJfT0ZfUkVHSU9OU107ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgV29yZDE2IHBvd2VyX2NhdGVnb3JpZXNbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIFdvcmQxNiBjYXRlZ29yeV9iYWxhbmNlc1tNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFUy0xXTsgICAgICAgICAKICAgICAgICAgICAgICBXb3JkMTYgKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgV29yZDE2IHJlZ2lvbl9tbHRfYml0X2NvdW50c1tNQVhfTlVNQkVSX09GX1JFR0lPTlNdOyAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIFdvcmQzMiByZWdpb25fbWx0X2JpdHNbNCpNQVhfTlVNQkVSX09GX1JFR0lPTlNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiBEZXNjcmlwdGlvbjogU2NhbGFyIHF1YW50aXplZCB2ZWN0b3IgSHVmZm1hbiBjb2RpbmcgKFNRVkgpCgogCiBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgIDAuNTcgICAgICB8ICAgICAwLjY1CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAogICAgICAgICAgICBNQVggIHwgICAgMC43OCAgICAgIHwgICAgIDAuODMKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjYyICAgICAgfCAgICAgMC45MCAgICAgICB8ICAgICAxLjExCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgMS4xNiAgICAgIHwgICAgIDEuMzkgICAgICAgfCAgICAgMS41NAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgdmVjdG9yX3F1YW50aXplX21sdHMoV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptbHRfY29lZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwb3dlcl9jYXRlZ29yaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqY2F0ZWdvcnlfYmFsYW5jZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpyZWdpb25fbWx0X2JpdF9jb3VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQzMiAqcmVnaW9uX21sdF9iaXRzKQp7CgogICAgV29yZDE2ICpyYXdfbWx0X3B0cjsKICAgIFdvcmQxNiByZWdpb247CiAgICBXb3JkMTYgY2F0ZWdvcnk7CiAgICBXb3JkMTYgdG90YWxfbWx0X2JpdHMgPSAwOwoKICAgIFdvcmQxNiB0ZW1wOwogICAgV29yZDE2IHRlbXAxOwogICAgV29yZDE2IHRlbXAyOwoKICAgIC8qIFN0YXJ0IGluIHRoZSBtaWRkbGUgb2YgdGhlIGNhdGVnb3JpemF0aW9uIGNvbnRyb2wgcmFuZ2UuICovCiAgICB0ZW1wID0gc2hyX25vY2hlY2sobnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywxKTsKICAgIHRlbXAgPSBzdWIodGVtcCwxKTsKICAgIGZvciAoKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCA9IDA7ICpwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2wgPCB0ZW1wOyAoKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCkrKykKICAgIHsKICAgICAgICByZWdpb24gPSBjYXRlZ29yeV9iYWxhbmNlc1sqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sXTsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl0gPSBhZGQocG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dLDEpOwogICAgICAgIG1vdmUxNigpOwogICAgfQoKICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCiAgICB7CiAgICAgICAgY2F0ZWdvcnkgPSBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl07CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgdGVtcCA9IGV4dHJhY3RfbChMX211bHQwKHJlZ2lvbixSRUdJT05fU0laRSkpOwogICAgICAgIHJhd19tbHRfcHRyID0gJm1sdF9jb2Vmc1t0ZW1wXTsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB0ZW1wID0gc3ViKGNhdGVnb3J5LChOVU1fQ0FURUdPUklFUy0xKSk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmICh0ZW1wIDwgMCkKICAgICAgICB7CiAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dID0KICAgICAgICAgICAgdmVjdG9yX2h1ZmZtYW4oY2F0ZWdvcnksIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLHJhd19tbHRfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uX21sdF9iaXRzW3NobF9ub2NoZWNrKHJlZ2lvbiwyKV0pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSA9IDA7CiAgICAgICAgICAgIG1vdmUxNigpOwogICAgICAgIH0KICAgICAgICB0b3RhbF9tbHRfYml0cyA9IGFkZCh0b3RhbF9tbHRfYml0cyxyZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSk7CiAgICB9CgoKICAgIC8qIElmIHRvbyBmZXcgYml0cy4uLiAqLwogICAgdGVtcCA9IHN1Yih0b3RhbF9tbHRfYml0cyxudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMpOwogICAgdGVzdCgpOwogICAgdGVzdCgpOwogICAgbG9naWMxNigpOwogICAgd2hpbGUgKCh0ZW1wIDwgMCkgJiYgKCpwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2wgPiAwKSkKICAgIHsKICAgICAgICB0ZXN0KCk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGxvZ2ljMTYoKTsKICAgICAgICAoKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCktLTsKICAgICAgICByZWdpb24gPSBjYXRlZ29yeV9iYWxhbmNlc1sqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sXTsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAKICAgICAgICBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl0gPSBzdWIocG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dLDEpOwogICAgICAgIG1vdmUxNigpOwoKICAgICAgICB0b3RhbF9tbHRfYml0cyA9IHN1Yih0b3RhbF9tbHRfYml0cyxyZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSk7CiAgICAgICAgY2F0ZWdvcnkgPSBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl07CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCiAgICAgICAgcmF3X21sdF9wdHIgPSAmbWx0X2NvZWZzW3JlZ2lvbipSRUdJT05fU0laRV07CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCiAgICAgICAgdGVtcCA9IHN1YihjYXRlZ29yeSwoTlVNX0NBVEVHT1JJRVMtMSkpOwogICAgICAgIHRlc3QoKTsKICAgICAgICBpZiAodGVtcCA8IDApCiAgICAgICAgewogICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSA9CiAgICAgICAgICAgICAgICB2ZWN0b3JfaHVmZm1hbihjYXRlZ29yeSwgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0scmF3X21sdF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25fbWx0X2JpdHNbc2hsX25vY2hlY2socmVnaW9uLDIpXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dID0gMDsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgfQogICAgICAgIHRvdGFsX21sdF9iaXRzID0gYWRkKHRvdGFsX21sdF9iaXRzLHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dKTsKICAgICAgICB0ZW1wID0gc3ViKHRvdGFsX21sdF9iaXRzLG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyk7CiAgICB9CgogICAgLyogSWYgdG9vIG1hbnkgYml0cy4uLiAqLwogICAgLyogU2V0IHVwIGZvciB3aGlsZSBsb29wIHRlc3QgKi8KICAgIHRlbXAxID0gc3ViKHRvdGFsX21sdF9iaXRzLG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyk7CiAgICB0ZW1wMiA9IHN1YigqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sLHN1YihudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLDEpKTsKICAgIHRlc3QoKTsKICAgIHRlc3QoKTsKICAgIGxvZ2ljMTYoKTsKICAgIAogICAgd2hpbGUgKCh0ZW1wMSA+IDApICYmICh0ZW1wMiA8IDApKQogICAgewogICAgICAgIC8qIG9wZXJhdGlvbnMgZm9yIHdoaWxlIGNvbnRpdGlvbnMgKi8KICAgICAgICB0ZXN0KCk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGxvZ2ljMTYoKTsKICAgICAgICAKICAgICAgICByZWdpb24gPSBjYXRlZ29yeV9iYWxhbmNlc1sqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sXTsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAKICAgICAgICBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl0gPSBhZGQocG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dLDEpOwogICAgICAgIG1vdmUxNigpOwoKICAgICAgICB0b3RhbF9tbHRfYml0cyA9IHN1Yih0b3RhbF9tbHRfYml0cyxyZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSk7CiAgICAgICAgY2F0ZWdvcnkgPSBwb3dlcl9jYXRlZ29yaWVzW3JlZ2lvbl07CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCiAgICAgICAgdGVtcCA9IGV4dHJhY3RfbChMX211bHQwKHJlZ2lvbixSRUdJT05fU0laRSkpOwogICAgICAgIHJhd19tbHRfcHRyID0gJm1sdF9jb2Vmc1t0ZW1wXTsKICAgICAgICBtb3ZlMTYoKTsKICAgICAgICAKICAgICAgICB0ZW1wID0gc3ViKGNhdGVnb3J5LChOVU1fQ0FURUdPUklFUy0xKSk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmICh0ZW1wIDwgMCkKICAgICAgICB7CiAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dID0KICAgICAgICAgICAgICAgIHZlY3Rvcl9odWZmbWFuKGNhdGVnb3J5LCBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSxyYXdfbWx0X3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbl9tbHRfYml0c1tzaGxfbm9jaGVjayhyZWdpb24sMildKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcmVnaW9uX21sdF9iaXRfY291bnRzW3JlZ2lvbl0gPSAwOwogICAgICAgICAgICBtb3ZlMTYoKTsKICAgICAgICB9CiAgICAgICAgdG90YWxfbWx0X2JpdHMgPSBhZGQodG90YWxfbWx0X2JpdHMscmVnaW9uX21sdF9iaXRfY291bnRzW3JlZ2lvbl0pOwogICAgICAgICgqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sKSsrOwogICAgICAgIAogICAgICAgIHRlbXAxID0gc3ViKHRvdGFsX21sdF9iaXRzLG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyk7CiAgICAgICAgdGVtcDIgPSBzdWIoKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCxzdWIobnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywxKSk7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiAgICB2ZWN0b3JfaHVmZm1hbgoKIFN5bnRheDogICAgICBXb3JkMTYgdmVjdG9yX2h1ZmZtYW4oV29yZDE2ICBjYXRlZ29yeSwgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHBvd2VyX2luZGV4LCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKnJhd19tbHRfcHRyLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMzIgKndvcmRfcHRyKSAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICBpbnB1dHM6ICAgICBXb3JkMTYgIGNhdGVnb3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBwb3dlcl9pbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKnJhd19tbHRfcHRyCiAgICAgICAgICAgICAKICAgICAgICAgICAgICBvdXRwdXRzOiAgICBudW1iZXJfb2ZfcmVnaW9uX2JpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAqd29yZF9wdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiBEZXNjcmlwdGlvbjogSHVmZm1hbiBlbmNvZGluZyBmb3IgZWFjaCByZWdpb24gYmFzZWQgb24gY2F0ZWdvcnkgYW5kIHBvd2VyX2luZGV4ICAKCiBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0CiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQVZHICB8ICAgIDAuMDMgICAgICB8ICAgICAwLjAzCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAogICAgICAgICAgICBNQVggIHwgICAgMC4wNCAgICAgIHwgICAgIDAuMDQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAKCiAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEFWRyAgfCAgICAwLjAzICAgICAgfCAgICAgMC4wMyAgICAgICB8ICAgICAwLjAzCiAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBNQVggIHwgICAgMC4wNCAgICAgIHwgICAgIDAuMDQgICAgICAgfCAgICAgMC4wNAogICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KV29yZDE2IHZlY3Rvcl9odWZmbWFuKFdvcmQxNiBjYXRlZ29yeSwKICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBwb3dlcl9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcmF3X21sdF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICBVV29yZDMyICp3b3JkX3B0cikKewogCgogICAgV29yZDE2ICBpbnZfb2Zfc3RlcF9zaXplX3RpbWVzX3N0ZF9kZXY7CiAgICBXb3JkMTYgIGosbjsKICAgIFdvcmQxNiAgazsKICAgIFdvcmQxNiAgbnVtYmVyX29mX3JlZ2lvbl9iaXRzOwogICAgV29yZDE2ICBudW1iZXJfb2Zfbm9uX3plcm87CiAgICBXb3JkMTYgIHZlY19kaW07CiAgICBXb3JkMTYgIG51bV92ZWNzOwogICAgV29yZDE2ICBrbWF4LCBrbWF4X3BsdXNfb25lOwogICAgV29yZDE2ICBpbmRleCxzaWduc19pbmRleDsKICAgIFdvcmQxNiAgKmJpdGNvdW50X3RhYmxlX3B0cjsKICAgIFVXb3JkMTYgKmNvZGVfdGFibGVfcHRyOwogICAgV29yZDMyICBjb2RlX2JpdHM7CiAgICBXb3JkMTYgIG51bWJlcl9vZl9jb2RlX2JpdHM7CiAgICBVV29yZDMyIGN1cnJlbnRfd29yZDsKICAgIFdvcmQxNiAgY3VycmVudF93b3JkX2JpdHNfZnJlZTsKICAgIAogICAgV29yZDMyIGFjY2E7CiAgICBXb3JkMzIgYWNjYjsKICAgIFdvcmQxNiB0ZW1wOwoKICAgIFdvcmQxNiBteXRlbXA7CQkJIC8qIG5ldyB2YXJpYWJsZSBpbiBSZWxlYXNlIDEuMiAqLwogICAgV29yZDE2IG15YWNjYTsJCQkgLyogbmV3IHZhcmlhYmxlIGluIFJlbGVhc2UgMS4yICovCgoKICAgIC8qIGluaXRpYWxpemUgdmFyaWFibGVzICovCiAgICB2ZWNfZGltID0gdmVjdG9yX2RpbWVuc2lvbltjYXRlZ29yeV07CiAgICBtb3ZlMTYoKTsKCiAgICBudW1fdmVjcyA9IG51bWJlcl9vZl92ZWN0b3JzW2NhdGVnb3J5XTsKICAgIG1vdmUxNigpOwoKICAgIGttYXggPSBtYXhfYmluW2NhdGVnb3J5XTsKICAgIG1vdmUxNigpOwoKICAgIGttYXhfcGx1c19vbmUgPSBhZGQoa21heCwxKTsKICAgIG1vdmUxNigpOwoKICAgIGN1cnJlbnRfd29yZCA9IDBMOwogICAgbW92ZTE2KCk7CgogICAgY3VycmVudF93b3JkX2JpdHNfZnJlZSA9IDMyOwogICAgbW92ZTE2KCk7CgogICAgbnVtYmVyX29mX3JlZ2lvbl9iaXRzID0gMDsKICAgIG1vdmUxNigpOwoKICAgIC8qIHNldCB1cCB0YWJsZSBwb2ludGVycyAqLwogICAgYml0Y291bnRfdGFibGVfcHRyID0gKFdvcmQxNiAqKXRhYmxlX29mX2JpdGNvdW50X3RhYmxlc1tjYXRlZ29yeV07CiAgICBjb2RlX3RhYmxlX3B0ciA9IChVV29yZDE2ICopIHRhYmxlX29mX2NvZGVfdGFibGVzW2NhdGVnb3J5XTsKCiAgICAvKiBjb21wdXRlIGludmVyc2Ugb2Ygc3RlcCBzaXplICogc3RhbmRhcmQgZGV2aWF0aW9uICovCiAgICBhY2NhID0gTF9tdWx0KHN0ZXBfc2l6ZV9pbnZlcnNlX3RhYmxlW2NhdGVnb3J5XSxzdGFuZGFyZF9kZXZpYXRpb25faW52ZXJzZV90YWJsZVtwb3dlcl9pbmRleF0pOwogICAgYWNjYSA9IExfc2hyX25vY2hlY2soYWNjYSwxKTsKICAgIGFjY2EgPSBMX2FkZChhY2NhLDQwOTYpOwogICAgYWNjYSA9IExfc2hyX25vY2hlY2soYWNjYSwxMyk7CgoJLyoKCSAqICBUaGUgbmV4dCB0d28gbGluZXMgYXJlIG5ldyB0byBSZWxlYXNlIDEuMiAKCSAqLwogICAgIAoJbXl0ZW1wID0gKFdvcmQxNikoYWNjYSAmIDB4Myk7CiAgICBhY2NhID0gTF9zaHJfbm9jaGVjayhhY2NhLDIpOwoKICAgIGludl9vZl9zdGVwX3NpemVfdGltZXNfc3RkX2RldiA9IGV4dHJhY3RfbChhY2NhKTsKCgogICAgZm9yIChuPTA7IG48bnVtX3ZlY3M7IG4rKykKICAgIHsKICAgICAgICBpbmRleCA9IDA7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCiAgICAgICAgc2lnbnNfaW5kZXggPSAwOwogICAgICAgIG1vdmUxNigpOwogICAgICAgIAogICAgICAgIG51bWJlcl9vZl9ub25femVybyA9IDA7CiAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgCiAgICAgICAgZm9yIChqPTA7IGo8dmVjX2RpbTsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgayA9IGFic19zKCpyYXdfbWx0X3B0cik7CiAgICAgICAgICAgIAogICAgICAgICAgICBhY2NhID0gTF9tdWx0KGssaW52X29mX3N0ZXBfc2l6ZV90aW1lc19zdGRfZGV2KTsKICAgICAgICAgICAgYWNjYSA9IExfc2hyX25vY2hlY2soYWNjYSwxKTsKCQkgICAgCgkJCS8qCgkJCSAqICBUaGUgbmV4dCBmb3VyIGxpbmVzIGFyZSBuZXcgdG8gUmVsZWFzZSAxLjIKCQkJICovCgoJCQlteWFjY2EgPSAoV29yZDE2KUxfbXVsdChrLG15dGVtcCk7CgkJCW15YWNjYSA9IChXb3JkMTYpTF9zaHJfbm9jaGVjayhteWFjY2EsMSk7CgkJCW15YWNjYSA9IChXb3JkMTYpTF9hZGQobXlhY2NhLGludF9kZWFkX3pvbmVfbG93X2JpdHNbY2F0ZWdvcnldKTsKCQkJbXlhY2NhID0gKFdvcmQxNilMX3Nocl9ub2NoZWNrKG15YWNjYSwyKTsKCiAgICAgICAgICAgIGFjY2EgPSBMX2FkZChhY2NhLGludF9kZWFkX3pvbmVbY2F0ZWdvcnldKTsKCgkJCS8qCgkJCSAqICBUaGUgbmV4dCB0d28gbGluZXMgYXJlIG5ldyB0byBSZWxlYXNlIDEuMgoJCQkgKi8KCgkJCWFjY2EgPSBMX2FkZChhY2NhLG15YWNjYSk7CgkJCWFjY2EgPSBMX3Nocl9ub2NoZWNrKGFjY2EsMTMpOwoKICAgICAgICAgICAgayA9IGV4dHJhY3RfbChhY2NhKTsKCiAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgaWYgKGsgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbnVtYmVyX29mX25vbl96ZXJvID0gYWRkKG51bWJlcl9vZl9ub25femVybywxKTsKICAgICAgICAgICAgICAgIHNpZ25zX2luZGV4ID0gc2hsX25vY2hlY2soc2lnbnNfaW5kZXgsMSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRlc3QoKTsKICAgICAgICAgICAgICAgIGlmICgqcmF3X21sdF9wdHIgPiAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNpZ25zX2luZGV4ID0gYWRkKHNpZ25zX2luZGV4LDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKGssa21heCk7CiAgICAgICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgICAgICBpZiAodGVtcCA+IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgayA9IGttYXg7CiAgICAgICAgICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWNjYSA9IExfc2hyX25vY2hlY2soTF9tdWx0KGluZGV4LChrbWF4X3BsdXNfb25lKSksMSk7CiAgICAgICAgICAgIGluZGV4ID0gZXh0cmFjdF9sKGFjY2EpOwogICAgICAgICAgICBpbmRleCA9IGFkZChpbmRleCxrKTsKICAgICAgICAgICAgcmF3X21sdF9wdHIrKzsKICAgICAgICB9CgogICAgICAgIGNvZGVfYml0cyA9ICooY29kZV90YWJsZV9wdHIraW5kZXgpOwogICAgICAgIG51bWJlcl9vZl9jb2RlX2JpdHMgPSBhZGQoKCooYml0Y291bnRfdGFibGVfcHRyK2luZGV4KSksbnVtYmVyX29mX25vbl96ZXJvKTsKICAgICAgICBudW1iZXJfb2ZfcmVnaW9uX2JpdHMgPSBhZGQobnVtYmVyX29mX3JlZ2lvbl9iaXRzLG51bWJlcl9vZl9jb2RlX2JpdHMpOwoKICAgICAgICBhY2NhID0gY29kZV9iaXRzIDw8IG51bWJlcl9vZl9ub25femVybzsKICAgICAgICBhY2NiID0gTF9kZXBvc2l0X2woc2lnbnNfaW5kZXgpOwogICAgICAgIGFjY2EgPSBMX2FkZChhY2NhLGFjY2IpOwogICAgICAgIGNvZGVfYml0cyA9IGFjY2E7CiAgICAgICAgbW92ZTMyKCk7CgogICAgICAgIC8qIG1zYiBvZiBjb2RlYml0cyBpcyB0cmFuc21pdHRlZCBmaXJzdC4gKi8KICAgICAgICBqID0gc3ViKGN1cnJlbnRfd29yZF9iaXRzX2ZyZWUsbnVtYmVyX29mX2NvZGVfYml0cyk7CiAgICAgICAgdGVzdCgpOwogICAgICAgIGlmIChqID49IDApCiAgICAgICAgewogICAgICAgICAgICB0ZXN0KCk7CiAgICAgICAgICAgIGFjY2EgPSBjb2RlX2JpdHMgPDwgajsKICAgICAgICAgICAgY3VycmVudF93b3JkID0gTF9hZGQoY3VycmVudF93b3JkLGFjY2EpOwogICAgICAgICAgICBjdXJyZW50X3dvcmRfYml0c19mcmVlID0gajsKICAgICAgICAgICAgbW92ZTE2KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGogPSBuZWdhdGUoaik7CiAgICAgICAgICAgIGFjY2EgPSBMX3Nocl9ub2NoZWNrKGNvZGVfYml0cyxqKTsKICAgICAgICAgICAgY3VycmVudF93b3JkID0gTF9hZGQoY3VycmVudF93b3JkLGFjY2EpOwogICAgICAgICAgICAKICAgICAgICAgICAgKndvcmRfcHRyKysgPSBjdXJyZW50X3dvcmQ7CiAgICAgICAgICAgIG1vdmUxNigpOwoKICAgICAgICAgICAgY3VycmVudF93b3JkX2JpdHNfZnJlZSA9IHN1YigzMixqKTsKICAgICAgICAgICAgdGVzdCgpOwogICAgICAgICAgICBjdXJyZW50X3dvcmQgPSBjb2RlX2JpdHMgPDwgY3VycmVudF93b3JkX2JpdHNfZnJlZTsKICAgICAgICB9CiAgICB9CgogICAgKndvcmRfcHRyKysgPSBjdXJyZW50X3dvcmQ7CiAgICBtb3ZlMTYoKTsKCiAgICByZXR1cm4gKG51bWJlcl9vZl9yZWdpb25fYml0cyk7Cn0KCgo=