Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gRGVzY3JpcHRpb246Ci8vCi8vIFRoaXMgZmlsZSBpcyBmb3IgODE5MmUxYW50IENvLWV4aXN0IG1lY2hhbmlzbQovLwovLyBIaXN0b3J5Ci8vIDIwMTIvMTEvMTUgQ29zYSBmaXJzdCBjaGVjayBpbi4KLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIGluY2x1ZGUgZmlsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KI2luY2x1ZGUgIk1wX1ByZWNvbXAuaCIKI2lmKEJUXzMwX1NVUFBPUlQgPT0gMSkKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gR2xvYmFsIHZhcmlhYmxlcywgdGhlc2UgYXJlIHN0YXRpYyB2YXJpYWJsZXMKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc3RhdGljIENPRVhfRE1fODE5MkVfMUFOVAkJR0xDb2V4RG04MTkyZTFBbnQ7CnN0YXRpYyBQQ09FWF9ETV84MTkyRV8xQU5UIAlwQ29leERtPSZHTENvZXhEbTgxOTJlMUFudDsKc3RhdGljIENPRVhfU1RBXzgxOTJFXzFBTlQJCUdMQ29leFN0YTgxOTJlMUFudDsKc3RhdGljIFBDT0VYX1NUQV84MTkyRV8xQU5UCXBDb2V4U3RhPSZHTENvZXhTdGE4MTkyZTFBbnQ7Cgpjb25zdCBjaGFyICpjb25zdCBHTEJ0SW5mb1NyYzgxOTJlMUFudFtdPXsKCSJCVCBJbmZvW3dpZmkgZnddIiwKCSJCVCBJbmZvW2J0IHJzcF0iLAoJIkJUIEluZm9bYnQgYXV0byByZXBvcnRdIiwKfTsKCnU0Qnl0ZQlHTENvZXhWZXJEYXRlODE5MmUxQW50PTIwMTMwNzI5Owp1NEJ5dGUJR0xDb2V4VmVyODE5MmUxQW50PTB4MTA7CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBsb2NhbCBmdW5jdGlvbiBwcm90byB0eXBlIGlmIG5lZWRlZAovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGhhbGJ0YzgxOTJlMWFudF8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KdTFCeXRlCmhhbGJ0YzgxOTJlMWFudF9CdFJzc2lTdGF0ZSgKCXUxQnl0ZQkJCWxldmVsTnVtLAoJdTFCeXRlCQkJcnNzaVRocmVzaCwKCXUxQnl0ZQkJCXJzc2lUaHJlc2gxCgkpCnsKCXM0Qnl0ZQkJCWJ0UnNzaT0wOwoJdTFCeXRlCQkJYnRSc3NpU3RhdGU9cENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlOwoKCWJ0UnNzaSA9IHBDb2V4U3RhLT5idFJzc2k7CgoJaWYobGV2ZWxOdW0gPT0gMikKCXsJCQkKCQlpZiggKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYoYnRSc3NpID49IChyc3NpVGhyZXNoK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8xQU5UKSkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1c7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKGJ0UnNzaSA8IHJzc2lUaHJlc2gpCgkJCXsKCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCWVsc2UgaWYobGV2ZWxOdW0gPT0gMykKCXsKCQlpZihyc3NpVGhyZXNoID4gcnNzaVRocmVzaDEpCgkJewoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSB0aHJlc2ggZXJyb3IhIVxuIikpOwoJCQlyZXR1cm4gcENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlOwoJCX0KCQkKCQlpZiggKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShwQ29leFN0YS0+cHJlQnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYoYnRSc3NpID49IChyc3NpVGhyZXNoK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8xQU5UKSkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlidFJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKCQkJfQoJCX0KCQllbHNlIGlmKCAocENvZXhTdGEtPnByZUJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKCQkJKHBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpCgkJewoJCQlpZihidFJzc2kgPj0gKHJzc2lUaHJlc2gxK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8xQU5UKSkKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9ISUdIOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKCQkJfQoJCQllbHNlIGlmKGJ0UnNzaSA8IHJzc2lUaHJlc2gpCgkJCXsKCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCBCVCBSc3NpIHN0YXRlIHN0YXkgYXQgTWVkaXVtXG4iKSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoYnRSc3NpIDwgcnNzaVRocmVzaDEpCgkJCXsKCQkJCWJ0UnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIEJUIFJzc2kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJYnRSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgQlQgUnNzaSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKCQkJfQoJCX0KCX0KCQkKCXBDb2V4U3RhLT5wcmVCdFJzc2lTdGF0ZSA9IGJ0UnNzaVN0YXRlOwoKCXJldHVybiBidFJzc2lTdGF0ZTsKfQoKdTFCeXRlCmhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJaW5kZXgsCglJTgl1MUJ5dGUJCQlsZXZlbE51bSwKCUlOCXUxQnl0ZQkJCXJzc2lUaHJlc2gsCglJTgl1MUJ5dGUJCQlyc3NpVGhyZXNoMQoJKQp7CglzNEJ5dGUJCQl3aWZpUnNzaT0wOwoJdTFCeXRlCQkJd2lmaVJzc2lTdGF0ZT1wQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF07CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1M0X1dJRklfUlNTSSwgJndpZmlSc3NpKTsKCQoJaWYobGV2ZWxOdW0gPT0gMikKCXsKCQlpZiggKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9MT1cpIHx8CgkJCShwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9MT1cpKQoJCXsKCQkJaWYod2lmaVJzc2kgPj0gKHJzc2lUaHJlc2grQlRDX1JTU0lfQ09FWF9USFJFU0hfVE9MXzgxOTJFXzFBTlQpKQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfSElHSDsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYod2lmaVJzc2kgPCByc3NpVGhyZXNoKQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CgkJCX0KCQl9Cgl9CgllbHNlIGlmKGxldmVsTnVtID09IDMpCgl7CgkJaWYocnNzaVRocmVzaCA+IHJzc2lUaHJlc2gxKQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHRocmVzaCBlcnJvciEhXG4iKSk7CgkJCXJldHVybiBwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF07CgkJfQoJCQoJCWlmKCAocENvZXhTdGEtPnByZVdpZmlSc3NpU3RhdGVbaW5kZXhdID09IEJUQ19SU1NJX1NUQVRFX0xPVykgfHwKCQkJKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0xPVykpCgkJewoJCQlpZih3aWZpUnNzaSA+PSAocnNzaVRocmVzaCtCVENfUlNTSV9DT0VYX1RIUkVTSF9UT0xfODE5MkVfMUFOVCkpCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7CgkJCX0KCQl9CgkJZWxzZSBpZiggKHBDb2V4U3RhLT5wcmVXaWZpUnNzaVN0YXRlW2luZGV4XSA9PSBCVENfUlNTSV9TVEFURV9NRURJVU0pIHx8CgkJCShwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKQoJCXsKCQkJaWYod2lmaVJzc2kgPj0gKHJzc2lUaHJlc2gxK0JUQ19SU1NJX0NPRVhfVEhSRVNIX1RPTF84MTkyRV8xQU5UKSkKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKCQkJfQoJCQllbHNlIGlmKHdpZmlSc3NpIDwgcnNzaVRocmVzaCkKCQkJewoJCQkJd2lmaVJzc2lTdGF0ZSA9IEJUQ19SU1NJX1NUQVRFX0xPVzsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19XSUZJX1JTU0lfU1RBVEUsICgiW0JUQ29leF0sIHdpZmkgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU07CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBNZWRpdW1cbiIpKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZih3aWZpUnNzaSA8IHJzc2lUaHJlc2gxKQoJCQl7CgkJCQl3aWZpUnNzaVN0YXRlID0gQlRDX1JTU0lfU1RBVEVfTUVESVVNOwoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1dJRklfUlNTSV9TVEFURSwgKCJbQlRDb2V4XSwgd2lmaSBSU1NJIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXdpZmlSc3NpU3RhdGUgPSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0g7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fV0lGSV9SU1NJX1NUQVRFLCAoIltCVENvZXhdLCB3aWZpIFJTU0kgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7CgkJCX0KCQl9Cgl9CgkJCglwQ29leFN0YS0+cHJlV2lmaVJzc2lTdGF0ZVtpbmRleF0gPSB3aWZpUnNzaVN0YXRlOwoKCXJldHVybiB3aWZpUnNzaVN0YXRlOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9VcGRhdGVyYV9tYXNrKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCQliRm9yY2VFeGVjLAoJSU4JdTFCeXRlCQkJCXR5cGUsCglJTgl1NEJ5dGUJCQkJcmF0ZU1hc2sKCSkKewoJaWYoQlRDX1JBVEVfRElTQUJMRSA9PSB0eXBlKQoJewoJCXBDb2V4RG0tPmN1cnJhX21hc2sgfD0gcmF0ZU1hc2s7CQkvLyBkaXNhYmxlIHJhdGUKCX0KCWVsc2UgaWYoQlRDX1JBVEVfRU5BQkxFID09IHR5cGUpCgl7CgkJcENvZXhEbS0+Y3VycmFfbWFzayAmPSB+cmF0ZU1hc2s7CS8vIGVuYWJsZSByYXRlCgl9CgkKCWlmKCBiRm9yY2VFeGVjIHx8IChwQ29leERtLT5wcmVyYV9tYXNrICE9IHBDb2V4RG0tPmN1cnJhX21hc2spKQoJewoJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfVVBEQVRFX3JhX21hc2ssICZwQ29leERtLT5jdXJyYV9tYXNrKTsKCX0KCXBDb2V4RG0tPnByZXJhX21hc2sgPSBwQ29leERtLT5jdXJyYV9tYXNrOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Nb25pdG9yQnRDdHIoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTRCeXRlIAkJCXJlZ0hQVHhSeCwgcmVnTFBUeFJ4LCB1NFRtcDsKCXU0Qnl0ZQkJCXJlZ0hQVHg9MCwgcmVnSFBSeD0wLCByZWdMUFR4PTAsIHJlZ0xQUng9MDsKCXUxQnl0ZQkJCXUxVG1wOwoJCglyZWdIUFR4UnggPSAweDc3MDsKCXJlZ0xQVHhSeCA9IDB4Nzc0OwoKCXU0VG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgcmVnSFBUeFJ4KTsKCXJlZ0hQVHggPSB1NFRtcCAmIE1BU0tMV09SRDsKCXJlZ0hQUnggPSAodTRUbXAgJiBNQVNLSFdPUkQpPj4xNjsKCgl1NFRtcCA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIHJlZ0xQVHhSeCk7CglyZWdMUFR4ID0gdTRUbXAgJiBNQVNLTFdPUkQ7CglyZWdMUFJ4ID0gKHU0VG1wICYgTUFTS0hXT1JEKT4+MTY7CgkJCglwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPSByZWdIUFR4OwoJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4ID0gcmVnSFBSeDsKCXBDb2V4U3RhLT5sb3dQcmlvcml0eVR4ID0gcmVnTFBUeDsKCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID0gcmVnTFBSeDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgSGlnaCBQcmlvcml0eSBUeC9SeCAocmVnIDB4JXgpPTB4JXgoJWQpLzB4JXgoJWQpXG4iLCAKCQlyZWdIUFR4UngsIHJlZ0hQVHgsIHJlZ0hQVHgsIHJlZ0hQUngsIHJlZ0hQUngpKTsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBMb3cgUHJpb3JpdHkgVHgvUnggKHJlZyAweCV4KT0weCV4KCVkKS8weCV4KCVkKVxuIiwgCgkJcmVnTFBUeFJ4LCByZWdMUFR4LCByZWdMUFR4LCByZWdMUFJ4LCByZWdMUFJ4KSk7CgoJLy8gcmVzZXQgY291bnRlcgoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NzZlLCAweGMpOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9RdWVyeUJ0SW5mbygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgoJcENvZXhTdGEtPmJDMmhCdEluZm9SZXFTZW50ID0gdHJ1ZTsKCglIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVDA7CS8vIHRyaWdnZXIKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgUXVlcnkgQnQgSW5mbywgRlcgd3JpdGUgMHg2MT0weCV4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4NjEsIDEsIEgyQ19QYXJhbWV0ZXIpOwp9CgpCT09MRUFOCmhhbGJ0YzgxOTJlMWFudF9Jc1dpZmlTdGF0dXNDaGFuZ2VkKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXN0YXRpYyBCT09MRUFOCWJQcmVXaWZpQnVzeT1GQUxTRSwgYlByZVVuZGVyNHdheT1GQUxTRSwgYlByZUJ0SHNPbj1GQUxTRTsKCUJPT0xFQU4JYldpZmlCdXN5PUZBTFNFLCBiVW5kZXI0d2F5PUZBTFNFLCBiQnRIc09uPUZBTFNFOwoJQk9PTEVBTgliV2lmaUNvbm5lY3RlZD1GQUxTRTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmYldpZmlCdXN5KTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJXzRfV0FZX1BST0dSRVNTLCAmYlVuZGVyNHdheSk7CgoJaWYoYldpZmlDb25uZWN0ZWQpCgl7CgkJaWYoYldpZmlCdXN5ICE9IGJQcmVXaWZpQnVzeSkKCQl7CgkJCWJQcmVXaWZpQnVzeSA9IGJXaWZpQnVzeTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWlmKGJVbmRlcjR3YXkgIT0gYlByZVVuZGVyNHdheSkKCQl7CgkJCWJQcmVVbmRlcjR3YXkgPSBiVW5kZXI0d2F5OwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJaWYoYkJ0SHNPbiAhPSBiUHJlQnRIc09uKQoJCXsKCQkJYlByZUJ0SHNPbiA9IGJCdEhzT247CgkJCXJldHVybiB0cnVlOwoJCX0KCX0KCglyZXR1cm4gRkFMU0U7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1VwZGF0ZUJ0TGlua0luZm8oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJUEJUQ19CVF9MSU5LX0lORk8JcEJ0TGlua0luZm89JnBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKCglwQnRMaW5rSW5mby0+YkJ0TGlua0V4aXN0ID0gcENvZXhTdGEtPmJCdExpbmtFeGlzdDsKCXBCdExpbmtJbmZvLT5iU2NvRXhpc3QgPSBwQ29leFN0YS0+YlNjb0V4aXN0OwoJcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgPSBwQ29leFN0YS0+YkEyZHBFeGlzdDsKCXBCdExpbmtJbmZvLT5iUGFuRXhpc3QgPSBwQ29leFN0YS0+YlBhbkV4aXN0OwoJcEJ0TGlua0luZm8tPmJIaWRFeGlzdCA9IHBDb2V4U3RhLT5iSGlkRXhpc3Q7CgoJLy8gY2hlY2sgaWYgU2NvIG9ubHkKCWlmKCBwQnRMaW5rSW5mby0+YlNjb0V4aXN0ICYmCgkJIXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICYmCgkJIXBCdExpbmtJbmZvLT5iUGFuRXhpc3QgJiYKCQkhcEJ0TGlua0luZm8tPmJIaWRFeGlzdCApCgkJcEJ0TGlua0luZm8tPmJTY29Pbmx5ID0gdHJ1ZTsKCWVsc2UKCQlwQnRMaW5rSW5mby0+YlNjb09ubHkgPSBGQUxTRTsKCgkvLyBjaGVjayBpZiBBMmRwIG9ubHkKCWlmKCAhcEJ0TGlua0luZm8tPmJTY29FeGlzdCAmJgoJCXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICYmCgkJIXBCdExpbmtJbmZvLT5iUGFuRXhpc3QgJiYKCQkhcEJ0TGlua0luZm8tPmJIaWRFeGlzdCApCgkJcEJ0TGlua0luZm8tPmJBMmRwT25seSA9IHRydWU7CgllbHNlCgkJcEJ0TGlua0luZm8tPmJBMmRwT25seSA9IEZBTFNFOwoKCS8vIGNoZWNrIGlmIFBhbiBvbmx5CglpZiggIXBCdExpbmtJbmZvLT5iU2NvRXhpc3QgJiYKCQkhcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgJiYKCQlwQnRMaW5rSW5mby0+YlBhbkV4aXN0ICYmCgkJIXBCdExpbmtJbmZvLT5iSGlkRXhpc3QgKQoJCXBCdExpbmtJbmZvLT5iUGFuT25seSA9IHRydWU7CgllbHNlCgkJcEJ0TGlua0luZm8tPmJQYW5Pbmx5ID0gRkFMU0U7CgkKCS8vIGNoZWNrIGlmIEhpZCBvbmx5CglpZiggIXBCdExpbmtJbmZvLT5iU2NvRXhpc3QgJiYKCQkhcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgJiYKCQkhcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgoJCXBCdExpbmtJbmZvLT5iSGlkRXhpc3QgKQoJCXBCdExpbmtJbmZvLT5iSGlkT25seSA9IHRydWU7CgllbHNlCgkJcEJ0TGlua0luZm8tPmJIaWRPbmx5ID0gRkFMU0U7Cn0KCnUxQnl0ZQpoYWxidGM4MTkyZTFhbnRfQWN0aW9uQWxnb3JpdGhtKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCVBCVENfQlRfTElOS19JTkZPCXBCdExpbmtJbmZvPSZwQnRDb2V4aXN0LT5idF9saW5rX2luZm87CglCT09MRUFOCQkJCWJCdEhzT249RkFMU0U7Cgl1MUJ5dGUJCQkJYWxnb3JpdGhtPUJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1VOREVGSU5FRDsKCXUxQnl0ZQkJCQludW1PZkRpZmZQcm9maWxlPTA7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOwoJCQoJaWYoIXBCdExpbmtJbmZvLT5iQnRMaW5rRXhpc3QpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBObyBCVCBsaW5rIGV4aXN0cyEhIVxuIikpOwoJCXJldHVybiBhbGdvcml0aG07Cgl9CgoJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCkKCQludW1PZkRpZmZQcm9maWxlKys7CglpZihwQnRMaW5rSW5mby0+YkhpZEV4aXN0KQoJCW51bU9mRGlmZlByb2ZpbGUrKzsKCWlmKHBCdExpbmtJbmZvLT5iUGFuRXhpc3QpCgkJbnVtT2ZEaWZmUHJvZmlsZSsrOwoJaWYocEJ0TGlua0luZm8tPmJBMmRwRXhpc3QpCgkJbnVtT2ZEaWZmUHJvZmlsZSsrOwoJCglpZihudW1PZkRpZmZQcm9maWxlID09IDEpCgl7CgkJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPIG9ubHlcbiIpKTsKCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fU0NPOwoJCX0KCQllbHNlCgkJewoJCQlpZihwQnRMaW5rSW5mby0+YkhpZEV4aXN0KQoJCQl7CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCBvbmx5XG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZihwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQIG9ubHlcbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0EyRFA7CgkJCX0KCQkJZWxzZSBpZihwQnRMaW5rSW5mby0+YlBhbkV4aXN0KQoJCQl7CgkJCQlpZihiQnRIc09uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEhTKSBvbmx5XG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFOSFM7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBQQU4oRURSKSBvbmx5XG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSOwoJCQkJfQoJCQl9CgkJfQoJfQoJZWxzZSBpZihudW1PZkRpZmZQcm9maWxlID09IDIpCgl7CgkJaWYocEJ0TGlua0luZm8tPmJTY29FeGlzdCkKCQl7CgkJCWlmKHBCdExpbmtJbmZvLT5iSGlkRXhpc3QpCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEXG4iKSk7CgkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISUQ7CgkJCX0KCQkJZWxzZSBpZihwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBBMkRQID09PiBTQ09cbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1NDTzsKCQkJfQoJCQllbHNlIGlmKHBCdExpbmtJbmZvLT5iUGFuRXhpc3QpCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fU0NPOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgUEFOKEVEUilcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWlmKCBwQnRMaW5rSW5mby0+YkhpZEV4aXN0ICYmCgkJCQlwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCApCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUFxuIikpOwoJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CgkJCX0KCQkJZWxzZSBpZiggcEJ0TGlua0luZm8tPmJIaWRFeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJQYW5FeGlzdCApCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oSFMpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEX0EyRFA7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZiggcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgKQoJCQl7CgkJCQlpZihiQnRIc09uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19BMkRQX1BBTkhTOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA7CgkJCQl9CgkJCX0KCQl9Cgl9CgllbHNlIGlmKG51bU9mRGlmZlByb2ZpbGUgPT0gMykKCXsKCQlpZihwQnRMaW5rSW5mby0+YlNjb0V4aXN0KQoJCXsKCQkJaWYoIHBCdExpbmtJbmZvLT5iSGlkRXhpc3QgJiYKCQkJCXBCdExpbmtJbmZvLT5iQTJkcEV4aXN0ICkKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQID09PiBISURcbiIpKTsKCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRDsKCQkJfQoJCQllbHNlIGlmKCBwQnRMaW5rSW5mby0+YkhpZEV4aXN0ICYmCgkJCQlwQnRMaW5rSW5mby0+YlBhbkV4aXN0ICkKCQkJewoJCQkJaWYoYkJ0SHNPbikKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihFRFIpXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCQllbHNlIGlmKCBwQnRMaW5rSW5mby0+YlBhbkV4aXN0ICYmCgkJCQlwQnRMaW5rSW5mby0+YkEyZHBFeGlzdCApCgkJCXsKCQkJCWlmKGJCdEhzT24pCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBBMkRQICsgUEFOKEhTKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1NDTzsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEEyRFAgKyBQQU4oRURSKSA9PT4gSElEXG4iKSk7CgkJCQkJYWxnb3JpdGhtID0gQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKCQkJCX0KCQkJfQoJCX0KCQllbHNlCgkJewoJCQlpZiggcEJ0TGlua0luZm8tPmJIaWRFeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgKQoJCQl7CgkJCQlpZihiQnRIc09uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oRURSKVxuIikpOwoJCQkJCWFsZ29yaXRobSA9IEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjsKCQkJCX0KCQkJfQoJCX0KCX0KCWVsc2UgaWYobnVtT2ZEaWZmUHJvZmlsZSA+PSAzKQoJewoJCWlmKHBCdExpbmtJbmZvLT5iU2NvRXhpc3QpCgkJewoJCQlpZiggcEJ0TGlua0luZm8tPmJIaWRFeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJQYW5FeGlzdCAmJgoJCQkJcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QgKQoJCQl7CgkJCQlpZihiQnRIc09uKQoJCQkJewoJCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKCgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBBMkRQICsgUEFOKEVEUik9PT5QQU4oRURSKStISURcbiIpKTsKCQkJCQlhbGdvcml0aG0gPSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiBhbGdvcml0aG07Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEZ3RGFjU3dpbmdMZXZlbCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCWRhY1N3aW5nTHZsCgkpCnsKCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMV0gPXswfTsKCgkvLyBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlIG9mIGRhY3N3aW5nCgkvLyAweDE4LyAweDEwLyAweGMvIDB4OC8gMHg0LyAweDYKCUgyQ19QYXJhbWV0ZXJbMF0gPSBkYWNTd2luZ0x2bDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgU2V0IERhYyBTd2luZyBMZXZlbD0weCV4XG4iLCBkYWNTd2luZ0x2bCkpOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0VYRUMsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4NjQ9MHgleFxuIiwgSDJDX1BhcmFtZXRlclswXSkpOwoKCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDY0LCAxLCBIMkNfUGFyYW1ldGVyKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU2V0RndEZWNCdFB3cigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCQlkZWNCdFB3ckx2bAoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgkKCUgyQ19QYXJhbWV0ZXJbMF0gPSBkZWNCdFB3ckx2bDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgZGVjcmVhc2UgQnQgUG93ZXIgbGV2ZWwgPSAlZCwgRlcgd3JpdGUgMHg2Mj0weCV4XG4iLCAKCQlkZWNCdFB3ckx2bCwgSDJDX1BhcmFtZXRlclswXSkpOwoKCXBCdENvZXhpc3QtPmJ0Y19maWxsX2gyYyhwQnRDb2V4aXN0LCAweDYyLCAxLCBIMkNfUGFyYW1ldGVyKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJCWJGb3JjZUV4ZWMsCglJTgl1MUJ5dGUJCQkJZGVjQnRQd3JMdmwKCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyBEZWMgQlQgcG93ZXIgbGV2ZWwgPSAlZFxuIiwgIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgZGVjQnRQd3JMdmwpKTsKCXBDb2V4RG0tPmN1ckJ0RGVjUHdyTHZsID0gZGVjQnRQd3JMdmw7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgQnREZWNQd3JMdmw9JWQsIGN1ckJ0RGVjUHdyTHZsPSVkXG4iLCAKCQkJcENvZXhEbS0+cHJlQnREZWNQd3JMdmwsIHBDb2V4RG0tPmN1ckJ0RGVjUHdyTHZsKSk7CgoJCWlmKHBDb2V4RG0tPnByZUJ0RGVjUHdyTHZsID09IHBDb2V4RG0tPmN1ckJ0RGVjUHdyTHZsKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODE5MmUxYW50X1NldEZ3RGVjQnRQd3IocEJ0Q29leGlzdCwgcENvZXhEbS0+Y3VyQnREZWNQd3JMdmwpOwoKCXBDb2V4RG0tPnByZUJ0RGVjUHdyTHZsID0gcENvZXhEbS0+Y3VyQnREZWNQd3JMdmw7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEZ3QnRMbmFDb25zdHJhaW4oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkJ0TG5hQ29uc09uCgkpCnsKCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMl0gPXswfTsKCQoJSDJDX1BhcmFtZXRlclswXSA9IDB4MzsJLy8gb3BDb2RlLCAweDM9QlRfU0VUX0xOQV9DT05TVFJBSU4KCglpZihiQnRMbmFDb25zT24pCgl7CgkJSDJDX1BhcmFtZXRlclsxXSB8PSBCSVQwOwoJfQoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBzZXQgQlQgTE5BIENvbnN0cmFpbjogJXMsIEZXIHdyaXRlIDB4Njk9MHgleFxuIiwgCgkJKGJCdExuYUNvbnNPbj8gIk9OISEiOiJPRkYhISIpLCAKCQlIMkNfUGFyYW1ldGVyWzBdPDw4fEgyQ19QYXJhbWV0ZXJbMV0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHg2OSwgMiwgSDJDX1BhcmFtZXRlcik7CQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9TZXRCdExuYUNvbnN0cmFpbigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJCdExuYUNvbnNPbgoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIEJUIENvbnN0cmFpbiA9ICVzXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSI6IiIpLCAoKGJCdExuYUNvbnNPbik/ICJPTiI6Ik9GRiIpKSk7CglwQ29leERtLT5iQ3VyQnRMbmFDb25zdHJhaW4gPSBiQnRMbmFDb25zT247CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUJ0TG5hQ29uc3RyYWluPSVkLCBiQ3VyQnRMbmFDb25zdHJhaW49JWRcbiIsIAoJCQlwQ29leERtLT5iUHJlQnRMbmFDb25zdHJhaW4sIHBDb2V4RG0tPmJDdXJCdExuYUNvbnN0cmFpbikpOwoKCQlpZihwQ29leERtLT5iUHJlQnRMbmFDb25zdHJhaW4gPT0gcENvZXhEbS0+YkN1ckJ0TG5hQ29uc3RyYWluKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODE5MmUxYW50X1NldEZ3QnRMbmFDb25zdHJhaW4ocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1ckJ0TG5hQ29uc3RyYWluKTsKCglwQ29leERtLT5iUHJlQnRMbmFDb25zdHJhaW4gPSBwQ29leERtLT5iQ3VyQnRMbmFDb25zdHJhaW47Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEZ3QnRQc2RNb2RlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJYnRQc2RNb2RlCgkpCnsKCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMl0gPXswfTsKCQoJSDJDX1BhcmFtZXRlclswXSA9IDB4MjsJLy8gb3BDb2RlLCAweDI9QlRfU0VUX1BTRF9NT0RFCgoJSDJDX1BhcmFtZXRlclsxXSA9IGJ0UHNkTW9kZTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgc2V0IEJUIFBTRCBtb2RlPTB4JXgsIEZXIHdyaXRlIDB4Njk9MHgleFxuIiwgCgkJSDJDX1BhcmFtZXRlclsxXSwgCgkJSDJDX1BhcmFtZXRlclswXTw8OHxIMkNfUGFyYW1ldGVyWzFdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4NjksIDIsIEgyQ19QYXJhbWV0ZXIpOwkKfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEJ0UHNkTW9kZSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JdTFCeXRlCQkJYnRQc2RNb2RlCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgQlQgUFNEIG1vZGUgPSAweCV4XG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSI6IiIpLCBidFBzZE1vZGUpKTsKCXBDb2V4RG0tPmJDdXJCdFBzZE1vZGUgPSBidFBzZE1vZGU7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUJ0UHNkTW9kZT0weCV4LCBiQ3VyQnRQc2RNb2RlPTB4JXhcbiIsIAoJCQlwQ29leERtLT5iUHJlQnRQc2RNb2RlLCBwQ29leERtLT5iQ3VyQnRQc2RNb2RlKSk7CgoJCWlmKHBDb2V4RG0tPmJQcmVCdFBzZE1vZGUgPT0gcENvZXhEbS0+YkN1ckJ0UHNkTW9kZSkgCgkJCXJldHVybjsKCX0KCWhhbGJ0YzgxOTJlMWFudF9TZXRGd0J0UHNkTW9kZShwQnRDb2V4aXN0LCBwQ29leERtLT5iQ3VyQnRQc2RNb2RlKTsKCglwQ29leERtLT5iUHJlQnRQc2RNb2RlID0gcENvZXhEbS0+YkN1ckJ0UHNkTW9kZTsKfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEJ0QXV0b1JlcG9ydCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRW5hYmxlQXV0b1JlcG9ydAoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzFdID17MH07CgkKCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOwoKCWlmKGJFbmFibGVBdXRvUmVwb3J0KQoJewoJCUgyQ19QYXJhbWV0ZXJbMF0gfD0gQklUMDsKCX0KCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgQlQgRlcgYXV0byByZXBvcnQgOiAlcywgRlcgd3JpdGUgMHg2OD0weCV4XG4iLCAKCQkoYkVuYWJsZUF1dG9SZXBvcnQ/ICJFbmFibGVkISEiOiJEaXNhYmxlZCEhIiksIEgyQ19QYXJhbWV0ZXJbMF0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHg2OCwgMSwgSDJDX1BhcmFtZXRlcik7CQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9CdEF1dG9SZXBvcnQoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkZvcmNlRXhlYywKCUlOCUJPT0xFQU4JCQliRW5hYmxlQXV0b1JlcG9ydAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIEJUIEF1dG8gcmVwb3J0ID0gJXNcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkVuYWJsZUF1dG9SZXBvcnQpPyAiRW5hYmxlZCI6IkRpc2FibGVkIikpKTsKCXBDb2V4RG0tPmJDdXJCdEF1dG9SZXBvcnQgPSBiRW5hYmxlQXV0b1JlcG9ydDsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQnRBdXRvUmVwb3J0PSVkLCBiQ3VyQnRBdXRvUmVwb3J0PSVkXG4iLCAKCQkJcENvZXhEbS0+YlByZUJ0QXV0b1JlcG9ydCwgcENvZXhEbS0+YkN1ckJ0QXV0b1JlcG9ydCkpOwoKCQlpZihwQ29leERtLT5iUHJlQnRBdXRvUmVwb3J0ID09IHBDb2V4RG0tPmJDdXJCdEF1dG9SZXBvcnQpIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4MTkyZTFhbnRfU2V0QnRBdXRvUmVwb3J0KHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJCdEF1dG9SZXBvcnQpOwoKCXBDb2V4RG0tPmJQcmVCdEF1dG9SZXBvcnQgPSBwQ29leERtLT5iQ3VyQnRBdXRvUmVwb3J0Owp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Gd0RhY1N3aW5nTHZsKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTgl1MUJ5dGUJCQlmd0RhY1N3aW5nTHZsCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgc2V0IEZXIERhYyBTd2luZyBsZXZlbCA9ICVkXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCBmd0RhY1N3aW5nTHZsKSk7CglwQ29leERtLT5jdXJGd0RhY1N3aW5nTHZsID0gZndEYWNTd2luZ0x2bDsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVGd0RhY1N3aW5nTHZsPSVkLCBjdXJGd0RhY1N3aW5nTHZsPSVkXG4iLCAKCQkJcENvZXhEbS0+cHJlRndEYWNTd2luZ0x2bCwgcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bCkpOwoKCQlpZihwQ29leERtLT5wcmVGd0RhY1N3aW5nTHZsID09IHBDb2V4RG0tPmN1ckZ3RGFjU3dpbmdMdmwpIAoJCQlyZXR1cm47Cgl9CgoJaGFsYnRjODE5MmUxYW50X1NldEZ3RGFjU3dpbmdMZXZlbChwQnRDb2V4aXN0LCBwQ29leERtLT5jdXJGd0RhY1N3aW5nTHZsKTsKCglwQ29leERtLT5wcmVGd0RhY1N3aW5nTHZsID0gcENvZXhEbS0+Y3VyRndEYWNTd2luZ0x2bDsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU2V0U3dSZlJ4THBmQ29ybmVyKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KCSkKewoJaWYoYlJ4UmZTaHJpbmtPbikKCXsKCQkvL1NocmluayBSRiBSeCBMUEYgY29ybmVyCgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgxZSwgMHhmZmZmZiwgMHhmMGZmNyk7Cgl9CgllbHNlCgl7CgkJLy9SZXN1bWUgUkYgUnggTFBGIGNvcm5lcgoJCS8vIEFmdGVyIGluaXRpYWxpemVkLCB3ZSBjYW4gdXNlIHBDb2V4RG0tPmJ0UmYweDFlQmFja3VwCgkJaWYocEJ0Q29leGlzdC0+aW5pdGlsaXplZCkKCQl7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBSZXN1bWUgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDFlLCAweGZmZmZmLCBwQ29leERtLT5idFJmMHgxZUJhY2t1cCk7CgkJfQoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9SZlNocmluaygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJSeFJmU2hyaW5rT24KCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIFJ4IFJGIFNocmluayA9ICVzXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJSeFJmU2hyaW5rT24pPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmsgPSBiUnhSZlNocmlua09uOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVSZlJ4THBmU2hyaW5rPSVkLCBiQ3VyUmZSeExwZlNocmluaz0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rLCBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaykpOwoKCQlpZihwQ29leERtLT5iUHJlUmZSeExwZlNocmluayA9PSBwQ29leERtLT5iQ3VyUmZSeExwZlNocmluaykgCgkJCXJldHVybjsKCX0KCWhhbGJ0YzgxOTJlMWFudF9TZXRTd1JmUnhMcGZDb3JuZXIocEJ0Q29leGlzdCwgcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbmspOwoKCXBDb2V4RG0tPmJQcmVSZlJ4THBmU2hyaW5rID0gcENvZXhEbS0+YkN1clJmUnhMcGZTaHJpbms7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKCSkKewoJdTFCeXRlCXRtcFUxOwoKCXRtcFUxID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg0ZmQpOwoJdG1wVTEgfD0gQklUMDsKCWlmKGJMb3dQZW5hbHR5UmEpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFR4IHJhdGUgYWRhcHRpdmUsIHNldCBsb3cgcGVuYWx0eSEhXG4iKSk7CgkJdG1wVTEgJj0gfkJJVDI7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIFR4IHJhdGUgYWRhcHRpdmUsIHNldCBub3JtYWwhIVxuIikpOwoJCXRtcFUxIHw9IEJJVDI7Cgl9CgoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NGZkLCB0bXBVMSk7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X0xvd1BlbmFsdHlSYSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJMb3dQZW5hbHR5UmEKCSkKewoJcmV0dXJuOwoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyB0dXJuIExvd1BlbmFsdHlSQSA9ICVzXG4iLCAgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCAoKGJMb3dQZW5hbHR5UmEpPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1ckxvd1BlbmFsdHlSYSA9IGJMb3dQZW5hbHR5UmE7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUxvd1BlbmFsdHlSYT0lZCwgYkN1ckxvd1BlbmFsdHlSYT0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEsIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpKTsKCgkJaWYocENvZXhEbS0+YlByZUxvd1BlbmFsdHlSYSA9PSBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhKSAKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODE5MmUxYW50X1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKHBCdENvZXhpc3QsIHBDb2V4RG0tPmJDdXJMb3dQZW5hbHR5UmEpOwoKCXBDb2V4RG0tPmJQcmVMb3dQZW5hbHR5UmEgPSBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9TZXREYWNTd2luZ1JlZygKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXU0Qnl0ZQkJCWxldmVsCgkpCnsKCXUxQnl0ZQl2YWw9KHUxQnl0ZSlsZXZlbDsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgV3JpdGUgU3dEYWNTd2luZyA9IDB4JXhcbiIsIGxldmVsKSk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhwQnRDb2V4aXN0LCAweDg4MywgMHgzZSwgdmFsKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU2V0U3dGdWxsVGltZURhY1N3aW5nKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJTd0RhY1N3aW5nT24sCglJTgl1NEJ5dGUJCQlzd0RhY1N3aW5nTHZsCgkpCnsKCWlmKGJTd0RhY1N3aW5nT24pCgl7CgkJaGFsYnRjODE5MmUxYW50X1NldERhY1N3aW5nUmVnKHBCdENvZXhpc3QsIHN3RGFjU3dpbmdMdmwpOwoJfQoJZWxzZQoJewoJCWhhbGJ0YzgxOTJlMWFudF9TZXREYWNTd2luZ1JlZyhwQnRDb2V4aXN0LCAweDE4KTsKCX0KfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkRhY1N3aW5nT24sCglJTgl1NEJ5dGUJCQlkYWNTd2luZ0x2bAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHR1cm4gRGFjU3dpbmc9JXMsIGRhY1N3aW5nTHZsPTB4JXhcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkRhY1N3aW5nT24pPyAiT04iOiJPRkYiKSwgZGFjU3dpbmdMdmwpKTsKCXBDb2V4RG0tPmJDdXJEYWNTd2luZ09uID0gYkRhY1N3aW5nT247CglwQ29leERtLT5jdXJEYWNTd2luZ0x2bCA9IGRhY1N3aW5nTHZsOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVEYWNTd2luZ09uPSVkLCBwcmVEYWNTd2luZ0x2bD0weCV4LCBiQ3VyRGFjU3dpbmdPbj0lZCwgY3VyRGFjU3dpbmdMdmw9MHgleFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVEYWNTd2luZ09uLCBwQ29leERtLT5wcmVEYWNTd2luZ0x2bCwKCQkJcENvZXhEbS0+YkN1ckRhY1N3aW5nT24sIHBDb2V4RG0tPmN1ckRhY1N3aW5nTHZsKSk7CgoJCWlmKCAocENvZXhEbS0+YlByZURhY1N3aW5nT24gPT0gcENvZXhEbS0+YkN1ckRhY1N3aW5nT24pICYmCgkJCShwQ29leERtLT5wcmVEYWNTd2luZ0x2bCA9PSBwQ29leERtLT5jdXJEYWNTd2luZ0x2bCkgKQoJCQlyZXR1cm47Cgl9CgltZGVsYXkoMzApOwoJaGFsYnRjODE5MmUxYW50X1NldFN3RnVsbFRpbWVEYWNTd2luZyhwQnRDb2V4aXN0LCBiRGFjU3dpbmdPbiwgZGFjU3dpbmdMdmwpOwoKCXBDb2V4RG0tPmJQcmVEYWNTd2luZ09uID0gcENvZXhEbS0+YkN1ckRhY1N3aW5nT247CglwQ29leERtLT5wcmVEYWNTd2luZ0x2bCA9IHBDb2V4RG0tPmN1ckRhY1N3aW5nTHZsOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9TZXRBZGNCYWNrT2ZmKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJBZGNCYWNrT2ZmCgkpCnsKCWlmKGJBZGNCYWNrT2ZmKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBCQiBCYWNrT2ZmIExldmVsIE9uIVxuIikpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKHBCdENvZXhpc3QsIDB4OGRiLCAweDYwLCAweDMpOwoJfQoJZWxzZQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBCQiBCYWNrT2ZmIExldmVsIE9mZiFcbiIpKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGVfYml0bWFzayhwQnRDb2V4aXN0LCAweDhkYiwgMHg2MCwgMHgxKTsKCX0KfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWRjQmFja09mZigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JQk9PTEVBTgkJCWJBZGNCYWNrT2ZmCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TVywgKCJbQlRDb2V4XSwgJXMgdHVybiBBZGNCYWNrT2ZmID0gJXNcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkFkY0JhY2tPZmYpPyAiT04iOiJPRkYiKSkpOwoJcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYgPSBiQWRjQmFja09mZjsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlQWRjQmFja09mZj0lZCwgYkN1ckFkY0JhY2tPZmY9JWRcbiIsIAoJCQlwQ29leERtLT5iUHJlQWRjQmFja09mZiwgcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYpKTsKCgkJaWYocENvZXhEbS0+YlByZUFkY0JhY2tPZmYgPT0gcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYpIAoJCQlyZXR1cm47Cgl9CgloYWxidGM4MTkyZTFhbnRfU2V0QWRjQmFja09mZihwQnRDb2V4aXN0LCBwQ29leERtLT5iQ3VyQWRjQmFja09mZik7CgoJcENvZXhEbS0+YlByZUFkY0JhY2tPZmYgPSBwQ29leERtLT5iQ3VyQWRjQmFja09mZjsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU2V0QWdjVGFibGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJYkFnY1RhYmxlRW4KCSkKewoJdTFCeXRlCQlyc3NpQWRqdXN0VmFsPTA7CgkKCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweGVmLCAweGZmZmZmLCAweDAyMDAwKTsKCWlmKGJBZ2NUYWJsZUVuKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBBZ2MgVGFibGUgT24hXG4iKSk7CgkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4M2IsIDB4ZmZmZmYsIDB4M2ZhNTgpOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDM3YTU4KTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgyZmE1OCk7CgkJcnNzaUFkanVzdFZhbCA9IDg7Cgl9CgllbHNlCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIEFnYyBUYWJsZSBPZmYhXG4iKSk7CgkJcEJ0Q29leGlzdC0+YnRjX3NldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4M2IsIDB4ZmZmZmYsIDB4MzkyNTgpOwoJCXBCdENvZXhpc3QtPmJ0Y19zZXRfcmZfcmVnKHBCdENvZXhpc3QsIEJUQ19SRl9BLCAweDNiLCAweGZmZmZmLCAweDMxMjU4KTsKCQlwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHgzYiwgMHhmZmZmZiwgMHgyOTI1OCk7Cgl9CglwQnRDb2V4aXN0LT5idGNfc2V0X3JmX3JlZyhwQnRDb2V4aXN0LCBCVENfUkZfQSwgMHhlZiwgMHhmZmZmZiwgMHgwKTsKCgkvLyBzZXQgcnNzaUFkanVzdFZhbCBmb3Igd2lmaSBtb2R1bGUuCglwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfVTFfUlNTSV9BREpfVkFMX0ZPUl9BR0NfVEFCTEVfT04sICZyc3NpQWRqdXN0VmFsKTsKfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X0FnY1RhYmxlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkFnY1RhYmxlRW4KCSkKewoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXLCAoIltCVENvZXhdLCAlcyAlcyBBZ2MgVGFibGVcbiIsICAKCQkoYkZvcmNlRXhlYz8gImZvcmNlIHRvIjoiIiksICgoYkFnY1RhYmxlRW4pPyAiRW5hYmxlIjoiRGlzYWJsZSIpKSk7CglwQ29leERtLT5iQ3VyQWdjVGFibGVFbiA9IGJBZ2NUYWJsZUVuOwoKCWlmKCFiRm9yY2VFeGVjKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19ERVRBSUwsICgiW0JUQ29leF0sIGJQcmVBZ2NUYWJsZUVuPSVkLCBiQ3VyQWdjVGFibGVFbj0lZFxuIiwgCgkJCXBDb2V4RG0tPmJQcmVBZ2NUYWJsZUVuLCBwQ29leERtLT5iQ3VyQWdjVGFibGVFbikpOwoKCQlpZihwQ29leERtLT5iUHJlQWdjVGFibGVFbiA9PSBwQ29leERtLT5iQ3VyQWdjVGFibGVFbikgCgkJCXJldHVybjsKCX0KCWhhbGJ0YzgxOTJlMWFudF9TZXRBZ2NUYWJsZShwQnRDb2V4aXN0LCBiQWdjVGFibGVFbik7CgoJcENvZXhEbS0+YlByZUFnY1RhYmxlRW4gPSBwQ29leERtLT5iQ3VyQWdjVGFibGVFbjsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU2V0Q29leFRhYmxlKAoJSU4JUEJUQ19DT0VYSVNUCXBCdENvZXhpc3QsCglJTgl1NEJ5dGUJCXZhbDB4NmMwLAoJSU4JdTRCeXRlCQl2YWwweDZjNCwKCUlOCXU0Qnl0ZQkJdmFsMHg2YzgsCglJTgl1MUJ5dGUJCXZhbDB4NmNjCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmMwPTB4JXhcbiIsIHZhbDB4NmMwKSk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzAsIHZhbDB4NmMwKTsKCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfRVhFQywgKCJbQlRDb2V4XSwgc2V0IGNvZXggdGFibGUsIHNldCAweDZjND0weCV4XG4iLCB2YWwweDZjNCkpOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4NmM0LCB2YWwweDZjNCk7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX1NXX0VYRUMsICgiW0JUQ29leF0sIHNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Yzg9MHgleFxuIiwgdmFsMHg2YzgpKTsKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDZjOCwgdmFsMHg2YzgpOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9TV19FWEVDLCAoIltCVENvZXhdLCBzZXQgY29leCB0YWJsZSwgc2V0IDB4NmNjPTB4JXhcbiIsIHZhbDB4NmNjKSk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg2Y2MsIHZhbDB4NmNjKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTgl1NEJ5dGUJCQl2YWwweDZjMCwKCUlOCXU0Qnl0ZQkJCXZhbDB4NmM0LAoJSU4JdTRCeXRlCQkJdmFsMHg2YzgsCglJTgl1MUJ5dGUJCQl2YWwweDZjYwoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1csICgiW0JUQ29leF0sICVzIHdyaXRlIENvZXggVGFibGUgMHg2YzA9MHgleCwgMHg2YzQ9MHgleCwgMHg2Yzg9MHgleCwgMHg2Y2M9MHgleFxuIiwgCgkJKGJGb3JjZUV4ZWM/ICJmb3JjZSB0byI6IiIpLCB2YWwweDZjMCwgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYykpOwoJcENvZXhEbS0+Y3VyVmFsMHg2YzAgPSB2YWwweDZjMDsKCXBDb2V4RG0tPmN1clZhbDB4NmM0ID0gdmFsMHg2YzQ7CglwQ29leERtLT5jdXJWYWwweDZjOCA9IHZhbDB4NmM4OwoJcENvZXhEbS0+Y3VyVmFsMHg2Y2MgPSB2YWwweDZjYzsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBwcmVWYWwweDZjMD0weCV4LCBwcmVWYWwweDZjND0weCV4LCBwcmVWYWwweDZjOD0weCV4LCBwcmVWYWwweDZjYz0weCV4ICEhXG4iLCAKCQkJcENvZXhEbS0+cHJlVmFsMHg2YzAsIHBDb2V4RG0tPnByZVZhbDB4NmM0LCBwQ29leERtLT5wcmVWYWwweDZjOCwgcENvZXhEbS0+cHJlVmFsMHg2Y2MpKTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfU1dfREVUQUlMLCAoIltCVENvZXhdLCBjdXJWYWwweDZjMD0weCV4LCBjdXJWYWwweDZjND0weCV4LCBjdXJWYWwweDZjOD0weCV4LCBjdXJWYWwweDZjYz0weCV4ICEhXG4iLCAKCQkJcENvZXhEbS0+Y3VyVmFsMHg2YzAsIHBDb2V4RG0tPmN1clZhbDB4NmM0LCBwQ29leERtLT5jdXJWYWwweDZjOCwgcENvZXhEbS0+Y3VyVmFsMHg2Y2MpKTsKCQoJCWlmKCAocENvZXhEbS0+cHJlVmFsMHg2YzAgPT0gcENvZXhEbS0+Y3VyVmFsMHg2YzApICYmCgkJCShwQ29leERtLT5wcmVWYWwweDZjNCA9PSBwQ29leERtLT5jdXJWYWwweDZjNCkgJiYKCQkJKHBDb2V4RG0tPnByZVZhbDB4NmM4ID09IHBDb2V4RG0tPmN1clZhbDB4NmM4KSAmJgoJCQkocENvZXhEbS0+cHJlVmFsMHg2Y2MgPT0gcENvZXhEbS0+Y3VyVmFsMHg2Y2MpICkKCQkJcmV0dXJuOwoJfQoJaGFsYnRjODE5MmUxYW50X1NldENvZXhUYWJsZShwQnRDb2V4aXN0LCB2YWwweDZjMCwgdmFsMHg2YzQsIHZhbDB4NmM4LCB2YWwweDZjYyk7CgoJcENvZXhEbS0+cHJlVmFsMHg2YzAgPSBwQ29leERtLT5jdXJWYWwweDZjMDsKCXBDb2V4RG0tPnByZVZhbDB4NmM0ID0gcENvZXhEbS0+Y3VyVmFsMHg2YzQ7CglwQ29leERtLT5wcmVWYWwweDZjOCA9IHBDb2V4RG0tPmN1clZhbDB4NmM4OwoJcENvZXhEbS0+cHJlVmFsMHg2Y2MgPSBwQ29leERtLT5jdXJWYWwweDZjYzsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJCWJGb3JjZUV4ZWMsCglJTgl1MUJ5dGUJCQkJdHlwZQoJKQp7Cglzd2l0Y2godHlwZSkKCXsKCQljYXNlIDA6CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgYkZvcmNlRXhlYywgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhmZmZmZmYsIDB4Myk7CgkJCWJyZWFrOwoJCWNhc2UgMToKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweDU1NTU1NTU1LCAweDVhNWE1YTVhLCAweGZmZmZmZiwgMHgzKTsKCQkJYnJlYWs7CgkJY2FzZSAyOgoJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIGJGb3JjZUV4ZWMsIDB4NWE1YTVhNWEsIDB4NWE1YTVhNWEsIDB4ZmZmZmZmLCAweDMpOwoJCQlicmVhazsKCQljYXNlIDM6CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgYkZvcmNlRXhlYywgMHhhYWFhYWFhYSwgMHhhYWFhYWFhYSwgMHhmZmZmZmYsIDB4Myk7CgkJCWJyZWFrOwoJCWNhc2UgNDoKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZiwgMHgzKTsKCQkJYnJlYWs7CgkJY2FzZSA1OgoJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIGJGb3JjZUV4ZWMsIDB4NWZmZjVmZmYsIDB4NWZmZjVmZmYsIDB4ZmZmZmZmLCAweDMpOwoJCQlicmVhazsKCQljYXNlIDY6CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGUocEJ0Q29leGlzdCwgYkZvcmNlRXhlYywgMHg1NWZmNTVmZiwgMHg1YTVhNWE1YSwgMHhmZmZmZmYsIDB4Myk7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweGRkZmZkZGZmLCAweGRkZmZkZGZmLCAweGZmZmZmZiwgMHgzKTsKCQkJYnJlYWs7CgkJY2FzZSA4OgoJCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlKHBCdENvZXhpc3QsIGJGb3JjZUV4ZWMsIDB4NTVmZjU1ZmYsIDB4NWFmYTVhZmEsIDB4ZmZmZmZmLCAweDMpOwoJCQlicmVhazsJCQoJCWNhc2UgOToKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZShwQnRDb2V4aXN0LCBiRm9yY2VFeGVjLCAweDVmNWY1ZjVmLCAweDVmNWY1ZjVmLCAweGZmZmZmZiwgMHgzKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJYnJlYWs7Cgl9Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEZ3SWdub3JlV2xhbkFjdCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRW5hYmxlCgkpCnsKCXUxQnl0ZQkJCUgyQ19QYXJhbWV0ZXJbMV0gPXswfTsKCQkKCWlmKGJFbmFibGUpCgl7CgkJSDJDX1BhcmFtZXRlclswXSB8PSBCSVQwOwkJLy8gZnVuY3Rpb24gZW5hYmxlCgl9CgkKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19FWEVDLCAoIltCVENvZXhdLCBzZXQgRlcgZm9yIEJUIElnbm9yZSBXbGFuX0FjdCwgRlcgd3JpdGUgMHg2Mz0weCV4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2ZpbGxfaDJjKHBCdENvZXhpc3QsIDB4NjMsIDEsIEgyQ19QYXJhbWV0ZXIpOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9JZ25vcmVXbGFuQWN0KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYkVuYWJsZQoJKQp7CglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRlcsICgiW0JUQ29leF0sICVzIHR1cm4gSWdub3JlIFdsYW5BY3QgJXNcbiIsIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKGJFbmFibGU/ICJPTiI6Ik9GRiIpKSk7CglwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCA9IGJFbmFibGU7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgYlByZUlnbm9yZVdsYW5BY3QgPSAlZCwgYkN1cklnbm9yZVdsYW5BY3QgPSAlZCEhXG4iLCAKCQkJcENvZXhEbS0+YlByZUlnbm9yZVdsYW5BY3QsIHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KSk7CgoJCWlmKHBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID09IHBDb2V4RG0tPmJDdXJJZ25vcmVXbGFuQWN0KQoJCQlyZXR1cm47Cgl9CgloYWxidGM4MTkyZTFhbnRfU2V0RndJZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIGJFbmFibGUpOwoKCXBDb2V4RG0tPmJQcmVJZ25vcmVXbGFuQWN0ID0gcENvZXhEbS0+YkN1cklnbm9yZVdsYW5BY3Q7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJYnl0ZTEsCglJTgl1MUJ5dGUJCQlieXRlMiwKCUlOCXUxQnl0ZQkJCWJ5dGUzLAoJSU4JdTFCeXRlCQkJYnl0ZTQsCglJTgl1MUJ5dGUJCQlieXRlNQoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzVdID17MH07CgoJSDJDX1BhcmFtZXRlclswXSA9IGJ5dGUxOwkKCUgyQ19QYXJhbWV0ZXJbMV0gPSBieXRlMjsJCglIMkNfUGFyYW1ldGVyWzJdID0gYnl0ZTM7CglIMkNfUGFyYW1ldGVyWzNdID0gYnl0ZTQ7CglIMkNfUGFyYW1ldGVyWzRdID0gYnl0ZTU7CgoJcENvZXhEbS0+cHNUZG1hUGFyYVswXSA9IGJ5dGUxOwoJcENvZXhEbS0+cHNUZG1hUGFyYVsxXSA9IGJ5dGUyOwoJcENvZXhEbS0+cHNUZG1hUGFyYVsyXSA9IGJ5dGUzOwoJcENvZXhEbS0+cHNUZG1hUGFyYVszXSA9IGJ5dGU0OwoJcENvZXhEbS0+cHNUZG1hUGFyYVs0XSA9IGJ5dGU1OwoJCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHg2MCg1Ynl0ZXMpPTB4JXglMDh4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdLCAKCQlIMkNfUGFyYW1ldGVyWzFdPDwyNHxIMkNfUGFyYW1ldGVyWzJdPDwxNnxIMkNfUGFyYW1ldGVyWzNdPDw4fEgyQ19QYXJhbWV0ZXJbNF0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHg2MCwgNSwgSDJDX1BhcmFtZXRlcik7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldExwc1Jwd20oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQlscHNWYWwsCglJTgl1MUJ5dGUJCQlycHdtVmFsCgkpCnsKCXUxQnl0ZQlscHM9bHBzVmFsOwoJdTFCeXRlCXJwd209cnB3bVZhbDsKCQoJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX1UxXzFBTlRfTFBTLCAmbHBzKTsKCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9VMV8xQU5UX1JQV00sICZycHdtKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfTHBzUnB3bSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCUJPT0xFQU4JCQliRm9yY2VFeGVjLAoJSU4JdTFCeXRlCQkJbHBzVmFsLAoJSU4JdTFCeXRlCQkJcnB3bVZhbAoJKQp7CglCT09MRUFOCWJGb3JjZUV4ZWNQd3JDbWQ9RkFMU0U7CgkKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgJXMgc2V0IGxwcy9ycHdtPTB4JXgvMHgleCBcbiIsIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgbHBzVmFsLCBycHdtVmFsKSk7CglwQ29leERtLT5jdXJMcHMgPSBscHNWYWw7CglwQ29leERtLT5jdXJScHdtID0gcnB3bVZhbDsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBwcmVMcHMvY3VyTHBzPTB4JXgvMHgleCwgcHJlUnB3bS9jdXJScHdtPTB4JXgvMHgleCEhXG4iLCAKCQkJcENvZXhEbS0+cHJlTHBzLCBwQ29leERtLT5jdXJMcHMsIHBDb2V4RG0tPnByZVJwd20sIHBDb2V4RG0tPmN1clJwd20pKTsKCgkJaWYoIChwQ29leERtLT5wcmVMcHMgPT0gcENvZXhEbS0+Y3VyTHBzKSAmJgoJCQkocENvZXhEbS0+cHJlUnB3bSA9PSBwQ29leERtLT5jdXJScHdtKSApCgkJewoJCQlyZXR1cm47CgkJfQoJfQoJaGFsYnRjODE5MmUxYW50X1NldExwc1Jwd20ocEJ0Q29leGlzdCwgbHBzVmFsLCBycHdtVmFsKTsKCglwQ29leERtLT5wcmVMcHMgPSBwQ29leERtLT5jdXJMcHM7CglwQ29leERtLT5wcmVScHdtID0gcENvZXhEbS0+Y3VyUnB3bTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20xKAoJSU4JUEJUQ19DT0VYSVNUCXBCdENvZXhpc3QsCQoJSU4JQk9PTEVBTgkJYlNocmlua1J4TFBGLAoJSU4JQk9PTEVBTiAJYkxvd1BlbmFsdHlSQSwKCUlOCUJPT0xFQU4JCWxpbWl0ZWRfZGlnLCAKCUlOCUJPT0xFQU4JCWJCVExOQUNvbnN0cmFpbgoJKSAKewoJLy9oYWxidGM4MTkyZTFhbnRfUmZTaHJpbmsocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIGJTaHJpbmtSeExQRik7CgkvL2hhbGJ0YzgxOTJlMWFudF9Mb3dQZW5hbHR5UmEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIGJMb3dQZW5hbHR5UkEpOwoKCS8vbm8gbGltaXRlZCBESUcKCS8vaGFsYnRjODE5MmUxYW50X1NldEJ0TG5hQ29uc3RyYWluKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBiQlRMTkFDb25zdHJhaW4pOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIoCglJTglQQlRDX0NPRVhJU1QJcEJ0Q29leGlzdCwJCglJTglCT09MRUFOCQliQUdDVGFibGVTaGlmdCwKCUlOCUJPT0xFQU4gCWJBRENCYWNrT2ZmLAoJSU4JQk9PTEVBTgkJYlNXREFDU3dpbmcsCglJTgl1NEJ5dGUJCWRhY1N3aW5nTHZsCgkpCnsKCS8vaGFsYnRjODE5MmUxYW50X0FnY1RhYmxlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBiQUdDVGFibGVTaGlmdCk7CgkvL2hhbGJ0YzgxOTJlMWFudF9BZGNCYWNrT2ZmKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBiQURDQmFja09mZik7CgkvL2hhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgYlNXREFDU3dpbmcsIGRhY1N3aW5nTHZsKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfUHNUZG1hKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJGb3JjZUV4ZWMsCglJTglCT09MRUFOCQkJYlR1cm5PbiwKCUlOCXUxQnl0ZQkJCXR5cGUKCSkKewoJQk9PTEVBTgkJCWJUdXJuT25CeUNudD1GQUxTRTsKCXUxQnl0ZQkJCXBzVGRtYVR5cGVCeUNudD0wLCByc3NpQWRqdXN0VmFsPTA7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXLCAoIltCVENvZXhdLCAlcyB0dXJuICVzIFBTIFRETUEsIHR5cGU9JWRcbiIsIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgKGJUdXJuT24/ICJPTiI6Ik9GRiIpLCB0eXBlKSk7CglwQ29leERtLT5iQ3VyUHNUZG1hT24gPSBiVHVybk9uOwoJcENvZXhEbS0+Y3VyUHNUZG1hID0gdHlwZTsKCglpZighYkZvcmNlRXhlYykKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBiUHJlUHNUZG1hT24gPSAlZCwgYkN1clBzVGRtYU9uID0gJWQhIVxuIiwgCgkJCXBDb2V4RG0tPmJQcmVQc1RkbWFPbiwgcENvZXhEbS0+YkN1clBzVGRtYU9uKSk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgcHJlUHNUZG1hID0gJWQsIGN1clBzVGRtYSA9ICVkISFcbiIsIAoJCQlwQ29leERtLT5wcmVQc1RkbWEsIHBDb2V4RG0tPmN1clBzVGRtYSkpOwoKCQlpZiggKHBDb2V4RG0tPmJQcmVQc1RkbWFPbiA9PSBwQ29leERtLT5iQ3VyUHNUZG1hT24pICYmCgkJCShwQ29leERtLT5wcmVQc1RkbWEgPT0gcENvZXhEbS0+Y3VyUHNUZG1hKSApCgkJCXJldHVybjsKCX0KCWlmKGJUdXJuT24pCgl7CgkJc3dpdGNoKHR5cGUpCgkJewoJCQlkZWZhdWx0OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4NTMsIDB4MmMsIDB4MDMsIDB4MTAsIDB4NTApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMToKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDUzLCAweDJjLCAweDAzLCAweDEwLCAweDUwKTsKCQkJCXJzc2lBZGp1c3RWYWwgPSAxMTsKCQkJCWJyZWFrOwoJCQljYXNlIDI6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg1MywgMHgyNSwgMHgwMywgMHgxMCwgMHg1MCk7CgkJCQlyc3NpQWRqdXN0VmFsID0gMTQ7CgkJCQlicmVhazsKCQkJY2FzZSAzOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OTMsIDB4MjUsIDB4MywgMHgxMCwgMHg0MCk7CgkJCQlicmVhazsKCQkJY2FzZSA0OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OTMsIDB4MTUsIDB4MywgMHgxNCwgMHgwKTsKCQkJCXJzc2lBZGp1c3RWYWwgPSAxNzsKCQkJCWJyZWFrOwoJCQljYXNlIDU6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg2MSwgMHgxNSwgMHgzLCAweDMxLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgNjoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDEzLCAweGEsIDB4MywgMHgwLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgNzoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDEzLCAweGMsIDB4NSwgMHgwLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgODoJCgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg5MywgMHgyNSwgMHgzLCAweDEwLCAweDApOwoJCQkJYnJlYWs7CgkJCWNhc2UgOToJCgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg1MywgMHgxZSwgMHgwMywgMHgxMCwgMHg1MCk7CgkJCQlyc3NpQWRqdXN0VmFsID0gMTg7CgkJCQlicmVhazsKCQkJY2FzZSAxMDoJCgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgxMywgMHhhLCAweGEsIDB4MCwgMHg0MCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMToJCgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHg1MywgMHgxMiwgMHgwMywgMHgxMCwgMHg1MCk7CgkJCQlyc3NpQWRqdXN0VmFsID0gMjA7CgkJCQlicmVhazsKCQkJY2FzZSAxMjoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGViLCAweGEsIDB4MywgMHgzMSwgMHgxOCk7CgkJCQlicmVhazsKCgkJCWNhc2UgMTU6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgxMywgMHhhLCAweDMsIDB4OCwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDE2OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OTMsIDB4MTUsIDB4MywgMHgxMCwgMHgwKTsKCQkJCXJzc2lBZGp1c3RWYWwgPSAxODsKCQkJCWJyZWFrOwoKCQkJY2FzZSAxODoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDkzLCAweDI1LCAweDMsIDB4MTAsIDB4MCk7CgkJCQlyc3NpQWRqdXN0VmFsID0gMTQ7CgkJCQlicmVhazsJCQkKCQkJCQoJCQljYXNlIDIwOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4MTMsIDB4MjUsIDB4MjUsIDB4MCwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDIxOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OTMsIDB4MjAsIDB4MywgMHgxMCwgMHg0MCk7CgkJCQlicmVhazsKCQkJY2FzZSAyMjoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDEzLCAweDgsIDB4OCwgMHgwLCAweDQwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDIzOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZTMsIDB4MjUsIDB4MywgMHgzMSwgMHgxOCk7CgkJCQlyc3NpQWRqdXN0VmFsID0gMjI7CgkJCQlicmVhazsKCQkJY2FzZSAyNDoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGUzLCAweDE1LCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJcnNzaUFkanVzdFZhbCA9IDIyOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjU6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHhhLCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJcnNzaUFkanVzdFZhbCA9IDIyOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjY6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHhhLCAweDMsIDB4MzEsIDB4MTgpOwoJCQkJcnNzaUFkanVzdFZhbCA9IDIyOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjc6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgyNSwgMHgzLCAweDMxLCAweDk4KTsKCQkJCXJzc2lBZGp1c3RWYWwgPSAyMjsKCQkJCWJyZWFrOwoJCQljYXNlIDI4OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4NjksIDB4MjUsIDB4MywgMHgzMSwgMHgwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDI5OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YWIsIDB4MWEsIDB4MWEsIDB4MSwgMHgxMCk7CgkJCQlicmVhazsKCQkJY2FzZSAzMDoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDkzLCAweDE1LCAweDMsIDB4MTQsIDB4MCk7CgkJCQlicmVhazsKCQkJY2FzZSAzMToKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGQzLCAweDFhLCAweDFhLCAwLCAweDU4KTsKCQkJCWJyZWFrOwoJCQljYXNlIDMyOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YWIsIDB4YSwgMHgzLCAweDMxLCAweDkwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDMzOgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4YTMsIDB4MjUsIDB4MywgMHgzMCwgMHg5MCk7CgkJCQlicmVhazsKCQkJY2FzZSAzNDoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweGQzLCAweDFhLCAweDFhLCAweDAsIDB4MTApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzU6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxYSwgMHgxYSwgMHgwLCAweDEwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDM2OgoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4ZDMsIDB4MTIsIDB4MywgMHgxNCwgMHg1MCk7CgkJCQlicmVhazsKCQkJY2FzZSAzNzoKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDUzLCAweDI1LCAweDMsIDB4MTAsIDB4NTApOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzg6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHhlMywgMHgxMiwgMHgxMiwgMHhlMSwgMHg5MCk7CgkJCQlicmVhazsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gZGlzYWJsZSBQUyB0ZG1hCgkJc3dpdGNoKHR5cGUpCgkJewoJCQljYXNlIDg6CQkvLzB4Nzc4ID0gMSwgYW50MlBUQQoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4OCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKCQkJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDkyYywgMHg0KTsKCQkJCWJyZWFrOwoJCQljYXNlIDA6CQkvLzB4Nzc4ID0gMSwgYW50MkJUCgkJCWRlZmF1bHQ6CgkJCQloYWxidGM4MTkyZTFhbnRfU2V0RndQc3RkbWEocEJ0Q29leGlzdCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDApOwoJCQkJbWRlbGF5KDUpOwoJCQkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4OTJjLCAweDIwKTsKCQkJCWJyZWFrOwoJCQljYXNlIDk6CQkvLzB4Nzc4ID0gMSwgYW50MldJRkkKCQkJCWhhbGJ0YzgxOTJlMWFudF9TZXRGd1BzdGRtYShwQnRDb2V4aXN0LCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCk7CgkJCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg5MmMsIDB4NCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMDoJLy8weDc3OCA9IDMsIGFudDJCVAoJCQkJaGFsYnRjODE5MmUxYW50X1NldEZ3UHN0ZG1hKHBCdENvZXhpc3QsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKCQkJCW1kZWxheSg1KTsKCQkJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDkyYywgMHgyMCk7CgkJCQlicmVhazsKCQl9Cgl9Cglyc3NpQWRqdXN0VmFsID0wOwoJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX1UxX1JTU0lfQURKX1ZBTF9GT1JfMUFOVF9DT0VYX1RZUEUsICZyc3NpQWRqdXN0VmFsKTsKCgkvLyB1cGRhdGUgcHJlIHN0YXRlCglwQ29leERtLT5iUHJlUHNUZG1hT24gPSBwQ29leERtLT5iQ3VyUHNUZG1hT247CglwQ29leERtLT5wcmVQc1RkbWEgPSBwQ29leERtLT5jdXJQc1RkbWE7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1NldFN3aXRjaFNzVHlwZSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCQlzc1R5cGUKCSkKewoJdTFCeXRlCW1pbW9Qcz1CVENfTUlNT19QU19EWU5BTUlDOwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgUkVBTCBzZXQgU1MgVHlwZSA9ICVkXG4iLCBzc1R5cGUpKTsKCglpZihzc1R5cGUgPT0gMSkKCXsKCQloYWxidGM4MTkyZTFhbnRfVXBkYXRlcmFfbWFzayhwQnRDb2V4aXN0LCBGT1JDRV9FWEVDLCBCVENfUkFURV9ESVNBQkxFLCAweGZmZjAwMDAwKTsJLy8gZGlzYWJsZSAyc3MKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFLCAwKTsKCQkvLyBzd2l0Y2ggb2ZkbSBwYXRoCgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4YzA0LCAweDExKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHhkMDQsIDB4MSk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4OTBjLCAweDgxMTExMTExKTsKCQkvLyBzd2l0Y2ggY2NrIHBhdGNoCgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlX2JpdG1hc2socEJ0Q29leGlzdCwgMHhlNzcsIDB4NCwgMHgxKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHhhMDcsIDB4ODEpOwoJCW1pbW9Qcz1CVENfTUlNT19QU19TVEFUSUM7Cgl9CgllbHNlIGlmKHNzVHlwZSA9PSAyKQoJewoJCWhhbGJ0YzgxOTJlMWFudF9VcGRhdGVyYV9tYXNrKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEJUQ19SQVRFX0VOQUJMRSwgMHhmZmYwMDAwMCk7CS8vIGVuYWJsZSAyc3MKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFLCA4KTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHhjMDQsIDB4MzMpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweGQwNCwgMHgzKTsKCQlwQnRDb2V4aXN0LT5idGNfd3JpdGVfNGJ5dGUocEJ0Q29leGlzdCwgMHg5MGMsIDB4ODExMjEzMTMpOwoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZV9iaXRtYXNrKHBCdENvZXhpc3QsIDB4ZTc3LCAweDQsIDB4MCk7CgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4YTA3LCAweDQxKTsKCQltaW1vUHM9QlRDX01JTU9fUFNfRFlOQU1JQzsKCX0KCQoJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9TRU5EX01JTU9fUFMsICZtaW1vUHMpOwkvLyBzZXQgcnggMXNzIG9yIDJzcwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Td2l0Y2hTc1R5cGUoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglCT09MRUFOCQkJCWJGb3JjZUV4ZWMsCglJTgl1MUJ5dGUJCQkJbmV3U3NUeXBlCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgJXMgU3dpdGNoIFNTIFR5cGUgPSAlZFxuIiwgIAoJCShiRm9yY2VFeGVjPyAiZm9yY2UgdG8iOiIiKSwgbmV3U3NUeXBlKSk7CglwQ29leERtLT5jdXJTc1R5cGUgPSBuZXdTc1R5cGU7CgoJaWYoIWJGb3JjZUV4ZWMpCgl7CgkJaWYocENvZXhEbS0+cHJlU3NUeXBlID09IHBDb2V4RG0tPmN1clNzVHlwZSkgCgkJCXJldHVybjsKCX0KCWhhbGJ0YzgxOTJlMWFudF9TZXRTd2l0Y2hTc1R5cGUocEJ0Q29leGlzdCwgcENvZXhEbS0+Y3VyU3NUeXBlKTsKCglwQ29leERtLT5wcmVTc1R5cGUgPSBwQ29leERtLT5jdXJTc1R5cGU7Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X0NvZXhBbGxPZmYoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCgkvLyBzdyBhbGwgb2ZmCgloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20xKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsRkFMU0UpOwoJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOwoKCgkvLyBodyBhbGwgb2ZmCgloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwp9CgpCT09MRUFOCmhhbGJ0YzgxOTJlMWFudF9Jc0NvbW1vbkFjdGlvbigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglCT09MRUFOCQkJYkNvbW1vbj1GQUxTRSwgYldpZmlDb25uZWN0ZWQ9RkFMU0UsIGJXaWZpQnVzeT1GQUxTRTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9DT05ORUNURUQsICZiV2lmaUNvbm5lY3RlZCk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmYldpZmlCdXN5KTsKCglpZighYldpZmlDb25uZWN0ZWQgJiYgCgkJQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBub24gY29ubmVjdGVkLWlkbGUgKyBCVCBub24gY29ubmVjdGVkLWlkbGUhIVxuIikpOwkJCiAJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTEocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSxGQUxTRSk7CgkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOwoKCQliQ29tbW9uID0gdHJ1ZTsKCX0KCWVsc2UgaWYoYldpZmlDb25uZWN0ZWQgJiYgCgkJKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykgKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBjb25uZWN0ZWQgKyBCVCBub24gY29ubmVjdGVkLWlkbGUhIVxuIikpOwogICAgICAJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMShwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLEZBTFNFKTsKCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgoJCWJDb21tb24gPSB0cnVlOwoJfQoJZWxzZSBpZighYldpZmlDb25uZWN0ZWQgJiYgCgkJKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKSApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBXaWZpIG5vbiBjb25uZWN0ZWQtaWRsZSArIEJUIGNvbm5lY3RlZC1pZGxlISFcbiIpKTsKCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20xKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsRkFMU0UpOwoJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCgkJYkNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKGJXaWZpQ29ubmVjdGVkICYmIAoJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykgKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgV2lmaSBjb25uZWN0ZWQgKyBCVCBjb25uZWN0ZWQtaWRsZSEhXG4iKSk7CgkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMShwQnRDb2V4aXN0LHRydWUsdHJ1ZSx0cnVlLHRydWUpOwoJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCgkJYkNvbW1vbiA9IHRydWU7Cgl9CgllbHNlIGlmKCFiV2lmaUNvbm5lY3RlZCAmJiAKCQkoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgIT0gcENvZXhEbS0+YnRTdGF0dXMpICkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFdpZmkgbm9uIGNvbm5lY3RlZC1pZGxlICsgQlQgQnVzeSEhXG4iKSk7CgkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMShwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLEZBTFNFKTsKCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgkJCgkJYkNvbW1vbiA9IHRydWU7Cgl9CgllbHNlCgl7CgkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMShwQnRDb2V4aXN0LHRydWUsdHJ1ZSx0cnVlLHRydWUpOwoJCQoJCWJDb21tb24gPSBGQUxTRTsKCX0KCQoJcmV0dXJuIGJDb21tb247Cn0KCgpWT0lECmhhbGJ0YzgxOTJlMWFudF9UZG1hRHVyYXRpb25BZGp1c3RGb3JBY2woCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJd2lmaVN0YXR1cwoJKQp7CglzdGF0aWMgczRCeXRlCQl1cCxkbixtLG4sV2FpdENvdW50OwoJczRCeXRlCQkJcmVzdWx0OyAgIC8vMDogbm8gY2hhbmdlLCArMTogaW5jcmVhc2UgV2lGaSBkdXJhdGlvbiwgLTE6IGRlY3JlYXNlIFdpRmkgZHVyYXRpb24KCXUxQnl0ZQkJCXJldHJ5Q291bnQ9MCwgYnRJbmZvRXh0OwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GVywgKCJbQlRDb2V4XSwgVGRtYUR1cmF0aW9uQWRqdXN0Rm9yQWNsKClcbiIpKTsKCglpZiggKEJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9BU1NPX0FVVEhfU0NBTiA9PSB3aWZpU3RhdHVzKSB8fAoJCShCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9TQ0FOID09IHdpZmlTdGF0dXMpIHx8CgkJKEJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX1NQRUNJQUxfUEtUID09IHdpZmlTdGF0dXMpICkKCXsKCQlpZiggcENvZXhEbS0+Y3VyUHNUZG1hICE9IDEgJiYKCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDIgJiYKCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDMgJiYKCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CgoJCQl1cCA9IDA7CgkJCWRuID0gMDsKCQkJbSA9IDE7CgkJCW49IDM7CgkJCXJlc3VsdCA9IDA7CgkJCVdhaXRDb3VudCA9IDA7CgkJfQkJCgkJcmV0dXJuOwoJfQoKCWlmKCFwQ29leERtLT5iQXV0b1RkbWFBZGp1c3QpCgl7CgkJcENvZXhEbS0+YkF1dG9UZG1hQWRqdXN0ID0gdHJ1ZTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBmaXJzdCBydW4gVGRtYUR1cmF0aW9uQWRqdXN0KCkhIVxuIikpOwoKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAyOwoJCS8vPT09PT09PT09PT09CgkJdXAgPSAwOwoJCWRuID0gMDsKCQltID0gMTsKCQluPSAzOwoJCXJlc3VsdCA9IDA7CgkJV2FpdENvdW50ID0gMDsKCX0KCWVsc2UKCXsKCQkvL2FjcXVpcmUgdGhlIEJUIFRSeCByZXRyeSBjb3VudCBmcm9tIEJUX0luZm8gYnl0ZTIKCQlyZXRyeUNvdW50ID0gcENvZXhTdGEtPmJ0UmV0cnlDbnQ7CgkJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCByZXRyeUNvdW50ID0gJWRcbiIsIHJldHJ5Q291bnQpKTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCB1cD0lZCwgZG49JWQsIG09JWQsIG49JWQsIFdhaXRDb3VudD0lZFxuIiwgCgkJCXVwLCBkbiwgbSwgbiwgV2FpdENvdW50KSk7CgkJcmVzdWx0ID0gMDsKCQlXYWl0Q291bnQrKzsgCgkJICAKCQlpZihyZXRyeUNvdW50ID09IDApICAvLyBubyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbgoJCXsKCQkJdXArKzsKCQkJZG4tLTsKCgkJCWlmIChkbiA8PSAwKQoJCQkJZG4gPSAwOwkJCQkgCgoJCQlpZih1cCA+PSBuKQkvLyBpZiCzc8TyIG4grdMyrO0gcmV0cnkgY291bnSssDAsIKtovdW8ZVdpRmkgZHVyYXRpb24KCQkJewoJCQkJV2FpdENvdW50ID0gMDsgCgkJCQluID0gMzsKCQkJCXVwID0gMDsKCQkJCWRuID0gMDsKCQkJCXJlc3VsdCA9IDE7IAoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFX0ZXX0RFVEFJTCwgKCJbQlRDb2V4XSwgSW5jcmVhc2Ugd2lmaSBkdXJhdGlvbiEhXG4iKSk7CgkJCX0KCQl9CgkJZWxzZSBpZiAocmV0cnlDb3VudCA8PSAzKQkvLyA8PTMgcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24KCQl7CgkJCXVwLS07IAoJCQlkbisrOwoKCQkJaWYgKHVwIDw9IDApCgkJCQl1cCA9IDA7CgoJCQlpZiAoZG4gPT0gMikJLy8gaWYgs3PE8iAyIK3TMqztIHJldHJ5IGNvdW50PCAzLCCraL3Vr7ZXaUZpIGR1cmF0aW9uCgkJCXsKCQkJCWlmIChXYWl0Q291bnQgPD0gMikKCQkJCQltKys7IC8vIMHXp0ukQKq9pmKo4q3TbGV2ZWykpKjTpl4KCQkJCWVsc2UKCQkJCQltID0gMTsKCgkJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KCQkJCQltID0gMjA7CgoJCQkJbiA9IDMqbTsKCQkJCXVwID0gMDsKCQkJCWRuID0gMDsKCQkJCVdhaXRDb3VudCA9IDA7CgkJCQlyZXN1bHQgPSAtMTsgCgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfREVUQUlMLCAoIltCVENvZXhdLCBEZWNyZWFzZSB3aWZpIGR1cmF0aW9uIGZvciByZXRyeUNvdW50ZXI8MyEhXG4iKSk7CgkJCX0KCQl9CgkJZWxzZSAgLy9yZXRyeSBjb3VudCA+IDMsIKV1rW4xprggcmV0cnkgY291bnQgPiAzLCCraL3Vr7ZXaUZpIGR1cmF0aW9uCgkJewoJCQlpZiAoV2FpdENvdW50ID09IDEpCgkJCQltKys7IC8vIMHXp0ukQKq9pmKo4q3TbGV2ZWykpKjTpl4KCQkJZWxzZQoJCQkJbSA9IDE7CgoJCQlpZiAoIG0gPj0gMjApIC8vbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4KCQkJCW0gPSAyMDsKCgkJCW4gPSAzKm07CgkJCXVwID0gMDsKCQkJZG4gPSAwOwoJCQlXYWl0Q291bnQgPSAwOyAKCQkJcmVzdWx0ID0gLTE7CgkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRV9GV19ERVRBSUwsICgiW0JUQ29leF0sIERlY3JlYXNlIHdpZmkgZHVyYXRpb24gZm9yIHJldHJ5Q291bnRlcj4zISFcbiIpKTsKCQl9CgoJCWlmKHJlc3VsdCA9PSAtMSkKCQl7CgkJCWlmKCAoQlRfSU5GT184MTkyRV8xQU5UX0EyRFBfQkFTSUNfUkFURShidEluZm9FeHQpKSAmJgoJCQkJKChwQ29leERtLT5jdXJQc1RkbWEgPT0gMSkgfHwocENvZXhEbS0+Y3VyUHNUZG1hID09IDIpKSApCgkJCXsKCQkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gOTsKCQkJfQoJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSAxKQoJCQl7CgkJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CgkJCX0KCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMikKCQkJewoJCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSA5OwoJCQl9CgkJCWVsc2UgaWYocENvZXhEbS0+Y3VyUHNUZG1hID09IDkpCgkJCXsKCQkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDExKTsKCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDExOwoJCQl9CgkJfQoJCWVsc2UgaWYocmVzdWx0ID09IDEpCgkJewoJCQlpZiggKEJUX0lORk9fODE5MkVfMUFOVF9BMkRQX0JBU0lDX1JBVEUoYnRJbmZvRXh0KSkgJiYKCQkJCSgocENvZXhEbS0+Y3VyUHNUZG1hID09IDEpIHx8KHBDb2V4RG0tPmN1clBzVGRtYSA9PSAyKSkgKQoJCQl7CgkJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA5KTsKCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDk7CgkJCX0KCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMTEpCgkJCXsKCQkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDkpOwoJCQkJcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlID0gOTsKCQkJfQoJCQllbHNlIGlmKHBDb2V4RG0tPmN1clBzVGRtYSA9PSA5KQoJCQl7CgkJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAyKTsKCQkJCXBDb2V4RG0tPnBzVGRtYUR1QWRqVHlwZSA9IDI7CgkJCX0KCQkJZWxzZSBpZihwQ29leERtLT5jdXJQc1RkbWEgPT0gMikKCQkJewoJCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMSk7CgkJCQlwQ29leERtLT5wc1RkbWFEdUFkalR5cGUgPSAxOwoJCQl9CgkJfQoKCQlpZiggcENvZXhEbS0+Y3VyUHNUZG1hICE9IDEgJiYKCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDIgJiYKCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDkgJiYKCQkJcENvZXhEbS0+Y3VyUHNUZG1hICE9IDExICkKCQl7CgkJCS8vIHJlY292ZXIgdG8gcHJldmlvdXMgYWRqdXN0IHR5cGUKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgcENvZXhEbS0+cHNUZG1hRHVBZGpUeXBlKTsKCQl9Cgl9Cn0KCnUxQnl0ZQpoYWxidGM4MTkyZTFhbnRfUHNUZG1hVHlwZUJ5V2lmaVJzc2koCglJTglzNEJ5dGUJd2lmaVJzc2ksCglJTglzNEJ5dGUJcHJlV2lmaVJzc2ksCglJTgl1MUJ5dGUJd2lmaVJzc2lUaHJlc2gKCSkKewoJdTFCeXRlCXBzVGRtYVR5cGU9MDsKCQoJaWYod2lmaVJzc2kgPiBwcmVXaWZpUnNzaSkKCXsKCQlpZih3aWZpUnNzaSA+ICh3aWZpUnNzaVRocmVzaCs1KSkKCQl7CgkJCXBzVGRtYVR5cGUgPSAyNjsKCQl9CgkJZWxzZQoJCXsKCQkJcHNUZG1hVHlwZSA9IDI1OwoJCX0KCX0KCWVsc2UKCXsKCQlpZih3aWZpUnNzaSA+IHdpZmlSc3NpVGhyZXNoKQoJCXsKCQkJcHNUZG1hVHlwZSA9IDI2OwoJCX0KCQllbHNlCgkJewoJCQlwc1RkbWFUeXBlID0gMjU7CgkJfQoJfQoKCXJldHVybiBwc1RkbWFUeXBlOwp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JQk9PTEVBTgkJCWJOZXdQc1N0YXRlCgkpCnsKCXUxQnl0ZQlscHNNb2RlPTB4MDsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTFfTFBTX01PREUsICZscHNNb2RlKTsKCQoJaWYobHBzTW9kZSkJLy8gYWxyZWFkeSB1bmRlciBMUFMgc3RhdGUKCXsKCQlpZihiTmV3UHNTdGF0ZSkJCQoJCXsKCQkJLy8ga2VlcCBzdGF0ZSB1bmRlciBMUFMsIGRvIG5vdGhpbmcuCgkJfQoJCWVsc2UKCQl7CgkJCS8vIHdpbGwgbGVhdmUgTFBTIHN0YXRlLCB0dXJuIG9mZiBwc1RkbWEgZmlyc3QKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCX0KCX0KCWVsc2UJCQkJCQkvLyBOTyBQUyBzdGF0ZQoJewoJCWlmKGJOZXdQc1N0YXRlKQoJCXsKCQkJLy8gd2lsbCBlbnRlciBMUFMgc3RhdGUsIHR1cm4gb2ZmIHBzVGRtYSBmaXJzdAoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJfQoJCWVsc2UKCQl7CgkJCS8vIGtlZXAgc3RhdGUgdW5kZXIgTk8gUFMgc3RhdGUsIGRvIG5vdGhpbmcuCgkJfQoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCQlwc1R5cGUsCglJTgl1MUJ5dGUJCQkJbHBzVmFsLAoJSU4JdTFCeXRlCQkJCXJwd21WYWwKCSkKewoJQk9PTEVBTgkJYkxvd1B3ckRpc2FibGU9RkFMU0U7CgoJc3dpdGNoKHBzVHlwZSkKCXsKCQljYXNlIEJUQ19QU19XSUZJX05BVElWRToKCQkJLy8gcmVjb3ZlciB0byBvcmlnaW5hbCAzMmsgbG93IHBvd2VyIHNldHRpbmcKCQkJYkxvd1B3ckRpc2FibGUgPSBGQUxTRTsKCQkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9ESVNBQkxFX0xPV19QT1dFUiwgJmJMb3dQd3JEaXNhYmxlKTsKCQkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9OT1JNQUxfTFBTLCBOVUxMKTsKCQkJYnJlYWs7CgkJY2FzZSBCVENfUFNfTFBTX09OOgoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hQ2hlY2tGb3JQb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCB0cnVlKTsKCQkJaGFsYnRjODE5MmUxYW50X0xwc1Jwd20ocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIGxwc1ZhbCwgcnB3bVZhbCk7CgkJCS8vIHdoZW4gY29leCBmb3JjZSB0byBlbnRlciBMUFMsIGRvIG5vdCBlbnRlciAzMmsgbG93IHBvd2VyLgoJCQliTG93UHdyRGlzYWJsZSA9IHRydWU7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfRElTQUJMRV9MT1dfUE9XRVIsICZiTG93UHdyRGlzYWJsZSk7CgkJCS8vIHBvd2VyIHNhdmUgbXVzdCBleGVjdXRlZCBiZWZvcmUgcHNUZG1hLgoJCQlwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQUNUX0VOVEVSX0xQUywgTlVMTCk7CgkJCWJyZWFrOwoJCWNhc2UgQlRDX1BTX0xQU19PRkY6CgkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWFDaGVja0ZvclBvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEZBTFNFKTsKCQkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9MRUFWRV9MUFMsIE5VTEwpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCX0KfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlPbmx5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOSk7CQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Nb25pdG9yQnRFbmFibGVEaXNhYmxlKAoJSU4gCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglzdGF0aWMgQk9PTEVBTgliUHJlQnREaXNhYmxlZD1GQUxTRTsKCXN0YXRpYyB1NEJ5dGUJCWJ0RGlzYWJsZUNudD0wOwoJQk9PTEVBTgkJCWJCdEFjdGl2ZT10cnVlLCBiQnREaXNhYmxlZD1GQUxTRTsKCgkvLyBUaGlzIGZ1bmN0aW9uIGNoZWNrIGlmIGJ0IGlzIGRpc2FibGVkCgoJaWYoCXBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCA9PSAwICYmCgkJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4ID09IDAgJiYKCQlwQ29leFN0YS0+bG93UHJpb3JpdHlUeCA9PSAwICYmCgkJcENvZXhTdGEtPmxvd1ByaW9yaXR5UnggPT0gMCkKCXsKCQliQnRBY3RpdmUgPSBGQUxTRTsKCX0KCWlmKAlwQ29leFN0YS0+aGlnaFByaW9yaXR5VHggPT0gMHhmZmZmICYmCgkJcENvZXhTdGEtPmhpZ2hQcmlvcml0eVJ4ID09IDB4ZmZmZiAmJgoJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVR4ID09IDB4ZmZmZiAmJgoJCXBDb2V4U3RhLT5sb3dQcmlvcml0eVJ4ID09IDB4ZmZmZikKCXsKCQliQnRBY3RpdmUgPSBGQUxTRTsKCX0KCWlmKGJCdEFjdGl2ZSkKCXsKCQlidERpc2FibGVDbnQgPSAwOwoJCWJCdERpc2FibGVkID0gRkFMU0U7CgkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0JMX0JUX0RJU0FCTEUsICZiQnREaXNhYmxlZCk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX0JUX01PTklUT1IsICgiW0JUQ29leF0sIEJUIGlzIGVuYWJsZWQgISFcbiIpKTsKCX0KCWVsc2UKCXsKCQlidERpc2FibGVDbnQrKzsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgYnQgYWxsIGNvdW50ZXJzPTAsICVkIHRpbWVzISFcbiIsIAoJCQkJYnREaXNhYmxlQ250KSk7CgkJaWYoYnREaXNhYmxlQ250ID49IDIpCgkJewoJCQliQnREaXNhYmxlZCA9IHRydWU7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9ESVNBQkxFLCAmYkJ0RGlzYWJsZWQpOwoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fQlRfTU9OSVRPUiwgKCJbQlRDb2V4XSwgQlQgaXMgZGlzYWJsZWQgISFcbiIpKTsKCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlPbmx5KHBCdENvZXhpc3QpOwoJCX0KCX0KCWlmKGJQcmVCdERpc2FibGVkICE9IGJCdERpc2FibGVkKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19CVF9NT05JVE9SLCAoIltCVENvZXhdLCBCVCBpcyBmcm9tICVzIHRvICVzISFcbiIsIAoJCQkoYlByZUJ0RGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIiksIAoJCQkoYkJ0RGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIikpKTsKCQliUHJlQnREaXNhYmxlZCA9IGJCdERpc2FibGVkOwoJCWlmKCFiQnREaXNhYmxlZCkKCQl7CgkJfQoJCWVsc2UKCQl7CgkJCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9BQ1RfTEVBVkVfTFBTLCBOVUxMKTsKCQkJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9OT1JNQUxfTFBTLCBOVUxMKTsKCQl9Cgl9Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vCVNvZnR3YXJlIENvZXggTWVjaGFuaXNtIHN0YXJ0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLyBTQ08gb25seSBvciBTQ08rUEFOKEhTKQpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25TY28oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCXdpZmlSc3NpU3RhdGU7Cgl1NEJ5dGUJd2lmaUJ3OwoKCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CgkKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQkgIGhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCSAgaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCQl9CQkKCX0KfQoKClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbkhpZCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJd2lmaVJzc2lTdGF0ZTsJCgl1NEJ5dGUJd2lmaUJ3OwoKCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLEZBTFNFLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCQl9CQkKCX0KfQoKLy9BMkRQIG9ubHkgLyBQQU4oRURSKSBvbmx5LyBBMkRQK1BBTihIUykKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uQTJkcCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlSc3NpU3RhdGU7Cgl1NEJ5dGUJCXdpZmlCdzsKCgl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjUsIDApOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOwoJCX0JCQoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25BMmRwUGFuSHMoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCBidEluZm9FeHQ7Cgl1NEJ5dGUJCXdpZmlCdzsKCglidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OwoJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCQl9CQkKCX0KfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uUGFuRWRyKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZTsKCXU0Qnl0ZQkJd2lmaUJ3OwoKCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgkJfQoJfQp9CgoKLy9QQU4oSFMpIG9ubHkKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uUGFuSHMoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlOwoJdTRCeXRlCQl3aWZpQnc7CgoJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCQl9Cgl9Cn0KCi8vUEFOKEVEUikrQTJEUApWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25QYW5FZHJBMmRwKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXUxQnl0ZQkJd2lmaVJzc2lTdGF0ZSwgYnRJbmZvRXh0OwoJdTRCeXRlCQl3aWZpQnc7CgoJYnRJbmZvRXh0ID0gcENvZXhTdGEtPmJ0SW5mb0V4dDsKCXdpZmlSc3NpU3RhdGUgPSBoYWxidGM4MTkyZTFhbnRfV2lmaVJzc2lTdGF0ZShwQnRDb2V4aXN0LCAwLCAyLCAyNSwgMCk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoKCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCX0KCWVsc2UKCXsKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsRkFMU0UsRkFMU0UsMHgxOCk7CgkJfQoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25QYW5FZHJIaWQoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlOwoJdTRCeXRlCQl3aWZpQnc7CgoJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewkJCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOwoJCX0KCX0KfQoKLy8gSElEK0EyRFArUEFOKEVEUikKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uSGlkQTJkcFBhbkVkcigKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7Cgl1MUJ5dGUJCXdpZmlSc3NpU3RhdGUsIGJ0SW5mb0V4dDsKCXU0Qnl0ZQkJd2lmaUJ3OwoKCWJ0SW5mb0V4dCA9IHBDb2V4U3RhLT5idEluZm9FeHQ7Cgl3aWZpUnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X1dpZmlSc3NpU3RhdGUocEJ0Q29leGlzdCwgMCwgMiwgMjUsIDApOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0JXLCAmd2lmaUJ3KTsKCglpZihCVENfV0lGSV9CV19IVDQwID09IHdpZmlCdykKCXsJCgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJfQoJZWxzZQoJewoJCS8vIHN3IG1lY2hhbmlzbQoJCWlmKCAod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9ISUdIKSB8fAoJCQkod2lmaVJzc2lTdGF0ZSA9PSBCVENfUlNTSV9TVEFURV9TVEFZX0hJR0gpICkKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCx0cnVlLHRydWUsRkFMU0UsMHgxOCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCQl9Cgl9Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbkhpZEEyZHAoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJdTFCeXRlCQl3aWZpUnNzaVN0YXRlLCBidEluZm9FeHQ7Cgl1NEJ5dGUJCXdpZmlCdzsKCglidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OwoJd2lmaVJzc2lTdGF0ZSA9IGhhbGJ0YzgxOTJlMWFudF9XaWZpUnNzaVN0YXRlKHBCdENvZXhpc3QsIDAsIDIsIDI1LCAwKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CgoJaWYoQlRDX1dJRklfQldfSFQ0MCA9PSB3aWZpQncpCgl7CQkKCQkvLyBzdyBtZWNoYW5pc20KCQlpZiggKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJKHdpZmlSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsdHJ1ZSx0cnVlLEZBTFNFLDB4MTgpOwoJCX0KCQllbHNlCgkJewoJCQloYWxidGM4MTkyZTFhbnRfU3dNZWNoYW5pc20yKHBCdENvZXhpc3QsRkFMU0UsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9Cgl9CgllbHNlCgl7CgkJLy8gc3cgbWVjaGFuaXNtCgkJaWYoICh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX0hJR0gpIHx8CgkJCSh3aWZpUnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfSElHSCkgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LHRydWUsdHJ1ZSxGQUxTRSwweDE4KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMihwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLDB4MTgpOwoJCX0KCX0KfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8JTm9uLVNvZnR3YXJlIENvZXggTWVjaGFuaXNtIHN0YXJ0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0SW5xdWlyeSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglQQlRDX0JUX0xJTktfSU5GTwlwQnRMaW5rSW5mbz0mcEJ0Q29leGlzdC0+YnRfbGlua19pbmZvOwoJQk9PTEVBTgkJCQliV2lmaUNvbm5lY3RlZD1GQUxTRSwgYkJ0SHNPbj1GQUxTRTsKCQoJLy8gTm90ZToKCS8vIERvIG5vdCBkbyBEYWNTd2luZyBoZXJlLCB1c2Ugb3JpZ2luYWwgc2V0dGluZy4KCQoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKCWlmKGJCdEhzT24pCgkJcmV0dXJuOwoKCWlmKCFiV2lmaUNvbm5lY3RlZCkKCXsKCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CgkJCgkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCgkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDgpOwoJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7Cgl9CgllbHNlIGlmKCAocEJ0TGlua0luZm8tPmJTY29FeGlzdCkgfHwKCQkJKHBCdExpbmtJbmZvLT5iSGlkT25seSkgKQoJewoJCS8vIFNDTy9ISUQtb25seSBidXN5CgkJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOwoJCQoJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgoJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDMyKTsKCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDEpOwoJfQoJZWxzZQoJewoJCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfTFBTX09OLCAweDUwLCAweDApOwoKCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAzMCk7CgkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCX0KfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uQnRTY29IaWRPbmx5QnVzeSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCQl3aWZpU3RhdHVzCgkpCnsKCVBCVENfQlRfTElOS19JTkZPIHBCdExpbmtJbmZvPSZwQnRDb2V4aXN0LT5idF9saW5rX2luZm87Cgl1MUJ5dGUJCWJ0UnNzaVN0YXRlPUJUQ19SU1NJX1NUQVRFX0hJR0g7CgoJaWYoQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19OT05fQ09OTkVDVEVEX0FTU09fQVVUSF9TQ0FOID09IHdpZmlTdGF0dXMpCgl7CQkKCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCgkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDgpOwoJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7Cgl9CgllbHNlCgl7CgkJaWYocEJ0TGlua0luZm8tPmJIaWRPbmx5KQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCQkJaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJCgkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKCQl9CgkJZWxzZQoJCXsKCQkJLy8gZGVjIGJ0IHBvd2VyIGZvciBkaWZmIGxldmVsCgkJCWJ0UnNzaVN0YXRlID0gaGFsYnRjODE5MmUxYW50X0J0UnNzaVN0YXRlKDMsIDM0LCA0Mik7CgkJCWlmKCAoYnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfTE9XKSB8fAoJCQkJKGJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX1NUQVlfTE9XKSApCgkJCXsKCQkJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgkJCX0KCQkJZWxzZSBpZiggKGJ0UnNzaVN0YXRlID09IEJUQ19SU1NJX1NUQVRFX01FRElVTSkgfHwKCQkJCQkoYnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pICkKCQkJewoJCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKCQkJfQoJCQllbHNlIGlmKCAoYnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfSElHSCkgfHwKCQkJCQkoYnRSc3NpU3RhdGUgPT0gQlRDX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSApCgkJCXsKCQkJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgNik7CgkJCX0KCgkJCS8vIHN3IGRhY1N3aW5nCgkJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMHhjKTsKCgkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCA3KTsJCQkKCQl9Cgl9Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbkhzKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCVBCVENfQlRfTElOS19JTkZPIHBCdExpbmtJbmZvPSZwQnRDb2V4aXN0LT5idF9saW5rX2luZm87CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gZm9yIEhTISEhXG4iKSk7CgoJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOwoKCWlmKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX05PTl9DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykKCXsKCQkvLyBlcnJvciwgc2hvdWxkIG5vdCBiZSBoZXJlCgkJcENvZXhEbS0+ZXJyb3JDb25kaXRpb24gPSAxOwoJfQoJZWxzZSBpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykKCXsKCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNik7CgoJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAxMCk7CgkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCX0KCWVsc2UgaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMgJiYgCgkJCSFwQnRDb2V4aXN0LT5idF9saW5rX2luZm8uYkhpZE9ubHkpCgl7CgkJaWYocENvZXhEbS0+Y3VyU3NUeXBlID09IDEpCgkJewoJCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDYpOwoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMTApOwoJCQkvL2hhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIHRydWUsIDM4KTsKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCQl9Cgl9CgllbHNlCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0U2NvSGlkT25seUJ1c3kocEJ0Q29leGlzdCwKCQkJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfQlVTWSk7Cgl9Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlDb25uZWN0ZWRCdEFjbEJ1c3koCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJd2lmaVN0YXR1cwoJKQp7CglQQlRDX0JUX0xJTktfSU5GTyBwQnRMaW5rSW5mbz0mcEJ0Q29leGlzdC0+YnRfbGlua19pbmZvOwoKCWlmKHBCdExpbmtJbmZvLT5iSGlkT25seSkKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uQnRTY29IaWRPbmx5QnVzeShwQnRDb2V4aXN0LCB3aWZpU3RhdHVzKTsKCQlwQ29leERtLT5iQXV0b1RkbWFBZGp1c3QgPSBGQUxTRTsKCQlyZXR1cm47Cgl9CgkKCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsKCglpZiggKHBCdExpbmtJbmZvLT5iQTJkcE9ubHkpIHx8CgkJKHBCdExpbmtJbmZvLT5iSGlkRXhpc3QmJnBCdExpbmtJbmZvLT5iQTJkcEV4aXN0KSApCgl7CgkJaGFsYnRjODE5MmUxYW50X1RkbWFEdXJhdGlvbkFkanVzdEZvckFjbChwQnRDb2V4aXN0LCB3aWZpU3RhdHVzKTsKCX0KCWVsc2UgaWYoIChwQnRMaW5rSW5mby0+YlBhbk9ubHkpIHx8CgkJCShwQnRMaW5rSW5mby0+YkhpZEV4aXN0JiZwQnRMaW5rSW5mby0+YlBhbkV4aXN0KSApCgl7CgkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgMyk7CgkJcENvZXhEbS0+YkF1dG9UZG1hQWRqdXN0ID0gRkFMU0U7Cgl9CgllbHNlCgl7CgkJaWYoIChCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX05PTl9DT05ORUNURURfQVNTT19BVVRIX1NDQU4gPT0gd2lmaVN0YXR1cykgfHwKCQkJKEJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX1NDQU4gPT0gd2lmaVN0YXR1cykgfHwKCQkJKEJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX1NQRUNJQUxfUEtUID09IHdpZmlTdGF0dXMpICkKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgOSk7CgkJZWxzZQoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCAxMSk7CgkJcENvZXhEbS0+YkF1dG9UZG1hQWRqdXN0ID0gRkFMU0U7Cgl9CgkJCgloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDEpOwp9CgoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CgkvLyBwb3dlciBzYXZlIHN0YXRlCgloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CgoJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoKCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkQXNzb0F1dGhTY2FuKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsIDB4MCwgMHgwKTsKCgloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgoJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDgpOwoJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKfQoKVk9JRApoYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNjYW4oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJLy8gcG93ZXIgc2F2ZSBzdGF0ZQoJaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMgJiYgIXBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mby5iSGlkT25seSkKCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX0xQU19PTiwgMHg1MCwgMHgwKTsKCWVsc2UKCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CgoJaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpCgl7CgkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlDb25uZWN0ZWRCdEFjbEJ1c3kocEJ0Q29leGlzdCwKCQkJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfU0NBTik7Cgl9CgllbHNlIGlmKCAoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpIHx8CgkJCShCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpICkKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uQnRTY29IaWRPbmx5QnVzeShwQnRDb2V4aXN0LAoJCQlCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9TQ0FOKTsKCX0KCWVsc2UKCXsJCQoJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgkJaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDgpOwoJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7Cgl9Cn0KCgpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU3BlY2lhbFBhY2tldCgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CgkvLyBwb3dlciBzYXZlIHN0YXRlCglpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cyAmJiAhcEJ0Q29leGlzdC0+YnRfbGlua19pbmZvLmJIaWRPbmx5KQoJCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfTFBTX09OLCAweDUwLCAweDApOwoJZWxzZQoJCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsIDB4MCwgMHgwKTsKCglpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cykKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZEJ0QWNsQnVzeShwQnRDb2V4aXN0LAoJCQlCVF84MTkyRV8xQU5UX1dJRklfU1RBVFVTX0NPTk5FQ1RFRF9TUEVDSUFMX1BLVCk7Cgl9CgllbHNlCgl7CQkKCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKCQloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDIpOwoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCUJPT0xFQU4gCWJXaWZpQ29ubmVjdGVkPUZBTFNFLCBiV2lmaUJ1c3k9RkFMU0U7CglCT09MRUFOIAliU2Nhbj1GQUxTRSwgYkxpbms9RkFMU0UsIGJSb2FtPUZBTFNFOwoJQk9PTEVBTiAJYlVuZGVyNHdheT1GQUxTRTsKCXU0Qnl0ZQkJd2lmaUJ3OwoKCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCk9PT0+XG4iKSk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpOwoJaWYoIWJXaWZpQ29ubmVjdGVkKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQ29leEZvcldpZmlDb25uZWN0KCksIHJldHVybiBmb3Igd2lmaSBub3QgY29ubmVjdGVkPD09PVxuIikpOwoJCXJldHVybjsKCX0KCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV80X1dBWV9QUk9HUkVTUywgJmJVbmRlcjR3YXkpOwoJaWYoYlVuZGVyNHdheSkKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZFNwZWNpYWxQYWNrZXQocEJ0Q29leGlzdCk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBDb2V4Rm9yV2lmaUNvbm5lY3QoKSwgcmV0dXJuIGZvciB3aWZpIGlzIHVuZGVyIDR3YXk8PT09XG4iKSk7CgkJcmV0dXJuOwoJfQoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1NDQU4sICZiU2Nhbik7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmYkxpbmspOwoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfUk9BTSwgJmJSb2FtKTsKCWlmKGJTY2FuIHx8IGJMaW5rIHx8IGJSb2FtKQoJewoJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU2NhbihwQnRDb2V4aXN0KTsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIENvZXhGb3JXaWZpQ29ubmVjdCgpLCByZXR1cm4gZm9yIHdpZmkgaXMgdW5kZXIgc2Nhbjw9PT1cbiIpKTsKCQlyZXR1cm47Cgl9CgoJLy8gcG93ZXIgc2F2ZSBzdGF0ZQoJaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMgJiYgIXBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mby5iSGlkT25seSkKCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX0xQU19PTiwgMHg1MCwgMHgwKTsKCWVsc2UKCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQlVTWSwgJmJXaWZpQnVzeSk7CQoJaWYoIWJXaWZpQnVzeSkKCXsKCQlpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cykKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkQnRBY2xCdXN5KHBCdENvZXhpc3QsIAoJCQkJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfSURMRSk7CgkJfQoJCWVsc2UgaWYoIChCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cykgfHwKCQkJKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cykgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0U2NvSGlkT25seUJ1c3kocEJ0Q29leGlzdCwKCQkJCUJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX0lETEUpOwoJCX0KCQllbHNlCgkJewkJCQkKCQkJaGFsYnRjODE5MmUxYW50X0RlY0J0UHdyKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAwKTsKCQkJaGFsYnRjODE5MmUxYW50X0RhY1N3aW5nKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgMCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA4KTsKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKCQl9Cgl9CgllbHNlCgl7CgkJaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKQoJCXsJCQkJCgkJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCB0cnVlLCA1KTsKCQkJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKCQl9CgkJZWxzZSBpZihCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQ29leERtLT5idFN0YXR1cykKCQl7CQkJCQoJCQloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDApOwoJCQloYWxidGM4MTkyZTFhbnRfRGFjU3dpbmcocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCAwKTsJCQkKCQkJaGFsYnRjODE5MmUxYW50X1BzVGRtYShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgdHJ1ZSwgNSk7CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CgkJfQoJCWVsc2UgaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpCgkJewoJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaUNvbm5lY3RlZEJ0QWNsQnVzeShwQnRDb2V4aXN0LAoJCQkJQlRfODE5MkVfMUFOVF9XSUZJX1NUQVRVU19DT05ORUNURURfQlVTWSk7CgkJfQoJCWVsc2UgaWYoIChCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19TQ09fQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cykgfHwKCQkJKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cykgKQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkJ0U2NvSGlkT25seUJ1c3kocEJ0Q29leGlzdCwKCQkJCUJUXzgxOTJFXzFBTlRfV0lGSV9TVEFUVVNfQ09OTkVDVEVEX0JVU1kpOwoJCX0KCQllbHNlIAoJCXsJCQkJCgkJCWhhbGJ0YzgxOTJlMWFudF9EZWNCdFB3cihwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9EYWNTd2luZyhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgRkFMU0UsIDApOwoJCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9Db2V4VGFibGVXaXRoVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CgkJfQoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9SdW5Td0NvZXhpc3RNZWNoYW5pc20oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJQk9PTEVBTgkJCQliV2lmaVVuZGVyNUc9RkFMU0UsIGJXaWZpQnVzeT1GQUxTRSwgYldpZmlDb25uZWN0ZWQ9RkFMU0U7Cgl1MUJ5dGUJCQkJYnRJbmZvT3JpZ2luYWw9MCwgYnRSZXRyeUNudD0wOwoJdTFCeXRlCQkJCWFsZ29yaXRobT0wOwoKCXJldHVybjsKCglhbGdvcml0aG0gPSBoYWxidGM4MTkyZTFhbnRfQWN0aW9uQWxnb3JpdGhtKHBCdENvZXhpc3QpOwoJcENvZXhEbS0+Y3VyQWxnb3JpdGhtID0gYWxnb3JpdGhtOwoKCWlmKGhhbGJ0YzgxOTJlMWFudF9Jc0NvbW1vbkFjdGlvbihwQnRDb2V4aXN0KSkKCXsKCX0KCWVsc2UKCXsKCQlzd2l0Y2gocENvZXhEbS0+Y3VyQWxnb3JpdGhtKQoJCXsKCQkJY2FzZSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19TQ086CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBTQ08uXG4iKSk7CgkJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uU2NvKHBCdENvZXhpc3QpOwoJCQkJYnJlYWs7CgkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEOgoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSElELlxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkhpZChwQnRDb2V4aXN0KTsKCQkJCWJyZWFrOwoJCQljYXNlIEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX0EyRFA6CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBBMkRQLlxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkEyZHAocEJ0Q29leGlzdCk7CgkJCQlicmVhazsKCQkJY2FzZSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19BMkRQX1BBTkhTOgoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gQTJEUCtQQU4oSFMpLlxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkEyZHBQYW5IcyhwQnRDb2V4aXN0KTsKCQkJCWJyZWFrOwoJCQljYXNlIEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1BBTkVEUjoKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IFBBTihFRFIpLlxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvblBhbkVkcihwQnRDb2V4aXN0KTsKCQkJCWJyZWFrOwoJCQljYXNlIEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1BBTkhTOgoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSFMgbW9kZS5cbiIpKTsKCQkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25QYW5IcyhwQnRDb2V4aXN0KTsKCQkJCWJyZWFrOwoJCQljYXNlIEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQOgoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gUEFOK0EyRFAuXG4iKSk7CgkJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uUGFuRWRyQTJkcChwQnRDb2V4aXN0KTsKCQkJCWJyZWFrOwoJCQljYXNlIEJUXzgxOTJFXzFBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ6CgkJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEFjdGlvbiBhbGdvcml0aG0gPSBQQU4oRURSKStISUQuXG4iKSk7CgkJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uUGFuRWRySGlkKHBCdENvZXhpc3QpOwoJCQkJYnJlYWs7CgkJCWNhc2UgQlRfODE5MkVfMUFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOgoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBBY3Rpb24gYWxnb3JpdGhtID0gSElEK0EyRFArUEFOLlxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkhpZEEyZHBQYW5FZHIocEJ0Q29leGlzdCk7CgkJCQlicmVhazsKCQkJY2FzZSBCVF84MTkyRV8xQU5UX0NPRVhfQUxHT19ISURfQTJEUDoKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IEhJRCtBMkRQLlxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbkhpZEEyZHAocEJ0Q29leGlzdCk7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQWN0aW9uIGFsZ29yaXRobSA9IGNvZXhpc3QgQWxsIE9mZiEhXG4iKSk7CgkJCQloYWxidGM4MTkyZTFhbnRfQ29leEFsbE9mZihwQnRDb2V4aXN0KTsKCQkJCWJyZWFrOwoJCX0KCQlwQ29leERtLT5wcmVBbGdvcml0aG0gPSBwQ29leERtLT5jdXJBbGdvcml0aG07Cgl9Cn0KClZPSUQKaGFsYnRjODE5MmUxYW50X1J1bkNvZXhpc3RNZWNoYW5pc20oCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QKCSkKewoJUEJUQ19CVF9MSU5LX0lORk8JcEJ0TGlua0luZm89JnBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKCUJPT0xFQU4JYldpZmlDb25uZWN0ZWQ9RkFMU0UsIGJCdEhzT249RkFMU0U7CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCk9PT0+XG4iKSk7CgoJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBSdW5Db2V4aXN0TWVjaGFuaXNtKCksIHJldHVybiBmb3IgTWFudWFsIENUUkwgPD09PVxuIikpOwoJCXJldHVybjsKCX0KCglpZihwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIFJ1bkNvZXhpc3RNZWNoYW5pc20oKSwgcmV0dXJuIGZvciBTdG9wIENvZXggRE0gPD09PVxuIikpOwoJCXJldHVybjsKCX0KCglpZihwQ29leFN0YS0+YlVuZGVySXBzKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgd2lmaSBpcyB1bmRlciBJUFMgISEhXG4iKSk7CgkJcmV0dXJuOwoJfQoJCgloYWxidGM4MTkyZTFhbnRfUnVuU3dDb2V4aXN0TWVjaGFuaXNtKHBCdENvZXhpc3QpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKCWlmKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSkKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uQnRJbnF1aXJ5KHBCdENvZXhpc3QpOwoJCXJldHVybjsKCX0KCgkvLyAxc3Mgb3IgMnNzCglpZihwQnRMaW5rSW5mby0+YlNjb0V4aXN0KQoJewoJCWhhbGJ0YzgxOTJlMWFudF9Td2l0Y2hTc1R5cGUocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIDEpOwoJfQoJZWxzZSBpZihiQnRIc09uKQoJewoJCWlmKHBCdExpbmtJbmZvLT5iSGlkT25seSkKCQkJaGFsYnRjODE5MmUxYW50X1N3aXRjaFNzVHlwZShwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgMik7CgkJZWxzZQoJCQloYWxidGM4MTkyZTFhbnRfU3dpdGNoU3NUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAxKTsKCX0KCWVsc2UKCQloYWxidGM4MTkyZTFhbnRfU3dpdGNoU3NUeXBlKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCAyKTsKCQoJaWYoYkJ0SHNPbikKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uSHMocEJ0Q29leGlzdCk7CgkJcmV0dXJuOwoJfQoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKCWlmKCFiV2lmaUNvbm5lY3RlZCkKCXsKCQlCT09MRUFOCWJTY2FuPUZBTFNFLCBiTGluaz1GQUxTRSwgYlJvYW09RkFMU0U7CgkJCgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCB3aWZpIGlzIG5vbiBjb25uZWN0ZWQtaWRsZSAhISFcbiIpKTsKCgkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJmJTY2FuKTsKCQlwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9MSU5LLCAmYkxpbmspOwoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX1JPQU0sICZiUm9hbSk7CgoJCWlmKGJTY2FuIHx8IGJMaW5rIHx8IGJSb2FtKQoJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZEFzc29BdXRoU2NhbihwQnRDb2V4aXN0KTsKCQllbHNlCgkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkKHBCdENvZXhpc3QpOwoJfQoJZWxzZQoJewoJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKHBCdENvZXhpc3QpOwoJfQp9CgpWT0lECmhhbGJ0YzgxOTJlMWFudF9Jbml0Q29leERtKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsJCgkvLyBmb3JjZSB0byByZXNldCBjb2V4IG1lY2hhbmlzbQoJaGFsYnRjODE5MmUxYW50X0Z3RGFjU3dpbmdMdmwocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgNik7CgloYWxidGM4MTkyZTFhbnRfRGVjQnRQd3IocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgMCk7CgoJLy8gc3cgYWxsIG9mZgoJaGFsYnRjODE5MmUxYW50X1N3TWVjaGFuaXNtMShwQnRDb2V4aXN0LEZBTFNFLEZBTFNFLEZBTFNFLEZBTFNFKTsKCWhhbGJ0YzgxOTJlMWFudF9Td01lY2hhbmlzbTIocEJ0Q29leGlzdCxGQUxTRSxGQUxTRSxGQUxTRSwweDE4KTsKCgloYWxidGM4MTkyZTFhbnRfU3dpdGNoU3NUeXBlKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIDIpOwoKCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UsIDgpOwoJaGFsYnRjODE5MmUxYW50X0NvZXhUYWJsZVdpdGhUeXBlKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIDApOwp9CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyB3b3JrIGFyb3VuZCBmdW5jdGlvbiBzdGFydCB3aXRoIHdhX2hhbGJ0YzgxOTJlMWFudF8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gZXh0ZXJuIGZ1bmN0aW9uIHN0YXJ0IHdpdGggRVhoYWxidGM4MTkyZTFhbnRfCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfSW5pdEh3Q29uZmlnKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXU0Qnl0ZQl1NFRtcD0wOwoJdTE2CXUyVG1wPTA7Cgl1MUJ5dGUJdTFUbXA9MDsKCglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgMUFudCBJbml0IEhXIENvbmZpZyEhXG4iKSk7CgoJLy8gYmFja3VwIHJmIDB4MWUgdmFsdWUKCXBDb2V4RG0tPmJ0UmYweDFlQmFja3VwID0gCgkJcEJ0Q29leGlzdC0+YnRjX2dldF9yZl9yZWcocEJ0Q29leGlzdCwgQlRDX1JGX0EsIDB4MWUsIDB4ZmZmZmYpOwoKCS8vIGFudGVubmEgc3cgY3RybCB0byBidAoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NGYsIDB4Nik7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg5NDQsIDB4MjQpOwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4OTMwLCAweDcwMDcwMCk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg5MmMsIDB4MjApOwoJaWYocEJ0Q29leGlzdC0+Y2hpcEludGVyZmFjZSA9PSBCVENfSU5URl9VU0IpCgkJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzRieXRlKHBCdENvZXhpc3QsIDB4NjQsIDB4MzA0MzAwMDQpOwoJZWxzZQoJCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDY0LCAweDMwMDMwMDA0KTsKCgloYWxidGM4MTkyZTFhbnRfQ29leFRhYmxlV2l0aFR5cGUocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgMCk7CgoJLy8gYW50ZW5uYSBzd2l0Y2ggY29udHJvbCBwYXJhbWV0ZXIKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV80Ynl0ZShwQnRDb2V4aXN0LCAweDg1OCwgMHg1NTU1NTU1NSk7CgoJLy8gY29leCBwYXJhbWV0ZXJzCglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg3NzgsIDB4MSk7CgkvLyAweDc5MFs1OjBdPTB4NQoJdTFUbXAgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDc5MCk7Cgl1MVRtcCAmPSAweGMwOwoJdTFUbXAgfD0gMHg1OwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NzkwLCB1MVRtcCk7CgoJLy8gZW5hYmxlIGNvdW50ZXIgc3RhdGlzdGljcwoJcEJ0Q29leGlzdC0+YnRjX3dyaXRlXzFieXRlKHBCdENvZXhpc3QsIDB4NzZlLCAweDQpOwoKCS8vIGVuYWJsZSBQVEEKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDQwLCAweDIwKTsKCS8vIGVuYWJsZSBtYWlsYm94IGludGVyZmFjZQoJdTJUbXAgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8yYnl0ZShwQnRDb2V4aXN0LCAweDQwKTsKCXUyVG1wIHw9IEJJVDk7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMmJ5dGUocEJ0Q29leGlzdCwgMHg0MCwgdTJUbXApOwoKCS8vIGVuYWJsZSBQVEEgSTJDIG1haWxib3ggCgl1MVRtcCA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4MTAxKTsKCXUxVG1wIHw9IEJJVDQ7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHgxMDEsIHUxVG1wKTsKCgkvLyBlbmFibGUgYnQgY2xvY2sgd2hlbiB3aWZpIGlzIGRpc2FibGVkLgoJdTFUbXAgPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDkzKTsKCXUxVG1wIHw9IEJJVDA7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg5MywgdTFUbXApOwoJLy8gZW5hYmxlIGJ0IGNsb2NrIHdoZW4gc3VzcGVuZC4KCXUxVG1wID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg3KTsKCXUxVG1wIHw9IEJJVDA7CglwQnRDb2V4aXN0LT5idGNfd3JpdGVfMWJ5dGUocEJ0Q29leGlzdCwgMHg3LCB1MVRtcCk7Cn0KClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfSW5pdENvZXhEbSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdAoJKQp7CglCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgQ29leCBNZWNoYW5pc20gSW5pdCEhXG4iKSk7CgoJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0gPSBGQUxTRTsKCQoJaGFsYnRjODE5MmUxYW50X0luaXRDb2V4RG0ocEJ0Q29leGlzdCk7Cn0KClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfRGlzcGxheUNvZXhJbmZvKAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0CgkpCnsKCXN0cnVjdCBidGNfYm9hcmRfaW5mbyAqCQlwQm9hcmRJbmZvPSZwQnRDb2V4aXN0LT5ib2FyZF9pbmZvOwoJUEJUQ19TVEFDS19JTkZPCQlwU3RhY2tJbmZvPSZwQnRDb2V4aXN0LT5zdGFja19pbmZvOwoJUEJUQ19CVF9MSU5LX0lORk8JcEJ0TGlua0luZm89JnBCdENvZXhpc3QtPmJ0X2xpbmtfaW5mbzsKCXB1MUJ5dGUJCQkJY2xpQnVmPXBCdENvZXhpc3QtPmNsaV9idWY7Cgl1MUJ5dGUJCQkJdTFUbXBbNF0sIGksIGJ0SW5mb0V4dCwgcHNUZG1hQ2FzZT0wOwoJdTRCeXRlCQkJCXU0VG1wWzRdOwoJQk9PTEVBTgkJCQliUm9hbT1GQUxTRSwgYlNjYW49RkFMU0UsIGJMaW5rPUZBTFNFLCBiV2lmaVVuZGVyNUc9RkFMU0U7CglCT09MRUFOCQkJCWJCdEhzT249RkFMU0UsIGJXaWZpQnVzeT1GQUxTRTsKCXM0Qnl0ZQkJCQl3aWZpUnNzaT0wLCBidEhzUnNzaT0wOwoJdTRCeXRlCQkJCXdpZmlCdywgd2lmaVRyYWZmaWNEaXI7Cgl1MUJ5dGUJCQkJd2lmaURvdDExQ2hubCwgd2lmaUhzQ2hubDsKCXU0Qnl0ZQkJCQlmd1Zlcj0wLCBidFBhdGNoVmVyPTA7CgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09W0JUIENvZXhpc3QgaW5mb109PT09PT09PT09PT0iKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCWlmKHBCdENvZXhpc3QtPm1hbnVhbF9jb250cm9sKQoJewoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuID09PT09PT09PT09PVtVbmRlciBNYW51YWwgQ29udHJvbF09PT09PT09PT09PT0iKTsKCQlDTF9QUklOVEYoY2xpQnVmKTsKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKCQlDTF9QUklOVEYoY2xpQnVmKTsKCX0JCglpZihwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSkKCXsKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiA9PT09PT09PT09PT1bQ29leCBpcyBTVE9QUEVEXT09PT09PT09PT09PSIpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoJfQoKCWlmKCFwQm9hcmRJbmZvLT5idF9leGlzdCkKCXsKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiBCVCBub3QgZXhpc3RzICEhISIpOwoJCUNMX1BSSU5URihjbGlCdWYpOwoJCXJldHVybjsKCX0KCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCAiLCAiQW50IFBHIG51bWJlci8gQW50IG1lY2hhbmlzbToiLCBcCgkJcEJvYXJkSW5mby0+cGdfYW50X251bSwgcEJvYXJkSW5mby0+YnRkbV9hbnRfbnVtKTsKCUNMX1BSSU5URihjbGlCdWYpOwkKCQoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVkIiwgIkJUIHN0YWNrLyBoY2kgZXh0IHZlciIsIFwKCQkoKHBTdGFja0luZm8tPmJQcm9maWxlTm90aWZpZWQpPyAiWWVzIjoiTm8iKSwgcFN0YWNrSW5mby0+aGNpVmVyc2lvbik7CglDTF9QUklOVEYoY2xpQnVmKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfQlRfUEFUQ0hfVkVSLCAmYnRQYXRjaFZlcik7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9GV19WRVIsICZmd1Zlcik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkXyVkLyAweCV4LyAweCV4KCVkKSIsICJDb2V4VmVyLyBGd1Zlci8gUGF0Y2hWZXIiLCBcCgkJR0xDb2V4VmVyRGF0ZTgxOTJlMUFudCwgR0xDb2V4VmVyODE5MmUxQW50LCBmd1ZlciwgYnRQYXRjaFZlciwgYnRQYXRjaFZlcik7CglDTF9QUklOVEYoY2xpQnVmKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfSFNfT1BFUkFUSU9OLCAmYkJ0SHNPbik7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9ET1QxMV9DSE5MLCAmd2lmaURvdDExQ2hubCk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9IU19DSE5MLCAmd2lmaUhzQ2hubCk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQoJWQpIiwgIkRvdDExIGNoYW5uZWwgLyBIc0NobmwoSHNNb2RlKSIsIFwKCQl3aWZpRG90MTFDaG5sLCB3aWZpSHNDaG5sLCBiQnRIc09uKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggIiwgIkgyQyBXaWZpIGluZm9ybSBidCBjaG5sIEluZm8iLCBcCgkJcENvZXhEbS0+d2lmaUNobmxJbmZvWzBdLCBwQ29leERtLT53aWZpQ2hubEluZm9bMV0sCgkJcENvZXhEbS0+d2lmaUNobmxJbmZvWzJdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9TNF9XSUZJX1JTU0ksICZ3aWZpUnNzaSk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfUzRfSFNfUlNTSSwgJmJ0SHNSc3NpKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIldpZmkgcnNzaS8gSFMgcnNzaSIsIFwKCQl3aWZpUnNzaSwgYnRIc1Jzc2kpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfU0NBTiwgJmJTY2FuKTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0xJTkssICZiTGluayk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9ST0FNLCAmYlJvYW0pOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQvICVkICIsICJXaWZpIGJMaW5rLyBiUm9hbS8gYlNjYW4iLCBcCgkJYkxpbmssIGJSb2FtLCBiU2Nhbik7CglDTF9QUklOVEYoY2xpQnVmKTsKCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9VTkRFUl81RywgJmJXaWZpVW5kZXI1Ryk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTRfV0lGSV9CVywgJndpZmlCdyk7CglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfQkxfV0lGSV9CVVNZLCAmYldpZmlCdXN5KTsKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX1RSQUZGSUNfRElSRUNUSU9OLCAmd2lmaVRyYWZmaWNEaXIpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVzLyAlcyAiLCAiV2lmaSBzdGF0dXMiLCBcCgkJKGJXaWZpVW5kZXI1Rz8gIjVHIjoiMi40RyIpLAoJCSgoQlRDX1dJRklfQldfTEVHQUNZPT13aWZpQncpPyAiTGVnYWN5IjogKCgoQlRDX1dJRklfQldfSFQ0MD09d2lmaUJ3KT8gIkhUNDAiOiJIVDIwIikpKSwKCQkoKCFiV2lmaUJ1c3kpPyAiaWRsZSI6ICgoQlRDX1dJRklfVFJBRkZJQ19UWD09d2lmaVRyYWZmaWNEaXIpPyAidXBsaW5rIjoiZG93bmxpbmsiKSkpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IFslcy8gJWQvICVkXSAiLCAiQlQgW3N0YXR1cy8gcnNzaS8gcmV0cnlDbnRdIiwgXAoJCSgocEJ0Q29leGlzdC0+YnRJbmZvLmJCdERpc2FibGVkKT8gKCJkaXNhYmxlZCIpOgkoKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSk/KCJpbnF1aXJ5L3BhZ2Ugc2NhbiIpOigoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKT8gIm5vbi1jb25uZWN0ZWQgaWRsZSI6CgkJKCAgKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IHBDb2V4RG0tPmJ0U3RhdHVzKT8gImNvbm5lY3RlZC1pZGxlIjoiYnVzeSIpKSkpLAoJCXBDb2V4U3RhLT5idFJzc2ksIHBDb2V4U3RhLT5idFJldHJ5Q250KTsKCUNMX1BSSU5URihjbGlCdWYpOwoJCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQgLyAlZCAvICVkIiwgIlNDTy9ISUQvUEFOL0EyRFAiLCBcCgkJcEJ0TGlua0luZm8tPmJTY29FeGlzdCwgcEJ0TGlua0luZm8tPmJIaWRFeGlzdCwgcEJ0TGlua0luZm8tPmJQYW5FeGlzdCwgcEJ0TGlua0luZm8tPmJBMmRwRXhpc3QpOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CglwQnRDb2V4aXN0LT5idGNfZGlzcF9kYmdfbXNnKHBCdENvZXhpc3QsIEJUQ19EQkdfRElTUF9CVF9MSU5LX0lORk8pOwkKCglidEluZm9FeHQgPSBwQ29leFN0YS0+YnRJbmZvRXh0OwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyIsICJCVCBJbmZvIEEyRFAgcmF0ZSIsIFwKCQkoYnRJbmZvRXh0JkJJVDApPyAiQmFzaWMgcmF0ZSI6IkVEUiByYXRlIik7CglDTF9QUklOVEYoY2xpQnVmKTsJCgoJZm9yKGk9MDsgaTxCVF9JTkZPX1NSQ184MTkyRV8xQU5UX01BWDsgaSsrKQoJewoJCWlmKHBDb2V4U3RhLT5idEluZm9DMmhDbnRbaV0pCgkJewkJCQkKCQkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4KCVkKSIsIEdMQnRJbmZvU3JjODE5MmUxQW50W2ldLCBcCgkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzBdLCBwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzFdLAoJCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVsyXSwgcENvZXhTdGEtPmJ0SW5mb0MyaFtpXVszXSwKCQkJCXBDb2V4U3RhLT5idEluZm9DMmhbaV1bNF0sIHBDb2V4U3RhLT5idEluZm9DMmhbaV1bNV0sCgkJCQlwQ29leFN0YS0+YnRJbmZvQzJoW2ldWzZdLCBwQ29leFN0YS0+YnRJbmZvQzJoQ250W2ldKTsKCQkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkJfQoJfQoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcy8lcywgKDB4JXgvMHgleCkiLCAiUFMgc3RhdGUsIElQUy9MUFMsIChscHMvcnB3bSkiLCBcCgkJKChwQ29leFN0YS0+YlVuZGVySXBzPyAiSVBTIE9OIjoiSVBTIE9GRiIpKSwKCQkoKHBDb2V4U3RhLT5iVW5kZXJMcHM/ICJMUFMgT04iOiJMUFMgT0ZGIikpLCAKCQlwQnRDb2V4aXN0LT5idEluZm8ubHBzMUFudCwgCgkJcEJ0Q29leGlzdC0+YnRJbmZvLnJwd21fMWFudCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCXBCdENvZXhpc3QtPmJ0Y19kaXNwX2RiZ19tc2cocEJ0Q29leGlzdCwgQlRDX0RCR19ESVNQX0ZXX1BXUl9NT0RFX0NNRCk7CgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4ICIsICJTUyBUeXBlIiwgXAoJCXBDb2V4RG0tPmN1clNzVHlwZSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCglpZighcEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wpCgl7CgkJLy8gU3cgbWVjaGFuaXNtCQoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtTdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQvICVkICIsICJTTTFbU2hSZi8gTHBSQS8gTGltRGlnLyBidExuYV0iLCBcCgkJCXBDb2V4RG0tPmJDdXJSZlJ4THBmU2hyaW5rLCBwQ29leERtLT5iQ3VyTG93UGVuYWx0eVJhLCBwQ29leERtLT5saW1pdGVkX2RpZywgcENvZXhEbS0+YkN1ckJ0TG5hQ29uc3RyYWluKTsKCQlDTF9QUklOVEYoY2xpQnVmKTsKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZC8gJWQoMHgleCkgIiwgIlNNMltBZ2NULyBBZGNCLyBTd0RhY1N3aW5nKGx2bCldIiwgXAoJCQlwQ29leERtLT5iQ3VyQWdjVGFibGVFbiwgcENvZXhEbS0+YkN1ckFkY0JhY2tPZmYsIHBDb2V4RG0tPmJDdXJEYWNTd2luZ09uLCBwQ29leERtLT5jdXJEYWNTd2luZ0x2bCk7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMvICVzLyAlZCAiLCAiRGVsQkEvIEJ0Q3RybEFnZy8gQWdnU2l6ZSIsIFwKCQkJKHBCdENvZXhpc3QtPmJ0SW5mby5yZWplY3RfYWdnX3BrdD8gIlllcyI6Ik5vIiksIChwQnRDb2V4aXN0LT5idEluZm8uYl9idF9jdHJsX2FnZ19idWZfc2l6ZT8gIlllcyI6Ik5vIiksCgkJCQlwQnRDb2V4aXN0LT5idEluZm8uYWdnQnVmU2l6ZSk7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4ICIsICJSYXRlIE1hc2siLCBcCgkJCQlwQnRDb2V4aXN0LT5idEluZm8ucmFfbWFzayk7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkKCQkvLyBGdyBtZWNoYW5pc20JCQoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtGdyBtZWNoYW5pc21dPT09PT09PT09PT09Iik7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CQoKCQlwc1RkbWFDYXNlID0gcENvZXhEbS0+Y3VyUHNUZG1hOwoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGNhc2UtJWQgKGF1dG86JWQpIiwgIlBTIFRETUEiLCBcCgkJCXBDb2V4RG0tPnBzVGRtYVBhcmFbMF0sIHBDb2V4RG0tPnBzVGRtYVBhcmFbMV0sCgkJCXBDb2V4RG0tPnBzVGRtYVBhcmFbMl0sIHBDb2V4RG0tPnBzVGRtYVBhcmFbM10sCgkJCXBDb2V4RG0tPnBzVGRtYVBhcmFbNF0sIHBzVGRtYUNhc2UsIHBDb2V4RG0tPmJBdXRvVGRtYUFkanVzdCk7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCAiLCAiTGF0ZXN0IGVycm9yIGNvbmRpdGlvbihzaG91bGQgYmUgMCkiLCBcCgkJCXBDb2V4RG0tPmVycm9yQ29uZGl0aW9uKTsKCQlDTF9QUklOVEYoY2xpQnVmKTsKCQkKCQlDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkLyAlZCAiLCAiRGVjQnRQd3JMdmwvIElnbldsYW5BY3QiLCBcCgkJCXBDb2V4RG0tPmN1ckJ0RGVjUHdyTHZsLCBwQ29leERtLT5iQ3VySWdub3JlV2xhbkFjdCk7CgkJQ0xfUFJJTlRGKGNsaUJ1Zik7Cgl9CgoJLy8gSHcgc2V0dGluZwkJCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bSHcgc2V0dGluZ109PT09PT09PT09PT0iKTsKCUNMX1BSSU5URihjbGlCdWYpOwkKCglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiUkYtQSwgMHgxZSBpbml0VmFsIiwgXAoJCXBDb2V4RG0tPmJ0UmYweDFlQmFja3VwKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHhjMDQpOwoJdTRUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweGQwNCk7Cgl1NFRtcFsyXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4OTBjKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleC8gMHgleCIsICIweGMwNC8gMHhkMDQvIDB4OTBjIiwgXAoJCXU0VG1wWzBdLCB1NFRtcFsxXSwgdTRUbXBbMl0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDc3OCk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg3NzgiLCBcCgkJdTFUbXBbMF0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgkKCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg5MmMpOwoJdTRUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDkzMCk7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLCAiMHg5MmMvIDB4OTMwIiwgXAoJCSh1MVRtcFswXSksIHU0VG1wWzBdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg0MCk7Cgl1MVRtcFsxXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzFieXRlKHBCdENvZXhpc3QsIDB4NGYpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4IiwgIjB4NDAvIDB4NGYiLCBcCgkJdTFUbXBbMF0sIHUxVG1wWzFdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg1NTApOwoJdTFUbXBbMF0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF8xYnl0ZShwQnRDb2V4aXN0LCAweDUyMik7CglDTF9TUFJJTlRGKGNsaUJ1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLCAiMHg1NTAoYmNuIGN0cmwpLzB4NTIyIiwgXAoJCXU0VG1wWzBdLCB1MVRtcFswXSk7CglDTF9QUklOVEYoY2xpQnVmKTsKCgl1NFRtcFswXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4YzUwKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweGM1MChkaWcpIiwgXAoJCXU0VG1wWzBdKTsKCUNMX1BSSU5URihjbGlCdWYpOwoKCXU0VG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfNGJ5dGUocEJ0Q29leGlzdCwgMHg2YzApOwoJdTRUbXBbMV0gPSBwQnRDb2V4aXN0LT5idGNfcmVhZF80Ynl0ZShwQnRDb2V4aXN0LCAweDZjNCk7Cgl1NFRtcFsyXSA9IHBCdENvZXhpc3QtPmJ0Y19yZWFkXzRieXRlKHBCdENvZXhpc3QsIDB4NmM4KTsKCXUxVG1wWzBdID0gcEJ0Q29leGlzdC0+YnRjX3JlYWRfMWJ5dGUocEJ0Q29leGlzdCwgMHg2Y2MpOwoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4LyAweCV4IiwgIjB4NmMwLzB4NmM0LzB4NmM4LzB4NmNjKGNvZXhUYWJsZSkiLCBcCgkJdTRUbXBbMF0sIHU0VG1wWzFdLCB1NFRtcFsyXSwgdTFUbXBbMF0pOwoJQ0xfUFJJTlRGKGNsaUJ1Zik7CgoJQ0xfU1BSSU5URihjbGlCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8gJWQiLCAiMHg3NzAoaHAgcnhbMzE6MTZdL3R4WzE1OjBdKSIsIFwKCQlwQ29leFN0YS0+aGlnaFByaW9yaXR5UngsIHBDb2V4U3RhLT5oaWdoUHJpb3JpdHlUeCk7CglDTF9QUklOVEYoY2xpQnVmKTsKCUNMX1NQUklOVEYoY2xpQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvICVkIiwgIjB4Nzc0KGxwIHJ4WzMxOjE2XS90eFsxNTowXSkiLCBcCgkJcENvZXhTdGEtPmxvd1ByaW9yaXR5UngsIHBDb2V4U3RhLT5sb3dQcmlvcml0eVR4KTsKCUNMX1BSSU5URihjbGlCdWYpOwojaWYoQlRfQVVUT19SRVBPUlRfT05MWV84MTkyRV8xQU5UID09IDEpCgloYWxidGM4MTkyZTFhbnRfTW9uaXRvckJ0Q3RyKHBCdENvZXhpc3QpOwojZW5kaWYKCQoJcEJ0Q29leGlzdC0+YnRjX2Rpc3BfZGJnX21zZyhwQnRDb2V4aXN0LCBCVENfREJHX0RJU1BfQ09FWF9TVEFUSVNUSUNTKTsKfQoKClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfSXBzTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJdHlwZQoJKQp7Cgl1NEJ5dGUJdTRUbXA9MDsKCglpZihwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fAlwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSkKCQlyZXR1cm47CgoJaWYoQlRDX0lQU19FTlRFUiA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIElQUyBFTlRFUiBub3RpZnlcbiIpKTsKCQlwQ29leFN0YS0+YlVuZGVySXBzID0gdHJ1ZTsKCQloYWxidGM4MTkyZTFhbnRfQ29leEFsbE9mZihwQnRDb2V4aXN0KTsKCX0KCWVsc2UgaWYoQlRDX0lQU19MRUFWRSA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIElQUyBMRUFWRSBub3RpZnlcbiIpKTsKCQlwQ29leFN0YS0+YlVuZGVySXBzID0gRkFMU0U7Cgl9Cn0KClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfTHBzTm90aWZ5KAoJSU4JUEJUQ19DT0VYSVNUCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJdHlwZQoJKQp7CglpZihwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fCBwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSkKCQlyZXR1cm47CgoJaWYoQlRDX0xQU19FTkFCTEUgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBMUFMgRU5BQkxFIG5vdGlmeVxuIikpOwoJCXBDb2V4U3RhLT5iVW5kZXJMcHMgPSB0cnVlOwoJfQoJZWxzZSBpZihCVENfTFBTX0RJU0FCTEUgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBMUFMgRElTQUJMRSBub3RpZnlcbiIpKTsKCQlwQ29leFN0YS0+YlVuZGVyTHBzID0gRkFMU0U7Cgl9Cn0KClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfU2Nhbk5vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJcEJ0Q29leGlzdCwKCUlOCXUxQnl0ZQkJCXR5cGUKCSkKewoJQk9PTEVBTiAJCWJXaWZpQ29ubmVjdGVkPUZBTFNFLCBiQnRIc09uPUZBTFNFOwkKCglpZihwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCB8fAoJCXBCdENvZXhpc3QtPmJTdG9wQ29leERtIHx8CgkJcEJ0Q29leGlzdC0+YnRJbmZvLmJCdERpc2FibGVkICkKCQlyZXR1cm47CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX0hTX09QRVJBVElPTiwgJmJCdEhzT24pOwoJaWYocENvZXhTdGEtPmJDMmhCdElucXVpcnlQYWdlKQoJewoJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25CdElucXVpcnkocEJ0Q29leGlzdCk7CgkJcmV0dXJuOwoJfQoJZWxzZSBpZihiQnRIc09uKQoJewoJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25IcyhwQnRDb2V4aXN0KTsKCQlyZXR1cm47Cgl9CgoJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpOwoJaWYoQlRDX1NDQU5fU1RBUlQgPT0gdHlwZSkKCXsJCgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgU0NBTiBTVEFSVCBub3RpZnlcbiIpKTsKCQlpZighYldpZmlDb25uZWN0ZWQpCS8vIG5vbi1jb25uZWN0ZWQgc2NhbgoJCXsKCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWRBc3NvQXV0aFNjYW4ocEJ0Q29leGlzdCk7CgkJfQoJCWVsc2UJLy8gd2lmaSBpcyBjb25uZWN0ZWQKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU2NhbihwQnRDb2V4aXN0KTsKCQl9Cgl9CgllbHNlIGlmKEJUQ19TQ0FOX0ZJTklTSCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFNDQU4gRklOSVNIIG5vdGlmeVxuIikpOwoJCWlmKCFiV2lmaUNvbm5lY3RlZCkJLy8gbm9uLWNvbm5lY3RlZCBzY2FuCgkJewoJCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uV2lmaU5vdENvbm5lY3RlZChwQnRDb2V4aXN0KTsKCQl9CgkJZWxzZQoJCXsKCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlDb25uZWN0ZWQocEJ0Q29leGlzdCk7CgkJfQoJfQp9CgpWT0lECkVYaGFsYnRjODE5MmUxYW50X0Nvbm5lY3ROb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQl0eXBlCgkpCnsKCUJPT0xFQU4JYldpZmlDb25uZWN0ZWQ9RkFMU0UsIGJCdEhzT249RkFMU0U7CgoJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwKCQlwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSB8fAoJCXBCdENvZXhpc3QtPmJ0SW5mby5iQnREaXNhYmxlZCApCgkJcmV0dXJuOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKCWlmKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSkKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uQnRJbnF1aXJ5KHBCdENvZXhpc3QpOwoJCXJldHVybjsKCX0KCWVsc2UgaWYoYkJ0SHNPbikKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uSHMocEJ0Q29leGlzdCk7CgkJcmV0dXJuOwoJfQoKCWlmKEJUQ19BU1NPQ0lBVEVfU1RBUlQgPT0gdHlwZSkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBDT05ORUNUIFNUQVJUIG5vdGlmeVxuIikpOwoJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpTm90Q29ubmVjdGVkQXNzb0F1dGhTY2FuKHBCdENvZXhpc3QpOwoJfQoJZWxzZSBpZihCVENfQVNTT0NJQVRFX0ZJTklTSCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIENPTk5FQ1QgRklOSVNIIG5vdGlmeVxuIikpOwoJCQoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9XSUZJX0NPTk5FQ1RFRCwgJmJXaWZpQ29ubmVjdGVkKTsKCQlpZighYldpZmlDb25uZWN0ZWQpIC8vIG5vbi1jb25uZWN0ZWQgc2NhbgoJCXsKCQkJaGFsYnRjODE5MmUxYW50X0FjdGlvbldpZmlOb3RDb25uZWN0ZWQocEJ0Q29leGlzdCk7CgkJfQoJCWVsc2UKCQl7CgkJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkKHBCdENvZXhpc3QpOwoJCX0KCX0KfQoKVk9JRApFWGhhbGJ0YzgxOTJlMWFudF9NZWRpYVN0YXR1c05vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJdHlwZQoJKQp7Cgl1MUJ5dGUJCQlIMkNfUGFyYW1ldGVyWzNdID17MH07Cgl1NEJ5dGUJCQl3aWZpQnc7Cgl1MUJ5dGUJCQl3aWZpQ2VudHJhbENobmw7CgoJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwKCQlwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSB8fAoJCXBCdENvZXhpc3QtPmJ0SW5mby5iQnREaXNhYmxlZCApCgkJcmV0dXJuOwoKCWlmKEJUQ19NRURJQV9DT05ORUNUID09IHR5cGUpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgTUVESUEgY29ubmVjdCBub3RpZnlcbiIpKTsKCX0KCWVsc2UKCXsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfTk9USUZZLCAoIltCVENvZXhdLCBNRURJQSBkaXNjb25uZWN0IG5vdGlmeVxuIikpOwoJfQoKCS8vIG9ubHkgMi40RyB3ZSBuZWVkIHRvIGluZm9ybSBidCB0aGUgY2hubCBtYXNrCglwQnRDb2V4aXN0LT5idGNfZ2V0KHBCdENvZXhpc3QsIEJUQ19HRVRfVTFfV0lGSV9DRU5UUkFMX0NITkwsICZ3aWZpQ2VudHJhbENobmwpOwoJaWYoIChCVENfTUVESUFfQ09OTkVDVCA9PSB0eXBlKSAmJgoJCSh3aWZpQ2VudHJhbENobmwgPD0gMTQpICkKCXsKCQlIMkNfUGFyYW1ldGVyWzBdID0gMHgxOwoJCUgyQ19QYXJhbWV0ZXJbMV0gPSB3aWZpQ2VudHJhbENobmw7CgkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X1dJRklfQlcsICZ3aWZpQncpOwoJCWlmKEJUQ19XSUZJX0JXX0hUNDAgPT0gd2lmaUJ3KQoJCQlIMkNfUGFyYW1ldGVyWzJdID0gMHgzMDsKCQllbHNlCgkJCUgyQ19QYXJhbWV0ZXJbMl0gPSAweDIwOwoJfQoJCQoJcENvZXhEbS0+d2lmaUNobmxJbmZvWzBdID0gSDJDX1BhcmFtZXRlclswXTsKCXBDb2V4RG0tPndpZmlDaG5sSW5mb1sxXSA9IEgyQ19QYXJhbWV0ZXJbMV07CglwQ29leERtLT53aWZpQ2hubEluZm9bMl0gPSBIMkNfUGFyYW1ldGVyWzJdOwoJCglCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0VfRldfRVhFQywgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHg2Nj0weCV4XG4iLCAKCQlIMkNfUGFyYW1ldGVyWzBdPDwxNnxIMkNfUGFyYW1ldGVyWzFdPDw4fEgyQ19QYXJhbWV0ZXJbMl0pKTsKCglwQnRDb2V4aXN0LT5idGNfZmlsbF9oMmMocEJ0Q29leGlzdCwgMHg2NiwgMywgSDJDX1BhcmFtZXRlcik7Cn0KClZPSUQKRVhoYWxidGM4MTkyZTFhbnRfU3BlY2lhbFBhY2tldE5vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJdHlwZQoJKQp7CglCT09MRUFOCWJCdEhzT249RkFMU0U7CgoJaWYocEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgfHwKCQlwQnRDb2V4aXN0LT5iU3RvcENvZXhEbSB8fAoJCXBCdENvZXhpc3QtPmJ0SW5mby5iQnREaXNhYmxlZCApCgkJcmV0dXJuOwoKCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9CTF9IU19PUEVSQVRJT04sICZiQnRIc09uKTsKCWlmKHBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSkKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uQnRJbnF1aXJ5KHBCdENvZXhpc3QpOwoJCXJldHVybjsKCX0KCWVsc2UgaWYoYkJ0SHNPbikKCXsKCQloYWxidGM4MTkyZTFhbnRfQWN0aW9uSHMocEJ0Q29leGlzdCk7CgkJcmV0dXJuOwoJfQoKCWlmKCBCVENfUEFDS0VUX0RIQ1AgPT0gdHlwZSB8fAoJCUJUQ19QQUNLRVRfRUFQT0wgPT0gdHlwZSApCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgc3BlY2lhbCBQYWNrZXQoJWQpIG5vdGlmeVxuIiwgdHlwZSkpOwoJCWhhbGJ0YzgxOTJlMWFudF9BY3Rpb25XaWZpQ29ubmVjdGVkU3BlY2lhbFBhY2tldChwQnRDb2V4aXN0KTsKCX0KfQoKVk9JRApFWGhhbGJ0YzgxOTJlMWFudF9CdEluZm9Ob3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCXBCdENvZXhpc3QsCglJTglwdTFCeXRlCQkJdG1wQnVmLAoJSU4JdTFCeXRlCQkJbGVuZ3RoCgkpCnsKCVBCVENfQlRfTElOS19JTkZPCXBCdExpbmtJbmZvPSZwQnRDb2V4aXN0LT5idF9saW5rX2luZm87Cgl1MUJ5dGUJCQkJYnRJbmZvPTA7Cgl1MUJ5dGUJCQkJaSwgcnNwU291cmNlPTA7CglzdGF0aWMgdTRCeXRlCQlzZXRCdFBzZE1vZGU9MDsKCUJPT0xFQU4JCQkJYkJ0QnVzeT1GQUxTRSwgbGltaXRlZF9kaWc9RkFMU0U7CglCT09MRUFOCQkJCWJXaWZpQ29ubmVjdGVkPUZBTFNFOwoJQk9PTEVBTgkJCQliX2J0X2N0cmxfYWdnX2J1Zl9zaXplPUZBTFNFOwoKCXBDb2V4U3RhLT5iQzJoQnRJbmZvUmVxU2VudCA9IEZBTFNFOwoKCXJzcFNvdXJjZSA9IHRtcEJ1ZlswXSYweGY7CglpZihyc3BTb3VyY2UgPj0gQlRfSU5GT19TUkNfODE5MkVfMUFOVF9NQVgpCgkJcnNwU291cmNlID0gQlRfSU5GT19TUkNfODE5MkVfMUFOVF9XSUZJX0ZXOwoJcENvZXhTdGEtPmJ0SW5mb0MyaENudFtyc3BTb3VyY2VdKys7CgoJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCJbQlRDb2V4XSwgQnQgaW5mb1slZF0sIGxlbmd0aD0lZCwgaGV4IGRhdGE9WyIsIHJzcFNvdXJjZSwgbGVuZ3RoKSk7Cglmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQoJewoJCXBDb2V4U3RhLT5idEluZm9DMmhbcnNwU291cmNlXVtpXSA9IHRtcEJ1ZltpXTsKCQlpZihpID09IDEpCgkJCWJ0SW5mbyA9IHRtcEJ1ZltpXTsKCQlpZihpID09IGxlbmd0aC0xKQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCIweCUwMnhdXG4iLCB0bXBCdWZbaV0pKTsKCQl9CgkJZWxzZQoJCXsKCQkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX05PVElGWSwgKCIweCUwMngsICIsIHRtcEJ1ZltpXSkpOwoJCX0KCX0KCglpZihwQnRDb2V4aXN0LT5idEluZm8uYkJ0RGlzYWJsZWQpCgl7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgcmV0dXJuIGZvciBCVCBpcyBkaXNhYmxlZCA8PT09XG4iKSk7CgkJcmV0dXJuOwoJfQkKCglpZihwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCkKCXsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCByZXR1cm4gZm9yIE1hbnVhbCBDVFJMPD09PVxuIikpOwoJCXJldHVybjsKCX0KCWlmKHBCdENvZXhpc3QtPmJTdG9wQ29leERtKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIHJldHVybiBmb3IgQ29leCBTVE9QUEVEISE8PT09XG4iKSk7CgkJcmV0dXJuOwoJfQoKCWlmKEJUX0lORk9fU1JDXzgxOTJFXzFBTlRfV0lGSV9GVyAhPSByc3BTb3VyY2UpCgl7CgkJcENvZXhTdGEtPmJ0UmV0cnlDbnQgPQkvLyBbMzowXQoJCQlwQ29leFN0YS0+YnRJbmZvQzJoW3JzcFNvdXJjZV1bMl0mMHhmOwoKCQlwQ29leFN0YS0+YnRSc3NpID0KCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdWzNdKjIrMTA7CgoJCXBDb2V4U3RhLT5idEluZm9FeHQgPSAKCQkJcENvZXhTdGEtPmJ0SW5mb0MyaFtyc3BTb3VyY2VdWzRdOwoKCQkvLyBIZXJlIHdlIG5lZWQgdG8gcmVzZW5kIHNvbWUgd2lmaSBpbmZvIHRvIEJUCgkJLy8gYmVjYXVzZSBidCBpcyByZXNldCBhbmQgbG9zcyBvZiB0aGUgaW5mby4KCQlpZiggKHBDb2V4U3RhLT5idEluZm9FeHQgJiBCSVQxKSApCgkJewkJCQoJCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJUIGV4dCBpbmZvIGJpdDEgY2hlY2ssIHNlbmQgd2lmaSBCVyZDaG5sIHRvIEJUISFcbiIpKTsKCQkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX0JMX1dJRklfQ09OTkVDVEVELCAmYldpZmlDb25uZWN0ZWQpOwoJCQlpZihiV2lmaUNvbm5lY3RlZCkKCQkJewoJCQkJRVhoYWxidGM4MTkyZTFhbnRfTWVkaWFTdGF0dXNOb3RpZnkocEJ0Q29leGlzdCwgQlRDX01FRElBX0NPTk5FQ1QpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJRVhoYWxidGM4MTkyZTFhbnRfTWVkaWFTdGF0dXNOb3RpZnkocEJ0Q29leGlzdCwgQlRDX01FRElBX0RJU0NPTk5FQ1QpOwoJCQl9CgoJCQlzZXRCdFBzZE1vZGUgPSAwOwoJCX0KCgkJLy8gdGVzdC1jaGlwIGJ0IHBhdGNoIG9ubHkgcnNwIHRoZSBzdGF0dXMgZm9yIEJUX1JTUCwgCgkJLy8gc28gdGVtcG9yYXJ5IHdlIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgb25seSB1bmRlciBCVF9SU1AKCQlpZihCVF9JTkZPX1NSQ184MTkyRV8xQU5UX0JUX1JTUCA9PSByc3BTb3VyY2UpCgkJewoJCQlpZiggKHBDb2V4U3RhLT5idEluZm9FeHQgJiBCSVQzKSApCgkJCXsKCQkJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQlQgZXh0IGluZm8gYml0MyBjaGVjaywgc2V0IEJUIE5PVCB0byBpZ25vcmUgV2xhbiBhY3RpdmUhIVxuIikpOwoJCQkJaGFsYnRjODE5MmUxYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgRkFMU0UpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJLy8gQlQgYWxyZWFkeSBOT1QgaWdub3JlIFdsYW4gYWN0aXZlLCBkbyBub3RoaW5nIGhlcmUuCgkJCX0KI2lmKEJUX0FVVE9fUkVQT1JUX09OTFlfODE5MkVfMUFOVCA9PSAwKQoJCQlpZiggKHBDb2V4U3RhLT5idEluZm9FeHQgJiBCSVQ0KSApCgkJCXsKCQkJCS8vIEJUIGF1dG8gcmVwb3J0IGFscmVhZHkgZW5hYmxlZCwgZG8gbm90aGluZwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCVCBleHQgaW5mbyBiaXQ0IGNoZWNrLCBzZXQgQlQgdG8gZW5hYmxlIEF1dG8gUmVwb3J0ISFcbiIpKTsKCQkJCWhhbGJ0YzgxOTJlMWFudF9CdEF1dG9SZXBvcnQocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgdHJ1ZSk7CgkJCX0KI2VuZGlmCgkJfQoJfQoJCQoJLy8gY2hlY2sgQklUMiBmaXJzdCA9PT4gY2hlY2sgaWYgYnQgaXMgdW5kZXIgaW5xdWlyeSBvciBwYWdlIHNjYW4KCWlmKGJ0SW5mbyAmIEJUX0lORk9fODE5MkVfMUFOVF9CX0lOUV9QQUdFKQoJCXBDb2V4U3RhLT5iQzJoQnRJbnF1aXJ5UGFnZSA9IHRydWU7CgllbHNlCgkJcENvZXhTdGEtPmJDMmhCdElucXVpcnlQYWdlID0gRkFMU0U7CgoJLy8gc2V0IGxpbmsgZXhpc3Qgc3RhdHVzCglpZighKGJ0SW5mbyZCVF9JTkZPXzgxOTJFXzFBTlRfQl9DT05ORUNUSU9OKSkKCXsKCQlwQ29leFN0YS0+YkJ0TGlua0V4aXN0ID0gRkFMU0U7CgkJcENvZXhTdGEtPmJQYW5FeGlzdCA9IEZBTFNFOwoJCXBDb2V4U3RhLT5iQTJkcEV4aXN0ID0gRkFMU0U7CgkJcENvZXhTdGEtPmJIaWRFeGlzdCA9IEZBTFNFOwoJCXBDb2V4U3RhLT5iU2NvRXhpc3QgPSBGQUxTRTsKCX0KCWVsc2UgLy8gY29ubmVjdGlvbiBleGlzdHMgCgl7CgkJcENvZXhTdGEtPmJCdExpbmtFeGlzdCA9IHRydWU7CgkJaWYoYnRJbmZvICYgQlRfSU5GT184MTkyRV8xQU5UX0JfRlRQKQoJCQlwQ29leFN0YS0+YlBhbkV4aXN0ID0gdHJ1ZTsKCQllbHNlCgkJCXBDb2V4U3RhLT5iUGFuRXhpc3QgPSBGQUxTRTsKCQlpZihidEluZm8gJiBCVF9JTkZPXzgxOTJFXzFBTlRfQl9BMkRQKQoJCQlwQ29leFN0YS0+YkEyZHBFeGlzdCA9IHRydWU7CgkJZWxzZQoJCQlwQ29leFN0YS0+YkEyZHBFeGlzdCA9IEZBTFNFOwoJCWlmKGJ0SW5mbyAmIEJUX0lORk9fODE5MkVfMUFOVF9CX0hJRCkKCQkJcENvZXhTdGEtPmJIaWRFeGlzdCA9IHRydWU7CgkJZWxzZQoJCQlwQ29leFN0YS0+YkhpZEV4aXN0ID0gRkFMU0U7CgkJaWYoYnRJbmZvICYgQlRfSU5GT184MTkyRV8xQU5UX0JfU0NPX0VTQ08pCgkJCXBDb2V4U3RhLT5iU2NvRXhpc3QgPSB0cnVlOwoJCWVsc2UKCQkJcENvZXhTdGEtPmJTY29FeGlzdCA9IEZBTFNFOwoJfQoKCWhhbGJ0YzgxOTJlMWFudF9VcGRhdGVCdExpbmtJbmZvKHBCdENvZXhpc3QpOwoKCWlmKCEoYnRJbmZvJkJUX0lORk9fODE5MkVfMUFOVF9CX0NPTk5FQ1RJT04pKQoJewoJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfTk9OX0NPTk5FQ1RFRF9JRExFOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIGJ0IG5vbi1jb25uZWN0ZWQgaWRsZSEhIVxuIikpOwoJfQoJZWxzZSBpZihidEluZm8gPT0gQlRfSU5GT184MTkyRV8xQU5UX0JfQ09OTkVDVElPTikJLy8gY29ubmVjdGlvbiBleGlzdHMgYnV0IG5vIGJ1c3kKCXsKCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIGJ0IGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7Cgl9CQkKCWVsc2UgaWYoKGJ0SW5mbyZCVF9JTkZPXzgxOTJFXzFBTlRfQl9TQ09fRVNDTykgfHwKCQkoYnRJbmZvJkJUX0lORk9fODE5MkVfMUFOVF9CX1NDT19CVVNZKSkKCXsKCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX1NDT19CVVNZOwoJCUJUQ19QUklOVChCVENfTVNHX0FMR09SSVRITSwgQUxHT19UUkFDRSwgKCJbQlRDb2V4XSwgQnRJbmZvTm90aWZ5KCksIGJ0IHNjbyBidXN5ISEhXG4iKSk7Cgl9CgllbHNlIGlmKCAoYnRJbmZvJkJUX0lORk9fODE5MkVfMUFOVF9CX0FDTF9CVVNZKSB8fAoJCQkoYnRJbmZvJkJUX0lORk9fODE5MkVfMUFOVF9CX0EyRFApIHx8CgkJCShidEluZm8mQlRfSU5GT184MTkyRV8xQU5UX0JfRlRQKSApCgl7CgkJaWYoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1kgIT0gcENvZXhEbS0+YnRTdGF0dXMpCgkJCXBDb2V4RG0tPmJBdXRvVGRtYUFkanVzdCA9IEZBTFNFOwoJCXBDb2V4RG0tPmJ0U3RhdHVzID0gQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfQUNMX0JVU1k7CgkJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCBCdEluZm9Ob3RpZnkoKSwgYnQgYWNsIGJ1c3khISFcbiIpKTsKCX0KCWVsc2UKCXsKCQlwQ29leERtLT5idFN0YXR1cyA9IEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX01BWDsKCQlCVENfUFJJTlQoQlRDX01TR19BTEdPUklUSE0sIEFMR09fVFJBQ0UsICgiW0JUQ29leF0sIEJ0SW5mb05vdGlmeSgpLCBidCBub24tZGVmaW5lZCBzdGF0ZSEhIVxuIikpOwoJfQoKCS8vIHJhIG1hc2sgY2hlY2sKCWlmKHBCdExpbmtJbmZvLT5iU2NvRXhpc3QgfHwgcEJ0TGlua0luZm8tPmJIaWRFeGlzdCkKCXsKCQloYWxidGM4MTkyZTFhbnRfVXBkYXRlcmFfbWFzayhwQnRDb2V4aXN0LCBOT1JNQUxfRVhFQywgQlRDX1JBVEVfRElTQUJMRSwgMHgwMDAwMDAwMyk7CS8vIGRpc2FibGUgdHggY2NrIDFNLzJNCgl9CgllbHNlCgl7CgkJaGFsYnRjODE5MmUxYW50X1VwZGF0ZXJhX21hc2socEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEJUQ19SQVRFX0VOQUJMRSwgMHgwMDAwMDAwMyk7CS8vIGVuYWJsZSB0eCBjY2sgMU0vMk0KCX0KCQoJaWYoIChCVF84MTkyRV8xQU5UX0JUX1NUQVRVU19BQ0xfQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cykgfHwKCQkoQlRfODE5MkVfMUFOVF9CVF9TVEFUVVNfU0NPX0JVU1kgPT0gcENvZXhEbS0+YnRTdGF0dXMpIHx8CgkJKEJUXzgxOTJFXzFBTlRfQlRfU1RBVFVTX0FDTF9TQ09fQlVTWSA9PSBwQ29leERtLT5idFN0YXR1cykgKQoJewoJCWJCdEJ1c3kgPSB0cnVlOwoJCWxpbWl0ZWRfZGlnID0gdHJ1ZTsKCQlpZihwQnRMaW5rSW5mby0+YkhpZEV4aXN0KQoJCQliX2J0X2N0cmxfYWdnX2J1Zl9zaXplID0gdHJ1ZTsKCX0KCWVsc2UKCXsKCQliQnRCdXN5ID0gRkFMU0U7CgkJbGltaXRlZF9kaWcgPSBGQUxTRTsKCX0KCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9UUkFGRklDX0JVU1ksICZiQnRCdXN5KTsKCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgkvLwlBZ2dyZWdhdGlvbiByZWxhdGVkIHNldHRpbmcKCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCS8vIGlmIHNjbywgcmVqZWN0IEFkZEJBCgkvL3BCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9UT19SRUpfQVBfQUdHX1BLVCwgJmJSZWpBcEFnZ1BrdCk7CgoJLy8gZGVjaWRlIEJUIGNvbnRyb2wgYWdncmVnYXRpb24gYnVmIHNpemUgb3Igbm90CglwQnRDb2V4aXN0LT5idGNfc2V0KHBCdENvZXhpc3QsIEJUQ19TRVRfQkxfQlRfQ1RSTF9BR0dfU0laRSwgJmJfYnRfY3RybF9hZ2dfYnVmX3NpemUpOwoJLy8gcmVhbCB1cGRhdGUgYWdncmVnYXRpb24gc2V0dGluZwoJcEJ0Q29leGlzdC0+YnRjX3NldChwQnRDb2V4aXN0LCBCVENfU0VUX0FDVF9BR0dSRUdBVEVfQ1RSTCwgTlVMTCk7CgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoJcENvZXhEbS0+bGltaXRlZF9kaWcgPSBsaW1pdGVkX2RpZzsKCXBCdENvZXhpc3QtPmJ0Y19zZXQocEJ0Q29leGlzdCwgQlRDX1NFVF9CTF9CVF9MSU1JVEVEX0RJRywgJmxpbWl0ZWRfZGlnKTsKCgloYWxidGM4MTkyZTFhbnRfUnVuQ29leGlzdE1lY2hhbmlzbShwQnRDb2V4aXN0KTsKfQoKVk9JRApFWGhhbGJ0YzgxOTJlMWFudF9TdGFja09wZXJhdGlvbk5vdGlmeSgKCUlOCVBCVENfQ09FWElTVAkJCXBCdENvZXhpc3QsCglJTgl1MUJ5dGUJCQkJdHlwZQoJKQp7CglpZihCVENfU1RBQ0tfT1BfSU5RX1BBR0VfUEFJUl9TVEFSVCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFN0YWNrT1AgSW5xdWlyeS9wYWdlL3BhaXIgc3RhcnQgbm90aWZ5XG4iKSk7Cgl9CgllbHNlIGlmKEJUQ19TVEFDS19PUF9JTlFfUEFHRV9QQUlSX0ZJTklTSCA9PSB0eXBlKQoJewoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFN0YWNrT1AgSW5xdWlyeS9wYWdlL3BhaXIgZmluaXNoIG5vdGlmeVxuIikpOwoJfQp9CgpWT0lECkVYaGFsYnRjODE5MmUxYW50X0hhbHROb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0CgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIEhhbHQgbm90aWZ5XG4iKSk7CgoJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0gPSB0cnVlOwoJaGFsYnRjODE5MmUxYW50X0lnbm9yZVdsYW5BY3QocEJ0Q29leGlzdCwgRk9SQ0VfRVhFQywgdHJ1ZSk7CgoJaGFsYnRjODE5MmUxYW50X1Bvd2VyU2F2ZVN0YXRlKHBCdENvZXhpc3QsIEJUQ19QU19XSUZJX05BVElWRSwgMHgwLCAweDApOwoJCgloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIEZBTFNFLCAwKTsKCXBCdENvZXhpc3QtPmJ0Y193cml0ZV8xYnl0ZShwQnRDb2V4aXN0LCAweDRmLCAweGYpOwoKCUVYaGFsYnRjODE5MmUxYW50X01lZGlhU3RhdHVzTm90aWZ5KHBCdENvZXhpc3QsIEJUQ19NRURJQV9ESVNDT05ORUNUKTsKfQoKVk9JRApFWGhhbGJ0YzgxOTJlMWFudF9QbnBOb3RpZnkoCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCXBucFN0YXRlCgkpCnsKCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9OT1RJRlksICgiW0JUQ29leF0sIFBucCBub3RpZnlcbiIpKTsKCglpZihCVENfV0lGSV9QTlBfU0xFRVAgPT0gcG5wU3RhdGUpCgl7CgkJcEJ0Q29leGlzdC0+YlN0b3BDb2V4RG0gPSB0cnVlOwoJCWhhbGJ0YzgxOTJlMWFudF9JZ25vcmVXbGFuQWN0KHBCdENvZXhpc3QsIEZPUkNFX0VYRUMsIHRydWUpOwoJCWhhbGJ0YzgxOTJlMWFudF9Qb3dlclNhdmVTdGF0ZShwQnRDb2V4aXN0LCBCVENfUFNfV0lGSV9OQVRJVkUsIDB4MCwgMHgwKTsKCQloYWxidGM4MTkyZTFhbnRfUHNUZG1hKHBCdENvZXhpc3QsIE5PUk1BTF9FWEVDLCBGQUxTRSwgOSk7CQoJfQoJZWxzZSBpZihCVENfV0lGSV9QTlBfV0FLRV9VUCA9PSBwbnBTdGF0ZSkKCXsKCQkKCX0KfQoKVk9JRApFWGhhbGJ0YzgxOTJlMWFudF9QZXJpb2RpY2FsKAoJSU4JUEJUQ19DT0VYSVNUCQkJcEJ0Q29leGlzdAoJKQp7CglzdGF0aWMgdTFCeXRlCQlkaXNWZXJJbmZvQ250PTA7Cgl1NEJ5dGUJCQkJZndWZXI9MCwgYnRQYXRjaFZlcj0wOwoJc3RydWN0IGJ0Y19ib2FyZF9pbmZvICoJCXBCb2FyZEluZm89JnBCdENvZXhpc3QtPmJvYXJkX2luZm87CglQQlRDX1NUQUNLX0lORk8JCXBTdGFja0luZm89JnBCdENvZXhpc3QtPnN0YWNrX2luZm87CgoJQlRDX1BSSU5UKEJUQ19NU0dfQUxHT1JJVEhNLCBBTEdPX1RSQUNFLCAoIltCVENvZXhdLCA9PT09PT09PT09PT09PT09PT09PT09PT09PVBlcmlvZGljYWw9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpKTsKCglpZihkaXNWZXJJbmZvQ250IDw9IDUpCgl7CgkJZGlzVmVySW5mb0NudCArPSAxOwoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKSk7CgkJQlRDX1BSSU5UKEJUQ19NU0dfSU5URVJGQUNFLCBJTlRGX0lOSVQsICgiW0JUQ29leF0sIEFudCBQRyBOdW0vIEFudCBNZWNoLyBBbnQgUG9zID0gJWQvICVkLyAlZFxuIiwgXAoJCQlwQm9hcmRJbmZvLT5wZ19hbnRfbnVtLCBwQm9hcmRJbmZvLT5idGRtX2FudF9udW0sIHBCb2FyZEluZm8tPmJ0ZG1fYW50X3BvcykpOwoJCUJUQ19QUklOVChCVENfTVNHX0lOVEVSRkFDRSwgSU5URl9JTklULCAoIltCVENvZXhdLCBCVCBzdGFjay8gaGNpIGV4dCB2ZXIgPSAlcyAvICVkXG4iLCBcCgkJCSgocFN0YWNrSW5mby0+YlByb2ZpbGVOb3RpZmllZCk/ICJZZXMiOiJObyIpLCBwU3RhY2tJbmZvLT5oY2lWZXJzaW9uKSk7CgkJcEJ0Q29leGlzdC0+YnRjX2dldChwQnRDb2V4aXN0LCBCVENfR0VUX1U0X0JUX1BBVENIX1ZFUiwgJmJ0UGF0Y2hWZXIpOwoJCXBCdENvZXhpc3QtPmJ0Y19nZXQocEJ0Q29leGlzdCwgQlRDX0dFVF9VNF9XSUZJX0ZXX1ZFUiwgJmZ3VmVyKTsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgQ29leFZlci8gRndWZXIvIFBhdGNoVmVyID0gJWRfJXgvIDB4JXgvIDB4JXgoJWQpXG4iLCBcCgkJCUdMQ29leFZlckRhdGU4MTkyZTFBbnQsIEdMQ29leFZlcjgxOTJlMUFudCwgZndWZXIsIGJ0UGF0Y2hWZXIsIGJ0UGF0Y2hWZXIpKTsKCQlCVENfUFJJTlQoQlRDX01TR19JTlRFUkZBQ0UsIElOVEZfSU5JVCwgKCJbQlRDb2V4XSwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwoJfQojaWYoQlRfQVVUT19SRVBPUlRfT05MWV84MTkyRV8xQU5UID09IDApCgloYWxidGM4MTkyZTFhbnRfUXVlcnlCdEluZm8ocEJ0Q29leGlzdCk7CgloYWxidGM4MTkyZTFhbnRfTW9uaXRvckJ0Q3RyKHBCdENvZXhpc3QpOwoJaGFsYnRjODE5MmUxYW50X01vbml0b3JCdEVuYWJsZURpc2FibGUocEJ0Q29leGlzdCk7CiNlbHNlCglpZiggaGFsYnRjODE5MmUxYW50X0lzV2lmaVN0YXR1c0NoYW5nZWQocEJ0Q29leGlzdCkgfHwKCQlwQ29leERtLT5iQXV0b1RkbWFBZGp1c3QpCgl7CgkJaGFsYnRjODE5MmUxYW50X1J1bkNvZXhpc3RNZWNoYW5pc20ocEJ0Q29leGlzdCk7Cgl9CiNlbmRpZgp9CgpWT0lECkVYaGFsYnRjODE5MmUxYW50X0RiZ0NvbnRyb2woCglJTglQQlRDX0NPRVhJU1QJCQlwQnRDb2V4aXN0LAoJSU4JdTFCeXRlCQkJCW9wQ29kZSwKCUlOCXUxQnl0ZQkJCQlvcExlbiwKCUlOCXB1MUJ5dGUJCQkJcERhdGEKCSkKewoJc3dpdGNoKG9wQ29kZSkKCXsKCQljYXNlIEJUQ19EQkdfU0VUX0NPRVhfTk9STUFMOgoJCQlwQnRDb2V4aXN0LT5tYW51YWxfY29udHJvbCA9IEZBTFNFOwoJCQloYWxidGM4MTkyZTFhbnRfSW5pdENvZXhEbShwQnRDb2V4aXN0KTsKCQkJYnJlYWs7CgkJY2FzZSBCVENfREJHX1NFVF9DT0VYX1dJRklfT05MWToKCQkJcEJ0Q29leGlzdC0+bWFudWFsX2NvbnRyb2wgPSB0cnVlOwoJCQloYWxidGM4MTkyZTFhbnRfUG93ZXJTYXZlU3RhdGUocEJ0Q29leGlzdCwgQlRDX1BTX1dJRklfTkFUSVZFLCAweDAsIDB4MCk7CgkJCWhhbGJ0YzgxOTJlMWFudF9Qc1RkbWEocEJ0Q29leGlzdCwgTk9STUFMX0VYRUMsIEZBTFNFLCA5KTsJCgkJCWJyZWFrOwoJCWNhc2UgQlRDX0RCR19TRVRfQ09FWF9CVF9PTkxZOgoJCQkvLyB0b2RvCgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJfQp9CiNlbmRpZgoK