LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgovLyBNQVJLRVIodXBkYXRlX3ByZWNvbXAucHkpOiBhdXRvZ2VuIGluY2x1ZGUgc3RhdGVtZW50LCBkbyBub3QgcmVtb3ZlCiNpbmNsdWRlICJwcmVjb21waWxlZF9kYnVpLmh4eCIKI2luY2x1ZGUgIkh0bWxSZWFkZXIuaHh4IgojaW5jbHVkZSA8Y29ubmVjdGl2aXR5L2RiY29udmVyc2lvbi5oeHg+CiNpbmNsdWRlIDxjb25uZWN0aXZpdHkvZGJ0b29scy5oeHg+CiNpbmNsdWRlIDx0b29scy90ZW5jY3Z0Lmh4eD4KI2luY2x1ZGUgPGNvbXBoZWxwZXIvZXh0cmFjdC5oeHg+CiNpbmNsdWRlICJkYnVfbWlzYy5ocmMiCiNpbmNsdWRlICJkYnVzdHJpbmdzLmhyYyIKI2luY2x1ZGUgPHNmeDIvc2Z4aHRtbC5oeHg+CiNpbmNsdWRlIDx0b29scy9kZWJ1Zy5oeHg+CiNpbmNsdWRlIDx0b29scy90ZW5jY3Z0Lmh4eD4KI2luY2x1ZGUgIm1vZHVsZWRidS5oeHgiCiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvc2RiY3gvWERhdGFEZXNjcmlwdG9yRmFjdG9yeS5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvc2RiY3gvWENvbHVtbnNTdXBwbGllci5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvc2RiY3gvWEFwcGVuZC5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvc2RiYy9EYXRhVHlwZS5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvc2RiYy9Db2x1bW5WYWx1ZS5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvYXd0L0ZvbnREZXNjcmlwdG9yLmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9hd3QvRm9udFdlaWdodC5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvYXd0L0ZvbnRTdHJpa2VvdXQuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL2F3dC9Gb250U2xhbnQuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL2F3dC9Gb250VW5kZXJsaW5lLmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci91dGlsL051bWJlckZvcm1hdC5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvdXRpbC9YTnVtYmVyRm9ybWF0VHlwZXMuaHBwPgojaW5jbHVkZSA8c3Z0b29scy9odG1sdG9rbi5oPgojaW5jbHVkZSA8c3Z0b29scy9odG1sa3l3ZC5oeHg+CiNpbmNsdWRlIDx0b29scy9jb2xvci5oeHg+CiNpbmNsdWRlICJXQ29weVRhYmxlLmh4eCIKI2luY2x1ZGUgIldFeHRlbmRQYWdlcy5oeHgiCiNpbmNsdWRlICJXTmFtZU1hdGNoLmh4eCIKI2luY2x1ZGUgIldDb2x1bW5TZWxlY3QuaHh4IgojaW5jbHVkZSAiUUVudW1UeXBlcy5oeHgiCiNpbmNsdWRlICJXQ1BhZ2UuaHh4IgojaW5jbHVkZSA8dG9vbHMvaW5ldG1pbWUuaHh4PgojaW5jbHVkZSA8c3ZsL2luZXR0eXBlLmh4eD4KI2luY2x1ZGUgPHJ0bC90ZW5jaW5mby5oPgojaW5jbHVkZSAiVUlUb29scy5oeHgiCiNpbmNsdWRlIDx2Y2wvc3ZhcHAuaHh4PgojaW5jbHVkZSA8cnRsL2xvZ2ZpbGUuaHh4PgoKdXNpbmcgbmFtZXNwYWNlIGRiYXVpOwp1c2luZyBuYW1lc3BhY2UgOjpjb206OnN1bjo6c3Rhcjo6dW5vOwp1c2luZyBuYW1lc3BhY2UgOjpjb206OnN1bjo6c3Rhcjo6YmVhbnM7CnVzaW5nIG5hbWVzcGFjZSA6OmNvbTo6c3VuOjpzdGFyOjpjb250YWluZXI7CnVzaW5nIG5hbWVzcGFjZSA6OmNvbTo6c3VuOjpzdGFyOjpzZGJjOwp1c2luZyBuYW1lc3BhY2UgOjpjb206OnN1bjo6c3Rhcjo6c2RiY3g7CnVzaW5nIG5hbWVzcGFjZSA6OmNvbTo6c3VuOjpzdGFyOjphd3Q7CgojZGVmaW5lIERCQVVJX0hUTUxfRk9OVFNJWkVTCTgJCS8vIHdpZSBFeHBvcnQsIEhUTUwtT3B0aW9ucwojZGVmaW5lIEhUTUxfTUVUQV9OT05FCQkJMAojZGVmaW5lIEhUTUxfTUVUQV9BVVRIT1IJCTEKI2RlZmluZSBIVE1MX01FVEFfREVTQ1JJUFRJT04JMgojZGVmaW5lIEhUTUxfTUVUQV9LRVlXT1JEUwkJMwojZGVmaW5lIEhUTUxfTUVUQV9SRUZSRVNICQk0CiNkZWZpbmUgSFRNTF9NRVRBX0NMQVNTSUZJQ0FUSU9OIDUKI2RlZmluZSBIVE1MX01FVEFfQ1JFQVRFRAkJNgojZGVmaW5lIEhUTUxfTUVUQV9DSEFOR0VEQlkJCTcKI2RlZmluZSBIVE1MX01FVEFfQ0hBTkdFRAkJOAojZGVmaW5lIEhUTUxfTUVUQV9HRU5FUkFUT1IJCTkKI2RlZmluZSBIVE1MX01FVEFfU0RGT09UTk9URQkxMAojZGVmaW5lIEhUTUxfTUVUQV9TREVORE5PVEUJCTExCiNkZWZpbmUgSFRNTF9NRVRBX0NPTlRFTlRfVFlQRQkxMgoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KREJHX05BTUUoT0hUTUxSZWFkZXIpCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIE9IVE1MUmVhZGVyCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ck9IVE1MUmVhZGVyOjpPSFRNTFJlYWRlcihTdlN0cmVhbSYgckluLGNvbnN0IFNoYXJlZENvbm5lY3Rpb24mIF9yeENvbm5lY3Rpb24sCgkJCQkJCWNvbnN0IFJlZmVyZW5jZTwgOjpjb206OnN1bjo6c3Rhcjo6dXRpbDo6WE51bWJlckZvcm1hdHRlciA+JiBfcnhOdW1iZXJGLAoJCQkJCQljb25zdCA6OmNvbTo6c3VuOjpzdGFyOjp1bm86OlJlZmVyZW5jZTwgOjpjb206OnN1bjo6c3Rhcjo6bGFuZzo6WE11bHRpU2VydmljZUZhY3RvcnkgPiYgX3JNLAoJCQkJCQljb25zdCBUQ29sdW1uVmVjdG9yKiBwTGlzdCwKCQkJCQkJY29uc3QgT1R5cGVJbmZvTWFwKiBfcEluZm9NYXApCgk6SFRNTFBhcnNlcihySW4pCgksT0RhdGFiYXNlRXhwb3J0KCBfcnhDb25uZWN0aW9uLCBfcnhOdW1iZXJGLCBfck0sIHBMaXN0LCBfcEluZm9NYXAsIHJJbiApCgksbV9uVGFibGVDb3VudCgwKQoJLG1fbkNvbHVtbldpZHRoKDg3KQoJLG1fYk1ldGFPcHRpb25zKHNhbF9GYWxzZSkKCSxtX2JTRE51bShzYWxfRmFsc2UpCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6T0hUTUxSZWFkZXIiICk7CglEQkdfQ1RPUihPSFRNTFJlYWRlcixOVUxMKTsKCVNldFNyY0VuY29kaW5nKCBHZXRFeHRlbmRlZENvbXBhdGliaWxpdHlUZXh0RW5jb2RpbmcoICBSVExfVEVYVEVOQ09ESU5HX0lTT184ODU5XzEgKSApOwogICAgLy8gSWYgdGhlIGZpbGUgc3RhcnRzIHdpdGggYSBCT00sIHN3aXRjaCB0byBVQ1MyLgogICAgU2V0U3dpdGNoVG9VQ1MyKCBzYWxfVHJ1ZSApOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpPSFRNTFJlYWRlcjo6T0hUTUxSZWFkZXIoU3ZTdHJlYW0mIHJJbiwKCQkJCQkJIHNhbF9JbnQzMiBuUm93cywKCQkJCQkJIGNvbnN0IFRQb3NpdGlvbnMgJl9yQ29sdW1uUG9zaXRpb25zLAoJCQkJCQkgY29uc3QgUmVmZXJlbmNlPCA6OmNvbTo6c3VuOjpzdGFyOjp1dGlsOjpYTnVtYmVyRm9ybWF0dGVyID4mIF9yeE51bWJlckYsCgkJCQkJCSBjb25zdCA6OmNvbTo6c3VuOjpzdGFyOjp1bm86OlJlZmVyZW5jZTwgOjpjb206OnN1bjo6c3Rhcjo6bGFuZzo6WE11bHRpU2VydmljZUZhY3RvcnkgPiYgX3JNLAoJCQkJCQkgY29uc3QgVENvbHVtblZlY3RvciogcExpc3QsCgkJCQkJCSBjb25zdCBPVHlwZUluZm9NYXAqIF9wSW5mb01hcCwKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbF9Cb29sIF9iQXV0b0luY3JlbWVudEVuYWJsZWQpCgk6SFRNTFBhcnNlcihySW4pCgksT0RhdGFiYXNlRXhwb3J0KCBuUm93cywgX3JDb2x1bW5Qb3NpdGlvbnMsIF9yeE51bWJlckYsIF9yTSwgcExpc3QsIF9wSW5mb01hcCwgX2JBdXRvSW5jcmVtZW50RW5hYmxlZCwgckluICkKCSxtX25UYWJsZUNvdW50KDApCgksbV9uQ29sdW1uV2lkdGgoODcpCgksbV9iTWV0YU9wdGlvbnMoc2FsX0ZhbHNlKQoJLG1fYlNETnVtKHNhbF9GYWxzZSkKewogICAgUlRMX0xPR0ZJTEVfQ09OVEVYVF9BVVRIT1IoIGFMb2dnZXIsICJtaXNjIiwgIk9ja2UuSmFuc3NlbkBzdW4uY29tIiwgIk9IVE1MUmVhZGVyOjpPSFRNTFJlYWRlciIgKTsKCURCR19DVE9SKE9IVE1MUmVhZGVyLE5VTEwpOwoJU2V0U3JjRW5jb2RpbmcoIEdldEV4dGVuZGVkQ29tcGF0aWJpbGl0eVRleHRFbmNvZGluZyggIFJUTF9URVhURU5DT0RJTkdfSVNPXzg4NTlfMSApICk7CiAgICAvLyBJZiB0aGUgZmlsZSBzdGFydHMgd2l0aCBhIEJPTSwgc3dpdGNoIHRvIFVDUzIuCiAgICBTZXRTd2l0Y2hUb1VDUzIoIHNhbF9UcnVlICk7Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk9IVE1MUmVhZGVyOjp+T0hUTUxSZWFkZXIoKQp7CglEQkdfRFRPUihPSFRNTFJlYWRlcixOVUxMKTsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KU3ZQYXJzZXJTdGF0ZSBPSFRNTFJlYWRlcjo6Q2FsbFBhcnNlcigpCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6Q2FsbFBhcnNlciIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJcklucHV0LlNlZWsoU1RSRUFNX1NFRUtfVE9fQkVHSU4pOwoJcklucHV0LlJlc2V0RXJyb3IoKTsKCVN2UGFyc2VyU3RhdGUgIGVQYXJzZVN0YXRlID0gSFRNTFBhcnNlcjo6Q2FsbFBhcnNlcigpOwoJU2V0Q29sdW1uVHlwZXMobV9wQ29sdW1uTGlzdCxtX3BJbmZvTWFwKTsKCXJldHVybiBtX2JGb3VuZFRhYmxlID8gZVBhcnNlU3RhdGUgOiBTVlBBUl9FUlJPUjsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE9IVE1MUmVhZGVyOjpOZXh0VG9rZW4oIGludCBuVG9rZW4gKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6Ok5leHRUb2tlbiIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJaWYobV9iRXJyb3IgfHwgIW1fblJvd3MpIC8vIGZhbGxzIEZlaGxlciBvZGVyIGtlaW5lIFJvd3MgbWVociB6dXIgIlViZXJwciJ1ZnVuZyBkYW5uIGdsZWljaCB6dXIidWNrCgkJcmV0dXJuOwoJaWYgKCBuVG9rZW4gPT0gIEhUTUxfTUVUQSApCgkJc2V0VGV4dEVuY29kaW5nKCk7CgoJaWYobV94Q29ubmVjdGlvbi5pcygpKQkgIC8vIGdpYnQgYW4gd2VsY2hlciBDVE9SIGdlcnVmZW4gd3VyZGUgdW5kIGRhbWl0LCBvYiBlaW5lIFRhYmVsbGUgZXJzdGVsbHQgd2VyZGVuIHNvbGwKCXsKCQlzd2l0Y2goblRva2VuKQoJCXsKCQkJY2FzZSBIVE1MX1RBQkxFX09OOgoJCQkJKyttX25UYWJsZUNvdW50OwoJCQkJewkvLyBlcyBrYW5uIGF1Y2ggVEQgb2RlciBUSCBzZWluLCB3ZW5uIGVzIHZvcmhlciBrZWluIFRBQkxFIGdhYgogICAgICAgICAgICAgICAgICAgIGNvbnN0IEhUTUxPcHRpb25zKiBwSHRtbE9wdGlvbnMgPSBHZXRPcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgc2FsX0ludDE2IG5BcnJMZW4gPSBwSHRtbE9wdGlvbnMtPkNvdW50KCk7CgkJCQkJZm9yICggc2FsX0ludDE2IGkgPSAwOyBpIDwgbkFyckxlbjsgaSsrICkKCQkJCQl7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhUTUxPcHRpb24qIHBPcHRpb24gPSAoKnBIdG1sT3B0aW9ucylbaV07CgkJCQkJCXN3aXRjaCggcE9wdGlvbi0+R2V0VG9rZW4oKSApCgkJCQkJCXsKCQkJCQkJCWNhc2UgSFRNTF9PX1dJRFRIOgoJCQkJCQkJewkvLyBQcm96ZW50OiB2b24gRG9rdW1lbnRicmVpdGUgYnp3LiBhZXVzc2VyZXIgWmVsbGUKCQkJCQkJCQltX25Db2x1bW5XaWR0aCA9IEdldFdpZHRoUGl4ZWwoIHBPcHRpb24gKTsKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQljYXNlIEhUTUxfVEhFQURfT046CgkJCWNhc2UgSFRNTF9UQk9EWV9PTjoKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzYWxfdUludDMyIG5UZWxsID0gcklucHV0LlRlbGwoKTsgLy8gdmVy5G5kZXJ0IHZpZWxsZWljaHQgZGllIFBvc2l0aW9uIGRlcyBTdHJlYW1zCgkJCQkgICAgaWYgKCAhbV94VGFibGUuaXMoKSApCiAgICAgICAgICAgICAgICAgICAgey8vIGVyc3RlIFplaWxlIGFscyBIZWFkZXIgdmVyd2VuZGVuCgkJCQkJICAgIG1fYkVycm9yID0gIUNyZWF0ZVRhYmxlKG5Ub2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbV9iQXBwZW5kRmlyc3RMaW5lICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJJbnB1dC5TZWVrKG5UZWxsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1RBQkxFX09GRjoKCQkJCWlmKCEtLW1fblRhYmxlQ291bnQpCgkJCQl7CgkJCQkJbV94VGFibGUgPSBOVUxMOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRVJPV19PTjoKCQkJCWlmICggbV9wVXBkYXRlSGVscGVyLmdldCgpICkKCQkJCXsKCQkJCQl0cnkKCQkJCQl7CgkJCQkJCW1fcFVwZGF0ZUhlbHBlci0+bW92ZVRvSW5zZXJ0Um93KCk7IC8vIHNvbnN0IG5ldWUgWmVpbGUgYW5oImFuZ2VuCgkJCQkJfQoJCQkJCWNhdGNoKFNRTEV4Y2VwdGlvbiYgZSkKCQkJCQkvLyBVcGRhdGVGZWhsZXJiZWhhbmRsdW5nCgkJCQkJewoJCQkJCQlzaG93RXJyb3JEaWFsb2coZSk7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZQoJCQkJCW1fYkVycm9yID0gc2FsX1RydWU7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1RFWFRUT0tFTjoKCQkJY2FzZSBIVE1MX1NJTkdMRUNIQVI6CgkJCQlpZiAoIG1fYkluVGJsICkgLy8mJiAhbV9iU0ROdW0gKSAvLyB3aWNodGlnLCBkYSB3aXIgc29uc3QgYXVjaCBkaWUgTmFtZW4gZGVyIEZvbnRzIGJla29tbWVuCgkJCQkgICAgbV9zVGV4dFRva2VuICs9IGFUb2tlbjsKCQkJCWJyZWFrOwogICAgICAgICAgICBjYXNlIEhUTUxfUEFSQUJSRUFLX09GRjoKICAgICAgICAgICAgICAgIG1fc0N1cnJlbnQgKz0gbV9zVGV4dFRva2VuOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgSFRNTF9QQVJBQlJFQUtfT046CiAgICAgICAgICAgICAgICBtX3NUZXh0VG9rZW4uRXJhc2UoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJCQljYXNlIEhUTUxfVEFCTEVEQVRBX09OOgogICAgICAgICAgICAgICAgZmV0Y2hPcHRpb25zKCk7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1RBQkxFREFUQV9PRkY6CgkJCQl7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBtX3NDdXJyZW50LkxlbigpICkKICAgICAgICAgICAgICAgICAgICAgICAgbV9zVGV4dFRva2VuID0gbV9zQ3VycmVudDsKCQkJCQl0cnkKCQkJCQl7CgkJCQkJCWluc2VydFZhbHVlSW50b0NvbHVtbigpOwoJCQkJCX0KCQkJCQljYXRjaChTUUxFeGNlcHRpb24mIGUpCgkJCQkJLy8gVXBkYXRlRmVobGVyYmVoYW5kbHVuZwoJCQkJCXsKCQkJCQkJc2hvd0Vycm9yRGlhbG9nKGUpOwoJCQkJCX0KICAgICAgICAgICAgICAgICAgICBtX3NDdXJyZW50LkVyYXNlKCk7CgkJCQkJbV9uQ29sdW1uUG9zKys7CiAgICAgICAgICAgICAgICAgICAgZXJhc2VUb2tlbnMoKTsKCQkJCQltX2JTRE51bSA9IG1fYkluVGJsID0gc2FsX0ZhbHNlOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRVJPV19PRkY6CgkJCQlpZiAoICFtX3BVcGRhdGVIZWxwZXIuZ2V0KCkgKQoJCQkJewoJCQkJCW1fYkVycm9yID0gc2FsX1RydWU7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQl0cnkKCQkJCXsKCQkJCQltX25Sb3dDb3VudCsrOwoJCQkJCWlmIChtX2JJc0F1dG9JbmNyZW1lbnQpIC8vIGlmIGJTZXRBdXRvSW5jcmVtZW50IHRoZW4gSSBoYXZlIHRvIHNldCB0aGUgYXV0b2luY3JlbWVudAoJCQkJCQltX3BVcGRhdGVIZWxwZXItPnVwZGF0ZUludCgxLG1fblJvd0NvdW50KTsKCQkJCQltX3BVcGRhdGVIZWxwZXItPmluc2VydFJvdygpOwoJCQkJfQoJCQkJY2F0Y2goU1FMRXhjZXB0aW9uJiBlKQoJCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCQkJLy8gVXBkYXRlRmVobGVyYmVoYW5kbHVuZwoJCQkJewoJCQkJCXNob3dFcnJvckRpYWxvZyhlKTsKCQkJCX0KCQkJCW1fbkNvbHVtblBvcyA9IDA7CgkJCQlicmVhazsKCQl9Cgl9CgllbHNlIC8vIFp3ZWlnIG51ciBmInVyIFR5cHByInVmdW5nIGcidWx0aWcKCXsKCQlzd2l0Y2goblRva2VuKQoJCXsKCQkJY2FzZSBIVE1MX1RIRUFEX09OOgoJCQljYXNlIEhUTUxfVEJPRFlfT046CgkJCQkvLyBEZXIgU3BhbHRlbiBLb3BmIHoiYWhsdCBuaWNodCBtaXQKCQkJCWlmKG1fYkhlYWQpCgkJCQl7CgkJCQkJZG8KCQkJCQl7fQoJCQkJCXdoaWxlKEdldE5leHRUb2tlbigpICE9IEhUTUxfVEFCTEVST1dfT0ZGKTsKCQkJCQltX2JIZWFkID0gc2FsX0ZhbHNlOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRURBVEFfT046CgkJCWNhc2UgSFRNTF9UQUJMRUhFQURFUl9PTjoKCQkJCWZldGNoT3B0aW9ucygpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9URVhUVE9LRU46CgkJCWNhc2UgSFRNTF9TSU5HTEVDSEFSOgogICAgICAgICAgICAgICAgaWYgKCBtX2JJblRibCApIC8vICYmICFtX2JTRE51bSApIC8vIHdpY2h0aWcsIGRhIHdpciBzb25zdCBhdWNoIGRpZSBOYW1lbiBkZXIgRm9udHMgYmVrb21tZW4KCQkJCSAgICBtX3NUZXh0VG9rZW4gKz0gYVRva2VuOwoJCQkJYnJlYWs7CiAgICAgICAgICAgIGNhc2UgSFRNTF9QQVJBQlJFQUtfT0ZGOgogICAgICAgICAgICAgICAgbV9zQ3VycmVudCArPSBtX3NUZXh0VG9rZW47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBIVE1MX1BBUkFCUkVBS19PTjoKICAgICAgICAgICAgICAgIG1fc1RleHRUb2tlbi5FcmFzZSgpOwogICAgICAgICAgICAgICAgYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRURBVEFfT0ZGOgogICAgICAgICAgICAgICAgaWYgKCBtX3NDdXJyZW50LkxlbigpICkKICAgICAgICAgICAgICAgICAgICBtX3NUZXh0VG9rZW4gPSBtX3NDdXJyZW50OwogICAgICAgICAgICAgICAgYWRqdXN0Rm9ybWF0KCk7CgkJCQltX25Db2x1bW5Qb3MrKzsKCQkJCW1fYlNETnVtID0gbV9iSW5UYmwgPSBzYWxfRmFsc2U7CiAgICAgICAgICAgICAgICBtX3NDdXJyZW50LkVyYXNlKCk7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1RBQkxFUk9XX09GRjoKICAgICAgICAgICAgICAgIGlmICggbV9zQ3VycmVudC5MZW4oKSApCiAgICAgICAgICAgICAgICAgICAgbV9zVGV4dFRva2VuID0gbV9zQ3VycmVudDsKICAgICAgICAgICAgICAgIGFkanVzdEZvcm1hdCgpOwoJCQkJbV9uQ29sdW1uUG9zID0gMDsKCQkJCW1fblJvd3MtLTsKICAgICAgICAgICAgICAgIG1fc0N1cnJlbnQuRXJhc2UoKTsKCQkJCWJyZWFrOwoJCX0KCX0KfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE9IVE1MUmVhZGVyOjpmZXRjaE9wdGlvbnMoKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6OmZldGNoT3B0aW9ucyIgKTsKCW1fYkluVGJsID0gc2FsX1RydWU7Cgljb25zdCBIVE1MT3B0aW9ucyogb3B0aW9ucyA9IEdldE9wdGlvbnMoKTsKCXNhbF9JbnQxNiBuQXJyTGVuID0gb3B0aW9ucy0+Q291bnQoKTsKCWZvciAoIHNhbF9JbnQxNiBpID0gMDsgaSA8IG5BcnJMZW47IGkrKyApCgl7CgkJY29uc3QgSFRNTE9wdGlvbiogcE9wdGlvbiA9ICgqb3B0aW9ucylbaV07CgkJc3dpdGNoKCBwT3B0aW9uLT5HZXRUb2tlbigpICkKCQl7CgkJCWNhc2UgSFRNTF9PX1NEVkFMOgoJCQl7CiAgICAgICAgICAgICAgICBtX3NWYWxUb2tlbiA9IHBPcHRpb24tPkdldFN0cmluZygpOwoJCQkJLy9tX3NUZXh0VG9rZW4gPSBwT3B0aW9uLT5HZXRTdHJpbmcoKTsKCQkJCW1fYlNETnVtID0gc2FsX1RydWU7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9PX1NETlVNOgogICAgICAgICAgICAgICAgbV9zTnVtVG9rZW4gPSBwT3B0aW9uLT5HZXRTdHJpbmcoKTsKCQkJYnJlYWs7CgkJfQoJfQp9Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgT0hUTUxSZWFkZXI6OlRhYmxlRGF0YU9uKFN2eENlbGxIb3JKdXN0aWZ5JiBlVmFsLGludCBuVG9rZW4pCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6VGFibGVEYXRhT24iICk7CglEQkdfQ0hLVEhJUyhPSFRNTFJlYWRlcixOVUxMKTsKCXNhbF9Cb29sIGJIb3JKdXN0aWZ5Q2VudGVyVEggPSAoblRva2VuID09IEhUTUxfVEFCTEVIRUFERVJfT04pOwoJY29uc3QgSFRNTE9wdGlvbnMqIHBIdG1sT3B0aW9ucyA9IEdldE9wdGlvbnMoKTsKCXNhbF9JbnQxNiBuQXJyTGVuID0gcEh0bWxPcHRpb25zLT5Db3VudCgpOwoJZm9yICggc2FsX0ludDE2IGkgPSAwOyBpIDwgbkFyckxlbjsgaSsrICkKCXsKCQljb25zdCBIVE1MT3B0aW9uKiBwT3B0aW9uID0gKCpwSHRtbE9wdGlvbnMpW2ldOwoJCXN3aXRjaCggcE9wdGlvbi0+R2V0VG9rZW4oKSApCgkJewoJCQljYXNlIEhUTUxfT19BTElHTjoKCQkJewoJCQkJYkhvckp1c3RpZnlDZW50ZXJUSCA9IHNhbF9GYWxzZTsKCQkJCWNvbnN0IFN0cmluZyYgck9wdFZhbCA9IHBPcHRpb24tPkdldFN0cmluZygpOwoJCQkJaWYgKHJPcHRWYWwuRXF1YWxzSWdub3JlQ2FzZUFzY2lpKCBPT09fU1RSSU5HX1NWVE9PTFNfSFRNTF9BTF9yaWdodCApKQoJCQkJCWVWYWwgPSBTVlhfSE9SX0pVU1RJRllfUklHSFQ7CgkJCQllbHNlIGlmIChyT3B0VmFsLkVxdWFsc0lnbm9yZUNhc2VBc2NpaSggT09PX1NUUklOR19TVlRPT0xTX0hUTUxfQUxfY2VudGVyICkpCgkJCQkJZVZhbCA9IFNWWF9IT1JfSlVTVElGWV9DRU5URVI7CgkJCQllbHNlIGlmIChyT3B0VmFsLkVxdWFsc0lnbm9yZUNhc2VBc2NpaSggT09PX1NUUklOR19TVlRPT0xTX0hUTUxfQUxfbGVmdCApKQoJCQkJCWVWYWwgPSBTVlhfSE9SX0pVU1RJRllfTEVGVDsKCQkJCWVsc2UKCQkJCQllVmFsID0gU1ZYX0hPUl9KVVNUSUZZX1NUQU5EQVJEOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlIEhUTUxfT19XSURUSDoKCQkJCW1fbldpZHRoID0gR2V0V2lkdGhQaXhlbCggcE9wdGlvbiApOwoJCQlicmVhazsKCQl9Cgl9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgT0hUTUxSZWFkZXI6OlRhYmxlRm9udE9uKEZvbnREZXNjcmlwdG9yJiBfckZvbnQsc2FsX0ludDMyICZfclRleHRDb2xvcikKewogICAgUlRMX0xPR0ZJTEVfQ09OVEVYVF9BVVRIT1IoIGFMb2dnZXIsICJtaXNjIiwgIk9ja2UuSmFuc3NlbkBzdW4uY29tIiwgIk9IVE1MUmVhZGVyOjpUYWJsZUZvbnRPbiIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJY29uc3QgSFRNTE9wdGlvbnMqIHBIdG1sT3B0aW9ucyA9IEdldE9wdGlvbnMoKTsKCXNhbF9JbnQxNiBuQXJyTGVuID0gcEh0bWxPcHRpb25zLT5Db3VudCgpOwoJZm9yICggc2FsX0ludDE2IGkgPSAwOyBpIDwgbkFyckxlbjsgaSsrICkKCXsKCQljb25zdCBIVE1MT3B0aW9uKiBwT3B0aW9uID0gKCpwSHRtbE9wdGlvbnMpW2ldOwoJCXN3aXRjaCggcE9wdGlvbi0+R2V0VG9rZW4oKSApCgkJewoJCWNhc2UgSFRNTF9PX0NPTE9SOgoJCQl7CgkJCQlDb2xvciBhQ29sb3I7CgkJCQlwT3B0aW9uLT5HZXRDb2xvciggYUNvbG9yICk7CgkJCQlfclRleHRDb2xvciA9IGFDb2xvci5HZXRSR0JDb2xvcigpOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgSFRNTF9PX0ZBQ0UgOgoJCQl7CgkJCQljb25zdCBTdHJpbmcmIHJGYWNlID0gcE9wdGlvbi0+R2V0U3RyaW5nKCk7CgkJCQlTdHJpbmcgYUZvbnROYW1lOwoJCQkJeHViX1N0ckxlbiBuUG9zID0gMDsKCQkJCXdoaWxlKCBuUG9zICE9IFNUUklOR19OT1RGT1VORCApCgkJCQl7CS8vIEZvbnRsaXN0ZSwgVkNMOiBTZW1pa29sb24gYWxzIFNlcGFyYXRvciwgSFRNTDogS29tbWEKCQkJCQlTdHJpbmcgYUZOYW1lID0gckZhY2UuR2V0VG9rZW4oIDAsICcsJywgblBvcyApOwoJCQkJCWFGTmFtZS5FcmFzZVRyYWlsaW5nQ2hhcnMoKS5FcmFzZUxlYWRpbmdDaGFycygpOwoJCQkJCWlmKCBhRm9udE5hbWUuTGVuKCkgKQoJCQkJCQlhRm9udE5hbWUgKz0gJzsnOwoJCQkJCWFGb250TmFtZSArPSBhRk5hbWU7CgkJCQl9CgkJCQlpZiAoIGFGb250TmFtZS5MZW4oKSApCgkJCQkJX3JGb250Lk5hbWUgPSA6OnJ0bDo6T1VTdHJpbmcoYUZvbnROYW1lKTsKCQkJfQoJCQlicmVhazsKCQljYXNlIEhUTUxfT19TSVpFIDoKCQkJewoJCQkJc2FsX0ludDE2IG5TaXplID0gKHNhbF9JbnQxNikgcE9wdGlvbi0+R2V0TnVtYmVyKCk7CgkJCQlpZiAoIG5TaXplID09IDAgKQoJCQkJCW5TaXplID0gMTsKCQkJCWVsc2UgaWYgKCBuU2l6ZSA8IERCQVVJX0hUTUxfRk9OVFNJWkVTICkKCQkJCQluU2l6ZSA9IERCQVVJX0hUTUxfRk9OVFNJWkVTOwoKCQkJCV9yRm9udC5IZWlnaHQgPSBuU2l6ZTsKCQkJfQoJCQlicmVhazsKCQl9Cgl9Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNhbF9JbnQxNiBPSFRNTFJlYWRlcjo6R2V0V2lkdGhQaXhlbCggY29uc3QgSFRNTE9wdGlvbiogcE9wdGlvbiApCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6R2V0V2lkdGhQaXhlbCIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJY29uc3QgU3RyaW5nJiByT3B0VmFsID0gcE9wdGlvbi0+R2V0U3RyaW5nKCk7CglpZiAoIHJPcHRWYWwuU2VhcmNoKCclJykgIT0gU1RSSU5HX05PVEZPVU5EICkKCXsJLy8gUHJvemVudAoJCURCR19BU1NFUlQoIG1fbkNvbHVtbldpZHRoLCAiV0lEVEggT3B0aW9uOiBtX25Db2x1bW5XaWR0aD09MCB1bmQgV2lkdGglIiApOwoJCXJldHVybiAoc2FsX0ludDE2KSgocE9wdGlvbi0+R2V0TnVtYmVyKCkgKiBtX25Db2x1bW5XaWR0aCkgLyAxMDApOwoJfQoJZWxzZQoJewoJCWlmICggck9wdFZhbC5TZWFyY2goJyonKSAhPSBTVFJJTkdfTk9URk9VTkQgKQoJCXsJLy8gcmVsYXRpdiB6dSB3YXM/IT8KLy8gVE9ETzogQ29sQXJyYXkgYWxsZXIgcmVsYXRpdmVuIFdlcnRlIHNhbW1lbG4gdW5kIGRhbm4gTWFrZUNvbAoJCQlyZXR1cm4gMDsKCQl9CgkJZWxzZQoJCQlyZXR1cm4gKHNhbF9JbnQxNilwT3B0aW9uLT5HZXROdW1iZXIoKTsJLy8gUGl4ZWwKCX0KfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc2FsX0Jvb2wgT0hUTUxSZWFkZXI6OkNyZWF0ZVRhYmxlKGludCBuVG9rZW4pCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6Q3JlYXRlVGFibGUiICk7CglEQkdfQ0hLVEhJUyhPSFRNTFJlYWRlcixOVUxMKTsKCVN0cmluZyBhVGVtcE5hbWUoTW9kdWxlUmVzKFNUUl9UQkxfVElUTEUpKTsKCWFUZW1wTmFtZSA9IGFUZW1wTmFtZS5HZXRUb2tlbigwLCcgJyk7CglhVGVtcE5hbWUgPSBTdHJpbmcoOjpkYnRvb2xzOjpjcmVhdGVVbmlxdWVOYW1lKG1feFRhYmxlcyw6OnJ0bDo6T1VTdHJpbmcoYVRlbXBOYW1lICkpKTsKCglpbnQgblRtcFRva2VuMiA9IG5Ub2tlbjsKCXNhbF9Cb29sIGJDYXB0aW9uID0gc2FsX0ZhbHNlOwoJc2FsX0Jvb2wgYlRhYmxlSGVhZGVyID0gc2FsX0ZhbHNlOwoJU3RyaW5nIGFDb2x1bW5OYW1lOwoJU3Z4Q2VsbEhvckp1c3RpZnkgZVZhbDsKCglTdHJpbmcgYVRhYmxlTmFtZTsKCUZvbnREZXNjcmlwdG9yIGFGb250ID0gOjpkYmF1aTo6Q3JlYXRlRm9udERlc2NyaXB0b3IoQXBwbGljYXRpb246OkdldFNldHRpbmdzKCkuR2V0U3R5bGVTZXR0aW5ncygpLkdldEFwcEZvbnQoKSk7CglzYWxfSW50MzIgblRleHRDb2xvciA9IDA7CglkbwoJewoJCXN3aXRjaChuVG1wVG9rZW4yKQoJCXsKCQkJY2FzZSBIVE1MX1RFWFRUT0tFTjoKCQkJY2FzZSBIVE1MX1NJTkdMRUNIQVI6CgkJCQlpZihiVGFibGVIZWFkZXIpCgkJCQkJYUNvbHVtbk5hbWUgKz0gYVRva2VuOwoJCQkJaWYoYkNhcHRpb24pCgkJCQkJYVRhYmxlTmFtZSArPSBhVG9rZW47CgkJCQlicmVhazsKICAgICAgICAgICAgY2FzZSBIVE1MX1BBUkFCUkVBS19PRkY6CiAgICAgICAgICAgICAgICBtX3NDdXJyZW50ICs9IGFDb2x1bW5OYW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgSFRNTF9QQVJBQlJFQUtfT046CiAgICAgICAgICAgICAgICBtX3NUZXh0VG9rZW4uRXJhc2UoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJCQljYXNlIEhUTUxfVEFCTEVEQVRBX09OOgogICAgICAgICAgICAgICAgLy8gbV9iQXBwZW5kRmlyc3RMaW5lID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vIHJ1biB0aHJvdWdoCgkJCWNhc2UgSFRNTF9UQUJMRUhFQURFUl9PTjoKCQkJCVRhYmxlRGF0YU9uKGVWYWwsblRtcFRva2VuMik7CgkJCQliVGFibGVIZWFkZXIgPSBzYWxfVHJ1ZTsKCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfVEFCTEVEQVRBX09GRjoKICAgICAgICAgICAgICAgIC8vIG1fYkFwcGVuZEZpcnN0TGluZSA9IHRydWU7CiAgICAgICAgICAgICAgICAvLyBydW4gdGhyb3VnaAoJCQljYXNlIEhUTUxfVEFCTEVIRUFERVJfT0ZGOgoJCQkJewoJCQkJCWFDb2x1bW5OYW1lLkVyYXNlTGVhZGluZ0NoYXJzKCk7CgkJCQkJYUNvbHVtbk5hbWUuRXJhc2VUcmFpbGluZ0NoYXJzKCk7CgkJCQkJaWYgKCFhQ29sdW1uTmFtZS5MZW4oKSB8fCBtX2JBcHBlbmRGaXJzdExpbmUgKQoJCQkJCQlhQ29sdW1uTmFtZSA9IFN0cmluZyhNb2R1bGVSZXMoU1RSX0NPTFVNTl9OQU1FKSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIG1fc0N1cnJlbnQuTGVuKCkgKQogICAgICAgICAgICAgICAgICAgICAgICBhQ29sdW1uTmFtZSA9IG1fc0N1cnJlbnQ7CgogICAgICAgICAgICAgICAgICAgIGFDb2x1bW5OYW1lLkVyYXNlTGVhZGluZ0NoYXJzKCk7CgkJCQkJYUNvbHVtbk5hbWUuRXJhc2VUcmFpbGluZ0NoYXJzKCk7CgkJCQkJQ3JlYXRlRGVmYXVsdENvbHVtbihhQ29sdW1uTmFtZSk7CgkJCQkJYUNvbHVtbk5hbWUuRXJhc2UoKTsKICAgICAgICAgICAgICAgICAgICBtX3NDdXJyZW50LkVyYXNlKCk7CgoJCQkJCWVWYWwgPSBTVlhfSE9SX0pVU1RJRllfU1RBTkRBUkQ7CgkJCQkJYlRhYmxlSGVhZGVyID0gc2FsX0ZhbHNlOwoJCQkJfQoJCQkJYnJlYWs7CgoJCQljYXNlIEhUTUxfVElUTEVfT046CgkJCWNhc2UgSFRNTF9DQVBUSU9OX09OOgoJCQkJYkNhcHRpb24gPSBzYWxfVHJ1ZTsKCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfVElUTEVfT0ZGOgoJCQljYXNlIEhUTUxfQ0FQVElPTl9PRkY6CgkJCQlhVGFibGVOYW1lLkVyYXNlTGVhZGluZ0NoYXJzKCk7CgkJCQlhVGFibGVOYW1lLkVyYXNlVHJhaWxpbmdDaGFycygpOwoJCQkJaWYoIWFUYWJsZU5hbWUuTGVuKCkpCgkJCQkJYVRhYmxlTmFtZSA9IFN0cmluZyg6OmRidG9vbHM6OmNyZWF0ZVVuaXF1ZU5hbWUobV94VGFibGVzLDo6cnRsOjpPVVN0cmluZyhhVGFibGVOYW1lKSkpOwoJCQkJZWxzZQoJCQkJCWFUYWJsZU5hbWUgPSBhVGVtcE5hbWU7CgkJCQliQ2FwdGlvbiA9IHNhbF9GYWxzZTsKCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfRk9OVF9PTjoKCQkJCVRhYmxlRm9udE9uKGFGb250LG5UZXh0Q29sb3IpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9CT0xEX09OOgoJCQkJYUZvbnQuV2VpZ2h0ID0gOjpjb206OnN1bjo6c3Rhcjo6YXd0OjpGb250V2VpZ2h0OjpCT0xEOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9JVEFMSUNfT046CgkJCQlhRm9udC5TbGFudCA9IDo6Y29tOjpzdW46OnN0YXI6OmF3dDo6Rm9udFNsYW50X0lUQUxJQzsKCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfVU5ERVJMSU5FX09OOgoJCQkJYUZvbnQuVW5kZXJsaW5lID0gOjpjb206OnN1bjo6c3Rhcjo6YXd0OjpGb250VW5kZXJsaW5lOjpTSU5HTEU7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1NUUklLRV9PTjoKCQkJCWFGb250LlN0cmlrZW91dCA9IDo6Y29tOjpzdW46OnN0YXI6OmF3dDo6Rm9udFN0cmlrZW91dDo6U0lOR0xFOwoJCQkJYnJlYWs7CgkJfQoJfQoJd2hpbGUoKG5UbXBUb2tlbjIgPSBHZXROZXh0VG9rZW4oKSkgIT0gSFRNTF9UQUJMRVJPV19PRkYpOwoKICAgIGlmICggbV9zQ3VycmVudC5MZW4oKSApCiAgICAgICAgYUNvbHVtbk5hbWUgPSBtX3NDdXJyZW50OwogICAgYUNvbHVtbk5hbWUuRXJhc2VMZWFkaW5nQ2hhcnMoKTsKCWFDb2x1bW5OYW1lLkVyYXNlVHJhaWxpbmdDaGFycygpOwoJaWYoYUNvbHVtbk5hbWUuTGVuKCkpCgkJQ3JlYXRlRGVmYXVsdENvbHVtbihhQ29sdW1uTmFtZSk7CgoJaWYgKCBtX3ZEZXN0VmVjdG9yLmVtcHR5KCkgKQoJCXJldHVybiBzYWxfRmFsc2U7CgoJaWYoIWFUYWJsZU5hbWUuTGVuKCkpCgkJYVRhYmxlTmFtZSA9IGFUZW1wTmFtZTsKCgltX2JJblRibAkJPSBzYWxfRmFsc2U7CgltX2JGb3VuZFRhYmxlCT0gc2FsX1RydWU7CgoJaWYgKCBpc0NoZWNrRW5hYmxlZCgpICkKCQlyZXR1cm4gc2FsX1RydWU7CgoJcmV0dXJuICFleGVjdXRlV2l6YXJkKGFUYWJsZU5hbWUsbWFrZUFueShuVGV4dENvbG9yKSxhRm9udCkgJiYgbV94VGFibGUuaXMoKTsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE9IVE1MUmVhZGVyOjpzZXRUZXh0RW5jb2RpbmcoKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6OnNldFRleHRFbmNvZGluZyIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJbV9iTWV0YU9wdGlvbnMgPSBzYWxfVHJ1ZTsKICAgIFBhcnNlTWV0YU9wdGlvbnMoTlVMTCwgTlVMTCk7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgT0hUTUxSZWFkZXI6OnJlbGVhc2UoKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6OnJlbGVhc2UiICk7CglEQkdfQ0hLVEhJUyhPSFRNTFJlYWRlcixOVUxMKTsKCVJlbGVhc2VSZWYoKTsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUeXBlU2VsZWN0aW9uUGFnZUZhY3RvcnkgT0hUTUxSZWFkZXI6OmdldFR5cGVTZWxlY3Rpb25QYWdlRmFjdG9yeSgpCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6Z2V0VHlwZVNlbGVjdGlvblBhZ2VGYWN0b3J5IiApOwoJREJHX0NIS1RISVMoT0hUTUxSZWFkZXIsTlVMTCk7CiAgICByZXR1cm4gJk9XaXpIVE1MRXh0ZW5kOjpDcmVhdGU7Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K