ZGlmZiAtLWdpdCBhL2puaS9wanByb2plY3QtYW5kcm9pZC8uc3ZuL3ByaXN0aW5lLzA1LzA1NGM0OGZlZWVmNzdlZmE2NDBjZjc2M2U4ZThhZjE2MDY5MjJkOGMuc3ZuLWJhc2UgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS8wNS8wNTRjNDhmZWVlZjc3ZWZhNjQwY2Y3NjNlOGU4YWYxNjA2OTIyZDhjLnN2bi1iYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkODc4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9qbmkvcGpwcm9qZWN0LWFuZHJvaWQvLnN2bi9wcmlzdGluZS8wNS8wNTRjNDhmZWVlZjc3ZWZhNjQwY2Y3NjNlOGU4YWYxNjA2OTIyZDhjLnN2bi1iYXNlCkBAIC0wLDAgKzEsMTEyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICAgSVRVLVQgRy43MjIuMSAoMjAwNS0wNSkgLSBGaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBmb3IgbWFpbiBib2R5IGFuZCBBbm5leCBDCisqKiAgID4gU29mdHdhcmUgUmVsZWFzZSAyLjEgKDIwMDgtMDYpCisqKiAgICAgKFNpbXBsZSByZXBhY2thZ2luZzsgbm8gY2hhbmdlIGZyb20gMjAwNS0wNSBSZWxlYXNlIDIuMCBjb2RlKQorKioKKyoqICAgqSAyMDA0IFBvbHljb20sIEluYy4KKyoqCisqKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIEZpbGVuYW1lOiAgICBlbmNvZGVyLmMgICAgCisKKyAgUHVycG9zZTogICAgIENvbnRhaW5zIGZpbGVzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBHLjcyMi4xIEFubmV4IEMgZW5jb2RlcgorCisgIERlc2lnbiBOb3RlczoKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAiaHVmZl9kZWYuaCIKKyNpbmNsdWRlICJ0YWJsZXMuaCIKKyNpbmNsdWRlICJjb3VudC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIGVuY29kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIFN5bnRheDogICAgICB2b2lkIGVuY29kZXIoV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtbHRfY29lZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1hZ19zaGlmdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgb3V0X3dvcmRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlucHV0czogICBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBtYWdfc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG1sdF9jb2Vmc1tEQ1RfTEVOR1RIXQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIG91dHB1dHM6ICBvdXRfd29yZHNbTUFYX0JJVFNfUEVSX0ZSQU1FLzE2XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIERlc2NyaXB0aW9uOiBFbmNvZGVzIHRoZSBtbHQgY29lZnMgaW50byBvdXRfd29yZHMgdXNpbmcgRy43MjIuMSBBbm5leCBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjkzICAgICAgfCAgICAgMS4wNAorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCisgICAgICAgICAgICBNQVggIHwgICAgMS4yMCAgICAgIHwgICAgIDEuMjgKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDEuMzkgICAgICB8ICAgICAxLjcxICAgICAgIHwgICAgIDIuMDEKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTUFYICB8ICAgIDIuMDAgICAgICB8ICAgICAyLjMwICAgICAgIHwgICAgIDIuNTIKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGVuY29kZXIoV29yZDE2ICBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsCisgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICBXb3JkMTYgICptbHRfY29lZnMsCisgICAgICAgICAgICAgV29yZDE2ICBtYWdfc2hpZnQsCisgICAgICAgICAgICAgV29yZDE2ICAqb3V0X3dvcmRzKQoreworCisgICAgV29yZDE2ICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzOworICAgIFdvcmQxNiAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllczsKKyAgICBXb3JkMTYgIG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZTsKKyAgICBXb3JkMTYgIG51bWJlcl9vZl9lbnZlbG9wZV9iaXRzOworICAgIFdvcmQxNiAgY2F0ZWdvcml6YXRpb25fY29udHJvbDsKKyAgICBXb3JkMTYgIHJlZ2lvbjsKKyAgICBXb3JkMTYgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtNQVhfTlVNQkVSX09GX1JFR0lPTlNdOworICAgIFdvcmQxNiAgcG93ZXJfY2F0ZWdvcmllc1tNQVhfTlVNQkVSX09GX1JFR0lPTlNdOworICAgIFdvcmQxNiAgY2F0ZWdvcnlfYmFsYW5jZXNbTUFYX05VTV9DQVRFR09SSVpBVElPTl9DT05UUk9MX1BPU1NJQklMSVRJRVMtMV07CisgICAgV29yZDE2ICBkcnBfbnVtX2JpdHNbTUFYX05VTUJFUl9PRl9SRUdJT05TKzFdOworICAgIFVXb3JkMTYgZHJwX2NvZGVfYml0c1tNQVhfTlVNQkVSX09GX1JFR0lPTlMrMV07CisgICAgV29yZDE2ICByZWdpb25fbWx0X2JpdF9jb3VudHNbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsKKyAgICBVV29yZDMyIHJlZ2lvbl9tbHRfYml0c1s0Kk1BWF9OVU1CRVJfT0ZfUkVHSU9OU107CisgICAgV29yZDE2ICBtYWdfc2hpZnRfb2Zmc2V0OworCisgICAgV29yZDE2IHRlbXA7CisKKyAgICAvKiBpbml0aWFsaXplIHZhcmlhYmxlcyAqLworICAgIHRlc3QoKTsKKyAgICBpZiAobnVtYmVyX29mX3JlZ2lvbnMgPT0gTlVNQkVSX09GX1JFR0lPTlMpCisgICAgeworICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzID0gTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfQklUUzsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMgPSBOVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9QT1NTSUJJTElUSUVTOworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9IAorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHMgPSBNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfQklUUzsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMgPSBNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFUzsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorCisgICAgbnVtYmVyX29mX2JpdHNfcGVyX2ZyYW1lID0gbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzOworICAgIG1vdmUxNigpOworCisgICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKKyAgICB7CisgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dID0gMDsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorICAgIAorICAgIC8qIEVzdGltYXRlIHBvd2VyIGVudmVsb3BlLiAqLworICAgIG51bWJlcl9vZl9lbnZlbG9wZV9iaXRzID0gY29tcHV0ZV9yZWdpb25fcG93ZXJzKG1sdF9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJwX251bV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRycF9jb2RlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zKTsKKworICAgIC8qIEFkanVzdCBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdHMgYmFzZWQgb24gcG93ZXIgZW52ZWxvcGUgZXN0aW1hdGUgKi8KKyAgICB0ZW1wID0gc3ViKG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyxudW1iZXJfb2ZfZW52ZWxvcGVfYml0cyk7CisgICAgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzID0gc3ViKHRlbXAsbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0cyk7CisKKyAgICAvKiBnZXQgY2F0ZWdvcml6YXRpb25zICovCisgICAgY2F0ZWdvcml6ZShudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsCisgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsCisgICAgICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsCisgICAgICAgICAgICAgICBwb3dlcl9jYXRlZ29yaWVzLAorICAgICAgICAgICAgICAgY2F0ZWdvcnlfYmFsYW5jZXMpOworCisgICAgLyogQWRqdXN0IGFic29sdXRlX3JlZ2lvbl9jYXRlZ29yeV9pbmRleFtdIGZvciBtYWdfc2hpZnQuCisgICAgICAgVGhpcyBhc3N1bWVzIHRoYXQgUkVHSU9OX1BPV0VSX1NURVBTSVpFX0RCIGlzIGRlZmluZWQKKyAgICAgICB0byBiZSBleGFjdGx5IDMuMDEwMjk5OTU3IG9yIDIwLjAgdGltZXMgbG9nIGJhc2UgMTAKKyAgICAgICBvZiBzcXVhcmUgcm9vdCBvZiAyLiAqLworICAgIHRlbXAgPSBzaGxfbm9jaGVjayhtYWdfc2hpZnQsMSk7CisgICAgbWFnX3NoaWZ0X29mZnNldCA9IGFkZCh0ZW1wLFJFR0lPTl9QT1dFUl9UQUJMRV9OVU1fTkVHQVRJVkVTKTsKKyAgICAKKyAgICBmb3IgKHJlZ2lvbj0wOyByZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKQorICAgIHsKKyAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSBhZGQoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sbWFnX3NoaWZ0X29mZnNldCk7CisgICAgICAgIG1vdmUxNigpOworICAgIH0KKworICAgIC8qIGFkanVzdCB0aGUgYWJzb2x1dGUgcG93ZXIgcmVnaW9uIGluZGV4IGJhc2VkIG9uIHRoZSBtbHQgY29lZnMgKi8KKyAgICBhZGp1c3RfYWJzX3JlZ2lvbl9wb3dlcl9pbmRleChhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsbWx0X2NvZWZzLG51bWJlcl9vZl9yZWdpb25zKTsKKworCisgICAgLyogcXVhbnRpemUgYW5kIGNvZGUgdGhlIG1sdCBjb2VmZmljaWVudHMgYmFzZWQgb24gY2F0ZWdvcml6YXRpb25zICovCisgICAgdmVjdG9yX3F1YW50aXplX21sdHMobnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWx0X2NvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlcl9jYXRlZ29yaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2JhbGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRlZ29yaXphdGlvbl9jb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fbWx0X2JpdHMpOworCisgICAgLyogc3R1ZmYgYml0cyBpbnRvIHdvcmRzICovCisgICAgYml0c190b193b3JkcyhyZWdpb25fbWx0X2JpdHMsCisgICAgICAgICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHMsCisgICAgICAgICAgICAgICAgICBkcnBfbnVtX2JpdHMsCisgICAgICAgICAgICAgICAgICBkcnBfY29kZV9iaXRzLAorICAgICAgICAgICAgICAgICAgb3V0X3dvcmRzLAorICAgICAgICAgICAgICAgICAgY2F0ZWdvcml6YXRpb25fY29udHJvbCwKKyAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9yZWdpb25zLAorICAgICAgICAgICAgICAgICAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0cywKKyAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uOiAgICBiaXRzX3RvX3dvcmRzCisKKyBTeW50YXg6ICAgICAgYml0c190b193b3JkcyhVV29yZDMyICpyZWdpb25fbWx0X2JpdHMsICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICpyZWdpb25fbWx0X2JpdF9jb3VudHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKmRycF9udW1fYml0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQxNiAqZHJwX2NvZGVfYml0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICpvdXRfd29yZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgY2F0ZWdvcml6YXRpb25fY29udHJvbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfYml0c19wZXJfZnJhbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyBEZXNjcmlwdGlvbjogU3R1ZmZzIHRoZSBiaXRzIGludG8gd29yZHMgZm9yIG91dHB1dAorCisgV01PUFM6ICAgICA3a0h6IHwgICAgMjRrYml0ICAgIHwgICAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjA5ICAgICAgfCAgICAgMC4xMgorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCisgICAgICAgICAgICBNQVggIHwgICAgMC4xMCAgICAgIHwgICAgIDAuMTMKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCisgICAgICAgICAgCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjEyICAgICAgfCAgICAgMC4xNSAgICAgICB8ICAgICAwLjE5CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjE0ICAgICAgfCAgICAgMC4xNyAgICAgICB8ICAgICAwLjIxCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiaXRzX3RvX3dvcmRzKFVXb3JkMzIgKnJlZ2lvbl9tbHRfYml0cywKKyAgICAgICAgICAgICAgICAgICBXb3JkMTYgICpyZWdpb25fbWx0X2JpdF9jb3VudHMsCisgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqZHJwX251bV9iaXRzLAorICAgICAgICAgICAgICAgICAgIFVXb3JkMTYgKmRycF9jb2RlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqb3V0X3dvcmRzLAorICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgY2F0ZWdvcml6YXRpb25fY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bWJlcl9vZl9yZWdpb25zLAorICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0cywKKyAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSkKK3sKKyAgICBXb3JkMTYgIG91dF93b3JkX2luZGV4ID0gMDsKKyAgICBXb3JkMTYgIGo7CisgICAgV29yZDE2ICByZWdpb247CisgICAgV29yZDE2ICBvdXRfd29yZDsKKyAgICBXb3JkMTYgIHJlZ2lvbl9iaXRfY291bnQ7CisgICAgV29yZDE2ICBjdXJyZW50X3dvcmRfYml0c19sZWZ0OworICAgIFVXb3JkMTYgc2xpY2U7CisgICAgV29yZDE2ICBvdXRfd29yZF9iaXRzX2ZyZWUgPSAxNjsKKyAgICBVV29yZDMyICppbl93b3JkX3B0cjsKKyAgICBVV29yZDMyIGN1cnJlbnRfd29yZDsKKyAgICAKKyAgICBXb3JkMzIgIGFjY2EgPSAwOworICAgIFdvcmQzMiAgYWNjYjsKKyAgICBXb3JkMTYgIHRlbXA7CisKKyAgICAvKiBGaXJzdCBzZXQgdXAgdGhlIGNhdGVnb3JpemF0aW9uIGNvbnRyb2wgYml0cyB0byBsb29rIGxpa2Ugb25lIG1vcmUgc2V0IG9mIHJlZ2lvbiBwb3dlciBiaXRzLiAqLworICAgIG91dF93b3JkID0gMDsKKyAgICBtb3ZlMTYoKTsKKworICAgIGRycF9udW1fYml0c1tudW1iZXJfb2ZfcmVnaW9uc10gPSBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9iaXRzOworICAgIG1vdmUxNigpOworICAgIAorICAgIGRycF9jb2RlX2JpdHNbbnVtYmVyX29mX3JlZ2lvbnNdID0gKFVXb3JkMTYpY2F0ZWdvcml6YXRpb25fY29udHJvbDsKKyAgICBtb3ZlMTYoKTsKKworICAgIC8qIFRoZXNlIGNvZGUgYml0cyBhcmUgcmlnaHQganVzdGlmaWVkLiAqLworICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbiA8PSBudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCisgICAgeworICAgICAgICBjdXJyZW50X3dvcmRfYml0c19sZWZ0ID0gZHJwX251bV9iaXRzW3JlZ2lvbl07CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgY3VycmVudF93b3JkID0gKFVXb3JkMzIpZHJwX2NvZGVfYml0c1tyZWdpb25dOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCisgICAgICAgIGogPSBzdWIoY3VycmVudF93b3JkX2JpdHNfbGVmdCxvdXRfd29yZF9iaXRzX2ZyZWUpOworCisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKGogPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9IGV4dHJhY3RfbChMX3Nocl9ub2NoZWNrKGN1cnJlbnRfd29yZCxqKSk7CisgICAgICAgICAgICBvdXRfd29yZCA9IGFkZChvdXRfd29yZCx0ZW1wKTsKKworICAgICAgICAgICAgb3V0X3dvcmRzW291dF93b3JkX2luZGV4KytdID0gb3V0X3dvcmQ7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3V0X3dvcmRfYml0c19mcmVlID0gMTY7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3V0X3dvcmRfYml0c19mcmVlID0gc3ViKG91dF93b3JkX2JpdHNfZnJlZSxqKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYWNjYSA9IChjdXJyZW50X3dvcmQgPDwgb3V0X3dvcmRfYml0c19mcmVlKTsKKyAgICAgICAgICAgIG91dF93b3JkID0gZXh0cmFjdF9sKGFjY2EpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaiA9IG5lZ2F0ZShqKTsKKworICAgICAgICAgICAgYWNjYSA9IChjdXJyZW50X3dvcmQgPDwgaik7CisgICAgICAgICAgICBhY2NiID0gTF9kZXBvc2l0X2wob3V0X3dvcmQpOworICAgICAgICAgICAgYWNjYSA9IExfYWRkKGFjY2IsYWNjYSk7CisgICAgICAgICAgICBvdXRfd29yZCA9IGV4dHJhY3RfbChhY2NhKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgb3V0X3dvcmRfYml0c19mcmVlID0gc3ViKG91dF93b3JkX2JpdHNfZnJlZSxjdXJyZW50X3dvcmRfYml0c19sZWZ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRoZXNlIGNvZGUgYml0cyBhcmUgbGVmdCBqdXN0aWZpZWQuICovCisgICAgCisgICAgZm9yIChyZWdpb249MDtyZWdpb248bnVtYmVyX29mX3JlZ2lvbnM7IHJlZ2lvbisrKQorICAgIHsKKyAgICAgICAgYWNjYiA9IExfZGVwb3NpdF9sKG91dF93b3JkX2luZGV4KTsKKyAgICAgICAgYWNjYiA9IExfc2hsX25vY2hlY2soYWNjYiw0KTsKKyAgICAgICAgYWNjYiA9IExfc3ViKGFjY2IsbnVtYmVyX29mX2JpdHNfcGVyX2ZyYW1lKTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZihhY2NiIDwgMCkgICAgICAgIAorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gc2hsX25vY2hlY2socmVnaW9uLDIpOworICAgICAgICAgICAgaW5fd29yZF9wdHIgPSAmcmVnaW9uX21sdF9iaXRzW3RlbXBdOworICAgICAgICAgICAgcmVnaW9uX2JpdF9jb3VudCA9IHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dOworICAgICAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgICAgIHRlbXAgPSBzdWIoMzIscmVnaW9uX2JpdF9jb3VudCk7CisgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICBpZih0ZW1wID4gMCkKKyAgICAgICAgICAgICAgICBjdXJyZW50X3dvcmRfYml0c19sZWZ0ID0gcmVnaW9uX2JpdF9jb3VudDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjdXJyZW50X3dvcmRfYml0c19sZWZ0ID0gMzI7CisKKyAgICAgICAgICAgIGN1cnJlbnRfd29yZCA9ICppbl93b3JkX3B0cisrOworICAgIAorICAgICAgICAgICAgYWNjYSA9IExfZGVwb3NpdF9sKG91dF93b3JkX2luZGV4KTsKKyAgICAgICAgICAgIGFjY2EgPSBMX3NobF9ub2NoZWNrKGFjY2EsNCk7CisgICAgICAgICAgICBhY2NhID0gTF9zdWIoYWNjYSxudW1iZXJfb2ZfYml0c19wZXJfZnJhbWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBmcm9tIHdoaWxlIGxvb3AgKi8KKyAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIGxvZ2ljMTYoKTsgCisgICAgICAgICAgICB3aGlsZSAoKHJlZ2lvbl9iaXRfY291bnQgPiAwKSAmJiAoYWNjYSA8IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGZyb20gd2hpbGUgbG9vcCAqLworICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICAgICAgbG9naWMxNigpOyAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKGN1cnJlbnRfd29yZF9iaXRzX2xlZnQsb3V0X3dvcmRfYml0c19mcmVlKTsKKyAgICAgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAgPj0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzdWIoMzIsb3V0X3dvcmRfYml0c19mcmVlKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjYiA9IExVX3NocihjdXJyZW50X3dvcmQsdGVtcCk7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlID0gKFVXb3JkMTYpZXh0cmFjdF9sKGFjY2IpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb3V0X3dvcmQgPSBhZGQob3V0X3dvcmQsc2xpY2UpOworICAgIAorICAgICAgICAgICAgICAgICAgICB0ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfd29yZCA8PD0gb3V0X3dvcmRfYml0c19mcmVlOworCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfd29yZF9iaXRzX2xlZnQgPSBzdWIoY3VycmVudF93b3JkX2JpdHNfbGVmdCxvdXRfd29yZF9iaXRzX2ZyZWUpOworICAgICAgICAgICAgICAgICAgICBvdXRfd29yZHNbb3V0X3dvcmRfaW5kZXgrK10gPSBleHRyYWN0X2wob3V0X3dvcmQpOworICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKworICAgICAgICAgICAgICAgICAgICBvdXRfd29yZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1vdmUxNigpOworCisgICAgICAgICAgICAgICAgICAgIG91dF93b3JkX2JpdHNfZnJlZSA9IDE2OworICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHN1YigzMixjdXJyZW50X3dvcmRfYml0c19sZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgYWNjYiA9IExVX3NocihjdXJyZW50X3dvcmQsdGVtcCk7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlID0gKFVXb3JkMTYpZXh0cmFjdF9sKGFjY2IpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHN1YihvdXRfd29yZF9iaXRzX2ZyZWUsY3VycmVudF93b3JkX2JpdHNfbGVmdCk7CisgICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjYiA9IHNsaWNlIDw8IHRlbXA7CisgICAgICAgICAgICAgICAgICAgIGFjY2EgPSBMX2RlcG9zaXRfbChvdXRfd29yZCk7CisgICAgICAgICAgICAgICAgICAgIGFjY2EgPSBMX2FkZChhY2NhLGFjY2IpOworICAgICAgICAgICAgICAgICAgICBvdXRfd29yZCA9IGV4dHJhY3RfbChhY2NhKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0X3dvcmRfYml0c19mcmVlID0gc3ViKG91dF93b3JkX2JpdHNfZnJlZSxjdXJyZW50X3dvcmRfYml0c19sZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfd29yZF9iaXRzX2xlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3dvcmRfYml0c19sZWZ0ID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3dvcmQgPSAqaW5fd29yZF9wdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVnaW9uX2JpdF9jb3VudCA9IHN1YihyZWdpb25fYml0X2NvdW50LDMyKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnRfd29yZF9iaXRzX2xlZnQgPSBNSU4oMzIscmVnaW9uX2JpdF9jb3VudCk7ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBzdWIoMzIscmVnaW9uX2JpdF9jb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYodGVtcCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3dvcmRfYml0c19sZWZ0ID0gcmVnaW9uX2JpdF9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF93b3JkX2JpdHNfbGVmdCA9IDMyOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWNjYSA9IExfZGVwb3NpdF9sKG91dF93b3JkX2luZGV4KTsKKyAgICAgICAgICAgICAgICBhY2NhID0gTF9zaGxfbm9jaGVjayhhY2NhLDQpOworICAgICAgICAgICAgICAgIGFjY2EgPSBMX3N1YihhY2NhLG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhY2NiID0gTF9kZXBvc2l0X2wob3V0X3dvcmRfaW5kZXgpOworICAgICAgICAgICAgYWNjYiA9IExfc2hsX25vY2hlY2soYWNjYiw0KTsKKyAgICAgICAgICAgIGFjY2IgPSBMX3N1YihhY2NiLG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGaWxsIG91dCB3aXRoIDEncy4gKi8KKworICAgIHRlc3QoKTsKKyAgICB3aGlsZSAoYWNjYSA8IDApCisgICAgeworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGN1cnJlbnRfd29yZCA9IDB4MDAwMGZmZmY7CisgICAgICAgIG1vdmUzMigpOworCisgICAgICAgIHRlbXAgPSBzdWIoMTYsb3V0X3dvcmRfYml0c19mcmVlKTsKKyAgICAgICAgYWNjYSA9IExVX3NocihjdXJyZW50X3dvcmQsdGVtcCk7CisgICAgICAgIHNsaWNlID0gKFVXb3JkMTYpZXh0cmFjdF9sKGFjY2EpOworCisgICAgICAgIG91dF93b3JkID0gYWRkKG91dF93b3JkLHNsaWNlKTsKKyAgICAgICAgb3V0X3dvcmRzW291dF93b3JkX2luZGV4KytdID0gb3V0X3dvcmQ7CisgICAgICAgIG1vdmUxNigpOworCisgICAgICAgIG91dF93b3JkID0gMDsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIAorICAgICAgICBvdXRfd29yZF9iaXRzX2ZyZWUgPSAxNjsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIAorICAgICAgICBhY2NhID0gTF9kZXBvc2l0X2wob3V0X3dvcmRfaW5kZXgpOworICAgICAgICBhY2NhID0gTF9zaGxfbm9jaGVjayhhY2NhLDQpOworICAgICAgICBhY2NhID0gTF9zdWIoYWNjYSxudW1iZXJfb2ZfYml0c19wZXJfZnJhbWUpOworICAgIH0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogICAgYWRqdXN0X2Fic19yZWdpb25fcG93ZXJfaW5kZXgKKworIFN5bnRheDogICAgICBhZGp1c3RfYWJzX3JlZ2lvbl9wb3dlcl9pbmRleChXb3JkMTYgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptbHRfY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucykKKworICAgICAgICAgICAgICBpbnB1dHM6ICAgKm1sdF9jb2VmcworICAgICAgICAgICAgICAgICAgICAgICAgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyX29mX3JlZ2lvbnMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICBvdXRwdXRzOiAgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleAorIAorIERlc2NyaXB0aW9uOiBBZGp1c3RzIHRoZSBhYnNvbHV0ZSBwb3dlciBpbmRleAorIAorIAorIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wMyAgICAgIHwgICAgICAwLjAzCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjEyICAgICAgfCAgICAgIDAuMTIKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCisKKyAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuMDMgICAgICB8ICAgICAwLjAzICAgICAgIHwgICAgIDAuMDMKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTUFYICB8ICAgIDAuMTQgICAgICB8ICAgICAwLjE0ICAgICAgIHwgICAgIDAuMTQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGFkanVzdF9hYnNfcmVnaW9uX3Bvd2VyX2luZGV4KFdvcmQxNiAqYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LFdvcmQxNiAqbWx0X2NvZWZzLFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucykKK3sKKyAgICBXb3JkMTYgbixpOworICAgIFdvcmQxNiByZWdpb247CisgICAgV29yZDE2ICpyYXdfbWx0X3B0cjsKKyAgICAKKyAgICBXb3JkMzIgYWNjYTsKKyAgICBXb3JkMTYgdGVtcDsKKworICAgIGZvciAocmVnaW9uPTA7IHJlZ2lvbjxudW1iZXJfb2ZfcmVnaW9uczsgcmVnaW9uKyspCisgICAgeworICAgICAgICBuID0gc3ViKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLDM5KTsKKyAgICAgICAgbiA9IHNocl9ub2NoZWNrKG4sMSk7CisgICAgICAgIAorICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9IGV4dHJhY3RfbChMX211bHQwKHJlZ2lvbixSRUdJT05fU0laRSkpOworCisgICAgICAgICAgICByYXdfbWx0X3B0ciA9ICZtbHRfY29lZnNbdGVtcF07CisKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPFJFR0lPTl9TSVpFOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWNjYSA9IExfc2hsX25vY2hlY2soKnJhd19tbHRfcHRyLDE2KTsKKyAgICAgICAgICAgICAgICBhY2NhID0gTF9hZGQoYWNjYSwzMjc2OEwpOworICAgICAgICAgICAgICAgIGFjY2EgPSBMX3Nocl9ub2NoZWNrKGFjY2Esbik7CisgICAgICAgICAgICAgICAgYWNjYSA9IExfc2hyX25vY2hlY2soYWNjYSwxNik7CisgICAgICAgICAgICAgICAgKnJhd19tbHRfcHRyKysgPSBleHRyYWN0X2woYWNjYSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXAgPSBzaGxfbm9jaGVjayhuLDEpOworICAgICAgICAgICAgdGVtcCA9IHN1YihhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSx0ZW1wKTsKKyAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dID0gdGVtcDsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246ICAgIGNvbXB1dGVfcmVnaW9uX3Bvd2VycworCisgU3ludGF4OiAgICAgIFdvcmQxNiBjb21wdXRlX3JlZ2lvbl9wb3dlcnMoV29yZDE2ICAqbWx0X2NvZWZzLCAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1hZ19zaGlmdCwgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqZHJwX251bV9iaXRzLCAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDE2ICpkcnBfY29kZV9iaXRzLCAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCwgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucykKKyAgICAgICAgICAgICAgICBtbHRfY29lZnNbRENUX0xFTkdUSF07ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1hZ19zaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkcnBfbnVtX2JpdHNbTUFYX05VTUJFUl9PRl9SRUdJT05TXTsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZHJwX2NvZGVfYml0c1tNQVhfTlVNQkVSX09GX1JFR0lPTlNdOyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtNQVhfTlVNQkVSX09GX1JFR0lPTlNdOyAgICAgICAKKyAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyBEZXNjcmlwdGlvbjogQ29tcHV0ZXMgdGhlIHBvd2VyIGZvciBlYWNoIG9mIHRoZSByZWdpb25zCisKKyAKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjA5ICAgICAgfCAgICAwLjA5CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tICAKKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjEzICAgICAgfCAgICAwLjEzCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjIwICAgICAgfCAgICAgMC4yMCAgICAgICB8ICAgICAwLjIwCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjI5ICAgICAgfCAgICAgMC4yOSAgICAgICB8ICAgICAwLjI5CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitXb3JkMTYgY29tcHV0ZV9yZWdpb25fcG93ZXJzKFdvcmQxNiAgKm1sdF9jb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtYWdfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgKmRycF9udW1fYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQxNiAqZHJwX2NvZGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bWJlcl9vZl9yZWdpb25zKQoreworCisgICAgV29yZDE2ICppbnB1dF9wdHI7CisgICAgV29yZDMyIGxvbmdfYWNjdW11bGF0b3I7CisgICAgV29yZDE2IGl0ZW1wMTsKKyAgICBXb3JkMTYgcG93ZXJfc2hpZnQ7CisgICAgV29yZDE2IHJlZ2lvbjsKKyAgICBXb3JkMTYgajsKKyAgICBXb3JkMTYgZGlmZmVyZW50aWFsX3JlZ2lvbl9wb3dlcl9pbmRleFtNQVhfTlVNQkVSX09GX1JFR0lPTlNdOworICAgIFdvcmQxNiBudW1iZXJfb2ZfYml0czsKKyAgICAKKyAgICBXb3JkMzIgYWNjYTsKKyAgICBXb3JkMTYgdGVtcDsKKyAgICBXb3JkMTYgdGVtcDE7CisgICAgV29yZDE2IHRlbXAyOworCisKKyAgICBpbnB1dF9wdHIgPSBtbHRfY29lZnM7CisgICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKKyAgICB7CisgICAgICAgIGxvbmdfYWNjdW11bGF0b3IgPSBMX2RlcG9zaXRfbCgwKTsKKworICAgICAgICBmb3IgKGo9MDsgajxSRUdJT05fU0laRTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpdGVtcDEgPSAqaW5wdXRfcHRyKys7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgIGxvbmdfYWNjdW11bGF0b3IgPSBMX21hYzAobG9uZ19hY2N1bXVsYXRvcixpdGVtcDEsaXRlbXAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHBvd2VyX3NoaWZ0ID0gMDsKKyAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgYWNjYSA9IChsb25nX2FjY3VtdWxhdG9yICYgMHg3ZmZmMDAwMEwpOworICAgICAgICBsb2dpYzMyKCk7CisKKyAgICAgICAgdGVzdCgpOworICAgICAgICB3aGlsZSAoYWNjYSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIGxvbmdfYWNjdW11bGF0b3IgPSBMX3Nocl9ub2NoZWNrKGxvbmdfYWNjdW11bGF0b3IsMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGFjY2EgPSAobG9uZ19hY2N1bXVsYXRvciAmIDB4N2ZmZjAwMDBMKTsKKyAgICAgICAgICAgIGxvZ2ljMzIoKTsKKworICAgICAgICAgICAgcG93ZXJfc2hpZnQgPSBhZGQocG93ZXJfc2hpZnQsMSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFjY2EgPSBMX3N1Yihsb25nX2FjY3VtdWxhdG9yLDMyNzY3KTsKKyAgICAgICAgCisgICAgICAgIHRlbXAgPSBhZGQocG93ZXJfc2hpZnQsMTUpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgbG9naWMxNigpOworICAgICAgICB3aGlsZSAoKGFjY2EgPD0gMCkgJiYgKHRlbXAgPj0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIGxvZ2ljMTYoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbG9uZ19hY2N1bXVsYXRvciA9IExfc2hsX25vY2hlY2sobG9uZ19hY2N1bXVsYXRvciwxKTsKKyAgICAgICAgICAgIGFjY2EgPSBMX3N1Yihsb25nX2FjY3VtdWxhdG9yLDMyNzY3KTsKKyAgICAgICAgICAgIHBvd2VyX3NoaWZ0LS07CisgICAgICAgICAgICB0ZW1wID0gYWRkKHBvd2VyX3NoaWZ0LDE1KTsKKyAgICAgICAgfQorICAgICAgICBsb25nX2FjY3VtdWxhdG9yID0gTF9zaHJfbm9jaGVjayhsb25nX2FjY3VtdWxhdG9yLDEpOworICAgICAgICAvKiAyODk2MyBjb3JyZXNwb25kcyB0byBzcXVhcmUgcm9vdCBvZiAyIHRpbWVzIFJFR0lPTl9TSVpFKDIwKS4gKi8KKyAgICAgICAgYWNjYSA9IExfc3ViKGxvbmdfYWNjdW11bGF0b3IsMjg5NjMpOworICAgICAgICAKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAoYWNjYSA+PSAwKQorICAgICAgICAgICAgcG93ZXJfc2hpZnQgPSBhZGQocG93ZXJfc2hpZnQsMSk7CisgICAgICAgIAorICAgICAgICBhY2NhID0gTF9kZXBvc2l0X2wobWFnX3NoaWZ0KTsKKyAgICAgICAgYWNjYSA9IExfc2hsX25vY2hlY2soYWNjYSwxKTsKKyAgICAgICAgYWNjYSA9IExfc3ViKHBvd2VyX3NoaWZ0LGFjY2EpOworICAgICAgICBhY2NhID0gTF9hZGQoMzUsYWNjYSk7CisgICAgICAgIGFjY2EgPSBMX3N1YihhY2NhLFJFR0lPTl9QT1dFUl9UQUJMRV9OVU1fTkVHQVRJVkVTKTsKKyAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSBleHRyYWN0X2woYWNjYSk7CisgICAgfQorCisKKyAgICAvKiBCZWZvcmUgd2UgZGlmZmVyZW50aWFsbHkgZW5jb2RlIHRoZSBxdWFudGl6ZWQgcmVnaW9uIHBvd2VycywgYWRqdXN0IHVwd2FyZCB0aGUKKyAgICB2YWxsZXlzIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIHBlYWtzIGNhbiBiZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkLiAqLworICAgIHRlbXAgPSBzdWIobnVtYmVyX29mX3JlZ2lvbnMsMik7CisKKyAgICBmb3IgKHJlZ2lvbiA9IHRlbXA7IHJlZ2lvbiA+PSAwOyByZWdpb24tLSkKKyAgICB7CisgICAgICAgIHRlbXAxID0gc3ViKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb24rMV0sRFJQX0RJRkZfTUFYKTsKKyAgICAgICAgdGVtcDIgPSBzdWIoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sdGVtcDEpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmICh0ZW1wMiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dID0gdGVtcDE7CisgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRoZSBNTFQgaXMgY3VycmVudGx5IHNjYWxlZCB0b28gbG93IGJ5IHRoZSBmYWN0b3IKKyAgICAgICBFTkNPREVSX1NDQUxFX0ZBQ1RPUig9MTgzMTgpLzMyNzY4ICogKDEuL3NxcnQoMTYwKS4KKyAgICAgICBUaGlzIGlzIHRoZSBuaW50aCBwb3dlciBvZiAxIG92ZXIgdGhlIHNxdWFyZSByb290IG9mIDIuCisgICAgICAgU28gbGF0ZXIgd2Ugd2lsbCBhZGQgRVNGX0FESlVTVE1FTlRfVE9fUk1TX0lOREVYIChub3cgOSkKKyAgICAgICB0byBkcnBfY29kZV9iaXRzWzBdLiAqLworCisgICAgLyogZHJwX2NvZGVfYml0c1swXSBjYW4gcmFuZ2UgZnJvbSAxIHRvIDMxLiAwIHdpbGwgYmUgdXNlZCBvbmx5IGFzIGFuIGVzY2FwZSBzZXF1ZW5jZS4gKi8KKyAgICB0ZW1wMSA9IHN1YigxLEVTRl9BREpVU1RNRU5UX1RPX1JNU19JTkRFWCk7CisgICAgdGVtcDIgPSBzdWIoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4WzBdLHRlbXAxKTsKKyAgICB0ZXN0KCk7CisgICAgaWYgKHRlbXAyIDwgMCkKKyAgICB7CisgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFswXSA9IHRlbXAxOworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9CisgICAgCisgICAgdGVtcDEgPSBzdWIoMzEsRVNGX0FESlVTVE1FTlRfVE9fUk1TX0lOREVYKTsKKworCS8qCisJICogVGhlIG5leHQgbGluZSB3YXMgY29ycmVjdGVkIGluIFJlbGVhc2UgMS4yIAorCSAqLworCisgICAgdGVtcDIgPSBzdWIoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4WzBdLCB0ZW1wMSk7ICAKKyAgICB0ZXN0KCk7CisgICAgaWYgKHRlbXAyID4gMCkKKyAgICB7CisgICAgICAgIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFswXSA9IHRlbXAxOworICAgICAgICBtb3ZlMTYoKTsKKyAgICB9CisKKyAgICBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2luZGV4WzBdID0gYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4WzBdOworICAgIG1vdmUxNigpOworICAgIAorICAgIG51bWJlcl9vZl9iaXRzID0gNTsKKyAgICBtb3ZlMTYoKTsKKyAgICAKKyAgICBkcnBfbnVtX2JpdHNbMF0gPSA1OworICAgIG1vdmUxNigpOworICAgIAorICAgIGRycF9jb2RlX2JpdHNbMF0gPSAoVVdvcmQxNilhZGQoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4WzBdLEVTRl9BREpVU1RNRU5UX1RPX1JNU19JTkRFWCk7CisgICAgbW92ZTE2KCk7CisKKyAgICAvKiBMb3dlciBsaW1pdCB0aGUgYWJzb2x1dGUgcmVnaW9uIHBvd2VyIGluZGljZXMgdG8gLTggYW5kIHVwcGVyIGxpbWl0IHRoZW0gdG8gMzEuIFN1Y2ggZXh0cmVtZXMKKyAgICAgbWF5IGJlIG1hdGhlbWF0aWNhbGx5IGltcG9zc2libGUgYW55d2F5LiovCisgICAgZm9yIChyZWdpb249MTsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKKyAgICB7CisgICAgICAgIHRlbXAxID0gc3ViKC04LEVTRl9BREpVU1RNRU5UX1RPX1JNU19JTkRFWCk7CisgICAgICAgIHRlbXAyID0gc3ViKGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLHRlbXAxKTsKKyAgICAgICAgdGVzdCgpOworICAgICAgICBpZiAodGVtcDIgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA9IHRlbXAxOworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wMSA9IHN1YigzMSxFU0ZfQURKVVNUTUVOVF9UT19STVNfSU5ERVgpOworICAgICAgICB0ZW1wMiA9IHN1YihhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSx0ZW1wMSk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKHRlbXAyID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0gPSB0ZW1wMTsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChyZWdpb249MTsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKKyAgICB7CisgICAgICAgIGogPSBzdWIoYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0sYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbi0xXSk7CisgICAgICAgIHRlbXAgPSBzdWIoaixEUlBfRElGRl9NSU4pOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmICh0ZW1wIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgaiA9IERSUF9ESUZGX01JTjsKKyAgICAgICAgfQorICAgICAgICBqID0gc3ViKGosRFJQX0RJRkZfTUlOKTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA9IGo7CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgdGVtcCA9IGFkZChhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uLTFdLGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSk7CisgICAgICAgIHRlbXAgPSBhZGQodGVtcCxEUlBfRElGRl9NSU4pOworICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXhbcmVnaW9uXSA9IHRlbXA7CisgICAgICAgIG1vdmUxNigpOworCisgICAgICAgIG51bWJlcl9vZl9iaXRzID0gYWRkKG51bWJlcl9vZl9iaXRzLGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfYml0c1tyZWdpb25dW2pdKTsKKyAgICAgICAgZHJwX251bV9iaXRzW3JlZ2lvbl0gPSBkaWZmZXJlbnRpYWxfcmVnaW9uX3Bvd2VyX2JpdHNbcmVnaW9uXVtqXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIGRycF9jb2RlX2JpdHNbcmVnaW9uXSA9IGRpZmZlcmVudGlhbF9yZWdpb25fcG93ZXJfY29kZXNbcmVnaW9uXVtqXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorCisgICAgcmV0dXJuIChudW1iZXJfb2ZfYml0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogICAgdmVjdG9yX3F1YW50aXplX21sdHMKKworIFN5bnRheDogICAgICB2b2lkIHZlY3Rvcl9xdWFudGl6ZV9tbHRzKG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2ZfcmVnaW9ucywgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sdF9jb2VmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXJfY2F0ZWdvcmllcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2JhbGFuY2VzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50cywgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fbWx0X2JpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9uczsKKyAgICAgICAgICAgICAgV29yZDE2IG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXM7CisgICAgICAgICAgICAgIFdvcmQxNiBtbHRfY29lZnNbRENUX0xFTkdUSF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgV29yZDE2IGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtNQVhfTlVNQkVSX09GX1JFR0lPTlNdOyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBXb3JkMTYgcG93ZXJfY2F0ZWdvcmllc1tNQVhfTlVNQkVSX09GX1JFR0lPTlNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIFdvcmQxNiBjYXRlZ29yeV9iYWxhbmNlc1tNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFUy0xXTsgICAgICAgICAKKyAgICAgICAgICAgICAgV29yZDE2ICpwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBXb3JkMTYgcmVnaW9uX21sdF9iaXRfY291bnRzW01BWF9OVU1CRVJfT0ZfUkVHSU9OU107ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIFdvcmQzMiByZWdpb25fbWx0X2JpdHNbNCpNQVhfTlVNQkVSX09GX1JFR0lPTlNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworIERlc2NyaXB0aW9uOiBTY2FsYXIgcXVhbnRpemVkIHZlY3RvciBIdWZmbWFuIGNvZGluZyAoU1FWSCkKKworIAorIFdNT1BTOiAgICAgN2tIeiB8ICAgIDI0a2JpdCAgICB8ICAgICAzMmtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjU3ICAgICAgfCAgICAgMC42NQorICAgICAgICAgIC0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLSAgCisgICAgICAgICAgICBNQVggIHwgICAgMC43OCAgICAgIHwgICAgIDAuODMKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gCisKKyAgICAgICAgICAgMTRrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0ICAgICB8ICAgICA0OGtiaXQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQVZHICB8ICAgIDAuNjIgICAgICB8ICAgICAwLjkwICAgICAgIHwgICAgIDEuMTEKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgTUFYICB8ICAgIDEuMTYgICAgICB8ICAgICAxLjM5ICAgICAgIHwgICAgIDEuNTQKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgdmVjdG9yX3F1YW50aXplX21sdHMoV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptbHRfY29lZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBvd2VyX2NhdGVnb3JpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqY2F0ZWdvcnlfYmFsYW5jZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnJlZ2lvbl9tbHRfYml0X2NvdW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQzMiAqcmVnaW9uX21sdF9iaXRzKQoreworCisgICAgV29yZDE2ICpyYXdfbWx0X3B0cjsKKyAgICBXb3JkMTYgcmVnaW9uOworICAgIFdvcmQxNiBjYXRlZ29yeTsKKyAgICBXb3JkMTYgdG90YWxfbWx0X2JpdHMgPSAwOworCisgICAgV29yZDE2IHRlbXA7CisgICAgV29yZDE2IHRlbXAxOworICAgIFdvcmQxNiB0ZW1wMjsKKworICAgIC8qIFN0YXJ0IGluIHRoZSBtaWRkbGUgb2YgdGhlIGNhdGVnb3JpemF0aW9uIGNvbnRyb2wgcmFuZ2UuICovCisgICAgdGVtcCA9IHNocl9ub2NoZWNrKG51bV9jYXRlZ29yaXphdGlvbl9jb250cm9sX3Bvc3NpYmlsaXRpZXMsMSk7CisgICAgdGVtcCA9IHN1Yih0ZW1wLDEpOworICAgIGZvciAoKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCA9IDA7ICpwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2wgPCB0ZW1wOyAoKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCkrKykKKyAgICB7CisgICAgICAgIHJlZ2lvbiA9IGNhdGVnb3J5X2JhbGFuY2VzWypwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xdOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dID0gYWRkKHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXSwxKTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgfQorCisgICAgZm9yIChyZWdpb249MDsgcmVnaW9uPG51bWJlcl9vZl9yZWdpb25zOyByZWdpb24rKykKKyAgICB7CisgICAgICAgIGNhdGVnb3J5ID0gcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgdGVtcCA9IGV4dHJhY3RfbChMX211bHQwKHJlZ2lvbixSRUdJT05fU0laRSkpOworICAgICAgICByYXdfbWx0X3B0ciA9ICZtbHRfY29lZnNbdGVtcF07CisgICAgICAgIG1vdmUxNigpOworICAgICAgICB0ZW1wID0gc3ViKGNhdGVnb3J5LChOVU1fQ0FURUdPUklFUy0xKSk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKHRlbXAgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSA9CisgICAgICAgICAgICB2ZWN0b3JfaHVmZm1hbihjYXRlZ29yeSwgYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4W3JlZ2lvbl0scmF3X21sdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uX21sdF9iaXRzW3NobF9ub2NoZWNrKHJlZ2lvbiwyKV0pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaW9uX21sdF9iaXRfY291bnRzW3JlZ2lvbl0gPSAwOworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxfbWx0X2JpdHMgPSBhZGQodG90YWxfbWx0X2JpdHMscmVnaW9uX21sdF9iaXRfY291bnRzW3JlZ2lvbl0pOworICAgIH0KKworCisgICAgLyogSWYgdG9vIGZldyBiaXRzLi4uICovCisgICAgdGVtcCA9IHN1Yih0b3RhbF9tbHRfYml0cyxudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMpOworICAgIHRlc3QoKTsKKyAgICB0ZXN0KCk7CisgICAgbG9naWMxNigpOworICAgIHdoaWxlICgodGVtcCA8IDApICYmICgqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sID4gMCkpCisgICAgeworICAgICAgICB0ZXN0KCk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgbG9naWMxNigpOworICAgICAgICAoKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCktLTsKKyAgICAgICAgcmVnaW9uID0gY2F0ZWdvcnlfYmFsYW5jZXNbKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbF07CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dID0gc3ViKHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXSwxKTsKKyAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgdG90YWxfbWx0X2JpdHMgPSBzdWIodG90YWxfbWx0X2JpdHMscmVnaW9uX21sdF9iaXRfY291bnRzW3JlZ2lvbl0pOworICAgICAgICBjYXRlZ29yeSA9IHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIAorICAgICAgICByYXdfbWx0X3B0ciA9ICZtbHRfY29lZnNbcmVnaW9uKlJFR0lPTl9TSVpFXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIAorICAgICAgICB0ZW1wID0gc3ViKGNhdGVnb3J5LChOVU1fQ0FURUdPUklFUy0xKSk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKHRlbXAgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSA9CisgICAgICAgICAgICAgICAgdmVjdG9yX2h1ZmZtYW4oY2F0ZWdvcnksIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLHJhd19tbHRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbl9tbHRfYml0c1tzaGxfbm9jaGVjayhyZWdpb24sMildKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dID0gMDsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisgICAgICAgIHRvdGFsX21sdF9iaXRzID0gYWRkKHRvdGFsX21sdF9iaXRzLHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dKTsKKyAgICAgICAgdGVtcCA9IHN1Yih0b3RhbF9tbHRfYml0cyxudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMpOworICAgIH0KKworICAgIC8qIElmIHRvbyBtYW55IGJpdHMuLi4gKi8KKyAgICAvKiBTZXQgdXAgZm9yIHdoaWxlIGxvb3AgdGVzdCAqLworICAgIHRlbXAxID0gc3ViKHRvdGFsX21sdF9iaXRzLG51bWJlcl9vZl9hdmFpbGFibGVfYml0cyk7CisgICAgdGVtcDIgPSBzdWIoKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbCxzdWIobnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfcG9zc2liaWxpdGllcywxKSk7CisgICAgdGVzdCgpOworICAgIHRlc3QoKTsKKyAgICBsb2dpYzE2KCk7CisgICAgCisgICAgd2hpbGUgKCh0ZW1wMSA+IDApICYmICh0ZW1wMiA8IDApKQorICAgIHsKKyAgICAgICAgLyogb3BlcmF0aW9ucyBmb3Igd2hpbGUgY29udGl0aW9ucyAqLworICAgICAgICB0ZXN0KCk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgbG9naWMxNigpOworICAgICAgICAKKyAgICAgICAgcmVnaW9uID0gY2F0ZWdvcnlfYmFsYW5jZXNbKnBfY2F0ZWdvcml6YXRpb25fY29udHJvbF07CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgcG93ZXJfY2F0ZWdvcmllc1tyZWdpb25dID0gYWRkKHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXSwxKTsKKyAgICAgICAgbW92ZTE2KCk7CisKKyAgICAgICAgdG90YWxfbWx0X2JpdHMgPSBzdWIodG90YWxfbWx0X2JpdHMscmVnaW9uX21sdF9iaXRfY291bnRzW3JlZ2lvbl0pOworICAgICAgICBjYXRlZ29yeSA9IHBvd2VyX2NhdGVnb3JpZXNbcmVnaW9uXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIAorICAgICAgICB0ZW1wID0gZXh0cmFjdF9sKExfbXVsdDAocmVnaW9uLFJFR0lPTl9TSVpFKSk7CisgICAgICAgIHJhd19tbHRfcHRyID0gJm1sdF9jb2Vmc1t0ZW1wXTsKKyAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIAorICAgICAgICB0ZW1wID0gc3ViKGNhdGVnb3J5LChOVU1fQ0FURUdPUklFUy0xKSk7CisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgaWYgKHRlbXAgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZWdpb25fbWx0X2JpdF9jb3VudHNbcmVnaW9uXSA9CisgICAgICAgICAgICAgICAgdmVjdG9yX2h1ZmZtYW4oY2F0ZWdvcnksIGFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleFtyZWdpb25dLHJhd19tbHRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbl9tbHRfYml0c1tzaGxfbm9jaGVjayhyZWdpb24sMildKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dID0gMDsKKyAgICAgICAgICAgIG1vdmUxNigpOworICAgICAgICB9CisgICAgICAgIHRvdGFsX21sdF9iaXRzID0gYWRkKHRvdGFsX21sdF9iaXRzLHJlZ2lvbl9tbHRfYml0X2NvdW50c1tyZWdpb25dKTsKKyAgICAgICAgKCpwX2NhdGVnb3JpemF0aW9uX2NvbnRyb2wpKys7CisgICAgICAgIAorICAgICAgICB0ZW1wMSA9IHN1Yih0b3RhbF9tbHRfYml0cyxudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMpOworICAgICAgICB0ZW1wMiA9IHN1YigqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sLHN1YihudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLDEpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogICAgdmVjdG9yX2h1ZmZtYW4KKworIFN5bnRheDogICAgICBXb3JkMTYgdmVjdG9yX2h1ZmZtYW4oV29yZDE2ICBjYXRlZ29yeSwgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBwb3dlcl9pbmRleCwgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqcmF3X21sdF9wdHIsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMzIgKndvcmRfcHRyKSAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlucHV0czogICAgIFdvcmQxNiAgY2F0ZWdvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBwb3dlcl9pbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICpyYXdfbWx0X3B0cgorICAgICAgICAgICAgIAorICAgICAgICAgICAgICBvdXRwdXRzOiAgICBudW1iZXJfb2ZfcmVnaW9uX2JpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKndvcmRfcHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgRGVzY3JpcHRpb246IEh1ZmZtYW4gZW5jb2RpbmcgZm9yIGVhY2ggcmVnaW9uIGJhc2VkIG9uIGNhdGVnb3J5IGFuZCBwb3dlcl9pbmRleCAgCisKKyBXTU9QUzogICAgIDdrSHogfCAgICAyNGtiaXQgICAgfCAgICAgMzJrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICBBVkcgIHwgICAgMC4wMyAgICAgIHwgICAgIDAuMDMKKyAgICAgICAgICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0gIAorICAgICAgICAgICAgTUFYICB8ICAgIDAuMDQgICAgICB8ICAgICAwLjA0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tIAorCisgICAgICAgICAgIDE0a0h6IHwgICAgMjRrYml0ICAgIHwgICAgIDMya2JpdCAgICAgfCAgICAgNDhrYml0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIEFWRyAgfCAgICAwLjAzICAgICAgfCAgICAgMC4wMyAgICAgICB8ICAgICAwLjAzCisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIE1BWCAgfCAgICAwLjA0ICAgICAgfCAgICAgMC4wNCAgICAgICB8ICAgICAwLjA0CisgICAgICAgICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IHZlY3Rvcl9odWZmbWFuKFdvcmQxNiBjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgcG93ZXJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpyYXdfbWx0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICBVV29yZDMyICp3b3JkX3B0cikKK3sKKyAKKworICAgIFdvcmQxNiAgaW52X29mX3N0ZXBfc2l6ZV90aW1lc19zdGRfZGV2OworICAgIFdvcmQxNiAgaixuOworICAgIFdvcmQxNiAgazsKKyAgICBXb3JkMTYgIG51bWJlcl9vZl9yZWdpb25fYml0czsKKyAgICBXb3JkMTYgIG51bWJlcl9vZl9ub25femVybzsKKyAgICBXb3JkMTYgIHZlY19kaW07CisgICAgV29yZDE2ICBudW1fdmVjczsKKyAgICBXb3JkMTYgIGttYXgsIGttYXhfcGx1c19vbmU7CisgICAgV29yZDE2ICBpbmRleCxzaWduc19pbmRleDsKKyAgICBXb3JkMTYgICpiaXRjb3VudF90YWJsZV9wdHI7CisgICAgVVdvcmQxNiAqY29kZV90YWJsZV9wdHI7CisgICAgV29yZDMyICBjb2RlX2JpdHM7CisgICAgV29yZDE2ICBudW1iZXJfb2ZfY29kZV9iaXRzOworICAgIFVXb3JkMzIgY3VycmVudF93b3JkOworICAgIFdvcmQxNiAgY3VycmVudF93b3JkX2JpdHNfZnJlZTsKKyAgICAKKyAgICBXb3JkMzIgYWNjYTsKKyAgICBXb3JkMzIgYWNjYjsKKyAgICBXb3JkMTYgdGVtcDsKKworICAgIFdvcmQxNiBteXRlbXA7CQkJIC8qIG5ldyB2YXJpYWJsZSBpbiBSZWxlYXNlIDEuMiAqLworICAgIFdvcmQxNiBteWFjY2E7CQkJIC8qIG5ldyB2YXJpYWJsZSBpbiBSZWxlYXNlIDEuMiAqLworCisKKyAgICAvKiBpbml0aWFsaXplIHZhcmlhYmxlcyAqLworICAgIHZlY19kaW0gPSB2ZWN0b3JfZGltZW5zaW9uW2NhdGVnb3J5XTsKKyAgICBtb3ZlMTYoKTsKKworICAgIG51bV92ZWNzID0gbnVtYmVyX29mX3ZlY3RvcnNbY2F0ZWdvcnldOworICAgIG1vdmUxNigpOworCisgICAga21heCA9IG1heF9iaW5bY2F0ZWdvcnldOworICAgIG1vdmUxNigpOworCisgICAga21heF9wbHVzX29uZSA9IGFkZChrbWF4LDEpOworICAgIG1vdmUxNigpOworCisgICAgY3VycmVudF93b3JkID0gMEw7CisgICAgbW92ZTE2KCk7CisKKyAgICBjdXJyZW50X3dvcmRfYml0c19mcmVlID0gMzI7CisgICAgbW92ZTE2KCk7CisKKyAgICBudW1iZXJfb2ZfcmVnaW9uX2JpdHMgPSAwOworICAgIG1vdmUxNigpOworCisgICAgLyogc2V0IHVwIHRhYmxlIHBvaW50ZXJzICovCisgICAgYml0Y291bnRfdGFibGVfcHRyID0gKFdvcmQxNiAqKXRhYmxlX29mX2JpdGNvdW50X3RhYmxlc1tjYXRlZ29yeV07CisgICAgY29kZV90YWJsZV9wdHIgPSAoVVdvcmQxNiAqKSB0YWJsZV9vZl9jb2RlX3RhYmxlc1tjYXRlZ29yeV07CisKKyAgICAvKiBjb21wdXRlIGludmVyc2Ugb2Ygc3RlcCBzaXplICogc3RhbmRhcmQgZGV2aWF0aW9uICovCisgICAgYWNjYSA9IExfbXVsdChzdGVwX3NpemVfaW52ZXJzZV90YWJsZVtjYXRlZ29yeV0sc3RhbmRhcmRfZGV2aWF0aW9uX2ludmVyc2VfdGFibGVbcG93ZXJfaW5kZXhdKTsKKyAgICBhY2NhID0gTF9zaHJfbm9jaGVjayhhY2NhLDEpOworICAgIGFjY2EgPSBMX2FkZChhY2NhLDQwOTYpOworICAgIGFjY2EgPSBMX3Nocl9ub2NoZWNrKGFjY2EsMTMpOworCisJLyoKKwkgKiAgVGhlIG5leHQgdHdvIGxpbmVzIGFyZSBuZXcgdG8gUmVsZWFzZSAxLjIgCisJICovCisgICAgIAorCW15dGVtcCA9IChXb3JkMTYpKGFjY2EgJiAweDMpOworICAgIGFjY2EgPSBMX3Nocl9ub2NoZWNrKGFjY2EsMik7CisKKyAgICBpbnZfb2Zfc3RlcF9zaXplX3RpbWVzX3N0ZF9kZXYgPSBleHRyYWN0X2woYWNjYSk7CisKKworICAgIGZvciAobj0wOyBuPG51bV92ZWNzOyBuKyspCisgICAgeworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgc2lnbnNfaW5kZXggPSAwOworICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgCisgICAgICAgIG51bWJlcl9vZl9ub25femVybyA9IDA7CisgICAgICAgIG1vdmUxNigpOworICAgICAgICAKKyAgICAgICAgZm9yIChqPTA7IGo8dmVjX2RpbTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBrID0gYWJzX3MoKnJhd19tbHRfcHRyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYWNjYSA9IExfbXVsdChrLGludl9vZl9zdGVwX3NpemVfdGltZXNfc3RkX2Rldik7CisgICAgICAgICAgICBhY2NhID0gTF9zaHJfbm9jaGVjayhhY2NhLDEpOworCQkgICAgCisJCQkvKgorCQkJICogIFRoZSBuZXh0IGZvdXIgbGluZXMgYXJlIG5ldyB0byBSZWxlYXNlIDEuMgorCQkJICovCisKKwkJCW15YWNjYSA9IChXb3JkMTYpTF9tdWx0KGssbXl0ZW1wKTsKKwkJCW15YWNjYSA9IChXb3JkMTYpTF9zaHJfbm9jaGVjayhteWFjY2EsMSk7CisJCQlteWFjY2EgPSAoV29yZDE2KUxfYWRkKG15YWNjYSxpbnRfZGVhZF96b25lX2xvd19iaXRzW2NhdGVnb3J5XSk7CisJCQlteWFjY2EgPSAoV29yZDE2KUxfc2hyX25vY2hlY2sobXlhY2NhLDIpOworCisgICAgICAgICAgICBhY2NhID0gTF9hZGQoYWNjYSxpbnRfZGVhZF96b25lW2NhdGVnb3J5XSk7CisKKwkJCS8qCisJCQkgKiAgVGhlIG5leHQgdHdvIGxpbmVzIGFyZSBuZXcgdG8gUmVsZWFzZSAxLjIKKwkJCSAqLworCisJCQlhY2NhID0gTF9hZGQoYWNjYSxteWFjY2EpOworCQkJYWNjYSA9IExfc2hyX25vY2hlY2soYWNjYSwxMyk7CisKKyAgICAgICAgICAgIGsgPSBleHRyYWN0X2woYWNjYSk7CisKKyAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIGlmIChrICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbnVtYmVyX29mX25vbl96ZXJvID0gYWRkKG51bWJlcl9vZl9ub25femVybywxKTsKKyAgICAgICAgICAgICAgICBzaWduc19pbmRleCA9IHNobF9ub2NoZWNrKHNpZ25zX2luZGV4LDEpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoKnJhd19tbHRfcHRyID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNpZ25zX2luZGV4ID0gYWRkKHNpZ25zX2luZGV4LDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0ZW1wID0gc3ViKGssa21heCk7CisgICAgICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGsgPSBrbWF4OworICAgICAgICAgICAgICAgICAgICBtb3ZlMTYoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhY2NhID0gTF9zaHJfbm9jaGVjayhMX211bHQoaW5kZXgsKGttYXhfcGx1c19vbmUpKSwxKTsKKyAgICAgICAgICAgIGluZGV4ID0gZXh0cmFjdF9sKGFjY2EpOworICAgICAgICAgICAgaW5kZXggPSBhZGQoaW5kZXgsayk7CisgICAgICAgICAgICByYXdfbWx0X3B0cisrOworICAgICAgICB9CisKKyAgICAgICAgY29kZV9iaXRzID0gKihjb2RlX3RhYmxlX3B0citpbmRleCk7CisgICAgICAgIG51bWJlcl9vZl9jb2RlX2JpdHMgPSBhZGQoKCooYml0Y291bnRfdGFibGVfcHRyK2luZGV4KSksbnVtYmVyX29mX25vbl96ZXJvKTsKKyAgICAgICAgbnVtYmVyX29mX3JlZ2lvbl9iaXRzID0gYWRkKG51bWJlcl9vZl9yZWdpb25fYml0cyxudW1iZXJfb2ZfY29kZV9iaXRzKTsKKworICAgICAgICBhY2NhID0gY29kZV9iaXRzIDw8IG51bWJlcl9vZl9ub25femVybzsKKyAgICAgICAgYWNjYiA9IExfZGVwb3NpdF9sKHNpZ25zX2luZGV4KTsKKyAgICAgICAgYWNjYSA9IExfYWRkKGFjY2EsYWNjYik7CisgICAgICAgIGNvZGVfYml0cyA9IGFjY2E7CisgICAgICAgIG1vdmUzMigpOworCisgICAgICAgIC8qIG1zYiBvZiBjb2RlYml0cyBpcyB0cmFuc21pdHRlZCBmaXJzdC4gKi8KKyAgICAgICAgaiA9IHN1YihjdXJyZW50X3dvcmRfYml0c19mcmVlLG51bWJlcl9vZl9jb2RlX2JpdHMpOworICAgICAgICB0ZXN0KCk7CisgICAgICAgIGlmIChqID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIGFjY2EgPSBjb2RlX2JpdHMgPDwgajsKKyAgICAgICAgICAgIGN1cnJlbnRfd29yZCA9IExfYWRkKGN1cnJlbnRfd29yZCxhY2NhKTsKKyAgICAgICAgICAgIGN1cnJlbnRfd29yZF9iaXRzX2ZyZWUgPSBqOworICAgICAgICAgICAgbW92ZTE2KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBqID0gbmVnYXRlKGopOworICAgICAgICAgICAgYWNjYSA9IExfc2hyX25vY2hlY2soY29kZV9iaXRzLGopOworICAgICAgICAgICAgY3VycmVudF93b3JkID0gTF9hZGQoY3VycmVudF93b3JkLGFjY2EpOworICAgICAgICAgICAgCisgICAgICAgICAgICAqd29yZF9wdHIrKyA9IGN1cnJlbnRfd29yZDsKKyAgICAgICAgICAgIG1vdmUxNigpOworCisgICAgICAgICAgICBjdXJyZW50X3dvcmRfYml0c19mcmVlID0gc3ViKDMyLGopOworICAgICAgICAgICAgdGVzdCgpOworICAgICAgICAgICAgY3VycmVudF93b3JkID0gY29kZV9iaXRzIDw8IGN1cnJlbnRfd29yZF9iaXRzX2ZyZWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqd29yZF9wdHIrKyA9IGN1cnJlbnRfd29yZDsKKyAgICBtb3ZlMTYoKTsKKworICAgIHJldHVybiAobnVtYmVyX29mX3JlZ2lvbl9iaXRzKTsKK30KKworCg==