ZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuYyBiL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYzI5NzZlCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5jCkBAIC0wLDAgKzEsMTM2MCBAQAorLyoKKwlGaWxlOgkJQ0ZNTGF0ZUltcG9ydC5jCisKKwlDb250YWluczoJSW1wbGVtZW50YXRpb24gb2YgQ0ZNIGxhdGUgaW1wb3J0IGxpYnJhcnkuCisKKwlXcml0dGVuIGJ5OglRdWlubgorCisJQ29weXJpZ2h0OglDb3B5cmlnaHQgqSAxOTk5IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorCisJCQkJWW91IG1heSBpbmNvcnBvcmF0ZSB0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBpbnRvIHlvdXIgcHJvZ3JhbShzKSB3aXRob3V0CisJCQkJcmVzdHJpY3Rpb24uIFRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGhhcyBiZWVuIHByb3ZpZGVkICJBUyBJUyIgYW5kIHRoZQorCQkJCXJlc3BvbnNpYmlsaXR5IGZvciBpdHMgb3BlcmF0aW9uIGlzIHlvdXJzLiBZb3UgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gcmVkaXN0cmlidXRlCisJCQkJdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgYXMgIkFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSIgYWZ0ZXIgaGF2aW5nIG1hZGUKKwkJCQljaGFuZ2VzLiBJZiB5b3UncmUgZ29pbmcgdG8gcmUtZGlzdHJpYnV0ZSB0aGUgc291cmNlLCB3ZSByZXF1aXJlIHRoYXQgeW91IG1ha2UKKwkJCQlpdCBjbGVhciBpbiB0aGUgc291cmNlIHRoYXQgdGhlIGNvZGUgd2FzIGRlc2NlbmRlZCBmcm9tIEFwcGxlIHNhbXBsZSBzb3VyY2UKKwkJCQljb2RlLCBidXQgdGhhdCB5b3UndmUgbWFkZSBjaGFuZ2VzLgorCisJQ2hhbmdlIEhpc3RvcnkgKG1vc3QgcmVjZW50IGZpcnN0KToKKworICAgICAgICA8MTM+ICAgICAyNC85LzAxICAgIFF1aW5uICAgRml4ZXMgdG8gY29tcGlsZSB3aXRoIEMrKyBhY3RpdmF0ZWQuCisgICAgICAgIDwxMj4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBbMjcxMDQ4OV0gRml4IHR5cG8gaW4gdGhlIGNvbW1lbnRzIGZvciBGcmFnbWVudExvb2t1cC4KKyAgICAgICAgPDExPiAgICAgMjEvOS8wMSAgICBRdWlubiAgIENoYW5nZXMgZm9yIENXUHJvNyBNYWNoLU8gYnVpbGQuCisgICAgICAgIDwxMD4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDb3JyZWN0ZWQgaW1wbGVtZW50YXRpb24gb2Yga1BFRlJlbG9jU21CeVNlY3Rpb24uIEFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgb2Yga1BFRlJlbG9jU2V0UG9zaXRpb24gYW5kIGtQRUZSZWxvY0xnQnlJbXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIGNvZGUgY29udHJpYnV0ZWQgYnkgRXJpYyBHcmFudCwgTmVkIEhvbGJyb29rLCBhbmQgU3RldmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEthbGt3YXJmKSwgYWx0aG91Z2ggSSBjYW4ndCB0ZXN0IHRoZW0geWV0LgorICAgICAgICAgPDk+ICAgICAxOS85LzAxICAgIFF1aW5uICAgV2Ugbm93IGhhbmRsZSB1bnBhY2tlZCBkYXRhIHNlY3Rpb25zLCBjb3VydGVzeSBvZiBzb21lIGNvZGUgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVkIEhvbGJyb29rLgorICAgICAgICAgPDg+ICAgICAxOS85LzAxICAgIFF1aW5uICAgTWlub3IgZml4ZXMgZm9yIHRoZSBwcmV2aW91cyBjaGVja2luLiBVcGRhdGVkIHNvbWUgY29tbWVudHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraWxsZWQgc29tZSBkZWFkIGNvZGUuCisgICAgICAgICA8Nz4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBTaW1wbGlmaWVkIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gYWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEVyaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW50LiBZb3Ugbm8gbG9uZ2VyIGhhdmUgdG8gQ0ZNIGV4cG9ydCBhIGR1bW15IGZ1bmN0aW9uOyB5b3UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBqdXN0IHBhc3MgaW4gdGhlIGFkZHJlc3Mgb2YgeW91ciBmcmFnbWVudCdzIGluaXQgcm91dGluZS4KKyAgICAgICAgIDw2PiAgICAgMTUvMi8wMSAgICBRdWlubiAgIE1vZGlmeSBjb21waWxlLXRpbWUgd2FybmluZ3MgdG8gY29tcGxhaW4gaWYgeW91IHRyeSB0byBidWlsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtb2R1bGUgaW50byBhIE1hY2gtTyBiaW5hcnkuCisgICAgICAgICA8NT4gICAgICA1LzIvMDEgICAgUXVpbm4gICBSZW1vdmVkIHJlZHVuZGFudCBhc3NpZ25tZW50IGluIENGTUxhdGVJbXBvcnRDb3JlLgorICAgICAgICAgPDQ+ICAgIDMwLzExLzAwICAgIFF1aW5uICAgQWRkZWQgY29tbWVudCBhYm91dCBmdXR1cmUgb2YgZGF0YSBzeW1ib2xzIGluIENGLgorICAgICAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZCdW5kbGUgc3VwcG9ydC4KKyAgICAgICAgIDwyPiAgICAxOC8xMC85OSAgICBRdWlubiAgIFJlbmFtZWQgQ0ZNTGF0ZUltcG9ydCB0byBDRk1MYXRlSW1wb3J0TGlicmFyeSB0byBhbGxvdyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgorICAgICAgICAgPDE+ICAgICAxNS82Lzk5ICAgIFF1aW5uICAgRmlyc3QgY2hlY2tlZCBpbi4KKyovCisKKy8vIFRvIERvIExpc3Q6CisvLworLy8gbyBnZXQgcmlkIG9mIGRlcGVuZGVuY2Ugb24gQU5TSSAic3RyaW5nLmgiLCBidXQgaG93PworLy8KKy8vIERvbmU6CisvLworLy8gwyBpbnZlc3RpZ2F0ZSBhbHRlcm5hdGl2ZSBBUElzLCBsaWtlIGFuIGV4dGVybmFsIGxvb2t1cCByb3V0aW5lCisvLyAgIHJlbmFtZWQgQ0ZNTGF0ZUltcG9ydCB0byBDRk1MYXRlSW1wb3J0TGlicmFyeSB0byBhbGxvdyBmb3IKKy8vICAgZnV0dXJlIGV4cGFuc2lvbiBvZiB0aGUgQVBJcyBmb3IgdGhpbmdzIGxpa2UgQ0ZNTGF0ZUltcG9ydFN5bWJvbAorLy8gwyB0ZXN0IHdpdGggbm9uLXplcm8gZnJhZ21lbnQgb2Zmc2V0IGluIHRoZSBmaWxlCisvLyDDIHRlc3QgbW9yZSB3aXRoIE1QVyBmcmFnbWVudHMKKy8vIMMgdGVzdCBkYXRhIGltcG9ydHMKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gTW9yZUlzQmV0dGVyIFNldHVwCisKKy8vI2luY2x1ZGUgIk1vcmVTZXR1cC5oIgorI2RlZmluZSBNb3JlQXNzZXJ0KHgpICh0cnVlKQorI2RlZmluZSBNb3JlQXNzZXJ0USh4KQorCisvLyBNYWMgT1MgSW50ZXJmYWNlcworCisjaWYgISBNT1JFX0ZSQU1FV09SS19JTkNMVURFUworCSNpbmNsdWRlIDxDb2RlRnJhZ21lbnRzLmg+CisJI2luY2x1ZGUgPFBFRkJpbmFyeUZvcm1hdC5oPgorI2VuZGlmCisKKy8vIFN0YW5kYXJkIEMgSW50ZXJmYWNlcworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIE1JQiBQcm90b3R5cGVzCisKKy8vI2luY2x1ZGUgIk1vcmVJbnRlcmZhY2VMaWIuaCIKKyNkZWZpbmUgTW9yZUJsb2NrWmVybyBCbG9ja1plcm8KKworLy8gT3VyIFByb3RvdHlwZXMKKworI2luY2x1ZGUgIkNGTUxhdGVJbXBvcnQuaCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2lmIFRBUkdFVF9SVF9NQUNfTUFDSE8KKwkjZXJyb3IgQ0ZNTGF0ZUltcG9ydCBpcyBub3Qgc3VpdGFibGUgZm9yIHVzZSBpbiBhIE1hY2gtTyBwcm9qZWN0LgorI2VsaWYgIVRBUkdFVF9SVF9NQUNfQ0ZNIHx8ICFUQVJHRVRfQ1BVX1BQQworCSNlcnJvciBDRk1MYXRlSW1wb3J0IGhhcyBub3QgYmVlbiBxdWFsaWZpZWQgZm9yIDY4SyBvciBDRk0tNjhLIHVzZS4KKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI3ByYWdtYSBtYXJrIC0tLS0tIFV0aWxpdHkgUm91dGluZXMgLS0tLS0KKworc3RhdGljIE9TU3RhdHVzIEZTUmVhZEF0T2Zmc2V0KFNJbnQxNiByZWZOdW0sIFNJbnQzMiBvZmZzZXQsIFNJbnQzMiBjb3VudCwgdm9pZCAqYnVmZmVyKQorCS8vIEEgY29udmVuaWVudCB3cmFwcGVyIGFyb3VuZCBQQlJlYWQgd2hpY2ggaGFzIHR3byBhZHZhbnRhZ2VzCisJLy8gb3ZlciBGU1JlYWQuICBGaXJzdCwgaXQgdGFrZXMgY291bnQgYXMgYSB2YWx1ZSBwYXJhbWV0ZXIuCisJLy8gU2Vjb25kLCBpdCByZWFkcyBmcm9tIGFuIGFyYml0cmFyeSBvZmZzZXQgaW50byB0aGUgZmlsZSwKKwkvLyB3aGljaCBhdm9pZHMgYSBidW5jaCBvZiBTZXRGUG9zIGNhbGxzLgorCS8vCisJLy8gSSBndWVzcyB0aGlzIHNob3VsZCBnbyBpbnRvICJNb3JlRmlsZXMuaCIsIGJ1dCBJJ20gbm90IHN1cmUKKwkvLyBob3cgd2UncmUgZ29pbmcgdG8gaW50ZWdyYXRlIHN1Y2ggYSBjb25jZXB0IGludG8gTUlCIHlldC4KK3sKKwlQYXJhbUJsb2NrUmVjIHBiOworCQorCXBiLmlvUGFyYW0uaW9SZWZOdW0gICAgID0gcmVmTnVtOworCXBiLmlvUGFyYW0uaW9CdWZmZXIgICAgID0gKFB0cikgYnVmZmVyOworCXBiLmlvUGFyYW0uaW9SZXFDb3VudCAgID0gY291bnQ7CisJcGIuaW9QYXJhbS5pb1Bvc01vZGUgICAgPSBmc0Zyb21TdGFydDsKKwlwYi5pb1BhcmFtLmlvUG9zT2Zmc2V0ICA9IG9mZnNldDsKKwkKKwlyZXR1cm4gUEJSZWFkU3luYygmcGIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI3ByYWdtYSBtYXJrIC0tLS0tIExhdGUgSW1wb3J0IEVuZ2luZSAtLS0tLQorCisvLyBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIHRoZSBjb3JlIGRhdGEgc3RydWN0dXJlIG9mIHRoZSBsYXRlIGltcG9ydAorLy8gZW5naW5lLiAgSXQgYmFzaWNhbGx5IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmFnbWVudCB3ZSdyZSBnb2luZworLy8gdG8gZml4IHVwLiAgSXQgc3RhcnRzIG9mZiB3aXRoIHRoZSBmaXJzdCB0aHJlZSBmaWVsZHMsIHdoaWNoIGFyZQorLy8gcHJvdmlkZWQgYnkgdGhlIGNsaWVudC4gIFRoZW4sIGFzIHdlIHByb2NlZGUgdGhyb3VnaCB0aGUgb3BlcmF0aW9uLAorLy8gd2UgZmlsbCBvdXQgbW9yZSBmaWVsZHMuCisKK3N0cnVjdCBGcmFnVG9GaXhJbmZvIHsKKwlDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IJbG9jYXRvcjsJCQkJLy8gSG93IHRvIGZpbmQgdGhlIGZyYWdtZW50J3MgY29udGFpbmVyLgorCUNGcmFnQ29ubmVjdGlvbklEIAkJCWNvbm5JRDsJCQkJCS8vIENGTSBjb25uZWN0aW9uIHRvIHRoZSBmcmFnbWVudC4KKwlDRnJhZ0luaXRGdW5jdGlvbiAJCQlpbml0Um91dGluZTsJCQkvLyBUaGUgQ0ZNIGluaXQgcm91dGluZSBmb3IgdGhlIGZyYWdtZW50LgorCVBFRkNvbnRhaW5lckhlYWRlciAJCQljb250YWluZXJIZWFkZXI7CQkvLyBUaGUgQ0ZNIGhlYWRlciwgcmVhZCBpbiBmcm9tIHRoZSBjb250YWluZXIuCisJUEVGU2VjdGlvbkhlYWRlcgkJCSpzZWN0aW9uSGVhZGVyczsJCS8vIFRoZSBDRk0gc2VjdGlvbiBoZWFkZXJzLiAgQSBwb2ludGVyIGJsb2NrIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgY29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCBlbGVtZW50cy4KKwlQRUZMb2FkZXJJbmZvSGVhZGVyCQkJKmxvYWRlclNlY3Rpb247CQkJLy8gVGhlIGVudGlyZSBDRk0gbG9hZGVyIHNlY3Rpb24gaW4gYSBwb2ludGVyIGJsb2NrLgorCVNJbnQxNgkJCQkJCWZpbGVSZWY7CQkJCS8vIEEgcmVhZC1vbmx5IHBhdGggdG8gdGhlIENGTSBjb250YWluZXIuICBXZSBrZWVwIHRoaXMgaGVyZSBiZWNhdXNlIG9uZSB0aGF0IG9uZSByb3V0aW5lIG5lZWRzIHRvIHJlYWQgZnJvbSB0aGUgY29udGFpbmVyLgorCXZvaWQgCQkJCQkJKnNlY3Rpb24wQmFzZTsJCQkvLyBUaGUgYmFzZSBhZGRyZXNzIG9mIHNlY3Rpb24gMCwgd2hpY2ggd2UgZ28gdGhyb3VnaCBob29wcyB0byBjYWxjdWxhdGUuCisJdm9pZCAJCQkJCQkqc2VjdGlvbjFCYXNlOwkJCS8vIFRoZSBiYXNlIGFkZHJlc3Mgb2Ygc2VjdGlvbiAxLCB3aGljaCB3ZSBnbyB0aHJvdWdoIGhvb3BzIHRvIGNhbGN1bGF0ZS4KKwlCb29sZWFuCQkJCQkJZGlzcG9zZVNlY3Rpb25Qb2ludGVyczsJLy8gU2VlIGJlbG93LgorfTsKK3R5cGVkZWYgc3RydWN0IEZyYWdUb0ZpeEluZm8gRnJhZ1RvRml4SW5mbzsKKworLy8gVGhlIGRpc3Bvc2VTZWN0aW9uUG9pbnRlcnMgQm9vbGVhbiBpcyBkZXNpZ25lZCBmb3IgZnV0dXJlIGNvb2wgVk0KKy8vIHN1cHBvcnQuICBJZiBWTSBpcyBvbiwgdGhlIGVudGlyZSBjb2RlIGZyYWdtZW50IGlzIGZpbGUgbWFwcGVkIGludG8KKy8vIGhpZ2ggbWVtb3J5LCBpbmNsdWRpbmcgdGhlIGRhdGEgd2UncmUgZm9yY2VkIHRvIGFsbG9jYXRlIHRoZQorLy8gc2VjdGlvbkhlYWRlcnMgYW5kIGxvYWRlclNlY3Rpb24gbWVtb3J5IGJsb2NrcyB0byBtYWludGFpbi4gIElmCisvLyB3ZSBjb3VsZCBmaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRpcmUgZmlsZSBtYXBwZWQgY29udGFpbmVyLAorLy8gd2UgY291bGQgYWNjZXNzIHRoZSBpbmZvcm1hdGlvbiBkaXJlY3RseSBmcm9tIHRoZXJlIGFuZCB0aHVzCisvLyB3ZSB3b3VsZG4ndCBuZWVkIHRvIGFsbG9jYXRlIChvciBkaXNwb3NlIG9mKSB0aGUgbWVtb3J5IGJsb2NrcworLy8gZm9yIHNlY3Rpb25IZWFkZXJzIGFuZCBsb2FkZXJTZWN0aW9uLgorLy8KKy8vIEkgaGF2ZW4ndCBpbXBsZW1lbnRlZCB0aGlzIHlldCBiZWNhdXNlIGEpIEknbSBub3Qgc3VyZSBob3cgdG8gZG8KKy8vIGl0IHdpdGggZG9jdW1lbnRlZCBBUElzLCBhbmQgYikgSSBjb3VsZG4ndCBiZSBib3RoZXJlZCwgYnV0CisvLyBkaXNwb3NlU2VjdGlvblBvaW50ZXJzIHJlbWFpbnMgYXMgdmVzdGlnaWFsIHN1cHBvcnQgZm9yIHRoZSBjb25jZXB0LgorCitzdGF0aWMgT1NTdGF0dXMgUmVhZENvbnRhaW5lckJhc2ljcyhGcmFnVG9GaXhJbmZvICpmcmFnVG9GaXgpCisJLy8gUmVhZHMgc29tZSBiYXNpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb250YWluZXIgb2YgdGhlCisJLy8gZnJhZ21lbnQgdG8gZml4IGFuZCBzdG9yZXMgaXQgaW4gdmFyaW91cyBmaWVsZHMgb2YKKwkvLyBmcmFnVG9GaXguICBUaGlzIGluY2x1ZGVzOgorCS8vCisJLy8gbyBjb250YWluZXJIZWFkZXIgLS0gVGhlIGNvbnRhaW4gaGVhZGVyIGl0c2VsZi4KKwkvLyBvIHNlY3Rpb25IZWFkZXJzICAtLSBUaGUgYXJyYXkgb2Ygc2VjdGlvbiBoZWFkZXJzIChpbiBhIG5ld2x5IGFsbG9jYXRlZCBwb2ludGVyIGJsb2NrKS4KKwkvLyBvIGxvYWRlclNlY3Rpb24gICAtLSBUaGUgZW50aXJlIGxvYWRlciBzZWN0aW9uIChpbiBhIG5ld2x5IGFsbG9jYXRlZCBwb2ludGVyIGJsb2NrKS4KKwkvLworCS8vIEFsc28gc2V0cyBkaXNwb3NlU2VjdGlvblBvaW50ZXJzIHRvIGluZGljYXRlIHdoZXRoZXIKKwkvLyB0aGUgbGFzdCB0d28gcG9pbnRlcnMgc2hvdWxkIGJlIGRpc3Bvc2VkIG9mLgorCS8vCisJLy8gRmluYWxseSwgaXQgbGVhdmVzIHRoZSBjb250YWluZXIgZmlsZSBvcGVuIGZvciBsYXRlcgorCS8vIGZvbGtzIHdobyB3YW50IHRvIHJlYWQgZGF0YSBmcm9tIGl0LgoreworCU9TU3RhdHVzIAllcnI7CisJVUludDE2IAkJc2VjdGlvbkluZGV4OworCUJvb2xlYW4gCWZvdW5kOworCisJTW9yZUFzc2VydFEoZnJhZ1RvRml4ICE9IG5pbCk7CisJTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2NhdG9yLmZpbGVTcGVjICE9IG5pbCk7CisJTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5jb25uSUQgIT0gbmlsKTsKKwlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gPT0gbmlsKTsKKwlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzID09IG5pbCk7CisJTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5maWxlUmVmID09IDApOworCQorCWZyYWdUb0ZpeC0+ZGlzcG9zZVNlY3Rpb25Qb2ludGVycyA9IHRydWU7CisJCisJLy8gT3BlbiB1cCB0aGUgZmlsZSwgcmVhZCB0aGUgY29udGFpbmVyIGhlYWQsIHRoZW4gcmVhZCBpbgorCS8vIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzLCB0aGVuIGdvIGxvb2tpbmcgdGhyb3VnaCB0aGUKKwkvLyBzZWN0aW9uIGhlYWRlcnMgZm9yIHRoZSBsb2FkZXIgc2VjdGlvbiAoUEVGIGRlZmluZXMKKwkvLyB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSkuCisJCisJZXJyID0gRlNwT3BlbkRGKGZyYWdUb0ZpeC0+bG9jYXRvci5maWxlU3BlYywgZnNSZFBlcm0sICZmcmFnVG9GaXgtPmZpbGVSZWYpOworCWlmIChlcnIgPT0gbm9FcnIpIHsKKwkJZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLAorCQkJCQkJCQlmcmFnVG9GaXgtPmxvY2F0b3Iub2Zmc2V0LAorCQkJCQkJCQlzaXplb2YoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIpLAorCQkJCQkJCQkmZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIpOworCQlpZiAoZXJyID09IG5vRXJyKSB7CisJCQlpZiAoICAgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMSAhPSBrUEVGVGFnMQorCQkJCXx8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzIgIT0ga1BFRlRhZzIKKwkJCQl8fCBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5hcmNoaXRlY3R1cmUgIT0ga0NvbXBpbGVkQ0ZyYWdBcmNoCisJCQkJfHwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuZm9ybWF0VmVyc2lvbiAhPSBrUEVGVmVyc2lvbikgeworCQkJCWVyciA9IGNmcmFnRnJhZ21lbnRGb3JtYXRFcnI7CisJCQl9CisJCX0KKwkJaWYgKGVyciA9PSBub0VycikgeworCQkJZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyA9IChQRUZTZWN0aW9uSGVhZGVyICopIE5ld1B0cihmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5zZWN0aW9uQ291bnQgKiBzaXplb2YoUEVGU2VjdGlvbkhlYWRlcikpOworCQkJZXJyID0gTWVtRXJyb3IoKTsKKwkJfQorCQlpZiAoZXJyID09IG5vRXJyKSB7CisJCQllcnIgPSBGU1JlYWRBdE9mZnNldChmcmFnVG9GaXgtPmZpbGVSZWYsCisJCQkJCQkJCQlmcmFnVG9GaXgtPmxvY2F0b3Iub2Zmc2V0ICsgc2l6ZW9mKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyKSwKKwkJCQkJCQkJCWZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAqIHNpemVvZihQRUZTZWN0aW9uSGVhZGVyKSwgCisJCQkJCQkJCQlmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzKTsKKwkJfQorCQlpZiAoZXJyID09IG5vRXJyKSB7CisJCQlzZWN0aW9uSW5kZXggPSAwOworCQkJZm91bmQgPSBmYWxzZTsKKwkJCXdoaWxlICggc2VjdGlvbkluZGV4IDwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICYmICEgZm91bmQgKSB7CisJCQkJZm91bmQgPSAoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLnNlY3Rpb25LaW5kID09IGtQRUZMb2FkZXJTZWN0aW9uKTsKKwkJCQlpZiAoICEgZm91bmQgKSB7CisJCQkJCXNlY3Rpb25JbmRleCArPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoZXJyID09IG5vRXJyICYmICEgZm91bmQpIHsKKwkJCWVyciA9IGNmcmFnTm9TZWN0aW9uRXJyOworCQl9CisJCQorCQkvLyBOb3cgcmVhZCBhbGxvY2F0ZSBhIHBvaW50ZXIgYmxvY2sgYW5kIHJlYWQgdGhlIGxvYWRlciBzZWN0aW9uIGludG8gaXQuCisJCQorCQlpZiAoZXJyID09IG5vRXJyKSB7CisJCQlmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gPSAoUEVGTG9hZGVySW5mb0hlYWRlciAqKSBOZXdQdHIoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLmNvbnRhaW5lckxlbmd0aCk7CisJCQllcnIgPSBNZW1FcnJvcigpOworCQl9CisJCWlmIChlcnIgPT0gbm9FcnIpIHsKKwkJCWVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwgCisJCQkJCQkJCQlmcmFnVG9GaXgtPmxvY2F0b3Iub2Zmc2V0ICsgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLmNvbnRhaW5lck9mZnNldCwKKwkJCQkJCQkJCWZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5jb250YWluZXJMZW5ndGgsIAorCQkJCQkJCQkJZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uKTsKKwkJfQkJCQkKKwl9CisJCisJLy8gTm8gY2xlYW4gdXAuICBUaGUgY2xpZW50IG11c3QgaW5pdCBmcmFnVG9GaXggdG8gemVyb3MgYW5kIHRoZW4KKwkvLyBjbGVhbiB1cCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgcmV0dXJuIGFuIGVycm9yLgorCQkKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgVUludDMyIERlY29kZVZDb3VudFZhbHVlKGNvbnN0IFVJbnQ4ICpzdGFydCwgVUludDMyICpvdXRDb3VudCkKKwkvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgbGVuZ3RoIFBFRiB2YWx1ZSwgCisJLy8gd29yayBvdXQgdGhlIHZhbHVlIChpbiAqb3V0Q291bnQpLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIAorCS8vIGNvbnN1bWVkIGJ5IHRoZSB2YWx1ZS4KK3sKKwlVSW50OCAqCQkJYnl0ZVB0cjsKKwlVSW50OAkJCWJ5dGU7CisJVUludDMyCQkJY291bnQ7CisJCisJYnl0ZVB0ciA9IChVSW50OCAqKXN0YXJ0OworCQorCS8vIENvZGUgdGFrZW4gZnJvbSAiUEVGQmluYXJ5Rm9ybWF0LmgiLgorCWNvdW50ID0gMDsKKwlkbyB7CisJCWJ5dGUgPSAqYnl0ZVB0cisrOworCQljb3VudCA9IChjb3VudCA8PCBrUEVGUGtEYXRhVkNvdW50U2hpZnQpIHwgKGJ5dGUgJiBrUEVGUGtEYXRhVkNvdW50TWFzayk7CisJfSB3aGlsZSAoKGJ5dGUgJiBrUEVGUGtEYXRhVkNvdW50RW5kTWFzaykgIT0gMCk7CisJCisJKm91dENvdW50ID0gY291bnQ7CisJcmV0dXJuIGJ5dGVQdHIgLSBzdGFydDsKK30KKworc3RhdGljIFVJbnQzMiBEZWNvZGVJbnN0ckNvdW50VmFsdWUoY29uc3QgVUludDggKmluT3BTdGFydCwgVUludDMyICpvdXRDb3VudCkKKwkvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGFuIG9wY29kZSAoaW5PcFN0YXJ0KSwgd29yayBvdXQgdGhlIAorCS8vIGNvdW50IGFyZ3VtZW50IGZvciB0aGF0IG9wY29kZSAoKm91dENvdW50KS4gIFJldHVybnMgdGhlIG51bWJlciBvZiAKKwkvLyBieXRlcyBjb25zdW1lZCBieSB0aGUgb3Bjb2RlIGFuZCBjb3VudCBjb21iaW5hdGlvbi4KK3sKKwlNb3JlQXNzZXJ0UShpbk9wU3RhcnQgIT0gbmlsKTsKKwlNb3JlQXNzZXJ0UShvdXRDb3VudCAgIT0gbmlsKTsKKwkKKwlpZiAoUEVGUGtEYXRhQ291bnQ1KCppbk9wU3RhcnQpICE9IDApCisJeworCQkvLyBTaW1wbGUgY2FzZSwgY291bnQgZW5jb2RlZCBpbiBvcGNvZGUuCisJCSpvdXRDb3VudCA9IFBFRlBrRGF0YUNvdW50NSgqaW5PcFN0YXJ0KTsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2UKKwl7CisJCS8vIFZhcmlhYmxlLWxlbmd0aCBjYXNlLgorCQlyZXR1cm4gMSArIERlY29kZVZDb3VudFZhbHVlKGluT3BTdGFydCArIDEsIG91dENvdW50KTsKKwl9Cit9CisKK3N0YXRpYyBPU1N0YXR1cyBVbnBhY2tQRUZEYXRhU2VjdGlvbihjb25zdCBVSW50OCAqIGNvbnN0IHBhY2tlZERhdGEsICAgVUludDMyIHBhY2tlZFNpemUsCisJCQkJCQkJCSAgICAgICAgICAgVUludDggKiBjb25zdCB1bnBhY2tlZERhdGEsIFVJbnQzMiB1bnBhY2tlZFNpemUpCit7CisJT1NFcnIJCQllcnI7CisJVUludDMyCQkJb2Zmc2V0OworCVVJbnQ4CQkJb3BDb2RlOworCVVJbnQ4ICoJCQl1bnBhY2tDdXJzb3I7CisJCisJTW9yZUFzc2VydFEocGFja2VkRGF0YSAhPSBuaWwpOworCU1vcmVBc3NlcnRRKHVucGFja2VkRGF0YSAhPSBuaWwpOworCU1vcmVBc3NlcnRRKHVucGFja2VkU2l6ZSA+PSBwYWNrZWRTaXplKTsKKworCS8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0cyBhc3N1bWUgdGhhdCB0aGUgY2xpZW50IGFsbG9jYXRlZCB0aGUgbWVtb3J5IHdpdGggTmV3UHRyLCAKKwkvLyB3aGljaCBtYXkgbm90IGFsd2F5cyBiZSB0cnVlLiAgSG93ZXZlciwgdGhlIGFzc2VydHMnIHZhbHVlIGluIHByZXZlbnRpbmcgYWNjaWRlbnRhbCAKKwkvLyBtZW1vcnkgYmxvY2sgb3ZlcnJ1bnMgb3V0d2VpZ2hzIHRoZSBwb3NzaWJsZSBtYWludGVuYW5jZSBlZmZvcnQuCisJCisJTW9yZUFzc2VydFEoIHBhY2tlZFNpemUgICA9PSBHZXRQdHJTaXplKCAoUHRyKSBwYWNrZWREYXRhICApICk7CisJTW9yZUFzc2VydFEoIHVucGFja2VkU2l6ZSA9PSBHZXRQdHJTaXplKCAoUHRyKSB1bnBhY2tlZERhdGEpICk7CisJCisJZXJyICAgICAgICAgID0gbm9FcnI7CisJb2Zmc2V0ICAgICAgID0gMDsKKwl1bnBhY2tDdXJzb3IgPSB1bnBhY2tlZERhdGE7CisJd2hpbGUgKG9mZnNldCA8IHBhY2tlZFNpemUpIHsKKwkJTW9yZUFzc2VydFEodW5wYWNrQ3Vyc29yIDwgJnVucGFja2VkRGF0YVt1bnBhY2tlZFNpemVdKTsKKwkJCisJCW9wQ29kZSA9IHBhY2tlZERhdGFbb2Zmc2V0XTsKKwkJCisJCXN3aXRjaCAoUEVGUGtEYXRhT3Bjb2RlKG9wQ29kZSkpIHsKKwkJCWNhc2Uga1BFRlBrRGF0YVplcm86CisJCQkJeworCQkJCQlVSW50MzIJY291bnQ7CisJCQkJCQorCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjb3VudCk7CisJCQkJCQorCQkJCQlNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY291bnQpOworCQkJCQl1bnBhY2tDdXJzb3IgKz0gY291bnQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCisJCQljYXNlIGtQRUZQa0RhdGFCbG9jazoKKwkJCQl7CisJCQkJCVVJbnQzMglibG9ja1NpemU7CisJCQkJCQorCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOworCQkJCQkKKwkJCQkJQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7CisJCQkJCXVucGFja0N1cnNvciArPSBibG9ja1NpemU7CisJCQkJCW9mZnNldCArPSBibG9ja1NpemU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCisJCQljYXNlIGtQRUZQa0RhdGFSZXBlYXQ6CisJCQkJeworCQkJCQlVSW50MzIJYmxvY2tTaXplOworCQkJCQlVSW50MzIJcmVwZWF0Q291bnQ7CisJCQkJCVVJbnQzMiAgbG9vcENvdW50ZXI7CisJCQkJCQorCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOworCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKKwkJCQkJcmVwZWF0Q291bnQgKz0gMTsJLy8gc3RvcmVkIHZhbHVlIGlzIChyZXBlYXRDb3VudCAtIDEpCisJCQkJCQorCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworCQkJCQkJQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7CisJCQkJCQl1bnBhY2tDdXJzb3IgKz0gYmxvY2tTaXplOworCQkJCQl9CisJCQkJCW9mZnNldCArPSBibG9ja1NpemU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJCisJCQljYXNlIGtQRUZQa0RhdGFSZXBlYXRCbG9jazoKKwkJCQl7CisJCQkJCVVJbnQzMgljb21tb25TaXplOworCQkJCQlVSW50MzIJY3VzdG9tU2l6ZTsKKwkJCQkJVUludDMyCXJlcGVhdENvdW50OworCQkJCQljb25zdCBVSW50OCAqY29tbW9uRGF0YTsKKwkJCQkJY29uc3QgVUludDggKmN1c3RvbURhdGE7CisJCQkJCVVJbnQzMiBsb29wQ291bnRlcjsKKwkJCQkJCisJCQkJCW9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvbW1vblNpemUpOworCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmN1c3RvbVNpemUpOworCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKKwkJCQkJCisJCQkJCWNvbW1vbkRhdGEgPSAmcGFja2VkRGF0YVtvZmZzZXRdOworCQkJCQljdXN0b21EYXRhID0gJnBhY2tlZERhdGFbb2Zmc2V0ICsgY29tbW9uU2l6ZV07CisJCQkJCQorCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworCQkJCQkJQmxvY2tNb3ZlRGF0YShjb21tb25EYXRhLCB1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOworCQkJCQkJdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7CisJCQkJCQlCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7CisJCQkJCQl1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKKwkJCQkJCWN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKKwkJCQkJfQorCQkJCQlCbG9ja01vdmVEYXRhKGNvbW1vbkRhdGEsIHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7CisJCQkJCXVucGFja0N1cnNvciArPSBjb21tb25TaXplOworCQkJCQlvZmZzZXQgKz0gKHJlcGVhdENvdW50ICogKGNvbW1vblNpemUgKyBjdXN0b21TaXplKSkgKyBjb21tb25TaXplOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQorCQkJY2FzZSBrUEVGUGtEYXRhUmVwZWF0WmVybzoKKwkJCQl7CisJCQkJCVVJbnQzMgljb21tb25TaXplOworCQkJCQlVSW50MzIJY3VzdG9tU2l6ZTsKKwkJCQkJVUludDMyCXJlcGVhdENvdW50OworCQkJCQljb25zdCBVSW50OCAqY3VzdG9tRGF0YTsKKwkJCQkJVUludDMyIGxvb3BDb3VudGVyOworCQkJCQkKKwkJCQkJb2Zmc2V0ICs9IERlY29kZUluc3RyQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY29tbW9uU2l6ZSk7CisJCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY3VzdG9tU2l6ZSk7CisJCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmcmVwZWF0Q291bnQpOworCQkJCQkKKwkJCQkJY3VzdG9tRGF0YSA9ICZwYWNrZWREYXRhW29mZnNldF07CisJCQkJCQorCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworCQkJCQkJTW9yZUJsb2NrWmVybyh1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOworCQkJCQkJdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7CisJCQkJCQlCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7CisJCQkJCQl1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKKwkJCQkJCWN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKKwkJCQkJfQorCQkJCQlNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7CisJCQkJCXVucGFja0N1cnNvciArPSBjb21tb25TaXplOworCQkJCQlvZmZzZXQgKz0gcmVwZWF0Q291bnQgKiBjdXN0b21TaXplOworCQkJCX0KKwkJCQlicmVhazsKKwkJCQorCQkJZGVmYXVsdDoKKwkJCQkjaWYgTU9SRV9ERUJVRworCQkJCQlEZWJ1Z1N0cigiXHBVbnBhY2tQRUZEYXRhU2VjdGlvbjogVW5leHBlY3RlZCBkYXRhIG9wY29kZSIpOworCQkJCSNlbmRpZgorCQkJCWVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOworCQkJCWdvdG8gbGVhdmVOb3c7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJCitsZWF2ZU5vdzoKKwlyZXR1cm4gZXJyOworfQorCisvKglTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzIFJhdGlvbmFsZQorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCisJT0ssIGhlcmUncyB3aGVyZSB0aGluZ3MgZ2V0IHdlaXJkLiAgSW4gb3JkZXIgdG8gcnVuIHRoZSByZWxvY2F0aW9uCisJZW5naW5lLCBJIG5lZWQgdG8gYmUgYWJsZSB0byBmaW5kIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkCisJc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgd2UncmUgZml4aW5nIHVwIGdpdmVuIG9ubHkgaXRzIHNlY3Rpb24gbnVtYmVyLgorCVRoaXMgaXNuJ3QgaGFyZCBmb3IgQ0ZNIHRvIGRvIGJlY2F1c2UgaXQncyB0aGUgb25lIHRoYXQgaW5zdGFudGlhdGVkIHRoZQorCXNlY3Rpb25zIGluIHRoZSBmaXJzdCBwbGFjZS4gIEl0J3Mgc3VycHJpc2luZ2x5IGRpZmZpY3VsdCB0byBkbyBpZgorCXlvdSdyZSBub3QgQ0ZNLiAgW0FuZCB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgQ0ZNIEFQaXMgZm9yIAorCWRvaW5nIGl0Ll0KKwkKKwlbQWxhbiBMaWxsaWNoIGlzIGdvaW5nIHRvIGtpbGwgbWUgd2hlbiBoZSByZWFkcyB0aGlzISAgSSBzaG91bGQgcG9pbnQgb3V0CisJIHRoYXQgVFZlY3RvcidzIGRvbid0IGhhdmUgdG8gY29udGFpbiB0d28gd29yZHMsIHRoZXkgY2FuIGJlIGxvbmdlciwKKwkgYW5kIHRoYXQgdGhlIHNlY29uZCB3b3JkIGlzbid0IG5lY2Vzc2FyaWx5IGEgVE9DIHBvaW50ZXIsIGl0J3MKKwkganVzdCB0aGF0IHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIHJlcXVpcmUgdGhhdCBpdCBiZSBwdXQgaW4gdGhlCisJIFRPQyByZWdpc3RlciB3aGVuIHRoZSBjb2RlIGlzIGNhbGxlZC4KKwkgCisJIEZ1cnRoZXJtb3JlLCB0aGUgY29kZSBzZWN0aW9uIGlzbid0IGFsd2F5cyBzZWN0aW9uIDAsIGFuZCB0aGUgZGF0YQorCSBzZWN0aW9uIGlzbid0IGFsd2F5cyBzZWN0aW9uIDEsIGFuZCB0aGVyZSBjYW4gYmUgemVybyB0byBtYW55IHNlY3Rpb25zCisJIG9mIGVhY2ggdHlwZS4KKwkgCisJIEJ1dCB0aGVzZSBuaWNldGllcyBhcmUgYmVzaWRlcyB0aGUgcG9pbnQ6IEknbSBkb2luZyBzb21ldGhpbmcgdHJpY2t5IAorCSBiZWNhdXNlIEkgZG9uJ3QgaGF2ZSBhIG5pY2UgQVBJIGZvciBnZXR0aW5nIHNlY3Rpb24gYmFzZSBhZGRyZXNzZXMuICAKKwkgSWYgSSBoYWQgYSBuaWNlIEFQSSBmb3IgZG9pbmcgdGhhdCwgbm9uZSBvZiB0aGlzIGNvZGUgd291bGQgZXhpc3QuCisJXQorCisJVGhlIHRlY2huaXF1ZSBpcyB2ZXJ5IHNuZWFreSAodGhhbmtzIHRvIEVyaWMgR3JhbnQpLiAgVGhlIGZyYWdtZW50IHRvIAorCWZpeCBuZWNlc3NhcmlseSBoYXMgYSBDRk0gaW5pdCByb3V0aW5lIChiZWNhdXNlIGl0IG5lZWRzIHRoYXQgcm91dGluZSAKKwlpbiBvcmRlciB0byBjYXB0dXJlIHRoZSBmcmFnbWVudCBsb2NhdGlvbiBhbmQgY29ubmVjdGlvbiBJRCkuICBUaHVzIHRoZSAKKwlmcmFnbWVudCB0byBmaXggbXVzdCBoYXZlIGEgVFZlY3RvciBpbiBpdHMgZGF0YSBzZWN0aW9uLiAgVFZlY3RvcnMgYXJlIAorCWludGVyZXN0aW5nIGJlY2F1c2UgdGhleSdyZSBtYWRlIHVwIG9mIHR3byB3b3Jkcy4gIFRoZSBmaXJzdCBpcyBhIHBvaW50ZXIgCisJdG8gdGhlIGNvZGUgdGhhdCBpbXBsZW1lbnRzIHRoZSByb3V0aW5lOyB0aGUgc2Vjb25kIGlzIGEgcG9pbnRlciB0byB0aGUgVE9DCisJZm9yIHRoZSBmcmFnbWVudCB0aGF0J3MgZXhwb3J0aW5nIHRoZSBUVmVjdG9yLiAgSG93IFRWZWN0b3JzIGFyZQorCWNyZWF0ZWQgaXMgaW50ZXJlc3RpbmcgdG9vLiAgT24gZGlzaywgYSBUVmVjdG9yIGNvbnNpc3RzIG9mIHR3byB3b3JkcywKKwl0aGUgZmlyc3QgYmVpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY29kZSBzZWN0aW9uIHRvIHRoZQorCXJvdXRpbmUsIHRoZSBzZWNvbmQgYmVpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWN0aW9uCisJdG8gdGhlIFRPQyBiYXNlLiAgV2hlbiBDRk0gcHJlcGFyZXMgYSBUVmVjdG9yLCBpdCBhcHBsaWVzIHRoZSBmb2xsb3dpbmcKKwl0cmFuc2Zvcm06CisJCisJCXR2ZWN0b3IuY29kZVB0ciA9IHR2ZWN0b3IuY29kZU9mZnNldCArIGJhc2Ugb2YgY29kZSBzZWN0aW9uCisJCXR2ZWN0b3IudG9jUHRyICA9IHR2ZWN0b3IudG9jT2Zmc2V0ICArIGJhc2Ugb2YgZGF0YSBzZWN0aW9uCisJCQorCU5vdywgeW91IGNhbiByZXZlcnNlIHRoZXNlIHF1ZXN0aW9ucyB0byBtYWtlIHRoZW06CisJCisJCWJhc2Ugb2YgY29kZSBzZWN0aW9uID0gdHZlY3Rvci5jb2RlUHRyIC0gdHZlY3Rvci5jb2RlT2Zmc2V0CisJCWJhc2Ugb2YgZGF0YSBzZWN0aW9uID0gdHZlY3Rvci5kYXRhUHRyIC0gdHZlY3Rvci5kYXRhT2Zmc2V0CisJCisJU28gaWYgeW91IGNhbiBmaW5kIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgYW5kCisJZmluZCB0aGUgb3JpZ2luYWwgb2Zmc2V0cyB0aGF0IG1hZGUgdXAgdGhlIFRWZWN0b3IsIHlvdSBjYW4gdGhlbgorCWNhbGN1bGF0ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGJvdGggdGhlIGNvZGUgYW5kIGRhdGEgc2VjdGlvbnMuCisJCisJRmluZGluZyB0aGUgcmVsb2NhdGVkIGNvbnRlbnRzIG9mIHRoZSBUVmVjdG9yIGlzIGVhc3k7IEkgc2ltcGx5IAorCXJlcXVpcmUgdGhlIGNsaWVudCB0byBwYXNzIGluIGEgcG9pbnRlciB0byBpdHMgaW5pdCByb3V0aW5lLiAKKwlBIHJvdXRpbmUgcG9pbnRlciBpcyBhIFRWZWN0b3IgcG9pbnRlciwgc28geW91IGNhbiBqdXN0IGNhc3QgaXQgCisJYW5kIGV4dHJhY3QgdGhlIHBhaXIgb2Ygd29yZHMuCisKKwlGaW5kaW5nIHRoZSBvcmlnaW5hbCBvZmZzZXRzIGlzIGEgdHJpY2tpZXIuICBNeSB0ZWNobmlxdWUgaXMgdG8KKwlsb29rIHVwIHRoZSBpbml0IHJvdXRpbmUgaW4gdGhlIGZyYWdtZW50J3MgbG9hZGVyIGluZm8gaGVhZGVyLiAgVGhpcworCXlpZWxkcyB0aGUgc2VjdGlvbiBudW1iZXIgYW5kIG9mZnNldCB3aGVyZSB0aGUgaW5pdCByb3V0aW5lJ3MgdW5yZWxvY2F0ZWQgCisJVFZlY3RvciBleGlzdHMuICBPbmNlIEkgaGF2ZSB0aGF0LCBJIGNhbiBqdXN0IHJlYWQgdGhlIHVucmVsb2NhdGVkIFRWZWN0b3IKKwlvdXQgb2YgdGhlIGZpbGUgYW5kIGV4dHJhY3QgdGhlIG9mZnNldHMuCisqLworCitzdHJ1Y3QgVFZlY3RvciB7CisJdm9pZCAqY29kZVB0cjsKKwl2b2lkICp0b2NQdHI7Cit9OwordHlwZWRlZiBzdHJ1Y3QgVFZlY3RvciBUVmVjdG9yOworCitzdGF0aWMgT1NTdGF0dXMgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyhGcmFnVG9GaXhJbmZvICpmcmFnVG9GaXgpCisJLy8gVGhpcyByb3V0aW5lIGluaXRpYWxpc2VzIHRoZSBzZWN0aW9uMEJhc2UgYW5kIHNlY3Rpb24xQmFzZQorCS8vIGJhc2UgZmllbGRzIG9mIGZyYWdUb0ZpeCB0byB0aGUgYmFzZSBhZGRyZXNzZXMgb2YgdGhlCisJLy8gaW5zdGFudGlhdGVkIGZyYWdtZW50IHJlcHJlc2VudGVkIGJ5IHRoZSBvdGhlciBmaWVsZHMKKwkvLyBvZiBmcmFnVG9GaXguICBUaGUgcHJvY2VzcyB3b3JrcyBpbiB0aHJlZSBzdGF0ZXM6CisJLy8KKwkvLyAxLiAJRmluZCB0aGUgY29udGVudHMgb2YgdGhlIHJlbG9jYXRlZCBUVmVjdG9yIG9mIHRoZSAKKwkvLyAgICAgIGZyYWdtZW50J3MgaW5pdGlhbGlzYXRpb24gcm91dGluZSwgcHJvdmlkZWQgdG8gdXMgYnkgCisJLy8gICAgICB0aGUgY2FsbGVyLgorCS8vCisJLy8gMi4JRmluZCB0aGUgY29udGVudHMgb2YgdGhlIG5vbi1yZWxvY2F0ZWQgVFZlY3RvciBieSAKKwkvLyAgICAgIGxvb2tpbmcgaXQgdXAgaW4gdGhlIFBFRiBsb2FkZXIgaW5mbyBoZWFkZXIgYW5kIHRoZW4gCisJLy8gICAgICB1c2luZyB0aGF0IHRvIHJlYWQgdGhlIFRWZWN0b3IgY29udGVudHMgZnJvbSBkaXNrLgorCS8vICAgICAgVGhpcyB5aWVsZHMgdGhlIG9mZnNldHMgZnJvbSB0aGUgc2VjdGlvbiBiYXNlcyBmb3IgCisJLy8gICAgICB0aGUgaW5pdCByb3V0aW5lLgorCS8vCisJLy8gMy4JU3VidHJhY3QgMiBmcm9tIDMuCit7CisJT1NTdGF0dXMgCQkJZXJyOworCVRWZWN0b3IgKgkJCXJlbG9jYXRlZEV4cG9ydDsKKwlTSW50MzIJCQkJaW5pdFNlY3Rpb247CisJVUludDMyCQkJCWluaXRPZmZzZXQ7CisJUEVGU2VjdGlvbkhlYWRlciAqCWluaXRTZWN0aW9uSGVhZGVyOworCVB0cgkJCQkJcGFja2VkRGF0YVNlY3Rpb247CisJUHRyCQkJCQl1bnBhY2tlZERhdGFTZWN0aW9uOworCVRWZWN0b3IgCQkJb3JpZ2luYWxPZmZzZXRzOworCisJcGFja2VkRGF0YVNlY3Rpb24gICA9IG5pbDsKKwl1bnBhY2tlZERhdGFTZWN0aW9uID0gbmlsOworCQorCS8vIFN0ZXAgMS4KKworCS8vIEZpcnN0IGZpbmQgdGhlIGluaXQgcm91dGluZSdzIFRWZWN0b3IsIHdoaWNoIGdpdmVzIHVzIHRoZSByZWxvY2F0ZWQgCisJLy8gb2Zmc2V0cyBvZiB0aGUgaW5pdCByb3V0aW5lIGludG8gdGhlIGRhdGEgYW5kIGNvZGUgc2VjdGlvbnMuCisKKwlyZWxvY2F0ZWRFeHBvcnQgPSAoVFZlY3RvciAqKSBmcmFnVG9GaXgtPmluaXRSb3V0aW5lOworCQkKKwkvLyBTdGVwIDIuCisJCisJLy8gTm93IGZpbmQgdGhlIGluaXQgcm91dGluZSdzIFRWZWN0b3IncyBvZmZzZXRzIGluIHRoZSBkYXRhIHNlY3Rpb24gb24gCisJLy8gZGlzay4gIFRoaXMgZ2l2ZXMgdXMgdGhlIHJhdyBvZmZzZXRzIGZyb20gdGhlIGRhdGEgYW5kIGNvZGUgc2VjdGlvbiAKKwkvLyBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbml0IHJvdXRpbmUuCisJCisJZXJyID0gbm9FcnI7CisJaW5pdFNlY3Rpb24gPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmluaXRTZWN0aW9uOworCWluaXRPZmZzZXQgID0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5pbml0T2Zmc2V0OworCWlmIChpbml0U2VjdGlvbiA9PSAtMSkgeworCQllcnIgPSBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnI7CisJfQorCWlmIChlcnIgPT0gbm9FcnIpIHsKKwkJTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uID49IDAgKTsJCS8vIE5lZ2F0aXZlIGluZGV4ZXMgYXJlIHBzZXVkby1zZWN0aW9ucyB3aGljaCBhcmUganVzdCBub3QgYWxsb3dlZCEKKwkJTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uIDwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICk7CisKKwkJaW5pdFNlY3Rpb25IZWFkZXIgPSAmZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl07CisJCQorCQkvLyBJZiB0aGUgZGF0YSBzZWN0aW9uIGlzIHBhY2tlZCwgdW5wYWNrIGl0IHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgdGhlbiBnZXQgdGhlIAorCQkvLyBvcmlnaW5hbCBvZmZzZXRzIGZyb20gdGhhdCBidWZmZXIuICBJZiB0aGUgZGF0YSBzZWN0aW9uIGlzIHVucGFja2VkLCBqdXN0IHJlYWQgCisJCS8vIHRoZSBvcmlnaW5hbCBvZmZzZXRzIGRpcmVjdGx5IG9mZiB0aGUgZGlzay4KKwkJCisJCWlmICggaW5pdFNlY3Rpb25IZWFkZXItPnNlY3Rpb25LaW5kID09IGtQRUZQYWNrZWREYXRhU2VjdGlvbiApIHsKKworCQkJLy8gQWxsb2NhdGUgc3BhY2UgZm9yIHBhY2tlZCBhbmQgdW5wYWNrZWQgY29waWVzIG9mIHRoZSBzZWN0aW9uLgorCQkJCisJCQlwYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoKTsKKwkJCWVyciA9IE1lbUVycm9yKCk7CisKKwkJCWlmIChlcnIgPT0gbm9FcnIpIHsKKwkJCQl1bnBhY2tlZERhdGFTZWN0aW9uID0gTmV3UHRyKGluaXRTZWN0aW9uSGVhZGVyLT51bnBhY2tlZExlbmd0aCk7CisJCQkJZXJyID0gTWVtRXJyb3IoKTsKKwkJCX0KKworCQkJLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tlZCBzZWN0aW9uLgorCQkJCisJCQlpZiAoZXJyID09IG5vRXJyKSB7CisJCQkJZXJyID0gRlNSZWFkQXRPZmZzZXQoCWZyYWdUb0ZpeC0+ZmlsZVJlZiwKKwkJCQkJCQkJCQlmcmFnVG9GaXgtPmxvY2F0b3Iub2Zmc2V0CisJCQkJCQkJCQkJKyBpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyT2Zmc2V0LAorCQkJCQkJCQkJCWluaXRTZWN0aW9uSGVhZGVyLT5jb250YWluZXJMZW5ndGgsCisJCQkJCQkJCQkJcGFja2VkRGF0YVNlY3Rpb24pOworCQkJfQorCQkJCisJCQkvLyBVbnBhY2sgdGhlIGRhdGEgaW50byB0aGUgdW5wYWNrZWQgc2VjdGlvbi4KKwkJCQorCQkJaWYgKGVyciA9PSBub0VycikgeworCQkJCWVyciA9IFVucGFja1BFRkRhdGFTZWN0aW9uKCAoVUludDggKikgcGFja2VkRGF0YVNlY3Rpb24sICAgaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lckxlbmd0aCwKKwkJCQkJCQkJICAgICAgICAgICAgKFVJbnQ4ICopIHVucGFja2VkRGF0YVNlY3Rpb24sIGluaXRTZWN0aW9uSGVhZGVyLT51bnBhY2tlZExlbmd0aCk7CisJCQl9CisJCQkKKwkJCS8vIEV4dHJhY3QgdGhlIGluaXQgcm91dGluZSdzIFRWZWN0b3IgZnJvbSB0aGUgdW5wYWNrZWQgc2VjdGlvbi4KKwkJCQorCQkJaWYgKGVyciA9PSBub0VycikgeworCQkJCUJsb2NrTW92ZURhdGEodW5wYWNrZWREYXRhU2VjdGlvbiArIGluaXRPZmZzZXQsICZvcmlnaW5hbE9mZnNldHMsIHNpemVvZihUVmVjdG9yKSk7CisJCQl9CisJCQkKKwkJfSBlbHNlIHsKKwkJCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbaW5pdFNlY3Rpb25dLnNlY3Rpb25LaW5kID09IGtQRUZVbnBhY2tlZERhdGFTZWN0aW9uKTsKKwkJCWVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwgCisJCQkJCQkJCQlmcmFnVG9GaXgtPmxvY2F0b3Iub2Zmc2V0CisJCQkJCQkJCQkrIGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbaW5pdFNlY3Rpb25dLmNvbnRhaW5lck9mZnNldAorCQkJCQkJCQkJKyBpbml0T2Zmc2V0LAorCQkJCQkJCQkJc2l6ZW9mKFRWZWN0b3IpLCAKKwkJCQkJCQkJCSZvcmlnaW5hbE9mZnNldHMpOworCQl9CisJfQorCisJLy8gU3RlcCAzLgorCQkKKwkvLyBEbyB0aGUgbWF0aHMgdG8gc3VidHJhY3QgdGhlIHVucmVsb2NhdGVkIG9mZnNldHMgZnJvbSB0aGUgY3VycmVudCBhZGRyZXNzIAorCS8vIHRvIGdldCB0aGUgYmFzZSBhZGRyZXNzLgorCQorCWlmIChlcnIgPT0gbm9FcnIpIHsKKwkJZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2UgPSAoKGNoYXIgKikgcmVsb2NhdGVkRXhwb3J0LT5jb2RlUHRyKSAtIChVSW50MzIpIG9yaWdpbmFsT2Zmc2V0cy5jb2RlUHRyOworCQlmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSA9ICgoY2hhciAqKSByZWxvY2F0ZWRFeHBvcnQtPnRvY1B0cikgIC0gKFVJbnQzMikgb3JpZ2luYWxPZmZzZXRzLnRvY1B0cjsKKwl9CisJCisJLy8gQ2xlYW4gdXAuCisJCisJaWYgKHBhY2tlZERhdGFTZWN0aW9uICE9IG5pbCkgeworCQlEaXNwb3NlUHRyKHBhY2tlZERhdGFTZWN0aW9uKTsKKwkJTW9yZUFzc2VydFEoIE1lbUVycm9yKCkgPT0gbm9FcnIgKTsKKwl9CisJaWYgKHVucGFja2VkRGF0YVNlY3Rpb24gIT0gbmlsKSB7CisJCURpc3Bvc2VQdHIodW5wYWNrZWREYXRhU2VjdGlvbik7CisJCU1vcmVBc3NlcnRRKCBNZW1FcnJvcigpID09IG5vRXJyICk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkICpHZXRTZWN0aW9uQmFzZUFkZHJlc3MoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LCBVSW50MTYgc2VjdGlvbkluZGV4KQorCS8vIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBiYXNlIG9mIHRoZSBpbnN0YW50aWF0ZWQgc2VjdGlvbgorCS8vIHdob3NlIGluZGV4IGlzIHNlY3Rpb25JbmRleC4gIFRoaXMgcm91dGluZSBpcyB0aGUgZXZpbCB0d2luCisJLy8gb2YgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3Nlcy4gIEl0IHNpbXBseSByZXR1cm5zIHRoZSB2YWx1ZXMKKwkvLyBmb3Igc2VjdGlvbiAwIGFuZCAxIHRoYXQgd2UgZGVyaXZlZCBpbiBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzLgorCS8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyByb3V0aW5lIHdvdWxkIGNhbGwgQ0ZNIEFQSQorCS8vIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uLCBhbmQgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyB3b3VsZAorCS8vIG5vdCBleGlzdCwgYnV0IENGTSBkb2VzIG5vdCBleHBvcnQgdGhlIG5lY2Vzc2FyeSBBUElzIHRvCisJLy8gdGhpcmQgcGFydGllcy4KK3sKKwl2b2lkICpyZXN1bHQ7CisJCisJTW9yZUFzc2VydFEoZnJhZ1RvRml4ICE9IG5pbCk7CisJTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMSA9PSBrUEVGVGFnMSk7CisJCisJc3dpdGNoIChzZWN0aW9uSW5kZXgpIHsKKwkJY2FzZSAwOgorCQkJcmVzdWx0ID0gZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2U7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcmVzdWx0ID0gZnJhZ1RvRml4LT5zZWN0aW9uMUJhc2U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlc3VsdCA9IG5pbDsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBPU1N0YXR1cyBGaW5kSW1wb3J0TGlicmFyeShQRUZMb2FkZXJJbmZvSGVhZGVyICpsb2FkZXJTZWN0aW9uLCBjb25zdCBjaGFyICpsaWJyYXJ5TmFtZSwgUEVGSW1wb3J0ZWRMaWJyYXJ5ICoqaW1wb3J0TGlicmFyeSkKKwkvLyBUaGlzIHJvdXRpbmUgZmluZHMgdGhlIGltcG9ydCBsaWJyYXJ5IGRlc2NyaXB0aW9uIChQRUZJbXBvcnRlZExpYnJhcnkpCisJLy8gZm9yIHRoZSBpbXBvcnQgbGlicmFyeSBsaWJyYXJ5TmFtZSBpbiB0aGUgUEVGIGxvYWRlciBzZWN0aW9uLgorCS8vIEl0IHNldHMgKmltcG9ydExpYnJhcnkgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0aW9uLgoreworCU9TU3RhdHVzIAkJCWVycjsKKwlVSW50MzIgCQkJCWxpYnJhcmllc1JlbWFpbmluZzsKKwlQRUZJbXBvcnRlZExpYnJhcnkgCSp0aGlzSW1wb3J0TGlicmFyeTsKKwlCb29sZWFuIAkJCWZvdW5kOworCQorCU1vcmVBc3NlcnRRKGxvYWRlclNlY3Rpb24gIT0gbmlsKTsKKwlNb3JlQXNzZXJ0UShsaWJyYXJ5TmFtZSAhPSBuaWwpOworCU1vcmVBc3NlcnRRKGltcG9ydExpYnJhcnkgIT0gbmlsKTsKKwkKKwkvLyBMb29wIHRocm91Z2ggZWFjaCBpbXBvcnQgbGlicmFyeSBsb29raW5nIGZvciBhIG1hdGNoaW5nIG5hbWUuCisJCisJLy8gSW5pdGlhbGlzZSB0aGlzSW1wb3J0TGlicmFyeSB0byBwb2ludCB0byB0aGUgYnl0ZSBhZnRlciB0aGUKKwkvLyBlbmQgb2YgdGhlIGxvYWRlciBzZWN0aW9uJ3MgaGVhZGVyLgorCQorCXRoaXNJbXBvcnRMaWJyYXJ5ID0gKFBFRkltcG9ydGVkTGlicmFyeSAqKSAobG9hZGVyU2VjdGlvbiArIDEpOworCWxpYnJhcmllc1JlbWFpbmluZyA9IGxvYWRlclNlY3Rpb24tPmltcG9ydGVkTGlicmFyeUNvdW50OworCWZvdW5kID0gZmFsc2U7CisJd2hpbGUgKCBsaWJyYXJpZXNSZW1haW5pbmcgPiAwICYmICEgZm91bmQgKSB7CisJCS8vIFBFRiBkZWZpbmVzIHRoYXQgaW1wb3J0IGxpYnJhcnkgbmFtZXMgd2lsbCBoYXZlCisJCS8vIGEgbnVsbCB0ZXJtaW5hdG9yLCBzbyB3ZSBjYW4ganVzdCB1c2Ugc3RyY21wLgorCQlmb3VuZCA9IChzdHJjbXAoIGxpYnJhcnlOYW1lLAorCQkJCQkJKChjaGFyICopbG9hZGVyU2VjdGlvbikKKwkJCQkJCSsgbG9hZGVyU2VjdGlvbi0+bG9hZGVyU3RyaW5nc09mZnNldCAKKwkJCQkJCSsgdGhpc0ltcG9ydExpYnJhcnktPm5hbWVPZmZzZXQpID09IDApOworCQkvLyAqKiogUmVtb3ZlIEFOU0kgc3RyY21wIGV2ZW50dWFsbHkuCisJCWlmICggISBmb3VuZCApIHsKKwkJCXRoaXNJbXBvcnRMaWJyYXJ5ICs9IDE7CisJCQlsaWJyYXJpZXNSZW1haW5pbmcgLT0gMTsKKwkJfQorCX0KKwkKKwlpZiAoZm91bmQpIHsKKwkJKmltcG9ydExpYnJhcnkgPSB0aGlzSW1wb3J0TGlicmFyeTsKKwkJZXJyID0gbm9FcnI7CisJfSBlbHNlIHsKKwkJKmltcG9ydExpYnJhcnkgPSBuaWw7CisJCWVyciA9IGNmcmFnTm9MaWJyYXJ5RXJyOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgT1NTdGF0dXMgTG9va3VwU3ltYm9sKENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwgdm9pZCAqcmVmQ29uLAorCQkJCQkJCVBFRkxvYWRlckluZm9IZWFkZXIgKmxvYWRlclNlY3Rpb24sCisJCQkJCQkJVUludDMyIHN5bWJvbEluZGV4LAorCQkJCQkJCVVJbnQzMiAqc3ltYm9sVmFsdWUpCisJLy8gVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gbG9vayB1cCBhIHN5bWJvbCBkdXJpbmcgcmVsb2NhdGlvbi4KKwkvLyAibG9va3VwIiBpcyBhIGNsaWVudCBjYWxsYmFjayBhbmQgcmVmQ29uIGlzIGl0cyBhcmd1bWVudC4KKwkvLyBUeXBpY2FsbHkgcmVmQ29uIGlzIHRoZSBDRk0gY29ubmVjdGlvbiB0byB0aGUgbGlicmFyeSB0aGF0IGlzCisJLy8gc3Vic3RpdHV0aW5nIGZvciB0aGUgd2VhayBsaW5rZWQgbGlicmFyeS4gIGxvYWRlclNlY3Rpb24KKwkvLyBpcyBhIHBvaW50ZXIgdG8gdGhlIGxvYWRlciBzZWN0aW9uIG9mIHRoZSBmcmFnbWVudCB0byBmaXggdXAuCisJLy8gc3ltYm9sSW5kZXggaXMgdGhlIGluZGV4IG9mIHRoZSBpbXBvcnRlZCBzeW1ib2wgaW4gdGhlIGxvYWRlciBzZWN0aW9uLgorCS8vIFRoZSByb3V0aW5lIHNldHMgdGhlIHdvcmQgcG9pbnRlZCB0byBieSBzeW1ib2xWYWx1ZSB0byB0aGUKKwkvLyB2YWx1ZSBvZiB0aGUgc3ltYm9sLgorCS8vCisJLy8gVGhlIHJvdXRpbmUgd29ya3MgYnkgdXNpbmcgc3ltYm9sSW5kZXggdG8gaW5kZXggaW50byB0aGUgaW1wb3J0ZWQKKwkvLyBzeW1ib2wgdGFibGUgdG8gZmluZCB0aGUgb2Zmc2V0IG9mIHRoZSBzeW1ib2wncyBuYW1lIGluIHRoZSBzdHJpbmcKKwkvLyB0YWJsZS4gIEl0IHRoZW4gbG9va3MgdXAgdGhlIHN5bWJvbCBieSBjYWxsaW5nIHRoZSBjbGllbnQncyAibG9va3VwIgorCS8vIGZ1bmN0aW9uIGFuZCBwYXNzZXMgdGhlIHJlc3VsdGluZyBzeW1ib2wgYWRkcmVzcyBiYWNrIGluIHN5bWJvbFZhbHVlLgoreworCU9TU3RhdHVzIAkJCWVycjsKKwlVSW50MzIgCQkJCSppbXBvcnRTeW1ib2xUYWJsZTsKKwlVSW50MzIgCQkJCXN5bWJvbFN0cmluZ09mZnNldDsKKwlCb29sZWFuIAkJCXN5bWJvbElzV2VhazsKKwlDRnJhZ1N5bWJvbENsYXNzIAlzeW1ib2xDbGFzczsKKwljaGFyIAkJCQkqc3ltYm9sU3RyaW5nQWRkcmVzczsKKwlTdHIyNTUgCQkJCXN5bWJvbFN0cmluZzsKKwkKKwlNb3JlQXNzZXJ0UShsb29rdXAgIT0gbmlsKTsKKwlNb3JlQXNzZXJ0UShsb2FkZXJTZWN0aW9uICE9IG5pbCk7CisJTW9yZUFzc2VydFEoc3ltYm9sSW5kZXggPCBsb2FkZXJTZWN0aW9uLT50b3RhbEltcG9ydGVkU3ltYm9sQ291bnQpOworCU1vcmVBc3NlcnRRKHN5bWJvbFZhbHVlICE9IG5pbCk7CisJCisJLy8gRmluZCB0aGUgYmFzZSBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIHRhYmxlLgorCQorCWltcG9ydFN5bWJvbFRhYmxlID0gKFVJbnQzMiAqKSgoKGNoYXIgKikobG9hZGVyU2VjdGlvbiArIDEpKSArIChsb2FkZXJTZWN0aW9uLT5pbXBvcnRlZExpYnJhcnlDb3VudCAqIHNpemVvZihQRUZJbXBvcnRlZExpYnJhcnkpKSk7CisJCisJLy8gR3JhYiB0aGUgYXBwcm9wcmlhdGUgZW50cnkgb3V0IG9mIHRoZSB0YWJsZSBhbmQKKwkvLyBleHRyYWN0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoYXQgZW50cnkuCisJCisJc3ltYm9sU3RyaW5nT2Zmc2V0ID0gaW1wb3J0U3ltYm9sVGFibGVbc3ltYm9sSW5kZXhdOworCXN5bWJvbENsYXNzID0gUEVGSW1wb3J0ZWRTeW1ib2xDbGFzcyhzeW1ib2xTdHJpbmdPZmZzZXQpOworCXN5bWJvbElzV2VhayA9ICgoc3ltYm9sQ2xhc3MgJiBrUEVGV2Vha0ltcG9ydFN5bU1hc2spICE9IDApOworCXN5bWJvbENsYXNzID0gc3ltYm9sQ2xhc3MgJiB+a1BFRldlYWtJbXBvcnRTeW1NYXNrOworCXN5bWJvbFN0cmluZ09mZnNldCA9IFBFRkltcG9ydGVkU3ltYm9sTmFtZU9mZnNldChzeW1ib2xTdHJpbmdPZmZzZXQpOworCQorCS8vIEZpbmQgdGhlIHN0cmluZyBmb3IgdGhlIHN5bWJvbCBpbiB0aGUgc3RyaW5ncyB0YWJsZSBhbmQKKwkvLyBleHRyYWN0IGl0IGZyb20gdGhlIHRhYmxlIGludG8gYSBQYXNjYWwgc3RyaW5nIG9uIHRoZSBzdGFjay4KKwkKKwlzeW1ib2xTdHJpbmdBZGRyZXNzID0gKChjaGFyICopbG9hZGVyU2VjdGlvbikgKyBsb2FkZXJTZWN0aW9uLT5sb2FkZXJTdHJpbmdzT2Zmc2V0ICsgc3ltYm9sU3RyaW5nT2Zmc2V0OworCXN5bWJvbFN0cmluZ1swXSA9IHN0cmxlbihzeW1ib2xTdHJpbmdBZGRyZXNzKTsJCS8vICoqKiByZW1vdmUgQU5TSSBzdHJsZW4KKwlCbG9ja01vdmVEYXRhKHN5bWJvbFN0cmluZ0FkZHJlc3MsICZzeW1ib2xTdHJpbmdbMV0sIHN5bWJvbFN0cmluZ1swXSk7CisJCisJLy8gTG9vayB1cCB0aGUgc3ltYm9sIGluIHN1YnN0aXR1dGUgbGlicmFyeS4gIElmIGl0IGZhaWxzLCByZXR1cm4KKwkvLyBhIDAgdmFsdWUgYW5kIGNoZWNrIHdoZXRoZXIgdGhlIGVycm9yIGlzIGZhdGFsIChhIHN0cm9uZyBsaW5rZWQKKwkvLyBzeW1ib2wpIG9yIGJlbmlnbiAoYSB3ZWFrIGxpbmtlZCBzeW1ib2wpLgorCQorCWVyciA9IGxvb2t1cChzeW1ib2xTdHJpbmcsIHN5bWJvbENsYXNzLCAodm9pZCAqKikgc3ltYm9sVmFsdWUsIHJlZkNvbik7CisJaWYgKGVyciAhPSBub0VycikgeworCQkqc3ltYm9sVmFsdWUgPSAwOworCQlpZiAoc3ltYm9sSXNXZWFrKSB7CisJCQllcnIgPSBub0VycjsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCisvLyBUaGUgRW5naW5lU3RhdGUgc3RydWN0dXJlIGVuY2Fwc3VsYXRlcyBhbGwgb2YgdGhlIHBlcnNpc3RlbnQgc3RhdGUKKy8vIG9mIHRoZSBDRk0gcmVsb2NhdGlvbiBlbmdpbmUgdmlydHVhbCBtYWNoaW5lLiAgSSBvcmlnaW5hbGx5IGRlZmluZWQKKy8vIHRoaXMgc3RydWN0dXJlIHNvIEkgY291bGQgcGFzcyB0aGUgc3RhdGUgYXJvdW5kIGJldHdlZW4gcm91dGluZXMKKy8vIHRoYXQgaW1wbGVtZW50IHZhcmlvdXMgdmlydHVhbCBvcGNvZGVzLCBob3dldmVyIEkgbGF0ZXIgd29ya2VkCisvLyBvdXQgdGhhdCB0aGUgcmVsb2NhdGlvbiB3YXMgc3VmZmljaWVudGx5IHNpbXBsZSB0aGF0IEkgY291bGQgcHV0IGl0CisvLyBpbiBpbiBvbmUgcm91dGluZS4gIFN0aWxsLCBJIGxlZnQgdGhlIHN0YXRlIGluIHRoaXMgc3RydWN0dXJlIGluCisvLyBjYXNlIEkgZXZlciBuZWVkIHRvIHJldmVyc2UgdGhhdCBkZWNpc2lvbi4gIEl0J3MgYWxzbyBhIGNvbnZlbmllbnQKKy8vIGluc3RydWN0aW9uYWwgZGVzaWduLgorCitzdHJ1Y3QgRW5naW5lU3RhdGUgeworCVVJbnQzMiBjdXJyZW50UmVsb2M7CQkvLyBJbmRleCBvZiBjdXJyZW50IHJlbG9jYXRpb24gb3Bjb2RlcworCVVJbnQzMiB0ZXJtaW5hdGluZ1JlbG9jOwkvLyBJbmRleCBvZiByZWxvY2F0aW9uIG9wY29kZXMgd2hpY2ggdGVybWluYXRlcyByZWxvY2F0aW9uCisJVUludDMyICpzZWN0aW9uQmFzZTsJCS8vIFN0YXJ0IG9mIHRoZSBzZWN0aW9uCisJVUludDMyICpyZWxvY0FkZHJlc3M7CQkvLyBBZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbiB3aGVyZSB0aGUgcmVsb2NhdGlvbnMgYXJlIHRvIGJlIHBlcmZvcm1lZAorCVVJbnQzMiBpbXBvcnRJbmRleDsJCQkvLyBTeW1ib2wgaW5kZXgsIHdoaWNoIGlzIHVzZWQgdG8gYWNjZXNzIGFuIGltcG9ydGVkIHN5bWJvbCdzIGFkZHJlc3MKKwl2b2lkICAqc2VjdGlvbkM7CQkJLy8gTWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gd2l0aGluIHRoZSBQRUYgY29udGFpbmVyOyB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgcmVsb2NhdGlvbiBvcGNvZGVzIHRoYXQgcmVsb2NhdGUgc2VjdGlvbiBhZGRyZXNzZXMKKwl2b2lkICAqc2VjdGlvbkQ7CQkJLy8gTWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gd2l0aGluIHRoZSBQRUYgY29udGFpbmVyOyB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgcmVsb2NhdGlvbiBvcGNvZGVzIHRoYXQgcmVsb2NhdGUgc2VjdGlvbiBhZGRyZXNzZXMKK307Cit0eXBlZGVmIHN0cnVjdCBFbmdpbmVTdGF0ZSBFbmdpbmVTdGF0ZTsKKworLy8gTm90ZToKKy8vIElmIEkgZXZlciBoYXZlIHRvIHN1cHBvcnQgdGhlIHJlcGVhdCBvcGNvZGVzLCBJJ2xsIHByb2JhYmx5CisvLyBoYXZlIHRvIGFkZCBhIHJlcGVhdCBjb3VudGVyIHRvIEVuZ2luZVN0YXRlLgorCitzdGF0aWMgT1NTdGF0dXMgSW5pdEVuZ2luZVN0YXRlKGNvbnN0IEZyYWdUb0ZpeEluZm8gKmZyYWdUb0ZpeCwKKwkJCQkJCQkJVUludDE2IHJlbG9jSGVhZGVySW5kZXgsCisJCQkJCQkJCUVuZ2luZVN0YXRlICpzdGF0ZSkKKwkvLyBUaGlzIHJvdXRpbmUgaW5pdGlhbGlzZXMgdGhlIGVuZ2luZSBzdGF0ZSBzdWl0YWJseSBmb3IKKwkvLyBydW5uaW5nIHRoZSByZWxvY2F0aW9uIG9wY29kZXMgZm9yIHRoZSBzZWN0aW9uIHdob3NlCisJLy8gaW5kZXggaXMgcmVsb2NIZWFkZXJJbmRleC4gIHJlbG9jSGVhZGVySW5kZXggaXMgbm90IGEKKwkvLyBhIHNlY3Rpb24gbnVtYmVyLiAgU2VlIHRoZSBjb21tZW50IHdoZXJlIGl0J3MgdXNlZCBiZWxvdworCS8vIGZvciBkZXRhaWxzLiAgVGhlIHJvdXRpbmUgYmFzaWNhbGx5IGZpbGxzIG91dCBhbGwgdGhlIGZpZWxkcworCS8vIGluIHRoZSBFbmdpbmVTdGF0ZSBzdHJ1Y3R1cmUgYXMgZGVzY3JpYmVkIGJ5CisJLy8gIk1hYyBPUyBSdW50aW1lIEFyY2hpdGVjdHVyZXMiLgoreworCU9TU3RhdHVzIGVycjsKKwlQRUZMb2FkZXJSZWxvY2F0aW9uSGVhZGVyICpyZWxvY0hlYWRlcjsKKwkKKwlNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKKwlNb3JlQXNzZXJ0UShzdGF0ZSAhPSBuaWwpOworCisJLy8gVGhpcyBiaXQgaXMgdHJpY2t5LiAgcmVsb2NIZWFkZXJJbmRleCBpcyBhbiBpbmRleCBpbnRvIHRoZSByZWxvY2F0aW9uCisJLy8gaGVhZGVyIHRhYmxlLCBzdGFydGluZyBhdCByZWxvY1NlY3Rpb25Db3VudCAod2hpY2ggaXMgaW4gdGhlIGxvYWRlcgorCS8vIHNlY3Rpb24gaGVhZGVyKSBmb3IgdGhlIGZpcnN0IHJlbG9jYXRlZCBzZWN0aW9uIGFuZCBkZWNyZW1lbnRpbmcKKwkvLyBkb3duIHRvIDEgZm9yIHRoZSBsYXN0IHJlbG9jYXRlZCBzZWN0aW9uLiAgSSBmaW5kIHRoZSByZWxvY2F0aW9uCisJLy8gaGVhZGVyIGJ5IHVzaW5nIHJlbG9jSGVhZGVySW5kZXggYXMgYSBpbmRleCBiYWNrd2FyZHMgZnJvbSB0aGUKKwkvLyBzdGFydCBvZiB0aGUgcmVsb2NhdGlvbiBvcGNvZGVzIChpZSByZWxvY0luc3RyT2Zmc2V0KS4gIElmIHlvdQorCS8vIGxvb2sgYXQgdGhlIGRpYWdyYW0gb2YgdGhlIGxheW91dCBvZiB0aGUgY29udGFpbmVyIGluCisJLy8gIlBFRkJpbmFyeUZvcm1hdC5oIiwgeW91J2xsIHNlZSB0aGF0IHRoZSByZWxvY2F0aW9uIG9wY29kZXMKKwkvLyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIHJlbG9jYXRpb24gaGVhZGVycy4KKwkvLworCS8vIEkgZGlkIHRoaXMgYmVjYXVzZSB0aGUgYWx0ZXJuYXRpdmUgKHN0YXJ0aW5nIGF0IHRoZSBsb2FkZXIKKwkvLyBoZWFkZXIgYW5kIHN0ZXBwaW5nIHBhc3QgdGhlIGltcG9ydCBsaWJyYXJ5IHRhYmxlIGFuZCB0aGUKKwkvLyBpbXBvcnQgc3ltYm9sIHRhYmxlKSB3YXMgYSBwYWluLgorCisJcmVsb2NIZWFkZXIgPSAoUEVGTG9hZGVyUmVsb2NhdGlvbkhlYWRlciAqKSAoKChjaGFyICopIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbikgKyBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQgLSByZWxvY0hlYWRlckluZGV4ICogc2l6ZW9mKFBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIpKTsKKwkKKwlNb3JlQXNzZXJ0UShyZWxvY0hlYWRlci0+cmVzZXJ2ZWRBID09IDApOwkJLy8gUEVGIHNwZWMgc2F5cyBpdCBtdXN0IGJlOyB3ZSBjaGVjayB0byB0cnkgdG8gY2F0Y2ggYnVncyBpbiBjYWxjdWxhdGlvbiBvZiByZWxvY0hlYWRlcgorCQorCXN0YXRlLT5jdXJyZW50UmVsb2MgPSByZWxvY0hlYWRlci0+Zmlyc3RSZWxvY09mZnNldDsKKwlzdGF0ZS0+dGVybWluYXRpbmdSZWxvYyA9IHJlbG9jSGVhZGVyLT5maXJzdFJlbG9jT2Zmc2V0ICsgcmVsb2NIZWFkZXItPnJlbG9jQ291bnQ7CisJc3RhdGUtPnNlY3Rpb25CYXNlID0gKFVJbnQzMiAqKSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCByZWxvY0hlYWRlci0+c2VjdGlvbkluZGV4KTsKKwlzdGF0ZS0+cmVsb2NBZGRyZXNzID0gc3RhdGUtPnNlY3Rpb25CYXNlOworCXN0YXRlLT5pbXBvcnRJbmRleCA9IDA7CisKKwkvLyBGcm9tICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIjoKKwkvLworCS8vIFRoZSBzZWN0aW9uQyBhbmQgc2VjdGlvbkQgdmFyaWFibGVzIGFjdHVhbGx5IGNvbnRhaW4gdGhlCisJLy8gbWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gbWludXMgdGhlCisJLy8gZGVmYXVsdCBhZGRyZXNzIGZvciB0aGF0IHNlY3Rpb24uIFRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIGEKKwkvLyBzZWN0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgZGVmYXVsdEFkZHJlc3MgZmllbGQgb2YgdGhlCisJLy8gc2VjdGlvbiBoZWFkZXIuIEhvd2V2ZXIsIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIGRlZmF1bHQKKwkvLyBhZGRyZXNzIHNob3VsZCBiZSAwLCBzbyB0aGUgc2ltcGxpZmllZCBkZWZpbml0aW9uIHN1ZmZpY2VzLgorCS8vIAorCS8vIEluIHRoZSBkZWJ1ZyB2ZXJzaW9uLCB3ZSBkcm9wIGludG8gTWFjc0J1ZyBpZiB0aGlzIHdlaXJkIGNhc2UKKwkvLyBldmVyIGV4ZWN1dGVzIGJlY2F1c2UgaXQncyBtb3JlIGxpa2VseSB3ZSBtYWRlIGEgbWlzdGFrZSB0aGFuCisJLy8gd2UgZW5jb3VudGVyZWQgYSBzZWN0aW9uIHdpdGggYSBkZWZhdWx0IGFkZHJlc3MuCisKKwlzdGF0ZS0+c2VjdGlvbkMgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCAwKTsKKwlpZiAoc3RhdGUtPnNlY3Rpb25DICE9IG5pbCkgeworCQkjaWYgTU9SRV9ERUJVRworCQkJaWYgKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMF0uZGVmYXVsdEFkZHJlc3MgIT0gMCkgeworCQkJCURlYnVnU3RyKCJccEluaXRFbmdpbmVTdGF0ZTogRXhlY3V0aW5nIHdlaXJkIGNhc2UuIik7CisJCQl9CisJCSNlbmRpZgorCQkoY2hhciAqKSBzdGF0ZS0+c2VjdGlvbkMgLT0gZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1swXS5kZWZhdWx0QWRkcmVzczsKKwl9CisJc3RhdGUtPnNlY3Rpb25EID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgMSk7CisJaWYgKHN0YXRlLT5zZWN0aW9uRCAhPSBuaWwpIHsKKwkJI2lmIE1PUkVfREVCVUcKKwkJCWlmIChmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzWzFdLmRlZmF1bHRBZGRyZXNzICE9IDApIHsKKwkJCQlEZWJ1Z1N0cigiXHBJbml0RW5naW5lU3RhdGU6IEV4ZWN1dGluZyB3ZWlyZCBjYXNlLiIpOworCQkJfQorCQkjZW5kaWYKKwkJKGNoYXIgKikgc3RhdGUtPnNlY3Rpb25EIC09IGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMV0uZGVmYXVsdEFkZHJlc3M7CisJfQorCisJZXJyID0gbm9FcnI7CisJaWYgKHN0YXRlLT5yZWxvY0FkZHJlc3MgPT0gbmlsKSB7CisJCWVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLy8ga1BFRlJlbG9jQmFzaWNPcGNvZGVzIGlzIGEgdGFibGUgdGhhdCBtYXBzIHRoZSB0b3AgNyBiaXRzIG9mIHRoZSBvcGNvZGUKKy8vIHRvIGEgZnVuZGFtZW50YWwgYWN0aW9uLiAgSXQncyBjb250ZW50cyBhcmUgZGVmaW5lZCBmb3IgbWUgaW4gIlBFRkJpbmFyeUZvcm1hdC5oIiwKKy8vIHdoaWNoIGlzIHJlYWxseSBjb252ZW5pZW50LgorCitzdGF0aWMgVUludDgga1BFRlJlbG9jQmFzaWNPcGNvZGVzW2tQRUZSZWxvY0Jhc2ljT3Bjb2RlUmFuZ2VdID0geyBQRUZNYXNrZWRCYXNpY09wY29kZXMgfTsKKworc3RhdGljIE9TU3RhdHVzIFJ1blJlbG9jYXRpb25FbmdpbmUoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LCAKKwkJCQkJCQkJCQlQRUZJbXBvcnRlZExpYnJhcnkgICppbXBvcnRMaWJyYXJ5LCAKKwkJCQkJCQkJCQlDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBsb29rdXAsIHZvaWQgKnJlZkNvbikKKwkvLyBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgcmVhbGx5IGhpdHMgdGhlLiAgR2l2ZW4gYSBmdWxseQorCS8vIHBvcHVsYXRlZCBmcmFnVG9GaXggc3RydWN0dXJlLCB0aGUgaW1wb3J0IGxpYnJhcnkgZGVzY3JpcHRpb24KKwkvLyBvZiB0aGUgd2VhayBpbXBvcnRlZCBsaWJyYXJ5IHdlJ3JlIHJlc29sdmluZywgYW5kIGEgY29ubmVjdGlvbgorCS8vIHRvIHRoZSBsaWJyYXJ5IHdlJ3JlIGdvaW5nIHRvIHN1YnN0aXR1dGUgaXQsIHJlLWV4ZWN1dGUgdGhlCisJLy8gcmVsb2NhdGlvbiBpbnN0cnVjdGlvbnMgKENGTSBoYXMgYWxyZWFkeSBleGVjdXRlZCB0aGVtIG9uY2UpCisJLy8gYnV0IG9ubHkgKmRvKiBpbnN0cnVjdGlvbnMgKGllIHN0b3JlIHRoZSBjaGFuZ2UgdG8gdGhlIGRhdGEgc2VjdGlvbikKKwkvLyB0aGF0IENGTSBza2lwcGVkIGJlY2F1c2UgdGhlIHdlYWsgc3ltYm9scyB3ZXJlIG1pc3NpbmcuCit7CisJT1NTdGF0dXMgCWVycjsKKwlFbmdpbmVTdGF0ZQlzdGF0ZTsKKwlVSW50MTYgCQlzZWN0aW9uc0xlZnRUb1JlbG9jYXRlOworCVVJbnQzMiAJCXRvdGFsUmVsb2NzOworCVVJbnQxNgkJKnJlbG9jSW5zdHJUYWJsZTsKKwlVSW50MTYgCQlvcENvZGU7CisJCisJTW9yZUFzc2VydFEoZnJhZ1RvRml4ICE9IG5pbCk7CisJTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMSA9PSBrUEVGVGFnMSk7CisJTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyAhPSBuaWwpOworCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiAhPSBuaWwpOworCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlICE9IG5pbCk7CS8vIFRlY2huaWNhbGx5LCBoYXZpbmcgYSBuaWwgZm9yIHRoZXNlIHR3byBpcyBub3QgYSBwcm9ibGVtLCAuLi4KKwlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSAhPSBuaWwpOwkvLyBidXQgaW4gcHJhY3Rpc2UgaXQgYSB3aWxkbHkgZGV2aWFudCBjYXNlIGFuZCB3ZSBzaG91bGQga25vdyBhYm91dCBpdC4KKwlNb3JlQXNzZXJ0UShpbXBvcnRMaWJyYXJ5ICE9IG5pbCk7CisJTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7CisKKwkvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGxvb3AsIHdvcmsgb3V0IHNvbWUgaW5mb3JtYXRpb24gaW4gYWR2YW5jZS4KKworCS8vIHRvdGFsUmVsb2NzIGlzIG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nLCB0byBtYWtlIHN1cmUgb3VyCisJLy8gcmVsb2NhdGlvbiBQQyAoc3RhdGUuY3VycmVudFJlbG9jKSBkb2Vzbid0IHJ1biB3aWxkLgorCQorCXRvdGFsUmVsb2NzID0gKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+bG9hZGVyU3RyaW5nc09mZnNldCAtIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NJbnN0ck9mZnNldCkgLyBzaXplb2YoVUludDE2KTsKKwkKKwkvLyByZWxvY0luc3RyVGFibGUgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdGFibGUgb2YgcmVsb2NhdGlvbgorCS8vIGluc3RydWN0aW9ucyBpbiB0aGUgZnJhZ21lbnQgdG8gZml4LgorCQorCXJlbG9jSW5zdHJUYWJsZSA9IChVSW50MTYgKikoKGNoYXIgKikgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uICsgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY0luc3RyT2Zmc2V0KTsKKwkKKwkvLyBzZWN0aW9uc0xlZnRUb1JlbG9jYXRlIGlzIHRoZSBsb29wIGNvdW50ZXIgZm9yIHRoZSBvdXRlciBsb29wLgorCQorCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NTZWN0aW9uQ291bnQgPD0gMHgwRkZGRik7CisJc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSA9IGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NTZWN0aW9uQ291bnQ7CisKKwkvLyBOb3cgbGV0J3MgcnVuIHRoZSByZWxvY2F0aW9uIGVuZ2luZS4gIFdlIHJ1biBpdCBvbmNlIHBlcgorCS8vIHNlY3Rpb24gaW4gdGhlIHRhYmxlLiAgRWFjaCB0aW1lIGFyb3VuZCwgd2UgaW5pdCB0aGUgZW5naW5lCisJLy8gYW5kIHRoZW4gbG9vcCBhZ2FpbiwgdGhpcyB0aW1lIGV4ZWN1dGluZyBpbmRpdmlkdWFsIG9wY29kZXMuCisJLy8gVGhlIG9wY29kZSBsb29wIHRlcm1pbmF0ZXMgd2hlbiB0aGUgcmVsb2NhdGlvbiBQQworCS8vIChzdGF0ZS5jdXJyZW50UmVsb2MpIGhpdHMgdGhlIGZpbmFsIG9wY29kZSAoc3RhdGUudGVybWluYXRpbmdSZWxvYykuCisJCisJLy8gTm90ZToKKwkvLyBPbmUgZGVzaWduIGRlY2lzaW9uIEkgbWFkZSB3YXMgdG8gdG90YWxseSByZS1pbml0IHRoZSBlbmdpbmUgc3RhdGUKKwkvLyBmb3IgZWFjaCBzZWN0aW9uLiAgVGhlIENGTSBzcGVjIGlzIHVuY2xlYXIgYXMgdG8gd2hldGhlciB5b3UncmUgc3VwcG9zZWQKKwkvLyB0byB0b3RhbGx5IHJlLWluaXQgdGhlIGVuZ2luZSBzdGF0ZSwgb3IganVzdCByZS1pbml0IHRoZSBzZWN0aW9uLXNwZWNpZmljCisJLy8gc3RhdGUgKGllIGN1cnJlbnRSZWxvYywgdGVybWluYXRpbmdSZWxvYywgYW5kIHJlbG9jQWRkcmVzcykuICBJIGhvcGUgdGhpcworCS8vIGlzIGNvcnJlY3QsIGJ1dCBpdCdzIGhhcmQgdG8gdGVzdCB3aXRob3V0IGhhdmluZyBhIGZyYWdtZW50IHdpdGggbXVsdGlwbGUKKwkvLyByZWxvY2F0ZWQgc2VjdGlvbnMsIHdoaWNoIGlzIGRpZmZpY3VsdCB0byBjcmVhdGUuCisJCisJLy8gSG93IGRvIEkgZGVjaWRlIHdoaWNoIG9wY29kZXMgc2hvdWxkIGJlIGVmZmVjdGl2ZSAoaWUgbWFrZSBjaGFuZ2VzIHRvCisJLy8gdGhlIHNlY3Rpb24gYmVpbmcgcmVsb2NhdGVkKSBhbmQgd2hpY2ggb3Bjb2RlcyBzaG91bGQganVzdCBiZSBleGVjdXRlZAorCS8vIGZvciB0aGVpciBzaWRlIGVmZmVjdHMgKGllIHVwZGF0ZWQgc3RhdGUucmVsb2NBZGRyZXNzIG9yIHN0YXRlLmltcG9ydEluZGV4KT8KKwkvLyBUaGUgYW5zd2VyIGlzIGJvdGggc2ltcGxlIGFuZCBzdWJ0bGUuICBPcGNvZGVzIHdob3NlIGFjdGlvbnMgYXJlIGRlcGVuZGVudAorCS8vIG9uIGEgc3ltYm9sIHRoYXQgd2FzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IGFyZSBlZmZlY3RpdmUsIHRob3NlIHRoYXQKKwkvLyBhbiBpbmRlcGVuZGVudCBvZiB0aG9zZSBzeW1ib2xzIGFyZSBub3QuICBUaGUgb25seSBvcGNvZGVzIHRoYXQgdXNlCisJLy8gc3ltYm9saWMgdmFsdWVzIGFyZSBrUEVGUmVsb2NJbXBvcnRSdW4gYW5kIGtQRUZSZWxvY1NtQnlJbXBvcnQsIGFuZAorCS8vIHRoZXNlIGFyZSBvbmx5IGlmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkuCisJLy8gQWxsIG90aGVyIGNhc2VzIGFyZSBleGVjdXRlZCBmb3IgdGhlaXIgc2lkZSBlZmZlY3RzIG9ubHkuCisJLy8KKwkvLyBIb3cgZG8gSSBkZXRlcm1pbmUgaWYgYSBzeW1ib2wgaXMgaW4gdGhlIHdlYWsgbGlua2VkIGxpYnJhcnk/CisJLy8gV2VsbCBJIGtub3cgdGhlIHN5bWJvbCdzIGluZGV4IGFuZCBJIGtub3cgdGhlIGxvd2VyIGJvdW5kIGFuZCBjb3VudAorCS8vIG9mIHRoZSBzeW1ib2xzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5LCBzbyBJIGp1c3QgZG8gYSBzaW1wbGUKKwkvLyBib3VuZHMgdGVzdCwgaWUgCisJLy8KKwkvLyAgIGZpcnN0SW1wb3J0ZWRTeW1ib2wgPD0gaW1wb3J0SW5kZXggPCBmaXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0ZWRTeW1ib2xDb3VudAorCisJLy8gRnJvbSB0aGlzIGNvZGUsIGl0J3MgcmVsYXRpdmVseSBlYXN5IHRvIHNlZSB3aGljaCByZWxvY2F0aW9uIG9wY29kZXMKKwkvLyBhcmVuJ3QgaW1wbGVtZW50ZWQuICBJZiB5b3UgZXZlciBlbmNvdW50ZXIgb25lLCB5b3UnbGwgZmluZCB5b3Vyc2VsZgorCS8vIGluIE1hY3NCdWcgd2l0aCBhIG1lc3NhZ2UgdGVsbGluZyB5b3Ugd2hpY2ggb3Bjb2RlIHdhcyBmb3VuZC4gIFRoZQorCS8vIHR3byBiaWcgZ3JvdXBzIG9mIG9wY29kZXMgSSBza2lwcGVkIHdlcmUgdGhlIGxhcmdlIGZvcm1hdCBvcGNvZGVzCisJLy8gYW5kIHRoZSByZXBlYXRpbmcgb3Bjb2Rlcy4gIEkgc2tpcHBlZCB0aGVtIGJlY2F1c2U6CisJLy8KKwkvLyBhKSBJIGhhdmVuJ3QgZ290IGEgd2F5IHRvIGdlbmVyYXRlIHRoZW0gaW4gYSBQRUYgY29udGFpbmVyIHRoYXQgSSBjYW4gCisJLy8gICAgdGVzdCBhZ2FpbnN0LiBXaXRob3V0IHRoYXQsIHRoZXJlJ3Mgbm8gd2F5IEkgY291bGQgYmUgYXNzdXJlZCB0aGF0CisJLy8gICAgdGhlIGNvZGUgd29ya2VkLgorCS8vCisJLy8gYikgSSdtIGxhenkuCisKKwllcnIgPSBub0VycjsKKwl3aGlsZSAoIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgPiAwICkgeworCQllcnIgPSBJbml0RW5naW5lU3RhdGUoZnJhZ1RvRml4LCBzZWN0aW9uc0xlZnRUb1JlbG9jYXRlLCAmc3RhdGUpOworCQlpZiAoZXJyICE9IG5vRXJyKSB7CisJCQlnb3RvIGxlYXZlTm93OworCQl9CisJCQorCQl3aGlsZSAoIHN0YXRlLmN1cnJlbnRSZWxvYyAhPSBzdGF0ZS50ZXJtaW5hdGluZ1JlbG9jICkgeworCQkJCisJCQlNb3JlQXNzZXJ0USggc3RhdGUuY3VycmVudFJlbG9jIDwgdG90YWxSZWxvY3MgKTsKKworCQkJb3BDb2RlID0gcmVsb2NJbnN0clRhYmxlW3N0YXRlLmN1cnJlbnRSZWxvY107CisJCQlzd2l0Y2ggKCBQRUZSZWxvY0Jhc2ljT3Bjb2RlKG9wQ29kZSkgKSB7CisJCQkJY2FzZSBrUEVGUmVsb2NCeVNlY3REV2l0aFNraXA6CisJCQkJCXsKKwkJCQkJCVVJbnQxNiBza2lwQ291bnQ7CisJCQkJCQlVSW50MTYgcmVsb2NDb3VudDsKKwkJCQkJCQorCQkJCQkJc2tpcENvdW50ID0gKChvcENvZGUgPj4gNikgJiAweDAwRkYpOworCQkJCQkJcmVsb2NDb3VudCA9IChvcENvZGUgJiAweDAwM0YpOworCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IHNraXBDb3VudDsKKwkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSByZWxvY0NvdW50OworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2Uga1BFRlJlbG9jQnlTZWN0QzoKKwkJCQljYXNlIGtQRUZSZWxvY0J5U2VjdEQ6CisJCQkJCXsKKwkJCQkJCVVJbnQxNiBydW5MZW5ndGg7CisKKwkJCQkJCXJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKwkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSBydW5MZW5ndGg7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBrUEVGUmVsb2NUVmVjdG9yMTI6CisJCQkJCXsKKwkJCQkJCVVJbnQxNiBydW5MZW5ndGg7CisKKwkJCQkJCXJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKwkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSAocnVuTGVuZ3RoICogMyk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBrUEVGUmVsb2NUVmVjdG9yODoKKwkJCQljYXNlIGtQRUZSZWxvY1ZUYWJsZTg6CisJCQkJCXsKKwkJCQkJCVVJbnQxNiBydW5MZW5ndGg7CisKKwkJCQkJCXJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKwkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSAocnVuTGVuZ3RoICogMik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBrUEVGUmVsb2NJbXBvcnRSdW46CisJCQkJCXsKKwkJCQkJCVVJbnQzMiBzeW1ib2xWYWx1ZTsKKwkJCQkJCVVJbnQxNiBydW5MZW5ndGg7CisJCQkJCQkKKwkJCQkJCXJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKwkJCQkJCXdoaWxlIChydW5MZW5ndGggPiAwKSB7CisJCQkJCQkJaWYgKCBzdGF0ZS5pbXBvcnRJbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIHN0YXRlLmltcG9ydEluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKKwkJCQkJCQkJZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIHN0YXRlLmltcG9ydEluZGV4LCAmc3ltYm9sVmFsdWUpOworCQkJCQkJCQlpZiAoZXJyICE9IG5vRXJyKSB7CisJCQkJCQkJCQlnb3RvIGxlYXZlTm93OworCQkJCQkJCQl9CisJCQkJCQkJCSooc3RhdGUucmVsb2NBZGRyZXNzKSArPSBzeW1ib2xWYWx1ZTsKKwkJCQkJCQl9CisJCQkJCQkJc3RhdGUuaW1wb3J0SW5kZXggKz0gMTsKKwkJCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKwkJCQkJCQlydW5MZW5ndGggLT0gMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIGtQRUZSZWxvY1NtQnlJbXBvcnQ6CisJCQkJCXsKKwkJCQkJCVVJbnQzMiBzeW1ib2xWYWx1ZTsKKwkJCQkJCVVJbnQzMiBpbmRleDsKKworCQkJCQkJaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKwkJCQkJCWlmICggaW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBpbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7CisJCQkJCQkJZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIGluZGV4LCAmc3ltYm9sVmFsdWUpOworCQkJCQkJCWlmIChlcnIgIT0gbm9FcnIpIHsKKwkJCQkJCQkJZ290byBsZWF2ZU5vdzsKKwkJCQkJCQl9CisJCQkJCQkJKihzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IHN5bWJvbFZhbHVlOworCQkJCQkJfQorCQkJCQkJc3RhdGUuaW1wb3J0SW5kZXggPSBpbmRleCArIDE7CisJCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIGtQRUZSZWxvY1NtU2V0U2VjdEM6CisJCQkJCXsKKwkJCQkJCVVJbnQzMiBpbmRleDsKKworCQkJCQkJaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKwkJCQkJCXN0YXRlLnNlY3Rpb25DID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgaW5kZXgpOworCQkJCQkJTW9yZUFzc2VydFEoc3RhdGUuc2VjdGlvbkMgIT0gbmlsKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIGtQRUZSZWxvY1NtU2V0U2VjdEQ6CisJCQkJCXsKKwkJCQkJCVVJbnQzMiBpbmRleDsKKworCQkJCQkJaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKwkJCQkJCXN0YXRlLnNlY3Rpb25EID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgaW5kZXgpOworCQkJCQkJTW9yZUFzc2VydFEoc3RhdGUuc2VjdGlvbkQgIT0gbmlsKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIGtQRUZSZWxvY1NtQnlTZWN0aW9uOgorCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBrUEVGUmVsb2NJbmNyUG9zaXRpb246CisJCQkJCXsKKwkJCQkJCVVJbnQxNiBvZmZzZXQ7CisJCQkJCQkKKwkJCQkJCW9mZnNldCA9IChvcENvZGUgJiAweDBGRkYpICsgMTsKKwkJCQkJCSgoY2hhciAqKSBzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IG9mZnNldDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIGtQRUZSZWxvY1NtUmVwZWF0OgorCQkJCQkjaWYgTU9SRV9ERUJVRworCQkJCQkJRGVidWdTdHIoIlxwUnVuUmVsb2NhdGlvbkVuZ2luZToga1BFRlJlbG9jU21SZXBlYXQgbm90IHlldCBpbXBsZW1lbnRlZCIpOworCQkJCQkjZW5kaWYKKwkJCQkJZXJyID0gdW5pbXBFcnI7CisJCQkJCWdvdG8gbGVhdmVOb3c7CisJCQkJCWJyZWFrOworCQkJCWNhc2Uga1BFRlJlbG9jU2V0UG9zaXRpb246CisJCQkJCXsKKwkJCQkJCVVJbnQzMiBvZmZzZXQ7CisKKwkJCQkJCS8vIExvdCdzIG9mIGZvbGtzIGhhdmUgdHJpZWQgdmFyaW91cyBpbnRlcnByZXRhdGlvbnMgb2YgdGhlIGRlc2NyaXB0aW9uIG9mIAorCQkJCQkJLy8gdGhpcyBvcENvZGUgaW4gIk1hYyBPUyBSdW50aW1lIEFyY2hpdGVjdHVyZXMiICh3aGljaCBzdGF0ZXMgIlRoaXMgaW5zdHJ1Y3Rpb24gCisJCQkJCQkvLyBzZXRzIHJlbG9jQWRkcmVzcyB0byB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBvZmZzZXQgb2Zmc2V0LiIgICpzbWlsZSopLgorCQkJCQkJLy8gSSBldmVudHVhbGx5IGR1ZyBpbnRvIHRoZSBDRk0gc291cmNlIGNvZGUgdG8gZmluZCBteSBpbnRlcnByZXRhdGlvbiwgd2hpY2ggCisJCQkJCQkvLyBJIGJlbGlldmUgaXMgY29ycmVjdC4gIFRoZSBrZXkgcG9pbnQgaXMgdGh0IHRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gCisJCQkJCQkvLyB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gZm9yIHdoaWNoIHRoZXNlIHJlbG9jYXRpb25zIGFyZSBiZWluZyBwZXJmb3JtZWQuCisJCQkJCQkKKwkJCQkJCS8vIFNraXAgdG8gbmV4dCByZWxvYyB3b3JkLCB3aGljaCBpcyB0aGUgc2Vjb25kIGNodW5rIG9mIHRoZSBvZmZzZXQuCisJCQkJCQkKKwkJCQkJCXN0YXRlLmN1cnJlbnRSZWxvYyArPSAxOworCQkJCQkJCisJCQkJCQkvLyBFeHRyYWN0IG9mZnNldCBiYXNlZCBvbiB0aGUgbW9zdCBzaWduaWZpY2FudCAxMCBiaXRzIGluIG9wQ29kZSBhbmQgCisJCQkJCQkvLyB0aGUgbmV4dCBzaWduaWZpY2FudCAxNiBiaXRzIGluIHRoZSBuZXh0IHJlbG9jIHdvcmQuCisJCQkJCQkKKwkJCQkJCW9mZnNldCA9IFBFRlJlbG9jU2V0UG9zRnVsbE9mZnNldChvcENvZGUsIHJlbG9jSW5zdHJUYWJsZVtzdGF0ZS5jdXJyZW50UmVsb2NdKTsKKworCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzID0gKFVJbnQzMiAqKSAoICgoY2hhciAqKSBzdGF0ZS5zZWN0aW9uQmFzZSkgKyBvZmZzZXQpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2Uga1BFRlJlbG9jTGdCeUltcG9ydDoKKwkJCQkJeworCQkJCQkJVUludDMyIHN5bWJvbFZhbHVlOworCQkJCQkJVUludDMyIGluZGV4OworCisJCQkJCQkvLyBHZXQgdGhlIDI2IGJpdCBzeW1ib2wgaW5kZXggZnJvbSB0aGUgY3VycmVudCBhbmQgbmV4dCByZWxvYyB3b3Jkcy4KKwkJCQkJCQorCQkJCQkJc3RhdGUuY3VycmVudFJlbG9jICs9IDE7CisJCQkJCQlpbmRleCA9IFBFRlJlbG9jTGdCeUltcG9ydEZ1bGxJbmRleChvcENvZGUsIHJlbG9jSW5zdHJUYWJsZVtzdGF0ZS5jdXJyZW50UmVsb2NdKTsKKwkJCQkJCQorCQkJCQkJaWYgKCBpbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIGluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKKwkJCQkJCQllcnIgPSBMb29rdXBTeW1ib2wobG9va3VwLCByZWZDb24sIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiwgaW5kZXgsICZzeW1ib2xWYWx1ZSk7CisJCQkJCQkJaWYgKGVyciAhPSBub0VycikgeworCQkJCQkJCQlnb3RvIGxlYXZlTm93OworCQkJCQkJCX0KKwkJCQkJCQkqKHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gc3ltYm9sVmFsdWU7CisJCQkJCQl9CisJCQkJCQlzdGF0ZS5pbXBvcnRJbmRleCA9IGluZGV4ICsgMTsKKwkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2Uga1BFRlJlbG9jTGdSZXBlYXQ6CisJCQkJCSNpZiBNT1JFX0RFQlVHCisJCQkJCQlEZWJ1Z1N0cigiXHBSdW5SZWxvY2F0aW9uRW5naW5lOiBrUEVGUmVsb2NMZ1JlcGVhdCBub3QgeWV0IGltcGxlbWVudGVkIik7CisJCQkJCSNlbmRpZgorCQkJCQllcnIgPSB1bmltcEVycjsKKwkJCQkJZ290byBsZWF2ZU5vdzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBrUEVGUmVsb2NMZ1NldE9yQnlTZWN0aW9uOgorCQkJCQkjaWYgTU9SRV9ERUJVRworCQkJCQkJRGVidWdTdHIoIlxwUnVuUmVsb2NhdGlvbkVuZ2luZToga1BFRlJlbG9jTGdTZXRPckJ5U2VjdGlvbiBub3QgeWV0IGltcGxlbWVudGVkIik7CisJCQkJCSNlbmRpZgorCQkJCQllcnIgPSB1bmltcEVycjsKKwkJCQkJZ290byBsZWF2ZU5vdzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBrUEVGUmVsb2NVbmRlZmluZWRPcGNvZGU6CisJCQkJCWVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOworCQkJCQlnb3RvIGxlYXZlTm93OworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlNb3JlQXNzZXJ0UShmYWxzZSk7CisJCQkJCWVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOworCQkJCQlnb3RvIGxlYXZlTm93OworCQkJCQlicmVhazsKKwkJCX0KKwkJCXN0YXRlLmN1cnJlbnRSZWxvYyArPSAxOworCQl9CisJCQorCQlzZWN0aW9uc0xlZnRUb1JlbG9jYXRlIC09IDE7CisJfQorCitsZWF2ZU5vdzoKKwlyZXR1cm4gZXJyOworfQorCitleHRlcm4gcGFzY2FsIE9TU3RhdHVzIENGTUxhdGVJbXBvcnRDb3JlKGNvbnN0IENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciAqZnJhZ1RvRml4TG9jYXRvciwKKwkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCisJCQkJCQkJCQkJQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisJCQkJCQkJCQkJQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCisJCQkJCQkJCQkJQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgbG9va3VwLAorCQkJCQkJCQkJCXZvaWQgKnJlZkNvbikKKwkvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCit7CisJT1NTdGF0dXMgZXJyOworCU9TU3RhdHVzIGp1bms7CisJRnJhZ1RvRml4SW5mbyBmcmFnVG9GaXg7CisJUEVGSW1wb3J0ZWRMaWJyYXJ5ICppbXBvcnRMaWJyYXJ5OworCWNoYXIgd2Vha0xpbmtlZExpYnJhcnlOYW1lQ1N0cmluZ1syNTZdOworCisJTW9yZUFzc2VydFEoZnJhZ1RvRml4TG9jYXRvciAhPSBuaWwpOwkKKwlNb3JlQXNzZXJ0UShmcmFnVG9GaXhDb25uSUQgIT0gbmlsKTsKKwlNb3JlQXNzZXJ0UShmcmFnVG9GaXhJbml0Um91dGluZSAhPSBuaWwpOworCU1vcmVBc3NlcnRRKHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSAhPSBuaWwpOwkKKwlNb3JlQXNzZXJ0UShsb29rdXAgIT0gbmlsKTsJCisJCisJLy8gRmlsbCBvdXQgdGhlIGJpdHMgb2YgZnJhZ1RvRml4IHdoaWNoIGFyZSBwYXNzZWQgaW4KKwkvLyBieSB0aGUgY2xpZW50LgorCQorCU1vcmVCbG9ja1plcm8oJmZyYWdUb0ZpeCwgc2l6ZW9mKGZyYWdUb0ZpeCkpOworCWZyYWdUb0ZpeC5sb2NhdG9yID0gKmZyYWdUb0ZpeExvY2F0b3I7CisJZnJhZ1RvRml4LmNvbm5JRCAgPSBmcmFnVG9GaXhDb25uSUQ7CisJZnJhZ1RvRml4LmluaXRSb3V0aW5lID0gZnJhZ1RvRml4SW5pdFJvdXRpbmU7CisJCisJLy8gTWFrZSBhIEMgc3RyaW5nIGZyb20gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgorCQorCUJsb2NrTW92ZURhdGEod2Vha0xpbmtlZExpYnJhcnlOYW1lICsgMSwgd2Vha0xpbmtlZExpYnJhcnlOYW1lQ1N0cmluZywgd2Vha0xpbmtlZExpYnJhcnlOYW1lWzBdKTsKKwl3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nW3dlYWtMaW5rZWRMaWJyYXJ5TmFtZVswXV0gPSAwOworCisJLy8gR2V0IHRoZSBiYXNpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmcmFnbWVudC4KKwkvLyBGaWxscyBvdXQgdGhlIGNvbnRhaW5lckhlYWRlciwgc2VjdGlvbkhlYWRlcnMsIGxvYWRlclNlY3Rpb24gYW5kIGZpbGVSZWYgZmllbGRzCisJLy8gb2YgZnJhZ1RvRml4LgorCQorCWVyciA9IFJlYWRDb250YWluZXJCYXNpY3MoJmZyYWdUb0ZpeCk7CisKKwkvLyBTZXQgdXAgdGhlIGJhc2UgYWRkcmVzcyBmaWVsZHMgaW4gZnJhZ1RvRml4IChpZSBzZWN0aW9uMEJhc2UgYW5kIHNlY3Rpb24xQmFzZSkKKwkvLyBieSBsb29raW5nIHVwIG91ciBpbml0IHJvdXRpbmUgKGZyYWdUb0ZpeC5pbml0Um91dGluZSkgYW5kIHN1YnRyYWN0aW5nCisJLy8gYXdheSB0aGUgc2VjdGlvbiBvZmZzZXRzICh3aGljaCB3ZSBnZXQgZnJvbSB0aGUgZGlzayBjb3B5IG9mIHRoZSBzZWN0aW9uKQorCS8vIHRvIGRlcml2ZSB0aGUgYmFzZXMgb2YgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMuCisJCisJaWYgKGVyciA9PSBub0VycikgeworCQllcnIgPSBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzKCZmcmFnVG9GaXgpOworCX0KKwkKKwkvLyBMb29rIGluc2lkZSB0aGUgbG9hZGVyIHNlY3Rpb24gZm9yIHRoZSBpbXBvcnQgbGlicmFyeSBkZXNjcmlwdGlvbgorCS8vIG9mIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4gIFdlIG5lZWQgdGhpcyB0byBrbm93IHRoZSByYW5nZSBvZiBzeW1ib2wKKwkvLyBpbmRleGVzIHdlJ3JlIGdvaW5nIHRvIGZpeCB1cC4KKwkKKwlpZiAoZXJyID09IG5vRXJyKSB7CisJCWVyciA9IEZpbmRJbXBvcnRMaWJyYXJ5KGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nLCAmaW1wb3J0TGlicmFyeSk7CisJfQorCQorCS8vIERvIGEgcXVpY2sgY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGxpYnJhcnkgd2FzIGFjdHVhbGx5IGltcG9ydGVkIHdlYWsuCisJLy8gSWYgaXQgd2Fzbid0LCBpdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byByZXNvbHZlIGl0cyB3ZWFrIGltcG9ydHMKKwkvLyBsYXRlciBvbi4gIFJlc29sdmluZyB0aGVtIGFnYWluIGlzIGxpa2VseSB0byBiZSBiYWQuCisJCisJaWYgKGVyciA9PSBub0VycikgeworCQlpZiAoKGltcG9ydExpYnJhcnktPm9wdGlvbnMgJiBrUEVGV2Vha0ltcG9ydExpYk1hc2spID09IDApIHsKKwkJCWVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKKwkJfQorCX0KKwkKKwkvLyBOb3cgcnVuIHRoZSBtYWluIHJlbG9jYXRpb24gZW5naW5lLgorCQorCWlmIChlcnIgPT0gbm9FcnIpIHsKKwkJZXJyID0gUnVuUmVsb2NhdGlvbkVuZ2luZSgmZnJhZ1RvRml4LCBpbXBvcnRMaWJyYXJ5LCBsb29rdXAsIHJlZkNvbik7CisJfQorCQorCS8vIENsZWFuIHVwLgorCQorCWlmIChmcmFnVG9GaXguZGlzcG9zZVNlY3Rpb25Qb2ludGVycykgeworCQlpZiAoZnJhZ1RvRml4LmZpbGVSZWYgIT0gMCkgeworCQkJanVuayA9IEZTQ2xvc2UoZnJhZ1RvRml4LmZpbGVSZWYpOworCQkJTW9yZUFzc2VydFEoanVuayA9PSBub0Vycik7CisJCX0KKwkJaWYgKGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uICE9IG5pbCkgeworCQkJRGlzcG9zZVB0ciggKFB0cikgZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24pOworCQkJTW9yZUFzc2VydFEoTWVtRXJyb3IoKSA9PSBub0Vycik7CisJCX0KKwkJaWYgKGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyAhPSBuaWwpIHsKKwkJCURpc3Bvc2VQdHIoIChQdHIpIGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyk7CisJCQlNb3JlQXNzZXJ0UShNZW1FcnJvcigpID09IG5vRXJyKTsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgcGFzY2FsIE9TU3RhdHVzIEZyYWdtZW50TG9va3VwKENvbnN0U3RyMjU1UGFyYW0gc3ltTmFtZSwgQ0ZyYWdTeW1ib2xDbGFzcyBzeW1DbGFzcywKKwkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCisJLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuIAorCS8vIGxhdGUgaW1wb3J0aW5nIGZyb20gYSBDRk0gc2hhcmVkIGxpYnJhcnkuCit7CisJT1NTdGF0dXMgZXJyOworCUNGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0OworCUNGcmFnU3ltYm9sQ2xhc3MgIGZvdW5kU3ltQ2xhc3M7CisJCisJTW9yZUFzc2VydFEoc3ltTmFtZSAhPSBuaWwpOworCU1vcmVBc3NlcnRRKHN5bUFkZHIgIT0gbmlsKTsKKwlNb3JlQXNzZXJ0UShyZWZDb24gICE9IG5pbCk7CisJCisJY29ubklEVG9JbXBvcnQgPSAoQ0ZyYWdDb25uZWN0aW9uSUQpIHJlZkNvbjsKKwkKKwkvLyBTaGFtZSB0aGVyZSdzIG5vIHdheSB0byB2YWxpZGF0ZSB0aGF0IGNvbm5JRFRvSW1wb3J0IGlzIHZhbGlkLgorCisJZXJyID0gRmluZFN5bWJvbChjb25uSURUb0ltcG9ydCwgc3ltTmFtZSwgKFB0ciAqKSBzeW1BZGRyLCAmZm91bmRTeW1DbGFzcyk7CisJaWYgKGVyciA9PSBub0VycikgeworCQkvLyBJZiB0aGUgc3ltYm9sIGlzbid0IG9mIHRoZSByaWdodCBjbGFzcywgd2UgYWN0IGxpa2Ugd2UgZGlkbid0IAorCQkvLyBmaW5kIGl0LCBidXQgYWxzbyBhc3NlcnQgaW4gdGhlIGRlYnVnIGJ1aWxkIGJlY2F1c2Ugd2VpcmQgdGhpbmdzIAorCQkvLyBhcmUgYWZvb3QuCisJCWlmIChmb3VuZFN5bUNsYXNzICE9IHN5bUNsYXNzKSB7CisJCQlNb3JlQXNzZXJ0UShmYWxzZSk7CisJCQkqc3ltQWRkciA9IG5pbDsKKwkJCWVyciA9IGNmcmFnTm9TeW1ib2xFcnI7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0TGlicmFyeShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCisJCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAorCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0KQorCS8vIFNlZSBjb21tZW50cyBpbiBpbnRlcmZhY2UgcGFydC4KK3sKKwlNb3JlQXNzZXJ0UShjb25uSURUb0ltcG9ydCAhPSBuaWwpOworCXJldHVybiBDRk1MYXRlSW1wb3J0Q29yZShmcmFnVG9GaXhMb2NhdG9yLCBmcmFnVG9GaXhDb25uSUQsIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorCQkJCQkJCQkJCXdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwgRnJhZ21lbnRMb29rdXAsIGNvbm5JRFRvSW1wb3J0KTsKK30KKworc3RhdGljIHBhc2NhbCBPU1N0YXR1cyBCdW5kbGVMb29rdXAoQ29uc3RTdHIyNTVQYXJhbSBzeW1OYW1lLCBDRnJhZ1N5bWJvbENsYXNzIHN5bUNsYXNzLAorCQkJCQkJCQkJdm9pZCAqKnN5bUFkZHIsIHZvaWQgKnJlZkNvbikKKwkvLyBUaGlzIGlzIHRoZSBDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBjYWxsYmFjayB1c2VkIHdoZW4gCisJLy8gbGF0ZSBpbXBvcnRpbmcgZnJvbSBhIENGQnVuZGxlLgoreworCU9TU3RhdHVzIAllcnI7CisJQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQ7CisJQ0ZTdHJpbmdSZWYgc3ltTmFtZVN0cjsKKwkKKwlNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7CisJTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOworCU1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKKwkKKwlzeW1OYW1lU3RyID0gbmlsOworCQorCWJ1bmRsZVRvSW1wb3J0ID0gKENGQnVuZGxlUmVmKSByZWZDb247CisJCisJLy8gU2hhbWUgdGhlcmUncyBubyB3YXkgdG8gdmFsaWRhdGUgdGhhdCBidW5kbGVUb0ltcG9ydCBpcyByZWFsbHkgYSBidW5kbGUuCisJCisJLy8gV2UgY2FuIG9ubHkgZmluZCBmdW5jdGlvbiBwb2ludGVycyBiZWNhdXNlIENGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZSAKKwkvLyBvbmx5IHdvcmtzIGZvciBmdW5jdGlvbiBwb2ludGVycy4gIFNvIGlmIHRoZSBjbGllbnQgaXMgYXNraW5nIGZvciBzb21ldGhpbmcgCisJLy8gb3RoZXIgdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgKGllIFRWZWN0b3Igc3ltYm9sKSB0aGVuIHdlIGRvbid0IGV2ZW4gdHJ1ZS4KKwkvLyBBbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB0aGlzIHNob3dzIGEgY2VydGFpbiBsYWNrIG9mIAorCS8vIHVuZGVyc3RhbmRpbmcgb24gdGhlIHBhcnQgb2YgdGhlIGNsaWVudC4KKwkvLworCS8vIENGIGlzIGJlaW5nIHJldmlzZSB0byBzdXBwb3J0IGFjY2Vzc2luZyBkYXRhIHN5bWJvbHMgdXNpbmcgYSBuZXcgQVBJCisJLy8gKGN1cnJlbnRseSB0aGlzIGlzIGF2YWlsYWJsZSB0byBBcHBsZSBpbnRlcm5hbCBkZXZlbG9wZXJzIGFzIAorCS8vIENGQnVuZGxlR2V0RGF0YVBvaW50ZXJGb3JOYW1lKS4gIFdoZW4gdGhlIG5ldyBBUEkgaXMgYXZhaWxhYmxlIGluIGEgCisJLy8gcHVibGljIGhlYWRlciBmaWxlIEkgc2hvdWxkIHJldmlzZSB0aGlzIGNvZGUgdG8gbGlmdCB0aGlzIHJlc3RyaWN0aW9uLgorCQorCWVyciA9IG5vRXJyOworCWlmIChzeW1DbGFzcyAhPSBrVFZlY3RvckNGcmFnU3ltYm9sKSB7CisJCU1vcmVBc3NlcnRRKGZhbHNlKTsKKwkJZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKKwl9CisJaWYgKGVyciA9PSBub0VycikgeworCQlzeW1OYW1lU3RyID0gQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKGtDRkFsbG9jYXRvclN5c3RlbURlZmF1bHQsIAorCQkJCQkJCQkJCQkJCXN5bU5hbWUsIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pOworCQlpZiAoc3ltTmFtZVN0ciA9PSBuaWwpIHsKKwkJCWVyciA9IGNvcmVGb3VuZGF0aW9uVW5rbm93bkVycjsKKwkJfQorCX0KKwlpZiAoZXJyID09IG5vRXJyKSB7CisJCSpzeW1BZGRyID0gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lKGJ1bmRsZVRvSW1wb3J0LCBzeW1OYW1lU3RyKTsKKwkJaWYgKCpzeW1BZGRyID09IG5pbCkgeworCQkJZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKKwkJfQorCX0KKwlpZiAoc3ltTmFtZVN0ciAhPSBuaWwpIHsKKwkJQ0ZSZWxlYXNlKHN5bU5hbWVTdHIpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitleHRlcm4gcGFzY2FsIE9TU3RhdHVzIENGTUxhdGVJbXBvcnRCdW5kbGUoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAorCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKwkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKKwkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKKwkJCQkJCQkJCQlDRkJ1bmRsZVJlZiBidW5kbGVUb0ltcG9ydCkKKwkvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCit7CisJTW9yZUFzc2VydFEoYnVuZGxlVG9JbXBvcnQgIT0gbmlsKTsKKwlyZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKKwkJCQkJCQkJCQl3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEJ1bmRsZUxvb2t1cCwgYnVuZGxlVG9JbXBvcnQpOworfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5oIGIvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYzYTg5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmgKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisJRmlsZToJCUNGTUxhdGVJbXBvcnQuaAorCisJQ29udGFpbnM6CUludGVyZmFjZSB0byBDRk0gbGF0ZSBpbXBvcnQgbGlicmFyeS4KKworCVdyaXR0ZW4gYnk6CVF1aW5uCisKKwlDb3B5cmlnaHQ6CUNvcHlyaWdodCCpIDE5OTkgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKwkJCQlZb3UgbWF5IGluY29ycG9yYXRlIHRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGludG8geW91ciBwcm9ncmFtKHMpIHdpdGhvdXQKKwkJCQlyZXN0cmljdGlvbi4gVGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaGFzIGJlZW4gcHJvdmlkZWQgIkFTIElTIiBhbmQgdGhlCisJCQkJcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvcGVyYXRpb24gaXMgeW91cnMuIFlvdSBhcmUgbm90IHBlcm1pdHRlZCB0byByZWRpc3RyaWJ1dGUKKwkJCQl0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBhcyAiQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIiBhZnRlciBoYXZpbmcgbWFkZQorCQkJCWNoYW5nZXMuIElmIHlvdSdyZSBnb2luZyB0byByZS1kaXN0cmlidXRlIHRoZSBzb3VyY2UsIHdlIHJlcXVpcmUgdGhhdCB5b3UgbWFrZQorCQkJCWl0IGNsZWFyIGluIHRoZSBzb3VyY2UgdGhhdCB0aGUgY29kZSB3YXMgZGVzY2VuZGVkIGZyb20gQXBwbGUgc2FtcGxlIHNvdXJjZQorCQkJCWNvZGUsIGJ1dCB0aGF0IHlvdSd2ZSBtYWRlIGNoYW5nZXMuCisKKwlDaGFuZ2UgSGlzdG9yeSAobW9zdCByZWNlbnQgZmlyc3QpOgorCisgICAgICAgICA8Nj4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBDaGFuZ2VzIGZvciBDV1BybzcgTWFjaC1PIGJ1aWxkLgorICAgICAgICAgPDU+ICAgICAxOS85LzAxICAgIFF1aW5uICAgQ2hhbmdlIGNvbW1lbnRzIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCBhbiB1bnBhY2tlZCBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGlzIG5vIGxvbmdlciByZXF1aXJlZC4KKyAgICAgICAgIDw0PiAgICAgMTkvOS8wMSAgICBRdWlubiAgIFNpbXBsaWZpZWQgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBhZnRlciBhIHN1Z2dlc3Rpb24gYnkgRXJpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhbnQuIFlvdSBubyBsb25nZXIgaGF2ZSB0byBDRk0gZXhwb3J0IGEgZHVtbXkgZnVuY3Rpb247IHlvdQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGp1c3QgcGFzcyBpbiB0aGUgYWRkcmVzcyBvZiB5b3VyIGZyYWdtZW50J3MgaW5pdCByb3V0aW5lLgorICAgICAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZCdW5kbGUgc3VwcG9ydC4KKyAgICAgICAgIDwyPiAgICAxOC8xMC85OSAgICBRdWlubiAgIFJlbmFtZWQgQ0ZNTGF0ZUltcG9ydCB0byBDRk1MYXRlSW1wb3J0TGlicmFyeSB0byBhbGxvdyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgorICAgICAgICAgPDE+ICAgICAxNS82Lzk5ICAgIFF1aW5uICAgRmlyc3QgY2hlY2tlZCBpbi4KKyovCisKKyNwcmFnbWEgb25jZQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBNb3JlSXNCZXR0ZXIgU2V0dXAKKworLy8jaW5jbHVkZSAiTW9yZVNldHVwLmgiCisKKy8vIE1hYyBPUyBJbnRlcmZhY2VzCisKKyNpZiAhIE1PUkVfRlJBTUVXT1JLX0lOQ0xVREVTCisJI2luY2x1ZGUgPE1hY1R5cGVzLmg+CisJI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KKwkjaW5jbHVkZSA8RGV2aWNlcy5oPgorCSNpbmNsdWRlIDxDRkJ1bmRsZS5oPgorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoJRkFRCisJLS0tCisJCisJUToJV2hhdCBkb2VzIHRoaXMgbGlicmFyeSBkbz8KKwlBOglJdCBhbGxvd3MgeW91IHRvIHJlc29sdmUgYSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IGF0IHJ1bnRpbWUsCisJICAgCWJ5IHN1cHBseSBhIENGTSBjb25uZWN0aW9uIHRvIHRoZSBsaWJyYXJ5IHRoYXQgc2hvdWxkIHN1YnN0aXR1dGUKKwkgICAJZm9yIHRoZSB3ZWFrIGxpbmtlZCBvbmUuCisJCisJUToJRG9lcyB0aGUgc3Vic3RpdHV0ZWQgbGlicmFyeSBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUKKwkJd2VhayBsaW5rZWQgbGlicmFyeS4KKwlBOglOby4KKwkKKwlROglXaGF0J3MgdGhpcyB1c2VmdWwgZm9yPworCUE6CVRoZSBtb3N0IG9idmlvdXMgZXhhbXBsZSBvZiB3aGVyZSB0aGlzIGlzIHVzZWZ1bCBpcyB3aGVuCisJCXlvdSByZWx5IG9uIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCB0aGUgdXNlciBtaWdodCBkZWxldGUKKwkJb3IgbW92ZS4gIFRvIGNhbiBmaW5kIHRoZSBzaGFyZWQgbGlicmFyeSAocG9zc2libHkgZXZlbgorCQl1c2luZyBDYXRTZWFyY2gpLCBjYWxsIEdldERpc2tGcmFnbWVudCB0byBvcGVuIGEgY29ubmVjdGlvbgorCQl0byBpdCwgbGF0ZSBpbXBvcnQgaXQgdXNpbmcgdGhpcyBsaWJyYXJ5LCBhbmQgdGhlbiB0aGUKKwkJcmVzdCBvZiB5b3VyIGNvZGUgY2FuIGNvbnRpbnVlIHRvIHVzZSB0aGUgc2hhcmVkIGxpYnJhcnkKKwkJYXMgaWYgbm90aGluZyBoYWQgaGFwcGVuZWQuICBObyBtb3JlIGRlZmluaW5nIHRob3VzYW5kcworCQlvZiBzdHViIHJvdXRpbmVzIHdoaWNoIGNhbGwgdGhyb3VnaCByb3V0aW5lIHBvaW50ZXJzLgorCQkKKwkJVGhlcmUgYXJlLCBob3dldmVyLCBudW1lcm91cyBsZXNzIG9idmlvdXMgdXNlcy4gIFlvdSBjYW4KKwkJdXNlIHRoaXMgY29kZSB0byBtYWtlIGEgJ3NlbGYgcmVwYWlyaW5nJyBhcHBsaWNhdGlvbi4gIElmCisJCXRoZSB1c2VyIHJlbW92ZXMgeW91ciBzaGFyZWQgbGlicmFyeSBmcm9tIHRoZSBFeHRlbnNpb25zCisJCWZvbGRlciwgdGhlIHN0YXJ0dXAgY29kZSBmb3IgeW91ciBhcHBsaWNhdGlvbiBjYW4gb2ZmZXIKKwkJdG9yIHJlLWluc3RhbGwgaXQuICBJZiB0aGUgdXNlciBhZ3JlZXMsIHlvdSBjYW4gdGhlbgorCQlyZS1pbnN0YWxsIHlvdXIgc2hhcmVkIGxpYnJhcnksIGxhdGUgaW1wb3J0IGl0LCBhbmQgdGhlbgorCQljb250aW51ZSBydW5uaW5nIHlvdXIgYXBwbGljYXRpb24gaWYgbm90aGluZyBoYXBwZW5lZC4KKwkJCisJCVlvdSBjYW4gZXZlbiB1c2UgdGhpcyBjb2RlIHRvIGZyZWUgeW91cnNlbGYgZnJvbSB0aGUKKwkJRXh0ZW5zaW9ucyBmb2xkZXIgZW50aXJlbHkuICBTYXkgeW91IGhhdmUgYSBzdWl0ZSBvZgorCQlhcHBsaWNhdGlvbnMgdGhhdCBjdXJyZW50bHkgaW5zdGFsbHMgYSBkb3plbiBzaGFyZWQgCisJCWxpYnJhcmllcyBpbiB0aGUgRXh0ZW5zaW9ucyBmb2xkZXIuICBZb3UgY2FuIG1vdmUgdGhvc2UKKwkJbGlicmFyaWVzIHRvIGFub3RoZXIgZm9sZGVyIGVudGlyZWx5IGFuZCBlYWNoIGFwcGxpY2F0aW9uJ3MKKwkJc3RhcnR1cCBjb2RlIGNhbiB0cmFjayBkb3duIHRoZSBsaWJyYXJ5ICh1c2luZyBhbiBhbGlhcworCQlpbiB0aGUgUHJlZmVyZW5jZXMgZmlsZSkgYW5kIGxhdGUgaW1wb3J0IGl0LgorCQkKKwkJQW4gZXZlbiBjb29sZXIgdXNlIGlzIHRvIHByb3ZpZGUgZWFzeSBhYnN0cmFjdGlvbiBsYXllcnMuCisJCVNheSB5b3UgaGF2ZSBhIG5ldHdvcmsgY29kZSBmb3IgYm90aCB0aGUgTWFjVENQCisJCUFQSSBhbmQgdGhlIE9wZW4gVHJhbnNwb3J0IEFQSS4gIFR5cGljYWxseSwgeW91IHdvdWxkIGJlCisJCWZvcmNlIHRvIGRvIHRoaXMgYnkgaGF2aW5nIGFuIGFic3RyYWN0aW9uIGxheWVyIHdoZXJlIGV2ZXJ5CisJCXJvdXRpbmUgY29udGFpbnMgYSBzd2l0Y2ggYmV0d2VlbiBNYWNUQ1AgYW5kIE9ULiAgWW91cgorCQlPcGVuU29ja2V0IHJvdXRpbmUgbWlnaHQgbG9vayBsaWtlOgorCisJCQlzdGF0aWMgaW50IE9wZW5Tb2NrZXQodm9pZCkKKwkJCXsKKwkJCSAgICBpZiAoZ09UQXZhaWxhYmxlKSB7CisJCQkgICAgICAgIHJldHVybiBPcGVuU29ja2V0T1QoKTsKKwkJCSAgICB9IGVsc2UgeworCQkJICAgICAgICByZXR1cm4gT3BlblNvY2tldE1hY1RDUCgpOworCQkJICAgIH0KKwkJCX0KKwkJCisJCVdpdGggdGhpcyBjb2RlLCB5b3UgY2FuIGF2b2lkIHRoYXQgZW50aXJlbHkuICBTaW1wbHkKKwkJd2VhayBsaW5rIHRvIGEgc2hhcmVkIGxpYnJhcnkgdGhhdCB5b3Uga25vdyBpcyBuZXZlcgorCQlnb2luZyB0byBiZSBpbXBsZW1lbnRlZCAoImNyZWE7TXlTb2NrZXRzRHVtbXkiKSBhbmQgdGhlbiwgCisJCWF0IHJ1bnRpbWUsIGRlY2lkZSB3aGV0aGVyIHRoZSBzeXN0ZW0gaGFzIE1hY1RDUCBvciBPVAorCQlhbmQgbGF0ZSBpbXBvcnQgdGhlIHJlbGV2YW50IHJlYWwgaW1wbGVtZW50YXRpb24KKwkJKCJjcmVhO015U29ja2V0c01hY1RDUCIgb3IgImNyZWE7TXlTb2NrZXRzT1QiKS4KKwkJT25lIGJlbmVmaXQgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IG9ubHkgdGhlIE1hY1RDUCBvcgorCQl0aGUgT1QgY29kZSBpcyByZXNpZGVudCBpbiBtZW1vcnkgb24gYW55IGdpdmVuIHN5c3RlbS4KKyovCisKK3R5cGVkZWYgcGFzY2FsIE9TU3RhdHVzICgqQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MpKENvbnN0U3RyMjU1UGFyYW0gc3ltTmFtZSwgQ0ZyYWdTeW1ib2xDbGFzcyBzeW1DbGFzcywKKwkJCQkJCQkJCQkJCQl2b2lkICoqc3ltQWRkciwgdm9pZCAqcmVmQ29uKTsKKwkvLyBDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBkZWZpbmVzIGEgY2FsbGJhY2sgZm9yIENGTUxhdGVJbXBvcnRDb3JlLgorCS8vIFRoZSByb3V0aW5lIGlzIGV4cGVjdGVkIHRvIGxvb2sgdXAgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBuYW1lZCAKKwkvLyBzeW1OYW1lIGFuZCByZXR1cm4gaXQgaW4gKnN5bUFkZHIuICBUaGUgc3ltYm9sIHNob3VsZCBiZSBvZiBjbGFzcyAKKwkvLyBzeW1DbGFzcywgYWx0aG91Z2ggdGhlIGNhbGxiYWNrIGRlY2lkZXMgd2hldGhlciBhIGNsYXNzIG1pc21hdGNoIGlzIAorCS8vIGFuIGVycm9yLiAgcmVmQ29uIGlzIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgb3JpZ2luYWxseSAKKwkvLyBwYXNzZWQgaW4gdG8gQ0ZNTGF0ZUltcG9ydENvcmUuCisJLy8KKwkvLyBJZiB0aGlzIHJvdXRpbmUgcmV0dXJucyBhbiBlcnJvciwgYSBzeW1ib2wgYWRkcmVzcyBvZiAwIGlzIGFzc3VtZWQuIAorCS8vIElmIHRoZSBzeW1ib2wgaXMgbWFya2VkIGFzIGEgd2VhayBpbXBvcnQsIHRoZSBDRk1MYXRlSW1wb3J0Q29yZSB3aWxsIAorCS8vIGNvbnRpbnVlLCBvdGhlcndpc2UgdGhlIENGTUxhdGVJbXBvcnRDb3JlIHJvdXRpbmUgd2lsbCBmYWlsIHdpdGggdGhlIAorCS8vIGVycm9yLgorCQorZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0Q29yZShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCisJCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAorCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorCQkJCQkJCQkJCUNGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKKwkJCQkJCQkJCQl2b2lkICpyZWZDb24pOworCS8vIFRoaXMgcm91dGluZSB3aWxsIGxpbmsgeW91LCBhdCBydW50aW1lLCB0byBzb21lIGxpYnJhcnkgCisJLy8gdGhhdCB5b3Ugd2VyZSB3ZWFrIGxpbmtlZCB0byBhbmQgd2Fzbid0IHByZXNlbnQgd2hlbiB5b3VyCisJLy8gZnJhZ21lbnQgd2FzIHByZXBhcmVkLiAgQXMgd2VsbCBhcyB0aGUgb2J2aW91cyBmdW5jdGlvbmFsaXR5CisJLy8gb2YgYmVpbmcgYWJsZSB0byByZXNvbHZlIHdlYWsgbGlua3MgYWZ0ZXIgcHJlcGFyZSB0aW1lLAorCS8vIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgcHV0IHRvIGEgbnVtYmVyIG9mIGxlc3Mgb2J2aW91cyB1c2VzLAorCS8vIHNvbWUgb2Ygd2hpY2ggYXJlIGRpc2N1c3NlZCBhdCB0aGUgdG9wIG9mIHRoaXMgaGVhZGVyIGZpbGUuCisJLy8KKwkvLyBUbyBjYWxsIHRoaXMgcm91dGluZSwgeW91IG5lZWQgYSBudW1iZXIgb2YgcGllY2VzIG9mIGluZm9ybWF0aW9uOgorCS8vCisJLy8gMS4gZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklEOiAgVGhlIGxvY2F0aW9uIG9mIHlvdXIgb3duCisJLy8gICAgY29kZSBmcmFnbWVudCBvbiBkaXNrIGFuZCB0aGUgQ0ZNIGNvbm5lY3Rpb24gSUQgdG8geW91ciBvd24KKwkvLyAgICBjb2RlIGZyYWdtZW50LiAgVHlwaWNhbGx5IHlvdSBnZXQgdGhpcyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgCisJLy8gICAgZnJhZ21lbnQncyBDRk0gaW5pdCByb3V0aW5lLiAgWW91IG11c3QgZW5zdXJlIHRoYXQKKwkvLyAgICBmcmFnVG9GaXhMb2NhdG9yLT5maWxlU3BlYyBwb2ludHMgdG8gYW4gRlNTcGVjIG9mIHRoZQorCS8vICAgIGZpbGUgd2hpY2ggaG9sZHMgeW91ciBjb2RlIGZyYWdtZW50LgorCS8vCisJLy8gICAgSU1QT1JUQU5UOgorCS8vICAgIFRoZSBmYWN0IHRoYXQgeW91IHBhc3MgaW4gYSBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgYXMgdGhlCisJLy8gICAgZnJhZ1RvRml4TG9jYXRvciBpbXBsaWVzIHRoYXQgdGhlIGZyYWdtZW50IHRvIGJlIGZpeGVkIHVwIG11c3QKKwkvLyAgICBiZSBpbiB0aGUgZGF0YSBmb3JrIG9mIGEgZmlsZS4gIFRoZSBjb2RlIGNvdWxkIGJlIG1vZGlmaWVkCisJLy8gICAgdG8gcmVtb3ZlIHRoaXMgcmVxdWlyZW1lbnQsIGJ1dCBvbiBkaXNrIGNvZGUgZnJhZ21lbnRzIGFyZSB0aGUgbW9zdAorCS8vICAgIGNvbW1vbiBjYXNlLgorCS8vCisJLy8gICAgSU1QT1JUQU5UOgorCS8vICAgIFRoZSBmcmFnbWVudCB0byBmaXggbWF5IGhhdmUgYSBwYWNrZWQgZGF0YSBzZWN0aW9uLiAgUGFja2luZyB0aGUgCisJLy8gICAgZGF0YSBzZWN0aW9uIHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIHlvdXIgZnJhZ21lbnQgb24gZGlzaywgYnV0IGl0IAorCS8vICAgIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgbWVtb3J5IG5lZWRlZCBieSB0aGlzIHJvdXRpbmUgCisJLy8gICAgKGl0IGluY3JlYXNlcyBtZW1vcnkgdXNhZ2UgYnkgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgdGhlIHBhY2tlZCAKKwkvLyAgICBhbmQgdW5wYWNrZWQgZGF0YSBzZWN0aW9uKS4gIFNlZSBiZWxvdyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byAKKwkvLyAgICBjcmVhdGUgYW4gdW5wYWNrZWQgZGF0YSBzZWN0aW9uLgorCS8vCisJLy8gMi4gZnJhZ1RvRml4SW5pdFJvdXRpbmU6ICBBIHBvaW50ZXIgdG8geW91ciBvd24gY29kZSBmcmFnbWVudCdzCisJLy8gICAgZnJhZ21lbnQgaW5pdGlhbGlzZXIgcm91dGluZS4gIFlvdSBuZWNlc3NhcmlseSBoYXZlIG9uZSBvZiB0aGVzZSAKKwkvLyAgICBiZWNhdXNlIHlvdSBuZWVkIGl0IHRvIGdldCB2YWx1ZXMgZm9yIHRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCAKKwkvLyAgICBmcmFnVG9GaXhDb25uSUQgcGFyYW1ldGVycy4gIEp1c3QgcGFzcyBpdHMgYWRkcmVzcyBpbiBhcyBhIHBhcmFtZXRlciAKKwkvLyAgICBhcyB3ZWxsLiAKKwkvLworCS8vIDMuIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZTogIFRoZSBuYW1lIG9mIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IHdoaWNoCisJLy8gICAgZmFpbGVkIHRvIGxpbmsuICBZb3UgbXVzdCBoYXZlIHdlYWsgbGlua2VkIHRvIHRoaXMgbGlicmFyeS4KKwkvLyAgICBJdCBpcyBveHltb3JpYyBmb3IgeW91IHRvIHBhc3MgYSBzdHJvbmcgbGlua2VkIGxpYnJhcnkgaGVyZSwKKwkvLyAgICBiZWNhdXNlIHlvdXIgY29kZSB3b3VsZCBub3QgaGF2ZSBwcmVwYXJlZCBpZiBhIHN0cm9uZyBsaW5rZWQKKwkvLyAgICBsaWJyYXJ5IGZhaWxlZCB0byBwcmVwYXJlLCBhbmQgc28geW91IGNvdWxkbid0IHN1cHBseSBhIHZhbGlkCisJLy8vICAgZnJhZ1RvRml4LgorCS8vCisJLy8gNC4gbG9va3VwLCByZWZDb246ICBBIHBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRoZSAKKwkvLwkgIHJvdXRpbmUgY2FsbHMgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiBhIHN5bWJvbCwgYW5kIGEgcmVmQ29uIAorCS8vICAgIGZvciB0aGF0IGNhbGxiYWNrIHJvdXRpbmUuCisJLy8KKwkvLyBOb3RlOgorCS8vIFRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCBmcmFnVG9GaXhJbml0Um91dGluZSBwYXJhbWV0ZXJzCisJLy8gYXJlIGFydGlmYWN0cyBvZiB0aGUgd2F5IGluIHdoaWNoIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZC4KKwkvLyBJbiBhbiBpZGVhbCB3b3JsZCwgd2hlcmUgQ0ZNIGV4cG9ydGVkIGRlY2VudCBpbnRyb3NwZWN0aW9uIEFQSXMKKwkvLyB0byB0aGlyZCBwYXJ0eSBkZXZlbG9wZXJzLCB0aGVzZSBwYXJhbWV0ZXJzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCisJLy8gSWYgeW91J3JlIHVzaW5nIHRoaXMgY29kZSBpbnNpZGUgQXBwbGUsIHlvdSBwcm9iYWJseSBzaG91bGQgaW52ZXN0aWdhdGUKKwkvLyB1c2luZyB0aGUgQ0ZNIHByaXZhdGUgQVBJcyBmb3IgZ2V0dGluZyBhdCB0aGUgaW5mb3JtYXRpb24gdGhlc2UKKwkvLyBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQgZm9yLiAgU2VlIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uCisJLy8gZm9yIG1vcmUgZGV0YWlscy4KKwkvLworCS8vIE5vdGU6CisJLy8gVGhlIGV4dHJhIG1lbW9yeSB0YWtlbiB3aGVuIHlvdSB1c2UgYSBwYWNrZWQgZGF0YSBzZWN0aW9uIGlzIGFsc28gYW4gCisJLy8gYXJ0aWZhY3Qgb2YgbXkgd29ya2Fyb3VuZCBmb3IgdGhlIGxhY2sgb2YgQ0ZNIGludHJvc3BlY3Rpb24gQVBJcy4gIEluIAorCS8vIG15IG9waW5pb24gaXQncyBiZXR0ZXIgdG8gdXNlIGFuIHVucGFja2VkIGRhdGEgc2VjdGlvbiBhbmQgY29uc3VtZSBtb3JlIAorCS8vIHNwYWNlIG9uIGRpc2sgd2hpbGUgc2F2aW5nIG1lbW9yeS4gIEluIENvZGVXYXJyaW9yIHlvdSBjYW4gc3dpdGNoIHRvIGFuIAorCS8vIHVucGFja2VkIGRhdGEgc2VjdGlvbiBieSBjaGVja2luZyB0aGUgIkV4cGFuZCBVbmluaXRpYWxpemVkIERhdGEiIAorCS8vIGNoZWNrYm94IGluIHRoZSAiUFBDIFBFRiIgc2V0dGluZ3MgcGFuZWwuICBJbiBNUFcsIHNwZWNpZmllZCB0aGUKKwkvLyAiLXBhY2tkYXRhIG9mZiIgb3B0aW9uIHRvIFBQQ0xpbmsuCisJLy8KKwkvLyBXaGVuIHRoZSByb3V0aW5lIHJldHVybnMsIGFueSBzeW1ib2xzIHRoYXQgeW91IGltcG9ydGVkIGZyb20gdGhlCisJLy8gbGlicmFyeSBuYW1lZCB3ZWFrTGlua2VkTGlicmFyeU5hbWUgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgYWRkcmVzcworCS8vIG9mIHRoZSBzeW1ib2wgcHJvdmlkZWQgYnkgdGhlICJsb29rdXAiIGNhbGxiYWNrIHJvdXRpbmUuCisJLy8KKwkvLyBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gdW5yZXNvbHZlZCBpbXBvcnQgdG8gcmVtYWluIHVucmVzb2x2ZWQgYWZ0ZXIKKwkvLyB0aGlzIHJvdXRpbmUgcmV0dXJucy4gIElmIHRoZSBzeW1ib2wgaW1wb3J0IGlzIG1hcmtlZCBhcyB3ZWFrIChhcworCS8vIG9wcG9zZWQgdG8gdGhlIGxpYnJhcnksIHdoaWNoICptdXN0KiBiZSBtYXJrZWQgYXMgd2VhaykgYW5kIHRoZSBzeW1ib2wKKwkvLyBpcyBub3QgZm91bmQgYnkgdGhlICJsb29rdXAiIGNhbGxiYWNrLCB0aGUgcm91dGluZSB3aWxsIHNpbXBsZSBza2lwIAorCS8vIHRoYXQgc3ltYm9sLiAgSWYgdGhlIHN5bWJvbCBpc24ndCBtYXJrZWQgYXMgd2VhaywgdGhlIHJvdXRpbmUgd2lsbCBmYWlsIAorCS8vIGluIHRoYXQgY2FzZS4KKwkvLworCS8vIE1vc3Qgb2YgdGhlIHBvc3NpYmxlIGVycm9yIHJlc3VsdHMgYXJlIGNvLW9wdGVkIENGTSBlcnJvcnMuICBUaGVzZQorCS8vIGluY2x1ZGU6CisJLy8KKwkvLyBjZnJhZ0ZyYWdtZW50Rm9ybWF0RXJyICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGlzIGlzIGFuIHVua25vd24gZm9ybWF0LgorCS8vIGNmcmFnTm9TZWN0aW9uRXJyICAgICAgIC0tIENvdWxkIG5vdCBmaW5kIHRoZSBsb2FkZXIgc2VjdGlvbiBpbiB0aGUgZnJhZ21lbnQgdG8gZml4LgorCS8vIGNmcmFnTm9MaWJyYXJ5RXJyICAgICAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgbm90IHdlYWsgbGlua2VkIHRvIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4KKwkvLyBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnIgICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGRvZXNuJ3QgaGF2ZSBhIGRhdGEgc2VjdGlvbi4KKwkvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGlzIHN0cm9uZyBsaW5rZWQgdG8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgorCS8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFRoZSBmcmFnbWVudCBkb2Vzbid0IGhhdmUgYW4gaW5pdCByb3V0aW5lLgorCS8vIGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyIC0tIEVuY291bnRlcmVkIGFuIHVuZGVmaW5lZCByZWxvY2F0aW9uIG9wY29kZS4KKwkvLyB1bmltcEVyciAgICAgICAgICAgICAgICAtLSBFbmNvdW50ZXJlZCBhbiB1bmltcGxlbWVudCByZWxvY2F0aW9uIG9wY29kZS4gIFRoZQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gZW5naW5lIG9ubHkgaW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgQ0ZNCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBvcGNvZGVzLCB0aGUgc3Vic2V0IG1vc3QgY29tbW9ubHkgdXNlZCBieQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QVyBhbmQgQ29kZVdhcnJpb3IgUEVGIGNvbnRhaW5lcnMuICBJZiB5b3UgZW5jb3VudGVyCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlcnJvciwgeW91J2xsIHByb2JhYmx5IGhhdmUgdG8gYWRkIHRoZSB3ZWlyZAorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gb3Bjb2RlIHRvIHRoZSBlbmdpbmUsIHdoaWNoIHNob3VsZG4ndCBiZQorCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHRvbyBoYXJkLgorCS8vIG1lbUZ1bGxFcnIJCQkgICAtLSBJdCdzIGxpa2VseSB0aGF0IHRoaXMgZXJyb3IgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBtZW1vcnkgCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIHVucGFjayB5b3VyIGRhdGEgc2VjdGlvbi4gIEVpdGhlciBtYWtlIHlvdXIgCisJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBzZWN0aW9uIHNtYWxsZXIsIG9yIHVucGFjayBpdCAoc2VlIGFib3ZlKS4KKwkvLyBlcnJvcnMgcmV0dXJuZWQgYnkgRmluZFN5bWJvbAorCS8vIGVycm9ycyByZXR1cm5lZCBieSBNZW1vcnkgTWFuYWdlcgorCS8vCisJLy8gVGhlIHJvdXRpbmUgbmVlZHMgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBsb2FkZXIgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQKKwkvLyB0byBmaXggaW4gbWVtb3J5LiAgSXQgYWxsb2NhdGVzIHRoYXQgbWVtb3J5IHVzaW5nIE5ld1B0ciBhbmQgZGlzcHNvc2VzIG9mIAorCS8vIGl0IGJlZm9yZSBpdCByZXR1cm5zLiAgWW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRvciwgd2hpY2gKKwkvLyBpcyB2ZXJ5IHNpbXBsZS4KKworZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0TGlicmFyeShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCisJCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAorCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0KTsKKwkvLyBBIHdyYXBwZXIgYXJvdW5kIENGTUxhdGVJbXBvcnRDb3JlIHRoYXQgbG9va3MgdXAgc3ltYm9scyBieSBjYWxsaW5nIAorCS8vIEZpbmRTeW1ib2wgb24gYSBjb25uZWN0aW9uIHRvIGEgQ0ZNIGxpYnJhcnkgKGNvbm5JRFRvSW1wb3J0KS4KKwkvLyBZb3UgY2FuIGdldCB0aGlzIGNvbm5lY3Rpb24gSUQgdGhyb3VnaCBhbnkgc3RhbmRhcmQgQ0ZNIEFQSSwgZm9yIGV4YW1wbGUKKwkvLyBHZXRTaGFyZWRMaWJyYXJ5LCBHZXREaXNrRnJhZ21lbnQsIG9yIEdldE1lbUZyYWdtZW50LgorCS8vCisJLy8gSU1QT1JUQU5UOgorCS8vIFRoZSBmcmFnbWVudCBuYW1lIGZvciBjb25uSURUb0ltcG9ydCAqZG9lcyBub3QqIGhhdmUgdG8gbWF0Y2gKKwkvLyB3ZWFrTGlua2VkTGlicmFyeU5hbWUuICBUaGlzIGlzIHBhcnQgb2YgdGhlIHBvd2VyIG9mIHRoaXMgbGlicmFyeS4KKworZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0QnVuZGxlKGNvbnN0IENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciAqZnJhZ1RvRml4TG9jYXRvciwKKwkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCisJCQkJCQkJCQkJQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisJCQkJCQkJCQkJQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCisJCQkJCQkJCQkJQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQpOworCS8vIEEgd3JhcHBlciBhcm91bmQgQ0ZNTGF0ZUltcG9ydENvcmUgdGhhdCBsb29rcyB1cCBzeW1ib2xzIGJ5IGNhbGxpbmcgCisJLy8gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lIG9uIGEgcmVmZXJlbmNlIHRvIGEgQ29yZSBGb3VuZGF0aW9uIAorCS8vIGJ1bmRsZSAoYnVuZGxlVG9JbXBvcnQpLiAgWW91IGNhbiBnZXQgdGhpcyByZWZlcmVuY2UgdGhyb3VnaCBhbnkgCisJLy8gQ29yZSBGb3VuZGF0aW9uIGJ1bmRsZSBBUEksIGZvciBleGFtcGxlIENGQnVuZGxlQ3JlYXRlLgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2cvQ0dTdHViTGliIGIvTWFjL01vZHVsZXMvY2cvQ0dTdHViTGliCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0ZGU5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvTW9kdWxlcy9jZy9DR1N0dWJMaWIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2cvQ0dTdHViTGliLmV4cCBiL01hYy9Nb2R1bGVzL2NnL0NHU3R1YkxpYi5leHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGIwMzRiNQotLS0gL2Rldi9udWxsCisrKyBiL01hYy9Nb2R1bGVzL2NnL0NHU3R1YkxpYi5leHAKQEAgLTAsMCArMSw1OCBAQAorQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50CitDR0NvbnRleHRTaG93VGV4dAorQ0dDb250ZXh0U2VsZWN0Rm9udAorQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlCitDR0NvbnRleHREcmF3UGF0aAorQ0dDb250ZXh0U2V0TGluZUpvaW4KK0NHQ29udGV4dFNldExpbmVDYXAKK0NHQ29udGV4dEdldFRleHRQb3NpdGlvbgorQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludAorQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzCitDR0NvbnRleHRTeW5jaHJvbml6ZQorQ0dDb250ZXh0Rmx1c2gKK0NHQ29udGV4dEVuZFBhZ2UKK0NHQ29udGV4dFNldEZvbnRTaXplCitDR0NvbnRleHRHZXRUZXh0TWF0cml4CitDR0NvbnRleHRTZXRUZXh0TWF0cml4CitDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24KK0NHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcKK0NHQ29udGV4dFNldENNWUtTdHJva2VDb2xvcgorQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvcgorQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IKK0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcgorQ0dDb250ZXh0U2V0R3JheVN0cm9rZUNvbG9yCitDR0NvbnRleHRTZXRHcmF5RmlsbENvbG9yCitDR0NvbnRleHRDbGlwVG9SZWN0CitDR0NvbnRleHRFT0NsaXAKK0NHQ29udGV4dENsaXAKK0NHQ29udGV4dENsZWFyUmVjdAorQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aAorQ0dDb250ZXh0U3Ryb2tlUmVjdAorQ0dDb250ZXh0RmlsbFJlY3QKK0NHQ29udGV4dFN0cm9rZVBhdGgKK0NHQ29udGV4dEVPRmlsbFBhdGgKK0NHQ29udGV4dEZpbGxQYXRoCitDR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3gKK0NHQ29udGV4dElzUGF0aEVtcHR5CitDR0NvbnRleHRBZGRBcmNUb1BvaW50CitDR0NvbnRleHRBZGRBcmMKK0NHQ29udGV4dEFkZFJlY3QKK0NHQ29udGV4dENsb3NlUGF0aAorQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludAorQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50CitDR0NvbnRleHRBZGRMaW5lVG9Qb2ludAorQ0dDb250ZXh0TW92ZVRvUG9pbnQKK0NHQ29udGV4dEJlZ2luUGF0aAorQ0dDb250ZXh0U2V0QWxwaGEKK0NHQ29udGV4dFNldEZsYXRuZXNzCitDR0NvbnRleHRTZXRNaXRlckxpbWl0CitDR0NvbnRleHRTZXRMaW5lV2lkdGgKK0NHQ29udGV4dEdldENUTQorQ0dDb250ZXh0Q29uY2F0Q1RNCitDR0NvbnRleHRSb3RhdGVDVE0KK0NHQ29udGV4dFRyYW5zbGF0ZUNUTQorQ0dDb250ZXh0U2NhbGVDVE0KK0NHQ29udGV4dFJlc3RvcmVHU3RhdGUKK0NHQ29udGV4dFNhdmVHU3RhdGUKK0NHQ29udGV4dFJlbGVhc2UKK0NyZWF0ZUNHQ29udGV4dEZvclBvcnQKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL0NHU3R1YkxpYi5yZWFkbWUgYi9NYWMvTW9kdWxlcy9jZy9DR1N0dWJMaWIucmVhZG1lCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyYzVmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvTW9kdWxlcy9jZy9DR1N0dWJMaWIucmVhZG1lCkBAIC0wLDAgKzEsMyBAQAorIyBDR1N0dWJMaWIgd2FzIGNyZWF0ZWQgYnkgaXNzdWluZyB0aGlzIGNvbW1hbmQgaW4gTVBXOgorCitNYWtlU3R1YiBDR1N0dWJMaWIuZXhwIC1vIENHU3R1YkxpYgpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9jZy9fQ0dtb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NTIzZTcxCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMKQEAgLTAsMCArMSwxMzMyIEBACisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PSBNb2R1bGUgX0NHID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaW5jbHVkZSAiUHl0aG9uLmgiCisKKworCisjaW5jbHVkZSAibWFjZ2x1ZS5oIgorI2luY2x1ZGUgInB5bWFjdG9vbGJveC5oIgorCisvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCisjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAorICAgIAlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgIAkiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIAlyZXR1cm4gTlVMTDsgXAorICAgIH19IHdoaWxlKDApCisKKworI2lmZGVmIFdJVEhPVVRfRlJBTUVXT1JLUworI2luY2x1ZGUgPFF1aWNrZHJhdy5oPgorI2luY2x1ZGUgPENHQ29udGV4dC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ29yZUdyYXBoaWNzLmg+CisjZW5kaWYKKworI2lmICFUQVJHRVRfQVBJX01BQ19PU1gKKwkvKiBUaGlzIGNvZGUgaXMgYWRhcHRlZCBmcm9tIHRoZSBDYWxsTWFjaE9GcmFtZXdvcmsgZGVtbyBhdDoKKyAgICAgICBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9zYW1wbGVjb2RlL1NhbXBsZV9Db2RlL1J1bnRpbWVfQXJjaGl0ZWN0dXJlL0NhbGxNYWNoT0ZyYW1ld29yay5odG0KKyAgICAgICBJdCBhbGxvd3MgdXMgdG8gY2FsbCBNYWNoLU8gZnVuY3Rpb25zIGZyb20gQ0ZNIGFwcHMuICovCisKKwkjaW5jbHVkZSA8Rm9sZGVycy5oPgorCSNpbmNsdWRlICJDRk1MYXRlSW1wb3J0LmgiCisKKwlzdGF0aWMgT1NTdGF0dXMgTG9hZEZyYW1ld29ya0J1bmRsZShDRlN0cmluZ1JlZiBmcmFtZXdvcmssIENGQnVuZGxlUmVmICpidW5kbGVQdHIpCisJCS8vIFRoaXMgcm91dGluZSBmaW5kcyBhIHRoZSBuYW1lZCBmcmFtZXdvcmsgYW5kIGNyZWF0ZXMgYSBDRkJ1bmRsZSAKKwkJLy8gb2JqZWN0IGZvciBpdC4gIEl0IGxvb2tzIGZvciB0aGUgZnJhbWV3b3JrIGluIHRoZSBmcmFtZXdvcmtzIGZvbGRlciwgCisJCS8vIGFzIGRlZmluZWQgYnkgdGhlIEZvbGRlciBNYW5hZ2VyLiAgQ3VycmVudGx5IHRoaXMgaXMgCisJCS8vICIvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3JrcyIsIGJ1dCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgYXZvaWQgaGFyZCBjb2RlZCAKKwkJLy8gcGF0aHMgdG8gZW5zdXJlIGZ1dHVyZSBjb21wYXRpYmlsaXR5LgorCQkvLworCQkvLyBZb3UgbWlnaHQgdGhpbmsgdGhhdCB5b3UgY291bGQgdXNlIENGQnVuZGxlR2V0QnVuZGxlV2l0aElkZW50aWZpZXIgYnV0IAorCQkvLyB0aGF0IG9ubHkgZmluZHMgYnVuZGxlcyB0aGF0IGFyZSBhbHJlYWR5IGxvYWRlZCBpbnRvIHlvdXIgY29udGV4dC4gCisJCS8vIFRoYXQgd291bGQgd29yayBpbiB0aGUgY2FzZSBvZiB0aGUgU3lzdGVtIGZyYW1ld29yayBidXQgaXQgd291bGRuJ3QgCisJCS8vIHdvcmsgaWYgeW91J3JlIHVzaW5nIHNvbWUgb3RoZXIsIGxlc3Mtb2J2aW91cywgZnJhbWV3b3JrLgorCXsKKwkJT1NTdGF0dXMgCWVycjsKKwkJRlNSZWYgCQlmcmFtZXdvcmtzRm9sZGVyUmVmOworCQlDRlVSTFJlZgliYXNlVVJMOworCQlDRlVSTFJlZglidW5kbGVVUkw7CisJCQorCQkqYnVuZGxlUHRyID0gbmlsOworCQkKKwkJYmFzZVVSTCA9IG5pbDsKKwkJYnVuZGxlVVJMID0gbmlsOworCQkKKwkJLy8gRmluZCB0aGUgZnJhbWV3b3JrcyBmb2xkZXIgYW5kIGNyZWF0ZSBhIFVSTCBmb3IgaXQuCisJCQorCQllcnIgPSBGU0ZpbmRGb2xkZXIoa09uQXBwcm9wcmlhdGVEaXNrLCBrRnJhbWV3b3Jrc0ZvbGRlclR5cGUsIHRydWUsICZmcmFtZXdvcmtzRm9sZGVyUmVmKTsKKwkJaWYgKGVyciA9PSBub0VycikgeworCQkJYmFzZVVSTCA9IENGVVJMQ3JlYXRlRnJvbUZTUmVmKGtDRkFsbG9jYXRvclN5c3RlbURlZmF1bHQsICZmcmFtZXdvcmtzRm9sZGVyUmVmKTsKKwkJCWlmIChiYXNlVVJMID09IG5pbCkgeworCQkJCWVyciA9IGNvcmVGb3VuZGF0aW9uVW5rbm93bkVycjsKKwkJCX0KKwkJfQorCQkKKwkJLy8gQXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBmcmFtZXdvcmsgdG8gdGhlIFVSTC4KKwkJCisJCWlmIChlcnIgPT0gbm9FcnIpIHsKKwkJCWJ1bmRsZVVSTCA9IENGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQoa0NGQWxsb2NhdG9yU3lzdGVtRGVmYXVsdCwgYmFzZVVSTCwgZnJhbWV3b3JrLCBmYWxzZSk7CisJCQlpZiAoYnVuZGxlVVJMID09IG5pbCkgeworCQkJCWVyciA9IGNvcmVGb3VuZGF0aW9uVW5rbm93bkVycjsKKwkJCX0KKwkJfQorCQkKKwkJLy8gQ3JlYXRlIGEgYnVuZGxlIGJhc2VkIG9uIHRoYXQgVVJMIGFuZCBsb2FkIHRoZSBidW5kbGUgaW50byBtZW1vcnkuCisJCS8vIFdlIG5ldmVyIHVubG9hZCB0aGUgYnVuZGxlLCB3aGljaCBpcyByZWFzb25hYmxlIGluIHRoaXMgY2FzZSBiZWNhdXNlIAorCQkvLyB0aGUgc2FtcGxlIGFzc3VtZXMgdGhhdCB5b3UnbGwgYmUgY2FsbGluZyBmdW5jdGlvbnMgZnJvbSB0aGlzIAorCQkvLyBmcmFtZXdvcmsgdGhyb3VnaG91dCB0aGUgbGlmZSBvZiB5b3VyIGFwcGxpY2F0aW9uLgorCQkKKwkJaWYgKGVyciA9PSBub0VycikgeworCQkJKmJ1bmRsZVB0ciA9IENGQnVuZGxlQ3JlYXRlKGtDRkFsbG9jYXRvclN5c3RlbURlZmF1bHQsIGJ1bmRsZVVSTCk7CisJCQlpZiAoKmJ1bmRsZVB0ciA9PSBuaWwpIHsKKwkJCQllcnIgPSBjb3JlRm91bmRhdGlvblVua25vd25FcnI7CisJCQl9CisJCX0KKwkJaWYgKGVyciA9PSBub0VycikgeworCQkgICAgaWYgKCAhIENGQnVuZGxlTG9hZEV4ZWN1dGFibGUoICpidW5kbGVQdHIgKSApIHsKKwkJCQllcnIgPSBjb3JlRm91bmRhdGlvblVua25vd25FcnI7CisJCSAgICB9CisJCX0KKworCQkvLyBDbGVhbiB1cC4KKwkJCisJCWlmIChlcnIgIT0gbm9FcnIgJiYgKmJ1bmRsZVB0ciAhPSBuaWwpIHsKKwkJCUNGUmVsZWFzZSgqYnVuZGxlUHRyKTsKKwkJCSpidW5kbGVQdHIgPSBuaWw7CisJCX0KKwkJaWYgKGJ1bmRsZVVSTCAhPSBuaWwpIHsKKwkJCUNGUmVsZWFzZShidW5kbGVVUkwpOworCQl9CQorCQlpZiAoYmFzZVVSTCAhPSBuaWwpIHsKKwkJCUNGUmVsZWFzZShiYXNlVVJMKTsKKwkJfQkKKwkJCisJCXJldHVybiBlcnI7CisJfQorCisKKworCS8vIFRoZSBDRk1MYXRlSW1wb3J0IGFwcHJvYWNoIHJlcXVpcmVzIHRoYXQgeW91IGRlZmluZSBhIGZyYWdtZW50IAorCS8vIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUgdGhhdCBsYXRjaGVzIHRoZSBmcmFnbWVudCdzIGNvbm5lY3Rpb24gCisJLy8gSUQgYW5kIGxvY2F0b3IuICBJZiB5b3VyIGNvZGUgYWxyZWFkeSBoYXMgYSBmcmFnbWVudCBpbml0aWFsaXNlciAKKwkvLyB5b3Ugd2lsbCBoYXZlIHRvIGludGVncmF0ZSB0aGUgZm9sbG93aW5nIGludG8gaXQuCisKKwlzdGF0aWMgQ0ZyYWdDb25uZWN0aW9uSUQgCQkJZ0ZyYWdUb0ZpeENvbm5JRDsKKwlzdGF0aWMgRlNTcGVjIAkJCQkJCWdGcmFnVG9GaXhGaWxlOworCXN0YXRpYyBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgCWdGcmFnVG9GaXhMb2NhdG9yOworCisJZXh0ZXJuIE9TRXJyIEZyYWdtZW50SW5pdChjb25zdCBDRnJhZ0luaXRCbG9jayAqaW5pdEJsb2NrKTsKKwlleHRlcm4gT1NFcnIgRnJhZ21lbnRJbml0KGNvbnN0IENGcmFnSW5pdEJsb2NrICppbml0QmxvY2spCisJeworCQlfX2luaXRpYWxpemUoaW5pdEJsb2NrKTsgLyogY2FsbCB0aGUgIm9yaWdpbmFsIiBpbml0aWFsaXplciAqLworCQlnRnJhZ1RvRml4Q29ubklECT0gKENGcmFnQ29ubmVjdGlvbklEKSBpbml0QmxvY2stPmNsb3N1cmVJRDsKKwkJZ0ZyYWdUb0ZpeEZpbGUgCQk9ICooaW5pdEJsb2NrLT5mcmFnTG9jYXRvci51Lm9uRGlzay5maWxlU3BlYyk7CisJCWdGcmFnVG9GaXhMb2NhdG9yIAk9IGluaXRCbG9jay0+ZnJhZ0xvY2F0b3IudS5vbkRpc2s7CisJCWdGcmFnVG9GaXhMb2NhdG9yLmZpbGVTcGVjID0gJmdGcmFnVG9GaXhGaWxlOworCQkKKwkJcmV0dXJuIG5vRXJyOworCX0KKworI2VuZGlmCisKK2V4dGVybiBpbnQgR3JhZk9ial9Db252ZXJ0KFB5T2JqZWN0ICosIEdyYWZQdHIgKik7CisKKy8qCisqKiBNYW51YWwgY29udmVydGVycworKi8KKworUHlPYmplY3QgKkNHUG9pbnRfTmV3KENHUG9pbnQgKml0c2VsZikKK3sKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmYpIiwKKwkJCWl0c2VsZi0+eCwKKwkJCWl0c2VsZi0+eSk7Cit9CisKK2ludAorQ0dQb2ludF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDR1BvaW50ICpwX2l0c2VsZikKK3sKKwlpZiggIVB5QXJnX1BhcnNlKHYsICIoZmYpIiwKKwkJCSZwX2l0c2VsZi0+eCwKKwkJCSZwX2l0c2VsZi0+eSkgKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworUHlPYmplY3QgKkNHUmVjdF9OZXcoQ0dSZWN0ICppdHNlbGYpCit7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmZmYpIiwKKwkJCWl0c2VsZi0+b3JpZ2luLngsCisJCQlpdHNlbGYtPm9yaWdpbi55LAorCQkJaXRzZWxmLT5zaXplLndpZHRoLAorCQkJaXRzZWxmLT5zaXplLmhlaWdodCk7Cit9CisKK2ludAorQ0dSZWN0X0NvbnZlcnQoUHlPYmplY3QgKnYsIENHUmVjdCAqcF9pdHNlbGYpCit7CisJaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmZmYpIiwKKwkJCSZwX2l0c2VsZi0+b3JpZ2luLngsCisJCQkmcF9pdHNlbGYtPm9yaWdpbi55LAorCQkJJnBfaXRzZWxmLT5zaXplLndpZHRoLAorCQkJJnBfaXRzZWxmLT5zaXplLmhlaWdodCkgKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworUHlPYmplY3QgKkNHQWZmaW5lVHJhbnNmb3JtX05ldyhDR0FmZmluZVRyYW5zZm9ybSAqaXRzZWxmKQoreworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZmZmZmYpIiwKKwkJCWl0c2VsZi0+YSwKKwkJCWl0c2VsZi0+YiwKKwkJCWl0c2VsZi0+YywKKwkJCWl0c2VsZi0+ZCwKKwkJCWl0c2VsZi0+dHgsCisJCQlpdHNlbGYtPnR5KTsKK30KKworaW50CitDR0FmZmluZVRyYW5zZm9ybV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDR0FmZmluZVRyYW5zZm9ybSAqcF9pdHNlbGYpCit7CisJaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmZmZmZikiLAorCQkJJnBfaXRzZWxmLT5hLAorCQkJJnBfaXRzZWxmLT5iLAorCQkJJnBfaXRzZWxmLT5jLAorCQkJJnBfaXRzZWxmLT5kLAorCQkJJnBfaXRzZWxmLT50eCwKKwkJCSZwX2l0c2VsZi0+dHkpICkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dfRXJyb3I7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIE9iamVjdCB0eXBlIENHQ29udGV4dFJlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitQeVR5cGVPYmplY3QgQ0dDb250ZXh0UmVmX1R5cGU7CisKKyNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNHQ29udGV4dFJlZl9UeXBlKQorCit0eXBlZGVmIHN0cnVjdCBDR0NvbnRleHRSZWZPYmplY3QgeworCVB5T2JqZWN0X0hFQUQKKwlDR0NvbnRleHRSZWYgb2JfaXRzZWxmOworfSBDR0NvbnRleHRSZWZPYmplY3Q7CisKK1B5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfTmV3KENHQ29udGV4dFJlZiBpdHNlbGYpCit7CisJQ0dDb250ZXh0UmVmT2JqZWN0ICppdDsKKwlpdCA9IFB5T2JqZWN0X05FVyhDR0NvbnRleHRSZWZPYmplY3QsICZDR0NvbnRleHRSZWZfVHlwZSk7CisJaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisJcmV0dXJuIChQeU9iamVjdCAqKWl0OworfQoraW50IENHQ29udGV4dFJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDR0NvbnRleHRSZWYgKnBfaXRzZWxmKQoreworCWlmICghQ0dDb250ZXh0UmVmT2JqX0NoZWNrKHYpKQorCXsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNHQ29udGV4dFJlZiByZXF1aXJlZCIpOworCQlyZXR1cm4gMDsKKwl9CisJKnBfaXRzZWxmID0gKChDR0NvbnRleHRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBDR0NvbnRleHRSZWZPYmpfZGVhbGxvYyhDR0NvbnRleHRSZWZPYmplY3QgKnNlbGYpCit7CisJQ0dDb250ZXh0UmVsZWFzZShzZWxmLT5vYl9pdHNlbGYpOworCVB5TWVtX0RFTChzZWxmKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2F2ZUdTdGF0ZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRTYXZlR1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRSZXN0b3JlR1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2NhbGVDVE0oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlmbG9hdCBzeDsKKwlmbG9hdCBzeTsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCisJICAgICAgICAgICAgICAgICAgICAgICZzeCwKKwkgICAgICAgICAgICAgICAgICAgICAgJnN5KSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0U2NhbGVDVE0oX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICBzeCwKKwkgICAgICAgICAgICAgICAgICBzeSk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRUcmFuc2xhdGVDVE0oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlmbG9hdCB0eDsKKwlmbG9hdCB0eTsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCisJICAgICAgICAgICAgICAgICAgICAgICZ0eCwKKwkgICAgICAgICAgICAgICAgICAgICAgJnR5KSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICAgIHR4LAorCSAgICAgICAgICAgICAgICAgICAgICB0eSk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSb3RhdGVDVE0oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlmbG9hdCBhbmdsZTsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKwkgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0Um90YXRlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgIGFuZ2xlKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENvbmNhdENUTShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCUNHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisJICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX0NvbnZlcnQsICZ0cmFuc2Zvcm0pKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRDb25jYXRDVE0oX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldENUTShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCUNHQWZmaW5lVHJhbnNmb3JtIF9ydjsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKwkJcmV0dXJuIE5VTEw7CisJX3J2ID0gQ0dDb250ZXh0R2V0Q1RNKF9zZWxmLT5vYl9pdHNlbGYpOworCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisJICAgICAgICAgICAgICAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1fTmV3LCAmX3J2KTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TGluZVdpZHRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJZmxvYXQgd2lkdGg7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisJICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldExpbmVXaWR0aChfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lQ2FwKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJaW50IGNhcDsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKwkgICAgICAgICAgICAgICAgICAgICAgJmNhcCkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldExpbmVDYXAoX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICAgIGNhcCk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lSm9pbihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWludCBqb2luOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorCSAgICAgICAgICAgICAgICAgICAgICAmam9pbikpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldExpbmVKb2luKF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICAgam9pbik7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRNaXRlckxpbWl0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJZmxvYXQgbGltaXQ7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisJICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldE1pdGVyTGltaXQoX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZsYXRuZXNzKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJZmxvYXQgZmxhdG5lc3M7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisJICAgICAgICAgICAgICAgICAgICAgICZmbGF0bmVzcykpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldEZsYXRuZXNzKF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICAgZmxhdG5lc3MpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0QWxwaGEoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlmbG9hdCBhbHBoYTsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKwkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0U2V0QWxwaGEoX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICBhbHBoYSk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRCZWdpblBhdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0QmVnaW5QYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0TW92ZVRvUG9pbnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlmbG9hdCB4OworCWZsb2F0IHk7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorCSAgICAgICAgICAgICAgICAgICAgICAmeCwKKwkgICAgICAgICAgICAgICAgICAgICAgJnkpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRNb3ZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICAgICAgIHgsCisJICAgICAgICAgICAgICAgICAgICAgeSk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRMaW5lVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWZsb2F0IHg7CisJZmxvYXQgeTsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCisJICAgICAgICAgICAgICAgICAgICAgICZ4LAorCSAgICAgICAgICAgICAgICAgICAgICAmeSkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dEFkZExpbmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICAgICAgeCwKKwkgICAgICAgICAgICAgICAgICAgICAgICB5KTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEN1cnZlVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWZsb2F0IGNwMXg7CisJZmxvYXQgY3AxeTsKKwlmbG9hdCBjcDJ4OworCWZsb2F0IGNwMnk7CisJZmxvYXQgeDsKKwlmbG9hdCB5OworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmZiIsCisJICAgICAgICAgICAgICAgICAgICAgICZjcDF4LAorCSAgICAgICAgICAgICAgICAgICAgICAmY3AxeSwKKwkgICAgICAgICAgICAgICAgICAgICAgJmNwMngsCisJICAgICAgICAgICAgICAgICAgICAgICZjcDJ5LAorCSAgICAgICAgICAgICAgICAgICAgICAmeCwKKwkgICAgICAgICAgICAgICAgICAgICAgJnkpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRBZGRDdXJ2ZVRvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgY3AxeCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgY3AxeSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgY3AyeCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgY3AyeSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgeSk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRRdWFkQ3VydmVUb1BvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJZmxvYXQgY3B4OworCWZsb2F0IGNweTsKKwlmbG9hdCB4OworCWZsb2F0IHk7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZmZiIsCisJICAgICAgICAgICAgICAgICAgICAgICZjcHgsCisJICAgICAgICAgICAgICAgICAgICAgICZjcHksCisJICAgICAgICAgICAgICAgICAgICAgICZ4LAorCSAgICAgICAgICAgICAgICAgICAgICAmeSkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dEFkZFF1YWRDdXJ2ZVRvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNweCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNweSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsb3NlUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRDbG9zZVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRSZWN0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJQ0dSZWN0IHJlY3Q7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRBZGRSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICByZWN0KTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyYyhDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWZsb2F0IHg7CisJZmxvYXQgeTsKKwlmbG9hdCByYWRpdXM7CisJZmxvYXQgc3RhcnRBbmdsZTsKKwlmbG9hdCBlbmRBbmdsZTsKKwlpbnQgY2xvY2t3aXNlOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmaSIsCisJICAgICAgICAgICAgICAgICAgICAgICZ4LAorCSAgICAgICAgICAgICAgICAgICAgICAmeSwKKwkgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cywKKwkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisJICAgICAgICAgICAgICAgICAgICAgICZlbmRBbmdsZSwKKwkgICAgICAgICAgICAgICAgICAgICAgJmNsb2Nrd2lzZSkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dEFkZEFyYyhfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICB4LAorCSAgICAgICAgICAgICAgICB5LAorCSAgICAgICAgICAgICAgICByYWRpdXMsCisJICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisJICAgICAgICAgICAgICAgIGVuZEFuZ2xlLAorCSAgICAgICAgICAgICAgICBjbG9ja3dpc2UpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQXJjVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWZsb2F0IHgxOworCWZsb2F0IHkxOworCWZsb2F0IHgyOworCWZsb2F0IHkyOworCWZsb2F0IHJhZGl1czsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCisJICAgICAgICAgICAgICAgICAgICAgICZ4MSwKKwkgICAgICAgICAgICAgICAgICAgICAgJnkxLAorCSAgICAgICAgICAgICAgICAgICAgICAmeDIsCisJICAgICAgICAgICAgICAgICAgICAgICZ5MiwKKwkgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cykpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dEFkZEFyY1RvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICAgICAgIHgxLAorCSAgICAgICAgICAgICAgICAgICAgICAgeTEsCisJICAgICAgICAgICAgICAgICAgICAgICB4MiwKKwkgICAgICAgICAgICAgICAgICAgICAgIHkyLAorCSAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dElzUGF0aEVtcHR5KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJaW50IF9ydjsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKwkJcmV0dXJuIE5VTEw7CisJX3J2ID0gQ0dDb250ZXh0SXNQYXRoRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7CisJX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLAorCSAgICAgICAgICAgICAgICAgICAgIF9ydik7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFBhdGhDdXJyZW50UG9pbnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlDR1BvaW50IF9ydjsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKwkJcmV0dXJuIE5VTEw7CisJX3J2ID0gQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludChfc2VsZi0+b2JfaXRzZWxmKTsKKwlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorCSAgICAgICAgICAgICAgICAgICAgIENHUG9pbnRfTmV3LCAmX3J2KTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJQ0dSZWN0IF9ydjsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKwkJcmV0dXJuIE5VTEw7CisJX3J2ID0gQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94KF9zZWxmLT5vYl9pdHNlbGYpOworCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisJICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X05ldywgJl9ydik7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJaW50IG1vZGU7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCisJICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0RHJhd1BhdGgoX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICBtb2RlKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxQYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dEZpbGxQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RU9GaWxsUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRFT0ZpbGxQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRTdHJva2VQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RmlsbFJlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlDR1JlY3QgcmVjdDsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisJICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dEZpbGxSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgcmVjdCk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTdHJva2VSZWN0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJQ0dSZWN0IHJlY3Q7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRTdHJva2VSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICByZWN0KTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlDR1JlY3QgcmVjdDsKKwlmbG9hdCB3aWR0aDsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmYiLAorCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QsCisJICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGVhclJlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlDR1JlY3QgcmVjdDsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisJICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dENsZWFyUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICAgICByZWN0KTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsaXAoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0Q2xpcChfc2VsZi0+b2JfaXRzZWxmKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEVPQ2xpcChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRFT0NsaXAoX3NlbGYtPm9iX2l0c2VsZik7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGlwVG9SZWN0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJQ0dSZWN0IHJlY3Q7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRDbGlwVG9SZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICByZWN0KTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlmbG9hdCBncmF5OworCWZsb2F0IGFscGhhOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKKwkgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCisJICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXksCisJICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlmbG9hdCBncmF5OworCWZsb2F0IGFscGhhOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKKwkgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCisJICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmF5LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlmbG9hdCByOworCWZsb2F0IGc7CisJZmxvYXQgYjsKKwlmbG9hdCBhbHBoYTsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKKwkgICAgICAgICAgICAgICAgICAgICAgJnIsCisJICAgICAgICAgICAgICAgICAgICAgICZnLAorCSAgICAgICAgICAgICAgICAgICAgICAmYiwKKwkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICAgICAgIHIsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGcsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGIsCisJICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJZmxvYXQgcjsKKwlmbG9hdCBnOworCWZsb2F0IGI7CisJZmxvYXQgYWxwaGE7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZmZiIsCisJICAgICAgICAgICAgICAgICAgICAgICZyLAorCSAgICAgICAgICAgICAgICAgICAgICAmZywKKwkgICAgICAgICAgICAgICAgICAgICAgJmIsCisJICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBnLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvcihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWZsb2F0IGM7CisJZmxvYXQgbTsKKwlmbG9hdCB5OworCWZsb2F0IGs7CisJZmxvYXQgYWxwaGE7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZmZmYiLAorCSAgICAgICAgICAgICAgICAgICAgICAmYywKKwkgICAgICAgICAgICAgICAgICAgICAgJm0sCisJICAgICAgICAgICAgICAgICAgICAgICZ5LAorCSAgICAgICAgICAgICAgICAgICAgICAmaywKKwkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIG0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICB5LAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgaywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENNWUtTdHJva2VDb2xvcihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWZsb2F0IGM7CisJZmxvYXQgbTsKKwlmbG9hdCB5OworCWZsb2F0IGs7CisJZmxvYXQgYWxwaGE7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZmZmYiLAorCSAgICAgICAgICAgICAgICAgICAgICAmYywKKwkgICAgICAgICAgICAgICAgICAgICAgJm0sCisJICAgICAgICAgICAgICAgICAgICAgICZ5LAorCSAgICAgICAgICAgICAgICAgICAgICAmaywKKwkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0U2V0Q01ZS1N0cm9rZUNvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGssCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQoreworCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKwlmbG9hdCBzcGFjaW5nOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAorCSAgICAgICAgICAgICAgICAgICAgICAmc3BhY2luZykpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmcpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJZmxvYXQgeDsKKwlmbG9hdCB5OworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKKwkgICAgICAgICAgICAgICAgICAgICAgJngsCisJICAgICAgICAgICAgICAgICAgICAgICZ5KSkKKwkJcmV0dXJuIE5VTEw7CisJQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisJICAgICAgICAgICAgICAgICAgICAgICAgIHkpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJQ0dQb2ludCBfcnY7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisJCXJldHVybiBOVUxMOworCV9ydiA9IENHQ29udGV4dEdldFRleHRQb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKwlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorCSAgICAgICAgICAgICAgICAgICAgIENHUG9pbnRfTmV3LCAmX3J2KTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0VGV4dE1hdHJpeChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCUNHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisJICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX0NvbnZlcnQsICZ0cmFuc2Zvcm0pKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRTZXRUZXh0TWF0cml4KF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0pOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0VGV4dE1hdHJpeChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCUNHQWZmaW5lVHJhbnNmb3JtIF9ydjsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKwkJcmV0dXJuIE5VTEw7CisJX3J2ID0gQ0dDb250ZXh0R2V0VGV4dE1hdHJpeChfc2VsZi0+b2JfaXRzZWxmKTsKKwlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorCSAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX05ldywgJl9ydik7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWludCBtb2RlOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZShfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZvbnRTaXplKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJZmxvYXQgc2l6ZTsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKwkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRTZXRGb250U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2VsZWN0Rm9udChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWNoYXIgKiBuYW1lOworCWZsb2F0IHNpemU7CisJaW50IHRleHRFbmNvZGluZzsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzZmkiLAorCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwKKwkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisJICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RW5jb2RpbmcpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRTZWxlY3RGb250KF9zZWxmLT5vYl9pdHNlbGYsCisJICAgICAgICAgICAgICAgICAgICBuYW1lLAorCSAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKwkgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGluZyk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWNoYXIgKmNzdHJpbmdfX2luX187CisJbG9uZyBjc3RyaW5nX19sZW5fXzsKKwlpbnQgY3N0cmluZ19faW5fbGVuX187CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorCSAgICAgICAgICAgICAgICAgICAgICAmY3N0cmluZ19faW5fXywgJmNzdHJpbmdfX2luX2xlbl9fKSkKKwkJcmV0dXJuIE5VTEw7CisJY3N0cmluZ19fbGVuX18gPSBjc3RyaW5nX19pbl9sZW5fXzsKKwlDR0NvbnRleHRTaG93VGV4dChfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICAgIGNzdHJpbmdfX2luX18sIGNzdHJpbmdfX2xlbl9fKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNob3dUZXh0QXRQb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWZsb2F0IHg7CisJZmxvYXQgeTsKKwljaGFyICpjc3RyaW5nX19pbl9fOworCWxvbmcgY3N0cmluZ19fbGVuX187CisJaW50IGNzdHJpbmdfX2luX2xlbl9fOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmcyMiLAorCSAgICAgICAgICAgICAgICAgICAgICAmeCwKKwkgICAgICAgICAgICAgICAgICAgICAgJnksCisJICAgICAgICAgICAgICAgICAgICAgICZjc3RyaW5nX19pbl9fLCAmY3N0cmluZ19faW5fbGVuX18pKQorCQlyZXR1cm4gTlVMTDsKKwljc3RyaW5nX19sZW5fXyA9IGNzdHJpbmdfX2luX2xlbl9fOworCUNHQ29udGV4dFNob3dUZXh0QXRQb2ludChfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICAgICAgICAgICB4LAorCSAgICAgICAgICAgICAgICAgICAgICAgICB5LAorCSAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyaW5nX19pbl9fLCBjc3RyaW5nX19sZW5fXyk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFbmRQYWdlKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dEVuZFBhZ2UoX3NlbGYtPm9iX2l0c2VsZik7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCV9yZXMgPSBQeV9Ob25lOworCXJldHVybiBfcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGbHVzaChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCit7CisJUHlPYmplY3QgKl9yZXMgPSBOVUxMOworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorCQlyZXR1cm4gTlVMTDsKKwlDR0NvbnRleHRGbHVzaChfc2VsZi0+b2JfaXRzZWxmKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJX3JlcyA9IFB5X05vbmU7CisJcmV0dXJuIF9yZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN5bmNocm9uaXplKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFN5bmNocm9uaXplKF9zZWxmLT5vYl9pdHNlbGYpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJaW50IHNob3VsZEFudGlhbGlhczsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKwkgICAgICAgICAgICAgICAgICAgICAgJnNob3VsZEFudGlhbGlhcykpCisJCXJldHVybiBOVUxMOworCUNHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcyhfc2VsZi0+b2JfaXRzZWxmLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBbnRpYWxpYXMpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlfcmVzID0gUHlfTm9uZTsKKwlyZXR1cm4gX3JlczsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIENHQ29udGV4dFJlZk9ial9tZXRob2RzW10gPSB7CisJeyJDR0NvbnRleHRTYXZlR1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTYXZlR1N0YXRlLCAxLAorCSAiKCkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSwgMSwKKwkgIigpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dFNjYWxlQ1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTY2FsZUNUTSwgMSwKKwkgIihmbG9hdCBzeCwgZmxvYXQgc3kpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dFRyYW5zbGF0ZUNUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0VHJhbnNsYXRlQ1RNLCAxLAorCSAiKGZsb2F0IHR4LCBmbG9hdCB0eSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0Um90YXRlQ1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSb3RhdGVDVE0sIDEsCisJICIoZmxvYXQgYW5nbGUpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dENvbmNhdENUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q29uY2F0Q1RNLCAxLAorCSAiKENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0R2V0Q1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRDVE0sIDEsCisJICIoKSAtPiAoQ0dBZmZpbmVUcmFuc2Zvcm0gX3J2KSJ9LAorCXsiQ0dDb250ZXh0U2V0TGluZVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lV2lkdGgsIDEsCisJICIoZmxvYXQgd2lkdGgpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dFNldExpbmVDYXAiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldExpbmVDYXAsIDEsCisJICIoaW50IGNhcCkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0U2V0TGluZUpvaW4iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldExpbmVKb2luLCAxLAorCSAiKGludCBqb2luKSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRTZXRNaXRlckxpbWl0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRNaXRlckxpbWl0LCAxLAorCSAiKGZsb2F0IGxpbWl0KSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRTZXRGbGF0bmVzcyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0RmxhdG5lc3MsIDEsCisJICIoZmxvYXQgZmxhdG5lc3MpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dFNldEFscGhhIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRBbHBoYSwgMSwKKwkgIihmbG9hdCBhbHBoYSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0QmVnaW5QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRCZWdpblBhdGgsIDEsCisJICIoKSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRNb3ZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0TW92ZVRvUG9pbnQsIDEsCisJICIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZExpbmVUb1BvaW50LCAxLAorCSAiKGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dEFkZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50LCAxLAorCSAiKGZsb2F0IGNwMXgsIGZsb2F0IGNwMXksIGZsb2F0IGNwMngsIGZsb2F0IGNwMnksIGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dEFkZFF1YWRDdXJ2ZVRvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZFF1YWRDdXJ2ZVRvUG9pbnQsIDEsCisJICIoZmxvYXQgY3B4LCBmbG9hdCBjcHksIGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dENsb3NlUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xvc2VQYXRoLCAxLAorCSAiKCkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0QWRkUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUmVjdCwgMSwKKwkgIihDR1JlY3QgcmVjdCkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0QWRkQXJjIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRBcmMsIDEsCisJICIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBlbmRBbmdsZSwgaW50IGNsb2Nrd2lzZSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0QWRkQXJjVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQXJjVG9Qb2ludCwgMSwKKwkgIihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgcmFkaXVzKSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRJc1BhdGhFbXB0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0SXNQYXRoRW1wdHksIDEsCisJICIoKSAtPiAoaW50IF9ydikifSwKKwl7IkNHQ29udGV4dEdldFBhdGhDdXJyZW50UG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFBhdGhDdXJyZW50UG9pbnQsIDEsCisJICIoKSAtPiAoQ0dQb2ludCBfcnYpIn0sCisJeyJDR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3giLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveCwgMSwKKwkgIigpIC0+IChDR1JlY3QgX3J2KSJ9LAorCXsiQ0dDb250ZXh0RHJhd1BhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoLCAxLAorCSAiKGludCBtb2RlKSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRGaWxsUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RmlsbFBhdGgsIDEsCisJICIoKSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRFT0ZpbGxQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0ZpbGxQYXRoLCAxLAorCSAiKCkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0U3Ryb2tlUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aCwgMSwKKwkgIigpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dEZpbGxSZWN0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUmVjdCwgMSwKKwkgIihDR1JlY3QgcmVjdCkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0U3Ryb2tlUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdCwgMSwKKwkgIihDR1JlY3QgcmVjdCkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCwgMSwKKwkgIihDR1JlY3QgcmVjdCwgZmxvYXQgd2lkdGgpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dENsZWFyUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xlYXJSZWN0LCAxLAorCSAiKENHUmVjdCByZWN0KSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRDbGlwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGlwLCAxLAorCSAiKCkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0RU9DbGlwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0NsaXAsIDEsCisJICIoKSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRDbGlwVG9SZWN0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGlwVG9SZWN0LCAxLAorCSAiKENHUmVjdCByZWN0KSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRTZXRHcmF5RmlsbENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRHcmF5RmlsbENvbG9yLCAxLAorCSAiKGZsb2F0IGdyYXksIGZsb2F0IGFscGhhKSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvciwgMSwKKwkgIihmbG9hdCBncmF5LCBmbG9hdCBhbHBoYSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IsIDEsCisJICIoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYWxwaGEpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvciwgMSwKKwkgIihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiLCBmbG9hdCBhbHBoYSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciwgMSwKKwkgIihmbG9hdCBjLCBmbG9hdCBtLCBmbG9hdCB5LCBmbG9hdCBrLCBmbG9hdCBhbHBoYSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0U2V0Q01ZS1N0cm9rZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IsIDEsCisJICIoZmxvYXQgYywgZmxvYXQgbSwgZmxvYXQgeSwgZmxvYXQgaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmciLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcsIDEsCisJICIoZmxvYXQgc3BhY2luZykgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0UG9zaXRpb24sIDEsCisJICIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0UG9zaXRpb24sIDEsCisJICIoKSAtPiAoQ0dQb2ludCBfcnYpIn0sCisJeyJDR0NvbnRleHRTZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0TWF0cml4LCAxLAorCSAiKENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0R2V0VGV4dE1hdHJpeCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0VGV4dE1hdHJpeCwgMSwKKwkgIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIn0sCisJeyJDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZSwgMSwKKwkgIihpbnQgbW9kZSkgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0U2V0Rm9udFNpemUiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZvbnRTaXplLCAxLAorCSAiKGZsb2F0IHNpemUpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dFNlbGVjdEZvbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNlbGVjdEZvbnQsIDEsCisJICIoY2hhciAqIG5hbWUsIGZsb2F0IHNpemUsIGludCB0ZXh0RW5jb2RpbmcpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dFNob3dUZXh0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dCwgMSwKKwkgIihCdWZmZXIgY3N0cmluZykgLT4gTm9uZSJ9LAorCXsiQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQsIDEsCisJICIoZmxvYXQgeCwgZmxvYXQgeSwgQnVmZmVyIGNzdHJpbmcpIC0+IE5vbmUifSwKKwl7IkNHQ29udGV4dEVuZFBhZ2UiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEVuZFBhZ2UsIDEsCisJICIoKSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRGbHVzaCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Rmx1c2gsIDEsCisJICIoKSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3luY2hyb25pemUsIDEsCisJICIoKSAtPiBOb25lIn0sCisJeyJDR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXMiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcywgMSwKKwkgIihpbnQgc2hvdWxkQW50aWFsaWFzKSAtPiBOb25lIn0sCisJe05VTEwsIE5VTEwsIDB9Cit9OworCitQeU1ldGhvZENoYWluIENHQ29udGV4dFJlZk9ial9jaGFpbiA9IHsgQ0dDb250ZXh0UmVmT2JqX21ldGhvZHMsIE5VTEwgfTsKKworc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfZ2V0YXR0cihDR0NvbnRleHRSZWZPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIFB5X0ZpbmRNZXRob2RJbkNoYWluKCZDR0NvbnRleHRSZWZPYmpfY2hhaW4sIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworfQorCisjZGVmaW5lIENHQ29udGV4dFJlZk9ial9zZXRhdHRyIE5VTEwKKworI2RlZmluZSBDR0NvbnRleHRSZWZPYmpfY29tcGFyZSBOVUxMCisKKyNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX3JlcHIgTlVMTAorCisjZGVmaW5lIENHQ29udGV4dFJlZk9ial9oYXNoIE5VTEwKKworUHlUeXBlT2JqZWN0IENHQ29udGV4dFJlZl9UeXBlID0geworCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorCTAsIC8qb2Jfc2l6ZSovCisJIl9DRy5DR0NvbnRleHRSZWYiLCAvKnRwX25hbWUqLworCXNpemVvZihDR0NvbnRleHRSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisJMCwgLyp0cF9pdGVtc2l6ZSovCisJLyogbWV0aG9kcyAqLworCShkZXN0cnVjdG9yKSBDR0NvbnRleHRSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKwkwLCAvKnRwX3ByaW50Ki8KKwkoZ2V0YXR0cmZ1bmMpIENHQ29udGV4dFJlZk9ial9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworCShzZXRhdHRyZnVuYykgQ0dDb250ZXh0UmVmT2JqX3NldGF0dHIsIC8qdHBfc2V0YXR0ciovCisJKGNtcGZ1bmMpIENHQ29udGV4dFJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworCShyZXByZnVuYykgQ0dDb250ZXh0UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisJKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisJKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisJKGhhc2hmdW5jKSBDR0NvbnRleHRSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0dDb250ZXh0UmVmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3N0YXRpYyBQeU9iamVjdCAqQ0dfQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKK3sKKwlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisJR3JhZlB0ciBwb3J0OworCUNHQ29udGV4dFJlZiBjdHg7CisJT1NTdGF0dXMgX2VycjsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisJCXJldHVybiBOVUxMOworCisJX2VyciA9IENyZWF0ZUNHQ29udGV4dEZvclBvcnQocG9ydCwgJmN0eCk7CisJaWYgKF9lcnIgIT0gbm9FcnIpCisJCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisJX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0dDb250ZXh0UmVmT2JqX05ldywgY3R4KTsKKwlyZXR1cm4gX3JlczsKKworfQorCitzdGF0aWMgUHlNZXRob2REZWYgQ0dfbWV0aG9kc1tdID0geworCXsiQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydCIsIChQeUNGdW5jdGlvbilDR19DcmVhdGVDR0NvbnRleHRGb3JQb3J0LCAxLAorCSAiKENHcmFmUHRyKSAtPiBDR0NvbnRleHRSZWYifSwKKwl7TlVMTCwgTlVMTCwgMH0KK307CisKKworCisKK3ZvaWQgaW5pdF9DRyh2b2lkKQoreworCVB5T2JqZWN0ICptOworCVB5T2JqZWN0ICpkOworCisKKworI2lmICFUQVJHRVRfQVBJX01BQ19PU1gKKwlDRkJ1bmRsZVJlZiBzeXNCdW5kbGU7CisJT1NTdGF0dXMgZXJyOworCisJaWYgKCZMb2FkRnJhbWV3b3JrQnVuZGxlID09IE5VTEwpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiQ29yZUNyYXBoaWNzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJcmV0dXJuOworCX0KKwllcnIgPSBMb2FkRnJhbWV3b3JrQnVuZGxlKENGU1RSKCJBcHBsaWNhdGlvblNlcnZpY2VzLmZyYW1ld29yayIpLCAmc3lzQnVuZGxlKTsKKwlpZiAoZXJyID09IG5vRXJyKQorCQllcnIgPSBDRk1MYXRlSW1wb3J0QnVuZGxlKCZnRnJhZ1RvRml4TG9jYXRvciwgZ0ZyYWdUb0ZpeENvbm5JRCwgRnJhZ21lbnRJbml0LCAiXHBDR1N0dWJMaWIiLCBzeXNCdW5kbGUpOworCWlmIChlcnIgIT0gbm9FcnIpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiQ29yZUNyYXBoaWNzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJcmV0dXJuOworCX07CisjZW5kaWYgIC8qICFUQVJHRVRfQVBJX01BQ19PU1ggKi8KKworCisJbSA9IFB5X0luaXRNb2R1bGUoIl9DRyIsIENHX21ldGhvZHMpOworCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworCUNHX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKwlpZiAoQ0dfRXJyb3IgPT0gTlVMTCB8fAorCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDR19FcnJvcikgIT0gMCkKKwkJcmV0dXJuOworCUNHQ29udGV4dFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisJUHlfSU5DUkVGKCZDR0NvbnRleHRSZWZfVHlwZSk7CisJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDR0NvbnRleHRSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNHQ29udGV4dFJlZl9UeXBlKSAhPSAwKQorCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIENHQ29udGV4dFJlZlR5cGUiKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PSBFbmQgbW9kdWxlIF9DRyA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL2Nnc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2NnL2Nnc2Nhbi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNjc2NDcwCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL01vZHVsZXMvY2cvY2dzY2FuLnB5CkBAIC0wLDAgKzEsODMgQEAKKyMgU2NhbiBhbiBBcHBsZSBoZWFkZXIgZmlsZSwgZ2VuZXJhdGluZyBhIFB5dGhvbiBmaWxlIG9mIGdlbmVyYXRvciBjYWxscy4KKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitCR0VORElSPW9zLnBhdGguam9pbihzeXMucHJlZml4LCAnOlRvb2xzOmJnZW46YmdlbicpCitzeXMucGF0aC5hcHBlbmQoQkdFTkRJUikKK2Zyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyX09TWAorZnJvbSBiZ2VubG9jYXRpb25zIGltcG9ydCBUT09MQk9YRElSCisKK0xPTkcgPSAiQ29yZUdyYXBoaWNzIgorU0hPUlQgPSAiY2ciCitPQkpFQ1RTID0gKCJDR0NvbnRleHRSZWYiLCAKKwkJKQorIyBBREQgb2JqZWN0IHR5cGVuYW1lcyBoZXJlCisKK2RlZiBtYWluKCk6CisJaW5wdXQgPSBbCisJCSJDR0NvbnRleHQuaCIsCisJXQorCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKwlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKwlzY2FubmVyLnNjYW4oKQorCXNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKKwlzY2FubmVyLmNsb3NlKCkKKwlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKwlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisJcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKworY2xhc3MgTXlTY2FubmVyKFNjYW5uZXJfT1NYKToKKworCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKwkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisJCWlmIGFyZ2xpc3Q6CisJCQl0LCBuLCBtID0gYXJnbGlzdFswXQorCQkJaWYgdCBpbiBPQkpFQ1RTIGFuZCBtID09ICJJbk1vZGUiOgorCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCisJCQkJbGlzdG5hbWUgPSB0ICsgIl9tZXRob2RzIgorCQkJIyBTcGVjaWFsIGNhc2UgZm9yIHRoZSBzaWxseSBmaXJzdCBBbGxvY2F0b3JSZWYgYXJndW1lbnQKKwkJCWlmIHQgPT0gJ0NGQWxsb2NhdG9yUmVmJyBhbmQgbSA9PSAnSW5Nb2RlJyBhbmQgbGVuKGFyZ2xpc3QpID4gMToKKwkJCQl0LCBuLCBtID0gYXJnbGlzdFsxXQorCQkJCWlmIHQgaW4gT0JKRUNUUyBhbmQgbSA9PSAiSW5Nb2RlIjoKKwkJCQkJY2xhc3NuYW1lID0gIk1ldGhvZFNraXBBcmcxIgorCQkJCQlsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCisJCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisKKwlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKwkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKworCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisJCXJldHVybiBbCisJCQkiQ0dDb250ZXh0UmV0YWluIiwKKwkJCSJDR0NvbnRleHRSZWxlYXNlIiwKKwkJCV0KKworCWRlZiBtYWtlZ3JleWxpc3Qoc2VsZik6CisJCXJldHVybiBbXQorCisJZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKwkJcmV0dXJuIFsKKwkJCSJmbG9hdF9wdHIiLAorCQkJIkNHUmVjdF9wdHIiLAorCQkJIkNHUG9pbnRfcHRyIiwKKwkJCSJDR0NvbG9yU3BhY2VSZWYiLAorCQkJIkNHQ29sb3JSZW5kZXJpbmdJbnRlbnQiLAorCQkJIkNHRm9udFJlZiIsCisjCQkJImNoYXJfcHRyIiwKKwkJCSJDR0dseXBoX3B0ciIsCisJCQkiQ0dJbWFnZVJlZiIsCisJCQkiQ0dQREZEb2N1bWVudFJlZiIsCisJCQldCisKKwlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKwkJcmV0dXJuIFsKKwkJCShbKCJjaGFyX3B0ciIsICJjc3RyaW5nIiwgIkluTW9kZSIpLCAoInNpemVfdCIsICJsZW5ndGgiLCAiSW5Nb2RlIildLAorCQkJIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCisjCQkJKFsoImNoYXJfcHRyIiwgIm5hbWUiLCAiSW5Nb2RlIiksXSwKKyMJCQkgWygiQ0NDQ0MiLCAiKiIsICIqIildKSwKKwkJCV0KKwkJCQoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKwltYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL2Nnc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL2NnL2Nnc3VwcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZWM1NmU0Ci0tLSAvZGV2L251bGwKKysrIGIvTWFjL01vZHVsZXMvY2cvY2dzdXBwb3J0LnB5CkBAIC0wLDAgKzEsMzA1IEBACisjIFRoaXMgc2NyaXB0IGdlbmVyYXRlcyBhIFB5dGhvbiBpbnRlcmZhY2UgZm9yIGFuIEFwcGxlIE1hY2ludG9zaCBNYW5hZ2VyLgorIyBJdCB1c2VzIHRoZSAiYmdlbiIgcGFja2FnZSB0byBnZW5lcmF0ZSBDIGNvZGUuCisjIFRoZSBmdW5jdGlvbiBzcGVjaWZpY2F0aW9ucyBhcmUgZ2VuZXJhdGVkIGJ5IHNjYW5uaW5nIHRoZSBtYW1hZ2VyJ3MgaGVhZGVyIGZpbGUsCisjIHVzaW5nIHRoZSAic2NhbnRvb2xzIiBwYWNrYWdlIChjdXN0b21pemVkIGZvciB0aGlzIHBhcnRpY3VsYXIgbWFuYWdlcikuCisKKyNlcnJvciBtaXNzaW5nIFNldEFjdGlvbkZpbHRlcgorCitpbXBvcnQgc3RyaW5nCisKKyMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKK01PRE5BTUUgPSAnX0NHJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKKworIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZworTU9EUFJFRklYID0gJ0NHJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK0lOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KKworZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCisKKworIyBDcmVhdGUgdGhlIHR5cGUgb2JqZWN0cworCitpbmNsdWRlc3R1ZmYgPSBpbmNsdWRlc3R1ZmYgKyAiIiIKKyNpZmRlZiBXSVRIT1VUX0ZSQU1FV09SS1MKKyNpbmNsdWRlIDxRdWlja2RyYXcuaD4KKyNpbmNsdWRlIDxDR0NvbnRleHQuaD4KKyNlbHNlCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oPgorI2VuZGlmCisKKyNpZiAhVEFSR0VUX0FQSV9NQUNfT1NYCisJLyogVGhpcyBjb2RlIGlzIGFkYXB0ZWQgZnJvbSB0aGUgQ2FsbE1hY2hPRnJhbWV3b3JrIGRlbW8gYXQ6CisgICAgICAgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vc2FtcGxlY29kZS9TYW1wbGVfQ29kZS9SdW50aW1lX0FyY2hpdGVjdHVyZS9DYWxsTWFjaE9GcmFtZXdvcmsuaHRtCisgICAgICAgSXQgYWxsb3dzIHVzIHRvIGNhbGwgTWFjaC1PIGZ1bmN0aW9ucyBmcm9tIENGTSBhcHBzLiAqLworCisJI2luY2x1ZGUgPEZvbGRlcnMuaD4KKwkjaW5jbHVkZSAiQ0ZNTGF0ZUltcG9ydC5oIgorCisJc3RhdGljIE9TU3RhdHVzIExvYWRGcmFtZXdvcmtCdW5kbGUoQ0ZTdHJpbmdSZWYgZnJhbWV3b3JrLCBDRkJ1bmRsZVJlZiAqYnVuZGxlUHRyKQorCQkvLyBUaGlzIHJvdXRpbmUgZmluZHMgYSB0aGUgbmFtZWQgZnJhbWV3b3JrIGFuZCBjcmVhdGVzIGEgQ0ZCdW5kbGUgCisJCS8vIG9iamVjdCBmb3IgaXQuICBJdCBsb29rcyBmb3IgdGhlIGZyYW1ld29yayBpbiB0aGUgZnJhbWV3b3JrcyBmb2xkZXIsIAorCQkvLyBhcyBkZWZpbmVkIGJ5IHRoZSBGb2xkZXIgTWFuYWdlci4gIEN1cnJlbnRseSB0aGlzIGlzIAorCQkvLyAiL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MiLCBidXQgd2UgcmVjb21tZW5kIHRoYXQgeW91IGF2b2lkIGhhcmQgY29kZWQgCisJCS8vIHBhdGhzIHRvIGVuc3VyZSBmdXR1cmUgY29tcGF0aWJpbGl0eS4KKwkJLy8KKwkJLy8gWW91IG1pZ2h0IHRoaW5rIHRoYXQgeW91IGNvdWxkIHVzZSBDRkJ1bmRsZUdldEJ1bmRsZVdpdGhJZGVudGlmaWVyIGJ1dCAKKwkJLy8gdGhhdCBvbmx5IGZpbmRzIGJ1bmRsZXMgdGhhdCBhcmUgYWxyZWFkeSBsb2FkZWQgaW50byB5b3VyIGNvbnRleHQuIAorCQkvLyBUaGF0IHdvdWxkIHdvcmsgaW4gdGhlIGNhc2Ugb2YgdGhlIFN5c3RlbSBmcmFtZXdvcmsgYnV0IGl0IHdvdWxkbid0IAorCQkvLyB3b3JrIGlmIHlvdSdyZSB1c2luZyBzb21lIG90aGVyLCBsZXNzLW9idmlvdXMsIGZyYW1ld29yay4KKwl7CisJCU9TU3RhdHVzIAllcnI7CisJCUZTUmVmIAkJZnJhbWV3b3Jrc0ZvbGRlclJlZjsKKwkJQ0ZVUkxSZWYJYmFzZVVSTDsKKwkJQ0ZVUkxSZWYJYnVuZGxlVVJMOworCQkKKwkJKmJ1bmRsZVB0ciA9IG5pbDsKKwkJCisJCWJhc2VVUkwgPSBuaWw7CisJCWJ1bmRsZVVSTCA9IG5pbDsKKwkJCisJCS8vIEZpbmQgdGhlIGZyYW1ld29ya3MgZm9sZGVyIGFuZCBjcmVhdGUgYSBVUkwgZm9yIGl0LgorCQkKKwkJZXJyID0gRlNGaW5kRm9sZGVyKGtPbkFwcHJvcHJpYXRlRGlzaywga0ZyYW1ld29ya3NGb2xkZXJUeXBlLCB0cnVlLCAmZnJhbWV3b3Jrc0ZvbGRlclJlZik7CisJCWlmIChlcnIgPT0gbm9FcnIpIHsKKwkJCWJhc2VVUkwgPSBDRlVSTENyZWF0ZUZyb21GU1JlZihrQ0ZBbGxvY2F0b3JTeXN0ZW1EZWZhdWx0LCAmZnJhbWV3b3Jrc0ZvbGRlclJlZik7CisJCQlpZiAoYmFzZVVSTCA9PSBuaWwpIHsKKwkJCQllcnIgPSBjb3JlRm91bmRhdGlvblVua25vd25FcnI7CisJCQl9CisJCX0KKwkJCisJCS8vIEFwcGVuZCB0aGUgbmFtZSBvZiB0aGUgZnJhbWV3b3JrIHRvIHRoZSBVUkwuCisJCQorCQlpZiAoZXJyID09IG5vRXJyKSB7CisJCQlidW5kbGVVUkwgPSBDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50KGtDRkFsbG9jYXRvclN5c3RlbURlZmF1bHQsIGJhc2VVUkwsIGZyYW1ld29yaywgZmFsc2UpOworCQkJaWYgKGJ1bmRsZVVSTCA9PSBuaWwpIHsKKwkJCQllcnIgPSBjb3JlRm91bmRhdGlvblVua25vd25FcnI7CisJCQl9CisJCX0KKwkJCisJCS8vIENyZWF0ZSBhIGJ1bmRsZSBiYXNlZCBvbiB0aGF0IFVSTCBhbmQgbG9hZCB0aGUgYnVuZGxlIGludG8gbWVtb3J5LgorCQkvLyBXZSBuZXZlciB1bmxvYWQgdGhlIGJ1bmRsZSwgd2hpY2ggaXMgcmVhc29uYWJsZSBpbiB0aGlzIGNhc2UgYmVjYXVzZSAKKwkJLy8gdGhlIHNhbXBsZSBhc3N1bWVzIHRoYXQgeW91J2xsIGJlIGNhbGxpbmcgZnVuY3Rpb25zIGZyb20gdGhpcyAKKwkJLy8gZnJhbWV3b3JrIHRocm91Z2hvdXQgdGhlIGxpZmUgb2YgeW91ciBhcHBsaWNhdGlvbi4KKwkJCisJCWlmIChlcnIgPT0gbm9FcnIpIHsKKwkJCSpidW5kbGVQdHIgPSBDRkJ1bmRsZUNyZWF0ZShrQ0ZBbGxvY2F0b3JTeXN0ZW1EZWZhdWx0LCBidW5kbGVVUkwpOworCQkJaWYgKCpidW5kbGVQdHIgPT0gbmlsKSB7CisJCQkJZXJyID0gY29yZUZvdW5kYXRpb25Vbmtub3duRXJyOworCQkJfQorCQl9CisJCWlmIChlcnIgPT0gbm9FcnIpIHsKKwkJICAgIGlmICggISBDRkJ1bmRsZUxvYWRFeGVjdXRhYmxlKCAqYnVuZGxlUHRyICkgKSB7CisJCQkJZXJyID0gY29yZUZvdW5kYXRpb25Vbmtub3duRXJyOworCQkgICAgfQorCQl9CisKKwkJLy8gQ2xlYW4gdXAuCisJCQorCQlpZiAoZXJyICE9IG5vRXJyICYmICpidW5kbGVQdHIgIT0gbmlsKSB7CisJCQlDRlJlbGVhc2UoKmJ1bmRsZVB0cik7CisJCQkqYnVuZGxlUHRyID0gbmlsOworCQl9CisJCWlmIChidW5kbGVVUkwgIT0gbmlsKSB7CisJCQlDRlJlbGVhc2UoYnVuZGxlVVJMKTsKKwkJfQkKKwkJaWYgKGJhc2VVUkwgIT0gbmlsKSB7CisJCQlDRlJlbGVhc2UoYmFzZVVSTCk7CisJCX0JCisJCQorCQlyZXR1cm4gZXJyOworCX0KKworCisKKwkvLyBUaGUgQ0ZNTGF0ZUltcG9ydCBhcHByb2FjaCByZXF1aXJlcyB0aGF0IHlvdSBkZWZpbmUgYSBmcmFnbWVudCAKKwkvLyBpbml0aWFsaXNhdGlvbiByb3V0aW5lIHRoYXQgbGF0Y2hlcyB0aGUgZnJhZ21lbnQncyBjb25uZWN0aW9uIAorCS8vIElEIGFuZCBsb2NhdG9yLiAgSWYgeW91ciBjb2RlIGFscmVhZHkgaGFzIGEgZnJhZ21lbnQgaW5pdGlhbGlzZXIgCisJLy8geW91IHdpbGwgaGF2ZSB0byBpbnRlZ3JhdGUgdGhlIGZvbGxvd2luZyBpbnRvIGl0LgorCisJc3RhdGljIENGcmFnQ29ubmVjdGlvbklEIAkJCWdGcmFnVG9GaXhDb25uSUQ7CisJc3RhdGljIEZTU3BlYyAJCQkJCQlnRnJhZ1RvRml4RmlsZTsKKwlzdGF0aWMgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yIAlnRnJhZ1RvRml4TG9jYXRvcjsKKworCWV4dGVybiBPU0VyciBGcmFnbWVudEluaXQoY29uc3QgQ0ZyYWdJbml0QmxvY2sgKmluaXRCbG9jayk7CisJZXh0ZXJuIE9TRXJyIEZyYWdtZW50SW5pdChjb25zdCBDRnJhZ0luaXRCbG9jayAqaW5pdEJsb2NrKQorCXsKKwkJX19pbml0aWFsaXplKGluaXRCbG9jayk7IC8qIGNhbGwgdGhlICJvcmlnaW5hbCIgaW5pdGlhbGl6ZXIgKi8KKwkJZ0ZyYWdUb0ZpeENvbm5JRAk9IChDRnJhZ0Nvbm5lY3Rpb25JRCkgaW5pdEJsb2NrLT5jbG9zdXJlSUQ7CisJCWdGcmFnVG9GaXhGaWxlIAkJPSAqKGluaXRCbG9jay0+ZnJhZ0xvY2F0b3IudS5vbkRpc2suZmlsZVNwZWMpOworCQlnRnJhZ1RvRml4TG9jYXRvciAJPSBpbml0QmxvY2stPmZyYWdMb2NhdG9yLnUub25EaXNrOworCQlnRnJhZ1RvRml4TG9jYXRvci5maWxlU3BlYyA9ICZnRnJhZ1RvRml4RmlsZTsKKwkJCisJCXJldHVybiBub0VycjsKKwl9CisKKyNlbmRpZgorCitleHRlcm4gaW50IEdyYWZPYmpfQ29udmVydChQeU9iamVjdCAqLCBHcmFmUHRyICopOworCisvKgorKiogTWFudWFsIGNvbnZlcnRlcnMKKyovCisKK1B5T2JqZWN0ICpDR1BvaW50X05ldyhDR1BvaW50ICppdHNlbGYpCit7CisKKwlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsCisJCQlpdHNlbGYtPngsCisJCQlpdHNlbGYtPnkpOworfQorCitpbnQKK0NHUG9pbnRfQ29udmVydChQeU9iamVjdCAqdiwgQ0dQb2ludCAqcF9pdHNlbGYpCit7CisJaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmKSIsCisJCQkmcF9pdHNlbGYtPngsCisJCQkmcF9pdHNlbGYtPnkpICkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK1B5T2JqZWN0ICpDR1JlY3RfTmV3KENHUmVjdCAqaXRzZWxmKQoreworCisJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZmZmKSIsCisJCQlpdHNlbGYtPm9yaWdpbi54LAorCQkJaXRzZWxmLT5vcmlnaW4ueSwKKwkJCWl0c2VsZi0+c2l6ZS53aWR0aCwKKwkJCWl0c2VsZi0+c2l6ZS5oZWlnaHQpOworfQorCitpbnQKK0NHUmVjdF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDR1JlY3QgKnBfaXRzZWxmKQoreworCWlmKCAhUHlBcmdfUGFyc2UodiwgIihmZmZmKSIsCisJCQkmcF9pdHNlbGYtPm9yaWdpbi54LAorCQkJJnBfaXRzZWxmLT5vcmlnaW4ueSwKKwkJCSZwX2l0c2VsZi0+c2l6ZS53aWR0aCwKKwkJCSZwX2l0c2VsZi0+c2l6ZS5oZWlnaHQpICkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK1B5T2JqZWN0ICpDR0FmZmluZVRyYW5zZm9ybV9OZXcoQ0dBZmZpbmVUcmFuc2Zvcm0gKml0c2VsZikKK3sKKworCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZmZmKSIsCisJCQlpdHNlbGYtPmEsCisJCQlpdHNlbGYtPmIsCisJCQlpdHNlbGYtPmMsCisJCQlpdHNlbGYtPmQsCisJCQlpdHNlbGYtPnR4LAorCQkJaXRzZWxmLT50eSk7Cit9CisKK2ludAorQ0dBZmZpbmVUcmFuc2Zvcm1fQ29udmVydChQeU9iamVjdCAqdiwgQ0dBZmZpbmVUcmFuc2Zvcm0gKnBfaXRzZWxmKQoreworCWlmKCAhUHlBcmdfUGFyc2UodiwgIihmZmZmZmYpIiwKKwkJCSZwX2l0c2VsZi0+YSwKKwkJCSZwX2l0c2VsZi0+YiwKKwkJCSZwX2l0c2VsZi0+YywKKwkJCSZwX2l0c2VsZi0+ZCwKKwkJCSZwX2l0c2VsZi0+dHgsCisJCQkmcF9pdHNlbGYtPnR5KSApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorIiIiCisKK2luaXRzdHVmZiA9IGluaXRzdHVmZiArICIiIgorI2lmICFUQVJHRVRfQVBJX01BQ19PU1gKK0NGQnVuZGxlUmVmIHN5c0J1bmRsZTsKK09TU3RhdHVzIGVycjsKKworaWYgKCZMb2FkRnJhbWV3b3JrQnVuZGxlID09IE5VTEwpIHsKKwlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJDb3JlQ3JhcGhpY3Mgbm90IHN1cHBvcnRlZCIpOworCXJldHVybjsKK30KK2VyciA9IExvYWRGcmFtZXdvcmtCdW5kbGUoQ0ZTVFIoIkFwcGxpY2F0aW9uU2VydmljZXMuZnJhbWV3b3JrIiksICZzeXNCdW5kbGUpOworaWYgKGVyciA9PSBub0VycikKKwllcnIgPSBDRk1MYXRlSW1wb3J0QnVuZGxlKCZnRnJhZ1RvRml4TG9jYXRvciwgZ0ZyYWdUb0ZpeENvbm5JRCwgRnJhZ21lbnRJbml0LCAiXHBDR1N0dWJMaWIiLCBzeXNCdW5kbGUpOworaWYgKGVyciAhPSBub0VycikgeworCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIkNvcmVDcmFwaGljcyBub3Qgc3VwcG9ydGVkIik7CisJcmV0dXJuOworfTsKKyNlbmRpZiAgLyogIVRBUkdFVF9BUElfTUFDX09TWCAqLworIiIiCisKK2NsYXNzIE15T3BhcXVlQnlWYWx1ZVR5cGUoT3BhcXVlQnlWYWx1ZVR5cGUpOgorCSIiIlNvcnQgb2YgYSBtaXggYmV0d2VlbiBPcGFxdWVCeVZhbHVlVHlwZSBhbmQgT3BhcXVlVHlwZS4iIiIKKwlkZWYgbWt2YWx1ZUFyZ3Moc2VsZiwgbmFtZSk6CisJCXJldHVybiAiJXMsICYlcyIgJSAoc2VsZi5uZXcsIG5hbWUpCisKK0NHUG9pbnQgPSBNeU9wYXF1ZUJ5VmFsdWVUeXBlKCdDR1BvaW50JywgJ0NHUG9pbnQnKQorQ0dSZWN0ID0gTXlPcGFxdWVCeVZhbHVlVHlwZSgnQ0dSZWN0JywgJ0NHUmVjdCcpCitDR0FmZmluZVRyYW5zZm9ybSA9IE15T3BhcXVlQnlWYWx1ZVR5cGUoJ0NHQWZmaW5lVHJhbnNmb3JtJywgJ0NHQWZmaW5lVHJhbnNmb3JtJykKKworY2hhcl9wdHIgPSBUeXBlKCJjaGFyICoiLCAicyIpCisKK0NHVGV4dEVuY29kaW5nID0gaW50CitDR0xpbmVDYXAgPSBpbnQKK0NHTGluZUpvaW4gPSBpbnQKK0NHVGV4dERyYXdpbmdNb2RlID0gaW50CitDR1BhdGhEcmF3aW5nTW9kZSA9IGludAorCisjIFRoZSByZWFsIG9iamVjdHMKK0NHQ29udGV4dFJlZiA9IE9wYXF1ZUJ5VmFsdWVUeXBlKCJDR0NvbnRleHRSZWYiLCAiQ0dDb250ZXh0UmVmT2JqIikKKworCitjbGFzcyBNeU9iamVjdERlZmluaXRpb24oR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6CisJZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6CisJCU9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQorCWRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKKwkJT3V0cHV0KCJDR0NvbnRleHRSZWxlYXNlKHNlbGYtPm9iX2l0c2VsZik7IikKKworCisjIENyZWF0ZSB0aGUgZ2VuZXJhdG9yIGdyb3VwcyBhbmQgbGluayB0aGVtCittb2R1bGUgPSBNYWNNb2R1bGUoTU9ETkFNRSwgTU9EUFJFRklYLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZikKKworQ0dDb250ZXh0UmVmX29iamVjdCA9IE15T2JqZWN0RGVmaW5pdGlvbignQ0dDb250ZXh0UmVmJywgJ0NHQ29udGV4dFJlZk9iaicsICdDR0NvbnRleHRSZWYnKQorCisKKyMgQUREIG9iamVjdCBoZXJlCisKK21vZHVsZS5hZGRvYmplY3QoQ0dDb250ZXh0UmVmX29iamVjdCkKKworCisKK0Z1bmN0aW9uID0gRnVuY3Rpb25HZW5lcmF0b3IKK01ldGhvZCA9IE1ldGhvZEdlbmVyYXRvcgorCitDR0NvbnRleHRSZWZfbWV0aG9kcyA9IFtdCisKKyMgQUREIF9tZXRob2RzIGluaXRpYWxpemVyIGhlcmUKK2V4ZWNmaWxlKElOUFVURklMRSkKKworQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydF9ib2R5ID0gIiIiXAorR3JhZlB0ciBwb3J0OworQ0dDb250ZXh0UmVmIGN0eDsKK09TU3RhdHVzIF9lcnI7CisKK2lmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisJcmV0dXJuIE5VTEw7CisKK19lcnIgPSBDcmVhdGVDR0NvbnRleHRGb3JQb3J0KHBvcnQsICZjdHgpOworaWYgKF9lcnIgIT0gbm9FcnIpCisJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKK19yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIENHQ29udGV4dFJlZk9ial9OZXcsIGN0eCk7CityZXR1cm4gX3JlczsKKyIiIgorCitmID0gTWFudWFsR2VuZXJhdG9yKCJDcmVhdGVDR0NvbnRleHRGb3JQb3J0IiwgQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydF9ib2R5KTsKK2YuZG9jc3RyaW5nID0gbGFtYmRhOiAiKENHcmFmUHRyKSAtPiBDR0NvbnRleHRSZWYiCittb2R1bGUuYWRkKGYpCisKKworIyBBREQgYWRkIGZvcmxvb3AgaGVyZQorZm9yIGYgaW4gQ0dDb250ZXh0UmVmX21ldGhvZHM6CisJQ0dDb250ZXh0UmVmX29iamVjdC5hZGQoZikKKworIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCitTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQorbW9kdWxlLmdlbmVyYXRlKCkKKwo=