LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bGltaXRzLmg+CgojZGVmaW5lIElOQ0xfUE0KI2RlZmluZSBJTkNMX0RPUwojZGVmaW5lIElOQ0xfRE9TRVJST1JTCiNpbmNsdWRlIDxzdnBtLmg+CgojaW5jbHVkZSA8dG9vbHMvZGVidWcuaHh4PgojaW5jbHVkZSA8dG9vbHMvZnN5cy5oeHg+CiNpbmNsdWRlIDx0b29scy9zdHJlYW0uaHh4PgoKLy8gY2xhc3MgRmlsZUJhc2UKI2luY2x1ZGUgPG9zbC9maWxlLmh4eD4KCnVzaW5nIG5hbWVzcGFjZSBvc2w7CgovLyBjbGFzcyBGaWxlQmFzZQojaWZuZGVmIF9PU0xfRklMRV9IWFhfCiNpbmNsdWRlIDxvc2wvZmlsZS5oeHg+CiNlbmRpZgoKdXNpbmcgbmFtZXNwYWNlIG9zbDsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyAtLS0tLS0tLS0tLS0tLQovLyAtIFN0cmVhbURhdGEgLQovLyAtLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3RyZWFtRGF0YQp7CnB1YmxpYzoKICAgIEhGSUxFICAgaEZpbGU7CiAgICBzYWxfQm9vbCAgICBiSXNFb2Y7CgogICAgICAgICAgICBTdHJlYW1EYXRhKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaEZpbGUgPSAwOwogICAgICAgICAgICAgICAgYklzRW9mID0gc2FsX1RydWU7CiAgICAgICAgICAgIH0KfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzYWxfdUludFB0ciBHZXRTdkVycm9yKCBBUElSRVQgblBNRXJyb3IgKQp7CiAgICBzdGF0aWMgc3RydWN0IHsgQVBJUkVUIHBtOyBzYWxfdUludFB0ciBzdjsgfSBlcnJBcnJbXSA9CiAgICB7CiAgICAgICAgeyBFUlJPUl9GSUxFX05PVF9GT1VORCwgICAgICAgICBTVlNUUkVBTV9GSUxFX05PVF9GT1VORCB9LAogICAgICAgIHsgRVJST1JfUEFUSF9OT1RfRk9VTkQsICAgICAgICAgU1ZTVFJFQU1fUEFUSF9OT1RfRk9VTkQgfSwKICAgICAgICB7IEVSUk9SX1RPT19NQU5ZX09QRU5fRklMRVMsICAgIFNWU1RSRUFNX1RPT19NQU5ZX09QRU5fRklMRVMgfSwKICAgICAgICB7IEVSUk9SX0FDQ0VTU19ERU5JRUQsICAgICAgICAgIFNWU1RSRUFNX0FDQ0VTU19ERU5JRUQgfSwKICAgICAgICB7IEVSUk9SX0lOVkFMSURfQUNDRVNTLCAgICAgICAgIFNWU1RSRUFNX0lOVkFMSURfQUNDRVNTIH0sCiAgICAgICAgeyBFUlJPUl9TSEFSSU5HX1ZJT0xBVElPTiwgICAgICBTVlNUUkVBTV9TSEFSSU5HX1ZJT0xBVElPTiB9LAogICAgICAgIHsgRVJST1JfU0hBUklOR19CVUZGRVJfRVhDRUVERUQsU1ZTVFJFQU1fU0hBUkVfQlVGRl9FWENFRURFRCB9LAogICAgICAgIHsgRVJST1JfQ0FOTk9UX01BS0UsICAgICAgICAgICAgU1ZTVFJFQU1fQ0FOTk9UX01BS0UgfSwKICAgICAgICB7IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLCAgICAgIFNWU1RSRUFNX0lOVkFMSURfUEFSQU1FVEVSIH0sCiAgICAgICAgeyBFUlJPUl9EUklWRV9MT0NLRUQsICAgICAgICAgICBTVlNUUkVBTV9MT0NLSU5HX1ZJT0xBVElPTiB9LAogICAgICAgIHsgRVJST1JfTE9DS19WSU9MQVRJT04sICAgICAgU1ZTVFJFQU1fTE9DS0lOR19WSU9MQVRJT04gfSwKICAgICAgICB7IEVSUk9SX0ZJTEVOQU1FX0VYQ0VEX1JBTkdFLCAgIFNWU1RSRUFNX0lOVkFMSURfUEFSQU1FVEVSIH0sCiAgICAgICAgeyBFUlJPUl9BVE9NSUNfTE9DS19OT1RfU1VQUE9SVEVELCBTVlNUUkVBTV9JTlZBTElEX1BBUkFNRVRFUiB9LAogICAgICAgIHsgRVJST1JfUkVBRF9MT0NLU19OT1RfU1VQUE9SVEVELCBTVlNUUkVBTV9JTlZBTElEX1BBUkFNRVRFUiB9LAoKCiAgICAgICAgeyAweEZGRkYsIFNWU1RSRUFNX0dFTkVSQUxFUlJPUiB9CiAgICB9OwoKICAgIHNhbF91SW50UHRyIG5SZXRWYWwgPSBTVlNUUkVBTV9HRU5FUkFMRVJST1I7ICAgIC8vIFN0YW5kYXJkZmVobGVyCiAgICBpbnQgaT0wOwogICAgZG8KICAgIHsKICAgICAgICBpZiggZXJyQXJyW2ldLnBtID09IG5QTUVycm9yICkKICAgICAgICB7CiAgICAgICAgICAgIG5SZXRWYWwgPSBlcnJBcnJbaV0uc3Y7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpKys7CiAgICB9CiAgICB3aGlsZSggZXJyQXJyW2ldLnBtICE9IDB4RkZGRiApOwogICAgcmV0dXJuIG5SZXRWYWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnwqCnwqICAgIFN2RmlsZVN0cmVhbTo6U3ZGaWxlU3RyZWFtKCkKfCoKfCogICAgQmVzY2hyZWlidW5nICAgICAgU1RSRUFNLlNEVwp8KiAgICBFcnN0ZXJzdGVsbHVuZyAgICBPViAxNS4wNi45NAp8KiAgICBMZXR6dGUgQWVuZGVydW5nICBPViAxNS4wNi45NAp8KgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKU3ZGaWxlU3RyZWFtOjpTdkZpbGVTdHJlYW0oIGNvbnN0IFN0cmluZyYgckZpbGVOYW1lLCBTdHJlYW1Nb2RlIG5PcGVuTW9kZSApCnsKICAgIGJJc09wZW4gICAgICAgICAgICAgPSBzYWxfRmFsc2U7CiAgICBuTG9ja0NvdW50ZXIgICAgICAgID0gMDsKICAgIGJJc1dyaXRhYmxlICAgICAgICAgPSBzYWxfRmFsc2U7CiAgICBwSW5zdGFuY2VEYXRhICAgICAgID0gbmV3IFN0cmVhbURhdGE7CgogICAgU2V0QnVmZmVyU2l6ZSggODE5MiApOwoJLy8gY29udmVydCBVUkwgdG8gU3lzdGVtUGF0aCwgaWYgbmVjZXNzYXJ5Cgk6OnJ0bDo6T1VTdHJpbmcgYUZpbGVOYW1lLCBhTm9ybVBhdGg7CgoJaWYgKCBGaWxlQmFzZTo6Z2V0U3lzdGVtUGF0aEZyb21GaWxlVVJMKCByRmlsZU5hbWUsIGFGaWxlTmFtZSApICE9IEZpbGVCYXNlOjpFX05vbmUgKQoJCWFGaWxlTmFtZSA9IHJGaWxlTmFtZTsKCU9wZW4oIGFGaWxlTmFtZSwgbk9wZW5Nb2RlICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnwqCnwqICAgIFN2RmlsZVN0cmVhbTo6U3ZGaWxlU3RyZWFtKCkKfCoKfCogICAgQmVzY2hyZWlidW5nICAgICAgU1RSRUFNLlNEVwp8KiAgICBFcnN0ZXJzdGVsbHVuZyAgICBPViAyMi4xMS45NAp8KiAgICBMZXR6dGUgQWVuZGVydW5nICBPViAyMi4xMS45NAp8KgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKU3ZGaWxlU3RyZWFtOjpTdkZpbGVTdHJlYW0oKQp7CiAgICBiSXNPcGVuICAgICAgICAgICAgID0gc2FsX0ZhbHNlOwogICAgbkxvY2tDb3VudGVyICAgICAgICA9IDA7CiAgICBiSXNXcml0YWJsZSAgICAgICAgID0gc2FsX0ZhbHNlOwogICAgcEluc3RhbmNlRGF0YSAgICAgICA9IG5ldyBTdHJlYW1EYXRhOwogICAgU2V0QnVmZmVyU2l6ZSggODE5MiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp8Kgp8KiAgICBTdkZpbGVTdHJlYW06On5TdkZpbGVTdHJlYW0oKQp8Kgp8KiAgICBCZXNjaHJlaWJ1bmcgICAgICBTVFJFQU0uU0RXCnwqICAgIEVyc3RlcnN0ZWxsdW5nICAgIE9WIDE0LjA2Ljk0CnwqICAgIExldHp0ZSBBZW5kZXJ1bmcgIE9WIDE0LjA2Ljk0CnwqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpTdkZpbGVTdHJlYW06On5TdkZpbGVTdHJlYW0oKQp7CiAgICBDbG9zZSgpOwogICAgaWYoIHBJbnN0YW5jZURhdGEgKQogICAgICAgIGRlbGV0ZSBwSW5zdGFuY2VEYXRhOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp8Kgp8KiAgICBTdkZpbGVTdHJlYW06OkdldEZpbGVIYW5kbGUoKQp8Kgp8KiAgICBCZXNjaHJlaWJ1bmcgICAgICBTVFJFQU0uU0RXCnwqICAgIEVyc3RlcnN0ZWxsdW5nICAgIE9WIDE0LjA2Ljk0CnwqICAgIExldHp0ZSBBZW5kZXJ1bmcgIE9WIDE0LjA2Ljk0CnwqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzYWxfdUludFB0ciBTdkZpbGVTdHJlYW06OkdldEZpbGVIYW5kbGUoKSBjb25zdAp7CiAgICByZXR1cm4gKHNhbF91SW50UHRyKXBJbnN0YW5jZURhdGEtPmhGaWxlOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp8Kgp8KiAgICBTdkZpbGVTdHJlYW06OklzQSgpCnwqCnwqICAgIEJlc2NocmVpYnVuZyAgICAgIFNUUkVBTS5TRFcKfCogICAgRXJzdGVyc3RlbGx1bmcgICAgT1YgMTQuMDYuOTQKfCogICAgTGV0enRlIEFlbmRlcnVuZyAgT1YgMTQuMDYuOTQKfCoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnNhbF91SW50MTYgU3ZGaWxlU3RyZWFtOjpJc0EoKSBjb25zdAp7CiAgICByZXR1cm4gSURfRklMRVNUUkVBTTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKfCoKfCogICAgU3ZGaWxlU3RyZWFtOjpHZXREYXRhKCkKfCoKfCogICAgQmVzY2hyZWlidW5nICAgICAgU1RSRUFNLlNEVywgUHJ1ZWZ0IG5pY2h0IEVvZjsgSXNFb2YgZGFuYWNoIHJ1ZmJhcgp8KiAgICBFcnN0ZXJzdGVsbHVuZyAgICBPViAxNS4wNi45NAp8KiAgICBMZXR6dGUgQWVuZGVydW5nICBPViAxNS4wNi45NAp8KgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc2FsX3VJbnRQdHIgU3ZGaWxlU3RyZWFtOjpHZXREYXRhKCB2b2lkKiBwRGF0YSwgc2FsX3VJbnRQdHIgblNpemUgKQp7CiNpZmRlZiBEQkdfVVRJTAogICAgQnl0ZVN0cmluZyBhVHJhY2VTdHIoICJTdkZpbGVTdHJlYW06OkdldERhdGEoKTogIiApOwogICAgYVRyYWNlU3RyICs9IEJ5dGVTdHJpbmc6OkNyZWF0ZUZyb21JbnQ2NChuU2l6ZSk7CiAgICBhVHJhY2VTdHIgKz0gIiBCeXRlcyBmcm9tICI7CiAgICBhVHJhY2VTdHIgKz0gQnl0ZVN0cmluZyhhRmlsZW5hbWUsIG9zbF9nZXRUaHJlYWRUZXh0RW5jb2RpbmcoKSk7CiAgICBEQkdfVFJBQ0UoIGFUcmFjZVN0ci5HZXRCdWZmZXIoKSApOwojZW5kaWYKCiAgICBzYWxfdUludFB0ciBuQ291bnQgPSAwTDsKICAgIGlmKCBJc09wZW4oKSApCiAgICB7CiAgICAgICAgQVBJUkVUIG5SZXN1bHQ7CiAgICAgICAgblJlc3VsdCA9IERvc1JlYWQoIHBJbnN0YW5jZURhdGEtPmhGaWxlLChQVk9JRClwRGF0YSxuU2l6ZSwmbkNvdW50ICk7CiAgICAgICAgaWYoIG5SZXN1bHQgKQogICAgICAgICAgICBTZXRFcnJvcig6OkdldFN2RXJyb3IoblJlc3VsdCkgKTsKICAgIH0KICAgIHJldHVybiBuQ291bnQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnwqCnwqICAgIFN2RmlsZVN0cmVhbTo6UHV0RGF0YSgpCnwqCnwqICAgIEJlc2NocmVpYnVuZyAgICAgIFNUUkVBTS5TRFcKfCogICAgRXJzdGVyc3RlbGx1bmcgICAgT1YgMTUuMDYuOTQKfCogICAgTGV0enRlIEFlbmRlcnVuZyAgT1YgMTUuMDYuOTQKfCoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnNhbF91SW50UHRyIFN2RmlsZVN0cmVhbTo6UHV0RGF0YSggY29uc3Qgdm9pZCogcERhdGEsIHNhbF91SW50UHRyIG5TaXplICkKewojaWZkZWYgREJHX1VUSUwKICAgIEJ5dGVTdHJpbmcgYVRyYWNlU3RyKCAiU3ZGaWxlU3RyZWFuOjpQdXREYXRhOiAiICk7CiAgICBhVHJhY2VTdHIgKz0gQnl0ZVN0cmluZzo6Q3JlYXRlRnJvbUludDY0KG5TaXplKTsKICAgIGFUcmFjZVN0ciArPSAiIEJ5dGVzIHRvICI7CiAgICBhVHJhY2VTdHIgKz0gQnl0ZVN0cmluZyhhRmlsZW5hbWUsIG9zbF9nZXRUaHJlYWRUZXh0RW5jb2RpbmcoKSk7CiAgICBEQkdfVFJBQ0UoIGFUcmFjZVN0ci5HZXRCdWZmZXIoKSApOwojZW5kaWYKCiAgICBzYWxfdUludFB0ciBuQ291bnQgPSAwTDsKICAgIGlmKCBJc09wZW4oKSApCiAgICB7CiAgICAgICAgQVBJUkVUIG5SZXN1bHQ7CiAgICAgICAgblJlc3VsdCA9IERvc1dyaXRlKCBwSW5zdGFuY2VEYXRhLT5oRmlsZSwoUFZPSUQpcERhdGEsblNpemUsJm5Db3VudCApOwogICAgICAgIGlmKCBuUmVzdWx0ICkKICAgICAgICAgICAgU2V0RXJyb3IoOjpHZXRTdkVycm9yKG5SZXN1bHQpICk7CiAgICAgICAgZWxzZSBpZiggIW5Db3VudCApCiAgICAgICAgICAgIFNldEVycm9yKCBTVlNUUkVBTV9ESVNLX0ZVTEwgKTsKICAgIH0KICAgIHJldHVybiBuQ291bnQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnwqCnwqICAgIFN2RmlsZVN0cmVhbTo6U2Vla1BvcygpCnwqCnwqICAgIEJlc2NocmVpYnVuZyAgICAgIFNUUkVBTS5TRFcKfCogICAgRXJzdGVyc3RlbGx1bmcgICAgT1YgMTUuMDYuOTQKfCogICAgTGV0enRlIEFlbmRlcnVuZyAgT1YgMTUuMDYuOTQKfCoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnNhbF91SW50UHRyIFN2RmlsZVN0cmVhbTo6U2Vla1Bvcyggc2FsX3VJbnRQdHIgblBvcyApCnsKICAgIHNhbF91SW50UHRyIG5OZXdQb3MgPSAwTDsKICAgIGlmKCBJc09wZW4oKSApCiAgICB7CiAgICAgICAgQVBJUkVUIG5SZXN1bHQ7CgogICAgICAgIGlmKCBuUG9zICE9IFNUUkVBTV9TRUVLX1RPX0VORCApCiAgICAgICAgICAgIG5SZXN1bHQgPSBEb3NTZXRGaWxlUHRyKCBwSW5zdGFuY2VEYXRhLT5oRmlsZSwobG9uZyluUG9zLAogICAgICAgICAgICAgICAgIEZJTEVfQkVHSU4sICZuTmV3UG9zICk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBuUmVzdWx0ID0gRG9zU2V0RmlsZVB0ciggcEluc3RhbmNlRGF0YS0+aEZpbGUsMEwsCiAgICAgICAgICAgICAgICAgRklMRV9FTkQsICZuTmV3UG9zICk7CgogICAgICAgIGlmKCBuUmVzdWx0ICkKICAgICAgICAgICAgU2V0RXJyb3IoOjpHZXRTdkVycm9yKG5SZXN1bHQpICk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgU2V0RXJyb3IoIFNWU1RSRUFNX0dFTkVSQUxFUlJPUiApOwogICAgcmV0dXJuIG5OZXdQb3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnwqCnwqICAgIFN2RmlsZVN0cmVhbTo6VGVsbCgpCnwqCnwqICAgIEJlc2NocmVpYnVuZyAgICAgIFNUUkVBTS5TRFcKfCogICAgRXJzdGVyc3RlbGx1bmcgICAgT1YgMTUuMDYuOTQKfCogICAgTGV0enRlIEFlbmRlcnVuZyAgT1YgMTUuMDYuOTQKfCoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKc2FsX3VJbnRQdHIgU3ZGaWxlU3RyZWFtOjpUZWxsKCkKewogICAgc2FsX3VJbnRQdHIgblBvcyA9IDBMOwoKICAgIGlmKCBJc09wZW4oKSApCiAgICB7CiAgICAgICAgQVBJUkVUIG5SZXN1bHQ7CiAgICAgICAgblJlc3VsdCA9IERvc1NldEZpbGVQdHIocEluc3RhbmNlRGF0YS0+aEZpbGUsMEwsRklMRV9DVVJSRU5ULCZuUG9zKTsKICAgICAgICBpZiggblJlc3VsdCApCiAgICAgICAgICAgIFNldEVycm9yKDo6R2V0U3ZFcnJvcihuUmVzdWx0KSApOwogICAgfQogICAgcmV0dXJuIG5Qb3M7Cn0KKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnwqCnwqICAgIFN2RmlsZVN0cmVhbTo6Rmx1c2hEYXRhKCkKfCoKfCogICAgQmVzY2hyZWlidW5nICAgICAgU1RSRUFNLlNEVwp8KiAgICBFcnN0ZXJzdGVsbHVuZyAgICBPViAxNS4wNi45NAp8KiAgICBMZXR6dGUgQWVuZGVydW5nICBPViAxNS4wNi45NAp8KgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBTdkZpbGVTdHJlYW06OkZsdXNoRGF0YSgpCnsKICAgIGlmKCBJc09wZW4oKSApCiAgICB7CiAgICAgICAgQVBJUkVUIG5SZXN1bHQ7CiAgICAgICAgblJlc3VsdCA9IERvc1Jlc2V0QnVmZmVyKHBJbnN0YW5jZURhdGEtPmhGaWxlICk7CiAgICAgICAgaWYoIG5SZXN1bHQgKQogICAgICAgICAgICBTZXRFcnJvcig6OkdldFN2RXJyb3IoblJlc3VsdCkgKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKfCoKfCogICAgU3ZGaWxlU3RyZWFtOjpMb2NrUmFuZ2UoKQp8Kgp8KiAgICBCZXNjaHJlaWJ1bmcgICAgICBTVFJFQU0uU0RXCnwqICAgIEVyc3RlcnN0ZWxsdW5nICAgIE9WIDE1LjA2Ljk0CnwqICAgIExldHp0ZSBBZW5kZXJ1bmcgIE9WIDE1LjA2Ljk0CnwqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzYWxfQm9vbCBTdkZpbGVTdHJlYW06OkxvY2tSYW5nZSggc2FsX3VJbnRQdHIgbkJ5dGVPZmZzZXQsIHNhbF91SW50UHRyIG5CeXRlcyApCnsKICAgIHNhbF9Cb29sIGJSZXRWYWwgPSBzYWxfRmFsc2U7CiAgICBpZiggSXNPcGVuKCkgKQogICAgewogICAgICAgIEFQSVJFVCAgIG5SZXN1bHQ7CiAgICAgICAgRklMRUxPQ0sgYUxvY2tBcmVhLCBhVW5sb2NrQXJlYTsKICAgICAgICBhVW5sb2NrQXJlYS5sT2Zmc2V0ID0gMEw7CiAgICAgICAgYVVubG9ja0FyZWEubFJhbmdlICAgICAgPSAwTDsKICAgICAgICBhTG9ja0FyZWEubE9mZnNldCAgICAgICA9IChsb25nKW5CeXRlT2Zmc2V0OwogICAgICAgIGFMb2NrQXJlYS5sUmFuZ2UgICAgICAgID0gKGxvbmcpbkJ5dGVzOwoKICAgICAgICBuUmVzdWx0ID0gRG9zU2V0RmlsZUxvY2tzKHBJbnN0YW5jZURhdGEtPmhGaWxlLAogICAgICAgICAgICAmYVVubG9ja0FyZWEsICZhTG9ja0FyZWEsCiAgICAgICAgICAgIDEwMDBVTCwgIC8vIFplaXQgaW4gbXMgYmlzIEFiYnJ1Y2gKICAgICAgICAgICAgMEwgICAgICAgLy8ga2VpbiBBdG9taWMtTG9jawogICAgICAgICk7CgogICAgICAgIGlmKCBuUmVzdWx0ICkKICAgICAgICAgICAgU2V0RXJyb3IoOjpHZXRTdkVycm9yKG5SZXN1bHQpICk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBiUmV0VmFsID0gc2FsX1RydWU7CiAgICB9CiAgICByZXR1cm4gYlJldFZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKfCoKfCogICAgU3ZGaWxlU3RyZWFtOjpVbmxvY2tSYW5nZSgpCnwqCnwqICAgIEJlc2NocmVpYnVuZyAgICAgIFNUUkVBTS5TRFcKfCogICAgRXJzdGVyc3RlbGx1bmcgICAgT1YgMTUuMDYuOTQKfCogICAgTGV0enRlIEFlbmRlcnVuZyAgT1YgMTUuMDYuOTQKfCoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnNhbF9Cb29sIFN2RmlsZVN0cmVhbTo6VW5sb2NrUmFuZ2UoIHNhbF91SW50UHRyIG5CeXRlT2Zmc2V0LCBzYWxfdUludFB0ciBuQnl0ZXMgKQp7CiAgICBzYWxfQm9vbCBiUmV0VmFsID0gc2FsX0ZhbHNlOwogICAgaWYoIElzT3BlbigpICkKICAgIHsKICAgICAgICBBUElSRVQgICBuUmVzdWx0OwogICAgICAgIEZJTEVMT0NLIGFMb2NrQXJlYSwgYVVubG9ja0FyZWE7CiAgICAgICAgYUxvY2tBcmVhLmxPZmZzZXQgICAgICAgPSAwTDsKICAgICAgICBhTG9ja0FyZWEubFJhbmdlICAgICAgICA9IDBMOwogICAgICAgIGFVbmxvY2tBcmVhLmxPZmZzZXQgPSAobG9uZyluQnl0ZU9mZnNldDsKICAgICAgICBhVW5sb2NrQXJlYS5sUmFuZ2UgICAgICA9IChsb25nKW5CeXRlczsKCiAgICAgICAgblJlc3VsdCA9IERvc1NldEZpbGVMb2NrcyhwSW5zdGFuY2VEYXRhLT5oRmlsZSwKICAgICAgICAgICAgJmFVbmxvY2tBcmVhLCAmYUxvY2tBcmVhLAogICAgICAgICAgICAxMDAwVUwsICAvLyBaZWl0IGluIG1zIGJpcyBBYmJydWNoCiAgICAgICAgICAgIDBMICAgICAgIC8vIGtlaW4gQXRvbWljLUxvY2sKICAgICAgICApOwoKICAgICAgICBpZiggblJlc3VsdCApCiAgICAgICAgICAgIFNldEVycm9yKDo6R2V0U3ZFcnJvcihuUmVzdWx0KSApOwogICAgICAgIGVsc2UKICAgICAgICAgICAgYlJldFZhbCA9IHNhbF9UcnVlOwogICAgfQogICAgcmV0dXJuIGJSZXRWYWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnwqCnwqICAgIFN2RmlsZVN0cmVhbTo6TG9ja0ZpbGUoKQp8Kgp8KiAgICBCZXNjaHJlaWJ1bmcgICAgICBTVFJFQU0uU0RXCnwqICAgIEVyc3RlcnN0ZWxsdW5nICAgIE9WIDE1LjA2Ljk0CnwqICAgIExldHp0ZSBBZW5kZXJ1bmcgIE9WIDE1LjA2Ljk0CnwqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzYWxfQm9vbCBTdkZpbGVTdHJlYW06OkxvY2tGaWxlKCkKewogICAgc2FsX0Jvb2wgYlJldFZhbCA9IHNhbF9GYWxzZTsKICAgIGlmKCAhbkxvY2tDb3VudGVyICkKICAgIHsKICAgICAgICBpZiggTG9ja1JhbmdlKCAwTCwgTE9OR19NQVggKSApCiAgICAgICAgewogICAgICAgICAgICBuTG9ja0NvdW50ZXIgPSAxOwogICAgICAgICAgICBiUmV0VmFsID0gc2FsX1RydWU7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG5Mb2NrQ291bnRlcisrOwogICAgICAgIGJSZXRWYWwgPSBzYWxfVHJ1ZTsKICAgIH0KICAgIHJldHVybiBiUmV0VmFsOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp8Kgp8KiAgICBTdkZpbGVTdHJlYW06OlVubG9ja0ZpbGUoKQp8Kgp8KiAgICBCZXNjaHJlaWJ1bmcgICAgICBTVFJFQU0uU0RXCnwqICAgIEVyc3RlcnN0ZWxsdW5nICAgIE9WIDE1LjA2Ljk0CnwqICAgIExldHp0ZSBBZW5kZXJ1bmcgIE9WIDE1LjA2Ljk0CnwqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzYWxfQm9vbCBTdkZpbGVTdHJlYW06OlVubG9ja0ZpbGUoKQp7CiAgICBzYWxfQm9vbCBiUmV0VmFsID0gc2FsX0ZhbHNlOwogICAgaWYoIG5Mb2NrQ291bnRlciA+IDApCiAgICB7CiAgICAgICAgaWYoIG5Mb2NrQ291bnRlciA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIFVubG9ja1JhbmdlKCAwTCwgTE9OR19NQVggKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5Mb2NrQ291bnRlciA9IDA7CiAgICAgICAgICAgICAgICBiUmV0VmFsID0gc2FsX1RydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbkxvY2tDb3VudGVyLS07CiAgICAgICAgICAgIGJSZXRWYWwgPSBzYWxfVHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYlJldFZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKfCoKfCogICAgU3ZGaWxlU3RyZWFtOjpPcGVuKCkKfCoKfCogICAgQmVzY2hyZWlidW5nICAgICAgU1RSRUFNLlNEVwp8KiAgICBFcnN0ZXJzdGVsbHVuZyAgICBPViAxNS4wNi45NAp8KiAgICBMZXR6dGUgQWVuZGVydW5nICBPViAxNS4wNi45NAp8KgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIDAKc2FsX0Jvb2wgY3JlYXRlTG9uZ05hbWVFQSAgICggY29uc3QgUENTWiBwc3pQYXRoLCBzYWxfdUludFB0ciB1bEF0dHJpYnV0ZXMsIGNvbnN0IFN0cmluZyYgYUxvbmdOYW1lICk7CiNlbmRpZgoKdm9pZCBTdkZpbGVTdHJlYW06Ok9wZW4oIGNvbnN0IFN0cmluZyYgckZpbGVuYW1lLCBTdHJlYW1Nb2RlIG5PcGVuTW9kZSApCnsKICAgICAgICBTdHJpbmcgYVBhcnNlZEZpbGVuYW1lOwoKI2lmIDAKICAgICAgICBpZiAgICAgICggRm9sZGVyOjpJc0F2YWlsYWJsZSgpICYmIChyRmlsZW5hbWUuU2VhcmNoKCd7JykgPCA5KSApCiAgICAgICAgewogICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgIGFWaXJ0dWFsUGFydDsKICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgICBhUmVhbFBhcnQ7CiAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgYVZpcnR1YWxQYXRoOwogICAgICAgICAgICAgICAgSXRlbUlEUGF0aCAgICAgIGFWaXJ0dWFsVVJMOwogICAgICAgICAgICAgICAgc2FsX3VJbnRQdHIgICAgICAgICAgIG5EaXZpZGVyID0gMDsKCiAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgYVZpcnR1YWxTdHJpbmcockZpbGVuYW1lKTsKCiAgICAgICAgICAgICAgICBmb3IgKGludCB4PWFWaXJ0dWFsU3RyaW5nLkxlbigpOyB4PjA7IHgtLSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFWaXJ0dWFsU3RyaW5nLkNvcHkoeCwxKS5Db21wYXJlKCJ9Iik9PUNPTVBBUkVfRVFVQUwpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRGl2aWRlciA9IHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBhVmlydHVhbFBhcnQgPSBhVmlydHVhbFN0cmluZy5Db3B5KDAsbkRpdmlkZXIrMSk7CiAgICAgICAgICAgICAgICBhUmVhbFBhcnQgPSBhVmlydHVhbFN0cmluZy5Db3B5KG5EaXZpZGVyKzIpOwoKICAgICAgICAgICAgICAgIGFWaXJ0dWFsVVJMICA9IGFWaXJ0dWFsUGFydDsKICAgICAgICAgICAgICAgIGFWaXJ0dWFsUGF0aCA9IGFWaXJ0dWFsVVJMLkdldEhvc3ROb3RhdGlvblBhdGgoKTsKCiAgICAgICAgICAgICAgICBEaXJFbnRyeSBhVGVtcERpckVudHJ5KGFWaXJ0dWFsUGF0aCk7CgogICAgICAgICAgICAgICAgYVRlbXBEaXJFbnRyeSArPSBhUmVhbFBhcnQ7CgogICAgICAgICAgICAgICAgYVBhcnNlZEZpbGVuYW1lID0gYVRlbXBEaXJFbnRyeS5HZXRGdWxsKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKI2VuZGlmIC8vIDAKICAgICAgICB7CiAgICAgICAgICAgICAgICBhUGFyc2VkRmlsZW5hbWUgPSByRmlsZW5hbWU7CiAgICAgICAgfQoKICAgIENsb3NlKCk7CiAgICBTdlN0cmVhbTo6Q2xlYXJCdWZmZXIoKTsKCiAgICBzYWxfdUludFB0ciAgIG5BY3Rpb25UYWtlbjsKICAgIHNhbF91SW50UHRyICAgbk9wZW5BY3Rpb24gICAgID0gMEw7CiAgICBzYWxfdUludFB0ciAgIG5TaGFyZUJpdHMgICAgICA9IDBMOwogICAgc2FsX3VJbnRQdHIgICBuUmVhZFdyaXRlQml0cyAgPSAwTDsKCiAgICBlU3RyZWFtTW9kZSA9IG5PcGVuTW9kZTsKICAgIGVTdHJlYW1Nb2RlICY9IH5TVFJFQU1fVFJVTkM7IC8vIGJlaW0gUmVPcGVuIG5pY2h0IGN1dHRlbgoKICAgIG5PcGVuTW9kZSB8PSBTVFJFQU1fU0hBUkVfREVOWU5PTkU7ICAvLyBkZWZpbmllcnRlbiBadXN0YW5kIGdhcmFudGllcmVuCgogICAgLy8gKioqKioqKioqIFp1Z3JpZmZzZmxhZ3MgKioqKioqKioqKioKICAgIGlmKCBuT3Blbk1vZGUgJiBTVFJFQU1fU0hBUkVfREVOWU5PTkUpCiAgICAgICAgblNoYXJlQml0cyA9IE9QRU5fU0hBUkVfREVOWU5PTkU7CgogICAgaWYoIG5PcGVuTW9kZSAmIFNUUkVBTV9TSEFSRV9ERU5ZUkVBRCkKICAgICAgICBuU2hhcmVCaXRzID0gT1BFTl9TSEFSRV9ERU5ZUkVBRDsKCiAgICBpZiggbk9wZW5Nb2RlICYgU1RSRUFNX1NIQVJFX0RFTllXUklURSkKICAgICAgICBuU2hhcmVCaXRzID0gT1BFTl9TSEFSRV9ERU5ZV1JJVEU7CgogICAgaWYoIG5PcGVuTW9kZSAmIFNUUkVBTV9TSEFSRV9ERU5ZQUxMKQogICAgICAgIG5TaGFyZUJpdHMgPSBPUEVOX1NIQVJFX0RFTllSRUFEV1JJVEU7CgogICAgICAgIGlmKCAobk9wZW5Nb2RlICYgU1RSRUFNX1JFQUQpICkKICAgIHsKICAgICAgICBpZiggbk9wZW5Nb2RlICYgU1RSRUFNX1dSSVRFICkKICAgICAgICAgICAgblJlYWRXcml0ZUJpdHMgfD0gT1BFTl9BQ0NFU1NfUkVBRFdSSVRFOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIG5SZWFkV3JpdGVCaXRzIHw9IE9QRU5fQUNDRVNTX1JFQURPTkxZOwogICAgICAgICAgICBuT3Blbk1vZGUgfD0gU1RSRUFNX05PQ1JFQVRFOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICBuUmVhZFdyaXRlQml0cyB8PSBPUEVOX0FDQ0VTU19XUklURU9OTFk7CgoKICAgIGlmKCBuT3Blbk1vZGUgJiBTVFJFQU1fTk9DUkVBVEUgKQogICAgewogICAgICAgIC8vIERhdGVpIG5pY2h0IGVyemV1Z2VuCiAgICAgICAgbk9wZW5BY3Rpb24gPSBPUEVOX0FDVElPTl9GQUlMX0lGX05FVyB8IE9QRU5fQUNUSU9OX09QRU5fSUZfRVhJU1RTOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vIERhdGVpIGVyemV1Z2VuLCB3ZW5uIG5pY2h0IHZvcmhhbmRlbgogICAgICAgIG5PcGVuQWN0aW9uID0gT1BFTl9BQ1RJT05fQ1JFQVRFX0lGX05FVzsKICAgICAgICBpZiggbk9wZW5Nb2RlICYgU1RSRUFNX1RSVU5DICkKICAgICAgICAgICAgLy8gQXVmIE51bGxhZW5nZSBrdWVyemVuLCB3ZW5uIGV4aXN0aWVydAogICAgICAgICAgICBuT3BlbkFjdGlvbiB8PSBPUEVOX0FDVElPTl9SRVBMQUNFX0lGX0VYSVNUUzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIC8vIEluaGFsdCBkZXIgRGF0ZWkgbmljaHQgd2Vnd2VyZmVuCiAgICAgICAgICAgIG5PcGVuQWN0aW9uIHw9IE9QRU5fQUNUSU9OX09QRU5fSUZfRVhJU1RTOwogICAgfQoKI2lmIDAgLy8gWUQKCS8vCgkvLyByZXNvbHZlcyBsb25nIEZBVCBuYW1lcyB1c2VkIGJ5IE9TMgoJLy8KCXNhbF9Cb29sIGJJc0xvbmdPUzI9c2FsX0ZhbHNlOwoJaWYgKEZvbGRlcjo6SXNBdmFpbGFibGUoKSkKCXsKCQlEaXJFbnRyeSBhRGlyRW50cnkockZpbGVuYW1lKTsKCQlpZiAgKGFEaXJFbnRyeS5Jc0xvbmdOYW1lT25GQVQoKSkKCQl7CgkJCS8vIGluIGt1cnplbiBQZmFkIHdhbmRlbG4KCQkJSXRlbUlEUGF0aCAgICAgIGFJdGVtSURQYXRoKHJGaWxlbmFtZSk7CgkJCWFQYXJzZWRGaWxlbmFtZSA9IGFJdGVtSURQYXRoLkdldEhvc3ROb3RhdGlvblBhdGgoKTsKCQkJYklzTG9uZ09TMiA9IHNhbF9UcnVlOwoJCX0KCX0KI2VuZGlmCgoJYUZpbGVuYW1lID0gYVBhcnNlZEZpbGVuYW1lOwoJQnl0ZVN0cmluZyBhRmlsZU5hbWVBKCBhRmlsZW5hbWUsIGdzbF9nZXRTeXN0ZW1UZXh0RW5jb2RpbmcoKSk7CglGU3lzUmVkaXJlY3Rvcjo6RG9SZWRpcmVjdCggYUZpbGVuYW1lICk7CgojaWZkZWYgREJHX1VUSUwKCUJ5dGVTdHJpbmcgYVRyYWNlU3RyKCAiU3ZGaWxlU3RyZWFtOjpPcGVuKCk6ICIgKTsKCWFUcmFjZVN0ciArPSAgYUZpbGVOYW1lQTsKCURCR19UUkFDRSggYVRyYWNlU3RyLkdldEJ1ZmZlcigpICk7CiNlbmRpZgoKICAgIEFQSVJFVCBuUmV0ID0gRG9zT3BlbiggYUZpbGVOYW1lQS5HZXRCdWZmZXIoKSwgJnBJbnN0YW5jZURhdGEtPmhGaWxlLAogICAgJm5BY3Rpb25UYWtlbiwgMEwsIEZJTEVfTk9STUFMLCBuT3BlbkFjdGlvbiwKICAgIG5SZWFkV3JpdGVCaXRzIHwgblNoYXJlQml0cyB8IE9QRU5fRkxBR1NfTk9JTkhFUklULCAwTCk7CgogICAgaWYoIG5SZXQgPT0gRVJST1JfVE9PX01BTllfT1BFTl9GSUxFUyApCiAgICB7CgkJbG9uZyBuVG9BZGQgPSAxMDsKCQlzYWxfdUludFB0ciBuQ3VyTWF4Rkg7CgkJblJldCA9IERvc1NldFJlbE1heEZIKCAmblRvQWRkLCAmbkN1ck1heEZIICk7CgkJblJldCA9IERvc09wZW4oIGFGaWxlTmFtZUEuR2V0QnVmZmVyKCksICZwSW5zdGFuY2VEYXRhLT5oRmlsZSwKCQkmbkFjdGlvblRha2VuLCAwTCwgRklMRV9OT1JNQUwsIG5PcGVuQWN0aW9uLAoJCW5SZWFkV3JpdGVCaXRzIHwgblNoYXJlQml0cyB8IE9QRU5fRkxBR1NfTk9JTkhFUklULCAwTCk7CiAgICB9CgogICAgLy8gQmVpIEZlaGxlciBwcnVlZmVuLCBvYiB3aXIgbGVzZW4gZHVlcmZlbgogICAgaWYoIG5SZXQ9PUVSUk9SX0FDQ0VTU19ERU5JRUQgfHwgblJldD09RVJST1JfU0hBUklOR19WSU9MQVRJT04gKQogICAgewogICAgICAgIG5SZWFkV3JpdGVCaXRzID0gT1BFTl9BQ0NFU1NfUkVBRE9OTFk7CiAgICAgICAgblJldCA9IERvc09wZW4oIGFGaWxlTmFtZUEuR2V0QnVmZmVyKCksICZwSW5zdGFuY2VEYXRhLT5oRmlsZSwKICAgICAgICAgICAgJm5BY3Rpb25UYWtlbiwgMEwsIEZJTEVfTk9STUFMLCBuT3BlbkFjdGlvbiwKICAgICAgICAgICAgblJlYWRXcml0ZUJpdHMgfCBuU2hhcmVCaXRzIHwgT1BFTl9GTEFHU19OT0lOSEVSSVQsIDBMKTsKICAgIH0KCiAgICAgICAgaWYoIG5SZXQgKQogICAgewogICAgICAgIGJJc09wZW4gPSBzYWxfRmFsc2U7CiAgICAgICAgU2V0RXJyb3IoOjpHZXRTdkVycm9yKG5SZXQpICk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgYklzT3BlbiAgICAgPSBzYWxfVHJ1ZTsKICAgICAgICBwSW5zdGFuY2VEYXRhLT5iSXNFb2YgPSBzYWxfRmFsc2U7CiAgICAgICAgaWYoIG5SZWFkV3JpdGVCaXRzICE9IE9QRU5fQUNDRVNTX1JFQURPTkxZICkKICAgICAgICAgICAgYklzV3JpdGFibGUgPSBzYWxfVHJ1ZTsKICAgIH0KCiNpZiAwCglpZiAoYklzT3BlbiAmJiBiSXNMb25nT1MyKQoJewoJCS8vZmlsZSBzY2hsaWXfZW4sIGRhIHNvbnN0IGNyZWF0ZUxvbmdOYW1lIHUuVS4gbmljaHQgbfZnbGljaAoJCUNsb3NlKCk7CgoJCS8vIGVyemV1Z3RlbSBGaWxlIGxhbmdlbiBOYW1lbiBnZWJlbgoJCURpckVudHJ5IGFEaXJFbnRyeShyRmlsZW5hbWUpOwoJCWNyZWF0ZUxvbmdOYW1lRUEoYUZpbGVOYW1lQS5HZXRCdWZmZXIoKSwgIEZJTEVfTk9STUFMLCBhRGlyRW50cnkuR2V0TmFtZSgpKTsKCgkJLy8gdW5kIHdpZWRlciBvZWZmbmVuCgkJUmVPcGVuKCk7CQkKCX0KI2VuZGlmCgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp8Kgp8KiAgICBTdkZpbGVTdHJlYW06OlJlT3BlbigpCnwqCnwqICAgIEJlc2NocmVpYnVuZyAgICAgIFNUUkVBTS5TRFcKfCogICAgRXJzdGVyc3RlbGx1bmcgICAgT1YgMTUuMDYuOTQKfCogICAgTGV0enRlIEFlbmRlcnVuZyAgT1YgMTUuMDYuOTQKfCoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgU3ZGaWxlU3RyZWFtOjpSZU9wZW4oKQp7CiAgICBpZiggIWJJc09wZW4gJiYgYUZpbGVuYW1lLkxlbigpICkKICAgICAgICBPcGVuKCBhRmlsZW5hbWUsIGVTdHJlYW1Nb2RlICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnwqCnwqICAgIFN2RmlsZVN0cmVhbTo6Q2xvc2UoKQp8Kgp8KiAgICBCZXNjaHJlaWJ1bmcgICAgICBTVFJFQU0uU0RXCnwqICAgIEVyc3RlcnN0ZWxsdW5nICAgIE9WIDE1LjA2Ljk0CnwqICAgIExldHp0ZSBBZW5kZXJ1bmcgIE9WIDE1LjA2Ljk0CnwqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIFN2RmlsZVN0cmVhbTo6Q2xvc2UoKQp7CiAgICBpZiggSXNPcGVuKCkgKQogICAgewojaWZkZWYgREJHX1VUSUwKICAgICAgICBCeXRlU3RyaW5nIGFUcmFjZVN0ciggIlN2RmlsZVN0cmVhbTo6Q2xvc2UoKTogIiApOwogICAgICAgIGFUcmFjZVN0ciArPSBCeXRlU3RyaW5nKGFGaWxlbmFtZSwgb3NsX2dldFRocmVhZFRleHRFbmNvZGluZygpKTsKICAgICAgICBEQkdfVFJBQ0UoIGFUcmFjZVN0ci5HZXRCdWZmZXIoKSApOwojZW5kaWYKCiAgICAgICAgaWYoIG5Mb2NrQ291bnRlciApCiAgICAgICAgewogICAgICAgICAgICBuTG9ja0NvdW50ZXIgPSAxOwogICAgICAgICAgICBVbmxvY2tGaWxlKCk7CiAgICAgICAgfQogICAgICAgIEZsdXNoKCk7CiAgICAgICAgRG9zQ2xvc2UoIHBJbnN0YW5jZURhdGEtPmhGaWxlICk7CiAgICB9CgogICAgYklzT3BlbiAgICAgPSBzYWxfRmFsc2U7CiAgICBuTG9ja0NvdW50ZXI9IDA7CiAgICBiSXNXcml0YWJsZSA9IHNhbF9GYWxzZTsKICAgIHBJbnN0YW5jZURhdGEtPmJJc0VvZiA9IHNhbF9UcnVlOwogICAgU3ZTdHJlYW06OkNsZWFyQnVmZmVyKCk7CiAgICBTdlN0cmVhbTo6Q2xlYXJFcnJvcigpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp8Kgp8KiAgICBTdkZpbGVTdHJlYW06OlJlc2V0RXJyb3IoKQp8Kgp8KiAgICBCZXNjaHJlaWJ1bmcgICAgICBTVFJFQU0uU0RXOyBTZXR6dCBGaWxlcG9pbnRlciBhdWYgRGF0ZWlhbmZhbmcKfCogICAgRXJzdGVyc3RlbGx1bmcgICAgT1YgMTUuMDYuOTQKfCogICAgTGV0enRlIEFlbmRlcnVuZyAgT1YgMTUuMDYuOTQKfCoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgU3ZGaWxlU3RyZWFtOjpSZXNldEVycm9yKCkKewogICAgU3ZTdHJlYW06OkNsZWFyRXJyb3IoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKfCoKfCogICAgU3ZGaWxlU3RyZWFtOjpTZXRTaXplKCkKfCoKfCogICAgQmVzY2hyZWlidW5nCnwqICAgIEVyc3RlcnN0ZWxsdW5nICAgIE9WIDE5LjEwLjk1CnwqICAgIExldHp0ZSBBZW5kZXJ1bmcgIE9WIDE5LjEwLjk1CnwqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIFN2RmlsZVN0cmVhbTo6U2V0U2l6ZSggc2FsX3VJbnRQdHIgblNpemUgKQp7CiAgICBpZiggSXNPcGVuKCkgKQogICAgewogICAgICAgIEFQSVJFVCBuUmV0ID0gRG9zU2V0RmlsZVNpemUoIHBJbnN0YW5jZURhdGEtPmhGaWxlLCBuU2l6ZSApOwogICAgICAgIGlmKCBuUmV0ICkKICAgICAgICAgICAgU2V0RXJyb3IoIDo6R2V0U3ZFcnJvciggblJldCApICk7CiAgICB9Cn0K