LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqCioqICAgICAgIFZvbiBTdGF0ZW1lbnRMaXN0IHdlcmRlbiBhbGxlIFN0YXRlbWVudHMgYWJnZWxlaXRldC4KKiogICBFcyBnaWJ0IGltbWVyIG51ciBlaW5lIFN0YXRlbWVudGxpc3RlLCBkaWUgdmVycG9pbnRlcnQgaXN0LgoqKiAgICAgICBqZWRlcnplaXQga2FubiBkYXMgZGVyIEFuZmFuZyBkZXIgS2V0dGUgYWJnZWZyYWd0IHdlcmRlbi4KKioKKioKKioKKioKKioKKioKKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWZuZGVmIF9TVEFURU1OVF9IWFgKI2RlZmluZSBfU1RBVEVNTlRfSFhYCgojaW5jbHVkZSA8dG9vbHMvd2ludHlwZXMuaHh4PgojaW5jbHVkZSA8dG9vbHMvc3RyaW5nLmh4eD4KI2luY2x1ZGUgPHRvb2xzL2RlYnVnLmh4eD4KI2luY2x1ZGUgPHRvb2xzL3RpbWUuaHh4PgojaWZuZGVmIF9TVl9EUkFHX0hYWCAvL2F1dG9nZW4KLy8jaW5jbHVkZSA8dmNsL2RyYWcuaHh4PgojZW5kaWYKI2luY2x1ZGUgPHZjbC9tZW51Lmh4eD4KI2luY2x1ZGUgPHZjbC9zdmFwcC5oeHg+CiNpbmNsdWRlIDx0b29scy9mc3lzLmh4eD4KI2luY2x1ZGUgPHNvdC9zdG9yYWdlLmh4eD4KI2luY2x1ZGUgPGJhc2ljL3Nic3Rhci5oeHg+CiNpbmNsdWRlIDx2Y2wvZXZlbnQuaHh4PgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL2JlYW5zL1Byb3BlcnR5VmFsdWUuaHBwPgojaW5jbHVkZSA8YXV0b21hdGlvbi9jb21tdHlwZXMuaHh4PgoKY2xhc3MgV2luZG93OwpjbGFzcyBTeXN0ZW1XaW5kb3c7CmNsYXNzIFBvaW50OwpjbGFzcyBTZnhQb29sSXRlbTsKCmNsYXNzIFNjcm9sbEJhcjsKCmNsYXNzIFNDbWRTdHJlYW07CmNsYXNzIFJldFN0cmVhbTsKY2xhc3MgSW1wbFJlbW90ZUNvbnRyb2w7CgpjbGFzcyBUVFByb2ZpbGVyOwpjbGFzcyBUVFByb3BlcnRpZXM7CgpjbGFzcyBEaXI7CgpjbGFzcyBDb21tdW5pY2F0aW9uTGluazsKCiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCmNsYXNzIEVkaXRXaW5kb3c7CiNlbmRpZgoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIKewojZW5kaWYKICAgIHZvaWQgU0FMX0NBTEwgb3NsX1Rlc3RUb29sRGVidWdQcmludCggY29uc3Qgc2FsX0NoYXIgKnBTdHJpbmcgKTsKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgoKI2RlZmluZSBJc1Zpc2libGUgSXNSZWFsbHlWaXNpYmxlCiNkZWZpbmUgR0VUX1JFQUxfUEFSRU5UKCkgR2V0V2luZG93KCBXSU5ET1dfUkVBTFBBUkVOVCApCgovLyBzd2l0Y2ggYmVoYXZpb3VyIG9mIEltcGxNb3VzZSogYW5kIEltcGxLZXlJbnB1dAojZGVmaW5lIEZPUkNFX0RJUkVDVF9DQUxMICAgc2FsX1RydWUKCnR5cGVkZWYgc2FsX3VJbnQxNiBTZWFyY2hGbGFnczsKI2RlZmluZSBTRUFSQ0hfTk9PVkVSTEFQCQkJKChTZWFyY2hGbGFncykgMHgwMDAxKQojZGVmaW5lIFNFQVJDSF9OT19UT1BMRVZFTF9XSU4JCSgoU2VhcmNoRmxhZ3MpIDB4MDAwMikKI2RlZmluZSBTRUFSQ0hfRk9DVVNfRklSU1QgICAgICAJKChTZWFyY2hGbGFncykgMHgwMDA0KQojZGVmaW5lIFNFQVJDSF9GSU5EX0RJU0FCTEVEICAgICAgCSgoU2VhcmNoRmxhZ3MpIDB4MDAwOCkKCmNsYXNzIFNlYXJjaAp7CglTZWFyY2hGbGFncyBubVNlYXJjaEZsYWdzOwpwdWJsaWM6CglTZWFyY2goIFNlYXJjaEZsYWdzIG5TZWFyY2hGbGFncyA9IDApOiBubVNlYXJjaEZsYWdzKG5TZWFyY2hGbGFncykge30KCXZpcnR1YWwgflNlYXJjaCgpIHt9CgoJdmlydHVhbCBzYWxfQm9vbCBJc1dpbk9LKCBXaW5kb3cgKnBXaW4gKSA9IDA7CglTZWFyY2hGbGFncyBHZXRTZWFyY2hGbGFncygpIHsgcmV0dXJuIG5tU2VhcmNoRmxhZ3M7IH0KICAgIHZvaWQgQWRkU2VhcmNoRmxhZ3MoIFNlYXJjaEZsYWdzIGFOZXdGbGFncyApIHsgbm1TZWFyY2hGbGFncyB8PSBhTmV3RmxhZ3M7IH0KCXZvaWQgUmVtb3ZlU2VhcmNoRmxhZ3MoIFNlYXJjaEZsYWdzIGFSZW1vdmVGbGFncyApIHsgbm1TZWFyY2hGbGFncyAmPSAoIH5hUmVtb3ZlRmxhZ3MgKTsgfQoJc2FsX0Jvb2wgSGFzU2VhcmNoRmxhZyggU2VhcmNoRmxhZ3MgYVF1ZXJ5RmxhZyApIHsgcmV0dXJuIChubVNlYXJjaEZsYWdzICYgYVF1ZXJ5RmxhZykgPT0gYVF1ZXJ5RmxhZzsgfQp9OwoKc2FsX0Jvb2wgSXNEaWFsb2coV2luZG93ICpwV2luKTsJCS8vIElzdCAqcFdpbiB2b24gU3lzdGVtV2luZG93IGFiZ2VsZWl0ZXQgKEthbm4gZXMgQWN0aXZlIHNlaW4pCnNhbF9Cb29sIElzQWNjZXNzYWJsZShXaW5kb3cgKnBXaW4pOwkvLyBJc3QgKnBXaW4gWnVncmVpZmJhciAo/GJlciBJc0VuYWJsZWQgdW5kIFBhcmVudHMgZ2VwcvxmdCkKCgovL2NsYXNzIFNhZmVQb2ludGVyIDogQ3JpdGljYWxTZWN0aW9uCmNsYXNzIFNhZmVQb2ludGVyCnsKCVNhZmVQb2ludGVyICpwU2VsZjsKcHVibGljOgoJU2FmZVBvaW50ZXIoKSAgIHsgcFNlbGYgPSB0aGlzOyB9Cgl2aXJ0dWFsIH5TYWZlUG9pbnRlcigpICB7IERCR19BU1NFUlQocFNlbGY9PXRoaXMsIkRlc3RydWN0b3Igdm9uIE5pY2h0IGV4aXN0aWVyZW5kZW0gT2JqZWt0IGF1ZmdlcnVmZW4iKTsKCQkJCQkJCSAgcFNlbGYgPSBOVUxMOyB9Ci8vCXN0YXRpYyBzYWxfQm9vbCBJc1ZhbGlkKCBTYWZlUG9pbnRlciAqcFRoaXMgKSB7IHJldHVybiBwVGhpcyA9PSBwVGhpcy0+cFNlbGY7IH0KLy8gdmlydHVhbCAgICAgIG9wZXJhdG9yIC0+ICgpOyB7IERCR19BU1NFUlQocE15c2VsZiA9PSB0aGlzLCItPiB2b24gTmljaHQgZXhpc3RpZXJlbmRlbSBPYmpla3QgYXVmZ2VydWZlbiIpOyB9Cn07CgoKY2xhc3MgRGlzcGxheUhpZFdpbjsKY2xhc3MgU3RhdGVtZW50Q29tbWFuZDsKY2xhc3MgVHJhbnNsYXRlV2luOwoKc3RydWN0IFRUU2V0dGluZ3MKewogICAgLy8gRGlzcGxheUhJRAogICAJU3RhdGVtZW50Q29tbWFuZCAqcERpc3BsYXlJbnN0YW5jZTsKCURpc3BsYXlIaWRXaW4gKnBEaXNwbGF5SGlkV2luOwoJV2luZG93ICpPbGQ7CiAgICBXaW5kb3cgKkFjdDsKCVN0cmluZyBhT3JpZ2luYWxDYXB0aW9uOwoKICAgIC8vIFRyYW5zbGF0ZQoJVHJhbnNsYXRlV2luICpwVHJhbnNsYXRlV2luOwoJc2FsX0Jvb2wgYlRvVG9wOwp9OwoKClRUU2V0dGluZ3MqIEdldFRUU2V0dGluZ3MoKTsKCgojZGVmaW5lIE1BWF9SRVRSSUVTIDkKY2xhc3MgU3RhdGVtZW50TGlzdCA6IHB1YmxpYyBTYWZlUG9pbnRlcgp7CnByaXZhdGU6CiAgICBTdGF0ZW1lbnRMaXN0KGNvbnN0IFN0YXRlbWVudExpc3QmKTsKICAgIFN0YXRlbWVudExpc3QgJiBvcGVyYXRvcj0oY29uc3QgU3RhdGVtZW50TGlzdCYpOwoKcHJvdGVjdGVkOgoJU3RhdGVtZW50TGlzdCgpOwoJc2FsX3VJbnQxNiBuUmV0cnlDb3VudDsKCXZvaWQgUXVlU3RhdGVtZW50KFN0YXRlbWVudExpc3QgKnBBZnRlclRoaXMpOwoJc2FsX0Jvb2wgYlN0YXRlbWVudEluUXVlOwoJc3RhdGljIHNhbF91SW50MTYgblVzZUJpbmRpbmdzOwoKCXN0YXRpYyBUVFByb2ZpbGVyICpwUHJvZmlsZXI7Cgl2b2lkIEluaXRQcm9maWxlKCk7Cgl2b2lkIFNlbmRQcm9maWxlKCBTdHJpbmcgYVRleHQgKTsKCXN0YXRpYyBTdGF0ZW1lbnRMaXN0ICpwQ3VycmVudFByb2ZpbGVTdGF0ZW1lbnQ7CgoJc3RhdGljIHNhbF9Cb29sIGJJc0luUmVzY2hlZHVsZTsKICAgICAgICBzdGF0aWMgc2FsX3VJbnQxNiBuTW9kYWxDb3VudDsKCXN0YXRpYyBXaW5kb3cgKnBMYXN0Rm9jdXNXaW5kb3c7CQkvLyBXZW5uIGRpZXNlcyBzaWNoIORuZGVydCB3aXJkIFNhZmUgUmVzY2hlZHVsZSBhYmdlYnJvY2hlbgoJc3RhdGljIHNhbF9Cb29sIGJXYXNEcmFnTWFuYWdlcjsJCQkvLyBXZW5uIGRpZXNlcyBzaWNoIORuZGVydCB3aXJkIFNhZmUgUmVzY2hlZHVsZSBhYmdlYnJvY2hlbgoJc3RhdGljIHNhbF9Cb29sIGJXYXNQb3B1cE1lbnU7CQkJCS8vIFdlbm4gZGllc2VzIHNpY2gg5G5kZXJ0IHdpcmQgU2FmZSBSZXNjaGVkdWxlIGFiZ2Vicm9jaGVuCiAgIAlzdGF0aWMgc2FsX0Jvb2wgYkJhc2ljV2FzUnVubmluZzsKCglzdGF0aWMgc2FsX3VJbnQxNiBuTWluVHlwZUtleXNEZWxheTsJCQkJLy8vIFZlcnr2Z2VydW5nIGRlciBlaW56ZWxuZW4gQW5zY2hs5GdlIGb8ciBUeXBlS2V5cwoJc3RhdGljIHNhbF91SW50MTYgbk1heFR5cGVLZXlzRGVsYXk7CglzdGF0aWMgc2FsX0Jvb2wgYkRvVHlwZUtleXNEZWxheTsKCglzdGF0aWMgV2luZG93KiBwRmlyc3REb2NGcmFtZTsKCiAgICBzdGF0aWMgc2FsX0Jvb2wgYklzU2xvdEluRXhlY3V0ZTsKCnB1YmxpYzoKCXN0YXRpYyBzYWxfQm9vbCBJc0luUmVzY2hlZHVsZSgpIHsgcmV0dXJuIGJJc0luUmVzY2hlZHVsZTsgfQoJdm9pZCBTYWZlUmVzY2hlZHVsZSggc2FsX0Jvb2wgYllpZWxkID0gc2FsX0ZhbHNlICkJLy8gU2V0enQgRmxhZywgc28gZGHfIG5pY2h0IHNjaG9uIGRlciBu5GNoc3RlIEJlZmVobCBhdXNnZWb8aHJ0IHdpcmQKCXsKCQluTW9kYWxDb3VudCA9IEFwcGxpY2F0aW9uOjpHZXRNb2RhbE1vZGVDb3VudCgpOwoJCWJJc0luUmVzY2hlZHVsZSA9IHNhbF9UcnVlOwoJCXBMYXN0Rm9jdXNXaW5kb3cgPSBHZXRwQXBwKCktPkdldEZvY3VzV2luZG93KCk7CgkJYldhc0RyYWdNYW5hZ2VyID0gZmFsc2UgLyohPSBEcmFnTWFuYWdlcjo6R2V0RHJhZ01hbmFnZXIoKSovOwoJCWJXYXNQb3B1cE1lbnUgPSBOVUxMICE9IFBvcHVwTWVudTo6R2V0QWN0aXZlUG9wdXBNZW51KCk7CiAgICAgICAgYkJhc2ljV2FzUnVubmluZyA9IFN0YXJCQVNJQzo6SXNSdW5uaW5nKCk7CgkJYldhc0V4ZWN1dGluZyA9IGJFeGVjdXRpbmc7CgkJaWYgKCBiWWllbGQgKQoJCQlHZXRwQXBwKCktPllpZWxkKCk7CgkJZWxzZQoJCQlHZXRwQXBwKCktPlJlc2NoZWR1bGUoKTsKCQliRXhlY3V0aW5nID0gYldhc0V4ZWN1dGluZzsKICAgICAgICBiQmFzaWNXYXNSdW5uaW5nID0gc2FsX0ZhbHNlOwoJCWJXYXNQb3B1cE1lbnUgPSBzYWxfRmFsc2U7CgkJYldhc0RyYWdNYW5hZ2VyID0gc2FsX0ZhbHNlOwoJCXBMYXN0Rm9jdXNXaW5kb3cgPSBOVUxMOwoJCWJJc0luUmVzY2hlZHVsZSA9IHNhbF9GYWxzZTsKCQluTW9kYWxDb3VudCA9IDA7Cgl9CglzdGF0aWMgc2FsX0Jvb2wgTWF5YmVSZXNldFNhZmVSZXNjaGVkdWxlKCkKCXsJCS8vIEltcGxlbWVudGllcnVuZyBtdd8gaGllciB6d2FyIG5pY2h0IHNlaW4sIGlzdCBhYmVyIPxiZXJzaWNodGxpY2hlciBzbwoJCWlmICggIWJJc0luUmVzY2hlZHVsZSApCgkJCXJldHVybiBzYWxfRmFsc2U7CgoJCWlmICggcExhc3RGb2N1c1dpbmRvdyAhPSBHZXRwQXBwKCktPkdldEZvY3VzV2luZG93KCkKCQkJfHwgKCBBcHBsaWNhdGlvbjo6R2V0TW9kYWxNb2RlQ291bnQoKSA+IG5Nb2RhbENvdW50ICkKLy8JCQl8fCAoIERyYWdNYW5hZ2VyOjpHZXREcmFnTWFuYWdlcigpICYmICFiV2FzRHJhZ01hbmFnZXIgKQoJCQl8fCAoIFBvcHVwTWVudTo6R2V0QWN0aXZlUG9wdXBNZW51KCkgJiYgIWJXYXNQb3B1cE1lbnUgKQoJCQl8fCAoIFN0YXJCQVNJQzo6SXNSdW5uaW5nKCkgJiYgIWJCYXNpY1dhc1J1bm5pbmcgKSApCgkJewoJCQliSXNJblJlc2NoZWR1bGUgPSBzYWxfRmFsc2U7CgkJCXBMYXN0Rm9jdXNXaW5kb3cgPSBOVUxMOwoJCQlyZXR1cm4gc2FsX1RydWU7CgkJfQoJCWVsc2UKCQkJcmV0dXJuIHNhbF9GYWxzZTsKCX0KCXN0YXRpYyB2b2lkIE5vcm1hbFJlc2NoZWR1bGUoKQkvLyBTZXR6dCBkYXMgZmxhZyBuaWNodAoJewoJCUdldHBBcHAoKS0+UmVzY2hlZHVsZSgpOwoJfQojZGVmaW5lIFJlc2NoZWR1bGUgUmVzY2hlZHVsZU5pY2h0QmVudXR6ZW5fU3RhdHRkZXNzZW5TYWZlUmVzY2hlZHVsZUFuU3RhdGVtZW50TGlzdAoKCXN0YXRpYyBXaW5kb3cqIEdldE1vdXNlV2luKCk7CglzdGF0aWMgc2FsX0Jvb2wgV2luUHRyVmFsaWQoV2luZG93ICpwVGVzdCk7CglzdGF0aWMgV2luZG93KiBTZWFyY2hBbGxXaW4oIFdpbmRvdyAqcEJhc2UsIFNlYXJjaCAmYVNlYXJjaCwgc2FsX0Jvb2wgTWF5YmVCYXNlID0gc2FsX1RydWUgKTsKcHJvdGVjdGVkOgoJc3RhdGljIFdpbmRvdyogU2VhcmNoQ2xpZW50V2luKCBXaW5kb3cgKnBCYXNlLCBTZWFyY2ggJmFTZWFyY2gsIHNhbF9Cb29sIE1heWJlQmFzZSA9IHNhbF9UcnVlICk7CgoJV2luZG93KiBTZWFyY2hUcmVlKCBydGw6Ok9TdHJpbmcgYVVJZCwgc2FsX0Jvb2wgYlNlYXJjaEJ1dHRvbk9uVG9vbGJveCA9IHNhbF9GYWxzZSApOwoJV2luZG93KiBHZXRBY3RpdmUoIFdpbmRvd1R5cGUgblJULCBzYWxfQm9vbCBNYXliZUJhc2UgPSBzYWxfVHJ1ZSApOwoJV2luZG93KiBHZXRGb2N1cyggV2luZG93VHlwZSBuUlQsIHNhbF9Cb29sIE1heWJlQmFzZSA9IHNhbF9UcnVlICk7CglXaW5kb3cqIEdldEFueUFjdGl2ZSggc2FsX0Jvb2wgTWF5YmVCYXNlID0gc2FsX1RydWUgKTsKICAgIFNjcm9sbEJhciogR2V0U2Nyb2xsQmFyKCBXaW5kb3cgKnBCYXNlLCBzYWxfdUludDE2IG5EaXJlY3Rpb24sIHNhbF9Cb29sIE1heWJlQmFzZSA9IHNhbF9UcnVlICk7CglXaW5kb3cqIEdldFBvcHVwRmxvYXRpbmdXaW4oIHNhbF9Cb29sIE1heWJlQmFzZSA9IHNhbF9UcnVlICk7CiAgICBNZW51KiBHZXRNYXRjaGluZ01lbnUoIFdpbmRvdyogcFdpbiwgTWVudSogcEJhc2VNZW51ID0gTlVMTCApOwoJV2luZG93KiBHZXRXaW5CeVJUKCBXaW5kb3cgKnBCYXNlLCBXaW5kb3dUeXBlIG5SVCwgc2FsX0Jvb2wgTWF5YmVCYXNlID0gc2FsX1RydWUsIHNhbF91SW50MTYgblNraXAgPSAwLCBzYWxfQm9vbCBiU2VhcmNoQWxsID0gc2FsX0ZhbHNlICk7CglzYWxfdUludDE2IENvdW50V2luQnlSVCggV2luZG93ICpwQmFzZSwgV2luZG93VHlwZSBuUlQsIHNhbF9Cb29sIE1heWJlQmFzZSA9IHNhbF9UcnVlICk7CiAgICBXaW5kb3cqIEdldERvY1dpbiggc2FsX3VJbnQxNiBuTnIgKTsKICAgIHNhbF91SW50MTYgR2V0RG9jV2luQ291bnQoKTsKCVdpbmRvdyogR2V0RmFkZVNwbGl0V2luKCBXaW5kb3cgKnBCYXNlLCBXaW5kb3dBbGlnbiBuQWxpZ24sIHNhbF9Cb29sIE1heWJlQmFzZSA9IHNhbF9UcnVlICk7CglzYWxfQm9vbCBWYWx1ZU9LKHJ0bDo6T1N0cmluZyBuSWQsIFN0cmluZyBhQmV6ZWljaG51bmcsIHNhbF91TG9uZyBuVmFsdWUsIHNhbF91TG9uZyBuTWF4KTsKCiAgICBzYWxfdUludDE2IEdldEN1cnJlbnRNZW51ZXMoIFBvcHVwTWVudSAqJnBQb3B1cCwgTWVudUJhciAqJnBNZW51QmFyLCBNZW51IComcE1lbnUgKTsKCnB1YmxpYzoKLy8gIHZvaWQgQWRkU3RhdGVtZW50KCBTdGF0ZW1lbnRMaXN0ICpwTmV3U3RhdGVtZW50ICk7CgoJdmlydHVhbCB+U3RhdGVtZW50TGlzdCgpOwoJdm9pZCBBZHZhbmNlKCk7Cgl2aXJ0dWFsIHNhbF9Cb29sIEV4ZWN1dGUoKSA9IDA7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiogQmVzdGltbXQgZXJzdCBkZW4gbuRjaHN0ZW4gQmVmZWhsLCBzZXR6dCBDdXJyZW50CioqIHVuZCBm/GhydCBkYW5uIGF1cy4KKiogUmV0dXJud2VydCBnaWJ0IGFuLCBvYiBCZWZlaGwgbm9jaG1hbCBhdXNnZWb8aHJ0CioqIHdlcmRlbiBzb2xsLiBEYW5uIG113yBhdWNoIGRlciBVc2VyRXZlbnQgdmVybGFzc2VuIHdlcmRlbiwgdW0gZGVyIEFwcGxpa2F0aW9uCioqIG5vcm1hbGVzIEFyYmVpdGVuIHp1IGVybfZnbGljaGVuIChEaWFsb2cgc2NobGllc3NlbikKKiogc2FsX1RydWUgYmVkZXV0ZXQsIGRhc3MgYWxsZXMga2xhciBnZWdhbmdlbiBpc3QKKiogc2FsX0ZhbHNlIGJlZGV1dGV0IG5vY2htYWwgQml0dGUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCXZvaWQgUmVwb3J0RXJyb3IoU3RyaW5nIGFNZXNzYWdlKTsKCXZvaWQgUmVwb3J0RXJyb3IocnRsOjpPU3RyaW5nIGFVSWQsIFN0cmluZyBhTWVzc2FnZSk7Cgl2b2lkIFJlcG9ydEVycm9yKFN0cmluZyBhTWVzc2FnZSwgc2FsX3VMb25nIG5XaGF0ZXZlcik7CgoJc3RhdGljIHZvaWQgRGlyZWN0TG9nKCBzYWxfdUxvbmcgblR5cGUsIFN0cmluZyBhU3RyaW5nICk7CgoJU3RyaW5nIFRyZWUoV2luZG93ICpwQmFzZSwgaW50IEluZGVudCk7CglTdHJpbmcgQ2xpZW50VHJlZShXaW5kb3cgKnBCYXNlLCBpbnQgSW5kZW50KTsKCglTdGF0ZW1lbnRMaXN0ICpwTmV4dDsKCXN0YXRpYyBTdGF0ZW1lbnRMaXN0IC8qKnBDdXJyZW50LCovICpwRmlyc3Q7CglzdGF0aWMgc2FsX0Jvb2wgYlJlYWRpbmdDb21tYW5kczsKCXN0YXRpYyBydGw6Ok9TdHJpbmcgYVdpbmRvd1dhaXRVSWQ7CglzdGF0aWMgV2luZG93ICpwV2luZG93V2FpdFBvaW50ZXI7CglzdGF0aWMgcnRsOjpPU3RyaW5nIGFXaW5kb3dXYWl0T2xkSGVscElkOwoJc3RhdGljIHJ0bDo6T1N0cmluZyBhV2luZG93V2FpdE9sZFVuaXF1ZUlkOwoJc3RhdGljIFJldFN0cmVhbSAqcFJldDsKCXN0YXRpYyBzYWxfQm9vbCBJc0Vycm9yOwoJc3RhdGljIHNhbF9Cb29sIGJEeWluZzsKCXN0YXRpYyBzYWxfQm9vbCBiRXhlY3V0aW5nOwkJCQkvLyBHZXNldHp0LCB3ZW5uIGVpbiBCZWZlaGwgcmVzY2hlZHVsZWQgb2huZSBlaW5lbiBuZXVlbiBCZWZlaGwgenUgZXJsYXViZW4KCXNhbF9Cb29sIGJXYXNFeGVjdXRpbmc7CSAgICAgICAgCQkvLyBXdXJkZSBiZWkgZWluZW0gTWF5YmVSZXNldFNhZmVSZXNjaGVkdWxlIHJlc2V0dGV0LCBzbyB3aXJkIGRlciBadXN0YW5kIGRhbmFjaCB3aWVkZXJoZXJnZXN0ZWxsdAoJc3RhdGljIHNhbF91SW50MTYgYVN1Yk1lbnVJZDE7CQkJLy8gVW50ZXJtZW78cyBiZWkgUG9wdXBNZW51cwoJc3RhdGljIHNhbF91SW50MTYgYVN1Yk1lbnVJZDI7CQkJLy8gZXJzdG1hbCAyLVN0dWZpZwoJc3RhdGljIHNhbF91SW50MTYgYVN1Yk1lbnVJZDM7CQkJLy8gYW5kIG5vdyBldmVuIDMgbGV2ZWxzICNpMzE1MTIjCiAgICBzdGF0aWMgU3lzdGVtV2luZG93ICpwTWVudVdpbmRvdzsgICAvLyB3aGVuIHVzaW5nIE1lbnVCYXIgYXMgYmFzZSBmb3IgTWVudUNvbW1hbmRzCglzdGF0aWMgVFRQcm9wZXJ0aWVzICpwVFRQcm9wZXJ0aWVzOwkvLyBIaWVyIHN0ZWhlbiBkaWUgU2xvdElEcyBhdXMgZGVtIFNGWCBkcmluCgoJc2FsX0Jvb2wgQ2hlY2tXaW5kb3dXYWl0KCk7CQkJLy9UcnVlIGhlaXNzdCwgZGFzcyBXaW5kb3cgbm9jaCBleGlzdGllcnQKCQkJCQkJCQkJLy9GYWxzZSAtPiBXaW5kb3cgd2VnOwoJc3RhdGljIHZvaWQgU2V0Rmlyc3REb2NGcmFtZSggV2luZG93KiBwV2luICk7CglzdGF0aWMgV2luZG93KiBHZXRGaXJzdERvY0ZyYW1lKCk7CglzdGF0aWMgc2FsX0Jvb2wgSXNGaXJzdERvY0ZyYW1lKCBXaW5kb3cqIHBXaW4gKTsKCXN0YXRpYyBzYWxfQm9vbCBJc0RvY1dpbiggV2luZG93KiBwV2luICk7CglzdGF0aWMgc2FsX0Jvb2wgSXNJTUVXaW4oIFdpbmRvdyogcFdpbiApOyAgICAvLyBJbnB1dCBXaW5kb3cgZm9yIENKSyB1bmRlciBTb2xhcmlzCiAgICBzdGF0aWMgc2FsX0Jvb2wgSXNEb2NGcmFtZSggV2luZG93KiBwV2luICk7CiAgICBzdGF0aWMgTWVudUJhciogR2V0RG9jRnJhbWVNZW51QmFyKCBXaW5kb3cqIHBXaW4gKTsKICAgIHN0YXRpYyBzYWxfdUludDE2IEdldERvY0ZyYW1lQ291bnQoKTsKCiAgICBzdGF0aWMgc2FsX0Jvb2wgYkNhdGNoR1BGOwoKCXN0YXRpYyBzYWxfQm9vbCBiVXNlUG9zdEV2ZW50czsgICAgICAgICAvLyB1c2UgQXBwbGljYXRpb246OlBvc3QqRXZlbnQgb3Igb3duIGltcGwgdG8gaGFuZGxlIGtleSBhbmQgbW91c2VldmVudHMKCiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCglzdGF0aWMgRWRpdFdpbmRvdyAqbV9wRGJnV2luOwojZW5kaWYKfTsKCmNsYXNzIFN0YXRlbWVudFNsb3QgOiBwdWJsaWMgU3RhdGVtZW50TGlzdAkvL1Nsb3RzIGF1ZnJ1ZmVuCnsKcHJvdGVjdGVkOgoJc2FsX3VJbnQxNiBuQW56YWhsOwoJU2Z4UG9vbEl0ZW0gKipwSXRlbUFycjsKICAgIDo6Y29tOjpzdW46OnN0YXI6OnVubzo6U2VxdWVuY2U8IDo6Y29tOjpzdW46OnN0YXI6OmJlYW5zOjpQcm9wZXJ0eVZhbHVlPiBhQXJnczsKCXNhbF91SW50MTYgbkZ1bmN0aW9uSWQ7ICAgICAvLyBjYW4gZ2V0IHJlbW92ZWQgd2hlbiB0aGUgb2xkIChudW1lcmljKSBzbG90aGFuZGxpbmcgaXMgcmVtb3ZlZAogICAgU3RyaW5nIGFVbm9Vcmw7CiAgICBzYWxfQm9vbCBiTWVudUNsb3NlZDsKCiAgICBTdGF0ZW1lbnRTbG90KCk7CiAgICB2b2lkIEFkZFJlZmVyZXIoKTsKcHVibGljOgoJU3RhdGVtZW50U2xvdCggU0NtZFN0cmVhbSAqcEluICk7CglTdGF0ZW1lbnRTbG90KCBzYWxfdUxvbmcgblNsb3QsIFNmeFBvb2xJdGVtKiBwSXRlbSA9IE5VTEwgKTsKCXZpcnR1YWwgflN0YXRlbWVudFNsb3QoKTsKCXZpcnR1YWwgc2FsX0Jvb2wgRXhlY3V0ZSgpOwp9OwoKY2xhc3MgU3RhdGVtZW50VW5vU2xvdCA6IHB1YmxpYyBTdGF0ZW1lbnRTbG90CS8vVW5vIFNsb3RzIGF1ZnJ1ZmVuCnsKcHVibGljOgoJU3RhdGVtZW50VW5vU2xvdChTQ21kU3RyZWFtICpwSW4pOwp9OwoKY2xhc3MgU3RhdGVtZW50Q29tbWFuZCA6IHB1YmxpYyBTdGF0ZW1lbnRMaXN0CS8vIEJlZmVobCBhdXNm/GhyZW4gKHdpbnRyZWUsIHJlc2V0YXBsaWNhdGlvbiAuLi4pCnsKCWZyaWVuZCBjbGFzcyBJbXBsUmVtb3RlQ29udHJvbDsKcHJvdGVjdGVkOgoJc2FsX3VJbnQxNiBuTWV0aG9kSWQ7CglzYWxfdUludDE2IG5QYXJhbXM7Cgljb21tX1VTSE9SVCBuTnIxLG5OcjIsbk5yMyxuTnI0OwoJY29tbV9VTE9ORyBuTE5yMTsKCVN0cmluZyBhU3RyaW5nMSxhU3RyaW5nMjsKCXNhbF9Cb29sIGJCb29sMSxiQm9vbDI7CgoJV2luZG93KiBHZXROZXh0T3ZlcmxhcCggV2luZG93KiBwQmFzZSApOwoJV2luZG93KiBHZXROZXh0UmVjb3ZlcldpbigpOwoKCXN0YXRpYyBzYWxfdUludDE2IG5EaXJQb3M7CglzdGF0aWMgRGlyICpwRGlyOwoJc3RhdGljIHBmdW5jX29zbF9wcmludERlYnVnTWVzc2FnZSBwT3JpZ2luYWxfb3NsX0RlYnVnTWVzc2FnZUZ1bmM7CgoKCXNhbF9Cb29sIFVucGFja1N0b3JhZ2UoIFNvdFN0b3JhZ2VSZWYgeFN0b3JhZ2UsIERpckVudHJ5ICZhQmFzZURpciApOwoKICAgIHZvaWQgSGFuZGxlU0FYUGFyc2VyKCk7CgpwdWJsaWM6CglTdGF0ZW1lbnRDb21tYW5kKCBTQ21kU3RyZWFtICpwSW4gKTsKCVN0YXRlbWVudENvbW1hbmQoIFN0YXRlbWVudExpc3QgKnBBZnRlclRoaXMsIHNhbF91SW50MTYgTWV0aG9kSWQsIHNhbF91SW50MTYgUGFyYW1zLCBzYWxfdUludDE2IE5yMSApOwoJdmlydHVhbCBzYWxfQm9vbCBFeGVjdXRlKCk7CglzYWxfQm9vbCBEaXNwbGF5SElEKCk7Cgl2b2lkIFRyYW5zbGF0ZSgpOwoJdm9pZCBXcml0ZUNvbnRyb2xEYXRhKCBXaW5kb3cgKnBCYXNlLCBzYWxfdUxvbmcgbkNvbmYsIHNhbF9Cb29sIGJGaXJzdCA9IHNhbF9UcnVlICk7Cgp9OwoKCmVudW0gVFRIb3RTcG90cyAgeyBNaXR0ZUxpbmtzLCBNaXR0ZSwgTWl0dGVPYmVuIH07CgpjbGFzcyBTdGF0ZW1lbnRDb250cm9sIDogcHVibGljIFN0YXRlbWVudExpc3QKewpwcm90ZWN0ZWQ6CglydGw6Ok9TdHJpbmcgYVVJZDsKCXNhbF91SW50MTYgbk1ldGhvZElkOwoJc2FsX3VJbnQxNiBuUGFyYW1zOwoJY29tbV9VU0hPUlQgbk5yMSxuTnIyLG5OcjMsbk5yNDsKCWNvbW1fVUxPTkcgbkxOcjE7CglTdHJpbmcgYVN0cmluZzEsYVN0cmluZzI7CglzYWxfQm9vbCBiQm9vbDEsYkJvb2wyOwoJc2FsX0Jvb2wgQ29udHJvbE9LKCBXaW5kb3cgKnBDb250cm9sLCBjb25zdCBzYWxfQ2hhciogYUJlemVpY2hudW5nICk7Cgl2b2lkIEFuaW1hdGVNb3VzZSggV2luZG93ICpwQ29udHJvbCwgVFRIb3RTcG90cyBhV29oaW4gKTsKCXZvaWQgQW5pbWF0ZU1vdXNlKCBXaW5kb3cgKnBDb250cm9sLCBQb2ludCBhV29oaW4gKTsKCglzYWxfQm9vbCBNYXliZURvVHlwZUtleXNEZWxheSggV2luZG93ICpwVGVzdFdpbmRvdyApOwoKCXNhbF9Cb29sIEhhbmRsZVZpc2libGVDb250cm9scyggV2luZG93ICpwQ29udHJvbCApOwoJc2FsX0Jvb2wgSGFuZGxlQ29tbW9uTWV0aG9kcyggV2luZG93ICpwQ29udHJvbCApOwoKcHVibGljOgoJU3RhdGVtZW50Q29udHJvbCggU0NtZFN0cmVhbSAqcEluLCBzYWxfdUludDE2IG5Db250cm9sVHlwZSApOwoJdmlydHVhbCBzYWxfQm9vbCBFeGVjdXRlKCk7Cgp9OwoKY2xhc3MgU3RhdGVtZW50RmxvdyA6IHB1YmxpYyBTdGF0ZW1lbnRMaXN0CQkvLyBLb21tdW5pa2F0aW9uIG1pdCBTZXF1ZW5jZQp7CglzYWxfdUludDE2IG5BcnQ7CgoJc2FsX3VJbnQxNiBuUGFyYW1zOwoJY29tbV9VU0hPUlQgblNOcjE7Cgljb21tX1VMT05HIG5MTnIxOwoJU3RyaW5nIGFTdHJpbmcxOwoJc2FsX0Jvb2wgYkJvb2wxOwoKCnB1YmxpYzoKCVN0YXRlbWVudEZsb3cgKHNhbF91TG9uZyBuU2VydmljZUlkLCBTQ21kU3RyZWFtICpwSW4sIEltcGxSZW1vdGVDb250cm9sICpwUkMgKTsKCVN0YXRlbWVudEZsb3coIFN0YXRlbWVudExpc3QgKnBBZnRlclRoaXMsIHNhbF91SW50MTYgbkFydFAgKTsKCXZpcnR1YWwgc2FsX0Jvb2wgRXhlY3V0ZSgpOwoJc3RhdGljIENvbW11bmljYXRpb25MaW5rICpwQ29tbUxpbms7CglzdGF0aWMgc2FsX0Jvb2wgYlNlbmRpbmc7CgoJc3RhdGljIHNhbF9Cb29sIGJVc2VJUEM7CS8vIFNvbGwgenVyIHL8Y2ttZWxkdW5nIElQQyB2ZXJ3ZW5kZXQgd2VyZGVuPwoJc3RhdGljIEltcGxSZW1vdGVDb250cm9sICpwUmVtb3RlQ29udHJvbDsJLy8gU3RhdGljIGb8ciAyLiBDb25zdHJ1Y3RvcgoKcHJpdmF0ZToKCXZvaWQgU2VuZFZpYVNvY2tldCgpOwp9OwoKY2xhc3MgU2VhcmNoVUlEIDogcHVibGljIFNlYXJjaAp7CglXaW5kb3cgKnBNYXliZVJlc3VsdDsKCVdpbmRvdyAqcEFsdGVybmF0ZVJlc3VsdDsKCXJ0bDo6T1N0cmluZyBhVUlkOwoJc2FsX0Jvb2wgYlNlYXJjaEJ1dHRvbk9uVG9vbGJveDsKcHVibGljOgoJU2VhcmNoVUlEKCBydGw6Ok9TdHJpbmcgYVVJZFAsIHNhbF9Cb29sIGJTZWFyY2hCdXR0b25PblRvb2xib3hQICk6IFNlYXJjaCggU0VBUkNIX0ZPQ1VTX0ZJUlNUICksIHBNYXliZVJlc3VsdChOVUxMKSwgcEFsdGVybmF0ZVJlc3VsdChOVUxMKSwgYVVJZChhVUlkUCksIGJTZWFyY2hCdXR0b25PblRvb2xib3goYlNlYXJjaEJ1dHRvbk9uVG9vbGJveFApIHt9Cgl2aXJ0dWFsIHNhbF9Cb29sIElzV2luT0soIFdpbmRvdyAqcFdpbiApOwoJV2luZG93KiBHZXRNYXliZVdpbigpIHsgcmV0dXJuIHBNYXliZVJlc3VsdDsgfQoJV2luZG93KiBHZXRBbHRlcm5hdGVSZXN1bHRXaW4oKSB7IHJldHVybiBwQWx0ZXJuYXRlUmVzdWx0OyB9Cn07CmNsYXNzIFNlYXJjaEFjdGl2ZSA6IHB1YmxpYyBTZWFyY2gKewoJV2luZG93VHlwZSBuUlQ7CnB1YmxpYzoKCVNlYXJjaEFjdGl2ZSggV2luZG93VHlwZSBuUlRQICk6IG5SVChuUlRQKSB7fQoJdmlydHVhbCBzYWxfQm9vbCBJc1dpbk9LKCBXaW5kb3cgKnBXaW4gKTsKfTsKY2xhc3MgU2VhcmNoUG9wdXBGbG9hdGluZ1dpbiA6IHB1YmxpYyBTZWFyY2gKewpwdWJsaWM6CglTZWFyY2hQb3B1cEZsb2F0aW5nV2luKCk6IFNlYXJjaCggU0VBUkNIX0ZPQ1VTX0ZJUlNUICkge30KCXZpcnR1YWwgc2FsX0Jvb2wgSXNXaW5PSyggV2luZG93ICpwV2luICk7Cn07CmNsYXNzIFNlYXJjaFJUIDogcHVibGljIFNlYXJjaAp7CglXaW5kb3dUeXBlIG1uUlQ7CiAgICBzYWxfdUludDE2IG1uU2tpcDsKICAgIHNhbF91SW50MTYgbW5Db3VudDsKcHVibGljOgoJU2VhcmNoUlQoIFdpbmRvd1R5cGUgblJUUCwgU2VhcmNoRmxhZ3MgblNlYXJjaEZsYWdzLCBzYWxfdUludDE2IG5Ta2lwID0gMCApOiBTZWFyY2goblNlYXJjaEZsYWdzKSwgbW5SVChuUlRQKSwgbW5Ta2lwKCBuU2tpcCApLCBtbkNvdW50KCAwICkge30KCXZpcnR1YWwgc2FsX0Jvb2wgSXNXaW5PSyggV2luZG93ICpwV2luICk7CiAgICBzYWxfdUludDE2IEdldENvdW50KCl7IHJldHVybiBtbkNvdW50OyB9Cn07CmNsYXNzIFNlYXJjaFNjcm9sbCA6IHB1YmxpYyBTZWFyY2hSVAp7CglzYWxfdUludDE2IG5EaXJlY3Rpb247CnB1YmxpYzoKCVNlYXJjaFNjcm9sbCggc2FsX3VJbnQxNiBuRGlyLCBTZWFyY2hGbGFncyBuU2VhcmNoRmxhZ3MgKTogU2VhcmNoUlQoV0lORE9XX1NDUk9MTEJBUiwgblNlYXJjaEZsYWdzKSwgbkRpcmVjdGlvbihuRGlyKSB7fQoJdmlydHVhbCBzYWxfQm9vbCBJc1dpbk9LKCBXaW5kb3cgKnBXaW4gKTsKfTsKY2xhc3MgU2VhcmNoV2luUHRyIDogcHVibGljIFNlYXJjaAp7CglXaW5kb3cgKnBUZXN0OwpwdWJsaWM6CglTZWFyY2hXaW5QdHIoIFdpbmRvdyAqcFRlc3RQICk6IHBUZXN0KHBUZXN0UCkge30KCXZpcnR1YWwgc2FsX0Jvb2wgSXNXaW5PSyggV2luZG93ICpwV2luICk7Cn07CmNsYXNzIFNlYXJjaEZhZGVTcGxpdFdpbiA6IHB1YmxpYyBTZWFyY2gKewoJV2luZG93QWxpZ24gbkFsaWduOwpwdWJsaWM6CglTZWFyY2hGYWRlU3BsaXRXaW4oIFdpbmRvd0FsaWduIG5BbGlnblAgKTogbkFsaWduKG5BbGlnblApIHt9Cgl2aXJ0dWFsIHNhbF9Cb29sIElzV2luT0soIFdpbmRvdyAqcFdpbiApOwp9OwoKCnZvaWQgSW1wbEtleUlucHV0KCBXaW5kb3cqIHBXaW4sIEtleUV2ZW50ICZhS0V2bnQsIHNhbF9Cb29sIGJGb3JjZURpcmVjdD1zYWxfRmFsc2UgKTsKdm9pZCBJbXBsTW91c2VNb3ZlKCBXaW5kb3cqIHBXaW4sIE1vdXNlRXZlbnQgJmFNRXZudCwgc2FsX0Jvb2wgYkZvcmNlRGlyZWN0PXNhbF9GYWxzZSApOwp2b2lkIEltcGxNb3VzZUJ1dHRvbkRvd24oIFdpbmRvdyogcFdpbiwgTW91c2VFdmVudCAmYU1Fdm50LCBzYWxfQm9vbCBiRm9yY2VEaXJlY3Q9c2FsX0ZhbHNlICk7CnZvaWQgSW1wbE1vdXNlQnV0dG9uVXAoIFdpbmRvdyogcFdpbiwgTW91c2VFdmVudCAmYU1Fdm50LCBzYWxfQm9vbCBiRm9yY2VEaXJlY3Q9c2FsX0ZhbHNlICk7CnZvaWQgSW1wbENvbW1hbmQoIFdpbmRvdyogcFdpbiwgQ29tbWFuZEV2ZW50ICZhQ21kRXZudCApOwp2b2lkIEltcGxFdmVudFdhaXQoIHNhbF91TG9uZyBuSUQgKTsKCiNlbmRpZgo=