Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gRGVzY3JpcHRpb246Ci8vCi8vIFRoaXMgZmlsZSBpcyBmb3IgUlRMODcyM0EgQ28tZXhpc3QgbWVjaGFuaXNtCi8vCi8vIEhpc3RvcnkKLy8gMjAxMi8wOC8yMiBDb3NhIGZpcnN0IGNoZWNrIGluLgovLyAyMDEyLzExLzE0IENvc2EgUmV2aXNlIGZvciA4NzIzQSAxQW50IG91dCBzb3VyY2luZy4KLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGluY2x1ZGUgZmlsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KI2luY2x1ZGUgIk1wX1ByZWNvbXAuaCIKI2lmKEJUXzMwX1NVUFBPUlQgPT0gMSkKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gR2xvYmFsIHZhcmlhYmxlcywgdGhlc2UgYXJlIHN0YXRpYyB2YXJpYWJsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc3RhdGljIENPRVhfRE1fODcyM0FfMUFOVAlHTENvZXhEbTg3MjNhMUFudDsKc3RhdGljIFBDT0VYX0RNXzg3MjNBXzFBTlQgCXBDb2V4RG09JkdMQ29leERtODcyM2ExQW50OwpzdGF0aWMgQ09FWF9TVEFfODcyM0FfMUFOVAlHTENvZXhTdGE4NzIzYTFBbnQ7CnN0YXRpYyBQQ09FWF9TVEFfODcyM0FfMUFOVAlwQ29leFN0YT0mR0xDb2V4U3RhODcyM2ExQW50OwoKY29uc3QgY2hhciAqY29uc3QgR0xCdEluZm9TcmM4NzIzYTFBbnRbXT17CgkiQlQgSW5mb1t3aWZpIGZ3XSIsCgkiQlQgSW5mb1tidCByc3BdIiwKCSJCVCBJbmZvW2J0IGF1dG8gcmVwb3J0XSIsCn07CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBsb2NhbCBmdW5jdGlvbiBwcm90byB0eXBlIGlmIG5lZWRlZAovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGhhbGJ0Yzg3MjNhMWFudF8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVk9JRApoYWxidGM4NzIzYTFhbnRfUmVnMHg1NTBCaXQzKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJTZXQKCSkKewoJdTFCeXRlCXUxdG1wPTA7CgkKCXUxdG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg1NTApOwoJaWYoYlNldCkKCXsKCQl1MXRtcCB8PSBCSVQzOwoJfQoJZWxzZQoJewoJCXUxdG1wICY9IH5CSVQzOwoJfQoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NTUwLCB1MXRtcCk7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHNldCAweDU1MFszXT0lZFxuIiwgKGJTZXQ/IDE6MCkpKTsKfQoKVk9JRApoYWxidGM4NzIzYTFhbnRfTm90aWZ5RndTY2FuKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJc2NhblR5cGUKCSkKewoJdTFCeXRlCQkJSDJDX1BhcmFtZXRlclsxXSA9ezB9OwoJCglpZihCVENfU0NBTl9TVEFSVCA9PSBzY2FuVHlwZSkKCQlIMkNfUGFyYW1ldGVyWzBdID0gMHgxOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBOb3RpZnkgRlcgZm9yIHdpZmkgc2Nhbiwgd3JpdGUgMHgzYj0weCV4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4M2IsIDEsIEgyQ19QYXJhbWV0ZXIpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMWFudF9RdWVyeUJ0SW5mbygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgoJcENvZXhTdGEtPmJDMmhCdEluZm9SZXFTZW50ID0gdHJ1ZTsKCglIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDA7CS8vIHRyaWdnZXIKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgUXVlcnkgQnQgSW5mbywgRlcgd3JpdGUgMHgzOD0weCV4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MzgsIDEsIEgyQ19QYXJhbWV0ZXIpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMWFudF9TZXRTd1JmUnhMcGZDb3JuZXIoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYlJ4UmZTaHJpbmtPbgoJKQp7CglpZihiUnhSZlNocmlua09uKQoJewoJCS8vU2hyaW5rIFJGIFJ4IExQRiBjb3JuZXIKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgU2hyaW5rIFJGIFJ4IExQRiBjb3JuZXIhIVxuIikpOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDFlLCAweGZmZmZmLCAweGYwZmY3KTsKCX0KCWVsc2UKCXsKCQkvL1Jlc3VtZSBSRiBSeCBMUEYgY29ybmVyCgkJLy8gQWZ0ZXIgaW5pdGlhbGl6ZWQsIHdlIGNhbiB1c2UgcENvZXhEbS0+YnRSZjB4MWVCYWNrdXAKCQlpZihwQnRDb2V4aXN0LT5pbml0aWxpemVkKQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFJlc3VtZSBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKCQkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYsIHBDb2V4RG0tPmJ0UmYweDFlQmFja3VwKTsKCQl9Cgl9Cn0KClZPSUQKaGFsYnRjODcyM2ExYW50X1JmU2hyaW5rKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYlJ4UmZTaHJpbmtPbgoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gUnggUkYgU2hyaW5rID0gJXNcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYlJ4UmZTaHJpbmtPbik/ICJPTiI6Ik9GRiIpKSk7CglwQ29leERtLT5iQ3VyUmZSeExwZlNocmluayA9IGJSeFJmU2hyaW5rT247CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZVJmUnhMcGZTaHJpbms9JWQsIGJDdXJSZlJ4THBmU2hyaW5rPSVkXG4iLCAKCQkJcENvZXhEbS0+YlByZVJmUnhMcGZTaHJpbmssIHBDb2V4RG0tPmJDdXJSZlJ4THBmU2hyaW5rKSk7CgoJCWlmKHBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rID09IHBDb2V4RG0tPmJDdXJSZlJ4THBmU2hyaW5rKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODcyM2ExYW50X1NldFN3UmZSeExwZkNvcm5lcihwQnRDb2V4aXN0LCBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluayk7CgoJcENvZXhEbS0+YlByZVJmUnhMcGZTaHJpbmsgPSBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluazsKfQoKVk9JRApoYWxidGM4NzIzYTFhbnRfU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkxvd1BlbmFsdHlSYQoJKQp7Cgl1MUJ5dGUJdG1wVTE7CgoJdG1wVTEgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDRmZCk7Cgl0bXBVMSB8PSBCSVQwOwoJaWYoYkxvd1BlbmFsdHlSYSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgVHggcmF0ZSBhZGFwdGl2ZSwgc2V0IGxvdyBwZW5hbHR5ISFcbiIpKTsKCQl0bXBVMSAmPSB+QklUMjsKCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgVHggcmF0ZSBhZGFwdGl2ZSwgc2V0IG5vcm1hbCEhXG4iKSk7CgkJdG1wVTEgfD0gQklUMjsKCX0KCglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg0ZmQsIHRtcFUxKTsKfQoKVk9JRApoYWxidGM4NzIzYTFhbnRfTG93UGVuYWx0eVJhKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkxvd1BlbmFsdHlSYQoJKQp7CglyZXR1cm47CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gTG93UGVuYWx0eVJBID0gJXNcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkxvd1BlbmFsdHlSYSk/ICJPTiI6Ik9GRiIpKSk7CglwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhID0gYkxvd1BlbmFsdHlSYTsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlTG93UGVuYWx0eVJhPSVkLCBiQ3VyTG93UGVuYWx0eVJhPSVkXG4iLCAKCQkJcENvZXhEbS0+YlByZUxvd1BlbmFsdHlSYSwgcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSkpOwoKCQlpZihwQ29leERtLT5iUHJlTG93UGVuYWx0eVJhID09IHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4NzIzYTFhbnRfU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSk7CgoJcENvZXhEbS0+YlByZUxvd1BlbmFsdHlSYSA9IHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmE7Cn0KClZPSUQKaGFsYnRjODcyM2ExYW50X1NldENvZXhUYWJsZSgKCUlOCVBCVENfQ09FWElTVAlwQnRDb2V4aXN0LAoJSU4JdTRCeXRlCQl2YWwweDZjMCwKCUlOCXU0Qnl0ZQkJdmFsMHg2YzgsCglJTgl1MUJ5dGUJCXZhbDB4NmNjCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmMwPTB4JXhcbiIsIHZhbDB4NmMwKSk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzAsIHZhbDB4NmMwKTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjOD0weCV4XG4iLCB2YWwweDZjOCkpOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4NmM4LCB2YWwweDZjOCk7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Y2M9MHgleFxuIiwgdmFsMHg2Y2MpKTsKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDZjYywgdmFsMHg2Y2MpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMWFudF9Db2V4VGFibGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKCUlOCXU0Qnl0ZQkJCXZhbDB4NmMwLAoJSU4JdTRCeXRlCQkJdmFsMHg2YzgsCglJTgl1MUJ5dGUJCQl2YWwweDZjYwoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHdyaXRlIENvZXggVGFibGUgMHg2YzA9MHgleCwgMHg2Yzg9MHgleCwgMHg2Y2M9MHgleFxuIiwgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCB2YWwweDZjMCwgdmFsMHg2YzgsIHZhbDB4NmNjKSk7CglwQ29leERtLT5jdXJWYWwweDZjMCA9IHZhbDB4NmMwOwoJcENvZXhEbS0+Y3VyVmFsMHg2YzggPSB2YWwweDZjODsKCXBDb2V4RG0tPmN1clZhbDB4NmNjID0gdmFsMHg2Y2M7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlVmFsMHg2YzA9MHgleCwgcHJlVmFsMHg2Yzg9MHgleCwgcHJlVmFsMHg2Y2M9MHgleCAhIVxuIiwgCgkJCXBDb2V4RG0tPnByZVZhbDB4NmMwLCBwQ29leERtLT5wcmVWYWwweDZjOCwgcENvZXhEbS0+cHJlVmFsMHg2Y2MpKTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBjdXJWYWwweDZjMD0weCV4LCBjdXJWYWwweDZjOD0weCV4LCBjdXJWYWwweDZjYz0weCV4ICEhXG4iLCAKCQkJcENvZXhEbS0+Y3VyVmFsMHg2YzAsIHBDb2V4RG0tPmN1clZhbDB4NmM4LCBwQ29leERtLT5jdXJWYWwweDZjYykpOwoJCgkJaWYoIChwQ29leERtLT5wcmVWYWwweDZjMCA9PSBwQ29leERtLT5jdXJWYWwweDZjMCkgJiYKCQkJKHBDb2V4RG0tPnByZVZhbDB4NmM4ID09IHBDb2V4RG0tPmN1clZhbDB4NmM4KSAmJgoJCQkocENvZXhEbS0+cHJlVmFsMHg2Y2MgPT0gcENvZXhEbS0+Y3VyVmFsMHg2Y2MpICkKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODcyM2ExYW50X1NldENvZXhUYWJsZShwQnRDb2V4aXN0LCB2YWwweDZjMCwgdmFsMHg2YzgsIHZhbDB4NmNjKTsKCglwQ29leERtLT5wcmVWYWwweDZjMCA9IHBDb2V4RG0tPmN1clZhbDB4NmMwOwoJcENvZXhEbS0+cHJlVmFsMHg2YzggPSBwQ29leERtLT5jdXJWYWwweDZjODsKCXBDb2V4RG0tPnByZVZhbDB4NmNjID0gcENvZXhEbS0+Y3VyVmFsMHg2Y2M7Cn0KClZPSUQKaGFsYnRjODcyM2ExYW50X1NldEZ3SWdub3JlV2xhbkFjdCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRW5hYmxlCgkpCnsKCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMV0gPXswfTsKCQkKCWlmKGJFbmFibGUpCgl7CgkJSDJDX1BhcmFtZXRlclswXSB8PSBCSVQwOwkJLy8gZnVuY3Rpb24gZW5hYmxlCgl9CgkKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBzZXQgRlcgZm9yIEJUIElnbm9yZSBXbGFuX0FjdCwgRlcgd3JpdGUgMHgyNT0weCV4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4MjUsIDEsIEgyQ19QYXJhbWV0ZXIpOwkKfQoKVk9JRApoYWxidGM4NzIzYTFhbnRfSWdub3JlV2xhbkFjdCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJFbmFibGUKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyB0dXJuIElnbm9yZSBXbGFuQWN0ICVzXG4iLCAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksIChiRW5hYmxlPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1cklnbm9yZVdsYW5BY3QgPSBiRW5hYmxlOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVJZ25vcmVXbGFuQWN0ID0gJWQsIGJDdXJJZ25vcmVXbGFuQWN0ID0gJWQhIVxuIiwgCgkJCXBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0LCBwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCkpOwoKCQlpZihwQ29leERtLT5iUHJlSWdub3JlV2xhbkFjdCA9PSBwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCkKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODcyM2ExYW50X1NldEZ3SWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBiRW5hYmxlKTsKCglwQ29leERtLT5iUHJlSWdub3JlV2xhbkFjdCA9IHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0Owp9CgpWT0lECmhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCXR5cGUsCglJTgl1MUJ5dGUJCQlieXRlMSwKCUlOCXUxQnl0ZQkJCWJ5dGUyLAoJSU4JdTFCeXRlCQkJYnl0ZTMsCglJTgl1MUJ5dGUJCQlieXRlNCwKCUlOCXUxQnl0ZQkJCWJ5dGU1CgkpCnsKCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbNV0gPXswfTsKCXUxQnl0ZQkJCXJlYWxCeXRlMT1ieXRlMSwgcmVhbEJ5dGU1PWJ5dGU1OwoJQk9PTEVBTgkJCWJBcEVuYWJsZT1GQUxTRTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9BUF9NT0RFX0VOQUJMRSwgJmJBcEVuYWJsZSk7CgoJLy8gYnl0ZTFbMTowXSAhPSAwIG1lYW5zIGVuYWJsZSBwc3RkbWEKCS8vIGZvciAyQW50IGJ0IGNvZXhpc3QsIGlmIGJ5dGUxICE9IDAgbWVhbnMgZW5hYmxlIHBzdGRtYQoJaWYoYnl0ZTEpCgl7CgkJaWYoYkFwRW5hYmxlKQoJCXsKCQkJaWYodHlwZSAhPSA1ICYmIHR5cGUgIT0gMTIpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIEZXIGZvciAxQW50IEFQIG1vZGVcbiIpKTsKCQkJCXJlYWxCeXRlMSAmPSB+QklUNDsKCQkJCXJlYWxCeXRlMSB8PSBCSVQ1OwoKCQkJCXJlYWxCeXRlNSB8PSBCSVQ1OwoJCQkJcmVhbEJ5dGU1ICY9IH5CSVQ2OwoJCQl9CgkJfQoJfQoJSDJDX1BhcmFtZXRlclswXSA9IHJlYWxCeXRlMTsJCglIMkNfUGFyYW1ldGVyWzFdID0gYnl0ZTI7CQoJSDJDX1BhcmFtZXRlclsyXSA9IGJ5dGUzOwoJSDJDX1BhcmFtZXRlclszXSA9IGJ5dGU0OwoJSDJDX1BhcmFtZXRlcls0XSA9IHJlYWxCeXRlNTsKCglwQ29leERtLT5wc1RkbWFQYXJhWzBdID0gcmVhbEJ5dGUxOwoJcENvZXhEbS0+cHNUZG1hUGFyYVsxXSA9IGJ5dGUyOwoJcENvZXhEbS0+cHNUZG1hUGFyYVsyXSA9IGJ5dGUzOwoJcENvZXhEbS0+cHNUZG1hUGFyYVszXSA9IGJ5dGU0OwoJcENvZXhEbS0+cHNUZG1hUGFyYVs0XSA9IHJlYWxCeXRlNTsKCQoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4M2EoNWJ5dGVzKT0weCV4JTA4eFxuIiwgCgkJSDJDX1BhcmFtZXRlclswXSwgCgkJSDJDX1BhcmFtZXRlclsxXTw8MjR8SDJDX1BhcmFtZXRlclsyXTw8MTZ8SDJDX1BhcmFtZXRlclszXTw8OHxIMkNfUGFyYW1ldGVyWzRdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4M2EsIDUsIEgyQ19QYXJhbWV0ZXIpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKCUlOCUJPT0xFQU4JCQliVHVybk9uLAoJSU4JdTFCeXRlCQkJdHlwZQoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIHR1cm4gJXMgUFMgVERNQSwgdHlwZT0lZFxuIiwgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoYlR1cm5Pbj8gIk9OIjoiT0ZGIiksIHR5cGUpKTsJCQoJcENvZXhEbS0+YkN1clBzVGRtYU9uID0gYlR1cm5PbjsKCXBDb2V4RG0tPmN1clBzVGRtYSA9IHR5cGU7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZVBzVGRtYU9uID0gJWQsIGJDdXJQc1RkbWFPbiA9ICVkISFcbiIsIAoJCQlwQ29leERtLT5iUHJlUHNUZG1hT24sIHBDb2V4RG0tPmJDdXJQc1RkbWFPbikpOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIHByZVBzVGRtYSA9ICVkLCBjdXJQc1RkbWEgPSAlZCEhXG4iLCAKCQkJcENvZXhEbS0+cHJlUHNUZG1hLCBwQ29leERtLT5jdXJQc1RkbWEpKTsKCgkJaWYoIChwQ29leERtLT5iUHJlUHNUZG1hT24gPT0gcENvZXhEbS0+YkN1clBzVGRtYU9uKSAmJgoJCQkocENvZXhEbS0+cHJlUHNUZG1hID09IHBDb2V4RG0tPmN1clBzVGRtYSkgKQoJCQlyZXR1cm47Cgl9CQoJaWYocENvZXhEbS0+YkN1clBzVGRtYU9uKQoJewoJCXN3aXRjaChwQ29leERtLT5jdXJQc1RkbWEpCgkJewoJCQljYXNlIDE6CgkJCWRlZmF1bHQ6CgkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgxMywgMHgxYSwgMHgxYSwgMHgwLCAweDQwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDI6CgkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgxMywgMHgxMiwgMHgxMiwgMHgwLCAweDQwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDM6CgkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHg5MywgMHgzZiwgMHgzLCAweDEwLCAweDQwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDQ6CgkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHg5MywgMHgxNSwgMHgzLCAweDEwLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgNToKCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweGE5LCAweDE1LCAweDMsIDB4MzUsIDB4YzApOwoJCQkJYnJlYWs7CgkJCQoJCQljYXNlIDg6IAoJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4OTMsIDB4MjUsIDB4MywgMHgxMCwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDk6IAoJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4MTMsIDB4YSwgMHhhLCAweDAsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTA6CQoJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4MTMsIDB4YSwgMHhhLCAweDAsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTE6CQoJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4MTMsIDB4NSwgMHg1LCAweDAsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTI6CgkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHhhOSwgMHhhLCAweDMsIDB4MTUsIDB4YzApOwoJCQkJYnJlYWs7CgkKCQkJY2FzZSAxODoKCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4MCk7CgkJCQlicmVhazsJCQkKCgkJCWNhc2UgMjA6CgkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgxMywgMHgyYSwgMHgyYSwgMHgwLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjE6CgkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHg5MywgMHgyMCwgMHgzLCAweDEwLCAweDQwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDIyOgoJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4MTMsIDB4MWEsIDB4MWEsIDB4MiwgMHg0MCk7CgkJCQlicmVhazsKCQkJY2FzZSAyMzoKCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDEzLCAweDEyLCAweDEyLCAweDIsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjQ6CgkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgxMywgMHhhLCAweGEsIDB4MiwgMHg0MCk7CgkJCQlicmVhazsKCQkJY2FzZSAyNToKCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDEzLCAweDUsIDB4NSwgMHgyLCAweDQwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDI2OgoJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4OTMsIDB4MjUsIDB4MywgMHgxMCwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDI3OgoJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4MTMsIDB4NSwgMHg1LCAweDIsIDB4NDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjg6CgkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHgzLCAweDJmLCAweDJmLCAweDAsIDB4MCk7CgkJCQlicmVhazsKCgkJfQoJfQoJZWxzZQoJewoJCS8vIGRpc2FibGUgUFMgdGRtYQoJCXN3aXRjaChwQ29leERtLT5jdXJQc1RkbWEpCgkJewoJCQljYXNlIDg6CgkJCQloYWxidGM4NzIzYTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgdHlwZSwgMHg4LCAweDAsIDB4MCwgMHgwLCAweDApOwkJCgkJCQlicmVhazsKCQkJY2FzZSAwOgoJCQlkZWZhdWx0OgoJCQkJaGFsYnRjODcyM2ExYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIHR5cGUsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKCQkJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShwQnRDb2V4aXN0LCAweDg2MCwgMHgyMTApOwoJCQkJYnJlYWs7CgkJCWNhc2UgOToKCQkJCWhhbGJ0Yzg3MjNhMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCB0eXBlLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCk7CgkJCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMmJ5dGUocEJ0Q29leGlzdCwgMHg4NjAsIDB4MTEwKTsKCQkJCWJyZWFrOwoKCQl9Cgl9CgoJLy8gdXBkYXRlIHByZSBzdGF0ZQoJcENvZXhEbS0+YlByZVBzVGRtYU9uID0gcENvZXhEbS0+YkN1clBzVGRtYU9uOwoJcENvZXhEbS0+cHJlUHNUZG1hID0gcENvZXhEbS0+Y3VyUHNUZG1hOwp9CgoKVk9JRApoYWxidGM4NzIzYTFhbnRfQ29leEFsbE9mZigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CgkvLyBmdyBhbGwgb2ZmCgloYWxidGM4NzIzYTFhbnRfSWdub3JlV2xhbkFjdChwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoKCS8vIHN3IGFsbCBvZmYKCWhhbGJ0Yzg3MjNhMWFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMWFudF9SZlNocmluayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoKCS8vIGh3IGFsbCBvZmYKCWhhbGJ0Yzg3MjNhMWFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKfQoKVk9JRApoYWxidGM4NzIzYTFhbnRfSW5pdENvZXhEbSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CgkvLyBmb3JjZSB0byByZXNldCBjb2V4IG1lY2hhbmlzbQoJaGFsYnRjODcyM2ExYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMWFudF9CdEVuYWJsZUFjdGlvbigKCUlOIAlQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJaGFsYnRjODcyM2ExYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMWFudF9Nb25pdG9yQnRDdHIoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTRCeXRlIAkJCXJlZ0hQVHhSeCwgcmVnTFBUeFJ4LCB1NFRtcDsKCXU0Qnl0ZQkJCXJlZ0hQVHg9MCwgcmVnSFBSeD0wLCByZWdMUFR4PTAsIHJlZ0xQUng9MDsKCXUxQnl0ZQkJCXUxVG1wOwoJCglyZWdIUFR4UnggPSAweDc3MDsKCXJlZ0xQVHhSeCA9IDB4Nzc0OwoKCXU0VG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgcmVnSFBUeFJ4KTsKCXJlZ0hQVHggPSB1NFRtcCAmIE1BU0tMV09SRDsKCXJlZ0hQUnggPSAodTRUbXAgJiBNQVNLSFdPUkQpPj4xNjsKCgl1NFRtcCA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIHJlZ0xQVHhSeCk7CglyZWdMUFR4ID0gdTRUbXAgJiBNQVNLTFdPUkQ7CglyZWdMUFJ4ID0gKHU0VG1wICYgTUFTS0hXT1JEKT4+MTY7CgkJCglwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPSByZWdIUFR4OwoJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4ID0gcmVnSFBSeDsKCXBDb2V4U3RhLT5sb3dQcmlvcml0eVR4ID0gcmVnTFBUeDsKCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID0gcmVnTFBSeDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgSGlnaCBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPTB4JXgoJWQpLzB4JXgoJWQpXG4iLCAKCQlyZWdIUFR4UngsIHJlZ0hQVHgsIHJlZ0hQVHgsIHJlZ0hQUngsIHJlZ0hQUngpKTsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBMb3cgUHJpb3JpdHkgVHgvUnggKHJlZyAweCV4KT0weCV4KCVkKS8weCV4KCVkKVxuIiwgCgkJcmVnTFBUeFJ4LCByZWdMUFR4LCByZWdMUFR4LCByZWdMUFJ4LCByZWdMUFJ4KSk7CgoJLy8gcmVzZXQgY291bnRlcgoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NzZlLCAweGMpOwp9CgpWT0lECmhhbGJ0Yzg3MjNhMWFudF9Nb25pdG9yQnRFbmFibGVEaXNhYmxlKAoJSU4gCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglzdGF0aWMgQk9PTEVBTgliUHJlQnREaXNhYmxlZD1GQUxTRTsKCXN0YXRpYyB1NEJ5dGUJYnREaXNhYmxlQ250PTA7CglCT09MRUFOCQkJYkJ0QWN0aXZlPXRydWUsIGJCdERpc2FibGVkPUZBTFNFOwoKCS8vIFRoaXMgZnVuY3Rpb24gY2hlY2sgaWYgYnQgaXMgZGlzYWJsZWQKCQoJaWYoCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCA9PSAwICYmCgkJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4ID09IDAgJiYKCQlwQ29leFN0YS0+bG93UHJpb3JpdHlUeCA9PSAwICYmCgkJcENvZXhTdGEtPmxvd1ByaW9yaXR5UnggPT0gMCkKCXsKCQliQnRBY3RpdmUgPSBGQUxTRTsKCX0KCWlmKAlwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPT0gMHhmZmZmICYmCgkJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4ID09IDB4ZmZmZiAmJgoJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVR4ID09IDB4ZmZmZiAmJgoJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID09IDB4ZmZmZikKCXsKCQliQnRBY3RpdmUgPSBGQUxTRTsKCX0KCWlmKGJCdEFjdGl2ZSkKCXsKCQlidERpc2FibGVDbnQgPSAwOwoJCWJCdERpc2FibGVkID0gRkFMU0U7CgkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0JMX0JUX0RJU0FCTEUsICZiQnREaXNhYmxlZCk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGVuYWJsZWQgISFcbiIpKTsKCX0KCWVsc2UKCXsKCQlidERpc2FibGVDbnQrKzsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgYnQgYWxsIGNvdW50ZXJzPTAsICVkIHRpbWVzISFcbiIsIAoJCQkJYnREaXNhYmxlQ250KSk7CgkJaWYoYnREaXNhYmxlQ250ID49IDIpCgkJewoJCQliQnREaXNhYmxlZCA9IHRydWU7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLCAmYkJ0RGlzYWJsZWQpOwoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZGlzYWJsZWQgISFcbiIpKTsKCQl9Cgl9CglpZihiUHJlQnREaXNhYmxlZCAhPSBiQnREaXNhYmxlZCkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZnJvbSAlcyB0byAlcyEhXG4iLCAKCQkJKGJQcmVCdERpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpLCAKCQkJKGJCdERpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpKSk7CgkJYlByZUJ0RGlzYWJsZWQgPSBiQnREaXNhYmxlZDsKCQlpZighYkJ0RGlzYWJsZWQpCgkJewoJCQloYWxidGM4NzIzYTFhbnRfQnRFbmFibGVBY3Rpb24ocEJ0Q29leGlzdCk7CgkJfQoJCWVsc2UKCQl7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfTk9STUFMX0xQUywgTlVMTCk7CgkJfQoJfQp9CgpWT0lECmhhbGJ0Yzg3MjNhMWFudF9UZG1hRHVyYXRpb25BZGp1c3QoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJc3RhdGljIHM0Qnl0ZQkJdXAsZG4sbSxuLFdhaXRDb3VudDsKCXM0Qnl0ZQkJCXJlc3VsdDsgICAvLzA6IG5vIGNoYW5nZSwgKzE6IGluY3JlYXNlIFdpRmkgZHVyYXRpb24sIC0xOiBkZWNyZWFzZSBXaUZpIGR1cmF0aW9uCgl1MUJ5dGUJCQlyZXRyeUNvdW50PTA7Cgl1MUJ5dGUJCQlidFN0YXRlOwoJQk9PTEVBTgkJCWJTY2FuPUZBTFNFLCBiTGluaz1GQUxTRSwgYlJvYW09RkFMU0U7Cgl1NEJ5dGUJCQl3aWZpQnc7CgkKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCWJ0U3RhdGUgPSBwQ29leERtLT5idFN0YXR1czsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFRkbWFEdXJhdGlvbkFkanVzdCgpXG4iKSk7CglpZihwQ29leERtLT5wc1RkbWFHbG9iYWxDbnQgIT0gcENvZXhEbS0+cHNUZG1hTW9uaXRvckNudCkKCXsKCQlwQ29leERtLT5wc1RkbWFNb25pdG9yQ250ID0gMDsKCQlwQ29leERtLT5wc1RkbWFHbG9iYWxDbnQgPSAwOwoJfQoJaWYocENvZXhEbS0+cHNUZG1hTW9uaXRvckNudCA9PSAwKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgZmlyc3QgcnVuIEJUIEEyRFAgKyBXaUZpIGJ1c3kgc3RhdGUhIVxuIikpOwoJCWlmKGJ0U3RhdGUgPT0gQlRfU1RBVEVfODcyM0FfMUFOVF9BQ0xfT05MWV9CVVNZKQoJCXsKCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMSk7CgkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIyKTsKCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjI7CgkJfQoJCS8vPT09PT09PT09PT09CgkJdXAgPSAwOwoJCWRuID0gMDsKCQltID0gMTsKCQluPSAzOwoJCXJlc3VsdCA9IDA7CgkJV2FpdENvdW50ID0gMDsKCX0KCWVsc2UKCXsKCQkvL2FjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKCQlyZXRyeUNvdW50ID0gcENvZXhTdGEtPmJ0UmV0cnlDbnQ7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCByZXRyeUNvdW50ID0gJWRcbiIsIHJldHJ5Q291bnQpKTsKCQlyZXN1bHQgPSAwOwoJCVdhaXRDb3VudCsrOyAKCQkgIAoJCWlmKHJldHJ5Q291bnQgPT0gMCkgIC8vIG5vIHJldHJ5IGluIHRoZSBsYXN0IDItc2Vjb25kIGR1cmF0aW9uCgkJewoJCQl1cCsrOwoJCQlkbi0tOwoKCQkJaWYgKGRuIDw9IDApCgkJCQlkbiA9IDA7IAkJCSAKCgkJCWlmKHVwID49IG4pIC8vIGlmILNzxPIgbiCt0zKs7SByZXRyeSBjb3VudKywMCwgq2i91bxlV2lGaSBkdXJhdGlvbgoJCQl7CgkJCQlXYWl0Q291bnQgPSAwOyAKCQkJCW4gPSAzOwoJCQkJdXAgPSAwOwoJCQkJZG4gPSAwOwoJCQkJcmVzdWx0ID0gMTsgCgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEluY3JlYXNlIHdpZmkgZHVyYXRpb24hIVxuIikpOwoJCQl9CgkJfQoJCWVsc2UgaWYgKHJldHJ5Q291bnQgPD0gMykJLy8gPD0zIHJldHJ5IGluIHRoZSBsYXN0IDItc2Vjb25kIGR1cmF0aW9uCgkJewoJCQl1cC0tOyAKCQkJZG4rKzsKCgkJCWlmICh1cCA8PSAwKQoJCQkJdXAgPSAwOwoKCQkJaWYgKGRuID09IDIpCS8vIGlmILNzxPIgMiCt0zKs7SByZXRyeSBjb3VudDwgMywgq2i91a+2V2lGaSBkdXJhdGlvbgoJCQl7CgkJCQlpZiAoV2FpdENvdW50IDw9IDIpCgkJCQkJbSsrOyAvLyDB16dLpECqvaZiqOKt02xldmVspKSo06ZeCgkJCQllbHNlCgkJCQkJbSA9IDE7CgoJCQkJaWYgKCBtID49IDIwKSAvL20gs8ykaq3IID0gMjAgJyCzzKRqMTIwrO0gcmVjaGVja6xPp1+91b7jIFdpRmkgZHVyYXRpb24uCgkJCQkJbSA9IDIwOwoKCQkJCW4gPSAzKm07CgkJCQl1cCA9IDA7CgkJCQlkbiA9IDA7CgkJCQlXYWl0Q291bnQgPSAwOwkKCQkJCXJlc3VsdCA9IC0xOyAKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnlDb3VudGVyPDMhIVxuIikpOwoJCQl9CgkJfQoJCWVsc2UgIC8vcmV0cnkgY291bnQgPiAzLCClda1uMaa4IHJldHJ5IGNvdW50ID4gMywgq2i91a+2V2lGaSBkdXJhdGlvbgoJCXsKCQkJaWYgKFdhaXRDb3VudCA9PSAxKQoJCQkJbSsrOyAvLyDB16dLpECqvaZiqOKt02xldmVspKSo06ZeCgkJCWVsc2UKCQkJCW0gPSAxOwoKCQkJaWYgKCBtID49IDIwKSAvL20gs8ykaq3IID0gMjAgJyCzzKRqMTIwrO0gcmVjaGVja6xPp1+91b7jIFdpRmkgZHVyYXRpb24uCgkJCQltID0gMjA7CgoJCQluID0gMyptOwoJCQl1cCA9IDA7CgkJCWRuID0gMDsKCQkJV2FpdENvdW50ID0gMDsgCgkJCXJlc3VsdCA9IC0xOwoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24gZm9yIHJldHJ5Q291bnRlcj4zISFcbiIpKTsKCQl9CgkJCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJUIFR4UnggY291bnRlciBIK0wgPD0gMTIwMFxuIikpOwoJCQlpZihidFN0YXRlICE9IEJUX1NUQVRFXzg3MjNBXzFBTlRfQUNMX09OTFlfQlVTWSkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBOT1QgQUNMIG9ubHkgYnVzeSFcbiIpKTsKCQkJCWlmKEJUQ19XSUZJX0JXX0hUNDAgIT0gd2lmaUJ3KQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgMjBNSHpcbiIpKTsKCQkJCQlpZihyZXN1bHQgPT0gLTEpCgkJCQkJewoJCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMjIpCgkJCQkJCXsKCQkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIzKTsKCQkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDIzOwoJCQkJCQl9CgkJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIzKQoJCQkJCQl7CgkJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyNCk7CgkJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyNDsKCQkJCQkJfQoJCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyNCkKCQkJCQkJewoJCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjUpOwoJCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjU7CgkJCQkJCX0KCQkJCQl9IAoJCQkJCWVsc2UgaWYgKHJlc3VsdCA9PSAxKQoJCQkJCXsKCQkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDI1KQoJCQkJCQl7CgkJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyNCk7CgkJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyNDsKCQkJCQkJfQoJCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyNCkKCQkJCQkJewoJCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjMpOwoJCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjM7CgkJCQkJCX0KCQkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMjMpCgkJCQkJCXsKCQkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIyKTsKCQkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDIyOwoJCQkJCQl9CgkJCQkJfQoJCQkJCS8vIGVycm9yIGhhbmRsZSwgaWYgbm90IGluIHRoZSBmb2xsb3dpbmcgc3RhdGUsCgkJCQkJLy8gc2V0IHBzVGRtYSBhZ2Fpbi4KCQkJCQlpZiggKHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSAhPSAyMikgJiYKCQkJCQkJKHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSAhPSAyMykgJiYKCQkJCQkJKHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSAhPSAyNCkgJiYKCQkJCQkJKHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSAhPSAyNSkgKQoJCQkJCXsKCQkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBkdXJhdGlvbiBjYXNlIG91dCBvZiBoYW5kbGUhIVxuIikpOwoJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyMyk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDIzOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIDQwTUh6XG4iKSk7CgkJCQkJaWYocmVzdWx0ID09IC0xKQoJCQkJCXsKCQkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDIzKQoJCQkJCQl7CgkJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyNCk7CgkJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyNDsKCQkJCQkJfQoJCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyNCkKCQkJCQkJewoJCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjUpOwoJCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjU7CgkJCQkJCX0KCQkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMjUpCgkJCQkJCXsKCQkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDI3KTsKCQkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI3OwoJCQkJCQl9CgkJCQkJfSAKCQkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKCQkJCQl7CgkJCQkJCWlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyNykKCQkJCQkJewoJCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjUpOwoJCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjU7CgkJCQkJCX0KCQkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMjUpCgkJCQkJCXsKCQkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDI0KTsKCQkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI0OwoJCQkJCQl9CgkJCQkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDI0KQoJCQkJCQl7CgkJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyMyk7CgkJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyMzsKCQkJCQkJfQoJCQkJCX0KCQkJCQkvLyBlcnJvciBoYW5kbGUsIGlmIG5vdCBpbiB0aGUgZm9sbG93aW5nIHN0YXRlLAoJCQkJCS8vIHNldCBwc1RkbWEgYWdhaW4uCgkJCQkJaWYoIChwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgIT0gMjMpICYmCgkJCQkJCShwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgIT0gMjQpICYmCgkJCQkJCShwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgIT0gMjUpICYmCgkJCQkJCShwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgIT0gMjcpICkKCQkJCQl7CgkJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgZHVyYXRpb24gY2FzZSBvdXQgb2YgaGFuZGxlISFcbiIpKTsKCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMjQpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyNDsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFDTCBvbmx5IGJ1c3lcbiIpKTsKCQkJCWlmIChyZXN1bHQgPT0gLTEpCgkJCQl7CgkJCQkJaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMikKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA5OwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA5KQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMTEpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIGlmIChyZXN1bHQgPT0gMSkKCQkJCXsKCQkJCQlpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCgkJCQkJewoJCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKCQkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gOTsKCQkJCQl9CgkJCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gOSkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDIpOwoJCQkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCQkJCX0KCQkJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMSk7CgkJCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDE7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIGVycm9yIGhhbmRsZSwgaWYgbm90IGluIHRoZSBmb2xsb3dpbmcgc3RhdGUsCgkJCQkvLyBzZXQgcHNUZG1hIGFnYWluLgoJCQkJaWYoIChwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgIT0gMSkgJiYKCQkJCQkocENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlICE9IDIpICYmCgkJCQkJKHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSAhPSA5KSAmJgoJCQkJCShwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgIT0gMTEpICkKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIGR1cmF0aW9uIGNhc2Ugb3V0IG9mIGhhbmRsZSEhXG4iKSk7CgkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMik7CgkJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gMjsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBpZiBjdXJyZW50IFBzVGRtYSBub3QgbWF0Y2ggd2l0aCB0aGUgcmVjb3JkZWQgb25lICh3aGVuIHNjYW4sIGRoY3AuLi4pLCAKCS8vIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QgaXQgYmFjayB0byB0aGUgcHJldmlvdXMgcmVjb3JkIG9uZS4KCWlmKHBDb2V4RG0tPmN1clBzVGRtYSAhPSBwQ29leERtLT5wc1RkbWFEdUFkalR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQc1RkbWEgdHlwZSBkaXNtYXRjaCEhISwgY3VyUHNUZG1hPSVkLCByZWNvcmRQc1RkbWE9JWRcbiIsIAoJCQlwQ29leERtLT5jdXJQc1RkbWEsIHBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSkpOwoKCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9TQ0FOLCAmYlNjYW4pOwoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZiTGluayk7CgkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJmJSb2FtKTsKCgkJaWYoICFiU2NhbiAmJiAhYkxpbmsgJiYJIWJSb2FtKQoJCXsKCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlKTsKCQl9CgkJZWxzZQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCByb2FtaW5nL2xpbmsvc2NhbiBpcyB1bmRlciBwcm9ncmVzcywgd2lsbCBhZGp1c3QgbmV4dCB0aW1lISEhXG4iKSk7CgkJfQoJfQoJcENvZXhEbS0+cHNUZG1hTW9uaXRvckNudCsrOwp9CgoKVk9JRApoYWxidGM4NzIzYTFhbnRfQ29leEZvcldpZmlDb25uZWN0KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCUJPT0xFQU4JCWJXaWZpQ29ubmVjdGVkPUZBTFNFLCBiV2lmaUJ1c3k9RkFMU0U7Cgl1MUJ5dGUJCWJ0U3RhdGUsIGJ0SW5mb09yaWdpbmFsPTA7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpOwoKCWJ0U3RhdGUgPSBwQ29leERtLT5idFN0YXR1czsKCWJ0SW5mb09yaWdpbmFsID0gcENvZXhTdGEtPmJ0SW5mb0MyaFtCVF9JTkZPX1NSQ184NzIzQV8xQU5UX0JUX1JTUF1bMF07CgoJaWYoYldpZmlDb25uZWN0ZWQpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCB3aWZpIGNvbm5lY3RlZCEhXG4iKSk7CgkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJmJXaWZpQnVzeSk7CgkJCgkJaWYoICFiV2lmaUJ1c3kgJiYKCQkJKChCVF9TVEFURV84NzIzQV8xQU5UX05PX0NPTk5FQ1RJT04gPT0gYnRTdGF0ZSkgfHwKCQkJKEJUX1NUQVRFXzg3MjNBXzFBTlRfQ09OTkVDVF9JRExFID09IGJ0U3RhdGUpKSApCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFtXaWZpIGlzIGlkbGVdIG9yIFtCdCBpcyBub24gY29ubmVjdGVkIGlkbGUgb3IgQnQgaXMgY29ubmVjdGVkIGlkbGVdISFcbiIpKTsKCgkJCWlmKEJUX1NUQVRFXzg3MjNBXzFBTlRfTk9fQ09OTkVDVElPTiA9PSBidFN0YXRlKQoJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDkpOwoJCQllbHNlIGlmKEJUX1NUQVRFXzg3MjNBXzFBTlRfQ09OTkVDVF9JRExFID09IGJ0U3RhdGUpCgkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgoJCQlwQnRDb2V4aXN0LT5idGNfc2V0QmJSZWcocEJ0Q29leGlzdCwgMHg4ODAsIDB4ZmYwMDAwMDAsIDB4YzApOwoJCX0KCQllbHNlCgkJewoJCQlpZiggKEJUX1NUQVRFXzg3MjNBXzFBTlRfU0NPX09OTFlfQlVTWSA9PSBidFN0YXRlKSB8fAoJCQkJKEJUX1NUQVRFXzg3MjNBXzFBTlRfQUNMX1NDT19CVVNZID09IGJ0U3RhdGUpIHx8CgkJCQkoQlRfU1RBVEVfODcyM0FfMUFOVF9ISURfQlVTWSA9PSBidFN0YXRlKSB8fAoJCQkJKEJUX1NUQVRFXzg3MjNBXzFBTlRfSElEX1NDT19CVVNZID09IGJ0U3RhdGUpICkKCQkJewoJCQkJcEJ0Q29leGlzdC0+YnRjX3NldEJiUmVnKHBCdENvZXhpc3QsIDB4ODgwLCAweGZmMDAwMDAwLCAweDYwKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXBCdENvZXhpc3QtPmJ0Y19zZXRCYlJlZyhwQnRDb2V4aXN0LCAweDg4MCwgMHhmZjAwMDAwMCwgMHhjMCk7CgkJCX0KCQkJc3dpdGNoKGJ0U3RhdGUpCgkJCXsKCQkJCWNhc2UgQlRfU1RBVEVfODcyM0FfMUFOVF9OT19DT05ORUNUSU9OOgoJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDUpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBCVF9TVEFURV84NzIzQV8xQU5UX0NPTk5FQ1RfSURMRToKCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMik7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUX1NUQVRFXzg3MjNBXzFBTlRfSU5RX09SX1BBRzoKCQkJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUX1NUQVRFXzg3MjNBXzFBTlRfU0NPX09OTFlfQlVTWToKCQkJCWNhc2UgQlRfU1RBVEVfODcyM0FfMUFOVF9BQ0xfU0NPX0JVU1k6CgkJCQljYXNlIEJUX1NUQVRFXzg3MjNBXzFBTlRfSElEX0JVU1k6CgkJCQljYXNlIEJUX1NUQVRFXzg3MjNBXzFBTlRfSElEX1NDT19CVVNZOgoJCQkJCWhhbGJ0Yzg3MjNhMWFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIEJUX1NUQVRFXzg3MjNBXzFBTlRfQUNMX09OTFlfQlVTWToKCQkJCQlpZiAoYnRJbmZvT3JpZ2luYWwmQlRfSU5GT184NzIzQV8xQU5UX0JfQTJEUCkKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9UZG1hRHVyYXRpb25BZGp1c3QocEJ0Q29leGlzdCk7CgkJCQkJfQoJCQkJCWVsc2UgaWYoYnRJbmZvT3JpZ2luYWwmQlRfSU5GT184NzIzQV8xQU5UX0JfRlRQKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMSk7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIChidEluZm9PcmlnaW5hbCZCVF9JTkZPXzg3MjNBXzFBTlRfQl9BMkRQKSAmJgoJCQkJCQkJKGJ0SW5mb09yaWdpbmFsJkJUX0lORk9fODcyM0FfMUFOVF9CX0ZUUCkgKQoJCQkJCXsKCQkJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDEpOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBlcnJvciEhISwgdW5kZWZpbmVkIGNhc2UgaW4gaGFsYnRjODcyM2ExYW50X0NvZXhGb3JXaWZpQ29ubmVjdCgpISFcbiIpKTsKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgaXMgZGlzY29ubmVjdGVkISFcbiIpKTsKCX0KCglwQ29leERtLT5wc1RkbWFHbG9iYWxDbnQrKzsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gd29yayBhcm91bmQgZnVuY3Rpb24gc3RhcnQgd2l0aCB3YV9oYWxidGM4NzIzYTFhbnRfCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClZPSUQKd2FfaGFsYnRjODcyM2ExYW50X01vbml0b3JDMmgoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQl0bXAxYj0weDA7Cgl1NEJ5dGUJY3VyQzJoVG90YWxDbnQ9MHgwOwoJc3RhdGljIHU0Qnl0ZQlwcmVDMmhUb3RhbENudD0weDAsIHNhbWVDbnRQb2xsaW5nVGltZT0weDA7CgoJY3VyQzJoVG90YWxDbnQrPXBDb2V4U3RhLT5idEluZm9DMmhDbnRbQlRfSU5GT19TUkNfODcyM0FfMUFOVF9CVF9SU1BdOwoKCWlmKGN1ckMyaFRvdGFsQ250ID09IHByZUMyaFRvdGFsQ250KQoJewoJCXNhbWVDbnRQb2xsaW5nVGltZSsrOwoJfQoJZWxzZQoJewoJCXByZUMyaFRvdGFsQ250ID0gY3VyQzJoVG90YWxDbnQ7CgkJc2FtZUNudFBvbGxpbmdUaW1lID0gMDsKCX0KCglpZihzYW1lQ250UG9sbGluZ1RpbWUgPj0gMikKCXsKCQl0bXAxYiA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4MWFmKTsKCQlpZih0bXAxYiAhPSAweDApCgkJewoJCQlwQ29leFN0YS0+YzJoSGFuZ0RldGVjdENudCsrOwoJCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHgxYWYsIDB4MCk7CgkJfQoJfQp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBleHRlcm4gZnVuY3Rpb24gc3RhcnQgd2l0aCBFWGhhbGJ0Yzg3MjNhMWFudF8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVk9JRApFWGhhbGJ0Yzg3MjNhMWFudF9Jbml0SHdDb25maWcoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIDFBbnQgSW5pdCBIVyBDb25maWchIVxuIikpOwoKCS8vIGJhY2t1cCByZiAweDFlIHZhbHVlCglwQ29leERtLT5idFJmMHgxZUJhY2t1cCA9IAoJCXBCdENvZXhpc3QtPmJ0Y19nZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDFlLCAweGZmZmZmKTsKCglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg0MCwgMHgyMCk7CgoJLy8gZW5hYmxlIGNvdW50ZXIgc3RhdGlzdGljcwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NzZlLCAweDQpOwoJCgkvLyBjb2V4IHRhYmxlCglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg2Y2MsIDB4MCk7CQkJLy8gMS1BbnQgY29leAoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4NmM4LCAweGZmZmYpOwkJLy8gd2lmaSBicmVhayB0YWJsZQoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4NmM0LCAweDU1NTU1NTU1KTsJLy9jb2V4IHRhYmxlCgoJLy8gYW50ZW5uYSBzd2l0Y2ggY29udHJvbCBwYXJhbWV0ZXIKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDg1OCwgMHhhYWFhYWFhYSk7CgkKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8yYnl0ZShwQnRDb2V4aXN0LCAweDg2MCwgMHgyMTApOwkvL3NldCBhbnRlbm5hIGF0IHdpZmkgc2lkZSBpZiBBTlRTVyBpcyBzb2Z0d2FyZSBjb250cm9sCglwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg4NzAsIDB4MzAwKTsJLy9TUERUKGNvbm5lY3RlZCB3aXRoIFRSU1cpIGNvbnRyb2wgYnkgaGFyZHdhcmUgUFRBCglwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg4NzQsIDB4MjI4MDQwMDApOwkvL0FOVFNXIGtlZXAgYnkgR05UX0JUCgoJLy8gY29leGlzdGVuY2UgcGFyYW1ldGVycwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4Nzc4LCAweDEpOwkvLyBlbmFibGUgUlRLIG1vZGUgUFRBCn0KClZPSUQKRVhoYWxidGM4NzIzYTFhbnRfSW5pdENvZXhEbSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgQ29leCBNZWNoYW5pc20gSW5pdCEhXG4iKSk7CgkKCWhhbGJ0Yzg3MjNhMWFudF9Jbml0Q29leERtKHBCdENvZXhpc3QpOwp9CgpWT0lECkVYaGFsYnRjODcyM2ExYW50X0Rpc3BsYXlDb2V4SW5mbygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglzdHJ1Y3QgYnRjX2JvYXJkX2luZm8gKgkJcEJvYXJkSW5mbz0mcEJ0Q29leGlzdC0+Ym9hcmRfaW5mbzsKCVBCVENfU1RBQ0tfSU5GTwkJcFN0YWNrSW5mbz0mcEJ0Q29leGlzdC0+c3RhY2tfaW5mbzsKCXB1MUJ5dGUJCQkJY2xpQnVmPXBCdENvZXhpc3QtPmNsaV9idWY7Cgl1MUJ5dGUJCQkJdTFUbXBbNF0sIGksIGJ0SW5mb0V4dCwgcHNUZG1hQ2FzZT0wOwoJdTRCeXRlCQkJCXU0VG1wWzRdOwoJQk9PTEVBTgkJCQliUm9hbT1GQUxTRSwgYlNjYW49RkFMU0UsIGJMaW5rPUZBTFNFLCBiV2lmaVVuZGVyNUc9RkFMU0U7CglCT09MRUFOCQkJCWJCdEhzT249RkFMU0UsIGJXaWZpQnVzeT1GQUxTRTsKCXM0Qnl0ZQkJCQl3aWZpUnNzaT0wLCBidEhzUnNzaT0wOwoJdTRCeXRlCQkJCXdpZmlCdywgd2lmaVRyYWZmaWNEaXI7Cgl1MUJ5dGUJCQkJd2lmaURvdDExQ2hubCwgd2lmaUhzQ2hubDsKCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT1bQlQgQ29leGlzdCBpbmZvXT09PT09PT09PT09PSIpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJaWYoIXBCb2FyZEluZm8tPmJ0X2V4aXN0KQoJewoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuIEJUIG5vdCBleGlzdHMgISEhIik7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkJcmV0dXJuOwoJfQoKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkICIsICJBbnQgUEcgbnVtYmVyLyBBbnQgbWVjaGFuaXNtOiIsIFwKCQlwQm9hcmRJbmZvLT5wZ19hbnRfbnVtLCBwQm9hcmRJbmZvLT5idGRtX2FudF9udW0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CQoJCglpZihwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCkKCXsKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICJbQWN0aW9uIE1hbnVhbCBjb250cm9sXSEhIik7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7Cgl9CgkKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMgLyAlZCIsICJCVCBzdGFjay8gaGNpIGV4dCB2ZXIiLCBcCgkJKChwU3RhY2tJbmZvLT5iUHJvZmlsZU5vdGlmaWVkKT8gIlllcyI6Ik5vIiksIHBTdGFja0luZm8tPmhjaVZlcnNpb24pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfRE9UMTFfQ0hOTCwgJndpZmlEb3QxMUNobmwpOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1UxX1dJRklfSFNfQ0hOTCwgJndpZmlIc0NobmwpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkKCVkKSIsICJEb3QxMSBjaGFubmVsIC8gSHNDaG5sKEhzTW9kZSkiLCBcCgkJd2lmaURvdDExQ2hubCwgd2lmaUhzQ2hubCwgYkJ0SHNPbik7CglDTF9QUklOVEYoY2xpQnVmKTsKCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUwMnggJTAyeCAlMDJ4ICIsICJIMkMgV2lmaSBpbmZvcm0gYnQgY2hubCBJbmZvIiwgXAoJCXBDb2V4RG0tPndpZmlDaG5sSW5mb1swXSwgcENvZXhEbS0+d2lmaUNobmxJbmZvWzFdLAoJCXBDb2V4RG0tPndpZmlDaG5sSW5mb1syXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfV0lGSV9SU1NJLCAmd2lmaVJzc2kpOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1M0X0hTX1JTU0ksICZidEhzUnNzaSk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICJXaWZpIHJzc2kvIEhTIHJzc2kiLCBcCgkJd2lmaVJzc2ksIGJ0SHNSc3NpKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZiU2Nhbik7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmYkxpbmspOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJmJSb2FtKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZCAiLCAiV2lmaSBiTGluay8gYlJvYW0vIGJTY2FuIiwgXAoJCWJMaW5rLCBiUm9hbSwgYlNjYW4pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfVU5ERVJfNUcsICZiV2lmaVVuZGVyNUcpOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJmJXaWZpQnVzeSk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9UUkFGRklDX0RJUkVDVElPTiwgJndpZmlUcmFmZmljRGlyKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMgLyAlcy8gJXMgIiwgIldpZmkgc3RhdHVzIiwgXAoJCShiV2lmaVVuZGVyNUc/ICI1RyI6IjIuNEciKSwKCQkoKEJUQ19XSUZJX0JXX0xFR0FDWT09d2lmaUJ3KT8gIkxlZ2FjeSI6ICgoKEJUQ19XSUZJX0JXX0hUNDA9PXdpZmlCdyk/ICJIVDQwIjoiSFQyMCIpKSksCgkJKCghYldpZmlCdXN5KT8gImlkbGUiOiAoKEJUQ19XSUZJX1RSQUZGSUNfVFg9PXdpZmlUcmFmZmljRGlyKT8gInVwbGluayI6ImRvd25saW5rIikpKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gWyVzLyAlZC8gJWRdICIsICJCVCBbc3RhdHVzLyByc3NpLyByZXRyeUNudF0iLCBcCgkJKChwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UpPygiaW5xdWlyeS9wYWdlIHNjYW4iKTooKEJUXzg3MjNBXzFBTlRfQlRfU1RBVFVTX0lETEUgPT0gcENvZXhEbS0+YnRTdGF0dXMpPyAiaWRsZSI6KCAgKEJUXzg3MjNBXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKT8gImNvbm5lY3RlZC1pZGxlIjoiYnVzeSIpKSksCgkJcENvZXhTdGEtPmJ0UnNzaSwgcENvZXhTdGEtPmJ0UmV0cnlDbnQpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkKCWlmKHBTdGFja0luZm8tPmJQcm9maWxlTm90aWZpZWQpCgl7CQkJCgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkIC8gJWQgLyAlZCIsICJTQ08vSElEL1BBTi9BMkRQIiwgXAoJCQlwU3RhY2tJbmZvLT5iU2NvRXhpc3QsIHBTdGFja0luZm8tPmJIaWRFeGlzdCwgcFN0YWNrSW5mby0+YlBhbkV4aXN0LCBwU3RhY2tJbmZvLT5iQTJkcEV4aXN0KTsKCQlDTF9QUklOVEYoY2xpQnVmKTsJCgoJCXBCdENvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2cocEJ0Q29leGlzdCwgQlRDX0RCR19ESVNQX0JUX0xJTktfSU5GTyk7Cgl9CgoJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMiLCAiQlQgSW5mbyBBMkRQIHJhdGUiLCBcCgkJKGJ0SW5mb0V4dCZCSVQwKT8gIkJhc2ljIHJhdGUiOiJFRFIgcmF0ZSIpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CQoKCWZvcihpPTA7IGk8QlRfSU5GT19TUkNfODcyM0FfMUFOVF9NQVg7IGkrKykKCXsKCQlpZihwQ29leFN0YS0+YnRJbmZvQzJoQ250W2ldKQoJCXsJCQkJCgkJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCglZCkiLCBHTEJ0SW5mb1NyYzg3MjNhMUFudFtpXSwgXAoJCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVswXSwgcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVsxXSwKCQkJCXBDb2V4U3RhLT5idEluZm9DMmhbaV1bMl0sIHBDb2V4U3RhLT5idEluZm9DMmhbaV1bM10sCgkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzRdLCBwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzVdLAoJCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVs2XSwgcENvZXhTdGEtPmJ0SW5mb0MyaENudFtpXSk7CgkJCUNMX1BSSU5URihjbGlCdWYpOwoJCX0KCX0KCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIiwgIndyaXRlIDB4MWFmPTB4MCBudW0iLCBcCgkJcENvZXhTdGEtPmMyaEhhbmdEZXRlY3RDbnQpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkKCS8vIFN3IG1lY2hhbmlzbQkKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtTdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CglDTF9QUklOVEYoY2xpQnVmKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkLyAlZCIsICJTTTFbU2hSZi8gTHBSQS8gTGltRGlnXSIsIFwKCQlwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaywgcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSwgcENvZXhEbS0+bGltaXRlZF9kaWcpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJLy8gRncgbWVjaGFuaXNtCQkKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtGdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CglDTF9QUklOVEYoY2xpQnVmKTsJCgkKCWlmKCFwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCkKCXsKCQlwc1RkbWFDYXNlID0gcENvZXhEbS0+Y3VyUHNUZG1hOwoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGNhc2UtJWQiLCAiUFMgVERNQSIsIFwKCQkJcENvZXhEbS0+cHNUZG1hUGFyYVswXSwgcENvZXhEbS0+cHNUZG1hUGFyYVsxXSwKCQkJcENvZXhEbS0+cHNUZG1hUGFyYVsyXSwgcENvZXhEbS0+cHNUZG1hUGFyYVszXSwKCQkJcENvZXhEbS0+cHNUZG1hUGFyYVs0XSwgcHNUZG1hQ2FzZSk7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkICIsICJJZ25XbGFuQWN0IiwgXAoJCQlwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCk7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7Cgl9CgoJLy8gSHcgc2V0dGluZwkJCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bSHcgc2V0dGluZ109PT09PT09PT09PT0iKTsKCUNMX1BSSU5URihjbGlCdWYpOwkKCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiUkYtQSwgMHgxZSBpbml0VmFsIiwgXAoJCXBDb2V4RG0tPmJ0UmYweDFlQmFja3VwKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg3NzgpOwoJdTFUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDc4Myk7Cgl1MVRtcFsyXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4Nzk2KTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleCIsICIweDc3OC8gMHg3ODMvIDB4Nzk2IiwgXAoJCXUxVG1wWzBdLCB1MVRtcFsxXSwgdTFUbXBbMl0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDg4MCk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg4ODAiLCBcCgkJdTRUbXBbMF0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDQwKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQwIiwgXAoJCXUxVG1wWzBdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg1NTApOwoJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDUyMik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLCAiMHg1NTAoYmNuIGN0cmwpLzB4NTIyIiwgXAoJCXU0VG1wWzBdLCB1MVRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NDg0KTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQ4NChyYXRlIGFkYXB0aXZlKSIsIFwKCQl1NFRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4YzUwKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweGM1MChkaWcpIiwgXAoJCXU0VG1wWzBdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhkYTApOwoJdTRUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGRhNCk7Cgl1NFRtcFsyXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4ZGE4KTsKCXU0VG1wWzNdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhkYWMpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4LyAweCV4IiwgIjB4ZGEwLzB4ZGE0LzB4ZGE4LzB4ZGFjKEZBIGNudCkiLCBcCgkJdTRUbXBbMF0sIHU0VG1wWzFdLCB1NFRtcFsyXSwgdTRUbXBbM10pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDZjMCk7Cgl1NFRtcFsxXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmM0KTsKCXU0VG1wWzJdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzgpOwoJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDZjYyk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLCAiMHg2YzAvMHg2YzQvMHg2YzgvMHg2Y2MoY29leFRhYmxlKSIsIFwKCQl1NFRtcFswXSwgdTRUbXBbMV0sIHU0VG1wWzJdLCB1MVRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCIsICIweDc3MCAoaHAgcnhbMzE6MTZdL3R4WzE1OjBdKSIsIFwKCQlwQ29leFN0YS0+aGlnaFByaW9yaXR5UngsIHBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIjB4Nzc0KGxwIHJ4WzMxOjE2XS90eFsxNTowXSkiLCBcCgkJcENvZXhTdGEtPmxvd1ByaW9yaXR5UngsIHBDb2V4U3RhLT5sb3dQcmlvcml0eVR4KTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCS8vIFR4IG1nbnQgcXVldWUgaGFuZyBvciBub3QsIDB4NDFiIHNob3VsZCA9IDB4ZiwgZXg6IDB4ZCA9PT5oYW5nCgl1MVRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NDFiKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQxYiAobWdudFEgaGFuZyBjaGsgPT0gMHhmKSIsIFwKCQl1MVRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsJCgoJcEJ0Q29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhwQnRDb2V4aXN0LCBCVENfREJHX0RJU1BfQ09FWF9TVEFUSVNUSUNTKTsKfQoKClZPSUQKRVhoYWxidGM4NzIzYTFhbnRfSXBzTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJdHlwZQoJKQp7CglpZihCVENfSVBTX0VOVEVSID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgSVBTIEVOVEVSIG5vdGlmeVxuIikpOwoJCWhhbGJ0Yzg3MjNhMWFudF9Db2V4QWxsT2ZmKHBCdENvZXhpc3QpOwoJfQoJZWxzZSBpZihCVENfSVBTX0xFQVZFID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgSVBTIExFQVZFIG5vdGlmeVxuIikpOwoJCS8vaGFsYnRjODcyM2ExYW50X0luaXRDb2V4RG0ocEJ0Q29leGlzdCk7Cgl9Cn0KClZPSUQKRVhoYWxidGM4NzIzYTFhbnRfTHBzTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJdHlwZQoJKQp7CglpZihCVENfTFBTX0VOQUJMRSA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIExQUyBFTkFCTEUgbm90aWZ5XG4iKSk7Cgl9CgllbHNlIGlmKEJUQ19MUFNfRElTQUJMRSA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIExQUyBESVNBQkxFIG5vdGlmeVxuIikpOwoJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKCX0KfQoKVk9JRApFWGhhbGJ0Yzg3MjNhMWFudF9TY2FuTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJdHlwZQoJKQp7CglCT09MRUFOCQliV2lmaUNvbm5lY3RlZD1GQUxTRTsKCQoJaGFsYnRjODcyM2ExYW50X05vdGlmeUZ3U2NhbihwQnRDb2V4aXN0LCB0eXBlKTsKCglpZihwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQpCgl7CgkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDkpOyAKCX0KCWVsc2UKCXsKCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CgkJaWYoQlRDX1NDQU5fU1RBUlQgPT0gdHlwZSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFNDQU4gU1RBUlQgbm90aWZ5XG4iKSk7CgkJCWlmKCFiV2lmaUNvbm5lY3RlZCkJLy8gbm9uLWNvbm5lY3RlZCBzY2FuCgkJCXsKCQkJCS8vc2V0IDB4NTUwWzNdPTEgYmVmb3JlIFBzVGRtYQoJCQkJaGFsYnRjODcyM2ExYW50X1JlZzB4NTUwQml0MyhwQnRDb2V4aXN0LCB0cnVlKTsKCQkJfQoKCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNCk7CgkJfQoJCWVsc2UgaWYoQlRDX1NDQU5fRklOSVNIID09IHR5cGUpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBTQ0FOIEZJTklTSCBub3RpZnlcbiIpKTsKCQkJaWYoIWJXaWZpQ29ubmVjdGVkKQkvLyBub24tY29ubmVjdGVkIHNjYW4KCQkJewoJCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOyAKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMWFudF9Db2V4Rm9yV2lmaUNvbm5lY3QocEJ0Q29leGlzdCk7CgkJCX0KCQl9Cgl9Cn0KClZPSUQKRVhoYWxidGM4NzIzYTFhbnRfQ29ubmVjdE5vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCXR5cGUKCSkKewoJQk9PTEVBTgkJYldpZmlDb25uZWN0ZWQ9RkFMU0U7CgkJCglpZihwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQpCgl7CgkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDkpOyAKCX0KCWVsc2UKCXsKCQlpZihCVENfQVNTT0NJQVRFX1NUQVJUID09IHR5cGUpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIFNUQVJUIG5vdGlmeVxuIikpOwoJCQkvL3NldCAweDU1MFszXT0xIGJlZm9yZSBQc1RkbWEKCQkJaGFsYnRjODcyM2ExYW50X1JlZzB4NTUwQml0MyhwQnRDb2V4aXN0LCB0cnVlKTsKCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOCk7CS8vIGV4dGVuZCB3aWZpIHNsb3QJCgkJfQoJCWVsc2UgaWYoQlRDX0FTU09DSUFURV9GSU5JU0ggPT0gdHlwZSkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIENPTk5FQ1QgRklOSVNIIG5vdGlmeVxuIikpOwoJCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CgkJCWlmKCFiV2lmaUNvbm5lY3RlZCkJLy8gbm9uLWNvbm5lY3RlZCBzY2FuCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWhhbGJ0Yzg3MjNhMWFudF9Db2V4Rm9yV2lmaUNvbm5lY3QocEJ0Q29leGlzdCk7CgkJCX0KCQl9Cgl9Cn0KClZPSUQKRVhoYWxidGM4NzIzYTFhbnRfTWVkaWFTdGF0dXNOb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXR5cGUKCSkKewoJaWYoQlRDX01FRElBX0NPTk5FQ1QgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBNRURJQSBjb25uZWN0IG5vdGlmeVxuIikpOwoJfQoJZWxzZQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIE1FRElBIGRpc2Nvbm5lY3Qgbm90aWZ5XG4iKSk7Cgl9Cn0KClZPSUQKRVhoYWxidGM4NzIzYTFhbnRfU3BlY2lhbFBhY2tldE5vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJdHlwZQoJKQp7CglpZih0eXBlID09IEJUQ19QQUNLRVRfREhDUCkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBESENQIFBhY2tldCBub3RpZnlcbiIpKTsKCQlpZihwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQpCgkJewoJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOSk7CQoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxOCk7CgkJfQkJCgl9Cn0KClZPSUQKRVhoYWxidGM4NzIzYTFhbnRfQnRJbmZvTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JcHUxQnl0ZQkJCXRtcEJ1ZiwKCUlOCXUxQnl0ZQkJCWxlbmd0aAoJKQp7Cgl1MUJ5dGUJCQlidEluZm89MDsKCXUxQnl0ZQkJCWksIHJzcFNvdXJjZT0wOwoJQk9PTEVBTgkJCWJCdEhzT249RkFMU0UsIGJCdEJ1c3k9RkFMU0UsIGJGb3JjZUxwcz1GQUxTRTsKCglwQ29leFN0YS0+YkMyaEJ0SW5mb1JlcVNlbnQgPSBGQUxTRTsKCQoJcnNwU291cmNlID0gQlRfSU5GT19TUkNfODcyM0FfMUFOVF9CVF9SU1A7CglwQ29leFN0YS0+YnRJbmZvQzJoQ250W3JzcFNvdXJjZV0rKzsKCglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBCdCBpbmZvWyVkXSwgbGVuZ3RoPSVkLCBoZXggZGF0YT1bIiwgcnNwU291cmNlLCBsZW5ndGgpKTsKCWZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCgl7CgkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdW2ldID0gdG1wQnVmW2ldOwoJCWlmKGkgPT0gMCkKCQkJYnRJbmZvID0gdG1wQnVmW2ldOwoJCWlmKGkgPT0gbGVuZ3RoLTEpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIjB4JTAyeF1cbiIsIHRtcEJ1ZltpXSkpOwoJCX0KCQllbHNlCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIjB4JTAyeCwgIiwgdG1wQnVmW2ldKSk7CgkJfQoJfQoKCWlmKEJUX0lORk9fU1JDXzg3MjNBXzFBTlRfV0lGSV9GVyAhPSByc3BTb3VyY2UpCgl7CgkJcENvZXhTdGEtPmJ0UmV0cnlDbnQgPQoJCQlwQ29leFN0YS0+YnRJbmZvQzJoW3JzcFNvdXJjZV1bMV07CgoJCXBDb2V4U3RhLT5idFJzc2kgPQoJCQlwQ29leFN0YS0+YnRJbmZvQzJoW3JzcFNvdXJjZV1bMl0qMisxMDsKCgkJcENvZXhTdGEtPmJ0SW5mb0V4dCA9IAoJCQlwQ29leFN0YS0+YnRJbmZvQzJoW3JzcFNvdXJjZV1bM107Cgl9CgkJCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbik7CgkvLyBjaGVjayBCSVQyIGZpcnN0ID09PiBjaGVjayBpZiBidCBpcyB1bmRlciBpbnF1aXJ5IG9yIHBhZ2Ugc2NhbgoJaWYoYnRJbmZvICYgQlRfSU5GT184NzIzQV8xQU5UX0JfSU5RX1BBR0UpCgl7CgkJcENvZXhTdGEtPmJDMmhCdElucXVpcnlQYWdlID0gdHJ1ZTsKCX0KCWVsc2UKCXsKCQlwQ29leFN0YS0+YkMyaEJ0SW5xdWlyeVBhZ2UgPSBGQUxTRTsKCX0KCWJ0SW5mbyAmPSB+QklUMjsKCWlmKCEoYnRJbmZvICYgQklUMCkpCgl7CgkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF9TVEFURV84NzIzQV8xQU5UX05PX0NPTk5FQ1RJT047CgkJYkZvcmNlTHBzID0gRkFMU0U7Cgl9CgllbHNlCgl7CgkJYkZvcmNlTHBzID0gdHJ1ZTsKCQlpZihidEluZm8gPT0gMHgxKQoJCXsKCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF9TVEFURV84NzIzQV8xQU5UX0NPTk5FQ1RfSURMRTsKCQl9CgkJZWxzZSBpZihidEluZm8gPT0gMHg5KQoJCXsKCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF9TVEFURV84NzIzQV8xQU5UX0FDTF9PTkxZX0JVU1k7CgkJCWJCdEJ1c3kgPSB0cnVlOwoJCX0KCQllbHNlIGlmKGJ0SW5mbyA9PSAweDEzKQoJCXsKCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF9TVEFURV84NzIzQV8xQU5UX1NDT19PTkxZX0JVU1k7CgkJCWJCdEJ1c3kgPSB0cnVlOwoJCX0KCQllbHNlIGlmKGJ0SW5mbyA9PSAweDFiKQoJCXsKCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF9TVEFURV84NzIzQV8xQU5UX0FDTF9TQ09fQlVTWTsKCQkJYkJ0QnVzeSA9IHRydWU7CgkJfQoJCWVsc2UgaWYoYnRJbmZvID09IDB4MjkpCgkJewoJCQlwQ29leERtLT5idFN0YXR1cyA9IEJUX1NUQVRFXzg3MjNBXzFBTlRfSElEX0JVU1k7CgkJCWJCdEJ1c3kgPSB0cnVlOwoJCX0KCQllbHNlIGlmKGJ0SW5mbyA9PSAweDNiKQoJCXsKCQkJcENvZXhEbS0+YnRTdGF0dXMgPSBCVF9TVEFURV84NzIzQV8xQU5UX0hJRF9TQ09fQlVTWTsKCQkJYkJ0QnVzeSA9IHRydWU7CgkJfQoJfQoJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0JMX0JUX1RSQUZGSUNfQlVTWSwgJmJCdEJ1c3kpOwoJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0JMX0JUX0xJTUlURURfRElHLCAmYkJ0QnVzeSk7CglpZihiRm9yY2VMcHMpCgkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9FTlRFUl9MUFMsIE5VTEwpOwoJZWxzZQoJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfTk9STUFMX0xQUywgTlVMTCk7CgoJaWYoIChCVF9TVEFURV84NzIzQV8xQU5UX05PX0NPTk5FQ1RJT04gPT0gcENvZXhEbS0+YnRTdGF0dXMpIHx8CgkJKEJUX1NUQVRFXzg3MjNBXzFBTlRfQ09OTkVDVF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKSApCgl7CgkJaWYocENvZXhTdGEtPmJDMmhCdElucXVpcnlQYWdlKQoJCQlwQ29leERtLT5idFN0YXR1cyA9IEJUX1NUQVRFXzg3MjNBXzFBTlRfSU5RX09SX1BBRzsKCX0KfQoKVk9JRApFWGhhbGJ0Yzg3MjNhMWFudF9TdGFja09wZXJhdGlvbk5vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJdHlwZQoJKQp7CglpZihCVENfU1RBQ0tfT1BfSU5RX1BBR0VfUEFJUl9TVEFSVCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFN0YWNrT1AgSW5xdWlyeS9wYWdlL3BhaXIgc3RhcnQgbm90aWZ5XG4iKSk7Cgl9CgllbHNlIGlmKEJUQ19TVEFDS19PUF9JTlFfUEFHRV9QQUlSX0ZJTklTSCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFN0YWNrT1AgSW5xdWlyeS9wYWdlL3BhaXIgZmluaXNoIG5vdGlmeVxuIikpOwoJfQp9CgpWT0lECkVYaGFsYnRjODcyM2ExYW50X0hhbHROb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0CgkpCnsKCWhhbGJ0Yzg3MjNhMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UsIDApOwoJCgloYWxidGM4NzIzYTFhbnRfTG93UGVuYWx0eVJhKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFKTsKCWhhbGJ0Yzg3MjNhMWFudF9SZlNocmluayhwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBGQUxTRSk7CgoJaGFsYnRjODcyM2ExYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgdHJ1ZSk7CglFWGhhbGJ0Yzg3MjNhMWFudF9NZWRpYVN0YXR1c05vdGlmeShwQnRDb2V4aXN0LCBCVENfTUVESUFfRElTQ09OTkVDVCk7Cn0KClZPSUQKRVhoYWxidGM4NzIzYTFhbnRfUGVyaW9kaWNhbCgKCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QKCSkKewoJQk9PTEVBTgkJYlNjYW49RkFMU0UsIGJMaW5rPUZBTFNFLCBiUm9hbT1GQUxTRSwgYldpZmlDb25uZWN0ZWQ9RkFMU0U7CgkKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIDFBbnQgUGVyaW9kaWNhbCEhXG4iKSk7CgkKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZiU2Nhbik7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmYkxpbmspOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJmJSb2FtKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKCgkvLyB3b3JrIGFyb3VuZCBmb3IgYzJoIGhhbmcKCXdhX2hhbGJ0Yzg3MjNhMWFudF9Nb25pdG9yQzJoKHBCdENvZXhpc3QpOwkKCgloYWxidGM4NzIzYTFhbnRfUXVlcnlCdEluZm8ocEJ0Q29leGlzdCk7CgloYWxidGM4NzIzYTFhbnRfTW9uaXRvckJ0Q3RyKHBCdENvZXhpc3QpOwoJaGFsYnRjODcyM2ExYW50X01vbml0b3JCdEVuYWJsZURpc2FibGUocEJ0Q29leGlzdCk7CgoJCglpZihiU2NhbikKCQlyZXR1cm47CglpZihiTGluaykKCQlyZXR1cm47CgoJaWYoYldpZmlDb25uZWN0ZWQpCgl7CgkJaWYocEJ0Q29leGlzdC0+YnRJbmZvLmJCdERpc2FibGVkKQoJCXsKCQkJaGFsYnRjODcyM2ExYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDkpOwoJCQkKCQkJaGFsYnRjODcyM2ExYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTFhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODcyM2ExYW50X0xvd1BlbmFsdHlSYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSk7CgkJCWhhbGJ0Yzg3MjNhMWFudF9SZlNocmluayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UpOwoJCQloYWxidGM4NzIzYTFhbnRfQ29leEZvcldpZmlDb25uZWN0KHBCdENvZXhpc3QpOwoJCX0KCX0KCWVsc2UKCXsKCQloYWxidGM4NzIzYTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgoJCWhhbGJ0Yzg3MjNhMWFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCQloYWxidGM4NzIzYTFhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFKTsKCX0KfQoKCiNlbmRpZgoK