ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZyBiL2RyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGIyMDFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnCkBAIC0wLDAgKzEsMTg4IEBACisjIC0qLSBzaGVsbC1zY3JpcHQgLSotCisKK21lbnUgIklFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQiCisKK2NvbmZpZyBJRUVFMTM5NAorCXRyaXN0YXRlICJJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJIHx8IEJST0tFTgorCXNlbGVjdCBORVQKKwloZWxwCisJICBJRUVFIDEzOTQgZGVzY3JpYmVzIGEgaGlnaCBwZXJmb3JtYW5jZSBzZXJpYWwgYnVzLCB3aGljaCBpcyBhbHNvCisJICBrbm93biBhcyBGaXJlV2lyZSh0bSkgb3IgaS5MaW5rKHRtKSBhbmQgaXMgdXNlZCBmb3IgY29ubmVjdGluZyBhbGwKKwkgIHNvcnRzIG9mIGRldmljZXMgKG1vc3Qgbm90YWJseSBkaWdpdGFsIHZpZGVvIGNhbWVyYXMpIHRvIHlvdXIKKwkgIGNvbXB1dGVyLgorCisJICBJZiB5b3UgaGF2ZSBGaXJlV2lyZSBoYXJkd2FyZSBhbmQgd2FudCB0byB1c2UgaXQsIHNheSBZIGhlcmUuICBUaGlzCisJICBpcyB0aGUgY29yZSBzdXBwb3J0IG9ubHksIHlvdSB3aWxsIGFsc28gbmVlZCB0byBzZWxlY3QgYSBkcml2ZXIgZm9yCisJICB5b3VyIElFRUUgMTM5NCBhZGFwdGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpZWVlMTM5NC4KKworY29tbWVudCAiU3Vic3lzdGVtIE9wdGlvbnMiCisJZGVwZW5kcyBvbiBJRUVFMTM5NAorCitjb25maWcgSUVFRTEzOTRfVkVSQk9TRURFQlVHCisJYm9vbCAiRXhjZXNzaXZlIGRlYnVnZ2luZyBvdXRwdXQiCisJZGVwZW5kcyBvbiBJRUVFMTM5NAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBnZXQgdmVyeSB2ZXJib3NlIGRlYnVnZ2luZyBsb2dzIGZyb20KKwkgIHRoZSBzdWJzeXN0ZW0gd2hpY2ggaW5jbHVkZXMgYSBkdW1wIG9mIHRoZSBoZWFkZXIgb2YgZXZlcnkgc2VudAorCSAgYW5kIHJlY2VpdmVkIHBhY2tldC4gIFRoaXMgY2FuIGFtb3VudCB0byBhIGhpZ2ggYW1vdW50IG9mIGRhdGEKKwkgIGNvbGxlY3RlZCBpbiBhIHZlcnkgc2hvcnQgdGltZSB3aGljaCBpcyB1c3VhbGx5IGFsc28gc2F2ZWQgdG8KKwkgIGRpc2sgYnkgdGhlIHN5c3RlbSBsb2dnaW5nIGRhZW1vbnMuCisKKwkgIFNheSBZIGlmIHlvdSByZWFsbHkgd2FudCBvciBuZWVkIHRoZSBkZWJ1Z2dpbmcgb3V0cHV0LCBldmVyeW9uZQorCSAgZWxzZSBzYXlzIE4uCisKK2NvbmZpZyBJRUVFMTM5NF9PVUlfREIKKwlib29sICJPVUkgRGF0YWJhc2UgYnVpbHQtaW4iCisJZGVwZW5kcyBvbiBJRUVFMTM5NAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIGFuIE9VSSBsaXN0ICh2ZW5kb3IgdW5pcXVlIElEJ3MpIHdpbGwgYmUKKwkgIGNvbXBpbGVkIGludG8gdGhlIGllZWUxMzk0IG1vZHVsZS4gVGhpcyBkb2Vzbid0IHJlYWxseSBkbyBtdWNoCisJICBleGNlcHQgYmVpbmcgYWJsZSB0byBkaXNwbGF5IHRoZSB2ZW5kb3Igb2YgYSBoYXJkd2FyZSBub2RlLiBUaGUKKwkgIGRvd25zaWRlIGlzIHRoYXQgaXQgYWRkcyBhYm91dCAzMDBrIHRvIHRoZSBzaXplIG9mIHRoZSBtb2R1bGUsCisJICBvciBrZXJuZWwgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHlvdSBjb21waWxlIGllZWUxMzk0IGFzIGEKKwkgIG1vZHVsZSwgb3Igc3RhdGljIGluIHRoZSBrZXJuZWwpLgorCisJICBUaGlzIG9wdGlvbiBpcyBub3QgbmVlZGVkIGZvciB1c2Vyc3BhY2UgcHJvZ3JhbXMgbGlrZSBnc2NhbmJ1cworCSAgdG8gc2hvdyB0aGlzIGluZm9ybWF0aW9uLgorCitjb25maWcgSUVFRTEzOTRfRVhUUkFfQ09ORklHX1JPTVMKKwlib29sICJCdWlsZCBpbiBleHRyYSBjb25maWcgcm9tIGVudHJpZXMgZm9yIGNlcnRhaW4gZnVuY3Rpb25hbGl0eSIKKwlkZXBlbmRzIG9uIElFRUUxMzk0CisJaGVscAorCSAgU29tZSBJRUVFMTM5NCBmdW5jdGlvbmFsaXR5IGRlcGVuZHMgb24gZXh0cmEgY29uZmlnIHJvbSBlbnRyaWVzCisJICBiZWluZyBhdmFpbGFibGUgaW4gdGhlIGhvc3QgYWRhcHRlcnMgQ1NSLiBUaGVzZSBvcHRpb25zIHdpbGwKKwkgIGFsbG93IHlvdSB0byBjaG9vc2Ugd2hpY2ggb25lcy4KKworY29uZmlnIElFRUUxMzk0X0NPTkZJR19ST01fSVAxMzk0CisJYm9vbCAiSVAtMTM5NCBFbnRyeSIKKwlkZXBlbmRzIG9uIElFRUUxMzk0X0VYVFJBX0NPTkZJR19ST01TICYmIElFRUUxMzk0CisJaGVscAorCSAgQWRkcyBhbiBlbnRyeSBmb3IgdXNpbmcgSVAtb3Zlci0xMzk0LiBJZiB5b3Ugd2FudCB0byB1c2UgeW91cgorCSAgSUVFRTEzOTQgYnVzIGFzIGEgbmV0d29yayBmb3IgSVAgc3lzdGVtcyAoaW5jbHVkaW5nIGludGVyYWN0aW5nCisJICB3aXRoIE1hY09TWCBhbmQgV2luWFAgSVAtb3Zlci0xMzk0KSwgZW5hYmxlIHRoaXMgb3B0aW9uIGFuZCB0aGUKKwkgIGV0aDEzOTQgb3B0aW9uIGJlbG93LgorCitjb21tZW50ICJEZXZpY2UgRHJpdmVycyIKKwlkZXBlbmRzIG9uIElFRUUxMzk0CisKK2NvbW1lbnQgIlRleGFzIEluc3RydW1lbnRzIFBDSUx5bnggcmVxdWlyZXMgSTJDIgorCWRlcGVuZHMgb24gSUVFRTEzOTQgJiYgSTJDPW4KKworY29uZmlnIElFRUUxMzk0X1BDSUxZTlgKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgUENJTHlueCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIElFRUUxMzk0ICYmIEkyQworCXNlbGVjdCBJMkNfQUxHT0JJVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gSUVFRS0xMzk0IGNvbnRyb2xsZXIgd2l0aCB0aGUgVGV4YXMKKwkgIEluc3RydW1lbnRzIFBDSUx5bnggY2hpcC4gIE5vdGU6IHRoaXMgZHJpdmVyIGlzIHdyaXR0ZW4gZm9yIHJldmlzaW9uCisJICAyIG9mIHRoaXMgY2hpcCBhbmQgbWF5IG5vdCB3b3JrIHdpdGggcmV2aXNpb24gMC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGNpbHlueC4KKworIyBOb24tbWFpbnRhaW5lZCBwY2lseW54IG9wdGlvbnMKKyMgaWYgWyAiJENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YIiAhPSAibiIgXTsgdGhlbgorIyAgICAgYm9vbCAnICAgIFVzZSBQQ0lMeW54IGxvY2FsIFJBTScgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfTE9DQUxSQU0KKyMgICAgIGJvb2wgJyAgICBTdXBwb3J0IGZvciBub24tSUVFRTEzOTQgbG9jYWwgcG9ydHMnIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX1BPUlRTCisjIGZpCitjb25maWcgSUVFRTEzOTRfT0hDSTEzOTQKKwl0cmlzdGF0ZSAiT0hDSS0xMzk0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kgJiYgSUVFRTEzOTQKKwloZWxwCisJICBFbmFibGUgdGhpcyBkcml2ZXIgaWYgeW91IGhhdmUgYW4gSUVFRSAxMzk0IGNvbnRyb2xsZXIgYmFzZWQgb24gdGhlCisJICBPSENJLTEzOTQgc3BlY2lmaWNhdGlvbi4gVGhlIGN1cnJlbnQgZHJpdmVyIGlzIG9ubHkgdGVzdGVkIHdpdGggT0hDSQorCSAgY2hpcHNldHMgbWFkZSBieSBUZXhhcyBJbnN0cnVtZW50cyBhbmQgTkVDLiBNb3N0IHRoaXJkLXBhcnR5IHZlbmRvcnMKKwkgIHVzZSBvbmUgb2YgdGhlc2UgY2hpcHNldHMuICBJdCBzaG91bGQgd29yayB3aXRoIGFueSBPSENJLTEzOTQKKwkgIGNvbXBsaWFudCBjYXJkLCBob3dldmVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvaGNpMTM5NC4KKworY29tbWVudCAiUHJvdG9jb2wgRHJpdmVycyIKKwlkZXBlbmRzIG9uIElFRUUxMzk0CisKK2NvbmZpZyBJRUVFMTM5NF9WSURFTzEzOTQKKwl0cmlzdGF0ZSAiT0hDSS0xMzk0IFZpZGVvIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJRUVFMTM5NCAmJiBJRUVFMTM5NF9PSENJMTM5NAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdmlkZW8gZGV2aWNlIHVzYWdlIGZvciBPSENJLTEzOTQgY2FyZHMuICBFbmFibGUKKwkgIHRoaXMgb3B0aW9uIG9ubHkgaWYgeW91IGhhdmUgYW4gSUVFRSAxMzk0IHZpZGVvIGRldmljZSBjb25uZWN0ZWQgdG8KKwkgIGFuIE9IQ0ktMTM5NCBjYXJkLgorCitjb25maWcgSUVFRTEzOTRfU0JQMgorCXRyaXN0YXRlICJTQlAtMiBzdXBwb3J0IChIYXJkZGlza3MgZXRjLikiCisJZGVwZW5kcyBvbiBJRUVFMTM5NCAmJiBTQ1NJICYmIChQQ0kgfHwgQlJPS0VOKQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgeW91IHRvIHVzZSBTQlAtMiBkZXZpY2VzIGNvbm5lY3RlZCB0byB5b3VyIElFRUUKKwkgIDEzOTQgYnVzLiAgU0JQLTIgZGV2aWNlcyBpbmNsdWRlIGhhcmRkcml2ZXMgYW5kIERWRCBkZXZpY2VzLgorCitjb25maWcgSUVFRTEzOTRfU0JQMl9QSFlTX0RNQQorCWJvb2wgIkVuYWJsZSBQaHlzIERNQSBzdXBwb3J0IGZvciBTQlAyIChEZWJ1ZykiCisJZGVwZW5kcyBvbiBJRUVFMTM5NCAmJiBJRUVFMTM5NF9TQlAyCisKK2NvbmZpZyBJRUVFMTM5NF9FVEgxMzk0CisJdHJpc3RhdGUgIkV0aGVybmV0IG92ZXIgMTM5NCIKKwlkZXBlbmRzIG9uIElFRUUxMzk0ICYmIEVYUEVSSU1FTlRBTCAmJiBJTkVUCisJc2VsZWN0IElFRUUxMzk0X0NPTkZJR19ST01fSVAxMzk0CisJc2VsZWN0IElFRUUxMzk0X0VYVFJBX0NPTkZJR19ST01TCisJaGVscAorCSAgVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBhIGZ1bmN0aW9uYWwgbWFqb3JpdHkgb2YgUkZDIDI3MzQ6IElQdjQgb3ZlcgorCSAgMTM5NC4gIEl0IHdpbGwgcHJvdmlkZSBJUCBjb25uZWN0aXZpdHkgd2l0aCBpbXBsZW1lbnRhdGlvbnMgb2YgUkZDCisJICAyNzM0IGZvdW5kIG9uIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiAgSXQgd2lsbCBub3QgY29tbXVuaWNhdGUgd2l0aAorCSAgb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBkcml2ZXIgZm91bmQgaW4gc3RvY2sga2VybmVscyBwcmlvciB0byAyLjYuMy4KKwkgIFRoaXMgZHJpdmVyIGlzIHN0aWxsIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiAgSXQgZG9lcyBub3QgeWV0IHN1cHBvcnQKKwkgIE1DQVAsIHRoZXJlZm9yZSBtdWx0aWNhc3Qgc3VwcG9ydCBpcyBzaWduaWZpY2FudGx5IGxpbWl0ZWQuCisKK2NvbmZpZyBJRUVFMTM5NF9EVjEzOTQKKwl0cmlzdGF0ZSAiT0hDSS1EViBJL08gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElFRUUxMzk0ICYmIElFRUUxMzk0X09IQ0kxMzk0CisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWxsb3dzIHlvdSB0byB0cmFuc21pdCBhbmQgcmVjZWl2ZSBEViAoZGlnaXRhbCB2aWRlbykKKwkgIHN0cmVhbXMgb24gYW4gT0hDSS0xMzk0IGNhcmQgdXNpbmcgYSBzaW1wbGUgZnJhbWUtb3JpZW50ZWQKKwkgIGludGVyZmFjZS4KKworCSAgVGhlIHVzZXItc3BhY2UgQVBJIGZvciBkdjEzOTQgaXMgZG9jdW1lbnRlZCBpbiBkdjEzOTQuaC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHYxMzk0LgorCitjb25maWcgSUVFRTEzOTRfUkFXSU8KKwl0cmlzdGF0ZSAiUmF3IElFRUUxMzk0IEkvTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSUVFRTEzOTQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSByYXcgZGV2aWNlLiBUaGlzIGlzIGdlbmVyYWxseQorCSAgYSBnb29kIGlkZWEsIHNvIHlvdSBzaG91bGQgc2F5IFkgaGVyZS4gVGhlIHJhdyBkZXZpY2UgZW5hYmxlcworCSAgZGlyZWN0IGNvbW11bmljYXRpb24gb2YgdXNlciBwcm9ncmFtcyB3aXRoIHRoZSBJRUVFIDEzOTQgYnVzIGFuZAorCSAgdGh1cyB3aXRoIHRoZSBhdHRhY2hlZCBwZXJpcGhlcmFscy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcmF3MTM5NC4KKworY29uZmlnIElFRUUxMzk0X0NNUAorCXRyaXN0YXRlICJJRUM2MTg4My0xIFBsdWcgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElFRUUxMzk0CisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgQ29ubmVjdGlvbiBNYW5hZ2VtZW50IFByb2NlZHVyZXMKKwkgIChJRUM2MTg4My0xKSBkcml2ZXIsIHdoaWNoIGltcGxlbWVudHMgaW5wdXQgYW5kIG91dHB1dCBwbHVncy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY21wLgorCitjb25maWcgSUVFRTEzOTRfQU1EVFAKKwl0cmlzdGF0ZSAiSUVDNjE4ODMtNiAoQXVkaW8gdHJhbnNtaXNzaW9uKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSUVFRTEzOTQgJiYgSUVFRTEzOTRfT0hDSTEzOTQgJiYgSUVFRTEzOTRfQ01QCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgQXVkaW8gJiBNdXNpYyBEYXRhIFRyYW5zbWlzc2lvbiBQcm90b2NvbAorCSAgKElFQzYxODgzLTYpIGRyaXZlciwgd2hpY2ggaW1wbGVtZW50cyBhdWRpbyB0cmFuc21pc3Npb24gb3ZlcgorCSAgSUVFRTEzOTQuCisKKwkgIFRoZSB1c2Vyc3BhY2UgaW50ZXJmYWNlIGlzIGRvY3VtZW50ZWQgaW4gYW1kdHAuaC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYW1kdHAuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvTWFrZWZpbGUgYi9kcml2ZXJzL2llZWUxMzk0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YjRkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L01ha2VmaWxlCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBJRUVFIDEzOTQgaW1wbGVtZW50YXRpb24KKyMKKworaWVlZTEzOTQtb2JqcyA6PSBpZWVlMTM5NF9jb3JlLm8gaWVlZTEzOTRfdHJhbnNhY3Rpb25zLm8gaG9zdHMubyBcCisJCSBoaWdobGV2ZWwubyBjc3IubyBub2RlbWdyLm8gb3VpLm8gZG1hLm8gaXNvLm8gXAorCQkgY3NyMTIxMi5vIGNvbmZpZ19yb21zLm8KKworb2JqLSQoQ09ORklHX0lFRUUxMzk0KSArPSBpZWVlMTM5NC5vCitvYmotJChDT05GSUdfSUVFRTEzOTRfUENJTFlOWCkgKz0gcGNpbHlueC5vCitvYmotJChDT05GSUdfSUVFRTEzOTRfT0hDSTEzOTQpICs9IG9oY2kxMzk0Lm8KK29iai0kKENPTkZJR19JRUVFMTM5NF9WSURFTzEzOTQpICs9IHZpZGVvMTM5NC5vCitvYmotJChDT05GSUdfSUVFRTEzOTRfUkFXSU8pICs9IHJhdzEzOTQubworb2JqLSQoQ09ORklHX0lFRUUxMzk0X1NCUDIpICs9IHNicDIubworb2JqLSQoQ09ORklHX0lFRUUxMzk0X0RWMTM5NCkgKz0gZHYxMzk0Lm8KK29iai0kKENPTkZJR19JRUVFMTM5NF9FVEgxMzk0KSArPSBldGgxMzk0Lm8KK29iai0kKENPTkZJR19JRUVFMTM5NF9BTURUUCkgKz0gYW1kdHAubworb2JqLSQoQ09ORklHX0lFRUUxMzk0X0NNUCkgKz0gY21wLm8KKworcXVpZXRfY21kX291aTJjID0gT1VJMkMgICAkQAorICAgICAgY21kX291aTJjID0gJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvJChzcmMpL291aTJjLnNoIDwgJDwgPiAkQAorCit0YXJnZXRzIDo9IG91aS5jCiskKG9iaikvb3VpLm86ICQob2JqKS9vdWkuYworJChvYmopL291aS5jOiAkKHNyYykvb3VpLmRiICQoc3JjKS9vdWkyYy5zaCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLG91aTJjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9hbWR0cC5jIGIvZHJpdmVycy9pZWVlMTM5NC9hbWR0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YWUwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2FtZHRwLmMKQEAgLTAsMCArMSwxMzAwIEBACisvKiAtKi0gYy1iYXNpYy1vZmZzZXQ6IDggLSotCisgKgorICogYW1kdHAuYyAtIEF1ZGlvIGFuZCBNdXNpYyBEYXRhIFRyYW5zbWlzc2lvbiBQcm90b2NvbCBEcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMSBLcmlzdGlhbiBI+GdzYmVyZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogT1ZFUlZJRVcKKyAqIC0tLS0tLS0tCisgKgorICogVGhlIEFNRFRQIGRyaXZlciBpcyBkZXNpZ25lZCB0byBleHBvc2UgdGhlIElFRUUxMzk0IGJ1cyBhcyBhCisgKiByZWd1bGFyIE9TUyBzb3VuZGNhcmQsIGkuZS4geW91IGNhbiBsaW5rIC9kZXYvZHNwIHRvIC9kZXYvYW1kdHAgYW5kCisgKiB0aGVuIHlvdXIgZmF2b3VyaXRlIE1QMyBwbGF5ZXIsIGdhbWUgb3Igd2hhdGV2ZXIgc291bmQgcHJvZ3JhbSB3aWxsCisgKiBvdXRwdXQgdG8gYW4gSUVFRTEzOTQgaXNvY2hyb25vdXMgY2hhbm5lbC4gIFRoZSBzaWduYWwgZGVzdGluYXRpb24KKyAqIGNvdWxkIGJlIGEgc2V0IG9mIElFRUUxMzk0IGxvdWRzcGVha2VycyAoaWYgYW5kIHdoZW4gc3VjaCB0aGluZ3MKKyAqIGJlY29tZSBhdmFpbGFibGUpIG9yIGFuIGFtcGxpZmllciB3aXRoIElFRUUxMzk0IGlucHV0IChsaWtlIHRoZQorICogU29ueSBTVFItTFNBMSkuICBUaGUgZHJpdmVyIG9ubHkgaGFuZGxlcyB0aGUgYWN0dWFsIHN0cmVhbWluZywgc29tZQorICogY29ubmVjdGlvbiBtYW5hZ2VtZW50IGlzIGFsc28gcmVxdWlyZWQgZm9yIHRoaXMgdG8gYWN0dWFsbHkgd29yay4KKyAqIFRoYXQgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBkcml2ZXIsIGFuZCBmdXJ0aGVybW9yZSBpdCBpcyBub3QKKyAqIHJlYWxseSBzdGFuZGFyZGl6ZWQgeWV0LgorICoKKyAqIFRoZSBBdWRpbyBhbmQgTXVzaWMgRGF0YSBUcmFubWlzc2lvbiBQcm90b2NvbCBpcyBhdmFpbGFibGUgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy4xMzk0dGEub3JnL0Rvd25sb2FkL1RlY2hub2xvZ3kvU3BlY2lmaWNhdGlvbnMvMjAwMS9BTTIwRmluYWwtamYyLnBkZgorICoKKyAqCisgKiBUT0RPCisgKiAtLS0tCisgKgorICogLSBXZSBzaG91bGQgYmUgYWJsZSB0byBjaGFuZ2UgaW5wdXQgc2FtcGxlIGZvcm1hdCBiZXR3ZWVuIExFL0JFLCBhcworICogICB3ZSBhbHJlYWR5IHNoaWZ0IHRoZSBieXRlcyBhcm91bmQgd2hlbiB3ZSBjb25zdHJ1Y3QgdGhlIGlzbworICogICBwYWNrZXRzLgorICoKKyAqIC0gRml4IERNQSBzdG9wIGFmdGVyIGJ1cyByZXNldCEKKyAqCisgKiAtIENsZWFuIHVwIGlzbyBjb250ZXh0IGhhbmRsaW5nIGluIG9oY2kxMzk0LgorICoKKyAqCisgKiBNQVlCRSBUT0RPCisgKiAtLS0tLS0tLS0tCisgKgorICogLSBSZWNlaXZlIGRhdGEgZm9yIGxvY2FsIHBsYXliYWNrIG9yIHJlY29yZGluZy4gIFBsYXliYWNrIHJlcXVpcmVzCisgKiAgIHNvZnQgc3luY2luZyB3aXRoIHRoZSBzb3VuZCBjYXJkLgorICoKKyAqIC0gU2lnbmFsIHByb2Nlc3NpbmcsIGkuZS4gcmVjZWl2ZSBwYWNrZXRzLCBkbyBzb21lIHByb2Nlc3NpbmcsIGFuZAorICogICB0cmFuc21pdCB0aGVtIGFnYWluIHVzaW5nIHRoZSBzYW1lIHBhY2tldCBzdHJ1Y3R1cmUgYW5kIHRpbWVzdGFtcHMKKyAqICAgb2Zmc2V0IGJ5IHByb2Nlc3NpbmcgdGltZS4KKyAqCisgKiAtIE1heWJlIG1ha2UgYW4gQUxTQSBpbnRlcmZhY2UsIHRoYXQgaXMsIGNyZWF0ZSBhIGZpbGVfb3BzCisgKiAgIGltcGxlbWVudGF0aW9uIHRoYXQgcmVjb2duaXplcyBBTFNBIGlvY3RscyBhbmQgdXNlcyBkZWZhdWx0cyBmb3IKKyAqICAgdGhpbmdzIHRoYXQgY2FuJ3QgYmUgY29udHJvbGxlZCB0aHJvdWdoIEFMU0EgKGlzbyBjaGFubmVsKS4KKyAqCisgKiAgIENoYW5nZXM6CisgKgorICogLSBBdWRpdCBjb3B5X2Zyb21fdXNlciBpbiBhbWR0cF93cml0ZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFuaWVsZSBCZWxsdWNjaSA8YmVsbHVjZGFAdGlzY2FsaS5pdD4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2luY2x1ZGUgImhvc3RzLmgiCisjaW5jbHVkZSAiaGlnaGxldmVsLmgiCisjaW5jbHVkZSAiaWVlZTEzOTQuaCIKKyNpbmNsdWRlICJpZWVlMTM5NF9jb3JlLmgiCisjaW5jbHVkZSAib2hjaTEzOTQuaCIKKworI2luY2x1ZGUgImFtZHRwLmgiCisjaW5jbHVkZSAiY21wLmgiCisKKyNkZWZpbmUgRk1UX0FNRFRQIDB4MTAKKyNkZWZpbmUgRkRGX0FNODI0IDB4MDAKKyNkZWZpbmUgRkRGX1NGQ18zMktIWiAgIDB4MDAKKyNkZWZpbmUgRkRGX1NGQ180NEsxSFogIDB4MDEKKyNkZWZpbmUgRkRGX1NGQ180OEtIWiAgIDB4MDIKKyNkZWZpbmUgRkRGX1NGQ184OEsySFogIDB4MDMKKyNkZWZpbmUgRkRGX1NGQ185NktIWiAgIDB4MDQKKyNkZWZpbmUgRkRGX1NGQ18xNzZLNEhaIDB4MDUKKyNkZWZpbmUgRkRGX1NGQ18xOTJLSFogIDB4MDYKKworc3RydWN0IGRlc2NyaXB0b3JfYmxvY2sgeworCXN0cnVjdCBvdXRwdXRfbW9yZV9pbW1lZGlhdGUgeworCQl1MzIgY29udHJvbDsKKwkJdTMyIHBhZDA7CisJCXUzMiBza2lwOworCQl1MzIgcGFkMTsKKwkJdTMyIGhlYWRlcls0XTsKKwl9IGhlYWRlcl9kZXNjOworCisJc3RydWN0IG91dHB1dF9sYXN0IHsKKwkJdTMyIGNvbnRyb2w7CisJCXUzMiBkYXRhX2FkZHJlc3M7CisJCXUzMiBicmFuY2g7CisJCXUzMiBzdGF0dXM7CisJfSBwYXlsb2FkX2Rlc2M7Cit9OworCitzdHJ1Y3QgcGFja2V0IHsKKwlzdHJ1Y3QgZGVzY3JpcHRvcl9ibG9jayAqZGI7CisJZG1hX2FkZHJfdCBkYl9idXM7CisJc3RydWN0IGlzb19wYWNrZXQgKnBheWxvYWQ7CisJZG1hX2FkZHJfdCBwYXlsb2FkX2J1czsKK307CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpZiBkZWZpbmVkIF9fQklHX0VORElBTl9CSVRGSUVMRAorCitzdHJ1Y3QgaXNvX3BhY2tldCB7CisJLyogRmlyc3QgcXVhZGxldCAqLworCXVuc2lnbmVkIGludCBkYnMgICAgICA6IDg7CisJdW5zaWduZWQgaW50IGVvaDAgICAgIDogMjsKKwl1bnNpZ25lZCBpbnQgc2lkICAgICAgOiA2OworCisJdW5zaWduZWQgaW50IGRiYyAgICAgIDogODsKKwl1bnNpZ25lZCBpbnQgZm4gICAgICAgOiAyOworCXVuc2lnbmVkIGludCBxcGMgICAgICA6IDM7CisJdW5zaWduZWQgaW50IHNwaCAgICAgIDogMTsKKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQgOiAyOworCisJLyogU2Vjb25kIHF1YWRsZXQgKi8KKwl1bnNpZ25lZCBpbnQgZmRmICAgICAgOiA4OworCXVuc2lnbmVkIGludCBlb2gxICAgICA6IDI7CisJdW5zaWduZWQgaW50IGZtdCAgICAgIDogNjsKKworCXVuc2lnbmVkIGludCBzeXQgICAgICA6IDE2OworCisgICAgICAgIHF1YWRsZXRfdCBkYXRhWzBdOworfTsKKworI2VsaWYgZGVmaW5lZCBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKworc3RydWN0IGlzb19wYWNrZXQgeworCS8qIEZpcnN0IHF1YWRsZXQgKi8KKwl1bnNpZ25lZCBpbnQgc2lkICAgICAgOiA2OworCXVuc2lnbmVkIGludCBlb2gwICAgICA6IDI7CisJdW5zaWduZWQgaW50IGRicyAgICAgIDogODsKKworCXVuc2lnbmVkIGludCByZXNlcnZlZCA6IDI7CisJdW5zaWduZWQgaW50IHNwaCAgICAgIDogMTsKKwl1bnNpZ25lZCBpbnQgcXBjICAgICAgOiAzOworCXVuc2lnbmVkIGludCBmbiAgICAgICA6IDI7CisJdW5zaWduZWQgaW50IGRiYyAgICAgIDogODsKKworCS8qIFNlY29uZCBxdWFkbGV0ICovCisJdW5zaWduZWQgaW50IGZtdCAgICAgIDogNjsKKwl1bnNpZ25lZCBpbnQgZW9oMSAgICAgOiAyOworCXVuc2lnbmVkIGludCBmZGYgICAgICA6IDg7CisKKwl1bnNpZ25lZCBpbnQgc3l0ICAgICAgOiAxNjsKKworCXF1YWRsZXRfdCBkYXRhWzBdOworfTsKKworI2Vsc2UKKworI2Vycm9yIFVua25vd24gYml0ZmllbGQgdHlwZQorCisjZW5kaWYKKworc3RydWN0IGZyYWN0aW9uIHsKKwlpbnQgaW50ZWdlcjsKKwlpbnQgbnVtZXJhdG9yOworCWludCBkZW5vbWluYXRvcjsKK307CisKKyNkZWZpbmUgUEFDS0VUX0xJU1RfU0laRSAyNTYKKyNkZWZpbmUgTUFYX1BBQ0tFVF9MSVNUUyA0CisKK3N0cnVjdCBwYWNrZXRfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCWludCBsYXN0X2N5Y2xlX2NvdW50OworCXN0cnVjdCBwYWNrZXQgcGFja2V0c1tQQUNLRVRfTElTVF9TSVpFXTsKK307CisKKyNkZWZpbmUgQlVGRkVSX1NJWkUgMTI4CisKKy8qIFRoaXMgaW1wbGVtZW50cyBhIGNpcmN1bGFyIGJ1ZmZlciBmb3IgaW5jb21pbmcgc2FtcGxlcy4gKi8KKworc3RydWN0IGJ1ZmZlciB7CisJc2l6ZV90IGhlYWQsIHRhaWwsIGxlbmd0aCwgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF07Cit9OworCitzdHJ1Y3Qgc3RyZWFtIHsKKwlpbnQgaXNvX2NoYW5uZWw7CisJaW50IGZvcm1hdDsKKwlpbnQgcmF0ZTsKKwlpbnQgZGltZW5zaW9uOworCWludCBmZGY7CisJaW50IG1vZGU7CisJaW50IHNhbXBsZV9mb3JtYXQ7CisJc3RydWN0IGNtcF9wY3IgKm9wY3I7CisKKwkvKiBJbnB1dCBzYW1wbGVzIGFyZSBjb3BpZWQgaGVyZS4gKi8KKwlzdHJ1Y3QgYnVmZmVyICppbnB1dDsKKworCS8qIElTTyBQYWNrZXIgc3RhdGUgKi8KKwl1bnNpZ25lZCBjaGFyIGRiYzsKKwlzdHJ1Y3QgcGFja2V0X2xpc3QgKmN1cnJlbnRfcGFja2V0X2xpc3Q7CisJaW50IGN1cnJlbnRfcGFja2V0OworCXN0cnVjdCBmcmFjdGlvbiByZWFkeV9zYW1wbGVzLCBzYW1wbGVzX3Blcl9jeWNsZTsKKworCS8qIFdlIHVzZSB0aGVzZSB0byBnZW5lcmF0ZSBjb250cm9sIGJpdHMgd2hlbiB3ZSBhcmUgcGFja2luZworCSAqIGllYzk1OCBkYXRhLgorCSAqLworCWludCBpZWM5NThfZnJhbWVfY291bnQ7CisJaW50IGllYzk1OF9yYXRlX2NvZGU7CisKKwkvKiBUaGUgY3ljbGVfY291bnQgYW5kIGN5Y2xlX29mZnNldCBmaWVsZHMgYXJlIHVzZWQgZm9yIHRoZQorCSAqIHN5bmNocm9uaXphdGlvbiB0aW1lc3RhbXBzIChzeXQpIGluIHRoZSBjaXAgaGVhZGVyLiAgVGhleQorCSAqIGFyZSBpbmNyZW1lbnRlZCBieSBhdCBsZWFzdCBhIGN5Y2xlIGV2ZXJ5IHRpbWUgd2UgcHV0IGEKKwkgKiB0aW1lIHN0YW1wIGluIGEgcGFja2V0LiAgQXMgd2UgZG9uJ3QgdGltZSBzdGFtcCBhbGwKKwkgKiBwYWNrYWdlcywgY3ljbGVfY291bnQgaXNuJ3QgdXBkYXRlZCBpbiBldmVyeSBjeWNsZSwgYW5kCisJICogc29tZXRpbWVzIGl0J3MgaW5jcmVtZW50ZWQgYnkgMi4gIFRodXMsIHdlIGhhdmUKKwkgKiBjeWNsZV9jb3VudDIsIHdoaWNoIGlzIHNpbXBseSBpbmNyZW1lbnRlZCBieSBvbmUgd2l0aCBlYWNoCisJICogcGFja2V0LCBzbyB3ZSBjYW4gY29tcGFyZSBpdCB0byB0aGUgdHJhbnNtaXNzaW9uIHRpbWUKKwkgKiB3cml0dGVuIGJhY2sgaW4gdGhlIGRtYSBwcm9ncmFtcy4KKwkgKi8KKwlhdG9taWNfdCBjeWNsZV9jb3VudCwgY3ljbGVfY291bnQyOworCXN0cnVjdCBmcmFjdGlvbiBjeWNsZV9vZmZzZXQsIHRpY2tzX3Blcl9zeXRfb2Zmc2V0OworCWludCBzeXRfaW50ZXJ2YWw7CisJaW50IHN0YWxlX2NvdW50OworCisJLyogVGhlc2VzIGZpZWxkcyBjb250cm9sIHRoZSBzYW1wbGUgb3V0cHV0IHRvIHRoZSBETUEgZW5naW5lLgorCSAqIFRoZSBkbWFfcGFja2V0X2xpc3RzIGxpc3QgaG9sZHMgcGFja2V0IGxpc3RzIGN1cnJlbnRseQorCSAqIHF1ZXVlZCBmb3IgZG1hOyB0aGUgaGVhZCBvZiB0aGUgbGlzdCBpcyBjdXJyZW50bHkgYmVpbmcKKwkgKiBwcm9jZXNzZWQuICBUaGUgbGFzdCBwcm9ncmFtIGluIGEgcGFja2V0IGxpc3QgZ2VuZXJhdGVzIGFuCisJICogaW50ZXJydXB0LCB3aGljaCByZW1vdmVzIHRoZSBoZWFkIGZyb20gZG1hX3BhY2tldF9saXN0cyBhbmQKKwkgKiBwdXRzIGl0IGJhY2sgb24gdGhlIGZyZWUgbGlzdC4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRtYV9wYWNrZXRfbGlzdHM7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX3BhY2tldF9saXN0czsKKyAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgcGFja2V0X2xpc3Rfd2FpdDsKKwlzcGlubG9ja190IHBhY2tldF9saXN0X2xvY2s7CisJc3RydWN0IG9oY2kxMzk0X2lzb190YXNrbGV0IGlzb190YXNrbGV0OworCXN0cnVjdCBwY2lfcG9vbCAqZGVzY3JpcHRvcl9wb29sLCAqcGFja2V0X3Bvb2w7CisKKwkvKiBTdHJlYW1zIGF0IGEgaG9zdCBjb250cm9sbGVyIGFyZSBjaGFpbmVkIHRocm91Z2ggdGhpcyBmaWVsZC4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJc3RydWN0IGFtZHRwX2hvc3QgKmhvc3Q7Cit9OworCitzdHJ1Y3QgYW1kdHBfaG9zdCB7CisJc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0cmVhbV9saXN0OworCXNwaW5sb2NrX3Qgc3RyZWFtX2xpc3RfbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgYW1kdHBfaGlnaGxldmVsOworCisKKy8qIEZJWE1FOiBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUuLi4gKi8KKworI2RlZmluZSBPSENJMTM5NF9DT05URVhUX0NZQ0xFX01BVENIIDB4ODAwMDAwMDAKKyNkZWZpbmUgT0hDSTEzOTRfQ09OVEVYVF9SVU4gICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIE9IQ0kxMzk0X0NPTlRFWFRfV0FLRSAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBPSENJMTM5NF9DT05URVhUX0RFQUQgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgT0hDSTEzOTRfQ09OVEVYVF9BQ1RJVkUgICAgICAweDAwMDAwNDAwCisKK3N0YXRpYyB2b2lkIG9oY2kxMzk0X3N0YXJ0X2l0X2N0eChzdHJ1Y3QgdGlfb2hjaSAqb2hjaSwgaW50IGN0eCwKKwkJCSAgIGRtYV9hZGRyX3QgZmlyc3RfY21kLCBpbnQgeiwgaW50IGN5Y2xlX21hdGNoKQoreworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza1NldCwgMSA8PCBjdHgpOworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0Q29tbWFuZFB0ciArIGN0eCAqIDE2LCBmaXJzdF9jbWQgfCB6KTsKKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvWG1pdENvbnRleHRDb250cm9sQ2xlYXIgKyBjdHggKiAxNiwgfjApOworCXdtYigpOworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0Q29udGV4dENvbnRyb2xTZXQgKyBjdHggKiAxNiwKKwkJICBPSENJMTM5NF9DT05URVhUX0NZQ0xFX01BVENIIHwgKGN5Y2xlX21hdGNoIDw8IDE2KSB8CisJCSAgT0hDSTEzOTRfQ09OVEVYVF9SVU4pOworfQorCitzdGF0aWMgdm9pZCBvaGNpMTM5NF93YWtlX2l0X2N0eChzdHJ1Y3QgdGlfb2hjaSAqb2hjaSwgaW50IGN0eCkKK3sKKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvWG1pdENvbnRleHRDb250cm9sU2V0ICsgY3R4ICogMTYsCisJCSAgT0hDSTEzOTRfQ09OVEVYVF9XQUtFKTsKK30KKworc3RhdGljIHZvaWQgb2hjaTEzOTRfc3RvcF9pdF9jdHgoc3RydWN0IHRpX29oY2kgKm9oY2ksIGludCBjdHgsIGludCBzeW5jaHJvbm91cykKK3sKKwl1MzIgY29udHJvbDsKKwlpbnQgd2FpdDsKKworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza0NsZWFyLCAxIDw8IGN0eCk7CisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRDb250ZXh0Q29udHJvbENsZWFyICsgY3R4ICogMTYsCisJCSAgT0hDSTEzOTRfQ09OVEVYVF9SVU4pOworCXdtYigpOworCisJaWYgKHN5bmNocm9ub3VzKSB7CisJCWZvciAod2FpdCA9IDA7IHdhaXQgPCA1OyB3YWl0KyspIHsKKwkJCWNvbnRyb2wgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Jc29YbWl0Q29udGV4dENvbnRyb2xTZXQgKyBjdHggKiAxNik7CisJCQlpZiAoKGNvbnRyb2wgJiBPSENJMTM5NF9DT05URVhUX0FDVElWRSkgPT0gMCkKKwkJCQlicmVhazsKKworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0KKwl9Cit9CisKKy8qIE5vdGU6IHdlIGNhbiB0ZXN0IGlmIGZyZWVfcGFja2V0X2xpc3RzIGlzIGVtcHR5IHdpdGhvdXQgYXF1aXJpbmcKKyAqIHRoZSBwYWNrZXRfbGlzdF9sb2NrLiAgVGhlIGludGVycnVwdCBoYW5kbGVyIG9ubHkgYWRkcyB0byB0aGUgZnJlZQorICogbGlzdCwgdGhlcmUgaXMgbm8gcmFjZSBjb25kaXRpb24gYmV0d2VlbiB0ZXN0aW5nIHRoZSBsaXN0IG5vbi1lbXB0eQorICogYW5kIGFjcXVpcmluZyB0aGUgbG9jay4KKyAqLworCitzdGF0aWMgc3RydWN0IHBhY2tldF9saXN0ICpzdHJlYW1fZ2V0X2ZyZWVfcGFja2V0X2xpc3Qoc3RydWN0IHN0cmVhbSAqcykKK3sKKwlzdHJ1Y3QgcGFja2V0X2xpc3QgKnBsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobGlzdF9lbXB0eSgmcy0+ZnJlZV9wYWNrZXRfbGlzdHMpKQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5wYWNrZXRfbGlzdF9sb2NrLCBmbGFncyk7CisJcGwgPSBsaXN0X2VudHJ5KHMtPmZyZWVfcGFja2V0X2xpc3RzLm5leHQsIHN0cnVjdCBwYWNrZXRfbGlzdCwgbGluayk7CisJbGlzdF9kZWwoJnBsLT5saW5rKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5wYWNrZXRfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcGw7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbV9zdGFydF9kbWEoc3RydWN0IHN0cmVhbSAqcywgc3RydWN0IHBhY2tldF9saXN0ICpwbCkKK3sKKwl1MzIgc3l0X2N5Y2xlLCBjeWNsZV9jb3VudCwgc3RhcnRfY3ljbGU7CisKKwljeWNsZV9jb3VudCA9IHJlZ19yZWFkKHMtPmhvc3QtPm9oY2ksCisJCQkgICAgICAgT0hDSTEzOTRfSXNvY2hyb25vdXNDeWNsZVRpbWVyKSA+PiAxMjsKKwlzeXRfY3ljbGUgPSAocGwtPmxhc3RfY3ljbGVfY291bnQgLSBQQUNLRVRfTElTVF9TSVpFICsgMSkgJiAweDBmOworCisJLyogV2UgcHJvZ3JhbSB0aGUgRE1BIGNvbnRyb2xsZXIgdG8gc3RhcnQgdHJhbnNtaXNzaW9uIGF0CisJICogbGVhc3QgMTcgY3ljbGVzIGZyb20gbm93IC0gdGhpcyBoYXBwZW5zIHdoZW4gdGhlIGxvd2VyIGZvdXIKKwkgKiBiaXRzIG9mIGN5Y2xlX2NvdW50IGlzIDB4MGYgYW5kIHN5dF9jeWNsZSBpcyAwLCBpbiB0aGlzCisJICogY2FzZSB0aGUgc3RhcnQgY3ljbGUgaXMgY3ljbGVfY291bnQgLSAxNSArIDMyLiAqLworCXN0YXJ0X2N5Y2xlID0gKGN5Y2xlX2NvdW50ICYgfjB4MGYpICsgMzIgKyBzeXRfY3ljbGU7CisJaWYgKChzdGFydF9jeWNsZSAmIDB4MWZmZikgPj0gODAwMCkKKwkJc3RhcnRfY3ljbGUgPSBzdGFydF9jeWNsZSAtIDgwMDAgKyAweDIwMDA7CisKKwlvaGNpMTM5NF9zdGFydF9pdF9jdHgocy0+aG9zdC0+b2hjaSwgcy0+aXNvX3Rhc2tsZXQuY29udGV4dCwKKwkJCSAgICAgIHBsLT5wYWNrZXRzWzBdLmRiX2J1cywgMywKKwkJCSAgICAgIHN0YXJ0X2N5Y2xlICYgMHg3ZmZmKTsKK30KKworc3RhdGljIHZvaWQgc3RyZWFtX3B1dF9kbWFfcGFja2V0X2xpc3Qoc3RydWN0IHN0cmVhbSAqcywKKwkJCQkgICAgICAgc3RydWN0IHBhY2tldF9saXN0ICpwbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwYWNrZXRfbGlzdCAqcHJldjsKKworCS8qIFJlbWVtYmVyIHRoZSBjeWNsZV9jb3VudCB1c2VkIGZvciB0aW1lc3RhbXBpbmcgdGhlIGxhc3QgcGFja2V0LiAqLworCXBsLT5sYXN0X2N5Y2xlX2NvdW50ID0gYXRvbWljX3JlYWQoJnMtPmN5Y2xlX2NvdW50MikgLSAxOworCXBsLT5wYWNrZXRzW1BBQ0tFVF9MSVNUX1NJWkUgLSAxXS5kYi0+cGF5bG9hZF9kZXNjLmJyYW5jaCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+cGFja2V0X2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnBsLT5saW5rLCAmcy0+ZG1hX3BhY2tldF9saXN0cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+cGFja2V0X2xpc3RfbG9jaywgZmxhZ3MpOworCisJcHJldiA9IGxpc3RfZW50cnkocGwtPmxpbmsucHJldiwgc3RydWN0IHBhY2tldF9saXN0LCBsaW5rKTsKKwlpZiAocGwtPmxpbmsucHJldiAhPSAmcy0+ZG1hX3BhY2tldF9saXN0cykgeworCQlzdHJ1Y3QgcGFja2V0ICpsYXN0ID0gJnByZXYtPnBhY2tldHNbUEFDS0VUX0xJU1RfU0laRSAtIDFdOworCQlsYXN0LT5kYi0+cGF5bG9hZF9kZXNjLmJyYW5jaCA9IHBsLT5wYWNrZXRzWzBdLmRiX2J1cyB8IDM7CisJCWxhc3QtPmRiLT5oZWFkZXJfZGVzYy5za2lwID0gcGwtPnBhY2tldHNbMF0uZGJfYnVzIHwgMzsKKwkJb2hjaTEzOTRfd2FrZV9pdF9jdHgocy0+aG9zdC0+b2hjaSwgcy0+aXNvX3Rhc2tsZXQuY29udGV4dCk7CisJfQorCWVsc2UKKwkJc3RyZWFtX3N0YXJ0X2RtYShzLCBwbCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbV9zaGlmdF9wYWNrZXRfbGlzdHModW5zaWduZWQgbG9uZyBsKQoreworCXN0cnVjdCBzdHJlYW0gKnMgPSAoc3RydWN0IHN0cmVhbSAqKSBsOworCXN0cnVjdCBwYWNrZXRfbGlzdCAqcGw7CisJc3RydWN0IHBhY2tldCAqbGFzdDsKKwlpbnQgZGlmZjsKKworCWlmIChsaXN0X2VtcHR5KCZzLT5kbWFfcGFja2V0X2xpc3RzKSkgeworCQlIUFNCX0VSUigiZW1wdHkgZG1hX3BhY2tldF9saXN0cyBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBsaXN0IGlzIG5vbi1lbXB0eSwgd2UgY2FuIGdldCB0aGUgaGVhZAorCSAqIG9mIHRoZSBsaXN0IHdpdGhvdXQgbG9ja2luZywgYmVjYXVzZSB0aGUgcHJvY2VzcyBjb250ZXh0CisJICogb25seSBhZGRzIHRvIHRoZSB0YWlsLgorCSAqLworCXBsID0gbGlzdF9lbnRyeShzLT5kbWFfcGFja2V0X2xpc3RzLm5leHQsIHN0cnVjdCBwYWNrZXRfbGlzdCwgbGluayk7CisJbGFzdCA9ICZwbC0+cGFja2V0c1tQQUNLRVRfTElTVF9TSVpFIC0gMV07CisKKwkvKiBUaGlzIGlzIHdlaXJkLi4uIGlmIHdlIHN0b3AgZG1hIHByb2Nlc3NpbmcgaW4gdGhlIG1pZGRsZSBvZgorCSAqIGEgcGFja2V0IGxpc3QsIHRoZSBkbWEgY29udGV4dCBpbW1lZGlhdGVseSBnZW5lcmF0ZXMgYW4KKwkgKiBpbnRlcnJ1cHQgaWYgd2UgZW5hYmxlIGl0IGFnYWluIGxhdGVyLiAgVGhpcyBvbmx5IGhhcHBlbnMKKwkgKiB3aGVuIGFtZHRwX3JlbGVhc2UgaXMgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgZG1hIHRvCisJICogY29tcGxldGUsIHRob3VnaC4gIEFueXdheSwgd2UgZGV0ZWN0IHRoaXMgYnkgc2VlaW5nIHRoYXQKKwkgKiB0aGUgc3RhdHVzIG9mIHRoZSBkbWEgZGVzY3JpcHRvciB0aGF0IHdlIGV4cGVjdGVkIGFuCisJICogaW50ZXJydXB0IGZyb20gaXMgc3RpbGwgMC4KKwkgKi8KKwlpZiAobGFzdC0+ZGItPnBheWxvYWRfZGVzYy5zdGF0dXMgPT0gMCkgeworCQlIUFNCX0lORk8oIndlaXJkIGludGVycnVwdC4uLiIpOworCQlyZXR1cm47CisJfQorCisJLyogSWYgdGhlIGxhc3QgZGVzY3JpcHRvciBibG9jayBkb2VzIG5vdCBzcGVjaWZ5IGEgYnJhbmNoCisJICogYWRkcmVzcywgd2UgaGF2ZSBhIHNhbXBsZSB1bmRlcmZsb3cuCisJICovCisJaWYgKGxhc3QtPmRiLT5wYXlsb2FkX2Rlc2MuYnJhbmNoID09IDApCisJCUhQU0JfSU5GTygiRklYTUU6IHNhbXBsZSB1bmRlcmZsb3cuLi4iKTsKKworCS8qIEhlcmUgd2UgY2hlY2sgd2hlbiAod2hpY2ggY3ljbGUpIHRoZSBsYXN0IHBhY2tldCB3YXMgc2VudAorCSAqIGFuZCBjb21wYXJlIGl0IHRvIHdoYXQgdGhlIGlzbyBwYWNrZXIgd2FzIHVzaW5nIGF0IHRoZQorCSAqIHRpbWUuICBJZiB0aGVyZSBpcyBhIG1pc21hdGNoLCB3ZSBhZGp1c3QgdGhlIGN5Y2xlIGNvdW50IGluCisJICogdGhlIGlzbyBwYWNrZXIuICBIb3dldmVyLCB0aGVyZSBhcmUgc3RpbGwgdXAgdG8KKwkgKiBNQVhfUEFDS0VUX0xJU1RTIHBhY2tldCBsaXN0cyBxdWV1ZWQgd2l0aCBiYWQgdGltZSBzdGFtcHMsCisJICogc28gd2UgZGlzYWJsZSB0aW1lIHN0YW1wIG1vbml0b3JpbmcgZm9yIHRoZSBuZXh0CisJICogTUFYX1BBQ0tFVF9MSVNUUyBwYWNrZXQgbGlzdHMuCisJICovCisJZGlmZiA9IChsYXN0LT5kYi0+cGF5bG9hZF9kZXNjLnN0YXR1cyAtIHBsLT5sYXN0X2N5Y2xlX2NvdW50KSAmIDB4ZjsKKwlpZiAoZGlmZiA+IDAgJiYgcy0+c3RhbGVfY291bnQgPT0gMCkgeworCQlhdG9taWNfYWRkKGRpZmYsICZzLT5jeWNsZV9jb3VudCk7CisJCWF0b21pY19hZGQoZGlmZiwgJnMtPmN5Y2xlX2NvdW50Mik7CisJCXMtPnN0YWxlX2NvdW50ID0gTUFYX1BBQ0tFVF9MSVNUUzsKKwl9CisKKwlpZiAocy0+c3RhbGVfY291bnQgPiAwKQorCQlzLT5zdGFsZV9jb3VudC0tOworCisJLyogRmluYWxseSwgd2UgbW92ZSB0aGUgcGFja2V0IGxpc3QgdGhhdCB3YXMganVzdCBwcm9jZXNzZWQKKwkgKiBiYWNrIHRvIHRoZSBmcmVlIGxpc3QsIGFuZCBub3RpZnkgYW55IHdhaXRlcnMuCisJICovCisJc3Bpbl9sb2NrKCZzLT5wYWNrZXRfbGlzdF9sb2NrKTsKKwlsaXN0X2RlbCgmcGwtPmxpbmspOworCWxpc3RfYWRkX3RhaWwoJnBsLT5saW5rLCAmcy0+ZnJlZV9wYWNrZXRfbGlzdHMpOworCXNwaW5fdW5sb2NrKCZzLT5wYWNrZXRfbGlzdF9sb2NrKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcy0+cGFja2V0X2xpc3Rfd2FpdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0ICpzdHJlYW1fY3VycmVudF9wYWNrZXQoc3RydWN0IHN0cmVhbSAqcykKK3sKKwlpZiAocy0+Y3VycmVudF9wYWNrZXRfbGlzdCA9PSBOVUxMICYmCisJICAgIChzLT5jdXJyZW50X3BhY2tldF9saXN0ID0gc3RyZWFtX2dldF9mcmVlX3BhY2tldF9saXN0KHMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmcy0+Y3VycmVudF9wYWNrZXRfbGlzdC0+cGFja2V0c1tzLT5jdXJyZW50X3BhY2tldF07Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbV9xdWV1ZV9wYWNrZXQoc3RydWN0IHN0cmVhbSAqcykKK3sKKwlzLT5jdXJyZW50X3BhY2tldCsrOworCWlmIChzLT5jdXJyZW50X3BhY2tldCA9PSBQQUNLRVRfTElTVF9TSVpFKSB7CisJCXN0cmVhbV9wdXRfZG1hX3BhY2tldF9saXN0KHMsIHMtPmN1cnJlbnRfcGFja2V0X2xpc3QpOworCQlzLT5jdXJyZW50X3BhY2tldF9saXN0ID0gTlVMTDsKKwkJcy0+Y3VycmVudF9wYWNrZXQgPSAwOworCX0KK30KKworLyogSW50ZWdlciBmcmFjdGlvbmFsIG1hdGguICBXaGVuIHdlIHRyYW5zbWl0IGEgNDRrMUh6IHNpZ25hbCB3ZSBtdXN0CisgKiBzZW5kIDUgNDEvODAgc2FtcGxlcyBwZXIgaXNvY2hyb25vdXMgY3ljbGUsIGFzIHRoZXNlIG9jY3VyIDgwMDAKKyAqIHRpbWVzIGEgc2Vjb25kLiAgT2YgY291cnNlLCB3ZSBtdXN0IHNlbmQgYW4gaW50ZWdyYWwgbnVtYmVyIG9mCisgKiBzYW1wbGVzIGluIGEgcGFja2V0LCBzbyB3ZSB1c2UgdGhlIGludGVnZXIgbWF0aCB0byBhbHRlcm5hdGUKKyAqIGJldHdlZW4gc2VuZGluZyA1IGFuZCA2IHNhbXBsZXMgcGVyIHBhY2tldC4KKyAqLworCitzdGF0aWMgdm9pZCBmcmFjdGlvbl9pbml0KHN0cnVjdCBmcmFjdGlvbiAqZiwgaW50IG51bWVyYXRvciwgaW50IGRlbm9taW5hdG9yKQoreworCWYtPmludGVnZXIgPSBudW1lcmF0b3IgLyBkZW5vbWluYXRvcjsKKwlmLT5udW1lcmF0b3IgPSBudW1lcmF0b3IgJSBkZW5vbWluYXRvcjsKKwlmLT5kZW5vbWluYXRvciA9IGRlbm9taW5hdG9yOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGZyYWN0aW9uX2FkZChzdHJ1Y3QgZnJhY3Rpb24gKmRzdCwKKwkJCQkgICAgc3RydWN0IGZyYWN0aW9uICpzcmMxLAorCQkJCSAgICBzdHJ1Y3QgZnJhY3Rpb24gKnNyYzIpCit7CisJLyogYXNzZXJ0OiBzcmMxLT5kZW5vbWluYXRvciA9PSBzcmMyLT5kZW5vbWluYXRvciAqLworCisJaW50IHN1bSwgZGVub207CisKKwkvKiBXZSB1c2UgdGhlc2UgdHdvIGxvY2FsIHZhcmlhYmxlcyB0byBhbGxvdyBnY2MgdG8gb3B0aW1pemUKKwkgKiB0aGUgZGl2aXNpb24gYW5kIHRoZSBtb2R1bG8gaW50byBvbmx5IG9uZSBkaXZpc2lvbi4gKi8KKworCXN1bSA9IHNyYzEtPm51bWVyYXRvciArIHNyYzItPm51bWVyYXRvcjsKKwlkZW5vbSA9IHNyYzEtPmRlbm9taW5hdG9yOworCWRzdC0+aW50ZWdlciA9IHNyYzEtPmludGVnZXIgKyBzcmMyLT5pbnRlZ2VyICsgc3VtIC8gZGVub207CisJZHN0LT5udW1lcmF0b3IgPSBzdW0gJSBkZW5vbTsKKwlkc3QtPmRlbm9taW5hdG9yID0gZGVub207Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZnJhY3Rpb25fc3ViX2ludChzdHJ1Y3QgZnJhY3Rpb24gKmRzdCwKKwkJCQkJc3RydWN0IGZyYWN0aW9uICpzcmMsIGludCBpbnRlZ2VyKQoreworCWRzdC0+aW50ZWdlciA9IHNyYy0+aW50ZWdlciAtIGludGVnZXI7CisJZHN0LT5udW1lcmF0b3IgPSBzcmMtPm51bWVyYXRvcjsKKwlkc3QtPmRlbm9taW5hdG9yID0gc3JjLT5kZW5vbWluYXRvcjsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGZyYWN0aW9uX2Zsb29yKHN0cnVjdCBmcmFjdGlvbiAqZnJhYykKK3sKKwlyZXR1cm4gZnJhYy0+aW50ZWdlcjsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGZyYWN0aW9uX2NlaWwoc3RydWN0IGZyYWN0aW9uICpmcmFjKQoreworCXJldHVybiBmcmFjLT5pbnRlZ2VyICsgKGZyYWMtPm51bWVyYXRvciA+IDAgPyAxIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhY2tldF9pbml0aWFsaXplKHN0cnVjdCBwYWNrZXQgKnAsIHN0cnVjdCBwYWNrZXQgKm5leHQpCit7CisJLyogSGVyZSB3ZSBpbml0aWFsaXplIHRoZSBkbWEgZGVzY3JpcHRvciBibG9jayBmb3IKKwkgKiB0cmFuc2ZlcnJpbmcgb25lIGlzbyBwYWNrZXQuICBXZSB1c2UgdHdvIGRlc2NyaXB0b3JzIHBlcgorCSAqIHBhY2tldDogYW4gT1VUUFVUX01PUkVfSU1NTUVESUFURSBkZXNjcmlwdG9yIGZvciB0aGUKKwkgKiBJRUVFMTM5NCBpc28gcGFja2V0IGhlYWRlciBhbmQgYW4gT1VUUFVUX0xBU1QgZGVzY3JpcHRvcgorCSAqIGZvciB0aGUgcGF5bG9hZC4KKwkgKi8KKworCXAtPmRiLT5oZWFkZXJfZGVzYy5jb250cm9sID0KKwkJRE1BX0NUTF9PVVRQVVRfTU9SRSB8IERNQV9DVExfSU1NRURJQVRFIHwgODsKKworCWlmIChuZXh0KSB7CisJCXAtPmRiLT5wYXlsb2FkX2Rlc2MuY29udHJvbCA9CisJCQlETUFfQ1RMX09VVFBVVF9MQVNUIHwgRE1BX0NUTF9CUkFOQ0g7CisJCXAtPmRiLT5wYXlsb2FkX2Rlc2MuYnJhbmNoID0gbmV4dC0+ZGJfYnVzIHwgMzsKKwkJcC0+ZGItPmhlYWRlcl9kZXNjLnNraXAgPSBuZXh0LT5kYl9idXMgfCAzOworCX0KKwllbHNlIHsKKwkJcC0+ZGItPnBheWxvYWRfZGVzYy5jb250cm9sID0KKwkJCURNQV9DVExfT1VUUFVUX0xBU1QgfCBETUFfQ1RMX0JSQU5DSCB8CisJCQlETUFfQ1RMX1VQREFURSB8IERNQV9DVExfSVJROworCQlwLT5kYi0+cGF5bG9hZF9kZXNjLmJyYW5jaCA9IDA7CisJCXAtPmRiLT5oZWFkZXJfZGVzYy5za2lwID0gMDsKKwl9CisJcC0+ZGItPnBheWxvYWRfZGVzYy5kYXRhX2FkZHJlc3MgPSBwLT5wYXlsb2FkX2J1czsKKwlwLT5kYi0+cGF5bG9hZF9kZXNjLnN0YXR1cyA9IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X2xpc3QgKnBhY2tldF9saXN0X2FsbG9jKHN0cnVjdCBzdHJlYW0gKnMpCit7CisJaW50IGk7CisJc3RydWN0IHBhY2tldF9saXN0ICpwbDsKKwlzdHJ1Y3QgcGFja2V0ICpuZXh0OworCisJcGwgPSBrbWFsbG9jKHNpemVvZiAqcGwsIFNMQUJfS0VSTkVMKTsKKwlpZiAocGwgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEFDS0VUX0xJU1RfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBwYWNrZXQgKnAgPSAmcGwtPnBhY2tldHNbaV07CisJCXAtPmRiID0gcGNpX3Bvb2xfYWxsb2Mocy0+ZGVzY3JpcHRvcl9wb29sLCBTTEFCX0tFUk5FTCwKKwkJCQkgICAgICAgJnAtPmRiX2J1cyk7CisJCXAtPnBheWxvYWQgPSBwY2lfcG9vbF9hbGxvYyhzLT5wYWNrZXRfcG9vbCwgU0xBQl9LRVJORUwsCisJCQkJCSAgICAmcC0+cGF5bG9hZF9idXMpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBQQUNLRVRfTElTVF9TSVpFOyBpKyspIHsKKwkJaWYgKGkgPCBQQUNLRVRfTElTVF9TSVpFIC0gMSkKKwkJCW5leHQgPSAmcGwtPnBhY2tldHNbaSArIDFdOworCQllbHNlCisJCQluZXh0ID0gTlVMTDsKKwkJcGFja2V0X2luaXRpYWxpemUoJnBsLT5wYWNrZXRzW2ldLCBuZXh0KTsKKwl9CisKKwlyZXR1cm4gcGw7Cit9CisKK3N0YXRpYyB2b2lkIHBhY2tldF9saXN0X2ZyZWUoc3RydWN0IHBhY2tldF9saXN0ICpwbCwgc3RydWN0IHN0cmVhbSAqcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBQQUNLRVRfTElTVF9TSVpFOyBpKyspIHsKKwkJc3RydWN0IHBhY2tldCAqcCA9ICZwbC0+cGFja2V0c1tpXTsKKwkJcGNpX3Bvb2xfZnJlZShzLT5kZXNjcmlwdG9yX3Bvb2wsIHAtPmRiLCBwLT5kYl9idXMpOworCQlwY2lfcG9vbF9mcmVlKHMtPnBhY2tldF9wb29sLCBwLT5wYXlsb2FkLCBwLT5wYXlsb2FkX2J1cyk7CisJfQorCWtmcmVlKHBsKTsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXIgKmJ1ZmZlcl9hbGxvYyhpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpiOworCisJYiA9IGttYWxsb2Moc2l6ZW9mICpiICsgc2l6ZSwgU0xBQl9LRVJORUwpOworCWlmIChiID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWItPmhlYWQgPSAwOworCWItPnRhaWwgPSAwOworCWItPmxlbmd0aCA9IDA7CisJYi0+c2l6ZSA9IHNpemU7CisKKwlyZXR1cm4gYjsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcl9nZXRfYnl0ZXMoc3RydWN0IGJ1ZmZlciAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKGJ1ZmZlci0+aGVhZCArIHNpemUgPiBidWZmZXItPnNpemUpCisJCUJVRygpOworCisJcCA9ICZidWZmZXItPmRhdGFbYnVmZmVyLT5oZWFkXTsKKwlidWZmZXItPmhlYWQgKz0gc2l6ZTsKKwlpZiAoYnVmZmVyLT5oZWFkID09IGJ1ZmZlci0+c2l6ZSkKKwkJYnVmZmVyLT5oZWFkID0gMDsKKwlidWZmZXItPmxlbmd0aCAtPSBzaXplOworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpidWZmZXJfcHV0X2J5dGVzKHN0cnVjdCBidWZmZXIgKmJ1ZmZlciwKKwkJCQkgICAgICAgc2l6ZV90IG1heCwgc2l6ZV90ICphY3R1YWwpCit7CisJc2l6ZV90IGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJcCA9ICZidWZmZXItPmRhdGFbYnVmZmVyLT50YWlsXTsKKwlsZW5ndGggPSBtaW4oYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5sZW5ndGgsIG1heCk7CisJaWYgKGJ1ZmZlci0+dGFpbCArIGxlbmd0aCA8IGJ1ZmZlci0+c2l6ZSkgeworCQkqYWN0dWFsID0gbGVuZ3RoOworCQlidWZmZXItPnRhaWwgKz0gbGVuZ3RoOworCX0KKwllbHNlIHsKKwkJKmFjdHVhbCA9IGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+dGFpbDsKKwkJIGJ1ZmZlci0+dGFpbCA9IDA7CisJfQorCisJYnVmZmVyLT5sZW5ndGggKz0gKmFjdHVhbDsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHUzMiBnZXRfaWVjOTU4X2hlYWRlcl9iaXRzKHN0cnVjdCBzdHJlYW0gKnMsIGludCBzdWJfZnJhbWUsIHUzMiBzYW1wbGUpCit7CisJaW50IGNzaSwgcGFyaXR5LCBzaGlmdDsKKwlpbnQgYmxvY2tfc3RhcnQ7CisJdTMyIGJpdHM7CisKKwlzd2l0Y2ggKHMtPmllYzk1OF9mcmFtZV9jb3VudCkgeworCWNhc2UgMToKKwkJY3NpID0gcy0+Zm9ybWF0ID09IEFNRFRQX0ZPUk1BVF9JRUM5NThfQUMzOworCQlicmVhazsKKwljYXNlIDI6CisJY2FzZSA5OgorCQljc2kgPSAxOworCQlicmVhazsKKwljYXNlIDI0IC4uLiAyNzoKKwkJY3NpID0gKHMtPmllYzk1OF9yYXRlX2NvZGUgPj4gKDI3IC0gcy0+aWVjOTU4X2ZyYW1lX2NvdW50KSkgJiAweDAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljc2kgPSAwOworCQlicmVhazsKKwl9CisKKwlibG9ja19zdGFydCA9IChzLT5pZWM5NThfZnJhbWVfY291bnQgPT0gMCAmJiBzdWJfZnJhbWUgPT0gMCk7CisKKwkvKiBUaGUgcGFyaXR5IGJpdCBpcyB0aGUgeG9yIG9mIHRoZSBzYW1wbGUgYml0cyBhbmQgdGhlCisJICogY2hhbm5lbCBzdGF0dXMgaW5mbyBiaXQuICovCisJZm9yIChzaGlmdCA9IDE2LCBwYXJpdHkgPSBzYW1wbGUgXiBjc2k7IHNoaWZ0ID4gMDsgc2hpZnQgPj49IDEpCisJCXBhcml0eSBePSAocGFyaXR5ID4+IHNoaWZ0KTsKKworCWJpdHMgPSAgKGJsb2NrX3N0YXJ0IDw8IDUpIHwJCS8qIEJsb2NrIHN0YXJ0IGJpdCAqLworCQkoKHN1Yl9mcmFtZSA9PSAwKSA8PCA0KSB8CS8qIFN1YmZyYW1lIGJpdCAqLworCQkoKHBhcml0eSAmIDEpIDw8IDMpIHwJCS8qIFBhcml0eSBiaXQgKi8KKwkJKGNzaSA8PCAyKTsJCQkvKiBDaGFubmVsIHN0YXR1cyBpbmZvIGJpdCAqLworCisJcmV0dXJuIGJpdHM7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X2hlYWRlcl9iaXRzKHN0cnVjdCBzdHJlYW0gKnMsIGludCBzdWJfZnJhbWUsIHUzMiBzYW1wbGUpCit7CisJc3dpdGNoIChzLT5mb3JtYXQpIHsKKwljYXNlIEFNRFRQX0ZPUk1BVF9JRUM5NThfUENNOgorCWNhc2UgQU1EVFBfRk9STUFUX0lFQzk1OF9BQzM6CisJCXJldHVybiBnZXRfaWVjOTU4X2hlYWRlcl9iaXRzKHMsIHN1Yl9mcmFtZSwgc2FtcGxlKTsKKworCWNhc2UgQU1EVFBfRk9STUFUX1JBVzoKKwkJcmV0dXJuIDB4NDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfcGF5bG9hZF9sZTE2KHN0cnVjdCBzdHJlYW0gKnMsIHF1YWRsZXRfdCAqZGF0YSwgaW50IG5ldmVudHMpCit7CisJcXVhZGxldF90ICpldmVudCwgc2FtcGxlLCBiaXRzOworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwLCBldmVudCA9IGRhdGE7IGkgPCBuZXZlbnRzOyBpKyspIHsKKworCQlmb3IgKGogPSAwOyBqIDwgcy0+ZGltZW5zaW9uOyBqKyspIHsKKwkJCXAgPSBidWZmZXJfZ2V0X2J5dGVzKHMtPmlucHV0LCAyKTsKKwkJCXNhbXBsZSA9IChwWzFdIDw8IDE2KSB8IChwWzBdIDw8IDgpOworCQkJYml0cyA9IGdldF9oZWFkZXJfYml0cyhzLCBqLCBzYW1wbGUpOworCQkJZXZlbnRbal0gPSBjcHVfdG9fYmUzMigoYml0cyA8PCAyNCkgfCBzYW1wbGUpOworCQl9CisKKwkJZXZlbnQgKz0gcy0+ZGltZW5zaW9uOworCQlpZiAoKytzLT5pZWM5NThfZnJhbWVfY291bnQgPT0gMTkyKQorCQkJcy0+aWVjOTU4X2ZyYW1lX2NvdW50ID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfcGFja2V0KHN0cnVjdCBzdHJlYW0gKnMsIHN0cnVjdCBwYWNrZXQgKnBhY2tldCwgaW50IG5ldmVudHMpCit7CisJaW50IHN5dF9pbmRleCwgc3l0LCBzaXplOworCXUzMiBjb250cm9sOworCisJc2l6ZSA9IChuZXZlbnRzICogcy0+ZGltZW5zaW9uICsgMikgKiBzaXplb2YocXVhZGxldF90KTsKKworCS8qIFVwZGF0ZSBETUEgZGVzY3JpcHRvcnMgKi8KKwlwYWNrZXQtPmRiLT5wYXlsb2FkX2Rlc2Muc3RhdHVzID0gMDsKKwljb250cm9sID0gcGFja2V0LT5kYi0+cGF5bG9hZF9kZXNjLmNvbnRyb2wgJiAweGZmZmYwMDAwOworCXBhY2tldC0+ZGItPnBheWxvYWRfZGVzYy5jb250cm9sID0gY29udHJvbCB8IHNpemU7CisKKwkvKiBGaWxsIElFRUUxMzk0IGhlYWRlcnMgKi8KKwlwYWNrZXQtPmRiLT5oZWFkZXJfZGVzYy5oZWFkZXJbMF0gPQorCQkoSUVFRTEzOTRfU1BFRURfMTAwIDw8IDE2KSB8ICgweDAxIDw8IDE0KSB8CisJCShzLT5pc29fY2hhbm5lbCA8PCA4KSB8IChUQ09ERV9JU09fREFUQSA8PCA0KTsKKwlwYWNrZXQtPmRiLT5oZWFkZXJfZGVzYy5oZWFkZXJbMV0gPSBzaXplIDw8IDE2OworCisJLyogQ2FsY3VsYXRlIHN5bmNocm9uaXphdGlvbiB0aW1lc3RhbXAgKHN5dCkuIEZpcnN0IHdlCisJICogZGV0ZXJtaW5lIHN5dF9pbmRleCwgdGhhdCBpcywgdGhlIGluZGV4IGluIHRoZSBwYWNrZXQgb2YKKwkgKiB0aGUgc2FtcGxlIGZvciB3aGljaCB0aGUgdGltZXN0YW1wIGlzIHZhbGlkLiAqLworCXN5dF9pbmRleCA9IChzLT5zeXRfaW50ZXJ2YWwgLSBzLT5kYmMpICYgKHMtPnN5dF9pbnRlcnZhbCAtIDEpOworCWlmIChzeXRfaW5kZXggPCBuZXZlbnRzKSB7CisJCXN5dCA9ICgoYXRvbWljX3JlYWQoJnMtPmN5Y2xlX2NvdW50KSA8PCAxMikgfAorCQkgICAgICAgcy0+Y3ljbGVfb2Zmc2V0LmludGVnZXIpICYgMHhmZmZmOworCQlmcmFjdGlvbl9hZGQoJnMtPmN5Y2xlX29mZnNldCwKKwkJCSAgICAgJnMtPmN5Y2xlX29mZnNldCwgJnMtPnRpY2tzX3Blcl9zeXRfb2Zmc2V0KTsKKworCQkvKiBUaGlzIG5leHQgYWRkaXRpb24gc2hvdWxkIGJlIG1vZHVsbyA4MDAwICgweDFmNDApLAorCQkgKiBidXQgd2Ugb25seSB1c2UgdGhlIGxvd2VyIDQgYml0cyBvZiBjeWNsZV9jb3VudCwgc28KKwkJICogd2UgZG9uJ3QgbmVlZCB0aGUgbW9kdWxvLiAqLworCQlhdG9taWNfYWRkKHMtPmN5Y2xlX29mZnNldC5pbnRlZ2VyIC8gMzA3MiwgJnMtPmN5Y2xlX2NvdW50KTsKKwkJcy0+Y3ljbGVfb2Zmc2V0LmludGVnZXIgJT0gMzA3MjsKKwl9CisJZWxzZQorCQlzeXQgPSAweGZmZmY7CisKKwlhdG9taWNfaW5jKCZzLT5jeWNsZV9jb3VudDIpOworCisJLyogRmlsbCBjaXAgaGVhZGVyICovCisJcGFja2V0LT5wYXlsb2FkLT5lb2gwID0gMDsKKwlwYWNrZXQtPnBheWxvYWQtPnNpZCA9IHMtPmhvc3QtPmhvc3QtPm5vZGVfaWQgJiAweDNmOworCXBhY2tldC0+cGF5bG9hZC0+ZGJzID0gcy0+ZGltZW5zaW9uOworCXBhY2tldC0+cGF5bG9hZC0+Zm4gPSAwOworCXBhY2tldC0+cGF5bG9hZC0+cXBjID0gMDsKKwlwYWNrZXQtPnBheWxvYWQtPnNwaCA9IDA7CisJcGFja2V0LT5wYXlsb2FkLT5yZXNlcnZlZCA9IDA7CisJcGFja2V0LT5wYXlsb2FkLT5kYmMgPSBzLT5kYmM7CisJcGFja2V0LT5wYXlsb2FkLT5lb2gxID0gMjsKKwlwYWNrZXQtPnBheWxvYWQtPmZtdCA9IEZNVF9BTURUUDsKKwlwYWNrZXQtPnBheWxvYWQtPmZkZiA9IHMtPmZkZjsKKwlwYWNrZXQtPnBheWxvYWQtPnN5dCA9IGNwdV90b19iZTE2KHN5dCk7CisKKwlzd2l0Y2ggKHMtPnNhbXBsZV9mb3JtYXQpIHsKKwljYXNlIEFNRFRQX0lOUFVUX0xFMTY6CisJCWZpbGxfcGF5bG9hZF9sZTE2KHMsIHBhY2tldC0+cGF5bG9hZC0+ZGF0YSwgbmV2ZW50cyk7CisJCWJyZWFrOworCX0KKworCXMtPmRiYyArPSBuZXZlbnRzOworfQorCitzdGF0aWMgdm9pZCBzdHJlYW1fZmx1c2goc3RydWN0IHN0cmVhbSAqcykKK3sKKwlzdHJ1Y3QgcGFja2V0ICpwOworCWludCBuZXZlbnRzOworCXN0cnVjdCBmcmFjdGlvbiBuZXh0OworCisJLyogVGhlIEFNRFRQIHNwZWNpZmllcyB0d28gdHJhbnNtaXNzaW9uIG1vZGVzOiBibG9ja2luZyBhbmQKKwkgKiBub24tYmxvY2tpbmcuICBJbiBibG9ja2luZyBtb2RlIHlvdSBhbHdheXMgdHJhbnNmZXIKKwkgKiBzeXRfaW50ZXJ2YWwgb3IgemVybyBzYW1wbGVzLCB3aGVyZWFzIGluIG5vbi1ibG9ja2luZyBtb2RlCisJICogeW91IHNlbmQgYXMgbWFueSBzYW1wbGVzIGFzIHlvdSBoYXZlIGF2YWlsYWJsZSBhdCB0cmFuc2ZlcgorCSAqIHRpbWUuCisJICoKKwkgKiBUaGUgZnJhY3Rpb24gc2FtcGxlc19wZXJfY3ljbGUgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YKKwkgKiBzYW1wbGVzIHRoYXQgYmVjb21lIGF2YWlsYWJsZSBwZXIgY3ljbGUuICBXZSBhZGQgdGhpcyB0bworCSAqIHRoZSBmcmFjdGlvbiByZWFkeV9zYW1wbGVzLCB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgorCSAqIGxlZnRvdmVyIHNhbXBsZXMgZnJvbSB0aGUgcHJldmlvdXMgdHJhbnNtaXNzaW9uLiAgVGhlIHN1bSwKKwkgKiBzdG9yZWQgaW4gdGhlIGZyYWN0aW9uIG5leHQsIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mCisJICogc2FtcGxlcyBhdmFpbGFibGUgZm9yIHRyYW5zbWlzc2lvbiwgYW5kIGZyb20gdGhpcyB3ZQorCSAqIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gYWN0dWFsbHkgdHJhbnNtaXQuCisJICovCisKKwl3aGlsZSAoMSkgeworCQlmcmFjdGlvbl9hZGQoJm5leHQsICZzLT5yZWFkeV9zYW1wbGVzLCAmcy0+c2FtcGxlc19wZXJfY3ljbGUpOworCQlpZiAocy0+bW9kZSA9PSBBTURUUF9NT0RFX0JMT0NLSU5HKSB7CisJCQlpZiAoZnJhY3Rpb25fZmxvb3IoJm5leHQpID49IHMtPnN5dF9pbnRlcnZhbCkKKwkJCQluZXZlbnRzID0gcy0+c3l0X2ludGVydmFsOworCQkJZWxzZQorCQkJCW5ldmVudHMgPSAwOworCQl9CisJCWVsc2UKKwkJCW5ldmVudHMgPSBmcmFjdGlvbl9mbG9vcigmbmV4dCk7CisKKwkJcCA9IHN0cmVhbV9jdXJyZW50X3BhY2tldChzKTsKKwkJaWYgKHMtPmlucHV0LT5sZW5ndGggPCBuZXZlbnRzICogcy0+ZGltZW5zaW9uICogMiB8fCBwID09IE5VTEwpCisJCQlicmVhazsKKworCQlmaWxsX3BhY2tldChzLCBwLCBuZXZlbnRzKTsKKwkJc3RyZWFtX3F1ZXVlX3BhY2tldChzKTsKKworCQkvKiBOb3cgdGhhdCB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBxdWV1ZWQgdGhlIHBhY2tldCBmb3IKKwkJICogdHJhbnNtaXNzaW9uLCB3ZSB1cGRhdGUgdGhlIGZyYWN0aW9uIHJlYWR5X3NhbXBsZXMuICovCisJCWZyYWN0aW9uX3N1Yl9pbnQoJnMtPnJlYWR5X3NhbXBsZXMsICZuZXh0LCBuZXZlbnRzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtX2FsbG9jX3BhY2tldF9saXN0cyhzdHJ1Y3Qgc3RyZWFtICpzKQoreworCWludCBtYXhfbmV2ZW50cywgbWF4X3BhY2tldF9zaXplLCBpOworCisJaWYgKHMtPm1vZGUgPT0gQU1EVFBfTU9ERV9CTE9DS0lORykKKwkJbWF4X25ldmVudHMgPSBzLT5zeXRfaW50ZXJ2YWw7CisJZWxzZQorCQltYXhfbmV2ZW50cyA9IGZyYWN0aW9uX2NlaWwoJnMtPnNhbXBsZXNfcGVyX2N5Y2xlKTsKKworCW1heF9wYWNrZXRfc2l6ZSA9IG1heF9uZXZlbnRzICogcy0+ZGltZW5zaW9uICogNCArIDg7CisJcy0+cGFja2V0X3Bvb2wgPSBwY2lfcG9vbF9jcmVhdGUoInBhY2tldCBwb29sIiwgcy0+aG9zdC0+b2hjaS0+ZGV2LAorCQkJCQkgbWF4X3BhY2tldF9zaXplLCAwLCAwKTsKKworCWlmIChzLT5wYWNrZXRfcG9vbCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlJTklUX0xJU1RfSEVBRCgmcy0+ZnJlZV9wYWNrZXRfbGlzdHMpOworCUlOSVRfTElTVF9IRUFEKCZzLT5kbWFfcGFja2V0X2xpc3RzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1BBQ0tFVF9MSVNUUzsgaSsrKSB7CisJCXN0cnVjdCBwYWNrZXRfbGlzdCAqcGwgPSBwYWNrZXRfbGlzdF9hbGxvYyhzKTsKKwkJaWYgKHBsID09IE5VTEwpCisJCQlicmVhazsKKwkJbGlzdF9hZGRfdGFpbCgmcGwtPmxpbmssICZzLT5mcmVlX3BhY2tldF9saXN0cyk7CisJfQorCisJcmV0dXJuIGkgPCBNQVhfUEFDS0VUX0xJU1RTID8gLTEgOiAwOworfQorCitzdGF0aWMgdm9pZCBzdHJlYW1fZnJlZV9wYWNrZXRfbGlzdHMoc3RydWN0IHN0cmVhbSAqcykKK3sKKwlzdHJ1Y3QgcGFja2V0X2xpc3QgKnBhY2tldF9sLCAqcGFja2V0X2xfbmV4dDsKKworCWlmIChzLT5jdXJyZW50X3BhY2tldF9saXN0ICE9IE5VTEwpCisJCXBhY2tldF9saXN0X2ZyZWUocy0+Y3VycmVudF9wYWNrZXRfbGlzdCwgcyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldF9sLCBwYWNrZXRfbF9uZXh0LCAmcy0+ZG1hX3BhY2tldF9saXN0cywgbGluaykKKwkJcGFja2V0X2xpc3RfZnJlZShwYWNrZXRfbCwgcyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldF9sLCBwYWNrZXRfbF9uZXh0LCAmcy0+ZnJlZV9wYWNrZXRfbGlzdHMsIGxpbmspCisJCXBhY2tldF9saXN0X2ZyZWUocGFja2V0X2wsIHMpOworCWlmIChzLT5wYWNrZXRfcG9vbCAhPSBOVUxMKQorCQlwY2lfcG9vbF9kZXN0cm95KHMtPnBhY2tldF9wb29sKTsKKworCXMtPmN1cnJlbnRfcGFja2V0X2xpc3QgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZzLT5mcmVlX3BhY2tldF9saXN0cyk7CisJSU5JVF9MSVNUX0hFQUQoJnMtPmRtYV9wYWNrZXRfbGlzdHMpOworCXMtPnBhY2tldF9wb29sID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcGx1Z191cGRhdGUoc3RydWN0IGNtcF9wY3IgKnBsdWcsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHN0cmVhbSAqcyA9IGRhdGE7CisKKwlIUFNCX0lORk8oInBsdWcgdXBkYXRlOiBwMnBfY291bnQ9JWQsIGNoYW5uZWw9JWQiLAorCQkgIHBsdWctPnAycF9jb3VudCwgcGx1Zy0+Y2hhbm5lbCk7CisJcy0+aXNvX2NoYW5uZWwgPSBwbHVnLT5jaGFubmVsOworCWlmIChwbHVnLT5wMnBfY291bnQgPiAwKSB7CisJCXN0cnVjdCBwYWNrZXRfbGlzdCAqcGw7CisKKwkJcGwgPSBsaXN0X2VudHJ5KHMtPmRtYV9wYWNrZXRfbGlzdHMubmV4dCwgc3RydWN0IHBhY2tldF9saXN0LCBsaW5rKTsKKwkJc3RyZWFtX3N0YXJ0X2RtYShzLCBwbCk7CisJfQorCWVsc2UgeworCQlvaGNpMTM5NF9zdG9wX2l0X2N0eChzLT5ob3N0LT5vaGNpLCBzLT5pc29fdGFza2xldC5jb250ZXh0LCAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtX2NvbmZpZ3VyZShzdHJ1Y3Qgc3RyZWFtICpzLCBpbnQgY21kLCBzdHJ1Y3QgYW1kdHBfaW9jdGwgKmNmZykKK3sKKwljb25zdCBpbnQgdHJhbnNmZXJfZGVsYXkgPSA5MDAwOworCisJaWYgKGNmZy0+Zm9ybWF0IDw9IEFNRFRQX0ZPUk1BVF9JRUM5NThfQUMzKQorCQlzLT5mb3JtYXQgPSBjZmctPmZvcm1hdDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjZmctPnJhdGUpIHsKKwljYXNlIDMyMDAwOgorCQlzLT5zeXRfaW50ZXJ2YWwgPSA4OworCQlzLT5mZGYgPSBGREZfU0ZDXzMyS0haOworCQlzLT5pZWM5NThfcmF0ZV9jb2RlID0gMHgwYzsKKwkJYnJlYWs7CisJY2FzZSA0NDEwMDoKKwkJcy0+c3l0X2ludGVydmFsID0gODsKKwkJcy0+ZmRmID0gRkRGX1NGQ180NEsxSFo7CisJCXMtPmllYzk1OF9yYXRlX2NvZGUgPSAweDAwOworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCQlzLT5zeXRfaW50ZXJ2YWwgPSA4OworCQlzLT5mZGYgPSBGREZfU0ZDXzQ4S0haOworCQlzLT5pZWM5NThfcmF0ZV9jb2RlID0gMHgwNDsKKwkJYnJlYWs7CisJY2FzZSA4ODIwMDoKKwkJcy0+c3l0X2ludGVydmFsID0gMTY7CisJCXMtPmZkZiA9IEZERl9TRkNfODhLMkhaOworCQlzLT5pZWM5NThfcmF0ZV9jb2RlID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSA5NjAwMDoKKwkJcy0+c3l0X2ludGVydmFsID0gMTY7CisJCXMtPmZkZiA9IEZERl9TRkNfOTZLSFo7CisJCXMtPmllYzk1OF9yYXRlX2NvZGUgPSAweDAwOworCQlicmVhazsKKwljYXNlIDE3NjQwMDoKKwkJcy0+c3l0X2ludGVydmFsID0gMzI7CisJCXMtPmZkZiA9IEZERl9TRkNfMTc2SzRIWjsKKwkJcy0+aWVjOTU4X3JhdGVfY29kZSA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgMTkyMDAwOgorCQlzLT5zeXRfaW50ZXJ2YWwgPSAzMjsKKwkJcy0+ZmRmID0gRkRGX1NGQ18xOTJLSFo7CisJCXMtPmllYzk1OF9yYXRlX2NvZGUgPSAweDAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXMtPnJhdGUgPSBjZmctPnJhdGU7CisJZnJhY3Rpb25faW5pdCgmcy0+c2FtcGxlc19wZXJfY3ljbGUsIHMtPnJhdGUsIDgwMDApOworCWZyYWN0aW9uX2luaXQoJnMtPnJlYWR5X3NhbXBsZXMsIDAsIDgwMDApOworCisJLyogVGhlIHRpY2tzX3Blcl9zeXRfb2Zmc2V0IGlzIGluaXRpYWxpemVkIHRvIHRoZSBudW1iZXIgb2YKKwkgKiB0aWNrcyBiZXR3ZWVuIHN5dF9pbnRlcnZhbCBldmVudHMuICBUaGUgbnVtYmVyIG9mIHRpY2tzIHBlcgorCSAqIHNlY29uZCBpcyAyNC41NzZlNiwgc28gdGhlIG51bWJlciBvZiB0aWNrcyBiZXR3ZWVuCisJICogc3l0X2ludGVydmFsIGV2ZW50cyBpcyAyNC41NzZlNiAqIHN5dF9pbnRlcnZhbCAvIHJhdGUuCisJICovCisJZnJhY3Rpb25faW5pdCgmcy0+dGlja3NfcGVyX3N5dF9vZmZzZXQsCisJCSAgICAgIDI0NTc2MDAwICogcy0+c3l0X2ludGVydmFsLCBzLT5yYXRlKTsKKwlmcmFjdGlvbl9pbml0KCZzLT5jeWNsZV9vZmZzZXQsICh0cmFuc2Zlcl9kZWxheSAlIDMwNzIpICogcy0+cmF0ZSwgcy0+cmF0ZSk7CisJYXRvbWljX3NldCgmcy0+Y3ljbGVfY291bnQsIHRyYW5zZmVyX2RlbGF5IC8gMzA3Mik7CisJYXRvbWljX3NldCgmcy0+Y3ljbGVfY291bnQyLCAwKTsKKworCXMtPm1vZGUgPSBjZmctPm1vZGU7CisJcy0+c2FtcGxlX2Zvcm1hdCA9IEFNRFRQX0lOUFVUX0xFMTY7CisKKwkvKiBXaGVuIHVzaW5nIHRoZSBBTTgyNCByYXcgc3ViZm9ybWF0IHdlIGNhbiBzdHJlYW0gc2lnbmFscyBvZgorCSAqIGFueSBkaW1lbnNpb24uICBUaGUgSUVDOTU4IHN1YmZvcm1hdCwgaG93ZXZlciwgb25seQorCSAqIHN1cHBvcnRzIDIgY2hhbm5lbHMuCisJICovCisJaWYgKHMtPmZvcm1hdCA9PSBBTURUUF9GT1JNQVRfUkFXIHx8IGNmZy0+ZGltZW5zaW9uID09IDIpCisJCXMtPmRpbWVuc2lvbiA9IGNmZy0+ZGltZW5zaW9uOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocy0+b3BjciAhPSBOVUxMKSB7CisJCWNtcF91bnJlZ2lzdGVyX29wY3Iocy0+aG9zdC0+aG9zdCwgcy0+b3Bjcik7CisJCXMtPm9wY3IgPSBOVUxMOworCX0KKworCXN3aXRjaChjbWQpIHsKKwljYXNlIEFNRFRQX0lPQ19QTFVHOgorCQlzLT5vcGNyID0gY21wX3JlZ2lzdGVyX29wY3Iocy0+aG9zdC0+aG9zdCwgY2ZnLT51LnBsdWcsCisJCQkJCSAgIC8qcGF5bG9hZCovIDEyLCBwbHVnX3VwZGF0ZSwgcyk7CisJCWlmIChzLT5vcGNyID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcy0+aXNvX2NoYW5uZWwgPSBzLT5vcGNyLT5jaGFubmVsOworCQlicmVhazsKKworCWNhc2UgQU1EVFBfSU9DX0NIQU5ORUw6CisJCWlmIChjZmctPnUuY2hhbm5lbCA+PSAwICYmIGNmZy0+dS5jaGFubmVsIDwgNjQpCisJCQlzLT5pc29fY2hhbm5lbCA9IGNmZy0+dS5jaGFubmVsOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJLyogVGhlIGlvY3RsIHNldHRpbmdzIHdlcmUgYWxsIHZhbGlkLCBzbyB3ZSByZWFsbG9jIHRoZSBwYWNrZXQKKwkgKiBsaXN0cyB0byBtYWtlIHN1cmUgdGhlIHBhY2tldCBzaXplIGlzIGJpZyBlbm91Z2guCisJICovCisJaWYgKHMtPnBhY2tldF9wb29sICE9IE5VTEwpCisJCXN0cmVhbV9mcmVlX3BhY2tldF9saXN0cyhzKTsKKworCWlmIChzdHJlYW1fYWxsb2NfcGFja2V0X2xpc3RzKHMpIDwgMCkgeworCQlzdHJlYW1fZnJlZV9wYWNrZXRfbGlzdHMocyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN0cmVhbSAqc3RyZWFtX2FsbG9jKHN0cnVjdCBhbWR0cF9ob3N0ICpob3N0KQoreworCXN0cnVjdCBzdHJlYW0gKnM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN0cmVhbSksIFNMQUJfS0VSTkVMKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBtZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBzdHJlYW0pKTsKKwlzLT5ob3N0ID0gaG9zdDsKKworCXMtPmlucHV0ID0gYnVmZmVyX2FsbG9jKEJVRkZFUl9TSVpFKTsKKwlpZiAocy0+aW5wdXQgPT0gTlVMTCkgeworCQlrZnJlZShzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcy0+ZGVzY3JpcHRvcl9wb29sID0gcGNpX3Bvb2xfY3JlYXRlKCJkZXNjcmlwdG9yIHBvb2wiLCBob3N0LT5vaGNpLT5kZXYsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBkZXNjcmlwdG9yX2Jsb2NrKSwKKwkJCQkJICAgICAxNiwgMCk7CisKKwlpZiAocy0+ZGVzY3JpcHRvcl9wb29sID09IE5VTEwpIHsKKwkJa2ZyZWUocy0+aW5wdXQpOworCQlrZnJlZShzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnMtPmZyZWVfcGFja2V0X2xpc3RzKTsKKwlJTklUX0xJU1RfSEVBRCgmcy0+ZG1hX3BhY2tldF9saXN0cyk7CisKKyAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+cGFja2V0X2xpc3Rfd2FpdCk7CisgICAgICAgIHNwaW5fbG9ja19pbml0KCZzLT5wYWNrZXRfbGlzdF9sb2NrKTsKKworCW9oY2kxMzk0X2luaXRfaXNvX3Rhc2tsZXQoJnMtPmlzb190YXNrbGV0LCBPSENJX0lTT19UUkFOU01JVCwKKwkJCQkgIHN0cmVhbV9zaGlmdF9wYWNrZXRfbGlzdHMsCisJCQkJICAodW5zaWduZWQgbG9uZykgcyk7CisKKwlpZiAob2hjaTEzOTRfcmVnaXN0ZXJfaXNvX3Rhc2tsZXQoaG9zdC0+b2hjaSwgJnMtPmlzb190YXNrbGV0KSA8IDApIHsKKwkJcGNpX3Bvb2xfZGVzdHJveShzLT5kZXNjcmlwdG9yX3Bvb2wpOworCQlrZnJlZShzLT5pbnB1dCk7CisJCWtmcmVlKHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+c3RyZWFtX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnMtPmxpbmssICZob3N0LT5zdHJlYW1fbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+c3RyZWFtX2xpc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbV9mcmVlKHN0cnVjdCBzdHJlYW0gKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFN0b3AgdGhlIERNQS4gIFdlIHdhaXQgZm9yIHRoZSBkbWEgcGFja2V0IGxpc3QgdG8gYmVjb21lCisJICogZW1wdHkgYW5kIGxldCB0aGUgZG1hIGNvbnRyb2xsZXIgcnVuIG91dCBvZiBwcm9ncmFtcy4gIFRoaXMKKwkgKiBzZWVtcyB0byBiZSBtb3JlIHJlbGlhYmxlIHRoYW4gc3RvcHBpbmcgaXQgZGlyZWN0bHksIHNpbmNlCisJICogdGhhdCBzb21ldGltZXMgZ2VuZXJhdGVzIGFuIGl0IHRyYW5zbWl0IGludGVycnVwdCBpZiB3ZQorCSAqIGxhdGVyIHJlLWVuYWJsZSB0aGUgY29udGV4dC4KKwkgKi8KKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocy0+cGFja2V0X2xpc3Rfd2FpdCwKKwkJCQkgbGlzdF9lbXB0eSgmcy0+ZG1hX3BhY2tldF9saXN0cykpOworCisJb2hjaTEzOTRfc3RvcF9pdF9jdHgocy0+aG9zdC0+b2hjaSwgcy0+aXNvX3Rhc2tsZXQuY29udGV4dCwgMSk7CisJb2hjaTEzOTRfdW5yZWdpc3Rlcl9pc29fdGFza2xldChzLT5ob3N0LT5vaGNpLCAmcy0+aXNvX3Rhc2tsZXQpOworCisJaWYgKHMtPm9wY3IgIT0gTlVMTCkKKwkJY21wX3VucmVnaXN0ZXJfb3BjcihzLT5ob3N0LT5ob3N0LCBzLT5vcGNyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5ob3N0LT5zdHJlYW1fbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJnMtPmxpbmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmhvc3QtPnN0cmVhbV9saXN0X2xvY2ssIGZsYWdzKTsKKworCWtmcmVlKHMtPmlucHV0KTsKKworCXN0cmVhbV9mcmVlX3BhY2tldF9saXN0cyhzKTsKKwlwY2lfcG9vbF9kZXN0cm95KHMtPmRlc2NyaXB0b3JfcG9vbCk7CisKKwlrZnJlZShzKTsKK30KKworLyogRmlsZSBvcGVyYXRpb25zICovCisKK3N0YXRpYyBzc2l6ZV90IGFtZHRwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsCisJCQkgICBsb2ZmX3QgKm9mZnNldF9pc19pZ25vcmVkKQoreworCXN0cnVjdCBzdHJlYW0gKnMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgaTsKKwlzaXplX3QgbGVuZ3RoOworCisJaWYgKHMtPnBhY2tldF9wb29sID09IE5VTEwpCisJCXJldHVybiAtRUJBREZEOworCisJLyogRmlsbCB0aGUgY2lyY3VsYXIgYnVmZmVyIGZyb20gdGhlIGlucHV0IGJ1ZmZlciBhbmQgY2FsbCB0aGUKKwkgKiBpc28gcGFja2VyIHdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsLiAgVGhlIGlzbyBwYWNrZXIgbWF5CisJICogbGVhdmUgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBmb3IgdHdvIHJlYXNvbnM6IGVpdGhlciB0aGUKKwkgKiByZW1haW5pbmcgYnl0ZXMgd2Fzbid0IGVub3VnaCB0byBidWlsZCBhIG5ldyBwYWNrZXQsIG9yCisJICogdGhlcmUgd2VyZSBubyBmcmVlIHBhY2tldCBsaXN0cy4gIEluIHRoZSBmaXJzdCBjYXNlIHdlCisJICogcmUtZmlsbCB0aGUgYnVmZmVyIGFuZCBjYWxsIHRoZSBpc28gcGFja2VyIGFnYWluIG9yIHJldHVybgorCSAqIGlmIHdlIHVzZWQgYWxsIHRoZSBkYXRhIGZyb20gdXNlcnNwYWNlLiAgSW4gdGhlIHNlY29uZAorCSAqIGNhc2UsIHRoZSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUgd2lsbCBibG9jayB1bnRpbCB0aGUgaXJxCisJICogaGFuZGxlciBmcmVlcyBhIHBhY2tldCBsaXN0LgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IGxlbmd0aCkgeworCQlwID0gYnVmZmVyX3B1dF9ieXRlcyhzLT5pbnB1dCwgY291bnQgLSBpLCAmbGVuZ3RoKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHAsIGJ1ZmZlciArIGksIGxlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHMtPmlucHV0LT5sZW5ndGggPCBzLT5pbnB1dC0+c2l6ZSkKKwkJCWNvbnRpbnVlOworCisJCXN0cmVhbV9mbHVzaChzKTsKKworCQlpZiAocy0+Y3VycmVudF9wYWNrZXRfbGlzdCAhPSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIGkgKyBsZW5ndGggPiAwID8gaSArIGxlbmd0aCA6IC1FQUdBSU47CisKKwkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzLT5wYWNrZXRfbGlzdF93YWl0LAorCQkJCQkgICAgICFsaXN0X2VtcHR5KCZzLT5mcmVlX3BhY2tldF9saXN0cykpKQorCQkJcmV0dXJuIC1FSU5UUjsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBsb25nIGFtZHRwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc3RyZWFtICpzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhbWR0cF9pb2N0bCBjZmc7CisJaW50IGVycjsKKwlsb2NrX2tlcm5lbCgpOworCXN3aXRjaChjbWQpCisJeworCWNhc2UgQU1EVFBfSU9DX1BMVUc6CisJY2FzZSBBTURUUF9JT0NfQ0hBTk5FTDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjZmcsIChzdHJ1Y3QgYW1kdHBfaW9jdGwgX191c2VyICopIGFyZywgc2l6ZW9mIGNmZykpCisJCQllcnIgPSAtRUZBVUxUOworCQllbHNlCisJCQllcnIgPSBzdHJlYW1fY29uZmlndXJlKHMsIGNtZCwgJmNmZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFtZHRwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKnB0KQoreworCXN0cnVjdCBzdHJlYW0gKnMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnMtPnBhY2tldF9saXN0X3dhaXQsIHB0KTsKKworCWlmICghbGlzdF9lbXB0eSgmcy0+ZnJlZV9wYWNrZXRfbGlzdHMpKQorCQlyZXR1cm4gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWR0cF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBhbWR0cF9ob3N0ICpob3N0OworCWludCBpID0gaWVlZTEzOTRfZmlsZV90b19pbnN0YW5jZShmaWxlKTsKKworCWhvc3QgPSBocHNiX2dldF9ob3N0aW5mb19ieWtleSgmYW1kdHBfaGlnaGxldmVsLCBpKTsKKwlpZiAoaG9zdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHN0cmVhbV9hbGxvYyhob3N0KTsKKwlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kdHBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3RyZWFtICpzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJc3RyZWFtX2ZyZWUocyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjZGV2IGFtZHRwX2NkZXY7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhbWR0cF9mb3BzID0KK3sKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkud3JpdGUgPQlhbWR0cF93cml0ZSwKKwkucG9sbCA9CQlhbWR0cF9wb2xsLAorCS51bmxvY2tlZF9pb2N0bCA9IGFtZHRwX2lvY3RsLAorCS5jb21wYXRfaW9jdGwgPSBhbWR0cF9pb2N0bCwgLyogQWxsIGFtZHRwIGlvY3RscyBhcmUgY29tcGF0aWJsZSAqLworCS5vcGVuID0JCWFtZHRwX29wZW4sCisJLnJlbGVhc2UgPQlhbWR0cF9yZWxlYXNlCit9OworCisvKiBJRUVFMTM5NCBTdWJzeXN0ZW0gZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIGFtZHRwX2FkZF9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGFtZHRwX2hvc3QgKmFoOworCWludCBtaW5vcjsKKworCWlmIChzdHJjbXAoaG9zdC0+ZHJpdmVyLT5uYW1lLCBPSENJMTM5NF9EUklWRVJfTkFNRSkgIT0gMCkKKwkJcmV0dXJuOworCisJYWggPSBocHNiX2NyZWF0ZV9ob3N0aW5mbygmYW1kdHBfaGlnaGxldmVsLCBob3N0LCBzaXplb2YoKmFoKSk7CisJaWYgKCFhaCkgeworCQlIUFNCX0VSUigiYW1kdHA6IFVuYWJsZSBhYmxlIHRvIGFsbG9jIGhvc3RpbmZvIik7CisJCXJldHVybjsKKwl9CisKKwlhaC0+aG9zdCA9IGhvc3Q7CisJYWgtPm9oY2kgPSBob3N0LT5ob3N0ZGF0YTsKKworCWhwc2Jfc2V0X2hvc3RpbmZvX2tleSgmYW1kdHBfaGlnaGxldmVsLCBob3N0LCBhaC0+aG9zdC0+aWQpOworCisJbWlub3IgPSBJRUVFMTM5NF9NSU5PUl9CTE9DS19BTURUUCAqIDE2ICsgYWgtPmhvc3QtPmlkOworCisJSU5JVF9MSVNUX0hFQUQoJmFoLT5zdHJlYW1fbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJmFoLT5zdHJlYW1fbGlzdF9sb2NrKTsKKworCWRldmZzX21rX2NkZXYoTUtERVYoSUVFRTEzOTRfTUFKT1IsIG1pbm9yKSwKKwkJCVNfSUZDSFJ8U19JUlVTUnxTX0lXVVNSLCAiYW1kdHAvJWQiLCBhaC0+aG9zdC0+aWQpOworfQorCitzdGF0aWMgdm9pZCBhbWR0cF9yZW1vdmVfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworCXN0cnVjdCBhbWR0cF9ob3N0ICphaCA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZhbWR0cF9oaWdobGV2ZWwsIGhvc3QpOworCisJaWYgKGFoKQorCQlkZXZmc19yZW1vdmUoImFtZHRwLyVkIiwgYWgtPmhvc3QtPmlkKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCBhbWR0cF9oaWdobGV2ZWwgPSB7CisJLm5hbWUgPQkJImFtZHRwIiwKKwkuYWRkX2hvc3QgPQlhbWR0cF9hZGRfaG9zdCwKKwkucmVtb3ZlX2hvc3QgPQlhbWR0cF9yZW1vdmVfaG9zdCwKK307CisKKy8qIE1vZHVsZSBpbnRlcmZhY2UgKi8KKworTU9EVUxFX0FVVEhPUigiS3Jpc3RpYW4gSG9nc2JlcmcgPGhvZ3NiZXJnQHVzZXJzLnNmLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBBdWRpbyAmIE11c2ljIERhdGEgVHJhbnNtaXNzaW9uIFByb3RvY29sICIKKwkJICAgIm9uIE9IQ0kgYm9hcmRzLiIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoImFtZHRwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IGFtZHRwX2luaXRfbW9kdWxlICh2b2lkKQoreworCWNkZXZfaW5pdCgmYW1kdHBfY2RldiwgJmFtZHRwX2ZvcHMpOworCWFtZHRwX2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKwlrb2JqZWN0X3NldF9uYW1lKCZhbWR0cF9jZGV2LmtvYmosICJhbWR0cCIpOworCWlmIChjZGV2X2FkZCgmYW1kdHBfY2RldiwgSUVFRTEzOTRfQU1EVFBfREVWLCAxNikpIHsKKwkJSFBTQl9FUlIoImFtZHRwOiB1bmFibGUgdG8gYWRkIGNoYXIgZGV2aWNlIik7CisgCQlyZXR1cm4gLUVJTzsKKyAJfQorCisJZGV2ZnNfbWtfZGlyKCJhbWR0cCIpOworCisJaHBzYl9yZWdpc3Rlcl9oaWdobGV2ZWwoJmFtZHRwX2hpZ2hsZXZlbCk7CisKKwlIUFNCX0lORk8oIkxvYWRlZCBBTURUUCBkcml2ZXIiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1kdHBfZXhpdF9tb2R1bGUgKHZvaWQpCit7CisgICAgICAgIGhwc2JfdW5yZWdpc3Rlcl9oaWdobGV2ZWwoJmFtZHRwX2hpZ2hsZXZlbCk7CisJZGV2ZnNfcmVtb3ZlKCJhbWR0cCIpOworCWNkZXZfZGVsKCZhbWR0cF9jZGV2KTsKKworCUhQU0JfSU5GTygiVW5sb2FkZWQgQU1EVFAgZHJpdmVyIik7Cit9CisKK21vZHVsZV9pbml0KGFtZHRwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFtZHRwX2V4aXRfbW9kdWxlKTsKK01PRFVMRV9BTElBU19DSEFSREVWKElFRUUxMzk0X01BSk9SLCBJRUVFMTM5NF9NSU5PUl9CTE9DS19BTURUUCAqIDE2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvYW1kdHAuaCBiL2RyaXZlcnMvaWVlZTEzOTQvYW1kdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzFmMjhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9hbWR0cC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qIC0qLSBjLWJhc2ljLW9mZnNldDogOCAtKi0gKi8KKworI2lmbmRlZiBfX0FNRFRQX0gKKyNkZWZpbmUgX19BTURUUF9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlICJpZWVlMTM5NC1pb2N0bC5oIgorCisvKiBUaGUgdXNlcnNwYWNlIGludGVyZmFjZSBmb3IgdGhlIEF1ZGlvICYgTXVzaWMgRGF0YSBUcmFuc21pc3Npb24KKyAqIFByb3RvY29sIGRyaXZlciBpcyByZWFsbHkgc2ltcGxlLiBGaXJzdCwgb3BlbiAvZGV2L2FtZHRwLCB1c2UgdGhlCisgKiBpb2N0bCB0byBjb25maWd1cmUgZm9ybWF0LCByYXRlLCBkaW1lbnNpb24gYW5kIGVpdGhlciBwbHVnIG9yCisgKiBjaGFubmVsLCB0aGVuIHN0YXJ0IHdyaXRpbmcgc2FtcGxlcy4KKyAqCisgKiBUaGUgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciBhcmUgbGlzdGVkIGJlbG93LgorICogQU1EVFBfRk9STUFUX1JBVyBjb3JyZXNwb25kcyB0byB0aGUgQU04MjQgcmF3IGZvcm1hdCwgd2hpY2ggY2FuCisgKiBjYXJyeSBhbnkgbnVtYmVyIG9mIGNoYW5uZWxzLCBzbyB1c2UgdGhpcyBpZiB5b3UncmUgc3RyZWFtaW5nCisgKiBtdWx0aWNoYW5uZWwgYXVkaW8uICBUaGUgQU1EVFBfRk9STUFUX0lFQzk1OF9QQ00gY29ycmVzcG9uZHMgdG8gdGhlCisgKiBBTTgyNCBJRUM5NTggZW5jYXBzdWxhdGlvbiB3aXRob3V0IHRoZSBJRUM5NTggZGF0YSBiaXQgc2V0LCB1c2luZworICogQU1EVFBfRk9STUFUX0lFQzk1OF9BQzMgd2lsbCB0cmFuc21pdCB0aGUgc2FtcGxlcyB3aXRoIHRoZSBkYXRhIGJpdAorICogc2V0LCBzdWl0YWJsZSBmb3IgdHJhbnNtaXR0aW5nIGNvbXByZXNzZWQgQUMtMyBhdWRpby4KKyAqCisgKiBUaGUgcmF0ZSBmaWVsZCBzcGVjaWZpZXMgdGhlIHRyYW5zbWlzc2lvbiByYXRlOyBzdXBwb3J0ZWQgdmFsdWVzCisgKiBhcmUgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAgYW5kIDE5MjAwMC4KKyAqCisgKiBUaGUgZGltZW5zaW9uIGZpZWxkIHNwZWNpZmllcyB0aGUgZGltZW5zaW9uIG9mIHRoZSBzaWduYWwsIHRoYXQgaXMsCisgKiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLiAgT25seSBBTURUUF9GT1JNQVRfUkFXIHN1cHBvcnRzCisgKiBzZXR0aW5ncyBncmVhdGVyIHRoYW4gMi4KKyAqCisgKiBUaGUgbW9kZSBmaWVsZCBzcGVjaWZpZXMgd2hpY2ggdHJhbnNtaXNzaW9uIG1vZGUgdG8gdXNlLiBUaGUgQU1EVFAKKyAqIHNwZWNpZmllcyB0d28gZGlmZmVyZW50IHRyYW5zbWlzc2lvbiBtb2RlczogYmxvY2tpbmcgYW5kCisgKiBub24tYmxvY2tpbmcuICBUaGUgYmxvY2tpbmcgdHJhbnNtaXNzaW9uIG1vZGUgYWx3YXlzIHNlbmQgYSBmaXhlZAorICogbnVtYmVyIG9mIHNhbXBsZXMsIHR5cGljYWxseSA4LCAxNiBvciAzMi4gIFRvIGV4YWN0bHkgbWF0Y2ggdGhlCisgKiB0cmFuc21pc3Npb24gcmF0ZSwgdGhlIGRyaXZlciBhbHRlcm5hdGVzIGJldHdlZW4gc2VuZGluZyBlbXB0eSBhbmQKKyAqIG5vbi1lbXB0eSBwYWNrZXRzLiAgSW4gbm9uLWJsb2NraW5nIG1vZGUsIHRoZSBkcml2ZXIgdHJhbnNtaXRzIGFzCisgKiBzbWFsbCBwYWNrZXRzIGFzIHBvc3NpYmxlLiAgRm9yIGV4YW1wbGUsIGZvciBhIHRyYW5zbWlzc2lvbiByYXRlIG9mCisgKiA0NDEwMEh6LCB0aGUgZHJpdmVyIHNob3VsZCBzZW5kIDUgNDEvODAgc2FtcGxlcyBpbiBldmVyeSBjeWNsZSwgYnV0CisgKiB0aGlzIGlzIG5vdCBwb3NzaWJsZSBzbyBpbnN0ZWFkIHRoZSBkcml2ZXIgYWx0ZXJuYXRlcyBiZXR3ZWVuCisgKiBzZW5kaW5nIDUgYW5kIDYgc2FtcGxlcy4KKyAqCisgKiBUaGUgbGFzdCB0aGluZyB0byBzcGVjaWZ5IGlzIGVpdGhlciB0aGUgaXNvY2hyb25vdXMgY2hhbm5lbCB0byB1c2UKKyAqIG9yIHRoZSBvdXRwdXQgcGx1ZyB0byBjb25uZWN0IHRvLiAgSWYgeW91IGtub3cgd2hhdCBjaGFubmVsIHRoZQorICogZGVzdGluYXRpb24gZGV2aWNlIHdpbGwgbGlzdGVuIG9uLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGNoYW5uZWwKKyAqIGRpcmVjdGx5IGFuZCB1c2UgdGhlIEFNRFRQX0lPQ19DSEFOTkVMIGlvY3RsLiAgSG93ZXZlciwgaWYgdGhlCisgKiBkZXN0aW5hdGlvbiBkZXZpY2UgY2hvb3NlcyB0aGUgY2hhbm5lbCBhbmQgdXNlcyB0aGUgSUVDNjE4ODMtMSBwbHVnCisgKiBtZWNoYW5pc20sIHlvdSBjYW4gc3BlY2lmeSBhbiBvdXRwdXQgcGx1ZyB0byBjb25uZWN0IHRvLiAgVGhlCisgKiBkcml2ZXIgd2lsbCBwaWNrIHVwIHRoZSBjaGFubmVsIG51bWJlciBmcm9tIHRoZSBwbHVnIG9uY2UgdGhlCisgKiBkZXN0aW5hdGlvbiBkZXZpY2UgbG9ja3MgdGhlIG91dHB1dCBwbHVnIGNvbnRyb2wgcmVnaXN0ZXIuICBJbiB0aGlzCisgKiBjYXNlIHNldCB0aGUgcGx1ZyBmaWVsZCBhbmQgdXNlIHRoZSBBTURUUF9JT0NfUExVRyBpb2N0bC4KKyAqCisgKiBIYXZpbmcgY29uZmlndXJlZCB0aGUgaW50ZXJmYWNlLCB0aGUgZHJpdmVyIG5vdyBhY2NlcHRzIHdyaXRlcyBvZgorICogcmVndWxhciAxNiBiaXQgc2lnbmVkIGxpdHRsZSBlbmRpYW4gc2FtcGxlcywgd2l0aCB0aGUgY2hhbm5lbHMKKyAqIGludGVybGVhdmVkLiAgRm9yIGV4YW1wbGUsIDQgY2hhbm5lbHMgd291bGQgbG9vayBsaWtlOgorICoKKyAqICAgfCBzYW1wbGUgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzYW1wbGUgMSAgICAuLi4KKyAqICAgfCBjaC4gMCAgICAgfCBjaC4gMSAgICAgfCBjaC4gMiAgICAgfCBjaC4gMyAgICAgfCBjaC4gMCAgICAgfCAuLi4KKyAqICAgfCBsc2IgfCBtc2IgfCBsc2IgfCBtc2IgfCBsc2IgfCBtc2IgfCBsc2IgfCBtc2IgfCBsc2IgfCBtc2IgfCAuLi4KKyAqCisgKi8KKworZW51bSB7CisJQU1EVFBfRk9STUFUX1JBVywKKwlBTURUUF9GT1JNQVRfSUVDOTU4X1BDTSwKKwlBTURUUF9GT1JNQVRfSUVDOTU4X0FDMworfTsKKworZW51bSB7CisJQU1EVFBfTU9ERV9CTE9DS0lORywKKwlBTURUUF9NT0RFX05PTl9CTE9DS0lORywKK307CisKK2VudW0geworCUFNRFRQX0lOUFVUX0xFMTYsCisJQU1EVFBfSU5QVVRfQkUxNiwKK307CisKK3N0cnVjdCBhbWR0cF9pb2N0bCB7CisJX191MzIgZm9ybWF0OworCV9fdTMyIHJhdGU7CisJX191MzIgZGltZW5zaW9uOworCV9fdTMyIG1vZGU7CisJdW5pb24geyBfX3UzMiBjaGFubmVsOyBfX3UzMiBwbHVnOyB9IHU7Cit9OworCisjZW5kaWYgLyogX19BTURUUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2NtcC5jIGIvZHJpdmVycy9pZWVlMTM5NC9jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWFlZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jbXAuYwpAQCAtMCwwICsxLDMxMSBAQAorLyogLSotIGMtYmFzaWMtb2Zmc2V0OiA4IC0qLQorICoKKyAqIGNtcC5jIC0gQ29ubmVjdGlvbiBNYW5hZ2VtZW50IFByb2NlZHVyZXMKKyAqIENvcHlyaWdodCAoQykgMjAwMSBLcmlzdGlhbiBI+GdzYmVyZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogVE9ETworICogLS0tLQorICoKKyAqIC0gSW1wbGVtZW50IElFQzYxODgzLTEgb3V0cHV0IHBsdWdzIGFuZCBjb25uZWN0aW9uIG1hbmFnZW1lbnQuCisgKiAgIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHBhcnQgb2YgdGhlIGdlbmVyYWwgc3Vic3lzdGVtLCBhcyBpdCBjb3VsZAorICogICBiZSBzaGFyZWQgd2l0aCBkdjEzOTQuCisgKgorICogLSBBZGQgSUVDNjE4ODMgdW5pdCBkaXJlY3Rvcnkgd2hlbiBsb2FkaW5nIHRoaXMgbW9kdWxlLiAgVGhpcworICogICByZXF1aXJlcyBhIHJ1bi10aW1lIGNoYW5nZWFibGUgY29uZmlnIHJvbS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJob3N0cy5oIgorI2luY2x1ZGUgImhpZ2hsZXZlbC5oIgorI2luY2x1ZGUgImllZWUxMzk0LmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfY29yZS5oIgorI2luY2x1ZGUgImNtcC5oIgorCitzdHJ1Y3QgcGx1ZyB7CisJdW5pb24geworCQlzdHJ1Y3QgY21wX3BjciBwY3I7CisJCXF1YWRsZXRfdCBxdWFkbGV0OworCX0gdTsKKwl2b2lkICgqdXBkYXRlKShzdHJ1Y3QgY21wX3BjciAqcGx1Zywgdm9pZCAqZGF0YSk7CisJdm9pZCAqZGF0YTsKK307CisKK3N0cnVjdCBjbXBfaG9zdCB7CisJc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKKworCXVuaW9uIHsKKwkJc3RydWN0IGNtcF9tcHIgb21wcjsKKwkJcXVhZGxldF90IG9tcHJfcXVhZGxldDsKKwl9IHU7CisJc3RydWN0IHBsdWcgb3BjclsyXTsKKworCXVuaW9uIHsKKwkJc3RydWN0IGNtcF9tcHIgaW1wcjsKKwkJcXVhZGxldF90IGltcHJfcXVhZGxldDsKKwl9IHY7CisJc3RydWN0IHBsdWcgaXBjclsyXTsKK307CisKK2VudW0geworCUNNUF9QMlBfQ09OTkVDVElPTiwKKwlDTVBfQkNfQ09OTkVDVElPTgorfTsKKworI2RlZmluZSBDU1JfUENSX01BUCAgICAgIDB4OTAwCisjZGVmaW5lIENTUl9QQ1JfTUFQX0VORCAgMHg5ZmMKKworc3RhdGljIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCBjbXBfaGlnaGxldmVsOworCitzdGF0aWMgdm9pZCBjbXBfYWRkX2hvc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBjbXBfaG9zdF9yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKK3N0YXRpYyBpbnQgcGNyX3JlYWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpidWYsCisJCSAgICB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsYWdzKTsKK3N0YXRpYyBpbnQgcGNyX2xvY2soc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpzdG9yZSwKKwkJICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgZGF0YSwgcXVhZGxldF90IGFyZywgaW50IGV4dGNvZGUsIHUxNiBmbGFncyk7CisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgY21wX2hpZ2hsZXZlbCA9IHsKKwkubmFtZSA9CQkiY21wIiwKKwkuYWRkX2hvc3QgPQljbXBfYWRkX2hvc3QsCisJLmhvc3RfcmVzZXQgPQljbXBfaG9zdF9yZXNldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBwY3Jfb3BzID0geworCS5yZWFkID0JcGNyX3JlYWQsCisJLmxvY2sgPQlwY3JfbG9jaywKK307CisKKworc3RydWN0IGNtcF9wY3IgKgorY21wX3JlZ2lzdGVyX29wY3Ioc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG9wY3JfbnVtYmVyLCBpbnQgcGF5bG9hZCwKKwkJICB2b2lkICgqdXBkYXRlKShzdHJ1Y3QgY21wX3BjciAqcGNyLCB2b2lkICpkYXRhKSwKKwkJICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjbXBfaG9zdCAqY2g7CisJc3RydWN0IHBsdWcgKnBsdWc7CisKKwljaCA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZjbXBfaGlnaGxldmVsLCBob3N0KTsKKworCWlmIChvcGNyX251bWJlciA+PSBjaC0+dS5vbXByLm5wbHVncyB8fAorCSAgICBjaC0+b3BjcltvcGNyX251bWJlcl0udXBkYXRlICE9IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcGx1ZyA9ICZjaC0+b3BjcltvcGNyX251bWJlcl07CisJcGx1Zy0+dS5wY3Iub25saW5lID0gMTsKKwlwbHVnLT51LnBjci5iY2FzdF9jb3VudCA9IDA7CisJcGx1Zy0+dS5wY3IucDJwX2NvdW50ID0gMDsKKwlwbHVnLT51LnBjci5vdmVyaGVhZCA9IDA7CisJcGx1Zy0+dS5wY3IucGF5bG9hZCA9IHBheWxvYWQ7CisJcGx1Zy0+dXBkYXRlID0gdXBkYXRlOworCXBsdWctPmRhdGEgPSBkYXRhOworCisJcmV0dXJuICZwbHVnLT51LnBjcjsKK30KKwordm9pZCBjbXBfdW5yZWdpc3Rlcl9vcGNyKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHN0cnVjdCBjbXBfcGNyICpvcGNyKQoreworCXN0cnVjdCBjbXBfaG9zdCAqY2g7CisJc3RydWN0IHBsdWcgKnBsdWc7CisKKwljaCA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZjbXBfaGlnaGxldmVsLCBob3N0KTsKKwlwbHVnID0gKHN0cnVjdCBwbHVnICopb3BjcjsKKwlpZiAocGx1ZyAtIGNoLT5vcGNyID49IGNoLT51Lm9tcHIubnBsdWdzKSBCVUcoKTsKKworCXBsdWctPnUucGNyLm9ubGluZSA9IDA7CisJcGx1Zy0+dXBkYXRlID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfcGx1Z3Moc3RydWN0IGNtcF9ob3N0ICpjaCkKK3sKKwlpbnQgaTsKKworCWNoLT51Lm9tcHIubm9uX3BlcnNpc3RlbnRfZXh0ID0gMHhmZjsKKwlmb3IgKGkgPSAwOyBpIDwgY2gtPnUub21wci5ucGx1Z3M7IGkrKykgeworCQljaC0+b3BjcltpXS51LnBjci5iY2FzdF9jb3VudCA9IDA7CisJCWNoLT5vcGNyW2ldLnUucGNyLnAycF9jb3VudCA9IDA7CisJCWNoLT5vcGNyW2ldLnUucGNyLm92ZXJoZWFkID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNtcF9hZGRfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworCXN0cnVjdCBjbXBfaG9zdCAqY2ggPSBocHNiX2NyZWF0ZV9ob3N0aW5mbygmY21wX2hpZ2hsZXZlbCwgaG9zdCwgc2l6ZW9mICgqY2gpKTsKKworCWlmIChjaCA9PSBOVUxMKSB7CisJCUhQU0JfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgY21wX2hvc3QiKTsKKwkJcmV0dXJuOworCX0KKworCWhwc2JfcmVnaXN0ZXJfYWRkcnNwYWNlKCZjbXBfaGlnaGxldmVsLCBob3N0LCAmcGNyX29wcywKKwkJCQlDU1JfUkVHSVNURVJfQkFTRSArIENTUl9QQ1JfTUFQLAorCQkJCUNTUl9SRUdJU1RFUl9CQVNFICsgQ1NSX1BDUl9NQVBfRU5EKTsKKworCWNoLT5ob3N0ID0gaG9zdDsKKwljaC0+dS5vbXByLnJhdGUgPSBJRUVFMTM5NF9TUEVFRF8xMDA7CisJY2gtPnUub21wci5iY2FzdF9jaGFubmVsX2Jhc2UgPSA2MzsKKwljaC0+dS5vbXByLm5wbHVncyA9IDI7CisKKwlyZXNldF9wbHVncyhjaCk7Cit9CisKK3N0YXRpYyB2b2lkIGNtcF9ob3N0X3Jlc2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGNtcF9ob3N0ICpjaDsKKworCWNoID0gaHBzYl9nZXRfaG9zdGluZm8oJmNtcF9oaWdobGV2ZWwsIGhvc3QpOworCWlmIChjaCA9PSBOVUxMKSB7CisJCUhQU0JfRVJSKCJjbXA6IFRyaWVkIHRvIHJlc2V0IHVua25vd24gaG9zdCIpOworCQlyZXR1cm47CisJfQorCisJcmVzZXRfcGx1Z3MoY2gpOworfQorCitzdGF0aWMgaW50IHBjcl9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHF1YWRsZXRfdCAqYnVmLAorCQkgICAgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbGFncykKK3sKKwlpbnQgY3NyYWRkciA9IGFkZHIgLSBDU1JfUkVHSVNURVJfQkFTRTsKKwlpbnQgcGx1ZzsKKwlzdHJ1Y3QgY21wX2hvc3QgKmNoOworCisJaWYgKGxlbmd0aCAhPSA0KQorCQlyZXR1cm4gUkNPREVfVFlQRV9FUlJPUjsKKworCWNoID0gaHBzYl9nZXRfaG9zdGluZm8oJmNtcF9oaWdobGV2ZWwsIGhvc3QpOworCWlmIChjc3JhZGRyID09IDB4OTAwKSB7CisJCSpidWYgPSBjcHVfdG9fYmUzMihjaC0+dS5vbXByX3F1YWRsZXQpOworCQlyZXR1cm4gUkNPREVfQ09NUExFVEU7CisJfQorCWVsc2UgaWYgKGNzcmFkZHIgPCAweDkwNCArIGNoLT51Lm9tcHIubnBsdWdzICogNCkgeworCQlwbHVnID0gKGNzcmFkZHIgLSAweDkwNCkgLyA0OworCQkqYnVmID0gY3B1X3RvX2JlMzIoY2gtPm9wY3JbcGx1Z10udS5xdWFkbGV0KTsKKwkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOworCX0KKwllbHNlIGlmIChjc3JhZGRyIDwgMHg5ODApIHsKKwkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CisJfQorCWVsc2UgaWYgKGNzcmFkZHIgPT0gMHg5ODApIHsKKwkJKmJ1ZiA9IGNwdV90b19iZTMyKGNoLT52LmltcHJfcXVhZGxldCk7CisJCXJldHVybiBSQ09ERV9DT01QTEVURTsKKwl9CisJZWxzZSBpZiAoY3NyYWRkciA8IDB4OTg0ICsgY2gtPnYuaW1wci5ucGx1Z3MgKiA0KSB7CisJCXBsdWcgPSAoY3NyYWRkciAtIDB4OTg0KSAvIDQ7CisJCSpidWYgPSBjcHVfdG9fYmUzMihjaC0+aXBjcltwbHVnXS51LnF1YWRsZXQpOworCQlyZXR1cm4gUkNPREVfQ09NUExFVEU7CisJfQorCWVsc2UKKwkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7Cit9CisKK3N0YXRpYyBpbnQgcGNyX2xvY2soc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpzdG9yZSwKKwkJICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgZGF0YSwgcXVhZGxldF90IGFyZywgaW50IGV4dGNvZGUsIHUxNiBmbGFncykKK3sKKwlpbnQgY3NyYWRkciA9IGFkZHIgLSBDU1JfUkVHSVNURVJfQkFTRTsKKwlpbnQgcGx1ZzsKKwlzdHJ1Y3QgY21wX2hvc3QgKmNoOworCisJY2ggPSBocHNiX2dldF9ob3N0aW5mbygmY21wX2hpZ2hsZXZlbCwgaG9zdCk7CisKKwlpZiAoZXh0Y29kZSAhPSBFWFRDT0RFX0NPTVBBUkVfU1dBUCkKKwkJcmV0dXJuIFJDT0RFX1RZUEVfRVJST1I7CisKKwlpZiAoY3NyYWRkciA9PSAweDkwMCkgeworCQkvKiBGSVhNRTogSWdub3JlIHdyaXRlcyB0byBiaXRzIDMwLTMxIGFuZCAwLTcgKi8KKwkJKnN0b3JlID0gY3B1X3RvX2JlMzIoY2gtPnUub21wcl9xdWFkbGV0KTsKKwkJaWYgKGFyZyA9PSBjcHVfdG9fYmUzMihjaC0+dS5vbXByX3F1YWRsZXQpKQorCQkJY2gtPnUub21wcl9xdWFkbGV0ID0gYmUzMl90b19jcHUoZGF0YSk7CisKKwkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOworCX0KKwlpZiAoY3NyYWRkciA8IDB4OTA0ICsgY2gtPnUub21wci5ucGx1Z3MgKiA0KSB7CisJCXBsdWcgPSAoY3NyYWRkciAtIDB4OTA0KSAvIDQ7CisJCSpzdG9yZSA9IGNwdV90b19iZTMyKGNoLT5vcGNyW3BsdWddLnUucXVhZGxldCk7CisKKwkJaWYgKGFyZyA9PSAqc3RvcmUpCisJCQljaC0+b3BjcltwbHVnXS51LnF1YWRsZXQgPSBiZTMyX3RvX2NwdShkYXRhKTsKKworCQlpZiAoYmUzMl90b19jcHUoKnN0b3JlKSAhPSBjaC0+b3BjcltwbHVnXS51LnF1YWRsZXQgJiYKKwkJICAgIGNoLT5vcGNyW3BsdWddLnVwZGF0ZSAhPSBOVUxMKQorCQkJY2gtPm9wY3JbcGx1Z10udXBkYXRlKCZjaC0+b3BjcltwbHVnXS51LnBjciwKKwkJCQkJICAgICAgY2gtPm9wY3JbcGx1Z10uZGF0YSk7CisKKwkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOworCX0KKwllbHNlIGlmIChjc3JhZGRyIDwgMHg5ODApIHsKKwkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CisJfQorCWVsc2UgaWYgKGNzcmFkZHIgPT0gMHg5ODApIHsKKwkJLyogRklYTUU6IElnbm9yZSB3cml0ZXMgdG8gYml0cyAyNC0zMSBhbmQgMC03ICovCisJCSpzdG9yZSA9IGNwdV90b19iZTMyKGNoLT51Lm9tcHJfcXVhZGxldCk7CisJCWlmIChhcmcgPT0gY3B1X3RvX2JlMzIoY2gtPnUub21wcl9xdWFkbGV0KSkKKwkJCWNoLT51Lm9tcHJfcXVhZGxldCA9IGJlMzJfdG9fY3B1KGRhdGEpOworCisJCXJldHVybiBSQ09ERV9DT01QTEVURTsKKwl9CisJZWxzZSBpZiAoY3NyYWRkciA8IDB4OTg0ICsgY2gtPnYuaW1wci5ucGx1Z3MgKiA0KSB7CisJCXBsdWcgPSAoY3NyYWRkciAtIDB4OTg0KSAvIDQ7CisJCSpzdG9yZSA9IGNwdV90b19iZTMyKGNoLT5pcGNyW3BsdWddLnUucXVhZGxldCk7CisKKwkJaWYgKGFyZyA9PSAqc3RvcmUpCisJCQljaC0+aXBjcltwbHVnXS51LnF1YWRsZXQgPSBiZTMyX3RvX2NwdShkYXRhKTsKKworCQlpZiAoYmUzMl90b19jcHUoKnN0b3JlKSAhPSBjaC0+aXBjcltwbHVnXS51LnF1YWRsZXQgJiYKKwkJICAgIGNoLT5pcGNyW3BsdWddLnVwZGF0ZSAhPSBOVUxMKQorCQkJY2gtPmlwY3JbcGx1Z10udXBkYXRlKCZjaC0+aXBjcltwbHVnXS51LnBjciwKKwkJCQkJICAgICAgY2gtPmlwY3JbcGx1Z10uZGF0YSk7CisKKwkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOworCX0KKwllbHNlCisJCXJldHVybiBSQ09ERV9BRERSRVNTX0VSUk9SOworfQorCisKKy8qIE1vZHVsZSBpbnRlcmZhY2UgKi8KKworTU9EVUxFX0FVVEhPUigiS3Jpc3RpYW4gSG9nc2JlcmcgPGhvZ3NiZXJnQHVzZXJzLnNmLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29ubmVjdGlvbiBNYW5hZ2VtZW50IFByb2NlZHVyZXMgKENNUCkiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJjbXAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChjbXBfcmVnaXN0ZXJfb3Bjcik7CitFWFBPUlRfU1lNQk9MKGNtcF91bnJlZ2lzdGVyX29wY3IpOworCitzdGF0aWMgaW50IF9faW5pdCBjbXBfaW5pdF9tb2R1bGUgKHZvaWQpCit7CisJaHBzYl9yZWdpc3Rlcl9oaWdobGV2ZWwgKCZjbXBfaGlnaGxldmVsKTsKKworCUhQU0JfSU5GTygiTG9hZGVkIENNUCBkcml2ZXIiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY21wX2V4aXRfbW9kdWxlICh2b2lkKQoreworICAgICAgICBocHNiX3VucmVnaXN0ZXJfaGlnaGxldmVsKCZjbXBfaGlnaGxldmVsKTsKKworCUhQU0JfSU5GTygiVW5sb2FkZWQgQ01QIGRyaXZlciIpOworfQorCittb2R1bGVfaW5pdChjbXBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoY21wX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY21wLmggYi9kcml2ZXJzL2llZWUxMzk0L2NtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Mjg4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2NtcC5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgX19DTVBfSAorI2RlZmluZSBfX0NNUF9ICisKK3N0cnVjdCBjbXBfbXByIHsKKwl1MzIgbnBsdWdzOjU7CisJdTMyIHJlc2VydmVkOjM7CisJdTMyIHBlcnNpc3RlbnRfZXh0Ojg7CisJdTMyIG5vbl9wZXJzaXN0ZW50X2V4dDo4OworCXUzMiBiY2FzdF9jaGFubmVsX2Jhc2U6NjsKKwl1MzIgcmF0ZToyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGNtcF9wY3IgeworCXUzMiBwYXlsb2FkOjEwOworCXUzMiBvdmVyaGVhZDo0OworCXUzMiBzcGVlZDoyOworCXUzMiBjaGFubmVsOjY7CisJdTMyIHJlc2VydmVkOjI7CisJdTMyIHAycF9jb3VudDo2OworCXUzMiBiY2FzdF9jb3VudDoxOworCXUzMiBvbmxpbmU6MTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBjbXBfcGNyICpjbXBfcmVnaXN0ZXJfb3BjcihzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgcGx1ZywKKwkJCQkgIGludCBwYXlsb2FkLAorCQkJCSAgdm9pZCAoKnVwZGF0ZSkoc3RydWN0IGNtcF9wY3IgKnBsdWcsCisJCQkJCQkgdm9pZCAqZGF0YSksCisJCQkJICB2b2lkICpkYXRhKTsKK3ZvaWQgY21wX3VucmVnaXN0ZXJfb3BjcihzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBzdHJ1Y3QgY21wX3BjciAqcGx1Zyk7CisKKyNlbmRpZiAvKiBfX0NNUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2NvbmZpZ19yb21zLmMgYi9kcml2ZXJzL2llZWUxMzk0L2NvbmZpZ19yb21zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxN2ZkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvY29uZmlnX3JvbXMuYwpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIElFRUUgMTM5NCBmb3IgTGludXgKKyAqCisgKiBDb25maWdST00gIGVudHJpZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQmVuIENvbGxpbnMKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSByb290CisgKiBkaXJlY3Rvcnkgb2YgdGhlIGtlcm5lbCBzb3VyY2VzIGZvciBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAiY3NyMTIxMi5oIgorI2luY2x1ZGUgImllZWUxMzk0LmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfdHlwZXMuaCIKKyNpbmNsdWRlICJob3N0cy5oIgorI2luY2x1ZGUgImllZWUxMzk0X2NvcmUuaCIKKyNpbmNsdWRlICJoaWdobGV2ZWwuaCIKKyNpbmNsdWRlICJjc3IuaCIKKyNpbmNsdWRlICJjb25maWdfcm9tcy5oIgorCitzdHJ1Y3QgaHBzYl9jb25maWdfcm9tX2VudHJ5IHsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogQmFzZSBpbml0aWFsaXphdGlvbiwgY2FsbGVkIGF0IG1vZHVsZSBsb2FkICovCisJaW50ICgqaW5pdCkodm9pZCk7CisKKwkvKiBBZGQgZW50cnkgdG8gc3BlY2lmaWVkIGhvc3QgKi8KKwlpbnQgKCphZGQpKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOworCisJLyogUmVtb3ZlIGVudHJ5IGZyb20gc3BlY2lmaWVkIGhvc3QgKi8KKwl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKKworCS8qIENsZWFudXAgY2FsbGVkIGF0IG1vZHVsZSBleGl0ICovCisJdm9pZCAoKmNsZWFudXApKHZvaWQpOworCisJLyogVGhlIGZsYWcgYWRkZWQgdG8gaG9zdC0+Y29uZmlnX3JvbXMgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZzsKK307CisKKworaW50IGhwc2JfZGVmYXVsdF9ob3N0X2VudHJ5KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICpyb290OworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqdmVuZF9pZCA9IE5VTEw7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICp0ZXh0ID0gTlVMTDsKKwljaGFyIGNzcl9uYW1lWzEyOF07CisJaW50IHJldDsKKworCXNwcmludGYoY3NyX25hbWUsICJMaW51eCAtICVzIiwgaG9zdC0+ZHJpdmVyLT5uYW1lKTsKKwlyb290ID0gaG9zdC0+Y3NyLnJvbS0+cm9vdF9rdjsKKworCXZlbmRfaWQgPSBjc3IxMjEyX25ld19pbW1lZGlhdGUoQ1NSMTIxMl9LVl9JRF9WRU5ET1IsIGhvc3QtPmNzci5ndWlkX2hpID4+IDgpOworCXRleHQgPSBjc3IxMjEyX25ld19zdHJpbmdfZGVzY3JpcHRvcl9sZWFmKGNzcl9uYW1lKTsKKworCWlmICghdmVuZF9pZCB8fCAhdGV4dCkgeworCQlpZiAodmVuZF9pZCkKKwkJCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwodmVuZF9pZCk7CisJCWlmICh0ZXh0KQorCQkJY3NyMTIxMl9yZWxlYXNlX2tleXZhbCh0ZXh0KTsKKwkJY3NyMTIxMl9kZXN0cm95X2Nzcihob3N0LT5jc3Iucm9tKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gY3NyMTIxMl9hc3NvY2lhdGVfa2V5dmFsKHZlbmRfaWQsIHRleHQpOworCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwodGV4dCk7CisJcmV0IHw9IGNzcjEyMTJfYXR0YWNoX2tleXZhbF90b19kaXJlY3Rvcnkocm9vdCwgdmVuZF9pZCk7CisJY3NyMTIxMl9yZWxlYXNlX2tleXZhbCh2ZW5kX2lkKTsKKwlpZiAocmV0ICE9IENTUjEyMTJfU1VDQ0VTUykgeworCQljc3IxMjEyX2Rlc3Ryb3lfY3NyKGhvc3QtPmNzci5yb20pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlob3N0LT51cGRhdGVfY29uZmlnX3JvbSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X0NPTkZJR19ST01fSVAxMzk0CisjaW5jbHVkZSAiZXRoMTM5NC5oIgorCitzdGF0aWMgc3RydWN0IGNzcjEyMTJfa2V5dmFsICppcDEzOTRfdWQ7CisKK3N0YXRpYyBpbnQgY29uZmlnX3JvbV9pcDEzOTRfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqc3BlY19pZCA9IE5VTEw7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICpzcGVjX2Rlc2MgPSBOVUxMOworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqdmVyID0gTlVMTDsKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKnZlcl9kZXNjID0gTlVMTDsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCWlwMTM5NF91ZCA9IGNzcjEyMTJfbmV3X2RpcmVjdG9yeShDU1IxMjEyX0tWX0lEX1VOSVQpOworCisJc3BlY19pZCA9IGNzcjEyMTJfbmV3X2ltbWVkaWF0ZShDU1IxMjEyX0tWX0lEX1NQRUNJRklFUl9JRCwKKwkJCQkJRVRIRVIxMzk0X0dBU1BfU1BFQ0lGSUVSX0lEKTsKKwlzcGVjX2Rlc2MgPSBjc3IxMjEyX25ld19zdHJpbmdfZGVzY3JpcHRvcl9sZWFmKCJJQU5BIik7CisJdmVyID0gY3NyMTIxMl9uZXdfaW1tZWRpYXRlKENTUjEyMTJfS1ZfSURfVkVSU0lPTiwKKwkJCQkgICAgRVRIRVIxMzk0X0dBU1BfVkVSU0lPTik7CisJdmVyX2Rlc2MgPSBjc3IxMjEyX25ld19zdHJpbmdfZGVzY3JpcHRvcl9sZWFmKCJJUHY0Iik7CisKKwlpZiAoIWlwMTM5NF91ZCB8fCAhc3BlY19pZCB8fCAhc3BlY19kZXNjIHx8ICF2ZXIgfHwgIXZlcl9kZXNjKQorCQlnb3RvIGlwMTM5NF9mYWlsOworCisJaWYgKGNzcjEyMTJfYXNzb2NpYXRlX2tleXZhbChzcGVjX2lkLCBzcGVjX2Rlc2MpID09IENTUjEyMTJfU1VDQ0VTUyAmJgorCSAgICBjc3IxMjEyX2Fzc29jaWF0ZV9rZXl2YWwodmVyLCB2ZXJfZGVzYykgPT0gQ1NSMTIxMl9TVUNDRVNTICYmCisJICAgIGNzcjEyMTJfYXR0YWNoX2tleXZhbF90b19kaXJlY3RvcnkoaXAxMzk0X3VkLCBzcGVjX2lkKSA9PSBDU1IxMjEyX1NVQ0NFU1MgJiYKKwkgICAgY3NyMTIxMl9hdHRhY2hfa2V5dmFsX3RvX2RpcmVjdG9yeShpcDEzOTRfdWQsIHZlcikgPT0gQ1NSMTIxMl9TVUNDRVNTKQorCQlyZXQgPSAwOworCitpcDEzOTRfZmFpbDoKKwlpZiAocmV0ICYmIGlwMTM5NF91ZCkgeworCQljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKGlwMTM5NF91ZCk7CisJCWlwMTM5NF91ZCA9IE5VTEw7CisJfQorCisJaWYgKHNwZWNfaWQpCisJCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwoc3BlY19pZCk7CisJaWYgKHNwZWNfZGVzYykKKwkJY3NyMTIxMl9yZWxlYXNlX2tleXZhbChzcGVjX2Rlc2MpOworCWlmICh2ZXIpCisJCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwodmVyKTsKKwlpZiAodmVyX2Rlc2MpCisJCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwodmVyX2Rlc2MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX3JvbV9pcDEzOTRfY2xlYW51cCh2b2lkKQoreworCWlmIChpcDEzOTRfdWQpIHsKKwkJY3NyMTIxMl9yZWxlYXNlX2tleXZhbChpcDEzOTRfdWQpOworCQlpcDEzOTRfdWQgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBjb25maWdfcm9tX2lwMTM5NF9hZGQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKwlpZiAoIWlwMTM5NF91ZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoY3NyMTIxMl9hdHRhY2hfa2V5dmFsX3RvX2RpcmVjdG9yeShob3N0LT5jc3Iucm9tLT5yb290X2t2LAorCQkJCQkgICAgICAgaXAxMzk0X3VkKSAhPSBDU1IxMjEyX1NVQ0NFU1MpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19yb21faXAxMzk0X3JlbW92ZShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworCWNzcjEyMTJfZGV0YWNoX2tleXZhbF9mcm9tX2RpcmVjdG9yeShob3N0LT5jc3Iucm9tLT5yb290X2t2LCBpcDEzOTRfdWQpOworfQorCitzdGF0aWMgc3RydWN0IGhwc2JfY29uZmlnX3JvbV9lbnRyeSBpcDEzOTRfZW50cnkgPSB7CisJLm5hbWUJCT0gImlwMTM5NCIsCisJLmluaXQJCT0gY29uZmlnX3JvbV9pcDEzOTRfaW5pdCwKKwkuYWRkCQk9IGNvbmZpZ19yb21faXAxMzk0X2FkZCwKKwkucmVtb3ZlCQk9IGNvbmZpZ19yb21faXAxMzk0X3JlbW92ZSwKKwkuY2xlYW51cAk9IGNvbmZpZ19yb21faXAxMzk0X2NsZWFudXAsCisJLmZsYWcJCT0gSFBTQl9DT05GSUdfUk9NX0VOVFJZX0lQMTM5NCwKK307CisjZW5kaWYgLyogQ09ORklHX0lFRUUxMzk0X0NPTkZJR19ST01fSVAxMzk0ICovCisKKworc3RhdGljIHN0cnVjdCBocHNiX2NvbmZpZ19yb21fZW50cnkgKmNvbnN0IGNvbmZpZ19yb21fZW50cmllc1tdID0geworI2lmZGVmIENPTkZJR19JRUVFMTM5NF9DT05GSUdfUk9NX0lQMTM5NAorCSZpcDEzOTRfZW50cnksCisjZW5kaWYKKwlOVUxMLAorfTsKKworCitpbnQgaHBzYl9pbml0X2NvbmZpZ19yb21zKHZvaWQpCit7CisJaW50IGksIGVycm9yID0gMDsKKworCWZvciAoaSA9IDA7IGNvbmZpZ19yb21fZW50cmllc1tpXTsgaSsrKSB7CisJCWlmICghY29uZmlnX3JvbV9lbnRyaWVzW2ldLT5pbml0KQorCQkJY29udGludWU7CisKKwkJaWYgKGNvbmZpZ19yb21fZW50cmllc1tpXS0+aW5pdCgpKSB7CisJCQlIUFNCX0VSUigiRmFpbGVkIHRvIGluaXRpYWxpemUgY29uZmlnIHJvbSBlbnRyeSBgJXMnIiwKKwkJCQkgY29uZmlnX3JvbV9lbnRyaWVzW2ldLT5uYW1lKTsKKwkJCWVycm9yID0gLTE7CisJCX0gZWxzZQorCQkJSFBTQl9ERUJVRygiSW5pdGlhbGl6ZWQgY29uZmlnIHJvbSBlbnRyeSBgJXMnIiwKKwkJCQkgICBjb25maWdfcm9tX2VudHJpZXNbaV0tPm5hbWUpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKwordm9pZCBocHNiX2NsZWFudXBfY29uZmlnX3JvbXModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGNvbmZpZ19yb21fZW50cmllc1tpXTsgaSsrKSB7CisJCWlmIChjb25maWdfcm9tX2VudHJpZXNbaV0tPmNsZWFudXApCisJCQljb25maWdfcm9tX2VudHJpZXNbaV0tPmNsZWFudXAoKTsKKwl9Cit9CisKK2ludCBocHNiX2FkZF9leHRyYV9jb25maWdfcm9tcyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworCWludCBpLCBlcnJvciA9IDA7CisKKwlmb3IgKGkgPSAwOyBjb25maWdfcm9tX2VudHJpZXNbaV07IGkrKykgeworCQlpZiAoY29uZmlnX3JvbV9lbnRyaWVzW2ldLT5hZGQoaG9zdCkpIHsKKwkJCUhQU0JfRVJSKCJmdy1ob3N0JWQ6IEZhaWxlZCB0byBhdHRhY2ggY29uZmlnIHJvbSBlbnRyeSBgJXMnIiwKKwkJCQkgaG9zdC0+aWQsIGNvbmZpZ19yb21fZW50cmllc1tpXS0+bmFtZSk7CisJCQllcnJvciA9IC0xOworCQl9IGVsc2UgeworCQkJaG9zdC0+Y29uZmlnX3JvbXMgfD0gY29uZmlnX3JvbV9lbnRyaWVzW2ldLT5mbGFnOworCQkJaG9zdC0+dXBkYXRlX2NvbmZpZ19yb20gPSAxOworCQl9CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIGhwc2JfcmVtb3ZlX2V4dHJhX2NvbmZpZ19yb21zKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBjb25maWdfcm9tX2VudHJpZXNbaV07IGkrKykgeworCQlpZiAoIShob3N0LT5jb25maWdfcm9tcyAmIGNvbmZpZ19yb21fZW50cmllc1tpXS0+ZmxhZykpCisJCQljb250aW51ZTsKKworCQljb25maWdfcm9tX2VudHJpZXNbaV0tPnJlbW92ZShob3N0KTsKKworCQlob3N0LT5jb25maWdfcm9tcyAmPSB+Y29uZmlnX3JvbV9lbnRyaWVzW2ldLT5mbGFnOworCQlob3N0LT51cGRhdGVfY29uZmlnX3JvbSA9IDE7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9jb25maWdfcm9tcy5oIGIvZHJpdmVycy9pZWVlMTM5NC9jb25maWdfcm9tcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNzA1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2NvbmZpZ19yb21zLmgKQEAgLTAsMCArMSwyNyBAQAorI2lmbmRlZiBfSUVFRTEzOTRfQ09ORklHX1JPTVNfSAorI2RlZmluZSBfSUVFRTEzOTRfQ09ORklHX1JPTVNfSAorCisjaW5jbHVkZSAiaWVlZTEzOTRfdHlwZXMuaCIKKyNpbmNsdWRlICJob3N0cy5oIgorCisvKiBUaGUgZGVmYXVsdCBob3N0IGVudHJ5LiBUaGlzIG11c3Qgc3VjY2VlZC4gKi8KK2ludCBocHNiX2RlZmF1bHRfaG9zdF9lbnRyeShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKKworLyogSW5pdGlhbGl6ZSBhbGwgY29uZmlnIHJvbXMgKi8KK2ludCBocHNiX2luaXRfY29uZmlnX3JvbXModm9pZCk7CisKKy8qIENsZWFudXAgYWxsIGNvbmZpZyByb21zICovCit2b2lkIGhwc2JfY2xlYW51cF9jb25maWdfcm9tcyh2b2lkKTsKKworLyogQWRkIGV4dHJhIGNvbmZpZyByb21zIHRvIHNwZWNpZmllZCBob3N0ICovCitpbnQgaHBzYl9hZGRfZXh0cmFfY29uZmlnX3JvbXMoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CisKKy8qIFJlbW92ZSBleHRyYSBjb25maWcgcm9tcyBmcm9tIHNwZWNpZmllZCBob3N0ICovCit2b2lkIGhwc2JfcmVtb3ZlX2V4dHJhX2NvbmZpZ19yb21zKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOworCisKKy8qIExpc3Qgb2YgZmxhZ3MgdG8gY2hlY2sgaWYgYSBob3N0IGNvbnRhaW5zIGEgY2VydGFpbiBleHRyYSBjb25maWcgcm9tCisgKiBlbnRyeS4gQXZhaWxhYmxlIGluIHRoZSBob3N0LT5jb25maWdfcm9tcyBtZW1iZXIuICovCisjZGVmaW5lIEhQU0JfQ09ORklHX1JPTV9FTlRSWV9JUDEzOTQJCTB4MDAwMDAwMDEKKworI2VuZGlmIC8qIF9JRUVFMTM5NF9DT05GSUdfUk9NU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2Nzci5jIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjk4Njg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuYwpAQCAtMCwwICsxLDg1NyBAQAorLyoKKyAqIElFRUUgMTM5NCBmb3IgTGludXgKKyAqCisgKiBDU1IgaW1wbGVtZW50YXRpb24sIGlzby9idXMgbWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQW5kcmVhcyBFLiBCb21iZQorICogICAgICAgICAgICAgICAyMDAyIE1hbmZyZWQgV2VpaHMgPHdlaWhzQGljdC50dXdpZW4uYWMuYXQ+CisgKgorICogVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgcm9vdAorICogZGlyZWN0b3J5IG9mIHRoZSBrZXJuZWwgc291cmNlcyBmb3IgZGV0YWlscy4KKyAqCisgKgorICogQ29udHJpYnV0aW9uczoKKyAqCisgKiBNYW5mcmVkIFdlaWhzIDx3ZWloc0BpY3QudHV3aWVuLmFjLmF0PgorICogICAgICAgIGNvbmZpZ3VyYXRpb24gUk9NIG1hbmlwdWxhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJjc3IxMjEyLmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfdHlwZXMuaCIKKyNpbmNsdWRlICJob3N0cy5oIgorI2luY2x1ZGUgImllZWUxMzk0LmgiCisjaW5jbHVkZSAiaGlnaGxldmVsLmgiCisKKy8qIE1vZHVsZSBQYXJhbWV0ZXJzICovCisvKiB0aGlzIG1vZHVsZSBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBtYXBwaW5nIG9mIHRoZSBGQ1AgcmVnaXN0ZXJzICovCisKK3N0YXRpYyBpbnQgZmNwID0gMTsKK21vZHVsZV9wYXJhbShmY3AsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZjcCwgIk1hcCBGQ1AgcmVnaXN0ZXJzIChkZWZhdWx0ID0gMSwgZGlzYWJsZSA9IDApLiIpOworCitzdGF0aWMgc3RydWN0IGNzcjEyMTJfa2V5dmFsICpub2RlX2NhcCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGFkZF9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOworc3RhdGljIHZvaWQgcmVtb3ZlX2hvc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBob3N0X3Jlc2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOworc3RhdGljIGludCByZWFkX21hcHMoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpidWZmZXIsCisJCSAgICAgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbCk7CitzdGF0aWMgaW50IHdyaXRlX2ZjcChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBpbnQgZGVzdCwKKwkJICAgICBxdWFkbGV0X3QgKmRhdGEsIHU2NCBhZGRyLCBzaXplX3QgbGVuZ3RoLCB1MTYgZmxhZ3MpOworc3RhdGljIGludCByZWFkX3JlZ3Moc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpidWYsCisJCSAgICAgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbGFncyk7CitzdGF0aWMgaW50IHdyaXRlX3JlZ3Moc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgaW50IGRlc3RpZCwKKwkJICAgICAgcXVhZGxldF90ICpkYXRhLCB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsYWdzKTsKK3N0YXRpYyBpbnQgbG9ja19yZWdzKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHF1YWRsZXRfdCAqc3RvcmUsCisJCSAgICAgdTY0IGFkZHIsIHF1YWRsZXRfdCBkYXRhLCBxdWFkbGV0X3QgYXJnLCBpbnQgZXh0Y29kZSwgdTE2IGZsKTsKK3N0YXRpYyBpbnQgbG9jazY0X3JlZ3Moc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgb2N0bGV0X3QgKiBzdG9yZSwKKwkJICAgICAgIHU2NCBhZGRyLCBvY3RsZXRfdCBkYXRhLCBvY3RsZXRfdCBhcmcsIGludCBleHRjb2RlLCB1MTYgZmwpOworc3RhdGljIGludCByZWFkX2NvbmZpZ19yb20oc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpidWZmZXIsCisJCQkgICB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsKTsKK3N0YXRpYyB1NjQgYWxsb2NhdGVfYWRkcl9yYW5nZSh1NjQgc2l6ZSwgdTMyIGFsaWdubWVudCwgdm9pZCAqX19ob3N0KTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYWRkcl9yYW5nZSh1NjQgYWRkciwgdm9pZCAqX19ob3N0KTsKKworc3RhdGljIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCBjc3JfaGlnaGxldmVsID0geworCS5uYW1lID0JCSJzdGFuZGFyZCByZWdpc3RlcnMiLAorCS5hZGRfaG9zdCA9CWFkZF9ob3N0LAorCS5yZW1vdmVfaG9zdCA9CXJlbW92ZV9ob3N0LAorCS5ob3N0X3Jlc2V0ID0JaG9zdF9yZXNldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBtYXBfb3BzID0geworCS5yZWFkID0gcmVhZF9tYXBzLAorfTsKKworc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGZjcF9vcHMgPSB7CisJLndyaXRlID0gd3JpdGVfZmNwLAorfTsKKworc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIHJlZ19vcHMgPSB7CisJLnJlYWQgPSByZWFkX3JlZ3MsCisJLndyaXRlID0gd3JpdGVfcmVncywKKwkubG9jayA9IGxvY2tfcmVncywKKwkubG9jazY0ID0gbG9jazY0X3JlZ3MsCit9OworCitzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgY29uZmlnX3JvbV9vcHMgPSB7CisJLnJlYWQgPSByZWFkX2NvbmZpZ19yb20sCit9OworCitzdHJ1Y3QgY3NyMTIxMl9idXNfb3BzIGNzcl9idXNfb3BzID0geworCS5hbGxvY2F0ZV9hZGRyX3JhbmdlID0JYWxsb2NhdGVfYWRkcl9yYW5nZSwKKwkucmVsZWFzZV9hZGRyID0JCXJlbGVhc2VfYWRkcl9yYW5nZSwKK307CisKKworc3RhdGljIHUxNiBjc3JfY3JjMTYodW5zaWduZWQgKmRhdGEsIGludCBsZW5ndGgpCit7CisgICAgICAgIGludCBjaGVjaz0wLCBpOworICAgICAgICBpbnQgc2hpZnQsIHN1bSwgbmV4dD0wOworCisgICAgICAgIGZvciAoaSA9IGxlbmd0aDsgaTsgaS0tKSB7CisgICAgICAgICAgICAgICAgZm9yIChuZXh0ID0gY2hlY2ssIHNoaWZ0ID0gMjg7IHNoaWZ0ID49IDA7IHNoaWZ0IC09IDQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAoKG5leHQgPj4gMTIpIF4gKGJlMzJfdG9fY3B1KCpkYXRhKSA+PiBzaGlmdCkpICYgMHhmOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IChuZXh0IDw8IDQpIF4gKHN1bSA8PCAxMikgXiAoc3VtIDw8IDUpIF4gKHN1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoZWNrID0gbmV4dCAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICBkYXRhKys7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2hlY2s7Cit9CisKK3N0YXRpYyB2b2lkIGhvc3RfcmVzZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKyAgICAgICAgaG9zdC0+Y3NyLnN0YXRlICY9IDB4MzAwOworCisgICAgICAgIGhvc3QtPmNzci5idXNfbWFuYWdlcl9pZCA9IDB4M2Y7CisgICAgICAgIGhvc3QtPmNzci5iYW5kd2lkdGhfYXZhaWxhYmxlID0gNDkxNTsKKwlob3N0LT5jc3IuY2hhbm5lbHNfYXZhaWxhYmxlX2hpID0gMHhmZmZmZmZmZTsJLyogcHJlLWFsbG9jIGNoIDMxIHBlciAxMzk0YS0yMDAwICovCisgICAgICAgIGhvc3QtPmNzci5jaGFubmVsc19hdmFpbGFibGVfbG8gPSB+MDsKKwlob3N0LT5jc3IuYnJvYWRjYXN0X2NoYW5uZWwgPSAweDgwMDAwMDAwIHwgMzE7CisKKwlpZiAoaG9zdC0+aXNfaXJtKSB7CisJCWlmIChob3N0LT5kcml2ZXItPmh3X2Nzcl9yZWcpIHsKKwkJCWhvc3QtPmRyaXZlci0+aHdfY3NyX3JlZyhob3N0LCAyLCAweGZmZmZmZmZlLCB+MCk7CisJCX0KKwl9CisKKyAgICAgICAgaG9zdC0+Y3NyLm5vZGVfaWRzID0gaG9zdC0+bm9kZV9pZCA8PCAxNjsKKworICAgICAgICBpZiAoIWhvc3QtPmlzX3Jvb3QpIHsKKyAgICAgICAgICAgICAgICAvKiBjbGVhciBjbXN0ciBiaXQgKi8KKyAgICAgICAgICAgICAgICBob3N0LT5jc3Iuc3RhdGUgJj0gfjB4MTAwOworICAgICAgICB9CisKKyAgICAgICAgaG9zdC0+Y3NyLnRvcG9sb2d5X21hcFsxXSA9CisgICAgICAgICAgICAgICAgY3B1X3RvX2JlMzIoYmUzMl90b19jcHUoaG9zdC0+Y3NyLnRvcG9sb2d5X21hcFsxXSkgKyAxKTsKKyAgICAgICAgaG9zdC0+Y3NyLnRvcG9sb2d5X21hcFsyXSA9IGNwdV90b19iZTMyKGhvc3QtPm5vZGVfY291bnQgPDwgMTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaG9zdC0+c2VsZmlkX2NvdW50KTsKKyAgICAgICAgaG9zdC0+Y3NyLnRvcG9sb2d5X21hcFswXSA9CisgICAgICAgICAgICAgICAgY3B1X3RvX2JlMzIoKGhvc3QtPnNlbGZpZF9jb3VudCArIDIpIDw8IDE2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjc3JfY3JjMTYoaG9zdC0+Y3NyLnRvcG9sb2d5X21hcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC0+c2VsZmlkX2NvdW50ICsgMikpOworCisgICAgICAgIGhvc3QtPmNzci5zcGVlZF9tYXBbMV0gPQorICAgICAgICAgICAgICAgIGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KGhvc3QtPmNzci5zcGVlZF9tYXBbMV0pICsgMSk7CisgICAgICAgIGhvc3QtPmNzci5zcGVlZF9tYXBbMF0gPSBjcHVfdG9fYmUzMigweDNmMSA8PCAxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjc3JfY3JjMTYoaG9zdC0+Y3NyLnNwZWVkX21hcCsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZjEpKTsKK30KKworLyoKKyAqIEhJID09IHNlY29uZHMgKGJpdHMgMDoyKQorICogTE8gPT0gZnJhY3Rpb24gdW5pdHMgb2YgMS84MDAwIG9mIGEgc2Vjb25kLCBhcyBwZXIgMTM5NCAoYml0cyAxOTozMSkKKyAqCisgKiBDb252ZXJ0IHRvIHVuaXRzIGFuZCB0aGVuIHRvIEhaLCBmb3IgY29tcGFyaXNvbiB0byBqaWZmaWVzLgorICoKKyAqIEJ5IGRlZmF1bHQgdGhpcyB3aWxsIGVuZCB1cCBiZWluZyA4MDAgdW5pdHMsIG9yIDEwMG1zICgxMjV1c2VjIHBlcgorICogdW5pdCkuCisgKgorICogTk9URTogVGhlIHNwZWMgc2F5cyAxLzgwMDAsIGJ1dCBhbHNvIHNheXMgd2UgY2FuIGNvbXB1dGUgYmFzZWQgb24gMS84MTkyCisgKiBsaWtlIENTUiBzcGVjaWZpZXMuIFNob3VsZCBtYWtlIG91ciBtYXRoIGxlc3MgY29tcGxleC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNhbGN1bGF0ZV9leHBpcmUoc3RydWN0IGNzcl9jb250cm9sICpjc3IpCit7CisJdW5zaWduZWQgbG9uZyB1bml0czsKKworCS8qIFRha2UgdGhlIHNlY29uZHMsIGFuZCBjb252ZXJ0IHRvIHVuaXRzICovCisJdW5pdHMgPSAodW5zaWduZWQgbG9uZykoY3NyLT5zcGxpdF90aW1lb3V0X2hpICYgMHgwNykgPDwgMTM7CisKKwkvKiBBZGQgaW4gdGhlIGZyYWN0aW9uYWwgdW5pdHMgKi8KKwl1bml0cyArPSAodW5zaWduZWQgbG9uZykoY3NyLT5zcGxpdF90aW1lb3V0X2xvID4+IDE5KTsKKworCS8qIENvbnZlcnQgdG8gamlmZmllcyAqLworCWNzci0+ZXhwaXJlID0gKHVuc2lnbmVkIGxvbmcpKHVuaXRzICogSFopID4+IDEzVUw7CisKKwkvKiBKdXN0IHRvIGtlZXAgZnJvbSByb3VuZGluZyBsb3cgKi8KKwljc3ItPmV4cGlyZSsrOworCisJSFBTQl9WRVJCT1NFKCJDU1I6IHNldHRpbmcgZXhwaXJlIHRvICVsdSwgSFo9JXUiLCBjc3ItPmV4cGlyZSwgSFopOworfQorCisKK3N0YXRpYyB2b2lkIGFkZF9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICpyb290OworCXF1YWRsZXRfdCBidXNfaW5mb1tDU1JfQlVTX0lORk9fU0laRV07CisKKwlocHNiX3JlZ2lzdGVyX2FkZHJzcGFjZSgmY3NyX2hpZ2hsZXZlbCwgaG9zdCwgJnJlZ19vcHMsCisJCQkJQ1NSX1JFR0lTVEVSX0JBU0UsCisJCQkJQ1NSX1JFR0lTVEVSX0JBU0UgKyBDU1JfQ09ORklHX1JPTSk7CisJaHBzYl9yZWdpc3Rlcl9hZGRyc3BhY2UoJmNzcl9oaWdobGV2ZWwsIGhvc3QsICZjb25maWdfcm9tX29wcywKKwkJCQlDU1JfUkVHSVNURVJfQkFTRSArIENTUl9DT05GSUdfUk9NLAorCQkJCUNTUl9SRUdJU1RFUl9CQVNFICsgQ1NSX0NPTkZJR19ST01fRU5EKTsKKwlpZiAoZmNwKSB7CisJCWhwc2JfcmVnaXN0ZXJfYWRkcnNwYWNlKCZjc3JfaGlnaGxldmVsLCBob3N0LCAmZmNwX29wcywKKwkJCQkJQ1NSX1JFR0lTVEVSX0JBU0UgKyBDU1JfRkNQX0NPTU1BTkQsCisJCQkJCUNTUl9SRUdJU1RFUl9CQVNFICsgQ1NSX0ZDUF9FTkQpOworCX0KKwlocHNiX3JlZ2lzdGVyX2FkZHJzcGFjZSgmY3NyX2hpZ2hsZXZlbCwgaG9zdCwgJm1hcF9vcHMsCisJCQkJQ1NSX1JFR0lTVEVSX0JBU0UgKyBDU1JfVE9QT0xPR1lfTUFQLAorCQkJCUNTUl9SRUdJU1RFUl9CQVNFICsgQ1NSX1RPUE9MT0dZX01BUF9FTkQpOworCWhwc2JfcmVnaXN0ZXJfYWRkcnNwYWNlKCZjc3JfaGlnaGxldmVsLCBob3N0LCAmbWFwX29wcywKKwkJCQlDU1JfUkVHSVNURVJfQkFTRSArIENTUl9TUEVFRF9NQVAsCisJCQkJQ1NSX1JFR0lTVEVSX0JBU0UgKyBDU1JfU1BFRURfTUFQX0VORCk7CisKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmNzci5sb2NrKTsKKworICAgICAgICBob3N0LT5jc3Iuc3RhdGUgICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgaG9zdC0+Y3NyLm5vZGVfaWRzICAgICAgICAgICAgICA9IDA7CisgICAgICAgIGhvc3QtPmNzci5zcGxpdF90aW1lb3V0X2hpICAgICAgPSAwOworICAgICAgICBob3N0LT5jc3Iuc3BsaXRfdGltZW91dF9sbyAgICAgID0gODAwIDw8IDE5OworCWNhbGN1bGF0ZV9leHBpcmUoJmhvc3QtPmNzcik7CisgICAgICAgIGhvc3QtPmNzci5jeWNsZV90aW1lICAgICAgICAgICAgPSAwOworICAgICAgICBob3N0LT5jc3IuYnVzX3RpbWUgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgaG9zdC0+Y3NyLmJ1c19tYW5hZ2VyX2lkICAgICAgICA9IDB4M2Y7CisgICAgICAgIGhvc3QtPmNzci5iYW5kd2lkdGhfYXZhaWxhYmxlICAgPSA0OTE1OworCWhvc3QtPmNzci5jaGFubmVsc19hdmFpbGFibGVfaGkgPSAweGZmZmZmZmZlOwkvKiBwcmUtYWxsb2MgY2ggMzEgcGVyIDEzOTRhLTIwMDAgKi8KKyAgICAgICAgaG9zdC0+Y3NyLmNoYW5uZWxzX2F2YWlsYWJsZV9sbyA9IH4wOworCWhvc3QtPmNzci5icm9hZGNhc3RfY2hhbm5lbCA9IDB4ODAwMDAwMDAgfCAzMTsKKworCWlmIChob3N0LT5pc19pcm0pIHsKKwkJaWYgKGhvc3QtPmRyaXZlci0+aHdfY3NyX3JlZykgeworCQkJaG9zdC0+ZHJpdmVyLT5od19jc3JfcmVnKGhvc3QsIDIsIDB4ZmZmZmZmZmUsIH4wKTsKKwkJfQorCX0KKworCWlmIChob3N0LT5jc3IubWF4X3JlYyA+PSA5KQorCQlob3N0LT5jc3IubWF4X3JvbSA9IDI7CisJZWxzZSBpZiAoaG9zdC0+Y3NyLm1heF9yZWMgPj0gNSkKKwkJaG9zdC0+Y3NyLm1heF9yb20gPSAxOworCWVsc2UKKwkJaG9zdC0+Y3NyLm1heF9yb20gPSAwOworCisJaG9zdC0+Y3NyLmdlbmVyYXRpb24gPSAyOworCisJYnVzX2luZm9bMV0gPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4MzEzMzM5MzQpOworCWJ1c19pbmZvWzJdID0gY3B1X3RvX2JlMzIoKDEgPDwgQ1NSX0lSTUNfU0hJRlQpIHwKKwkJCQkgICgxIDw8IENTUl9DTUNfU0hJRlQpIHwKKwkJCQkgICgxIDw8IENTUl9JU0NfU0hJRlQpIHwKKwkJCQkgICgwIDw8IENTUl9CTUNfU0hJRlQpIHwKKwkJCQkgICgwIDw8IENTUl9QTUNfU0hJRlQpIHwKKwkJCQkgIChob3N0LT5jc3IuY3ljX2Nsa19hY2MgPDwgQ1NSX0NZQ19DTEtfQUNDX1NISUZUKSB8CisJCQkJICAoaG9zdC0+Y3NyLm1heF9yZWMgPDwgQ1NSX01BWF9SRUNfU0hJRlQpIHwKKwkJCQkgIChob3N0LT5jc3IubWF4X3JvbSA8PCBDU1JfTUFYX1JPTV9TSElGVCkgfAorCQkJCSAgKGhvc3QtPmNzci5nZW5lcmF0aW9uIDw8IENTUl9HRU5FUkFUSU9OX1NISUZUKSB8CisJCQkJICBob3N0LT5jc3IubG5rX3NwZCk7CisKKwlidXNfaW5mb1szXSA9IGNwdV90b19iZTMyKGhvc3QtPmNzci5ndWlkX2hpKTsKKwlidXNfaW5mb1s0XSA9IGNwdV90b19iZTMyKGhvc3QtPmNzci5ndWlkX2xvKTsKKworCS8qIFRoZSBoYXJkd2FyZSBjb3B5IG9mIHRoZSBidXMgaW5mbyBibG9jayB3aWxsIGJlIHNldCBsYXRlciB3aGVuIGEKKwkgKiBidXMgcmVzZXQgaXMgaXNzdWVkLiAqLworCisJY3NyMTIxMl9pbml0X2xvY2FsX2Nzcihob3N0LT5jc3Iucm9tLCBidXNfaW5mbywgaG9zdC0+Y3NyLm1heF9yb20pOworCisJcm9vdCA9IGhvc3QtPmNzci5yb20tPnJvb3Rfa3Y7CisKKwlpZihjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KHJvb3QsIG5vZGVfY2FwKSAhPSBDU1IxMjEyX1NVQ0NFU1MpIHsKKwkJSFBTQl9FUlIoIkZhaWxlZCB0byBhdHRhY2ggTm9kZSBDYXBhYmlsaXRpZXMgdG8gcm9vdCBkaXJlY3RvcnkiKTsKKwl9CisKKwlob3N0LT51cGRhdGVfY29uZmlnX3JvbSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJcXVhZGxldF90IGJ1c19pbmZvW0NTUl9CVVNfSU5GT19TSVpFXTsKKworCWJ1c19pbmZvWzFdID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigweDMxMzMzOTM0KTsKKwlidXNfaW5mb1syXSA9IGNwdV90b19iZTMyKCgwIDw8IENTUl9JUk1DX1NISUZUKSB8CisJCQkJICAoMCA8PCBDU1JfQ01DX1NISUZUKSB8CisJCQkJICAoMCA8PCBDU1JfSVNDX1NISUZUKSB8CisJCQkJICAoMCA8PCBDU1JfQk1DX1NISUZUKSB8CisJCQkJICAoMCA8PCBDU1JfUE1DX1NISUZUKSB8CisJCQkJICAoaG9zdC0+Y3NyLmN5Y19jbGtfYWNjIDw8IENTUl9DWUNfQ0xLX0FDQ19TSElGVCkgfAorCQkJCSAgKGhvc3QtPmNzci5tYXhfcmVjIDw8IENTUl9NQVhfUkVDX1NISUZUKSB8CisJCQkJICAoMCA8PCBDU1JfTUFYX1JPTV9TSElGVCkgfAorCQkJCSAgKDAgPDwgQ1NSX0dFTkVSQVRJT05fU0hJRlQpIHwKKwkJCQkgIGhvc3QtPmNzci5sbmtfc3BkKTsKKworCWJ1c19pbmZvWzNdID0gY3B1X3RvX2JlMzIoaG9zdC0+Y3NyLmd1aWRfaGkpOworCWJ1c19pbmZvWzRdID0gY3B1X3RvX2JlMzIoaG9zdC0+Y3NyLmd1aWRfbG8pOworCisJY3NyMTIxMl9kZXRhY2hfa2V5dmFsX2Zyb21fZGlyZWN0b3J5KGhvc3QtPmNzci5yb20tPnJvb3Rfa3YsIG5vZGVfY2FwKTsKKworCWNzcjEyMTJfaW5pdF9sb2NhbF9jc3IoaG9zdC0+Y3NyLnJvbSwgYnVzX2luZm8sIDApOworCWhvc3QtPnVwZGF0ZV9jb25maWdfcm9tID0gMTsKK30KKworCitpbnQgaHBzYl91cGRhdGVfY29uZmlnX3JvbShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBjb25zdCBxdWFkbGV0X3QgKm5ld19yb20sCisJc2l6ZV90IGJ1ZmZlcnNpemUsIHVuc2lnbmVkIGNoYXIgcm9tX3ZlcnNpb24pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJSFBTQl9OT1RJQ0UoImhwc2JfdXBkYXRlX2NvbmZpZ19yb20oKSBpcyBkZXByZWNhdGVkIik7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmNzci5sb2NrLCBmbGFncyk7CisJaWYgKHJvbV92ZXJzaW9uICE9IGhvc3QtPmNzci5nZW5lcmF0aW9uKQorICAgICAgICAgICAgICAgIHJldCA9IC0xOworCWVsc2UgaWYgKGJ1ZmZlcnNpemUgPiBob3N0LT5jc3Iucm9tLT5jYWNoZV9oZWFkLT5zaXplKQorCQlyZXQgPSAtMjsKKyAgICAgICAgZWxzZSB7CisJCS8qIEp1c3Qgb3ZlcndyaXRlIHRoZSBnZW5lcmF0ZWQgQ29uZmlnUk9NIGltYWdlIHdpdGggbmV3IGRhdGEsCisJCSAqIGl0IGNhbiBiZSByZWdlbmVyYXRlZCBsYXRlci4gKi8KKwkJbWVtY3B5KGhvc3QtPmNzci5yb20tPmNhY2hlX2hlYWQtPmRhdGEsIG5ld19yb20sIGJ1ZmZlcnNpemUpOworCQlob3N0LT5jc3Iucm9tLT5jYWNoZV9oZWFkLT5sZW4gPSBidWZmZXJzaXplOworCisJCWlmIChob3N0LT5kcml2ZXItPnNldF9od19jb25maWdfcm9tKQorCQkJaG9zdC0+ZHJpdmVyLT5zZXRfaHdfY29uZmlnX3JvbShob3N0LCBob3N0LT5jc3Iucm9tLT5idXNfaW5mb19kYXRhKTsKKwkJLyogSW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIG51bWJlciB0byBrZWVwIHNvbWUgc29ydCBvZiBzeW5jCisJCSAqIHdpdGggdGhlIG5ld2VyIENvbmZpZ1JPTSBtYW5pcHVsYXRpb24gbWV0aG9kLiAqLworCQlob3N0LT5jc3IuZ2VuZXJhdGlvbisrOworCQlpZiAoaG9zdC0+Y3NyLmdlbmVyYXRpb24gPiAweGYgfHwgaG9zdC0+Y3NyLmdlbmVyYXRpb24gPCAyKQorCQkJaG9zdC0+Y3NyLmdlbmVyYXRpb24gPSAyOworCQlyZXQ9MDsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5jc3IubG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gcmV0OworfQorCisKKy8qIFJlYWQgdG9wb2xvZ3kgLyBzcGVlZCBtYXBzIGFuZCBjb25maWd1cmF0aW9uIFJPTSAqLworc3RhdGljIGludCByZWFkX21hcHMoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGludCBjc3JhZGRyID0gYWRkciAtIENTUl9SRUdJU1RFUl9CQVNFOworICAgICAgICBjb25zdCBjaGFyICpzcmM7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmNzci5sb2NrLCBmbGFncyk7CisKKwlpZiAoY3NyYWRkciA8IENTUl9TUEVFRF9NQVApIHsKKyAgICAgICAgICAgICAgICBzcmMgPSAoKGNoYXIgKilob3N0LT5jc3IudG9wb2xvZ3lfbWFwKSArIGNzcmFkZHIKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gQ1NSX1RPUE9MT0dZX01BUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcmMgPSAoKGNoYXIgKilob3N0LT5jc3Iuc3BlZWRfbWFwKSArIGNzcmFkZHIgLSBDU1JfU1BFRURfTUFQOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciwgc3JjLCBsZW5ndGgpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5jc3IubG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gUkNPREVfQ09NUExFVEU7Cit9CisKKworI2RlZmluZSBvdXQgaWYgKC0tbGVuZ3RoID09IDApIGJyZWFrCisKK3N0YXRpYyBpbnQgcmVhZF9yZWdzKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHF1YWRsZXRfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbGFncykKK3sKKyAgICAgICAgaW50IGNzcmFkZHIgPSBhZGRyIC0gQ1NSX1JFR0lTVEVSX0JBU0U7CisgICAgICAgIGludCBvbGRjeWNsZTsKKyAgICAgICAgcXVhZGxldF90IHJldDsKKworICAgICAgICBpZiAoKGNzcmFkZHIgfCBsZW5ndGgpICYgMHgzKQorICAgICAgICAgICAgICAgIHJldHVybiBSQ09ERV9UWVBFX0VSUk9SOworCisgICAgICAgIGxlbmd0aCAvPSA0OworCisgICAgICAgIHN3aXRjaCAoY3NyYWRkcikgeworICAgICAgICBjYXNlIENTUl9TVEFURV9DTEVBUjoKKyAgICAgICAgICAgICAgICAqKGJ1ZisrKSA9IGNwdV90b19iZTMyKGhvc3QtPmNzci5zdGF0ZSk7CisgICAgICAgICAgICAgICAgb3V0OworICAgICAgICBjYXNlIENTUl9TVEFURV9TRVQ6CisgICAgICAgICAgICAgICAgKihidWYrKykgPSBjcHVfdG9fYmUzMihob3N0LT5jc3Iuc3RhdGUpOworICAgICAgICAgICAgICAgIG91dDsKKyAgICAgICAgY2FzZSBDU1JfTk9ERV9JRFM6CisgICAgICAgICAgICAgICAgKihidWYrKykgPSBjcHVfdG9fYmUzMihob3N0LT5jc3Iubm9kZV9pZHMpOworICAgICAgICAgICAgICAgIG91dDsKKworICAgICAgICBjYXNlIENTUl9SRVNFVF9TVEFSVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUkNPREVfVFlQRV9FUlJPUjsKKworICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZ2FwIC0gaGFuZGxlZCBieSBkZWZhdWx0IGJlbG93ICovCisKKyAgICAgICAgY2FzZSBDU1JfU1BMSVRfVElNRU9VVF9ISToKKyAgICAgICAgICAgICAgICAqKGJ1ZisrKSA9IGNwdV90b19iZTMyKGhvc3QtPmNzci5zcGxpdF90aW1lb3V0X2hpKTsKKyAgICAgICAgICAgICAgICBvdXQ7CisgICAgICAgIGNhc2UgQ1NSX1NQTElUX1RJTUVPVVRfTE86CisgICAgICAgICAgICAgICAgKihidWYrKykgPSBjcHVfdG9fYmUzMihob3N0LT5jc3Iuc3BsaXRfdGltZW91dF9sbyk7CisgICAgICAgICAgICAgICAgb3V0OworCisgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBnYXAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gUkNPREVfQUREUkVTU19FUlJPUjsKKworICAgICAgICBjYXNlIENTUl9DWUNMRV9USU1FOgorICAgICAgICAgICAgICAgIG9sZGN5Y2xlID0gaG9zdC0+Y3NyLmN5Y2xlX3RpbWU7CisgICAgICAgICAgICAgICAgaG9zdC0+Y3NyLmN5Y2xlX3RpbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC0+ZHJpdmVyLT5kZXZjdGwoaG9zdCwgR0VUX0NZQ0xFX0NPVU5URVIsIDApOworCisgICAgICAgICAgICAgICAgaWYgKG9sZGN5Y2xlID4gaG9zdC0+Y3NyLmN5Y2xlX3RpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN5Y2xlIHRpbWUgd3JhcHBlZCBhcm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QtPmNzci5idXNfdGltZSArPSAxIDw8IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICooYnVmKyspID0gY3B1X3RvX2JlMzIoaG9zdC0+Y3NyLmN5Y2xlX3RpbWUpOworICAgICAgICAgICAgICAgIG91dDsKKyAgICAgICAgY2FzZSBDU1JfQlVTX1RJTUU6CisgICAgICAgICAgICAgICAgb2xkY3ljbGUgPSBob3N0LT5jc3IuY3ljbGVfdGltZTsKKyAgICAgICAgICAgICAgICBob3N0LT5jc3IuY3ljbGVfdGltZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBob3N0LT5kcml2ZXItPmRldmN0bChob3N0LCBHRVRfQ1lDTEVfQ09VTlRFUiwgMCk7CisKKyAgICAgICAgICAgICAgICBpZiAob2xkY3ljbGUgPiBob3N0LT5jc3IuY3ljbGVfdGltZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogY3ljbGUgdGltZSB3cmFwcGVkIGFyb3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC0+Y3NyLmJ1c190aW1lICs9ICgxIDw8IDcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqKGJ1ZisrKSA9IGNwdV90b19iZTMyKGhvc3QtPmNzci5idXNfdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoaG9zdC0+Y3NyLmN5Y2xlX3RpbWUgPj4gMjUpKTsKKyAgICAgICAgICAgICAgICBvdXQ7CisKKyAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGdhcCAqLworICAgICAgICAgICAgICAgIHJldHVybiBSQ09ERV9BRERSRVNTX0VSUk9SOworCisgICAgICAgIGNhc2UgQ1NSX0JVU1lfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAvKiBub3QgeWV0IGltcGxlbWVudGVkICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CisKKyAgICAgICAgY2FzZSBDU1JfQlVTX01BTkFHRVJfSUQ6CisgICAgICAgICAgICAgICAgaWYgKGhvc3QtPmRyaXZlci0+aHdfY3NyX3JlZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGhvc3QtPmRyaXZlci0+aHdfY3NyX3JlZyhob3N0LCAwLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBob3N0LT5jc3IuYnVzX21hbmFnZXJfaWQ7CisKKyAgICAgICAgICAgICAgICAqKGJ1ZisrKSA9IGNwdV90b19iZTMyKHJldCk7CisgICAgICAgICAgICAgICAgb3V0OworICAgICAgICBjYXNlIENTUl9CQU5EV0lEVEhfQVZBSUxBQkxFOgorICAgICAgICAgICAgICAgIGlmIChob3N0LT5kcml2ZXItPmh3X2Nzcl9yZWcpCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBob3N0LT5kcml2ZXItPmh3X2Nzcl9yZWcoaG9zdCwgMSwgMCwgMCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaG9zdC0+Y3NyLmJhbmR3aWR0aF9hdmFpbGFibGU7CisKKyAgICAgICAgICAgICAgICAqKGJ1ZisrKSA9IGNwdV90b19iZTMyKHJldCk7CisgICAgICAgICAgICAgICAgb3V0OworICAgICAgICBjYXNlIENTUl9DSEFOTkVMU19BVkFJTEFCTEVfSEk6CisgICAgICAgICAgICAgICAgaWYgKGhvc3QtPmRyaXZlci0+aHdfY3NyX3JlZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGhvc3QtPmRyaXZlci0+aHdfY3NyX3JlZyhob3N0LCAyLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBob3N0LT5jc3IuY2hhbm5lbHNfYXZhaWxhYmxlX2hpOworCisgICAgICAgICAgICAgICAgKihidWYrKykgPSBjcHVfdG9fYmUzMihyZXQpOworICAgICAgICAgICAgICAgIG91dDsKKyAgICAgICAgY2FzZSBDU1JfQ0hBTk5FTFNfQVZBSUxBQkxFX0xPOgorICAgICAgICAgICAgICAgIGlmIChob3N0LT5kcml2ZXItPmh3X2Nzcl9yZWcpCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBob3N0LT5kcml2ZXItPmh3X2Nzcl9yZWcoaG9zdCwgMywgMCwgMCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaG9zdC0+Y3NyLmNoYW5uZWxzX2F2YWlsYWJsZV9sbzsKKworICAgICAgICAgICAgICAgICooYnVmKyspID0gY3B1X3RvX2JlMzIocmV0KTsKKyAgICAgICAgICAgICAgICBvdXQ7CisKKwljYXNlIENTUl9CUk9BRENBU1RfQ0hBTk5FTDoKKwkJKihidWYrKykgPSBjcHVfdG9fYmUzMihob3N0LT5jc3IuYnJvYWRjYXN0X2NoYW5uZWwpOworCQlvdXQ7CisKKyAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGdhcCB0byBlbmQgLSBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBSQ09ERV9BRERSRVNTX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFJDT0RFX0NPTVBMRVRFOworfQorCitzdGF0aWMgaW50IHdyaXRlX3JlZ3Moc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgaW50IGRlc3RpZCwKKwkJICAgICAgcXVhZGxldF90ICpkYXRhLCB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsYWdzKQoreworICAgICAgICBpbnQgY3NyYWRkciA9IGFkZHIgLSBDU1JfUkVHSVNURVJfQkFTRTsKKworICAgICAgICBpZiAoKGNzcmFkZHIgfCBsZW5ndGgpICYgMHgzKQorICAgICAgICAgICAgICAgIHJldHVybiBSQ09ERV9UWVBFX0VSUk9SOworCisgICAgICAgIGxlbmd0aCAvPSA0OworCisgICAgICAgIHN3aXRjaCAoY3NyYWRkcikgeworICAgICAgICBjYXNlIENTUl9TVEFURV9DTEVBUjoKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSBGSVhNRSBGSVhNRSAqLworICAgICAgICAgICAgICAgIHByaW50aygiZG9oLCBzb21lb25lIHdhbnRzIHRvIG1lc3Mgd2l0aCBzdGF0ZSBjbGVhclxuIik7CisgICAgICAgICAgICAgICAgb3V0OworICAgICAgICBjYXNlIENTUl9TVEFURV9TRVQ6CisgICAgICAgICAgICAgICAgcHJpbnRrKCJkb2gsIHNvbWVvbmUgd2FudHMgdG8gbWVzcyB3aXRoIHN0YXRlIHNldFxuIik7CisgICAgICAgICAgICAgICAgb3V0OworCisgICAgICAgIGNhc2UgQ1NSX05PREVfSURTOgorICAgICAgICAgICAgICAgIGhvc3QtPmNzci5ub2RlX2lkcyAmPSBOT0RFX01BU0sgPDwgMTY7CisgICAgICAgICAgICAgICAgaG9zdC0+Y3NyLm5vZGVfaWRzIHw9IGJlMzJfdG9fY3B1KCooZGF0YSsrKSkgJiAoQlVTX01BU0sgPDwgMTYpOworICAgICAgICAgICAgICAgIGhvc3QtPm5vZGVfaWQgPSBob3N0LT5jc3Iubm9kZV9pZHMgPj4gMTY7CisgICAgICAgICAgICAgICAgaG9zdC0+ZHJpdmVyLT5kZXZjdGwoaG9zdCwgU0VUX0JVU19JRCwgaG9zdC0+bm9kZV9pZCA+PiA2KTsKKyAgICAgICAgICAgICAgICBvdXQ7CisKKyAgICAgICAgY2FzZSBDU1JfUkVTRVRfU1RBUlQ6CisgICAgICAgICAgICAgICAgLyogRklYTUUgLSBwZXJmb3JtIGNvbW1hbmQgcmVzZXQgKi8KKyAgICAgICAgICAgICAgICBvdXQ7CisKKyAgICAgICAgICAgICAgICAvKiBhZGRyZXNzIGdhcCAqLworICAgICAgICAgICAgICAgIHJldHVybiBSQ09ERV9BRERSRVNTX0VSUk9SOworCisgICAgICAgIGNhc2UgQ1NSX1NQTElUX1RJTUVPVVRfSEk6CisgICAgICAgICAgICAgICAgaG9zdC0+Y3NyLnNwbGl0X3RpbWVvdXRfaGkgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmUzMl90b19jcHUoKihkYXRhKyspKSAmIDB4MDAwMDAwMDc7CisJCWNhbGN1bGF0ZV9leHBpcmUoJmhvc3QtPmNzcik7CisgICAgICAgICAgICAgICAgb3V0OworICAgICAgICBjYXNlIENTUl9TUExJVF9USU1FT1VUX0xPOgorICAgICAgICAgICAgICAgIGhvc3QtPmNzci5zcGxpdF90aW1lb3V0X2xvID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJlMzJfdG9fY3B1KCooZGF0YSsrKSkgJiAweGZmZjgwMDAwOworCQljYWxjdWxhdGVfZXhwaXJlKCZob3N0LT5jc3IpOworICAgICAgICAgICAgICAgIG91dDsKKworICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZ2FwICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CisKKyAgICAgICAgY2FzZSBDU1JfQ1lDTEVfVElNRToKKyAgICAgICAgICAgICAgICAvKiBzaG91bGQgb25seSBiZSBzZXQgYnkgY3ljbGUgc3RhcnQgcGFja2V0LCBhdXRvbWF0aWNhbGx5ICovCisgICAgICAgICAgICAgICAgaG9zdC0+Y3NyLmN5Y2xlX3RpbWUgPSBiZTMyX3RvX2NwdSgqZGF0YSk7CisgICAgICAgICAgICAgICAgaG9zdC0+ZHJpdmVyLT5kZXZjdGwoaG9zdCwgU0VUX0NZQ0xFX0NPVU5URVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZTMyX3RvX2NwdSgqKGRhdGErKykpKTsKKyAgICAgICAgICAgICAgICBvdXQ7CisgICAgICAgIGNhc2UgQ1NSX0JVU19USU1FOgorICAgICAgICAgICAgICAgIGhvc3QtPmNzci5idXNfdGltZSA9IGJlMzJfdG9fY3B1KCooZGF0YSsrKSkgJiAweGZmZmZmZjgwOworICAgICAgICAgICAgICAgIG91dDsKKworICAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgZ2FwICovCisgICAgICAgICAgICAgICAgcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CisKKyAgICAgICAgY2FzZSBDU1JfQlVTWV9USU1FT1VUOgorICAgICAgICAgICAgICAgIC8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gUkNPREVfQUREUkVTU19FUlJPUjsKKworICAgICAgICBjYXNlIENTUl9CVVNfTUFOQUdFUl9JRDoKKyAgICAgICAgY2FzZSBDU1JfQkFORFdJRFRIX0FWQUlMQUJMRToKKyAgICAgICAgY2FzZSBDU1JfQ0hBTk5FTFNfQVZBSUxBQkxFX0hJOgorICAgICAgICBjYXNlIENTUl9DSEFOTkVMU19BVkFJTEFCTEVfTE86CisgICAgICAgICAgICAgICAgLyogdGhlc2UgYXJlIG5vdCB3cml0YWJsZSwgb25seSBsb2NrYWJsZSAqLworICAgICAgICAgICAgICAgIHJldHVybiBSQ09ERV9UWVBFX0VSUk9SOworCisJY2FzZSBDU1JfQlJPQURDQVNUX0NIQU5ORUw6CisJCS8qIG9ubHkgdGhlIHZhbGlkIGJpdCBjYW4gYmUgd3JpdHRlbiAqLworCQlob3N0LT5jc3IuYnJvYWRjYXN0X2NoYW5uZWwgPSAoaG9zdC0+Y3NyLmJyb2FkY2FzdF9jaGFubmVsICYgfjB4NDAwMDAwMDApCisgICAgICAgICAgICAgICAgICAgICAgICB8IChiZTMyX3RvX2NwdSgqZGF0YSkgJiAweDQwMDAwMDAwKTsKKwkJb3V0OworCisgICAgICAgICAgICAgICAgLyogYWRkcmVzcyBnYXAgdG8gZW5kIC0gZmFsbCB0aHJvdWdoICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUkNPREVfQ09NUExFVEU7Cit9CisKKyN1bmRlZiBvdXQKKworCitzdGF0aWMgaW50IGxvY2tfcmVncyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBxdWFkbGV0X3QgKnN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgdTY0IGFkZHIsIHF1YWRsZXRfdCBkYXRhLCBxdWFkbGV0X3QgYXJnLCBpbnQgZXh0Y29kZSwgdTE2IGZsKQoreworICAgICAgICBpbnQgY3NyYWRkciA9IGFkZHIgLSBDU1JfUkVHSVNURVJfQkFTRTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgcXVhZGxldF90ICpyZWdwdHIgPSBOVUxMOworCisgICAgICAgIGlmIChjc3JhZGRyICYgMHgzKQorCQlyZXR1cm4gUkNPREVfVFlQRV9FUlJPUjsKKworICAgICAgICBpZiAoY3NyYWRkciA8IENTUl9CVVNfTUFOQUdFUl9JRCB8fCBjc3JhZGRyID4gQ1NSX0NIQU5ORUxTX0FWQUlMQUJMRV9MTworICAgICAgICAgICAgfHwgZXh0Y29kZSAhPSBFWFRDT0RFX0NPTVBBUkVfU1dBUCkKKyAgICAgICAgICAgICAgICBnb3RvIHVuc3VwcG9ydGVkX2xvY2tyZXE7CisKKyAgICAgICAgZGF0YSA9IGJlMzJfdG9fY3B1KGRhdGEpOworICAgICAgICBhcmcgPSBiZTMyX3RvX2NwdShhcmcpOworCisJLyogSXMgc29tZWJvZHkgcmVsZWFzaW5nIHRoZSBicm9hZGNhc3RfY2hhbm5lbCBvbiB1cz8gKi8KKwlpZiAoY3NyYWRkciA9PSBDU1JfQ0hBTk5FTFNfQVZBSUxBQkxFX0hJICYmIChkYXRhICYgMHgxKSkgeworCQkvKiBOb3RlOiB0aGlzIGlzIG1heSBub3QgYmUgdGhlIHJpZ2h0IHdheSB0byBoYW5kbGUKKwkJICogdGhlIHByb2JsZW0sIHNvIHdlIHNob3VsZCBsb29rIGludG8gdGhlIHByb3BlciB3YXkKKwkJICogZXZlbnR1YWxseS4gKi8KKwkJSFBTQl9XQVJOKCJOb2RlIFsiIE5PREVfQlVTX0ZNVCAiXSB3YW50cyB0byByZWxlYXNlICIKKwkJCSAgImJyb2FkY2FzdCBjaGFubmVsIDMxLiAgSWdub3JpbmcuIiwKKwkJCSAgTk9ERV9CVVNfQVJHUyhob3N0LCBub2RlaWQpKTsKKworCQlkYXRhICY9IH4weDE7CS8qIGtlZXAgYnJvYWRjYXN0IGNoYW5uZWwgYWxsb2NhdGVkICovCisJfQorCisgICAgICAgIGlmIChob3N0LT5kcml2ZXItPmh3X2Nzcl9yZWcpIHsKKyAgICAgICAgICAgICAgICBxdWFkbGV0X3Qgb2xkOworCisgICAgICAgICAgICAgICAgb2xkID0gaG9zdC0+ZHJpdmVyLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGh3X2Nzcl9yZWcoaG9zdCwgKGNzcmFkZHIgLSBDU1JfQlVTX01BTkFHRVJfSUQpID4+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGFyZyk7CisKKyAgICAgICAgICAgICAgICAqc3RvcmUgPSBjcHVfdG9fYmUzMihvbGQpOworICAgICAgICAgICAgICAgIHJldHVybiBSQ09ERV9DT01QTEVURTsKKyAgICAgICAgfQorCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5jc3IubG9jaywgZmxhZ3MpOworCisgICAgICAgIHN3aXRjaCAoY3NyYWRkcikgeworICAgICAgICBjYXNlIENTUl9CVVNfTUFOQUdFUl9JRDoKKyAgICAgICAgICAgICAgICByZWdwdHIgPSAmaG9zdC0+Y3NyLmJ1c19tYW5hZ2VyX2lkOworCQkqc3RvcmUgPSBjcHVfdG9fYmUzMigqcmVncHRyKTsKKwkJaWYgKCpyZWdwdHIgPT0gYXJnKQorCQkJKnJlZ3B0ciA9IGRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDU1JfQkFORFdJRFRIX0FWQUlMQUJMRToKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHF1YWRsZXRfdCBiYW5kd2lkdGg7CisgICAgICAgICAgICAgICAgcXVhZGxldF90IG9sZDsKKyAgICAgICAgICAgICAgICBxdWFkbGV0X3QgbmV3OworCisgICAgICAgICAgICAgICAgcmVncHRyID0gJmhvc3QtPmNzci5iYW5kd2lkdGhfYXZhaWxhYmxlOworICAgICAgICAgICAgICAgIG9sZCA9ICpyZWdwdHI7CisKKyAgICAgICAgICAgICAgICAvKiBiYW5kd2lkdGggYXZhaWxhYmxlIGFsZ29yaXRobSBhZGFwdGVkIGZyb20gSUVFRSAxMzk0YS0yMDAwIHNwZWMgKi8KKyAgICAgICAgICAgICAgICBpZiAoYXJnID4gMHgxZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqc3RvcmUgPSBjcHVfdG9fYmUzMihvbGQpOwkvKiBjaGFuZ2Ugbm90aGluZyAqLworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRhdGEgJj0gMHgxZmZmOworICAgICAgICAgICAgICAgIGlmIChhcmcgPj0gZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgYmFuZHdpZHRoICovCisgICAgICAgICAgICAgICAgICAgICAgICBiYW5kd2lkdGggPSBhcmcgLSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZCA+PSBiYW5kd2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ID0gb2xkIC0gYmFuZHdpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RvcmUgPSBjcHVfdG9fYmUzMihhcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVncHRyID0gbmV3OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0b3JlID0gY3B1X3RvX2JlMzIob2xkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVhbGxvY2F0ZSBiYW5kd2lkdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aCA9IGRhdGEgLSBhcmc7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkICsgYmFuZHdpZHRoIDwgMHgyMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyA9IG9sZCArIGJhbmR3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0b3JlID0gY3B1X3RvX2JlMzIoYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ3B0ciA9IG5ldzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdG9yZSA9IGNwdV90b19iZTMyKG9sZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDU1JfQ0hBTk5FTFNfQVZBSUxBQkxFX0hJOgorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTG9jayBhbGdvcml0aG0gZm9yIENIQU5ORUxTX0FWQUlMQUJMRSBhcyByZWNvbW1lbmRlZCBieSAxMzk0YS0yMDAwICovCisgICAgICAgICAgICAgICAgcXVhZGxldF90IGFmZmVjdGVkX2NoYW5uZWxzID0gYXJnIF4gZGF0YTsKKworICAgICAgICAgICAgICAgIHJlZ3B0ciA9ICZob3N0LT5jc3IuY2hhbm5lbHNfYXZhaWxhYmxlX2hpOworCisgICAgICAgICAgICAgICAgaWYgKChhcmcgJiBhZmZlY3RlZF9jaGFubmVscykgPT0gKCpyZWdwdHIgJiBhZmZlY3RlZF9jaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZWdwdHIgXj0gYWZmZWN0ZWRfY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgICAgICAqc3RvcmUgPSBjcHVfdG9fYmUzMihhcmcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqc3RvcmUgPSBjcHVfdG9fYmUzMigqcmVncHRyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQ1NSX0NIQU5ORUxTX0FWQUlMQUJMRV9MTzoKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExvY2sgYWxnb3JpdGhtIGZvciBDSEFOTkVMU19BVkFJTEFCTEUgYXMgcmVjb21tZW5kZWQgYnkgMTM5NGEtMjAwMCAqLworICAgICAgICAgICAgICAgIHF1YWRsZXRfdCBhZmZlY3RlZF9jaGFubmVscyA9IGFyZyBeIGRhdGE7CisKKyAgICAgICAgICAgICAgICByZWdwdHIgPSAmaG9zdC0+Y3NyLmNoYW5uZWxzX2F2YWlsYWJsZV9sbzsKKworICAgICAgICAgICAgICAgIGlmICgoYXJnICYgYWZmZWN0ZWRfY2hhbm5lbHMpID09ICgqcmVncHRyICYgYWZmZWN0ZWRfY2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcmVncHRyIF49IGFmZmVjdGVkX2NoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICAgICAgKnN0b3JlID0gY3B1X3RvX2JlMzIoYXJnKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKnN0b3JlID0gY3B1X3RvX2JlMzIoKnJlZ3B0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5jc3IubG9jaywgZmxhZ3MpOworCisgICAgICAgIHJldHVybiBSQ09ERV9DT01QTEVURTsKKworIHVuc3VwcG9ydGVkX2xvY2tyZXE6CisgICAgICAgIHN3aXRjaCAoY3NyYWRkcikgeworICAgICAgICBjYXNlIENTUl9TVEFURV9DTEVBUjoKKyAgICAgICAgY2FzZSBDU1JfU1RBVEVfU0VUOgorICAgICAgICBjYXNlIENTUl9SRVNFVF9TVEFSVDoKKyAgICAgICAgY2FzZSBDU1JfTk9ERV9JRFM6CisgICAgICAgIGNhc2UgQ1NSX1NQTElUX1RJTUVPVVRfSEk6CisgICAgICAgIGNhc2UgQ1NSX1NQTElUX1RJTUVPVVRfTE86CisgICAgICAgIGNhc2UgQ1NSX0NZQ0xFX1RJTUU6CisgICAgICAgIGNhc2UgQ1NSX0JVU19USU1FOgorCWNhc2UgQ1NSX0JST0FEQ0FTVF9DSEFOTkVMOgorICAgICAgICAgICAgICAgIHJldHVybiBSQ09ERV9UWVBFX0VSUk9SOworCisgICAgICAgIGNhc2UgQ1NSX0JVU1lfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAvKiBub3QgeWV0IGltcGxlbWVudGVkIC0gZmFsbCB0aHJvdWdoICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBsb2NrNjRfcmVncyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBvY3RsZXRfdCAqIHN0b3JlLAorCQkgICAgICAgdTY0IGFkZHIsIG9jdGxldF90IGRhdGEsIG9jdGxldF90IGFyZywgaW50IGV4dGNvZGUsIHUxNiBmbCkKK3sKKwlpbnQgY3NyYWRkciA9IGFkZHIgLSBDU1JfUkVHSVNURVJfQkFTRTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGF0YSA9IGJlNjRfdG9fY3B1KGRhdGEpOworCWFyZyA9IGJlNjRfdG9fY3B1KGFyZyk7CisKKwlpZiAoY3NyYWRkciAmIDB4MykKKwkJcmV0dXJuIFJDT0RFX1RZUEVfRVJST1I7CisKKwlpZiAoY3NyYWRkciAhPSBDU1JfQ0hBTk5FTFNfQVZBSUxBQkxFCisJICAgIHx8IGV4dGNvZGUgIT0gRVhUQ09ERV9DT01QQVJFX1NXQVApCisJCWdvdG8gdW5zdXBwb3J0ZWRfbG9jazY0cmVxOworCisJLyogSXMgc29tZWJvZHkgcmVsZWFzaW5nIHRoZSBicm9hZGNhc3RfY2hhbm5lbCBvbiB1cz8gKi8KKwlpZiAoY3NyYWRkciA9PSBDU1JfQ0hBTk5FTFNfQVZBSUxBQkxFX0hJICYmIChkYXRhICYgMHgxMDAwMDAwMDBVTEwpKSB7CisJCS8qIE5vdGU6IHRoaXMgaXMgbWF5IG5vdCBiZSB0aGUgcmlnaHQgd2F5IHRvIGhhbmRsZQorCQkgKiB0aGUgcHJvYmxlbSwgc28gd2Ugc2hvdWxkIGxvb2sgaW50byB0aGUgcHJvcGVyIHdheQorICAgICAgICAgICAgICAgICAqIGV2ZW50dWFsbHkuICovCisJCUhQU0JfV0FSTigiTm9kZSBbIiBOT0RFX0JVU19GTVQgIl0gd2FudHMgdG8gcmVsZWFzZSAiCisJCQkgICJicm9hZGNhc3QgY2hhbm5lbCAzMS4gIElnbm9yaW5nLiIsCisJCQkgIE5PREVfQlVTX0FSR1MoaG9zdCwgbm9kZWlkKSk7CisKKwkJZGF0YSAmPSB+MHgxMDAwMDAwMDBVTEw7CS8qIGtlZXAgYnJvYWRjYXN0IGNoYW5uZWwgYWxsb2NhdGVkICovCisJfQorCisJaWYgKGhvc3QtPmRyaXZlci0+aHdfY3NyX3JlZykgeworCQlxdWFkbGV0X3QgZGF0YV9oaSwgZGF0YV9sbzsKKwkJcXVhZGxldF90IGFyZ19oaSwgYXJnX2xvOworCQlxdWFkbGV0X3Qgb2xkX2hpLCBvbGRfbG87CisKKwkJZGF0YV9oaSA9IGRhdGEgPj4gMzI7CisJCWRhdGFfbG8gPSBkYXRhICYgMHhGRkZGRkZGRjsKKwkJYXJnX2hpID0gYXJnID4+IDMyOworCQlhcmdfbG8gPSBhcmcgJiAweEZGRkZGRkZGOworCisJCW9sZF9oaSA9IGhvc3QtPmRyaXZlci0+aHdfY3NyX3JlZyhob3N0LCAoY3NyYWRkciAtIENTUl9CVVNfTUFOQUdFUl9JRCkgPj4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9oaSwgYXJnX2hpKTsKKworCQlvbGRfbG8gPSBob3N0LT5kcml2ZXItPmh3X2Nzcl9yZWcoaG9zdCwgKChjc3JhZGRyICsgNCkgLSBDU1JfQlVTX01BTkFHRVJfSUQpID4+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfbG8sIGFyZ19sbyk7CisKKwkJKnN0b3JlID0gY3B1X3RvX2JlNjQoKChvY3RsZXRfdClvbGRfaGkgPDwgMzIpIHwgb2xkX2xvKTsKKwl9IGVsc2UgeworCQlvY3RsZXRfdCBvbGQ7CisJCW9jdGxldF90IGFmZmVjdGVkX2NoYW5uZWxzID0gYXJnIF4gZGF0YTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+Y3NyLmxvY2ssIGZsYWdzKTsKKworCQlvbGQgPSAoKG9jdGxldF90KWhvc3QtPmNzci5jaGFubmVsc19hdmFpbGFibGVfaGkgPDwgMzIpIHwgaG9zdC0+Y3NyLmNoYW5uZWxzX2F2YWlsYWJsZV9sbzsKKworCQlpZiAoKGFyZyAmIGFmZmVjdGVkX2NoYW5uZWxzKSA9PSAob2xkICYgYWZmZWN0ZWRfY2hhbm5lbHMpKSB7CisJCQlob3N0LT5jc3IuY2hhbm5lbHNfYXZhaWxhYmxlX2hpIF49IChhZmZlY3RlZF9jaGFubmVscyA+PiAzMik7CisJCQlob3N0LT5jc3IuY2hhbm5lbHNfYXZhaWxhYmxlX2xvIF49IChhZmZlY3RlZF9jaGFubmVscyAmIDB4ZmZmZmZmZmYpOworCQkJKnN0b3JlID0gY3B1X3RvX2JlNjQoYXJnKTsKKwkJfSBlbHNlIHsKKwkJCSpzdG9yZSA9IGNwdV90b19iZTY0KG9sZCk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5jc3IubG9jaywgZmxhZ3MpOworCX0KKworCS8qIElzIHNvbWVib2R5IGVycm9uZW91c2x5IHJlbGVhc2luZyB0aGUgYnJvYWRjYXN0X2NoYW5uZWwgb24gdXM/ICovCisJaWYgKGhvc3QtPmNzci5jaGFubmVsc19hdmFpbGFibGVfaGkgJiAweDEpCisJCWhvc3QtPmNzci5jaGFubmVsc19hdmFpbGFibGVfaGkgJj0gfjB4MTsKKworCXJldHVybiBSQ09ERV9DT01QTEVURTsKKworIHVuc3VwcG9ydGVkX2xvY2s2NHJlcToKKwlzd2l0Y2ggKGNzcmFkZHIpIHsKKwljYXNlIENTUl9TVEFURV9DTEVBUjoKKwljYXNlIENTUl9TVEFURV9TRVQ6CisJY2FzZSBDU1JfUkVTRVRfU1RBUlQ6CisJY2FzZSBDU1JfTk9ERV9JRFM6CisJY2FzZSBDU1JfU1BMSVRfVElNRU9VVF9ISToKKwljYXNlIENTUl9TUExJVF9USU1FT1VUX0xPOgorCWNhc2UgQ1NSX0NZQ0xFX1RJTUU6CisJY2FzZSBDU1JfQlVTX1RJTUU6CisJY2FzZSBDU1JfQlVTX01BTkFHRVJfSUQ6CisJY2FzZSBDU1JfQlJPQURDQVNUX0NIQU5ORUw6CisJY2FzZSBDU1JfQlVTWV9USU1FT1VUOgorCWNhc2UgQ1NSX0JBTkRXSURUSF9BVkFJTEFCTEU6CisJCXJldHVybiBSQ09ERV9UWVBFX0VSUk9SOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CisJfQorfQorCitzdGF0aWMgaW50IHdyaXRlX2ZjcChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBpbnQgZGVzdCwKKwkJICAgICBxdWFkbGV0X3QgKmRhdGEsIHU2NCBhZGRyLCBzaXplX3QgbGVuZ3RoLCB1MTYgZmxhZ3MpCit7CisgICAgICAgIGludCBjc3JhZGRyID0gYWRkciAtIENTUl9SRUdJU1RFUl9CQVNFOworCisgICAgICAgIGlmIChsZW5ndGggPiA1MTIpCisgICAgICAgICAgICAgICAgcmV0dXJuIFJDT0RFX1RZUEVfRVJST1I7CisKKyAgICAgICAgc3dpdGNoIChjc3JhZGRyKSB7CisgICAgICAgIGNhc2UgQ1NSX0ZDUF9DT01NQU5EOgorICAgICAgICAgICAgICAgIGhpZ2hsZXZlbF9mY3BfcmVxdWVzdChob3N0LCBub2RlaWQsIDAsICh1OCAqKWRhdGEsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1NSX0ZDUF9SRVNQT05TRToKKyAgICAgICAgICAgICAgICBoaWdobGV2ZWxfZmNwX3JlcXVlc3QoaG9zdCwgbm9kZWlkLCAxLCAodTggKilkYXRhLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBSQ09ERV9UWVBFX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFJDT0RFX0NPTVBMRVRFOworfQorCitzdGF0aWMgaW50IHJlYWRfY29uZmlnX3JvbShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBxdWFkbGV0X3QgKmJ1ZmZlciwKKwkJCSAgIHU2NCBhZGRyLCBzaXplX3QgbGVuZ3RoLCB1MTYgZmwpCit7CisJdTMyIG9mZnNldCA9IGFkZHIgLSBDU1IxMjEyX1JFR0lTVEVSX1NQQUNFX0JBU0U7CisKKwlpZiAoY3NyMTIxMl9yZWFkKGhvc3QtPmNzci5yb20sIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgpID09IENTUjEyMTJfU1VDQ0VTUykKKwkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOworCWVsc2UKKwkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7Cit9CisKK3N0YXRpYyB1NjQgYWxsb2NhdGVfYWRkcl9yYW5nZSh1NjQgc2l6ZSwgdTMyIGFsaWdubWVudCwgdm9pZCAqX19ob3N0KQoreworIAlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gKHN0cnVjdCBocHNiX2hvc3QqKV9faG9zdDsKKworCXJldHVybiBocHNiX2FsbG9jYXRlX2FuZF9yZWdpc3Rlcl9hZGRyc3BhY2UoJmNzcl9oaWdobGV2ZWwsCisJCQkJCQkgICAgaG9zdCwKKwkJCQkJCSAgICAmY29uZmlnX3JvbV9vcHMsCisJCQkJCQkgICAgc2l6ZSwgYWxpZ25tZW50LAorCQkJCQkJICAgIENTUjEyMTJfVU5JVFNfU1BBQ0VfQkFTRSwKKwkJCQkJCSAgICBDU1IxMjEyX1VOSVRTX1NQQUNFX0VORCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYWRkcl9yYW5nZSh1NjQgYWRkciwgdm9pZCAqX19ob3N0KQoreworIAlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gKHN0cnVjdCBocHNiX2hvc3QqKV9faG9zdDsKKwlocHNiX3VucmVnaXN0ZXJfYWRkcnNwYWNlKCZjc3JfaGlnaGxldmVsLCBob3N0LCBhZGRyKTsKK30KKworCitpbnQgaW5pdF9jc3Iodm9pZCkKK3sKKwlub2RlX2NhcCA9IGNzcjEyMTJfbmV3X2ltbWVkaWF0ZShDU1IxMjEyX0tWX0lEX05PREVfQ0FQQUJJTElUSUVTLCAweDAwODNjMCk7CisJaWYgKCFub2RlX2NhcCkgeworCQlIUFNCX0VSUigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgTm9kZSBDYXBhYmlsdGllcyBDb25maWdST00gZW50cnkhIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWhwc2JfcmVnaXN0ZXJfaGlnaGxldmVsKCZjc3JfaGlnaGxldmVsKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfY3NyKHZvaWQpCit7CisJaWYgKG5vZGVfY2FwKQorCQljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKG5vZGVfY2FwKTsKKyAgICAgICAgaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbCgmY3NyX2hpZ2hsZXZlbCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2Nzci5oIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTlhYTRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuaApAQCAtMCwwICsxLDk2IEBACisKKyNpZm5kZWYgX0lFRUUxMzk0X0NTUl9ICisjZGVmaW5lIF9JRUVFMTM5NF9DU1JfSAorCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJjc3IxMjEyLmgiCisKKyNkZWZpbmUgQ1NSX1JFR0lTVEVSX0JBU0UgIDB4ZmZmZmYwMDAwMDAwVUxMCisKKy8qIHJlZ2lzdGVyIG9mZnNldHMgcmVsYXRpdmUgdG8gQ1NSX1JFR0lTVEVSX0JBU0UgKi8KKyNkZWZpbmUgQ1NSX1NUQVRFX0NMRUFSICAgICAgICAgICAweDAKKyNkZWZpbmUgQ1NSX1NUQVRFX1NFVCAgICAgICAgICAgICAweDQKKyNkZWZpbmUgQ1NSX05PREVfSURTICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgQ1NSX1JFU0VUX1NUQVJUICAgICAgICAgICAweGMKKyNkZWZpbmUgQ1NSX1NQTElUX1RJTUVPVVRfSEkgICAgICAweDE4CisjZGVmaW5lIENTUl9TUExJVF9USU1FT1VUX0xPICAgICAgMHgxYworI2RlZmluZSBDU1JfQ1lDTEVfVElNRSAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIENTUl9CVVNfVElNRSAgICAgICAgICAgICAgMHgyMDQKKyNkZWZpbmUgQ1NSX0JVU1lfVElNRU9VVCAgICAgICAgICAweDIxMAorI2RlZmluZSBDU1JfQlVTX01BTkFHRVJfSUQgICAgICAgIDB4MjFjCisjZGVmaW5lIENTUl9CQU5EV0lEVEhfQVZBSUxBQkxFICAgMHgyMjAKKyNkZWZpbmUgQ1NSX0NIQU5ORUxTX0FWQUlMQUJMRSAgICAweDIyNAorI2RlZmluZSBDU1JfQ0hBTk5FTFNfQVZBSUxBQkxFX0hJIDB4MjI0CisjZGVmaW5lIENTUl9DSEFOTkVMU19BVkFJTEFCTEVfTE8gMHgyMjgKKyNkZWZpbmUgQ1NSX0JST0FEQ0FTVF9DSEFOTkVMICAgICAweDIzNAorI2RlZmluZSBDU1JfQ09ORklHX1JPTSAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIENTUl9DT05GSUdfUk9NX0VORCAgICAgICAgMHg4MDAKKyNkZWZpbmUgQ1NSX0ZDUF9DT01NQU5EICAgICAgICAgICAweEIwMAorI2RlZmluZSBDU1JfRkNQX1JFU1BPTlNFICAgICAgICAgIDB4RDAwCisjZGVmaW5lIENTUl9GQ1BfRU5EICAgICAgICAgICAgICAgMHhGMDAKKyNkZWZpbmUgQ1NSX1RPUE9MT0dZX01BUCAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgQ1NSX1RPUE9MT0dZX01BUF9FTkQgICAgICAweDE0MDAKKyNkZWZpbmUgQ1NSX1NQRUVEX01BUCAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgQ1NSX1NQRUVEX01BUF9FTkQgICAgICAgICAweDMwMDAKKworLyogSUVFRSAxMzk0IGJ1cyBzcGVjaWZpYyBDb25maWd1cmF0aW9uIFJPTSBLZXkgSURzICovCisjZGVmaW5lIElFRUUxMzk0X0tWX0lEX1BPV0VSX1JFUVVJUkVNRU5UUyAoMHgzMCkKKworLyogSUVFRSAxMzk0IEJ1cyBJbmZvcmFtYXRpb24gQmxvY2sgc3BlY2lmaWNzICovCisjZGVmaW5lIENTUl9CVVNfSU5GT19TSVpFICg1ICogc2l6ZW9mKHF1YWRsZXRfdCkpCisKKyNkZWZpbmUgQ1NSX0lSTUNfU0hJRlQgMzEKKyNkZWZpbmUgQ1NSX0NNQ19TSElGVCAgMzAKKyNkZWZpbmUgQ1NSX0lTQ19TSElGVCAgMjkKKyNkZWZpbmUgQ1NSX0JNQ19TSElGVCAgMjgKKyNkZWZpbmUgQ1NSX1BNQ19TSElGVCAgMjcKKyNkZWZpbmUgQ1NSX0NZQ19DTEtfQUNDX1NISUZUIDE2CisjZGVmaW5lIENTUl9NQVhfUkVDX1NISUZUIDEyCisjZGVmaW5lIENTUl9NQVhfUk9NX1NISUZUIDgKKyNkZWZpbmUgQ1NSX0dFTkVSQVRJT05fU0hJRlQgNAorCisjZGVmaW5lIENTUl9TRVRfQlVTX0lORk9fR0VORVJBVElPTihjc3IsIGdlbikJCQkJXAorCSgoY3NyKS0+YnVzX2luZm9fZGF0YVsyXSA9CQkJCQlcCisJCWNwdV90b19iZTMyKChiZTMyX3RvX2NwdSgoY3NyKS0+YnVzX2luZm9fZGF0YVsyXSkgJglcCisJCQkgICAgIH4oMHhmIDw8IENTUl9HRU5FUkFUSU9OX1NISUZUKSkgfCAgICAgICAgICBcCisJCQkgICAgKGdlbikgPDwgQ1NSX0dFTkVSQVRJT05fU0hJRlQpKQorCitzdHJ1Y3QgY3NyX2NvbnRyb2wgeworICAgICAgICBzcGlubG9ja190IGxvY2s7CisKKyAgICAgICAgcXVhZGxldF90IHN0YXRlOworICAgICAgICBxdWFkbGV0X3Qgbm9kZV9pZHM7CisgICAgICAgIHF1YWRsZXRfdCBzcGxpdF90aW1lb3V0X2hpLCBzcGxpdF90aW1lb3V0X2xvOworCXVuc2lnbmVkIGxvbmcgZXhwaXJlOwkvLyBDYWxjdWxhdGVkIGZyb20gc3BsaXRfdGltZW91dAorICAgICAgICBxdWFkbGV0X3QgY3ljbGVfdGltZTsKKyAgICAgICAgcXVhZGxldF90IGJ1c190aW1lOworICAgICAgICBxdWFkbGV0X3QgYnVzX21hbmFnZXJfaWQ7CisgICAgICAgIHF1YWRsZXRfdCBiYW5kd2lkdGhfYXZhaWxhYmxlOworICAgICAgICBxdWFkbGV0X3QgY2hhbm5lbHNfYXZhaWxhYmxlX2hpLCBjaGFubmVsc19hdmFpbGFibGVfbG87CisJcXVhZGxldF90IGJyb2FkY2FzdF9jaGFubmVsOworCisJLyogQnVzIEluZm8gKi8KKwlxdWFkbGV0X3QgZ3VpZF9oaSwgZ3VpZF9sbzsKKwl1OCBjeWNfY2xrX2FjYzsKKwl1OCBtYXhfcmVjOworCXU4IG1heF9yb207CisJdTggZ2VuZXJhdGlvbjsJLyogT25seSB1c2UgdmFsdWVzIGJldHdlZW4gMHgyIGFuZCAweGYgKi8KKwl1OCBsbmtfc3BkOworCisJdW5zaWduZWQgbG9uZyBnZW5fdGltZXN0YW1wWzE2XTsKKworCXN0cnVjdCBjc3IxMjEyX2NzciAqcm9tOworCisgICAgICAgIHF1YWRsZXRfdCB0b3BvbG9neV9tYXBbMjU2XTsKKyAgICAgICAgcXVhZGxldF90IHNwZWVkX21hcFsxMDI0XTsKK307CisKK2V4dGVybiBzdHJ1Y3QgY3NyMTIxMl9idXNfb3BzIGNzcl9idXNfb3BzOworCitpbnQgaW5pdF9jc3Iodm9pZCk7Cit2b2lkIGNsZWFudXBfY3NyKHZvaWQpOworCisjZW5kaWYgLyogX0lFRUUxMzk0X0NTUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDMzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYwpAQCAtMCwwICsxLDE2MTIgQEAKKy8qCisgKiBjc3IxMjEyLmMgLS0gSUVFRSAxMjEyIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciBzdXBwb3J0IGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBGcmFuY29pcyBSZXRpZWYgPGZncmV0aWVmQHN1bi5hYy56YT4KKyAqICAgICAgICAgICAgICAgICAgICBTdGV2ZSBLaW5uZWJlcmcgPGtpbm5lYmVyZ3N0ZXZlQGFjbXN5c3RlbXMuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KKyAqIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworICogT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisvKiBUT0RPIExpc3Q6CisgKiAtIFZlcmlmeSBpbnRlcmZhY2UgY29uc2lzdGVuY3k6IGkuZS4sIHB1YmxpYyBmdW5jdGlvbnMgdGhhdCB0YWtlIGEgc2l6ZQorICogICBwYXJhbWV0ZXIgZXhwZWN0IHNpemUgdG8gYmUgaW4gYnl0ZXMuCisgKiAtIENvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBhIGJsb2NrIG9mIGRhdGEgZnJvbSBhIGdpdmVuIG9mZnNldC4KKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiY3NyMTIxMi5oIgorCisKKy8qIFBlcm1pdHRlZCBrZXkgdHlwZSBmb3IgZWFjaCBrZXkgaWQgKi8KKyNkZWZpbmUgX19JICgxIDw8IENTUjEyMTJfS1ZfVFlQRV9JTU1FRElBVEUpCisjZGVmaW5lIF9fQyAoMSA8PCBDU1IxMjEyX0tWX1RZUEVfQ1NSX09GRlNFVCkKKyNkZWZpbmUgX19EICgxIDw8IENTUjEyMTJfS1ZfVFlQRV9ESVJFQ1RPUlkpCisjZGVmaW5lIF9fTCAoMSA8PCBDU1IxMjEyX0tWX1RZUEVfTEVBRikKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBjc3IxMjEyX2tleV9pZF90eXBlX21hcFsweDMwXSA9IHsKKwkwLAkJCS8qIFJlc2VydmVkICovCisJX19EIHwgX19MLAkJLyogRGVzY3JpcHRvciAqLworCV9fSSB8IF9fRCB8IF9fTCwJLyogQnVzX0RlcGVuZGVudF9JbmZvICovCisJX19JIHwgX19EIHwgX19MLAkvKiBWZW5kb3IgKi8KKwlfX0ksCQkJLyogSGFyZHdhcmVfVmVyc2lvbiAqLworCTAsIDAsCQkJLyogUmVzZXJ2ZWQgKi8KKwlfX0QgfCBfX0wsCQkvKiBNb2R1bGUgKi8KKwkwLCAwLCAwLCAwLAkJLyogUmVzZXJ2ZWQgKi8KKwlfX0ksCQkJLyogTm9kZV9DYXBhYmlsaXRpZXMgKi8KKwlfX0wsCQkJLyogRVVJXzY0ICovCisJMCwgMCwgMCwJCS8qIFJlc2VydmVkICovCisJX19ELAkJCS8qIFVuaXQgKi8KKwlfX0ksCQkJLyogU3BlY2lmaWVyX0lEICovCisJX19JLAkJCS8qIFZlcnNpb24gKi8KKwlfX0kgfCBfX0MgfCBfX0QgfCBfX0wsCS8qIERlcGVuZGVudF9JbmZvICovCisJX19MLAkJCS8qIFVuaXRfTG9jYXRpb24gKi8KKwkwLAkJCS8qIFJlc2VydmVkICovCisJX19JLAkJCS8qIE1vZGVsICovCisJX19ELAkJCS8qIEluc3RhbmNlICovCisJX19MLAkJCS8qIEtleXdvcmQgKi8KKwlfX0QsCQkJLyogRmVhdHVyZSAqLworCV9fTCwJCQkvKiBFeHRlbmRlZF9ST00gKi8KKwlfX0ksCQkJLyogRXh0ZW5kZWRfS2V5X1NwZWNpZmllcl9JRCAqLworCV9fSSwJCQkvKiBFeHRlbmRlZF9LZXkgKi8KKwlfX0kgfCBfX0MgfCBfX0QgfCBfX0wsCS8qIEV4dGVuZGVkX0RhdGEgKi8KKwlfX0wsCQkJLyogTW9kaWZpYWJsZV9EZXNjcmlwdG9yICovCisJX19JLAkJCS8qIERpcmVjdG9yeV9JRCAqLworCV9fSSwJCQkvKiBSZXZpc2lvbiAqLworfTsKKyN1bmRlZiBfX0kKKyN1bmRlZiBfX0MKKyN1bmRlZiBfX0QKKyN1bmRlZiBfX0wKKworCisjZGVmaW5lIHF1YWRzX3RvX2J5dGVzKF9xKSAoKF9xKSAqIHNpemVvZih1X2ludDMyX3QpKQorI2RlZmluZSBieXRlc190b19xdWFkcyhfYikgKCgoX2IpICsgc2l6ZW9mKHVfaW50MzJfdCkgLSAxKSAvIHNpemVvZih1X2ludDMyX3QpKQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdikKK3sKKwlpZiAoKGt2LT5rZXkudHlwZSA9PSBDU1IxMjEyX0tWX1RZUEVfTEVBRikgJiYKKwkgICAgKGt2LT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9ST00pKQorCQlDU1IxMjEyX0ZSRUUoa3YtPnZhbHVlLmxlYWYuZGF0YSk7CisKKwlDU1IxMjEyX0ZSRUUoa3YpOworfQorCitzdGF0aWMgdV9pbnQxNl90IGNzcjEyMTJfY3JjMTYoY29uc3QgdV9pbnQzMl90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisJaW50IHNoaWZ0OworCXVfaW50MzJfdCBkYXRhOworCXVfaW50MTZfdCBzdW0sIGNyYyA9IDA7CisKKwlmb3IgKDsgbGVuZ3RoOyBsZW5ndGgtLSkgeworCQlkYXRhID0gQ1NSMTIxMl9CRTMyX1RPX0NQVSgqYnVmZmVyKTsKKwkJYnVmZmVyKys7CisJCWZvciAoc2hpZnQgPSAyODsgc2hpZnQgPj0gMDsgc2hpZnQgLT0gNCApIHsKKwkJCXN1bSA9ICgoY3JjID4+IDEyKSBeIChkYXRhID4+IHNoaWZ0KSkgJiAweGY7CisJCQljcmMgPSAoY3JjIDw8IDQpIF4gKHN1bSA8PCAxMikgXiAoc3VtIDw8IDUpIF4gKHN1bSk7CisJCX0KKwkJY3JjICY9IDB4ZmZmZjsKKwl9CisKKwlyZXR1cm4gQ1NSMTIxMl9DUFVfVE9fQkUxNihjcmMpOworfQorCisjaWYgMAorLyogTWljcm9zb2Z0IGNvbXB1dGVzIHRoZSBDUkMgd2l0aCB0aGUgYnl0ZXMgaW4gcmV2ZXJzZSBvcmRlci4gIFRoZXJlZm9yZSB3ZQorICogaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgQ1JDIGFsZ29yaXRobSB0byBhY2NvdW50IGZvciB0aGVpciBidWdneQorICogc29mdHdhcmUuICovCitzdGF0aWMgdV9pbnQxNl90IGNzcjEyMTJfbXNmdF9jcmMxNihjb25zdCB1X2ludDMyX3QgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKwlpbnQgc2hpZnQ7CisJdV9pbnQzMl90IGRhdGE7CisJdV9pbnQxNl90IHN1bSwgY3JjID0gMDsKKworCWZvciAoOyBsZW5ndGg7IGxlbmd0aC0tKSB7CisJCWRhdGEgPSBDU1IxMjEyX0xFMzJfVE9fQ1BVKCpidWZmZXIpOworCQlidWZmZXIrKzsKKwkJZm9yIChzaGlmdCA9IDI4OyBzaGlmdCA+PSAwOyBzaGlmdCAtPSA0ICkgeworCQkJc3VtID0gKChjcmMgPj4gMTIpIF4gKGRhdGEgPj4gc2hpZnQpKSAmIDB4ZjsKKwkJCWNyYyA9IChjcmMgPDwgNCkgXiAoc3VtIDw8IDEyKSBeIChzdW0gPDwgNSkgXiAoc3VtKTsKKwkJfQorCQljcmMgJj0gMHhmZmZmOworCX0KKworCXJldHVybiBDU1IxMjEyX0NQVV9UT19CRTE2KGNyYyk7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKmNzcjEyMTJfZmluZF9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICpkaXIsCisJCQkJCQkJIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCit7CisJc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpwb3M7CisKKwlmb3IgKHBvcyA9IGRpci0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX2hlYWQ7CisJICAgICBwb3MgIT0gTlVMTDsgcG9zID0gcG9zLT5uZXh0KSB7CisJCWlmIChwb3MtPmt2ID09IGt2KQorCQkJcmV0dXJuIHBvczsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfZmluZF9rZXl2YWxfb2Zmc2V0KHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3ZfbGlzdCwKKwkJCQkJCQkJdV9pbnQzMl90IG9mZnNldCkKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2OworCisJZm9yIChrdiA9IGt2X2xpc3QtPm5leHQ7IGt2ICYmIChrdiAhPSBrdl9saXN0KTsga3YgPSBrdi0+bmV4dCkgeworCQlpZiAoa3YtPm9mZnNldCA9PSBvZmZzZXQpCisJCQlyZXR1cm4ga3Y7CisJfQorCXJldHVybiBOVUxMOworfQorCisKKy8qIENyZWF0aW9uIFJvdXRpbmVzICovCitzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzcjEyMTJfY3JlYXRlX2NzcihzdHJ1Y3QgY3NyMTIxMl9idXNfb3BzICpvcHMsCisJCQkJICAgICAgIHNpemVfdCBidXNfaW5mb19zaXplLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBjc3IxMjEyX2NzciAqY3NyOworCisJY3NyID0gQ1NSMTIxMl9NQUxMT0Moc2l6ZW9mKCpjc3IpKTsKKwlpZiAoIWNzcikKKwkJcmV0dXJuIE5VTEw7CisKKwljc3ItPmNhY2hlX2hlYWQgPQorCQljc3IxMjEyX3JvbV9jYWNoZV9tYWxsb2MoQ1NSMTIxMl9DT05GSUdfUk9NX1NQQUNFX09GRlNFVCwKKwkJCQkJIENTUjEyMTJfQ09ORklHX1JPTV9TUEFDRV9TSVpFKTsKKwlpZiAoIWNzci0+Y2FjaGVfaGVhZCkgeworCQlDU1IxMjEyX0ZSRUUoY3NyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogVGhlIGtleXZhbCBrZXkgaWQgaXMgbm90IHVzZWQgZm9yIHRoZSByb290IG5vZGUsIGJ1dCBhIHZhbGlkIGtleSBpZAorCSAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGEgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIHBhc3NlZCB0bworCSAqIGNzcjEyMTJfbmV3X2RpcmVjdG9yeSgpLiAqLworCWNzci0+cm9vdF9rdiA9IGNzcjEyMTJfbmV3X2RpcmVjdG9yeShDU1IxMjEyX0tWX0lEX1ZFTkRPUik7CisJaWYgKCFjc3ItPnJvb3Rfa3YpIHsKKwkJQ1NSMTIxMl9GUkVFKGNzci0+Y2FjaGVfaGVhZCk7CisJCUNTUjEyMTJfRlJFRShjc3IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljc3ItPmJ1c19pbmZvX2RhdGEgPSBjc3ItPmNhY2hlX2hlYWQtPmRhdGE7CisJY3NyLT5idXNfaW5mb19sZW4gPSBidXNfaW5mb19zaXplOworCWNzci0+Y3JjX2xlbiA9IGJ1c19pbmZvX3NpemU7CisJY3NyLT5vcHMgPSBvcHM7CisJY3NyLT5wcml2YXRlID0gcHJpdmF0ZTsKKwljc3ItPmNhY2hlX3RhaWwgPSBjc3ItPmNhY2hlX2hlYWQ7CisKKwlyZXR1cm4gY3NyOworfQorCisKKwordm9pZCBjc3IxMjEyX2luaXRfbG9jYWxfY3NyKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLAorCQkJICAgIGNvbnN0IHVfaW50MzJfdCAqYnVzX2luZm9fZGF0YSwgaW50IG1heF9yb20pCit7CisJc3RhdGljIGNvbnN0IGludCBtcl9tYXBbXSA9IHsgNCwgNjQsIDEwMjQsIDAgfTsKKworCWNzci0+bWF4X3JvbSA9IG1yX21hcFttYXhfcm9tXTsKKwltZW1jcHkoY3NyLT5idXNfaW5mb19kYXRhLCBidXNfaW5mb19kYXRhLCBjc3ItPmJ1c19pbmZvX2xlbik7Cit9CisKKworc3RhdGljIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfa2V5dmFsKHVfaW50OF90IHR5cGUsIHVfaW50OF90IGtleSkKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2OworCisJaWYgKGtleSA8IDB4MzAgJiYgKChjc3IxMjEyX2tleV9pZF90eXBlX21hcFtrZXldICYgKDEgPDwgdHlwZSkpID09IDApKQorCQlyZXR1cm4gTlVMTDsKKworCWt2ID0gQ1NSMTIxMl9NQUxMT0Moc2l6ZW9mKCprdikpOworCWlmICgha3YpCisJCXJldHVybiBOVUxMOworCisJa3YtPmtleS50eXBlID0gdHlwZTsKKwlrdi0+a2V5LmlkID0ga2V5OworCisJa3YtPmFzc29jaWF0ZSA9IE5VTEw7CisJa3YtPnJlZmNudCA9IDE7CisKKwlrdi0+bmV4dCA9IE5VTEw7CisJa3YtPnByZXYgPSBOVUxMOworCWt2LT5vZmZzZXQgPSAwOworCWt2LT52YWxpZCA9IDA7CisJcmV0dXJuIGt2OworfQorCitzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2ltbWVkaWF0ZSh1X2ludDhfdCBrZXksIHVfaW50MzJfdCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2ID0gY3NyMTIxMl9uZXdfa2V5dmFsKENTUjEyMTJfS1ZfVFlQRV9JTU1FRElBVEUsIGtleSk7CisKKwlpZiAoIWt2KQorCQlyZXR1cm4gTlVMTDsKKworCWt2LT52YWx1ZS5pbW1lZGlhdGUgPSB2YWx1ZTsKKwlrdi0+dmFsaWQgPSAxOworCXJldHVybiBrdjsKK30KKworc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19sZWFmKHVfaW50OF90IGtleSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKQoreworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YgPSBjc3IxMjEyX25ld19rZXl2YWwoQ1NSMTIxMl9LVl9UWVBFX0xFQUYsIGtleSk7CisKKwlpZiAoIWt2KQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkYXRhX2xlbiA+IDApIHsKKwkJa3YtPnZhbHVlLmxlYWYuZGF0YSA9IENTUjEyMTJfTUFMTE9DKGRhdGFfbGVuKTsKKwkJaWYgKCFrdi0+dmFsdWUubGVhZi5kYXRhKSB7CisJCQlDU1IxMjEyX0ZSRUUoa3YpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoZGF0YSkKKwkJCW1lbWNweShrdi0+dmFsdWUubGVhZi5kYXRhLCBkYXRhLCBkYXRhX2xlbik7CisJfSBlbHNlIHsKKwkJa3YtPnZhbHVlLmxlYWYuZGF0YSA9IE5VTEw7CisJfQorCisJa3YtPnZhbHVlLmxlYWYubGVuID0gYnl0ZXNfdG9fcXVhZHMoZGF0YV9sZW4pOworCWt2LT5vZmZzZXQgPSAwOworCWt2LT52YWxpZCA9IDE7CisKKwlyZXR1cm4ga3Y7Cit9CisKK3N0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfY3NyX29mZnNldCh1X2ludDhfdCBrZXksIHVfaW50MzJfdCBjc3Jfb2Zmc2V0KQoreworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YgPSBjc3IxMjEyX25ld19rZXl2YWwoQ1NSMTIxMl9LVl9UWVBFX0NTUl9PRkZTRVQsIGtleSk7CisKKwlpZiAoIWt2KQorCQlyZXR1cm4gTlVMTDsKKworCWt2LT52YWx1ZS5jc3Jfb2Zmc2V0ID0gY3NyX29mZnNldDsKKworCWt2LT5vZmZzZXQgPSAwOworCWt2LT52YWxpZCA9IDE7CisJcmV0dXJuIGt2OworfQorCitzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2RpcmVjdG9yeSh1X2ludDhfdCBrZXkpCit7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdiA9IGNzcjEyMTJfbmV3X2tleXZhbChDU1IxMjEyX0tWX1RZUEVfRElSRUNUT1JZLCBrZXkpOworCisJaWYgKCFrdikKKwkJcmV0dXJuIE5VTEw7CisKKwlrdi0+dmFsdWUuZGlyZWN0b3J5LmxlbiA9IDA7CisJa3YtPm9mZnNldCA9IDA7CisJa3YtPnZhbHVlLmRpcmVjdG9yeS5kZW50cmllc19oZWFkID0gTlVMTDsKKwlrdi0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX3RhaWwgPSBOVUxMOworCWt2LT52YWxpZCA9IDE7CisJcmV0dXJuIGt2OworfQorCitpbnQgY3NyMTIxMl9hc3NvY2lhdGVfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YsCisJCQkgICAgIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqYXNzb2NpYXRlKQoreworCWlmICgha3YgfHwgIWFzc29jaWF0ZSkKKwkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOworCisJaWYgKGt2LT5rZXkuaWQgPT0gQ1NSMTIxMl9LVl9JRF9ERVNDUklQVE9SIHx8CisJICAgKGFzc29jaWF0ZS0+a2V5LmlkICE9IENTUjEyMTJfS1ZfSURfREVTQ1JJUFRPUiAmJgorCSAgICBhc3NvY2lhdGUtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0RFUEVOREVOVF9JTkZPICYmCisJICAgIGFzc29jaWF0ZS0+a2V5LmlkICE9IENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZICYmCisJICAgIGFzc29jaWF0ZS0+a2V5LmlkICE9IENTUjEyMTJfS1ZfSURfRVhURU5ERURfREFUQSAmJgorCSAgICBhc3NvY2lhdGUtPmtleS5pZCA8IDB4MzApKQorCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CisKKwlpZiAoa3YtPmtleS5pZCA9PSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWV9TUEVDSUZJRVJfSUQgJiYKKwkgICBhc3NvY2lhdGUtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWSkKKwkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOworCisJaWYgKGt2LT5rZXkuaWQgPT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVkgJiYKKwkgICBhc3NvY2lhdGUtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0RBVEEpCisJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKKworCWlmIChhc3NvY2lhdGUtPmtleS5pZCA9PSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWSAmJgorCSAgIGt2LT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVlfU1BFQ0lGSUVSX0lEKQorCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CisKKwlpZiAoYXNzb2NpYXRlLT5rZXkuaWQgPT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9EQVRBICYmCisJICAga3YtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWSkKKwkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOworCisJaWYgKGt2LT5hc3NvY2lhdGUpCisJCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwoa3YtPmFzc29jaWF0ZSk7CisKKwlhc3NvY2lhdGUtPnJlZmNudCsrOworCWt2LT5hc3NvY2lhdGUgPSBhc3NvY2lhdGU7CisKKwlyZXR1cm4gQ1NSMTIxMl9TVUNDRVNTOworfQorCitpbnQgY3NyMTIxMl9hdHRhY2hfa2V5dmFsX3RvX2RpcmVjdG9yeShzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmRpciwKKwkJCQkgICAgICAgc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdikKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKmRlbnRyeTsKKworCWlmICgha3YgfHwgIWRpciB8fCBkaXItPmtleS50eXBlICE9IENTUjEyMTJfS1ZfVFlQRV9ESVJFQ1RPUlkpCisJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKKworCWRlbnRyeSA9IENTUjEyMTJfTUFMTE9DKHNpemVvZigqZGVudHJ5KSk7CisJaWYgKCFkZW50cnkpCisJCXJldHVybiBDU1IxMjEyX0VOT01FTTsKKworCWRlbnRyeS0+a3YgPSBrdjsKKworCWt2LT5yZWZjbnQrKzsKKworCWRlbnRyeS0+bmV4dCA9IE5VTEw7CisJZGVudHJ5LT5wcmV2ID0gZGlyLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfdGFpbDsKKworCWlmICghZGlyLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfaGVhZCkKKwkJZGlyLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfaGVhZCA9IGRlbnRyeTsKKworCWlmIChkaXItPnZhbHVlLmRpcmVjdG9yeS5kZW50cmllc190YWlsKQorCQlkaXItPnZhbHVlLmRpcmVjdG9yeS5kZW50cmllc190YWlsLT5uZXh0ID0gZGVudHJ5OworCWRpci0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX3RhaWwgPSBkZW50cnk7CisKKwlyZXR1cm4gQ1NSMTIxMl9TVUNDRVNTOworfQorCitzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2V4dGVuZGVkX2ltbWVkaWF0ZSh1X2ludDMyX3Qgc3BlYywgdV9pbnQzMl90IGtleSwKKwkJCQkJCSAgICAgIHVfaW50MzJfdCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2cywgKmt2aywgKmt2djsKKworCWt2cyA9IGNzcjEyMTJfbmV3X2ltbWVkaWF0ZShDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWV9TUEVDSUZJRVJfSUQsIHNwZWMpOworCWt2ayA9IGNzcjEyMTJfbmV3X2ltbWVkaWF0ZShDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWSwga2V5KTsKKwlrdnYgPSBjc3IxMjEyX25ld19pbW1lZGlhdGUoQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9EQVRBLCB2YWx1ZSk7CisKKwlpZiAoIWt2cyB8fCAha3ZrIHx8ICFrdnYpIHsKKwkJaWYgKGt2cykKKwkJCWZyZWVfa2V5dmFsKGt2cyk7CisJCWlmIChrdmspCisJCQlmcmVlX2tleXZhbChrdmspOworCQlpZiAoa3Z2KQorCQkJZnJlZV9rZXl2YWwoa3Z2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogRG9uJ3Qga2VlcCBhIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgZXh0ZW5kZWQga2V5IG9yIHZhbHVlLiAqLworCWt2ay0+cmVmY250ID0gMDsKKwlrdnYtPnJlZmNudCA9IDA7CisKKwljc3IxMjEyX2Fzc29jaWF0ZV9rZXl2YWwoa3ZrLCBrdnYpOworCWNzcjEyMTJfYXNzb2NpYXRlX2tleXZhbChrdnMsIGt2ayk7CisKKwlyZXR1cm4ga3ZzOworfQorCitzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2V4dGVuZGVkX2xlYWYodV9pbnQzMl90IHNwZWMsIHVfaW50MzJfdCBrZXksCisJCQkJCQkgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKQoreworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3ZzLCAqa3ZrLCAqa3Z2OworCisJa3ZzID0gY3NyMTIxMl9uZXdfaW1tZWRpYXRlKENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZX1NQRUNJRklFUl9JRCwgc3BlYyk7CisJa3ZrID0gY3NyMTIxMl9uZXdfaW1tZWRpYXRlKENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZLCBrZXkpOworCWt2diA9IGNzcjEyMTJfbmV3X2xlYWYoQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9EQVRBLCBkYXRhLCBkYXRhX2xlbik7CisKKwlpZiAoIWt2cyB8fCAha3ZrIHx8ICFrdnYpIHsKKwkJaWYgKGt2cykKKwkJCWZyZWVfa2V5dmFsKGt2cyk7CisJCWlmIChrdmspCisJCQlmcmVlX2tleXZhbChrdmspOworCQlpZiAoa3Z2KQorCQkJZnJlZV9rZXl2YWwoa3Z2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogRG9uJ3Qga2VlcCBhIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgZXh0ZW5kZWQga2V5IG9yIHZhbHVlLiAqLworCWt2ay0+cmVmY250ID0gMDsKKwlrdnYtPnJlZmNudCA9IDA7CisKKwljc3IxMjEyX2Fzc29jaWF0ZV9rZXl2YWwoa3ZrLCBrdnYpOworCWNzcjEyMTJfYXNzb2NpYXRlX2tleXZhbChrdnMsIGt2ayk7CisKKwlyZXR1cm4ga3ZzOworfQorCitzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2Rlc2NyaXB0b3JfbGVhZih1X2ludDhfdCBkdHlwZSwgdV9pbnQzMl90IHNwZWNpZmllcl9pZCwKKwkJCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2OworCisJa3YgPSBjc3IxMjEyX25ld19sZWFmKENTUjEyMTJfS1ZfSURfREVTQ1JJUFRPUiwgTlVMTCwKKwkJCSAgICAgIGRhdGFfbGVuICsgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfT1ZFUkhFQUQpOworCWlmICgha3YpCisJCXJldHVybiBOVUxMOworCisJQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfU0VUX1RZUEUoa3YsIGR0eXBlKTsKKwlDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9TRVRfU1BFQ0lGSUVSX0lEKGt2LCBzcGVjaWZpZXJfaWQpOworCisJaWYgKGRhdGEpIHsKKwkJbWVtY3B5KENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX0RBVEEoa3YpLCBkYXRhLCBkYXRhX2xlbik7CisJfQorCisJcmV0dXJuIGt2OworfQorCisKK3N0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfdGV4dHVhbF9kZXNjcmlwdG9yX2xlYWYodV9pbnQ4X3QgY3dpZHRoLAorCQkJCQkJCSAgIHVfaW50MTZfdCBjc2V0LAorCQkJCQkJCSAgIHVfaW50MTZfdCBsYW5ndWFnZSwKKwkJCQkJCQkgICBjb25zdCB2b2lkICpkYXRhLAorCQkJCQkJCSAgIHNpemVfdCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2OworCWNoYXIgKmxzdHI7CisKKwlrdiA9IGNzcjEyMTJfbmV3X2Rlc2NyaXB0b3JfbGVhZigwLCAwLCBOVUxMLCBkYXRhX2xlbiArCisJCQkJCSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX09WRVJIRUFEKTsKKwlpZiAoIWt2KQorCQlyZXR1cm4gTlVMTDsKKworCUNTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfU0VUX1dJRFRIKGt2LCBjd2lkdGgpOworCUNTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfU0VUX0NIQVJfU0VUKGt2LCBjc2V0KTsKKwlDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1NFVF9MQU5HVUFHRShrdiwgbGFuZ3VhZ2UpOworCisJbHN0ciA9IChjaGFyKilDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0RBVEEoa3YpOworCisJLyogbWFrZSBzdXJlIGxhc3QgcXVhZGxldCBpcyB6ZXJvZWQgb3V0ICovCisJKigodV9pbnQzMl90KikmKGxzdHJbKGRhdGFfbGVuIC0gMSkgJiB+MHgzXSkpID0gMDsKKworCS8qIGRvbid0IGNvcHkgdGhlIE5VTCB0ZXJtaW5hdG9yICovCisJbWVtY3B5KGxzdHIsIGRhdGEsIGRhdGFfbGVuKTsKKworCXJldHVybiBrdjsKK30KKworc3RhdGljIGludCBjc3IxMjEyX2NoZWNrX21pbmltYWxfYXNjaWkoY29uc3QgY2hhciAqcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtaW5pbWFsX2FzY2lpX3RhYmxlW10gPSB7CisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsCisJCTB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MEMsIDB4MEQsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MjAsIDB4MjEsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjYsIDB4MjcsCisJCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsCisJCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisJCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsCisJCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsCisJCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsCisJCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsCisJCTB4NTgsIDB4NTksIDB4NWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NWYsCisJCTB4MDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCisJCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsCisJCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsCisJCTB4NzgsIDB4NzksIDB4N2EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJfTsKKwlmb3IgKDsgKnM7IHMrKykgeworCQlpZiAobWluaW1hbF9hc2NpaV90YWJsZVsqcyAmIDB4N0ZdICE9ICpzKQorCQkJcmV0dXJuIC0xOyAvKiBmYWlsZWQgKi8KKwl9CisJLyogU3RyaW5nIGNvbmZvcm1zIHRvIG1pbmltYWwtYXNjaWksIGFzIHNwZWNpZmllZCBieSBJRUVFIDEyMTIsCisJICogcGFyLiA3LjQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19zdHJpbmdfZGVzY3JpcHRvcl9sZWFmKGNvbnN0IGNoYXIgKnMpCit7CisJLyogQ2hlY2sgaWYgc3RyaW5nIGNvbmZvcm0gdG8gbWluaW1hbF9hc2NpaSBmb3JtYXQgKi8KKwlpZiAoY3NyMTIxMl9jaGVja19taW5pbWFsX2FzY2lpKHMpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIElFRUUgMTIxMiwgcGFyLiA3LjUuNC4xICBUZXh0dWFsIGRlc2NyaXB0b3JzIChtaW5pbWFsIEFTQ0lJKSAqLworCXJldHVybiBjc3IxMjEyX25ld190ZXh0dWFsX2Rlc2NyaXB0b3JfbGVhZigwLCAwLCAwLCBzLCBzdHJsZW4ocykpOworfQorCitzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2ljb25fZGVzY3JpcHRvcl9sZWFmKHVfaW50MzJfdCB2ZXJzaW9uLAorCQkJCQkJCXVfaW50OF90IHBhbGV0dGVfZGVwdGgsCisJCQkJCQkJdV9pbnQ4X3QgY29sb3Jfc3BhY2UsCisJCQkJCQkJdV9pbnQxNl90IGxhbmd1YWdlLAorCQkJCQkJCXVfaW50MTZfdCBoc2NhbiwKKwkJCQkJCQl1X2ludDE2X3QgdnNjYW4sCisJCQkJCQkJdV9pbnQzMl90ICpwYWxldHRlLAorCQkJCQkJCXVfaW50MzJfdCAqcGl4ZWxzKQoreworCXN0YXRpYyBjb25zdCBpbnQgcGRbNF0gPSB7IDAsIDQsIDE2LCAyNTYgfTsKKwlzdGF0aWMgY29uc3QgaW50IGNzWzE2XSA9IHsgNCwgMiB9OworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3Y7CisJaW50IHBhbGV0dGVfc2l6ZSA9IHBkW3BhbGV0dGVfZGVwdGhdICogY3NbY29sb3Jfc3BhY2VdOworCWludCBwaXhlbF9zaXplID0gKGhzY2FuICogdnNjYW4gKyAzKSAmIH4weDM7CisKKwlpZiAoKHBhbGV0dGVfZGVwdGggJiYgIXBhbGV0dGUpIHx8ICFwaXhlbHMpCisJCXJldHVybiBOVUxMOworCisJa3YgPSBjc3IxMjEyX25ld19kZXNjcmlwdG9yX2xlYWYoMSwgMCwgTlVMTCwKKwkJCQkJIHBhbGV0dGVfc2l6ZSArIHBpeGVsX3NpemUgKworCQkJCQkgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9PVkVSSEVBRCk7CisJaWYgKCFrdikKKwkJcmV0dXJuIE5VTEw7CisKKwlDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9WRVJTSU9OKGt2LCB2ZXJzaW9uKTsKKwlDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9QQUxFVFRFX0RFUFRIKGt2LCBwYWxldHRlX2RlcHRoKTsKKwlDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9DT0xPUl9TUEFDRShrdiwgY29sb3Jfc3BhY2UpOworCUNTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfU0VUX0xBTkdVQUdFKGt2LCBsYW5ndWFnZSk7CisJQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9TRVRfSFNDQU4oa3YsIGhzY2FuKTsKKwlDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9WU0NBTihrdiwgdnNjYW4pOworCisJaWYgKHBhbGV0dGVfc2l6ZSkKKwkJbWVtY3B5KENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfUEFMRVRURShrdiksIHBhbGV0dGUsCisJCSAgICAgICBwYWxldHRlX3NpemUpOworCisJbWVtY3B5KENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfUElYRUxTKGt2KSwgcGl4ZWxzLCBwaXhlbF9zaXplKTsKKworCXJldHVybiBrdjsKK30KKworc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19tb2RpZmlhYmxlX2Rlc2NyaXB0b3JfbGVhZih1X2ludDE2X3QgbWF4X3NpemUsCisJCQkJCQkJICAgICAgdV9pbnQ2NF90IGFkZHJlc3MpCit7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdjsKKworCS8qIElFRUUgMTIxMiwgcGFyLiA3LjUuNC4zICBNb2RpZmlhYmxlIGRlc2NyaXB0b3JzICovCisJa3YgPSBjc3IxMjEyX25ld19sZWFmKENTUjEyMTJfS1ZfSURfTU9ESUZJQUJMRV9ERVNDUklQVE9SLCBOVUxMLCBzaXplb2YodV9pbnQ2NF90KSk7CisJaWYoIWt2KQorCQlyZXR1cm4gTlVMTDsKKworCUNTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX1NFVF9NQVhfU0laRShrdiwgbWF4X3NpemUpOworCUNTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX1NFVF9BRERSRVNTX0hJKGt2LCBhZGRyZXNzKTsKKwlDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9TRVRfQUREUkVTU19MTyhrdiwgYWRkcmVzcyk7CisKKwlyZXR1cm4ga3Y7Cit9CisKK3N0YXRpYyBpbnQgY3NyMTIxMl9jaGVja19rZXl3b3JkKGNvbnN0IGNoYXIgKnMpCit7CisJZm9yICg7ICpzOyBzKyspIHsKKworCQlpZiAoKCdBJyA8PSAqcykgJiYgKCpzIDw9ICdaJykpCisJCQljb250aW51ZTsKKwkJaWYgKCgnMCcgPD0gKnMpICYmICgqcyA8PSAnOScpKQorCQkJY29udGludWU7CisJCWlmICgqcyA9PSAnLScpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gLTE7IC8qIGZhaWxlZCAqLworCX0KKwkvKiBTdHJpbmcgY29uZm9ybXMgdG8ga2V5d29yZCwgYXMgc3BlY2lmaWVkIGJ5IElFRUUgMTIxMiwKKwkgKiBwYXIuIDcuNi41ICovCisJcmV0dXJuIENTUjEyMTJfU1VDQ0VTUzsKK30KKworc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19rZXl3b3JkX2xlYWYoaW50IHN0cmMsIGNvbnN0IGNoYXIgKnN0cnZbXSkKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2OworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgaSwgZGF0YV9sZW4gPSAwOworCisJLyogQ2hlY2sgYWxsIGtleXdvcmRzIHRvIHNlZSBpZiB0aGV5IGNvbmZvcm0gdG8gcmVzdHJpY3Rpb25zOgorCSAqIE9ubHkgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGlzIGFsbG93ZWQgWydBJy4uJ1onLCcwJy4uJzknLCctJ10KKwkgKiBFYWNoIHdvcmQgaXMgemVyby10ZXJtaW5hdGVkLgorCSAqIEFsc28gY2FsY3VsYXRlIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGtleXdvcmRzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBzdHJjOyBpKyspIHsKKwkJaWYgKCFzdHJ2W2ldIHx8IGNzcjEyMTJfY2hlY2tfa2V5d29yZChzdHJ2W2ldKSkgeworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZGF0YV9sZW4gKz0gc3RybGVuKHN0cnZbaV0pICsgMTsgLyogQWRkIHplcm8tdGVybWluYXRpb24gY2hhci4gKi8KKwl9CisKKwkvKiBJRUVFIDEyMTIsIHBhci4gNy42LjUgS2V5d29yZCBsZWF2ZXMgKi8KKwlrdiA9IGNzcjEyMTJfbmV3X2xlYWYoQ1NSMTIxMl9LVl9JRF9LRVlXT1JELCBOVUxMLCBkYXRhX2xlbik7CisJaWYgKCFrdikKKwkJcmV0dXJuIE5VTEw7CisKKwlidWZmZXIgPSAoY2hhciAqKWt2LT52YWx1ZS5sZWFmLmRhdGE7CisKKwkvKiBtYWtlIHN1cmUgbGFzdCBxdWFkbGV0IGlzIHplcm9lZCBvdXQgKi8KKwkqKCh1X2ludDMyX3QqKSYoYnVmZmVyWyhkYXRhX2xlbiAtIDEpICYgfjB4M10pKSA9IDA7CisKKwkvKiBDb3B5IGtleXdvcmQocykgaW50byBsZWFmIGRhdGEgYnVmZmVyICovCisJZm9yIChpID0gMDsgaSA8IHN0cmM7IGkrKykgeworCQlpbnQgbGVuID0gc3RybGVuKHN0cnZbaV0pICsgMTsKKwkJbWVtY3B5KGJ1ZmZlciwgc3RydltpXSwgbGVuKTsKKwkJYnVmZmVyICs9IGxlbjsKKwl9CisJcmV0dXJuIGt2OworfQorCisKKy8qIERlc3RydWN0aW9uIFJvdXRpbmVzICovCisKK3ZvaWQgY3NyMTIxMl9kZXRhY2hfa2V5dmFsX2Zyb21fZGlyZWN0b3J5KHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqZGlyLAorCQkJCQkgIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCit7CisJc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpkZW50cnk7CisKKwlpZiAoIWt2IHx8ICFkaXIgfHwgZGlyLT5rZXkudHlwZSAhPSBDU1IxMjEyX0tWX1RZUEVfRElSRUNUT1JZKQorCQlyZXR1cm47CisKKwlkZW50cnkgPSBjc3IxMjEyX2ZpbmRfa2V5dmFsKGRpciwga3YpOworCisJaWYgKCFkZW50cnkpCisJCXJldHVybjsKKworCWlmIChkZW50cnktPnByZXYpCisJCWRlbnRyeS0+cHJldi0+bmV4dCA9IGRlbnRyeS0+bmV4dDsKKwlpZiAoZGVudHJ5LT5uZXh0KQorCQlkZW50cnktPm5leHQtPnByZXYgPSBkZW50cnktPnByZXY7CisJaWYgKGRpci0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX2hlYWQgPT0gZGVudHJ5KQorCQlkaXItPnZhbHVlLmRpcmVjdG9yeS5kZW50cmllc19oZWFkID0gZGVudHJ5LT5uZXh0OworCWlmIChkaXItPnZhbHVlLmRpcmVjdG9yeS5kZW50cmllc190YWlsID09IGRlbnRyeSkKKwkJZGlyLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfdGFpbCA9IGRlbnRyeS0+cHJldjsKKworCUNTUjEyMTJfRlJFRShkZW50cnkpOworCisJY3NyMTIxMl9yZWxlYXNlX2tleXZhbChrdik7Cit9CisKKwordm9pZCBjc3IxMjEyX2Rpc2Fzc29jaWF0ZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdikKK3sKKwlpZiAoa3YtPmFzc29jaWF0ZSkgeworCQljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKGt2LT5hc3NvY2lhdGUpOworCX0KKworCWt2LT5hc3NvY2lhdGUgPSBOVUxMOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmcmVlIHRoZSBtZW1vcnkgdGFrZW4gYnkgYSBrZXl2YWwuICBJZiB0aGUgZ2l2ZW4KKyAqIGtleXZhbCBpcyBhIGRpcmVjdG9yeSB0eXBlLCB0aGVuIGFueSBrZXl2YWxzIGNvbnRhaW5lZCBpbiB0aGF0IGRpcmVjdG9yeQorICogd2lsbCBiZSBkZXN0cm95ZWQgYXMgd2VsbCBpZiB0aGVpciByZXNwZWN0aXZlIHJlZmNudHMgYXJlIDAuICBCeSBtZWFucyBvZgorICogbGlzdCBtYW5pcHVsYXRpb24sIHRoaXMgcm91dGluZSB3aWxsIGRlc2NlbmQgYSBkaXJlY3Rvcnkgc3RydWN0dXJlIGluIGEKKyAqIG5vbi1yZWN1cnNpdmUgbWFubmVyLiAqLwordm9pZCBfY3NyMTIxMl9kZXN0cm95X2tleXZhbChzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KQoreworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqaywgKmE7CisJc3RydWN0IGNzcjEyMTJfZGVudHJ5IGRlbnRyeTsKKwlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKmhlYWQsICp0YWlsOworCisJZGVudHJ5Lmt2ID0ga3Y7CisJZGVudHJ5Lm5leHQgPSBOVUxMOworCWRlbnRyeS5wcmV2ID0gTlVMTDsKKworCWhlYWQgPSAmZGVudHJ5OworCXRhaWwgPSBoZWFkOworCisJd2hpbGUgKGhlYWQpIHsKKwkJayA9IGhlYWQtPmt2OworCisJCXdoaWxlIChrKSB7CisJCQlrLT5yZWZjbnQtLTsKKworCQkJaWYgKGstPnJlZmNudCA+IDApCisJCQkJYnJlYWs7CisKKwkJCWEgPSBrLT5hc3NvY2lhdGU7CisKKwkJCWlmIChrLT5rZXkudHlwZSA9PSBDU1IxMjEyX0tWX1RZUEVfRElSRUNUT1JZKSB7CisJCQkJLyogSWYgdGhlIGN1cnJlbnQgZW50cnkgaXMgYSBkaXJlY3RvcnksIHRoZW4gbW92ZSBhbGwKKwkJCQkgKiB0aGUgZW50cmllcyB0byB0aGUgZGVzdHJ1Y3Rpb24gbGlzdC4gKi8KKwkJCQlpZiAoay0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX2hlYWQpIHsKKwkJCQkJdGFpbC0+bmV4dCA9IGstPnZhbHVlLmRpcmVjdG9yeS5kZW50cmllc19oZWFkOworCQkJCQlrLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfaGVhZC0+cHJldiA9IHRhaWw7CisJCQkJCXRhaWwgPSBrLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfdGFpbDsKKwkJCQl9CisJCQl9CisJCQlmcmVlX2tleXZhbChrKTsKKwkJCWsgPSBhOworCQl9CisKKwkJaGVhZCA9IGhlYWQtPm5leHQ7CisJCWlmIChoZWFkKSB7CisJCQlpZiAoaGVhZC0+cHJldiAmJiBoZWFkLT5wcmV2ICE9ICZkZW50cnkpIHsKKwkJCQlDU1IxMjEyX0ZSRUUoaGVhZC0+cHJldik7CisJCQl9CisJCQloZWFkLT5wcmV2ID0gTlVMTDsKKwkJfSBlbHNlIGlmICh0YWlsICE9ICZkZW50cnkpCisJCQlDU1IxMjEyX0ZSRUUodGFpbCk7CisJfQorfQorCisKK3ZvaWQgY3NyMTIxMl9kZXN0cm95X2NzcihzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzcikKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjLCAqb2M7CisJc3RydWN0IGNzcjEyMTJfY2FjaGVfcmVnaW9uICpjciwgKm9jcjsKKworCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwoY3NyLT5yb290X2t2KTsKKworCWMgPSBjc3ItPmNhY2hlX2hlYWQ7CisJd2hpbGUgKGMpIHsKKwkJb2MgPSBjOworCQljciA9IGMtPmZpbGxlZF9oZWFkOworCQl3aGlsZSAoY3IpIHsKKwkJCW9jciA9IGNyOworCQkJY3IgPSBjci0+bmV4dDsKKwkJCUNTUjEyMTJfRlJFRShvY3IpOworCQl9CisJCWMgPSBjLT5uZXh0OworCQlDU1IxMjEyX0ZSRUUob2MpOworCX0KKworCUNTUjEyMTJfRlJFRShjc3IpOworfQorCisKKworLyogQ1NSIEltYWdlIENyZWF0aW9uICovCisKK3N0YXRpYyBpbnQgY3NyMTIxMl9hcHBlbmRfbmV3X2NhY2hlKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLCBzaXplX3Qgcm9tc2l6ZSkKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZTsKKwl1X2ludDY0X3QgY3NyX2FkZHI7CisKKwlpZiAoIWNzciB8fCAhY3NyLT5vcHMtPmFsbG9jYXRlX2FkZHJfcmFuZ2UgfHwKKwkgICAgIWNzci0+b3BzLT5yZWxlYXNlX2FkZHIpCisJCXJldHVybiBDU1IxMjEyX0VOT01FTTsKKworCS8qIFJPTSBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBjc3ItPm1heF9yb20gKi8KKwlyb21zaXplID0gKHJvbXNpemUgKyAoY3NyLT5tYXhfcm9tIC0gMSkpICYgfihjc3ItPm1heF9yb20gLSAxKTsKKworCWNzcl9hZGRyID0gY3NyLT5vcHMtPmFsbG9jYXRlX2FkZHJfcmFuZ2Uocm9tc2l6ZSwgY3NyLT5tYXhfcm9tLCBjc3ItPnByaXZhdGUpOworCWlmIChjc3JfYWRkciA9PSB+MFVMTCkgeworCQlyZXR1cm4gQ1NSMTIxMl9FTk9NRU07CisJfQorCWlmIChjc3JfYWRkciA8IENTUjEyMTJfUkVHSVNURVJfU1BBQ0VfQkFTRSkgeworCQkvKiBJbnZhbGlkIGFkZHJlc3MgcmV0dXJuZWQgZnJvbSBhbGxvY2F0ZV9hZGRyX3JhbmdlKCkuICovCisJCWNzci0+b3BzLT5yZWxlYXNlX2FkZHIoY3NyX2FkZHIsIGNzci0+cHJpdmF0ZSk7CisJCXJldHVybiBDU1IxMjEyX0VOT01FTTsKKwl9CisKKwljYWNoZSA9IGNzcjEyMTJfcm9tX2NhY2hlX21hbGxvYyhjc3JfYWRkciAtIENTUjEyMTJfUkVHSVNURVJfU1BBQ0VfQkFTRSwgcm9tc2l6ZSk7CisJaWYgKCFjYWNoZSkgeworCQljc3ItPm9wcy0+cmVsZWFzZV9hZGRyKGNzcl9hZGRyLCBjc3ItPnByaXZhdGUpOworCQlyZXR1cm4gQ1NSMTIxMl9FTk9NRU07CisJfQorCisJY2FjaGUtPmV4dF9yb20gPSBjc3IxMjEyX25ld19rZXl2YWwoQ1NSMTIxMl9LVl9UWVBFX0xFQUYsIENTUjEyMTJfS1ZfSURfRVhURU5ERURfUk9NKTsKKwlpZiAoIWNhY2hlLT5leHRfcm9tKSB7CisJCWNzci0+b3BzLT5yZWxlYXNlX2FkZHIoY3NyX2FkZHIsIGNzci0+cHJpdmF0ZSk7CisJCUNTUjEyMTJfRlJFRShjYWNoZSk7CisJCXJldHVybiBDU1IxMjEyX0VOT01FTTsKKwl9CisKKwlpZiAoY3NyMTIxMl9hdHRhY2hfa2V5dmFsX3RvX2RpcmVjdG9yeShjc3ItPnJvb3Rfa3YsIGNhY2hlLT5leHRfcm9tKSAhPSBDU1IxMjEyX1NVQ0NFU1MpIHsKKwkJY3NyMTIxMl9yZWxlYXNlX2tleXZhbChjYWNoZS0+ZXh0X3JvbSk7CisJCWNzci0+b3BzLT5yZWxlYXNlX2FkZHIoY3NyX2FkZHIsIGNzci0+cHJpdmF0ZSk7CisJCUNTUjEyMTJfRlJFRShjYWNoZSk7CisJCXJldHVybiBDU1IxMjEyX0VOT01FTTsKKwl9CisJY2FjaGUtPmV4dF9yb20tPm9mZnNldCA9IGNzcl9hZGRyIC0gQ1NSMTIxMl9SRUdJU1RFUl9TUEFDRV9CQVNFOworCWNhY2hlLT5leHRfcm9tLT52YWx1ZS5sZWFmLmxlbiA9IC0xOworCWNhY2hlLT5leHRfcm9tLT52YWx1ZS5sZWFmLmRhdGEgPSBjYWNoZS0+ZGF0YTsKKworCS8qIEFkZCBjYWNoZSB0byB0YWlsIG9mIGNhY2hlIGxpc3QgKi8KKwljYWNoZS0+cHJldiA9IGNzci0+Y2FjaGVfdGFpbDsKKwljc3ItPmNhY2hlX3RhaWwtPm5leHQgPSBjYWNoZTsKKwljc3ItPmNhY2hlX3RhaWwgPSBjYWNoZTsKKwlyZXR1cm4gQ1NSMTIxMl9TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3NyMTIxMl9yZW1vdmVfY2FjaGUoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsCisJCQkJCXN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlKQoreworCWlmIChjc3ItPmNhY2hlX2hlYWQgPT0gY2FjaGUpCisJCWNzci0+Y2FjaGVfaGVhZCA9IGNhY2hlLT5uZXh0OworCWlmIChjc3ItPmNhY2hlX3RhaWwgPT0gY2FjaGUpCisJCWNzci0+Y2FjaGVfdGFpbCA9IGNhY2hlLT5wcmV2OworCisJaWYgKGNhY2hlLT5wcmV2KQorCQljYWNoZS0+cHJldi0+bmV4dCA9IGNhY2hlLT5uZXh0OworCWlmIChjYWNoZS0+bmV4dCkKKwkJY2FjaGUtPm5leHQtPnByZXYgPSBjYWNoZS0+cHJldjsKKworCWlmIChjYWNoZS0+ZXh0X3JvbSkgeworCQljc3IxMjEyX2RldGFjaF9rZXl2YWxfZnJvbV9kaXJlY3RvcnkoY3NyLT5yb290X2t2LCBjYWNoZS0+ZXh0X3JvbSk7CisJCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwoY2FjaGUtPmV4dF9yb20pOworCX0KKworCUNTUjEyMTJfRlJFRShjYWNoZSk7Cit9CisKK3N0YXRpYyBpbnQgY3NyMTIxMl9nZW5lcmF0ZV9sYXlvdXRfc3ViZGlyKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqZGlyLAorCQkJCQkgIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqKmxheW91dF90YWlsKQoreworCXN0cnVjdCBjc3IxMjEyX2RlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqZGt2OworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqbGFzdF9leHRrZXlfc3BlYyA9IE5VTEw7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICpsYXN0X2V4dGtleSA9IE5VTEw7CisJaW50IG51bV9lbnRyaWVzID0gMDsKKworCWZvciAoZGVudHJ5ID0gZGlyLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfaGVhZDsgZGVudHJ5OworCSAgICAgZGVudHJ5ID0gZGVudHJ5LT5uZXh0KSB7CisJCWZvciAoZGt2ID0gZGVudHJ5LT5rdjsgZGt2OyBka3YgPSBka3YtPmFzc29jaWF0ZSkgeworCQkJLyogU3BlY2lhbCBDYXNlOiBFeHRlbmRlZCBLZXkgU3BlY2lmaWVyX0lEICovCisJCQlpZiAoZGt2LT5rZXkuaWQgPT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVlfU1BFQ0lGSUVSX0lEKSB7CisJCQkJaWYgKGxhc3RfZXh0a2V5X3NwZWMgPT0gTlVMTCkgeworCQkJCQlsYXN0X2V4dGtleV9zcGVjID0gZGt2OworCQkJCX0gZWxzZSBpZiAoZGt2LT52YWx1ZS5pbW1lZGlhdGUgIT0gbGFzdF9leHRrZXlfc3BlYy0+dmFsdWUuaW1tZWRpYXRlKSB7CisJCQkJCWxhc3RfZXh0a2V5X3NwZWMgPSBka3Y7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJLyogU3BlY2lhbCBDYXNlOiBFeHRlbmRlZCBLZXkgKi8KKwkJCX0gZWxzZSBpZiAoZGt2LT5rZXkuaWQgPT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVkpIHsKKwkJCQlpZiAobGFzdF9leHRrZXkgPT0gTlVMTCkgeworCQkJCQlsYXN0X2V4dGtleSA9IGRrdjsKKwkJCQl9IGVsc2UgaWYgKGRrdi0+dmFsdWUuaW1tZWRpYXRlICE9IGxhc3RfZXh0a2V5LT52YWx1ZS5pbW1lZGlhdGUpIHsKKwkJCQkJbGFzdF9leHRrZXkgPSBka3Y7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCisJCQludW1fZW50cmllcyArPSAxOworCisJCQlzd2l0Y2goZGt2LT5rZXkudHlwZSkgeworCQkJZGVmYXVsdDoKKwkJCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0lNTUVESUFURToKKwkJCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0NTUl9PRkZTRVQ6CisJCQkJYnJlYWs7CisJCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9MRUFGOgorCQkJY2FzZSBDU1IxMjEyX0tWX1RZUEVfRElSRUNUT1JZOgorCQkJCS8qIFJlbW92ZSBmcm9tIGxpc3QgKi8KKwkJCQlpZiAoZGt2LT5wcmV2ICYmIChka3YtPnByZXYtPm5leHQgPT0gZGt2KSkKKwkJCQkJZGt2LT5wcmV2LT5uZXh0ID0gZGt2LT5uZXh0OworCQkJCWlmIChka3YtPm5leHQgJiYgKGRrdi0+bmV4dC0+cHJldiA9PSBka3YpKQorCQkJCQlka3YtPm5leHQtPnByZXYgPSBka3YtPnByZXY7CisJCQkJLy9pZiAoZGt2ID09ICpsYXlvdXRfdGFpbCkKKwkJCQkvLwkqbGF5b3V0X3RhaWwgPSBka3YtPnByZXY7CisKKwkJCQkvKiBTcGVjaWFsIGNhc2U6IEV4dGVuZGVkIFJPTSBsZWFmcyAqLworCQkJCWlmIChka3YtPmtleS5pZCA9PSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX1JPTSkgeworCQkJCQlka3YtPnZhbHVlLmxlYWYubGVuID0gLTE7CisJCQkJCS8qIERvbid0IGFkZCBFeHRlbmRlZCBST00gbGVhZnMgaW4gdGhlIGxheW91dCBsaXN0LAorCQkJCQkgKiB0aGV5IGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LiAqLworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBBZGQgdG8gdGFpbCBvZiBsaXN0ICovCisJCQkJZGt2LT5uZXh0ID0gTlVMTDsKKwkJCQlka3YtPnByZXYgPSAqbGF5b3V0X3RhaWw7CisJCQkJKCpsYXlvdXRfdGFpbCktPm5leHQgPSBka3Y7CisJCQkJKmxheW91dF90YWlsID0gZGt2OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBudW1fZW50cmllczsKK30KKworc2l6ZV90IGNzcjEyMTJfZ2VuZXJhdGVfbGF5b3V0X29yZGVyKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpCit7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICpsdGFpbCA9IGt2OworCXNpemVfdCBhZ2dfc2l6ZSA9IDA7CisKKwl3aGlsZShrdikgeworCQlzd2l0Y2goa3YtPmtleS50eXBlKSB7CisJCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0xFQUY6CisJCQkvKiBBZGQgMSBxdWFkbGV0IGZvciBjcmMvbGVuIGZpZWxkICovCisJCQlhZ2dfc2l6ZSArPSBrdi0+dmFsdWUubGVhZi5sZW4gKyAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBDU1IxMjEyX0tWX1RZUEVfRElSRUNUT1JZOgorCQkJa3YtPnZhbHVlLmRpcmVjdG9yeS5sZW4gPSBjc3IxMjEyX2dlbmVyYXRlX2xheW91dF9zdWJkaXIoa3YsICZsdGFpbCk7CisJCQkvKiBBZGQgMSBxdWFkbGV0IGZvciBjcmMvbGVuIGZpZWxkICovCisJCQlhZ2dfc2l6ZSArPSBrdi0+dmFsdWUuZGlyZWN0b3J5LmxlbiArIDE7CisJCQlicmVhazsKKwkJfQorCQlrdiA9IGt2LT5uZXh0OworCX0KKwlyZXR1cm4gcXVhZHNfdG9fYnl0ZXMoYWdnX3NpemUpOworfQorCitzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfZ2VuZXJhdGVfcG9zaXRpb25zKHN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlLAorCQkJCQkJICBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKnN0YXJ0X2t2LAorCQkJCQkJICBpbnQgc3RhcnRfcG9zKQoreworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YgPSBzdGFydF9rdjsKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKm9rdiA9IHN0YXJ0X2t2OworCWludCBwb3MgPSBzdGFydF9wb3M7CisJaW50IGt2X2xlbiA9IDAsIG9rdl9sZW4gPSAwOworCisJY2FjaGUtPmxheW91dF9oZWFkID0ga3Y7CisKKwl3aGlsZShrdiAmJiBwb3MgPCBjYWNoZS0+c2l6ZSkgeworCQkvKiBTcGVjaWFsIGNhc2U6IEV4dGVuZGVkIFJPTSBsZWFmcyAqLworCQlpZiAoa3YtPmtleS5pZCAhPSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX1JPTSkgeworCQkJa3YtPm9mZnNldCA9IGNhY2hlLT5vZmZzZXQgKyBwb3M7CisJCX0KKworCQlzd2l0Y2goa3YtPmtleS50eXBlKSB7CisJCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0xFQUY6CisJCQlrdl9sZW4gPSBrdi0+dmFsdWUubGVhZi5sZW47CisJCQlicmVhazsKKworCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9ESVJFQ1RPUlk6CisJCQlrdl9sZW4gPSBrdi0+dmFsdWUuZGlyZWN0b3J5LmxlbjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJcG9zICs9IHF1YWRzX3RvX2J5dGVzKGt2X2xlbiArIDEpOworCisJCWlmIChwb3MgPD0gY2FjaGUtPnNpemUpIHsKKwkJCW9rdiA9IGt2OworCQkJb2t2X2xlbiA9IGt2X2xlbjsKKwkJCWt2ID0ga3YtPm5leHQ7CisJCX0KKwl9CisKKwljYWNoZS0+bGF5b3V0X3RhaWwgPSBva3Y7CisJY2FjaGUtPmxlbiA9IChva3YtPm9mZnNldCAtIGNhY2hlLT5vZmZzZXQpICsgcXVhZHNfdG9fYnl0ZXMob2t2X2xlbiArIDEpOworCisJcmV0dXJuIGt2OworfQorCitzdGF0aWMgdm9pZCBjc3IxMjEyX2dlbmVyYXRlX3RyZWVfc3ViZGlyKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqZGlyLAorCQkJCQkgdV9pbnQzMl90ICpkYXRhX2J1ZmZlcikKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmxhc3RfZXh0a2V5X3NwZWMgPSBOVUxMOworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqbGFzdF9leHRrZXkgPSBOVUxMOworCWludCBpbmRleCA9IDA7CisKKwlmb3IgKGRlbnRyeSA9IGRpci0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX2hlYWQ7IGRlbnRyeTsgZGVudHJ5ID0gZGVudHJ5LT5uZXh0KSB7CisJCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqYTsKKworCQlmb3IgKGEgPSBkZW50cnktPmt2OyBhOyBhID0gYS0+YXNzb2NpYXRlKSB7CisJCQl1X2ludDMyX3QgdmFsdWUgPSAwOworCisJCQkvKiBTcGVjaWFsIENhc2U6IEV4dGVuZGVkIEtleSBTcGVjaWZpZXJfSUQgKi8KKwkJCWlmIChhLT5rZXkuaWQgPT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9LRVlfU1BFQ0lGSUVSX0lEKSB7CisJCQkJaWYgKGxhc3RfZXh0a2V5X3NwZWMgPT0gTlVMTCkgeworCQkJCQlsYXN0X2V4dGtleV9zcGVjID0gYTsKKwkJCQl9IGVsc2UgaWYgKGEtPnZhbHVlLmltbWVkaWF0ZSAhPSBsYXN0X2V4dGtleV9zcGVjLT52YWx1ZS5pbW1lZGlhdGUpIHsKKwkJCQkJbGFzdF9leHRrZXlfc3BlYyA9IGE7CisJCQkJfSBlbHNlIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJLyogU3BlY2lhbCBDYXNlOiBFeHRlbmRlZCBLZXkgKi8KKwkJCX0gZWxzZSBpZiAoYS0+a2V5LmlkID09IENTUjEyMTJfS1ZfSURfRVhURU5ERURfS0VZKSB7CisJCQkJaWYgKGxhc3RfZXh0a2V5ID09IE5VTEwpIHsKKwkJCQkJbGFzdF9leHRrZXkgPSBhOworCQkJCX0gZWxzZSBpZiAoYS0+dmFsdWUuaW1tZWRpYXRlICE9IGxhc3RfZXh0a2V5LT52YWx1ZS5pbW1lZGlhdGUpIHsKKwkJCQkJbGFzdF9leHRrZXkgPSBhOworCQkJCX0gZWxzZSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJc3dpdGNoKGEtPmtleS50eXBlKSB7CisJCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9JTU1FRElBVEU6CisJCQkJdmFsdWUgPSBhLT52YWx1ZS5pbW1lZGlhdGU7CisJCQkJYnJlYWs7CisJCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9DU1JfT0ZGU0VUOgorCQkJCXZhbHVlID0gYS0+dmFsdWUuY3NyX29mZnNldDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0xFQUY6CisJCQkJdmFsdWUgPSBhLT5vZmZzZXQ7CisJCQkJdmFsdWUgLT0gZGlyLT5vZmZzZXQgKyBxdWFkc190b19ieXRlcygxK2luZGV4KTsKKwkJCQl2YWx1ZSA9IGJ5dGVzX3RvX3F1YWRzKHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0RJUkVDVE9SWToKKwkJCQl2YWx1ZSA9IGEtPm9mZnNldDsKKwkJCQl2YWx1ZSAtPSBkaXItPm9mZnNldCArIHF1YWRzX3RvX2J5dGVzKDEraW5kZXgpOworCQkJCXZhbHVlID0gYnl0ZXNfdG9fcXVhZHModmFsdWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJCQlicmVhazsgLyogR0RCIGJyZWFrcG9pbnQgKi8KKwkJCX0KKworCQkJdmFsdWUgfD0gKGEtPmtleS5pZCAmIENTUjEyMTJfS1ZfS0VZX0lEX01BU0spIDw8IENTUjEyMTJfS1ZfS0VZX1NISUZUOworCQkJdmFsdWUgfD0gKGEtPmtleS50eXBlICYgQ1NSMTIxMl9LVl9LRVlfVFlQRV9NQVNLKSA8PAorCQkJCShDU1IxMjEyX0tWX0tFWV9TSElGVCArIENTUjEyMTJfS1ZfS0VZX1RZUEVfU0hJRlQpOworCQkJZGF0YV9idWZmZXJbaW5kZXhdID0gQ1NSMTIxMl9DUFVfVE9fQkUzMih2YWx1ZSk7CisJCQlpbmRleCsrOworCQl9CisJfQorfQorCit2b2lkIGNzcjEyMTJfZmlsbF9jYWNoZShzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZSkKK3sKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2LCAqbmt2OworCXN0cnVjdCBjc3IxMjEyX2tleXZhbF9pbWcgKmt2aTsKKworCWZvciAoa3YgPSBjYWNoZS0+bGF5b3V0X2hlYWQ7IGt2ICE9IGNhY2hlLT5sYXlvdXRfdGFpbC0+bmV4dDsga3YgPSBua3YpIHsKKwkJa3ZpID0gKHN0cnVjdCBjc3IxMjEyX2tleXZhbF9pbWcgKikKKwkJCShjYWNoZS0+ZGF0YSArIGJ5dGVzX3RvX3F1YWRzKGt2LT5vZmZzZXQgLSBjYWNoZS0+b2Zmc2V0KSk7CisJCXN3aXRjaChrdi0+a2V5LnR5cGUpIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSBDU1IxMjEyX0tWX1RZUEVfSU1NRURJQVRFOgorCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9DU1JfT0ZGU0VUOgorCQkJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisJCQlicmVhazsgLyogR0RCIGJyZWFrcG9pbnQgKi8KKworCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9MRUFGOgorCQkJLyogRG9uJ3QgY29weSBvdmVyIEV4dGVuZGVkIFJPTSBhcmVhcywgdGhleSBhcmUKKwkJCSAqIGFscmVhZHkgZmlsbGVkIG91dCEgKi8KKwkJCWlmIChrdi0+a2V5LmlkICE9IENTUjEyMTJfS1ZfSURfRVhURU5ERURfUk9NKQorCQkJCW1lbWNweShrdmktPmRhdGEsIGt2LT52YWx1ZS5sZWFmLmRhdGEsCisJCQkJICAgICAgIHF1YWRzX3RvX2J5dGVzKGt2LT52YWx1ZS5sZWFmLmxlbikpOworCisJCQlrdmktPmxlbmd0aCA9IENTUjEyMTJfQ1BVX1RPX0JFMTYoa3YtPnZhbHVlLmxlYWYubGVuKTsKKwkJCWt2aS0+Y3JjID0gY3NyMTIxMl9jcmMxNihrdmktPmRhdGEsIGt2LT52YWx1ZS5sZWFmLmxlbik7CisJCQlicmVhazsKKworCQljYXNlIENTUjEyMTJfS1ZfVFlQRV9ESVJFQ1RPUlk6CisJCQljc3IxMjEyX2dlbmVyYXRlX3RyZWVfc3ViZGlyKGt2LCBrdmktPmRhdGEpOworCisJCQlrdmktPmxlbmd0aCA9IENTUjEyMTJfQ1BVX1RPX0JFMTYoa3YtPnZhbHVlLmRpcmVjdG9yeS5sZW4pOworCQkJa3ZpLT5jcmMgPSBjc3IxMjEyX2NyYzE2KGt2aS0+ZGF0YSwga3YtPnZhbHVlLmRpcmVjdG9yeS5sZW4pOworCQkJYnJlYWs7CisJCX0KKworCQlua3YgPSBrdi0+bmV4dDsKKwkJaWYgKGt2LT5wcmV2KQorCQkJa3YtPnByZXYtPm5leHQgPSBOVUxMOworCQlpZiAoa3YtPm5leHQpCisJCQlrdi0+bmV4dC0+cHJldiA9IE5VTEw7CisJCWt2LT5wcmV2ID0gTlVMTDsKKwkJa3YtPm5leHQgPSBOVUxMOworCX0KK30KKworaW50IGNzcjEyMTJfZ2VuZXJhdGVfY3NyX2ltYWdlKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyKQoreworCXN0cnVjdCBjc3IxMjEyX2J1c19pbmZvX2Jsb2NrX2ltZyAqYmk7CisJc3RydWN0IGNzcjEyMTJfY3NyX3JvbV9jYWNoZSAqY2FjaGU7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdjsKKwlzaXplX3QgYWdnX3NpemU7CisJaW50IHJldDsKKwlpbnQgaW5pdF9vZmZzZXQ7CisKKwlpZiAoIWNzcikKKwkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOworCisJY2FjaGUgPSBjc3ItPmNhY2hlX2hlYWQ7CisKKwliaSA9IChzdHJ1Y3QgY3NyMTIxMl9idXNfaW5mb19ibG9ja19pbWcqKWNhY2hlLT5kYXRhOworCisJYmktPmxlbmd0aCA9IGJ5dGVzX3RvX3F1YWRzKGNzci0+YnVzX2luZm9fbGVuKSAtIDE7CisJYmktPmNyY19sZW5ndGggPSBiaS0+bGVuZ3RoOworCWJpLT5jcmMgPSBjc3IxMjEyX2NyYzE2KGJpLT5kYXRhLCBiaS0+Y3JjX2xlbmd0aCk7CisKKwljc3ItPnJvb3Rfa3YtPm5leHQgPSBOVUxMOworCWNzci0+cm9vdF9rdi0+cHJldiA9IE5VTEw7CisKKwlhZ2dfc2l6ZSA9IGNzcjEyMTJfZ2VuZXJhdGVfbGF5b3V0X29yZGVyKGNzci0+cm9vdF9rdik7CisKKwlpbml0X29mZnNldCA9IGNzci0+YnVzX2luZm9fbGVuOworCisJZm9yIChrdiA9IGNzci0+cm9vdF9rdiwgY2FjaGUgPSBjc3ItPmNhY2hlX2hlYWQ7IGt2OyBjYWNoZSA9IGNhY2hlLT5uZXh0KSB7CisJCWlmICghY2FjaGUpIHsKKwkJCS8qIEVzdGltYXRlIGFwcHJveGltYXRlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNhY2hlCisJCQkgKiByZWdpb25zIG5lZWRlZCAoaXQgYXNzdW1lcyB0aGF0IHRoZSBjYWNoZSBob2xkaW5nCisJCQkgKiB0aGUgZmlyc3QgMUsgQ29uZmlnIFJPTSBzcGFjZSBhbHdheXMgZXhpc3RzKS4gKi8KKwkJCWludCBlc3RfYyA9IGFnZ19zaXplIC8gKENTUjEyMTJfRVhURU5ERURfUk9NX1NJWkUgLQorCQkJCQkJKDIgKiBzaXplb2YodV9pbnQzMl90KSkpICsgMTsKKworCQkJLyogQWRkIGFkZGl0aW9uYWwgY2FjaGUgcmVnaW9ucywgZXh0cmFzIHdpbGwgYmUKKwkJCSAqIHJlbW92ZWQgbGF0ZXIgKi8KKwkJCWZvciAoOyBlc3RfYzsgZXN0X2MtLSkgeworCQkJCXJldCA9IGNzcjEyMTJfYXBwZW5kX25ld19jYWNoZShjc3IsIENTUjEyMTJfRVhURU5ERURfUk9NX1NJWkUpOworCQkJCWlmIChyZXQgIT0gQ1NSMTIxMl9TVUNDRVNTKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJLyogTmVlZCB0byByZS1sYXlvdXQgZm9yIGFkZGl0aW9uYWwgY2FjaGUgcmVnaW9ucyAqLworCQkJYWdnX3NpemUgPSBjc3IxMjEyX2dlbmVyYXRlX2xheW91dF9vcmRlcihjc3ItPnJvb3Rfa3YpOworCQkJa3YgPSBjc3ItPnJvb3Rfa3Y7CisJCQljYWNoZSA9IGNzci0+Y2FjaGVfaGVhZDsKKwkJCWluaXRfb2Zmc2V0ID0gY3NyLT5idXNfaW5mb19sZW47CisJCX0KKwkJa3YgPSBjc3IxMjEyX2dlbmVyYXRlX3Bvc2l0aW9ucyhjYWNoZSwga3YsIGluaXRfb2Zmc2V0KTsKKwkJYWdnX3NpemUgLT0gY2FjaGUtPmxlbjsKKwkJaW5pdF9vZmZzZXQgPSBzaXplb2YodV9pbnQzMl90KTsKKwl9CisKKwkvKiBSZW1vdmUgdW51c2VkLCBleGNlc3MgY2FjaGUgcmVnaW9ucyAqLworCXdoaWxlIChjYWNoZSkgeworCQlzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpvYyA9IGNhY2hlOworCisJCWNhY2hlID0gY2FjaGUtPm5leHQ7CisJCWNzcjEyMTJfcmVtb3ZlX2NhY2hlKGNzciwgb2MpOworCX0KKworCS8qIEdvIHRocm91Z2ggdGhlIGxpc3QgYmFja3dhcmQgc28gdGhhdCB3aGVuIGRvbmUsIHRoZSBjb3JyZWN0IENSQworCSAqIHdpbGwgYmUgY2FsY3VsYXRlZCBmb3IgdGhlIEV4dGVuZGVkIFJPTSBhcmVhcy4gKi8KKwlmb3IoY2FjaGUgPSBjc3ItPmNhY2hlX3RhaWw7IGNhY2hlOyBjYWNoZSA9IGNhY2hlLT5wcmV2KSB7CisJCS8qIE9ubHkgRXh0ZW5kZWQgUk9NIGNhY2hlcyBzaG91bGQgaGF2ZSB0aGlzIHNldC4gKi8KKwkJaWYgKGNhY2hlLT5leHRfcm9tKSB7CisJCQlpbnQgbGVhZl9zaXplOworCisJCQkvKiBNYWtlIHN1cmUgdGhlIEV4dGVuZGVkIFJPTSBsZWFmIGlzIGEgbXVsdGlwbGUgb2YKKwkJCSAqIG1heF9yb20gaW4gc2l6ZS4gKi8KKwkJCWxlYWZfc2l6ZSA9IChjYWNoZS0+bGVuICsgKGNzci0+bWF4X3JvbSAtIDEpKSAmCisJCQkJfihjc3ItPm1heF9yb20gLSAxKTsKKworCQkJLyogWmVybyBvdXQgdGhlIHVudXNlZCBST00gcmVnaW9uICovCisJCQltZW1zZXQoY2FjaGUtPmRhdGEgKyBieXRlc190b19xdWFkcyhjYWNoZS0+bGVuKSwgMHgwMCwKKwkJCSAgICAgICBsZWFmX3NpemUgLSBjYWNoZS0+bGVuKTsKKworCQkJLyogU3VidHJhY3QgbGVhZiBoZWFkZXIgKi8KKwkJCWxlYWZfc2l6ZSAtPSBzaXplb2YodV9pbnQzMl90KTsKKworCQkJLyogVXBkYXRlIHRoZSBFeHRlbmRlZCBST00gbGVhZiBsZW5ndGggKi8KKwkJCWNhY2hlLT5leHRfcm9tLT52YWx1ZS5sZWFmLmxlbiA9CisJCQkJYnl0ZXNfdG9fcXVhZHMobGVhZl9zaXplKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFplcm8gb3V0IHRoZSB1bnVzZWQgUk9NIHJlZ2lvbiAqLworCQkJbWVtc2V0KGNhY2hlLT5kYXRhICsgYnl0ZXNfdG9fcXVhZHMoY2FjaGUtPmxlbiksIDB4MDAsCisJCQkgICAgICAgY2FjaGUtPnNpemUgLSBjYWNoZS0+bGVuKTsKKwkJfQorCisJCS8qIENvcHkgdGhlIGRhdGEgaW50byB0aGUgY2FjaGUgYnVmZmVyICovCisJCWNzcjEyMTJfZmlsbF9jYWNoZShjYWNoZSk7CisKKwkJaWYgKGNhY2hlICE9IGNzci0+Y2FjaGVfaGVhZCkgeworCQkJLyogU2V0IHRoZSBsZW5ndGggYW5kIENSQyBvZiB0aGUgZXh0ZW5kZWQgUk9NLiAqLworCQkJc3RydWN0IGNzcjEyMTJfa2V5dmFsX2ltZyAqa3ZpID0KKwkJCQkoc3RydWN0IGNzcjEyMTJfa2V5dmFsX2ltZyopY2FjaGUtPmRhdGE7CisKKwkJCWt2aS0+bGVuZ3RoID0gQ1NSMTIxMl9DUFVfVE9fQkUxNihieXRlc190b19xdWFkcyhjYWNoZS0+bGVuKSAtIDEpOworCQkJa3ZpLT5jcmMgPSBjc3IxMjEyX2NyYzE2KGt2aS0+ZGF0YSwKKwkJCQkJCSBieXRlc190b19xdWFkcyhjYWNoZS0+bGVuKSAtIDEpOworCisJCX0KKwl9CisKKwlyZXR1cm4gQ1NSMTIxMl9TVUNDRVNTOworfQorCitpbnQgY3NyMTIxMl9yZWFkKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLCB1X2ludDMyX3Qgb2Zmc2V0LCB2b2lkICpidWZmZXIsIHVfaW50MzJfdCBsZW4pCit7CisJc3RydWN0IGNzcjEyMTJfY3NyX3JvbV9jYWNoZSAqY2FjaGU7CisKKwlmb3IgKGNhY2hlID0gY3NyLT5jYWNoZV9oZWFkOyBjYWNoZTsgY2FjaGUgPSBjYWNoZS0+bmV4dCkgeworCQlpZiAob2Zmc2V0ID49IGNhY2hlLT5vZmZzZXQgJiYKKwkJICAgIChvZmZzZXQgKyBsZW4pIDw9IChjYWNoZS0+b2Zmc2V0ICsgY2FjaGUtPnNpemUpKSB7CisJCQltZW1jcHkoYnVmZmVyLAorCQkJICAgICAgICZjYWNoZS0+ZGF0YVtieXRlc190b19xdWFkcyhvZmZzZXQgLSBjYWNoZS0+b2Zmc2V0KV0sCisJCQkgICAgICAgbGVuKTsKKwkJCXJldHVybiBDU1IxMjEyX1NVQ0NFU1M7CisJCX0KKwl9CisJcmV0dXJuIENTUjEyMTJfRU5PRU5UOworfQorCisKKworLyogUGFyc2UgYSBjaHVuayBvZiBkYXRhIGFzIGEgQ29uZmlnIFJPTSAqLworCitzdGF0aWMgaW50IGNzcjEyMTJfcGFyc2VfYnVzX2luZm9fYmxvY2soc3RydWN0IGNzcjEyMTJfY3NyICpjc3IpCit7CisJc3RydWN0IGNzcjEyMTJfYnVzX2luZm9fYmxvY2tfaW1nICpiaTsKKwlzdHJ1Y3QgY3NyMTIxMl9jYWNoZV9yZWdpb24gKmNyOworCWludCBpOworCWludCByZXQ7CisKKwkvKiBJRUVFIDEyMTIgc2F5cyB0aGF0IHRoZSBlbnRpcmUgYnVzIGluZm8gYmxvY2sgc2hvdWxkIGJlIHJlYWRhYmxlIGluCisJICogYSBzaW5nbGUgdHJhbnNhY3Rpb24gcmVnYXJkbGVzcyBvZiB0aGUgbWF4X3JvbSB2YWx1ZS4KKwkgKiBVbmZvcnR1bmF0ZWx5LCBtYW55IElFRUUgMTM5NCBkZXZpY2VzIGRvIG5vdCBhYmlkZSBieSB0aGF0LCBzbyB0aGUKKwkgKiBidXMgaW5mbyBibG9jayB3aWxsIGJlIHJlYWQgMSBxdWFkbGV0IGF0IGEgdGltZS4gIFRoZSByZXN0IG9mIHRoZQorCSAqIENvbmZpZ1JPTSB3aWxsIGJlIHJlYWQgYWNjb3JkaW5nIHRvIHRoZSBtYXhfcm9tIGZpZWxkLiAqLworCWZvciAoaSA9IDA7IGkgPCBjc3ItPmJ1c19pbmZvX2xlbjsgaSArPSBzaXplb2YoY3NyMTIxMl9xdWFkX3QpKSB7CisJCXJldCA9IGNzci0+b3BzLT5idXNfcmVhZChjc3IsIENTUjEyMTJfQ09ORklHX1JPTV9TUEFDRV9CQVNFICsgaSwKKwkJCQkJIHNpemVvZihjc3IxMjEyX3F1YWRfdCksCisJCQkJCSAmY3NyLT5jYWNoZV9oZWFkLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGkpXSwKKwkJCQkJIGNzci0+cHJpdmF0ZSk7CisJCWlmIChyZXQgIT0gQ1NSMTIxMl9TVUNDRVNTKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwliaSA9IChzdHJ1Y3QgY3NyMTIxMl9idXNfaW5mb19ibG9ja19pbWcqKWNzci0+Y2FjaGVfaGVhZC0+ZGF0YTsKKwljc3ItPmNyY19sZW4gPSBxdWFkc190b19ieXRlcyhiaS0+Y3JjX2xlbmd0aCk7CisKKwkvKiBJRUVFIDEyMTIgcmVjb21tZW5kcyB0aGF0IGNyY19sZW4gYmUgZXF1YWwgdG8gYnVzX2luZm9fbGVuLCBidXQgdGhhdCBpcyBub3QKKwkgKiBhbHdheXMgdGhlIGNhc2UsIHNvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGNyYyBhcmVhIDEgcXVhZGxldCBhdCBhIHRpbWUuICovCisJZm9yIChpID0gY3NyLT5idXNfaW5mb19sZW47IGkgPD0gY3NyLT5jcmNfbGVuOyBpICs9IHNpemVvZihjc3IxMjEyX3F1YWRfdCkpIHsKKwkJcmV0ID0gY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwgQ1NSMTIxMl9DT05GSUdfUk9NX1NQQUNFX0JBU0UgKyBpLAorCQkJCQkgc2l6ZW9mKGNzcjEyMTJfcXVhZF90KSwKKwkJCQkJICZjc3ItPmNhY2hlX2hlYWQtPmRhdGFbYnl0ZXNfdG9fcXVhZHMoaSldLAorCQkJCQkgY3NyLT5wcml2YXRlKTsKKwkJaWYgKHJldCAhPSBDU1IxMjEyX1NVQ0NFU1MpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChieXRlc190b19xdWFkcyhjc3ItPmJ1c19pbmZvX2xlbiAtIHNpemVvZihjc3IxMjEyX3F1YWRfdCkpICE9IGJpLT5sZW5ndGgpCisJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKKworI2lmIDAKKwkvKiBBcHBhcmVudGx5IHRoZXJlIGFyZSB0b28gbWFueSBkaWZmZXJudCB3cm9uZyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCisJICogQ1JDIGFsZ29yaXRobSB0aGF0IHZlcmlmeWluZyB0aGVtIGlzIG1vb3QuICovCisJaWYgKChjc3IxMjEyX2NyYzE2KGJpLT5kYXRhLCBiaS0+Y3JjX2xlbmd0aCkgIT0gYmktPmNyYykgJiYKKwkgICAgKGNzcjEyMTJfbXNmdF9jcmMxNihiaS0+ZGF0YSwgYmktPmNyY19sZW5ndGgpICE9IGJpLT5jcmMpKQorCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CisjZW5kaWYKKworCWNyID0gQ1NSMTIxMl9NQUxMT0Moc2l6ZW9mKHN0cnVjdCBjc3IxMjEyX2NhY2hlX3JlZ2lvbikpOworCWlmICghY3IpCisJCXJldHVybiBDU1IxMjEyX0VOT01FTTsKKworCWNyLT5uZXh0ID0gTlVMTDsKKwljci0+cHJldiA9IE5VTEw7CisJY3ItPm9mZnNldF9zdGFydCA9IDA7CisJY3ItPm9mZnNldF9lbmQgPSBjc3ItPmNyY19sZW4gKyA0OworCisJY3NyLT5jYWNoZV9oZWFkLT5maWxsZWRfaGVhZCA9IGNyOworCWNzci0+Y2FjaGVfaGVhZC0+ZmlsbGVkX3RhaWwgPSBjcjsKKworCXJldHVybiBDU1IxMjEyX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgY3NyMTIxMl9wYXJzZV9kaXJfZW50cnkoc3RydWN0IGNzcjEyMTJfa2V5dmFsICpkaXIsCisJCQkJICAgY3NyMTIxMl9xdWFkX3Qga2ksCisJCQkJICAgdV9pbnQzMl90IGt2X3BvcykKK3sKKwlpbnQgcmV0ID0gQ1NSMTIxMl9TVUNDRVNTOworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqayA9IE5VTEw7CisJdV9pbnQzMl90IG9mZnNldDsKKworCXN3aXRjaChDU1IxMjEyX0tWX0tFWV9UWVBFKGtpKSkgeworCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0lNTUVESUFURToKKwkJayA9IGNzcjEyMTJfbmV3X2ltbWVkaWF0ZShDU1IxMjEyX0tWX0tFWV9JRChraSksCisJCQkJCSAgQ1NSMTIxMl9LVl9WQUwoa2kpKTsKKwkJaWYgKCFrKSB7CisJCQlyZXQgPSBDU1IxMjEyX0VOT01FTTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWstPnJlZmNudCA9IDA7CS8qIERvbid0IGtlZXAgbG9jYWwgcmVmZXJlbmNlIHdoZW4gcGFyc2luZy4gKi8KKwkJYnJlYWs7CisKKwljYXNlIENTUjEyMTJfS1ZfVFlQRV9DU1JfT0ZGU0VUOgorCQlrID0gY3NyMTIxMl9uZXdfY3NyX29mZnNldChDU1IxMjEyX0tWX0tFWV9JRChraSksCisJCQkJCSAgIENTUjEyMTJfS1ZfVkFMKGtpKSk7CisJCWlmICghaykgeworCQkJcmV0ID0gQ1NSMTIxMl9FTk9NRU07CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJay0+cmVmY250ID0gMDsJLyogRG9uJ3Qga2VlcCBsb2NhbCByZWZlcmVuY2Ugd2hlbiBwYXJzaW5nLiAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIENvbXB1dGUgdGhlIG9mZnNldCBmcm9tIDB4ZmZmZiBmMDAwIDAwMDAuICovCisJCW9mZnNldCA9IHF1YWRzX3RvX2J5dGVzKENTUjEyMTJfS1ZfVkFMKGtpKSkgKyBrdl9wb3M7CisJCWlmIChvZmZzZXQgPT0ga3ZfcG9zKSB7CisJCQkvKiBVaC1vaC4gIENhbid0IGhhdmUgYSByZWxhdGl2ZSBvZmZzZXQgb2YgMCBmb3IgTGVhdmVzCisJCQkgKiBvciBEaXJlY3Rvcmllcy4gIFRoZSBDb25maWcgUk9NIGltYWdlIGlzIG1vc3QgbGlrZWx5CisJCQkgKiBtZXNzZWQgdXAsIHNvIHdlJ2xsIGp1c3QgYWJvcnQgaGVyZS4gKi8KKwkJCXJldCA9IENTUjEyMTJfRUlPOworCQkJZ290byBmYWlsOworCQl9CisKKwkJayA9IGNzcjEyMTJfZmluZF9rZXl2YWxfb2Zmc2V0KGRpciwgb2Zmc2V0KTsKKworCQlpZiAoaykKKwkJCWJyZWFrOwkJLyogRm91bmQgaXQuICovCisKKwkJaWYgKENTUjEyMTJfS1ZfS0VZX1RZUEUoa2kpID09IENTUjEyMTJfS1ZfVFlQRV9ESVJFQ1RPUlkpIHsKKwkJCWsgPSBjc3IxMjEyX25ld19kaXJlY3RvcnkoQ1NSMTIxMl9LVl9LRVlfSUQoa2kpKTsKKwkJfSBlbHNlIHsKKwkJCWsgPSBjc3IxMjEyX25ld19sZWFmKENTUjEyMTJfS1ZfS0VZX0lEKGtpKSwgTlVMTCwgMCk7CisJCX0KKwkJaWYgKCFrKSB7CisJCQlyZXQgPSBDU1IxMjEyX0VOT01FTTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlrLT5yZWZjbnQgPSAwOwkvKiBEb24ndCBrZWVwIGxvY2FsIHJlZmVyZW5jZSB3aGVuIHBhcnNpbmcuICovCisJCWstPnZhbGlkID0gMDsJLyogQ29udGVudHMgbm90IHJlYWQgeWV0IHNvIGl0J3Mgbm90IHZhbGlkLiAqLworCQlrLT5vZmZzZXQgPSBvZmZzZXQ7CisKKwkJay0+cHJldiA9IGRpcjsKKwkJay0+bmV4dCA9IGRpci0+bmV4dDsKKwkJZGlyLT5uZXh0LT5wcmV2ID0gazsKKwkJZGlyLT5uZXh0ID0gazsKKwl9CisJcmV0ID0gY3NyMTIxMl9hdHRhY2hfa2V5dmFsX3RvX2RpcmVjdG9yeShkaXIsIGspOworCitmYWlsOgorCWlmIChyZXQgIT0gQ1NSMTIxMl9TVUNDRVNTKSB7CisJCWlmIChrKQorCQkJZnJlZV9rZXl2YWwoayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworaW50IGNzcjEyMTJfcGFyc2Vfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YsCisJCQkgc3RydWN0IGNzcjEyMTJfY3NyX3JvbV9jYWNoZSAqY2FjaGUpCit7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsX2ltZyAqa3ZpOworCWludCBpOworCWludCByZXQgPSBDU1IxMjEyX1NVQ0NFU1M7CisJaW50IGt2aV9sZW47CisKKwlrdmkgPSAoc3RydWN0IGNzcjEyMTJfa2V5dmFsX2ltZyopJmNhY2hlLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGt2LT5vZmZzZXQgLQorCQkJCQkJCQkgICAgICBjYWNoZS0+b2Zmc2V0KV07CisJa3ZpX2xlbiA9IENTUjEyMTJfQkUxNl9UT19DUFUoa3ZpLT5sZW5ndGgpOworCisjaWYgMAorCS8qIEFwcGFyZW50bHkgdGhlcmUgYXJlIHRvbyBtYW55IGRpZmZlcm50IHdyb25nIGltcGxlbWVudGF0aW9ucyBvZiB0aGUKKwkgKiBDUkMgYWxnb3JpdGhtIHRoYXQgdmVyaWZ5aW5nIHRoZW0gaXMgbW9vdC4gKi8KKwlpZiAoKGNzcjEyMTJfY3JjMTYoa3ZpLT5kYXRhLCBrdmlfbGVuKSAhPSBrdmktPmNyYykgJiYKKwkgICAgKGNzcjEyMTJfbXNmdF9jcmMxNihrdmktPmRhdGEsIGt2aV9sZW4pICE9IGt2aS0+Y3JjKSkgeworCQlyZXQgPSBDU1IxMjEyX0VJTlZBTDsKKwkJZ290byBmYWlsOworCX0KKyNlbmRpZgorCisJc3dpdGNoKGt2LT5rZXkudHlwZSkgeworCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0RJUkVDVE9SWToKKwkJZm9yIChpID0gMDsgaSA8IGt2aV9sZW47IGkrKykgeworCQkJY3NyMTIxMl9xdWFkX3Qga2kgPSBrdmktPmRhdGFbaV07CisKKwkJCS8qIFNvbWUgZGV2aWNlcyBwdXQgbnVsbCBlbnRyaWVzIGluIHRoZWlyIHVuaXQKKwkJCSAqIGRpcmVjdG9yaWVzLiAgSWYgd2UgY29tZSBhY3Jvc3Mgc3VjaCBhbiBlbnRyeSwKKwkJCSAqIHRoZW4gc2tpcCBpdC4gKi8KKwkJCWlmIChraSA9PSAweDApCisJCQkJY29udGludWU7CisJCQlyZXQgPSBjc3IxMjEyX3BhcnNlX2Rpcl9lbnRyeShrdiwga2ksCisJCQkJCQkgICAgICAoa3YtPm9mZnNldCArCisJCQkJCQkgICAgICAgcXVhZHNfdG9fYnl0ZXMoaSArIDEpKSk7CisJCX0KKwkJa3YtPnZhbHVlLmRpcmVjdG9yeS5sZW4gPSBrdmlfbGVuOworCQlicmVhazsKKworCWNhc2UgQ1NSMTIxMl9LVl9UWVBFX0xFQUY6CisJCWlmIChrdi0+a2V5LmlkICE9IENTUjEyMTJfS1ZfSURfRVhURU5ERURfUk9NKSB7CisJCQlrdi0+dmFsdWUubGVhZi5kYXRhID0gQ1NSMTIxMl9NQUxMT0MocXVhZHNfdG9fYnl0ZXMoa3ZpX2xlbikpOworCQkJaWYgKCFrdi0+dmFsdWUubGVhZi5kYXRhKQorCQkJeworCQkJCXJldCA9IENTUjEyMTJfRU5PTUVNOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKworCQkJa3YtPnZhbHVlLmxlYWYubGVuID0ga3ZpX2xlbjsKKwkJCW1lbWNweShrdi0+dmFsdWUubGVhZi5kYXRhLCBrdmktPmRhdGEsIHF1YWRzX3RvX2J5dGVzKGt2aV9sZW4pKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlrdi0+dmFsaWQgPSAxOworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKworaW50IF9jc3IxMjEyX3JlYWRfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLCBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KQoreworCXN0cnVjdCBjc3IxMjEyX2NhY2hlX3JlZ2lvbiAqY3IsICpuY3IsICpuZXdjciA9IE5VTEw7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsX2ltZyAqa3ZpID0gTlVMTDsKKwlzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZTsKKwlpbnQgY2FjaGVfaW5kZXg7CisJdV9pbnQ2NF90IGFkZHI7CisJdV9pbnQzMl90ICpjYWNoZV9wdHI7CisJdV9pbnQxNl90IGt2X2xlbiA9IDA7CisKKwlpZiAoIWNzciB8fCAha3YpCisJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKKworCS8qIEZpcnN0IGZpbmQgd2hpY2ggY2FjaGUgdGhlIGRhdGEgc2hvdWxkIGJlIGluIChvciBnbyBpbiBpZiBub3QgcmVhZAorCSAqIHlldCkuICovCisJZm9yIChjYWNoZSA9IGNzci0+Y2FjaGVfaGVhZDsgY2FjaGU7IGNhY2hlID0gY2FjaGUtPm5leHQpIHsKKwkJaWYgKGt2LT5vZmZzZXQgPj0gY2FjaGUtPm9mZnNldCAmJgorCQkgICAga3YtPm9mZnNldCA8IChjYWNoZS0+b2Zmc2V0ICsgY2FjaGUtPnNpemUpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFjYWNoZSkgeworCQljc3IxMjEyX3F1YWRfdCBxOworCQl1X2ludDMyX3QgY2FjaGVfc2l6ZTsKKworCQkvKiBPbmx5IGNyZWF0ZSBhIG5ldyBjYWNoZSBmb3IgRXh0ZW5kZWQgUk9NIGxlYXZlcy4gKi8KKwkJaWYgKGt2LT5rZXkuaWQgIT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9ST00pCisJCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CisKKwkJaWYgKGNzci0+b3BzLT5idXNfcmVhZChjc3IsCisJCQkJICAgICAgIENTUjEyMTJfUkVHSVNURVJfU1BBQ0VfQkFTRSArIGt2LT5vZmZzZXQsCisJCQkJICAgICAgIHNpemVvZihjc3IxMjEyX3F1YWRfdCksICZxLCBjc3ItPnByaXZhdGUpKSB7CisJCQlyZXR1cm4gQ1NSMTIxMl9FSU87CisJCX0KKworCQlrdi0+dmFsdWUubGVhZi5sZW4gPSBDU1IxMjEyX0JFMzJfVE9fQ1BVKHEpID4+IDE2OworCisJCWNhY2hlX3NpemUgPSAocXVhZHNfdG9fYnl0ZXMoa3YtPnZhbHVlLmxlYWYubGVuICsgMSkgKworCQkJICAgICAgKGNzci0+bWF4X3JvbSAtIDEpKSAmIH4oY3NyLT5tYXhfcm9tIC0gMSk7CisKKwkJY2FjaGUgPSBjc3IxMjEyX3JvbV9jYWNoZV9tYWxsb2Moa3YtPm9mZnNldCwgY2FjaGVfc2l6ZSk7CisJCWlmICghY2FjaGUpCisJCQlyZXR1cm4gQ1NSMTIxMl9FTk9NRU07CisKKwkJa3YtPnZhbHVlLmxlYWYuZGF0YSA9ICZjYWNoZS0+ZGF0YVsxXTsKKwkJY3NyLT5jYWNoZV90YWlsLT5uZXh0ID0gY2FjaGU7CisJCWNhY2hlLT5wcmV2ID0gY3NyLT5jYWNoZV90YWlsOworCQljYWNoZS0+bmV4dCA9IE5VTEw7CisJCWNzci0+Y2FjaGVfdGFpbCA9IGNhY2hlOworCQljYWNoZS0+ZmlsbGVkX2hlYWQgPQorCQkJQ1NSMTIxMl9NQUxMT0Moc2l6ZW9mKHN0cnVjdCBjc3IxMjEyX2NhY2hlX3JlZ2lvbikpOworCQlpZiAoIWNhY2hlLT5maWxsZWRfaGVhZCkgeworCQkJcmV0dXJuIENTUjEyMTJfRU5PTUVNOworCQl9CisKKwkJY2FjaGUtPmZpbGxlZF9oZWFkLT5vZmZzZXRfc3RhcnQgPSAwOworCQljYWNoZS0+ZmlsbGVkX2hlYWQtPm9mZnNldF9lbmQgPSBzaXplb2YoY3NyMTIxMl9xdWFkX3QpOworCQljYWNoZS0+ZmlsbGVkX3RhaWwgPSBjYWNoZS0+ZmlsbGVkX2hlYWQ7CisJCWNhY2hlLT5maWxsZWRfaGVhZC0+bmV4dCA9IE5VTEw7CisJCWNhY2hlLT5maWxsZWRfaGVhZC0+cHJldiA9IE5VTEw7CisJCWNhY2hlLT5kYXRhWzBdID0gcTsKKworCQkvKiBEb24ndCByZWFkIHRoZSBlbnRpcmUgZXh0ZW5kZWQgUk9NIG5vdy4gIFBpZWNlcyBvZiBpdCB3aWxsCisJCSAqIGJlIHJlYWQgd2hlbiBlbnRyaWVzIGluc2lkZSBpdCBhcmUgcmVhZC4gKi8KKwkJcmV0dXJuIGNzcjEyMTJfcGFyc2Vfa2V5dmFsKGt2LCBjYWNoZSk7CisJfQorCisJY2FjaGVfaW5kZXggPSBrdi0+b2Zmc2V0IC0gY2FjaGUtPm9mZnNldDsKKworCS8qIE5vdyBzZWFjaCByZWFkIHBvcnRpb25zIG9mIHRoZSBjYWNoZSB0byBzZWUgaWYgaXQgaXMgdGhlcmUuICovCisJZm9yIChjciA9IGNhY2hlLT5maWxsZWRfaGVhZDsgY3I7IGNyID0gY3ItPm5leHQpIHsKKwkJaWYgKGNhY2hlX2luZGV4IDwgY3ItPm9mZnNldF9zdGFydCkgeworCQkJbmV3Y3IgPSBDU1IxMjEyX01BTExPQyhzaXplb2Yoc3RydWN0IGNzcjEyMTJfY2FjaGVfcmVnaW9uKSk7CisJCQlpZiAoIW5ld2NyKQorCQkJCXJldHVybiBDU1IxMjEyX0VOT01FTTsKKworCQkJbmV3Y3ItPm9mZnNldF9zdGFydCA9IGNhY2hlX2luZGV4ICYgfihjc3ItPm1heF9yb20gLSAxKTsKKwkJCW5ld2NyLT5vZmZzZXRfZW5kID0gbmV3Y3ItPm9mZnNldF9zdGFydDsKKwkJCW5ld2NyLT5uZXh0ID0gY3I7CisJCQluZXdjci0+cHJldiA9IGNyLT5wcmV2OworCQkJY3ItPnByZXYgPSBuZXdjcjsKKwkJCWNyID0gbmV3Y3I7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoY2FjaGVfaW5kZXggPj0gY3ItPm9mZnNldF9zdGFydCkgJiYKKwkJCSAgIChjYWNoZV9pbmRleCA8IGNyLT5vZmZzZXRfZW5kKSkgeworCQkJa3ZpID0gKHN0cnVjdCBjc3IxMjEyX2tleXZhbF9pbWcqKQorCQkJCSgmY2FjaGUtPmRhdGFbYnl0ZXNfdG9fcXVhZHMoY2FjaGVfaW5kZXgpXSk7CisJCQlrdl9sZW4gPSBxdWFkc190b19ieXRlcyhDU1IxMjEyX0JFMTZfVE9fQ1BVKGt2aS0+bGVuZ3RoKSArCisJCQkJCQkxKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGNhY2hlX2luZGV4ID09IGNyLT5vZmZzZXRfZW5kKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFjcikgeworCQljciA9IGNhY2hlLT5maWxsZWRfdGFpbDsKKwkJbmV3Y3IgPSBDU1IxMjEyX01BTExPQyhzaXplb2Yoc3RydWN0IGNzcjEyMTJfY2FjaGVfcmVnaW9uKSk7CisJCWlmICghbmV3Y3IpCisJCQlyZXR1cm4gQ1NSMTIxMl9FTk9NRU07CisKKwkJbmV3Y3ItPm9mZnNldF9zdGFydCA9IGNhY2hlX2luZGV4ICYgfihjc3ItPm1heF9yb20gLSAxKTsKKwkJbmV3Y3ItPm9mZnNldF9lbmQgPSBuZXdjci0+b2Zmc2V0X3N0YXJ0OworCQluZXdjci0+cHJldiA9IGNyOworCQluZXdjci0+bmV4dCA9IGNyLT5uZXh0OworCQljci0+bmV4dCA9IG5ld2NyOworCQljciA9IG5ld2NyOworCQljYWNoZS0+ZmlsbGVkX3RhaWwgPSBuZXdjcjsKKwl9CisKKwl3aGlsZSgha3ZpIHx8IGNyLT5vZmZzZXRfZW5kIDwgY2FjaGVfaW5kZXggKyBrdl9sZW4pIHsKKwkJY2FjaGVfcHRyID0gJmNhY2hlLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGNyLT5vZmZzZXRfZW5kICYKKwkJCQkJCQl+KGNzci0+bWF4X3JvbSAtIDEpKV07CisKKwkJYWRkciA9IChDU1IxMjEyX0NTUl9BUkNIX1JFR19TUEFDRV9CQVNFICsgY2FjaGUtPm9mZnNldCArCisJCQljci0+b2Zmc2V0X2VuZCkgJiB+KGNzci0+bWF4X3JvbSAtIDEpOworCisJCWlmIChjc3ItPm9wcy0+YnVzX3JlYWQoY3NyLCBhZGRyLCBjc3ItPm1heF9yb20sIGNhY2hlX3B0ciwKKwkJCQkgICAgICAgY3NyLT5wcml2YXRlKSkgeworCQkJaWYgKGNzci0+bWF4X3JvbSA9PSA0KQorCQkJCS8qIFdlJ3ZlIGdvdCBwcm9ibGVtcyEgKi8KKwkJCQlyZXR1cm4gQ1NSMTIxMl9FSU87CisKKwkJCS8qIEFwcGVyZW50bHkgdGhlIG1heF9yb20gdmFsdWUgd2FzIGEgbGllLCBzZXQgaXQgdG8KKwkJCSAqIGRvIHF1YWRsZXQgcmVhZHMgYW5kIHRyeSBhZ2Fpbi4gKi8KKwkJCWNzci0+bWF4X3JvbSA9IDQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWNyLT5vZmZzZXRfZW5kICs9IGNzci0+bWF4X3JvbSAtIChjci0+b2Zmc2V0X2VuZCAmCisJCQkJCQkgIChjc3ItPm1heF9yb20gLSAxKSk7CisKKwkJaWYgKCFrdmkgJiYgKGNyLT5vZmZzZXRfZW5kID4gY2FjaGVfaW5kZXgpKSB7CisJCQlrdmkgPSAoc3RydWN0IGNzcjEyMTJfa2V5dmFsX2ltZyopCisJCQkJKCZjYWNoZS0+ZGF0YVtieXRlc190b19xdWFkcyhjYWNoZV9pbmRleCldKTsKKwkJCWt2X2xlbiA9IHF1YWRzX3RvX2J5dGVzKENTUjEyMTJfQkUxNl9UT19DUFUoa3ZpLT5sZW5ndGgpICsKKwkJCQkJCTEpOworCQl9CisKKwkJaWYgKChrdl9sZW4gKyAoa3YtPm9mZnNldCAtIGNhY2hlLT5vZmZzZXQpKSA+IGNhY2hlLT5zaXplKSB7CisJCQkvKiBUaGUgTGVhZiBvciBEaXJlY3RvcnkgY2xhaW1zIGl0cyBsZW5ndGggZXh0ZW5kcworCQkJICogYmV5b25kIHRoZSBDb25maWdST00gaW1hZ2UgcmVnaW9uIGFuZCB0aHVzIGJleW9uZCB0aGUKKwkJCSAqIGVuZCBvZiBvdXIgY2FjaGUgcmVnaW9uLiAgVGhlcmVmb3JlLCB3ZSBhYm9ydCBub3cKKwkJCSAqIHJhdGhlciB0aGFuIHNlZyBmYXVsdGluZyBsYXRlci4gKi8KKwkJCXJldHVybiBDU1IxMjEyX0VJTzsKKwkJfQorCisJCW5jciA9IGNyLT5uZXh0OworCisJCWlmIChuY3IgJiYgKGNyLT5vZmZzZXRfZW5kID49IG5jci0+b2Zmc2V0X3N0YXJ0KSkgeworCQkJLyogY29uc29saWRhdGUgcmVnaW9uIGVudHJpZXMgKi8KKwkJCW5jci0+b2Zmc2V0X3N0YXJ0ID0gY3ItPm9mZnNldF9zdGFydDsKKworCQkJaWYgKGNyLT5wcmV2KQorCQkJCWNyLT5wcmV2LT5uZXh0ID0gY3ItPm5leHQ7CisJCQluY3ItPnByZXYgPSBjci0+cHJldjsKKwkJCWlmIChjYWNoZS0+ZmlsbGVkX2hlYWQgPT0gY3IpCisJCQkJY2FjaGUtPmZpbGxlZF9oZWFkID0gbmNyOworCQkJQ1NSMTIxMl9GUkVFKGNyKTsKKwkJCWNyID0gbmNyOworCQl9CisJfQorCisJcmV0dXJuIGNzcjEyMTJfcGFyc2Vfa2V5dmFsKGt2LCBjYWNoZSk7Cit9CisKKworCitpbnQgY3NyMTIxMl9wYXJzZV9jc3Ioc3RydWN0IGNzcjEyMTJfY3NyICpjc3IpCit7CisJc3RhdGljIGNvbnN0IGludCBtcl9tYXBbXSA9IHsgNCwgNjQsIDEwMjQsIDAgfTsKKwlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKmRlbnRyeTsKKwlpbnQgcmV0OworCisJaWYgKCFjc3IgfHwgIWNzci0+b3BzLT5idXNfcmVhZCkKKwkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOworCisJcmV0ID0gY3NyMTIxMl9wYXJzZV9idXNfaW5mb19ibG9jayhjc3IpOworCWlmIChyZXQgIT0gQ1NSMTIxMl9TVUNDRVNTKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCFjc3ItPm9wcy0+Z2V0X21heF9yb20pCisJCWNzci0+bWF4X3JvbSA9IG1yX21hcFswXTsJLyogZGVmYXVsdCB2YWx1ZSAqLworCWVsc2UKKwkJY3NyLT5tYXhfcm9tID0gbXJfbWFwW2Nzci0+b3BzLT5nZXRfbWF4X3JvbShjc3ItPmJ1c19pbmZvX2RhdGEsCisJCQkJCQkJICAgIGNzci0+cHJpdmF0ZSldOworCisJY3NyLT5jYWNoZV9oZWFkLT5sYXlvdXRfaGVhZCA9IGNzci0+cm9vdF9rdjsKKwljc3ItPmNhY2hlX2hlYWQtPmxheW91dF90YWlsID0gY3NyLT5yb290X2t2OworCisJY3NyLT5yb290X2t2LT5vZmZzZXQgPSAoQ1NSMTIxMl9DT05GSUdfUk9NX1NQQUNFX0JBU0UgJiAweGZmZmYpICsKKwkJY3NyLT5idXNfaW5mb19sZW47CisKKwljc3ItPnJvb3Rfa3YtPnZhbGlkID0gMDsKKwljc3ItPnJvb3Rfa3YtPm5leHQgPSBjc3ItPnJvb3Rfa3Y7CisJY3NyLT5yb290X2t2LT5wcmV2ID0gY3NyLT5yb290X2t2OworCWNzcjEyMTJfZ2V0X2tleXZhbChjc3IsIGNzci0+cm9vdF9rdik7CisKKwkvKiBTY2FuIHRocm91Z2ggdGhlIFJvb3QgZGlyZWN0b3J5IGZpbmRpbmcgYWxsIGV4dGVuZGVkIFJPTSByZWdpb25zCisJICogYW5kIG1ha2UgY2FjaGUgcmVnaW9ucyBmb3IgdGhlbSAqLworCWZvciAoZGVudHJ5ID0gY3NyLT5yb290X2t2LT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfaGVhZDsKKwkgICAgIGRlbnRyeTsgZGVudHJ5ID0gZGVudHJ5LT5uZXh0KSB7CisJCWlmIChkZW50cnktPmt2LT5rZXkuaWQgPT0gQ1NSMTIxMl9LVl9JRF9FWFRFTkRFRF9ST00pIHsKKwkJCWNzcjEyMTJfZ2V0X2tleXZhbChjc3IsIGRlbnRyeS0+a3YpOworCisJCQlpZiAocmV0ICE9IENTUjEyMTJfU1VDQ0VTUykKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIENTUjEyMTJfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5oIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3MzQyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5oCkBAIC0wLDAgKzEsNzI3IEBACisvKgorICogY3NyMTIxMi5oIC0tIElFRUUgMTIxMiBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgc3VwcG9ydCBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRnJhbmNvaXMgUmV0aWVmIDxmZ3JldGllZkBzdW4uYWMuemE+CisgKiAgICAgICAgICAgICAgICAgICAgU3RldmUgS2lubmViZXJnIDxraW5uZWJlcmdzdGV2ZUBhY21zeXN0ZW1zLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCisgKiBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKKyAqIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19DU1IxMjEyX0hfXworI2RlZmluZSBfX0NTUjEyMTJfSF9fCisKKworLyogQ29tcGF0aWJpbGl0eSBsYXllciAqLworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisKKyNkZWZpbmUgQ1NSMTIxMl9NQUxMT0Moc2l6ZSkJCXZtYWxsb2MoKHNpemUpKQorI2RlZmluZSBDU1IxMjEyX0ZSRUUocHRyKQkJdmZyZWUocHRyKQorI2RlZmluZSBDU1IxMjEyX0JFMTZfVE9fQ1BVKHF1YWQpCWJlMTZfdG9fY3B1KHF1YWQpCisjZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0JFMTYocXVhZCkJY3B1X3RvX2JlMTYocXVhZCkKKyNkZWZpbmUgQ1NSMTIxMl9CRTMyX1RPX0NQVShxdWFkKQliZTMyX3RvX2NwdShxdWFkKQorI2RlZmluZSBDU1IxMjEyX0NQVV9UT19CRTMyKHF1YWQpCWNwdV90b19iZTMyKHF1YWQpCisjZGVmaW5lIENTUjEyMTJfQkU2NF9UT19DUFUocXVhZCkJYmU2NF90b19jcHUocXVhZCkKKyNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fQkU2NChxdWFkKQljcHVfdG9fYmU2NChxdWFkKQorCisjZGVmaW5lIENTUjEyMTJfTEUxNl9UT19DUFUocXVhZCkJbGUxNl90b19jcHUocXVhZCkKKyNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fTEUxNihxdWFkKQljcHVfdG9fbGUxNihxdWFkKQorI2RlZmluZSBDU1IxMjEyX0xFMzJfVE9fQ1BVKHF1YWQpCWxlMzJfdG9fY3B1KHF1YWQpCisjZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0xFMzIocXVhZCkJY3B1X3RvX2xlMzIocXVhZCkKKyNkZWZpbmUgQ1NSMTIxMl9MRTY0X1RPX0NQVShxdWFkKQlsZTY0X3RvX2NwdShxdWFkKQorI2RlZmluZSBDU1IxMjEyX0NQVV9UT19MRTY0KHF1YWQpCWNwdV90b19sZTY0KHF1YWQpCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2RlZmluZSBDU1IxMjEyX1NVQ0NFU1MgKDApCisjZGVmaW5lIENTUjEyMTJfRUlOVkFMCSgtRUlOVkFMKQorI2RlZmluZSBDU1IxMjEyX0VOT01FTQkoLUVOT01FTSkKKyNkZWZpbmUgQ1NSMTIxMl9FTk9FTlQJKC1FTk9FTlQpCisjZGVmaW5lIENTUjEyMTJfRUlPCSgtRUlPKQorI2RlZmluZSBDU1IxMjEyX0VCVVNZCSgtRUJVU1kpCisKKyNlbHNlCS8qIFVzZXJzcGFjZSAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjZGVmaW5lIENTUjEyMTJfTUFMTE9DKHNpemUpCQltYWxsb2Moc2l6ZSkKKyNkZWZpbmUgQ1NSMTIxMl9GUkVFKHB0cikJCWZyZWUocHRyKQorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2RlZmluZSBDU1IxMjEyX0JFMTZfVE9fQ1BVKHF1YWQpCWJzd2FwXzE2KHF1YWQpCisjZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0JFMTYocXVhZCkJYnN3YXBfMTYocXVhZCkKKyNkZWZpbmUgQ1NSMTIxMl9CRTMyX1RPX0NQVShxdWFkKQlic3dhcF8zMihxdWFkKQorI2RlZmluZSBDU1IxMjEyX0NQVV9UT19CRTMyKHF1YWQpCWJzd2FwXzMyKHF1YWQpCisjZGVmaW5lIENTUjEyMTJfQkU2NF9UT19DUFUocXVhZCkJYnN3YXBfNjQocXVhZCkKKyNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fQkU2NChxdWFkKQlic3dhcF82NChxdWFkKQorCisjZGVmaW5lIENTUjEyMTJfTEUxNl9UT19DUFUocXVhZCkJKHF1YWQpCisjZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0xFMTYocXVhZCkJKHF1YWQpCisjZGVmaW5lIENTUjEyMTJfTEUzMl9UT19DUFUocXVhZCkJKHF1YWQpCisjZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0xFMzIocXVhZCkJKHF1YWQpCisjZGVmaW5lIENTUjEyMTJfTEU2NF9UT19DUFUocXVhZCkJKHF1YWQpCisjZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0xFNjQocXVhZCkJKHF1YWQpCisjZWxzZQorI2RlZmluZSBDU1IxMjEyX0JFMTZfVE9fQ1BVKHF1YWQpCShxdWFkKQorI2RlZmluZSBDU1IxMjEyX0NQVV9UT19CRTE2KHF1YWQpCShxdWFkKQorI2RlZmluZSBDU1IxMjEyX0JFMzJfVE9fQ1BVKHF1YWQpCShxdWFkKQorI2RlZmluZSBDU1IxMjEyX0NQVV9UT19CRTMyKHF1YWQpCShxdWFkKQorI2RlZmluZSBDU1IxMjEyX0JFNjRfVE9fQ1BVKHF1YWQpCShxdWFkKQorI2RlZmluZSBDU1IxMjEyX0NQVV9UT19CRTY0KHF1YWQpCShxdWFkKQorCisjZGVmaW5lIENTUjEyMTJfTEUxNl9UT19DUFUocXVhZCkJYnN3YXBfMTYocXVhZCkKKyNkZWZpbmUgQ1NSMTIxMl9DUFVfVE9fTEUxNihxdWFkKQlic3dhcF8xNihxdWFkKQorI2RlZmluZSBDU1IxMjEyX0xFMzJfVE9fQ1BVKHF1YWQpCWJzd2FwXzMyKHF1YWQpCisjZGVmaW5lIENTUjEyMTJfQ1BVX1RPX0xFMzIocXVhZCkJYnN3YXBfMzIocXVhZCkKKyNkZWZpbmUgQ1NSMTIxMl9MRTY0X1RPX0NQVShxdWFkKQlic3dhcF82NChxdWFkKQorI2RlZmluZSBDU1IxMjEyX0NQVV9UT19MRTY0KHF1YWQpCWJzd2FwXzY0KHF1YWQpCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjZGVmaW5lIENTUjEyMTJfU1VDQ0VTUyAoMCkKKyNkZWZpbmUgQ1NSMTIxMl9FSU5WQUwJKEVJTlZBTCkKKyNkZWZpbmUgQ1NSMTIxMl9FTk9NRU0JKEVOT01FTSkKKyNkZWZpbmUgQ1NSMTIxMl9FTk9FTlQJKEVOT0VOVCkKKyNkZWZpbmUgQ1NSMTIxMl9FSU8JKEVJTykKKyNkZWZpbmUgQ1NSMTIxMl9FQlVTWQkoRUJVU1kpCisKKyNlbmRpZgorCisKKyNkZWZpbmUgQ1NSMTIxMl9LVl9WQUxfTUFTSwkJCTB4ZmZmZmZmCisjZGVmaW5lIENTUjEyMTJfS1ZfS0VZX1NISUZUCQkJMjQKKyNkZWZpbmUgQ1NSMTIxMl9LVl9LRVlfVFlQRV9TSElGVAkJNgorI2RlZmluZSBDU1IxMjEyX0tWX0tFWV9JRF9NQVNLCQkJMHgzZgorI2RlZmluZSBDU1IxMjEyX0tWX0tFWV9UWVBFX01BU0sJCTB4MwkJLyogQWZ0ZXIgc2hpZnQgKi8KKworCisvKiBDU1IgMTIxMiBrZXkgdHlwZXMgKi8KKyNkZWZpbmUgQ1NSMTIxMl9LVl9UWVBFX0lNTUVESUFURQkJMAorI2RlZmluZSBDU1IxMjEyX0tWX1RZUEVfQ1NSX09GRlNFVAkJMQorI2RlZmluZSBDU1IxMjEyX0tWX1RZUEVfTEVBRgkJCTIKKyNkZWZpbmUgQ1NSMTIxMl9LVl9UWVBFX0RJUkVDVE9SWQkJMworCisKKy8qIENTUiAxMjEyIGtleSBpZHMgKi8KKyNkZWZpbmUgQ1NSMTIxMl9LVl9JRF9ERVNDUklQVE9SCQkweDAxCisjZGVmaW5lIENTUjEyMTJfS1ZfSURfQlVTX0RFUEVOREVOVF9JTkZPCTB4MDIKKyNkZWZpbmUgQ1NSMTIxMl9LVl9JRF9WRU5ET1IJCQkweDAzCisjZGVmaW5lIENTUjEyMTJfS1ZfSURfSEFSRFdBUkVfVkVSU0lPTgkJMHgwNAorI2RlZmluZSBDU1IxMjEyX0tWX0lEX01PRFVMRQkJCTB4MDcKKyNkZWZpbmUgQ1NSMTIxMl9LVl9JRF9OT0RFX0NBUEFCSUxJVElFUwkJMHgwQworI2RlZmluZSBDU1IxMjEyX0tWX0lEX0VVSV82NAkJCTB4MEQKKyNkZWZpbmUgQ1NSMTIxMl9LVl9JRF9VTklUCQkJMHgxMQorI2RlZmluZSBDU1IxMjEyX0tWX0lEX1NQRUNJRklFUl9JRAkJMHgxMgorI2RlZmluZSBDU1IxMjEyX0tWX0lEX1ZFUlNJT04JCQkweDEzCisjZGVmaW5lIENTUjEyMTJfS1ZfSURfREVQRU5ERU5UX0lORk8JCTB4MTQKKyNkZWZpbmUgQ1NSMTIxMl9LVl9JRF9VTklUX0xPQ0FUSU9OCQkweDE1CisjZGVmaW5lIENTUjEyMTJfS1ZfSURfTU9ERUwJCQkweDE3CisjZGVmaW5lIENTUjEyMTJfS1ZfSURfSU5TVEFOQ0UJCQkweDE4CisjZGVmaW5lIENTUjEyMTJfS1ZfSURfS0VZV09SRAkJCTB4MTkKKyNkZWZpbmUgQ1NSMTIxMl9LVl9JRF9GRUFUVVJFCQkJMHgxQQorI2RlZmluZSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX1JPTQkJMHgxQgorI2RlZmluZSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWV9TUEVDSUZJRVJfSUQJMHgxQworI2RlZmluZSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0tFWQkJMHgxRAorI2RlZmluZSBDU1IxMjEyX0tWX0lEX0VYVEVOREVEX0RBVEEJCTB4MUUKKyNkZWZpbmUgQ1NSMTIxMl9LVl9JRF9NT0RJRklBQkxFX0RFU0NSSVBUT1IJMHgxRgorI2RlZmluZSBDU1IxMjEyX0tWX0lEX0RJUkVDVE9SWV9JRAkJMHgyMAorI2RlZmluZSBDU1IxMjEyX0tWX0lEX1JFVklTSU9OCQkJMHgyMQorCisKKy8qIElFRUUgMTIxMiBBZGRyZXNzIHNwYWNlIG1hcCAqLworI2RlZmluZSBDU1IxMjEyX0FMTF9TUEFDRV9CQVNFCQkJKDB4MDAwMDAwMDAwMDAwVUxMKQorI2RlZmluZSBDU1IxMjEyX0FMTF9TUEFDRV9TSVpFCQkJKDFVTEwgPDwgNDgpCisjZGVmaW5lIENTUjEyMTJfQUxMX1NQQUNFX0VORAkJCShDU1IxMjEyX0FMTF9TUEFDRV9CQVNFICsgQ1NSMTIxMl9BTExfU1BBQ0VfU0laRSkKKworI2RlZmluZSAgQ1NSMTIxMl9NRU1PUllfU1BBQ0VfQkFTRQkJKDB4MDAwMDAwMDAwMDAwVUxMKQorI2RlZmluZSAgQ1NSMTIxMl9NRU1PUllfU1BBQ0VfU0laRQkJKCgyNTZVTEwgKiAoMVVMTCA8PCA0MCkpIC0gKDUxMlVMTCAqICgxVUxMIDw8IDIwKSkpCisjZGVmaW5lICBDU1IxMjEyX01FTU9SWV9TUEFDRV9FTkQJCShDU1IxMjEyX01FTU9SWV9TUEFDRV9CQVNFICsgQ1NSMTIxMl9NRU1PUllfU1BBQ0VfU0laRSkKKworI2RlZmluZSAgQ1NSMTIxMl9QUklWQVRFX1NQQUNFX0JBU0UJCSgweGZmZmZlMDAwMDAwMFVMTCkKKyNkZWZpbmUgIENTUjEyMTJfUFJJVkFURV9TUEFDRV9TSVpFCQkoMjU2VUxMICogKDFVTEwgPDwgMjApKQorI2RlZmluZSAgQ1NSMTIxMl9QUklWQVRFX1NQQUNFX0VORAkJKENTUjEyMTJfUFJJVkFURV9TUEFDRV9CQVNFICsgQ1NSMTIxMl9QUklWQVRFX1NQQUNFX1NJWkUpCisKKyNkZWZpbmUgIENTUjEyMTJfUkVHSVNURVJfU1BBQ0VfQkFTRQkJKDB4ZmZmZmYwMDAwMDAwVUxMKQorI2RlZmluZSAgQ1NSMTIxMl9SRUdJU1RFUl9TUEFDRV9TSVpFCQkoMjU2VUxMICogKDFVTEwgPDwgMjApKQorI2RlZmluZSAgQ1NSMTIxMl9SRUdJU1RFUl9TUEFDRV9FTkQJCShDU1IxMjEyX1JFR0lTVEVSX1NQQUNFX0JBU0UgKyBDU1IxMjEyX1JFR0lTVEVSX1NQQUNFX1NJWkUpCisKKyNkZWZpbmUgIENTUjEyMTJfQ1NSX0FSQ0hfUkVHX1NQQUNFX0JBU0UJKDB4ZmZmZmYwMDAwMDAwVUxMKQorI2RlZmluZSAgQ1NSMTIxMl9DU1JfQVJDSF9SRUdfU1BBQ0VfU0laRQkoNTEyKQorI2RlZmluZSAgQ1NSMTIxMl9DU1JfQVJDSF9SRUdfU1BBQ0VfRU5ECQkoQ1NSMTIxMl9DU1JfQVJDSF9SRUdfU1BBQ0VfQkFTRSArIENTUjEyMTJfQ1NSX0FSQ0hfUkVHX1NQQUNFX1NJWkUpCisjZGVmaW5lICBDU1IxMjEyX0NTUl9BUkNIX1JFR19TUEFDRV9PRkZTRVQJKENTUjEyMTJfQ1NSX0FSQ0hfUkVHX1NQQUNFX0JBU0UgLSBDU1IxMjEyX1JFR0lTVEVSX1NQQUNFX0JBU0UpCisKKyNkZWZpbmUgIENTUjEyMTJfQ1NSX0JVU19ERVBfUkVHX1NQQUNFX0JBU0UJKDB4ZmZmZmYwMDAwMjAwVUxMKQorI2RlZmluZSAgQ1NSMTIxMl9DU1JfQlVTX0RFUF9SRUdfU1BBQ0VfU0laRQkoNTEyKQorI2RlZmluZSAgQ1NSMTIxMl9DU1JfQlVTX0RFUF9SRUdfU1BBQ0VfRU5ECShDU1IxMjEyX0NTUl9CVVNfREVQX1JFR19TUEFDRV9CQVNFICsgQ1NSMTIxMl9DU1JfQlVTX0RFUF9SRUdfU1BBQ0VfU0laRSkKKyNkZWZpbmUgIENTUjEyMTJfQ1NSX0JVU19ERVBfUkVHX1NQQUNFX09GRlNFVAkoQ1NSMTIxMl9DU1JfQlVTX0RFUF9SRUdfU1BBQ0VfQkFTRSAtIENTUjEyMTJfUkVHSVNURVJfU1BBQ0VfQkFTRSkKKworI2RlZmluZSAgQ1NSMTIxMl9DT05GSUdfUk9NX1NQQUNFX0JBU0UJCSgweGZmZmZmMDAwMDQwMFVMTCkKKyNkZWZpbmUgIENTUjEyMTJfQ09ORklHX1JPTV9TUEFDRV9TSVpFCQkoMTAyNCkKKyNkZWZpbmUgIENTUjEyMTJfQ09ORklHX1JPTV9TUEFDRV9FTkQJCShDU1IxMjEyX0NPTkZJR19ST01fU1BBQ0VfQkFTRSArIENTUjEyMTJfQ09ORklHX1JPTV9TUEFDRV9TSVpFKQorI2RlZmluZSAgQ1NSMTIxMl9DT05GSUdfUk9NX1NQQUNFX09GRlNFVAkoQ1NSMTIxMl9DT05GSUdfUk9NX1NQQUNFX0JBU0UgLSBDU1IxMjEyX1JFR0lTVEVSX1NQQUNFX0JBU0UpCisKKyNkZWZpbmUgIENTUjEyMTJfVU5JVFNfU1BBQ0VfQkFTRQkJKDB4ZmZmZmYwMDAwODAwVUxMKQorI2RlZmluZSAgQ1NSMTIxMl9VTklUU19TUEFDRV9TSVpFCQkoKDI1NlVMTCAqICgxVUxMIDw8IDIwKSkgLSAyMDQ4KQorI2RlZmluZSAgQ1NSMTIxMl9VTklUU19TUEFDRV9FTkQJCShDU1IxMjEyX1VOSVRTX1NQQUNFX0JBU0UgKyBDU1IxMjEyX1VOSVRTX1NQQUNFX1NJWkUpCisjZGVmaW5lICBDU1IxMjEyX1VOSVRTX1NQQUNFX09GRlNFVAkJKENTUjEyMTJfVU5JVFNfU1BBQ0VfQkFTRSAtIENTUjEyMTJfUkVHSVNURVJfU1BBQ0VfQkFTRSkKKworI2RlZmluZSAgQ1NSMTIxMl9FWFRFTkRFRF9ST01fU0laRQkJKDB4MTAwMDAgKiBzaXplb2YodV9pbnQzMl90KSkKKworCisvKiBDb25maWcgUk9NIGltYWdlIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBjc3IxMjEyX2J1c19pbmZvX2Jsb2NrX2ltZyB7CisJdV9pbnQ4X3QgbGVuZ3RoOworCXVfaW50OF90IGNyY19sZW5ndGg7CisJdV9pbnQxNl90IGNyYzsKKworCS8qIE11c3QgYmUgbGFzdCAqLworCXVfaW50MzJfdCBkYXRhWzBdOwkvKiBvbGRlciBnY2MgY2FuJ3QgaGFuZGxlIFtdIHdoaWNoIGlzIHN0YW5kYXJkICovCit9OworCisjZGVmaW5lIENTUjEyMTJfS1ZfS0VZKHF1YWQpCQkoQ1NSMTIxMl9CRTMyX1RPX0NQVShxdWFkKSA+PiBDU1IxMjEyX0tWX0tFWV9TSElGVCkKKyNkZWZpbmUgQ1NSMTIxMl9LVl9LRVlfVFlQRShxdWFkKQkoQ1NSMTIxMl9LVl9LRVkocXVhZCkgPj4gQ1NSMTIxMl9LVl9LRVlfVFlQRV9TSElGVCkKKyNkZWZpbmUgQ1NSMTIxMl9LVl9LRVlfSUQocXVhZCkJCShDU1IxMjEyX0tWX0tFWShxdWFkKSAmIENTUjEyMTJfS1ZfS0VZX0lEX01BU0spCisjZGVmaW5lIENTUjEyMTJfS1ZfVkFMKHF1YWQpCQkoQ1NSMTIxMl9CRTMyX1RPX0NQVShxdWFkKSAmIENTUjEyMTJfS1ZfVkFMX01BU0spCisKKyNkZWZpbmUgQ1NSMTIxMl9TRVRfS1ZfS0VZKHF1YWQsIGtleSkJKChxdWFkKSA9IFwKKwlDU1IxMjEyX0NQVV9UT19CRTMyKENTUjEyMTJfS1ZfVkFMKHF1YWQpIHwgKChrZXkpIDw8IENTUjEyMTJfS1ZfS0VZX1NISUZUKSkpCisjZGVmaW5lIENTUjEyMTJfU0VUX0tWX1ZBTChxdWFkLCB2YWwpCSgocXVhZCkgPSBcCisJQ1NSMTIxMl9DUFVfVE9fQkUzMigoQ1NSMTIxMl9LVl9LRVkocXVhZCkgPDwgQ1NSMTIxMl9LVl9LRVlfU0hJRlQpIHwgKHZhbCkpKQorI2RlZmluZSBDU1IxMjEyX1NFVF9LVl9UWVBFSUQocXVhZCwgdHlwZSwgaWQpCSgocXVhZCkgPSBcCisJQ1NSMTIxMl9DUFVfVE9fQkUzMihDU1IxMjEyX0tWX1ZBTChxdWFkKSB8IFwKKwkoKCgoKHR5cGUpICYgQ1NSMTIxMl9LVl9LRVlfVFlQRV9NQVNLKSA8PCBDU1IxMjEyX0tWX0tFWV9UWVBFX1NISUZUKSB8IFwKKwkgICgoaWQpICYgQ1NSMTIxMl9LVl9LRVlfSURfTUFTSykpIDw8IENTUjEyMTJfS1ZfS0VZX1NISUZUKSkpCisKK3R5cGVkZWYgdV9pbnQzMl90IGNzcjEyMTJfcXVhZF90OworCisKK3N0cnVjdCBjc3IxMjEyX2tleXZhbF9pbWcgeworCXVfaW50MTZfdCBsZW5ndGg7CisJdV9pbnQxNl90IGNyYzsKKworCS8qIE11c3QgYmUgbGFzdCAqLworCWNzcjEyMTJfcXVhZF90IGRhdGFbMF07CS8qIG9sZGVyIGdjYyBjYW4ndCBoYW5kbGUgW10gd2hpY2ggaXMgc3RhbmRhcmQgKi8KK307CisKK3N0cnVjdCBjc3IxMjEyX2xlYWYgeworCWludCBsZW47CisJdV9pbnQzMl90ICpkYXRhOworfTsKKworc3RydWN0IGNzcjEyMTJfZGVudHJ5IHsKKwlzdHJ1Y3QgY3NyMTIxMl9kZW50cnkgKm5leHQsICpwcmV2OworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3Y7Cit9OworCitzdHJ1Y3QgY3NyMTIxMl9kaXJlY3RvcnkgeworCWludCBsZW47CisJc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpkZW50cmllc19oZWFkLCAqZGVudHJpZXNfdGFpbDsKK307CisKK3N0cnVjdCBjc3IxMjEyX2tleXZhbCB7CisJc3RydWN0IHsKKwkJdV9pbnQ4X3QgdHlwZTsKKwkJdV9pbnQ4X3QgaWQ7CisJfSBrZXk7CisJdW5pb24geworCQl1X2ludDMyX3QgaW1tZWRpYXRlOworCQl1X2ludDMyX3QgY3NyX29mZnNldDsKKwkJc3RydWN0IGNzcjEyMTJfbGVhZiBsZWFmOworCQlzdHJ1Y3QgY3NyMTIxMl9kaXJlY3RvcnkgZGlyZWN0b3J5OworCX0gdmFsdWU7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICphc3NvY2lhdGU7CisJaW50IHJlZmNudDsKKworCS8qIHVzZWQgaW4gZ2VuZXJhdGluZyBhbmQvb3IgcGFyc2luZyBDU1IgaW1hZ2UgKi8KKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKm5leHQsICpwcmV2OwkvKiBmbGF0IGxpc3Qgb2YgQ1NSIGVsZW1lbnRzICovCisJdV9pbnQzMl90IG9mZnNldDsJLyogcG9zaXRpb24gaW4gQ1NSIGZyb20gMHhmZmZmIGYwMDAgMDAwMCAqLworCXVfaW50OF90IHZhbGlkOwkJLyogZmxhZyBpbmRpY2F0aW5nIGtleXZhbCBoYXMgdmFsaWQgZGF0YSovCit9OworCisKK3N0cnVjdCBjc3IxMjEyX2NhY2hlX3JlZ2lvbiB7CisJc3RydWN0IGNzcjEyMTJfY2FjaGVfcmVnaW9uICpuZXh0LCAqcHJldjsKKwl1X2ludDMyX3Qgb2Zmc2V0X3N0YXJ0OwkJLyogaW5jbHVzaXZlICovCisJdV9pbnQzMl90IG9mZnNldF9lbmQ7CQkvKiBleGNsdXNpdmUgKi8KK307CisKK3N0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgeworCXN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKm5leHQsICpwcmV2OworCXN0cnVjdCBjc3IxMjEyX2NhY2hlX3JlZ2lvbiAqZmlsbGVkX2hlYWQsICpmaWxsZWRfdGFpbDsKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmxheW91dF9oZWFkLCAqbGF5b3V0X3RhaWw7CisJc2l6ZV90IHNpemU7CisJdV9pbnQzMl90IG9mZnNldDsKKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmV4dF9yb207CisJc2l6ZV90IGxlbjsKKworCS8qIE11c3QgYmUgbGFzdCAqLworCXVfaW50MzJfdCBkYXRhWzBdOwkvKiBvbGRlciBnY2MgY2FuJ3QgaGFuZGxlIFtdIHdoaWNoIGlzIHN0YW5kYXJkICovCit9OworCitzdHJ1Y3QgY3NyMTIxMl9jc3IgeworCXNpemVfdCBidXNfaW5mb19sZW47CS8qIGJ1cyBpbmZvIGJsb2NrIGxlbmd0aCBpbiBieXRlcyAqLworCXNpemVfdCBjcmNfbGVuOwkJLyogY3JjIGxlbmd0aCBpbiBieXRlcyAqLworCXVfaW50MzJfdCAqYnVzX2luZm9fZGF0YTsJLyogYnVzIGluZm8gZGF0YSBpbmNsIGJ1cyBuYW1lIGFuZCBFVUkgKi8KKworCXZvaWQgKnByaXZhdGU7CQkvKiBwcml2YXRlLCBidXMgc3BlY2lmaWMgZGF0YSAqLworCXN0cnVjdCBjc3IxMjEyX2J1c19vcHMgKm9wczsKKworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqcm9vdF9rdjsKKworCWludCBtYXhfcm9tOwkJLyogbWF4IGJ5dGVzIHJlYWRhYmxlIGluIENvbmZpZyBST00gcmVnaW9uICovCisKKwkvKiBJdGVtcyBiZWxvdyB1c2VkIGZvciBpbWFnZSBwYXJzaW5nIGFuZCBnZW5lcmF0aW9uICovCisJc3RydWN0IGNzcjEyMTJfY3NyX3JvbV9jYWNoZSAqY2FjaGVfaGVhZCwgKmNhY2hlX3RhaWw7Cit9OworCitzdHJ1Y3QgY3NyMTIxMl9idXNfb3BzIHsKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgY3NyMTIxMiB0byByZWFkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKwkgKiBmcm9tIHJlbW90ZSBub2RlcyB3aGVuIHBhcnNpbmcgYSBDb25maWcgUk9NIChpLmUuLCByZWFkIENvbmZpZyBST00KKwkgKiBlbnRyaWVzIGxvY2F0ZWQgaW4gdGhlIFVuaXRzIFNwYWNlLiAgTXVzdCByZXR1cm4gMCBvbiBzdWNjZXNzCisJICogYW55dGhpbmcgZWxzZSBpbmRpY2F0ZXMgYW4gZXJyb3IuICovCisJaW50ICgqYnVzX3JlYWQpIChzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwgdV9pbnQ2NF90IGFkZHIsCisJCQkgdV9pbnQxNl90IGxlbmd0aCwgdm9pZCAqYnVmZmVyLCB2b2lkICpwcml2YXRlKTsKKworCS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBjc3IxMjEyIHRvIGFsbG9jYXRlIGEgcmVnaW9uIGluIHVuaXRzIHNwYWNlCisJICogaW4gdGhlIGV2ZW50IHRoYXQgQ29uZmlnIFJPTSBlbnRyaWVzIGRvbid0IGFsbCBmaXQgaW4gdGhlIHByZWRlZmluZWQKKwkgKiAxSyByZWdpb24uICBUaGUgdm9pZCAqcHJpdmF0ZSBwYXJhbWV0ZXIgaXMgcHJpdmF0ZSBtZW1iZXIgb2Ygc3RydWN0CisJICogY3NyMTIxMl9jc3IuICovCisJdV9pbnQ2NF90ICgqYWxsb2NhdGVfYWRkcl9yYW5nZSkgKHVfaW50NjRfdCBzaXplLCB1X2ludDMyX3QgYWxpZ25tZW50LAorCQkJCQkgIHZvaWQgKnByaXZhdGUpOworCisKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgY3NyMTIxMiB0byByZWxlYXNlIGEgcmVnaW9uIGluIHVuaXRzIHNwYWNlCisJICogdGhhdCBpcyBubyBsb25nZXIgbmVlZGVkLiAqLworCXZvaWQgKCpyZWxlYXNlX2FkZHIpICh1X2ludDY0X3QgYWRkciwgdm9pZCAqcHJpdmF0ZSk7CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgY3NyMTIxMiB0byBkZXRlcm1pbmUgdGhlIG1heCByZWFkIHJlcXVlc3QKKwkgKiBzdXBwb3J0ZWQgYnkgYSByZW1vdGUgbm9kZSB3aGVuIHJlYWRpbmcgdGhlIENvbmZpZ1JPTSBzcGFjZS4gIE11c3QKKwkgKiByZXR1cm4gMCwgMSwgb3IgMiBwZXIgSUVFRSAxMjEyLiAgKi8KKwlpbnQgKCpnZXRfbWF4X3JvbSkgKHVfaW50MzJfdCAqYnVzX2luZm8sIHZvaWQgKnByaXZhdGUpOworfTsKKworCisKKworLyogRGVzY3JpcHRvciBMZWFmIG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KKyNkZWZpbmUgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfVFlQRV9TSElGVCAyNAorI2RlZmluZSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9TUEVDSUZJRVJfSURfTUFTSyAweGZmZmZmZgorI2RlZmluZSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9PVkVSSEVBRCAoMSAqIHNpemVvZih1X2ludDMyX3QpKQorCisjZGVmaW5lIENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1RZUEUoa3YpIFwKKwkoQ1NSMTIxMl9CRTMyX1RPX0NQVSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMF0pID4+IENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1RZUEVfU0hJRlQpCisjZGVmaW5lIENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1NQRUNJRklFUl9JRChrdikgXAorCShDU1IxMjEyX0JFMzJfVE9fQ1BVKChrdiktPnZhbHVlLmxlYWYuZGF0YVswXSkgJiBcCisJIENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1NQRUNJRklFUl9JRF9NQVNLKQorI2RlZmluZSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9EQVRBKGt2KSBcCisJKCYoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzFdKSkKKworI2RlZmluZSBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9TRVRfVFlQRShrdiwgdHlwZSkgXAorCSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMF0gPSBcCisJIENTUjEyMTJfQ1BVX1RPX0JFMzIoQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfU1BFQ0lGSUVSX0lEKGt2KSB8IFwKKwkJCSAgICAgKCh0eXBlKSA8PCBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9UWVBFX1NISUZUKSkpCisjZGVmaW5lIENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1NFVF9TUEVDSUZJRVJfSUQoa3YsIHNwZWNfaWQpIFwKKwkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzBdID0gXAorCSBDU1IxMjEyX0NQVV9UT19CRTMyKChDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9UWVBFKGt2KSA8PCBcCisJCQkgICAgICBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9UWVBFX1NISUZUKSB8IFwKKwkJCSAgICAgKChzcGVjX2lkKSAmIENTUjEyMTJfREVTQ1JJUFRPUl9MRUFGX1NQRUNJRklFUl9JRF9NQVNLKSkpCisKKy8qIFRleHQgRGVzY3JpcHRvciBMZWFmIG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KKyNkZWZpbmUgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9XSURUSF9TSElGVCAyOAorI2RlZmluZSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1dJRFRIX01BU0sgMHhmIC8qIGFmdGVyIHNoaWZ0ICovCisjZGVmaW5lIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfQ0hBUl9TRVRfU0hJRlQgMTYKKyNkZWZpbmUgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9DSEFSX1NFVF9NQVNLIDB4ZmZmICAvKiBhZnRlciBzaGlmdCAqLworI2RlZmluZSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0xBTkdVQUdFX01BU0sgMHhmZmZmCisjZGVmaW5lIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfT1ZFUkhFQUQgKDEgKiBzaXplb2YodV9pbnQzMl90KSkKKworI2RlZmluZSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1dJRFRIKGt2KSBcCisJKENTUjEyMTJfQkUzMl9UT19DUFUoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzFdKSA+PiBcCisJIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfV0lEVEhfU0hJRlQpCisjZGVmaW5lIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfQ0hBUl9TRVQoa3YpIFwKKwkoKENTUjEyMTJfQkUzMl9UT19DUFUoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzFdKSA+PiBcCisJCQkgICAgIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfQ0hBUl9TRVRfU0hJRlQpICYgXAorCQkJICAgIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfQ0hBUl9TRVRfTUFTSykKKyNkZWZpbmUgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9MQU5HVUFHRShrdikgXAorCShDU1IxMjEyX0JFMzJfVE9fQ1BVKChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSkgJiBcCisJIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfTEFOR1VBR0VfTUFTSykKKyNkZWZpbmUgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9EQVRBKGt2KSBcCisJKCYoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzJdKSkKKworI2RlZmluZSBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1NFVF9XSURUSChrdiwgd2lkdGgpIFwKKwkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzFdID0gXAorCSAoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzFdICYgXAorCSAgQ1NSMTIxMl9DUFVfVE9fQkUzMih+KENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfV0lEVEhfTUFTSyA8PCBcCisJCQkJQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9XSURUSF9TSElGVCkpKSB8IFwKKwkgQ1NSMTIxMl9DUFVfVE9fQkUzMigoKHdpZHRoKSAmIFwKKwkJCSAgICAgIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfV0lEVEhfTUFTSykgPDwgXAorCQkJICAgICBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX1dJRFRIX1NISUZUKSkKKyNkZWZpbmUgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9TRVRfQ0hBUl9TRVQoa3YsIGNoYXJfc2V0KSBcCisJKChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSA9IFwKKwkgKChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSAmIFwKKwkgIENTUjEyMTJfQ1BVX1RPX0JFMzIofihDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0NIQVJfU0VUX01BU0sgPDwgXAorCQkJCUNTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfQ0hBUl9TRVRfU0hJRlQpKSkgfCBcCisJIENTUjEyMTJfQ1BVX1RPX0JFMzIoKChjaGFyX3NldCkgJiBcCisJCQkgICAgICBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0NIQVJfU0VUX01BU0spIDw8IFwKKwkJCSAgICAgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9DSEFSX1NFVF9TSElGVCkpCisjZGVmaW5lIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfU0VUX0xBTkdVQUdFKGt2LCBsYW5ndWFnZSkgXAorCSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMV0gPSBcCisJICgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMV0gJiBcCisJICBDU1IxMjEyX0NQVV9UT19CRTMyKH4oQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9MQU5HVUFHRV9NQVNLKSkpIHwgXAorCSBDU1IxMjEyX0NQVV9UT19CRTMyKCgobGFuZ3VhZ2UpICYgXAorCQkJICAgICAgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9MQU5HVUFHRV9NQVNLKSkpCisKKworLyogSWNvbiBEZXNjcmlwdG9yIExlYWYgbWFuaXB1bGF0aW9uIG1hY3JvcyAqLworI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1ZFUlNJT05fTUFTSyAweGZmZmZmZgorI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1BBTEVUVEVfREVQVEhfU0hJRlQgMzAKKyNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9QQUxFVFRFX0RFUFRIX01BU0sgMHgzIC8qIGFmdGVyIHNoaWZ0ICovCisjZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfQ09MT1JfU1BBQ0VfU0hJRlQgMTYKKyNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9DT0xPUl9TUEFDRV9NQVNLIDB4ZiAvKiBhZnRlciBzaGlmdCAqLworI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0xBTkdVQUdFX01BU0sgMHhmZmZmCisjZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfSFNDQU5fU0hJRlQgMTYKKyNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9IU0NBTl9NQVNLIDB4ZmZmZiAvKiBhZnRlciBzaGlmdCAqLworI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1ZTQ0FOX01BU0sgMHhmZmZmCisjZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfT1ZFUkhFQUQgKDMgKiBzaXplb2YodV9pbnQzMl90KSkKKworI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1ZFUlNJT04oa3YpIFwKKwkoQ1NSMTIxMl9CRTMyX1RPX0NQVSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMl0pICYgXAorCSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1ZFUlNJT05fTUFTSykKKworI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1BBTEVUVEVfREVQVEgoa3YpIFwKKwkoQ1NSMTIxMl9CRTMyX1RPX0NQVSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbM10pID4+IFwKKwkgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9QQUxFVFRFX0RFUFRIX1NISUZUKQorCisjZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfQ09MT1JfU1BBQ0Uoa3YpIFwKKwkoKENTUjEyMTJfQkUzMl9UT19DUFUoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzNdKSA+PiBcCisJICBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0NPTE9SX1NQQUNFX1NISUZUKSAmIFwKKwkgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9DT0xPUl9TUEFDRV9NQVNLKQorCisjZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfTEFOR1VBR0Uoa3YpIFwKKwkoQ1NSMTIxMl9CRTMyX1RPX0NQVSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbM10pICYgXAorCSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0xBTkdVQUdFX01BU0spCisKKyNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9IU0NBTihrdikgXAorCSgoQ1NSMTIxMl9CRTMyX1RPX0NQVSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbNF0pID4+IFwKKwkgIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfQ09MT1JfSFNDQU5fU0hJRlQpICYgXAorCSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0NPTE9SX0hTQ0FOX01BU0spCisKKyNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9WU0NBTihrdikgXAorCShDU1IxMjEyX0JFMzJfVE9fQ1BVKChrdiktPnZhbHVlLmxlYWYuZGF0YVs0XSkgJiBcCisJIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfVlNDQU5fTUFTSykKKworI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1BBTEVUVEUoa3YpIFwKKwkoJigoa3YpLT52YWx1ZS5sZWFmLmRhdGFbNV0pKQorCitzdGF0aWMgaW5saW5lIHVfaW50MzJfdCAqQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9QSVhFTFMoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdikKK3sKKwlzdGF0aWMgY29uc3QgaW50IHBkWzRdID0geyAwLCA0LCAxNiwgMjU2IH07CisJc3RhdGljIGNvbnN0IGludCBjc1sxNl0gPSB7IDQsIDIgfTsKKwlpbnQgcHMgPSBwZFtDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1BBTEVUVEVfREVQVEgoa3YpXTsKKworCXJldHVybiAma3YtPnZhbHVlLmxlYWYuZGF0YVs1ICsKKwkJCQkgICAgKHBzICogY3NbQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9DT0xPUl9TUEFDRShrdildKSAvCisJCQkgICBzaXplb2YodV9pbnQzMl90KV07Cit9CisKKyNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9TRVRfVkVSU0lPTihrdiwgdmVyc2lvbikgXAorCSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMl0gPSBcCisJICgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbMl0gJiBcCisJICBDU1IxMjEyX0NQVV9UT19CRTMyKH4oQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9WRVJTSU9OX01BU0spKSkgfCBcCisJIENTUjEyMTJfQ1BVX1RPX0JFMzIoKCh2ZXJzaW9uKSAmIFwKKwkJCSAgICAgIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfVkVSU0lPTl9NQVNLKSkpCisKKyNkZWZpbmUgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9TRVRfUEFMRVRURV9ERVBUSChrdiwgcGFsZXR0ZV9kZXB0aCkgXAorCSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbM10gPSBcCisJICgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbM10gJiBcCisJICBDU1IxMjEyX0NQVV9UT19CRTMyKH4oQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9QQUxFVFRFX0RFUFRIX01BU0sgPDwgXAorCQkJCUNTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfUEFMRVRURV9ERVBUSF9TSElGVCkpKSB8IFwKKwkgQ1NSMTIxMl9DUFVfVE9fQkUzMigoKHBhbGV0dGVfZGVwdGgpICYgXAorCQkJICAgICAgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9QQUxFVFRFX0RFUFRIX01BU0spIDw8IFwKKwkJCSAgICAgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9QQUxFVFRFX0RFUFRIX1NISUZUKSkKKworI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9DT0xPUl9TUEFDRShrdiwgY29sb3Jfc3BhY2UpIFwKKwkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzNdID0gXAorCSAoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzNdICYgXAorCSAgQ1NSMTIxMl9DUFVfVE9fQkUzMih+KENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfQ09MT1JfU1BBQ0VfTUFTSyA8PCBcCisJCQkJQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9DT0xPUl9TUEFDRV9TSElGVCkpKSB8IFwKKwkgQ1NSMTIxMl9DUFVfVE9fQkUzMigoKGNvbG9yX3NwYWNlKSAmIFwKKwkJCSAgICAgIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfQ09MT1JfU1BBQ0VfTUFTSykgPDwgXAorCQkJICAgICBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0NPTE9SX1NQQUNFX1NISUZUKSkKKworI2RlZmluZSBDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX1NFVF9MQU5HVUFHRShrdiwgbGFuZ3VhZ2UpIFwKKwkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzNdID0gXAorCSAoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzNdICYgXAorCSAgQ1NSMTIxMl9DUFVfVE9fQkUzMih+KENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfTEFOR1VBR0VfTUFTSykpKSB8IFwKKwkgQ1NSMTIxMl9DUFVfVE9fQkUzMigoKGxhbmd1YWdlKSAmIFwKKwkJCSAgICAgIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfTEFOR1VBR0VfTUFTSykpKQorCisjZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfU0VUX0hTQ0FOKGt2LCBoc2NhbikgXAorCSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbNF0gPSBcCisJICgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbNF0gJiBcCisJICBDU1IxMjEyX0NQVV9UT19CRTMyKH4oQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9IU0NBTl9NQVNLIDw8IFwKKwkJCQlDU1IxMjEyX0lDT05fREVTQ1JJUFRPUl9MRUFGX0hTQ0FOX1NISUZUKSkpIHwgXAorCSBDU1IxMjEyX0NQVV9UT19CRTMyKCgoaHNjYW4pICYgXAorCQkJICAgICAgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9IU0NBTl9NQVNLKSA8PCBcCisJCQkgICAgIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfSFNDQU5fU0hJRlQpKQorCisjZGVmaW5lIENTUjEyMTJfSUNPTl9ERVNDUklQVE9SX0xFQUZfU0VUX1ZTQ0FOKGt2LCB2c2NhbikgXAorCSgoa3YpLT52YWx1ZS5sZWFmLmRhdGFbNF0gPSBcCisJICgoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzRdICYgXAorCSAgQ1NSMTIxMl9DUFVfVE9fQkUzMih+Q1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9WU0NBTl9NQVNLKSkpIHwgXAorCSBDU1IxMjEyX0NQVV9UT19CRTMyKCgodnNjYW4pICYgXAorCQkJICAgICAgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9WU0NBTl9NQVNLKSkpCisKKworLyogTW9kaWZpYWJsZSBEZXNjcmlwdG9yIExlYWYgbWFuaXB1bGF0aW9uIG1hY3JvcyAqLworI2RlZmluZSBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9MRUFGX01BWF9TSVpFX1NISUZUIDE2CisjZGVmaW5lIENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX0xFQUZfTUFYX1NJWkVfTUFTSyAweGZmZmYKKyNkZWZpbmUgQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfTEVBRl9BRERSX0hJX1NISUZUIDMyCisjZGVmaW5lIENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX0xFQUZfQUREUl9ISV9NQVNLIDB4ZmZmZgorI2RlZmluZSBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9MRUFGX0FERFJfTE9fTUFTSyAweGZmZmZmZmZmVUxMCisKKyNkZWZpbmUgQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfTUFYX1NJWkUoa3YpIFwKKwlDU1IxMjEyX0JFMTZfVE9fQ1BVKChrdiktPnZhbHVlLmxlYWYuZGF0YVswXSA+PiBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9NQVhfU0laRV9TSElGVCkKKworI2RlZmluZSBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9BRERSRVNTKGt2KSBcCisJKENTUjEyMTJfQkUxNl9UT19DUFUoKCh1X2ludDY0X3QpKChrdiktPnZhbHVlLmxlYWYuZGF0YVswXSkpIDw8IFwKKwkJCSAgICAgQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfQUREUl9ISV9TSElGVCkgfCBcCisJIENTUjEyMTJfQkUzMl9UT19DUFUoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzFdKSkKKworI2RlZmluZSBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9TRVRfTUFYX1NJWkUoa3YsIHNpemUpIFwKKwkoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzBdID0gXAorCSAoKGt2KS0+dmFsdWUubGVhZi5kYXRhWzBdICYgXAorCSAgQ1NSMTIxMl9DUFVfVE9fQkUzMih+KENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX0xFQUZfTUFYX1NJWkVfTUFTSyA8PCBcCisJCQkJQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfTEVBRl9NQVhfU0laRV9TSElGVCkpKSB8IFwKKwkgQ1NSMTIxMl9DUFVfVE9fQkUzMigoKHNpemUpICYgXAorCQkJICAgICAgQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfTEVBRl9NQVhfU0laRV9NQVNLKSA8PCBcCisJCQkgICAgIENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX0xFQUZfTUFYX1NJWkVfU0hJRlQpKQorCisjZGVmaW5lIENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX1NFVF9BRERSRVNTX0hJKGt2LCBhZGRyKSBcCisJKChrdiktPnZhbHVlLmxlYWYuZGF0YVswXSA9IFwKKwkgKChrdiktPnZhbHVlLmxlYWYuZGF0YVswXSAmIFwKKwkgIENTUjEyMTJfQ1BVX1RPX0JFMzIofihDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9MRUFGX0FERFJfSElfTUFTSykpKSB8IFwKKwkgIENTUjEyMTJfQ1BVX1RPX0JFMzIoKChhZGRyKSAmIFwKKwkJCSAgICAgICBDU1IxMjEyX01PRElGSUFCTEVfREVTQ1JJUFRPUl9MRUFGX0FERFJfSElfTUFTSykpKQorCisjZGVmaW5lIENTUjEyMTJfTU9ESUZJQUJMRV9ERVNDUklQVE9SX1NFVF9BRERSRVNTX0xPKGt2LCBhZGRyKSBcCisJKChrdiktPnZhbHVlLmxlYWYuZGF0YVsxXSA9IFwKKwkgQ1NSMTIxMl9DUFVfVE9fQkUzMihhZGRyICYgQ1NSMTIxMl9NT0RJRklBQkxFX0RFU0NSSVBUT1JfTEVBRl9BRERSX0xPX01BU0spKQorCisKKworLyogVGhlIGZvbGxvd2luZyAyIGZ1bmN0aW9uIGFyZSBmb3IgY3JlYXRpbmcgbmV3IENvbmZpZ3VyYXRpb24gUk9NIHRyZWVzLiAgVGhlCisgKiBmaXJzdCBmdW5jdGlvbiBpcyB1c2VkIGZvciBib3RoIGNyZWF0aW5nIGxvY2FsIHRyZWVzIGFuZCBwYXJzaW5nIHJlbW90ZQorICogdHJlZXMuICBUaGUgc2Vjb25kIGZ1bmN0aW9uIGFkZHMgcGVydGluZW50IGluZm9ybWF0aW9uIHRvIGxvY2FsIENvbmZpZ3VyYXRpb24KKyAqIFJPTSB0cmVlcyAtIG5hbWVseSBkYXRhIGZvciB0aGUgYnVzIGluZm9ybWF0aW9uIGJsb2NrLiAqLworZXh0ZXJuIHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyMTIxMl9jcmVhdGVfY3NyKHN0cnVjdCBjc3IxMjEyX2J1c19vcHMgKm9wcywKKwkJCQkJICAgICAgc2l6ZV90IGJ1c19pbmZvX3NpemUsCisJCQkJCSAgICAgIHZvaWQgKnByaXZhdGUpOworZXh0ZXJuIHZvaWQgY3NyMTIxMl9pbml0X2xvY2FsX2NzcihzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwKKwkJCQkgICBjb25zdCB1X2ludDMyX3QgKmJ1c19pbmZvX2RhdGEsIGludCBtYXhfcm9tKTsKKworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGRlc3Ryb3lzIGEgQ29uZmlndXJhdGlvbiBST00gdHJlZSBhbmQgcmVsZWFzZSBhbGwKKyAqIG1lbW9yeSB0YWtlbiBieSB0aGUgdHJlZS4gKi8KK2V4dGVybiB2b2lkIGNzcjEyMTJfZGVzdHJveV9jc3Ioc3RydWN0IGNzcjEyMTJfY3NyICpjc3IpOworCisKKy8qIFRoZSBmb2xsb3dpbmcgc2V0IG9mIGZ1bmN0aW9ucyBhcmUgZm9yZSBjcmVhdGluZyBuZXcga2V5dmFscyBmb3IgcGxhY2VtZW50IGluCisgKiBhIENvbmZpZ3VyYXRpb24gUk9NIHRyZWUuICBDb2RlIHRoYXQgY3JlYXRlcyBuZXcga2V5dmFscyB3aXRoIHRoZXNlIGZ1bmN0aW9ucworICogbXVzdCByZWxlYXNlIHRob3NlIGtleXZhbHMgd2l0aCBjc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKCkgd2hlbiB0aGV5IGFyZSBubworICogbG9uZ2VyIG5lZWRlZC4gKi8KK2V4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2ltbWVkaWF0ZSh1X2ludDhfdCBrZXksIHVfaW50MzJfdCB2YWx1ZSk7CitleHRlcm4gc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19sZWFmKHVfaW50OF90IGtleSwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJICAgICAgIHNpemVfdCBkYXRhX2xlbik7CitleHRlcm4gc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19jc3Jfb2Zmc2V0KHVfaW50OF90IGtleSwKKwkJCQkJCSAgICAgdV9pbnQzMl90IGNzcl9vZmZzZXQpOworZXh0ZXJuIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfZGlyZWN0b3J5KHVfaW50OF90IGtleSk7CitleHRlcm4gc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19leHRlbmRlZF9pbW1lZGlhdGUodV9pbnQzMl90IHNwZWMsCisJCQkJCQkJICAgICB1X2ludDMyX3Qga2V5LAorCQkJCQkJCSAgICAgdV9pbnQzMl90IHZhbHVlKTsKK2V4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2V4dGVuZGVkX2xlYWYodV9pbnQzMl90IHNwZWMsCisJCQkJCQkJdV9pbnQzMl90IGtleSwKKwkJCQkJCQljb25zdCB2b2lkICpkYXRhLAorCQkJCQkJCXNpemVfdCBkYXRhX2xlbik7CitleHRlcm4gc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19kZXNjcmlwdG9yX2xlYWYodV9pbnQ4X3QgZHR5cGUsCisJCQkJCQkJICB1X2ludDMyX3Qgc3BlY2lmaWVyX2lkLAorCQkJCQkJCSAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJCQkgIHNpemVfdCBkYXRhX2xlbik7CitleHRlcm4gc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld190ZXh0dWFsX2Rlc2NyaXB0b3JfbGVhZih1X2ludDhfdCBjd2lkdGgsCisJCQkJCQkJCSAgdV9pbnQxNl90IGNzZXQsCisJCQkJCQkJCSAgdV9pbnQxNl90IGxhbmd1YWdlLAorCQkJCQkJCQkgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCQkJCSAgc2l6ZV90IGRhdGFfbGVuKTsKK2V4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X3N0cmluZ19kZXNjcmlwdG9yX2xlYWYoY29uc3QgY2hhciAqcyk7CitleHRlcm4gc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX25ld19pY29uX2Rlc2NyaXB0b3JfbGVhZih1X2ludDMyX3QgdmVyc2lvbiwKKwkJCQkJCQkgICAgICAgdV9pbnQ4X3QgcGFsZXR0ZV9kZXB0aCwKKwkJCQkJCQkgICAgICAgdV9pbnQ4X3QgY29sb3Jfc3BhY2UsCisJCQkJCQkJICAgICAgIHVfaW50MTZfdCBsYW5ndWFnZSwKKwkJCQkJCQkgICAgICAgdV9pbnQxNl90IGhzY2FuLAorCQkJCQkJCSAgICAgICB1X2ludDE2X3QgdnNjYW4sCisJCQkJCQkJICAgICAgIHVfaW50MzJfdCAqcGFsZXR0ZSwKKwkJCQkJCQkgICAgICAgdV9pbnQzMl90ICpwaXhlbHMpOworZXh0ZXJuIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqY3NyMTIxMl9uZXdfbW9kaWZpYWJsZV9kZXNjcmlwdG9yX2xlYWYodV9pbnQxNl90IG1heF9zaXplLAorCQkJCQkJCQkgICAgIHVfaW50NjRfdCBhZGRyZXNzKTsKK2V4dGVybiBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfbmV3X2tleXdvcmRfbGVhZihpbnQgc3RyYywKKwkJCQkJCSAgICAgICBjb25zdCBjaGFyICpzdHJ2W10pOworCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG1hbmFnZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGtleXZhbHMuICBUeXBpY2FsbHksCisgKiBEZXNjcmlwdG9yIExlYXZlcyBhbmQgRGlyZWN0b3JpZXMgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggYW5vdGhlciBrZXl2YWwgYW5kCisgKiBpdCBpcyBkZXNpcmFibGUgZm9yIHRoZSBEZXNjcmlwdG9yIGtleXZhbCB0byBiZSBwbGFjZSBpbW1lZGlhdGVseSBhZnRlciB0aGUKKyAqIGtleXZhbCB0aGF0IGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4qLworZXh0ZXJuIGludCBjc3IxMjEyX2Fzc29jaWF0ZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdiwKKwkJCQkgICAgc3RydWN0IGNzcjEyMTJfa2V5dmFsICphc3NvY2lhdGUpOworZXh0ZXJuIHZvaWQgY3NyMTIxMl9kaXNhc3NvY2lhdGVfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpOworCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG1hbmFnZSB0aGUgYXNzb2NpYXRpb24gb2YgYSBrZXl2YWwgYW5kIGRpcmVjdG9yaWVzLgorICogQSBrZXl2YWwgbWF5IGJlIGF0dGFjaGVkIHRvIG1vcmUgdGhhbiBvbmUgZGlyZWN0b3J5LiAqLworZXh0ZXJuIGludCBjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqZGlyLAorCQkJCQkgICAgICBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KTsKK2V4dGVybiB2b2lkIGNzcjEyMTJfZGV0YWNoX2tleXZhbF9mcm9tX2RpcmVjdG9yeShzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmRpciwKKwkJCQkJCSBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KTsKKworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgYSBDb25maWd1cmF0aW9uIFJPTSBpbWFnZSBmcm9tIHRoZSB0cmVlIG9mCisgKiBrZXl2YWxzIHByb3ZpZGVkLiAgY3NyMTIxMl9nZW5lcmF0ZV9jc3JfaW1hZ2UoKSBjcmVhdGVzIGEgY29tcGxldGUgaW1hZ2UgaW4KKyAqIHRoZSBsaXN0IG9mIGNhY2hlcyBhdmFpbGFibGUgdmlhIGNzci0+Y2FjaGVfaGVhZC4gIFRoZSBvdGhlciBmdW5jdGlvbnMgYXJlCisgKiBwcm92aWRlZCBzaG91bGQgdGhlcmUgYmUgYSBuZWVkIHRvIGNyZWF0ZSBhIGZsYXQgaW1hZ2Ugd2l0aG91dCByZXN0cmljdGlvbnMKKyAqIHBsYWNlZCBieSBJRUVFIDEyMTIuICovCitleHRlcm4gc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX2dlbmVyYXRlX3Bvc2l0aW9ucyhzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZSwKKwkJCQkJCQkgc3RydWN0IGNzcjEyMTJfa2V5dmFsICpzdGFydF9rdiwKKwkJCQkJCQkgaW50IHN0YXJ0X3Bvcyk7CitleHRlcm4gc2l6ZV90IGNzcjEyMTJfZ2VuZXJhdGVfbGF5b3V0X29yZGVyKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpOworZXh0ZXJuIHZvaWQgY3NyMTIxMl9maWxsX2NhY2hlKHN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlKTsKK2V4dGVybiBpbnQgY3NyMTIxMl9nZW5lcmF0ZV9jc3JfaW1hZ2Uoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IpOworCisKKy8qIFRoaXMgaXMgYSBjb252aWVuY2UgZnVuY3Rpb24gZm9yIHJlYWRpbmcgYSBibG9jayBvZiBkYXRhIG91dCBvZiBvbmUgb2YgdGhlCisgKiBjYWNoZXMgaW4gdGhlIGNzci0+Y2FjaGVfaGVhZCBsaXN0LiAqLworZXh0ZXJuIGludCBjc3IxMjEyX3JlYWQoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHVfaW50MzJfdCBvZmZzZXQsIHZvaWQgKmJ1ZmZlciwKKwkJCXVfaW50MzJfdCBsZW4pOworCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpbiBwbGFjZSBmb3IgcGFyc2luZyBDb25maWd1cmF0aW9uIFJPTSBpbWFnZXMuCisgKiBjc3IxMjEyX3BhcnNlX2tleXZhbCgpIGlzIHVzZWQgc2hvdWxkIHRoZXJlIGJlIGEgbmVlZCB0byBkaXJlY3RseSBwYXJzZSBhCisgKiBDb25maWd1cmF0aW9uIFJPTSBkaXJlY3RseS4gKi8KK2V4dGVybiBpbnQgY3NyMTIxMl9wYXJzZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdiwKKwkJCQlzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZSk7CitleHRlcm4gaW50IGNzcjEyMTJfcGFyc2VfY3NyKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyKTsKKworLyogVGhlc2UgYXJlIGludGVybmFsIGZ1bmN0aW9ucyByZWZlcmVuY2VkIGJ5IGlubGluZSBmdW5jdGlvbnMgYmVsb3cuICovCitleHRlcm4gaW50IF9jc3IxMjEyX3JlYWRfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLCBzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmt2KTsKK2V4dGVybiB2b2lkIF9jc3IxMjEyX2Rlc3Ryb3lfa2V5dmFsKHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3YpOworCisKKy8qIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbmV3IGNhY2hlIHdoaWNoIG1heSBiZSB1c2VkIGZvciBlaXRoZXIgcGFyc2luZyBvcgorICogZ2VuZXJhdGluZyBzdWItc2V0cyBvZiBDb25maWd1cmF0aW9uIFJPTSBpbWFnZXMuICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNzcjEyMTJfcm9tX2NhY2hlX21hbGxvYyh1X2ludDMyX3Qgb2Zmc2V0LAorCQkJCQkJCQkgICAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBjc3IxMjEyX2Nzcl9yb21fY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBDU1IxMjEyX01BTExPQyhzaXplb2Yoc3RydWN0IGNzcjEyMTJfY3NyX3JvbV9jYWNoZSkgKyBzaXplKTsKKwlpZiAoIWNhY2hlKQorCQlyZXR1cm4gTlVMTDsKKworCWNhY2hlLT5uZXh0ID0gTlVMTDsKKwljYWNoZS0+cHJldiA9IE5VTEw7CisJY2FjaGUtPmZpbGxlZF9oZWFkID0gTlVMTDsKKwljYWNoZS0+ZmlsbGVkX3RhaWwgPSBOVUxMOworCWNhY2hlLT5sYXlvdXRfaGVhZCA9IE5VTEw7CisJY2FjaGUtPmxheW91dF90YWlsID0gTlVMTDsKKwljYWNoZS0+b2Zmc2V0ID0gb2Zmc2V0OworCWNhY2hlLT5zaXplID0gc2l6ZTsKKwljYWNoZS0+ZXh0X3JvbSA9IE5VTEw7CisKKwlyZXR1cm4gY2FjaGU7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgYSBrZXl2YWwgY29udGFpbnMgZGF0YSB3aGVuIHJlZmVyZW5jaW5nIGEga2V5dmFsCisgKiBjcmVhdGVkIGJ5IHBhcnNpbmcgYSBDb25maWd1cmF0aW9uIFJPTS4gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNzcjEyMTJfa2V5dmFsICpjc3IxMjEyX2dldF9rZXl2YWwoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsCisJCQkJCQkJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdikKK3sKKwlpZiAoIWt2KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWt2LT52YWxpZCkKKwkJaWYgKF9jc3IxMjEyX3JlYWRfa2V5dmFsKGNzciwga3YpICE9IENTUjEyMTJfU1VDQ0VTUykKKwkJCXJldHVybiBOVUxMOworCXJldHVybiBrdjsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgYSBrZXl2YWwgc2hvdWxkIHRoZXJlIGJlIGEKKyAqIG5lZWQgZm9yIGNvZGUgdG8gcmV0YWluIGEga2V5dmFsIHRoYXQgaGFzIGJlZW4gcGFyc2VkLiAqLworc3RhdGljIGlubGluZSB2b2lkIGNzcjEyMTJfa2VlcF9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdikKK3sKKwlrdi0+cmVmY250Kys7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBkZWNyZW1lbnRzIGEga2V5dmFsJ3MgcmVmZXJlbmNlIGNvdW50IGFuZCB3aWxsIGRlc3Ryb3kgdGhlCisgKiBrZXl2YWwgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB1c2VycyBvZiB0aGUga2V5dmFsLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5CisgKiBhbnkgY29kZSB0aGF0IGNhbGxzIGNzcjEyMTJfa2VlcF9rZXl2YWwoKSBvciBhbnkgb2YgdGhlIGtleXZhbCBjcmVhdGlvbgorICogcm91dGluZXMgY3NyMTIxMl9uZXdfKigpLiAqLworc3RhdGljIGlubGluZSB2b2lkIGNzcjEyMTJfcmVsZWFzZV9rZXl2YWwoc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdikKK3sKKwlpZiAoa3YtPnJlZmNudCA+IDEpCisJCWt2LT5yZWZjbnQtLTsKKwllbHNlCisJCV9jc3IxMjEyX2Rlc3Ryb3lfa2V5dmFsKGt2KTsKK30KKworCisvKgorICogVGhpcyBtYWNybyBhbGxvd3MgZm9yIGxvb3Bpbmcgb3ZlciB0aGUga2V5dmFsIGVudHJpZXMgaW4gYSBkaXJlY3RvcnkgYW5kIGl0CisgKiBlbnN1cmVzIHRoYXQga2V5dmFscyBmcm9tIHJlbW90ZSBDb25maWdST01zIGFyZSBwYXJzZWQgcHJvcGVybHkuCisgKgorICogX2NzciBpcyBhIHN0cnVjdCBjc3IxMjEyX2NzciAqIHRoYXQgcG9pbnRzIHRvIENTUiBhc3NvY2lhdGVkIHdpdGggZGlyLgorICogX2t2IGlzIGEgc3RydWN0IGNzcjEyMTJfa2V5dmFsICogdGhhdCdsbCBwb2ludCB0byB0aGUgY3VycmVudCBrZXl2YWwgKGxvb3AgaW5kZXgpLgorICogX2RpciBpcyBhIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqIHRoYXQgcG9pbnRzIHRvIHRoZSBkaXJlY3RvcnkgdG8gYmUgbG9vcGVkLgorICogX3BvcyBpcyBhIHN0cnVjdCBjc3IxMjEyX2RlbnRyeSAqIHRoYXQgaXMgdXNlZCBpbnRlcm5hbGx5IGZvciBpbmRleGluZy4KKyAqCisgKiBrdiB3aWxsIGJlIE5VTEwgdXBvbiBleGl0IG9mIHRoZSBsb29wLgorICovCisjZGVmaW5lIGNzcjEyMTJfZm9yX2VhY2hfZGlyX2VudHJ5KF9jc3IsIF9rdiwgX2RpciwgX3BvcykJCQlcCisJZm9yIChjc3IxMjEyX2dldF9rZXl2YWwoKF9jc3IpLCAoX2RpcikpLAkJCQlcCisJICAgICBfcG9zID0gKF9kaXIpLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfaGVhZCwJCQlcCisJICAgICBfa3YgPSAoX3BvcykgPyBjc3IxMjEyX2dldF9rZXl2YWwoKF9jc3IpLCBfcG9zLT5rdikgOiBOVUxMOwlcCisJICAgICAoX2t2KSAmJiAoX3Bvcyk7CQkJCQkJCVwKKwkgICAgIChfa3YtPmFzc29jaWF0ZSA9PSBOVUxMKSA/CQkJCQkJXAorCQkgICAgICgoX3BvcyA9IF9wb3MtPm5leHQpLCAJCQkJCVwKKwkJICAgICAgKF9rdiA9IChfcG9zKSA/IGNzcjEyMTJfZ2V0X2tleXZhbCgoX2NzciksIF9wb3MtPmt2KSA6CVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpIDoJCQkJCQlcCisJCSAgICAgKF9rdiA9IGNzcjEyMTJfZ2V0X2tleXZhbCgoX2NzciksIF9rdi0+YXNzb2NpYXRlKSkpCisKKworCisjZW5kaWYgLyogX19DU1IxMjEyX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9kbWEuYyBiL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4ODE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBETUEgcmVnaW9uIGJvb2trZWVwaW5nIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIE1hYXMgRGlnaXRhbCBMTEMKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSByb290CisgKiBkaXJlY3Rvcnkgb2YgdGhlIGtlcm5lbCBzb3VyY2VzIGZvciBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSAiZG1hLmgiCisKKy8qIGRtYV9wcm9nX3JlZ2lvbiAqLworCit2b2lkIGRtYV9wcm9nX3JlZ2lvbl9pbml0KHN0cnVjdCBkbWFfcHJvZ19yZWdpb24gKnByb2cpCit7CisJcHJvZy0+a3ZpcnQgPSBOVUxMOworCXByb2ctPmRldiA9IE5VTEw7CisJcHJvZy0+bl9wYWdlcyA9IDA7CisJcHJvZy0+YnVzX2FkZHIgPSAwOworfQorCitpbnQgIGRtYV9wcm9nX3JlZ2lvbl9hbGxvYyhzdHJ1Y3QgZG1hX3Byb2dfcmVnaW9uICpwcm9nLCB1bnNpZ25lZCBsb25nIG5fYnl0ZXMsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJLyogcm91bmQgdXAgdG8gcGFnZSBzaXplICovCisJbl9ieXRlcyA9IFBBR0VfQUxJR04obl9ieXRlcyk7CisKKwlwcm9nLT5uX3BhZ2VzID0gbl9ieXRlcyA+PiBQQUdFX1NISUZUOworCisJcHJvZy0+a3ZpcnQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYsIG5fYnl0ZXMsICZwcm9nLT5idXNfYWRkcik7CisJaWYgKCFwcm9nLT5rdmlydCkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYV9wcm9nX3JlZ2lvbl9hbGxvYzogcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSBmYWlsZWRcbiIpOworCQlkbWFfcHJvZ19yZWdpb25fZnJlZShwcm9nKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJvZy0+ZGV2ID0gZGV2OworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZG1hX3Byb2dfcmVnaW9uX2ZyZWUoc3RydWN0IGRtYV9wcm9nX3JlZ2lvbiAqcHJvZykKK3sKKwlpZiAocHJvZy0+a3ZpcnQpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwcm9nLT5kZXYsIHByb2ctPm5fcGFnZXMgPDwgUEFHRV9TSElGVCwgcHJvZy0+a3ZpcnQsIHByb2ctPmJ1c19hZGRyKTsKKwl9CisKKwlwcm9nLT5rdmlydCA9IE5VTEw7CisJcHJvZy0+ZGV2ID0gTlVMTDsKKwlwcm9nLT5uX3BhZ2VzID0gMDsKKwlwcm9nLT5idXNfYWRkciA9IDA7Cit9CisKKy8qIGRtYV9yZWdpb24gKi8KKwordm9pZCBkbWFfcmVnaW9uX2luaXQoc3RydWN0IGRtYV9yZWdpb24gKmRtYSkKK3sKKwlkbWEtPmt2aXJ0ID0gTlVMTDsKKwlkbWEtPmRldiA9IE5VTEw7CisJZG1hLT5uX3BhZ2VzID0gMDsKKwlkbWEtPm5fZG1hX3BhZ2VzID0gMDsKKwlkbWEtPnNnbGlzdCA9IE5VTEw7Cit9CisKK2ludCBkbWFfcmVnaW9uX2FsbG9jKHN0cnVjdCBkbWFfcmVnaW9uICpkbWEsIHVuc2lnbmVkIGxvbmcgbl9ieXRlcywgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGRpcmVjdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIHJvdW5kIHVwIHRvIHBhZ2Ugc2l6ZSAqLworCW5fYnl0ZXMgPSBQQUdFX0FMSUdOKG5fYnl0ZXMpOworCisJZG1hLT5uX3BhZ2VzID0gbl9ieXRlcyA+PiBQQUdFX1NISUZUOworCisJZG1hLT5rdmlydCA9IHZtYWxsb2NfMzIobl9ieXRlcyk7CisJaWYgKCFkbWEtPmt2aXJ0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hX3JlZ2lvbl9hbGxvYzogdm1hbGxvY18zMigpIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCisJbWVtc2V0KGRtYS0+a3ZpcnQsIDAsIG5fYnl0ZXMpOworCisJLyogYWxsb2NhdGUgc2NhdHRlci9nYXRoZXIgbGlzdCAqLworCWRtYS0+c2dsaXN0ID0gdm1hbGxvYyhkbWEtPm5fcGFnZXMgKiBzaXplb2YoKmRtYS0+c2dsaXN0KSk7CisJaWYgKCFkbWEtPnNnbGlzdCkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYV9yZWdpb25fYWxsb2M6IHZtYWxsb2Moc2dsaXN0KSBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBqdXN0IHRvIGJlIHNhZmUgLSB0aGlzIHdpbGwgYmVjb21lIHVubmVjZXNzYXJ5IG9uY2Ugc2dsaXN0LT5hZGRyZXNzIGdvZXMgYXdheSAqLworCW1lbXNldChkbWEtPnNnbGlzdCwgMCwgZG1hLT5uX3BhZ2VzICogc2l6ZW9mKCpkbWEtPnNnbGlzdCkpOworCisJLyogZmlsbCBzY2F0dGVyL2dhdGhlciBsaXN0IHdpdGggcGFnZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZG1hLT5uX3BhZ2VzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyB2YSA9ICh1bnNpZ25lZCBsb25nKSBkbWEtPmt2aXJ0ICsgKGkgPDwgUEFHRV9TSElGVCk7CisKKwkJZG1hLT5zZ2xpc3RbaV0ucGFnZSA9IHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKXZhKTsKKwkJZG1hLT5zZ2xpc3RbaV0ubGVuZ3RoID0gUEFHRV9TSVpFOworCX0KKworCS8qIG1hcCBzZ2xpc3QgdG8gdGhlIElPTU1VICovCisJZG1hLT5uX2RtYV9wYWdlcyA9IHBjaV9tYXBfc2coZGV2LCBkbWEtPnNnbGlzdCwgZG1hLT5uX3BhZ2VzLCBkaXJlY3Rpb24pOworCisJaWYgKGRtYS0+bl9kbWFfcGFnZXMgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYV9yZWdpb25fYWxsb2M6IHBjaV9tYXBfc2coKSBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlkbWEtPmRldiA9IGRldjsKKwlkbWEtPmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKworCXJldHVybiAwOworCitlcnI6CisJZG1hX3JlZ2lvbl9mcmVlKGRtYSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgZG1hX3JlZ2lvbl9mcmVlKHN0cnVjdCBkbWFfcmVnaW9uICpkbWEpCit7CisJaWYgKGRtYS0+bl9kbWFfcGFnZXMpIHsKKwkJcGNpX3VubWFwX3NnKGRtYS0+ZGV2LCBkbWEtPnNnbGlzdCwgZG1hLT5uX3BhZ2VzLCBkbWEtPmRpcmVjdGlvbik7CisJCWRtYS0+bl9kbWFfcGFnZXMgPSAwOworCQlkbWEtPmRldiA9IE5VTEw7CisJfQorCisJdmZyZWUoZG1hLT5zZ2xpc3QpOworCWRtYS0+c2dsaXN0ID0gTlVMTDsKKworCXZmcmVlKGRtYS0+a3ZpcnQpOworCWRtYS0+a3ZpcnQgPSBOVUxMOworCWRtYS0+bl9wYWdlcyA9IDA7Cit9CisKKy8qIGZpbmQgdGhlIHNjYXR0ZXJsaXN0IGluZGV4IGFuZCByZW1haW5pbmcgb2Zmc2V0IGNvcnJlc3BvbmRpbmcgdG8gYQorICAgZ2l2ZW4gb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIGludCBkbWFfcmVnaW9uX2ZpbmQoc3RydWN0IGRtYV9yZWdpb24gKmRtYSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgKnJlbSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIG9mZiA9IG9mZnNldDsKKworCWZvciAoaSA9IDA7IGkgPCBkbWEtPm5fZG1hX3BhZ2VzOyBpKyspIHsKKwkJaWYgKG9mZiA8IHNnX2RtYV9sZW4oJmRtYS0+c2dsaXN0W2ldKSkgeworCQkJKnJlbSA9IG9mZjsKKwkJCWJyZWFrOworCQl9CisKKwkJb2ZmIC09IHNnX2RtYV9sZW4oJmRtYS0+c2dsaXN0W2ldKTsKKwl9CisKKwlCVUdfT04oaSA+PSBkbWEtPm5fZG1hX3BhZ2VzKTsKKworCXJldHVybiBpOworfQorCitkbWFfYWRkcl90IGRtYV9yZWdpb25fb2Zmc2V0X3RvX2J1cyhzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlbTsKKworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmZG1hLT5zZ2xpc3RbZG1hX3JlZ2lvbl9maW5kKGRtYSwgb2Zmc2V0LCAmcmVtKV07CisJcmV0dXJuIHNnX2RtYV9hZGRyZXNzKHNnKSArIHJlbTsKK30KKwordm9pZCBkbWFfcmVnaW9uX3N5bmNfZm9yX2NwdShzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJaW50IGZpcnN0LCBsYXN0OworCXVuc2lnbmVkIGxvbmcgcmVtOworCisJaWYgKCFsZW4pCisJCWxlbiA9IDE7CisKKwlmaXJzdCA9IGRtYV9yZWdpb25fZmluZChkbWEsIG9mZnNldCwgJnJlbSk7CisJbGFzdCA9IGRtYV9yZWdpb25fZmluZChkbWEsIG9mZnNldCArIGxlbiAtIDEsICZyZW0pOworCisJcGNpX2RtYV9zeW5jX3NnX2Zvcl9jcHUoZG1hLT5kZXYsICZkbWEtPnNnbGlzdFtmaXJzdF0sIGxhc3QgLSBmaXJzdCArIDEsIGRtYS0+ZGlyZWN0aW9uKTsKK30KKwordm9pZCBkbWFfcmVnaW9uX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJaW50IGZpcnN0LCBsYXN0OworCXVuc2lnbmVkIGxvbmcgcmVtOworCisJaWYgKCFsZW4pCisJCWxlbiA9IDE7CisKKwlmaXJzdCA9IGRtYV9yZWdpb25fZmluZChkbWEsIG9mZnNldCwgJnJlbSk7CisJbGFzdCA9IGRtYV9yZWdpb25fZmluZChkbWEsIG9mZnNldCArIGxlbiAtIDEsICZyZW0pOworCisJcGNpX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2UoZG1hLT5kZXYsICZkbWEtPnNnbGlzdFtmaXJzdF0sIGxhc3QgLSBmaXJzdCArIDEsIGRtYS0+ZGlyZWN0aW9uKTsKK30KKworI2lmZGVmIENPTkZJR19NTVUKKworLyogbm9wYWdlKCkgaGFuZGxlciBmb3IgbW1hcCBhY2Nlc3MgKi8KKworc3RhdGljIHN0cnVjdCBwYWdlKgorZG1hX3JlZ2lvbl9wYWdlZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCAqdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGtlcm5lbF92aXJ0X2FkZHI7CisJc3RydWN0IHBhZ2UgKnJldCA9IE5PUEFHRV9TSUdCVVM7CisKKwlzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hID0gKHN0cnVjdCBkbWFfcmVnaW9uKikgYXJlYS0+dm1fcHJpdmF0ZV9kYXRhOworCisJaWYgKCFkbWEtPmt2aXJ0KQorCQlnb3RvIG91dDsKKworCWlmICggKGFkZHJlc3MgPCAodW5zaWduZWQgbG9uZykgYXJlYS0+dm1fc3RhcnQpIHx8CisJICAgIChhZGRyZXNzID4gKHVuc2lnbmVkIGxvbmcpIGFyZWEtPnZtX3N0YXJ0ICsgKGRtYS0+bl9wYWdlcyA8PCBQQUdFX1NISUZUKSkgKQorCQlnb3RvIG91dDsKKworCWlmICh0eXBlKQorCQkqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCW9mZnNldCA9IGFkZHJlc3MgLSBhcmVhLT52bV9zdGFydDsKKwlrZXJuZWxfdmlydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGRtYS0+a3ZpcnQgKyBvZmZzZXQ7CisJcmV0ID0gdm1hbGxvY190b19wYWdlKCh2b2lkKikga2VybmVsX3ZpcnRfYWRkcik7CisJZ2V0X3BhZ2UocmV0KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGRtYV9yZWdpb25fdm1fb3BzID0geworCS5ub3BhZ2UJPSBkbWFfcmVnaW9uX3BhZ2VmYXVsdCwKK307CisKK2ludCBkbWFfcmVnaW9uX21tYXAoc3RydWN0IGRtYV9yZWdpb24gKmRtYSwgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmICghZG1hLT5rdmlydCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBtdXN0IGJlIHBhZ2UtYWxpZ25lZCAqLworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogY2hlY2sgdGhlIGxlbmd0aCAqLworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiAoZG1hLT5uX3BhZ2VzIDw8IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZtYS0+dm1fb3BzID0gJmRtYV9yZWdpb25fdm1fb3BzOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gZG1hOworCXZtYS0+dm1fZmlsZSA9IGZpbGU7CisJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKworCXJldHVybiAwOworfQorCisjZWxzZSAvKiBDT05GSUdfTU1VICovCisKK2ludCBkbWFfcmVnaW9uX21tYXAoc3RydWN0IGRtYV9yZWdpb24gKmRtYSwgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXJldHVybiAtRUlOVkFMOworfQorCisjZW5kaWYgLyogQ09ORklHX01NVSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9kbWEuaCBiL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxNTUwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIERNQSByZWdpb24gYm9va2tlZXBpbmcgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTWFhcyBEaWdpdGFsIExMQworICoKKyAqIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHJvb3QKKyAqIGRpcmVjdG9yeSBvZiB0aGUga2VybmVsIHNvdXJjZXMgZm9yIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBJRUVFMTM5NF9ETUFfSAorI2RlZmluZSBJRUVFMTM5NF9ETUFfSAorCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisKKy8qIHN0cnVjdCBkbWFfcHJvZ19yZWdpb24KKworICAgYSBzbWFsbCwgcGh5c2ljYWxseS1jb250aWd1b3VzIERNQSBidWZmZXIgd2l0aCByYW5kb20tYWNjZXNzLAorICAgc3luY2hyb25vdXMgdXNhZ2UgY2hhcmFjdGVyaXN0aWNzCisqLworCitzdHJ1Y3QgZG1hX3Byb2dfcmVnaW9uIHsKKwl1bnNpZ25lZCBjaGFyICAgICprdmlydDsgICAgIC8qIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcGNpX2RldiAgICpkZXY7ICAgICAgIC8qIFBDSSBkZXZpY2UgKi8KKwl1bnNpZ25lZCBpbnQgICAgICBuX3BhZ2VzOyAgIC8qICMgb2Yga2VybmVsIHBhZ2VzICovCisJZG1hX2FkZHJfdCAgICAgICAgYnVzX2FkZHI7ICAvKiBiYXNlIGJ1cyBhZGRyZXNzICovCit9OworCisvKiBjbGVhciBvdXQgYWxsIGZpZWxkcyBidXQgZG8gbm90IGFsbG9jYXRlIGFueSBtZW1vcnkgKi8KK3ZvaWQgZG1hX3Byb2dfcmVnaW9uX2luaXQoc3RydWN0IGRtYV9wcm9nX3JlZ2lvbiAqcHJvZyk7CitpbnQgIGRtYV9wcm9nX3JlZ2lvbl9hbGxvYyhzdHJ1Y3QgZG1hX3Byb2dfcmVnaW9uICpwcm9nLCB1bnNpZ25lZCBsb25nIG5fYnl0ZXMsIHN0cnVjdCBwY2lfZGV2ICpkZXYpOwordm9pZCBkbWFfcHJvZ19yZWdpb25fZnJlZShzdHJ1Y3QgZG1hX3Byb2dfcmVnaW9uICpwcm9nKTsKKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKHN0cnVjdCBkbWFfcHJvZ19yZWdpb24gKnByb2csIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiBwcm9nLT5idXNfYWRkciArIG9mZnNldDsKK30KKworLyogc3RydWN0IGRtYV9yZWdpb24KKworICAgYSBsYXJnZSwgbm9uLXBoeXNpY2FsbHktY29udGlndW91cyBETUEgYnVmZmVyIHdpdGggc3RyZWFtaW5nLAorICAgYXN5bmNocm9ub3VzIHVzYWdlIGNoYXJhY3RlcmlzdGljcworKi8KKworc3RydWN0IGRtYV9yZWdpb24geworCXVuc2lnbmVkIGNoYXIgICAgICAqa3ZpcnQ7ICAgICAgIC8qIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcGNpX2RldiAgICAgKmRldjsgICAgICAgICAvKiBQQ0kgZGV2aWNlICovCisJdW5zaWduZWQgaW50ICAgICAgICBuX3BhZ2VzOyAgICAgLyogIyBvZiBrZXJuZWwgcGFnZXMgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgIG5fZG1hX3BhZ2VzOyAvKiAjIG9mIElPTU1VIHBhZ2VzICovCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3Q7ICAgICAgLyogSU9NTVUgbWFwcGluZyAqLworCWludCAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOyAgIC8qIFBDSV9ETUFfVE9ERVZJQ0UsIGV0YyAqLworfTsKKworLyogY2xlYXIgb3V0IGFsbCBmaWVsZHMgYnV0IGRvIG5vdCBhbGxvY2F0ZSBhbnl0aGluZyAqLwordm9pZCBkbWFfcmVnaW9uX2luaXQoc3RydWN0IGRtYV9yZWdpb24gKmRtYSk7CisKKy8qIGFsbG9jYXRlIHRoZSBidWZmZXIgYW5kIG1hcCBpdCB0byB0aGUgSU9NTVUgKi8KK2ludCAgZG1hX3JlZ2lvbl9hbGxvYyhzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hLCB1bnNpZ25lZCBsb25nIG5fYnl0ZXMsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBkaXJlY3Rpb24pOworCisvKiB1bm1hcCBhbmQgZnJlZSB0aGUgYnVmZmVyICovCit2b2lkIGRtYV9yZWdpb25fZnJlZShzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hKTsKKworLyogc3luYyB0aGUgQ1BVJ3MgdmlldyBvZiB0aGUgYnVmZmVyICovCit2b2lkIGRtYV9yZWdpb25fc3luY19mb3JfY3B1KHN0cnVjdCBkbWFfcmVnaW9uICpkbWEsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxlbik7CisvKiBzeW5jIHRoZSBJTyBidXMnIHZpZXcgb2YgdGhlIGJ1ZmZlciAqLwordm9pZCBkbWFfcmVnaW9uX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4pOworCisvKiBtYXAgdGhlIGJ1ZmZlciBpbnRvIGEgdXNlciBzcGFjZSBwcm9jZXNzICovCitpbnQgIGRtYV9yZWdpb25fbW1hcChzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworCisvKiBtYWNybyB0byBpbmRleCBpbnRvIGEgRE1BIHJlZ2lvbiAob3IgZG1hX3Byb2dfcmVnaW9uKSAqLworI2RlZmluZSBkbWFfcmVnaW9uX2koX2RtYSwgX3R5cGUsIF9pbmRleCkgKCAoKF90eXBlKikgKChfZG1hKS0+a3ZpcnQpKSArIChfaW5kZXgpICkKKworLyogcmV0dXJuIHRoZSBETUEgYnVzIGFkZHJlc3Mgb2YgdGhlIGJ5dGUgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0CisgICByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkbWFfcmVnaW9uICovCitkbWFfYWRkcl90IGRtYV9yZWdpb25fb2Zmc2V0X3RvX2J1cyhzdHJ1Y3QgZG1hX3JlZ2lvbiAqZG1hLCB1bnNpZ25lZCBsb25nIG9mZnNldCk7CisKKyNlbmRpZiAvKiBJRUVFMTM5NF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQtcHJpdmF0ZS5oIGIvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQtcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYjVhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC1wcml2YXRlLmgKQEAgLTAsMCArMSw1ODcgQEAKKy8qCisgKiBkdjEzOTQtcHJpdmF0ZS5oIC0gRFYgaW5wdXQvb3V0cHV0IG92ZXIgSUVFRSAxMzk0IG9uIE9IQ0kgY2hpcHMKKyAqICAgQ29weXJpZ2h0IChDKTIwMDEgRGFuaWVsIE1hYXMgPGRtYWFzQGRjaW5lLmNvbT4KKyAqICAgICByZWNlaXZlIGJ5IERhbiBEZW5uZWR5IDxkYW5AZGVubmVkeS5vcmc+CisgKgorICogYmFzZWQgb246CisgKiAgIHZpZGVvMTM5NC5oIC0gZHJpdmVyIGZvciBPSENJIDEzOTQgYm9hcmRzCisgKiAgIENvcHlyaWdodCAoQykxOTk5LDIwMDAgU2ViYXN0aWVuIFJvdWdlYXV4IDxzZWJhc3RpZW4ucm91Z2VhdXhAYW51LmVkdS5hdT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBQZXRlciBTY2hsYWlsZSA8dWRiekByei51bmkta2FybHNydWhlLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfRFZfMTM5NF9QUklWQVRFX0gKKyNkZWZpbmUgX0RWXzEzOTRfUFJJVkFURV9ICisKKyNpbmNsdWRlICJpZWVlMTM5NC5oIgorI2luY2x1ZGUgIm9oY2kxMzk0LmgiCisjaW5jbHVkZSAiZG1hLmgiCisKKy8qIGRhdGEgc3RydWN0dXJlcyBwcml2YXRlIHRvIHRoZSBkdjEzOTQgZHJpdmVyICovCisvKiBub25lIG9mIHRoaXMgaXMgZXhwb3NlZCB0byB1c2VyLXNwYWNlICovCisKKworLyoKKyAgIHRoZSA4LWJ5dGUgQ0lQIChDb21tb24gSXNvY2hyb25vdXMgUGFja2V0KSBoZWFkZXIgdGhhdCBwcmVjZWRlcworICAgZWFjaCBwYWNrZXQgb2YgRFYgZGF0YS4KKworICAgU2VlIHRoZSBJRUMgNjE4ODMgc3RhbmRhcmQuCisqLworCitzdHJ1Y3QgQ0lQX2hlYWRlciB7IHVuc2lnbmVkIGNoYXIgYls4XTsgfTsKKworc3RhdGljIGlubGluZSB2b2lkIGZpbGxfY2lwX2hlYWRlcihzdHJ1Y3QgQ0lQX2hlYWRlciAqY2lwLAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgc291cmNlX25vZGVfaWQsCisJCQkJICAgdW5zaWduZWQgbG9uZyBjb3VudGVyLAorCQkJCSAgIGVudW0gcGFsX29yX250c2MgZm9ybWF0LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgdGltZXN0YW1wKQoreworCWNpcC0+YlswXSA9IHNvdXJjZV9ub2RlX2lkOworCWNpcC0+YlsxXSA9IDB4Nzg7IC8qIHBhY2tldCBzaXplIGluIHF1YWRsZXRzICg0ODAvNCkgLSBldmVuIGZvciBlbXB0eSBwYWNrZXRzISAqLworCWNpcC0+YlsyXSA9IDB4MDA7CisJY2lwLT5iWzNdID0gY291bnRlcjsKKworCWNpcC0+Yls0XSA9IDB4ODA7IC8qIGNvbnN0ICovCisKKwlzd2l0Y2goZm9ybWF0KSB7CisJY2FzZSBEVjEzOTRfUEFMOgorCQljaXAtPmJbNV0gPSAweDgwOworCQlicmVhazsKKwljYXNlIERWMTM5NF9OVFNDOgorCQljaXAtPmJbNV0gPSAweDAwOworCQlicmVhazsKKwl9CisKKwljaXAtPmJbNl0gPSB0aW1lc3RhbXAgPj4gODsKKwljaXAtPmJbN10gPSB0aW1lc3RhbXAgJiAweEZGOworfQorCisKKworLyoKKyAgIERNQSBjb21tYW5kcyB1c2VkIHRvIHByb2dyYW0gdGhlIE9IQ0kncyBETUEgZW5naW5lCisKKyAgIFNlZSB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgT0hDSSAxMzk0IGNoaXBzZXQgZG9jdW1lbnRhdGlvbi4KKyovCisKK3N0cnVjdCBvdXRwdXRfbW9yZV9pbW1lZGlhdGUgeyB1MzIgcVs4XTsgfTsKK3N0cnVjdCBvdXRwdXRfbW9yZSB7IHUzMiBxWzRdOyB9Oworc3RydWN0IG91dHB1dF9sYXN0IHsgdTMyIHFbNF07IH07CitzdHJ1Y3QgaW5wdXRfbW9yZSB7IHUzMiBxWzRdOyB9Oworc3RydWN0IGlucHV0X2xhc3QgeyB1MzIgcVs0XTsgfTsKKworLyogb3V0cHV0cyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9vdXRwdXRfbW9yZV9pbW1lZGlhdGUoc3RydWN0IG91dHB1dF9tb3JlX2ltbWVkaWF0ZSAqb21pLAorCQkJCQkgICAgICB1bnNpZ25lZCBjaGFyIHRhZywKKwkJCQkJICAgICAgdW5zaWduZWQgY2hhciBjaGFubmVsLAorCQkJCQkgICAgICB1bnNpZ25lZCBjaGFyIHN5bmNfdGFnLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgIHBheWxvYWRfc2l6ZSkKK3sKKwlvbWktPnFbMF0gPSBjcHVfdG9fbGUzMigweDAyMDAwMDAwIHwgOCk7IC8qIE9VVFBVVF9NT1JFX0lNTUVESUFURTsgOCBpcyB0aGUgc2l6ZSBvZiB0aGUgSVQgaGVhZGVyICovCisJb21pLT5xWzFdID0gMDsKKwlvbWktPnFbMl0gPSAwOworCW9taS0+cVszXSA9IDA7CisKKwkvKiBJVCBwYWNrZXQgaGVhZGVyICovCisJb21pLT5xWzRdID0gY3B1X3RvX2xlMzIoICAoMHgwIDw8IDE2KSAgLyogSUVFRTEzOTRfU1BFRURfMTAwICovCisJCQkJICB8ICh0YWcgPDwgMTQpCisJCQkJICB8IChjaGFubmVsIDw8IDgpCisJCQkJICB8IChUQ09ERV9JU09fREFUQSA8PCA0KQorCQkJCSAgfCAoc3luY190YWcpICk7CisKKwkvKiByZXNlcnZlZCBmaWVsZDsgbWltaWMgYmVoYXZpb3Igb2YgbXkgU29ueSBEU1ItNDAgKi8KKwlvbWktPnFbNV0gPSBjcHVfdG9fbGUzMigocGF5bG9hZF9zaXplIDw8IDE2KSB8ICgweDdGIDw8IDgpIHwgMHhBMCk7CisKKwlvbWktPnFbNl0gPSAwOworCW9taS0+cVs3XSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX291dHB1dF9tb3JlKHN0cnVjdCBvdXRwdXRfbW9yZSAqb20sCisJCQkJICAgIHVuc2lnbmVkIGludCBkYXRhX3NpemUsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgZGF0YV9waHlzX2FkZHIpCit7CisJb20tPnFbMF0gPSBjcHVfdG9fbGUzMihkYXRhX3NpemUpOworCW9tLT5xWzFdID0gY3B1X3RvX2xlMzIoZGF0YV9waHlzX2FkZHIpOworCW9tLT5xWzJdID0gMDsKKwlvbS0+cVszXSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX291dHB1dF9sYXN0KHN0cnVjdCBvdXRwdXRfbGFzdCAqb2wsCisJCQkJICAgIGludCB3YW50X3RpbWVzdGFtcCwKKwkJCQkgICAgaW50IHdhbnRfaW50ZXJydXB0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YV9zaXplLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGRhdGFfcGh5c19hZGRyKQoreworCXUzMiB0ZW1wID0gMDsKKwl0ZW1wIHw9IDEgPDwgMjg7IC8qIE9VVFBVVF9MQVNUICovCisKKwlpZiAod2FudF90aW1lc3RhbXApIC8qIGNvbnRyb2xsZXIgd2lsbCB1cGRhdGUgdGltZXN0YW1wIGF0IERNQSB0aW1lICovCisJCXRlbXAgfD0gMSA8PCAyNzsKKworCWlmICh3YW50X2ludGVycnVwdCkKKwkJdGVtcCB8PSAzIDw8IDIwOworCisJdGVtcCB8PSAzIDw8IDE4OyAvKiBtdXN0IHRha2UgYnJhbmNoICovCisJdGVtcCB8PSBkYXRhX3NpemU7CisKKwlvbC0+cVswXSA9IGNwdV90b19sZTMyKHRlbXApOworCW9sLT5xWzFdID0gY3B1X3RvX2xlMzIoZGF0YV9waHlzX2FkZHIpOworCW9sLT5xWzJdID0gMDsKKwlvbC0+cVszXSA9IDA7Cit9CisKKy8qIGlucHV0cyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9pbnB1dF9tb3JlKHN0cnVjdCBpbnB1dF9tb3JlICppbSwKKwkJCQkgICBpbnQgd2FudF9pbnRlcnJ1cHQsCisJCQkJICAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGRhdGFfcGh5c19hZGRyKQoreworCXUzMiB0ZW1wID0gIDIgPDwgMjg7IC8qIElOUFVUX01PUkUgKi8KKwl0ZW1wIHw9IDggPDwgMjQ7IC8qIHMgPSAxLCB1cGRhdGUgeGZlclN0YXR1cyBhbmQgcmVzQ291bnQgKi8KKwlpZiAod2FudF9pbnRlcnJ1cHQpCisJCXRlbXAgfD0gMCA8PCAyMDsgLyogaW50ZXJydXB0cywgaT0wIGluIHBhY2tldC1wZXItYnVmZmVyIG1vZGUgKi8KKwl0ZW1wIHw9IDB4MCA8PCAxNjsgLyogZGlzYWJsZSBicmFuY2ggdG8gYWRkcmVzcyBmb3IgcGFja2V0LXBlci1idWZmZXIgbW9kZSAqLworCSAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzYWJsZSB3YWl0IG9uIHN5bmMgZmllbGQsIG5vdCB1c2VkIGluIERWIDotKCAqLworICAgICAgIAl0ZW1wIHw9IGRhdGFfc2l6ZTsKKworCWltLT5xWzBdID0gY3B1X3RvX2xlMzIodGVtcCk7CisJaW0tPnFbMV0gPSBjcHVfdG9fbGUzMihkYXRhX3BoeXNfYWRkcik7CisJaW0tPnFbMl0gPSAwOyAvKiBicmFuY2hBZGRyZXNzIGFuZCBaIG5vdCB1c2UgaW4gcGFja2V0LXBlci1idWZmZXIgbW9kZSAqLworCWltLT5xWzNdID0gMDsgLyogeGZlclN0YXR1cyAmIHJlc0NvdW50LCByZXNDb3VudCBtdXN0IGJlIGluaXRpYWxpemUgdG8gZGF0YV9zaXplICovCit9CisgCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9pbnB1dF9sYXN0KHN0cnVjdCBpbnB1dF9sYXN0ICppbCwKKwkJCQkgICAgaW50IHdhbnRfaW50ZXJydXB0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YV9zaXplLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGRhdGFfcGh5c19hZGRyKQoreworCXUzMiB0ZW1wID0gIDMgPDwgMjg7IC8qIElOUFVUX0xBU1QgKi8KKwl0ZW1wIHw9IDggPDwgMjQ7IC8qIHMgPSAxLCB1cGRhdGUgeGZlclN0YXR1cyBhbmQgcmVzQ291bnQgKi8KKwlpZiAod2FudF9pbnRlcnJ1cHQpCisJCXRlbXAgfD0gMyA8PCAyMDsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwl0ZW1wIHw9IDB4QyA8PCAxNjsgLyogZW5hYmxlIGJyYW5jaCB0byBhZGRyZXNzICovCisJICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIHdhaXQgb24gc3luYyBmaWVsZCwgbm90IHVzZWQgaW4gRFYgOi0oICovCisJdGVtcCB8PSBkYXRhX3NpemU7CisKKwlpbC0+cVswXSA9IGNwdV90b19sZTMyKHRlbXApOworCWlsLT5xWzFdID0gY3B1X3RvX2xlMzIoZGF0YV9waHlzX2FkZHIpOworCWlsLT5xWzJdID0gY3B1X3RvX2xlMzIoMSk7IC8qIGJyYW5jaEFkZHJlc3MgKGZpbGxlZCBpbiBsYXRlcikgYW5kIFogPSAxIGRlc2NyaXB0b3IgaW4gbmV4dCBibG9jayAqLworCWlsLT5xWzNdID0gY3B1X3RvX2xlMzIoZGF0YV9zaXplKTsgLyogeGZlclN0YXR1cyAmIHJlc0NvdW50LCByZXNDb3VudCBtdXN0IGJlIGluaXRpYWxpemUgdG8gZGF0YV9zaXplICovCit9CisKKworCisvKgorICAgQSAiRE1BIGRlc2NyaXB0b3IgYmxvY2siIGNvbnNpc3RzIG9mIHNldmVyYWwgY29udGlndW91cyBETUEgY29tbWFuZHMuCisgICBzdHJ1Y3QgRE1BX2Rlc2NyaXB0b3JfYmxvY2sgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgY29tbWFuZHMgbmVjZXNzYXJ5CisgICB0byBzZW5kIG9uZSBwYWNrZXQgb2YgRFYgZGF0YS4KKworICAgVGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCB0eXBlcyBvZiB0aGVzZSBibG9ja3M6CisKKyAgICAgICAgMSkgY29tbWFuZCB0byBzZW5kIGFuIGVtcHR5IHBhY2tldCAoQ0lQIGhlYWRlciBvbmx5LCBubyBEViBkYXRhKToKKworCSAgICBPVVRQVVRfTU9SRS1JbW1lZGlhdGUgPC0tIGNvbnRhaW5zIHRoZSBpc28gaGVhZGVyIGluLWxpbmUKKwkgICAgT1VUUFVUX0xBU1QgICAgICAgICAgIDwtLSBwb2ludHMgdG8gdGhlIENJUCBoZWFkZXIKKworCTIpIGNvbW1hbmQgdG8gc2VuZCBhIGZ1bGwgcGFja2V0IHdoZW4gdGhlIERWIGRhdGEgcGF5bG9hZCBkb2VzIE5PVAorCSAgIGNyb3NzIGEgcGFnZSBib3VuZGFyeToKKworCSAgICBPVVRQVVRfTU9SRS1JbW1lZGlhdGUgPC0tIGNvbnRhaW5zIHRoZSBpc28gaGVhZGVyIGluLWxpbmUKKwkgICAgT1VUUFVUX01PUkUgICAgICAgICAgIDwtLSBwb2ludHMgdG8gdGhlIENJUCBoZWFkZXIKKwkgICAgT1VUUFVUX0xBU1QgICAgICAgICAgIDwtLSBwb2ludHMgdG8gZW50aXJlIERWIGRhdGEgcGF5bG9hZAorCisJMykgY29tbWFuZCB0byBzZW5kIGEgZnVsbCBwYWNrZXQgd2hlbiB0aGUgRFYgcGF5bG9hZCBET0VTIGNyb3NzCisJICAgYSBwYWdlIGJvdW5kYXJ5OgorCisJICAgIE9VVFBVVF9NT1JFLUltbWVkaWF0ZSA8LS0gY29udGFpbnMgdGhlIGlzbyBoZWFkZXIgaW4tbGluZQorCSAgICBPVVRQVVRfTU9SRSAgICAgICAgICAgPC0tIHBvaW50cyB0byB0aGUgQ0lQIGhlYWRlcgorCSAgICBPVVRQVVRfTU9SRSAgICAgICAgICAgPC0tIHBvaW50cyB0byBmaXJzdCBwYXJ0IG9mIERWIGRhdGEgcGF5bG9hZAorCSAgICBPVVRQVVRfTEFTVCAgICAgICAgICAgPC0tIHBvaW50cyB0byBzZWNvbmQgcGFydCBvZiBEViBkYXRhIHBheWxvYWQKKworICAgVGhpcyBzdHJ1Y3QgZGVzY3JpYmVzIGFsbCB0aHJlZSBibG9jayB0eXBlcyB1c2luZyB1bmlvbnMuCisKKyAgICEhISBJdCBpcyB2aXRhbCB0aGF0IGFuIGV2ZW4gbnVtYmVyIG9mIHRoZXNlIGRlc2NyaXB0b3IgYmxvY2tzIGZpdCBvbiBvbmUKKyAgIHBhZ2Ugb2YgbWVtb3J5LCBzaW5jZSBhIGJsb2NrIGNhbm5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkgISEhCisKKyAqLworCitzdHJ1Y3QgRE1BX2Rlc2NyaXB0b3JfYmxvY2sgeworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogIGlzbyBoZWFkZXIsIGNvbW1vbiB0byBhbGwgb3V0cHV0IGJsb2NrIHR5cGVzICovCisJCQlzdHJ1Y3Qgb3V0cHV0X21vcmVfaW1tZWRpYXRlIG9taTsKKworCQkJdW5pb24geworCQkJCS8qIGVtcHR5IHBhY2tldCAqLworCQkJCXN0cnVjdCB7CisJCQkJCXN0cnVjdCBvdXRwdXRfbGFzdCBvbDsgIC8qIENJUCBoZWFkZXIgKi8KKwkJCQl9IGVtcHR5OworCisJCQkJLyogZnVsbCBwYWNrZXQgKi8KKwkJCQlzdHJ1Y3QgeworCQkJCQlzdHJ1Y3Qgb3V0cHV0X21vcmUgb207ICAvKiBDSVAgaGVhZGVyICovCisKKwkJCQkJdW5pb24geworCQkJCSAgICAgICAgICAgICAgIC8qIHBheWxvYWQgZG9lcyBub3QgY3Jvc3MgcGFnZSBib3VuZGFyeSAqLworCQkJCQkJc3RydWN0IHsKKwkJCQkJCQlzdHJ1Y3Qgb3V0cHV0X2xhc3Qgb2w7ICAvKiBkYXRhIHBheWxvYWQgKi8KKwkJCQkJCX0gbm9jcm9zczsKKworCQkJCSAgICAgICAgICAgICAgIC8qIHBheWxvYWQgY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5ICovCisJCQkJCQlzdHJ1Y3QgeworCQkJCQkJCXN0cnVjdCBvdXRwdXRfbW9yZSBvbTsgIC8qIGRhdGEgcGF5bG9hZCAqLworCQkJCQkJCXN0cnVjdCBvdXRwdXRfbGFzdCBvbDsgIC8qIGRhdGEgcGF5bG9hZCAqLworCQkJCQkJfSBjcm9zczsKKwkJCQkJfSB1OworCisJCQkJfSBmdWxsOworCQkJfSB1OworCQl9IG91dDsKKworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGlucHV0X2xhc3QgaWw7CisJCX0gaW47CisKKwl9IHU7CisKKwkvKiBlbnN1cmUgdGhhdCBQQUdFX1NJWkUgJSBzaXplb2Yoc3RydWN0IERNQV9kZXNjcmlwdG9yX2Jsb2NrKSA9PSAwCisJICAgYnkgcGFkZGluZyBvdXQgdG8gMTI4IGJ5dGVzICovCisJdTMyIF9fcGFkX19bMTJdOworfTsKKworCisvKiBzdHJ1Y3QgZnJhbWUgY29udGFpbnMgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIG9uZSBmcmFtZSBpbiB0aGUKKyAgIHJpbmdidWZmZXIgdGhlc2UgYXJlIGFsbG9jYXRlZCB3aGVuIHRoZSBETUEgY29udGV4dCBpcyBpbml0aWFsaXplZAorICAgZG9fZHYxMzk0X2luaXQoKS4gIFRoZXkgYXJlIHJlLXVzZWQgYWZ0ZXIgdGhlIGNhcmQgZmluaXNoZXMKKyAgIHRyYW5zbWl0dGluZyB0aGUgZnJhbWUuICovCisKK3N0cnVjdCB2aWRlb19jYXJkOyAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCisKK3N0cnVjdCBmcmFtZSB7CisKKwkvKiBwb2ludHMgdG8gdGhlIHN0cnVjdCB2aWRlb19jYXJkIHRoYXQgb3ducyB0aGlzIGZyYW1lICovCisJc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvOworCisJLyogaW5kZXggb2YgdGhpcyBmcmFtZSBpbiB2aWRlb19jYXJkLT5mcmFtZXNbXSAqLworCXVuc2lnbmVkIGludCBmcmFtZV9udW07CisKKwkvKiBGUkFNRV9DTEVBUiAtIERNQSBwcm9ncmFtIG5vdCBzZXQgdXAsIHdhaXRpbmcgZm9yIGRhdGEKKwkgICBGUkFNRV9SRUFEWSAtIERNQSBwcm9ncmFtIHdyaXR0ZW4sIHJlYWR5IHRvIHRyYW5zbWl0CisKKwkgICBDaGFuZ2VzIHRvIHRoZXNlIHNob3VsZCBiZSBsb2NrZWQgYWdhaW5zdCB0aGUgaW50ZXJydXB0CisJKi8KKwllbnVtIHsKKwkJRlJBTUVfQ0xFQVIgPSAwLAorCQlGUkFNRV9SRUFEWQorCX0gc3RhdGU7CisKKwkvKiB3aGV0aGVyIHRoaXMgZnJhbWUgaGFzIGJlZW4gRE1BJ2VkIGFscmVhZHk7IHVzZWQgb25seSBmcm9tCisJICAgdGhlIElSUSBoYW5kbGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBmcmFtZSBjYW4gYmUgcmVzZXQgKi8KKwlpbnQgZG9uZTsKKworCisJLyoga2VybmVsIHZpcnR1YWwgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhpcyBmcmFtZSdzIGRhdGEgaW4KKwkgICB0aGUgdXNlciByaW5nYnVmZmVyLiBVc2Ugb25seSBmb3IgQ1BVIGFjY2VzczsgdG8gZ2V0IHRoZSBETUEKKwkgICBidXMgYWRkcmVzcyB5b3UgbXVzdCBnbyB0aHJvdWdoIHRoZSB2aWRlby0+dXNlcl9kbWEgbWFwcGluZyAqLworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKworCS8qIE1heCAjIG9mIHBhY2tldHMgcGVyIGZyYW1lICovCisjZGVmaW5lIE1BWF9QQUNLRVRTIDUwMAorCisKKwkvKiBhIFBBR0VfU0laRSBtZW1vcnkgcG9vbCBmb3IgYWxsb2NhdGluZyBDSVAgaGVhZGVycworCSAgICFoZWFkZXJfcG9vbCBtdXN0IGJlIGFsaWduZWQgdG8gUEFHRV9TSVpFISAqLworCXN0cnVjdCBDSVBfaGVhZGVyICpoZWFkZXJfcG9vbDsKKwlkbWFfYWRkcl90ICAgICAgICAgaGVhZGVyX3Bvb2xfZG1hOworCisKKwkvKiBhIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkgcG9vbCBmb3IgYWxsb2NhdGluZyBETUEKKwkgICBkZXNjcmlwdG9yIGJsb2NrczsgdXN1YWxseSBhcm91bmQgNjRLQiBpbiBzaXplCisJICAgIWRlc2NyaXB0b3JfcG9vbCBtdXN0IGJlIGFsaWduZWQgdG8gUEFHRV9TSVpFISAqLworCXN0cnVjdCBETUFfZGVzY3JpcHRvcl9ibG9jayAqZGVzY3JpcHRvcl9wb29sOworCWRtYV9hZGRyX3QgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sX2RtYTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcG9vbF9zaXplOworCisKKwkvKiAjIG9mIHBhY2tldHMgYWxsb2NhdGVkIGZvciB0aGlzIGZyYW1lICovCisJdW5zaWduZWQgaW50IG5fcGFja2V0czsKKworCisJLyogYmVsb3cgYXJlIHNldmVyYWwgcG9pbnRlcnMgKGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Nlcywgbm90CisJICAgRE1BIGJ1cyBhZGRyZXNzZXMpIHRvIHBhcnRzIG9mIHRoZSBETUEgcHJvZ3JhbS4gIFRoZXNlIGFyZQorCSAgIHNldCBlYWNoIHRpbWUgdGhlIERNQSBwcm9ncmFtIGlzIHdyaXR0ZW4gaW4KKwkgICBmcmFtZV9wcmVwYXJlKCkuIFRoZXkgYXJlIHVzZWQgbGF0ZXIgb24sIGUuZy4gZnJvbSB0aGUKKwkgICBpbnRlcnJ1cHQgaGFuZGxlciwgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgZnJhbWUgKi8KKworCS8qIHBvaW50cyB0byBzdGF0dXMvdGltZXN0YW1wIGZpZWxkIG9mIGZpcnN0IERNQSBwYWNrZXQgKi8KKwkvKiAod2UnbGwgY2hlY2sgaXQgbGF0ZXIgdG8gbW9uaXRvciB0aW1lc3RhbXAgYWNjdXJhY3kpICovCisJdTMyICpmcmFtZV9iZWdpbl90aW1lc3RhbXA7CisKKwkvKiB0aGUgdGltZXN0YW1wIHdlIGFzc2lnbmVkIHRvIHRoZSBmaXJzdCBwYWNrZXQgaW4gdGhlIGZyYW1lICovCisJdTMyIGFzc2lnbmVkX3RpbWVzdGFtcDsKKworCS8qIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHBhY2tldCdzIENJUCBoZWFkZXIgKHdoZXJlIHRoZSB0aW1lc3RhbXAgZ29lcykgKi8KKwlzdHJ1Y3QgQ0lQX2hlYWRlciAqY2lwX3N5dDE7CisKKwkvKiBwb2ludGVyIHRvIHRoZSBzZWNvbmQgcGFja2V0J3MgQ0lQIGhlYWRlcgorCSAgIChvbmx5IHNldCBpZiB0aGUgZmlyc3QgcGFja2V0IHdhcyBlbXB0eSkgKi8KKwlzdHJ1Y3QgQ0lQX2hlYWRlciAqY2lwX3N5dDI7CisKKwkvKiBpbiBvcmRlciB0byBmaWd1cmUgb3V0IHdoYXQgY2F1c2VkIGFuIGludGVycnVwdCwKKwkgICBzdG9yZSBwb2ludGVycyB0byB0aGUgc3RhdHVzIGZpZWxkcyBvZiB0aGUgdHdvIHBhY2tldHMKKwkgICB0aGF0IGNhbiBjYXVzZSBpbnRlcnJ1cHRzLiBXZSdsbCBjaGVjayB0aGVzZSBmcm9tIHRoZQorCSAgIGludGVycnVwdCBoYW5kbGVyLgorCSovCisJdTMyICptaWRfZnJhbWVfdGltZXN0YW1wOworCXUzMiAqZnJhbWVfZW5kX3RpbWVzdGFtcDsKKworCS8qIGJyYW5jaCBhZGRyZXNzIGZpZWxkIG9mIGZpbmFsIHBhY2tldC4gVGhpcyBpcyBlZmZlY3RpdmVseQorCSAgIHRoZSAidGFpbCIgaW4gdGhlIGNoYWluIG9mIERNQSBkZXNjcmlwdG9yIGJsb2Nrcy4KKwkgICBXZSB3aWxsIGZpbGwgaXQgd2l0aCB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgRE1BIGRlc2NyaXB0b3IKKwkgICBibG9jayBpbiB0aGUgc3Vic2VxdWVudCBmcmFtZSwgb25jZSBpdCBpcyByZWFkeS4KKwkqLworCXUzMiAqZnJhbWVfZW5kX2JyYW5jaDsKKworCS8qIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIGZpcnN0IGRlc2NyaXB0b3IgYmxvY2sKKwkgICBvZiB0aGUgZnJhbWUuIE5lZWRlZCB0byBzdGFydCBETUEgKi8KKwlpbnQgZmlyc3Rfbl9kZXNjcmlwdG9yczsKK307CisKKworc3RydWN0IHBhY2tldCB7CisJdTE2CXRpbWVzdGFtcDsKKwl1MTYJaW52YWxpZDsKKwl1MTYJaXNvX2hlYWRlcjsKKwl1MTYJZGF0YV9sZW5ndGg7CisJdTMyCWNpcF9oMTsKKwl1MzIJY2lwX2gyOworCXVuc2lnbmVkIGNoYXIgZGF0YVs0ODBdOworCXVuc2lnbmVkIGNoYXIgcGFkZGluZ1sxNl07IC8qIGZvcmNlIHN0cnVjdCBzaXplID01MTIgZm9yIHBhZ2UgYWxpZ25tZW50ICovCit9OworCisKKy8qIGFsbG9jYXRlL2ZyZWUgYSBmcmFtZSAqLworc3RhdGljIHN0cnVjdCBmcmFtZSogZnJhbWVfbmV3KHVuc2lnbmVkIGludCBmcmFtZV9udW0sIHN0cnVjdCB2aWRlb19jYXJkICp2aWRlbyk7CitzdGF0aWMgdm9pZCBmcmFtZV9kZWxldGUoc3RydWN0IGZyYW1lICpmKTsKKworLyogcmVzZXQgZiBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFnYWluICovCitzdGF0aWMgdm9pZCBmcmFtZV9yZXNldChzdHJ1Y3QgZnJhbWUgKmYpOworCisvKiBzdHJ1Y3QgdmlkZW9fY2FyZCBjb250YWlucyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggb25lIGluc3RhbmNlCisgICBvZiB0aGUgZHYxMzk0IGRyaXZlcgorKi8KK2VudW0gbW9kZXMgeworCU1PREVfUkVDRUlWRSwKKwlNT0RFX1RSQU5TTUlUCit9OworCitzdHJ1Y3QgdmlkZW9fY2FyZCB7CisKKwkvKiBvaGNpIGNhcmQgdG8gd2hpY2ggdGhpcyBpbnN0YW5jZSBjb3JyZXNwb25kcyAqLworCXN0cnVjdCB0aV9vaGNpICpvaGNpOworCisJLyogT0hDSSBjYXJkIGlkOyB0aGUgbGluayBiZXR3ZWVuIHRoZSBWRlMgaW5vZGUgYW5kIGEgc3BlY2lmaWMgdmlkZW9fY2FyZAorCSAgIChlc3NlbnRpYWxseSB0aGUgZGV2aWNlIG1pbm9yIG51bWJlcikgKi8KKwlpbnQgaWQ7CisKKwkvKiBlbnRyeSBpbiBkdjEzOTRfY2FyZHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiBPSENJIGNhcmQgSVQgRE1BIGNvbnRleHQgbnVtYmVyLCAtMSBpZiBub3QgaW4gdXNlICovCisJaW50IG9oY2lfaXRfY3R4OworCXN0cnVjdCBvaGNpMTM5NF9pc29fdGFza2xldCBpdF90YXNrbGV0OworCisJLyogcmVnaXN0ZXIgb2Zmc2V0cyBmb3IgY3VycmVudCBJVCBETUEgY29udGV4dCwgMCBpZiBub3QgaW4gdXNlICovCisJdTMyIG9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sU2V0OworCXUzMiBvaGNpX0lzb1htaXRDb250ZXh0Q29udHJvbENsZWFyOworCXUzMiBvaGNpX0lzb1htaXRDb21tYW5kUHRyOworCisJLyogT0hDSSBjYXJkIElSIERNQSBjb250ZXh0IG51bWJlciwgLTEgaWYgbm90IGluIHVzZSAqLworCXN0cnVjdCBvaGNpMTM5NF9pc29fdGFza2xldCBpcl90YXNrbGV0OworCWludCBvaGNpX2lyX2N0eDsKKworCS8qIHJlZ2lzdGVyIG9mZnNldHMgZm9yIGN1cnJlbnQgSVIgRE1BIGNvbnRleHQsIDAgaWYgbm90IGluIHVzZSAqLworCXUzMiBvaGNpX0lzb1JjdkNvbnRleHRDb250cm9sU2V0OworCXUzMiBvaGNpX0lzb1JjdkNvbnRleHRDb250cm9sQ2xlYXI7CisJdTMyIG9oY2lfSXNvUmN2Q29tbWFuZFB0cjsKKwl1MzIgb2hjaV9Jc29SY3ZDb250ZXh0TWF0Y2g7CisKKworCS8qIENPTkNVUlJFTkNZIENPTlRST0wgKi8KKworCS8qIHRoZXJlIGFyZSBUSFJFRSBsZXZlbHMgb2YgbG9ja2luZyBhc3NvY2lhdGVkIHdpdGggdmlkZW9fY2FyZC4gKi8KKworCS8qCisJICAgMSkgdGhlICdvcGVuJyBmbGFnIC0gdGhpcyBwcmV2ZW50cyBtb3JlIHRoYW4gb25lIHByb2Nlc3MgZnJvbQorCSAgIG9wZW5pbmcgdGhlIGRldmljZS4gKHRoZSBkcml2ZXIgY3VycmVudGx5IGFzc3VtZXMgb25seSBvbmUgb3BlbmVyKS4KKwkgICBUaGlzIGlzIGEgcmVndWxhciBpbnQsIGJ1dCB1c2UgdGVzdF9hbmRfc2V0X2JpdCgpIChvbiBiaXQgemVybykgCisJICAgZm9yIGF0b21pY2l0eS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIG9wZW47CisKKwkvKgorCSAgIDIpIHRoZSBzcGlubG9jayAtIHRoaXMgcHJvdmlkZXMgbXV0dWFsIGV4Y2x1c2lvbiBiZXR3ZWVuIHRoZSBpbnRlcnJ1cHQKKwkgICBoYW5kbGVyIGFuZCBwcm9jZXNzLWNvbnRleHQgb3BlcmF0aW9ucy4gR2VuZXJhbGx5IHlvdSBtdXN0IHRha2UgdGhlCisJICAgc3BpbmxvY2sgdW5kZXIgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCSAgICAgMSkgRE1BIChhbmQgaGVuY2UgdGhlIGludGVycnVwdCBoYW5kbGVyKSBtYXkgYmUgcnVubmluZworCSAgICAgQU5ECisJICAgICAyKSB5b3UgbmVlZCB0byBvcGVyYXRlIG9uIHRoZSB2aWRlb19jYXJkLCBlc3BlY2lhbGx5IGFjdGl2ZV9mcmFtZQorCisJICAgICBJdCBpcyBPSyB0byBwbGF5IHdpdGggdmlkZW9fY2FyZCB3aXRob3V0IHRha2luZyB0aGUgc3BpbmxvY2sgaWYKKwkgICAgIHlvdSBhcmUgY2VydGFpbiB0aGF0IERNQSBpcyBub3QgcnVubmluZy4gRXZlbiBpZiBETUEgaXMgcnVubmluZywKKwkgICAgIGl0IGlzIE9LIHRvICpyZWFkKiBhY3RpdmVfZnJhbWUgd2l0aCB0aGUgbG9jaywgdGhlbiBkcm9wIGl0CisJICAgICBpbW1lZGlhdGVseS4gVGhpcyBpcyBzYWZlIGJlY2F1c2UgdGhlIGludGVycnVwdCBoYW5kbGVyIHdpbGwgbmV2ZXIKKwkgICAgIGFkdmFuY2UgYWN0aXZlX2ZyYW1lIG9udG8gYSBmcmFtZSB0aGF0IGlzIG5vdCBSRUFEWSAoYW5kIHRoZSBzcGlubG9jaworCSAgICAgbXVzdCBiZSBoZWxkIHdoaWxlIG1hcmtpbmcgYSBmcmFtZSBSRUFEWSkuCisKKwkgICAgIHNwaW5sb2NrIGlzIGFsc28gdXNlZCB0byBwcm90ZWN0IG9oY2lfaXRfY3R4IGFuZCBvaGNpX2lyX2N0eCwKKwkgICAgIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIGJvdGggcHJvY2VzcyBhbmQgaW50ZXJydXB0IGNvbnRleHQKKwkgKi8KKwlzcGlubG9ja190IHNwaW5sb2NrOworCisJLyogZmxhZyB0byBwcmV2ZW50IHNwdXJpb3VzIGludGVycnVwdHMgKHdoaWNoIE9IQ0kgc2VlbXMgdG8KKwkgICBnZW5lcmF0ZSBhIGxvdCA6KSBmcm9tIGFjY2Vzc2luZyB0aGUgc3RydWN0ICovCisJaW50IGRtYV9ydW5uaW5nOworCisJLyoKKwkgIDMpIHRoZSBzbGVlcGluZyBzZW1hcGhvcmUgJ3NlbScgLSB0aGlzIGlzIHVzZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgb25seSwKKwkgIHRvIHNlcmlhbGl6ZSB2YXJpb3VzIG9wZXJhdGlvbnMgb24gdGhlIHZpZGVvX2NhcmQuIEV2ZW4gdGhvdWdoIG9ubHkgb25lCisJICBvcGVuKCkgaXMgYWxsb3dlZCwgd2Ugc3RpbGwgbmVlZCB0byBwcmV2ZW50IG11bHRpcGxlIHRocmVhZHMgb2YgZXhlY3V0aW9uCisJICBmcm9tIGVudGVyaW5nIGNhbGxzIGxpa2UgcmVhZCwgd3JpdGUsIGlvY3RsLCBldGMuCisKKwkgIEkgaG9uZXN0bHkgY2FuJ3QgdGhpbmsgb2YgYSBnb29kIHJlYXNvbiB0byB1c2UgZHYxMzk0IGZyb20gc2V2ZXJhbCB0aHJlYWRzCisJICBhdCBvbmNlLCBidXQgd2UgbmVlZCB0byBzZXJpYWxpemUgYW55d2F5IHRvIHByZXZlbnQgb29wc2VzID0pLgorCisJICBOT1RFOiBpZiB5b3UgbmVlZCBib3RoIHNwaW5sb2NrIGFuZCBzZW0sIHRha2Ugc2VtIGZpcnN0IHRvIGF2b2lkIGRlYWRsb2NrIQorCSAqLworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCisJLyogcGVvcGxlIHdhaXRpbmcgZm9yIGJ1ZmZlciBzcGFjZSwgcGxlYXNlIGZvcm0gYSBsaW5lIGhlcmUuLi4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKworCS8qIHN1cHBvcnQgYXN5bmNocm9ub3VzIEkvTyBzaWduYWxzIChTSUdJTykgKi8KKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZmFzeW5jOworCisJLyogdGhlIGxhcmdlLCBub24tY29udGlndW91cyAocnZtYWxsb2MoKSkgcmluZ2J1ZmZlciBmb3IgRFYKKyAgICAgICAgICAgZGF0YSwgZXhwb3NlZCB0byB1c2VyLXNwYWNlIHZpYSBtbWFwKCkgKi8KKwl1bnNpZ25lZCBsb25nICAgICAgZHZfYnVmX3NpemU7CisJc3RydWN0IGRtYV9yZWdpb24gIGR2X2J1ZjsKKworCS8qIG5leHQgYnl0ZSBpbiB0aGUgcmluZ2J1ZmZlciB0aGF0IGEgd3JpdGUoKSBjYWxsIHdpbGwgZmlsbCAqLworCXNpemVfdCB3cml0ZV9vZmY7CisKKwlzdHJ1Y3QgZnJhbWUgKmZyYW1lc1tEVjEzOTRfTUFYX0ZSQU1FU107CisKKwkvKiBuX2ZyYW1lcyBhbHNvIHNlcnZlcyBhcyBhbiBpbmRpY2F0b3IgdGhhdCB0aGlzIHN0cnVjdCB2aWRlb19jYXJkIGlzCisJICAgaW5pdGlhbGl6ZWQgYW5kIHJlYWR5IHRvIHJ1biBETUEgYnVmZmVycyAqLworCisJaW50IG5fZnJhbWVzOworCisJLyogdGhpcyBpcyB0aGUgZnJhbWUgdGhhdCBpcyBjdXJyZW50bHkgIm93bmVkIiBieSB0aGUgT0hDSSBETUEgY29udHJvbGxlcgorCSAgIChzZXQgdG8gLTEgaWZmIERNQSBpcyBub3QgcnVubmluZykKKworCSAgICEgbXVzdCBsb2NrIGFnYWluc3QgdGhlIGludGVycnVwdCBoYW5kbGVyIHdoZW4gYWNjZXNzaW5nIGl0ICEKKworCSAgIFJVTEVTOgorCisJICAgICAgIE9ubHkgdGhlIGludGVycnVwdCBoYW5kbGVyIG1heSBjaGFuZ2UgYWN0aXZlX2ZyYW1lIGlmIERNQQorCSAgICAgICAgICBpcyBydW5uaW5nOyBpZiBub3QsIHByb2Nlc3MgbWF5IGNoYW5nZSBpdAorCisJICAgICAgIElmIHRoZSBuZXh0IGZyYW1lIGlzIFJFQURZLCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBhZHZhbmNlCisJICAgICAgIGFjdGl2ZV9mcmFtZSB3aGVuIHRoZSBjdXJyZW50IGZyYW1lIGlzIGZpbmlzaGVkLgorCisJICAgICAgIElmIHRoZSBuZXh0IGZyYW1lIGlzIENMRUFSLCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCByZS10cmFuc21pdAorCSAgICAgICB0aGUgY3VycmVudCBmcmFtZSwgYW5kIHRoZSBkcm9wcGVkX2ZyYW1lcyBjb3VudGVyIHdpbGwgYmUgIGluY3JlbWVudGVkLgorCisJICAgICAgIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIE5FVkVSIGFkdmFuY2UgYWN0aXZlX2ZyYW1lIHRvIGEKKwkgICAgICAgZnJhbWUgdGhhdCBpcyBub3QgUkVBRFkuCisJKi8KKwlpbnQgYWN0aXZlX2ZyYW1lOworCWludCBmaXJzdF9ydW47CisKKwkvKiB0aGUgc2FtZSBsb2NraW5nIHJ1bGVzIGFwcGx5IHRvIHRoZXNlIHRocmVlIGZpZWxkcyBhbHNvOiAqLworCisJLyogYWx0ZXJlZCBPTkxZIGZyb20gcHJvY2VzcyBjb250ZXh0LiBNdXN0IGNoZWNrIGZpcnN0X2NsZWFyX2ZyYW1lLT5zdGF0ZTsKKwkgICBpZiBpdCdzIFJFQURZLCB0aGF0IG1lYW5zIHRoZSByaW5nYnVmZmVyIGlzIGZ1bGwgd2l0aCBSRUFEWSBmcmFtZXM7CisJICAgaWYgaXQncyBDTEVBUiwgdGhhdCBtZWFucyBvbmUgb3IgbW9yZSByaW5nYnVmZmVyIGZyYW1lcyBhcmUgQ0xFQVIgKi8KKwl1bnNpZ25lZCBpbnQgZmlyc3RfY2xlYXJfZnJhbWU7CisKKwkvKiBhbHRlcmVkIGJvdGggYnkgcHJvY2VzcyBhbmQgaW50ZXJydXB0ICovCisJdW5zaWduZWQgaW50IG5fY2xlYXJfZnJhbWVzOworCisJLyogb25seSBhbHRlcmVkIGJ5IHRoZSBpbnRlcnJ1cHQgKi8KKwl1bnNpZ25lZCBpbnQgZHJvcHBlZF9mcmFtZXM7CisKKworCisJLyogdGhlIENJUCBhY2N1bXVsYXRvciBhbmQgY29udGludWl0eSBjb3VudGVyIGFyZSBwcm9wZXJ0aWVzCisJICAgb2YgdGhlIERNQSBzdHJlYW0gYXMgYSB3aG9sZSAobm90IGEgc2luZ2xlIGZyYW1lKSwgc28gdGhleQorCSAgIGFyZSBzdG9yZWQgaGVyZSBpbiB0aGUgdmlkZW9fY2FyZCAqLworCisJdW5zaWduZWQgbG9uZyBjaXBfYWNjdW07CisJdW5zaWduZWQgbG9uZyBjaXBfbiwgY2lwX2Q7CisJdW5zaWduZWQgaW50IHN5dF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGNvbnRpbnVpdHlfY291bnRlcjsKKworCWVudW0gcGFsX29yX250c2MgcGFsX29yX250c2M7CisKKwkvKiByZWR1bmRhbnQsIGJ1dCBzaW1wbGlmaWVzIHRoZSBjb2RlIHNvbWV3aGF0ICovCisJdW5zaWduZWQgaW50IGZyYW1lX3NpemU7IC8qIGluIGJ5dGVzICovCisKKwkvKiB0aGUgaXNvY2hyb25vdXMgY2hhbm5lbCB0byB1c2UsIC0xIGlmIHZpZGVvIGNhcmQgaXMgaW5hY3RpdmUgKi8KKwlpbnQgY2hhbm5lbDsKKworCisJLyogcGh5c2ljYWxseSBjb250aWd1b3VzIHBhY2tldCByaW5nYnVmZmVyIGZvciByZWNlaXZlICovCisJc3RydWN0IGRtYV9yZWdpb24gcGFja2V0X2J1ZjsKKwl1bnNpZ25lZCBsb25nICBwYWNrZXRfYnVmX3NpemU7CisKKwl1bnNpZ25lZCBpbnQgY3VycmVudF9wYWNrZXQ7CisJaW50IGZpcnN0X2ZyYW1lOyAJLyogcmVjZWl2ZWQgZmlyc3Qgc3RhcnQgZnJhbWUgbWFya2VyPyAqLworCWVudW0gbW9kZXMgbW9kZTsKK307CisKKy8qCisgICBpZiB0aGUgdmlkZW9fY2FyZCBpcyBub3QgaW5pdGlhbGl6ZWQsIHRoZW4gdGhlIE9OTFkgZmllbGRzIHRoYXQgYXJlIHZhbGlkIGFyZToKKyAgIG9oY2kKKyAgIG9wZW4KKyAgIG5fZnJhbWVzCisqLworCitzdGF0aWMgaW5saW5lIGludCB2aWRlb19jYXJkX2luaXRpYWxpemVkKHN0cnVjdCB2aWRlb19jYXJkICp2KQoreworCXJldHVybiB2LT5uX2ZyYW1lcyA+IDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fZHYxMzk0X2luaXQoc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvLCBzdHJ1Y3QgZHYxMzk0X2luaXQgKmluaXQpOworc3RhdGljIGludCBkb19kdjEzOTRfaW5pdF9kZWZhdWx0KHN0cnVjdCB2aWRlb19jYXJkICp2aWRlbyk7CitzdGF0aWMgdm9pZCBkb19kdjEzOTRfc2h1dGRvd24oc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvLCBpbnQgZnJlZV91c2VyX2J1Zik7CisKKworLyogTlRTQyBlbXB0eSBwYWNrZXQgcmF0ZSBhY2N1cmF0ZSB0byB3aXRoaW4gMC4wMSUsCisgICBjYWxpYnJhdGVkIGFnYWluc3QgYSBTb255IERTUi00MCBEVkNBTSBkZWNrICovCisKKyNkZWZpbmUgQ0lQX05fTlRTQyAgIDY4MDAwMDAwCisjZGVmaW5lIENJUF9EX05UU0MgMTA2ODAwMDAwMAorCisjZGVmaW5lIENJUF9OX1BBTCAgMQorI2RlZmluZSBDSVBfRF9QQUwgMTYKKworI2VuZGlmIC8qIF9EVl8xMzk0X1BSSVZBVEVfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGM3YTVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYwpAQCAtMCwwICsxLDI2NjMgQEAKKy8qCisgKiBkdjEzOTQuYyAtIERWIGlucHV0L291dHB1dCBvdmVyIElFRUUgMTM5NCBvbiBPSENJIGNoaXBzCisgKiAgIENvcHlyaWdodCAoQykyMDAxIERhbmllbCBNYWFzIDxkbWFhc0BkY2luZS5jb20+CisgKiAgICAgcmVjZWl2ZSBieSBEYW4gRGVubmVkeSA8ZGFuQGRlbm5lZHkub3JnPgorICoKKyAqIGJhc2VkIG9uOgorICogIHZpZGVvMTM5NC5jIC0gdmlkZW8gZHJpdmVyIGZvciBPSENJIDEzOTQgYm9hcmRzCisgKiAgQ29weXJpZ2h0IChDKTE5OTksMjAwMCBTZWJhc3RpZW4gUm91Z2VhdXggPHNlYmFzdGllbi5yb3VnZWF1eEBhbnUuZWR1LmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyoKKyAgT1ZFUlZJRVcKKworICBJIGRlc2lnbmVkIGR2MTM5NCBhcyBhICJwaXBlIiB0aGF0IHlvdSBjYW4gdXNlIHRvIHNob290IERWIG9udG8gYQorICBGaXJlV2lyZSBidXMuIEluIHRyYW5zbWlzc2lvbiBtb2RlLCBkdjEzOTQgZG9lcyB0aGUgZm9sbG93aW5nOgorCisgICAxLiBhY2NlcHRzIGNvbnRpZ3VvdXMgZnJhbWVzIG9mIERWIGRhdGEgZnJvbSB1c2VyLXNwYWNlLCB2aWEgd3JpdGUoKQorICAgICAgb3IgbW1hcCgpIChzZWUgZHYxMzk0LmggZm9yIHRoZSBjb21wbGV0ZSBBUEkpCisgICAyLiB3cmFwcyBJRUMgNjE4ODMgcGFja2V0cyBhcm91bmQgdGhlIERWIGRhdGEsIGluc2VydGluZworICAgICAgZW1wdHkgc3luY2hyb25pemF0aW9uIHBhY2tldHMgYXMgbmVjZXNzYXJ5CisgICAzLiBhc3NpZ25zIGFjY3VyYXRlIFNZVCB0aW1lc3RhbXBzIHRvIHRoZSBvdXRnb2luZyBwYWNrZXRzCisgICA0LiBzaG9vdHMgdGhlbSBvdXQgdXNpbmcgdGhlIE9IQ0kgY2FyZCdzIElUIERNQSBlbmdpbmUKKworICAgVGhhbmtzIHRvIERhbiBEZW5uZWR5LCB3ZSBub3cgaGF2ZSBhIHJlY2VpdmUgbW9kZSB0aGF0IGRvZXMgdGhlIGZvbGxvd2luZzoKKworICAgMS4gYWNjZXB0cyByYXcgSUVDIDYxODgzIHBhY2tldHMgZnJvbSB0aGUgT0hDSSBjYXJkCisgICAyLiByZS1hc3NlbWJsZXMgdGhlIERWIGRhdGEgcGF5bG9hZHMgaW50byBjb250aWd1b3VzIGZyYW1lcywKKyAgICAgIGRpc2NhcmRpbmcgZW1wdHkgcGFja2V0cworICAgMy4gc2VuZHMgdGhlIERWIGRhdGEgdG8gdXNlci1zcGFjZSB2aWEgcmVhZCgpIG9yIG1tYXAoKQorKi8KKworLyoKKyAgVE9ETzoKKworICAtIHR1bmFibGUgZnJhbWUtZHJvcCBiZWhhdmlvcjogZWl0aGVyIGxvb3AgbGFzdCBmcmFtZSwgb3IgaGFsdCB0cmFuc21pc3Npb24KKworICAtIHVzZSBhIHNjYXR0ZXIvZ2F0aGVyIGJ1ZmZlciBmb3IgRE1BIHByb2dyYW1zIChmLT5kZXNjcmlwdG9yX3Bvb2wpCisgICAgc28gdGhhdCB3ZSBkb24ndCByZWx5IG9uIGFsbG9jYXRpbmcgNjRLQiBvZiBjb250aWd1b3VzIGtlcm5lbCBtZW1vcnkKKyAgICB2aWEgcGNpX2FsbG9jX2NvbnNpc3RlbnQoKQorCisgIERPTkU6CisgIC0gZHVyaW5nIHJlY2VwdGlvbiwgYmV0dGVyIGhhbmRsaW5nIG9mIGRyb3BwZWQgZnJhbWVzIGFuZCBjb250aW51aXR5IGVycm9ycworICAtIGR1cmluZyByZWNlcHRpb24sIHByZXZlbnQgRE1BIGZyb20gYnlwYXNzaW5nIHRoZSBpcnEgdGFza2xldHMKKyAgLSByZWR1Y2UgaXJxIHJhdGUgZHVyaW5nIHJlY2VwdGlvbiAoMS8yNTAgcGFja2V0cykuCisgIC0gYWRkIG1hbnkgbW9yZSBpbnRlcm5hbCBidWZmZXJzIGR1cmluZyByZWNlcHRpb24gd2l0aCBzY2F0dGVyL2dhdGhlciBkbWEuCisgIC0gYWRkIGRiYyAoY29udGludWl0eSkgY2hlY2tpbmcgb24gcmVjZWl2ZSwgaW5jcmVtZW50IHN0YXR1cy5kcm9wcGVkX2ZyYW1lcworICAgIGlmIG5vdCBjb250aW51b3VzLgorICAtIHJlc3RhcnQgSVQgRE1BIGFmdGVyIGEgYnVzIHJlc2V0CisgIC0gc2FmZWx5IG9idGFpbiBhbmQgcmVsZWFzZSBJU08gVHggY2hhbm5lbHMgaW4gY29vcGVyYXRpb24gd2l0aCBPSENJIGRyaXZlcgorICAtIG1hcCByZWNlaXZlZCBESUYgYmxvY2tzIHRvIHRoZWlyIHByb3BlciBsb2NhdGlvbiBpbiBEViBmcmFtZSAoZW5zdXJlCisgICAgcmVjb3ZlcnkgaWYgZHJvcHBlZCBwYWNrZXQpCisgIC0gaGFuZGxlIGJ1cyByZXNldHMgZ3JhY2VmdWxseSAoT0hDSSBjYXJkIHNlZW1zIHRvIHRha2UgY2FyZSBvZiB0aGlzIGl0c2VsZighKSkKKyAgLSBkbyBub3QgYWxsb3cgcmVzaXppbmcgdGhlIHVzZXJfYnVmIG9uY2UgYWxsb2NhdGVkOyBlbGltaW5hdGUgbnVrZV9idWZmZXJfbWFwcGluZ3MKKyAgLSBlbGltaW5hdGVkICNpZmRlZiBEVjEzOTRfREVCVUdfTEVWRUwgYnkgaW52ZW50aW5nIG1hY3JvcyBkZWJ1Z19wcmludGsgYW5kIGlycV9wcmludGsKKyAgLSBhZGRlZCB3bWIoKSBhbmQgbWIoKSB0byBwbGFjZXMgd2hlcmUgUENJIHJlYWQvd3JpdGUgb3JkZXJpbmcgbmVlZHMgdG8gYmUgZW5mb3JjZWQKKyAgLSBzZXQgdmlkZW8tPmlkIGNvcnJlY3RseQorICAtIHN0b3JlIHZpZGVvX2NhcmRzIGluIGFuIGFycmF5IGluZGV4ZWQgYnkgT0hDSSBjYXJkIElELCByYXRoZXIgdGhhbiBhIGxpc3QKKyAgLSBpbXBsZW1lbnQgRE1BIGNvbnRleHQgYWxsb2NhdGlvbiB0byBjb29wZXJhdGUgd2l0aCBvdGhlciB1c2VycyBvZiB0aGUgT0hDSQorICAtIGZpeCBhbGwgWFhYIHNob3dzdG9wcGVycworICAtIGRpc2FibGUgSVIvSVQgRE1BIGludGVycnVwdHMgb24gc2h1dGRvd24KKyAgLSBmbHVzaCBwY2kgd3JpdGVzIHRvIHRoZSBjYXJkIGJ5IGlzc3VpbmcgYSByZWFkCisgIC0gZGV2ZnMgYW5kIGNoYXJhY3RlciBkZXZpY2UgZGlzcGF0Y2hpbmcgKCogbmVlZHMgdGVzdGluZyB3aXRoIExpbnV4IDIuMi54KQorICAtIHN3aXRjaCBvdmVyIHRvIHRoZSBuZXcga2VybmVsIERNQSBBUEkgKHBjaV9tYXBfKigpKSAoKiBuZWVkcyB0ZXN0aW5nIG9uIHBsYXRmb3JtcyB3aXRoIElPTU1VISkKKyAgLSBrZWVwIGFsbCB2aWRlb19jYXJkcyBpbiBhIGxpc3QgKGZvciBvcGVuKCkgdmlhIGNoYXJkZXYpLCBzZXQgZmlsZS0+cHJpdmF0ZV9kYXRhID0gdmlkZW8KKyAgLSBkdjEzOTRfcG9sbCBzaG91bGQgaW5kaWNhdGUgUE9MTElOIHdoZW4gcmVjZWl2aW5nIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZQorICAtIGFkZCBwcm9jIGZzIGludGVyZmFjZSB0byBzZXQgY2lwX24sIGNpcF9kLCBzeXRfb2Zmc2V0LCBhbmQgdmlkZW8gc2lnbmFsCisgIC0gZXhwb3NlIHhtaXQgYW5kIHJlY3YgYXMgc2VwYXJhdGUgZGV2aWNlcyAobm90IGV4Y2x1c2l2ZSkKKyAgLSBleHBvc2UgTlRTQyBhbmQgUEFMIGFzIHNlcGFyYXRlIGRldmljZXMgKGNhbiBiZSBvdmVycmlkZGVuKQorCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorCisjaW5jbHVkZSAiaWVlZTEzOTQuaCIKKyNpbmNsdWRlICJpZWVlMTM5NF90eXBlcy5oIgorI2luY2x1ZGUgIm5vZGVtZ3IuaCIKKyNpbmNsdWRlICJob3N0cy5oIgorI2luY2x1ZGUgImllZWUxMzk0X2NvcmUuaCIKKyNpbmNsdWRlICJoaWdobGV2ZWwuaCIKKyNpbmNsdWRlICJkdjEzOTQuaCIKKyNpbmNsdWRlICJkdjEzOTQtcHJpdmF0ZS5oIgorCisjaW5jbHVkZSAib2hjaTEzOTQuaCIKKworI2lmbmRlZiB2aXJ0X3RvX3BhZ2UKKyNkZWZpbmUgdmlydF90b19wYWdlKHgpIE1BUF9OUih4KQorI2VuZGlmCisKKyNpZm5kZWYgdm1hbGxvY18zMgorI2RlZmluZSB2bWFsbG9jXzMyKHgpIHZtYWxsb2MoeCkKKyNlbmRpZgorCisKKy8qIERFQlVHIExFVkVMUzoKKyAgIDAgLSBubyBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyAgIDEgLSBzb21lIGRlYnVnZ2luZyBtZXNzYWdlcywgYnV0IG5vbmUgZHVyaW5nIERNQSBmcmFtZSB0cmFuc21pc3Npb24KKyAgIDIgLSBsb3RzIG9mIG1lc3NhZ2VzLCBpbmNsdWRpbmcgZHVyaW5nIERNQSBmcmFtZSB0cmFuc21pc3Npb24KKyAgICAgICAod2lsbCBjYXVzZSB1bmRlZmxvd3MgaWYgeW91ciBtYWNoaW5lIGlzIHRvbyBzbG93ISkKKyovCisKKyNkZWZpbmUgRFYxMzk0X0RFQlVHX0xFVkVMIDAKKworLyogZm9yIGRlYnVnZ2luZyB1c2UgT05MWTogYWxsb3cgbW9yZSB0aGFuIG9uZSBvcGVuKCkgb2YgdGhlIGRldmljZSAqLworLyogI2RlZmluZSBEVjEzOTRfQUxMT1dfTU9SRV9USEFOX09ORV9PUEVOIDEgKi8KKworI2lmIERWMTM5NF9ERUJVR19MRVZFTCA+PSAyCisjZGVmaW5lIGlycV9wcmludGsoIGFyZ3MuLi4gKSBwcmludGsoIGFyZ3MgKQorI2Vsc2UKKyNkZWZpbmUgaXJxX3ByaW50ayggYXJncy4uLiApCisjZW5kaWYKKworI2lmIERWMTM5NF9ERUJVR19MRVZFTCA+PSAxCisjZGVmaW5lIGRlYnVnX3ByaW50ayggYXJncy4uLiApIHByaW50ayggYXJncykKKyNlbHNlCisjZGVmaW5lIGRlYnVnX3ByaW50ayggYXJncy4uLiApCisjZW5kaWYKKworLyogaXNzdWUgYSBkdW1teSBQQ0kgcmVhZCB0byBmb3JjZSB0aGUgcHJlY2VkaW5nIHdyaXRlCisgICB0byBiZSBwb3N0ZWQgdG8gdGhlIFBDSSBidXMgaW1tZWRpYXRlbHkgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3BjaV93cml0ZShzdHJ1Y3QgdGlfb2hjaSAqb2hjaSkKK3sKKwltYigpOworCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb2Nocm9ub3VzQ3ljbGVUaW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGl0X3Rhc2tsZXRfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgaXJfdGFza2xldF9mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBkdjEzOTRfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNlbmRpZgorCisvKiBHTE9CQUwgREFUQSAqLworCisvKiBsaXN0IG9mIGFsbCB2aWRlb19jYXJkcyAqLworc3RhdGljIExJU1RfSEVBRChkdjEzOTRfY2FyZHMpOworc3RhdGljIERFRklORV9TUElOTE9DSyhkdjEzOTRfY2FyZHNfbG9jayk7CisKKy8qIHRyYW5zbGF0ZSBmcm9tIGEgc3RydWN0IGZpbGUqIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0cnVjdCB2aWRlb19jYXJkKiAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2aWRlb19jYXJkKiBmaWxlX3RvX3ZpZGVvX2NhcmQoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIChzdHJ1Y3QgdmlkZW9fY2FyZCopIGZpbGUtPnByaXZhdGVfZGF0YTsKK30KKworLyoqKiBGUkFNRSBNRVRIT0RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZnJhbWVfcmVzZXQoc3RydWN0IGZyYW1lICpmKQoreworCWYtPnN0YXRlID0gRlJBTUVfQ0xFQVI7CisJZi0+ZG9uZSA9IDA7CisJZi0+bl9wYWNrZXRzID0gMDsKKwlmLT5mcmFtZV9iZWdpbl90aW1lc3RhbXAgPSBOVUxMOworCWYtPmFzc2lnbmVkX3RpbWVzdGFtcCA9IDA7CisJZi0+Y2lwX3N5dDEgPSBOVUxMOworCWYtPmNpcF9zeXQyID0gTlVMTDsKKwlmLT5taWRfZnJhbWVfdGltZXN0YW1wID0gTlVMTDsKKwlmLT5mcmFtZV9lbmRfdGltZXN0YW1wID0gTlVMTDsKKwlmLT5mcmFtZV9lbmRfYnJhbmNoID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBmcmFtZSogZnJhbWVfbmV3KHVuc2lnbmVkIGludCBmcmFtZV9udW0sIHN0cnVjdCB2aWRlb19jYXJkICp2aWRlbykKK3sKKwlzdHJ1Y3QgZnJhbWUgKmYgPSBrbWFsbG9jKHNpemVvZigqZiksIEdGUF9LRVJORUwpOworCWlmICghZikKKwkJcmV0dXJuIE5VTEw7CisKKwlmLT52aWRlbyA9IHZpZGVvOworCWYtPmZyYW1lX251bSA9IGZyYW1lX251bTsKKworCWYtPmhlYWRlcl9wb29sID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZi0+dmlkZW8tPm9oY2ktPmRldiwgUEFHRV9TSVpFLCAmZi0+aGVhZGVyX3Bvb2xfZG1hKTsKKwlpZiAoIWYtPmhlYWRlcl9wb29sKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHYxMzk0OiBmYWlsZWQgdG8gYWxsb2NhdGUgQ0lQIGhlYWRlciBwb29sXG4iKTsKKwkJa2ZyZWUoZik7CisJCXJldHVybiBOVUxMOworCX0KKworCWRlYnVnX3ByaW50aygiZHYxMzk0OiBmcmFtZV9uZXc6IGFsbG9jYXRlZCBDSVAgaGVhZGVyIHBvb2wgYXQgdmlydCAweCUwOGx4IChjb250aWcpIGRtYSAweCUwOGx4IHNpemUgJWxkXG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBmLT5oZWFkZXJfcG9vbCwgKHVuc2lnbmVkIGxvbmcpIGYtPmhlYWRlcl9wb29sX2RtYSwgUEFHRV9TSVpFKTsKKworCWYtPmRlc2NyaXB0b3JfcG9vbF9zaXplID0gTUFYX1BBQ0tFVFMgKiBzaXplb2Yoc3RydWN0IERNQV9kZXNjcmlwdG9yX2Jsb2NrKTsKKwkvKiBtYWtlIGl0IGFuIGV2ZW4gIyBvZiBwYWdlcyAqLworCWYtPmRlc2NyaXB0b3JfcG9vbF9zaXplICs9IFBBR0VfU0laRSAtIChmLT5kZXNjcmlwdG9yX3Bvb2xfc2l6ZSVQQUdFX1NJWkUpOworCisJZi0+ZGVzY3JpcHRvcl9wb29sID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZi0+dmlkZW8tPm9oY2ktPmRldiwKKwkJCQkJCSAgZi0+ZGVzY3JpcHRvcl9wb29sX3NpemUsCisJCQkJCQkgICZmLT5kZXNjcmlwdG9yX3Bvb2xfZG1hKTsKKwlpZiAoIWYtPmRlc2NyaXB0b3JfcG9vbCkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGYtPnZpZGVvLT5vaGNpLT5kZXYsIFBBR0VfU0laRSwgZi0+aGVhZGVyX3Bvb2wsIGYtPmhlYWRlcl9wb29sX2RtYSk7CisJCWtmcmVlKGYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkZWJ1Z19wcmludGsoImR2MTM5NDogZnJhbWVfbmV3OiBhbGxvY2F0ZWQgRE1BIHByb2dyYW0gbWVtb3J5IGF0IHZpcnQgMHglMDhseCAoY29udGlnKSBkbWEgMHglMDhseCBzaXplICVsZFxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZykgZi0+ZGVzY3JpcHRvcl9wb29sLCAodW5zaWduZWQgbG9uZykgZi0+ZGVzY3JpcHRvcl9wb29sX2RtYSwgZi0+ZGVzY3JpcHRvcl9wb29sX3NpemUpOworCisJZi0+ZGF0YSA9IDA7CisJZnJhbWVfcmVzZXQoZik7CisKKwlyZXR1cm4gZjsKK30KKworc3RhdGljIHZvaWQgZnJhbWVfZGVsZXRlKHN0cnVjdCBmcmFtZSAqZikKK3sKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGYtPnZpZGVvLT5vaGNpLT5kZXYsIFBBR0VfU0laRSwgZi0+aGVhZGVyX3Bvb2wsIGYtPmhlYWRlcl9wb29sX2RtYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChmLT52aWRlby0+b2hjaS0+ZGV2LCBmLT5kZXNjcmlwdG9yX3Bvb2xfc2l6ZSwgZi0+ZGVzY3JpcHRvcl9wb29sLCBmLT5kZXNjcmlwdG9yX3Bvb2xfZG1hKTsKKwlrZnJlZShmKTsKK30KKworCisKKworLyoKKyAgIGZyYW1lX3ByZXBhcmUoKSAtIGJ1aWxkIHRoZSBETUEgcHJvZ3JhbSBmb3IgdHJhbnNtaXR0aW5nCisKKyAgIEZyYW1lX3ByZXBhcmUoKSBtdXN0IGJlIGNhbGxlZCBPVVRTSURFIHRoZSB2aWRlby0+c3BpbmxvY2suCisgICBIb3dldmVyLCBmcmFtZV9wcmVwYXJlKCkgbXVzdCBzdGlsbCBiZSBzZXJpYWxpemVkLCBzbworICAgaXQgc2hvdWxkIGJlIGNhbGxlZCBXSVRIIHRoZSB2aWRlby0+c2VtIHRha2VuLgorICovCisKK3N0YXRpYyB2b2lkIGZyYW1lX3ByZXBhcmUoc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvLCB1bnNpZ25lZCBpbnQgdGhpc19mcmFtZSkKK3sKKwlzdHJ1Y3QgZnJhbWUgKmYgPSB2aWRlby0+ZnJhbWVzW3RoaXNfZnJhbWVdOworCWludCBsYXN0X2ZyYW1lOworCisJc3RydWN0IERNQV9kZXNjcmlwdG9yX2Jsb2NrICpibG9jazsKKwlkbWFfYWRkcl90IGJsb2NrX2RtYTsKKwlzdHJ1Y3QgQ0lQX2hlYWRlciAqY2lwOworCWRtYV9hZGRyX3QgY2lwX2RtYTsKKworCXVuc2lnbmVkIGludCBuX2Rlc2NyaXB0b3JzLCBmdWxsX3BhY2tldHMsIHBhY2tldHNfcGVyX2ZyYW1lLCBwYXlsb2FkX3NpemU7CisKKwkvKiB0aGVzZSBmbGFncyBkZW5vdGUgcGFja2V0cyB0aGF0IG5lZWQgc3BlY2lhbCBhdHRlbnRpb24gKi8KKwlpbnQgZW1wdHlfcGFja2V0LCBmaXJzdF9wYWNrZXQsIGxhc3RfcGFja2V0LCBtaWRfcGFja2V0OworCisJdTMyICpicmFuY2hfYWRkcmVzcywgKmxhc3RfYnJhbmNoX2FkZHJlc3MgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZGF0YV9wOworCWludCBmaXJzdF9wYWNrZXRfZW1wdHkgPSAwOworCXUzMiBjeWNsZVRpbWVyLCBjdF9zZWMsIGN0X2N5YywgY3Rfb2ZmOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJaXJxX3ByaW50aygiZnJhbWVfcHJlcGFyZSggJWQgKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsIHRoaXNfZnJhbWUpOworCisJZnVsbF9wYWNrZXRzID0gMDsKKworCisKKwlpZiAodmlkZW8tPnBhbF9vcl9udHNjID09IERWMTM5NF9QQUwpCisJCXBhY2tldHNfcGVyX2ZyYW1lID0gRFYxMzk0X1BBTF9QQUNLRVRTX1BFUl9GUkFNRTsKKwllbHNlCisJCXBhY2tldHNfcGVyX2ZyYW1lID0gRFYxMzk0X05UU0NfUEFDS0VUU19QRVJfRlJBTUU7CisKKwl3aGlsZSAoIGZ1bGxfcGFja2V0cyA8IHBhY2tldHNfcGVyX2ZyYW1lICkgeworCQllbXB0eV9wYWNrZXQgPSBmaXJzdF9wYWNrZXQgPSBsYXN0X3BhY2tldCA9IG1pZF9wYWNrZXQgPSAwOworCisJCWRhdGFfcCA9IGYtPmRhdGEgKyBmdWxsX3BhY2tldHMgKiA0ODA7CisKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJLyogYWxsb2NhdGUgYSBkZXNjcmlwdG9yIGJsb2NrIGFuZCBhIENJUCBoZWFkZXIgKi8KKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCQkvKiBub3RlOiB0aGVzZSBzaG91bGQgTk9UIGNyb3NzIGEgcGFnZSBib3VuZGFyeSAoRE1BIHJlc3RyaWN0aW9uKSAqLworCisJCWlmIChmLT5uX3BhY2tldHMgPj0gTUFYX1BBQ0tFVFMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZHYxMzk0OiBGQVRBTCBFUlJPUjogbWF4IHBhY2tldCBjb3VudCBleGNlZWRlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiB0aGUgYmxvY2sgc3VyZWx5IHdvbid0IGNyb3NzIGEgcGFnZSBib3VuZGFyeSwKKwkJICAgc2luY2UgYW4gZXZlbiBudW1iZXIgb2YgZGVzY3JpcHRvcl9ibG9ja3MgZml0IG9uIGEgcGFnZSAqLworCQlibG9jayA9ICYoZi0+ZGVzY3JpcHRvcl9wb29sW2YtPm5fcGFja2V0c10pOworCisJCS8qIERNQSBhZGRyZXNzIG9mIHRoZSBibG9jayA9IG9mZnNldCBvZiBibG9jayByZWxhdGl2ZQorCQkgICAgdG8gdGhlIGtlcm5lbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IgcG9vbAorCQkgICAgKyBETUEgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yIHBvb2wgKi8KKwkJYmxvY2tfZG1hID0gKCh1bnNpZ25lZCBsb25nKSBibG9jayAtICh1bnNpZ25lZCBsb25nKSBmLT5kZXNjcmlwdG9yX3Bvb2wpICsgZi0+ZGVzY3JpcHRvcl9wb29sX2RtYTsKKworCisJCS8qIHRoZSB3aG9sZSBDSVAgcG9vbCBmaXRzIG9uIG9uZSBwYWdlLCBzbyBubyB3b3JyaWVzIGFib3V0IGJvdW5kYXJpZXMgKi8KKwkJaWYgKCAoKHVuc2lnbmVkIGxvbmcpICYoZi0+aGVhZGVyX3Bvb2xbZi0+bl9wYWNrZXRzXSkgLSAodW5zaWduZWQgbG9uZykgZi0+aGVhZGVyX3Bvb2wpCisJCSAgICA+IFBBR0VfU0laRSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkdjEzOTQ6IEZBVEFMIEVSUk9SOiBubyByb29tIHRvIGFsbG9jYXRlIENJUCBoZWFkZXJcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJY2lwID0gJihmLT5oZWFkZXJfcG9vbFtmLT5uX3BhY2tldHNdKTsKKworCQkvKiBETUEgYWRkcmVzcyBvZiB0aGUgQ0lQIGhlYWRlciA9IG9mZnNldCBvZiBjaXAKKwkJICAgcmVsYXRpdmUgdG8ga2VybmVsIGJhc2UgYWRkcmVzcyBvZiB0aGUgaGVhZGVyIHBvb2wKKwkJICAgKyBETUEgYmFzZSBhZGRyZXNzIG9mIHRoZSBoZWFkZXIgcG9vbCAqLworCQljaXBfZG1hID0gKHVuc2lnbmVkIGxvbmcpIGNpcCAlIFBBR0VfU0laRSArIGYtPmhlYWRlcl9wb29sX2RtYTsKKworCQkvKiBpcyB0aGlzIGFuIGVtcHR5IHBhY2tldD8gKi8KKworCQlpZiAodmlkZW8tPmNpcF9hY2N1bSA+ICh2aWRlby0+Y2lwX2QgLSB2aWRlby0+Y2lwX24pKSB7CisJCQllbXB0eV9wYWNrZXQgPSAxOworCQkJcGF5bG9hZF9zaXplID0gODsKKwkJCXZpZGVvLT5jaXBfYWNjdW0gLT0gKHZpZGVvLT5jaXBfZCAtIHZpZGVvLT5jaXBfbik7CisJCX0gZWxzZSB7CisJCQlwYXlsb2FkX3NpemUgPSA0ODg7CisJCQl2aWRlby0+Y2lwX2FjY3VtICs9IHZpZGVvLT5jaXBfbjsKKwkJfQorCisJCS8qIHRoZXJlIGFyZSB0aHJlZSBpbXBvcnRhbnQgcGFja2V0cyBlYWNoIGZyYW1lOgorCisJCSAgIHRoZSBmaXJzdCBwYWNrZXQgaW4gdGhlIGZyYW1lIC0gd2UgYXNrIHRoZSBjYXJkIHRvIHJlY29yZCB0aGUgdGltZXN0YW1wIHdoZW4KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhY2tldCBpcyBhY3R1YWxseSBzZW50LCBzbyB3ZSBjYW4gbW9uaXRvcgorCQkJCQkJICAgaG93IGFjY3VyYXRlIG91ciB0aW1lc3RhbXBzIGFyZS4gQWxzbywgdGhlIGZpcnN0CisJCQkJCQkgICBwYWNrZXQgc2VydmVzIGFzIGEgc2VtYXBob3JlIHRvIGxldCB1cyBrbm93IHRoYXQKKwkJCQkJCSAgIGl0J3MgT0sgdG8gZnJlZSB0aGUgKnByZXZpb3VzKiBmcmFtZSdzIERNQSBidWZmZXIKKworCQkgICB0aGUgbGFzdCBwYWNrZXQgaW4gdGhlIGZyYW1lIC0gIHRoaXMgcGFja2V0IGlzIHVzZWQgdG8gZGV0ZWN0IGJ1ZmZlciB1bmRlcmZsb3dzLgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVhZHkgZnJhbWUsIHRoZSBsYXN0IERNQSBibG9jaworCQkJCQkJICAgd2lsbCBoYXZlIGEgYnJhbmNoIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUKKwkJCQkJCSAgIChzbyB0aGF0IHRoZSBjYXJkIHdpbGwgcmUtc2VuZCB0aGUgZnJhbWUgb24gdW5kZXJmbG93KS4KKwkJCQkJCSAgIGlmIHRoaXMgYnJhbmNoIGdldHMgdGFrZW4sIHdlIGtub3cgdGhhdCBhdCBsZWFzdCBvbmUKKwkJCQkJCSAgIGZyYW1lIGhhcyBiZWVuIGRyb3BwZWQuIFdoZW4gdGhlIG5leHQgZnJhbWUgaXMgcmVhZHksCisJCQkJCQkgICB0aGUgYnJhbmNoIGlzIHBvaW50ZWQgdG8gaXRzIGZpcnN0IHBhY2tldCwgYW5kIHRoZQorCQkJCQkJICAgc2VtYXBob3JlIGlzIGRpc2FibGVkLgorCisJCSAgIGEgIm1pZCIgcGFja2V0IHNsaWdodGx5IGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBmcmFtZSAtIHRoaXMgcGFja2V0IHNob3VsZCB0cmlnZ2VyCisJCSAgICAgICAgICAgICAgICAgICBhbiBpbnRlcnJ1cHQgc28gd2UgY2FuIGdvIGFuZCBhc3NpZ24gYSB0aW1lc3RhbXAgdG8gdGhlIGZpcnN0IHBhY2tldAorCQkJCSAgIGluIHRoZSBuZXh0IGZyYW1lLiBXZSBkb24ndCB1c2UgdGhlIHZlcnkgbGFzdCBwYWNrZXQgaW4gdGhlIGZyYW1lCisJCQkJICAgZm9yIHRoaXMgcHVycG9zZSwgYmVjYXVzZSB0aGF0IHdvdWxkIGxlYXZlIHZlcnkgbGl0dGxlIHRpbWUgdG8gc2V0CisJCQkJICAgdGhlIHRpbWVzdGFtcCBiZWZvcmUgRE1BIHN0YXJ0cyBvbiB0aGUgbmV4dCBmcmFtZS4KKwkJKi8KKworCQlpZiAoZi0+bl9wYWNrZXRzID09IDApIHsKKwkJCWZpcnN0X3BhY2tldCA9IDE7CisJCX0gZWxzZSBpZiAoIGZ1bGxfcGFja2V0cyA9PSAocGFja2V0c19wZXJfZnJhbWUtMSkgKSB7CisJCQlsYXN0X3BhY2tldCA9IDE7CisJCX0gZWxzZSBpZiAoZi0+bl9wYWNrZXRzID09IHBhY2tldHNfcGVyX2ZyYW1lKSB7CisJCQltaWRfcGFja2V0ID0gMTsKKwkJfQorCisKKwkJLyoqKioqKioqKioqKioqKioqKioqLworCQkvKiBzZXR1cCBDSVAgaGVhZGVyICovCisJCS8qKioqKioqKioqKioqKioqKioqKi8KKworCQkvKiB0aGUgdGltZXN0YW1wIHdpbGwgYmUgd3JpdHRlbiBsYXRlciBmcm9tIHRoZQorCQkgICBtaWQtZnJhbWUgaW50ZXJydXB0IGhhbmRsZXIuIEZvciBub3cgd2UganVzdAorCQkgICBzdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgQ0lQIGhlYWRlcihzKSB0aGF0CisJCSAgIG5lZWQgYSB0aW1lc3RhbXAuICovCisKKwkJLyogZmlyc3QgcGFja2V0IGluIHRoZSBmcmFtZSBuZWVkcyBhIHRpbWVzdGFtcCAqLworCQlpZiAoZmlyc3RfcGFja2V0KSB7CisJCQlmLT5jaXBfc3l0MSA9IGNpcDsKKwkJCWlmIChlbXB0eV9wYWNrZXQpCisJCQkJZmlyc3RfcGFja2V0X2VtcHR5ID0gMTsKKworCQl9IGVsc2UgaWYgKGZpcnN0X3BhY2tldF9lbXB0eSAmJiAoZi0+bl9wYWNrZXRzID09IDEpICkgeworCQkJLyogaWYgdGhlIGZpcnN0IHBhY2tldCB3YXMgZW1wdHksIHRoZSBzZWNvbmQKKwkJCSAgIHBhY2tldCdzIENJUCBoZWFkZXIgYWxzbyBuZWVkcyBhIHRpbWVzdGFtcCAqLworCQkJZi0+Y2lwX3N5dDIgPSBjaXA7CisJCX0KKworCQlmaWxsX2NpcF9oZWFkZXIoY2lwLAorCQkJCS8qIHRoZSBub2RlIElEIG51bWJlciBvZiB0aGUgT0hDSSBjYXJkICovCisJCQkJcmVnX3JlYWQodmlkZW8tPm9oY2ksIE9IQ0kxMzk0X05vZGVJRCkgJiAweDNGLAorCQkJCXZpZGVvLT5jb250aW51aXR5X2NvdW50ZXIsCisJCQkJdmlkZW8tPnBhbF9vcl9udHNjLAorCQkJCTB4RkZGRiAvKiB0aGUgdGltZXN0YW1wIGlzIGZpbGxlZCBpbiBsYXRlciAqLyk7CisKKwkJLyogYWR2YW5jZSBjb3VudGVyLCBvbmx5IGZvciBmdWxsIHBhY2tldHMgKi8KKwkJaWYgKCAhIGVtcHR5X3BhY2tldCApCisJCQl2aWRlby0+Y29udGludWl0eV9jb3VudGVyKys7CisKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJLyogc2V0dXAgRE1BIGRlc2NyaXB0b3IgYmxvY2sgKi8KKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCQkvKiBmaXJzdCBkZXNjcmlwdG9yIC0gT1VUUFVUX01PUkVfSU1NRURJQVRFLCBmb3IgdGhlIGNvbnRyb2xsZXIncyBJVCBoZWFkZXIgKi8KKwkJZmlsbF9vdXRwdXRfbW9yZV9pbW1lZGlhdGUoICYoYmxvY2stPnUub3V0Lm9taSksIDEsIHZpZGVvLT5jaGFubmVsLCAwLCBwYXlsb2FkX3NpemUpOworCisJCWlmIChlbXB0eV9wYWNrZXQpIHsKKwkJCS8qIHNlY29uZCBkZXNjcmlwdG9yIC0gT1VUUFVUX0xBU1QgZm9yIENJUCBoZWFkZXIgKi8KKwkJCWZpbGxfb3V0cHV0X2xhc3QoICYoYmxvY2stPnUub3V0LnUuZW1wdHkub2wpLAorCisJCQkJCSAgLyogd2FudCBjb21wbGV0aW9uIHN0YXR1cyBvbiBhbGwgaW50ZXJlc3RpbmcgcGFja2V0cyAqLworCQkJCQkgIChmaXJzdF9wYWNrZXQgfHwgbWlkX3BhY2tldCB8fCBsYXN0X3BhY2tldCkgPyAxIDogMCwKKworCQkJCQkgIC8qIHdhbnQgaW50ZXJydXB0cyBvbiBhbGwgaW50ZXJlc3RpbmcgcGFja2V0cyAqLworCQkJCQkgIChmaXJzdF9wYWNrZXQgfHwgbWlkX3BhY2tldCB8fCBsYXN0X3BhY2tldCkgPyAxIDogMCwKKworCQkJCQkgIHNpemVvZihzdHJ1Y3QgQ0lQX2hlYWRlciksIC8qIGRhdGEgc2l6ZSAqLworCQkJCQkgIGNpcF9kbWEpOworCisJCQlpZiAoZmlyc3RfcGFja2V0KQorCQkJCWYtPmZyYW1lX2JlZ2luX3RpbWVzdGFtcCA9ICYoYmxvY2stPnUub3V0LnUuZW1wdHkub2wucVszXSk7CisJCQllbHNlIGlmIChtaWRfcGFja2V0KQorCQkJCWYtPm1pZF9mcmFtZV90aW1lc3RhbXAgPSAmKGJsb2NrLT51Lm91dC51LmVtcHR5Lm9sLnFbM10pOworCQkJZWxzZSBpZiAobGFzdF9wYWNrZXQpIHsKKwkJCQlmLT5mcmFtZV9lbmRfdGltZXN0YW1wID0gJihibG9jay0+dS5vdXQudS5lbXB0eS5vbC5xWzNdKTsKKwkJCQlmLT5mcmFtZV9lbmRfYnJhbmNoID0gJihibG9jay0+dS5vdXQudS5lbXB0eS5vbC5xWzJdKTsKKwkJCX0KKworCQkJYnJhbmNoX2FkZHJlc3MgPSAmKGJsb2NrLT51Lm91dC51LmVtcHR5Lm9sLnFbMl0pOworCQkJbl9kZXNjcmlwdG9ycyA9IDM7CisJCQlpZiAoZmlyc3RfcGFja2V0KQorCQkJCWYtPmZpcnN0X25fZGVzY3JpcHRvcnMgPSBuX2Rlc2NyaXB0b3JzOworCisJCX0gZWxzZSB7IC8qIGZ1bGwgcGFja2V0ICovCisKKwkJCS8qIHNlY29uZCBkZXNjcmlwdG9yIC0gT1VUUFVUX01PUkUgZm9yIENJUCBoZWFkZXIgKi8KKwkJCWZpbGxfb3V0cHV0X21vcmUoICYoYmxvY2stPnUub3V0LnUuZnVsbC5vbSksCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBDSVBfaGVhZGVyKSwgLyogZGF0YSBzaXplICovCisJCQkJCSAgY2lwX2RtYSk7CisKKworCQkJLyogdGhpcmQgKGFuZCBwb3NzaWJseSBmb3VydGgpIGRlc2NyaXB0b3IgLSBmb3IgRFYgZGF0YSAqLworCQkJLyogdGhlIDQ4MC1ieXRlIHBheWxvYWQgY2FuIGNyb3NzIGEgcGFnZSBib3VuZGFyeTsgaWYgc28sCisJCQkgICB3ZSBuZWVkIHRvIHNwbGl0IGl0IGludG8gdHdvIERNQSBkZXNjcmlwdG9ycyAqLworCisJCQkvKiBkb2VzIHRoZSA0ODAtYnl0ZSBkYXRhIHBheWxvYWQgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5PyAqLworCQkJaWYgKCAoUEFHRV9TSVpFLSAoKHVuc2lnbmVkIGxvbmcpZGF0YV9wICUgUEFHRV9TSVpFKSApIDwgNDgwICkgeworCisJCQkJLyogcGFnZSBib3VuZGFyeSBjcm9zc2VkICovCisKKwkJCQlmaWxsX291dHB1dF9tb3JlKCAmKGJsb2NrLT51Lm91dC51LmZ1bGwudS5jcm9zcy5vbSksCisJCQkJCQkgIC8qIGRhdGEgc2l6ZSAtIGhvdyBtdWNoIG9mIGRhdGFfcCBmaXRzIG9uIHRoZSBmaXJzdCBwYWdlICovCisJCQkJCQkgIFBBR0VfU0laRSAtIChkYXRhX3AgJSBQQUdFX1NJWkUpLAorCisJCQkJCQkgIC8qIERNQSBhZGRyZXNzIG9mIGRhdGFfcCAqLworCQkJCQkJICBkbWFfcmVnaW9uX29mZnNldF90b19idXMoJnZpZGVvLT5kdl9idWYsCisJCQkJCQkJCQkgICBkYXRhX3AgLSAodW5zaWduZWQgbG9uZykgdmlkZW8tPmR2X2J1Zi5rdmlydCkpOworCisJCQkJZmlsbF9vdXRwdXRfbGFzdCggJihibG9jay0+dS5vdXQudS5mdWxsLnUuY3Jvc3Mub2wpLAorCisJCQkJCQkgIC8qIHdhbnQgY29tcGxldGlvbiBzdGF0dXMgb24gYWxsIGludGVyZXN0aW5nIHBhY2tldHMgKi8KKwkJCQkJCSAgKGZpcnN0X3BhY2tldCB8fCBtaWRfcGFja2V0IHx8IGxhc3RfcGFja2V0KSA/IDEgOiAwLAorCisJCQkJCQkgIC8qIHdhbnQgaW50ZXJydXB0IG9uIGFsbCBpbnRlcmVzdGluZyBwYWNrZXRzICovCisJCQkJCQkgIChmaXJzdF9wYWNrZXQgfHwgbWlkX3BhY2tldCB8fCBsYXN0X3BhY2tldCkgPyAxIDogMCwKKworCQkJCQkJICAvKiBkYXRhIHNpemUgLSByZW1haW5pbmcgcG9ydGlvbiBvZiBkYXRhX3AgKi8KKwkJCQkJCSAgNDgwIC0gKFBBR0VfU0laRSAtIChkYXRhX3AgJSBQQUdFX1NJWkUpKSwKKworCQkJCQkJICAvKiBETUEgYWRkcmVzcyBvZiBkYXRhX3AgKyBQQUdFX1NJWkUgLSAoZGF0YV9wICUgUEFHRV9TSVpFKSAqLworCQkJCQkJICBkbWFfcmVnaW9uX29mZnNldF90b19idXMoJnZpZGVvLT5kdl9idWYsCisJCQkJCQkJCQkgICBkYXRhX3AgKyBQQUdFX1NJWkUgLSAoZGF0YV9wICUgUEFHRV9TSVpFKSAtICh1bnNpZ25lZCBsb25nKSB2aWRlby0+ZHZfYnVmLmt2aXJ0KSk7CisKKwkJCQlpZiAoZmlyc3RfcGFja2V0KQorCQkJCQlmLT5mcmFtZV9iZWdpbl90aW1lc3RhbXAgPSAmKGJsb2NrLT51Lm91dC51LmZ1bGwudS5jcm9zcy5vbC5xWzNdKTsKKwkJCQllbHNlIGlmIChtaWRfcGFja2V0KQorCQkJCQlmLT5taWRfZnJhbWVfdGltZXN0YW1wID0gJihibG9jay0+dS5vdXQudS5mdWxsLnUuY3Jvc3Mub2wucVszXSk7CisJCQkJZWxzZSBpZiAobGFzdF9wYWNrZXQpIHsKKwkJCQkJZi0+ZnJhbWVfZW5kX3RpbWVzdGFtcCA9ICYoYmxvY2stPnUub3V0LnUuZnVsbC51LmNyb3NzLm9sLnFbM10pOworCQkJCQlmLT5mcmFtZV9lbmRfYnJhbmNoID0gJihibG9jay0+dS5vdXQudS5mdWxsLnUuY3Jvc3Mub2wucVsyXSk7CisJCQkJfQorCisJCQkJYnJhbmNoX2FkZHJlc3MgPSAmKGJsb2NrLT51Lm91dC51LmZ1bGwudS5jcm9zcy5vbC5xWzJdKTsKKworCQkJCW5fZGVzY3JpcHRvcnMgPSA1OworCQkJCWlmIChmaXJzdF9wYWNrZXQpCisJCQkJCWYtPmZpcnN0X25fZGVzY3JpcHRvcnMgPSBuX2Rlc2NyaXB0b3JzOworCisJCQkJZnVsbF9wYWNrZXRzKys7CisKKwkJCX0gZWxzZSB7CisJCQkJLyogZml0cyBvbiBvbmUgcGFnZSAqLworCisJCQkJZmlsbF9vdXRwdXRfbGFzdCggJihibG9jay0+dS5vdXQudS5mdWxsLnUubm9jcm9zcy5vbCksCisKKwkJCQkJCSAgLyogd2FudCBjb21wbGV0aW9uIHN0YXR1cyBvbiBhbGwgaW50ZXJlc3RpbmcgcGFja2V0cyAqLworCQkJCQkJICAoZmlyc3RfcGFja2V0IHx8IG1pZF9wYWNrZXQgfHwgbGFzdF9wYWNrZXQpID8gMSA6IDAsCisKKwkJCQkJCSAgLyogd2FudCBpbnRlcnJ1cHQgb24gYWxsIGludGVyZXN0aW5nIHBhY2tldHMgKi8KKwkJCQkJCSAgKGZpcnN0X3BhY2tldCB8fCBtaWRfcGFja2V0IHx8IGxhc3RfcGFja2V0KSA/IDEgOiAwLAorCisJCQkJCQkgIDQ4MCwgLyogZGF0YSBzaXplICg0ODAgYnl0ZXMgb2YgRFYgZGF0YSkgKi8KKworCisJCQkJCQkgIC8qIERNQSBhZGRyZXNzIG9mIGRhdGFfcCAqLworCQkJCQkJICBkbWFfcmVnaW9uX29mZnNldF90b19idXMoJnZpZGVvLT5kdl9idWYsCisJCQkJCQkJCQkgICBkYXRhX3AgLSAodW5zaWduZWQgbG9uZykgdmlkZW8tPmR2X2J1Zi5rdmlydCkpOworCisJCQkJaWYgKGZpcnN0X3BhY2tldCkKKwkJCQkJZi0+ZnJhbWVfYmVnaW5fdGltZXN0YW1wID0gJihibG9jay0+dS5vdXQudS5mdWxsLnUubm9jcm9zcy5vbC5xWzNdKTsKKwkJCQllbHNlIGlmIChtaWRfcGFja2V0KQorCQkJCQlmLT5taWRfZnJhbWVfdGltZXN0YW1wID0gJihibG9jay0+dS5vdXQudS5mdWxsLnUubm9jcm9zcy5vbC5xWzNdKTsKKwkJCQllbHNlIGlmIChsYXN0X3BhY2tldCkgeworCQkJCQlmLT5mcmFtZV9lbmRfdGltZXN0YW1wID0gJihibG9jay0+dS5vdXQudS5mdWxsLnUubm9jcm9zcy5vbC5xWzNdKTsKKwkJCQkJZi0+ZnJhbWVfZW5kX2JyYW5jaCA9ICYoYmxvY2stPnUub3V0LnUuZnVsbC51Lm5vY3Jvc3Mub2wucVsyXSk7CisJCQkJfQorCisJCQkJYnJhbmNoX2FkZHJlc3MgPSAmKGJsb2NrLT51Lm91dC51LmZ1bGwudS5ub2Nyb3NzLm9sLnFbMl0pOworCisJCQkJbl9kZXNjcmlwdG9ycyA9IDQ7CisJCQkJaWYgKGZpcnN0X3BhY2tldCkKKwkJCQkJZi0+Zmlyc3Rfbl9kZXNjcmlwdG9ycyA9IG5fZGVzY3JpcHRvcnM7CisKKwkJCQlmdWxsX3BhY2tldHMrKzsKKwkJCX0KKwkJfQorCisJCS8qIGxpbmsgdGhpcyBkZXNjcmlwdG9yIGJsb2NrIGludG8gdGhlIERNQSBwcm9ncmFtIGJ5IGZpbGxpbmcgaW4KKwkJICAgdGhlIGJyYW5jaCBhZGRyZXNzIG9mIHRoZSBwcmV2aW91cyBibG9jayAqLworCisJCS8qIG5vdGU6IHdlIGFyZSBub3QgbGlua2VkIGludG8gdGhlIGFjdGl2ZSBETUEgY2hhaW4geWV0ICovCisKKwkJaWYgKGxhc3RfYnJhbmNoX2FkZHJlc3MpIHsKKwkJCSoobGFzdF9icmFuY2hfYWRkcmVzcykgPSBjcHVfdG9fbGUzMihibG9ja19kbWEgfCBuX2Rlc2NyaXB0b3JzKTsKKwkJfQorCisJCWxhc3RfYnJhbmNoX2FkZHJlc3MgPSBicmFuY2hfYWRkcmVzczsKKworCisJCWYtPm5fcGFja2V0cysrOworCisJfQorCisJLyogd2hlbiB3ZSBmaXJzdCBhc3NlbWJsZSBhIG5ldyBmcmFtZSwgc2V0IHRoZSBmaW5hbCBicmFuY2gKKwkgICB0byBsb29wIGJhY2sgdXAgdG8gdGhlIHRvcCAqLworCSooZi0+ZnJhbWVfZW5kX2JyYW5jaCkgPSBjcHVfdG9fbGUzMihmLT5kZXNjcmlwdG9yX3Bvb2xfZG1hIHwgZi0+Zmlyc3Rfbl9kZXNjcmlwdG9ycyk7CisKKwkvKiBtYWtlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGZyYW1lIHZpc2libGUgdG8gdGhlIFBDSSBjYXJkICovCisJZG1hX3JlZ2lvbl9zeW5jX2Zvcl9kZXZpY2UoJnZpZGVvLT5kdl9idWYsIGYtPmRhdGEgLSAodW5zaWduZWQgbG9uZykgdmlkZW8tPmR2X2J1Zi5rdmlydCwgdmlkZW8tPmZyYW1lX3NpemUpOworCisJLyogbG9jayBhZ2FpbnN0IERNQSBpbnRlcnJ1cHQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnNwaW5sb2NrLCBpcnFfZmxhZ3MpOworCisJZi0+c3RhdGUgPSBGUkFNRV9SRUFEWTsKKworCXZpZGVvLT5uX2NsZWFyX2ZyYW1lcy0tOworCisJbGFzdF9mcmFtZSA9IHZpZGVvLT5maXJzdF9jbGVhcl9mcmFtZSAtIDE7CisJaWYgKGxhc3RfZnJhbWUgPT0gLTEpCisJCWxhc3RfZnJhbWUgPSB2aWRlby0+bl9mcmFtZXMtMTsKKworCXZpZGVvLT5maXJzdF9jbGVhcl9mcmFtZSA9ICh2aWRlby0+Zmlyc3RfY2xlYXJfZnJhbWUgKyAxKSAlIHZpZGVvLT5uX2ZyYW1lczsKKworCWlycV9wcmludGsoIiAgIGZyYW1lICVkIHByZXBhcmVkLCBhY3RpdmVfZnJhbWUgPSAlZCwgbl9jbGVhcl9mcmFtZXMgPSAlZCwgZmlyc3RfY2xlYXJfZnJhbWUgPSAlZFxuIGxhc3Q9JWRcbiIsCisJCSAgIHRoaXNfZnJhbWUsIHZpZGVvLT5hY3RpdmVfZnJhbWUsIHZpZGVvLT5uX2NsZWFyX2ZyYW1lcywgdmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lLCBsYXN0X2ZyYW1lKTsKKworCWlycV9wcmludGsoIiAgIGJlZ2luX3RzICUwOGx4IG1pZF90cyAlMDhseCBlbmRfdHMgJTA4bHggZW5kX2JyICUwOGx4XG4iLAorCQkgICAodW5zaWduZWQgbG9uZykgZi0+ZnJhbWVfYmVnaW5fdGltZXN0YW1wLAorCQkgICAodW5zaWduZWQgbG9uZykgZi0+bWlkX2ZyYW1lX3RpbWVzdGFtcCwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGYtPmZyYW1lX2VuZF90aW1lc3RhbXAsCisJCSAgICh1bnNpZ25lZCBsb25nKSBmLT5mcmFtZV9lbmRfYnJhbmNoKTsKKworCWlmICh2aWRlby0+YWN0aXZlX2ZyYW1lICE9IC0xKSB7CisKKwkJLyogaWYgRE1BIGlzIGFscmVhZHkgYWN0aXZlLCB3ZSBhcmUgYWxtb3N0IGRvbmUgKi8KKwkJLyoganVzdCBsaW5rIHVzIG9udG8gdGhlIGFjdGl2ZSBETUEgY2hhaW4gKi8KKwkJaWYgKHZpZGVvLT5mcmFtZXNbbGFzdF9mcmFtZV0tPmZyYW1lX2VuZF9icmFuY2gpIHsKKwkJCXUzMiB0ZW1wOworCisJCQkvKiBwb2ludCB0aGUgcHJldmlvdXMgZnJhbWUncyB0YWlsIHRvIHRoaXMgZnJhbWUncyBoZWFkICovCisJCQkqKHZpZGVvLT5mcmFtZXNbbGFzdF9mcmFtZV0tPmZyYW1lX2VuZF9icmFuY2gpID0gY3B1X3RvX2xlMzIoZi0+ZGVzY3JpcHRvcl9wb29sX2RtYSB8IGYtPmZpcnN0X25fZGVzY3JpcHRvcnMpOworCisJCQkvKiB0aGlzIHdyaXRlIE1VU1QgcHJlY2VkZSB0aGUgbmV4dCBvbmUsIG9yIHdlIGNvdWxkIHNpbGVudGx5IGRyb3AgZnJhbWVzICovCisJCQl3bWIoKTsKKworCQkJLyogZGlzYWJsZSB0aGUgd2FudF9zdGF0dXMgc2VtYXBob3JlIG9uIHRoZSBsYXN0IHBhY2tldCAqLworCQkJdGVtcCA9IGxlMzJfdG9fY3B1KCoodmlkZW8tPmZyYW1lc1tsYXN0X2ZyYW1lXS0+ZnJhbWVfZW5kX2JyYW5jaCAtIDIpKTsKKwkJCXRlbXAgJj0gMHhGN0NGRkZGRjsKKwkJCSoodmlkZW8tPmZyYW1lc1tsYXN0X2ZyYW1lXS0+ZnJhbWVfZW5kX2JyYW5jaCAtIDIpID0gY3B1X3RvX2xlMzIodGVtcCk7CisKKwkJCS8qIGZsdXNoIHRoZXNlIHdyaXRlcyB0byBtZW1vcnkgQVNBUCAqLworCQkJZmx1c2hfcGNpX3dyaXRlKHZpZGVvLT5vaGNpKTsKKworCQkJLyogTk9URToKKwkJCSAgIGlkZWFsbHkgdGhlIHdyaXRlcyBzaG91bGQgYmUgImF0b21pYyI6IGlmCisJCQkgICB0aGUgT0hDSSBjYXJkIHJlYWRzIHRoZSB3YW50X3N0YXR1cyBmbGFnIGluCisJCQkgICBiZXR3ZWVuIHRoZW0sIHdlJ2xsIGZhbHNlbHkgcmVwb3J0IGEKKwkJCSAgIGRyb3BwZWQgZnJhbWUuIEhvcGVmdWxseSB0aGlzIHdpbmRvdyBpcyB0b28KKwkJCSAgIHNtYWxsIHRvIHJlYWxseSBtYXR0ZXIsIGFuZCB0aGUgY29uc2VxdWVuY2UKKwkJCSAgIGlzIHJhdGhlciBoYXJtbGVzcy4gKi8KKworCisJCQlpcnFfcHJpbnRrKCIgICAgIG5ldyBmcmFtZSAlZCBsaW5rZWQgb250byBETUEgY2hhaW5cbiIsIHRoaXNfZnJhbWUpOworCisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgImR2MTM5NDogbGFzdCBmcmFtZSBub3QgcmVhZHk/Pz9cbiIpOworCQl9CisKKwl9IGVsc2UgeworCisJCXUzMiB0cmFuc21pdF9zZWMsIHRyYW5zbWl0X2N5YzsKKwkJdTMyIHRzX2N5YywgdHNfb2ZmOworCisJCS8qIERNQSBpcyBzdG9wcGVkLCBzbyB0aGlzIGlzIHRoZSB2ZXJ5IGZpcnN0IGZyYW1lICovCisJCXZpZGVvLT5hY3RpdmVfZnJhbWUgPSB0aGlzX2ZyYW1lOworCisJICAgICAgICAvKiBzZXQgQ29tbWFuZFB0ciB0byBhZGRyZXNzIGFuZCBzaXplIG9mIGZpcnN0IGRlc2NyaXB0b3IgYmxvY2sgKi8KKwkJcmVnX3dyaXRlKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29YbWl0Q29tbWFuZFB0ciwKKwkJCSAgdmlkZW8tPmZyYW1lc1t2aWRlby0+YWN0aXZlX2ZyYW1lXS0+ZGVzY3JpcHRvcl9wb29sX2RtYSB8CisJCQkgIGYtPmZpcnN0X25fZGVzY3JpcHRvcnMpOworCisJCS8qIGFzc2lnbiBhIHRpbWVzdGFtcCBiYXNlZCBvbiB0aGUgY3VycmVudCBjeWNsZSB0aW1lLi4uCisJCSAgIFdlJ2xsIHRlbGwgdGhlIGNhcmQgdG8gYmVnaW4gRE1BIDEwMCBjeWNsZXMgZnJvbSBub3csCisJCSAgIGFuZCBhc3NpZ24gYSB0aW1lc3RhbXAgMTAzIGN5Y2xlcyBmcm9tIG5vdyAqLworCisJCWN5Y2xlVGltZXIgPSByZWdfcmVhZCh2aWRlby0+b2hjaSwgT0hDSTEzOTRfSXNvY2hyb25vdXNDeWNsZVRpbWVyKTsKKworCQljdF9zZWMgPSBjeWNsZVRpbWVyID4+IDI1OworCQljdF9jeWMgPSAoY3ljbGVUaW1lciA+PiAxMikgJiAweDFGRkY7CisJCWN0X29mZiA9IGN5Y2xlVGltZXIgJiAweEZGRjsKKworCQl0cmFuc21pdF9zZWMgPSBjdF9zZWM7CisJCXRyYW5zbWl0X2N5YyA9IGN0X2N5YyArIDEwMDsKKworCQl0cmFuc21pdF9zZWMgKz0gdHJhbnNtaXRfY3ljLzgwMDA7CisJCXRyYW5zbWl0X2N5YyAlPSA4MDAwOworCisJCXRzX29mZiA9IGN0X29mZjsKKwkJdHNfY3ljID0gdHJhbnNtaXRfY3ljICsgMzsKKwkJdHNfY3ljICU9IDgwMDA7CisKKwkJZi0+YXNzaWduZWRfdGltZXN0YW1wID0gKHRzX2N5YyYweEYpIDw8IDEyOworCisJCS8qIG5vdyBhY3R1YWxseSB3cml0ZSB0aGUgdGltZXN0YW1wIGludG8gdGhlIGFwcHJvcHJpYXRlIENJUCBoZWFkZXJzICovCisJCWlmIChmLT5jaXBfc3l0MSkgeworCQkJZi0+Y2lwX3N5dDEtPmJbNl0gPSBmLT5hc3NpZ25lZF90aW1lc3RhbXAgPj4gODsKKwkJCWYtPmNpcF9zeXQxLT5iWzddID0gZi0+YXNzaWduZWRfdGltZXN0YW1wICYgMHhGRjsKKwkJfQorCQlpZiAoZi0+Y2lwX3N5dDIpIHsKKwkJCWYtPmNpcF9zeXQyLT5iWzZdID0gZi0+YXNzaWduZWRfdGltZXN0YW1wID4+IDg7CisJCQlmLT5jaXBfc3l0Mi0+Yls3XSA9IGYtPmFzc2lnbmVkX3RpbWVzdGFtcCAmIDB4RkY7CisJCX0KKworCQkvKiAtLS0gc3RhcnQgRE1BIC0tLSAqLworCisJCS8qIGNsZWFyIGFsbCBiaXRzIGluIENvbnRleHRDb250cm9sIHJlZ2lzdGVyICovCisKKwkJcmVnX3dyaXRlKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29YbWl0Q29udGV4dENvbnRyb2xDbGVhciwgMHhGRkZGRkZGRik7CisJCXdtYigpOworCisJCS8qIHRoZSBPSENJIGNhcmQgaGFzIHRoZSBhYmlsaXR5IHRvIHN0YXJ0IElTTyB0cmFuc21pc3Npb24gb24gYQorCQkgICBwYXJ0aWN1bGFyIGN5Y2xlIChzdGFydC1vbi1jeWNsZSkuIFRoaXMgd2F5IHdlIGNhbiBlbnN1cmUgdGhhdAorCQkgICB0aGUgZmlyc3QgRFYgZnJhbWUgd2lsbCBoYXZlIGFuIGFjY3VyYXRlIHRpbWVzdGFtcC4KKworCQkgICBIb3dldmVyLCBzdGFydC1vbi1jeWNsZSBvbmx5IGFwcGVhcnMgdG8gd29yayBpZiB0aGUgT0hDSSBjYXJkCisJCSAgIGlzIGN5Y2xlIG1hc3RlciEgU2luY2UgdGhlIGNvbnNlcXVlbmNlcyBvZiBtZXNzaW5nIHVwIHRoZSBmaXJzdAorCQkgICB0aW1lc3RhbXAgYXJlIG1pbmltYWwqLCBqdXN0IGRpc2FibGUgc3RhcnQtb24tY3ljbGUgZm9yIG5vdy4KKworCQkgICAqIG15IERWIGRlY2sgZHJvcHMgdGhlIGZpcnN0IGZldyBmcmFtZXMgYmVmb3JlIGl0ICJsb2NrcyBpbjsiCisJCSAgICAgc28gdGhlIGZpcnN0IGZyYW1lIGhhdmluZyBhbiBpbmNvcnJlY3QgdGltZXN0YW1wIGlzIGluY29uc2VxdWVudGlhbC4KKwkJKi8KKworI2lmIDAKKwkJcmVnX3dyaXRlKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29YbWl0Q29udGV4dENvbnRyb2xTZXQsCisJCQkgICgxIDw8IDMxKSAvKiBlbmFibGUgc3RhcnQtb24tY3ljbGUgKi8KKwkJCSAgfCAoICh0cmFuc21pdF9zZWMgJiAweDMpIDw8IDI5KQorCQkJICB8ICh0cmFuc21pdF9jeWMgPDwgMTYpKTsKKwkJd21iKCk7CisjZW5kaWYKKworCQl2aWRlby0+ZG1hX3J1bm5pbmcgPSAxOworCisJCS8qIHNldCB0aGUgJ3J1bicgYml0ICovCisJCXJlZ193cml0ZSh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sU2V0LCAweDgwMDApOworCQlmbHVzaF9wY2lfd3JpdGUodmlkZW8tPm9oY2kpOworCisJCS8qIC0tLSBETUEgc2hvdWxkIGJlIHJ1bm5pbmcgbm93IC0tLSAqLworCisJCWRlYnVnX3ByaW50aygiICAgIEN5Y2xlID0gJTR1IENvbnRleHRDb250cm9sID0gJTA4eCBDbWRQdHIgPSAlMDh4XG4iLAorCQkJICAgICAocmVnX3JlYWQodmlkZW8tPm9oY2ksIE9IQ0kxMzk0X0lzb2Nocm9ub3VzQ3ljbGVUaW1lcikgPj4gMTIpICYgMHgxRkZGLAorCQkJICAgICByZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sU2V0KSwKKwkJCSAgICAgcmVnX3JlYWQodmlkZW8tPm9oY2ksIHZpZGVvLT5vaGNpX0lzb1htaXRDb21tYW5kUHRyKSk7CisKKwkJZGVidWdfcHJpbnRrKCIgICAgRE1BIHN0YXJ0IC0gY3VycmVudCBjeWNsZSAlNHUsIHRyYW5zbWl0IGN5Y2xlICU0dSAoJTJ1KSwgYXNzaWduaW5nIHRzIGN5Y2xlICUydVxuIiwKKwkJCSAgICAgY3RfY3ljLCB0cmFuc21pdF9jeWMsIHRyYW5zbWl0X2N5YyAmIDB4RiwgdHNfY3ljICYgMHhGKTsKKworI2lmIERWMTM5NF9ERUJVR19MRVZFTCA+PSAyCisJCXsKKwkJCS8qIGNoZWNrIGlmIERNQSBpcyByZWFsbHkgcnVubmluZyAqLworCQkJaW50IGkgPSAwOworCQkJd2hpbGUgKGkgPCAyMCkgeworCQkJCW1iKCk7CisJCQkJbWRlbGF5KDEpOworCQkJCWlmIChyZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sU2V0KSAmICgxIDw8IDEwKSkgeworCQkJCQlwcmludGsoIkRNQSBBQ1RJVkUgYWZ0ZXIgJWQgbXNlY1xuIiwgaSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpKys7CisJCQl9CisKKwkJCXByaW50aygic2V0ID0gJTA4eCwgY21kUHRyID0gJTA4eFxuIiwKKwkJCSAgICAgICByZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sU2V0KSwKKwkJCSAgICAgICByZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvWG1pdENvbW1hbmRQdHIpCisJCQkgICAgICAgKTsKKworCQkJaWYgKCAhIChyZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sU2V0KSAmICAoMSA8PCAxMCkpICkgeworCQkJCXByaW50aygiRE1BIGRpZCBOT1QgZ28gYWN0aXZlIGFmdGVyIDIwbXMsIGV2ZW50ID0gJXhcbiIsCisJCQkJICAgICAgIHJlZ19yZWFkKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29YbWl0Q29udGV4dENvbnRyb2xTZXQpICYgMHgxRik7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoIkRNQSBpcyBSVU5OSU5HIVxuIik7CisJCX0KKyNlbmRpZgorCisJfQorCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+c3BpbmxvY2ssIGlycV9mbGFncyk7Cit9CisKKworCisvKioqIFJFQ0VJVkUgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCWZyYW1lIG1ldGhvZCBwdXRfcGFja2V0CisKKwltYXAgYW5kIGNvcHkgdGhlIHBhY2tldCBkYXRhIHRvIGl0cyBsb2NhdGlvbiBpbiB0aGUgZnJhbWUKKwliYXNlZCB1cG9uIERJRiBzZWN0aW9uIGFuZCBzZXF1ZW5jZQorKi8KKworc3RhdGljIHZvaWQgaW5saW5lCitmcmFtZV9wdXRfcGFja2V0IChzdHJ1Y3QgZnJhbWUgKmYsIHN0cnVjdCBwYWNrZXQgKnApCit7CisJaW50IHNlY3Rpb25fdHlwZSA9IHAtPmRhdGFbMF0gPj4gNTsgICAgICAgICAgIC8qIHNlY3Rpb24gdHlwZSBpcyBpbiBiaXRzIDUgLSA3ICovCisJaW50IGRpZl9zZXF1ZW5jZSA9IHAtPmRhdGFbMV0gPj4gNDsgICAgICAgICAgIC8qIGRpZiBzZXF1ZW5jZSBudW1iZXIgaXMgaW4gYml0cyA0IC0gNyAqLworCWludCBkaWZfYmxvY2sgPSBwLT5kYXRhWzJdOworCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKGRpZl9zZXF1ZW5jZSA+IDExIHx8IGRpZl9ibG9jayA+IDE0OSkgcmV0dXJuOworCisJc3dpdGNoIChzZWN0aW9uX3R5cGUpIHsKKwljYXNlIDA6ICAgICAgICAgICAvKiAxIEhlYWRlciBibG9jayAqLworCSAgICAgICAgbWVtY3B5KCAodm9pZCAqKSBmLT5kYXRhICsgZGlmX3NlcXVlbmNlICogMTUwICogODAsIHAtPmRhdGEsIDQ4MCk7CisJICAgICAgICBicmVhazsKKworCWNhc2UgMTogICAgICAgICAgIC8qIDIgU3ViY29kZSBibG9ja3MgKi8KKwkgICAgICAgIG1lbWNweSggKHZvaWQgKikgZi0+ZGF0YSArIGRpZl9zZXF1ZW5jZSAqIDE1MCAqIDgwICsgKDEgKyBkaWZfYmxvY2spICogODAsIHAtPmRhdGEsIDQ4MCk7CisJICAgICAgICBicmVhazsKKworCWNhc2UgMjogICAgICAgICAgIC8qIDMgVkFVWCBibG9ja3MgKi8KKwkgICAgICAgIG1lbWNweSggKHZvaWQgKikgZi0+ZGF0YSArIGRpZl9zZXF1ZW5jZSAqIDE1MCAqIDgwICsgKDMgKyBkaWZfYmxvY2spICogODAsIHAtPmRhdGEsIDQ4MCk7CisJICAgICAgICBicmVhazsKKworCWNhc2UgMzogICAgICAgICAgIC8qIDkgQXVkaW8gYmxvY2tzIGludGVybGVhdmVkIHdpdGggdmlkZW8gKi8KKwkgICAgICAgIG1lbWNweSggKHZvaWQgKikgZi0+ZGF0YSArIGRpZl9zZXF1ZW5jZSAqIDE1MCAqIDgwICsgKDYgKyBkaWZfYmxvY2sgKiAxNikgKiA4MCwgcC0+ZGF0YSwgNDgwKTsKKwkgICAgICAgIGJyZWFrOworCisJY2FzZSA0OiAgICAgICAgICAgLyogMTM1IFZpZGVvIGJsb2NrcyBpbnRlcmxlYXZlZCB3aXRoIGF1ZGlvICovCisJICAgICAgICBtZW1jcHkoICh2b2lkICopIGYtPmRhdGEgKyBkaWZfc2VxdWVuY2UgKiAxNTAgKiA4MCArICg3ICsgKGRpZl9ibG9jayAvIDE1KSArIGRpZl9ibG9jaykgKiA4MCwgcC0+ZGF0YSwgNDgwKTsKKwkgICAgICAgIGJyZWFrOworCisJZGVmYXVsdDogICAgICAgICAgIC8qIHdlIGNhbiBub3QgaGFuZGxlIGFueSBvdGhlciBkYXRhICovCisJICAgICAgICBicmVhazsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgc3RhcnRfZG1hX3JlY2VpdmUoc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvKQoreworCWlmICh2aWRlby0+Zmlyc3RfcnVuID09IDEpIHsKKwkJdmlkZW8tPmZpcnN0X3J1biA9IDA7CisKKwkJLyogc3RhcnQgRE1BIG9uY2UgYWxsIG9mIHRoZSBmcmFtZXMgYXJlIFJFQURZICovCisJCXZpZGVvLT5uX2NsZWFyX2ZyYW1lcyA9IDA7CisJCXZpZGVvLT5maXJzdF9jbGVhcl9mcmFtZSA9IC0xOworCQl2aWRlby0+Y3VycmVudF9wYWNrZXQgPSAwOworCQl2aWRlby0+YWN0aXZlX2ZyYW1lID0gMDsKKworCQkvKiByZXNldCBpc28gcmVjdiBjb250cm9sIHJlZ2lzdGVyICovCisJCXJlZ193cml0ZSh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xDbGVhciwgMHhGRkZGRkZGRik7CisJCXdtYigpOworCisJCS8qIGNsZWFyIGJ1ZmZlckZpbGwsIHNldCBpc29jaEhlYWRlciBhbmQgc3BlZWQgKDA9MTAwKSAqLworCQlyZWdfd3JpdGUodmlkZW8tPm9oY2ksIHZpZGVvLT5vaGNpX0lzb1JjdkNvbnRleHRDb250cm9sU2V0LCAweDQwMDAwMDAwKTsKKworCQkvKiBtYXRjaCBvbiBhbGwgdGFncywgbGlzdGVuIG9uIGNoYW5uZWwgKi8KKwkJcmVnX3dyaXRlKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29SY3ZDb250ZXh0TWF0Y2gsIDB4ZjAwMDAwMDAgfCB2aWRlby0+Y2hhbm5lbCk7CisKKwkJLyogYWRkcmVzcyBhbmQgZmlyc3QgZGVzY3JpcHRvciBibG9jayArIFo9MSAqLworCQlyZWdfd3JpdGUodmlkZW8tPm9oY2ksIHZpZGVvLT5vaGNpX0lzb1JjdkNvbW1hbmRQdHIsCisJCQkgIHZpZGVvLT5mcmFtZXNbMF0tPmRlc2NyaXB0b3JfcG9vbF9kbWEgfCAxKTsgLyogWj0xICovCisJCXdtYigpOworCisJCXZpZGVvLT5kbWFfcnVubmluZyA9IDE7CisKKwkJLyogcnVuICovCisJCXJlZ193cml0ZSh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQsIDB4ODAwMCk7CisJCWZsdXNoX3BjaV93cml0ZSh2aWRlby0+b2hjaSk7CisKKwkJZGVidWdfcHJpbnRrKCJkdjEzOTQ6IERNQSBzdGFydGVkXG4iKTsKKworI2lmIERWMTM5NF9ERUJVR19MRVZFTCA+PSAyCisJCXsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisJCQkJbWRlbGF5KDEpOworCQkJCWlmIChyZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQpICYgKDEgPDwgMTApKSB7CisJCQkJCXByaW50aygiRE1BIEFDVElWRSBhZnRlciAlZCBtc2VjXG4iLCBpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKCByZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQpICYgICgxIDw8IDExKSApIHsKKwkJCQlwcmludGsoIkRFQUQsIGV2ZW50ID0gJXhcbiIsCisJCQkJCSAgIHJlZ19yZWFkKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29SY3ZDb250ZXh0Q29udHJvbFNldCkgJiAweDFGKTsKKwkJCX0gZWxzZQorCQkJCXByaW50aygiUlVOTklORyFcbiIpOworCQl9CisjZW5kaWYKKwl9IGVsc2UgaWYgKCByZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQpICYgICgxIDw8IDExKSApIHsKKwkJZGVidWdfcHJpbnRrKCJERUFELCBldmVudCA9ICV4XG4iLAorCQkJICAgICByZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQpICYgMHgxRik7CisKKwkJLyogd2FrZSAqLworCQlyZWdfd3JpdGUodmlkZW8tPm9oY2ksIHZpZGVvLT5vaGNpX0lzb1JjdkNvbnRleHRDb250cm9sU2V0LCAoMSA8PCAxMikpOworCX0KK30KKworCisvKgorICAgcmVjZWl2ZV9wYWNrZXRzKCkgLSBidWlsZCB0aGUgRE1BIHByb2dyYW0gZm9yIHJlY2VpdmluZworKi8KKworc3RhdGljIHZvaWQgcmVjZWl2ZV9wYWNrZXRzKHN0cnVjdCB2aWRlb19jYXJkICp2aWRlbykKK3sKKwlzdHJ1Y3QgRE1BX2Rlc2NyaXB0b3JfYmxvY2sgKmJsb2NrID0gTlVMTDsKKwlkbWFfYWRkcl90IGJsb2NrX2RtYSA9IDA7CisJc3RydWN0IHBhY2tldCAqZGF0YSA9IE5VTEw7CisJZG1hX2FkZHJfdCBkYXRhX2RtYSA9IDA7CisJdTMyICpsYXN0X2JyYW5jaF9hZGRyZXNzID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlpbnQgd2FudF9pbnRlcnJ1cHQgPSAwOworCXN0cnVjdCBmcmFtZSAqZiA9IE5VTEw7CisJaW50IGksIGo7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnNwaW5sb2NrLCBpcnFfZmxhZ3MpOworCisJZm9yIChqID0gMDsgaiA8IHZpZGVvLT5uX2ZyYW1lczsgaisrKSB7CisKKwkJLyogY29ubmVjdCBmcmFtZXMgKi8KKwkJaWYgKGogPiAwICYmIGYgIT0gTlVMTCAmJiBmLT5mcmFtZV9lbmRfYnJhbmNoICE9IE5VTEwpCisJCQkqKGYtPmZyYW1lX2VuZF9icmFuY2gpID0gY3B1X3RvX2xlMzIodmlkZW8tPmZyYW1lc1tqXS0+ZGVzY3JpcHRvcl9wb29sX2RtYSB8IDEpOyAvKiBzZXQgWj0xICovCisKKwkJZiA9IHZpZGVvLT5mcmFtZXNbal07CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9QQUNLRVRTOyBpKyspIHsKKwkJCS8qIGxvY2F0ZSBhIGRlc2NyaXB0b3IgYmxvY2sgYW5kIHBhY2tldCBmcm9tIHRoZSBidWZmZXIgKi8KKwkJCWJsb2NrID0gJihmLT5kZXNjcmlwdG9yX3Bvb2xbaV0pOworCQkJYmxvY2tfZG1hID0gKCh1bnNpZ25lZCBsb25nKSBibG9jayAtICh1bnNpZ25lZCBsb25nKSBmLT5kZXNjcmlwdG9yX3Bvb2wpICsgZi0+ZGVzY3JpcHRvcl9wb29sX2RtYTsKKworCQkJZGF0YSA9ICgoc3RydWN0IHBhY2tldCopdmlkZW8tPnBhY2tldF9idWYua3ZpcnQpICsgZi0+ZnJhbWVfbnVtICogTUFYX1BBQ0tFVFMgKyBpOworCQkJZGF0YV9kbWEgPSBkbWFfcmVnaW9uX29mZnNldF90b19idXMoICZ2aWRlby0+cGFja2V0X2J1ZiwKKwkJCQkJCQkgICAgICgodW5zaWduZWQgbG9uZykgZGF0YSAtICh1bnNpZ25lZCBsb25nKSB2aWRlby0+cGFja2V0X2J1Zi5rdmlydCkgKTsKKworCQkJLyogc2V0dXAgRE1BIGRlc2NyaXB0b3IgYmxvY2sgKi8KKwkJCXdhbnRfaW50ZXJydXB0ID0gKChpICUgKE1BWF9QQUNLRVRTLzIpKSA9PSAwIHx8IGkgPT0gKE1BWF9QQUNLRVRTLTEpKTsKKwkJCWZpbGxfaW5wdXRfbGFzdCggJihibG9jay0+dS5pbi5pbCksIHdhbnRfaW50ZXJydXB0LCA1MTIsIGRhdGFfZG1hKTsKKworCQkJLyogbGluayBkZXNjcmlwdG9ycyAqLworCQkJbGFzdF9icmFuY2hfYWRkcmVzcyA9IGYtPmZyYW1lX2VuZF9icmFuY2g7CisKKwkJCWlmIChsYXN0X2JyYW5jaF9hZGRyZXNzICE9IE5VTEwpCisJCQkJKihsYXN0X2JyYW5jaF9hZGRyZXNzKSA9IGNwdV90b19sZTMyKGJsb2NrX2RtYSB8IDEpOyAvKiBzZXQgWj0xICovCisKKwkJCWYtPmZyYW1lX2VuZF9icmFuY2ggPSAmKGJsb2NrLT51LmluLmlsLnFbMl0pOworCQl9CisKKwl9IC8qIG5leHQgaiAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlkZW8tPnNwaW5sb2NrLCBpcnFfZmxhZ3MpOworCit9CisKKworCisvKioqIE1BTkFHRU1FTlQgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGRvX2R2MTM5NF9pbml0KHN0cnVjdCB2aWRlb19jYXJkICp2aWRlbywgc3RydWN0IGR2MTM5NF9pbml0ICppbml0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG5ld19idWZfc2l6ZTsKKwlpbnQgaTsKKwl1NjQgY2hhbl9tYXNrOworCWludCByZXR2YWwgPSAtRUlOVkFMOworCisJZGVidWdfcHJpbnRrKCJkdjEzOTQ6IGluaXRpYWxpc2luZyAlZFxuIiwgdmlkZW8tPmlkKTsKKwlpZiAoaW5pdC0+YXBpX3ZlcnNpb24gIT0gRFYxMzk0X0FQSV9WRVJTSU9OKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGZpcnN0IHNhbml0aXplIGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWlmICggKGluaXQtPm5fZnJhbWVzIDwgMikgfHwgKGluaXQtPm5fZnJhbWVzID4gRFYxMzk0X01BWF9GUkFNRVMpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIChpbml0LT5mb3JtYXQgIT0gRFYxMzk0X05UU0MpICYmIChpbml0LT5mb3JtYXQgIT0gRFYxMzk0X1BBTCkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggKGluaXQtPnN5dF9vZmZzZXQgPT0gMCkgfHwgKGluaXQtPnN5dF9vZmZzZXQgPiA1MCkgKQorCQkvKiBkZWZhdWx0IFNZVCBvZmZzZXQgaXMgMyBjeWNsZXMgKi8KKwkJaW5pdC0+c3l0X29mZnNldCA9IDM7CisKKwlpZiAoIChpbml0LT5jaGFubmVsID4gNjMpIHx8IChpbml0LT5jaGFubmVsIDwgMCkgKQorCQlpbml0LT5jaGFubmVsID0gNjM7CisKKwljaGFuX21hc2sgPSAodTY0KTEgPDwgaW5pdC0+Y2hhbm5lbDsKKworCS8qIGNhbGN1bGF0ZSB3aGF0IHNpemUgRE1BIGJ1ZmZlciBpcyBuZWVkZWQgKi8KKwlpZiAoaW5pdC0+Zm9ybWF0ID09IERWMTM5NF9OVFNDKQorCQluZXdfYnVmX3NpemUgPSBEVjEzOTRfTlRTQ19GUkFNRV9TSVpFICogaW5pdC0+bl9mcmFtZXM7CisJZWxzZQorCQluZXdfYnVmX3NpemUgPSBEVjEzOTRfUEFMX0ZSQU1FX1NJWkUgKiBpbml0LT5uX2ZyYW1lczsKKworCS8qIHJvdW5kIHVwIHRvIFBBR0VfU0laRSAqLworCWlmIChuZXdfYnVmX3NpemUgJSBQQUdFX1NJWkUpIG5ld19idWZfc2l6ZSArPSBQQUdFX1NJWkUgLSAobmV3X2J1Zl9zaXplICUgUEFHRV9TSVpFKTsKKworCS8qIGRvbid0IGFsbG93IHRoZSB1c2VyIHRvIGFsbG9jYXRlIHRoZSBETUEgYnVmZmVyIG1vcmUgdGhhbiBvbmNlICovCisJaWYgKHZpZGVvLT5kdl9idWYua3ZpcnQgJiYgdmlkZW8tPmR2X2J1Zl9zaXplICE9IG5ld19idWZfc2l6ZSkgeworCQlwcmludGsoImR2MTM5NDogcmUtc2l6aW5nIHRoZSBETUEgYnVmZmVyIGlzIG5vdCBhbGxvd2VkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc2h1dGRvd24gdGhlIGNhcmQgaWYgaXQncyBjdXJyZW50bHkgYWN0aXZlICovCisJLyogKHRoZSBjYXJkIHNob3VsZCBub3QgYmUgcmVzZXQgaWYgdGhlIHBhcmFtZXRlcnMgYXJlIHNjcmV3eSkgKi8KKworCWRvX2R2MTM5NF9zaHV0ZG93bih2aWRlbywgMCk7CisKKwkvKiB0cnkgdG8gY2xhaW0gdGhlIElTTyBjaGFubmVsICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpZGVvLT5vaGNpLT5JUl9jaGFubmVsX2xvY2ssIGZsYWdzKTsKKwlpZiAodmlkZW8tPm9oY2ktPklTT19jaGFubmVsX3VzYWdlICYgY2hhbl9tYXNrKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5vaGNpLT5JUl9jaGFubmVsX2xvY2ssIGZsYWdzKTsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIGVycjsKKwl9CisJdmlkZW8tPm9oY2ktPklTT19jaGFubmVsX3VzYWdlIHw9IGNoYW5fbWFzazsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+b2hjaS0+SVJfY2hhbm5lbF9sb2NrLCBmbGFncyk7CisKKwl2aWRlby0+Y2hhbm5lbCA9IGluaXQtPmNoYW5uZWw7CisKKwkvKiBpbml0aWFsaXplIG1pc2MuIGZpZWxkcyBvZiB2aWRlbyAqLworCXZpZGVvLT5uX2ZyYW1lcyA9IGluaXQtPm5fZnJhbWVzOworCXZpZGVvLT5wYWxfb3JfbnRzYyA9IGluaXQtPmZvcm1hdDsKKworCXZpZGVvLT5jaXBfYWNjdW0gPSAwOworCXZpZGVvLT5jb250aW51aXR5X2NvdW50ZXIgPSAwOworCisJdmlkZW8tPmFjdGl2ZV9mcmFtZSA9IC0xOworCXZpZGVvLT5maXJzdF9jbGVhcl9mcmFtZSA9IDA7CisJdmlkZW8tPm5fY2xlYXJfZnJhbWVzID0gdmlkZW8tPm5fZnJhbWVzOworCXZpZGVvLT5kcm9wcGVkX2ZyYW1lcyA9IDA7CisKKwl2aWRlby0+d3JpdGVfb2ZmID0gMDsKKworCXZpZGVvLT5maXJzdF9ydW4gPSAxOworCXZpZGVvLT5jdXJyZW50X3BhY2tldCA9IC0xOworCXZpZGVvLT5maXJzdF9mcmFtZSA9IDA7CisKKwlpZiAodmlkZW8tPnBhbF9vcl9udHNjID09IERWMTM5NF9OVFNDKSB7CisJCXZpZGVvLT5jaXBfbiA9IGluaXQtPmNpcF9uICE9IDAgPyBpbml0LT5jaXBfbiA6IENJUF9OX05UU0M7CisJCXZpZGVvLT5jaXBfZCA9IGluaXQtPmNpcF9kICE9IDAgPyBpbml0LT5jaXBfZCA6IENJUF9EX05UU0M7CisJCXZpZGVvLT5mcmFtZV9zaXplID0gRFYxMzk0X05UU0NfRlJBTUVfU0laRTsKKwl9IGVsc2UgeworCQl2aWRlby0+Y2lwX24gPSBpbml0LT5jaXBfbiAhPSAwID8gaW5pdC0+Y2lwX24gOiBDSVBfTl9QQUw7CisJCXZpZGVvLT5jaXBfZCA9IGluaXQtPmNpcF9kICE9IDAgPyBpbml0LT5jaXBfZCA6IENJUF9EX1BBTDsKKwkJdmlkZW8tPmZyYW1lX3NpemUgPSBEVjEzOTRfUEFMX0ZSQU1FX1NJWkU7CisJfQorCisJdmlkZW8tPnN5dF9vZmZzZXQgPSBpbml0LT5zeXRfb2Zmc2V0OworCisJLyogZmluZCBhbmQgY2xhaW0gRE1BIGNvbnRleHRzIG9uIHRoZSBPSENJIGNhcmQgKi8KKworCWlmICh2aWRlby0+b2hjaV9pdF9jdHggPT0gLTEpIHsKKwkJb2hjaTEzOTRfaW5pdF9pc29fdGFza2xldCgmdmlkZW8tPml0X3Rhc2tsZXQsIE9IQ0lfSVNPX1RSQU5TTUlULAorCQkJCQkgIGl0X3Rhc2tsZXRfZnVuYywgKHVuc2lnbmVkIGxvbmcpIHZpZGVvKTsKKworCQlpZiAob2hjaTEzOTRfcmVnaXN0ZXJfaXNvX3Rhc2tsZXQodmlkZW8tPm9oY2ksICZ2aWRlby0+aXRfdGFza2xldCkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImR2MTM5NDogY291bGQgbm90IGZpbmQgYW4gYXZhaWxhYmxlIElUIERNQSBjb250ZXh0XG4iKTsKKwkJCXJldHZhbCA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJdmlkZW8tPm9oY2lfaXRfY3R4ID0gdmlkZW8tPml0X3Rhc2tsZXQuY29udGV4dDsKKwkJZGVidWdfcHJpbnRrKCJkdjEzOTQ6IGNsYWltZWQgSVQgRE1BIGNvbnRleHQgJWRcbiIsIHZpZGVvLT5vaGNpX2l0X2N0eCk7CisJfQorCisJaWYgKHZpZGVvLT5vaGNpX2lyX2N0eCA9PSAtMSkgeworCQlvaGNpMTM5NF9pbml0X2lzb190YXNrbGV0KCZ2aWRlby0+aXJfdGFza2xldCwgT0hDSV9JU09fUkVDRUlWRSwKKwkJCQkJICBpcl90YXNrbGV0X2Z1bmMsICh1bnNpZ25lZCBsb25nKSB2aWRlbyk7CisKKwkJaWYgKG9oY2kxMzk0X3JlZ2lzdGVyX2lzb190YXNrbGV0KHZpZGVvLT5vaGNpLCAmdmlkZW8tPmlyX3Rhc2tsZXQpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkdjEzOTQ6IGNvdWxkIG5vdCBmaW5kIGFuIGF2YWlsYWJsZSBJUiBETUEgY29udGV4dFxuIik7CisJCQlyZXR2YWwgPSAtRUJVU1k7CisJCQlnb3RvIGVycjsKKwkJfQorCQl2aWRlby0+b2hjaV9pcl9jdHggPSB2aWRlby0+aXJfdGFza2xldC5jb250ZXh0OworCQlkZWJ1Z19wcmludGsoImR2MTM5NDogY2xhaW1lZCBJUiBETUEgY29udGV4dCAlZFxuIiwgdmlkZW8tPm9oY2lfaXJfY3R4KTsKKwl9CisKKwkvKiBhbGxvY2F0ZSBzdHJ1Y3QgZnJhbWVzICovCisJZm9yIChpID0gMDsgaSA8IGluaXQtPm5fZnJhbWVzOyBpKyspIHsKKwkJdmlkZW8tPmZyYW1lc1tpXSA9IGZyYW1lX25ldyhpLCB2aWRlbyk7CisKKwkJaWYgKCF2aWRlby0+ZnJhbWVzW2ldKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImR2MTM5NDogQ2Fubm90IGFsbG9jYXRlIGZyYW1lIHN0cnVjdHNcbiIpOworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJaWYgKCF2aWRlby0+ZHZfYnVmLmt2aXJ0KSB7CisJCS8qIGFsbG9jYXRlIHRoZSByaW5nYnVmZmVyICovCisJCXJldHZhbCA9IGRtYV9yZWdpb25fYWxsb2MoJnZpZGVvLT5kdl9idWYsIG5ld19idWZfc2l6ZSwgdmlkZW8tPm9oY2ktPmRldiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycjsKKworCQl2aWRlby0+ZHZfYnVmX3NpemUgPSBuZXdfYnVmX3NpemU7CisKKwkJZGVidWdfcHJpbnRrKCJkdjEzOTQ6IEFsbG9jYXRlZCAlZCBmcmFtZSBidWZmZXJzLCB0b3RhbCAldSBwYWdlcyAoJXUgRE1BIHBhZ2VzKSwgJWx1IGJ5dGVzXG4iLCAKKwkJCSAgICAgdmlkZW8tPm5fZnJhbWVzLCB2aWRlby0+ZHZfYnVmLm5fcGFnZXMsCisJCQkgICAgIHZpZGVvLT5kdl9idWYubl9kbWFfcGFnZXMsIHZpZGVvLT5kdl9idWZfc2l6ZSk7CisJfQorCisJLyogc2V0IHVwIHRoZSBmcmFtZS0+ZGF0YSBwb2ludGVycyAqLworCWZvciAoaSA9IDA7IGkgPCB2aWRlby0+bl9mcmFtZXM7IGkrKykKKwkJdmlkZW8tPmZyYW1lc1tpXS0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB2aWRlby0+ZHZfYnVmLmt2aXJ0ICsgaSAqIHZpZGVvLT5mcmFtZV9zaXplOworCisJaWYgKCF2aWRlby0+cGFja2V0X2J1Zi5rdmlydCkgeworCQkvKiBhbGxvY2F0ZSBwYWNrZXQgYnVmZmVyICovCisJCXZpZGVvLT5wYWNrZXRfYnVmX3NpemUgPSBzaXplb2Yoc3RydWN0IHBhY2tldCkgKiB2aWRlby0+bl9mcmFtZXMgKiBNQVhfUEFDS0VUUzsKKwkJaWYgKHZpZGVvLT5wYWNrZXRfYnVmX3NpemUgJSBQQUdFX1NJWkUpCisJCQl2aWRlby0+cGFja2V0X2J1Zl9zaXplICs9IFBBR0VfU0laRSAtICh2aWRlby0+cGFja2V0X2J1Zl9zaXplICUgUEFHRV9TSVpFKTsKKworCQlyZXR2YWwgPSBkbWFfcmVnaW9uX2FsbG9jKCZ2aWRlby0+cGFja2V0X2J1ZiwgdmlkZW8tPnBhY2tldF9idWZfc2l6ZSwKKwkJCQkJICB2aWRlby0+b2hjaS0+ZGV2LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnI7CisKKwkJZGVidWdfcHJpbnRrKCJkdjEzOTQ6IEFsbG9jYXRlZCAlZCBwYWNrZXRzIGluIGJ1ZmZlciwgdG90YWwgJXUgcGFnZXMgKCV1IERNQSBwYWdlcyksICVsdSBieXRlc1xuIiwKKwkJCQkgdmlkZW8tPm5fZnJhbWVzKk1BWF9QQUNLRVRTLCB2aWRlby0+cGFja2V0X2J1Zi5uX3BhZ2VzLAorCQkJCSB2aWRlby0+cGFja2V0X2J1Zi5uX2RtYV9wYWdlcywgdmlkZW8tPnBhY2tldF9idWZfc2l6ZSk7CisJfQorCisJLyogc2V0IHVwIHJlZ2lzdGVyIG9mZnNldHMgZm9yIElUIGNvbnRleHQgKi8KKwkvKiBJVCBETUEgY29udGV4dCByZWdpc3RlcnMgYXJlIHNwYWNlZCAxNiBieXRlcyBhcGFydCAqLworCXZpZGVvLT5vaGNpX0lzb1htaXRDb250ZXh0Q29udHJvbFNldCA9IE9IQ0kxMzk0X0lzb1htaXRDb250ZXh0Q29udHJvbFNldCsxNip2aWRlby0+b2hjaV9pdF9jdHg7CisJdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sQ2xlYXIgPSBPSENJMTM5NF9Jc29YbWl0Q29udGV4dENvbnRyb2xDbGVhcisxNip2aWRlby0+b2hjaV9pdF9jdHg7CisJdmlkZW8tPm9oY2lfSXNvWG1pdENvbW1hbmRQdHIgPSBPSENJMTM5NF9Jc29YbWl0Q29tbWFuZFB0cisxNip2aWRlby0+b2hjaV9pdF9jdHg7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyBmb3IgSVQgY29udGV4dCAqLworCXJlZ193cml0ZSh2aWRlby0+b2hjaSwgT0hDSTEzOTRfSXNvWG1pdEludE1hc2tTZXQsICgxIDw8IHZpZGVvLT5vaGNpX2l0X2N0eCkpOworCWRlYnVnX3ByaW50aygiZHYxMzk0OiBpbnRlcnJ1cHRzIGVuYWJsZWQgZm9yIElUIGNvbnRleHQgJWRcbiIsIHZpZGVvLT5vaGNpX2l0X2N0eCk7CisKKwkvKiBzZXQgdXAgcmVnaXN0ZXIgb2Zmc2V0cyBmb3IgSVIgY29udGV4dCAqLworCS8qIElSIERNQSBjb250ZXh0IHJlZ2lzdGVycyBhcmUgc3BhY2VkIDMyIGJ5dGVzIGFwYXJ0ICovCisJdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQgPSBPSENJMTM5NF9Jc29SY3ZDb250ZXh0Q29udHJvbFNldCszMip2aWRlby0+b2hjaV9pcl9jdHg7CisJdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xDbGVhciA9IE9IQ0kxMzk0X0lzb1JjdkNvbnRleHRDb250cm9sQ2xlYXIrMzIqdmlkZW8tPm9oY2lfaXJfY3R4OworCXZpZGVvLT5vaGNpX0lzb1JjdkNvbW1hbmRQdHIgPSBPSENJMTM5NF9Jc29SY3ZDb21tYW5kUHRyKzMyKnZpZGVvLT5vaGNpX2lyX2N0eDsKKwl2aWRlby0+b2hjaV9Jc29SY3ZDb250ZXh0TWF0Y2ggPSBPSENJMTM5NF9Jc29SY3ZDb250ZXh0TWF0Y2grMzIqdmlkZW8tPm9oY2lfaXJfY3R4OworCisJLyogZW5hYmxlIGludGVycnVwdHMgZm9yIElSIGNvbnRleHQgKi8KKwlyZWdfd3JpdGUodmlkZW8tPm9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRNYXNrU2V0LCAoMSA8PCB2aWRlby0+b2hjaV9pcl9jdHgpICk7CisJZGVidWdfcHJpbnRrKCJkdjEzOTQ6IGludGVycnVwdHMgZW5hYmxlZCBmb3IgSVIgY29udGV4dCAlZFxuIiwgdmlkZW8tPm9oY2lfaXJfY3R4KTsKKworCXJldHVybiAwOworCitlcnI6CisJZG9fZHYxMzk0X3NodXRkb3duKHZpZGVvLCAxKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBpZiB0aGUgdXNlciBkb2Vzbid0IGJvdGhlciB0byBjYWxsIGlvY3RsKElOSVQpIGJlZm9yZSBzdGFydGluZworICAgbW1hcCgpIG9yIHJlYWQoKS93cml0ZSgpLCBqdXN0IGdpdmUgaGltIHNvbWUgZGVmYXVsdCB2YWx1ZXMgKi8KKworc3RhdGljIGludCBkb19kdjEzOTRfaW5pdF9kZWZhdWx0KHN0cnVjdCB2aWRlb19jYXJkICp2aWRlbykKK3sKKwlzdHJ1Y3QgZHYxMzk0X2luaXQgaW5pdDsKKworCWluaXQuYXBpX3ZlcnNpb24gPSBEVjEzOTRfQVBJX1ZFUlNJT047CisJaW5pdC5uX2ZyYW1lcyA9IERWMTM5NF9NQVhfRlJBTUVTIC8gNDsKKwkvKiB0aGUgZm9sbG93aW5nIGFyZSBub3cgc2V0IHZpYSBkZXZmcyAqLworCWluaXQuY2hhbm5lbCA9IHZpZGVvLT5jaGFubmVsOworCWluaXQuZm9ybWF0ID0gdmlkZW8tPnBhbF9vcl9udHNjOworCWluaXQuY2lwX24gPSB2aWRlby0+Y2lwX247CisJaW5pdC5jaXBfZCA9IHZpZGVvLT5jaXBfZDsKKwlpbml0LnN5dF9vZmZzZXQgPSB2aWRlby0+c3l0X29mZnNldDsKKworCXJldHVybiBkb19kdjEzOTRfaW5pdCh2aWRlbywgJmluaXQpOworfQorCisvKiBkbyBOT1QgY2FsbCBmcm9tIGludGVycnVwdCBjb250ZXh0ICovCitzdGF0aWMgdm9pZCBzdG9wX2RtYShzdHJ1Y3QgdmlkZW9fY2FyZCAqdmlkZW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCS8qIG5vIGludGVycnVwdHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisKKwl2aWRlby0+ZG1hX3J1bm5pbmcgPSAwOworCisJaWYgKCAodmlkZW8tPm9oY2lfaXRfY3R4ID09IC0xKSAmJiAodmlkZW8tPm9oY2lfaXJfY3R4ID09IC0xKSApCisJCWdvdG8gb3V0OworCisJLyogc3RvcCBETUEgaWYgaW4gcHJvZ3Jlc3MgKi8KKwlpZiAoICh2aWRlby0+YWN0aXZlX2ZyYW1lICE9IC0xKSB8fAorCSAgICAocmVnX3JlYWQodmlkZW8tPm9oY2ksIHZpZGVvLT5vaGNpX0lzb1htaXRDb250ZXh0Q29udHJvbENsZWFyKSAmICgxIDw8IDEwKSkgfHwKKwkgICAgKHJlZ19yZWFkKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29SY3ZDb250ZXh0Q29udHJvbENsZWFyKSAmICAoMSA8PCAxMCkpICkgeworCisJCS8qIGNsZWFyIHRoZSAucnVuIGJpdHMgKi8KKwkJcmVnX3dyaXRlKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29YbWl0Q29udGV4dENvbnRyb2xDbGVhciwgKDEgPDwgMTUpKTsKKwkJcmVnX3dyaXRlKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29SY3ZDb250ZXh0Q29udHJvbENsZWFyLCAoMSA8PCAxNSkpOworCQlmbHVzaF9wY2lfd3JpdGUodmlkZW8tPm9oY2kpOworCisJCXZpZGVvLT5hY3RpdmVfZnJhbWUgPSAtMTsKKwkJdmlkZW8tPmZpcnN0X3J1biA9IDE7CisKKwkJLyogd2FpdCB1bnRpbCBETUEgcmVhbGx5IHN0b3BzICovCisJCWkgPSAwOworCQl3aGlsZSAoaSA8IDEwMDApIHsKKworCQkJLyogd2FpdCAwLjEgbWlsbGlzZWNvbmQgKi8KKwkJCXVkZWxheSgxMDApOworCisJCQlpZiAoIChyZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sQ2xlYXIpICYgKDEgPDwgMTApKSB8fAorCQkJICAgIChyZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xDbGVhcikgICYgKDEgPDwgMTApKSApIHsKKwkJCQkvKiBzdGlsbCBhY3RpdmUgKi8KKwkJCQlkZWJ1Z19wcmludGsoImR2MTM5NDogc3RvcF9kbWE6IERNQSBub3Qgc3RvcHBlZCB5ZXRcbiIgKTsKKwkJCQltYigpOworCQkJfSBlbHNlIHsKKwkJCQlkZWJ1Z19wcmludGsoImR2MTM5NDogc3RvcF9kbWE6IERNQSBzdG9wcGVkIHNhZmVseSBhZnRlciAlZCBtc1xuIiwgaS8xMCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWkrKzsKKwkJfQorCisJCWlmIChpID09IDEwMDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZHYxMzk0OiBzdG9wX2RtYTogRE1BIHN0aWxsIGdvaW5nIGFmdGVyICVkIG1zIVxuIiwgaS8xMCk7CisJCX0KKwl9CisJZWxzZQorCQlkZWJ1Z19wcmludGsoImR2MTM5NDogc3RvcF9kbWE6IGFscmVhZHkgc3RvcHBlZC5cbiIpOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7Cit9CisKKworCitzdGF0aWMgdm9pZCBkb19kdjEzOTRfc2h1dGRvd24oc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvLCBpbnQgZnJlZV9kdl9idWYpCit7CisJaW50IGk7CisKKwlkZWJ1Z19wcmludGsoImR2MTM5NDogc2h1dGRvd24uLi5cbiIpOworCisJLyogc3RvcCBETUEgaWYgaW4gcHJvZ3Jlc3MgKi8KKwlzdG9wX2RtYSh2aWRlbyk7CisKKwkvKiByZWxlYXNlIHRoZSBETUEgY29udGV4dHMgKi8KKwlpZiAodmlkZW8tPm9oY2lfaXRfY3R4ICE9IC0xKSB7CisJCXZpZGVvLT5vaGNpX0lzb1htaXRDb250ZXh0Q29udHJvbFNldCA9IDA7CisJCXZpZGVvLT5vaGNpX0lzb1htaXRDb250ZXh0Q29udHJvbENsZWFyID0gMDsKKwkJdmlkZW8tPm9oY2lfSXNvWG1pdENvbW1hbmRQdHIgPSAwOworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgSVQgY29udGV4dCAqLworCQlyZWdfd3JpdGUodmlkZW8tPm9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRNYXNrQ2xlYXIsICgxIDw8IHZpZGVvLT5vaGNpX2l0X2N0eCkpOworCisJCS8qIHJlbW92ZSB0YXNrbGV0ICovCisJCW9oY2kxMzk0X3VucmVnaXN0ZXJfaXNvX3Rhc2tsZXQodmlkZW8tPm9oY2ksICZ2aWRlby0+aXRfdGFza2xldCk7CisJCWRlYnVnX3ByaW50aygiZHYxMzk0OiBJVCBjb250ZXh0ICVkIHJlbGVhc2VkXG4iLCB2aWRlby0+b2hjaV9pdF9jdHgpOworCQl2aWRlby0+b2hjaV9pdF9jdHggPSAtMTsKKwl9CisKKwlpZiAodmlkZW8tPm9oY2lfaXJfY3R4ICE9IC0xKSB7CisJCXZpZGVvLT5vaGNpX0lzb1JjdkNvbnRleHRDb250cm9sU2V0ID0gMDsKKwkJdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xDbGVhciA9IDA7CisJCXZpZGVvLT5vaGNpX0lzb1JjdkNvbW1hbmRQdHIgPSAwOworCQl2aWRlby0+b2hjaV9Jc29SY3ZDb250ZXh0TWF0Y2ggPSAwOworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgSVIgY29udGV4dCAqLworCQlyZWdfd3JpdGUodmlkZW8tPm9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRNYXNrQ2xlYXIsICgxIDw8IHZpZGVvLT5vaGNpX2lyX2N0eCkpOworCisJCS8qIHJlbW92ZSB0YXNrbGV0ICovCisJCW9oY2kxMzk0X3VucmVnaXN0ZXJfaXNvX3Rhc2tsZXQodmlkZW8tPm9oY2ksICZ2aWRlby0+aXJfdGFza2xldCk7CisJCWRlYnVnX3ByaW50aygiZHYxMzk0OiBJUiBjb250ZXh0ICVkIHJlbGVhc2VkXG4iLCB2aWRlby0+b2hjaV9pcl9jdHgpOworCQl2aWRlby0+b2hjaV9pcl9jdHggPSAtMTsKKwl9CisKKwkvKiByZWxlYXNlIHRoZSBJU08gY2hhbm5lbCAqLworCWlmICh2aWRlby0+Y2hhbm5lbCAhPSAtMSkgeworCQl1NjQgY2hhbl9tYXNrOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWNoYW5fbWFzayA9ICh1NjQpMSA8PCB2aWRlby0+Y2hhbm5lbDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPm9oY2ktPklSX2NoYW5uZWxfbG9jaywgZmxhZ3MpOworCQl2aWRlby0+b2hjaS0+SVNPX2NoYW5uZWxfdXNhZ2UgJj0gfihjaGFuX21hc2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+b2hjaS0+SVJfY2hhbm5lbF9sb2NrLCBmbGFncyk7CisKKwkJdmlkZW8tPmNoYW5uZWwgPSAtMTsKKwl9CisKKwkvKiBmcmVlIHRoZSBmcmFtZSBzdHJ1Y3RzICovCisJZm9yIChpID0gMDsgaSA8IERWMTM5NF9NQVhfRlJBTUVTOyBpKyspIHsKKwkJaWYgKHZpZGVvLT5mcmFtZXNbaV0pCisJCQlmcmFtZV9kZWxldGUodmlkZW8tPmZyYW1lc1tpXSk7CisJCXZpZGVvLT5mcmFtZXNbaV0gPSBOVUxMOworCX0KKworCXZpZGVvLT5uX2ZyYW1lcyA9IDA7CisKKwkvKiB3ZSBjYW4ndCBmcmVlIHRoZSBETUEgYnVmZmVyIHVubGVzcyBpdCBpcyBndWFyYW50ZWVkIHRoYXQKKwkgICBubyBtb3JlIHVzZXItc3BhY2UgbWFwcGluZ3MgZXhpc3QgKi8KKworCWlmIChmcmVlX2R2X2J1ZikgeworCQlkbWFfcmVnaW9uX2ZyZWUoJnZpZGVvLT5kdl9idWYpOworCQl2aWRlby0+ZHZfYnVmX3NpemUgPSAwOworCX0KKworCS8qIGZyZWUgcGFja2V0IGJ1ZmZlciAqLworCWRtYV9yZWdpb25fZnJlZSgmdmlkZW8tPnBhY2tldF9idWYpOworCXZpZGVvLT5wYWNrZXRfYnVmX3NpemUgPSAwOworCisJZGVidWdfcHJpbnRrKCJkdjEzOTQ6IHNodXRkb3duIE9LXG4iKTsKK30KKworLyoKKyAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgKioqIE1NQVAoKSBUSEVPUlkgT0YgT1BFUkFUSU9OICoqKgorICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICBUaGUgcmluZ2J1ZmZlciBjYW5ub3QgYmUgcmUtYWxsb2NhdGVkIG9yIGZyZWVkIHdoaWxlCisgICAgICAgIGEgdXNlciBwcm9ncmFtIG1haW50YWlucyBhIG1hcHBpbmcgb2YgaXQuIChub3RlIHRoYXQgYSBtYXBwaW5nCisJY2FuIHBlcnNpc3QgZXZlbiBhZnRlciB0aGUgZGV2aWNlIGZkIGlzIGNsb3NlZCEpCisKKwlTbywgb25seSBsZXQgdGhlIHVzZXIgcHJvY2VzcyBhbGxvY2F0ZSB0aGUgRE1BIGJ1ZmZlciBvbmNlLgorCVRvIHJlc2l6ZSBvciBkZWFsbG9jYXRlIGl0LCB5b3UgbXVzdCBjbG9zZSB0aGUgZGV2aWNlIGZpbGUKKwlhbmQgb3BlbiBpdCBhZ2Fpbi4KKworCVByZXZpb3VzbHkgRGFuIE0uIGhhY2tlZCBvdXQgYSBzY2hlbWUgdGhhdCBhbGxvd2VkIHRoZSBETUEKKwlidWZmZXIgdG8gY2hhbmdlIGJ5IGZvcmNlZnVsbHkgdW5tYXBwaW5nIGl0IGZyb20gdGhlIHVzZXIncworCWFkZHJlc3Mgc3BhY2UuIEl0IHdhcyBwcm9uZSB0byBlcnJvciBiZWNhdXNlIGl0J3MgdmVyeSBoYXJkIHRvCisJdHJhY2sgYWxsIHRoZSBwbGFjZXMgdGhlIGJ1ZmZlciBjb3VsZCBoYXZlIGJlZW4gbWFwcGVkICh3ZQorCXdvdWxkIGhhdmUgaGFkIHRvIHdhbGsgdGhlIHZtYSBsaXN0IG9mIGV2ZXJ5IHByb2Nlc3MgaW4gdGhlCisJc3lzdGVtIHRvIGJlIHN1cmUgd2UgZm91bmQgYWxsIHRoZSBtYXBwaW5ncyEpLiBJbnN0ZWFkLCB3ZQorCWZvcmNlIHRoZSB1c2VyIHRvIGNob29zZSBvbmUgYnVmZmVyIHNpemUgYW5kIHN0aWNrIHdpdGgKKwlpdC4gVGhpcyBzbWFsbCBzYWNyaWZpY2UgaXMgd29ydGggdGhlIGh1Z2UgcmVkdWN0aW9uIGluCisJZXJyb3ItcHJvbmUgY29kZSBpbiBkdjEzOTQuCisqLworCitzdGF0aWMgaW50IGR2MTM5NF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdmlkZW9fY2FyZCAqdmlkZW8gPSBmaWxlX3RvX3ZpZGVvX2NhcmQoZmlsZSk7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CisKKwkvKiBzZXJpYWxpemUgbW1hcCAqLworCWRvd24oJnZpZGVvLT5zZW0pOworCisJaWYgKCAhIHZpZGVvX2NhcmRfaW5pdGlhbGl6ZWQodmlkZW8pICkgeworCQlyZXR2YWwgPSBkb19kdjEzOTRfaW5pdF9kZWZhdWx0KHZpZGVvKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gb3V0OworCX0KKworCXJldHZhbCA9IGRtYV9yZWdpb25fbW1hcCgmdmlkZW8tPmR2X2J1ZiwgZmlsZSwgdm1hKTsKK291dDoKKwl1cCgmdmlkZW8tPnNlbSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqKiBERVZJQ0UgRklMRSBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogbm8gbmVlZCB0byBzZXJpYWxpemUsIG11bHRpcGxlIHRocmVhZHMgT0sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHYxMzk0X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgdmlkZW9fY2FyZCAqdmlkZW8gPSBmaWxlX3RvX3ZpZGVvX2NhcmQoZmlsZSk7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnZpZGVvLT53YWl0cSwgd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKCB2aWRlby0+bl9mcmFtZXMgPT0gMCApIHsKKworCX0gZWxzZSBpZiAoIHZpZGVvLT5hY3RpdmVfZnJhbWUgPT0gLTEgKSB7CisJCS8qIG5vdGhpbmcgZ29pbmcgb24gKi8KKwkJbWFzayB8PSBQT0xMT1VUOworCX0gZWxzZSB7CisJCS8qIGFueSBjbGVhci9yZWFkeSBidWZmZXJzPyAqLworCQlpZiAodmlkZW8tPm5fY2xlYXJfZnJhbWVzID4wKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTElOOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGR2MTM5NF9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQoreworCS8qIEkganVzdCBjb3BpZWQgdGhpcyBjb2RlIHZlcmJhdGltIGZyb20gQWxhbiBDb3gncyBtb3VzZSBkcml2ZXIgZXhhbXBsZQorCSAgIChEb2N1bWVudGF0aW9uL0RvY0Jvb2svKSAqLworCisJc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvID0gZmlsZV90b192aWRlb19jYXJkKGZpbGUpOworCisJaW50IHJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbGUsIG9uLCAmdmlkZW8tPmZhc3luYyk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGR2MTM5NF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvID0gZmlsZV90b192aWRlb19jYXJkKGZpbGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXNpemVfdCBjbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdGFyZ2V0X2ZyYW1lOworCisJLyogc2VyaWFsaXplIHRoaXMgdG8gcHJldmVudCBtdWx0aS10aHJlYWRlZCBtYXloZW0gKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJaWYgKGRvd25fdHJ5bG9jaygmdmlkZW8tPnNlbSkpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9IGVsc2UgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ2aWRlby0+c2VtKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJaWYgKCAhdmlkZW9fY2FyZF9pbml0aWFsaXplZCh2aWRlbykgKSB7CisJCXJldCA9IGRvX2R2MTM5NF9pbml0X2RlZmF1bHQodmlkZW8pOworCQlpZiAocmV0KSB7CisJCQl1cCgmdmlkZW8tPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0ID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmdmlkZW8tPndhaXRxLCAmd2FpdCk7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisKKwkJLyogbXVzdCBzZXQgVEFTS19JTlRFUlJVUFRJQkxFICpiZWZvcmUqIGNoZWNraW5nIGZvciBmcmVlCisJCSAgIGJ1ZmZlcnM7IG90aGVyd2lzZSB3ZSBjb3VsZCBtaXNzIGEgd2FrZXVwIGlmIHRoZSBpbnRlcnJ1cHQKKwkJICAgZmlyZXMgYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSBzY2hlZHVsZSgpICovCisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisKKwkJdGFyZ2V0X2ZyYW1lID0gdmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5zcGlubG9jaywgZmxhZ3MpOworCisJCWlmICh2aWRlby0+ZnJhbWVzW3RhcmdldF9mcmFtZV0tPnN0YXRlID09IEZSQU1FX0NMRUFSKSB7CisKKwkJCS8qIGhvdyBtdWNoIHJvb20gaXMgbGVmdCBpbiB0aGUgdGFyZ2V0IGZyYW1lIGJ1ZmZlciAqLworCQkJY250ID0gdmlkZW8tPmZyYW1lX3NpemUgLSAodmlkZW8tPndyaXRlX29mZiAtIHRhcmdldF9mcmFtZSAqIHZpZGVvLT5mcmFtZV9zaXplKTsKKworCQl9IGVsc2UgeworCQkJLyogYnVmZmVyIGlzIGFscmVhZHkgdXNlZCAqLworCQkJY250ID0gMDsKKwkJfQorCisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCisJCWlmIChjbnQgPD0gMCkgeworCQkJLyogbm8gcm9vbSBsZWZ0LCBnb3R0YSB3YWl0ICovCisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXNjaGVkdWxlKCk7CisKKwkJCWNvbnRpbnVlOyAvKiBzdGFydCBvdmVyIGZyb20gJ3doaWxlKGNvdW50ID4gMCkuLi4nICovCisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIodmlkZW8tPmR2X2J1Zi5rdmlydCArIHZpZGVvLT53cml0ZV9vZmYsIGJ1ZmZlciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJdmlkZW8tPndyaXRlX29mZiA9ICh2aWRlby0+d3JpdGVfb2ZmICsgY250KSAlICh2aWRlby0+bl9mcmFtZXMgKiB2aWRlby0+ZnJhbWVfc2l6ZSk7CisKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCisJCWlmICh2aWRlby0+d3JpdGVfb2ZmID09IHZpZGVvLT5mcmFtZV9zaXplICogKCh0YXJnZXRfZnJhbWUgKyAxKSAlIHZpZGVvLT5uX2ZyYW1lcykpCisJCQkJZnJhbWVfcHJlcGFyZSh2aWRlbywgdGFyZ2V0X2ZyYW1lKTsKKwl9CisKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdmlkZW8tPndhaXRxLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl1cCgmdmlkZW8tPnNlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCBkdjEzOTRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2aWRlb19jYXJkICp2aWRlbyA9IGZpbGVfdG9fdmlkZW9fY2FyZChmaWxlKTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwlzaXplX3QgY250OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRhcmdldF9mcmFtZTsKKworCS8qIHNlcmlhbGl6ZSB0aGlzIHRvIHByZXZlbnQgbXVsdGktdGhyZWFkZWQgbWF5aGVtICovCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCWlmIChkb3duX3RyeWxvY2soJnZpZGVvLT5zZW0pKQorCQkJcmV0dXJuIC1FQUdBSU47CisJfSBlbHNlIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdmlkZW8tPnNlbSkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworCWlmICggIXZpZGVvX2NhcmRfaW5pdGlhbGl6ZWQodmlkZW8pICkgeworCQlyZXQgPSBkb19kdjEzOTRfaW5pdF9kZWZhdWx0KHZpZGVvKTsKKwkJaWYgKHJldCkgeworCQkJdXAoJnZpZGVvLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQl2aWRlby0+Y29udGludWl0eV9jb3VudGVyID0gLTE7CisKKwkJcmVjZWl2ZV9wYWNrZXRzKHZpZGVvKTsKKworCQlzdGFydF9kbWFfcmVjZWl2ZSh2aWRlbyk7CisJfQorCisJcmV0ID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmdmlkZW8tPndhaXRxLCAmd2FpdCk7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisKKwkJLyogbXVzdCBzZXQgVEFTS19JTlRFUlJVUFRJQkxFICpiZWZvcmUqIGNoZWNraW5nIGZvciBmcmVlCisJCSAgIGJ1ZmZlcnM7IG90aGVyd2lzZSB3ZSBjb3VsZCBtaXNzIGEgd2FrZXVwIGlmIHRoZSBpbnRlcnJ1cHQKKwkJICAgZmlyZXMgYmV0d2VlbiB0aGUgY2hlY2sgYW5kIHRoZSBzY2hlZHVsZSgpICovCisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisKKwkJdGFyZ2V0X2ZyYW1lID0gdmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5zcGlubG9jaywgZmxhZ3MpOworCisJCWlmICh0YXJnZXRfZnJhbWUgPj0gMCAmJgorCQkJdmlkZW8tPm5fY2xlYXJfZnJhbWVzID4gMCAmJgorCQkJdmlkZW8tPmZyYW1lc1t0YXJnZXRfZnJhbWVdLT5zdGF0ZSA9PSBGUkFNRV9DTEVBUikgeworCisJCQkvKiBob3cgbXVjaCByb29tIGlzIGxlZnQgaW4gdGhlIHRhcmdldCBmcmFtZSBidWZmZXIgKi8KKwkJCWNudCA9IHZpZGVvLT5mcmFtZV9zaXplIC0gKHZpZGVvLT53cml0ZV9vZmYgLSB0YXJnZXRfZnJhbWUgKiB2aWRlby0+ZnJhbWVfc2l6ZSk7CisKKwkJfSBlbHNlIHsKKwkJCS8qIGJ1ZmZlciBpcyBhbHJlYWR5IHVzZWQgKi8KKwkJCWNudCA9IDA7CisJCX0KKworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKworCQlpZiAoY250IDw9IDApIHsKKwkJCS8qIG5vIHJvb20gbGVmdCwgZ290dGEgd2FpdCAqLworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCisJCQlzY2hlZHVsZSgpOworCisJCQljb250aW51ZTsgLyogc3RhcnQgb3ZlciBmcm9tICd3aGlsZShjb3VudCA+IDApLi4uJyAqLworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHZpZGVvLT5kdl9idWYua3ZpcnQgKyB2aWRlby0+d3JpdGVfb2ZmLCBjbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCX0KKworCQl2aWRlby0+d3JpdGVfb2ZmID0gKHZpZGVvLT53cml0ZV9vZmYgKyBjbnQpICUgKHZpZGVvLT5uX2ZyYW1lcyAqIHZpZGVvLT5mcmFtZV9zaXplKTsKKworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisKKwkJaWYgKHZpZGVvLT53cml0ZV9vZmYgPT0gdmlkZW8tPmZyYW1lX3NpemUgKiAoKHRhcmdldF9mcmFtZSArIDEpICUgdmlkZW8tPm5fZnJhbWVzKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnZpZGVvLT5zcGlubG9jaywgZmxhZ3MpOworCQkJdmlkZW8tPm5fY2xlYXJfZnJhbWVzLS07CisJCQl2aWRlby0+Zmlyc3RfY2xlYXJfZnJhbWUgPSAodmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lICsgMSkgJSB2aWRlby0+bl9mcmFtZXM7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCXJlbW92ZV93YWl0X3F1ZXVlKCZ2aWRlby0+d2FpdHEsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXVwKCZ2aWRlby0+c2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKiogREVWSUNFIElPQ1RMIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBsb25nIGR2MTM5NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWxvY2tfa2VybmVsKCk7CisJdmlkZW8gPSBmaWxlX3RvX3ZpZGVvX2NhcmQoZmlsZSk7CisKKwkvKiBzZXJpYWxpemUgdGhpcyB0byBwcmV2ZW50IG11bHRpLXRocmVhZGVkIG1heWhlbSAqLworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQlpZiAoZG93bl90cnlsb2NrKCZ2aWRlby0+c2VtKSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ2aWRlby0+c2VtKSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKworCXN3aXRjaChjbWQpCisJeworCWNhc2UgRFYxMzk0X0lPQ19TVUJNSVRfRlJBTUVTOiB7CisJCXVuc2lnbmVkIGludCBuX3N1Ym1pdDsKKworCQlpZiAoICF2aWRlb19jYXJkX2luaXRpYWxpemVkKHZpZGVvKSApIHsKKwkJCXJldCA9IGRvX2R2MTM5NF9pbml0X2RlZmF1bHQodmlkZW8pOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCisJCW5fc3VibWl0ID0gKHVuc2lnbmVkIGludCkgYXJnOworCisJCWlmIChuX3N1Ym1pdCA+IHZpZGVvLT5uX2ZyYW1lcykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJd2hpbGUgKG5fc3VibWl0ID4gMCkgeworCisJCQlhZGRfd2FpdF9xdWV1ZSgmdmlkZW8tPndhaXRxLCAmd2FpdCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisKKwkJCS8qIHdhaXQgdW50aWwgdmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lIGlzIHJlYWxseSBDTEVBUiAqLworCQkJd2hpbGUgKHZpZGVvLT5mcmFtZXNbdmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lXS0+c3RhdGUgIT0gRlJBTUVfQ0xFQVIpIHsKKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5zcGlubG9jaywgZmxhZ3MpOworCisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZ2aWRlby0+d2FpdHEsICZ3YWl0KTsKKwkJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQkJcmV0ID0gLUVJTlRSOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisKKwkJCQlzY2hlZHVsZSgpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+c3BpbmxvY2ssIGZsYWdzKTsKKworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnZpZGVvLT53YWl0cSwgJndhaXQpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCQkJZnJhbWVfcHJlcGFyZSh2aWRlbywgdmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lKTsKKworCQkJbl9zdWJtaXQtLTsKKwkJfQorCisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgRFYxMzk0X0lPQ19XQUlUX0ZSQU1FUzogeworCQl1bnNpZ25lZCBpbnQgbl93YWl0OworCisJCWlmICggIXZpZGVvX2NhcmRfaW5pdGlhbGl6ZWQodmlkZW8pICkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbl93YWl0ID0gKHVuc2lnbmVkIGludCkgYXJnOworCisJCS8qIHNpbmNlIHdlIHJlLXJ1biB0aGUgbGFzdCBmcmFtZSBvbiB1bmRlcmZsb3csIHdlIHdpbGwKKwkJICAgbmV2ZXIgYWN0dWFsbHkgaGF2ZSBuX2ZyYW1lcyBjbGVhciBmcmFtZXM7IGF0IG1vc3Qgb25seQorCQkgICBuX2ZyYW1lcyAtIDEgKi8KKworCQlpZiAobl93YWl0ID4gKHZpZGVvLT5uX2ZyYW1lcy0xKSApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWFkZF93YWl0X3F1ZXVlKCZ2aWRlby0+d2FpdHEsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisKKwkJd2hpbGUgKHZpZGVvLT5uX2NsZWFyX2ZyYW1lcyA8IG5fd2FpdCkgeworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWRlby0+c3BpbmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnZpZGVvLT53YWl0cSwgJndhaXQpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQkJcmV0ID0gLUVJTlRSOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnZpZGVvLT5zcGlubG9jaywgZmxhZ3MpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnZpZGVvLT53YWl0cSwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIERWMTM5NF9JT0NfUkVDRUlWRV9GUkFNRVM6IHsKKwkJdW5zaWduZWQgaW50IG5fcmVjdjsKKworCQlpZiAoICF2aWRlb19jYXJkX2luaXRpYWxpemVkKHZpZGVvKSApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW5fcmVjdiA9ICh1bnNpZ25lZCBpbnQpIGFyZzsKKworCQkvKiBhdCBsZWFzdCBvbmUgZnJhbWUgbXVzdCBiZSBhY3RpdmUgKi8KKwkJaWYgKG5fcmVjdiA+ICh2aWRlby0+bl9mcmFtZXMtMSkgKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisKKwkJLyogcmVsZWFzZSB0aGUgY2xlYXIgZnJhbWVzICovCisJCXZpZGVvLT5uX2NsZWFyX2ZyYW1lcyAtPSBuX3JlY3Y7CisKKwkJLyogYWR2YW5jZSB0aGUgY2xlYXIgZnJhbWUgY3Vyc29yICovCisJCXZpZGVvLT5maXJzdF9jbGVhcl9mcmFtZSA9ICh2aWRlby0+Zmlyc3RfY2xlYXJfZnJhbWUgKyBuX3JlY3YpICUgdmlkZW8tPm5fZnJhbWVzOworCisJCS8qIHJlc2V0IGRyb3BwZWRfZnJhbWVzICovCisJCXZpZGVvLT5kcm9wcGVkX2ZyYW1lcyA9IDA7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBEVjEzOTRfSU9DX1NUQVJUX1JFQ0VJVkU6IHsKKwkJaWYgKCAhdmlkZW9fY2FyZF9pbml0aWFsaXplZCh2aWRlbykgKSB7CisJCQlyZXQgPSBkb19kdjEzOTRfaW5pdF9kZWZhdWx0KHZpZGVvKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisJCX0KKworCQl2aWRlby0+Y29udGludWl0eV9jb3VudGVyID0gLTE7CisKKwkJcmVjZWl2ZV9wYWNrZXRzKHZpZGVvKTsKKworCQlzdGFydF9kbWFfcmVjZWl2ZSh2aWRlbyk7CisKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBEVjEzOTRfSU9DX0lOSVQ6IHsKKwkJc3RydWN0IGR2MTM5NF9pbml0IGluaXQ7CisJCWlmICghYXJncCkgeworCQkJcmV0ID0gZG9fZHYxMzk0X2luaXRfZGVmYXVsdCh2aWRlbyk7CisJCX0gZWxzZSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmluaXQsIGFyZ3AsIHNpemVvZihpbml0KSkpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcmV0ID0gZG9fZHYxMzk0X2luaXQodmlkZW8sICZpbml0KTsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIERWMTM5NF9JT0NfU0hVVERPV046CisJCWRvX2R2MTM5NF9zaHV0ZG93bih2aWRlbywgMCk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCisKKyAgICAgICAgY2FzZSBEVjEzOTRfSU9DX0dFVF9TVEFUVVM6IHsKKwkJc3RydWN0IGR2MTM5NF9zdGF0dXMgc3RhdHVzOworCisJCWlmICggIXZpZGVvX2NhcmRfaW5pdGlhbGl6ZWQodmlkZW8pICkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3RhdHVzLmluaXQuYXBpX3ZlcnNpb24gPSBEVjEzOTRfQVBJX1ZFUlNJT047CisJCXN0YXR1cy5pbml0LmNoYW5uZWwgPSB2aWRlby0+Y2hhbm5lbDsKKwkJc3RhdHVzLmluaXQubl9mcmFtZXMgPSB2aWRlby0+bl9mcmFtZXM7CisJCXN0YXR1cy5pbml0LmZvcm1hdCA9IHZpZGVvLT5wYWxfb3JfbnRzYzsKKwkJc3RhdHVzLmluaXQuY2lwX24gPSB2aWRlby0+Y2lwX247CisJCXN0YXR1cy5pbml0LmNpcF9kID0gdmlkZW8tPmNpcF9kOworCQlzdGF0dXMuaW5pdC5zeXRfb2Zmc2V0ID0gdmlkZW8tPnN5dF9vZmZzZXQ7CisKKwkJc3RhdHVzLmZpcnN0X2NsZWFyX2ZyYW1lID0gdmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lOworCisJCS8qIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMgbmVlZCB0byBiZSBsb2NrZWQgYWdhaW5zdCB0aGUgaW50ZXJydXB0ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aWRlby0+c3BpbmxvY2ssIGZsYWdzKTsKKworCQlzdGF0dXMuYWN0aXZlX2ZyYW1lID0gdmlkZW8tPmFjdGl2ZV9mcmFtZTsKKwkJc3RhdHVzLm5fY2xlYXJfZnJhbWVzID0gdmlkZW8tPm5fY2xlYXJfZnJhbWVzOworCisJCXN0YXR1cy5kcm9wcGVkX2ZyYW1lcyA9IHZpZGVvLT5kcm9wcGVkX2ZyYW1lczsKKworCQkvKiByZXNldCBkcm9wcGVkX2ZyYW1lcyAqLworCQl2aWRlby0+ZHJvcHBlZF9mcmFtZXMgPSAwOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZGVvLT5zcGlubG9jaywgZmxhZ3MpOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKyBvdXQ6CisJdXAoJnZpZGVvLT5zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioqIERFVklDRSBGSUxFIElOVEVSRkFDRSBDT05USU5VRUQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGR2MTM5NF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19jYXJkICp2aWRlbyA9IE5VTEw7CisKKwkvKiBpZiB0aGUgZGV2aWNlIHdhcyBvcGVuZWQgdGhyb3VnaCBkZXZmcywgdGhlbiBmaWxlLT5wcml2YXRlX2RhdGEKKwkgICBoYXMgYWxyZWFkeSBiZWVuIHNldCB0byB2aWRlbyBieSBkZXZmcyAqLworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEpIHsKKwkJdmlkZW8gPSAoc3RydWN0IHZpZGVvX2NhcmQqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwl9IGVsc2UgeworCQkvKiBsb29rIHVwIHRoZSBjYXJkIGJ5IElEICovCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmR2MTM5NF9jYXJkc19sb2NrLCBmbGFncyk7CisJCWlmICghbGlzdF9lbXB0eSgmZHYxMzk0X2NhcmRzKSkgeworCQkJc3RydWN0IHZpZGVvX2NhcmQgKnA7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZkdjEzOTRfY2FyZHMsIGxpc3QpIHsKKwkJCQlpZiAoKHAtPmlkKSA9PSBpZWVlMTM5NF9maWxlX3RvX2luc3RhbmNlKGZpbGUpKSB7CisJCQkJCXZpZGVvID0gcDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR2MTM5NF9jYXJkc19sb2NrLCBmbGFncyk7CisKKwkJaWYgKCF2aWRlbykgeworCQkJZGVidWdfcHJpbnRrKCJkdjEzOTQ6IE9IQ0kgY2FyZCAlZCBub3QgZm91bmQiLCBpZWVlMTM5NF9maWxlX3RvX2luc3RhbmNlKGZpbGUpKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQqKSB2aWRlbzsKKwl9CisKKyNpZm5kZWYgRFYxMzk0X0FMTE9XX01PUkVfVEhBTl9PTkVfT1BFTgorCisJaWYgKCB0ZXN0X2FuZF9zZXRfYml0KDAsICZ2aWRlby0+b3BlbikgKSB7CisJCS8qIHZpZGVvIGlzIGFscmVhZHkgb3BlbiBieSBzb21lb25lIGVsc2UgKi8KKwkJcmV0dXJuIC1FQlVTWTsKKyAJfQorCisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZHYxMzk0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvID0gZmlsZV90b192aWRlb19jYXJkKGZpbGUpOworCisJLyogT0sgdG8gZnJlZSB0aGUgRE1BIGJ1ZmZlciwgbm8gbW9yZSBtYXBwaW5ncyBjYW4gZXhpc3QgKi8KKwlkb19kdjEzOTRfc2h1dGRvd24odmlkZW8sIDEpOworCisJLyogY2xlYW4gdXAgYXN5bmMgSS9PIHVzZXJzICovCisJZHYxMzk0X2Zhc3luYygtMSwgZmlsZSwgMCk7CisKKwkvKiBnaXZlIHNvbWVvbmUgZWxzZSBhIHR1cm4gKi8KKwljbGVhcl9iaXQoMCwgJnZpZGVvLT5vcGVuKTsKKworCXJldHVybiAwOworfQorCisKKy8qKiogREVWSUNFIERSSVZFUiBIQU5ETEVSUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGl0X3Rhc2tsZXRfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaW50IHdha2UgPSAwOworCXN0cnVjdCB2aWRlb19jYXJkICp2aWRlbyA9IChzdHJ1Y3QgdmlkZW9fY2FyZCopIGRhdGE7CisKKwlzcGluX2xvY2soJnZpZGVvLT5zcGlubG9jayk7CisKKwlpZiAoIXZpZGVvLT5kbWFfcnVubmluZykKKwkJZ290byBvdXQ7CisKKwlpcnFfcHJpbnRrKCJDb250ZXh0Q29udHJvbCA9ICUwOHgsIENvbW1hbmRQdHIgPSAlMDh4XG4iLAorCSAgICAgICByZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sU2V0KSwKKwkgICAgICAgcmVnX3JlYWQodmlkZW8tPm9oY2ksIHZpZGVvLT5vaGNpX0lzb1htaXRDb21tYW5kUHRyKQorCSAgICAgICApOworCisKKwlpZiAoICh2aWRlby0+b2hjaV9pdF9jdHggIT0gLTEpICYmCisJICAgIChyZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sU2V0KSAmICgxIDw8IDEwKSkgKSB7CisKKwkJc3RydWN0IGZyYW1lICpmOworCQl1bnNpZ25lZCBpbnQgZnJhbWUsIGk7CisKKworCQlpZiAodmlkZW8tPmFjdGl2ZV9mcmFtZSA9PSAtMSkKKwkJCWZyYW1lID0gMDsKKwkJZWxzZQorCQkJZnJhbWUgPSB2aWRlby0+YWN0aXZlX2ZyYW1lOworCisJCS8qIGNoZWNrIGFsbCB0aGUgRE1BLWFibGUgZnJhbWVzICovCisJCWZvciAoaSA9IDA7IGkgPCB2aWRlby0+bl9mcmFtZXM7IGkrKywgZnJhbWUgPSAoZnJhbWUrMSkgJSB2aWRlby0+bl9mcmFtZXMpIHsKKworCQkJaXJxX3ByaW50aygiSVJRIGNoZWNraW5nIGZyYW1lICVkLi4uIiwgZnJhbWUpOworCQkJZiA9IHZpZGVvLT5mcmFtZXNbZnJhbWVdOworCQkJaWYgKGYtPnN0YXRlICE9IEZSQU1FX1JFQURZKSB7CisJCQkJaXJxX3ByaW50aygiY2xlYXIsIHNraXBwaW5nXG4iKTsKKwkJCQkvKiB3ZSBkb24ndCBvd24gdGhpcyBmcmFtZSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpcnFfcHJpbnRrKCJETUFcbiIpOworCisJCQkvKiBjaGVjayB0aGUgZnJhbWUgYmVnaW4gc2VtYXBob3JlIHRvIHNlZSBpZiB3ZSBjYW4gZnJlZSB0aGUgcHJldmlvdXMgZnJhbWUgKi8KKwkJCWlmICggKihmLT5mcmFtZV9iZWdpbl90aW1lc3RhbXApICkgeworCQkJCWludCBwcmV2X2ZyYW1lOworCQkJCXN0cnVjdCBmcmFtZSAqcHJldl9mOworCisKKworCQkJCS8qIGRvbid0IHJlc2V0LCBuZWVkIHRoaXMgbGF0ZXIgKihmLT5mcmFtZV9iZWdpbl90aW1lc3RhbXApID0gMDsgKi8KKwkJCQlpcnFfcHJpbnRrKCIgIEJFR0lOXG4iKTsKKworCQkJCXByZXZfZnJhbWUgPSBmcmFtZSAtIDE7CisJCQkJaWYgKHByZXZfZnJhbWUgPT0gLTEpCisJCQkJCXByZXZfZnJhbWUgKz0gdmlkZW8tPm5fZnJhbWVzOworCQkJCXByZXZfZiA9IHZpZGVvLT5mcmFtZXNbcHJldl9mcmFtZV07CisKKwkJCQkvKiBtYWtlIHN1cmUgd2UgY2FuIGFjdHVhbGx5IGdhcmJhZ2UgY29sbGVjdAorCQkJCSAgIHRoaXMgZnJhbWUgKi8KKwkJCQlpZiAoIChwcmV2X2YtPnN0YXRlID09IEZSQU1FX1JFQURZKSAmJgorCQkJCSAgICBwcmV2X2YtPmRvbmUgJiYgKCFmLT5kb25lKSApCisJCQkJeworCQkJCQlmcmFtZV9yZXNldChwcmV2X2YpOworCQkJCQl2aWRlby0+bl9jbGVhcl9mcmFtZXMrKzsKKwkJCQkJd2FrZSA9IDE7CisJCQkJCXZpZGVvLT5hY3RpdmVfZnJhbWUgPSBmcmFtZTsKKworCQkJCQlpcnFfcHJpbnRrKCIgIEJFR0lOIC0gZnJlZWluZyBwcmV2aW91cyBmcmFtZSAlZCwgbmV3IGFjdGl2ZSBmcmFtZSBpcyAlZFxuIiwgcHJldl9mcmFtZSwgZnJhbWUpOworCQkJCX0gZWxzZSB7CisJCQkJCWlycV9wcmludGsoIiAgQkVHSU4gLSBjYW4ndCBmcmVlIHlldFxuIik7CisJCQkJfQorCisJCQkJZi0+ZG9uZSA9IDE7CisJCQl9CisKKworCQkJLyogc2VlIGlmIHdlIG5lZWQgdG8gc2V0IHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBuZXh0IGZyYW1lICovCisJCQlpZiAoICooZi0+bWlkX2ZyYW1lX3RpbWVzdGFtcCkgKSB7CisJCQkJc3RydWN0IGZyYW1lICpuZXh0X2ZyYW1lOworCQkJCXUzMiBiZWdpbl90cywgdHNfY3ljLCB0c19vZmY7CisKKwkJCQkqKGYtPm1pZF9mcmFtZV90aW1lc3RhbXApID0gMDsKKworCQkJCWJlZ2luX3RzID0gbGUzMl90b19jcHUoKihmLT5mcmFtZV9iZWdpbl90aW1lc3RhbXApKTsKKworCQkJCWlycV9wcmludGsoIiAgTUlERExFIC0gZmlyc3QgcGFja2V0IHdhcyBzZW50IGF0IGN5Y2xlICU0dSAoJTJ1KSwgYXNzaWduZWQgdGltZXN0YW1wIHdhcyAoJTJ1KSAlNHVcbiIsCisJCQkJCSAgIGJlZ2luX3RzICYgMHgxRkZGLCBiZWdpbl90cyAmIDB4RiwKKwkJCQkJICAgZi0+YXNzaWduZWRfdGltZXN0YW1wID4+IDEyLCBmLT5hc3NpZ25lZF90aW1lc3RhbXAgJiAweEZGRik7CisKKwkJCQkvKiBwcmVwYXJlIG5leHQgZnJhbWUgYW5kIGFzc2lnbiB0aW1lc3RhbXAgKi8KKwkJCQluZXh0X2ZyYW1lID0gdmlkZW8tPmZyYW1lc1sgKGZyYW1lKzEpICUgdmlkZW8tPm5fZnJhbWVzIF07CisKKwkJCQlpZiAobmV4dF9mcmFtZS0+c3RhdGUgPT0gRlJBTUVfUkVBRFkpIHsKKwkJCQkJaXJxX3ByaW50aygiICBNSURETEUgLSBuZXh0IGZyYW1lIGlzIHJlYWR5LCBnb29kXG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkZWJ1Z19wcmludGsoImR2MTM5NDogVW5kZXJmbG93ISBBdCBsZWFzdCBvbmUgZnJhbWUgaGFzIGJlZW4gZHJvcHBlZC5cbiIpOworCQkJCQluZXh0X2ZyYW1lID0gZjsKKwkJCQl9CisKKwkJCQkvKiBzZXQgdGhlIHRpbWVzdGFtcCB0byB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGZyYW1lIHNlbnQsCisJCQkJICAgcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0IGZyYW1lIHNlbnQsIHBsdXMgdGhlIHN5dCBsYXRlbmN5ICovCisJCQkJdHNfY3ljID0gYmVnaW5fdHMgJiAweEY7CisJCQkJLyogYWR2YW5jZSBvbmUgZnJhbWUsIHBsdXMgc3l0IGxhdGVuY3kgKHR5cGljYWxseSAyLTMpICovCisJCQkJdHNfY3ljICs9IGYtPm5fcGFja2V0cyArIHZpZGVvLT5zeXRfb2Zmc2V0IDsKKworCQkJCXRzX29mZiA9IDA7CisKKwkJCQl0c19jeWMgKz0gdHNfb2ZmLzMwNzI7CisJCQkJdHNfb2ZmICU9IDMwNzI7CisKKwkJCQluZXh0X2ZyYW1lLT5hc3NpZ25lZF90aW1lc3RhbXAgPSAoKHRzX2N5YyYweEYpIDw8IDEyKSArIHRzX29mZjsKKwkJCQlpZiAobmV4dF9mcmFtZS0+Y2lwX3N5dDEpIHsKKwkJCQkJbmV4dF9mcmFtZS0+Y2lwX3N5dDEtPmJbNl0gPSBuZXh0X2ZyYW1lLT5hc3NpZ25lZF90aW1lc3RhbXAgPj4gODsKKwkJCQkJbmV4dF9mcmFtZS0+Y2lwX3N5dDEtPmJbN10gPSBuZXh0X2ZyYW1lLT5hc3NpZ25lZF90aW1lc3RhbXAgJiAweEZGOworCQkJCX0KKwkJCQlpZiAobmV4dF9mcmFtZS0+Y2lwX3N5dDIpIHsKKwkJCQkJbmV4dF9mcmFtZS0+Y2lwX3N5dDItPmJbNl0gPSBuZXh0X2ZyYW1lLT5hc3NpZ25lZF90aW1lc3RhbXAgPj4gODsKKwkJCQkJbmV4dF9mcmFtZS0+Y2lwX3N5dDItPmJbN10gPSBuZXh0X2ZyYW1lLT5hc3NpZ25lZF90aW1lc3RhbXAgJiAweEZGOworCQkJCX0KKworCQkJfQorCisJCQkvKiBzZWUgaWYgdGhlIGZyYW1lIGxvb3BlZCAqLworCQkJaWYgKCAqKGYtPmZyYW1lX2VuZF90aW1lc3RhbXApICkgeworCisJCQkJKihmLT5mcmFtZV9lbmRfdGltZXN0YW1wKSA9IDA7CisKKwkJCQlkZWJ1Z19wcmludGsoIiAgRU5EIC0gdGhlIGZyYW1lIGxvb3BlZCBhdCBsZWFzdCBvbmNlXG4iKTsKKworCQkJCXZpZGVvLT5kcm9wcGVkX2ZyYW1lcysrOworCQkJfQorCisJCX0gLyogZm9yIChlYWNoIGZyYW1lKSAqLworCX0KKworCWlmICh3YWtlKSB7CisJCWtpbGxfZmFzeW5jKCZ2aWRlby0+ZmFzeW5jLCBTSUdJTywgUE9MTF9PVVQpOworCisJCS8qIHdha2UgcmVhZGVycy93cml0ZXJzL2lvY3RsJ2VycyAqLworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnZpZGVvLT53YWl0cSk7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2soJnZpZGVvLT5zcGlubG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGlyX3Rhc2tsZXRfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaW50IHdha2UgPSAwOworCXN0cnVjdCB2aWRlb19jYXJkICp2aWRlbyA9IChzdHJ1Y3QgdmlkZW9fY2FyZCopIGRhdGE7CisKKwlzcGluX2xvY2soJnZpZGVvLT5zcGlubG9jayk7CisKKwlpZiAoIXZpZGVvLT5kbWFfcnVubmluZykKKwkJZ290byBvdXQ7CisKKwlpZiAoICh2aWRlby0+b2hjaV9pcl9jdHggIT0gLTEpICYmCisJICAgIChyZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQpICYgKDEgPDwgMTApKSApIHsKKworCQlpbnQgc29mPTA7IC8qIHN0YXJ0LW9mLWZyYW1lIGZsYWcgKi8KKwkJc3RydWN0IGZyYW1lICpmOworCQl1MTYgcGFja2V0X2xlbmd0aCwgcGFja2V0X3RpbWU7CisJCWludCBpLCBkYmM9MDsKKwkJc3RydWN0IERNQV9kZXNjcmlwdG9yX2Jsb2NrICpibG9jayA9IE5VTEw7CisJCXUxNiB4ZmVyc3RhdHVzOworCisJCWludCBuZXh0X2ksIHByZXZfaTsKKwkJc3RydWN0IERNQV9kZXNjcmlwdG9yX2Jsb2NrICpuZXh0ID0gTlVMTDsKKwkJZG1hX2FkZHJfdCBuZXh0X2RtYSA9IDA7CisJCXN0cnVjdCBETUFfZGVzY3JpcHRvcl9ibG9jayAqcHJldiA9IE5VTEw7CisKKwkJLyogbG9vcCBvdmVyIGFsbCBkZXNjcmlwdG9ycyBpbiBhbGwgZnJhbWVzICovCisJCWZvciAoaSA9IDA7IGkgPCB2aWRlby0+bl9mcmFtZXMqTUFYX1BBQ0tFVFM7IGkrKykgeworCQkJc3RydWN0IHBhY2tldCAqcCA9IGRtYV9yZWdpb25faSgmdmlkZW8tPnBhY2tldF9idWYsIHN0cnVjdCBwYWNrZXQsIHZpZGVvLT5jdXJyZW50X3BhY2tldCk7CisKKwkJCS8qIG1ha2Ugc3VyZSB3ZSBhcmUgc2VlaW5nIHRoZSBsYXRlc3QgY2hhbmdlcyB0byBwICovCisJCQlkbWFfcmVnaW9uX3N5bmNfZm9yX2NwdSgmdmlkZW8tPnBhY2tldF9idWYsCisJCQkJCQkodW5zaWduZWQgbG9uZykgcCAtICh1bnNpZ25lZCBsb25nKSB2aWRlby0+cGFja2V0X2J1Zi5rdmlydCwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcGFja2V0KSk7CisKKwkJCXBhY2tldF9sZW5ndGggPSBsZTE2X3RvX2NwdShwLT5kYXRhX2xlbmd0aCk7CisJCQlwYWNrZXRfdGltZSAgID0gbGUxNl90b19jcHUocC0+dGltZXN0YW1wKTsKKworCQkJaXJxX3ByaW50aygicmVjZWl2ZWQgcGFja2V0ICUwMmQsIHRpbWVzdGFtcD0lMDR4LCBsZW5ndGg9JTA0eCwgc29mPSUwMnglMDJ4XG4iLCB2aWRlby0+Y3VycmVudF9wYWNrZXQsCisJCQkJICAgcGFja2V0X3RpbWUsIHBhY2tldF9sZW5ndGgsCisJCQkJICAgcC0+ZGF0YVswXSwgcC0+ZGF0YVsxXSk7CisKKwkJCS8qIGdldCB0aGUgZGVzY3JpcHRvciBiYXNlZCBvbiBwYWNrZXRfYnVmZmVyIGN1cnNvciAqLworCQkJZiA9IHZpZGVvLT5mcmFtZXNbdmlkZW8tPmN1cnJlbnRfcGFja2V0IC8gTUFYX1BBQ0tFVFNdOworCQkJYmxvY2sgPSAmKGYtPmRlc2NyaXB0b3JfcG9vbFt2aWRlby0+Y3VycmVudF9wYWNrZXQgJSBNQVhfUEFDS0VUU10pOworCQkJeGZlcnN0YXR1cyA9IGxlMzJfdG9fY3B1KGJsb2NrLT51LmluLmlsLnFbM10pID4+IDE2OworCQkJeGZlcnN0YXR1cyAmPSAweDFGOworCQkJaXJxX3ByaW50aygiaXJfdGFza2xldF9mdW5jOiB4ZmVyU3RhdHVzL3Jlc0NvdW50IFslZF0gPSAweCUwOHhcbiIsIGksIGxlMzJfdG9fY3B1KGJsb2NrLT51LmluLmlsLnFbM10pICk7CisKKwkJCS8qIGdldCB0aGUgY3VycmVudCBmcmFtZSAqLworCQkJZiA9IHZpZGVvLT5mcmFtZXNbdmlkZW8tPmFjdGl2ZV9mcmFtZV07CisKKwkJCS8qIGV4Y2x1ZGUgZW1wdHkgcGFja2V0ICovCisJCQlpZiAocGFja2V0X2xlbmd0aCA+IDggJiYgeGZlcnN0YXR1cyA9PSAweDExKSB7CisJCQkJLyogY2hlY2sgZm9yIHN0YXJ0IG9mIGZyYW1lICovCisJCQkJLyogRFJEPiBDaGFuZ2VkIHRvIGNoZWNrIHNlY3Rpb24gdHlwZSAoWzBdPj41PT0wKQorCQkJCSAgIGFuZCBkaWYgc2VxdWVuY2UgKFsxXT4+ND09MCkgKi8KKwkJCQlzb2YgPSAoIChwLT5kYXRhWzBdID4+IDUpID09IDAgJiYgKHAtPmRhdGFbMV0gPj4gNCkgPT0gMCk7CisKKwkJCQlkYmMgPSAoaW50KSAocC0+Y2lwX2gxID4+IDI0KTsKKwkJCQlpZiAoIHZpZGVvLT5jb250aW51aXR5X2NvdW50ZXIgIT0gLTEgJiYgZGJjID4gKCh2aWRlby0+Y29udGludWl0eV9jb3VudGVyICsgMSkgJSAyNTYpICkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImR2MTM5NDogZGlzY29udGludWl0eSBkZXRlY3RlZCwgZHJvcHBpbmcgYWxsIGZyYW1lc1xuIiApOworCQkJCQl2aWRlby0+ZHJvcHBlZF9mcmFtZXMgKz0gdmlkZW8tPm5fY2xlYXJfZnJhbWVzICsgMTsKKwkJCQkJdmlkZW8tPmZpcnN0X2ZyYW1lID0gMDsKKwkJCQkJdmlkZW8tPm5fY2xlYXJfZnJhbWVzID0gMDsKKwkJCQkJdmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lID0gLTE7CisJCQkJfQorCQkJCXZpZGVvLT5jb250aW51aXR5X2NvdW50ZXIgPSBkYmM7CisKKwkJCQlpZiAoIXZpZGVvLT5maXJzdF9mcmFtZSkgeworCQkJCQlpZiAoc29mKSB7CisJCQkJCQl2aWRlby0+Zmlyc3RfZnJhbWUgPSAxOworCQkJCQl9CisKKwkJCQl9IGVsc2UgaWYgKHNvZikgeworCQkJCQkvKiBjbG9zZSBjdXJyZW50IGZyYW1lICovCisJCQkJCWZyYW1lX3Jlc2V0KGYpOyAgLyogZi0+c3RhdGUgPSBTVEFURV9DTEVBUiAqLworCQkJCQl2aWRlby0+bl9jbGVhcl9mcmFtZXMrKzsKKwkJCQkJaWYgKHZpZGVvLT5uX2NsZWFyX2ZyYW1lcyA+IHZpZGVvLT5uX2ZyYW1lcykgeworCQkJCQkJdmlkZW8tPmRyb3BwZWRfZnJhbWVzKys7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJkdjEzOTQ6IGRyb3BwZWQgYSBmcmFtZSBkdXJpbmcgcmVjZXB0aW9uXG4iICk7CisJCQkJCQl2aWRlby0+bl9jbGVhcl9mcmFtZXMgPSB2aWRlby0+bl9mcmFtZXMtMTsKKwkJCQkJCXZpZGVvLT5maXJzdF9jbGVhcl9mcmFtZSA9ICh2aWRlby0+Zmlyc3RfY2xlYXJfZnJhbWUgKyAxKSAlIHZpZGVvLT5uX2ZyYW1lczsKKwkJCQkJfQorCQkJCQlpZiAodmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lID09IC0xKQorCQkJCQkJdmlkZW8tPmZpcnN0X2NsZWFyX2ZyYW1lID0gdmlkZW8tPmFjdGl2ZV9mcmFtZTsKKworCQkJCQkvKiBnZXQgdGhlIG5leHQgZnJhbWUgKi8KKwkJCQkJdmlkZW8tPmFjdGl2ZV9mcmFtZSA9ICh2aWRlby0+YWN0aXZlX2ZyYW1lICsgMSkgJSB2aWRlby0+bl9mcmFtZXM7CisJCQkJCWYgPSB2aWRlby0+ZnJhbWVzW3ZpZGVvLT5hY3RpdmVfZnJhbWVdOworCQkJCQlpcnFfcHJpbnRrKCIgICBmcmFtZSByZWNlaXZlZCwgYWN0aXZlX2ZyYW1lID0gJWQsIG5fY2xlYXJfZnJhbWVzID0gJWQsIGZpcnN0X2NsZWFyX2ZyYW1lID0gJWRcbiIsCisJCQkJCQkgICB2aWRlby0+YWN0aXZlX2ZyYW1lLCB2aWRlby0+bl9jbGVhcl9mcmFtZXMsIHZpZGVvLT5maXJzdF9jbGVhcl9mcmFtZSk7CisJCQkJfQorCQkJCWlmICh2aWRlby0+Zmlyc3RfZnJhbWUpIHsKKwkJCQkJaWYgKHNvZikgeworCQkJCQkJLyogb3BlbiBuZXh0IGZyYW1lICovCisJCQkJCQlmLT5zdGF0ZSA9IEZSQU1FX1JFQURZOworCQkJCQl9CisKKwkJCQkJLyogY29weSB0byBidWZmZXIgKi8KKwkJCQkJaWYgKGYtPm5fcGFja2V0cyA+ICh2aWRlby0+ZnJhbWVfc2l6ZSAvIDQ4MCkpIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAiZnJhbWUgYnVmZmVyIG92ZXJmbG93IGR1cmluZyByZWNlaXZlXG4iKTsKKwkJCQkJfQorCisJCQkJCWZyYW1lX3B1dF9wYWNrZXQoZiwgcCk7CisKKwkJCQl9IC8qIGZpcnN0X2ZyYW1lICovCisJCQl9CisKKwkJCS8qIHN0b3AsIGVuZCBvZiByZWFkeSBwYWNrZXRzICovCisJCQllbHNlIGlmICh4ZmVyc3RhdHVzID09IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogcmVzZXQgeGZlclN0YXR1cyAmIHJlc0NvdW50ICovCisJCQlibG9jay0+dS5pbi5pbC5xWzNdID0gY3B1X3RvX2xlMzIoNTEyKTsKKworCQkJLyogdGVybWluYXRlIGRtYSBjaGFpbiBhdCB0aGlzIChuZXh0KSBwYWNrZXQgKi8KKwkJCW5leHRfaSA9IHZpZGVvLT5jdXJyZW50X3BhY2tldDsKKwkJCWYgPSB2aWRlby0+ZnJhbWVzW25leHRfaSAvIE1BWF9QQUNLRVRTXTsKKwkJCW5leHQgPSAmKGYtPmRlc2NyaXB0b3JfcG9vbFtuZXh0X2kgJSBNQVhfUEFDS0VUU10pOworCQkJbmV4dF9kbWEgPSAoKHVuc2lnbmVkIGxvbmcpIGJsb2NrIC0gKHVuc2lnbmVkIGxvbmcpIGYtPmRlc2NyaXB0b3JfcG9vbCkgKyBmLT5kZXNjcmlwdG9yX3Bvb2xfZG1hOworCQkJbmV4dC0+dS5pbi5pbC5xWzBdIHw9IDMgPDwgMjA7IC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJCW5leHQtPnUuaW4uaWwucVsyXSA9IDA7IC8qIGRpc2FibGUgYnJhbmNoICovCisKKwkJCS8qIGxpbmsgcHJldmlvdXMgdG8gbmV4dCAqLworCQkJcHJldl9pID0gKG5leHRfaSA9PSAwKSA/IChNQVhfUEFDS0VUUyAqIHZpZGVvLT5uX2ZyYW1lcyAtIDEpIDogKG5leHRfaSAtIDEpOworCQkJZiA9IHZpZGVvLT5mcmFtZXNbcHJldl9pIC8gTUFYX1BBQ0tFVFNdOworCQkJcHJldiA9ICYoZi0+ZGVzY3JpcHRvcl9wb29sW3ByZXZfaSAlIE1BWF9QQUNLRVRTXSk7CisJCQlpZiAocHJldl9pICUgKE1BWF9QQUNLRVRTLzIpKSB7CisJCQkJcHJldi0+dS5pbi5pbC5xWzBdICY9IH4oMyA8PCAyMCk7IC8qIG5vIGludGVycnVwdCAqLworCQkJfSBlbHNlIHsKKwkJCQlwcmV2LT51LmluLmlsLnFbMF0gfD0gMyA8PCAyMDsgLyogZW5hYmxlIGludGVycnVwdCAqLworCQkJfQorCQkJcHJldi0+dS5pbi5pbC5xWzJdID0gY3B1X3RvX2xlMzIobmV4dF9kbWEgfCAxKTsgLyogc2V0IFo9MSAqLworCQkJd21iKCk7CisKKwkJCS8qIHdha2UgdXAgRE1BIGluIGNhc2UgaXQgZmVsbCBhc2xlZXAgKi8KKwkJCXJlZ193cml0ZSh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQsICgxIDw8IDEyKSk7CisKKwkJCS8qIGFkdmFuY2UgcGFja2V0X2J1ZmZlciBjdXJzb3IgKi8KKwkJCXZpZGVvLT5jdXJyZW50X3BhY2tldCA9ICh2aWRlby0+Y3VycmVudF9wYWNrZXQgKyAxKSAlIChNQVhfUEFDS0VUUyAqIHZpZGVvLT5uX2ZyYW1lcyk7CisKKwkJfSAvKiBmb3IgYWxsIHBhY2tldHMgKi8KKworCQl3YWtlID0gMTsgLyogd2h5IHRoZSBoZWxsIG5vdD8gKi8KKworCX0gLyogcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKworCWlmICh3YWtlKSB7CisJCWtpbGxfZmFzeW5jKCZ2aWRlby0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisKKwkJLyogd2FrZSByZWFkZXJzL3dyaXRlcnMvaW9jdGwnZXJzICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmlkZW8tPndhaXRxKTsKKwl9CisKK291dDoKKwlzcGluX3VubG9jaygmdmlkZW8tPnNwaW5sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBjZGV2IGR2MTM5NF9jZGV2Oworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZHYxMzk0X2ZvcHM9Cit7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnBvbGwgPSAgICAgICAgIGR2MTM5NF9wb2xsLAorCS51bmxvY2tlZF9pb2N0bCA9IGR2MTM5NF9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9IGR2MTM5NF9jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkubW1hcCA9CQlkdjEzOTRfbW1hcCwKKwkub3BlbiA9CQlkdjEzOTRfb3BlbiwKKwkud3JpdGUgPSAgICAgICAgZHYxMzk0X3dyaXRlLAorCS5yZWFkID0gICAgICAgICBkdjEzOTRfcmVhZCwKKwkucmVsZWFzZSA9CWR2MTM5NF9yZWxlYXNlLAorCS5mYXN5bmMgPSAgICAgICBkdjEzOTRfZmFzeW5jLAorfTsKKworCisvKioqIEhPVFBMVUcgU1RVRkYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBFeHBvcnQgaW5mb3JtYXRpb24gYWJvdXQgcHJvdG9jb2xzL2RldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLgorICovCitzdGF0aWMgc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCBkdjEzOTRfaWRfdGFibGVbXSA9IHsKKwl7CisJCS5tYXRjaF9mbGFncwk9IElFRUUxMzk0X01BVENIX1NQRUNJRklFUl9JRCB8IElFRUUxMzk0X01BVENIX1ZFUlNJT04sCisJCS5zcGVjaWZpZXJfaWQJPSBBVkNfVU5JVF9TUEVDX0lEX0VOVFJZICYgMHhmZmZmZmYsCisJCS52ZXJzaW9uCT0gQVZDX1NXX1ZFUlNJT05fRU5UUlkgJiAweGZmZmZmZgorCX0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGllZWUxMzk0LCBkdjEzOTRfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyIGR2MTM5NF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIkRWLzEzOTQgRHJpdmVyIiwKKwkuaWRfdGFibGUJPSBkdjEzOTRfaWRfdGFibGUsCisJLmRyaXZlciAgICAgICAgID0geworCQkubmFtZQk9ICJkdjEzOTQiLAorCQkuYnVzCT0gJmllZWUxMzk0X2J1c190eXBlLAorCX0sCit9OworCisKKy8qKiogSUVFRTEzOTQgSFBTQiBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZHYxMzk0X2luaXQoc3RydWN0IHRpX29oY2kgKm9oY2ksIGVudW0gcGFsX29yX250c2MgZm9ybWF0LCBlbnVtIG1vZGVzIG1vZGUpCit7CisJc3RydWN0IHZpZGVvX2NhcmQgKnZpZGVvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwl2aWRlbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWRlb19jYXJkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2aWRlbykgeworCQlwcmludGsoS0VSTl9FUlIgImR2MTM5NDogY2Fubm90IGFsbG9jYXRlIHZpZGVvX2NhcmRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwltZW1zZXQodmlkZW8sIDAsIHNpemVvZihzdHJ1Y3QgdmlkZW9fY2FyZCkpOworCisJdmlkZW8tPm9oY2kgPSBvaGNpOworCS8qIGxvd2VyIDIgYml0cyBvZiBpZCBpbmRpY2F0ZSB3aGljaCBvZiBmb3VyICJwbHVncyIKKwkgICBwZXIgaG9zdCAqLworCXZpZGVvLT5pZCA9IG9oY2ktPmhvc3QtPmlkIDw8IDI7CisJaWYgKGZvcm1hdCA9PSBEVjEzOTRfTlRTQykKKwkJdmlkZW8tPmlkIHw9IG1vZGU7CisJZWxzZQorCQl2aWRlby0+aWQgfD0gMiArIG1vZGU7CisKKwl2aWRlby0+b2hjaV9pdF9jdHggPSAtMTsKKwl2aWRlby0+b2hjaV9pcl9jdHggPSAtMTsKKworCXZpZGVvLT5vaGNpX0lzb1htaXRDb250ZXh0Q29udHJvbFNldCA9IDA7CisJdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sQ2xlYXIgPSAwOworCXZpZGVvLT5vaGNpX0lzb1htaXRDb21tYW5kUHRyID0gMDsKKworCXZpZGVvLT5vaGNpX0lzb1JjdkNvbnRleHRDb250cm9sU2V0ID0gMDsKKwl2aWRlby0+b2hjaV9Jc29SY3ZDb250ZXh0Q29udHJvbENsZWFyID0gMDsKKwl2aWRlby0+b2hjaV9Jc29SY3ZDb21tYW5kUHRyID0gMDsKKwl2aWRlby0+b2hjaV9Jc29SY3ZDb250ZXh0TWF0Y2ggPSAwOworCisJdmlkZW8tPm5fZnJhbWVzID0gMDsgLyogZmxhZyB0aGF0IHZpZGVvIGlzIG5vdCBpbml0aWFsaXplZCAqLworCXZpZGVvLT5jaGFubmVsID0gNjM7IC8qIGRlZmF1bHQgdG8gYnJvYWRjYXN0IGNoYW5uZWwgKi8KKwl2aWRlby0+YWN0aXZlX2ZyYW1lID0gLTE7CisKKwkvKiBpbml0aWFsaXplIHRoZSBmb2xsb3dpbmcgKi8KKwl2aWRlby0+cGFsX29yX250c2MgPSBmb3JtYXQ7CisJdmlkZW8tPmNpcF9uID0gMDsgLyogMCA9IHVzZSBidWlsdGluIGRlZmF1bHQgKi8KKwl2aWRlby0+Y2lwX2QgPSAwOworCXZpZGVvLT5zeXRfb2Zmc2V0ID0gMDsKKwl2aWRlby0+bW9kZSA9IG1vZGU7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFYxMzk0X01BWF9GUkFNRVM7IGkrKykKKwkJdmlkZW8tPmZyYW1lc1tpXSA9IE5VTEw7CisKKwlkbWFfcmVnaW9uX2luaXQoJnZpZGVvLT5kdl9idWYpOworCXZpZGVvLT5kdl9idWZfc2l6ZSA9IDA7CisJZG1hX3JlZ2lvbl9pbml0KCZ2aWRlby0+cGFja2V0X2J1Zik7CisJdmlkZW8tPnBhY2tldF9idWZfc2l6ZSA9IDA7CisKKwljbGVhcl9iaXQoMCwgJnZpZGVvLT5vcGVuKTsKKwlzcGluX2xvY2tfaW5pdCgmdmlkZW8tPnNwaW5sb2NrKTsKKwl2aWRlby0+ZG1hX3J1bm5pbmcgPSAwOworCWluaXRfTVVURVgoJnZpZGVvLT5zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZpZGVvLT53YWl0cSk7CisJdmlkZW8tPmZhc3luYyA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHYxMzk0X2NhcmRzX2xvY2ssIGZsYWdzKTsKKwlJTklUX0xJU1RfSEVBRCgmdmlkZW8tPmxpc3QpOworCWxpc3RfYWRkX3RhaWwoJnZpZGVvLT5saXN0LCAmZHYxMzk0X2NhcmRzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkdjEzOTRfY2FyZHNfbG9jaywgZmxhZ3MpOworCisJaWYgKGRldmZzX21rX2NkZXYoTUtERVYoSUVFRTEzOTRfTUFKT1IsCisJCQkJSUVFRTEzOTRfTUlOT1JfQkxPQ0tfRFYxMzk0KjE2ICsgdmlkZW8tPmlkKSwKKwkJCVNfSUZDSFJ8U19JUlVHT3xTX0lXVUdPLAorCQkJICJpZWVlMTM5NC9kdi9ob3N0JWQvJXMvJXMiLAorCQkJICh2aWRlby0+aWQ+PjIpLAorCQkJICh2aWRlby0+cGFsX29yX250c2MgPT0gRFYxMzk0X05UU0MgPyAiTlRTQyIgOiAiUEFMIiksCisJCQkgKHZpZGVvLT5tb2RlID09IE1PREVfUkVDRUlWRSA/ICJpbiIgOiAib3V0IikpIDwgMCkKKwkJCWdvdG8gZXJyX2ZyZWU7CisKKwlkZWJ1Z19wcmludGsoImR2MTM5NDogZHYxMzk0X2luaXQoKSBPSyBvbiBJRCAlZFxuIiwgdmlkZW8tPmlkKTsKKworCXJldHVybiAwOworCisgZXJyX2ZyZWU6CisJa2ZyZWUodmlkZW8pOworIGVycjoKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGR2MTM5NF91bl9pbml0KHN0cnVjdCB2aWRlb19jYXJkICp2aWRlbykKK3sKKwljaGFyIGJ1ZlszMl07CisKKwkvKiBvYnZpb3VzbHkgbm9ib2R5IGhhcyB0aGUgZHJpdmVyIG9wZW4gYXQgdGhpcyBwb2ludCAqLworCWRvX2R2MTM5NF9zaHV0ZG93bih2aWRlbywgMSk7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImR2L2hvc3QlZC8lcy8lcyIsICh2aWRlby0+aWQgPj4gMiksCisJCSh2aWRlby0+cGFsX29yX250c2MgPT0gRFYxMzk0X05UU0MgPyAiTlRTQyIgOiAiUEFMIiksCisJCSh2aWRlby0+bW9kZSA9PSBNT0RFX1JFQ0VJVkUgPyAiaW4iIDogIm91dCIpCisJCSk7CisKKwlkZXZmc19yZW1vdmUoImllZWUxMzk0LyVzIiwgYnVmKTsKKwlrZnJlZSh2aWRlbyk7Cit9CisKKworc3RhdGljIHZvaWQgZHYxMzk0X3JlbW92ZV9ob3N0IChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworCXN0cnVjdCB2aWRlb19jYXJkICp2aWRlbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpZCA9IGhvc3QtPmlkOworCisJLyogV2Ugb25seSB3b3JrIHdpdGggdGhlIE9IQ0ktMTM5NCBkcml2ZXIgKi8KKwlpZiAoc3RyY21wKGhvc3QtPmRyaXZlci0+bmFtZSwgT0hDSTEzOTRfRFJJVkVSX05BTUUpKQorCQlyZXR1cm47CisKKwkvKiBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIHZpZGVvX2NhcmRzICovCisJZG8geworCQlzdHJ1Y3QgdmlkZW9fY2FyZCAqdG1wX3ZpZDsKKworCQl2aWRlbyA9IE5VTEw7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmR2MTM5NF9jYXJkc19sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wX3ZpZCwgJmR2MTM5NF9jYXJkcywgbGlzdCkgeworCQkJaWYgKCh0bXBfdmlkLT5pZCA+PiAyKSA9PSBpZCkgeworCQkJCWxpc3RfZGVsKCZ0bXBfdmlkLT5saXN0KTsKKwkJCQl2aWRlbyA9IHRtcF92aWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHYxMzk0X2NhcmRzX2xvY2ssIGZsYWdzKTsKKworCQlpZiAodmlkZW8pCisJCQlkdjEzOTRfdW5faW5pdCh2aWRlbyk7CisJfSB3aGlsZSAodmlkZW8gIT0gTlVMTCk7CisKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVigKKwkJSUVFRTEzOTRfTUFKT1IsIElFRUUxMzk0X01JTk9SX0JMT0NLX0RWMTM5NCAqIDE2ICsgKGlkPDwyKSkpOworCWRldmZzX3JlbW92ZSgiaWVlZTEzOTQvZHYvaG9zdCVkL05UU0MiLCBpZCk7CisJZGV2ZnNfcmVtb3ZlKCJpZWVlMTM5NC9kdi9ob3N0JWQvUEFMIiwgaWQpOworCWRldmZzX3JlbW92ZSgiaWVlZTEzOTQvZHYvaG9zdCVkIiwgaWQpOworfQorCitzdGF0aWMgdm9pZCBkdjEzOTRfYWRkX2hvc3QgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IHRpX29oY2kgKm9oY2k7CisJaW50IGlkID0gaG9zdC0+aWQ7CisKKwkvKiBXZSBvbmx5IHdvcmsgd2l0aCB0aGUgT0hDSS0xMzk0IGRyaXZlciAqLworCWlmIChzdHJjbXAoaG9zdC0+ZHJpdmVyLT5uYW1lLCBPSENJMTM5NF9EUklWRVJfTkFNRSkpCisJCXJldHVybjsKKworCW9oY2kgPSAoc3RydWN0IHRpX29oY2kgKilob3N0LT5ob3N0ZGF0YTsKKworCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKGhwc2JfcHJvdG9jb2xfY2xhc3MsIE1LREVWKAorCQlJRUVFMTM5NF9NQUpPUiwJSUVFRTEzOTRfTUlOT1JfQkxPQ0tfRFYxMzk0ICogMTYgKyAoaWQ8PDIpKSwgCisJCU5VTEwsICJkdjEzOTQtJWQiLCBpZCk7CisJZGV2ZnNfbWtfZGlyKCJpZWVlMTM5NC9kdi9ob3N0JWQiLCBpZCk7CisJZGV2ZnNfbWtfZGlyKCJpZWVlMTM5NC9kdi9ob3N0JWQvTlRTQyIsIGlkKTsKKwlkZXZmc19ta19kaXIoImllZWUxMzk0L2R2L2hvc3QlZC9QQUwiLCBpZCk7CisKKwlkdjEzOTRfaW5pdChvaGNpLCBEVjEzOTRfTlRTQywgTU9ERV9SRUNFSVZFKTsKKwlkdjEzOTRfaW5pdChvaGNpLCBEVjEzOTRfTlRTQywgTU9ERV9UUkFOU01JVCk7CisJZHYxMzk0X2luaXQob2hjaSwgRFYxMzk0X1BBTCwgTU9ERV9SRUNFSVZFKTsKKwlkdjEzOTRfaW5pdChvaGNpLCBEVjEzOTRfUEFMLCBNT0RFX1RSQU5TTUlUKTsKK30KKworCisvKiBCdXMgcmVzZXQgaGFuZGxlci4gSW4gdGhlIGV2ZW50IG9mIGEgYnVzIHJlc2V0LCB3ZSBtYXkgbmVlZCB0bworICAgcmUtc3RhcnQgdGhlIERNQSBjb250ZXh0cyAtIG90aGVyd2lzZSB0aGUgdXNlciBwcm9ncmFtIHdvdWxkCisgICBlbmQgdXAgd2FpdGluZyBmb3JldmVyLgorKi8KKworc3RhdGljIHZvaWQgZHYxMzk0X2hvc3RfcmVzZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaTsKKwlzdHJ1Y3QgdmlkZW9fY2FyZCAqdmlkZW8gPSBOVUxMLCAqdG1wX3ZpZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogV2Ugb25seSB3b3JrIHdpdGggdGhlIE9IQ0ktMTM5NCBkcml2ZXIgKi8KKwlpZiAoc3RyY21wKGhvc3QtPmRyaXZlci0+bmFtZSwgT0hDSTEzOTRfRFJJVkVSX05BTUUpKQorCQlyZXR1cm47CisKKwlvaGNpID0gKHN0cnVjdCB0aV9vaGNpICopaG9zdC0+aG9zdGRhdGE7CisKKworCS8qIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgdmlkZW9fY2FyZHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHYxMzk0X2NhcmRzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF92aWQsICZkdjEzOTRfY2FyZHMsIGxpc3QpIHsKKwkJaWYgKCh0bXBfdmlkLT5pZCA+PiAyKSA9PSBob3N0LT5pZCkgeworCQkJdmlkZW8gPSB0bXBfdmlkOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHYxMzk0X2NhcmRzX2xvY2ssIGZsYWdzKTsKKworCWlmICghdmlkZW8pCisJCXJldHVybjsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpZGVvLT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKCF2aWRlby0+ZG1hX3J1bm5pbmcpCisJCWdvdG8gb3V0OworCisJLyogY2hlY2sgSVQgY29udGV4dCAqLworCWlmICh2aWRlby0+b2hjaV9pdF9jdHggIT0gLTEpIHsKKwkJdTMyIGN0eDsKKworCQljdHggPSByZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvWG1pdENvbnRleHRDb250cm9sU2V0KTsKKworCQkvKiBpZiAoUlVOIGJ1dCBub3QgQUNUSVZFKSAqLworCQlpZiAoIChjdHggJiAoMTw8MTUpKSAmJgorCQkgICAgIShjdHggJiAoMTw8MTApKSApIHsKKworCQkJZGVidWdfcHJpbnRrKCJkdjEzOTQ6IElUIGNvbnRleHQgc3RvcHBlZCBkdWUgdG8gYnVzIHJlc2V0OyB3YWtpbmcgaXQgdXBcbiIpOworCisJCQkvKiB0byBiZSBzYWZlLCBhc3N1bWUgYSBmcmFtZSBoYXMgYmVlbiBkcm9wcGVkLiBVc2VyLXNwYWNlIHByb2dyYW1zCisJCQkgICBzaG91bGQgaGFuZGxlIHRoaXMgY29uZGl0aW9uIGxpa2UgYW4gdW5kZXJmbG93LiAqLworCQkJdmlkZW8tPmRyb3BwZWRfZnJhbWVzKys7CisKKwkJCS8qIGZvciBzb21lIHJlYXNvbiB5b3UgbXVzdCBjbGVhciwgdGhlbiByZS1zZXQgdGhlIFJVTiBiaXQgdG8gcmVzdGFydCBETUEgKi8KKworCQkJLyogY2xlYXIgUlVOICovCisJCQlyZWdfd3JpdGUodmlkZW8tPm9oY2ksIHZpZGVvLT5vaGNpX0lzb1htaXRDb250ZXh0Q29udHJvbENsZWFyLCAoMSA8PCAxNSkpOworCQkJZmx1c2hfcGNpX3dyaXRlKHZpZGVvLT5vaGNpKTsKKworCQkJLyogc2V0IFJVTiAqLworCQkJcmVnX3dyaXRlKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29YbWl0Q29udGV4dENvbnRyb2xTZXQsICgxIDw8IDE1KSk7CisJCQlmbHVzaF9wY2lfd3JpdGUodmlkZW8tPm9oY2kpOworCisJCQkvKiBzZXQgdGhlIFdBS0UgYml0IChqdXN0IGluIGNhc2U7IHRoaXMgaXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5KSAqLworCQkJcmVnX3dyaXRlKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29YbWl0Q29udGV4dENvbnRyb2xTZXQsICgxIDw8IDEyKSk7CisJCQlmbHVzaF9wY2lfd3JpdGUodmlkZW8tPm9oY2kpOworCisJCQlpcnFfcHJpbnRrKCJkdjEzOTQ6IEFGVEVSIElUIHJlc3RhcnQgY3R4IDB4JTA4eCBwdHIgMHglMDh4XG4iLAorCQkJCSAgIHJlZ19yZWFkKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29YbWl0Q29udGV4dENvbnRyb2xTZXQpLAorCQkJCSAgIHJlZ19yZWFkKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29YbWl0Q29tbWFuZFB0cikpOworCQl9CisJfQorCisJLyogY2hlY2sgSVIgY29udGV4dCAqLworCWlmICh2aWRlby0+b2hjaV9pcl9jdHggIT0gLTEpIHsKKwkJdTMyIGN0eDsKKworCQljdHggPSByZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQpOworCisJCS8qIGlmIChSVU4gYnV0IG5vdCBBQ1RJVkUpICovCisJCWlmICggKGN0eCAmICgxPDwxNSkpICYmCisJCSAgICAhKGN0eCAmICgxPDwxMCkpICkgeworCisJCQlkZWJ1Z19wcmludGsoImR2MTM5NDogSVIgY29udGV4dCBzdG9wcGVkIGR1ZSB0byBidXMgcmVzZXQ7IHdha2luZyBpdCB1cFxuIik7CisKKwkJCS8qIHRvIGJlIHNhZmUsIGFzc3VtZSBhIGZyYW1lIGhhcyBiZWVuIGRyb3BwZWQuIFVzZXItc3BhY2UgcHJvZ3JhbXMKKwkJCSAgIHNob3VsZCBoYW5kbGUgdGhpcyBjb25kaXRpb24gbGlrZSBhbiBvdmVyZmxvdy4gKi8KKwkJCXZpZGVvLT5kcm9wcGVkX2ZyYW1lcysrOworCisJCQkvKiBmb3Igc29tZSByZWFzb24geW91IG11c3QgY2xlYXIsIHRoZW4gcmUtc2V0IHRoZSBSVU4gYml0IHRvIHJlc3RhcnQgRE1BICovCisJCQkvKiBYWFggdGhpcyBkb2Vzbid0IHdvcmsgZm9yIG1lLCBJIGNhbid0IGdldCBJUiBETUEgdG8gcmVzdGFydCA6WyAqLworCisJCQkvKiBjbGVhciBSVU4gKi8KKwkJCXJlZ193cml0ZSh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xDbGVhciwgKDEgPDwgMTUpKTsKKwkJCWZsdXNoX3BjaV93cml0ZSh2aWRlby0+b2hjaSk7CisKKwkJCS8qIHNldCBSVU4gKi8KKwkJCXJlZ193cml0ZSh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQsICgxIDw8IDE1KSk7CisJCQlmbHVzaF9wY2lfd3JpdGUodmlkZW8tPm9oY2kpOworCisJCQkvKiBzZXQgdGhlIFdBS0UgYml0IChqdXN0IGluIGNhc2U7IHRoaXMgaXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5KSAqLworCQkJcmVnX3dyaXRlKHZpZGVvLT5vaGNpLCB2aWRlby0+b2hjaV9Jc29SY3ZDb250ZXh0Q29udHJvbFNldCwgKDEgPDwgMTIpKTsKKwkJCWZsdXNoX3BjaV93cml0ZSh2aWRlby0+b2hjaSk7CisKKwkJCWlycV9wcmludGsoImR2MTM5NDogQUZURVIgSVIgcmVzdGFydCBjdHggMHglMDh4IHB0ciAweCUwOHhcbiIsCisJCQkJICAgcmVnX3JlYWQodmlkZW8tPm9oY2ksIHZpZGVvLT5vaGNpX0lzb1JjdkNvbnRleHRDb250cm9sU2V0KSwKKwkJCQkgICByZWdfcmVhZCh2aWRlby0+b2hjaSwgdmlkZW8tPm9oY2lfSXNvUmN2Q29tbWFuZFB0cikpOworCQl9CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlkZW8tPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiB3YWtlIHJlYWRlcnMvd3JpdGVycy9pb2N0bCdlcnMgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnZpZGVvLT53YWl0cSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgZHYxMzk0X2hpZ2hsZXZlbCA9IHsKKwkubmFtZSA9CQkiZHYxMzk0IiwKKwkuYWRkX2hvc3QgPQlkdjEzOTRfYWRkX2hvc3QsCisJLnJlbW92ZV9ob3N0ID0JZHYxMzk0X3JlbW92ZV9ob3N0LAorCS5ob3N0X3Jlc2V0ID0gICBkdjEzOTRfaG9zdF9yZXNldCwKK307CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisKKyNkZWZpbmUgRFYxMzk0X0lPQzMyX0lOSVQgICAgICAgX0lPVygnIycsIDB4MDYsIHN0cnVjdCBkdjEzOTRfaW5pdDMyKQorI2RlZmluZSBEVjEzOTRfSU9DMzJfR0VUX1NUQVRVUyBfSU9SKCcjJywgMHgwYywgc3RydWN0IGR2MTM5NF9zdGF0dXMzMikKKworc3RydWN0IGR2MTM5NF9pbml0MzIgeworCXUzMiBhcGlfdmVyc2lvbjsKKwl1MzIgY2hhbm5lbDsKKwl1MzIgbl9mcmFtZXM7CisJdTMyIGZvcm1hdDsKKwl1MzIgY2lwX247CisJdTMyIGNpcF9kOworCXUzMiBzeXRfb2Zmc2V0OworfTsKKworc3RydWN0IGR2MTM5NF9zdGF0dXMzMiB7CisJc3RydWN0IGR2MTM5NF9pbml0MzIgaW5pdDsKKwlzMzIgYWN0aXZlX2ZyYW1lOworCXUzMiBmaXJzdF9jbGVhcl9mcmFtZTsKKwl1MzIgbl9jbGVhcl9mcmFtZXM7CisJdTMyIGRyb3BwZWRfZnJhbWVzOworfTsKKworLyogUkVELVBFTjogdGhpcyBzaG91bGQgdXNlIGNvbXBhdF9hbGxvY191c2Vyc3BhY2UgaW5zdGVhZCAqLworCitzdGF0aWMgaW50IGhhbmRsZV9kdjEzOTRfaW5pdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGR2MTM5NF9pbml0MzIgZHYzMjsKKwlzdHJ1Y3QgZHYxMzk0X2luaXQgZHY7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwlpbnQgcmV0OworCisJaWYgKGZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsICE9IGR2MTM5NF9pb2N0bCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmR2MzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGR2MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkdi5hcGlfdmVyc2lvbiA9IGR2MzIuYXBpX3ZlcnNpb247CisJZHYuY2hhbm5lbCA9IGR2MzIuY2hhbm5lbDsKKwlkdi5uX2ZyYW1lcyA9IGR2MzIubl9mcmFtZXM7CisJZHYuZm9ybWF0ID0gZHYzMi5mb3JtYXQ7CisJZHYuY2lwX24gPSAodW5zaWduZWQgbG9uZylkdjMyLmNpcF9uOworCWR2LmNpcF9kID0gKHVuc2lnbmVkIGxvbmcpZHYzMi5jaXBfZDsKKwlkdi5zeXRfb2Zmc2V0ID0gZHYzMi5zeXRfb2Zmc2V0OworCisJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJcmV0ID0gZHYxMzk0X2lvY3RsKGZpbGUsIERWMTM5NF9JT0NfSU5JVCwgKHVuc2lnbmVkIGxvbmcpJmR2KTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2R2MTM5NF9nZXRfc3RhdHVzKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZHYxMzk0X3N0YXR1czMyIGR2MzI7CisJc3RydWN0IGR2MTM5NF9zdGF0dXMgZHY7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwlpbnQgcmV0OworCisJaWYgKGZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsICE9IGR2MTM5NF9pb2N0bCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlyZXQgPSBkdjEzOTRfaW9jdGwoZmlsZSwgRFYxMzk0X0lPQ19HRVRfU1RBVFVTLCAodW5zaWduZWQgbG9uZykmZHYpOworCXNldF9mcyhvbGRfZnMpOworCisJaWYgKCFyZXQpIHsKKwkJZHYzMi5pbml0LmFwaV92ZXJzaW9uID0gZHYuaW5pdC5hcGlfdmVyc2lvbjsKKwkJZHYzMi5pbml0LmNoYW5uZWwgPSBkdi5pbml0LmNoYW5uZWw7CisJCWR2MzIuaW5pdC5uX2ZyYW1lcyA9IGR2LmluaXQubl9mcmFtZXM7CisJCWR2MzIuaW5pdC5mb3JtYXQgPSBkdi5pbml0LmZvcm1hdDsKKwkJZHYzMi5pbml0LmNpcF9uID0gKHUzMilkdi5pbml0LmNpcF9uOworCQlkdjMyLmluaXQuY2lwX2QgPSAodTMyKWR2LmluaXQuY2lwX2Q7CisJCWR2MzIuaW5pdC5zeXRfb2Zmc2V0ID0gZHYuaW5pdC5zeXRfb2Zmc2V0OworCQlkdjMyLmFjdGl2ZV9mcmFtZSA9IGR2LmFjdGl2ZV9mcmFtZTsKKwkJZHYzMi5maXJzdF9jbGVhcl9mcmFtZSA9IGR2LmZpcnN0X2NsZWFyX2ZyYW1lOworCQlkdjMyLm5fY2xlYXJfZnJhbWVzID0gZHYubl9jbGVhcl9mcmFtZXM7CisJCWR2MzIuZHJvcHBlZF9mcmFtZXMgPSBkdi5kcm9wcGVkX2ZyYW1lczsKKworCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgZHYxMzk0X3N0YXR1czMyIF9fdXNlciAqKWFyZywgJmR2MzIsIHNpemVvZihkdjMyKSkpCisJCQlyZXQgPSAtRUZBVUxUOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworCitzdGF0aWMgbG9uZyBkdjEzOTRfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBEVjEzOTRfSU9DX1NIVVRET1dOOgorCWNhc2UgRFYxMzk0X0lPQ19TVUJNSVRfRlJBTUVTOgorCWNhc2UgRFYxMzk0X0lPQ19XQUlUX0ZSQU1FUzoKKwljYXNlIERWMTM5NF9JT0NfUkVDRUlWRV9GUkFNRVM6CisJY2FzZSBEVjEzOTRfSU9DX1NUQVJUX1JFQ0VJVkU6CisJCXJldHVybiBkdjEzOTRfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCisJY2FzZSBEVjEzOTRfSU9DMzJfSU5JVDoKKwkJcmV0dXJuIGhhbmRsZV9kdjEzOTRfaW5pdChmaWxlLCBjbWQsIGFyZyk7CisJY2FzZSBEVjEzOTRfSU9DMzJfR0VUX1NUQVRVUzoKKwkJcmV0dXJuIGhhbmRsZV9kdjEzOTRfZ2V0X3N0YXR1cyhmaWxlLCBjbWQsIGFyZyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCisKKworLyoqKiBLRVJORUwgTU9EVUxFIEhBTkRMRVJTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTU9EVUxFX0FVVEhPUigiRGFuIE1hYXMgPGRtYWFzQGRjaW5lLmNvbT4sIERhbiBEZW5uZWR5IDxkYW5AZGVubmVkeS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImRyaXZlciBmb3IgRFYgaW5wdXQvb3V0cHV0IG9uIE9IQ0kgYm9hcmQiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJkdjEzOTQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHZvaWQgX19leGl0IGR2MTM5NF9leGl0X21vZHVsZSh2b2lkKQoreworCWhwc2JfdW5yZWdpc3Rlcl9wcm90b2NvbCgmZHYxMzk0X2RyaXZlcik7CisKKwlocHNiX3VucmVnaXN0ZXJfaGlnaGxldmVsKCZkdjEzOTRfaGlnaGxldmVsKTsKKwljZGV2X2RlbCgmZHYxMzk0X2NkZXYpOworCWRldmZzX3JlbW92ZSgiaWVlZTEzOTQvZHYiKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZHYxMzk0X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldDsKKworCWNkZXZfaW5pdCgmZHYxMzk0X2NkZXYsICZkdjEzOTRfZm9wcyk7CisJZHYxMzk0X2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKwlrb2JqZWN0X3NldF9uYW1lKCZkdjEzOTRfY2Rldi5rb2JqLCAiZHYxMzk0Iik7CisJcmV0ID0gY2Rldl9hZGQoJmR2MTM5NF9jZGV2LCBJRUVFMTM5NF9EVjEzOTRfREVWLCAxNik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImR2MTM5NDogdW5hYmxlIHRvIHJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2VcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldmZzX21rX2RpcigiaWVlZTEzOTQvZHYiKTsKKworCWhwc2JfcmVnaXN0ZXJfaGlnaGxldmVsKCZkdjEzOTRfaGlnaGxldmVsKTsKKworCXJldCA9IGhwc2JfcmVnaXN0ZXJfcHJvdG9jb2woJmR2MTM5NF9kcml2ZXIpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkdjEzOTQ6IGZhaWxlZCB0byByZWdpc3RlciBwcm90b2NvbFxuIik7CisJCWhwc2JfdW5yZWdpc3Rlcl9oaWdobGV2ZWwoJmR2MTM5NF9oaWdobGV2ZWwpOworCQlkZXZmc19yZW1vdmUoImllZWUxMzk0L2R2Iik7CisJCWNkZXZfZGVsKCZkdjEzOTRfY2Rldik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGR2MTM5NF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkdjEzOTRfZXhpdF9tb2R1bGUpOworTU9EVUxFX0FMSUFTX0NIQVJERVYoSUVFRTEzOTRfTUFKT1IsIElFRUUxMzk0X01JTk9SX0JMT0NLX0RWMTM5NCAqIDE2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmggYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDdmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5oCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogZHYxMzk0LmggLSBEViBpbnB1dC9vdXRwdXQgb3ZlciBJRUVFIDEzOTQgb24gT0hDSSBjaGlwcworICogICBDb3B5cmlnaHQgKEMpMjAwMSBEYW5pZWwgTWFhcyA8ZG1hYXNAZGNpbmUuY29tPgorICogICAgIHJlY2VpdmUgYnkgRGFuIERlbm5lZHkgPGRhbkBkZW5uZWR5Lm9yZz4KKyAqCisgKiBiYXNlZCBvbjoKKyAqICAgdmlkZW8xMzk0LmggLSBkcml2ZXIgZm9yIE9IQ0kgMTM5NCBib2FyZHMKKyAqICAgQ29weXJpZ2h0IChDKTE5OTksMjAwMCBTZWJhc3RpZW4gUm91Z2VhdXggPHNlYmFzdGllbi5yb3VnZWF1eEBhbnUuZWR1LmF1PgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFBldGVyIFNjaGxhaWxlIDx1ZGJ6QHJ6LnVuaS1rYXJsc3J1aGUuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9EVl8xMzk0X0gKKyNkZWZpbmUgX0RWXzEzOTRfSAorCisvKiBUaGlzIGlzIHRoZSBwdWJsaWMgdXNlci1zcGFjZSBpbnRlcmZhY2UuIFRyeSBub3QgdG8gYnJlYWsgaXQuICovCisKKyNkZWZpbmUgRFYxMzk0X0FQSV9WRVJTSU9OIDB4MjAwMTExMjcKKworLyogKioqKioqKioqKioqKioqKioqKioKKyAgICoqICAgICAgICAgICAgICAgICoqCisgICAqKiAgIERWMTM5NCBBUEkgICAqKgorICAgKiogICAgICAgICAgICAgICAgKioKKyAgICoqKioqKioqKioqKioqKioqKioqCisKKyAgIFRoZXJlIGFyZSB0d28gbWV0aG9kcyBvZiBvcGVyYXRpbmcgdGhlIERWMTM5NCBEViBvdXRwdXQgZGV2aWNlLgorCisgICAxKQorCisgICBUaGUgc2ltcGxlc3QgaXMgYW4gaW50ZXJmYWNlIGJhc2VkIG9uIHdyaXRlKCk6IHNpbXBseSB3cml0ZQorICAgZnVsbCBEViBmcmFtZXMgb2YgZGF0YSB0byB0aGUgZGV2aWNlLCBhbmQgdGhleSB3aWxsIGJlIHRyYW5zbWl0dGVkCisgICBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLiBUaGUgRkQgbWF5IGJlIHNldCBmb3Igbm9uLWJsb2NraW5nIEkvTywKKyAgIGluIHdoaWNoIGNhc2UgeW91IGNhbiB1c2Ugc2VsZWN0KCkgb3IgcG9sbCgpIHRvIHdhaXQgZm9yIG91dHB1dAorICAgYnVmZmVyIHNwYWNlLgorCisgICBUbyBzZXQgdGhlIERWIG91dHB1dCBwYXJhbWV0ZXJzIChlLmcuIHdoZXRoZXIgeW91IHdhbnQgTlRTQyBvciBQQUwKKyAgIHZpZGVvKSwgdXNlIHRoZSBEVjEzOTRfSU5JVCBpb2N0bCwgcGFzc2luZyBpbiB0aGUgcGFyYW1ldGVycyB5b3UKKyAgIHdhbnQgaW4gYSBzdHJ1Y3QgZHYxMzk0X2luaXQuCisKKyAgIEV4YW1wbGUgMToKKyAgICAgICAgIFRvIHBsYXkgYSByYXcgLkRWIGZpbGU6ICAgY2F0IGZvby5EViA+IC9kZXYvZHYxMzk0CisJIChjYXQgd2lsbCB1c2Ugd3JpdGUoKSBpbnRlcm5hbGx5KQorCisgICBFeGFtcGxlIDI6CisgICAgICAgICAgIHN0YXRpYyBzdHJ1Y3QgZHYxMzk0X2luaXQgaW5pdCA9IHsKKwkgICAgICAweDYzLCAgICAgICAgKGJyb2FkY2FzdCBjaGFubmVsKQorICAgICAgICAgICAgICA0LCAgICAgICAgICAgKGZvdXItZnJhbWUgcmluZ2J1ZmZlcikKKwkgICAgICBEVjEzOTRfTlRTQywgKHNlbmQgTlRTQyB2aWRlbykKKwkgICAgICAwLCAwICAgICAgICAgKGRlZmF1bHQgZW1wdHkgcGFja2V0IHJhdGUpCisgICAgICAgICAgIH0KKworCSAgIGlvY3RsKGZkLCBEVjEzOTRfSU5JVCwgJmluaXQpOworCisJICAgd2hpbGUgKDEpIHsKKwkgICAgICAgICAgcmVhZCggPGEgcmF3IERWIGZpbGU+LCBidWYsIERWMTM5NF9OVFNDX0ZSQU1FX1NJWkUgKTsKKwkJICB3cml0ZSggPHRoZSBkdjEzOTQgRkQ+LCBidWYsIERWMTM5NF9OVFNDX0ZSQU1FX1NJWkUgKTsKKyAgICAgICAgICAgfQorCisgICAyKQorCisgICBGb3IgbW9yZSBjb250cm9sIG92ZXIgYnVmZmVyaW5nLCBhbmQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgY29waWVzCisgICBvZiB0aGUgRFYgZGF0YSwgeW91IGNhbiB1c2UgdGhlIG1vcmUgc29waGlzdGljYXRlZCB0aGUgbW1hcCgpIGludGVyZmFjZS4KKyAgIEZpcnN0LCBjYWxsIHRoZSBEVjEzOTRfSU5JVCBpb2N0bCB0byBzcGVjaWZ5IHlvdXIgcGFyYW1ldGVycywKKyAgIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGUgcmluZ2J1ZmZlci4gVGhlbiwgY2FsbGluZyBtbWFwKCkKKyAgIG9uIHRoZSBkdjEzOTQgZGV2aWNlIHdpbGwgZ2l2ZSB5b3UgZGlyZWN0IGFjY2VzcyB0byB0aGUgcmluZ2J1ZmZlcgorICAgZnJvbSB3aGljaCB0aGUgRFYgY2FyZCByZWFkcyB5b3VyIGZyYW1lIGRhdGEuCisKKyAgIFRoZSByaW5nYnVmZmVyIGlzIHNpbXBseSBvbmUgbGFyZ2UsIGNvbnRpZ3VvdXMgcmVnaW9uIG9mIG1lbW9yeQorICAgY29udGFpbmluZyB0d28gb3IgbW9yZSBmcmFtZXMgb2YgcGFja2VkIERWIGRhdGEuIEVhY2ggZnJhbWUgb2YgRFYgZGF0YQorICAgaXMgMTIwMDAwIGJ5dGVzIChOVFNDKSBvciAxNDQwMDAgYnl0ZXMgKFBBTCkuCisKKyAgIEZpbGwgb25lIG9yIG1vcmUgZnJhbWVzIGluIHRoZSByaW5nYnVmZmVyLCB0aGVuIHVzZSB0aGUgRFYxMzk0X1NVQk1JVF9GUkFNRVMKKyAgIGlvY3RsIHRvIGJlZ2luIEkvTy4gWW91IGNhbiB1c2UgZWl0aGVyIHRoZSBEVjEzOTRfV0FJVF9GUkFNRVMgaW9jdGwKKyAgIG9yIHNlbGVjdCgpL3BvbGwoKSB0byB3YWl0IHVudGlsIHRoZSBmcmFtZXMgYXJlIHRyYW5zbWl0dGVkLiBOZXh0LCB5b3UnbGwKKyAgIG5lZWQgdG8gY2FsbCB0aGUgRFYxMzk0X0dFVF9TVEFUVVMgaW9jdGwgdG8gZGV0ZXJtaW5lIHdoaWNoIHJpbmdidWZmZXIKKyAgIGZyYW1lcyBhcmUgY2xlYXIgKHJlYWR5IHRvIGJlIGZpbGxlZCB3aXRoIG5ldyBEViBkYXRhKS4gRmluYWxseSwgdXNlCisgICBEVjEzOTRfU1VCTUlUX0ZSQU1FUyBhZ2FpbiB0byBzZW5kIHRoZSBuZXcgZGF0YSB0byB0aGUgRFYgb3V0cHV0LgorCisKKyAgIEV4YW1wbGU6IGhlcmUgaXMgd2hhdCBhIGZvdXItZnJhbWUgcmluZ2J1ZmZlciBtaWdodCBsb29rIGxpa2UKKyAgICAgICAgICAgIGR1cmluZyBEViB0cmFuc21pc3Npb246CisKKworICAgICAgICAgZnJhbWUgMCAgIGZyYW1lIDEgICBmcmFtZSAyICAgZnJhbWUgMworCisJKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAgICB8IENMRUFSICAgfCBEViBkYXRhIHwgRFYgZGF0YSB8IENMRUFSICB8CisgICAgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgICAgICAgICAgICAgICA8QUNUSVZFPgorCisJdHJhbnNtaXNzaW9uIGdvZXMgaW4gdGhpcyBkaXJlY3Rpb24gLS0tPj4+CisKKworICAgVGhlIERWIGhhcmR3YXJlIGlzIGN1cnJlbnRseSB0cmFuc21pdHRpbmcgdGhlIGRhdGEgaW4gZnJhbWUgMS4KKyAgIE9uY2UgZnJhbWUgMSBpcyBmaW5pc2hlZCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRyYW5zbWl0IGZyYW1lIDIuCisgICAoaWYgZnJhbWUgMiBmaW5pc2hlcyBiZWZvcmUgZnJhbWUgMyBpcyBzdWJtaXR0ZWQsIHRoZSBkZXZpY2UKKyAgIHdpbGwgY29udGludWUgdG8gdHJhbnNtaXQgZnJhbWUgMiwgYW5kIHdpbGwgaW5jcmVhc2UgdGhlIGRyb3BwZWRfZnJhbWVzCisgICBjb3VudGVyIGVhY2ggdGltZSBpdCByZXBlYXRzIHRoZSB0cmFuc21pc3Npb24pLgorCisKKyAgIElmIHlvdSBjYWxsZWQgRFYxMzk0X0dFVF9TVEFUVVMgYXQgdGhpcyBpbnN0YW50LCB5b3Ugd291bGQKKyAgIHJlY2VpdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICAgICAgICAgICAgICAgIG5fZnJhbWVzICAgICAgICAgID0gNAorCQkgIGFjdGl2ZV9mcmFtZSAgICAgID0gMQorCQkgIGZpcnN0X2NsZWFyX2ZyYW1lID0gMworCQkgIG5fY2xlYXJfZnJhbWVzICAgID0gMgorCisgICBBdCB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIHdyaXRlIG5ldyBEViBkYXRhIGludG8gZnJhbWUgMyBhbmQgb3B0aW9uYWxseQorICAgZnJhbWUgMC4gVGhlbiBjYWxsIERWMTM5NF9TVUJNSVRfRlJBTUVTIHRvIGluZm9ybSB0aGUgZGV2aWNlIHRoYXQKKyAgIGl0IG1heSB0cmFuc21pdCB0aGUgbmV3IGZyYW1lcy4KKworICAgRVJST1IgSEFORExJTkcKKworICAgQW4gZXJyb3IgKGJ1ZmZlciB1bmRlcmZsb3cvb3ZlcmZsb3cgb3IgYSBicmVhayBpbiB0aGUgRFYgc3RyZWFtIGR1ZQorICAgdG8gYSAxMzk0IGJ1cyByZXNldCkgY2FuIGJlIGRldGVjdGVkIGJ5IGNoZWNraW5nIHRoZSBkcm9wcGVkX2ZyYW1lcworICAgZmllbGQgb2Ygc3RydWN0IGR2MTM5NF9zdGF0dXMgKG9idGFpbmVkIHRocm91Z2ggdGhlCisgICBEVjEzOTRfR0VUX1NUQVRVUyBpb2N0bCkuCisKKyAgIFRoZSBiZXN0IHdheSB0byByZWNvdmVyIGZyb20gc3VjaCBhbiBlcnJvciBpcyB0byByZS1pbml0aWFsaXplCisgICBkdjEzOTQsIGVpdGhlciBieSB1c2luZyB0aGUgRFYxMzk0X0lOSVQgaW9jdGwgY2FsbCwgb3IgY2xvc2luZyB0aGUKKyAgIGZpbGUgZGVzY3JpcHRvciBhbmQgb3BlbmluZyBpdCBhZ2Fpbi4gKG5vdGUgdGhhdCB5b3UgbXVzdCB1bm1hcCBhbGwKKyAgIHJpbmdidWZmZXIgbWFwcGluZ3Mgd2hlbiBjbG9zaW5nIHRoZSBmaWxlIGRlc2NyaXB0b3IsIG9yIGVsc2UKKyAgIGR2MTM5NCB3aWxsIHN0aWxsIGJlIGNvbnNpZGVyZWQgJ2luIHVzZScpLgorCisgICBNQUlOIExPT1AKKworICAgRm9yIG1heGltdW0gZWZmaWNpZW5jeSBhbmQgcm9idXN0bmVzcyBhZ2FpbnN0IGJ1cyBlcnJvcnMsIHlvdSBhcmUKKyAgIGFkdmlzZWQgdG8gbW9kZWwgdGhlIG1haW4gbG9vcCBvZiB5b3VyIGFwcGxpY2F0aW9uIGFmdGVyIHRoZQorICAgZm9sbG93aW5nIHBzZXVkby1jb2RlIGV4YW1wbGU6CisKKyAgIChjaGVja3Mgb2Ygc3lzdGVtIGNhbGwgcmV0dXJuIHZhbHVlcyBvbWl0dGVkIGZvciBicmV2aXR5OyBhbHdheXMKKyAgIGNoZWNrIHJldHVybiB2YWx1ZXMgaW4geW91ciBjb2RlISkKKworICAgd2hpbGUgKCBmcmFtZXMgbGVmdCApIHsKKworICAgIHN0cnVjdCBwb2xsZmQgKnBmZCA9IC4uLjsKKworICAgIHBmZC0+ZmQgPSBkdjEzOTRfZmQ7CisgICAgcGZkLT5yZXZlbnRzID0gMDsKKyAgICBwZmQtPmV2ZW50cyA9IFBPTExPVVQgfCBQT0xMSU47IChPVVQgZm9yIHRyYW5zbWl0LCBJTiBmb3IgcmVjZWl2ZSkKKworICAgIChhZGQgb3RoZXIgc291cmNlcyBvZiBJL08gaGVyZSkKKworICAgIHBvbGwocGZkLCAxLCAtMSk7IChvciBzZWxlY3QoKTsgYWRkIGEgdGltZW91dCBpZiB5b3Ugd2FudCkKKworICAgIGlmIChwZmQtPnJldmVudHMpIHsKKyAgICAgICAgIHN0cnVjdCBkdjEzOTRfc3RhdHVzIHN0YXR1czsKKworICAgICAgICAgaW9jdGwoZHYxMzk0X2ZkLCBEVjEzOTRfR0VUX1NUQVRVUywgJnN0YXR1cyk7CisKKwkgaWYgKHN0YXR1cy5kcm9wcGVkX2ZyYW1lcyA+IDApIHsKKwkgICAgICByZXNldF9kdjEzOTQoKTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzLm5fY2xlYXJfZnJhbWVzOyBpKyspIHsKKwkgICAgICAgICAgY29weV9EVl9mcmFtZSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgfQorICAgfQorCisgICB3aGVyZSBjb3B5X0RWX2ZyYW1lKCkgcmVhZHMgb3Igd3JpdGVzIG9uIHRoZSBkdjEzOTQgZmlsZSBkZXNjcmlwdG9yCisgICAocmVhZC93cml0ZSBtb2RlKSBvciBjb3BpZXMgZGF0YSB0by9mcm9tIHRoZSBtbWFwIHJpbmdidWZmZXIgYW5kCisgICB0aGVuIGNhbGxzIGlvY3RsKERWMTM5NF9TVUJNSVRfRlJBTUVTKSB0byBub3RpZnkgZHYxMzk0IHRoYXQgbmV3CisgICBmcmFtZXMgYXJlIGF2YWlsYmxlIChtbWFwIG1vZGUpLgorCisgICByZXNldF9kdjEzOTQoKSBpcyBjYWxsZWQgaW4gdGhlIGV2ZW50IG9mIGEgYnVmZmVyCisgICB1bmRlcmZsb3cvb3ZlcmZsb3cgb3IgYSBoYWx0IGluIHRoZSBEViBzdHJlYW0gKGUuZy4gZHVlIHRvIGEgMTM5NAorICAgYnVzIHJlc2V0KS4gVG8gZ3VhcmFudGVlIHJlY292ZXJ5IGZyb20gdGhlIGVycm9yLCB0aGlzIGZ1bmN0aW9uCisgICBzaG91bGQgY2xvc2UgdGhlIGR2MTM5NCBmaWxlIGRlc2NyaXB0b3IgKGFuZCBtdW5tYXAoKSBhbGwKKyAgIHJpbmdidWZmZXIgbWFwcGluZ3MsIGlmIHlvdSBhcmUgdXNpbmcgdGhlbSksIHRoZW4gcmUtb3BlbiB0aGUKKyAgIGR2MTM5NCBkZXZpY2UgKGFuZCByZS1tYXAgdGhlIHJpbmdidWZmZXIpLgorCisqLworCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGUgcmluZ2J1ZmZlciAqLworI2RlZmluZSBEVjEzOTRfTUFYX0ZSQU1FUyAzMgorCisvKiBudW1iZXIgb2YgKmZ1bGwqIGlzb2Nocm9ub3VzIHBhY2tldHMgcGVyIERWIGZyYW1lICovCisjZGVmaW5lIERWMTM5NF9OVFNDX1BBQ0tFVFNfUEVSX0ZSQU1FIDI1MAorI2RlZmluZSBEVjEzOTRfUEFMX1BBQ0tFVFNfUEVSX0ZSQU1FICAzMDAKKworLyogc2l6ZSBvZiBvbmUgZnJhbWUncyB3b3J0aCBvZiBEViBkYXRhLCBpbiBieXRlcyAqLworI2RlZmluZSBEVjEzOTRfTlRTQ19GUkFNRV9TSVpFICg0ODAgKiBEVjEzOTRfTlRTQ19QQUNLRVRTX1BFUl9GUkFNRSkKKyNkZWZpbmUgRFYxMzk0X1BBTF9GUkFNRV9TSVpFICAoNDgwICogRFYxMzk0X1BBTF9QQUNLRVRTX1BFUl9GUkFNRSkKKworCisvKiBpb2N0bCgpIGNvbW1hbmRzICovCisjaW5jbHVkZSAiaWVlZTEzOTQtaW9jdGwuaCIKKworCitlbnVtIHBhbF9vcl9udHNjIHsKKwlEVjEzOTRfTlRTQyA9IDAsCisJRFYxMzk0X1BBTAorfTsKKworCisKKworLyogdGhpcyBpcyB0aGUgYXJndW1lbnQgdG8gRFYxMzk0X0lOSVQgKi8KK3N0cnVjdCBkdjEzOTRfaW5pdCB7CisJLyogRFYxMzk0X0FQSV9WRVJTSU9OICovCisJdW5zaWduZWQgaW50IGFwaV92ZXJzaW9uOworCisJLyogaXNvY2hyb25vdXMgdHJhbnNtaXNzaW9uIGNoYW5uZWwgdG8gdXNlICovCisJdW5zaWduZWQgaW50IGNoYW5uZWw7CisKKwkvKiBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSByaW5nYnVmZmVyLiBNdXN0IGJlIGF0IGxlYXN0IDIKKwkgICBhbmQgYXQgbW9zdCBEVjEzOTRfTUFYX0ZSQU1FUy4gKi8KKwl1bnNpZ25lZCBpbnQgbl9mcmFtZXM7CisKKwkvKiBzZW5kL3JlY2VpdmUgUEFMIG9yIE5UU0MgdmlkZW8gZm9ybWF0ICovCisJZW51bSBwYWxfb3JfbnRzYyBmb3JtYXQ7CisKKwkvKiB0aGUgZm9sbG93aW5nIGFyZSB1c2VkIG9ubHkgZm9yIHRyYW5zbWlzc2lvbiAqLworCisJLyogc2V0IHRoZXNlIHRvIHplcm8gdW5sZXNzIHlvdSB3YW50IGEKKwkgICBub24tZGVmYXVsdCBlbXB0eSBwYWNrZXQgcmF0ZSAoc2VlIGJlbG93KSAqLworCXVuc2lnbmVkIGxvbmcgY2lwX247CisJdW5zaWduZWQgbG9uZyBjaXBfZDsKKworCS8qIHNldCB0aGlzIHRvIHplcm8gdW5sZXNzIHlvdSB3YW50IGEKKwkgICBub24tZGVmYXVsdCBTWVQgY3ljbGUgb2Zmc2V0IChkZWZhdWx0ID0gMyBjeWNsZXMpICovCisJdW5zaWduZWQgaW50IHN5dF9vZmZzZXQ7Cit9OworCisvKiBOT1RFOiB5b3UgbWF5IG9ubHkgYWxsb2NhdGUgdGhlIERWIGZyYW1lIHJpbmdidWZmZXIgb25jZSBlYWNoIHRpbWUKKyAgIHlvdSBvcGVuIHRoZSBkdjEzOTQgZGV2aWNlLiBEVjEzOTRfSU5JVCB3aWxsIGZhaWwgaWYgeW91IGNhbGwgaXQgYQorICAgc2Vjb25kIHRpbWUgd2l0aCBkaWZmZXJlbnQgJ25fZnJhbWVzJyBvciAnZm9ybWF0JyBhcmd1bWVudHMgKHdoaWNoCisgICB3b3VsZCBpbXBseSBhIGRpZmZlcmVudCBzaXplIGZvciB0aGUgcmluZ2J1ZmZlcikuIElmIHlvdSBuZWVkIGEKKyAgIGRpZmZlcmVudCBidWZmZXIgc2l6ZSwgc2ltcGx5IGNsb3NlIGFuZCByZS1vcGVuIHRoZSBkZXZpY2UsIHRoZW4KKyAgIGluaXRpYWxpemUgaXQgd2l0aCB5b3VyIG5ldyBzZXR0aW5ncy4gKi8KKworLyogUTogV2hhdCBhcmUgY2lwX24gYW5kIGNpcF9kPyAqLworCisvKgorICBBOiBEViB2aWRlbyBzdHJlYW1zIGRvIG5vdCB1dGlsaXplIDEwMCUgb2YgdGhlIHBvdGVudGlhbCBiYW5kd2lkdGggb2ZmZXJlZAorICBieSBJRUVFIDEzOTQgKEZpcmVXaXJlKS4gVG8gYWNoaWV2ZSB0aGUgY29ycmVjdCByYXRlIG9mIGRhdGEgdHJhbnNtaXNzaW9uLAorICBEViBkZXZpY2VzIG11c3QgcGVyaW9kaWNhbGx5IGluc2VydCBlbXB0eSBwYWNrZXRzIGludG8gdGhlIDEzOTQgZGF0YSBzdHJlYW0uCisgIFR5cGljYWxseSB0aGVyZSBpcyBvbmUgZW1wdHkgcGFja2V0IHBlciAxNC0xNiBkYXRhLWNhcnJ5aW5nIHBhY2tldHMuCisKKyAgU29tZSBEViBkZXZpY2VzIHdpbGwgYWNjZXB0IGEgd2lkZSByYW5nZSBvZiBlbXB0eSBwYWNrZXQgcmF0ZXMsIHdoaWxlIG90aGVycworICByZXF1aXJlIGEgcHJlY2lzZSByYXRlLiBJZiB0aGUgZHYxMzk0IGRyaXZlciBwcm9kdWNlcyBlbXB0eSBwYWNrZXRzIGF0CisgIGEgcmF0ZSB0aGF0IHlvdXIgZGV2aWNlIGRvZXMgbm90IGFjY2VwdCwgeW91IG1heSBzZWUgdWdseSBwYXR0ZXJucyBvbiB0aGUKKyAgRFYgb3V0cHV0LCBvciBldmVuIG5vIG91dHB1dCBhdCBhbGwuCisKKyAgVGhlIGRlZmF1bHQgZW1wdHkgcGFja2V0IGluc2VydGlvbiByYXRlIHNlZW1zIHRvIHdvcmsgZm9yIG1hbnkgcGVvcGxlOyBpZgorICB5b3VyIERWIG91dHB1dCBpcyBzdGFibGUsIHlvdSBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRpc2N1c3Npb24uIEhvd2V2ZXIsCisgIHdlIGhhdmUgZXhwb3NlZCB0aGUgZW1wdHkgcGFja2V0IHJhdGUgYXMgYSBwYXJhbWV0ZXIgdG8gc3VwcG9ydCBkZXZpY2VzIHRoYXQKKyAgZG8gbm90IHdvcmsgd2l0aCB0aGUgZGVmYXVsdCByYXRlLgorCisgIFRoZSBkZWNpc2lvbiB0byBpbnNlcnQgYW4gZW1wdHkgcGFja2V0IGlzIG1hZGUgd2l0aCBhIG51bWVyYXRvci9kZW5vbWluYXRvcgorICBhbGdvcml0aG0uIEVtcHR5IHBhY2tldHMgYXJlIHByb2R1Y2VkIGF0IGFuIGF2ZXJhZ2UgcmF0ZSBvZiBDSVBfTiAvIENJUF9ELgorICBZb3UgY2FuIGFsdGVyIHRoZSBlbXB0eSBwYWNrZXQgcmF0ZSBieSBwYXNzaW5nIG5vbi16ZXJvIHZhbHVlcyBmb3IgY2lwX24KKyAgYW5kIGNpcF9kIHRvIHRoZSBJTklUIGlvY3RsLgorCisgKi8KKworCisKK3N0cnVjdCBkdjEzOTRfc3RhdHVzIHsKKwkvKiB0aGlzIGVtYmVkZGVkIGluaXQgc3RydWN0IHJldHVybnMgdGhlIGN1cnJlbnQgZHYxMzk0CisJICAgcGFyYW1ldGVycyBpbiB1c2UgKi8KKwlzdHJ1Y3QgZHYxMzk0X2luaXQgaW5pdDsKKworCS8qIHRoZSByaW5nYnVmZmVyIGZyYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCisJICAgZGlzcGxheWVkLiAoLTEgaWYgdGhlIGRldmljZSBpcyBub3QgdHJhbnNtaXR0aW5nIGFueXRoaW5nKSAqLworCWludCBhY3RpdmVfZnJhbWU7CisKKwkvKiBpbmRleCBvZiB0aGUgZmlyc3QgYnVmZmVyIChhaGVhZCBvZiBhY3RpdmVfZnJhbWUpIHRoYXQKKwkgICBpcyByZWFkeSB0byBiZSBmaWxsZWQgd2l0aCBkYXRhICovCisJdW5zaWduZWQgaW50IGZpcnN0X2NsZWFyX2ZyYW1lOworCisJLyogaG93IG1hbnkgYnVmZmVycywgaW5jbHVkaW5nIGZpcnN0X2NsZWFyX2J1ZmZlciwgYXJlCisJICAgcmVhZHkgdG8gYmUgZmlsbGVkIHdpdGggZGF0YSAqLworCXVuc2lnbmVkIGludCBuX2NsZWFyX2ZyYW1lczsKKworCS8qIGhvdyBtYW55IHRpbWVzIHRoZSBEViBzdHJlYW0gaGFzIHVuZGVyZmxvd2VkLCBvdmVyZmxvd2VkLAorCSAgIG9yIG90aGVyd2lzZSBlbmNvdW50ZXJlZCBhbiBlcnJvciwgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwKKwkgICB0byBEVjEzOTRfR0VUX1NUQVRVUyAqLworCXVuc2lnbmVkIGludCBkcm9wcGVkX2ZyYW1lczsKKworCS8qIE4uQi4gVGhlIGRyb3BwZWRfZnJhbWVzIGNvdW50ZXIgaXMgb25seSBhIGxvd2VyIGJvdW5kIG9uIHRoZSBhY3R1YWwKKwkgICBudW1iZXIgb2YgZHJvcHBlZCBmcmFtZXMsIHdpdGggdGhlIHNwZWNpYWwgY2FzZSB0aGF0IGlmIGRyb3BwZWRfZnJhbWVzCisJICAgaXMgemVybywgdGhlbiBpdCBpcyBndWFyYW50ZWVkIHRoYXQgTk8gZnJhbWVzIGhhdmUgYmVlbiBkcm9wcGVkCisJICAgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBEVjEzOTRfR0VUX1NUQVRVUy4KKwkqLworfTsKKworCisjZW5kaWYgLyogX0RWXzEzOTRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTRkYTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKQEAgLTAsMCArMSwxODAxIEBACisvKgorICogZXRoMTM5NC5jIC0tIEV0aGVybmV0IGRyaXZlciBmb3IgTGludXggSUVFRS0xMzk0IFN1YnN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIEJlbiBDb2xsaW5zIDxiY29sbGluc0BkZWJpYW4ub3JnPgorICogICAgICAgICAgICAgICAyMDAwIEJvbmluIEZyYW5jayA8Ym9uaW5mQGZyZWUuZnI+CisgKiAgICAgICAgICAgICAgIDIwMDMgU3RldmUgS2lubmViZXJnIDxraW5uZWJlcmdzdGV2ZUBhY21zeXN0ZW1zLmNvbT4KKyAqCisgKiBNYWlubHkgYmFzZWQgb24gd29yayBieSBFbWFudWVsIFBpcmtlciBhbmQgQW5kcmVhcyBFLiBCb21iZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogVGhpcyBkcml2ZXIgaW50ZW5kcyB0byBzdXBwb3J0IFJGQyAyNzM0LCB3aGljaCBkZXNjcmliZXMgYSBtZXRob2QgZm9yCisgKiB0cmFuc3BvcnRpbmcgSVB2NCBkYXRhZ3JhbXMgb3ZlciBJRUVFLTEzOTQgc2VyaWFsIGJ1c3Nlcy4gVGhpcyBkcml2ZXIKKyAqIHdpbGwgdWx0aW1hdGVseSBzdXBwb3J0IHRoYXQgbWV0aG9kLCBidXQgY3VycmVudGx5IGZhbGxzIHNob3J0IGluCisgKiBzZXZlcmFsIGFyZWFzLgorICoKKyAqIFRPRE86CisgKiBSRkMgMjczNCByZWxhdGVkOgorICogLSBBZGQgTUNBUC4gTGltaXRlZCBNdWx0aWNhc3QgZXhpc3RzIG9ubHkgdG8gMjI0LjAuMC4xIGFuZCAyMjQuMC4wLjIuCisgKgorICogTm9uLVJGQyAyNzM0IHJlbGF0ZWQ6CisgKiAtIEhhbmRsZSBmcmFnbWVudGVkIHNrYidzIGNvbWluZyBmcm9tIHRoZSBuZXR3b3JraW5nIGxheWVyLgorICogLSBNb3ZlIGdlbmVyaWMgR0FTUCByZWNlcHRpb24gdG8gY29yZSAxMzk0IGNvZGUKKyAqIC0gQ29udmVydCBrbWFsbG9jL2tmcmVlIGZvciBsaW5rIGZyYWdtZW50cyB0byB1c2Uga21lbV9jYWNoZV8qIGluc3RlYWQKKyAqIC0gU3RhYmlsaXR5IGltcHJvdmVtZW50cworICogLSBQZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMKKyAqIC0gQ29uc2lkZXIgZ2FyYmFnZSBjb2xsZWN0aW5nIG9sZCBwYXJ0aWFsIGRhdGFncmFtcyBhZnRlciBYIGFtb3VudCBvZiB0aW1lCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSAiY3NyMTIxMi5oIgorI2luY2x1ZGUgImllZWUxMzk0X3R5cGVzLmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfY29yZS5oIgorI2luY2x1ZGUgImllZWUxMzk0X3RyYW5zYWN0aW9ucy5oIgorI2luY2x1ZGUgImllZWUxMzk0LmgiCisjaW5jbHVkZSAiaGlnaGxldmVsLmgiCisjaW5jbHVkZSAiaXNvLmgiCisjaW5jbHVkZSAibm9kZW1nci5oIgorI2luY2x1ZGUgImV0aDEzOTQuaCIKKyNpbmNsdWRlICJjb25maWdfcm9tcy5oIgorCisjZGVmaW5lIEVUSDEzOTRfUFJJTlRfRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKGxldmVsICIlczogIiBmbXQsIGRyaXZlcl9uYW1lLCAjIyBhcmdzKQorCisjZGVmaW5lIEVUSDEzOTRfUFJJTlQobGV2ZWwsIGRldl9uYW1lLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsobGV2ZWwgIiVzOiAlczogIiBmbXQsIGRyaXZlcl9uYW1lLCBkZXZfbmFtZSwgIyMgYXJncykKKworI2RlZmluZSBERUJVRyhmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIgIiVzOiVzWyVkXTogIiBmbXQgIlxuIiwgZHJpdmVyX25hbWUsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjIGFyZ3MpCisjZGVmaW5lIFRSQUNFKCkgcHJpbnRrKEtFUk5fRVJSICIlczolc1slZF0gLS0tLSBUUkFDRVxuIiwgZHJpdmVyX25hbWUsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKwkiJFJldjogMTI0NyAkIEJlbiBDb2xsaW5zIDxiY29sbGluc0BkZWJpYW4ub3JnPiI7CisKK3N0cnVjdCBmcmFnbWVudF9pbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IG9mZnNldDsKKwlpbnQgbGVuOworfTsKKworc3RydWN0IHBhcnRpYWxfZGF0YWdyYW0geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1MTYgZGdsOworCXUxNiBkZ19zaXplOworCXUxNiBldGhlcl90eXBlOworCXN0cnVjdCBza19idWZmICpza2I7CisJY2hhciAqcGJ1ZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyYWdfaW5mbzsKK307CisKK3N0cnVjdCBwZGdfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogcGFydGlhbCBkYXRhZ3JhbSBsaXN0IHBlciBub2RlCSovCisJdW5zaWduZWQgaW50IHN6OwkJLyogcGFydGlhbCBkYXRhZ3JhbSBsaXN0IHNpemUgcGVyIG5vZGUJKi8KKwlzcGlubG9ja190IGxvY2s7CQkvKiBwYXJ0aWFsIGRhdGFncmFtIGxvY2sJCSovCit9OworCitzdHJ1Y3QgZXRoMTM5NF9ob3N0X2luZm8geworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKK307CisKK3N0cnVjdCBldGgxMzk0X25vZGVfcmVmIHsKKwlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBldGgxMzk0X25vZGVfaW5mbyB7CisJdTE2IG1heHBheWxvYWQ7CQkJLyogTWF4IHBheWxvYWQJCQkqLworCXU4IHNzcGQ7CQkJLyogTWF4IHNwZWVkCQkJKi8KKwl1NjQgZmlmbzsJCQkvKiBGSUZPIGFkZHJlc3MJCQkqLworCXN0cnVjdCBwZGdfbGlzdCBwZGc7CQkvKiBwYXJ0aWFsIFJYIGRhdGFncmFtIGxpc3RzCSovCisJaW50IGRnbDsJCQkvKiBPdXRnb2luZyBkYXRhZ3JhbSBsYWJlbAkqLworfTsKKworLyogT3VyIGllZWUxMzk0IGhpZ2hsZXZlbCBkcml2ZXIgKi8KKyNkZWZpbmUgRVRIMTM5NF9EUklWRVJfTkFNRSAiZXRoMTM5NCIKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSBFVEgxMzk0X0RSSVZFUl9OQU1FOworCitzdGF0aWMga21lbV9jYWNoZV90ICpwYWNrZXRfdGFza19jYWNoZTsKKworc3RhdGljIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCBldGgxMzk0X2hpZ2hsZXZlbDsKKworLyogVXNlIGNvbW1vbi5sZiB0byBkZXRlcm1pbmUgaGVhZGVyIGxlbiAqLworc3RhdGljIGNvbnN0IGludCBoZHJfdHlwZV9sZW5bXSA9IHsKKwlzaXplb2YgKHN0cnVjdCBldGgxMzk0X3VmX2hkciksCisJc2l6ZW9mIChzdHJ1Y3QgZXRoMTM5NF9mZl9oZHIpLAorCXNpemVvZiAoc3RydWN0IGV0aDEzOTRfc2ZfaGRyKSwKKwlzaXplb2YgKHN0cnVjdCBldGgxMzk0X3NmX2hkcikKK307CisKKy8qIENoYW5nZSB0aGlzIHRvIElFRUUxMzk0X1NQRUVEX1MxMDAgdG8gbWFrZSB0ZXN0aW5nIGVhc2llciAqLworI2RlZmluZSBFVEgxMzk0X1NQRUVEX0RFRglJRUVFMTM5NF9TUEVFRF9NQVgKKworLyogRm9yIG5vdywgdGhpcyBuZWVkcyB0byBiZSAxNTAwLCBzbyB0aGF0IFhQIHdvcmtzIHdpdGggdXMgKi8KKyNkZWZpbmUgRVRIMTM5NF9EQVRBX0xFTglFVEhfREFUQV9MRU4KKworc3RhdGljIGNvbnN0IHUxNiBldGgxMzk0X3NwZWVkdG9fbWF4cGF5bG9hZFtdID0geworLyogICAgIFMxMDAsIFMyMDAsIFM0MDAsIFM4MDAsIFMxNjAwLCBTMzIwMCAqLworCTUxMiwgMTAyNCwgMjA0OCwgNDA5NiwgIDQwOTYsICA0MDk2Cit9OworCitNT0RVTEVfQVVUSE9SKCJCZW4gQ29sbGlucyAoYmNvbGxpbnNAZGViaWFuLm9yZykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSUVFRSAxMzk0IElQdjQgRHJpdmVyIChJUHY0LW92ZXItMTM5NCBhcyBwZXIgUkZDIDI3MzQpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFRoZSBtYXhfcGFydGlhbF9kYXRhZ3JhbXMgcGFyYW1ldGVyIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmcmFnbWVudGVkCisgKiBkYXRhZ3JhbXMgcGVyIG5vZGUgdGhhdCBldGgxMzk0IHdpbGwga2VlcCBpbiBtZW1vcnkuICBQcm92aWRpbmcgYW4gdXBwZXIKKyAqIGJvdW5kIGFsbG93cyB1cyB0byBsaW1pdCB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGF0IHBhcnRpYWwgZGF0YWdyYW1zCisgKiBjb25zdW1lIGluIHRoZSBldmVudCB0aGF0IHNvbWUgcGFydGlhbCBkYXRhZ3JhbXMgYXJlIG5ldmVyIGNvbXBsZXRlZC4KKyAqLworc3RhdGljIGludCBtYXhfcGFydGlhbF9kYXRhZ3JhbXMgPSAyNTsKK21vZHVsZV9wYXJhbShtYXhfcGFydGlhbF9kYXRhZ3JhbXMsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfcGFydGlhbF9kYXRhZ3JhbXMsCisJCSAiTWF4aW11bSBudW1iZXIgb2YgcGFydGlhbGx5IHJlY2VpdmVkIGZyYWdtZW50ZWQgZGF0YWdyYW1zICIKKwkJICIoZGVmYXVsdCA9IDI1KS4iKTsKKworCitzdGF0aWMgaW50IGV0aGVyMTM5NF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsCisJCQkgICAgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgZXRoZXIxMzk0X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBldGhlcjEzOTRfaGVhZGVyX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKTsKK3N0YXRpYyBpbnQgZXRoZXIxMzk0X2hlYWRlcl9jYWNoZShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IGhoX2NhY2hlICpoaCk7CitzdGF0aWMgdm9pZCBldGhlcjEzOTRfaGVhZGVyX2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaGhfY2FjaGUgKmhoLAorCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgdW5zaWduZWQgY2hhciAqIGhhZGRyKTsKK3N0YXRpYyBpbnQgZXRoZXIxMzk0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApOworCitzdGF0aWMgdm9pZCBwdXJnZV9wYXJ0aWFsX2RhdGFncmFtKHN0cnVjdCBsaXN0X2hlYWQgKm9sZCk7CitzdGF0aWMgaW50IGV0aGVyMTM5NF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9pc28oc3RydWN0IGhwc2JfaXNvICppc28pOworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzOworCitzdGF0aWMgaW50IGV0aGVyMTM5NF93cml0ZShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgc3JjaWQsIGludCBkZXN0aWQsCisJCQkgICBxdWFkbGV0X3QgKmRhdGEsIHU2NCBhZGRyLCBzaXplX3QgbGVuLCB1MTYgZmxhZ3MpOworc3RhdGljIHZvaWQgZXRoZXIxMzk0X2FkZF9ob3N0IChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9yZW1vdmVfaG9zdCAoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBldGhlcjEzOTRfaG9zdF9yZXNldCAoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CisKKy8qIEZ1bmN0aW9uIGZvciBpbmNvbWluZyAxMzk0IHBhY2tldHMgKi8KK3N0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBhZGRyX29wcyA9IHsKKwkud3JpdGUgPQlldGhlcjEzOTRfd3JpdGUsCit9OworCisvKiBJZWVlMTM5NCBoaWdobGV2ZWwgZHJpdmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCBldGgxMzk0X2hpZ2hsZXZlbCA9IHsKKwkubmFtZSA9CQlkcml2ZXJfbmFtZSwKKwkuYWRkX2hvc3QgPQlldGhlcjEzOTRfYWRkX2hvc3QsCisJLnJlbW92ZV9ob3N0ID0JZXRoZXIxMzk0X3JlbW92ZV9ob3N0LAorCS5ob3N0X3Jlc2V0ID0JZXRoZXIxMzk0X2hvc3RfcmVzZXQsCit9OworCisKKy8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuICJpZnVwIiAqLworc3RhdGljIGludCBldGhlcjEzOTRfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQsIGRvbid0IGV2ZW4gdHJ5ICovCisJaWYgKHByaXYtPmJjX3N0YXRlID09IEVUSEVSMTM5NF9CQ19FUlJPUikgeworCQkvKiB3ZSdsbCB0cnkgYWdhaW4gKi8KKwkJcHJpdi0+aXNvID0gaHBzYl9pc29fcmVjdl9pbml0KHByaXYtPmhvc3QsCisJCQkJCSAgICAgICBFVEhFUjEzOTRfR0FTUF9CVUZGRVJTICogMiAqCisJCQkJCSAgICAgICAoMSA8PCAocHJpdi0+aG9zdC0+Y3NyLm1heF9yZWMgKworCQkJCQkJICAgICAgMSkpLAorCQkJCQkgICAgICAgRVRIRVIxMzk0X0dBU1BfQlVGRkVSUywKKwkJCQkJICAgICAgIHByaXYtPmJyb2FkY2FzdF9jaGFubmVsLAorCQkJCQkgICAgICAgSFBTQl9JU09fRE1BX1BBQ0tFVF9QRVJfQlVGRkVSLAorCQkJCQkgICAgICAgMSwgZXRoZXIxMzk0X2lzbyk7CisJCWlmIChwcml2LT5pc28gPT0gTlVMTCkgeworCQkJRVRIMTM5NF9QUklOVChLRVJOX0VSUiwgZGV2LT5uYW1lLAorCQkJCSAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgaXNvY2hyb25vdXMgcmVjZWl2ZSAiCisJCQkJICAgICAgImNvbnRleHQgZm9yIHRoZSBicm9hZGNhc3QgY2hhbm5lbFxuIik7CisJCQlwcml2LT5iY19zdGF0ZSA9IEVUSEVSMTM5NF9CQ19FUlJPUjsKKwkJCXJldCA9IC1FQUdBSU47CisJCX0gZWxzZSB7CisJCQlpZiAoaHBzYl9pc29fcmVjdl9zdGFydChwcml2LT5pc28sIC0xLCAoMSA8PCAzKSwgLTEpIDwgMCkKKwkJCQlwcml2LT5iY19zdGF0ZSA9IEVUSEVSMTM5NF9CQ19TVE9QUEVEOworCQkJZWxzZQorCQkJCXByaXYtPmJjX3N0YXRlID0gRVRIRVIxMzk0X0JDX1JVTk5JTkc7CisJCX0KKwl9CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuICJpZmRvd24iICovCitzdGF0aWMgaW50IGV0aGVyMTM5NF9zdG9wIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiBzdGF0aXN0aWNzIHRvIHRoZSBjYWxsZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXRoZXIxMzk0X3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAmKCgoc3RydWN0IGV0aDEzOTRfcHJpdiAqKW5ldGRldl9wcml2KGRldikpLT5zdGF0cyk7Cit9CisKKy8qIFdoYXQgdG8gZG8gaWYgd2UgdGltZW91dC4gSSB0aGluayBhIGhvc3QgcmVzZXQgaXMgcHJvYmFibHkgaW4gb3JkZXIsIHNvCisgKiB0aGF0J3Mgd2hhdCB3ZSBkby4gU2hvdWxkIHdlIGluY3JlbWVudCB0aGUgc3RhdCBjb3VudGVycyB0b28/ICAqLworc3RhdGljIHZvaWQgZXRoZXIxMzk0X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJRVRIMTM5NF9QUklOVCAoS0VSTl9FUlIsIGRldi0+bmFtZSwgIlRpbWVvdXQsIHJlc2V0dGluZyBob3N0ICVzXG4iLAorCQkgICAgICAgKChzdHJ1Y3QgZXRoMTM5NF9wcml2ICopbmV0ZGV2X3ByaXYoZGV2KSktPmhvc3QtPmRyaXZlci0+bmFtZSk7CisKKwloaWdobGV2ZWxfaG9zdF9yZXNldCAoKChzdHJ1Y3QgZXRoMTM5NF9wcml2ICopbmV0ZGV2X3ByaXYoZGV2KSktPmhvc3QpOworCisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworc3RhdGljIGludCBldGhlcjEzOTRfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICgobmV3X210dSA8IDY4KSB8fAorCSAgICAobmV3X210dSA+IG1pbihFVEgxMzk0X0RBVEFfTEVOLAorCQkJICAgKGludCkoKDEgPDwgKHByaXYtPmhvc3QtPmNzci5tYXhfcmVjICsgMSkpIC0KKwkJCQkgKHNpemVvZih1bmlvbiBldGgxMzk0X2hkcikgKworCQkJCSAgRVRIRVIxMzk0X0dBU1BfT1ZFUkhFQUQpKSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1cmdlX3BhcnRpYWxfZGF0YWdyYW0oc3RydWN0IGxpc3RfaGVhZCAqb2xkKQoreworCXN0cnVjdCBwYXJ0aWFsX2RhdGFncmFtICpwZCA9IGxpc3RfZW50cnkob2xkLCBzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSwgbGlzdCk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBuLCAmcGQtPmZyYWdfaW5mbykgeworCQlzdHJ1Y3QgZnJhZ21lbnRfaW5mbyAqZmkgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgZnJhZ21lbnRfaW5mbywgbGlzdCk7CisJCWxpc3RfZGVsKGxoKTsKKwkJa2ZyZWUoZmkpOworCX0KKwlsaXN0X2RlbChvbGQpOworCWtmcmVlX3NrYihwZC0+c2tiKTsKKwlrZnJlZShwZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIDEzOTQgYnVzIGFjdGl2aXR5IGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBldGgxMzk0X25vZGVfcmVmICpldGgxMzk0X2ZpbmRfbm9kZShzdHJ1Y3QgbGlzdF9oZWFkICppbmwsCisJCQkJCQkgIHN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQpCit7CisJc3RydWN0IGV0aDEzOTRfbm9kZV9yZWYgKm5vZGU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsIGlubCwgbGlzdCkKKwkJaWYgKG5vZGUtPnVkID09IHVkKQorCQkJcmV0dXJuIG5vZGU7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBldGgxMzk0X25vZGVfcmVmICpldGgxMzk0X2ZpbmRfbm9kZV9ndWlkKHN0cnVjdCBsaXN0X2hlYWQgKmlubCwKKwkJCQkJCSAgICAgICB1NjQgZ3VpZCkKK3sKKwlzdHJ1Y3QgZXRoMTM5NF9ub2RlX3JlZiAqbm9kZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgaW5sLCBsaXN0KQorCQlpZiAobm9kZS0+dWQtPm5lLT5ndWlkID09IGd1aWQpCisJCQlyZXR1cm4gbm9kZTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGV0aDEzOTRfbm9kZV9yZWYgKmV0aDEzOTRfZmluZF9ub2RlX25vZGVpZChzdHJ1Y3QgbGlzdF9oZWFkICppbmwsCisJCQkJCQkJIG5vZGVpZF90IG5vZGVpZCkKK3sKKwlzdHJ1Y3QgZXRoMTM5NF9ub2RlX3JlZiAqbm9kZTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsIGlubCwgbGlzdCkgeworCQlpZiAobm9kZS0+dWQtPm5lLT5ub2RlaWQgPT0gbm9kZWlkKQorCQkJcmV0dXJuIG5vZGU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZXRoMTM5NF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZDsKKwlzdHJ1Y3QgZXRoMTM5NF9ob3N0X2luZm8gKmhpOworCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXY7CisJc3RydWN0IGV0aDEzOTRfbm9kZV9yZWYgKm5ld19ub2RlOworCXN0cnVjdCBldGgxMzk0X25vZGVfaW5mbyAqbm9kZV9pbmZvOworCisJdWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGRldmljZSk7CisKKwloaSA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZldGgxMzk0X2hpZ2hsZXZlbCwgdWQtPm5lLT5ob3N0KTsKKwlpZiAoIWhpKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW5ld19ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGV0aDEzOTRfbm9kZV9yZWYpLAorCQkJICAgaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlub2RlX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8pLAorCQkJICAgIGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUwpOworCWlmICghbm9kZV9pbmZvKSB7CisJCWtmcmVlKG5ld19ub2RlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJm5vZGVfaW5mby0+cGRnLmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZub2RlX2luZm8tPnBkZy5saXN0KTsKKwlub2RlX2luZm8tPnBkZy5zeiA9IDA7CisJbm9kZV9pbmZvLT5maWZvID0gRVRIRVIxMzk0X0lOVkFMSURfQUREUjsKKworCXVkLT5kZXZpY2UuZHJpdmVyX2RhdGEgPSBub2RlX2luZm87CisJbmV3X25vZGUtPnVkID0gdWQ7CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoaGktPmRldik7CisJbGlzdF9hZGRfdGFpbCgmbmV3X25vZGUtPmxpc3QsICZwcml2LT5pcF9ub2RlX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXRoMTM5NF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7CisJc3RydWN0IGV0aDEzOTRfaG9zdF9pbmZvICpoaTsKKwlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2OworCXN0cnVjdCBldGgxMzk0X25vZGVfcmVmICpvbGRfbm9kZTsKKwlzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8gKm5vZGVfaW5mbzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgKm47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXVkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCBkZXZpY2UpOworCWhpID0gaHBzYl9nZXRfaG9zdGluZm8oJmV0aDEzOTRfaGlnaGxldmVsLCB1ZC0+bmUtPmhvc3QpOworCWlmICghaGkpCisJCXJldHVybiAtRU5PRU5UOworCisJcHJpdiA9IG5ldGRldl9wcml2KGhpLT5kZXYpOworCisJb2xkX25vZGUgPSBldGgxMzk0X2ZpbmRfbm9kZSgmcHJpdi0+aXBfbm9kZV9saXN0LCB1ZCk7CisKKwlpZiAob2xkX25vZGUpIHsKKwkJbGlzdF9kZWwoJm9sZF9ub2RlLT5saXN0KTsKKwkJa2ZyZWUob2xkX25vZGUpOworCisJCW5vZGVfaW5mbyA9IChzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8qKXVkLT5kZXZpY2UuZHJpdmVyX2RhdGE7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5vZGVfaW5mby0+cGRnLmxvY2ssIGZsYWdzKTsKKwkJLyogVGhlIHBhcnRpYWwgZGF0YWdyYW0gbGlzdCBzaG91bGQgYmUgZW1wdHksIGJ1dCB3ZSdsbCBqdXN0CisJCSAqIG1ha2Ugc3VyZSBhbnl3YXkuLi4gKi8KKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBuLCAmbm9kZV9pbmZvLT5wZGcubGlzdCkgeworCQkJcHVyZ2VfcGFydGlhbF9kYXRhZ3JhbShsaCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbm9kZV9pbmZvLT5wZGcubG9jaywgZmxhZ3MpOworCisJCWtmcmVlKG5vZGVfaW5mbyk7CisJCXVkLT5kZXZpY2UuZHJpdmVyX2RhdGEgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGgxMzk0X3VwZGF0ZShzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkKQoreworCXN0cnVjdCBldGgxMzk0X2hvc3RfaW5mbyAqaGk7CisJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgZXRoMTM5NF9ub2RlX3JlZiAqbm9kZTsKKwlzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8gKm5vZGVfaW5mbzsKKworCWhpID0gaHBzYl9nZXRfaG9zdGluZm8oJmV0aDEzOTRfaGlnaGxldmVsLCB1ZC0+bmUtPmhvc3QpOworCWlmICghaGkpCisJCXJldHVybiAtRU5PRU5UOworCisJcHJpdiA9IG5ldGRldl9wcml2KGhpLT5kZXYpOworCisJbm9kZSA9IGV0aDEzOTRfZmluZF9ub2RlKCZwcml2LT5pcF9ub2RlX2xpc3QsIHVkKTsKKworCWlmICghbm9kZSkgeworCQlub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGV0aDEzOTRfbm9kZV9yZWYpLAorCQkJICAgICAgIGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUwpOworCQlpZiAoIW5vZGUpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlub2RlX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8pLAorCQkJCSAgICBpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMKTsKKwkJaWYgKCFub2RlX2luZm8pIHsKKwkJCWtmcmVlKG5vZGUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlzcGluX2xvY2tfaW5pdCgmbm9kZV9pbmZvLT5wZGcubG9jayk7CisJCUlOSVRfTElTVF9IRUFEKCZub2RlX2luZm8tPnBkZy5saXN0KTsKKwkJbm9kZV9pbmZvLT5wZGcuc3ogPSAwOworCisJCXVkLT5kZXZpY2UuZHJpdmVyX2RhdGEgPSBub2RlX2luZm87CisJCW5vZGUtPnVkID0gdWQ7CisKKwkJcHJpdiA9IG5ldGRldl9wcml2KGhpLT5kZXYpOworCQlsaXN0X2FkZF90YWlsKCZub2RlLT5saXN0LCAmcHJpdi0+aXBfbm9kZV9saXN0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCBldGgxMzk0X2lkX3RhYmxlW10gPSB7CisJeworCQkubWF0Y2hfZmxhZ3MgPSAoSUVFRTEzOTRfTUFUQ0hfU1BFQ0lGSUVSX0lEIHwKKwkJCQlJRUVFMTM5NF9NQVRDSF9WRVJTSU9OKSwKKwkJLnNwZWNpZmllcl9pZCA9CUVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRCwKKwkJLnZlcnNpb24gPSBFVEhFUjEzOTRfR0FTUF9WRVJTSU9OLAorCX0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaWVlZTEzOTQsIGV0aDEzOTRfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyIGV0aDEzOTRfcHJvdG9fZHJpdmVyID0geworCS5uYW1lCQk9ICJJUHY0IG92ZXIgMTM5NCBEcml2ZXIiLAorCS5pZF90YWJsZQk9IGV0aDEzOTRfaWRfdGFibGUsCisJLnVwZGF0ZQkJPSBldGgxMzk0X3VwZGF0ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gRVRIMTM5NF9EUklWRVJfTkFNRSwKKwkJLmJ1cwkJPSAmaWVlZTEzOTRfYnVzX3R5cGUsCisJCS5wcm9iZQkJPSBldGgxMzk0X3Byb2JlLAorCQkucmVtb3ZlCQk9IGV0aDEzOTRfcmVtb3ZlLAorCX0sCit9OworCisKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9yZXNldF9wcml2IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc2V0X210dSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBwcml2LT5ob3N0OworCXU2NCBndWlkID0gKigodTY0KikmKGhvc3QtPmNzci5yb20tPmJ1c19pbmZvX2RhdGFbM10pKTsKKwl1MTYgbWF4cGF5bG9hZCA9IDEgPDwgKGhvc3QtPmNzci5tYXhfcmVjICsgMSk7CisJaW50IG1heF9zcGVlZCA9IElFRUUxMzk0X1NQRUVEX01BWDsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJbWVtc2V0KHByaXYtPnVkX2xpc3QsIDAsIHNpemVvZihzdHJ1Y3Qgbm9kZV9lbnRyeSopICogQUxMX05PREVTKTsKKwlwcml2LT5iY19tYXhwYXlsb2FkID0gNTEyOworCisJLyogRGV0ZXJtaW5lIHNwZWVkIGxpbWl0ICovCisJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5vZGVfY291bnQ7IGkrKykKKwkJaWYgKG1heF9zcGVlZCA+IGhvc3QtPnNwZWVkX21hcFtOT0RFSURfVE9fTk9ERShob3N0LT5ub2RlX2lkKSAqCisJCQkJCQk2NCArIGldKQorCQkJbWF4X3NwZWVkID0gaG9zdC0+c3BlZWRfbWFwW05PREVJRF9UT19OT0RFKGhvc3QtPm5vZGVfaWQpICoKKwkJCQkJCSAgICA2NCArIGldOworCXByaXYtPmJjX3NzcGQgPSBtYXhfc3BlZWQ7CisKKwkvKiBXZSdsbCB1c2Ugb3VyIG1heHBheWxvYWQgYXMgdGhlIGRlZmF1bHQgbXR1ICovCisJaWYgKHNldF9tdHUpIHsKKwkJZGV2LT5tdHUgPSBtaW4oRVRIMTM5NF9EQVRBX0xFTiwKKwkJCSAgICAgICAoaW50KShtYXhwYXlsb2FkIC0KKwkJCQkgICAgIChzaXplb2YodW5pb24gZXRoMTM5NF9oZHIpICsKKwkJCQkgICAgICBFVEhFUjEzOTRfR0FTUF9PVkVSSEVBRCkpKTsKKworCQkvKiBTZXQgb3VyIGhhcmR3YXJlIGFkZHJlc3Mgd2hpbGUgd2UncmUgYXQgaXQgKi8KKwkJKih1NjQqKWRldi0+ZGV2X2FkZHIgPSBndWlkOworCQkqKHU2NCopZGV2LT5icm9hZGNhc3QgPSB+MHgwVUxMOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSByZWdpc3Rlcl9uZXRkZXYgKi8KK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9pbml0X2RldiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBPdXIgZnVuY3Rpb25zICovCisJZGV2LT5vcGVuCQk9IGV0aGVyMTM5NF9vcGVuOworCWRldi0+c3RvcAkJPSBldGhlcjEzOTRfc3RvcDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGV0aGVyMTM5NF90eDsKKwlkZXYtPmdldF9zdGF0cwkJPSBldGhlcjEzOTRfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0CQk9IGV0aGVyMTM5NF90eF90aW1lb3V0OworCWRldi0+Y2hhbmdlX210dQkJPSBldGhlcjEzOTRfY2hhbmdlX210dTsKKworCWRldi0+aGFyZF9oZWFkZXIJPSBldGhlcjEzOTRfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIJPSBldGhlcjEzOTRfcmVidWlsZF9oZWFkZXI7CisJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZQk9IGV0aGVyMTM5NF9oZWFkZXJfY2FjaGU7CisJZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlPSBldGhlcjEzOTRfaGVhZGVyX2NhY2hlX3VwZGF0ZTsKKwlkZXYtPmhhcmRfaGVhZGVyX3BhcnNlCT0gZXRoZXIxMzk0X2hlYWRlcl9wYXJzZTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcwk9IGV0aGVyMTM5NF9tYWNfYWRkcjsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworCisJLyogU29tZSBjb25zdGFudHMgKi8KKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gRVRIRVIxMzk0X1RJTUVPVVQ7CisJZGV2LT5mbGFncwkJPSBJRkZfQlJPQURDQVNUIHwgSUZGX01VTFRJQ0FTVDsKKwlkZXYtPmZlYXR1cmVzCQk9IE5FVElGX0ZfSElHSERNQTsKKwlkZXYtPmFkZHJfbGVuCQk9IEVUSDEzOTRfQUxFTjsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiAJPSBFVEgxMzk0X0hMRU47CisJZGV2LT50eXBlCQk9IEFSUEhSRF9JRUVFMTM5NDsKKworCWV0aGVyMTM5NF9yZXNldF9wcml2IChkZXYsIDEpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZXZlcnkgdGltZSBhIGNhcmQgaXMgZm91bmQuIEl0IGlzIGdlbmVyYWxseSBjYWxsZWQKKyAqIHdoZW4gdGhlIG1vZHVsZSBpcyBpbnN0YWxsZWQuIFRoaXMgaXMgd2hlcmUgd2UgYWRkIGFsbCBvZiBvdXIgZXRoZXJuZXQKKyAqIGRldmljZXMuIE9uZSBmb3IgZWFjaCBob3N0LgorICovCitzdGF0aWMgdm9pZCBldGhlcjEzOTRfYWRkX2hvc3QgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGV0aDEzOTRfaG9zdF9pbmZvICpoaSA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdjsKKwlzdGF0aWMgaW50IHZlcnNpb25fcHJpbnRlZCA9IDA7CisJdTY0IGZpZm9fYWRkcjsKKworCWlmICghKGhvc3QtPmNvbmZpZ19yb21zICYgSFBTQl9DT05GSUdfUk9NX0VOVFJZX0lQMTM5NCkpCisJCXJldHVybjsKKworCWZpZm9fYWRkciA9IGhwc2JfYWxsb2NhdGVfYW5kX3JlZ2lzdGVyX2FkZHJzcGFjZSgmZXRoMTM5NF9oaWdobGV2ZWwsCisJCQkJCQkJIGhvc3QsCisJCQkJCQkJICZhZGRyX29wcywKKwkJCQkJCQkgRVRIRVIxMzk0X1JFR0lPTl9BRERSX0xFTiwKKwkJCQkJCQkgRVRIRVIxMzk0X1JFR0lPTl9BRERSX0xFTiwKKwkJCQkJCQkgLTEsIC0xKTsKKwlpZiAoZmlmb19hZGRyID09IH4wVUxMKQorCQlnb3RvIG91dDsKKworCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlFVEgxMzk0X1BSSU5UX0cgKEtFUk5fSU5GTywgIiVzXG4iLCB2ZXJzaW9uKTsKKworCS8qIFdlIHNob3VsZCByZWFsbHkgaGF2ZSBvdXIgb3duIGFsbG9jX2hwc2JkZXYoKSBmdW5jdGlvbiBpbgorCSAqIG5ldF9pbml0LmMgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZSBvbmUgZm9yIGV0aGVybmV0IHRoZW4gaGlqYWNraW5nCisJICogaXQgZm9yIG91cnNlbHZlcy4gIFRoYXQgd2F5IHdlJ2QgYmUgYSByZWFsIG5ldHdvcmtpbmcgZGV2aWNlLiAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZiAoc3RydWN0IGV0aDEzOTRfcHJpdikpOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCUVUSDEzOTRfUFJJTlRfRyAoS0VSTl9FUlIsICJPdXQgb2YgbWVtb3J5IHRyeWluZyB0byBhbGxvY2F0ZSAiCisJCQkJICJldGhlcmRldmljZSBmb3IgSUVFRSAxMzk0IGRldmljZSAlcy0lZFxuIiwKKwkJCQkgaG9zdC0+ZHJpdmVyLT5uYW1lLCBob3N0LT5pZCk7CisJCWdvdG8gb3V0OworICAgICAgICB9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmaG9zdC0+ZGV2aWNlKTsKKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmlwX25vZGVfbGlzdCk7CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJcHJpdi0+aG9zdCA9IGhvc3Q7CisJcHJpdi0+bG9jYWxfZmlmbyA9IGZpZm9fYWRkcjsKKworCWhpID0gaHBzYl9jcmVhdGVfaG9zdGluZm8oJmV0aDEzOTRfaGlnaGxldmVsLCBob3N0LCBzaXplb2YoKmhpKSk7CisKKwlpZiAoaGkgPT0gTlVMTCkgeworCQlFVEgxMzk0X1BSSU5UX0cgKEtFUk5fRVJSLCAiT3V0IG9mIG1lbW9yeSB0cnlpbmcgdG8gY3JlYXRlICIKKwkJCQkgImhvc3RpbmZvIGZvciBJRUVFIDEzOTQgZGV2aWNlICVzLSVkXG4iLAorCQkJCSBob3N0LT5kcml2ZXItPm5hbWUsIGhvc3QtPmlkKTsKKwkJZ290byBvdXQ7CisgICAgICAgIH0KKworCWV0aGVyMTM5NF9pbml0X2RldihkZXYpOworCisJaWYgKHJlZ2lzdGVyX25ldGRldiAoZGV2KSkgeworCQlFVEgxMzk0X1BSSU5UIChLRVJOX0VSUiwgZGV2LT5uYW1lLCAiRXJyb3IgcmVnaXN0ZXJpbmcgbmV0d29yayBkcml2ZXJcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlFVEgxMzk0X1BSSU5UIChLRVJOX0lORk8sIGRldi0+bmFtZSwgIklFRUUtMTM5NCBJUHY0IG92ZXIgMTM5NCBFdGhlcm5ldCAoZnctaG9zdCVkKVxuIiwKKwkJICAgICAgIGhvc3QtPmlkKTsKKworCWhpLT5ob3N0ID0gaG9zdDsKKwloaS0+ZGV2ID0gZGV2OworCisJLyogSWdub3JlIHZhbGlkaXR5IGluIGhvcGVzIHRoYXQgaXQgd2lsbCBiZSBzZXQgaW4gdGhlIGZ1dHVyZS4gIEl0J2xsCisJICogYmUgY2hlY2tlZCB3aGVuIHRoZSBldGggZGV2aWNlIGlzIG9wZW5lZC4gKi8KKwlwcml2LT5icm9hZGNhc3RfY2hhbm5lbCA9IGhvc3QtPmNzci5icm9hZGNhc3RfY2hhbm5lbCAmIDB4M2Y7CisKKwlwcml2LT5pc28gPSBocHNiX2lzb19yZWN2X2luaXQoaG9zdCwgKEVUSEVSMTM5NF9HQVNQX0JVRkZFUlMgKiAyICoKKwkJCQkJICAgICAgKDEgPDwgKGhvc3QtPmNzci5tYXhfcmVjICsgMSkpKSwKKwkJCQkgICAgICAgRVRIRVIxMzk0X0dBU1BfQlVGRkVSUywKKwkJCQkgICAgICAgcHJpdi0+YnJvYWRjYXN0X2NoYW5uZWwsCisJCQkJICAgICAgIEhQU0JfSVNPX0RNQV9QQUNLRVRfUEVSX0JVRkZFUiwKKwkJCQkgICAgICAgMSwgZXRoZXIxMzk0X2lzbyk7CisJaWYgKHByaXYtPmlzbyA9PSBOVUxMKSB7CisJCUVUSDEzOTRfUFJJTlQoS0VSTl9FUlIsIGRldi0+bmFtZSwKKwkJCSAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgaXNvY2hyb25vdXMgcmVjZWl2ZSBjb250ZXh0ICIKKwkJCSAgICAgICJmb3IgdGhlIGJyb2FkY2FzdCBjaGFubmVsXG4iKTsKKwkJcHJpdi0+YmNfc3RhdGUgPSBFVEhFUjEzOTRfQkNfRVJST1I7CisJfSBlbHNlIHsKKwkJaWYgKGhwc2JfaXNvX3JlY3Zfc3RhcnQocHJpdi0+aXNvLCAtMSwgKDEgPDwgMyksIC0xKSA8IDApCisJCQlwcml2LT5iY19zdGF0ZSA9IEVUSEVSMTM5NF9CQ19TVE9QUEVEOworCQllbHNlCisJCQlwcml2LT5iY19zdGF0ZSA9IEVUSEVSMTM5NF9CQ19SVU5OSU5HOworCX0KKworCXJldHVybjsKKworb3V0OgorCWlmIChkZXYgIT0gTlVMTCkKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwlpZiAoaGkpCisJCWhwc2JfZGVzdHJveV9ob3N0aW5mbygmZXRoMTM5NF9oaWdobGV2ZWwsIGhvc3QpOworCisJcmV0dXJuOworfQorCisvKiBSZW1vdmUgYSBjYXJkIGZyb20gb3VyIGxpc3QgKi8KK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9yZW1vdmVfaG9zdCAoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgZXRoMTM5NF9ob3N0X2luZm8gKmhpOworCisJaGkgPSBocHNiX2dldF9ob3N0aW5mbygmZXRoMTM5NF9oaWdobGV2ZWwsIGhvc3QpOworCWlmIChoaSAhPSBOVUxMKSB7CisJCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihoaS0+ZGV2KTsKKworCQlocHNiX3VucmVnaXN0ZXJfYWRkcnNwYWNlKCZldGgxMzk0X2hpZ2hsZXZlbCwgaG9zdCwKKwkJCQkJICBwcml2LT5sb2NhbF9maWZvKTsKKworCQlpZiAocHJpdi0+aXNvICE9IE5VTEwpCisJCQlocHNiX2lzb19zaHV0ZG93bihwcml2LT5pc28pOworCisJCWlmIChoaS0+ZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldiAoaGktPmRldik7CisJCQlmcmVlX25ldGRldihoaS0+ZGV2KTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyogQSByZXNldCBoYXMganVzdCBhcmlzZW4gKi8KK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9ob3N0X3Jlc2V0IChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworCXN0cnVjdCBldGgxMzk0X2hvc3RfaW5mbyAqaGk7CisJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKmxoLCAqbjsKKwlzdHJ1Y3QgZXRoMTM5NF9ub2RlX3JlZiAqbm9kZTsKKwlzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8gKm5vZGVfaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaGkgPSBocHNiX2dldF9ob3N0aW5mbygmZXRoMTM5NF9oaWdobGV2ZWwsIGhvc3QpOworCisJLyogVGhpcyBjYW4gaGFwcGVuIGZvciBob3N0cyB0aGF0IHdlIGRvbid0IHVzZSAqLworCWlmIChoaSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlkZXYgPSBoaS0+ZGV2OworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogUmVzZXQgb3VyIHByaXZhdGUgaG9zdCBkYXRhLCBidXQgbm90IG91ciBtdHUgKi8KKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCWV0aGVyMTM5NF9yZXNldF9wcml2IChkZXYsIDApOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmcHJpdi0+aXBfbm9kZV9saXN0LCBsaXN0KSB7CisJCW5vZGVfaW5mbyA9IChzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8qKW5vZGUtPnVkLT5kZXZpY2UuZHJpdmVyX2RhdGE7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5vZGVfaW5mby0+cGRnLmxvY2ssIGZsYWdzKTsKKworCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGgsIG4sICZub2RlX2luZm8tPnBkZy5saXN0KSB7CisJCQlwdXJnZV9wYXJ0aWFsX2RhdGFncmFtKGxoKTsKKwkJfQorCisJCUlOSVRfTElTVF9IRUFEKCYobm9kZV9pbmZvLT5wZGcubGlzdCkpOworCQlub2RlX2luZm8tPnBkZy5zeiA9IDA7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbm9kZV9pbmZvLT5wZGcubG9jaywgZmxhZ3MpOworCX0KKworCW5ldGlmX3dha2VfcXVldWUgKGRldik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhXIEhlYWRlciBuZXQgZGV2aWNlIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gYWRhcHRlZCBmcm9tIG5ldC9ldGhlcm5ldC9ldGguYyAqLworCisKKy8qIENyZWF0ZSBhIGZha2UgTUFDIGhlYWRlciBmb3IgYW4gYXJiaXRyYXJ5IHByb3RvY29sIGxheWVyLgorICogc2FkZHI9TlVMTCBtZWFucyB1c2UgZGV2aWNlIHNvdXJjZSBhZGRyZXNzCisgKiBkYWRkcj1OVUxMIG1lYW5zIGxlYXZlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKGVnIHVucmVzb2x2ZWQgYXJwKS4gKi8KK3N0YXRpYyBpbnQgZXRoZXIxMzk0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwKKwkJCSAgICB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IGV0aDEzOTRoZHIgKmV0aCA9IChzdHJ1Y3QgZXRoMTM5NGhkciAqKXNrYl9wdXNoKHNrYiwgRVRIMTM5NF9ITEVOKTsKKworCWV0aC0+aF9wcm90byA9IGh0b25zKHR5cGUpOworCisJaWYgKGRldi0+ZmxhZ3MgJiAoSUZGX0xPT1BCQUNLfElGRl9OT0FSUCkpIHsKKwkJbWVtc2V0KGV0aC0+aF9kZXN0LCAwLCBkZXYtPmFkZHJfbGVuKTsKKwkJcmV0dXJuKGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwl9CisKKwlpZiAoZGFkZHIpIHsKKwkJbWVtY3B5KGV0aC0+aF9kZXN0LGRhZGRyLGRldi0+YWRkcl9sZW4pOworCQlyZXR1cm4gZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJfQorCisJcmV0dXJuIC1kZXYtPmhhcmRfaGVhZGVyX2xlbjsKKworfQorCisKKy8qIFJlYnVpbGQgdGhlIGZha2VkIE1BQyBoZWFkZXIuIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuIEFSUAorICogKG9yIGluIGZ1dHVyZSBvdGhlciBhZGRyZXNzIHJlc29sdXRpb24pIGhhcyBjb21wbGV0ZWQgb24gdGhpcworICogc2tfYnVmZi4gV2Ugbm93IGxldCBBUlAgZmlsbCBpbiB0aGUgb3RoZXIgZmllbGRzLgorICoKKyAqIFRoaXMgcm91dGluZSBDQU5OT1QgdXNlIGNhY2hlZCBkc3QtPm5laWdoIQorICogUmVhbGx5LCBpdCBpcyB1c2VkIG9ubHkgd2hlbiBkc3QtPm5laWdoIGlzIHdyb25nLgorICovCitzdGF0aWMgaW50IGV0aGVyMTM5NF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBldGgxMzk0aGRyICpldGggPSAoc3RydWN0IGV0aDEzOTRoZHIgKilza2ItPmRhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCisJc3dpdGNoIChldGgtPmhfcHJvdG8pIHsKKworI2lmZGVmIENPTkZJR19JTkVUCisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKyAJCXJldHVybiBhcnBfZmluZCgodW5zaWduZWQgY2hhciopJmV0aC0+aF9kZXN0LCBza2IpOworI2VuZGlmCisJZGVmYXVsdDoKKwkJRVRIMTM5NF9QUklOVChLRVJOX0RFQlVHLCBkZXYtPm5hbWUsCisJCQkgICAgICAidW5hYmxlIHRvIHJlc29sdmUgdHlwZSAlMDR4IGFkZHJlc3Nlcy5cbiIsCisJCQkgICAgICBldGgtPmhfcHJvdG8pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGhlcjEzOTRfaGVhZGVyX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKKwltZW1jcHkoaGFkZHIsIGRldi0+ZGV2X2FkZHIsIEVUSDEzOTRfQUxFTik7CisJcmV0dXJuIEVUSDEzOTRfQUxFTjsKK30KKworCitzdGF0aWMgaW50IGV0aGVyMTM5NF9oZWFkZXJfY2FjaGUoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBoaF9jYWNoZSAqaGgpCit7CisJdW5zaWduZWQgc2hvcnQgdHlwZSA9IGhoLT5oaF90eXBlOworCXN0cnVjdCBldGgxMzk0aGRyICpldGggPSAoc3RydWN0IGV0aDEzOTRoZHIqKSgoKHU4KiloaC0+aGhfZGF0YSkgKworCQkJCQkJICAgICAgKDE2IC0gRVRIMTM5NF9ITEVOKSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CisKKwlpZiAodHlwZSA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJZXRoLT5oX3Byb3RvID0gdHlwZTsKKwltZW1jcHkoZXRoLT5oX2Rlc3QsIG5laWdoLT5oYSwgZGV2LT5hZGRyX2xlbik7CisKKwloaC0+aGhfbGVuID0gRVRIMTM5NF9ITEVOOworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgYnkgQWRkcmVzcyBSZXNvbHV0aW9uIG1vZHVsZSB0byBub3RpZnkgY2hhbmdlcyBpbiBhZGRyZXNzLiAqLworc3RhdGljIHZvaWQgZXRoZXIxMzk0X2hlYWRlcl9jYWNoZV91cGRhdGUoc3RydWN0IGhoX2NhY2hlICpoaCwKKwkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgIHVuc2lnbmVkIGNoYXIgKiBoYWRkcikKK3sKKwltZW1jcHkoKCh1OCopaGgtPmhoX2RhdGEpICsgKDE2IC0gRVRIMTM5NF9ITEVOKSwgaGFkZHIsIGRldi0+YWRkcl9sZW4pOworfQorCitzdGF0aWMgaW50IGV0aGVyMTM5NF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBOb3QgZ29pbmcgdG8gYWxsb3cgc2V0dGluZyB0aGUgTUFDIGFkZHJlc3MsIHdlIHJlYWxseSBuZWVkIHRvIHVzZQorCSAqIHRoZSByZWFsIG9uZSBzdXBwbGllZCBieSB0aGUgaGFyZHdhcmUgKi8KKwkgcmV0dXJuIC1FSU5WQUw7CisgfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGF0YWdyYW0gcmVjZXB0aW9uIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvcGllZCBmcm9tIG5ldC9ldGhlcm5ldC9ldGguYyAqLworc3RhdGljIGlubGluZSB1MTYgZXRoZXIxMzk0X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXRoMTM5NGhkciAqZXRoOworCXVuc2lnbmVkIGNoYXIgKnJhd3A7CisKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3B1bGwgKHNrYiwgRVRIMTM5NF9ITEVOKTsKKwlldGggPSBldGgxMzk0X2hkcihza2IpOworCisJaWYgKCpldGgtPmhfZGVzdCAmIDEpIHsKKwkJaWYgKG1lbWNtcChldGgtPmhfZGVzdCwgZGV2LT5icm9hZGNhc3QsIGRldi0+YWRkcl9sZW4pPT0wKQorCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9CUk9BRENBU1Q7CisjaWYgMAorCQllbHNlCisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX01VTFRJQ0FTVDsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWlmIChtZW1jbXAoZXRoLT5oX2Rlc3QsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pKQorCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisgICAgICAgIH0KKworCWlmIChudG9ocyAoZXRoLT5oX3Byb3RvKSA+PSAxNTM2KQorCQlyZXR1cm4gZXRoLT5oX3Byb3RvOworCisJcmF3cCA9IHNrYi0+ZGF0YTsKKworICAgICAgICBpZiAoKih1bnNpZ25lZCBzaG9ydCAqKXJhd3AgPT0gMHhGRkZGKQorCQlyZXR1cm4gaHRvbnMgKEVUSF9QXzgwMl8zKTsKKworICAgICAgICByZXR1cm4gaHRvbnMgKEVUSF9QXzgwMl8yKTsKK30KKworLyogUGFyc2UgYW4gZW5jYXBzdWxhdGVkIElQMTM5NCBoZWFkZXIgaW50byBhbiBldGhlcm5ldCBmcmFtZSBwYWNrZXQuCisgKiBXZSBhbHNvIHBlcmZvcm0gQVJQIHRyYW5zbGF0aW9uIGhlcmUsIGlmIG5lZWQgYmUuICAqLworc3RhdGljIGlubGluZSB1MTYgZXRoZXIxMzk0X3BhcnNlX2VuY2FwKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCW5vZGVpZF90IHNyY2lkLCBub2RlaWRfdCBkZXN0aWQsCisJCQkJCXUxNiBldGhlcl90eXBlKQoreworCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXU2NCBkZXN0X2h3OworCXVuc2lnbmVkIHNob3J0IHJldCA9IDA7CisKKwkvKiBTZXR1cCBvdXIgaHcgYWRkcmVzc2VzLiBXZSB1c2UgdGhlc2UgdG8gYnVpbGQgdGhlCisJICogZXRoZXJuZXQgaGVhZGVyLiAgKi8KKwlpZiAoZGVzdGlkID09IChMT0NBTF9CVVMgfCBBTExfTk9ERVMpKQorCQlkZXN0X2h3ID0gfjBVTEw7ICAvKiBicm9hZGNhc3QgKi8KKwllbHNlCisJCWRlc3RfaHcgPSBjcHVfdG9fYmU2NCgoKCh1NjQpcHJpdi0+aG9zdC0+Y3NyLmd1aWRfaGkpIDw8IDMyKSB8CisJCQkJICAgICAgcHJpdi0+aG9zdC0+Y3NyLmd1aWRfbG8pOworCisJLyogSWYgdGhpcyBpcyBhbiBBUlAgcGFja2V0LCBjb252ZXJ0IGl0LiBGaXJzdCwgd2Ugd2FudCB0byBtYWtlCisJICogdXNlIG9mIHNvbWUgb2YgdGhlIGZpZWxkcywgc2luY2UgdGhleSB0ZWxsIHVzIGEgbGl0dGxlIGJpdAorCSAqIGFib3V0IHRoZSBzZW5kaW5nIG1hY2hpbmUuICAqLworCWlmIChldGhlcl90eXBlID09IF9fY29uc3RhbnRfaHRvbnMgKEVUSF9QX0FSUCkpIHsKKwkJc3RydWN0IGV0aDEzOTRfYXJwICphcnAxMzk0ID0gKHN0cnVjdCBldGgxMzk0X2FycCopc2tiLT5kYXRhOworCQlzdHJ1Y3QgYXJwaGRyICphcnAgPSAoc3RydWN0IGFycGhkciAqKXNrYi0+ZGF0YTsKKwkJdW5zaWduZWQgY2hhciAqYXJwX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopKGFycCArIDEpOworCQl1NjQgZmlmb19hZGRyID0gKHU2NCludG9ocyhhcnAxMzk0LT5maWZvX2hpKSA8PCAzMiB8CisJCQludG9obChhcnAxMzk0LT5maWZvX2xvKTsKKwkJdTggbWF4X3JlYyA9IG1pbihwcml2LT5ob3N0LT5jc3IubWF4X3JlYywKKwkJCQkgKHU4KShhcnAxMzk0LT5tYXhfcmVjKSk7CisJCWludCBzc3BkID0gYXJwMTM5NC0+c3NwZDsKKwkJdTE2IG1heHBheWxvYWQ7CisJCXN0cnVjdCBldGgxMzk0X25vZGVfcmVmICpub2RlOworCQlzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8gKm5vZGVfaW5mbzsKKworCQkvKiBTYW5pdHkgY2hlY2suIE1hY09TWCBzZWVtcyB0byBiZSBzZW5kaW5nIHVzIDEzMSBpbiB0aGlzCisJCSAqIGZpZWxkIChhdGxlYXN0IG9uIG15IFBhbnRoZXIgRzUpLiBOb3Qgc3VyZSB3aHkuICovCisJCWlmIChzc3BkID4gNSB8fCBzc3BkIDwgMCkKKwkJCXNzcGQgPSAwOworCisJCW1heHBheWxvYWQgPSBtaW4oZXRoMTM5NF9zcGVlZHRvX21heHBheWxvYWRbc3NwZF0sICh1MTYpKDEgPDwgKG1heF9yZWMgKyAxKSkpOworCisJCW5vZGUgPSBldGgxMzk0X2ZpbmRfbm9kZV9ndWlkKCZwcml2LT5pcF9ub2RlX2xpc3QsCisJCQkJCSAgICAgIGJlNjRfdG9fY3B1KGFycDEzOTQtPnNfdW5pcV9pZCkpOworCQlpZiAoIW5vZGUpIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJbm9kZV9pbmZvID0gKHN0cnVjdCBldGgxMzk0X25vZGVfaW5mbyopbm9kZS0+dWQtPmRldmljZS5kcml2ZXJfZGF0YTsKKworCQkvKiBVcGRhdGUgb3VyIHNwZWVkL3BheWxvYWQvZmlmb19vZmZzZXQgdGFibGUgKi8KKwkJbm9kZV9pbmZvLT5tYXhwYXlsb2FkID0JbWF4cGF5bG9hZDsKKwkJbm9kZV9pbmZvLT5zc3BkID0Jc3NwZDsKKwkJbm9kZV9pbmZvLT5maWZvID0JZmlmb19hZGRyOworCisJCS8qIE5vdyB0aGF0IHdlJ3JlIGRvbmUgd2l0aCB0aGUgMTM5NCBzcGVjaWZpYyBzdHVmZiwgd2UnbGwKKwkJICogbmVlZCB0byBhbHRlciBzb21lIG9mIHRoZSBkYXRhLiAgQmVsaWV2ZSBpdCBvciBub3QsIGFsbAorCQkgKiB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaXMgc2VuZGVyX0lQX2FkZHJlc3MgbmVlZHMgdG8gYmUKKwkJICogbW92ZWQsIHRoZSBkZXN0aW5hdGlvbiBoYXJkd2FyZSBhZGRyZXNzIGdldCBzdHVmZmVkCisJCSAqIGluIGFuZCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggc2V0IHRvIDguCisJCSAqCisJCSAqIElNUE9SVEFOVDogVGhlIGNvZGUgYmVsb3cgb3ZlcndyaXRlcyAxMzk0IHNwZWNpZmljIGRhdGEKKwkJICogbmVlZGVkIGFib3ZlIHNvIGtlZXAgdGhlIG11bmdpbmcgb2YgdGhlIGRhdGEgZm9yIHRoZQorCQkgKiBoaWdoZXIgbGV2ZWwgSVAgc3RhY2sgbGFzdC4gKi8KKworCQlhcnAtPmFyX2hsbiA9IDg7CisJCWFycF9wdHIgKz0gYXJwLT5hcl9obG47CQkvKiBza2lwIG92ZXIgc2VuZGVyIHVuaXF1ZSBpZCAqLworCQkqKHUzMiopYXJwX3B0ciA9IGFycDEzOTQtPnNpcDsJLyogbW92ZSBzZW5kZXIgSVAgYWRkciAqLworCQlhcnBfcHRyICs9IGFycC0+YXJfcGxuOwkJLyogc2tpcCBvdmVyIHNlbmRlciBJUCBhZGRyICovCisKKwkJaWYgKGFycC0+YXJfb3AgPT0gMSkKKwkJCS8qIGp1c3Qgc2V0IEFSUCByZXEgdGFyZ2V0IHVuaXF1ZSBJRCB0byAwICovCisJCQkqKCh1NjQqKWFycF9wdHIpID0gMDsKKwkJZWxzZQorCQkJKigodTY0KilhcnBfcHRyKSA9ICooKHU2NCopZGV2LT5kZXZfYWRkcik7CisJfQorCisJLyogTm93IGFkZCB0aGUgZXRoZXJuZXQgaGVhZGVyLiAqLworCWlmIChkZXYtPmhhcmRfaGVhZGVyIChza2IsIGRldiwgX19jb25zdGFudF9udG9ocyAoZXRoZXJfdHlwZSksCisJCQkgICAgICAmZGVzdF9odywgTlVMTCwgc2tiLT5sZW4pID49IDApCisJCXJldCA9IGV0aGVyMTM5NF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZyYWdtZW50X292ZXJsYXAoc3RydWN0IGxpc3RfaGVhZCAqZnJhZ19saXN0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuKQoreworCXN0cnVjdCBmcmFnbWVudF9pbmZvICpmaTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmksIGZyYWdfbGlzdCwgbGlzdCkgeworCQlpZiAoICEgKChvZmZzZXQgPiAoZmktPm9mZnNldCArIGZpLT5sZW4gLSAxKSkgfHwKKwkJICAgICAgICgob2Zmc2V0ICsgbGVuIC0gMSkgPCBmaS0+b2Zmc2V0KSkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxpc3RfaGVhZCAqZmluZF9wYXJ0aWFsX2RhdGFncmFtKHN0cnVjdCBsaXN0X2hlYWQgKnBkZ2wsIGludCBkZ2wpCit7CisJc3RydWN0IHBhcnRpYWxfZGF0YWdyYW0gKnBkOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwZCwgcGRnbCwgbGlzdCkgeworCQlpZiAocGQtPmRnbCA9PSBkZ2wpCisJCQlyZXR1cm4gJnBkLT5saXN0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogQXNzdW1lcyB0aGF0IG5ldyBmcmFnbWVudCBkb2VzIG5vdCBvdmVybGFwIGFueSBleGlzdGluZyBmcmFnbWVudHMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5ld19mcmFnbWVudChzdHJ1Y3QgbGlzdF9oZWFkICpmcmFnX2luZm8sIGludCBvZmZzZXQsIGludCBsZW4pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGg7CisJc3RydWN0IGZyYWdtZW50X2luZm8gKmZpLCAqZmkyLCAqbmV3OworCisJbGlzdF9mb3JfZWFjaChsaCwgZnJhZ19pbmZvKSB7CisJCWZpID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IGZyYWdtZW50X2luZm8sIGxpc3QpOworCQlpZiAoKGZpLT5vZmZzZXQgKyBmaS0+bGVuKSA9PSBvZmZzZXQpIHsKKwkJCS8qIFRoZSBuZXcgZnJhZ21lbnQgY2FuIGJlIHRhY2tlZCBvbiB0byB0aGUgZW5kICovCisJCQlmaS0+bGVuICs9IGxlbjsKKwkJCS8qIERpZCB0aGUgbmV3IGZyYWdtZW50IHBsdWcgYSBob2xlPyAqLworCQkJZmkyID0gbGlzdF9lbnRyeShsaC0+bmV4dCwgc3RydWN0IGZyYWdtZW50X2luZm8sIGxpc3QpOworCQkJaWYgKChmaS0+b2Zmc2V0ICsgZmktPmxlbikgPT0gZmkyLT5vZmZzZXQpIHsKKwkJCQkvKiBnbHVlIGZyYWdtZW50cyB0b2dldGhlciAqLworCQkJCWZpLT5sZW4gKz0gZmkyLT5sZW47CisJCQkJbGlzdF9kZWwobGgtPm5leHQpOworCQkJCWtmcmVlKGZpMik7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmICgob2Zmc2V0ICsgbGVuKSA9PSBmaS0+b2Zmc2V0KSB7CisJCQkvKiBUaGUgbmV3IGZyYWdtZW50IGNhbiBiZSB0YWNrZWQgb24gdG8gdGhlIGJlZ2lubmluZyAqLworCQkJZmktPm9mZnNldCA9IG9mZnNldDsKKwkJCWZpLT5sZW4gKz0gbGVuOworCQkJLyogRGlkIHRoZSBuZXcgZnJhZ21lbnQgcGx1ZyBhIGhvbGU/ICovCisJCQlmaTIgPSBsaXN0X2VudHJ5KGxoLT5wcmV2LCBzdHJ1Y3QgZnJhZ21lbnRfaW5mbywgbGlzdCk7CisJCQlpZiAoKGZpMi0+b2Zmc2V0ICsgZmkyLT5sZW4pID09IGZpLT5vZmZzZXQpIHsKKwkJCQkvKiBnbHVlIGZyYWdtZW50cyB0b2dldGhlciAqLworCQkJCWZpMi0+bGVuICs9IGZpLT5sZW47CisJCQkJbGlzdF9kZWwobGgpOworCQkJCWtmcmVlKGZpKTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKG9mZnNldCA+IChmaS0+b2Zmc2V0ICsgZmktPmxlbikpIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKChvZmZzZXQgKyBsZW4pIDwgZmktPm9mZnNldCkgeworCQkJbGggPSBsaC0+cHJldjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJbmV3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZyYWdtZW50X2luZm8pLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW5ldykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZXctPm9mZnNldCA9IG9mZnNldDsKKwluZXctPmxlbiA9IGxlbjsKKworCWxpc3RfYWRkKCZuZXctPmxpc3QsIGxoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZXdfcGFydGlhbF9kYXRhZ3JhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwZGdsLCBpbnQgZGdsLAorCQkJCSAgICAgICBpbnQgZGdfc2l6ZSwgY2hhciAqZnJhZ19idWYsCisJCQkJICAgICAgIGludCBmcmFnX29mZiwgaW50IGZyYWdfbGVuKQoreworCXN0cnVjdCBwYXJ0aWFsX2RhdGFncmFtICpuZXc7CisKKwluZXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSksIEdGUF9BVE9NSUMpOworCWlmICghbmV3KQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfTElTVF9IRUFEKCZuZXctPmZyYWdfaW5mbyk7CisKKwlpZiAobmV3X2ZyYWdtZW50KCZuZXctPmZyYWdfaW5mbywgZnJhZ19vZmYsIGZyYWdfbGVuKSA8IDApIHsKKwkJa2ZyZWUobmV3KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbmV3LT5kZ2wgPSBkZ2w7CisJbmV3LT5kZ19zaXplID0gZGdfc2l6ZTsKKworCW5ldy0+c2tiID0gZGV2X2FsbG9jX3NrYihkZ19zaXplICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyAxNSk7CisJaWYgKCFuZXctPnNrYikgeworCQlzdHJ1Y3QgZnJhZ21lbnRfaW5mbyAqZmkgPSBsaXN0X2VudHJ5KG5ldy0+ZnJhZ19pbmZvLm5leHQsCisJCQkJCQkgICAgICBzdHJ1Y3QgZnJhZ21lbnRfaW5mbywKKwkJCQkJCSAgICAgIGxpc3QpOworCQlrZnJlZShmaSk7CisJCWtmcmVlKG5ldyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNrYl9yZXNlcnZlKG5ldy0+c2tiLCAoZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyAxNSkgJiB+MTUpOworCW5ldy0+cGJ1ZiA9IHNrYl9wdXQobmV3LT5za2IsIGRnX3NpemUpOworCW1lbWNweShuZXctPnBidWYgKyBmcmFnX29mZiwgZnJhZ19idWYsIGZyYWdfbGVuKTsKKworCWxpc3RfYWRkKCZuZXctPmxpc3QsIHBkZ2wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVwZGF0ZV9wYXJ0aWFsX2RhdGFncmFtKHN0cnVjdCBsaXN0X2hlYWQgKnBkZ2wsIHN0cnVjdCBsaXN0X2hlYWQgKmxoLAorCQkJCQkgIGNoYXIgKmZyYWdfYnVmLCBpbnQgZnJhZ19vZmYsIGludCBmcmFnX2xlbikKK3sKKwlzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSAqcGQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSwgbGlzdCk7CisKKwlpZiAobmV3X2ZyYWdtZW50KCZwZC0+ZnJhZ19pbmZvLCBmcmFnX29mZiwgZnJhZ19sZW4pIDwgMCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkocGQtPnBidWYgKyBmcmFnX29mZiwgZnJhZ19idWYsIGZyYWdfbGVuKTsKKworCS8qIE1vdmUgbGlzdCBlbnRyeSB0byBiZWdpbm5pZyBvZiBsaXN0IHNvIHRoYXQgb2xkZXN0IHBhcnRpYWwKKwkgKiBkYXRhZ3JhbXMgcGVyY29sYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKwlsaXN0X2RlbChsaCk7CisJbGlzdF9hZGQobGgsIHBkZ2wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2RhdGFncmFtX2NvbXBsZXRlKHN0cnVjdCBsaXN0X2hlYWQgKmxoLCBpbnQgZGdfc2l6ZSkKK3sKKwlzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSAqcGQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSwgbGlzdCk7CisJc3RydWN0IGZyYWdtZW50X2luZm8gKmZpID0gbGlzdF9lbnRyeShwZC0+ZnJhZ19pbmZvLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBmcmFnbWVudF9pbmZvLCBsaXN0KTsKKworCXJldHVybiAoZmktPmxlbiA9PSBkZ19zaXplKTsKK30KKworLyogUGFja2V0IHJlY2VwdGlvbi4gV2UgY29udmVydCB0aGUgSVAxMzk0IGVuY2Fwc3VsYXRpb24gaGVhZGVyIHRvIGFuCisgKiBldGhlcm5ldCBoZWFkZXIsIGFuZCBmaWxsIGl0IHdpdGggc29tZSBvZiBvdXIgb3RoZXIgZmllbGRzLiBUaGlzIGlzCisgKiBhbiBpbmNvbWluZyBwYWNrZXQgZnJvbSB0aGUgMTM5NCBidXMuICAqLworc3RhdGljIGludCBldGhlcjEzOTRfZGF0YV9oYW5kbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzcmNpZCwgaW50IGRlc3RpZCwKKwkJCQkgIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5pb24gZXRoMTM5NF9oZHIgKmhkciA9ICh1bmlvbiBldGgxMzk0X2hkciAqKWJ1ZjsKKwl1MTYgZXRoZXJfdHlwZSA9IDA7ICAvKiBpbml0aWFsaXplZCB0byBjbGVhciB3YXJuaW5nICovCisJaW50IGhkcl9sZW47CisJc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZCA9IHByaXYtPnVkX2xpc3RbTk9ERUlEX1RPX05PREUoc3JjaWQpXTsKKwlzdHJ1Y3QgZXRoMTM5NF9ub2RlX2luZm8gKm5vZGVfaW5mbzsKKworCWlmICghdWQpIHsKKwkJc3RydWN0IGV0aDEzOTRfbm9kZV9yZWYgKm5vZGU7CisJCW5vZGUgPSBldGgxMzk0X2ZpbmRfbm9kZV9ub2RlaWQoJnByaXYtPmlwX25vZGVfbGlzdCwgc3JjaWQpOworCQlpZiAoIW5vZGUpIHsKKwkJCUhQU0JfUFJJTlQoS0VSTl9FUlIsICJldGhlcjEzOTQgcng6IHNlbmRlciBub2RlaWQgIgorCQkJCSAgICJsb29rdXAgZmFpbHVyZTogIiBOT0RFX0JVU19GTVQsCisJCQkJICAgTk9ERV9CVVNfQVJHUyhwcml2LT5ob3N0LCBzcmNpZCkpOworCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJcmV0dXJuIC0xOworCQl9CisJCXVkID0gbm9kZS0+dWQ7CisKKwkJcHJpdi0+dWRfbGlzdFtOT0RFSURfVE9fTk9ERShzcmNpZCldID0gdWQ7CisJfQorCisJbm9kZV9pbmZvID0gKHN0cnVjdCBldGgxMzk0X25vZGVfaW5mbyopdWQtPmRldmljZS5kcml2ZXJfZGF0YTsKKworCS8qIEZpcnN0LCBkaWQgd2UgcmVjZWl2ZSBhIGZyYWdtZW50ZWQgb3IgdW5mcmFnbWVudGVkIGRhdGFncmFtPyAqLworCWhkci0+d29yZHMud29yZDEgPSBudG9ocyhoZHItPndvcmRzLndvcmQxKTsKKworCWhkcl9sZW4gPSBoZHJfdHlwZV9sZW5baGRyLT5jb21tb24ubGZdOworCisJaWYgKGhkci0+Y29tbW9uLmxmID09IEVUSDEzOTRfSERSX0xGX1VGKSB7CisJCS8qIEFuIHVuZnJhZ21lbnRlZCBkYXRhZ3JhbSBoYXMgYmVlbiByZWNlaXZlZCBieSB0aGUgaWVlZTEzOTQKKwkJICogYnVzLiBCdWlsZCBhbiBza2J1ZmYgYXJvdW5kIGl0IHNvIHdlIGNhbiBwYXNzIGl0IHRvIHRoZQorCQkgKiBoaWdoIGxldmVsIG5ldHdvcmsgbGF5ZXIuICovCisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIDE1KTsKKwkJaWYgKCFza2IpIHsKKwkJCUhQU0JfUFJJTlQgKEtFUk5fRVJSLCAiZXRoZXIxMzk0IHJ4OiBsb3cgb24gbWVtXG4iKTsKKwkJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlza2JfcmVzZXJ2ZShza2IsIChkZXYtPmhhcmRfaGVhZGVyX2xlbiArIDE1KSAmIH4xNSk7CisJCW1lbWNweShza2JfcHV0KHNrYiwgbGVuIC0gaGRyX2xlbiksIGJ1ZiArIGhkcl9sZW4sIGxlbiAtIGhkcl9sZW4pOworCQlldGhlcl90eXBlID0gaGRyLT51Zi5ldGhlcl90eXBlOworCX0gZWxzZSB7CisJCS8qIEEgZGF0YWdyYW0gZnJhZ21lbnQgaGFzIGJlZW4gcmVjZWl2ZWQsIG5vdyB0aGUgZnVuIGJlZ2lucy4gKi8KKworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwZGdsLCAqbGg7CisJCXN0cnVjdCBwYXJ0aWFsX2RhdGFncmFtICpwZDsKKwkJaW50IGZnX29mZjsKKwkJaW50IGZnX2xlbiA9IGxlbiAtIGhkcl9sZW47CisJCWludCBkZ19zaXplOworCQlpbnQgZGdsOworCQlpbnQgcmV0dmFsOworCQlzdHJ1Y3QgcGRnX2xpc3QgKnBkZyA9ICYobm9kZV9pbmZvLT5wZGcpOworCisJCWhkci0+d29yZHMud29yZDMgPSBudG9ocyhoZHItPndvcmRzLndvcmQzKTsKKwkJLyogVGhlIDR0aCBoZWFkZXIgd29yZCBpcyByZXNlcnZlZCBzbyBubyBuZWVkIHRvIGRvIG50b2hzKCkgKi8KKworCQlpZiAoaGRyLT5jb21tb24ubGYgPT0gRVRIMTM5NF9IRFJfTEZfRkYpIHsKKwkJCWV0aGVyX3R5cGUgPSBoZHItPmZmLmV0aGVyX3R5cGU7CisJCQlkZ2wgPSBoZHItPmZmLmRnbDsKKwkJCWRnX3NpemUgPSBoZHItPmZmLmRnX3NpemUgKyAxOworCQkJZmdfb2ZmID0gMDsKKwkJfSBlbHNlIHsKKwkJCWhkci0+d29yZHMud29yZDIgPSBudG9ocyhoZHItPndvcmRzLndvcmQyKTsKKwkJCWRnbCA9IGhkci0+c2YuZGdsOworCQkJZGdfc2l6ZSA9IGhkci0+c2YuZGdfc2l6ZSArIDE7CisJCQlmZ19vZmYgPSBoZHItPnNmLmZnX29mZjsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRnLT5sb2NrLCBmbGFncyk7CisKKwkJcGRnbCA9ICYocGRnLT5saXN0KTsKKwkJbGggPSBmaW5kX3BhcnRpYWxfZGF0YWdyYW0ocGRnbCwgZGdsKTsKKworCQlpZiAobGggPT0gTlVMTCkgeworCQkJd2hpbGUgKHBkZy0+c3ogPj0gbWF4X3BhcnRpYWxfZGF0YWdyYW1zKSB7CisJCQkJLyogcmVtb3ZlIHRoZSBvbGRlc3QgKi8KKwkJCQlwdXJnZV9wYXJ0aWFsX2RhdGFncmFtKHBkZ2wtPnByZXYpOworCQkJCXBkZy0+c3otLTsKKwkJCX0KKworCQkJcmV0dmFsID0gbmV3X3BhcnRpYWxfZGF0YWdyYW0oZGV2LCBwZGdsLCBkZ2wsIGRnX3NpemUsCisJCQkJCQkgICAgICBidWYgKyBoZHJfbGVuLCBmZ19vZmYsCisJCQkJCQkgICAgICBmZ19sZW4pOworCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGctPmxvY2ssIGZsYWdzKTsKKwkJCQlnb3RvIGJhZF9wcm90bzsKKwkJCX0KKwkJCXBkZy0+c3orKzsKKwkJCWxoID0gZmluZF9wYXJ0aWFsX2RhdGFncmFtKHBkZ2wsIGRnbCk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgcGFydGlhbF9kYXRhZ3JhbSAqcGQ7CisKKwkJCXBkID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHBhcnRpYWxfZGF0YWdyYW0sIGxpc3QpOworCisJCQlpZiAoZnJhZ21lbnRfb3ZlcmxhcCgmcGQtPmZyYWdfaW5mbywgZmdfb2ZmLCBmZ19sZW4pKSB7CisJCQkJLyogT3ZlcmxhcHBpbmcgZnJhZ21lbnRzLCBvYmxpdGVyYXRlIG9sZAorCQkJCSAqIGRhdGFncmFtIGFuZCBzdGFydCBuZXcgb25lLiAqLworCQkJCXB1cmdlX3BhcnRpYWxfZGF0YWdyYW0obGgpOworCQkJCXJldHZhbCA9IG5ld19wYXJ0aWFsX2RhdGFncmFtKGRldiwgcGRnbCwgZGdsLAorCQkJCQkJCSAgICAgIGRnX3NpemUsCisJCQkJCQkJICAgICAgYnVmICsgaGRyX2xlbiwKKwkJCQkJCQkgICAgICBmZ19vZmYsIGZnX2xlbik7CisJCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQkJcGRnLT5zei0tOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGctPmxvY2ssIGZsYWdzKTsKKwkJCQkJZ290byBiYWRfcHJvdG87CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyZXR2YWwgPSB1cGRhdGVfcGFydGlhbF9kYXRhZ3JhbShwZGdsLCBsaCwKKwkJCQkJCQkJIGJ1ZiArIGhkcl9sZW4sCisJCQkJCQkJCSBmZ19vZmYsIGZnX2xlbik7CisJCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQkJLyogQ291bGRuJ3Qgc2F2ZSBvZmYgZnJhZ21lbnQgYW55d2F5CisJCQkJCSAqIHNvIG1pZ2h0IGFzIHdlbGwgb2JsaXRlcmF0ZSB0aGUKKwkJCQkJICogZGF0YWdyYW0gbm93LiAqLworCQkJCQlwdXJnZV9wYXJ0aWFsX2RhdGFncmFtKGxoKTsKKwkJCQkJcGRnLT5zei0tOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGctPmxvY2ssIGZsYWdzKTsKKwkJCQkJZ290byBiYWRfcHJvdG87CisJCQkJfQorCQkJfSAvKiBmcmFnbWVudCBvdmVybGFwICovCisJCX0gLyogbmV3IGRhdGFncmFtIG9yIGFkZCB0byBleGlzdGluZyBvbmUgKi8KKworCQlwZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBwYXJ0aWFsX2RhdGFncmFtLCBsaXN0KTsKKworCQlpZiAoaGRyLT5jb21tb24ubGYgPT0gRVRIMTM5NF9IRFJfTEZfRkYpIHsKKwkJCXBkLT5ldGhlcl90eXBlID0gZXRoZXJfdHlwZTsKKwkJfQorCisJCWlmIChpc19kYXRhZ3JhbV9jb21wbGV0ZShsaCwgZGdfc2l6ZSkpIHsKKwkJCWV0aGVyX3R5cGUgPSBwZC0+ZXRoZXJfdHlwZTsKKwkJCXBkZy0+c3otLTsKKwkJCXNrYiA9IHNrYl9nZXQocGQtPnNrYik7CisJCQlwdXJnZV9wYXJ0aWFsX2RhdGFncmFtKGxoKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZy0+bG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJLyogRGF0YWdyYW0gaXMgbm90IGNvbXBsZXRlLCB3ZSdyZSBkb25lIGZvciB0aGUKKwkJCSAqIG1vbWVudC4gKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZy0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IC8qIHVuZnJhbWdlbnRlZCBkYXRhZ3JhbSBvciBmcmFnbWVudGVkIG9uZSAqLworCisJLyogV3JpdGUgbWV0YWRhdGEsIGFuZCB0aGVuIHBhc3MgdG8gdGhlIHJlY2VpdmUgbGV2ZWwgKi8KKwlza2ItPmRldiA9IGRldjsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwkvKiBkb24ndCBjaGVjayBpdCAqLworCisJLyogUGFyc2UgdGhlIGVuY2Fwc3VsYXRpb24gaGVhZGVyLiBUaGlzIGFjdHVhbGx5IGRvZXMgdGhlIGpvYiBvZgorCSAqIGNvbnZlcnRpbmcgdG8gYW4gZXRoZXJuZXQgZnJhbWUgaGVhZGVyLCBhc3dlbGwgYXMgYXJwCisJICogY29udmVyc2lvbiBpZiBuZWVkZWQuIEFSUCBjb252ZXJzaW9uIGlzIGVhc2llciBpbiB0aGlzCisJICogZGlyZWN0aW9uLCBzaW5jZSB3ZSBhcmUgdXNpbmcgZXRoZXJuZXQgYXMgb3VyIGJhY2tlbmQuICAqLworCXNrYi0+cHJvdG9jb2wgPSBldGhlcjEzOTRfcGFyc2VfZW5jYXAoc2tiLCBkZXYsIHNyY2lkLCBkZXN0aWQsCisJCQkJCSAgICAgIGV0aGVyX3R5cGUpOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWlmICghc2tiLT5wcm90b2NvbCkgeworCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlnb3RvIGJhZF9wcm90bzsKKwl9CisKKwlpZiAobmV0aWZfcngoc2tiKSA9PSBORVRfUlhfRFJPUCkgeworCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlnb3RvIGJhZF9wcm90bzsKKwl9CisKKwkvKiBTdGF0aXN0aWNzICovCisJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCitiYWRfcHJvdG86CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGhlcjEzOTRfd3JpdGUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IHNyY2lkLCBpbnQgZGVzdGlkLAorCQkJICAgcXVhZGxldF90ICpkYXRhLCB1NjQgYWRkciwgc2l6ZV90IGxlbiwgdTE2IGZsYWdzKQoreworCXN0cnVjdCBldGgxMzk0X2hvc3RfaW5mbyAqaGk7CisKKwloaSA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZldGgxMzk0X2hpZ2hsZXZlbCwgaG9zdCk7CisJaWYgKGhpID09IE5VTEwpIHsKKwkJRVRIMTM5NF9QUklOVF9HKEtFUk5fRVJSLCAiQ291bGQgbm90IGZpbmQgbmV0IGRldmljZSBmb3IgaG9zdCAlc1xuIiwKKwkJCQlob3N0LT5kcml2ZXItPm5hbWUpOworCQlyZXR1cm4gUkNPREVfQUREUkVTU19FUlJPUjsKKwl9CisKKwlpZiAoZXRoZXIxMzk0X2RhdGFfaGFuZGxlcihoaS0+ZGV2LCBzcmNpZCwgZGVzdGlkLCAoY2hhciopZGF0YSwgbGVuKSkKKwkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7CisJZWxzZQorCQlyZXR1cm4gUkNPREVfQ09NUExFVEU7Cit9CisKK3N0YXRpYyB2b2lkIGV0aGVyMTM5NF9pc28oc3RydWN0IGhwc2JfaXNvICppc28pCit7CisJcXVhZGxldF90ICpkYXRhOworCWNoYXIgKmJ1ZjsKKwlzdHJ1Y3QgZXRoMTM5NF9ob3N0X2luZm8gKmhpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXUzMiBzcGVjaWZpZXJfaWQ7CisJdTE2IHNvdXJjZV9pZDsKKwlpbnQgaTsKKwlpbnQgbnJlYWR5OworCisJaGkgPSBocHNiX2dldF9ob3N0aW5mbygmZXRoMTM5NF9oaWdobGV2ZWwsIGlzby0+aG9zdCk7CisJaWYgKGhpID09IE5VTEwpIHsKKwkJRVRIMTM5NF9QUklOVF9HKEtFUk5fRVJSLCAiQ291bGQgbm90IGZpbmQgbmV0IGRldmljZSBmb3IgaG9zdCAlc1xuIiwKKwkJCQlpc28tPmhvc3QtPmRyaXZlci0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlkZXYgPSBoaS0+ZGV2OworCisJbnJlYWR5ID0gaHBzYl9pc29fbl9yZWFkeShpc28pOworCWZvciAoaSA9IDA7IGkgPCBucmVhZHk7IGkrKykgeworCQlzdHJ1Y3QgaHBzYl9pc29fcGFja2V0X2luZm8gKmluZm8gPQorCQkJJmlzby0+aW5mb3NbKGlzby0+Zmlyc3RfcGFja2V0ICsgaSkgJSBpc28tPmJ1Zl9wYWNrZXRzXTsKKwkJZGF0YSA9IChxdWFkbGV0X3QqKSAoaXNvLT5kYXRhX2J1Zi5rdmlydCArIGluZm8tPm9mZnNldCk7CisKKwkJLyogc2tpcCBvdmVyIEdBU1AgaGVhZGVyICovCisJCWJ1ZiA9IChjaGFyICopZGF0YSArIDg7CisJCWxlbiA9IGluZm8tPmxlbiAtIDg7CisKKwkJc3BlY2lmaWVyX2lkID0gKCgoYmUzMl90b19jcHUoZGF0YVswXSkgJiAweGZmZmYpIDw8IDgpIHwKKwkJCQkoKGJlMzJfdG9fY3B1KGRhdGFbMV0pICYgMHhmZjAwMDAwMCkgPj4gMjQpKTsKKwkJc291cmNlX2lkID0gYmUzMl90b19jcHUoZGF0YVswXSkgPj4gMTY7CisKKwkJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkJaWYgKGluZm8tPmNoYW5uZWwgIT0gKGlzby0+aG9zdC0+Y3NyLmJyb2FkY2FzdF9jaGFubmVsICYgMHgzZikgfHwKKwkJICAgc3BlY2lmaWVyX2lkICE9IEVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRCkgeworCQkJLyogVGhpcyBwYWNrZXQgaXMgbm90IGZvciB1cyAqLworCQkJY29udGludWU7CisJCX0KKwkJZXRoZXIxMzk0X2RhdGFfaGFuZGxlcihkZXYsIHNvdXJjZV9pZCwgTE9DQUxfQlVTIHwgQUxMX05PREVTLAorCQkJCSAgICAgICBidWYsIGxlbik7CisJfQorCisJaHBzYl9pc29fcmVjdl9yZWxlYXNlX3BhY2tldHMoaXNvLCBpKTsKKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERhdGFncmFtIHRyYW5zbWlzc2lvbiBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb252ZXJ0IGEgc3RhbmRhcmQgQVJQIHBhY2tldCB0byAxMzk0IEFSUC4gVGhlIGZpcnN0IDggYnl0ZXMgKHRoZSBlbnRpcmUKKyAqIGFycGhkcikgaXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBpcDEzOTQgaGVhZGVyLCBzbyB0aGV5IG92ZXJsYXAuICBUaGUgcmVzdAorICogbmVlZHMgdG8gYmUgbXVuZ2VkIGEgYml0LiAgVGhlIHJlbWFpbmRlciBvZiB0aGUgYXJwaGRyIGlzIGZvcm1hdHRlZCBiYXNlZAorICogb24gaHdhZGRyIGxlbiBhbmQgaXBhZGRyIGxlbi4gIFdlIGtub3cgd2hhdCB0aGV5J2xsIGJlLCBzbyBpdCdzIGVhc3kgdG8KKyAqIGp1ZGdlLgorICoKKyAqIE5vdyB0aGF0IHRoZSBFVUkgaXMgdXNlZCBmb3IgdGhlIGhhcmR3YXJlIGFkZHJlc3MgYWxsIHdlIG5lZWQgdG8gZG8gdG8gbWFrZQorICogdGhpcyB3b3JrIGZvciAxMzk0IGlzIHRvIGluc2VydCAyIHF1YWRsZXRzIHRoYXQgY29udGFpbiBtYXhfcmVjIHNpemUsCisgKiBzcGVlZCwgYW5kIHVuaWNhc3QgRklGTyBhZGRyZXNzIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIHNlbmRlcl91bmlxdWVfaWQKKyAqIGFuZCB0aGUgSVAgYWRkcmVzc2VzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXRoZXIxMzk0X2FycF90b18xMzk0YXJwKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RydWN0IGFycGhkciAqYXJwID0gKHN0cnVjdCBhcnBoZHIgKilza2ItPmRhdGE7CisJdW5zaWduZWQgY2hhciAqYXJwX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopKGFycCArIDEpOworCXN0cnVjdCBldGgxMzk0X2FycCAqYXJwMTM5NCA9IChzdHJ1Y3QgZXRoMTM5NF9hcnAgKilza2ItPmRhdGE7CisKKwkvKiBCZWxpZXZlIGl0IG9yIG5vdCwgYWxsIHRoYXQgbmVlZCB0byBoYXBwZW4gaXMgc2VuZGVyIElQIGdldCBtb3ZlZAorCSAqIGFuZCBzZXQgaHdfYWRkcl9sZW4sIG1heF9yZWMsIHNzcGQsIGZpZm9faGkgYW5kIGZpZm9fbG8uICAqLworCWFycDEzOTQtPmh3X2FkZHJfbGVuCT0gMTY7CisJYXJwMTM5NC0+c2lwCQk9ICoodTMyKikoYXJwX3B0ciArIEVUSDEzOTRfQUxFTik7CisJYXJwMTM5NC0+bWF4X3JlYwk9IHByaXYtPmhvc3QtPmNzci5tYXhfcmVjOworCWFycDEzOTQtPnNzcGQJCT0gcHJpdi0+aG9zdC0+Y3NyLmxua19zcGQ7CisJYXJwMTM5NC0+Zmlmb19oaQk9IGh0b25zIChwcml2LT5sb2NhbF9maWZvID4+IDMyKTsKKwlhcnAxMzk0LT5maWZvX2xvCT0gaHRvbmwgKHByaXYtPmxvY2FsX2ZpZm8gJiB+MHgwKTsKKworCXJldHVybjsKK30KKworLyogV2UgbmVlZCB0byBlbmNhcHN1bGF0ZSB0aGUgc3RhbmRhcmQgaGVhZGVyIHdpdGggb3VyIG93bi4gV2UgdXNlIHRoZQorICogZXRoZXJuZXQgaGVhZGVyJ3MgcHJvdG8gZm9yIG91ciBvd24uICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBldGhlcjEzOTRfZW5jYXBzdWxhdGVfcHJlcCh1bnNpZ25lZCBpbnQgbWF4X3BheWxvYWQsCisJCQkJCQkgICAgICBpbnQgcHJvdG8sCisJCQkJCQkgICAgICB1bmlvbiBldGgxMzk0X2hkciAqaGRyLAorCQkJCQkJICAgICAgdTE2IGRnX3NpemUsIHUxNiBkZ2wpCit7CisJdW5zaWduZWQgaW50IGFkal9tYXhfcGF5bG9hZCA9IG1heF9wYXlsb2FkIC0gaGRyX3R5cGVfbGVuW0VUSDEzOTRfSERSX0xGX1VGXTsKKworCS8qIERvZXMgaXQgYWxsIGZpdCBpbiBvbmUgcGFja2V0PyAqLworCWlmIChkZ19zaXplIDw9IGFkal9tYXhfcGF5bG9hZCkgeworCQloZHItPnVmLmxmID0gRVRIMTM5NF9IRFJfTEZfVUY7CisJCWhkci0+dWYuZXRoZXJfdHlwZSA9IHByb3RvOworCX0gZWxzZSB7CisJCWhkci0+ZmYubGYgPSBFVEgxMzk0X0hEUl9MRl9GRjsKKwkJaGRyLT5mZi5ldGhlcl90eXBlID0gcHJvdG87CisJCWhkci0+ZmYuZGdfc2l6ZSA9IGRnX3NpemUgLSAxOworCQloZHItPmZmLmRnbCA9IGRnbDsKKwkJYWRqX21heF9wYXlsb2FkID0gbWF4X3BheWxvYWQgLSBoZHJfdHlwZV9sZW5bRVRIMTM5NF9IRFJfTEZfRkZdOworCX0KKwlyZXR1cm4oKGRnX3NpemUgKyAoYWRqX21heF9wYXlsb2FkIC0gMSkpIC8gYWRqX21heF9wYXlsb2FkKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXRoZXIxMzk0X2VuY2Fwc3VsYXRlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgdW5zaWduZWQgaW50IG1heF9wYXlsb2FkLAorCQkJCQkJIHVuaW9uIGV0aDEzOTRfaGRyICpoZHIpCit7CisJdW5pb24gZXRoMTM5NF9oZHIgKmJ1ZmhkcjsKKwlpbnQgZnR5cGUgPSBoZHItPmNvbW1vbi5sZjsKKwlpbnQgaGRyc3ogPSBoZHJfdHlwZV9sZW5bZnR5cGVdOworCXVuc2lnbmVkIGludCBhZGpfbWF4X3BheWxvYWQgPSBtYXhfcGF5bG9hZCAtIGhkcnN6OworCisJc3dpdGNoKGZ0eXBlKSB7CisJY2FzZSBFVEgxMzk0X0hEUl9MRl9VRjoKKwkJYnVmaGRyID0gKHVuaW9uIGV0aDEzOTRfaGRyICopc2tiX3B1c2goc2tiLCBoZHJzeik7CisJCWJ1Zmhkci0+d29yZHMud29yZDEgPSBodG9ucyhoZHItPndvcmRzLndvcmQxKTsKKwkJYnVmaGRyLT53b3Jkcy53b3JkMiA9IGhkci0+d29yZHMud29yZDI7CisJCWJyZWFrOworCisJY2FzZSBFVEgxMzk0X0hEUl9MRl9GRjoKKwkJYnVmaGRyID0gKHVuaW9uIGV0aDEzOTRfaGRyICopc2tiX3B1c2goc2tiLCBoZHJzeik7CisJCWJ1Zmhkci0+d29yZHMud29yZDEgPSBodG9ucyhoZHItPndvcmRzLndvcmQxKTsKKwkJYnVmaGRyLT53b3Jkcy53b3JkMiA9IGhkci0+d29yZHMud29yZDI7CisJCWJ1Zmhkci0+d29yZHMud29yZDMgPSBodG9ucyhoZHItPndvcmRzLndvcmQzKTsKKwkJYnVmaGRyLT53b3Jkcy53b3JkNCA9IDA7CisKKwkJLyogU2V0IGZyYWcgdHlwZSBoZXJlIGZvciBmdXR1cmUgaW50ZXJpb3IgZnJhZ21lbnRzICovCisJCWhkci0+Y29tbW9uLmxmID0gRVRIMTM5NF9IRFJfTEZfSUY7CisJCWhkci0+c2YuZmdfb2ZmID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQloZHItPnNmLmZnX29mZiArPSBhZGpfbWF4X3BheWxvYWQ7CisJCWJ1ZmhkciA9ICh1bmlvbiBldGgxMzk0X2hkciAqKXNrYl9wdWxsKHNrYiwgYWRqX21heF9wYXlsb2FkKTsKKwkJaWYgKG1heF9wYXlsb2FkID49IHNrYi0+bGVuKQorCQkJaGRyLT5jb21tb24ubGYgPSBFVEgxMzk0X0hEUl9MRl9MRjsKKwkJYnVmaGRyLT53b3Jkcy53b3JkMSA9IGh0b25zKGhkci0+d29yZHMud29yZDEpOworCQlidWZoZHItPndvcmRzLndvcmQyID0gaHRvbnMoaGRyLT53b3Jkcy53b3JkMik7CisJCWJ1Zmhkci0+d29yZHMud29yZDMgPSBodG9ucyhoZHItPndvcmRzLndvcmQzKTsKKwkJYnVmaGRyLT53b3Jkcy53b3JkNCA9IDA7CisJfQorCisJcmV0dXJuIG1pbihtYXhfcGF5bG9hZCwgc2tiLT5sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBocHNiX3BhY2tldCAqZXRoZXIxMzk0X2FsbG9jX2NvbW1vbl9wYWNrZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnA7CisKKwlwID0gaHBzYl9hbGxvY19wYWNrZXQoMCk7CisJaWYgKHApIHsKKwkJcC0+aG9zdCA9IGhvc3Q7CisJCXAtPmdlbmVyYXRpb24gPSBnZXRfaHBzYl9nZW5lcmF0aW9uKGhvc3QpOworCQlwLT50eXBlID0gaHBzYl9hc3luYzsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV0aGVyMTM5NF9wcmVwX3dyaXRlX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnAsCisJCQkJCSAgICAgIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCisJCQkJCSAgICAgIG5vZGVpZF90IG5vZGUsIHU2NCBhZGRyLAorCQkJCQkgICAgICB2b2lkICogZGF0YSwgaW50IHR4X2xlbikKK3sKKwlwLT5ub2RlX2lkID0gbm9kZTsKKwlwLT5kYXRhID0gTlVMTDsKKworCXAtPnRjb2RlID0gVENPREVfV1JJVEVCOworCXAtPmhlYWRlclsxXSA9IChob3N0LT5ub2RlX2lkIDw8IDE2KSB8IChhZGRyID4+IDMyKTsKKwlwLT5oZWFkZXJbMl0gPSBhZGRyICYgMHhmZmZmZmZmZjsKKworCXAtPmhlYWRlcl9zaXplID0gMTY7CisJcC0+ZXhwZWN0X3Jlc3BvbnNlID0gMTsKKworCWlmIChocHNiX2dldF90bGFiZWwocCkpIHsKKwkJRVRIMTM5NF9QUklOVF9HKEtFUk5fRVJSLCAiTm8gbW9yZSB0bGFiZWxzIGxlZnQgd2hpbGUgc2VuZGluZyAiCisJCQkJInRvIG5vZGUgIiBOT0RFX0JVU19GTVQgIlxuIiwgTk9ERV9CVVNfQVJHUyhob3N0LCBub2RlKSk7CisJCXJldHVybiAtMTsKKwl9CisJcC0+aGVhZGVyWzBdID0gKHAtPm5vZGVfaWQgPDwgMTYpIHwgKHAtPnRsYWJlbCA8PCAxMCkKKwkJfCAoMSA8PCA4KSB8IChUQ09ERV9XUklURUIgPDwgNCk7CisKKwlwLT5oZWFkZXJbM10gPSB0eF9sZW4gPDwgMTY7CisJcC0+ZGF0YV9zaXplID0gKHR4X2xlbiArIDMpICYgfjM7CisJcC0+ZGF0YSA9IChxdWFkbGV0X3QqKWRhdGE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV0aGVyMTM5NF9wcmVwX2dhc3BfcGFja2V0KHN0cnVjdCBocHNiX3BhY2tldCAqcCwKKwkJCQkJICAgICAgc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdiwKKwkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbmd0aCkKK3sKKwlwLT5oZWFkZXJfc2l6ZSA9IDQ7CisJcC0+dGNvZGUgPSBUQ09ERV9TVFJFQU1fREFUQTsKKworCXAtPmhlYWRlclswXSA9IChsZW5ndGggPDwgMTYpIHwgKDMgPDwgMTQpCisJCXwgKChwcml2LT5icm9hZGNhc3RfY2hhbm5lbCkgPDwgOCkKKwkJfCAoVENPREVfU1RSRUFNX0RBVEEgPDwgNCk7CisJcC0+ZGF0YV9zaXplID0gbGVuZ3RoOworCXAtPmRhdGEgPSAoKHF1YWRsZXRfdCopc2tiLT5kYXRhKSAtIDI7CisJcC0+ZGF0YVswXSA9IGNwdV90b19iZTMyKChwcml2LT5ob3N0LT5ub2RlX2lkIDw8IDE2KSB8CisJCQkJIEVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRF9ISSk7CisJcC0+ZGF0YVsxXSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoKEVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRF9MTyA8PCAyNCkgfAorCQkJCQkgICAgRVRIRVIxMzk0X0dBU1BfVkVSU0lPTik7CisKKwkvKiBTZXR0aW5nIHRoZSBub2RlIGlkIHRvIEFMTF9OT0RFUyAobm90IExPQ0FMX0JVUyB8IEFMTF9OT0RFUykKKwkgKiBwcmV2ZW50cyBocHNiX3NlbmRfcGFja2V0KCkgZnJvbSBzZXR0aW5nIHRoZSBzcGVlZCB0byBhbiBhcmJpdHJhcnkKKwkgKiB2YWx1ZSBiYXNlZCBvbiBwYWNrZXQtPm5vZGVfaWQgaWYgcGFja2V0LT5ub2RlX2lkIGlzIG5vdCBzZXQuICovCisJcC0+bm9kZV9pZCA9IEFMTF9OT0RFUzsKKwlwLT5zcGVlZF9jb2RlID0gcHJpdi0+YmNfc3NwZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV0aGVyMTM5NF9mcmVlX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCkKK3sKKwlpZiAocGFja2V0LT50Y29kZSAhPSBUQ09ERV9TVFJFQU1fREFUQSkKKwkJaHBzYl9mcmVlX3RsYWJlbChwYWNrZXQpOworCWhwc2JfZnJlZV9wYWNrZXQocGFja2V0KTsKK30KKworc3RhdGljIHZvaWQgZXRoZXIxMzk0X2NvbXBsZXRlX2NiKHZvaWQgKl9fcHRhc2spOworCitzdGF0aWMgaW50IGV0aGVyMTM5NF9zZW5kX3BhY2tldChzdHJ1Y3QgcGFja2V0X3Rhc2sgKnB0YXNrLCB1bnNpZ25lZCBpbnQgdHhfbGVuKQoreworCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBwdGFzay0+cHJpdjsKKwlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCA9IE5VTEw7CisKKwlwYWNrZXQgPSBldGhlcjEzOTRfYWxsb2NfY29tbW9uX3BhY2tldChwcml2LT5ob3N0KTsKKwlpZiAoIXBhY2tldCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHB0YXNrLT50eF90eXBlID09IEVUSDEzOTRfR0FTUCkgeworCQlpbnQgbGVuZ3RoID0gdHhfbGVuICsgKDIgKiBzaXplb2YocXVhZGxldF90KSk7CisKKwkJZXRoZXIxMzk0X3ByZXBfZ2FzcF9wYWNrZXQocGFja2V0LCBwcml2LCBwdGFzay0+c2tiLCBsZW5ndGgpOworCX0gZWxzZSBpZiAoZXRoZXIxMzk0X3ByZXBfd3JpdGVfcGFja2V0KHBhY2tldCwgcHJpdi0+aG9zdCwKKwkJCQkJICAgICAgIHB0YXNrLT5kZXN0X25vZGUsCisJCQkJCSAgICAgICBwdGFzay0+YWRkciwgcHRhc2stPnNrYi0+ZGF0YSwKKwkJCQkJICAgICAgIHR4X2xlbikpIHsKKwkJaHBzYl9mcmVlX3BhY2tldChwYWNrZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHRhc2stPnBhY2tldCA9IHBhY2tldDsKKwlocHNiX3NldF9wYWNrZXRfY29tcGxldGVfdGFzayhwdGFzay0+cGFja2V0LCBldGhlcjEzOTRfY29tcGxldGVfY2IsCisJCQkJICAgICAgcHRhc2spOworCisJaWYgKGhwc2Jfc2VuZF9wYWNrZXQocGFja2V0KSA8IDApIHsKKwkJZXRoZXIxMzk0X2ZyZWVfcGFja2V0KHBhY2tldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBUYXNrIGZ1bmN0aW9uIHRvIGJlIHJ1biB3aGVuIGEgZGF0YWdyYW0gdHJhbnNtaXNzaW9uIGlzIGNvbXBsZXRlZCAqLworc3RhdGljIGlubGluZSB2b2lkIGV0aGVyMTM5NF9kZ19jb21wbGV0ZShzdHJ1Y3QgcGFja2V0X3Rhc2sgKnB0YXNrLCBpbnQgZmFpbCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHRhc2stPnNrYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CisJc3RydWN0IGV0aDEzOTRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFN0YXRpc3RpY3MgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWlmIChmYWlsKSB7CisJCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisJfSBlbHNlIHsKKwkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlrbWVtX2NhY2hlX2ZyZWUocGFja2V0X3Rhc2tfY2FjaGUsIHB0YXNrKTsKK30KKworCisvKiBDYWxsYmFjayBmb3Igd2hlbiBhIHBhY2tldCBoYXMgYmVlbiBzZW50IGFuZCB0aGUgc3RhdHVzIG9mIHRoYXQgcGFja2V0IGlzCisgKiBrbm93biAqLworc3RhdGljIHZvaWQgZXRoZXIxMzk0X2NvbXBsZXRlX2NiKHZvaWQgKl9fcHRhc2spCit7CisJc3RydWN0IHBhY2tldF90YXNrICpwdGFzayA9IChzdHJ1Y3QgcGFja2V0X3Rhc2sgKilfX3B0YXNrOworCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0ID0gcHRhc2stPnBhY2tldDsKKwlpbnQgZmFpbCA9IDA7CisKKwlpZiAocGFja2V0LT50Y29kZSAhPSBUQ09ERV9TVFJFQU1fREFUQSkKKwkJZmFpbCA9IGhwc2JfcGFja2V0X3N1Y2Nlc3MocGFja2V0KTsKKworCWV0aGVyMTM5NF9mcmVlX3BhY2tldChwYWNrZXQpOworCisJcHRhc2stPm91dHN0YW5kaW5nX3BrdHMtLTsKKwlpZiAocHRhc2stPm91dHN0YW5kaW5nX3BrdHMgPiAwICYmICFmYWlsKSB7CisJCWludCB0eF9sZW47CisKKwkJLyogQWRkIHRoZSBlbmNhcHN1bGF0aW9uIGhlYWRlciB0byB0aGUgZnJhZ21lbnQgKi8KKwkJdHhfbGVuID0gZXRoZXIxMzk0X2VuY2Fwc3VsYXRlKHB0YXNrLT5za2IsIHB0YXNrLT5tYXhfcGF5bG9hZCwKKwkJCQkJICAgICAgICZwdGFzay0+aGRyKTsKKwkJaWYgKGV0aGVyMTM5NF9zZW5kX3BhY2tldChwdGFzaywgdHhfbGVuKSkKKwkJCWV0aGVyMTM5NF9kZ19jb21wbGV0ZShwdGFzaywgMSk7CisJfSBlbHNlIHsKKwkJZXRoZXIxMzk0X2RnX2NvbXBsZXRlKHB0YXNrLCBmYWlsKTsKKwl9Cit9CisKKworCisvKiBUcmFuc21pdCBhIHBhY2tldCAoY2FsbGVkIGJ5IGtlcm5lbCkgKi8KK3N0YXRpYyBpbnQgZXRoZXIxMzk0X3R4IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBrbWZsYWdzID0gaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTDsKKwlzdHJ1Y3QgZXRoMTM5NGhkciAqZXRoOworCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBwcm90bzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW5vZGVpZF90IGRlc3Rfbm9kZTsKKwlldGgxMzk0X3R4X3R5cGUgdHhfdHlwZTsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgdHhfbGVuOworCXVuc2lnbmVkIGludCBtYXhfcGF5bG9hZDsKKwl1MTYgZGdfc2l6ZTsKKwl1MTYgZGdsOworCXN0cnVjdCBwYWNrZXRfdGFzayAqcHRhc2s7CisJc3RydWN0IGV0aDEzOTRfbm9kZV9yZWYgKm5vZGU7CisJc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICpub2RlX2luZm8gPSBOVUxMOworCisJcHRhc2sgPSBrbWVtX2NhY2hlX2FsbG9jKHBhY2tldF90YXNrX2NhY2hlLCBrbWZsYWdzKTsKKwlpZiAocHRhc2sgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogWFhYIElnbm9yZSB0aGlzIGZvciBub3cuIE5vdGljZWQgdGhhdCB3aGVuIE1hY09TWCBpcyB0aGUgSVJNLAorCSAqIGl0IGRvZXMgbm90IHNldCBvdXIgdmFsaWRpdHkgYml0LiBXZSBuZWVkIHRvIGNvbXBlbnNhdGUgZm9yCisJICogdGhhdCBzb21ld2hlcmUgZWxzZSwgYnV0IG5vdCBpbiBldGgxMzk0LiAqLworI2lmIDAKKwlpZiAoKHByaXYtPmhvc3QtPmNzci5icm9hZGNhc3RfY2hhbm5lbCAmIDB4YzAwMDAwMDApICE9IDB4YzAwMDAwMDApIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBmYWlsOworCX0KKyNlbmRpZgorCisJaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2sgKHNrYiwga21mbGFncykpID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIEdldCByaWQgb2YgdGhlIGZha2UgZXRoMTM5NCBoZWFkZXIsIGJ1dCBzYXZlIGEgcG9pbnRlciAqLworCWV0aCA9IChzdHJ1Y3QgZXRoMTM5NGhkciopc2tiLT5kYXRhOworCXNrYl9wdWxsKHNrYiwgRVRIMTM5NF9ITEVOKTsKKworCXByb3RvID0gZXRoLT5oX3Byb3RvOworCWRnX3NpemUgPSBza2ItPmxlbjsKKworCS8qIFNldCB0aGUgdHJhbnNtaXNzaW9uIHR5cGUgZm9yIHRoZSBwYWNrZXQuICBBUlAgcGFja2V0cyBhbmQgSVAKKwkgKiBicm9hZGNhc3QgcGFja2V0cyBhcmUgc2VudCB2aWEgR0FTUC4gKi8KKwlpZiAobWVtY21wKGV0aC0+aF9kZXN0LCBkZXYtPmJyb2FkY2FzdCwgRVRIMTM5NF9BTEVOKSA9PSAwIHx8CisJICAgIHByb3RvID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQVJQKSB8fAorCSAgICAocHJvdG8gPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCkgJiYKKwkgICAgIElOX01VTFRJQ0FTVChfX2NvbnN0YW50X250b2hsKHNrYi0+bmguaXBoLT5kYWRkcikpKSkgeworCQl0eF90eXBlID0gRVRIMTM5NF9HQVNQOworCQlkZXN0X25vZGUgPSBMT0NBTF9CVVMgfCBBTExfTk9ERVM7CisJCW1heF9wYXlsb2FkID0gcHJpdi0+YmNfbWF4cGF5bG9hZCAtIEVUSEVSMTM5NF9HQVNQX09WRVJIRUFEOworCQlCVUdfT04obWF4X3BheWxvYWQgPCAoNTEyIC0gRVRIRVIxMzk0X0dBU1BfT1ZFUkhFQUQpKTsKKwkJZGdsID0gcHJpdi0+YmNfZGdsOworCQlpZiAobWF4X3BheWxvYWQgPCBkZ19zaXplICsgaGRyX3R5cGVfbGVuW0VUSDEzOTRfSERSX0xGX1VGXSkKKwkJCXByaXYtPmJjX2RnbCsrOworCX0gZWxzZSB7CisJCW5vZGUgPSBldGgxMzk0X2ZpbmRfbm9kZV9ndWlkKCZwcml2LT5pcF9ub2RlX2xpc3QsCisJCQkJCSAgICAgIGJlNjRfdG9fY3B1KCoodTY0KilldGgtPmhfZGVzdCkpOworCQlpZiAoIW5vZGUpIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJbm9kZV9pbmZvID0gKHN0cnVjdCBldGgxMzk0X25vZGVfaW5mbyopbm9kZS0+dWQtPmRldmljZS5kcml2ZXJfZGF0YTsKKwkJaWYgKG5vZGVfaW5mby0+ZmlmbyA9PSBFVEhFUjEzOTRfSU5WQUxJRF9BRERSKSB7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJZ290byBmYWlsOworCQl9CisKKwkJZGVzdF9ub2RlID0gbm9kZS0+dWQtPm5lLT5ub2RlaWQ7CisJCW1heF9wYXlsb2FkID0gbm9kZV9pbmZvLT5tYXhwYXlsb2FkOworCQlCVUdfT04obWF4X3BheWxvYWQgPCAoNTEyIC0gRVRIRVIxMzk0X0dBU1BfT1ZFUkhFQUQpKTsKKworCQlkZ2wgPSBub2RlX2luZm8tPmRnbDsKKwkJaWYgKG1heF9wYXlsb2FkIDwgZGdfc2l6ZSArIGhkcl90eXBlX2xlbltFVEgxMzk0X0hEUl9MRl9VRl0pCisJCQlub2RlX2luZm8tPmRnbCsrOworCQl0eF90eXBlID0gRVRIMTM5NF9XUlJFUTsKKwl9CisKKwkvKiBJZiB0aGlzIGlzIGFuIEFSUCBwYWNrZXQsIGNvbnZlcnQgaXQgKi8KKwlpZiAocHJvdG8gPT0gX19jb25zdGFudF9odG9ucyAoRVRIX1BfQVJQKSkKKwkJZXRoZXIxMzk0X2FycF90b18xMzk0YXJwIChza2IsIGRldik7CisKKwlwdGFzay0+aGRyLndvcmRzLndvcmQxID0gMDsKKwlwdGFzay0+aGRyLndvcmRzLndvcmQyID0gMDsKKwlwdGFzay0+aGRyLndvcmRzLndvcmQzID0gMDsKKwlwdGFzay0+aGRyLndvcmRzLndvcmQ0ID0gMDsKKwlwdGFzay0+c2tiID0gc2tiOworCXB0YXNrLT5wcml2ID0gcHJpdjsKKwlwdGFzay0+dHhfdHlwZSA9IHR4X3R5cGU7CisKKwlpZiAodHhfdHlwZSAhPSBFVEgxMzk0X0dBU1ApIHsKKwkJdTY0IGFkZHI7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJYWRkciA9IG5vZGVfaW5mby0+ZmlmbzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJCXB0YXNrLT5hZGRyID0gYWRkcjsKKwkJcHRhc2stPmRlc3Rfbm9kZSA9IGRlc3Rfbm9kZTsKKwl9CisKKwlwdGFzay0+dHhfdHlwZSA9IHR4X3R5cGU7CisJcHRhc2stPm1heF9wYXlsb2FkID0gbWF4X3BheWxvYWQ7CisgICAgICAgIHB0YXNrLT5vdXRzdGFuZGluZ19wa3RzID0gZXRoZXIxMzk0X2VuY2Fwc3VsYXRlX3ByZXAobWF4X3BheWxvYWQsIHByb3RvLAorCQkJCQkJCSAgICAgJnB0YXNrLT5oZHIsIGRnX3NpemUsCisJCQkJCQkJICAgICBkZ2wpOworCisJLyogQWRkIHRoZSBlbmNhcHN1bGF0aW9uIGhlYWRlciB0byB0aGUgZnJhZ21lbnQgKi8KKwl0eF9sZW4gPSBldGhlcjEzOTRfZW5jYXBzdWxhdGUoc2tiLCBtYXhfcGF5bG9hZCwgJnB0YXNrLT5oZHIpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWlmIChldGhlcjEzOTRfc2VuZF9wYWNrZXQocHRhc2ssIHR4X2xlbikpCisJCWdvdG8gZmFpbDsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJaWYgKHB0YXNrKQorCQlrbWVtX2NhY2hlX2ZyZWUocGFja2V0X3Rhc2tfY2FjaGUsIHB0YXNrKTsKKworCWlmIChza2IgIT0gTlVMTCkKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsgIC8qIHJldHVybmluZyBub24temVybyBjYXVzZXMgc2VyaW91cyBwcm9ibGVtcyAqLworfQorCitzdGF0aWMgdm9pZCBldGhlcjEzOTRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkgKGluZm8tPmRyaXZlciwgZHJpdmVyX25hbWUpOworCXN0cmNweSAoaW5mby0+dmVyc2lvbiwgIiRSZXY6IDEyNDcgJCIpOworCS8qIEZJWE1FIFhYWCBwcm92aWRlIHNhbmUgYnVzaW5mbyAqLworCXN0cmNweSAoaW5mby0+YnVzX2luZm8sICJpZWVlMTM5NCIpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IGV0aGVyMTM5NF9nZXRfZHJ2aW5mbworfTsKKworc3RhdGljIGludCBfX2luaXQgZXRoZXIxMzk0X2luaXRfbW9kdWxlICh2b2lkKQoreworCXBhY2tldF90YXNrX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInBhY2tldF90YXNrIiwgc2l6ZW9mKHN0cnVjdCBwYWNrZXRfdGFzayksCisJCQkJCSAgICAgIDAsIDAsIE5VTEwsIE5VTEwpOworCisJLyogUmVnaXN0ZXIgb3Vyc2VsdmVzIGFzIGEgaGlnaGxldmVsIGRyaXZlciAqLworCWhwc2JfcmVnaXN0ZXJfaGlnaGxldmVsKCZldGgxMzk0X2hpZ2hsZXZlbCk7CisKKwlyZXR1cm4gaHBzYl9yZWdpc3Rlcl9wcm90b2NvbCgmZXRoMTM5NF9wcm90b19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXRoZXIxMzk0X2V4aXRfbW9kdWxlICh2b2lkKQoreworCWhwc2JfdW5yZWdpc3Rlcl9wcm90b2NvbCgmZXRoMTM5NF9wcm90b19kcml2ZXIpOworCWhwc2JfdW5yZWdpc3Rlcl9oaWdobGV2ZWwoJmV0aDEzOTRfaGlnaGxldmVsKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kocGFja2V0X3Rhc2tfY2FjaGUpOworfQorCittb2R1bGVfaW5pdChldGhlcjEzOTRfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZXRoZXIxMzk0X2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5oIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4ZjFjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5oCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogZXRoMTM5NC5oIC0tIEV0aGVybmV0IGRyaXZlciBmb3IgTGludXggSUVFRS0xMzk0IFN1YnN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBCb25pbiBGcmFuY2sgPGJvbmluZkBmcmVlLmZyPgorICogICAgICAgICAgIChDKSAyMDAxIEJlbiBDb2xsaW5zIDxiY29sbGluc0BkZWJpYW4ub3JnPgorICoKKyAqIE1haW5seSBiYXNlZCBvbiB3b3JrIGJ5IEVtYW51ZWwgUGlya2VyIGFuZCBBbmRyZWFzIEUuIEJvbWJlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fRVRIMTM5NF9ICisjZGVmaW5lIF9fRVRIMTM5NF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgImllZWUxMzk0LmgiCisKKy8qIFJlZ2lzdGVyIGZvciBpbmNvbWluZyBwYWNrZXRzLiBUaGlzIGlzIDQwOTYgYnl0ZXMsIHdoaWNoIHN1cHBvcnRzIHVwIHRvCisgKiBTMzIwMCAocGVyIFRhYmxlIDE2LTMgb2YgSUVFRSAxMzk0Yi0yMDAyKS4gKi8KKyNkZWZpbmUgRVRIRVIxMzk0X1JFR0lPTl9BRERSX0xFTgk0MDk2CisKKyNkZWZpbmUgRVRIRVIxMzk0X0lOVkFMSURfQUREUgkJfjBVTEwKKworLyogR0FTUCBpZGVudGlmaWVyIG51bWJlcnMgZm9yIElQdjQgb3ZlciBJRUVFIDEzOTQgKi8KKyNkZWZpbmUgRVRIRVIxMzk0X0dBU1BfU1BFQ0lGSUVSX0lECTB4MDAwMDVFCisjZGVmaW5lIEVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRF9ISQkoKEVUSEVSMTM5NF9HQVNQX1NQRUNJRklFUl9JRCA+PiA4KSAmIDB4ZmZmZikKKyNkZWZpbmUgRVRIRVIxMzk0X0dBU1BfU1BFQ0lGSUVSX0lEX0xPCShFVEhFUjEzOTRfR0FTUF9TUEVDSUZJRVJfSUQgJiAweGZmKQorI2RlZmluZSBFVEhFUjEzOTRfR0FTUF9WRVJTSU9OCQkxCisKKyNkZWZpbmUgRVRIRVIxMzk0X0dBU1BfT1ZFUkhFQUQgKDIgKiBzaXplb2YocXVhZGxldF90KSkgIC8qIEdBU1AgaGVhZGVyIG92ZXJoZWFkICovCisKKyNkZWZpbmUgRVRIRVIxMzk0X0dBU1BfQlVGRkVSUyAxNgorCisvKiBOb2RlIHNldCA9PSA2NCAqLworI2RlZmluZSBOT0RFX1NFVAkJCShBTExfTk9ERVMgKyAxKQorCitlbnVtIGV0aDEzOTRfYmNfc3RhdGVzIHsgRVRIRVIxMzk0X0JDX0VSUk9SLAorCQkJIEVUSEVSMTM5NF9CQ19SVU5OSU5HLAorCQkJIEVUSEVSMTM5NF9CQ19TVE9QUEVEIH07CisKKworLyogUHJpdmF0ZSBzdHJ1Y3R1cmUgZm9yIG91ciBldGhlcm5ldCBkcml2ZXIgKi8KK3N0cnVjdCBldGgxMzk0X3ByaXYgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBEZXZpY2Ugc3RhdHMJCQkgKi8KKwlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OwkJLyogVGhlIGNhcmQgZm9yIHRoaXMgZGV2CSAqLworCXUxNiBiY19tYXhwYXlsb2FkOwkJLyogTWF4IGJyb2FkY2FzdCBwYXlsb2FkCSAqLworCXU4IGJjX3NzcGQ7CQkJLyogTWF4IGJyb2FkY2FzdCBzcGVlZAkJICovCisJdTY0IGxvY2FsX2ZpZm87CQkJLyogTG9jYWwgRklGTyBBZGRyZXNzCQkgKi8KKwlzcGlubG9ja190IGxvY2s7CQkvKiBQcml2YXRlIGxvY2sJCQkgKi8KKwlpbnQgYnJvYWRjYXN0X2NoYW5uZWw7CQkvKiBBc3luYyBzdHJlYW0gQnJvYWRjYXN0IENoYW5uZWwgKi8KKwllbnVtIGV0aDEzOTRfYmNfc3RhdGVzIGJjX3N0YXRlOyAvKiBicm9hZGNhc3QgY2hhbm5lbCBzdGF0ZQkgKi8KKwlzdHJ1Y3QgaHBzYl9pc28gKmlzbzsJCS8qIEFzeW5jIHN0cmVhbSByZWN2IGhhbmRsZQkgKi8KKwlpbnQgYmNfZGdsOwkJCS8qIE91dGdvaW5nIGJyb2FkY2FzdCBkYXRhZ3JhbSBsYWJlbCAqLworCXN0cnVjdCBsaXN0X2hlYWQgaXBfbm9kZV9saXN0OwkvKiBMaXN0IG9mIElQIGNhcGFibGUgbm9kZXMJICovCisJc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZF9saXN0W0FMTF9OT0RFU107IC8qIENhY2hlZCB1bml0IGRpciBsaXN0ICovCit9OworCisKKy8qIERlZmluZSBhIGZha2UgaGFyZHdhcmUgaGVhZGVyIGZvcm1hdCBmb3IgdGhlIG5ldHdvcmtpbmcgY29yZS4gIE5vdGUgdGhhdAorICogaGVhZGVyIHNpemUgY2Fubm90IGV4Y2VlZCAxNiBieXRlcyBhcyB0aGF0IGlzIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgY2FjaGUuCisgKiBBbHNvLCB3ZSBkbyBub3QgbmVlZCB0aGUgc291cmNlIGFkZHJlc3MgaW4gdGhlIGhlYWRlciBzbyB3ZSBvbWl0IGl0IGFuZAorICoga2VlcCB0aGUgaGVhZGVyIHRvIHVuZGVyIDE2IGJ5dGVzICovCisjZGVmaW5lIEVUSDEzOTRfQUxFTiAoOCkKKyNkZWZpbmUgRVRIMTM5NF9ITEVOICgxMCkKKworc3RydWN0IGV0aDEzOTRoZHIgeworCXVuc2lnbmVkIGNoYXIJaF9kZXN0W0VUSDEzOTRfQUxFTl07CS8qIGRlc3RpbmF0aW9uIGV0aDEzOTQgYWRkcgkqLworCXVuc2lnbmVkIHNob3J0CWhfcHJvdG87CQkvKiBwYWNrZXQgdHlwZSBJRCBmaWVsZAkqLworfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV0aDEzOTRoZHIgKmV0aDEzOTRfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgZXRoMTM5NGhkciAqKXNrYi0+bWFjLnJhdzsKK30KKyNlbmRpZgorCit0eXBlZGVmIGVudW0ge0VUSDEzOTRfR0FTUCwgRVRIMTM5NF9XUlJFUX0gZXRoMTM5NF90eF90eXBlOworCisvKiBJUDEzOTQgaGVhZGVycyAqLworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyogVW5mcmFnbWVudGVkICovCisjaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fQklURklFTEQKK3N0cnVjdCBldGgxMzk0X3VmX2hkciB7CisJdTE2IGxmOjI7CisJdTE2IHJlczoxNDsKKwl1MTYgZXRoZXJfdHlwZTsJCS8qIEV0aGVybmV0IHBhY2tldCB0eXBlICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworI2VsaWYgZGVmaW5lZCBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKK3N0cnVjdCBldGgxMzk0X3VmX2hkciB7CisJdTE2IHJlczoxNDsKKwl1MTYgbGY6MjsKKwl1MTYgZXRoZXJfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjZWxzZQorI2Vycm9yIFVua25vd24gYml0IGZpZWxkIHR5cGUKKyNlbmRpZgorCisvKiBGaXJzdCBmcmFnbWVudCAqLworI2lmIGRlZmluZWQgX19CSUdfRU5ESUFOX0JJVEZJRUxECitzdHJ1Y3QgZXRoMTM5NF9mZl9oZHIgeworCXUxNiBsZjoyOworCXUxNiByZXMxOjI7CisJdTE2IGRnX3NpemU6MTI7CQkvKiBEYXRhZ3JhbSBzaXplICovCisJdTE2IGV0aGVyX3R5cGU7CQkvKiBFdGhlcm5ldCBwYWNrZXQgdHlwZSAqLworCXUxNiBkZ2w7CQkvKiBEYXRhZ3JhbSBsYWJlbCAqLworCXUxNiByZXMyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNlbGlmIGRlZmluZWQgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECitzdHJ1Y3QgZXRoMTM5NF9mZl9oZHIgeworCXUxNiBkZ19zaXplOjEyOworCXUxNiByZXMxOjI7CisJdTE2IGxmOjI7CisJdTE2IGV0aGVyX3R5cGU7CisJdTE2IGRnbDsKKwl1MTYgcmVzMjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjZWxzZQorI2Vycm9yIFVua25vd24gYml0IGZpZWxkIHR5cGUKKyNlbmRpZgorCisvKiBYWFg6IFN1YnNlcXVlbnQgZnJhZ21lbnRzLCBpbmNsdWRpbmcgbGFzdCAqLworI2lmIGRlZmluZWQgX19CSUdfRU5ESUFOX0JJVEZJRUxECitzdHJ1Y3QgZXRoMTM5NF9zZl9oZHIgeworCXUxNiBsZjoyOworCXUxNiByZXMxOjI7CisJdTE2IGRnX3NpemU6MTI7CQkvKiBEYXRhZ3JhbSBzaXplICovCisJdTE2IHJlczI6NDsKKwl1MTYgZmdfb2ZmOjEyOwkJLyogRnJhZ21lbnQgb2Zmc2V0ICovCisJdTE2IGRnbDsJCS8qIERhdGFncmFtIGxhYmVsICovCisJdTE2IHJlczM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworI2VsaWYgZGVmaW5lZCBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKK3N0cnVjdCBldGgxMzk0X3NmX2hkciB7CisJdTE2IGRnX3NpemU6MTI7CisJdTE2IHJlczE6MjsKKwl1MTYgbGY6MjsKKwl1MTYgZmdfb2ZmOjEyOworCXUxNiByZXMyOjQ7CisJdTE2IGRnbDsKKwl1MTYgcmVzMzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjZWxzZQorI2Vycm9yIFVua25vd24gYml0IGZpZWxkIHR5cGUKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfX0JJR19FTkRJQU5fQklURklFTEQKK3N0cnVjdCBldGgxMzk0X2NvbW1vbl9oZHIgeworCXUxNiBsZjoyOworCXUxNiBwYWQxOjE0OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNlbGlmIGRlZmluZWQgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECitzdHJ1Y3QgZXRoMTM5NF9jb21tb25faGRyIHsKKwl1MTYgcGFkMToxNDsKKwl1MTYgbGY6MjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisjZWxzZQorI2Vycm9yIFVua25vd24gYml0IGZpZWxkIHR5cGUKKyNlbmRpZgorCitzdHJ1Y3QgZXRoMTM5NF9oZHJfd29yZHMgeworCXUxNiB3b3JkMTsKKwl1MTYgd29yZDI7CisJdTE2IHdvcmQzOworCXUxNiB3b3JkNDsKK307CisKK3VuaW9uIGV0aDEzOTRfaGRyIHsKKwlzdHJ1Y3QgZXRoMTM5NF9jb21tb25faGRyIGNvbW1vbjsKKwlzdHJ1Y3QgZXRoMTM5NF91Zl9oZHIgdWY7CisJc3RydWN0IGV0aDEzOTRfZmZfaGRyIGZmOworCXN0cnVjdCBldGgxMzk0X3NmX2hkciBzZjsKKwlzdHJ1Y3QgZXRoMTM5NF9oZHJfd29yZHMgd29yZHM7Cit9OworCisvKiBFbmQgb2YgSVAxMzk0IGhlYWRlcnMgKi8KKworLyogRnJhZ21lbnQgdHlwZXMgKi8KKyNkZWZpbmUgRVRIMTM5NF9IRFJfTEZfVUYJMAkvKiB1bmZyYWdtZW50ZWQJCSovCisjZGVmaW5lIEVUSDEzOTRfSERSX0xGX0ZGCTEJLyogZmlyc3QgZnJhZ21lbnQJKi8KKyNkZWZpbmUgRVRIMTM5NF9IRFJfTEZfTEYJMgkvKiBsYXN0IGZyYWdtZW50CSovCisjZGVmaW5lIEVUSDEzOTRfSERSX0xGX0lGCTMJLyogaW50ZXJpb3IgZnJhZ21lbnQJKi8KKworI2RlZmluZSBJUDEzOTRfSFdfQUREUl9MRU4JMTYJLyogQXMgcGVyIFJGQwkJKi8KKworLyogT3VyIGFycCBwYWNrZXQgKEFSUEhSRF9JRUVFMTM5NCkgKi8KK3N0cnVjdCBldGgxMzk0X2FycCB7CisJdTE2IGh3X3R5cGU7CQkvKiAweDAwMTgJKi8KKwl1MTYgcHJvdG9fdHlwZTsJCS8qIDB4MDgwNgkqLworCXU4IGh3X2FkZHJfbGVuOwkJLyogMTYgCQkqLworCXU4IGlwX2FkZHJfbGVuOwkJLyogNAkJKi8KKwl1MTYgb3Bjb2RlOwkJLyogQVJQIE9wY29kZQkqLworCS8qIEFib3ZlIGlzIGV4YWN0bHkgdGhlIHNhbWUgZm9ybWF0IGFzIHN0cnVjdCBhcnBoZHIgKi8KKworCXU2NCBzX3VuaXFfaWQ7CQkvKiBTZW5kZXIncyA2NGJpdCBFVUkJCQkqLworCXU4IG1heF9yZWM7CQkvKiBTZW5kZXIncyBtYXggcGFja2V0IHNpemUJCSovCisJdTggc3NwZDsJCS8qIFNlbmRlcidzIG1heCBzcGVlZAkJCSovCisJdTE2IGZpZm9faGk7CQkvKiBoaSAxNmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCisJdTMyIGZpZm9fbG87CQkvKiBsbyAzMmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCisJdTMyIHNpcDsJCS8qIFNlbmRlcidzIElQIEFkZHJlc3MJCQkqLworCXUzMiB0aXA7CQkvKiBJUCBBZGRyZXNzIG9mIHJlcXVlc3RlZCBodyBhZGRyCSovCit9OworCisvKiBOZXR3b3JrIHRpbWVvdXQgKi8KKyNkZWZpbmUgRVRIRVIxMzk0X1RJTUVPVVQJMTAwMDAwCisKKy8qIFRoaXMgaXMgb3VyIHRhc2sgc3RydWN0LiBJdCdzIHVzZWQgZm9yIHRoZSBwYWNrZXQgY29tcGxldGUgY2FsbGJhY2suICAqLworc3RydWN0IHBhY2tldF90YXNrIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBvdXRzdGFuZGluZ19wa3RzOworCWV0aDEzOTRfdHhfdHlwZSB0eF90eXBlOworCWludCBtYXhfcGF5bG9hZDsKKwlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKKwlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2OworCXVuaW9uIGV0aDEzOTRfaGRyIGhkcjsKKwl1NjQgYWRkcjsKKwl1MTYgZGVzdF9ub2RlOworfTsKKworI2VuZGlmIC8qIF9fRVRIMTM5NF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5jIGIvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdlMWJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuYwpAQCAtMCwwICsxLDcwNCBAQAorLyoKKyAqIElFRUUgMTM5NCBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQW5kcmVhcyBFLiBCb21iZQorICoKKyAqIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHJvb3QKKyAqIGRpcmVjdG9yeSBvZiB0aGUga2VybmVsIHNvdXJjZXMgZm9yIGRldGFpbHMuCisgKgorICoKKyAqIENvbnRyaWJ1dGlvbnM6CisgKgorICogQ2hyaXN0aWFuIFRvZWdlbCA8Y2hyaXN0aWFuLnRvZWdlbEBnbXguYXQ+CisgKiAgICAgICAgdW5yZWdpc3RlciBhZGRyZXNzIHNwYWNlCisgKgorICogTWFuZnJlZCBXZWlocyA8d2VpaHNAaWN0LnR1d2llbi5hYy5hdD4KKyAqICAgICAgICB1bnJlZ2lzdGVyIGFkZHJlc3Mgc3BhY2UKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlICJpZWVlMTM5NC5oIgorI2luY2x1ZGUgImllZWUxMzk0X3R5cGVzLmgiCisjaW5jbHVkZSAiaG9zdHMuaCIKKyNpbmNsdWRlICJpZWVlMTM5NF9jb3JlLmgiCisjaW5jbHVkZSAiaGlnaGxldmVsLmgiCisjaW5jbHVkZSAibm9kZW1nci5oIgorCisKK3N0cnVjdCBobF9ob3N0X2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OworCXNpemVfdCBzaXplOworCXVuc2lnbmVkIGxvbmcga2V5OworCXZvaWQgKmRhdGE7Cit9OworCisKK3N0YXRpYyBMSVNUX0hFQUQoaGxfZHJpdmVycyk7CitzdGF0aWMgREVDTEFSRV9SV1NFTShobF9kcml2ZXJzX3NlbSk7CisKK3N0YXRpYyBMSVNUX0hFQUQoaGxfaXJxcyk7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhobF9pcnFzX2xvY2spOworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhhZGRyX3NwYWNlX2xvY2spOworCisvKiBhZGRyX3NwYWNlIGxpc3Qgd2lsbCBoYXZlIHplcm8gYW5kIG1heCBhbHJlYWR5IGluY2x1ZGVkIGFzIGJvdW5kcyAqLworc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGR1bW15X29wcyA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUgZHVtbXlfemVyb19hZGRyLCBkdW1teV9tYXhfYWRkcjsKKworCitzdGF0aWMgc3RydWN0IGhsX2hvc3RfaW5mbyAqaGxfZ2V0X2hvc3RpbmZvKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsCisJCQkJCSAgICAgIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGhsX2hvc3RfaW5mbyAqaGkgPSBOVUxMOworCisJaWYgKCFobCB8fCAhaG9zdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZWFkX2xvY2soJmhsLT5ob3N0X2luZm9fbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShoaSwgJmhsLT5ob3N0X2luZm9fbGlzdCwgbGlzdCkgeworCQlpZiAoaGktPmhvc3QgPT0gaG9zdCkgeworCQkJcmVhZF91bmxvY2soJmhsLT5ob3N0X2luZm9fbG9jayk7CisJCQlyZXR1cm4gaGk7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmhsLT5ob3N0X2luZm9fbG9jayk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBSZXR1cm5zIGEgcGVyIGhvc3QvZHJpdmVyIGRhdGEgc3RydWN0dXJlIHRoYXQgd2FzIHByZXZpb3VzbHkgc3RvcmVkIGJ5CisgKiBocHNiX2NyZWF0ZV9ob3N0aW5mby4gKi8KK3ZvaWQgKmhwc2JfZ2V0X2hvc3RpbmZvKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGhsX2hvc3RfaW5mbyAqaGkgPSBobF9nZXRfaG9zdGluZm8oaGwsIGhvc3QpOworCisJaWYgKGhpKQorCQlyZXR1cm4gaGktPmRhdGE7CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBJZiBzaXplIGlzIHplcm8sIHRoZW4gdGhlIHJldHVybiBoZXJlIGlzIG9ubHkgdmFsaWQgZm9yIGVycm9yIGNoZWNraW5nICovCit2b2lkICpocHNiX2NyZWF0ZV9ob3N0aW5mbyhzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorCQkJICAgc2l6ZV90IGRhdGFfc2l6ZSkKK3sKKwlzdHJ1Y3QgaGxfaG9zdF9pbmZvICpoaTsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwloaSA9IGhsX2dldF9ob3N0aW5mbyhobCwgaG9zdCk7CisJaWYgKGhpKSB7CisJCUhQU0JfRVJSKCIlcyBjYWxsZWQgaHBzYl9jcmVhdGVfaG9zdGluZm8gd2hlbiBob3N0aW5mbyBhbHJlYWR5IGV4aXN0cyIsCisJCQkgaGwtPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwloaSA9IGttYWxsb2Moc2l6ZW9mKCpoaSkgKyBkYXRhX3NpemUsIEdGUF9BVE9NSUMpOworCWlmICghaGkpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KGhpLCAwLCBzaXplb2YoKmhpKSArIGRhdGFfc2l6ZSk7CisKKwlpZiAoZGF0YV9zaXplKSB7CisJCWRhdGEgPSBoaS0+ZGF0YSA9IGhpICsgMTsKKwkJaGktPnNpemUgPSBkYXRhX3NpemU7CisJfSBlbHNlCisJCWRhdGEgPSBoaTsKKworCWhpLT5ob3N0ID0gaG9zdDsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaGwtPmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmaGktPmxpc3QsICZobC0+aG9zdF9pbmZvX2xpc3QpOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZobC0+aG9zdF9pbmZvX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBkYXRhOworfQorCisKK2ludCBocHNiX3NldF9ob3N0aW5mbyhzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorCQkgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBobF9ob3N0X2luZm8gKmhpOworCisJaGkgPSBobF9nZXRfaG9zdGluZm8oaGwsIGhvc3QpOworCWlmIChoaSkgeworCQlpZiAoIWhpLT5zaXplICYmICFoaS0+ZGF0YSkgeworCQkJaGktPmRhdGEgPSBkYXRhOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJSFBTQl9FUlIoIiVzIGNhbGxlZCBocHNiX3NldF9ob3N0aW5mbyB3aGVuIGhvc3RpbmZvIGFscmVhZHkgaGFzIGRhdGEiLAorCQkJCSBobC0+bmFtZSk7CisJfSBlbHNlCisJCUhQU0JfRVJSKCIlcyBjYWxsZWQgaHBzYl9zZXRfaG9zdGluZm8gd2hlbiBubyBob3N0aW5mbyBleGlzdHMiLAorCQkJIGhsLT5uYW1lKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCisKK3ZvaWQgaHBzYl9kZXN0cm95X2hvc3RpbmZvKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGhsX2hvc3RfaW5mbyAqaGk7CisKKwloaSA9IGhsX2dldF9ob3N0aW5mbyhobCwgaG9zdCk7CisJaWYgKGhpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaGwtPmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJCWxpc3RfZGVsKCZoaS0+bGlzdCk7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZobC0+aG9zdF9pbmZvX2xvY2ssIGZsYWdzKTsKKwkJa2ZyZWUoaGkpOworCX0KKworCXJldHVybjsKK30KKworCit2b2lkIGhwc2Jfc2V0X2hvc3RpbmZvX2tleShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCB1bnNpZ25lZCBsb25nIGtleSkKK3sKKwlzdHJ1Y3QgaGxfaG9zdF9pbmZvICpoaTsKKworCWhpID0gaGxfZ2V0X2hvc3RpbmZvKGhsLCBob3N0KTsKKwlpZiAoaGkpCisJCWhpLT5rZXkgPSBrZXk7CisKKwlyZXR1cm47Cit9CisKKwordm9pZCAqaHBzYl9nZXRfaG9zdGluZm9fYnlrZXkoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgdW5zaWduZWQgbG9uZyBrZXkpCit7CisJc3RydWN0IGhsX2hvc3RfaW5mbyAqaGk7CisJdm9pZCAqZGF0YSA9IE5VTEw7CisKKwlpZiAoIWhsKQorCQlyZXR1cm4gTlVMTDsKKworCXJlYWRfbG9jaygmaGwtPmhvc3RfaW5mb19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhpLCAmaGwtPmhvc3RfaW5mb19saXN0LCBsaXN0KSB7CisJCWlmIChoaS0+a2V5ID09IGtleSkgeworCQkJZGF0YSA9IGhpLT5kYXRhOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmhsLT5ob3N0X2luZm9fbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworCitzdGF0aWMgaW50IGhpZ2hsZXZlbF9mb3JfZWFjaF9ob3N0X3JlZyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCB2b2lkICpfX2RhdGEpCit7CisJc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCA9IF9fZGF0YTsKKworCWhsLT5hZGRfaG9zdChob3N0KTsKKworICAgICAgICBpZiAoaG9zdC0+dXBkYXRlX2NvbmZpZ19yb20pIHsKKwkJaWYgKGhwc2JfdXBkYXRlX2NvbmZpZ19yb21faW1hZ2UoaG9zdCkgPCAwKSB7CisJCQlIUFNCX0VSUigiRmFpbGVkIHRvIGdlbmVyYXRlIENvbmZpZ3VyYXRpb24gUk9NIGltYWdlIGZvciBob3N0ICIKKwkJCQkgIiVzLSVkIiwgaGwtPm5hbWUsIGhvc3QtPmlkKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGhwc2JfcmVnaXN0ZXJfaGlnaGxldmVsKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwpCit7CisgICAgICAgIElOSVRfTElTVF9IRUFEKCZobC0+YWRkcl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaGwtPmhvc3RfaW5mb19saXN0KTsKKworCXJ3bG9ja19pbml0KCZobC0+aG9zdF9pbmZvX2xvY2spOworCisJZG93bl93cml0ZSgmaGxfZHJpdmVyc19zZW0pOworICAgICAgICBsaXN0X2FkZF90YWlsKCZobC0+aGxfbGlzdCwgJmhsX2RyaXZlcnMpOworCXVwX3dyaXRlKCZobF9kcml2ZXJzX3NlbSk7CisKKwl3cml0ZV9sb2NrKCZobF9pcnFzX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmhsLT5pcnFfbGlzdCwgJmhsX2lycXMpOworCXdyaXRlX3VubG9jaygmaGxfaXJxc19sb2NrKTsKKworCWlmIChobC0+YWRkX2hvc3QpCisJCW5vZGVtZ3JfZm9yX2VhY2hfaG9zdChobCwgaGlnaGxldmVsX2Zvcl9lYWNoX2hvc3RfcmVnKTsKKworICAgICAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIF9fZGVsZXRlX2FkZHIoc3RydWN0IGhwc2JfYWRkcmVzc19zZXJ2ZSAqYXMpCit7CisJbGlzdF9kZWwoJmFzLT5ob3N0X2xpc3QpOworCWxpc3RfZGVsKCZhcy0+aGxfbGlzdCk7CisJa2ZyZWUoYXMpOworfQorCitzdGF0aWMgdm9pZCBfX3VucmVnaXN0ZXJfaG9zdChzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgdXBkYXRlX2NyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbGgsICpuZXh0OworCXN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUgKmFzOworCisJLyogRmlyc3QsIGxldCB0aGUgaGlnaGxldmVsIGRyaXZlciB1bnJlZyAqLworCWlmIChobC0+cmVtb3ZlX2hvc3QpCisJCWhsLT5yZW1vdmVfaG9zdChob3N0KTsKKworCS8qIFJlbW92ZSBhbnkgYWRkcmVzc2VzIHRoYXQgYXJlIG1hdGNoZWQgZm9yIHRoaXMgaGlnaGxldmVsIGRyaXZlcgorCSAqIGFuZCB0aGlzIHBhcnRpY3VsYXIgaG9zdC4gKi8KKwl3cml0ZV9sb2NrX2lycXNhdmUoJmFkZHJfc3BhY2VfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfc2FmZSAobGgsIG5leHQsICZobC0+YWRkcl9saXN0KSB7CisJCWFzID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IGhwc2JfYWRkcmVzc19zZXJ2ZSwgaGxfbGlzdCk7CisKKwkJaWYgKGFzLT5ob3N0ID09IGhvc3QpCisJCQlfX2RlbGV0ZV9hZGRyKGFzKTsKKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmFkZHJfc3BhY2VfbG9jaywgZmxhZ3MpOworCisJLyogTm93IHVwZGF0ZSB0aGUgY29uZmlnLXJvbSB0byByZWZsZWN0IGFueXRoaW5nIHJlbW92ZWQgYnkgdGhlCisJICogaGlnaGxldmVsIGRyaXZlci4gKi8KKwlpZiAodXBkYXRlX2NyICYmIGhvc3QtPnVwZGF0ZV9jb25maWdfcm9tKSB7CisJCWlmIChocHNiX3VwZGF0ZV9jb25maWdfcm9tX2ltYWdlKGhvc3QpIDwgMCkgeworCQkJSFBTQl9FUlIoIkZhaWxlZCB0byBnZW5lcmF0ZSBDb25maWd1cmF0aW9uIFJPTSBpbWFnZSBmb3IgaG9zdCAiCisJCQkJICIlcy0lZCIsIGhsLT5uYW1lLCBob3N0LT5pZCk7CisJCX0KKwl9CisKKwkvKiBBbmQgZmluYWxseSwgcmVtb3ZlIGFsbCB0aGUgaG9zdCBpbmZvIGFzc29jaWF0ZWQgYmV0d2VlbiB0aGVzZQorCSAqIHR3by4gKi8KKwlocHNiX2Rlc3Ryb3lfaG9zdGluZm8oaGwsIGhvc3QpOworfQorCitzdGF0aWMgaW50IGhpZ2hsZXZlbF9mb3JfZWFjaF9ob3N0X3VucmVnKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHZvaWQgKl9fZGF0YSkKK3sKKwlzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsID0gX19kYXRhOworCisJX191bnJlZ2lzdGVyX2hvc3QoaGwsIGhvc3QsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbChzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsKQoreworCXdyaXRlX2xvY2soJmhsX2lycXNfbG9jayk7CisJbGlzdF9kZWwoJmhsLT5pcnFfbGlzdCk7CisJd3JpdGVfdW5sb2NrKCZobF9pcnFzX2xvY2spOworCisJZG93bl93cml0ZSgmaGxfZHJpdmVyc19zZW0pOworICAgICAgICBsaXN0X2RlbCgmaGwtPmhsX2xpc3QpOworCXVwX3dyaXRlKCZobF9kcml2ZXJzX3NlbSk7CisKKwlub2RlbWdyX2Zvcl9lYWNoX2hvc3QoaGwsIGhpZ2hsZXZlbF9mb3JfZWFjaF9ob3N0X3VucmVnKTsKK30KKwordTY0IGhwc2JfYWxsb2NhdGVfYW5kX3JlZ2lzdGVyX2FkZHJzcGFjZShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLAorCQkJCQkgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKKwkJCQkJIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsCisJCQkJCSB1NjQgc2l6ZSwgdTY0IGFsaWdubWVudCwKKwkJCQkJIHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwlzdHJ1Y3QgaHBzYl9hZGRyZXNzX3NlcnZlICphcywgKmExLCAqYTI7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJdTY0IHJldHZhbCA9IH4wVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IGFsaWduX21hc2sgPSB+KGFsaWdubWVudCAtIDEpOworCisJaWYgKChhbGlnbm1lbnQgJiAzKSB8fCAoYWxpZ25tZW50ID4gMHg4MDAwMDAwMDAwMDBVTEwpIHx8CisJICAgICgoaHdlaWdodDMyKGFsaWdubWVudCA+PiAzMikgKworCSAgICAgIGh3ZWlnaHQzMihhbGlnbm1lbnQgJiAweGZmZmZmZmZmKSAhPSAxKSkpIHsKKwkJSFBTQl9FUlIoIiVzIGNhbGxlZCB3aXRoIGludmFsaWQgYWxpZ25tZW50OiAweCUwNDhsbHgiLAorCQkJIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGxvbmcgbG9uZylhbGlnbm1lbnQpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmIChzdGFydCA9PSB+MFVMTCAmJiBlbmQgPT0gfjBVTEwpIHsKKwkJc3RhcnQgPSBDU1IxMjEyX0FMTF9TUEFDRV9CQVNFICsgMHhmZmZmMDAwMDAwMDBVTEw7ICAvKiBvaGNpMTM5NC5jIGxpbWl0ICovCisJCWVuZCA9IENTUjEyMTJfQUxMX1NQQUNFX0VORDsKKwl9CisKKwlpZiAoKChzdGFydHxlbmQpICYgfmFsaWduX21hc2spIHx8IChzdGFydCA+PSBlbmQpIHx8IChlbmQgPiAweDEwMDAwMDAwMDAwMDBVTEwpKSB7CisJCUhQU0JfRVJSKCIlcyBjYWxsZWQgd2l0aCBpbnZhbGlkIGFkZHJlc3NlcyAoc3RhcnQgPSAlMDEyTHggICAgZW5kID0gJTAxMkx4KSIsCisJCQkgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKWVuZCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJYXMgPSAoc3RydWN0IGhwc2JfYWRkcmVzc19zZXJ2ZSAqKQorCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaHBzYl9hZGRyZXNzX3NlcnZlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFzID09IE5VTEwpIHsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmYXMtPmhvc3RfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmFzLT5obF9saXN0KTsKKwlhcy0+b3AgPSBvcHM7CisJYXMtPmhvc3QgPSBob3N0OworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZhZGRyX3NwYWNlX2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZob3N0LT5hZGRyX3NwYWNlKSB7CisJCXU2NCBhMXNhLCBhMWVhOworCQl1NjQgYTJzYSwgYTJlYTsKKworCQlhMSA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUsIGhvc3RfbGlzdCk7CisJCWEyID0gbGlzdF9lbnRyeShlbnRyeS0+bmV4dCwgc3RydWN0IGhwc2JfYWRkcmVzc19zZXJ2ZSwgaG9zdF9saXN0KTsKKworCQlhMXNhID0gYTEtPnN0YXJ0ICYgYWxpZ25fbWFzazsKKwkJYTFlYSA9IChhMS0+ZW5kICsgYWxpZ25tZW50IC0xKSAmIGFsaWduX21hc2s7CisJCWEyc2EgPSBhMi0+c3RhcnQgJiBhbGlnbl9tYXNrOworCQlhMmVhID0gKGEyLT5lbmQgKyBhbGlnbm1lbnQgLTEpICYgYWxpZ25fbWFzazsKKworCQlpZiAoKGEyc2EgLSBhMWVhID49IHNpemUpICYmIChhMnNhIC0gc3RhcnQgPj0gc2l6ZSkgJiYgKGEyc2EgPiBzdGFydCkpIHsKKwkJCWFzLT5zdGFydCA9IG1heChzdGFydCwgYTFlYSk7CisJCQlhcy0+ZW5kID0gYXMtPnN0YXJ0ICsgc2l6ZTsKKwkJCWxpc3RfYWRkKCZhcy0+aG9zdF9saXN0LCBlbnRyeSk7CisJCQlsaXN0X2FkZF90YWlsKCZhcy0+aGxfbGlzdCwgJmhsLT5hZGRyX2xpc3QpOworCQkJcmV0dmFsID0gYXMtPnN0YXJ0OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYWRkcl9zcGFjZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0dmFsID09IH4wVUxMKSB7CisJCWtmcmVlKGFzKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgaHBzYl9yZWdpc3Rlcl9hZGRyc3BhY2Uoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3BzLCB1NjQgc3RhcnQsIHU2NCBlbmQpCit7CisgICAgICAgIHN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUgKmFzOworCXN0cnVjdCBsaXN0X2hlYWQgKmxoOworICAgICAgICBpbnQgcmV0dmFsID0gMDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBpZiAoKChzdGFydHxlbmQpICYgMykgfHwgKHN0YXJ0ID49IGVuZCkgfHwgKGVuZCA+IDB4MTAwMDAwMDAwMDAwMFVMTCkpIHsKKyAgICAgICAgICAgICAgICBIUFNCX0VSUigiJXMgY2FsbGVkIHdpdGggaW52YWxpZCBhZGRyZXNzZXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgYXMgPSAoc3RydWN0IGhwc2JfYWRkcmVzc19zZXJ2ZSAqKQorICAgICAgICAgICAgICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUpLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgaWYgKGFzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIElOSVRfTElTVF9IRUFEKCZhcy0+aG9zdF9saXN0KTsKKyAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmFzLT5obF9saXN0KTsKKyAgICAgICAgYXMtPm9wID0gb3BzOworICAgICAgICBhcy0+c3RhcnQgPSBzdGFydDsKKyAgICAgICAgYXMtPmVuZCA9IGVuZDsKKwlhcy0+aG9zdCA9IGhvc3Q7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmFkZHJfc3BhY2VfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaChsaCwgJmhvc3QtPmFkZHJfc3BhY2UpIHsKKwkJc3RydWN0IGhwc2JfYWRkcmVzc19zZXJ2ZSAqYXNfdGhpcyA9CisJCQlsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgaHBzYl9hZGRyZXNzX3NlcnZlLCBob3N0X2xpc3QpOworCQlzdHJ1Y3QgaHBzYl9hZGRyZXNzX3NlcnZlICphc19uZXh0ID0KKwkJCWxpc3RfZW50cnkobGgtPm5leHQsIHN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUsIGhvc3RfbGlzdCk7CisKKwkJaWYgKGFzX3RoaXMtPmVuZCA+IGFzLT5zdGFydCkKKwkJCWJyZWFrOworCisJCWlmIChhc19uZXh0LT5zdGFydCA+PSBhcy0+ZW5kKSB7CisJCQlsaXN0X2FkZCgmYXMtPmhvc3RfbGlzdCwgbGgpOworCQkJbGlzdF9hZGRfdGFpbCgmYXMtPmhsX2xpc3QsICZobC0+YWRkcl9saXN0KTsKKwkJCXJldHZhbCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmYWRkcl9zcGFjZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0dmFsID09IDApCisJCWtmcmVlKGFzKTsKKworICAgICAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQgaHBzYl91bnJlZ2lzdGVyX2FkZHJzcGFjZShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IHN0YXJ0KQoreworICAgICAgICBpbnQgcmV0dmFsID0gMDsKKyAgICAgICAgc3RydWN0IGhwc2JfYWRkcmVzc19zZXJ2ZSAqYXM7CisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxoLCAqbmV4dDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICB3cml0ZV9sb2NrX2lycXNhdmUoJmFkZHJfc3BhY2VfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlIChsaCwgbmV4dCwgJmhsLT5hZGRyX2xpc3QpIHsKKyAgICAgICAgICAgICAgICBhcyA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUsIGhsX2xpc3QpOworICAgICAgICAgICAgICAgIGlmIChhcy0+c3RhcnQgPT0gc3RhcnQgJiYgYXMtPmhvc3QgPT0gaG9zdCkgeworCQkJX19kZWxldGVfYWRkcihhcyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmFkZHJfc3BhY2VfbG9jaywgZmxhZ3MpOworCisgICAgICAgIHJldHVybiByZXR2YWw7Cit9CisKK2ludCBocHNiX2xpc3Rlbl9jaGFubmVsKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisgICAgICAgIGlmIChjaGFubmVsID4gNjMpIHsKKyAgICAgICAgICAgICAgICBIUFNCX0VSUigiJXMgY2FsbGVkIHdpdGggaW52YWxpZCBjaGFubmVsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChob3N0LT5pc29fbGlzdGVuX2NvdW50W2NoYW5uZWxdKysgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBob3N0LT5kcml2ZXItPmRldmN0bChob3N0LCBJU09fTElTVEVOX0NIQU5ORUwsIGNoYW5uZWwpOworICAgICAgICB9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBocHNiX3VubGlzdGVuX2NoYW5uZWwoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworICAgICAgICBpZiAoY2hhbm5lbCA+IDYzKSB7CisgICAgICAgICAgICAgICAgSFBTQl9FUlIoIiVzIGNhbGxlZCB3aXRoIGludmFsaWQgY2hhbm5lbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKC0taG9zdC0+aXNvX2xpc3Rlbl9jb3VudFtjaGFubmVsXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaG9zdC0+ZHJpdmVyLT5kZXZjdGwoaG9zdCwgSVNPX1VOTElTVEVOX0NIQU5ORUwsIGNoYW5uZWwpOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfaHBzYl9oaWdobGV2ZWwoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmZHVtbXlfemVyb19hZGRyLmhvc3RfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmR1bW15X3plcm9fYWRkci5obF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZHVtbXlfbWF4X2FkZHIuaG9zdF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZHVtbXlfbWF4X2FkZHIuaGxfbGlzdCk7CisKKwlkdW1teV96ZXJvX2FkZHIub3AgPSBkdW1teV9tYXhfYWRkci5vcCA9ICZkdW1teV9vcHM7CisKKwlkdW1teV96ZXJvX2FkZHIuc3RhcnQgPSBkdW1teV96ZXJvX2FkZHIuZW5kID0gMDsKKwlkdW1teV9tYXhfYWRkci5zdGFydCA9IGR1bW15X21heF9hZGRyLmVuZCA9ICgodTY0KSAxKSA8PCA0ODsKKworCWxpc3RfYWRkX3RhaWwoJmR1bW15X3plcm9fYWRkci5ob3N0X2xpc3QsICZob3N0LT5hZGRyX3NwYWNlKTsKKwlsaXN0X2FkZF90YWlsKCZkdW1teV9tYXhfYWRkci5ob3N0X2xpc3QsICZob3N0LT5hZGRyX3NwYWNlKTsKK30KKwordm9pZCBoaWdobGV2ZWxfYWRkX2hvc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKyAgICAgICAgc3RydWN0IGhwc2JfaGlnaGxldmVsICpobDsKKworCWluaXRfaHBzYl9oaWdobGV2ZWwoaG9zdCk7CisKKwlkb3duX3JlYWQoJmhsX2RyaXZlcnNfc2VtKTsKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeShobCwgJmhsX2RyaXZlcnMsIGhsX2xpc3QpIHsKKwkJaWYgKGhsLT5hZGRfaG9zdCkKKwkJCWhsLT5hZGRfaG9zdChob3N0KTsKKyAgICAgICAgfQorCXVwX3JlYWQoJmhsX2RyaXZlcnNfc2VtKTsKKwlpZiAoaG9zdC0+dXBkYXRlX2NvbmZpZ19yb20pIHsKKwkJaWYgKGhwc2JfdXBkYXRlX2NvbmZpZ19yb21faW1hZ2UoaG9zdCkgPCAwKQorCQkJSFBTQl9FUlIoIkZhaWxlZCB0byBnZW5lcmF0ZSBDb25maWd1cmF0aW9uIFJPTSBpbWFnZSBmb3IgIgorCQkJCSAiaG9zdCAlcy0lZCIsIGhsLT5uYW1lLCBob3N0LT5pZCk7CisJfQorfQorCit2b2lkIGhpZ2hsZXZlbF9yZW1vdmVfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworICAgICAgICBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsOworCisJZG93bl9yZWFkKCZobF9kcml2ZXJzX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShobCwgJmhsX2RyaXZlcnMsIGhsX2xpc3QpCisJCV9fdW5yZWdpc3Rlcl9ob3N0KGhsLCBob3N0LCAwKTsKKwl1cF9yZWFkKCZobF9kcml2ZXJzX3NlbSk7Cit9CisKK3ZvaWQgaGlnaGxldmVsX2hvc3RfcmVzZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKyAgICAgICAgc3RydWN0IGhwc2JfaGlnaGxldmVsICpobDsKKworCXJlYWRfbG9jaygmaGxfaXJxc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhsLCAmaGxfaXJxcywgaXJxX2xpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGwtPmhvc3RfcmVzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICBobC0+aG9zdF9yZXNldChob3N0KTsKKyAgICAgICAgfQorCXJlYWRfdW5sb2NrKCZobF9pcnFzX2xvY2spOworfQorCit2b2lkIGhpZ2hsZXZlbF9pc29fcmVjZWl2ZShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgICAgICBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsOworICAgICAgICBpbnQgY2hhbm5lbCA9ICgoKHF1YWRsZXRfdCAqKWRhdGEpWzBdID4+IDgpICYgMHgzZjsKKworICAgICAgICByZWFkX2xvY2soJmhsX2lycXNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShobCwgJmhsX2lycXMsIGlycV9saXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKGhsLT5pc29fcmVjZWl2ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhsLT5pc29fcmVjZWl2ZShob3N0LCBjaGFubmVsLCBkYXRhLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJlYWRfdW5sb2NrKCZobF9pcnFzX2xvY2spOworfQorCit2b2lkIGhpZ2hsZXZlbF9mY3BfcmVxdWVzdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBpbnQgZGlyZWN0aW9uLAorCQkJICAgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICAgICAgc3RydWN0IGhwc2JfaGlnaGxldmVsICpobDsKKyAgICAgICAgaW50IGN0cyA9ICgocXVhZGxldF90ICopZGF0YSlbMF0gPj4gNDsKKworICAgICAgICByZWFkX2xvY2soJmhsX2lycXNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShobCwgJmhsX2lycXMsIGlycV9saXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKGhsLT5mY3BfcmVxdWVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhsLT5mY3BfcmVxdWVzdChob3N0LCBub2RlaWQsIGRpcmVjdGlvbiwgY3RzLCBkYXRhLAorCQkJCQlsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJlYWRfdW5sb2NrKCZobF9pcnFzX2xvY2spOworfQorCitpbnQgaGlnaGxldmVsX3JlYWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICB1NjQgYWRkciwgdW5zaWduZWQgaW50IGxlbmd0aCwgdTE2IGZsYWdzKQoreworICAgICAgICBzdHJ1Y3QgaHBzYl9hZGRyZXNzX3NlcnZlICphczsKKyAgICAgICAgdW5zaWduZWQgaW50IHBhcnRsZW5ndGg7CisgICAgICAgIGludCByY29kZSA9IFJDT0RFX0FERFJFU1NfRVJST1I7CisKKyAgICAgICAgcmVhZF9sb2NrKCZhZGRyX3NwYWNlX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhcywgJmhvc3QtPmFkZHJfc3BhY2UsIGhvc3RfbGlzdCkgeworCQlpZiAoYXMtPnN0YXJ0ID4gYWRkcikKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKGFzLT5lbmQgPiBhZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bGVuZ3RoID0gbWluKGFzLT5lbmQgLSBhZGRyLCAodTY0KSBsZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXMtPm9wLT5yZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gYXMtPm9wLT5yZWFkKGhvc3QsIG5vZGVpZCwgZGF0YSwKKwkJCQkJCSAgICAgYWRkciwgcGFydGxlbmd0aCwgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBSQ09ERV9UWVBFX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisJCQlkYXRhICs9IHBhcnRsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggLT0gcGFydGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgKz0gcGFydGxlbmd0aDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyY29kZSAhPSBSQ09ERV9DT01QTEVURSkgfHwgIWxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZWFkX3VubG9jaygmYWRkcl9zcGFjZV9sb2NrKTsKKworICAgICAgICBpZiAobGVuZ3RoICYmIChyY29kZSA9PSBSQ09ERV9DT01QTEVURSkpIHsKKyAgICAgICAgICAgICAgICByY29kZSA9IFJDT0RFX0FERFJFU1NfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmNvZGU7Cit9CisKK2ludCBoaWdobGV2ZWxfd3JpdGUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgaW50IGRlc3RpZCwKKwkJICAgIHZvaWQgKmRhdGEsIHU2NCBhZGRyLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1MTYgZmxhZ3MpCit7CisgICAgICAgIHN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUgKmFzOworICAgICAgICB1bnNpZ25lZCBpbnQgcGFydGxlbmd0aDsKKyAgICAgICAgaW50IHJjb2RlID0gUkNPREVfQUREUkVTU19FUlJPUjsKKworICAgICAgICByZWFkX2xvY2soJmFkZHJfc3BhY2VfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFzLCAmaG9zdC0+YWRkcl9zcGFjZSwgaG9zdF9saXN0KSB7CisJCWlmIChhcy0+c3RhcnQgPiBhZGRyKQorCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAoYXMtPmVuZCA+IGFkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRsZW5ndGggPSBtaW4oYXMtPmVuZCAtIGFkZHIsICh1NjQpIGxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcy0+b3AtPndyaXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gYXMtPm9wLT53cml0ZShob3N0LCBub2RlaWQsIGRlc3RpZCwKKwkJCQkJCSAgICAgIGRhdGEsIGFkZHIsIHBhcnRsZW5ndGgsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gUkNPREVfVFlQRV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCQkJZGF0YSArPSBwYXJ0bGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIC09IHBhcnRsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyICs9IHBhcnRsZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmNvZGUgIT0gUkNPREVfQ09NUExFVEUpIHx8ICFsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVhZF91bmxvY2soJmFkZHJfc3BhY2VfbG9jayk7CisKKyAgICAgICAgaWYgKGxlbmd0aCAmJiAocmNvZGUgPT0gUkNPREVfQ09NUExFVEUpKSB7CisgICAgICAgICAgICAgICAgcmNvZGUgPSBSQ09ERV9BRERSRVNTX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJjb2RlOworfQorCisKK2ludCBoaWdobGV2ZWxfbG9jayhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBxdWFkbGV0X3QgKnN0b3JlLAorICAgICAgICAgICAgICAgICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgZGF0YSwgcXVhZGxldF90IGFyZywgaW50IGV4dF90Y29kZSwgdTE2IGZsYWdzKQoreworICAgICAgICBzdHJ1Y3QgaHBzYl9hZGRyZXNzX3NlcnZlICphczsKKyAgICAgICAgaW50IHJjb2RlID0gUkNPREVfQUREUkVTU19FUlJPUjsKKworICAgICAgICByZWFkX2xvY2soJmFkZHJfc3BhY2VfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFzLCAmaG9zdC0+YWRkcl9zcGFjZSwgaG9zdF9saXN0KSB7CisJCWlmIChhcy0+c3RhcnQgPiBhZGRyKQorCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAoYXMtPmVuZCA+IGFkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcy0+b3AtPmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBhcy0+b3AtPmxvY2soaG9zdCwgbm9kZWlkLCBzdG9yZSwgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgYXJnLCBleHRfdGNvZGUsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gUkNPREVfVFlQRV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVhZF91bmxvY2soJmFkZHJfc3BhY2VfbG9jayk7CisKKyAgICAgICAgcmV0dXJuIHJjb2RlOworfQorCitpbnQgaGlnaGxldmVsX2xvY2s2NChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBvY3RsZXRfdCAqc3RvcmUsCisgICAgICAgICAgICAgICAgICAgICB1NjQgYWRkciwgb2N0bGV0X3QgZGF0YSwgb2N0bGV0X3QgYXJnLCBpbnQgZXh0X3Rjb2RlLCB1MTYgZmxhZ3MpCit7CisgICAgICAgIHN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUgKmFzOworICAgICAgICBpbnQgcmNvZGUgPSBSQ09ERV9BRERSRVNTX0VSUk9SOworCisgICAgICAgIHJlYWRfbG9jaygmYWRkcl9zcGFjZV9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYXMsICZob3N0LT5hZGRyX3NwYWNlLCBob3N0X2xpc3QpIHsKKwkJaWYgKGFzLT5zdGFydCA+IGFkZHIpCisJCQlicmVhazsKKworICAgICAgICAgICAgICAgIGlmIChhcy0+ZW5kID4gYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFzLT5vcC0+bG9jazY0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gYXMtPm9wLT5sb2NrNjQoaG9zdCwgbm9kZWlkLCBzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLCBkYXRhLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0X3Rjb2RlLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IFJDT0RFX1RZUEVfRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlYWRfdW5sb2NrKCZhZGRyX3NwYWNlX2xvY2spOworCisgICAgICAgIHJldHVybiByY29kZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmggYi9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMTlmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5oCkBAIC0wLDAgKzEsMTkwIEBACisKKyNpZm5kZWYgSUVFRTEzOTRfSElHSExFVkVMX0gKKyNkZWZpbmUgSUVFRTEzOTRfSElHSExFVkVMX0gKKworCitzdHJ1Y3QgaHBzYl9hZGRyZXNzX3NlcnZlIHsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBob3N0X2xpc3Q7IC8qIHBlciBob3N0IGxpc3QgKi8KKworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGhsX2xpc3Q7IC8qIGhwc2JfaGlnaGxldmVsIGxpc3QgKi8KKworICAgICAgICBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3A7CisKKwlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OworCisgICAgICAgIC8qIGZpcnN0IGFkZHJlc3MgaGFuZGxlZCBhbmQgZmlyc3QgYWRkcmVzcyBiZWhpbmQsIHF1YWRsZXQgYWxpZ25lZCAqLworICAgICAgICB1NjQgc3RhcnQsIGVuZDsKK307CisKKworLyoKKyAqIFRoZSBhYm92ZSBzdHJ1Y3RzIGFyZSBpbnRlcm5hbCB0byBoaWdobGV2ZWwgZHJpdmVyIGhhbmRsaW5nLiAgT25seSB0aGUKKyAqIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIGFyZSBvZiBpbnRlcmVzdCB0byBhY3R1YWwgaGlnaGxldmVsIGRyaXZlcnMuCisgKi8KKworc3RydWN0IGhwc2JfaGlnaGxldmVsIHsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwljb25zdCBjaGFyICpuYW1lOworCisgICAgICAgIC8qIEFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGNhbiBsZWdhbGx5IGJlIE5VTEwsIGV4Y2VwdCBmb3IKKyAgICAgICAgICogaXNvX3JlY2VpdmUgd2hpY2ggY2FuIG9ubHkgYmUgTlVMTCB3aGVuIHlvdSBkb24ndCByZXF1ZXN0CisgICAgICAgICAqIGNoYW5uZWxzLiAqLworCisgICAgICAgIC8qIE5ldyBob3N0IGluaXRpYWxpemVkLiAgV2lsbCBhbHNvIGJlIGNhbGxlZCBkdXJpbmcKKyAgICAgICAgICogaHBzYl9yZWdpc3Rlcl9oaWdobGV2ZWwgZm9yIGFsbCBob3N0cyBhbHJlYWR5IGluc3RhbGxlZC4gKi8KKyAgICAgICAgdm9pZCAoKmFkZF9ob3N0KSAoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CisKKyAgICAgICAgLyogSG9zdCBhYm91dCB0byBiZSByZW1vdmVkLiAgV2lsbCBhbHNvIGJlIGNhbGxlZCBkdXJpbmcKKyAgICAgICAgICogaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbCBvbmNlIGZvciBlYWNoIGhvc3QuICovCisgICAgICAgIHZvaWQgKCpyZW1vdmVfaG9zdCkgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOworCisgICAgICAgIC8qIEhvc3QgZXhwZXJpZW5jZWQgYnVzIHJlc2V0IHdpdGggcG9zc2libGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgorCSAqIE5vdGUgdGhhdCB0aGlzIG9uZSBtYXkgb2NjdXIgZHVyaW5nIGludGVycnVwdC9ib3R0b20gaGFsZiBoYW5kbGluZy4KKwkgKiBZb3UgY2FuIG5vdCBleHBlY3QgdG8gYmUgYWJsZSB0byBkbyBzdG9jayBocHNiX3JlYWRzLiAqLworICAgICAgICB2b2lkICgqaG9zdF9yZXNldCkgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOworCisgICAgICAgIC8qIEFuIGlzb2Nocm9ub3VzIHBhY2tldCB3YXMgcmVjZWl2ZWQuICBDaGFubmVsIGNvbnRhaW5zIHRoZSBjaGFubmVsCisgICAgICAgICAqIG51bWJlciBmb3IgeW91ciBjb252ZW5pZW5jZSwgaXQgaXMgYWxzbyBjb250YWluZWQgaW4gdGhlIGluY2x1ZGVkCisgICAgICAgICAqIHBhY2tldCBoZWFkZXIgKGZpcnN0IHF1YWRsZXQsIENSQ3MgYXJlIG1pc3NpbmcpLiAgWW91IG1heSBnZXQgY2FsbGVkCisgICAgICAgICAqIGZvciBjaGFubmVsL2hvc3QgY29tYmluYXRpb25zIHlvdSBkaWQgbm90IHJlcXVlc3QuICovCisgICAgICAgIHZvaWQgKCppc29fcmVjZWl2ZSkgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkbGV0X3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworCisgICAgICAgIC8qIEEgd3JpdGUgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgb24gZWl0aGVyIHRoZSBGQ1BfQ09NTUFORCAoZGlyZWN0aW9uID0KKyAgICAgICAgICogMCkgb3IgdGhlIEZDUF9SRVNQT05TRSAoZGlyZWN0aW9uID0gMSkgcmVnaXN0ZXIuICBUaGUgY3RzIGFyZworICAgICAgICAgKiBjb250YWlucyB0aGUgY3RzIGZpZWxkIChmaXJzdCBieXRlIG9mIGRhdGEpLiAqLworICAgICAgICB2b2lkICgqZmNwX3JlcXVlc3QpIChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBpbnQgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3RzLCB1OCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisKKwkvKiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgYnkgdGhlIHN1YnN5c3RlbSB3aGVuIHRoZQorCSAqIGhwc2JfaGlnbGV2ZWwgaXMgcmVnaXN0ZXJlZC4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGhsX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBpcnFfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFkZHJfbGlzdDsKKworCXN0cnVjdCBsaXN0X2hlYWQgaG9zdF9pbmZvX2xpc3Q7CisJcndsb2NrX3QgaG9zdF9pbmZvX2xvY2s7Cit9OworCitzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyB7CisgICAgICAgIC8qCisgICAgICAgICAqIE51bGwgZnVuY3Rpb24gcG9pbnRlcnMgd2lsbCBtYWtlIHRoZSByZXNwZWN0aXZlIG9wZXJhdGlvbiBjb21wbGV0ZQorICAgICAgICAgKiB3aXRoIFJDT0RFX1RZUEVfRVJST1IuICBNYWtlcyBmb3IgZWFzeSB0byBpbXBsZW1lbnQgcmVhZC1vbmx5CisgICAgICAgICAqIHJlZ2lzdGVycyAoanVzdCBsZWF2ZSBldmVyeXRoaW5nIGJ1dCByZWFkIE5VTEwpLgorICAgICAgICAgKgorICAgICAgICAgKiBBbGwgZnVuY3Rpb25zIHNoYWxsIHJldHVybiBhcHByb3ByaWF0ZSBJRUVFIDEzOTQgcmNvZGVzLgorICAgICAgICAgKi8KKworICAgICAgICAvKiBUaGVzZSBmdW5jdGlvbnMgaGF2ZSB0byBpbXBsZW1lbnQgYmxvY2sgcmVhZHMgZm9yIHRoZW1zZWx2ZXMuICovCisgICAgICAgIC8qIFRoZXNlIGZ1bmN0aW9ucyBlaXRoZXIgcmV0dXJuIGEgcmVzcG9uc2UgY29kZQorICAgICAgICAgICBvciBhIG5lZ2F0aXZlIG51bWJlci4gSW4gdGhlIGZpcnN0IGNhc2UgYSByZXNwb25zZSB3aWxsIGJlIGdlbmVyYXRlZDsgaW4gdGhlCisgICAgICAgICAgIGxhdGVyIGNhc2UsIG5vIHJlc3BvbnNlIHdpbGwgYmUgc2VudCBhbmQgdGhlIGRyaXZlciwgdGhhdCBoYW5kbGVkIHRoZSByZXF1ZXN0CisgICAgICAgICAgIHdpbGwgc2VuZCB0aGUgcmVzcG9uc2UgaXRzZWxmCisgICAgICAgICovCisgICAgICAgIGludCAoKnJlYWQpIChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBxdWFkbGV0X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIHU2NCBhZGRyLCBzaXplX3QgbGVuZ3RoLCB1MTYgZmxhZ3MpOworICAgICAgICBpbnQgKCp3cml0ZSkgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIGludCBkZXN0aWQsCisJCSAgICAgIHF1YWRsZXRfdCAqZGF0YSwgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbGFncyk7CisKKyAgICAgICAgLyogTG9jayB0cmFuc2FjdGlvbnM6IHdyaXRlIHJlc3VsdHMgb2YgZXh0X3Rjb2RlIG9wZXJhdGlvbiBpbnRvCisgICAgICAgICAqICpzdG9yZS4gKi8KKyAgICAgICAgaW50ICgqbG9jaykgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHF1YWRsZXRfdCAqc3RvcmUsCisgICAgICAgICAgICAgICAgICAgICB1NjQgYWRkciwgcXVhZGxldF90IGRhdGEsIHF1YWRsZXRfdCBhcmcsIGludCBleHRfdGNvZGUsIHUxNiBmbGFncyk7CisgICAgICAgIGludCAoKmxvY2s2NCkgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIG9jdGxldF90ICpzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdTY0IGFkZHIsIG9jdGxldF90IGRhdGEsIG9jdGxldF90IGFyZywgaW50IGV4dF90Y29kZSwgdTE2IGZsYWdzKTsKK307CisKKwordm9pZCBoaWdobGV2ZWxfYWRkX2hvc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7Cit2b2lkIGhpZ2hsZXZlbF9yZW1vdmVfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKK3ZvaWQgaGlnaGxldmVsX2hvc3RfcmVzZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CisKKworLyogdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdG8gaGFuZGxlIHRyYW5zYWN0aW9ucy4gVGhleSBhcmUgY2FsbGVkLCB3aGVuCisgICBhIHBhY2tldCBhcnJpdmVzLiBUaGUgZmxhZ3MgYXJndW1lbnQgY29udGFpbnMgdGhlIHNlY29uZCB3b3JkIG9mIHRoZSBmaXJzdCBoZWFkZXIKKyAgIHF1YWRsZXQgb2YgdGhlIGluY29taW5nIHBhY2tldCAoY29udGFpbmluZyB0cmFuc2FjdGlvbiBsYWJlbCwgcmV0cnkgY29kZSwKKyAgIHRyYW5zYWN0aW9uIGNvZGUgYW5kIHByaW9yaXR5KS4gVGhlc2UgZnVuY3Rpb25zIGVpdGhlciByZXR1cm4gYSByZXNwb25zZSBjb2RlCisgICBvciBhIG5lZ2F0aXZlIG51bWJlci4gSW4gdGhlIGZpcnN0IGNhc2UgYSByZXNwb25zZSB3aWxsIGJlIGdlbmVyYXRlZDsgaW4gdGhlCisgICBsYXRlciBjYXNlLCBubyByZXNwb25zZSB3aWxsIGJlIHNlbnQgYW5kIHRoZSBkcml2ZXIsIHRoYXQgaGFuZGxlZCB0aGUgcmVxdWVzdAorICAgd2lsbCBzZW5kIHRoZSByZXNwb25zZSBpdHNlbGYuCisqLworaW50IGhpZ2hsZXZlbF9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgdTY0IGFkZHIsIHVuc2lnbmVkIGludCBsZW5ndGgsIHUxNiBmbGFncyk7CitpbnQgaGlnaGxldmVsX3dyaXRlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIGludCBkZXN0aWQsCisJCSAgICB2b2lkICpkYXRhLCB1NjQgYWRkciwgdW5zaWduZWQgaW50IGxlbmd0aCwgdTE2IGZsYWdzKTsKK2ludCBoaWdobGV2ZWxfbG9jayhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBxdWFkbGV0X3QgKnN0b3JlLAorICAgICAgICAgICAgICAgICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgZGF0YSwgcXVhZGxldF90IGFyZywgaW50IGV4dF90Y29kZSwgdTE2IGZsYWdzKTsKK2ludCBoaWdobGV2ZWxfbG9jazY0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIG9jdGxldF90ICpzdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgIHU2NCBhZGRyLCBvY3RsZXRfdCBkYXRhLCBvY3RsZXRfdCBhcmcsIGludCBleHRfdGNvZGUsIHUxNiBmbGFncyk7CisKK3ZvaWQgaGlnaGxldmVsX2lzb19yZWNlaXZlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKK3ZvaWQgaGlnaGxldmVsX2ZjcF9yZXF1ZXN0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIGludCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKworCisvKgorICogUmVnaXN0ZXIgaGlnaGxldmVsIGRyaXZlci4gIFRoZSBuYW1lIHBvaW50ZXIgaGFzIHRvIHN0YXkgdmFsaWQgYXQgYWxsIHRpbWVzCisgKiBiZWNhdXNlIHRoZSBzdHJpbmcgaXMgbm90IGNvcGllZC4KKyAqLwordm9pZCBocHNiX3JlZ2lzdGVyX2hpZ2hsZXZlbChzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsKTsKK3ZvaWQgaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbChzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsKTsKKworLyoKKyAqIFJlZ2lzdGVyIGhhbmRsZXJzIGZvciBob3N0IGFkZHJlc3Mgc3BhY2VzLiAgU3RhcnQgYW5kIGVuZCBhcmUgNDggYml0IHBvaW50ZXJzCisgKiBhbmQgaGF2ZSB0byBiZSBxdWFkbGV0IGFsaWduZWQgKGVuZCBwb2ludHMgdG8gdGhlIGZpcnN0IGFkZHJlc3MgYmVoaW5kIHRoZQorICogaGFuZGxlZCBhZGRyZXNzZXMuICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgc2luZ2xlCisgKiBocHNiX2hpZ2hsZXZlbCB0byBpbXBsZW1lbnQgc3BhcnNlIHJlZ2lzdGVyIHNldHMuICBUaGUgcmVxdWVzdGVkIHJlZ2lvbiBtdXN0CisgKiBub3Qgb3ZlcmxhcCBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgcmVnaW9uLCBvdGhlcndpc2UgcmVnaXN0ZXJpbmcgd2lsbCBmYWlsLgorICoKKyAqIEl0IHJldHVybnMgdHJ1ZSBmb3Igc3VjY2Vzc2Z1bCBhbGxvY2F0aW9uLiAgVGhlcmUgaXMgbm8gdW5yZWdpc3RlciBmdW5jdGlvbiwKKyAqIGFsbCBhZGRyZXNzIHNwYWNlcyBhcmUgZGVhbGxvY2F0ZWQgdG9nZXRoZXIgd2l0aCB0aGUgaHBzYl9oaWdobGV2ZWwuCisgKi8KK3U2NCBocHNiX2FsbG9jYXRlX2FuZF9yZWdpc3Rlcl9hZGRyc3BhY2Uoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwKKwkJCQkJIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCisJCQkJCSBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3BzLAorCQkJCQkgdTY0IHNpemUsIHU2NCBhbGlnbm1lbnQsCisJCQkJCSB1NjQgc3RhcnQsIHU2NCBlbmQpOworaW50IGhwc2JfcmVnaXN0ZXJfYWRkcnNwYWNlKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKKworaW50IGhwc2JfdW5yZWdpc3Rlcl9hZGRyc3BhY2Uoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU2NCBzdGFydCk7CisKKy8qCisgKiBFbmFibGUgb3IgZGlzYWJsZSByZWNldmluZyBhIGNlcnRhaW4gaXNvY2hyb25vdXMgY2hhbm5lbCB0aHJvdWdoIHRoZQorICogaXNvX3JlY2VpdmUgb3AuCisgKi8KK2ludCBocHNiX2xpc3Rlbl9jaGFubmVsKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwpOwordm9pZCBocHNiX3VubGlzdGVuX2NoYW5uZWwoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsKTsKKworCisvKiBSZXRyaWV2ZSBhIGhvc3RpbmZvIHBvaW50ZXIgYm91bmQgdG8gdGhpcyBkcml2ZXIvaG9zdCAqLwordm9pZCAqaHBzYl9nZXRfaG9zdGluZm8oc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CisKKy8qIEFsbG9jYXRlIGEgaG9zdGluZm8gcG9pbnRlciBvZiBkYXRhX3NpemUgYm91bmQgdG8gdGhpcyBkcml2ZXIvaG9zdCAqLwordm9pZCAqaHBzYl9jcmVhdGVfaG9zdGluZm8oc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKKwkJCSAgIHNpemVfdCBkYXRhX3NpemUpOworCisvKiBGcmVlIGFuZCByZW1vdmUgdGhlIGhvc3RpbmZvIHBvaW50ZXIgYm91bmQgdG8gdGhpcyBkcml2ZXIvaG9zdCAqLwordm9pZCBocHNiX2Rlc3Ryb3lfaG9zdGluZm8oc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CisKKy8qIFNldCBhbiBhbHRlcm5hdGUgbG9va3VwIGtleSBmb3IgdGhlIGhvc3RpbmZvIGJvdW5kIHRvIHRoaXMgZHJpdmVyL2hvc3QgKi8KK3ZvaWQgaHBzYl9zZXRfaG9zdGluZm9fa2V5KHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGxvbmcga2V5KTsKKworLyogUmV0cmlldmUgdGhlIGFsdGVybmF0ZSBsb29rdXAga2V5IGZvciB0aGUgaG9zdGluZm8gYm91bmQgdG8gdGhpcyBkcml2ZXIvaG9zdCAqLwordW5zaWduZWQgbG9uZyBocHNiX2dldF9ob3N0aW5mb19rZXkoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CisKKy8qIFJldHJpZXZlIGEgaG9zdGluZm8gcG9pbnRlciBib3VuZCB0byB0aGlzIGRyaXZlciB1c2luZyBpdHMgYWx0ZXJuYXRlIGtleSAqLwordm9pZCAqaHBzYl9nZXRfaG9zdGluZm9fYnlrZXkoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgdW5zaWduZWQgbG9uZyBrZXkpOworCisvKiBTZXQgdGhlIGhvc3RpbmZvIHBvaW50ZXIgdG8gc29tZXRoaW5nIHVzZWZ1bC4gVXN1YWxseSBmb2xsb3dzIGEgY2FsbCB0bworICogaHBzYl9jcmVhdGVfaG9zdGluZm8sIHdoZXJlIHRoZSBzaXplIGlzIDAuICovCitpbnQgaHBzYl9zZXRfaG9zdGluZm8oc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgdm9pZCAqZGF0YSk7CisKKy8qIFJldHJpZXZlIGhwc2JfaG9zdCB1c2luZyBhIGhpZ2hsZXZlbCBoYW5kbGUgYW5kIGEga2V5ICovCitzdHJ1Y3QgaHBzYl9ob3N0ICpocHNiX2dldF9ob3N0X2J5a2V5KHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHVuc2lnbmVkIGxvbmcga2V5KTsKKworI2VuZGlmIC8qIElFRUUxMzk0X0hJR0hMRVZFTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmMgYi9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwMmM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIElFRUUgMTM5NCBmb3IgTGludXgKKyAqCisgKiBMb3cgbGV2ZWwgKGhvc3QgYWRhcHRlcikgbWFuYWdlbWVudC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQW5kcmVhcyBFLiBCb21iZQorICogQ29weXJpZ2h0IChDKSAxOTk5IEVtYW51ZWwgUGlya2VyCisgKgorICogVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgcm9vdAorICogZGlyZWN0b3J5IG9mIHRoZSBrZXJuZWwgc291cmNlcyBmb3IgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisjaW5jbHVkZSAiY3NyMTIxMi5oIgorI2luY2x1ZGUgImllZWUxMzk0LmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfdHlwZXMuaCIKKyNpbmNsdWRlICJob3N0cy5oIgorI2luY2x1ZGUgImllZWUxMzk0X2NvcmUuaCIKKyNpbmNsdWRlICJoaWdobGV2ZWwuaCIKKyNpbmNsdWRlICJub2RlbWdyLmgiCisjaW5jbHVkZSAiY3NyLmgiCisjaW5jbHVkZSAiY29uZmlnX3JvbXMuaCIKKworCitzdGF0aWMgdm9pZCBkZWxheWVkX3Jlc2V0X2J1cyh2b2lkICogX19yZXNldF9pbmZvKQoreworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSAoc3RydWN0IGhwc2JfaG9zdCopX19yZXNldF9pbmZvOworCWludCBnZW5lcmF0aW9uID0gaG9zdC0+Y3NyLmdlbmVyYXRpb24gKyAxOworCisJLyogVGhlIGdlbmVyYXRpb24gZmllbGQgcm9sbHMgb3ZlciB0byAyIHJhdGhlciB0aGFuIDAgcGVyIElFRUUKKwkgKiAxMzk0YS0yMDAwLiAqLworCWlmIChnZW5lcmF0aW9uID4gMHhmIHx8IGdlbmVyYXRpb24gPCAyKQorCQlnZW5lcmF0aW9uID0gMjsKKworCUNTUl9TRVRfQlVTX0lORk9fR0VORVJBVElPTihob3N0LT5jc3Iucm9tLCBnZW5lcmF0aW9uKTsKKwlpZiAoY3NyMTIxMl9nZW5lcmF0ZV9jc3JfaW1hZ2UoaG9zdC0+Y3NyLnJvbSkgIT0gQ1NSMTIxMl9TVUNDRVNTKSB7CisJCS8qIENTUiBpbWFnZSBjcmVhdGlvbiBmYWlsZWQsIHJlc2V0IGdlbmVyYXRpb24gZmllbGQgYW5kIGRvIG5vdAorCQkgKiBpc3N1ZSBhIGJ1cyByZXNldC4gKi8KKwkJQ1NSX1NFVF9CVVNfSU5GT19HRU5FUkFUSU9OKGhvc3QtPmNzci5yb20sIGhvc3QtPmNzci5nZW5lcmF0aW9uKTsKKwkJcmV0dXJuOworCX0KKworCWhvc3QtPmNzci5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKworCWhvc3QtPnVwZGF0ZV9jb25maWdfcm9tID0gMDsKKwlpZiAoaG9zdC0+ZHJpdmVyLT5zZXRfaHdfY29uZmlnX3JvbSkKKwkJaG9zdC0+ZHJpdmVyLT5zZXRfaHdfY29uZmlnX3JvbShob3N0LCBob3N0LT5jc3Iucm9tLT5idXNfaW5mb19kYXRhKTsKKworCWhvc3QtPmNzci5nZW5fdGltZXN0YW1wW2hvc3QtPmNzci5nZW5lcmF0aW9uXSA9IGppZmZpZXM7CisJaHBzYl9yZXNldF9idXMoaG9zdCwgU0hPUlRfUkVTRVQpOworfQorCitzdGF0aWMgaW50IGR1bW15X3RyYW5zbWl0X3BhY2tldChzdHJ1Y3QgaHBzYl9ob3N0ICpoLCBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnApCit7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bW15X2RldmN0bChzdHJ1Y3QgaHBzYl9ob3N0ICpoLCBlbnVtIGRldmN0bF9jbWQgYywgaW50IGFyZykKK3sKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGR1bW15X2lzb2N0bChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgZW51bSBpc29jdGxfY21kIGNvbW1hbmQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBocHNiX2hvc3RfZHJpdmVyIGR1bW15X2RyaXZlciA9IHsKKyAgICAgICAgLnRyYW5zbWl0X3BhY2tldCA9IGR1bW15X3RyYW5zbWl0X3BhY2tldCwKKyAgICAgICAgLmRldmN0bCA9ICAgICAgICAgIGR1bW15X2RldmN0bCwKKwkuaXNvY3RsID0gICAgICAgICAgZHVtbXlfaXNvY3RsCit9OworCitzdGF0aWMgaW50IGFsbG9jX2hvc3RudW1fY2Ioc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgdm9pZCAqX19kYXRhKQoreworCWludCAqaG9zdG51bSA9IF9fZGF0YTsKKworCWlmIChob3N0LT5pZCA9PSAqaG9zdG51bSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBocHNiX2FsbG9jX2hvc3QgLSBhbGxvY2F0ZSBhIG5ldyBob3N0IGNvbnRyb2xsZXIuCisgKiBAZHJ2OiB0aGUgZHJpdmVyIHRoYXQgd2lsbCBtYW5hZ2UgdGhlIGhvc3QgY29udHJvbGxlcgorICogQGV4dHJhOiBudW1iZXIgb2YgZXh0cmEgYnl0ZXMgdG8gYWxsb2NhdGUgZm9yIHRoZSBkcml2ZXIKKyAqCisgKiBBbGxvY2F0ZSBhICZocHNiX2hvc3QgYW5kIGluaXRpYWxpemUgdGhlIGdlbmVyYWwgc3Vic3lzdGVtIHNwZWNpZmljCisgKiBmaWVsZHMuICBJZiB0aGUgZHJpdmVyIG5lZWRzIHRvIHN0b3JlIHBlciBob3N0IGRhdGEsIGFzIGRyaXZlcnMKKyAqIHVzdWFsbHkgZG8sIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIGNhbiBiZSBzcGVjaWZpZWQgYnkgdGhlCisgKiBAZXh0cmEgcGFyYW1ldGVyLiAgT25jZSBhbGxvY2F0ZWQsIHRoZSBkcml2ZXIgc2hvdWxkIGluaXRpYWxpemUgdGhlCisgKiBkcml2ZXIgc3BlY2lmaWMgcGFydHMsIGVuYWJsZSB0aGUgY29udHJvbGxlciBhbmQgbWFrZSBpdCBhdmFpbGFibGUKKyAqIHRvIHRoZSBnZW5lcmFsIHN1YnN5c3RlbSB1c2luZyBocHNiX2FkZF9ob3N0KCkuCisgKgorICogUmV0dXJuIFZhbHVlOiBhIHBvaW50ZXIgdG8gdGhlICZocHNiX2hvc3QgaWYgc3VjY2VzZnVsLCAlTlVMTCBpZgorICogbm8gbWVtb3J5IHdhcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGhvc3RfbnVtX2FsbG9jKTsKKworc3RydWN0IGhwc2JfaG9zdCAqaHBzYl9hbGxvY19ob3N0KHN0cnVjdCBocHNiX2hvc3RfZHJpdmVyICpkcnYsIHNpemVfdCBleHRyYSwKKwkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGhwc2JfaG9zdCAqaDsKKwlpbnQgaTsKKwlpbnQgaG9zdG51bSA9IDA7CisKKyAgICAgICAgaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBocHNiX2hvc3QpICsgZXh0cmEsIFNMQUJfS0VSTkVMKTsKKyAgICAgICAgaWYgKCFoKSByZXR1cm4gTlVMTDsKKyAgICAgICAgbWVtc2V0KGgsIDAsIHNpemVvZihzdHJ1Y3QgaHBzYl9ob3N0KSArIGV4dHJhKTsKKworCWgtPmNzci5yb20gPSBjc3IxMjEyX2NyZWF0ZV9jc3IoJmNzcl9idXNfb3BzLCBDU1JfQlVTX0lORk9fU0laRSwgaCk7CisJaWYgKCFoLT5jc3Iucm9tKSB7CisJCWtmcmVlKGgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwloLT5ob3N0ZGF0YSA9IGggKyAxOworICAgICAgICBoLT5kcml2ZXIgPSBkcnY7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZoLT5wZW5kaW5nX3BhY2tldF9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmgtPmFkZHJfc3BhY2UpOworCisJZm9yIChpID0gMjsgaSA8IDE2OyBpKyspCisJCWgtPmNzci5nZW5fdGltZXN0YW1wW2ldID0gamlmZmllcyAtIDYwICogSFo7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoLT50cG9vbCk7IGkrKykKKwkJSFBTQl9UUE9PTF9JTklUKCZoLT50cG9vbFtpXSk7CisKKwlhdG9taWNfc2V0KCZoLT5nZW5lcmF0aW9uLCAwKTsKKworCUlOSVRfV09SSygmaC0+ZGVsYXllZF9yZXNldCwgZGVsYXllZF9yZXNldF9idXMsIGgpOworCQorCWluaXRfdGltZXIoJmgtPnRpbWVvdXQpOworCWgtPnRpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBoOworCWgtPnRpbWVvdXQuZnVuY3Rpb24gPSBhYm9ydF90aW1lZG91dHM7CisJaC0+dGltZW91dF9pbnRlcnZhbCA9IEhaIC8gMjA7IC8vIDUwbXMgYnkgZGVmYXVsdAorCisgICAgICAgIGgtPnRvcG9sb2d5X21hcCA9IGgtPmNzci50b3BvbG9neV9tYXAgKyAzOworICAgICAgICBoLT5zcGVlZF9tYXAgPSAodTggKikoaC0+Y3NyLnNwZWVkX21hcCArIDIpOworCisJZG93bigmaG9zdF9udW1fYWxsb2MpOworCisJd2hpbGUgKG5vZGVtZ3JfZm9yX2VhY2hfaG9zdCgmaG9zdG51bSwgYWxsb2NfaG9zdG51bV9jYikpCisJCWhvc3RudW0rKzsKKworCWgtPmlkID0gaG9zdG51bTsKKworCW1lbWNweSgmaC0+ZGV2aWNlLCAmbm9kZW1ncl9kZXZfdGVtcGxhdGVfaG9zdCwgc2l6ZW9mKGgtPmRldmljZSkpOworCWgtPmRldmljZS5wYXJlbnQgPSBkZXY7CisJc25wcmludGYoaC0+ZGV2aWNlLmJ1c19pZCwgQlVTX0lEX1NJWkUsICJmdy1ob3N0JWQiLCBoLT5pZCk7CisKKwloLT5jbGFzc19kZXYuZGV2ID0gJmgtPmRldmljZTsKKwloLT5jbGFzc19kZXYuY2xhc3MgPSAmaHBzYl9ob3N0X2NsYXNzOworCXNucHJpbnRmKGgtPmNsYXNzX2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsICJmdy1ob3N0JWQiLCBoLT5pZCk7CisKKwlkZXZpY2VfcmVnaXN0ZXIoJmgtPmRldmljZSk7CisJY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZoLT5jbGFzc19kZXYpOworCWdldF9kZXZpY2UoJmgtPmRldmljZSk7CisKKwl1cCgmaG9zdF9udW1fYWxsb2MpOworCisJcmV0dXJuIGg7Cit9CisKK2ludCBocHNiX2FkZF9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJaWYgKGhwc2JfZGVmYXVsdF9ob3N0X2VudHJ5KGhvc3QpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhwc2JfYWRkX2V4dHJhX2NvbmZpZ19yb21zKGhvc3QpOworCisJaGlnaGxldmVsX2FkZF9ob3N0KGhvc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaHBzYl9yZW1vdmVfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworICAgICAgICBob3N0LT5pc19zaHV0ZG93biA9IDE7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZob3N0LT5kZWxheWVkX3Jlc2V0KTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisgICAgICAgIGhvc3QtPmRyaXZlciA9ICZkdW1teV9kcml2ZXI7CisKKyAgICAgICAgaGlnaGxldmVsX3JlbW92ZV9ob3N0KGhvc3QpOworCisJaHBzYl9yZW1vdmVfZXh0cmFfY29uZmlnX3JvbXMoaG9zdCk7CisKKwljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmaG9zdC0+Y2xhc3NfZGV2KTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmaG9zdC0+ZGV2aWNlKTsKK30KKworaW50IGhwc2JfdXBkYXRlX2NvbmZpZ19yb21faW1hZ2Uoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2V0X2RlbGF5OworCWludCBuZXh0X2dlbiA9IGhvc3QtPmNzci5nZW5lcmF0aW9uICsgMTsKKworCWlmICghaG9zdC0+dXBkYXRlX2NvbmZpZ19yb20pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG5leHRfZ2VuID4gMHhmKQorCQluZXh0X2dlbiA9IDI7CisKKwkvKiBTdG9wIHRoZSBkZWxheWVkIGludGVycnVwdCwgd2UncmUgYWJvdXQgdG8gY2hhbmdlIHRoZSBjb25maWcgcm9tIGFuZAorCSAqIGl0IHdvdWxkIGJlIGEgd2FzdGUgdG8gZG8gYSBidXMgcmVzZXQgdHdpY2UuICovCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaG9zdC0+ZGVsYXllZF9yZXNldCk7CisKKwkvKiBJRUVFIDEzOTRhLTIwMDAgcHJvaGliaXRzIHVzaW5nIHRoZSBzYW1lIGdlbmVyYXRpb24gbnVtYmVyCisJICogdHdpY2UgaW4gYSA2MCBzZWNvbmQgcGVyaW9kLiAqLworCWlmIChqaWZmaWVzIC0gaG9zdC0+Y3NyLmdlbl90aW1lc3RhbXBbbmV4dF9nZW5dIDwgNjAgKiBIWikKKwkJLyogV2FpdCA2MCBzZWNvbmRzIGZyb20gdGhlIGxhc3QgdGltZSB0aGlzIGdlbmVyYXRpb24gbnVtYmVyIHdhcworCQkgKiB1c2VkLiAqLworCQlyZXNldF9kZWxheSA9ICg2MCAqIEhaKSArIGhvc3QtPmNzci5nZW5fdGltZXN0YW1wW25leHRfZ2VuXSAtIGppZmZpZXM7CisJZWxzZQorCQkvKiBXYWl0IDEgc2Vjb25kIGluIGNhc2Ugc29tZSBvdGhlciBjb2RlIHdhbnRzIHRvIGNoYW5nZSB0aGUKKwkJICogQ29uZmlnIFJPTSBpbiB0aGUgbmVhciBmdXR1cmUuICovCisJCXJlc2V0X2RlbGF5ID0gSFo7CisKKwlQUkVQQVJFX1dPUksoJmhvc3QtPmRlbGF5ZWRfcmVzZXQsIGRlbGF5ZWRfcmVzZXRfYnVzLCBob3N0KTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmhvc3QtPmRlbGF5ZWRfcmVzZXQsIHJlc2V0X2RlbGF5KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5oIGIvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOWU3NjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmgKQEAgLTAsMCArMSwyMTUgQEAKKyNpZm5kZWYgX0lFRUUxMzk0X0hPU1RTX0gKKyNkZWZpbmUgX0lFRUUxMzk0X0hPU1RTX0gKKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgImllZWUxMzk0X3R5cGVzLmgiCisjaW5jbHVkZSAiY3NyLmgiCisKKworc3RydWN0IGhwc2JfcGFja2V0Oworc3RydWN0IGhwc2JfaXNvOworCitzdHJ1Y3QgaHBzYl9ob3N0IHsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBob3N0X2xpc3Q7CisKKyAgICAgICAgdm9pZCAqaG9zdGRhdGE7CisKKyAgICAgICAgYXRvbWljX3QgZ2VuZXJhdGlvbjsKKworCXN0cnVjdCBza19idWZmX2hlYWQgcGVuZGluZ19wYWNrZXRfcXVldWU7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dF9pbnRlcnZhbDsKKworICAgICAgICB1bnNpZ25lZCBjaGFyIGlzb19saXN0ZW5fY291bnRbNjRdOworCisgICAgICAgIGludCBub2RlX2NvdW50OyAvKiBudW1iZXIgb2YgaWRlbnRpZmllZCBub2RlcyBvbiB0aGlzIGJ1cyAqLworICAgICAgICBpbnQgc2VsZmlkX2NvdW50OyAvKiB0b3RhbCBudW1iZXIgb2YgU2VsZklEcyByZWNlaXZlZCAqLworCWludCBub2Rlc19hY3RpdmU7IC8qIG51bWJlciBvZiBub2RlcyB0aGF0IGFyZSBhY3R1YWxseSBhY3RpdmUgKi8KKworICAgICAgICBub2RlaWRfdCBub2RlX2lkOyAvKiBub2RlIElEIG9mIHRoaXMgaG9zdCAqLworICAgICAgICBub2RlaWRfdCBpcm1faWQ7IC8qIElEIG9mIHRoaXMgYnVzJyBpc29jaHJvbm91cyByZXNvdXJjZSBtYW5hZ2VyICovCisgICAgICAgIG5vZGVpZF90IGJ1c21ncl9pZDsgLyogSUQgb2YgdGhpcyBidXMnIGJ1cyBtYW5hZ2VyICovCisKKyAgICAgICAgLyogdGhpcyBub2RlcyBzdGF0ZSAqLworICAgICAgICB1bnNpZ25lZCBpbl9idXNfcmVzZXQ6MTsKKyAgICAgICAgdW5zaWduZWQgaXNfc2h1dGRvd246MTsKKworICAgICAgICAvKiB0aGlzIG5vZGVzJyBkdXRpZXMgb24gdGhlIGJ1cyAqLworICAgICAgICB1bnNpZ25lZCBpc19yb290OjE7CisgICAgICAgIHVuc2lnbmVkIGlzX2N5Y21zdDoxOworICAgICAgICB1bnNpZ25lZCBpc19pcm06MTsKKyAgICAgICAgdW5zaWduZWQgaXNfYnVzbWdyOjE7CisKKyAgICAgICAgaW50IHJlc2V0X3JldHJpZXM7CisgICAgICAgIHF1YWRsZXRfdCAqdG9wb2xvZ3lfbWFwOworICAgICAgICB1OCAqc3BlZWRfbWFwOworICAgICAgICBzdHJ1Y3QgY3NyX2NvbnRyb2wgY3NyOworCisJLyogUGVyIG5vZGUgdGxhYmVsIHBvb2wgYWxsb2NhdGlvbiAqLworCXN0cnVjdCBocHNiX3RsYWJlbF9wb29sIHRwb29sWzY0XTsKKworICAgICAgICBzdHJ1Y3QgaHBzYl9ob3N0X2RyaXZlciAqZHJpdmVyOworCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwlpbnQgaWQ7CisKKwlzdHJ1Y3QgZGV2aWNlIGRldmljZTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlIGNsYXNzX2RldjsKKworCWludCB1cGRhdGVfY29uZmlnX3JvbTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGVsYXllZF9yZXNldDsKKworCXVuc2lnbmVkIGludCBjb25maWdfcm9tczsKKworCXN0cnVjdCBsaXN0X2hlYWQgYWRkcl9zcGFjZTsKK307CisKKworCitlbnVtIGRldmN0bF9jbWQgeworICAgICAgICAvKiBIb3N0IGlzIHJlcXVlc3RlZCB0byByZXNldCBpdHMgYnVzIGFuZCBjYW5jZWwgYWxsIG91dHN0YW5kaW5nIGFzeW5jCisgICAgICAgICAqIHJlcXVlc3RzLiAgSWYgYXJnID09IDEsIGl0IHNoYWxsIGFsc28gYXR0ZW1wdCB0byBiZWNvbWUgcm9vdCBvbiB0aGUKKyAgICAgICAgICogYnVzLiAgUmV0dXJuIHZvaWQuICovCisgICAgICAgIFJFU0VUX0JVUywKKworICAgICAgICAvKiBBcmcgaXMgdm9pZCwgcmV0dXJuIHZhbHVlIGlzIHRoZSBoYXJkd2FyZSBjeWNsZSBjb3VudGVyIHZhbHVlLiAqLworICAgICAgICBHRVRfQ1lDTEVfQ09VTlRFUiwKKworICAgICAgICAvKiBTZXQgdGhlIGhhcmR3YXJlIGN5Y2xlIGNvdW50ZXIgdG8gdGhlIHZhbHVlIGluIGFyZywgcmV0dXJuIHZvaWQuCisgICAgICAgICAqIEZJWE1FIC0gc2V0dGluZyBpcyBwcm9iYWJseSBub3QgcmVxdWlyZWQuICovCisgICAgICAgIFNFVF9DWUNMRV9DT1VOVEVSLAorCisgICAgICAgIC8qIENvbmZpZ3VyZSBoYXJkd2FyZSBmb3IgbmV3IGJ1cyBJRCBpbiBhcmcsIHJldHVybiB2b2lkLiAqLworICAgICAgICBTRVRfQlVTX0lELAorCisgICAgICAgIC8qIElmIGFyZyB0cnVlLCBzdGFydCBzZW5kaW5nIGN5Y2xlIHN0YXJ0IHBhY2tldHMsIHN0b3AgaWYgYXJnID09IDAuCisgICAgICAgICAqIFJldHVybiB2b2lkLiAqLworICAgICAgICBBQ1RfQ1lDTEVfTUFTVEVSLAorCisgICAgICAgIC8qIENhbmNlbCBhbGwgb3V0c3RhbmRpbmcgYXN5bmMgcmVxdWVzdHMgd2l0aG91dCByZXNldHRpbmcgdGhlIGJ1cy4KKyAgICAgICAgICogUmV0dXJuIHZvaWQuICovCisgICAgICAgIENBTkNFTF9SRVFVRVNUUywKKworICAgICAgICAvKiBTdGFydCBvciBzdG9wIHJlY2VpdmluZyBpc29jaHJvbm91cyBjaGFubmVsIGluIGFyZy4gIFJldHVybiB2b2lkLgorICAgICAgICAgKiBUaGlzIGFjdHMgYXMgYW4gb3B0aW1pemF0aW9uIGhpbnQsIGhvc3RzIGFyZSBub3QgcmVxdWlyZWQgbm90IHRvCisgICAgICAgICAqIGxpc3RlbiBvbiB1bnJlcXVlc3RlZCBjaGFubmVscy4gKi8KKyAgICAgICAgSVNPX0xJU1RFTl9DSEFOTkVMLAorICAgICAgICBJU09fVU5MSVNURU5fQ0hBTk5FTAorfTsKKworZW51bSBpc29jdGxfY21kIHsKKwkvKiByYXdpc28gQVBJIC0gc2VlIGlzby5oIGZvciB0aGUgbWVhbmluZ3Mgb2YgdGhlc2UgY29tbWFuZHMKKwkgICAodGhleSBjb3JyZXNwb25kIGV4YWN0bHkgdG8gdGhlIGhwc2JfaXNvXyogQVBJIGZ1bmN0aW9ucykKKwkgKiBJTklUID0gYWxsb2NhdGUgcmVzb3VyY2VzCisJICogU1RBUlQgPSBiZWdpbiB0cmFuc21pc3Npb24vcmVjZXB0aW9uCisJICogU1RPUCA9IGhhbHQgdHJhbnNtaXNzaW9uL3JlY2VwdGlvbgorCSAqIFFVRVVFL1JFTEVBU0UgPSBwcm9kdWNlL2NvbnN1bWUgcGFja2V0cworCSAqIFNIVVRET1dOID0gZGVhbGxvY2F0ZSByZXNvdXJjZXMKKwkgKi8KKworCVhNSVRfSU5JVCwKKwlYTUlUX1NUQVJULAorCVhNSVRfU1RPUCwKKwlYTUlUX1FVRVVFLAorCVhNSVRfU0hVVERPV04sCisKKwlSRUNWX0lOSVQsCisJUkVDVl9MSVNURU5fQ0hBTk5FTCwgICAvKiBtdWx0aS1jaGFubmVsIG9ubHkgKi8KKwlSRUNWX1VOTElTVEVOX0NIQU5ORUwsIC8qIG11bHRpLWNoYW5uZWwgb25seSAqLworCVJFQ1ZfU0VUX0NIQU5ORUxfTUFTSywgLyogbXVsdGktY2hhbm5lbCBvbmx5OyBhcmcgaXMgYSAqdTY0ICovCisJUkVDVl9TVEFSVCwKKwlSRUNWX1NUT1AsCisJUkVDVl9SRUxFQVNFLAorCVJFQ1ZfU0hVVERPV04sCisJUkVDVl9GTFVTSAorfTsKKworZW51bSByZXNldF90eXBlcyB7CisgICAgICAgIC8qIDE2NiBtaWNyb3NlY29uZCByZXNldCAtLSBvbmx5IHR5cGUgb2YgcmVzZXQgYXZhaWxhYmxlIG9uCisgICAgICAgICAgIG5vbi0xMzk0YSBjYXBhYmxlIElFRUUgMTM5NCBjb250cm9sbGVycyAqLworICAgICAgICBMT05HX1JFU0VULAorCisgICAgICAgIC8qIFNob3J0IChhcmJpdHJhdGVkKSByZXNldCAtLSBvbmx5IGF2YWlsYWJsZSBvbiAxMzk0YSBjYXBhYmxlCisgICAgICAgICAgIElFRUUgMTM5NCBjYXBhYmxlIGNvbnRyb2xsZXJzICovCisgICAgICAgIFNIT1JUX1JFU0VULAorCisJLyogVmFyaWFudHMsIHRoYXQgc2V0IGZvcmNlX3Jvb3QgYmVmb3JlIGlzc3VlaW5nIHRoZSBidXMgcmVzZXQgKi8KKwlMT05HX1JFU0VUX0ZPUkNFX1JPT1QsIFNIT1JUX1JFU0VUX0ZPUkNFX1JPT1QsCisKKwkvKiBWYXJpYW50cywgdGhhdCBjbGVhciBmb3JjZV9yb290IGJlZm9yZSBpc3N1ZWluZyB0aGUgYnVzIHJlc2V0ICovCisJTE9OR19SRVNFVF9OT19GT1JDRV9ST09ULCBTSE9SVF9SRVNFVF9OT19GT1JDRV9ST09UCit9OworCitzdHJ1Y3QgaHBzYl9ob3N0X2RyaXZlciB7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qIFRoZSBoYXJkd2FyZSBkcml2ZXIgbWF5IG9wdGlvbmFsbHkgc3VwcG9ydCBhIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZAorCSAqIHRvIHNldCB0aGUgaGFyZHdhcmUgQ29uZmlnUk9NIGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBoYW5kbGluZworCSAqIHJlYWRzIHRvIHRoZSBDb25maWdST00gb24gaXRzIG93bi4gKi8KKwl2b2lkICgqc2V0X2h3X2NvbmZpZ19yb20pIChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBxdWFkbGV0X3QgKmNvbmZpZ19yb20pOworCisgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gc2hhbGwgaW1wbGVtZW50IHBhY2tldCB0cmFuc21pc3Npb24gYmFzZWQgb24KKyAgICAgICAgICogcGFja2V0LT50eXBlLiAgSXQgc2hhbGwgQ1JDIGJvdGggcGFydHMgb2YgdGhlIHBhY2tldCAodW5sZXNzCisgICAgICAgICAqIHBhY2tldC0+dHlwZSA9PSByYXcpIGFuZCBkbyBieXRlLXN3YXBwaW5nIGFzIG5lY2Vzc2FyeSBvciBpbnN0cnVjdAorICAgICAgICAgKiB0aGUgaGFyZHdhcmUgdG8gZG8gc28uICBJdCBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBwYWNrZXQKKyAgICAgICAgICogd2FzIHF1ZXVlZCBmb3Igc2VuZGluZy4gIEFmdGVyIHNlbmRpbmcsIGhwc2Jfc2VudF9wYWNrZXQoKSBoYXMgdG8gYmUKKyAgICAgICAgICogY2FsbGVkLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS4KKyAgICAgICAgICogTk9URTogVGhlIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGFibGUgaW4gaW50ZXJydXB0IGNvbnRleHQuCisgICAgICAgICAqLworICAgICAgICBpbnQgKCp0cmFuc21pdF9wYWNrZXQpIChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCk7CisKKyAgICAgICAgLyogVGhpcyBmdW5jdGlvbiByZXF1ZXN0cyBtaXNjZWxsYW5vdXMgc2VydmljZXMgZnJvbSB0aGUgZHJpdmVyLCBzZWUKKyAgICAgICAgICogYWJvdmUgZm9yIGNvbW1hbmQgY29kZXMgYW5kIGV4cGVjdGVkIGFjdGlvbnMuICBSZXR1cm4gLTEgZm9yIHVua25vd24KKyAgICAgICAgICogY29tbWFuZCwgdGhvdWdoIHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKyAgICAgICAgICovCisgICAgICAgIGludCAoKmRldmN0bCkgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGVudW0gZGV2Y3RsX2NtZCBjb21tYW5kLCBpbnQgYXJnKTsKKworCSAvKiBJU08gdHJhbnNtaXNzaW9uL3JlY2VwdGlvbiBmdW5jdGlvbnMuIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xCisJICAqIChvciAtRVhYWCBlcnJubyBjb2RlKSBvbiBmYWlsdXJlLiBJZiB0aGUgbG93LWxldmVsIGRyaXZlciBkb2VzIG5vdAorCSAgKiBzdXBwb3J0IHRoZSBuZXcgSVNPIEFQSSwgc2V0IGlzb2N0bCB0byBOVUxMLgorCSAgKi8KKwlpbnQgKCppc29jdGwpIChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgZW51bSBpc29jdGxfY21kIGNvbW1hbmQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSB0byByZWRpcmVjdCBsb2NhbCBDU1IgcmVhZHMvbG9ja3MgdG8gdGhlIGlzbworICAgICAgICAgKiBtYW5hZ2VtZW50IHJlZ2lzdGVycyAoYnVzIG1hbmFnZXIgaWQsIGJhbmR3aWR0aCBhdmFpbGFibGUsIGNoYW5uZWxzCisgICAgICAgICAqIGF2YWlsYWJsZSkgdG8gdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyBpbiBPSENJLiAgcmVnIGlzIDAsMSwyLDMgZm9yIGJ1cworICAgICAgICAgKiBtZ3IsIGJ3ZHRoIGF2YWlsLCBjaCBhdmFpbCBoaSwgY2ggYXZhaWwgbG8gcmVzcGVjdGl2ZWx5ICh0aGUgc2FtZSBpZHMKKyAgICAgICAgICogYXMgT0hDSSB1c2VzKS4gIGRhdGEgYW5kIGNvbXBhcmUgYXJlIHRoZSBuZXcgZGF0YSBhbmQgZXhwZWN0ZWQgZGF0YQorICAgICAgICAgKiByZXNwZWN0aXZlbHksIHJldHVybiB2YWx1ZSBpcyB0aGUgb2xkIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcXVhZGxldF90ICgqaHdfY3NyX3JlZykgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkbGV0X3QgZGF0YSwgcXVhZGxldF90IGNvbXBhcmUpOworfTsKKworCitzdHJ1Y3QgaHBzYl9ob3N0ICpocHNiX2FsbG9jX2hvc3Qoc3RydWN0IGhwc2JfaG9zdF9kcml2ZXIgKmRydiwgc2l6ZV90IGV4dHJhLAorCQkJCSAgc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBocHNiX2FkZF9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOwordm9pZCBocHNiX3JlbW92ZV9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmgpOworCisvKiBUaGUgZm9sbG93aW5nIDIgZnVuY3Rpb25zIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgd2hlbiB0aGUKKyAqIHJhdzEzOTQvbGlicmF3MTM5NCB1cGRhdGUgaXMgY29tcGxldGUuICovCitpbnQgaHBzYl91cGRhdGVfY29uZmlnX3JvbShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorICAgICAgY29uc3QgcXVhZGxldF90ICpuZXdfcm9tLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgY2hhciByb21fdmVyc2lvbik7CitpbnQgaHBzYl9nZXRfY29uZmlnX3JvbShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBxdWFkbGV0X3QgKmJ1ZmZlciwKKyAgICAgIHNpemVfdCBidWZmZXJzaXplLCBzaXplX3QgKnJvbV9zaXplLCB1bnNpZ25lZCBjaGFyICpyb21fdmVyc2lvbik7CisKKy8qIFVwZGF0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gcm9tIGltYWdlIG9mIGEgaG9zdC4gIHJvbV92ZXJzaW9uIG11c3QgYmUgdGhlCisgKiBjdXJyZW50IHZlcnNpb24sIG90aGVyd2lzZSBpdCB3aWxsIGZhaWwgd2l0aCByZXR1cm4gdmFsdWUgLTEuIElmIHRoaXMKKyAqIGhvc3QgZG9lcyBub3Qgc3VwcG9ydCBjb25maWctcm9tLXVwZGF0ZSwgaXQgd2lsbCByZXR1cm4gLUVJTlZBTC4KKyAqIFJldHVybiB2YWx1ZSAwIGluZGljYXRlcyBzdWNjZXNzLgorICovCitpbnQgaHBzYl91cGRhdGVfY29uZmlnX3JvbV9pbWFnZShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKKworI2VuZGlmIC8qIF9JRUVFMTM5NF9IT1NUU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0LWlvY3RsLmggYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0LWlvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyYjU2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTQtaW9jdGwuaApAQCAtMCwwICsxLDExMSBAQAorLyogQmFzZSBmaWxlIGZvciBhbGwgaWVlZTEzOTQgaW9jdGwncy4gTGludXgtMTM5NCBoYXMgYWxsb2NhdGVkIGJhc2UgJyMnCisgKiB3aXRoIGEgcmFuZ2Ugb2YgMHgwMC0weDNmLiAqLworCisjaWZuZGVmIF9fSUVFRTEzOTRfSU9DVExfSAorI2RlZmluZSBfX0lFRUUxMzk0X0lPQ1RMX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworCisvKiBBTURUUCBHZXRzIDYgKi8KKyNkZWZpbmUgQU1EVFBfSU9DX0NIQU5ORUwJX0lPVygnIycsIDB4MDAsIHN0cnVjdCBhbWR0cF9pb2N0bCkKKyNkZWZpbmUgQU1EVFBfSU9DX1BMVUcJCV9JT1coJyMnLCAweDAxLCBzdHJ1Y3QgYW1kdHBfaW9jdGwpCisjZGVmaW5lIEFNRFRQX0lPQ19QSU5HCQlfSU9XKCcjJywgMHgwMiwgc3RydWN0IGFtZHRwX2lvY3RsKQorI2RlZmluZSBBTURUUF9JT0NfWkFQCQlfSU8gKCcjJywgMHgwMykKKworCisvKiBEVjEzOTQgR2V0cyAxMCAqLworCisvKiBHZXQgdGhlIGRyaXZlciByZWFkeSB0byB0cmFuc21pdCB2aWRlby4gIHBhc3MgYSBzdHJ1Y3QgZHYxMzk0X2luaXQqIGFzCisgKiB0aGUgcGFyYW1ldGVyIChzZWUgYmVsb3cpLCBvciBOVUxMIHRvIGdldCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgRFYxMzk0X0lPQ19JTklUCQkJX0lPVygnIycsIDB4MDYsIHN0cnVjdCBkdjEzOTRfaW5pdCkKKworLyogU3RvcCB0cmFuc21pdHRpbmcgdmlkZW8gYW5kIGZyZWUgdGhlIHJpbmdidWZmZXIgKi8KKyNkZWZpbmUgRFYxMzk0X0lPQ19TSFVURE9XTgkJX0lPICgnIycsIDB4MDcpCisKKy8qIFN1Ym1pdCBOIG5ldyBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQsIHdoZXJlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbmV3CisgKiBmcmFtZSBpcyBmaXJzdF9jbGVhcl9idWZmZXIsIGFuZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgbmV3IGZyYW1lIGlzCisgKiAoZmlyc3RfY2xlYXJfYnVmZmVyICsgTikgJSBuX2ZyYW1lcyAqLworI2RlZmluZSBEVjEzOTRfSU9DX1NVQk1JVF9GUkFNRVMJX0lPICgnIycsIDB4MDgpCisKKy8qIEJsb2NrIHVudGlsIE4gYnVmZmVycyBhcmUgY2xlYXIgKHBhc3MgTiBhcyB0aGUgcGFyYW1ldGVyKSBCZWNhdXNlIHdlCisgKiByZS10cmFuc21pdCB0aGUgbGFzdCBmcmFtZSBvbiB1bmRlcnJ1biwgdGhlcmUgd2lsbCBhdCBtb3N0IGJlIG5fZnJhbWVzCisgKiAtIDEgY2xlYXIgZnJhbWVzIGF0IGFueSB0aW1lICovCisjZGVmaW5lIERWMTM5NF9JT0NfV0FJVF9GUkFNRVMJCV9JTyAoJyMnLCAweDA5KQorCisvKiBDYXB0dXJlIG5ldyBmcmFtZXMgdGhhdCBoYXZlIGJlZW4gcmVjZWl2ZWQsIHdoZXJlIHRoZSBpbmRleCBvZiB0aGUKKyAqIGZpcnN0IG5ldyBmcmFtZSBpcyBmaXJzdF9jbGVhcl9idWZmZXIsIGFuZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgbmV3CisgKiBmcmFtZSBpcyAoZmlyc3RfY2xlYXJfYnVmZmVyICsgTikgJSBuX2ZyYW1lcyAqLworI2RlZmluZSBEVjEzOTRfSU9DX1JFQ0VJVkVfRlJBTUVTCV9JTyAoJyMnLCAweDBhKQorCisvKiBUZWxsIGNhcmQgdG8gc3RhcnQgcmVjZWl2aW5nIERNQSAqLworI2RlZmluZSBEVjEzOTRfSU9DX1NUQVJUX1JFQ0VJVkUJX0lPICgnIycsIDB4MGIpCisKKy8qIFBhc3MgYSBzdHJ1Y3QgZHYxMzk0X3N0YXR1cyogYXMgdGhlIHBhcmFtZXRlciAqLworI2RlZmluZSBEVjEzOTRfSU9DX0dFVF9TVEFUVVMJCV9JT1IoJyMnLCAweDBjLCBzdHJ1Y3QgZHYxMzk0X3N0YXR1cykKKworCisvKiBWaWRlbzEzOTQgR2V0cyAxMCAqLworCisjZGVmaW5lIFZJREVPMTM5NF9JT0NfTElTVEVOX0NIQU5ORUwJCVwKKwlfSU9XUignIycsIDB4MTAsIHN0cnVjdCB2aWRlbzEzOTRfbW1hcCkKKyNkZWZpbmUgVklERU8xMzk0X0lPQ19VTkxJU1RFTl9DSEFOTkVMCQlcCisJX0lPVyAoJyMnLCAweDExLCBpbnQpCisjZGVmaW5lIFZJREVPMTM5NF9JT0NfTElTVEVOX1FVRVVFX0JVRkZFUglcCisJX0lPVyAoJyMnLCAweDEyLCBzdHJ1Y3QgdmlkZW8xMzk0X3dhaXQpCisjZGVmaW5lIFZJREVPMTM5NF9JT0NfTElTVEVOX1dBSVRfQlVGRkVSCVwKKwlfSU9XUignIycsIDB4MTMsIHN0cnVjdCB2aWRlbzEzOTRfd2FpdCkKKyNkZWZpbmUgVklERU8xMzk0X0lPQ19UQUxLX0NIQU5ORUwJCVwKKwlfSU9XUignIycsIDB4MTQsIHN0cnVjdCB2aWRlbzEzOTRfbW1hcCkKKyNkZWZpbmUgVklERU8xMzk0X0lPQ19VTlRBTEtfQ0hBTk5FTAkJXAorCV9JT1cgKCcjJywgMHgxNSwgaW50KQorLyoKKyAqIFRoaXMgb25lIGlzIGJyb2tlbjogaXQgcmVhbGx5IHdhbnRlZAorICogInNpemVvZiAoc3RydWN0IHZpZGVvMTM5NF93YWl0KSArIHNpemVvZiAoc3RydWN0IHZpZGVvMTM5NF9xdWV1ZV92YXJpYWJsZSkiCisgKiBidXQgZ290IGp1c3QgYSAic2l6ZV90IgorICovCisjZGVmaW5lIFZJREVPMTM5NF9JT0NfVEFMS19RVUVVRV9CVUZGRVIgCVwKKwlfSU9XICgnIycsIDB4MTYsIHNpemVfdCkKKyNkZWZpbmUgVklERU8xMzk0X0lPQ19UQUxLX1dBSVRfQlVGRkVSCQlcCisJX0lPVyAoJyMnLCAweDE3LCBzdHJ1Y3QgdmlkZW8xMzk0X3dhaXQpCisjZGVmaW5lIFZJREVPMTM5NF9JT0NfTElTVEVOX1BPTExfQlVGRkVSCVwKKwlfSU9XUignIycsIDB4MTgsIHN0cnVjdCB2aWRlbzEzOTRfd2FpdCkKKworCisvKiBSYXcxMzk0J3MgSVNPIGludGVyZmFjZSAqLworI2RlZmluZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9JTklUCQlcCisJX0lPVyAoJyMnLCAweDFhLCBzdHJ1Y3QgcmF3MTM5NF9pc29fc3RhdHVzKQorI2RlZmluZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9JTklUCQlcCisJX0lPV1IoJyMnLCAweDFiLCBzdHJ1Y3QgcmF3MTM5NF9pc29fc3RhdHVzKQorI2RlZmluZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9TVEFSVAkJXAorCV9JT0MgKF9JT0NfV1JJVEUsICcjJywgMHgxYywgc2l6ZW9mKGludCkgKiAzKQorI2RlZmluZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9TVEFSVAkJXAorCV9JT0MgKF9JT0NfV1JJVEUsICcjJywgMHgxZCwgc2l6ZW9mKGludCkgKiAyKQorI2RlZmluZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9SRUNWX1NUT1AJCVwKKwlfSU8gICgnIycsIDB4MWUpCisjZGVmaW5lIFJBVzEzOTRfSU9DX0lTT19HRVRfU1RBVFVTCQlcCisJX0lPUiAoJyMnLCAweDFmLCBzdHJ1Y3QgcmF3MTM5NF9pc29fc3RhdHVzKQorI2RlZmluZSBSQVcxMzk0X0lPQ19JU09fU0hVVERPV04JCVwKKwlfSU8gICgnIycsIDB4MjApCisjZGVmaW5lIFJBVzEzOTRfSU9DX0lTT19RVUVVRV9BQ1RJVklUWQkJXAorCV9JTyAgKCcjJywgMHgyMSkKKyNkZWZpbmUgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfTElTVEVOX0NIQU5ORUwJXAorCV9JT1cgKCcjJywgMHgyMiwgdW5zaWduZWQgY2hhcikKKyNkZWZpbmUgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfVU5MSVNURU5fQ0hBTk5FTAlcCisJX0lPVyAoJyMnLCAweDIzLCB1bnNpZ25lZCBjaGFyKQorI2RlZmluZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9TRVRfQ0hBTk5FTF9NQVNLCVwKKwlfSU9XICgnIycsIDB4MjQsIF9fdTY0KQorI2RlZmluZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9QQUNLRVRTCQlcCisJX0lPVyAoJyMnLCAweDI1LCBzdHJ1Y3QgcmF3MTM5NF9pc29fcGFja2V0cykKKyNkZWZpbmUgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfUkVMRUFTRV9QQUNLRVRTCVwKKwlfSU9XICgnIycsIDB4MjYsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgUkFXMTM5NF9JT0NfSVNPX1hNSVRfUEFDS0VUUwkJXAorCV9JT1cgKCcjJywgMHgyNywgc3RydWN0IHJhdzEzOTRfaXNvX3BhY2tldHMpCisjZGVmaW5lIFJBVzEzOTRfSU9DX0lTT19YTUlUX1NZTkMJCVwKKwlfSU8gICgnIycsIDB4MjgpCisjZGVmaW5lIFJBVzEzOTRfSU9DX0lTT19SRUNWX0ZMVVNIICAgICAgICAgICAgICBcCisJX0lPICAoJyMnLCAweDI5KQorCisKKyNlbmRpZiAvKiBfX0lFRUUxMzk0X0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTQuaCBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjM0YTliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NC5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogR2VuZXJpYyBJRUVFIDEzOTQgZGVmaW5pdGlvbnMKKyAqLworCisjaWZuZGVmIF9JRUVFMTM5NF9JRUVFMTM5NF9ICisjZGVmaW5lIF9JRUVFMTM5NF9JRUVFMTM5NF9ICisKKyNkZWZpbmUgVENPREVfV1JJVEVRICAgICAgICAgICAgIDB4MAorI2RlZmluZSBUQ09ERV9XUklURUIgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFRDT0RFX1dSSVRFX1JFU1BPTlNFICAgICAweDIKKyNkZWZpbmUgVENPREVfUkVBRFEgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBUQ09ERV9SRUFEQiAgICAgICAgICAgICAgMHg1CisjZGVmaW5lIFRDT0RFX1JFQURRX1JFU1BPTlNFICAgICAweDYKKyNkZWZpbmUgVENPREVfUkVBREJfUkVTUE9OU0UgICAgIDB4NworI2RlZmluZSBUQ09ERV9DWUNMRV9TVEFSVCAgICAgICAgMHg4CisjZGVmaW5lIFRDT0RFX0xPQ0tfUkVRVUVTVCAgICAgICAweDkKKyNkZWZpbmUgVENPREVfSVNPX0RBVEEgICAgICAgICAgIDB4YQorI2RlZmluZSBUQ09ERV9TVFJFQU1fREFUQSAgICAgICAgMHhhCisjZGVmaW5lIFRDT0RFX0xPQ0tfUkVTUE9OU0UgICAgICAweGIKKworI2RlZmluZSBSQ09ERV9DT01QTEVURSAgICAgICAgICAgMHgwCisjZGVmaW5lIFJDT0RFX0NPTkZMSUNUX0VSUk9SICAgICAweDQKKyNkZWZpbmUgUkNPREVfREFUQV9FUlJPUiAgICAgICAgIDB4NQorI2RlZmluZSBSQ09ERV9UWVBFX0VSUk9SICAgICAgICAgMHg2CisjZGVmaW5lIFJDT0RFX0FERFJFU1NfRVJST1IgICAgICAweDcKKworI2RlZmluZSBFWFRDT0RFX01BU0tfU1dBUCAgICAgICAgMHgxCisjZGVmaW5lIEVYVENPREVfQ09NUEFSRV9TV0FQICAgICAweDIKKyNkZWZpbmUgRVhUQ09ERV9GRVRDSF9BREQgICAgICAgIDB4MworI2RlZmluZSBFWFRDT0RFX0xJVFRMRV9BREQgICAgICAgMHg0CisjZGVmaW5lIEVYVENPREVfQk9VTkRFRF9BREQgICAgICAweDUKKyNkZWZpbmUgRVhUQ09ERV9XUkFQX0FERCAgICAgICAgIDB4NgorCisjZGVmaW5lIEFDS19DT01QTEVURSAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQUNLX1BFTkRJTkcgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBBQ0tfQlVTWV9YICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIEFDS19CVVNZX0EgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgQUNLX0JVU1lfQiAgICAgICAgICAgICAgIDB4NgorI2RlZmluZSBBQ0tfVEFSRFkgICAgICAgICAgICAgICAgMHhiCisjZGVmaW5lIEFDS19DT05GTElDVF9FUlJPUiAgICAgICAweGMKKyNkZWZpbmUgQUNLX0RBVEFfRVJST1IgICAgICAgICAgIDB4ZAorI2RlZmluZSBBQ0tfVFlQRV9FUlJPUiAgICAgICAgICAgMHhlCisjZGVmaW5lIEFDS19BRERSRVNTX0VSUk9SICAgICAgICAweGYKKworLyogTm9uLXN0YW5kYXJkICJBQ0sgY29kZXMiIGZvciBpbnRlcm5hbCB1c2UgKi8KKyNkZWZpbmUgQUNLWF9OT05FICAgICAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgQUNLWF9TRU5EX0VSUk9SICAgICAgICAgICgtMikKKyNkZWZpbmUgQUNLWF9BQk9SVEVEICAgICAgICAgICAgICgtMykKKyNkZWZpbmUgQUNLWF9USU1FT1VUICAgICAgICAgICAgICgtNCkKKworCisjZGVmaW5lIElFRUUxMzk0X1NQRUVEXzEwMAkJMHgwMAorI2RlZmluZSBJRUVFMTM5NF9TUEVFRF8yMDAJCTB4MDEKKyNkZWZpbmUgSUVFRTEzOTRfU1BFRURfNDAwCQkweDAyCisjZGVmaW5lIElFRUUxMzk0X1NQRUVEXzgwMAkJMHgwMworI2RlZmluZSBJRUVFMTM5NF9TUEVFRF8xNjAwCQkweDA0CisjZGVmaW5lIElFRUUxMzk0X1NQRUVEXzMyMDAJCTB4MDUKKy8qIFRoZSBjdXJyZW50IGhpZ2hlc3QgdGVzdGVkIHNwZWVkIHN1cHBvcnRlZCBieSB0aGUgc3Vic3lzdGVtICovCisjZGVmaW5lIElFRUUxMzk0X1NQRUVEX01BWAkJSUVFRTEzOTRfU1BFRURfODAwCisKKy8qIE1hcHMgc3BlZWQgdmFsdWVzIGFib3ZlIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uICovCitleHRlcm4gY29uc3QgY2hhciAqaHBzYl9zcGVlZHRvX3N0cltdOworCisKKyNkZWZpbmUgU0VMRklEX1BXUkNMX05PX1BPV0VSICAgIDB4MAorI2RlZmluZSBTRUxGSURfUFdSQ0xfUFJPVklERV8xNVcgMHgxCisjZGVmaW5lIFNFTEZJRF9QV1JDTF9QUk9WSURFXzMwVyAweDIKKyNkZWZpbmUgU0VMRklEX1BXUkNMX1BST1ZJREVfNDVXIDB4MworI2RlZmluZSBTRUxGSURfUFdSQ0xfVVNFXzFXICAgICAgMHg0CisjZGVmaW5lIFNFTEZJRF9QV1JDTF9VU0VfM1cgICAgICAweDUKKyNkZWZpbmUgU0VMRklEX1BXUkNMX1VTRV82VyAgICAgIDB4NgorI2RlZmluZSBTRUxGSURfUFdSQ0xfVVNFXzEwVyAgICAgMHg3CisKKyNkZWZpbmUgU0VMRklEX1BPUlRfQ0hJTEQgICAgICAgIDB4MworI2RlZmluZSBTRUxGSURfUE9SVF9QQVJFTlQgICAgICAgMHgyCisjZGVmaW5lIFNFTEZJRF9QT1JUX05DT05OICAgICAgICAweDEKKyNkZWZpbmUgU0VMRklEX1BPUlRfTk9ORSAgICAgICAgIDB4MAorCisKKy8qIDEzOTRhIFBIWSBiaXRtYXNrcyAqLworI2RlZmluZSBQSFlfMDBfUEhZU0lDQUxfSUQgICAgICAgMHhGQworI2RlZmluZSBQSFlfMDBfUiAgICAgICAgICAgICAgICAgMHgwMiAvKiBSb290ICovCisjZGVmaW5lIFBIWV8wMF9QUyAgICAgICAgICAgICAgICAweDAxIC8qIFBvd2VyIFN0YXR1cyovCisjZGVmaW5lIFBIWV8wMV9SSEIgICAgICAgICAgICAgICAweDgwIC8qIFJvb3QgSG9sZC1PZmYgKi8KKyNkZWZpbmUgUEhZXzAxX0lCUiAgICAgICAgICAgICAgIDB4ODAgLyogSW5pdGlhdGUgQnVzIFJlc2V0ICovCisjZGVmaW5lIFBIWV8wMV9HQVBfQ09VTlQgICAgICAgICAweDNGCisjZGVmaW5lIFBIWV8wMl9FWFRFTkRFRCAgICAgICAgICAweEUwIC8qIDB4NyBmb3IgMTM5NGEtY29tcGxpYW50IFBIWSAqLworI2RlZmluZSBQSFlfMDJfVE9UQUxfUE9SVFMgICAgICAgMHgxRgorI2RlZmluZSBQSFlfMDNfTUFYX1NQRUVEICAgICAgICAgMHhFMAorI2RlZmluZSBQSFlfMDNfREVMQVkgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBQSFlfMDRfTENUUkwgICAgICAgICAgICAgMHg4MCAvKiBMaW5rIEFjdGl2ZSBSZXBvcnQgQ29udHJvbCAqLworI2RlZmluZSBQSFlfMDRfQ09OVEVOREVSICAgICAgICAgMHg0MAorI2RlZmluZSBQSFlfMDRfSklUVEVSICAgICAgICAgICAgMHgzOAorI2RlZmluZSBQSFlfMDRfUFdSX0NMQVNTICAgICAgICAgMHgwNyAvKiBQb3dlciBDbGFzcyAqLworI2RlZmluZSBQSFlfMDVfV0FUQ0hET0cgICAgICAgICAgMHg4MAorI2RlZmluZSBQSFlfMDVfSVNCUiAgICAgICAgICAgICAgMHg0MCAvKiBJbml0aWF0ZSBTaG9ydCBCdXMgUmVzZXQgKi8KKyNkZWZpbmUgUEhZXzA1X0xPT1AgICAgICAgICAgICAgIDB4MjAgLyogTG9vcCBEZXRlY3QgKi8KKyNkZWZpbmUgUEhZXzA1X1BXUl9GQUlMICAgICAgICAgIDB4MTAgLyogQ2FibGUgUG93ZXIgRmFpbHVyZSBEZXRlY3QgKi8KKyNkZWZpbmUgUEhZXzA1X1RJTUVPVVQgICAgICAgICAgIDB4MDggLyogQXJiaXRyYXRpb24gU3RhdGUgTWFjaGluZSBUaW1lb3V0ICovCisjZGVmaW5lIFBIWV8wNV9QT1JUX0VWRU5UICAgICAgICAweDA0IC8qIFBvcnQgRXZlbnQgRGV0ZWN0ICovCisjZGVmaW5lIFBIWV8wNV9FTkFCX0FDQ0VMICAgICAgICAweDAyIC8qIEVuYWJsZSBBcmJpdHJhdGlvbiBBY2NlbGVyYXRpb24gKi8KKyNkZWZpbmUgUEhZXzA1X0VOQUJfTVVMVEkgICAgICAgIDB4MDEgLyogRW5hLiBNdWx0aXNwZWVkIFBhY2tldCBDb25jYXRlbmF0aW9uICovCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKKworc3RydWN0IHNlbGZpZCB7CisgICAgICAgIHUzMiBwYWNrZXRfaWRlbnRpZmllcjoyOyAvKiBhbHdheXMgYmluYXJ5IDEwICovCisgICAgICAgIHUzMiBwaHlfaWQ6NjsKKyAgICAgICAgLyogYnl0ZSAqLworICAgICAgICB1MzIgZXh0ZW5kZWQ6MTsgLyogaWYgdHJ1ZSBpcyBzdHJ1Y3QgZXh0X3NlbGZpZCAqLworICAgICAgICB1MzIgbGlua19hY3RpdmU6MTsKKyAgICAgICAgdTMyIGdhcF9jb3VudDo2OworICAgICAgICAvKiBieXRlICovCisgICAgICAgIHUzMiBzcGVlZDoyOworICAgICAgICB1MzIgcGh5X2RlbGF5OjI7CisgICAgICAgIHUzMiBjb250ZW5kZXI6MTsKKyAgICAgICAgdTMyIHBvd2VyX2NsYXNzOjM7CisgICAgICAgIC8qIGJ5dGUgKi8KKyAgICAgICAgdTMyIHBvcnQwOjI7CisgICAgICAgIHUzMiBwb3J0MToyOworICAgICAgICB1MzIgcG9ydDI6MjsKKyAgICAgICAgdTMyIGluaXRpYXRlZF9yZXNldDoxOworICAgICAgICB1MzIgbW9yZV9wYWNrZXRzOjE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZXh0X3NlbGZpZCB7CisgICAgICAgIHUzMiBwYWNrZXRfaWRlbnRpZmllcjoyOyAvKiBhbHdheXMgYmluYXJ5IDEwICovCisgICAgICAgIHUzMiBwaHlfaWQ6NjsKKyAgICAgICAgLyogYnl0ZSAqLworICAgICAgICB1MzIgZXh0ZW5kZWQ6MTsgLyogaWYgZmFsc2UgaXMgc3RydWN0IHNlbGZpZCAqLworICAgICAgICB1MzIgc2VxX25yOjM7CisgICAgICAgIHUzMiByZXNlcnZlZDoyOworICAgICAgICB1MzIgcG9ydGE6MjsKKyAgICAgICAgLyogYnl0ZSAqLworICAgICAgICB1MzIgcG9ydGI6MjsKKyAgICAgICAgdTMyIHBvcnRjOjI7CisgICAgICAgIHUzMiBwb3J0ZDoyOworICAgICAgICB1MzIgcG9ydGU6MjsKKyAgICAgICAgLyogYnl0ZSAqLworICAgICAgICB1MzIgcG9ydGY6MjsKKyAgICAgICAgdTMyIHBvcnRnOjI7CisgICAgICAgIHUzMiBwb3J0aDoyOworICAgICAgICB1MzIgcmVzZXJ2ZWQyOjE7CisgICAgICAgIHUzMiBtb3JlX3BhY2tldHM6MTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbGlmIGRlZmluZWQgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEIC8qIF9fQklHX0VORElBTl9CSVRGSUVMRCAqLworCisvKgorICogTm90ZTogdGhlc2UgbWVhbiB0byBiZSBiaXQgZmllbGRzIG9mIGEgYmlnIGVuZGlhbiBTZWxmSUQgYXMgc2VlbiBvbiBhIGxpdHRsZQorICogZW5kaWFuIG1hY2hpbmUuICBXaXRob3V0IHN3YXBwaW5nLgorICovCisKK3N0cnVjdCBzZWxmaWQgeworICAgICAgICB1MzIgcGh5X2lkOjY7CisgICAgICAgIHUzMiBwYWNrZXRfaWRlbnRpZmllcjoyOyAvKiBhbHdheXMgYmluYXJ5IDEwICovCisgICAgICAgIC8qIGJ5dGUgKi8KKyAgICAgICAgdTMyIGdhcF9jb3VudDo2OworICAgICAgICB1MzIgbGlua19hY3RpdmU6MTsKKyAgICAgICAgdTMyIGV4dGVuZGVkOjE7IC8qIGlmIHRydWUgaXMgc3RydWN0IGV4dF9zZWxmaWQgKi8KKyAgICAgICAgLyogYnl0ZSAqLworICAgICAgICB1MzIgcG93ZXJfY2xhc3M6MzsKKyAgICAgICAgdTMyIGNvbnRlbmRlcjoxOworICAgICAgICB1MzIgcGh5X2RlbGF5OjI7CisgICAgICAgIHUzMiBzcGVlZDoyOworICAgICAgICAvKiBieXRlICovCisgICAgICAgIHUzMiBtb3JlX3BhY2tldHM6MTsKKyAgICAgICAgdTMyIGluaXRpYXRlZF9yZXNldDoxOworICAgICAgICB1MzIgcG9ydDI6MjsKKyAgICAgICAgdTMyIHBvcnQxOjI7CisgICAgICAgIHUzMiBwb3J0MDoyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGV4dF9zZWxmaWQgeworICAgICAgICB1MzIgcGh5X2lkOjY7CisgICAgICAgIHUzMiBwYWNrZXRfaWRlbnRpZmllcjoyOyAvKiBhbHdheXMgYmluYXJ5IDEwICovCisgICAgICAgIC8qIGJ5dGUgKi8KKyAgICAgICAgdTMyIHBvcnRhOjI7CisgICAgICAgIHUzMiByZXNlcnZlZDoyOworICAgICAgICB1MzIgc2VxX25yOjM7CisgICAgICAgIHUzMiBleHRlbmRlZDoxOyAvKiBpZiBmYWxzZSBpcyBzdHJ1Y3Qgc2VsZmlkICovCisgICAgICAgIC8qIGJ5dGUgKi8KKyAgICAgICAgdTMyIHBvcnRlOjI7CisgICAgICAgIHUzMiBwb3J0ZDoyOworICAgICAgICB1MzIgcG9ydGM6MjsKKyAgICAgICAgdTMyIHBvcnRiOjI7CisgICAgICAgIC8qIGJ5dGUgKi8KKyAgICAgICAgdTMyIG1vcmVfcGFja2V0czoxOworICAgICAgICB1MzIgcmVzZXJ2ZWQyOjE7CisgICAgICAgIHUzMiBwb3J0aDoyOworICAgICAgICB1MzIgcG9ydGc6MjsKKyAgICAgICAgdTMyIHBvcnRmOjI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZWxzZQorI2Vycm9yIFdoYXQ/IFBEUCBlbmRpYW4/CisjZW5kaWYgLyogX19CSUdfRU5ESUFOX0JJVEZJRUxEICovCisKKworI2VuZGlmIC8qIF9JRUVFMTM5NF9JRUVFMTM5NF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTg0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYwpAQCAtMCwwICsxLDEzMzAgQEAKKy8qCisgKiBJRUVFIDEzOTQgZm9yIExpbnV4CisgKgorICogQ29yZSBzdXBwb3J0OiBocHNiX3BhY2tldCBtYW5hZ2VtZW50LCBwYWNrZXQgaGFuZGxpbmcgYW5kIGZvcndhcmRpbmcgdG8KKyAqICAgICAgICAgICAgICAgaGlnaGxldmVsIG9yIGxvd2xldmVsIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgQW5kcmVhcyBFLiBCb21iZQorICogICAgICAgICAgICAgICAgICAgICAyMDAyIE1hbmZyZWQgV2VpaHMgPHdlaWhzQGljdC50dXdpZW4uYWMuYXQ+CisgKgorICogVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgcm9vdAorICogZGlyZWN0b3J5IG9mIHRoZSBrZXJuZWwgc291cmNlcyBmb3IgZGV0YWlscy4KKyAqCisgKgorICogQ29udHJpYnV0aW9uczoKKyAqCisgKiBNYW5mcmVkIFdlaWhzIDx3ZWloc0BpY3QudHV3aWVuLmFjLmF0PgorICogICAgICAgIGxvb3BiYWNrIGZ1bmN0aW9uYWxpdHkgaW4gaHBzYl9zZW5kX3BhY2tldAorICogICAgICAgIGFsbG93IGhpZ2hsZXZlbCBkcml2ZXJzIHRvIGRpc2FibGUgYXV0b21hdGljIHJlc3BvbnNlIGdlbmVyYXRpb24KKyAqICAgICAgICAgICAgICBhbmQgdG8gZ2VuZXJhdGUgcmVzcG9uc2VzIHRoZW1zZWx2ZXMgKGRlZmVycmVkKQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAiaWVlZTEzOTRfdHlwZXMuaCIKKyNpbmNsdWRlICJpZWVlMTM5NC5oIgorI2luY2x1ZGUgImhvc3RzLmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfY29yZS5oIgorI2luY2x1ZGUgImhpZ2hsZXZlbC5oIgorI2luY2x1ZGUgImllZWUxMzk0X3RyYW5zYWN0aW9ucy5oIgorI2luY2x1ZGUgImNzci5oIgorI2luY2x1ZGUgIm5vZGVtZ3IuaCIKKyNpbmNsdWRlICJkbWEuaCIKKyNpbmNsdWRlICJpc28uaCIKKyNpbmNsdWRlICJjb25maWdfcm9tcy5oIgorCisvKgorICogRGlzYWJsZSB0aGUgbm9kZW1nciBkZXRlY3Rpb24gYW5kIGNvbmZpZyByb20gcmVhZGluZyBmdW5jdGlvbmFsaXR5LgorICovCitzdGF0aWMgaW50IGRpc2FibGVfbm9kZW1nciA9IDA7Cittb2R1bGVfcGFyYW0oZGlzYWJsZV9ub2RlbWdyLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX25vZGVtZ3IsICJEaXNhYmxlIG5vZGVtZ3IgZnVuY3Rpb25hbGl0eS4iKTsKKworLyogRGlzYWJsZSBJc29jaHJvbm91cyBSZXNvdXJjZSBNYW5hZ2VyIGZ1bmN0aW9uYWxpdHkgKi8KK2ludCBocHNiX2Rpc2FibGVfaXJtID0gMDsKK21vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlX2lybSwgaHBzYl9kaXNhYmxlX2lybSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfaXJtLAorCQkgIkRpc2FibGUgSXNvY2hyb25vdXMgUmVzb3VyY2UgTWFuYWdlciBmdW5jdGlvbmFsaXR5LiIpOworCisvKiBXZSBhcmUgR1BMLCBzbyB0cmVhdCB1cyBzcGVjaWFsICovCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFNvbWUgZ2xvYmFscyB1c2VkICovCitjb25zdCBjaGFyICpocHNiX3NwZWVkdG9fc3RyW10gPSB7ICJTMTAwIiwgIlMyMDAiLCAiUzQwMCIsICJTODAwIiwgIlMxNjAwIiwgIlMzMjAwIiB9Oworc3RydWN0IGNsYXNzX3NpbXBsZSAqaHBzYl9wcm90b2NvbF9jbGFzczsKKworI2lmZGVmIENPTkZJR19JRUVFMTM5NF9WRVJCT1NFREVCVUcKK3N0YXRpYyB2b2lkIGR1bXBfcGFja2V0KGNvbnN0IGNoYXIgKnRleHQsIHF1YWRsZXRfdCAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IGk7CisKKwlzaXplIC89IDQ7CisJc2l6ZSA9IChzaXplID4gNCA/IDQgOiBzaXplKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJpZWVlMTM5NDogJXMiLCB0ZXh0KTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlwcmludGsoIiAlMDh4IiwgZGF0YVtpXSk7CisJcHJpbnRrKCJcbiIpOworfQorI2Vsc2UKKyNkZWZpbmUgZHVtcF9wYWNrZXQoeCx5LHopCisjZW5kaWYKKworc3RhdGljIHZvaWQgYWJvcnRfcmVxdWVzdHMoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CitzdGF0aWMgdm9pZCBxdWV1ZV9wYWNrZXRfY29tcGxldGUoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpOworCisKKy8qKgorICogaHBzYl9zZXRfcGFja2V0X2NvbXBsZXRlX3Rhc2sgLSBzZXQgdGhlIHRhc2sgdGhhdCBydW5zIHdoZW4gYSBwYWNrZXQKKyAqIGNvbXBsZXRlcy4gWW91IGNhbm5vdCBjYWxsIHRoaXMgbW9yZSB0aGFuIG9uY2Ugb24gYSBzaW5nbGUgcGFja2V0CisgKiBiZWZvcmUgaXQgaXMgc2VudC4KKyAqCisgKiBAcGFja2V0OiB0aGUgcGFja2V0IHdob3NlIGNvbXBsZXRpb24gd2Ugd2FudCB0aGUgdGFzayBhZGRlZCB0bworICogQHJvdXRpbmU6IGZ1bmN0aW9uIHRvIGNhbGwKKyAqIEBkYXRhOiBkYXRhIChpZiBhbnkpIHRvIHBhc3MgdG8gdGhlIGFib3ZlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgaHBzYl9zZXRfcGFja2V0X2NvbXBsZXRlX3Rhc2soc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQsCisJCQkJICAgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJV0FSTl9PTihwYWNrZXQtPmNvbXBsZXRlX3JvdXRpbmUgIT0gTlVMTCk7CisJcGFja2V0LT5jb21wbGV0ZV9yb3V0aW5lID0gcm91dGluZTsKKwlwYWNrZXQtPmNvbXBsZXRlX2RhdGEgPSBkYXRhOworCXJldHVybjsKK30KKworLyoqCisgKiBocHNiX2FsbG9jX3BhY2tldCAtIGFsbG9jYXRlIG5ldyBwYWNrZXQgc3RydWN0dXJlCisgKiBAZGF0YV9zaXplOiBzaXplIG9mIHRoZSBkYXRhIGJsb2NrIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzLCBpbml0aWFsaXplcyBhbmQgcmV0dXJucyBhIG5ldyAmc3RydWN0IGhwc2JfcGFja2V0LgorICogSXQgY2FuIGJlIHVzZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuICBBIGhlYWRlciBibG9jayBpcyBhbHdheXMgaW5jbHVkZWQsIGl0cworICogc2l6ZSBpcyBiaWcgZW5vdWdoIHRvIGNvbnRhaW4gYWxsIHBvc3NpYmxlIDEzOTQgaGVhZGVycy4gIFRoZSBkYXRhIGJsb2NrIGlzCisgKiBvbmx5IGFsbG9jYXRlZCB3aGVuIEBkYXRhX3NpemUgaXMgbm90IHplcm8uCisgKgorICogRm9yIHBhY2tldHMgZm9yIHdoaWNoIHJlc3BvbnNlcyB3aWxsIGJlIHJlY2VpdmVkIHRoZSBAZGF0YV9zaXplIGhhcyB0byBiZSBiaWcKKyAqIGVub3VnaCB0byBjb250YWluIHRoZSByZXNwb25zZSdzIGRhdGEgYmxvY2sgc2luY2Ugbm8gZnVydGhlciBhbGxvY2F0aW9uCisgKiBvY2N1cnMgYXQgcmVzcG9uc2UgbWF0Y2hpbmcgdGltZS4KKyAqCisgKiBUaGUgcGFja2V0J3MgZ2VuZXJhdGlvbiB2YWx1ZSB3aWxsIGJlIHNldCB0byB0aGUgY3VycmVudCBnZW5lcmF0aW9uIG51bWJlcgorICogZm9yIGVhc2Ugb2YgdXNlLiAgUmVtZW1iZXIgdG8gb3ZlcndyaXRlIGl0IHdpdGggeW91ciBvd24gcmVjb3JkZWQgZ2VuZXJhdGlvbgorICogbnVtYmVyIGlmIHlvdSBjYW4gbm90IGJlIHN1cmUgdGhhdCB5b3VyIGNvZGUgd2lsbCBub3QgcmFjZSB3aXRoIGEgYnVzIHJlc2V0LgorICoKKyAqIFJldHVybiB2YWx1ZTogQSBwb2ludGVyIHRvIGEgJnN0cnVjdCBocHNiX3BhY2tldCBvciBOVUxMIG9uIGFsbG9jYXRpb24KKyAqIGZhaWx1cmUuCisgKi8KK3N0cnVjdCBocHNiX3BhY2tldCAqaHBzYl9hbGxvY19wYWNrZXQoc2l6ZV90IGRhdGFfc2l6ZSkKK3sKKwlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWRhdGFfc2l6ZSA9ICgoZGF0YV9zaXplICsgMykgJiB+Myk7CisKKwlza2IgPSBhbGxvY19za2IoZGF0YV9zaXplICsgc2l6ZW9mKCpwYWNrZXQpLCBHRlBfQVRPTUlDKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHNrYi0+ZGF0YSwgMCwgZGF0YV9zaXplICsgc2l6ZW9mKCpwYWNrZXQpKTsKKworCXBhY2tldCA9IChzdHJ1Y3QgaHBzYl9wYWNrZXQgKilza2ItPmRhdGE7CisJcGFja2V0LT5za2IgPSBza2I7CisKKwlwYWNrZXQtPmhlYWRlciA9IHBhY2tldC0+ZW1iZWRkZWRfaGVhZGVyOworCXBhY2tldC0+c3RhdGUgPSBocHNiX3VudXNlZDsKKwlwYWNrZXQtPmdlbmVyYXRpb24gPSAtMTsKKwlJTklUX0xJU1RfSEVBRCgmcGFja2V0LT5kcml2ZXJfbGlzdCk7CisJYXRvbWljX3NldCgmcGFja2V0LT5yZWZjbnQsIDEpOworCisJaWYgKGRhdGFfc2l6ZSkgeworCQlwYWNrZXQtPmRhdGEgPSAocXVhZGxldF90ICopKHNrYi0+ZGF0YSArIHNpemVvZigqcGFja2V0KSk7CisJCXBhY2tldC0+ZGF0YV9zaXplID0gZGF0YV9zaXplOworCX0KKworCXJldHVybiBwYWNrZXQ7Cit9CisKKworLyoqCisgKiBocHNiX2ZyZWVfcGFja2V0IC0gZnJlZSBwYWNrZXQgYW5kIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0CisgKiBAcGFja2V0OiBwYWNrZXQgdG8gZnJlZSAoaXMgTlVMTCBzYWZlKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHBhY2tldC0+ZGF0YSBhbmQgZmluYWxseSB0aGUgcGFja2V0IGl0c2VsZi4KKyAqLwordm9pZCBocHNiX2ZyZWVfcGFja2V0KHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0KQoreworCWlmIChwYWNrZXQgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmcGFja2V0LT5yZWZjbnQpKSB7CisJCUJVR19PTighbGlzdF9lbXB0eSgmcGFja2V0LT5kcml2ZXJfbGlzdCkpOworCQlrZnJlZV9za2IocGFja2V0LT5za2IpOworCX0KK30KKworCitpbnQgaHBzYl9yZXNldF9idXMoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IHR5cGUpCit7CisgICAgICAgIGlmICghaG9zdC0+aW5fYnVzX3Jlc2V0KSB7CisgICAgICAgICAgICAgICAgaG9zdC0+ZHJpdmVyLT5kZXZjdGwoaG9zdCwgUkVTRVRfQlVTLCB0eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorfQorCisKK2ludCBocHNiX2J1c19yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworICAgICAgICBpZiAoaG9zdC0+aW5fYnVzX3Jlc2V0KSB7CisgICAgICAgICAgICAgICAgSFBTQl9OT1RJQ0UoIiVzIGNhbGxlZCB3aGlsZSBidXMgcmVzZXQgYWxyZWFkeSBpbiBwcm9ncmVzcyIsCisJCQkgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGFib3J0X3JlcXVlc3RzKGhvc3QpOworICAgICAgICBob3N0LT5pbl9idXNfcmVzZXQgPSAxOworICAgICAgICBob3N0LT5pcm1faWQgPSAtMTsKKwlob3N0LT5pc19pcm0gPSAwOworICAgICAgICBob3N0LT5idXNtZ3JfaWQgPSAtMTsKKwlob3N0LT5pc19idXNtZ3IgPSAwOworCWhvc3QtPmlzX2N5Y21zdCA9IDA7CisgICAgICAgIGhvc3QtPm5vZGVfY291bnQgPSAwOworICAgICAgICBob3N0LT5zZWxmaWRfY291bnQgPSAwOworCisgICAgICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBWZXJpZnkgbnVtX29mX3NlbGZpZHMgU2VsZklEcyBhbmQgcmV0dXJuIG51bWJlciBvZiBub2Rlcy4gIFJldHVybiB6ZXJvIGluCisgKiBjYXNlIHZlcmlmaWNhdGlvbiBmYWlsZWQuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfc2VsZmlkcyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworICAgICAgICBpbnQgbm9kZWlkID0gLTE7CisgICAgICAgIGludCByZXN0X29mX3NlbGZpZHMgPSBob3N0LT5zZWxmaWRfY291bnQ7CisgICAgICAgIHN0cnVjdCBzZWxmaWQgKnNpZCA9IChzdHJ1Y3Qgc2VsZmlkICopaG9zdC0+dG9wb2xvZ3lfbWFwOworICAgICAgICBzdHJ1Y3QgZXh0X3NlbGZpZCAqZXNpZDsKKyAgICAgICAgaW50IGVzaWRfc2VxID0gMjM7CisKKwlob3N0LT5ub2Rlc19hY3RpdmUgPSAwOworCisgICAgICAgIHdoaWxlIChyZXN0X29mX3NlbGZpZHMtLSkgeworICAgICAgICAgICAgICAgIGlmICghc2lkLT5leHRlbmRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZWlkKys7CisgICAgICAgICAgICAgICAgICAgICAgICBlc2lkX3NlcSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWQtPnBoeV9pZCAhPSBub2RlaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFBTQl9JTkZPKCJTZWxmSURzIGZhaWxlZCBtb25vdG9ueSBjaGVjayB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZCIsIHNpZC0+cGh5X2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKwkJCWlmIChzaWQtPmxpbmtfYWN0aXZlKSB7CisJCQkJaG9zdC0+bm9kZXNfYWN0aXZlKys7CisJCQkJaWYgKHNpZC0+Y29udGVuZGVyKQorCQkJCQlob3N0LT5pcm1faWQgPSBMT0NBTF9CVVMgfCBzaWQtPnBoeV9pZDsKKwkJCX0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXNpZCA9IChzdHJ1Y3QgZXh0X3NlbGZpZCAqKXNpZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlc2lkLT5waHlfaWQgIT0gbm9kZWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChlc2lkLT5zZXFfbnIgIT0gZXNpZF9zZXEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhQU0JfSU5GTygiU2VsZklEcyBmYWlsZWQgbW9ub3RvbnkgY2hlY2sgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQvJWQiLCBlc2lkLT5waHlfaWQsIGVzaWQtPnNlcV9ucik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXNpZF9zZXErKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2lkKys7CisgICAgICAgIH0KKworICAgICAgICBlc2lkID0gKHN0cnVjdCBleHRfc2VsZmlkICopKHNpZCAtIDEpOworICAgICAgICB3aGlsZSAoZXNpZC0+ZXh0ZW5kZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGVzaWQtPnBvcnRhID09IDB4MikgfHwgKGVzaWQtPnBvcnRiID09IDB4MikKKyAgICAgICAgICAgICAgICAgICAgfHwgKGVzaWQtPnBvcnRjID09IDB4MikgfHwgKGVzaWQtPnBvcnRkID09IDB4MikKKyAgICAgICAgICAgICAgICAgICAgfHwgKGVzaWQtPnBvcnRlID09IDB4MikgfHwgKGVzaWQtPnBvcnRmID09IDB4MikKKyAgICAgICAgICAgICAgICAgICAgfHwgKGVzaWQtPnBvcnRnID09IDB4MikgfHwgKGVzaWQtPnBvcnRoID09IDB4MikpIHsKKwkJCUhQU0JfSU5GTygiU2VsZklEcyBmYWlsZWQgcm9vdCBjaGVjayBvbiAiCisJCQkJICAiZXh0ZW5kZWQgU2VsZklEIik7CisJCQlyZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXNpZC0tOworICAgICAgICB9CisKKyAgICAgICAgc2lkID0gKHN0cnVjdCBzZWxmaWQgKillc2lkOworICAgICAgICBpZiAoKHNpZC0+cG9ydDAgPT0gMHgyKSB8fCAoc2lkLT5wb3J0MSA9PSAweDIpIHx8IChzaWQtPnBvcnQyID09IDB4MikpIHsKKwkJSFBTQl9JTkZPKCJTZWxmSURzIGZhaWxlZCByb290IGNoZWNrIik7CisJCXJldHVybiAwOworICAgICAgICB9CisKKwlob3N0LT5ub2RlX2NvdW50ID0gbm9kZWlkICsgMTsKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3NwZWVkX21hcChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWNvdW50KQoreworCXU4IHNwZWVkY2FwW25vZGVjb3VudF07CisJdTggY2xkY250W25vZGVjb3VudF07CisgICAgICAgIHU4ICptYXAgPSBob3N0LT5zcGVlZF9tYXA7CisgICAgICAgIHN0cnVjdCBzZWxmaWQgKnNpZDsKKyAgICAgICAgc3RydWN0IGV4dF9zZWxmaWQgKmVzaWQ7CisgICAgICAgIGludCBpLCBqLCBuOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAobm9kZWNvdW50ICogNjQpOyBpICs9IDY0KSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5vZGVjb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXBbaStqXSA9IElFRUUxMzk0X1NQRUVEX01BWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZWNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjbGRjbnRbaV0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogZmluZCBkaXJlY3QgY2hpbGRyZW4gY291bnQgYW5kIHNwZWVkICovCisgICAgICAgIGZvciAoc2lkID0gKHN0cnVjdCBzZWxmaWQgKikmaG9zdC0+dG9wb2xvZ3lfbWFwW2hvc3QtPnNlbGZpZF9jb3VudC0xXSwKKyAgICAgICAgICAgICAgICAgICAgIG4gPSBub2RlY291bnQgLSAxOworICAgICAgICAgICAgICh2b2lkICopc2lkID49ICh2b2lkICopaG9zdC0+dG9wb2xvZ3lfbWFwOyBzaWQtLSkgeworICAgICAgICAgICAgICAgIGlmIChzaWQtPmV4dGVuZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlc2lkID0gKHN0cnVjdCBleHRfc2VsZmlkICopc2lkOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNpZC0+cG9ydGEgPT0gMHgzKSBjbGRjbnRbbl0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2lkLT5wb3J0YiA9PSAweDMpIGNsZGNudFtuXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzaWQtPnBvcnRjID09IDB4MykgY2xkY250W25dKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNpZC0+cG9ydGQgPT0gMHgzKSBjbGRjbnRbbl0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2lkLT5wb3J0ZSA9PSAweDMpIGNsZGNudFtuXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzaWQtPnBvcnRmID09IDB4MykgY2xkY250W25dKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNpZC0+cG9ydGcgPT0gMHgzKSBjbGRjbnRbbl0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2lkLT5wb3J0aCA9PSAweDMpIGNsZGNudFtuXSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lkLT5wb3J0MCA9PSAweDMpIGNsZGNudFtuXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZC0+cG9ydDEgPT0gMHgzKSBjbGRjbnRbbl0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWQtPnBvcnQyID09IDB4MykgY2xkY250W25dKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkY2FwW25dID0gc2lkLT5zcGVlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgc2VsZiBtYXBwaW5nICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG1hcFs2NCppICsgaV0gPSBzcGVlZGNhcFtpXTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGZpeCB1cCBkaXJlY3QgY2hpbGRyZW4gY291bnQgdG8gdG90YWwgY2hpbGRyZW4gY291bnQ7CisgICAgICAgICAqIGFsc28gZml4IHVwIHNwZWVkY2FwcyBmb3Igc2libGluZyBhbmQgcGFyZW50IGNvbW11bmljYXRpb24gKi8KKyAgICAgICAgZm9yIChpID0gMTsgaSA8IG5vZGVjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gY2xkY250W2ldLCBuID0gaSAtIDE7IGogPiAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZGNudFtpXSArPSBjbGRjbnRbbl07CisgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZGNhcFtuXSA9IG1pbihzcGVlZGNhcFtuXSwgc3BlZWRjYXBbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgbiAtPSBjbGRjbnRbbl0gKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAobiA9IDA7IG4gPCBub2RlY291bnQ7IG4rKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IG4gLSBjbGRjbnRbbl07IGkgPD0gbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKG4gLSBjbGRjbnRbbl0pOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2oqNjQgKyBpXSA9IG1hcFtpKjY0ICsgal0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbihtYXBbaSo2NCArIGpdLCBzcGVlZGNhcFtuXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBuICsgMTsgaiA8IG5vZGVjb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtqKjY0ICsgaV0gPSBtYXBbaSo2NCArIGpdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4obWFwW2kqNjQgKyBqXSwgc3BlZWRjYXBbbl0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCisKK3ZvaWQgaHBzYl9zZWxmaWRfcmVjZWl2ZWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgcXVhZGxldF90IHNpZCkKK3sKKyAgICAgICAgaWYgKGhvc3QtPmluX2J1c19yZXNldCkgeworICAgICAgICAgICAgICAgIEhQU0JfVkVSQk9TRSgiSW5jbHVkaW5nIFNlbGZJRCAweCV4Iiwgc2lkKTsKKyAgICAgICAgICAgICAgICBob3N0LT50b3BvbG9neV9tYXBbaG9zdC0+c2VsZmlkX2NvdW50KytdID0gc2lkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEhQU0JfTk9USUNFKCJTcHVyaW91cyBTZWxmSUQgcGFja2V0ICgweCUwOHgpIHJlY2VpdmVkIGZyb20gYnVzICVkIiwKKwkJCSAgICBzaWQsIE5PREVJRF9UT19CVVMoaG9zdC0+bm9kZV9pZCkpOworICAgICAgICB9Cit9CisKK3ZvaWQgaHBzYl9zZWxmaWRfY29tcGxldGUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IHBoeWlkLCBpbnQgaXNyb290KQoreworCWlmICghaG9zdC0+aW5fYnVzX3Jlc2V0KQorCQlIUFNCX05PVElDRSgiU2VsZklEIGNvbXBsZXRpb24gY2FsbGVkIG91dHNpZGUgb2YgYnVzIHJlc2V0ISIpOworCisgICAgICAgIGhvc3QtPm5vZGVfaWQgPSBMT0NBTF9CVVMgfCBwaHlpZDsKKyAgICAgICAgaG9zdC0+aXNfcm9vdCA9IGlzcm9vdDsKKworICAgICAgICBpZiAoIWNoZWNrX3NlbGZpZHMoaG9zdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaG9zdC0+cmVzZXRfcmV0cmllcysrIDwgMjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbGZpZCBzdGFnZSBkaWQgbm90IGNvbXBsZXRlIHdpdGhvdXQgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEhQU0JfTk9USUNFKCJFcnJvciBpbiBTZWxmSUQgc3RhZ2UsIHJlc2V0dGluZyIpOworCQkJaG9zdC0+aW5fYnVzX3Jlc2V0ID0gMDsKKwkJCS8qIHRoaXMgc2hvdWxkIHdvcmsgZnJvbSBvaGNpMTM5NCBub3cuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGhwc2JfcmVzZXRfYnVzKGhvc3QsIExPTkdfUkVTRVQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBIUFNCX05PVElDRSgiU3RvcHBpbmcgb3V0LW9mLWNvbnRyb2wgcmVzZXQgbG9vcCIpOworICAgICAgICAgICAgICAgICAgICAgICAgSFBTQl9OT1RJQ0UoIldhcm5pbmcgLSB0b3BvbG9neSBtYXAgYW5kIHNwZWVkIG1hcCB3aWxsIG5vdCBiZSB2YWxpZCIpOworCQkJaG9zdC0+cmVzZXRfcmV0cmllcyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworCQlob3N0LT5yZXNldF9yZXRyaWVzID0gMDsKKyAgICAgICAgICAgICAgICBidWlsZF9zcGVlZF9tYXAoaG9zdCwgaG9zdC0+bm9kZV9jb3VudCk7CisgICAgICAgIH0KKworCUhQU0JfVkVSQk9TRSgic2VsZmlkX2NvbXBsZXRlIGNhbGxlZCB3aXRoIHN1Y2Nlc3NmdWwgU2VsZklEIHN0YWdlICIKKwkJICAgICAiLi4uIGlybV9pZDogMHglWCBub2RlX2lkOiAweCVYIixob3N0LT5pcm1faWQsaG9zdC0+bm9kZV9pZCk7CisKKyAgICAgICAgLyogaXJtX2lkIGlzIGtlcHQgdXAgdG8gZGF0ZSBieSBjaGVja19zZWxmaWRzKCkgKi8KKyAgICAgICAgaWYgKGhvc3QtPmlybV9pZCA9PSBob3N0LT5ub2RlX2lkKSB7CisgICAgICAgICAgICAgICAgaG9zdC0+aXNfaXJtID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBob3N0LT5pc19idXNtZ3IgPSAwOworICAgICAgICAgICAgICAgIGhvc3QtPmlzX2lybSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNyb290KSB7CisJCWhvc3QtPmRyaXZlci0+ZGV2Y3RsKGhvc3QsIEFDVF9DWUNMRV9NQVNURVIsIDEpOworCQlob3N0LT5pc19jeWNtc3QgPSAxOworCX0KKwlhdG9taWNfaW5jKCZob3N0LT5nZW5lcmF0aW9uKTsKKwlob3N0LT5pbl9idXNfcmVzZXQgPSAwOworICAgICAgICBoaWdobGV2ZWxfaG9zdF9yZXNldChob3N0KTsKK30KKworCit2b2lkIGhwc2JfcGFja2V0X3NlbnQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFja2NvZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7CisKKwlwYWNrZXQtPmFja19jb2RlID0gYWNrY29kZTsKKworCWlmIChwYWNrZXQtPm5vX3dhaXRlciB8fCBwYWNrZXQtPnN0YXRlID09IGhwc2JfY29tcGxldGUpIHsKKwkJLyogaWYgcGFja2V0LT5ub193YWl0ZXIsIG11c3Qgbm90IGhhdmUgYSB0bGFiZWwgYWxsb2NhdGVkICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlLmxvY2ssIGZsYWdzKTsKKwkJaHBzYl9mcmVlX3BhY2tldChwYWNrZXQpOworCQlyZXR1cm47CisJfQorCisJYXRvbWljX2RlYygmcGFja2V0LT5yZWZjbnQpOwkvKiBkcm9wIEhDJ3MgcmVmZXJlbmNlICovCisJLyogaGVyZSB0aGUgcGFja2V0IG11c3QgYmUgb24gdGhlIGhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlICovCisKKwlpZiAoYWNrY29kZSAhPSBBQ0tfUEVORElORyB8fCAhcGFja2V0LT5leHBlY3RfcmVzcG9uc2UpIHsKKwkJcGFja2V0LT5zdGF0ZSA9IGhwc2JfY29tcGxldGU7CisJCV9fc2tiX3VubGluayhwYWNrZXQtPnNrYiwgJmhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUubG9jaywgZmxhZ3MpOworCQlxdWV1ZV9wYWNrZXRfY29tcGxldGUocGFja2V0KTsKKwkJcmV0dXJuOworCX0KKworCXBhY2tldC0+c3RhdGUgPSBocHNiX3BlbmRpbmc7CisJcGFja2V0LT5zZW5kdGltZSA9IGppZmZpZXM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7CisKKwltb2RfdGltZXIoJmhvc3QtPnRpbWVvdXQsIGppZmZpZXMgKyBob3N0LT50aW1lb3V0X2ludGVydmFsKTsKK30KKworLyoqCisgKiBocHNiX3NlbmRfcGh5X2NvbmZpZyAtIHRyYW5zbWl0IGEgUEhZIGNvbmZpZ3VyYXRpb24gcGFja2V0IG9uIHRoZSBidXMKKyAqIEBob3N0OiBob3N0IHRoYXQgUEhZIGNvbmZpZyBwYWNrZXQgZ2V0cyBzZW50IHRocm91Z2gKKyAqIEByb290aWQ6IHJvb3Qgd2hvc2UgZm9yY2Vfcm9vdCBiaXQgc2hvdWxkIGdldCBzZXQgKC0xID0gZG9uJ3Qgc2V0IGZvcmNlX3Jvb3QpCisgKiBAZ2FwY250OiBnYXAgY291bnQgdmFsdWUgdG8gc2V0ICgtMSA9IGRvbid0IHNldCBnYXAgY291bnQpCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhIFBIWSBjb25maWcgcGFja2V0IG9uIHRoZSBidXMgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGhvc3QuCisgKgorICogUmV0dXJuIHZhbHVlOiAwIGZvciBzdWNjZXNzIG9yIGVycm9yIG51bWJlciBvdGhlcndpc2UuCisgKi8KK2ludCBocHNiX3NlbmRfcGh5X2NvbmZpZyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgcm9vdGlkLCBpbnQgZ2FwY250KQoreworCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0OworCWludCByZXR2YWwgPSAwOworCisJaWYgKHJvb3RpZCA+PSBBTExfTk9ERVMgfHwgcm9vdGlkIDwgLTEgfHwgZ2FwY250ID4gMHgzZiB8fCBnYXBjbnQgPCAtMSB8fAorCSAgIChyb290aWQgPT0gLTEgJiYgZ2FwY250ID09IC0xKSkgeworCQlIUFNCX0RFQlVHKCJJbnZhbGlkIFBhcmFtZXRlcjogcm9vdGlkID0gJWQgICBnYXBjbnQgPSAlZCIsCisJCQkgICByb290aWQsIGdhcGNudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBhY2tldCA9IGhwc2JfYWxsb2NfcGFja2V0KDApOworCWlmICghcGFja2V0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhY2tldC0+aG9zdCA9IGhvc3Q7CisJcGFja2V0LT5oZWFkZXJfc2l6ZSA9IDg7CisJcGFja2V0LT5kYXRhX3NpemUgPSAwOworCXBhY2tldC0+ZXhwZWN0X3Jlc3BvbnNlID0gMDsKKwlwYWNrZXQtPm5vX3dhaXRlciA9IDA7CisJcGFja2V0LT50eXBlID0gaHBzYl9yYXc7CisJcGFja2V0LT5oZWFkZXJbMF0gPSAwOworCWlmIChyb290aWQgIT0gLTEpCisJCXBhY2tldC0+aGVhZGVyWzBdIHw9IHJvb3RpZCA8PCAyNCB8IDEgPDwgMjM7CisJaWYgKGdhcGNudCAhPSAtMSkKKwkJcGFja2V0LT5oZWFkZXJbMF0gfD0gZ2FwY250IDw8IDE2IHwgMSA8PCAyMjsKKworCXBhY2tldC0+aGVhZGVyWzFdID0gfnBhY2tldC0+aGVhZGVyWzBdOworCisJcGFja2V0LT5nZW5lcmF0aW9uID0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KTsKKworCXJldHZhbCA9IGhwc2Jfc2VuZF9wYWNrZXRfYW5kX3dhaXQocGFja2V0KTsKKwlocHNiX2ZyZWVfcGFja2V0KHBhY2tldCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGhwc2Jfc2VuZF9wYWNrZXQgLSB0cmFuc21pdCBhIHBhY2tldCBvbiB0aGUgYnVzCisgKiBAcGFja2V0OiBwYWNrZXQgdG8gc2VuZAorICoKKyAqIFRoZSBwYWNrZXQgaXMgc2VudCB0aHJvdWdoIHRoZSBob3N0IHNwZWNpZmllZCBpbiB0aGUgcGFja2V0LT5ob3N0IGZpZWxkLgorICogQmVmb3JlIHNlbmRpbmcsIHRoZSBwYWNrZXQncyB0cmFuc21pdCBzcGVlZCBpcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQKKyAqIHVzaW5nIHRoZSBsb2NhbCBzcGVlZCBtYXAgd2hlbiBpdCBpcyBhbiBhc3luYywgbm9uLWJyb2FkY2FzdCBwYWNrZXQuCisgKgorICogUG9zc2liaWxpdGllcyBmb3IgZmFpbHVyZSBhcmUgdGhhdCBob3N0IGlzIGVpdGhlciBub3QgaW5pdGlhbGl6ZWQsIGluIGJ1cworICogcmVzZXQsIHRoZSBwYWNrZXQncyBnZW5lcmF0aW9uIG51bWJlciBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IGdlbmVyYXRpb24KKyAqIG51bWJlciBvciB0aGUgaG9zdCByZXBvcnRzIGEgdHJhbnNtaXQgZXJyb3IuCisgKgorICogUmV0dXJuIHZhbHVlOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuCisgKi8KK2ludCBocHNiX3NlbmRfcGFja2V0KHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0KQoreworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBwYWNrZXQtPmhvc3Q7CisKKyAgICAgICAgaWYgKGhvc3QtPmlzX3NodXRkb3duKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaG9zdC0+aW5fYnVzX3Jlc2V0IHx8CisJICAgIChwYWNrZXQtPmdlbmVyYXRpb24gIT0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisKKyAgICAgICAgcGFja2V0LT5zdGF0ZSA9IGhwc2JfcXVldWVkOworCisJLyogVGhpcyBqdXN0IHNlZW1zIHNpbGx5IHRvIG1lICovCisJV0FSTl9PTihwYWNrZXQtPm5vX3dhaXRlciAmJiBwYWNrZXQtPmV4cGVjdF9yZXNwb25zZSk7CisKKwlpZiAoIXBhY2tldC0+bm9fd2FpdGVyIHx8IHBhY2tldC0+ZXhwZWN0X3Jlc3BvbnNlKSB7CisJCWF0b21pY19pbmMoJnBhY2tldC0+cmVmY250KTsKKwkJcGFja2V0LT5zZW5kdGltZSA9IGppZmZpZXM7CisJCXNrYl9xdWV1ZV90YWlsKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZSwgcGFja2V0LT5za2IpOworCX0KKworICAgICAgICBpZiAocGFja2V0LT5ub2RlX2lkID09IGhvc3QtPm5vZGVfaWQpIHsKKwkJLyogaXQgaXMgYSBsb2NhbCByZXF1ZXN0LCBzbyBoYW5kbGUgaXQgbG9jYWxseSAqLworCisgICAgICAgICAgICAgICAgcXVhZGxldF90ICpkYXRhOworICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gcGFja2V0LT5kYXRhX3NpemUgKyBwYWNrZXQtPmhlYWRlcl9zaXplOworCisgICAgICAgICAgICAgICAgZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CisgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBIUFNCX0VSUigidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29uY2F0ZW5hdGluZyBoZWFkZXIgYW5kIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1lbWNweShkYXRhLCBwYWNrZXQtPmhlYWRlciwgcGFja2V0LT5oZWFkZXJfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAocGFja2V0LT5kYXRhX3NpemUpCisJCQltZW1jcHkoKCh1OCopZGF0YSkgKyBwYWNrZXQtPmhlYWRlcl9zaXplLCBwYWNrZXQtPmRhdGEsIHBhY2tldC0+ZGF0YV9zaXplKTsKKworICAgICAgICAgICAgICAgIGR1bXBfcGFja2V0KCJzZW5kIHBhY2tldCBsb2NhbDoiLCBwYWNrZXQtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmhlYWRlcl9zaXplKTsKKworICAgICAgICAgICAgICAgIGhwc2JfcGFja2V0X3NlbnQoaG9zdCwgcGFja2V0LCBwYWNrZXQtPmV4cGVjdF9yZXNwb25zZSA/IEFDS19QRU5ESU5HIDogQUNLX0NPTVBMRVRFKTsKKyAgICAgICAgICAgICAgICBocHNiX3BhY2tldF9yZWNlaXZlZChob3N0LCBkYXRhLCBzaXplLCAwKTsKKworICAgICAgICAgICAgICAgIGtmcmVlKGRhdGEpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFja2V0LT50eXBlID09IGhwc2JfYXN5bmMgJiYgcGFja2V0LT5ub2RlX2lkICE9IEFMTF9OT0RFUykgeworICAgICAgICAgICAgICAgIHBhY2tldC0+c3BlZWRfY29kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBob3N0LT5zcGVlZF9tYXBbTk9ERUlEX1RPX05PREUoaG9zdC0+bm9kZV9pZCkgKiA2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBOT0RFSURfVE9fTk9ERShwYWNrZXQtPm5vZGVfaWQpXTsKKyAgICAgICAgfQorCisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1ZFUkJPU0VERUJVRworICAgICAgICBzd2l0Y2ggKHBhY2tldC0+c3BlZWRfY29kZSkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZHVtcF9wYWNrZXQoInNlbmQgcGFja2V0IDQwMDoiLCBwYWNrZXQtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmhlYWRlcl9zaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGR1bXBfcGFja2V0KCJzZW5kIHBhY2tldCAyMDA6IiwgcGFja2V0LT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5oZWFkZXJfc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZHVtcF9wYWNrZXQoInNlbmQgcGFja2V0IDEwMDoiLCBwYWNrZXQtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmhlYWRlcl9zaXplKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcmV0dXJuIGhvc3QtPmRyaXZlci0+dHJhbnNtaXRfcGFja2V0KGhvc3QsIHBhY2tldCk7Cit9CisKKy8qIFdlIGNvdWxkIGp1c3QgdXNlIGNvbXBsZXRlKCkgZGlyZWN0bHkgYXMgdGhlIHBhY2tldCBjb21wbGV0ZQorICogY2FsbGJhY2ssIGJ1dCB0aGlzIGlzIG1vcmUgdHlwZXNhZmUsIGluIHRoZSBzZW5zZSB0aGF0IHdlIGdldCBhCisgKiBjb21waWxlciBlcnJvciBpZiB0aGUgcHJvdG90eXBlIGZvciBjb21wbGV0ZSgpIGNoYW5nZXMuICovCisKK3N0YXRpYyB2b2lkIGNvbXBsZXRlX3BhY2tldCh2b2lkICpkYXRhKQoreworCWNvbXBsZXRlKChzdHJ1Y3QgY29tcGxldGlvbiAqKSBkYXRhKTsKK30KKworaW50IGhwc2Jfc2VuZF9wYWNrZXRfYW5kX3dhaXQoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpCit7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKKwlpbnQgcmV0dmFsOworCisJaW5pdF9jb21wbGV0aW9uKCZkb25lKTsKKwlocHNiX3NldF9wYWNrZXRfY29tcGxldGVfdGFzayhwYWNrZXQsIGNvbXBsZXRlX3BhY2tldCwgJmRvbmUpOworCXJldHZhbCA9IGhwc2Jfc2VuZF9wYWNrZXQocGFja2V0KTsKKwlpZiAocmV0dmFsID09IDApCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRvbmUpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgc2VuZF9wYWNrZXRfbm9jYXJlKHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0KQoreworICAgICAgICBpZiAoaHBzYl9zZW5kX3BhY2tldChwYWNrZXQpIDwgMCkgeworICAgICAgICAgICAgICAgIGhwc2JfZnJlZV9wYWNrZXQocGFja2V0KTsKKyAgICAgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGhhbmRsZV9wYWNrZXRfcmVzcG9uc2Uoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IHRjb2RlLAorCQkJCSAgIHF1YWRsZXRfdCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgICAgIHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0ID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAgICAgICBpbnQgdGNvZGVfbWF0Y2ggPSAwOworICAgICAgICBpbnQgdGxhYmVsOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIHRsYWJlbCA9IChkYXRhWzBdID4+IDEwKSAmIDB4M2Y7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUubG9jaywgZmxhZ3MpOworCisJc2tiX3F1ZXVlX3dhbGsoJmhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlLCBza2IpIHsKKwkJcGFja2V0ID0gKHN0cnVjdCBocHNiX3BhY2tldCAqKXNrYi0+ZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAoKHBhY2tldC0+dGxhYmVsID09IHRsYWJlbCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBhY2tldC0+bm9kZV9pZCA9PSAoZGF0YVsxXSA+PiAxNikpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworCQlwYWNrZXQgPSBOVUxMOworICAgICAgICB9CisKKwlpZiAocGFja2V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBIUFNCX0RFQlVHKCJ1bnNvbGljaXRlZCByZXNwb25zZSBwYWNrZXQgcmVjZWl2ZWQgLSBubyB0bGFiZWwgbWF0Y2giKTsKKyAgICAgICAgICAgICAgICBkdW1wX3BhY2tldCgiY29udGVudHM6IiwgZGF0YSwgMTYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChwYWNrZXQtPnRjb2RlKSB7CisgICAgICAgIGNhc2UgVENPREVfV1JJVEVROgorICAgICAgICBjYXNlIFRDT0RFX1dSSVRFQjoKKyAgICAgICAgICAgICAgICBpZiAodGNvZGUgIT0gVENPREVfV1JJVEVfUkVTUE9OU0UpCisJCQlicmVhazsKKwkJdGNvZGVfbWF0Y2ggPSAxOworCQltZW1jcHkocGFja2V0LT5oZWFkZXIsIGRhdGEsIDEyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQ09ERV9SRUFEUToKKyAgICAgICAgICAgICAgICBpZiAodGNvZGUgIT0gVENPREVfUkVBRFFfUkVTUE9OU0UpCisJCQlicmVhazsKKwkJdGNvZGVfbWF0Y2ggPSAxOworCQltZW1jcHkocGFja2V0LT5oZWFkZXIsIGRhdGEsIDE2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQ09ERV9SRUFEQjoKKyAgICAgICAgICAgICAgICBpZiAodGNvZGUgIT0gVENPREVfUkVBREJfUkVTUE9OU0UpCisJCQlicmVhazsKKwkJdGNvZGVfbWF0Y2ggPSAxOworCQlCVUdfT04ocGFja2V0LT5za2ItPmxlbiAtIHNpemVvZigqcGFja2V0KSA8IHNpemUgLSAxNik7CisJCW1lbWNweShwYWNrZXQtPmhlYWRlciwgZGF0YSwgMTYpOworCQltZW1jcHkocGFja2V0LT5kYXRhLCBkYXRhICsgNCwgc2l6ZSAtIDE2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQ09ERV9MT0NLX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgaWYgKHRjb2RlICE9IFRDT0RFX0xPQ0tfUkVTUE9OU0UpCisJCQlicmVhazsKKwkJdGNvZGVfbWF0Y2ggPSAxOworCQlzaXplID0gbWluKChzaXplIC0gMTYpLCAoc2l6ZV90KTgpOworCQlCVUdfT04ocGFja2V0LT5za2ItPmxlbiAtIHNpemVvZigqcGFja2V0KSA8IHNpemUpOworCQltZW1jcHkocGFja2V0LT5oZWFkZXIsIGRhdGEsIDE2KTsKKwkJbWVtY3B5KHBhY2tldC0+ZGF0YSwgZGF0YSArIDQsIHNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF0Y29kZV9tYXRjaCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgSFBTQl9JTkZPKCJ1bnNvbGljaXRlZCByZXNwb25zZSBwYWNrZXQgcmVjZWl2ZWQgLSB0Y29kZSBtaXNtYXRjaCIpOworICAgICAgICAgICAgICAgIGR1bXBfcGFja2V0KCJjb250ZW50czoiLCBkYXRhLCAxNik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwlfX3NrYl91bmxpbmsoc2tiLCBza2ItPmxpc3QpOworCisJaWYgKHBhY2tldC0+c3RhdGUgPT0gaHBzYl9xdWV1ZWQpIHsKKwkJcGFja2V0LT5zZW5kdGltZSA9IGppZmZpZXM7CisJCXBhY2tldC0+YWNrX2NvZGUgPSBBQ0tfUEVORElORzsKKwl9CisKKwlwYWNrZXQtPnN0YXRlID0gaHBzYl9jb21wbGV0ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZS5sb2NrLCBmbGFncyk7CisKKwlxdWV1ZV9wYWNrZXRfY29tcGxldGUocGFja2V0KTsKK30KKworCitzdGF0aWMgc3RydWN0IGhwc2JfcGFja2V0ICpjcmVhdGVfcmVwbHlfcGFja2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCisJCQkJCSAgICAgICBxdWFkbGV0X3QgKmRhdGEsIHNpemVfdCBkc2l6ZSkKK3sKKyAgICAgICAgc3RydWN0IGhwc2JfcGFja2V0ICpwOworCisgICAgICAgIHAgPSBocHNiX2FsbG9jX3BhY2tldChkc2l6ZSk7CisgICAgICAgIGlmICh1bmxpa2VseShwID09IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgLyogRklYTUUgLSBzZW5kIGRhdGFfZXJyb3IgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHAtPnR5cGUgPSBocHNiX2FzeW5jOworICAgICAgICBwLT5zdGF0ZSA9IGhwc2JfdW51c2VkOworICAgICAgICBwLT5ob3N0ID0gaG9zdDsKKyAgICAgICAgcC0+bm9kZV9pZCA9IGRhdGFbMV0gPj4gMTY7CisgICAgICAgIHAtPnRsYWJlbCA9IChkYXRhWzBdID4+IDEwKSAmIDB4M2Y7CisgICAgICAgIHAtPm5vX3dhaXRlciA9IDE7CisKKwlwLT5nZW5lcmF0aW9uID0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KTsKKworCWlmIChkc2l6ZSAlIDQpCisJCXAtPmRhdGFbZHNpemUgLyA0XSA9IDA7CisKKyAgICAgICAgcmV0dXJuIHA7Cit9CisKKyNkZWZpbmUgUFJFUF9BU1lOQ19IRUFEX1JDT0RFKHRjKSBcCisJcGFja2V0LT50Y29kZSA9IHRjOyBcCisJcGFja2V0LT5oZWFkZXJbMF0gPSAocGFja2V0LT5ub2RlX2lkIDw8IDE2KSB8IChwYWNrZXQtPnRsYWJlbCA8PCAxMCkgXAorCQl8ICgxIDw8IDgpIHwgKHRjIDw8IDQpOyBcCisJcGFja2V0LT5oZWFkZXJbMV0gPSAocGFja2V0LT5ob3N0LT5ub2RlX2lkIDw8IDE2KSB8IChyY29kZSA8PCAxMik7IFwKKwlwYWNrZXQtPmhlYWRlclsyXSA9IDAKKworc3RhdGljIHZvaWQgZmlsbF9hc3luY19yZWFkcXVhZF9yZXNwKHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0LCBpbnQgcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkbGV0X3QgZGF0YSkKK3sKKwlQUkVQX0FTWU5DX0hFQURfUkNPREUoVENPREVfUkVBRFFfUkVTUE9OU0UpOworCXBhY2tldC0+aGVhZGVyWzNdID0gZGF0YTsKKwlwYWNrZXQtPmhlYWRlcl9zaXplID0gMTY7CisJcGFja2V0LT5kYXRhX3NpemUgPSAwOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2FzeW5jX3JlYWRibG9ja19yZXNwKHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0LCBpbnQgcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkKK3sKKwlpZiAocmNvZGUgIT0gUkNPREVfQ09NUExFVEUpCisJCWxlbmd0aCA9IDA7CisKKwlQUkVQX0FTWU5DX0hFQURfUkNPREUoVENPREVfUkVBREJfUkVTUE9OU0UpOworCXBhY2tldC0+aGVhZGVyWzNdID0gbGVuZ3RoIDw8IDE2OworCXBhY2tldC0+aGVhZGVyX3NpemUgPSAxNjsKKwlwYWNrZXQtPmRhdGFfc2l6ZSA9IGxlbmd0aCArIChsZW5ndGggJSA0ID8gNCAtIChsZW5ndGggJSA0KSA6IDApOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2FzeW5jX3dyaXRlX3Jlc3Aoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQsIGludCByY29kZSkKK3sKKwlQUkVQX0FTWU5DX0hFQURfUkNPREUoVENPREVfV1JJVEVfUkVTUE9OU0UpOworCXBhY2tldC0+aGVhZGVyWzJdID0gMDsKKwlwYWNrZXQtPmhlYWRlcl9zaXplID0gMTI7CisJcGFja2V0LT5kYXRhX3NpemUgPSAwOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2FzeW5jX2xvY2tfcmVzcChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCwgaW50IHJjb2RlLCBpbnQgZXh0Y29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkKK3sKKwlpZiAocmNvZGUgIT0gUkNPREVfQ09NUExFVEUpCisJCWxlbmd0aCA9IDA7CisKKwlQUkVQX0FTWU5DX0hFQURfUkNPREUoVENPREVfTE9DS19SRVNQT05TRSk7CisJcGFja2V0LT5oZWFkZXJbM10gPSAobGVuZ3RoIDw8IDE2KSB8IGV4dGNvZGU7CisJcGFja2V0LT5oZWFkZXJfc2l6ZSA9IDE2OworCXBhY2tldC0+ZGF0YV9zaXplID0gbGVuZ3RoOworfQorCisjZGVmaW5lIFBSRVBfUkVQTFlfUEFDS0VUKGxlbmd0aCkgXAorICAgICAgICAgICAgICAgIHBhY2tldCA9IGNyZWF0ZV9yZXBseV9wYWNrZXQoaG9zdCwgZGF0YSwgbGVuZ3RoKTsgXAorICAgICAgICAgICAgICAgIGlmIChwYWNrZXQgPT0gTlVMTCkgYnJlYWsKKworc3RhdGljIHZvaWQgaGFuZGxlX2luY29taW5nX3BhY2tldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgdGNvZGUsCisJCQkJICAgcXVhZGxldF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50IHdyaXRlX2Fja2VkKQoreworICAgICAgICBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKKyAgICAgICAgaW50IGxlbmd0aCwgcmNvZGUsIGV4dGNvZGU7CisgICAgICAgIHF1YWRsZXRfdCBidWZmZXI7CisgICAgICAgIG5vZGVpZF90IHNvdXJjZSA9IGRhdGFbMV0gPj4gMTY7CisgICAgICAgIG5vZGVpZF90IGRlc3QgPSBkYXRhWzBdID4+IDE2OworICAgICAgICB1MTYgZmxhZ3MgPSAodTE2KSBkYXRhWzBdOworICAgICAgICB1NjQgYWRkcjsKKworICAgICAgICAvKiBiaWcgRklYTUUgLSBubyBlcnJvciBjaGVja2luZyBpcyBkb25lIGZvciBhbiBvdXQgb2YgYm91bmRzIGxlbmd0aCAqLworCisgICAgICAgIHN3aXRjaCAodGNvZGUpIHsKKyAgICAgICAgY2FzZSBUQ09ERV9XUklURVE6CisgICAgICAgICAgICAgICAgYWRkciA9ICgoKHU2NCkoZGF0YVsxXSAmIDB4ZmZmZikpIDw8IDMyKSB8IGRhdGFbMl07CisgICAgICAgICAgICAgICAgcmNvZGUgPSBoaWdobGV2ZWxfd3JpdGUoaG9zdCwgc291cmNlLCBkZXN0LCBkYXRhKzMsCisJCQkJCWFkZHIsIDQsIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIGlmICghd3JpdGVfYWNrZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgKE5PREVJRF9UT19OT0RFKGRhdGFbMF0gPj4gMTYpICE9IE5PREVfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgJiYgKHJjb2RlID49IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgYSBicm9hZGNhc3Qgd3JpdGUsIHJlcGx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICBQUkVQX1JFUExZX1BBQ0tFVCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfYXN5bmNfd3JpdGVfcmVzcChwYWNrZXQsIHJjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfcGFja2V0X25vY2FyZShwYWNrZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRDT0RFX1dSSVRFQjoKKyAgICAgICAgICAgICAgICBhZGRyID0gKCgodTY0KShkYXRhWzFdICYgMHhmZmZmKSkgPDwgMzIpIHwgZGF0YVsyXTsKKyAgICAgICAgICAgICAgICByY29kZSA9IGhpZ2hsZXZlbF93cml0ZShob3N0LCBzb3VyY2UsIGRlc3QsIGRhdGErNCwKKwkJCQkJYWRkciwgZGF0YVszXT4+MTYsIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIGlmICghd3JpdGVfYWNrZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgKE5PREVJRF9UT19OT0RFKGRhdGFbMF0gPj4gMTYpICE9IE5PREVfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgJiYgKHJjb2RlID49IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgYSBicm9hZGNhc3Qgd3JpdGUsIHJlcGx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICBQUkVQX1JFUExZX1BBQ0tFVCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfYXN5bmNfd3JpdGVfcmVzcChwYWNrZXQsIHJjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfcGFja2V0X25vY2FyZShwYWNrZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRDT0RFX1JFQURROgorICAgICAgICAgICAgICAgIGFkZHIgPSAoKCh1NjQpKGRhdGFbMV0gJiAweGZmZmYpKSA8PCAzMikgfCBkYXRhWzJdOworICAgICAgICAgICAgICAgIHJjb2RlID0gaGlnaGxldmVsX3JlYWQoaG9zdCwgc291cmNlLCAmYnVmZmVyLCBhZGRyLCA0LCBmbGFncyk7CisKKyAgICAgICAgICAgICAgICBpZiAocmNvZGUgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUFJFUF9SRVBMWV9QQUNLRVQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2FzeW5jX3JlYWRxdWFkX3Jlc3AocGFja2V0LCByY29kZSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfcGFja2V0X25vY2FyZShwYWNrZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRDT0RFX1JFQURCOgorICAgICAgICAgICAgICAgIGxlbmd0aCA9IGRhdGFbM10gPj4gMTY7CisgICAgICAgICAgICAgICAgUFJFUF9SRVBMWV9QQUNLRVQobGVuZ3RoKTsKKworICAgICAgICAgICAgICAgIGFkZHIgPSAoKCh1NjQpKGRhdGFbMV0gJiAweGZmZmYpKSA8PCAzMikgfCBkYXRhWzJdOworICAgICAgICAgICAgICAgIHJjb2RlID0gaGlnaGxldmVsX3JlYWQoaG9zdCwgc291cmNlLCBwYWNrZXQtPmRhdGEsIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIGlmIChyY29kZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2FzeW5jX3JlYWRibG9ja19yZXNwKHBhY2tldCwgcmNvZGUsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3BhY2tldF9ub2NhcmUocGFja2V0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaHBzYl9mcmVlX3BhY2tldChwYWNrZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRDT0RFX0xPQ0tfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBkYXRhWzNdID4+IDE2OworICAgICAgICAgICAgICAgIGV4dGNvZGUgPSBkYXRhWzNdICYgMHhmZmZmOworICAgICAgICAgICAgICAgIGFkZHIgPSAoKCh1NjQpKGRhdGFbMV0gJiAweGZmZmYpKSA8PCAzMikgfCBkYXRhWzJdOworCisgICAgICAgICAgICAgICAgUFJFUF9SRVBMWV9QQUNLRVQoOCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKGV4dGNvZGUgPT0gMCkgfHwgKGV4dGNvZGUgPj0gNykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCBzd2l0Y2ggZGVmYXVsdCBoYW5kbGUgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IGhpZ2hsZXZlbF9sb2NrKGhvc3QsIHNvdXJjZSwgcGFja2V0LT5kYXRhLCBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzRdLCAwLCBleHRjb2RlLGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfYXN5bmNfbG9ja19yZXNwKHBhY2tldCwgcmNvZGUsIGV4dGNvZGUsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChleHRjb2RlICE9IEVYVENPREVfRkVUQ0hfQUREKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChleHRjb2RlICE9IEVYVENPREVfTElUVExFX0FERCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBoaWdobGV2ZWxfbG9jayhob3N0LCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5kYXRhLCBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNV0sIGRhdGFbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0Y29kZSwgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2FzeW5jX2xvY2tfcmVzcChwYWNrZXQsIHJjb2RlLCBleHRjb2RlLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gaGlnaGxldmVsX2xvY2s2NChob3N0LCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2N0bGV0X3QgKilwYWNrZXQtPmRhdGEsIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKG9jdGxldF90ICopKGRhdGEgKyA0KSwgMFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGNvZGUsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9hc3luY19sb2NrX3Jlc3AocGFja2V0LCByY29kZSwgZXh0Y29kZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBoaWdobGV2ZWxfbG9jazY0KGhvc3QsIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2N0bGV0X3QgKilwYWNrZXQtPmRhdGEsIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihvY3RsZXRfdCAqKShkYXRhICsgNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihvY3RsZXRfdCAqKShkYXRhICsgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0Y29kZSwgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9hc3luY19sb2NrX3Jlc3AocGFja2V0LCByY29kZSwgZXh0Y29kZSwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBSQ09ERV9UWVBFX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9hc3luY19sb2NrX3Jlc3AocGFja2V0LCByY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGNvZGUsIDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyY29kZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3BhY2tldF9ub2NhcmUocGFja2V0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaHBzYl9mcmVlX3BhY2tldChwYWNrZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCit9CisjdW5kZWYgUFJFUF9SRVBMWV9QQUNLRVQKKworCit2b2lkIGhwc2JfcGFja2V0X3JlY2VpdmVkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHF1YWRsZXRfdCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3cml0ZV9hY2tlZCkKK3sKKyAgICAgICAgaW50IHRjb2RlOworCisgICAgICAgIGlmIChob3N0LT5pbl9idXNfcmVzZXQpIHsKKyAgICAgICAgICAgICAgICBIUFNCX0lORk8oInJlY2VpdmVkIHBhY2tldCBkdXJpbmcgcmVzZXQ7IGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZHVtcF9wYWNrZXQoInJlY2VpdmVkIHBhY2tldDoiLCBkYXRhLCBzaXplKTsKKworICAgICAgICB0Y29kZSA9IChkYXRhWzBdID4+IDQpICYgMHhmOworCisgICAgICAgIHN3aXRjaCAodGNvZGUpIHsKKyAgICAgICAgY2FzZSBUQ09ERV9XUklURV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBUQ09ERV9SRUFEUV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBUQ09ERV9SRUFEQl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBUQ09ERV9MT0NLX1JFU1BPTlNFOgorICAgICAgICAgICAgICAgIGhhbmRsZV9wYWNrZXRfcmVzcG9uc2UoaG9zdCwgdGNvZGUsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVENPREVfV1JJVEVROgorICAgICAgICBjYXNlIFRDT0RFX1dSSVRFQjoKKyAgICAgICAgY2FzZSBUQ09ERV9SRUFEUToKKyAgICAgICAgY2FzZSBUQ09ERV9SRUFEQjoKKyAgICAgICAgY2FzZSBUQ09ERV9MT0NLX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgaGFuZGxlX2luY29taW5nX3BhY2tldChob3N0LCB0Y29kZSwgZGF0YSwgc2l6ZSwgd3JpdGVfYWNrZWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBUQ09ERV9JU09fREFUQToKKyAgICAgICAgICAgICAgICBoaWdobGV2ZWxfaXNvX3JlY2VpdmUoaG9zdCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUQ09ERV9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAvKiBzaW1wbHkgaWdub3JlIHRoaXMgcGFja2V0IGlmIGl0IGlzIHBhc3NlZCBvbiAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgSFBTQl9OT1RJQ0UoInJlY2VpdmVkIHBhY2tldCB3aXRoIGJvZ3VzIHRyYW5zYWN0aW9uIGNvZGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjb2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGFib3J0X3JlcXVlc3RzKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWhvc3QtPmRyaXZlci0+ZGV2Y3RsKGhvc3QsIENBTkNFTF9SRVFVRVNUUywgMCk7CisKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZSkpICE9IE5VTEwpIHsKKwkJcGFja2V0ID0gKHN0cnVjdCBocHNiX3BhY2tldCAqKXNrYi0+ZGF0YTsKKworCQlwYWNrZXQtPnN0YXRlID0gaHBzYl9jb21wbGV0ZTsKKwkJcGFja2V0LT5hY2tfY29kZSA9IEFDS1hfQUJPUlRFRDsKKwkJcXVldWVfcGFja2V0X2NvbXBsZXRlKHBhY2tldCk7CisJfQorfQorCit2b2lkIGFib3J0X3RpbWVkb3V0cyh1bnNpZ25lZCBsb25nIF9fb3BhcXVlKQoreworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSAoc3RydWN0IGhwc2JfaG9zdCAqKV9fb3BhcXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5jc3IubG9jaywgZmxhZ3MpOworCWV4cGlyZSA9IGhvc3QtPmNzci5leHBpcmU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+Y3NyLmxvY2ssIGZsYWdzKTsKKworCS8qIEhvbGQgdGhlIGxvY2sgYXJvdW5kIHRoaXMsIHNpbmNlIHdlIGFyZW4ndCBkZXF1ZXVpbmcgYWxsCisJICogcGFja2V0cywganVzdCBvbmVzIHdlIG5lZWQuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlLmxvY2ssIGZsYWdzKTsKKworCXdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZSkpIHsKKwkJc2tiID0gc2tiX3BlZWsoJmhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlKTsKKworCQlwYWNrZXQgPSAoc3RydWN0IGhwc2JfcGFja2V0ICopc2tiLT5kYXRhOworCisJCWlmICh0aW1lX2JlZm9yZShwYWNrZXQtPnNlbmR0aW1lICsgZXhwaXJlLCBqaWZmaWVzKSkgeworCQkJX19za2JfdW5saW5rKHNrYiwgc2tiLT5saXN0KTsKKwkJCXBhY2tldC0+c3RhdGUgPSBocHNiX2NvbXBsZXRlOworCQkJcGFja2V0LT5hY2tfY29kZSA9IEFDS1hfVElNRU9VVDsKKwkJCXF1ZXVlX3BhY2tldF9jb21wbGV0ZShwYWNrZXQpOworCQl9IGVsc2UgeworCQkJLyogU2luY2UgcGFja2V0cyBhcmUgYWRkZWQgdG8gdGhlIHRhaWwsIHRoZSBvbGRlc3QKKwkJCSAqIG9uZXMgYXJlIGZpcnN0LCBhbHdheXMuIFdoZW4gd2UgZ2V0IHRvIG9uZSB0aGF0CisJCQkgKiBpc24ndCB0aW1lZCBvdXQsIHRoZSByZXN0IGFyZW4ndCBlaXRoZXIuICovCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZob3N0LT5wZW5kaW5nX3BhY2tldF9xdWV1ZSkpCisJCW1vZF90aW1lcigmaG9zdC0+dGltZW91dCwgamlmZmllcyArIGhvc3QtPnRpbWVvdXRfaW50ZXJ2YWwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+cGVuZGluZ19wYWNrZXRfcXVldWUubG9jaywgZmxhZ3MpOworfQorCisKKy8qIEtlcm5lbCB0aHJlYWQgYW5kIHZhcnMsIHdoaWNoIGhhbmRsZXMgcGFja2V0cyB0aGF0IGFyZSBjb21wbGV0ZWQuIE9ubHkKKyAqIHBhY2tldHMgdGhhdCBoYXZlIGEgImNvbXBsZXRlIiBmdW5jdGlvbiBhcmUgc2VudCBoZXJlLiBUaGlzIHdheSwgdGhlCisgKiBjb21wbGV0aW9uIGlzIHJ1biBvdXQgb2Yga2VybmVsIGNvbnRleHQsIGFuZCBkb2Vzbid0IGJsb2NrIHRoZSByZXN0IG9mCisgKiB0aGUgc3RhY2suICovCitzdGF0aWMgaW50IGtocHNicGt0X3BpZCA9IC0xLCBraHBzYnBrdF9raWxsOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihraHBzYnBrdF9jb21wbGV0ZSk7CitzdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCBocHNicGt0X3F1ZXVlOworc3RhdGljIERFQ0xBUkVfTVVURVhfTE9DS0VEKGtocHNicGt0X3NpZyk7CisKKworc3RhdGljIHZvaWQgcXVldWVfcGFja2V0X2NvbXBsZXRlKHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0KQoreworCWlmIChwYWNrZXQtPm5vX3dhaXRlcikgeworCQlocHNiX2ZyZWVfcGFja2V0KHBhY2tldCk7CisJCXJldHVybjsKKwl9CisJaWYgKHBhY2tldC0+Y29tcGxldGVfcm91dGluZSAhPSBOVUxMKSB7CisJCXNrYl9xdWV1ZV90YWlsKCZocHNicGt0X3F1ZXVlLCBwYWNrZXQtPnNrYik7CisKKwkJLyogU2lnbmFsIHRoZSBrZXJuZWwgdGhyZWFkIHRvIGhhbmRsZSB0aGlzICovCisJCXVwKCZraHBzYnBrdF9zaWcpOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgaHBzYnBrdF90aHJlYWQodm9pZCAqX19oaSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0OworCXZvaWQgKCpjb21wbGV0ZV9yb3V0aW5lKSh2b2lkKik7CisJdm9pZCAqY29tcGxldGVfZGF0YTsKKworCWRhZW1vbml6ZSgia2hwc2Jwa3QiKTsKKworCXdoaWxlICgxKSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmtocHNicGt0X3NpZykpIHsKKwkJCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkgeworCQkJCXJlZnJpZ2VyYXRvcigwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXByaW50aygia2hwc2Jwa3Q6IHJlY2VpdmVkIHVuZXhwZWN0ZWQgc2lnbmFsPyFcbiIgKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGtocHNicGt0X2tpbGwpCisJCQlicmVhazsKKworCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZocHNicGt0X3F1ZXVlKSkgIT0gTlVMTCkgeworCQkJcGFja2V0ID0gKHN0cnVjdCBocHNiX3BhY2tldCAqKXNrYi0+ZGF0YTsKKworCQkJY29tcGxldGVfcm91dGluZSA9IHBhY2tldC0+Y29tcGxldGVfcm91dGluZTsKKwkJCWNvbXBsZXRlX2RhdGEgPSBwYWNrZXQtPmNvbXBsZXRlX2RhdGE7CisKKwkJCXBhY2tldC0+Y29tcGxldGVfcm91dGluZSA9IHBhY2tldC0+Y29tcGxldGVfZGF0YSA9IE5VTEw7CisKKwkJCWNvbXBsZXRlX3JvdXRpbmUoY29tcGxldGVfZGF0YSk7CisJCX0KKwl9CisKKwljb21wbGV0ZV9hbmRfZXhpdCgma2hwc2Jwa3RfY29tcGxldGUsIDApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpZWVlMTM5NF9pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmhwc2Jwa3RfcXVldWUpOworCisJLyogbm9uLWZhdGFsIGVycm9yICovCisJaWYgKGhwc2JfaW5pdF9jb25maWdfcm9tcygpKSB7CisJCUhQU0JfRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBzb21lIGNvbmZpZyByb20gZW50cmllcy5cbiIpOworCQlIUFNCX0VSUigiU29tZSBmZWF0dXJlcyBtYXkgbm90IGJlIGF2YWlsYWJsZVxuIik7CisJfQorCisJa2hwc2Jwa3RfcGlkID0ga2VybmVsX3RocmVhZChocHNicGt0X3RocmVhZCwgTlVMTCwgQ0xPTkVfS0VSTkVMKTsKKwlpZiAoa2hwc2Jwa3RfcGlkIDwgMCkgeworCQlIUFNCX0VSUigiRmFpbGVkIHRvIHN0YXJ0IGhwc2Jwa3QgdGhyZWFkIVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9jbGVhbnVwX2NvbmZpZ19yb21zOworCX0KKworCWlmIChyZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKElFRUUxMzk0X0NPUkVfREVWLCAyNTYsICJpZWVlMTM5NCIpKSB7CisJCUhQU0JfRVJSKCJ1bmFibGUgdG8gcmVnaXN0ZXIgY2hhcmFjdGVyIGRldmljZSBtYWpvciAlZCFcbiIsIElFRUUxMzk0X01BSk9SKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBleGl0X3JlbGVhc2Vfa2VybmVsX3RocmVhZDsKKwl9CisKKwkvKiBhY3R1YWxseSB0aGlzIGlzIGEgbm9uLWZhdGFsIGVycm9yICovCisJcmV0ID0gZGV2ZnNfbWtfZGlyKCJpZWVlMTM5NCIpOworCWlmIChyZXQgPCAwKSB7CisJCUhQU0JfRVJSKCJ1bmFibGUgdG8gbWFrZSBkZXZmcyBkaXIgZm9yIGRldmljZSBtYWpvciAlZCFcbiIsIElFRUUxMzk0X01BSk9SKTsKKwkJZ290byByZWxlYXNlX2NocmRldjsKKwl9CisKKwlyZXQgPSBidXNfcmVnaXN0ZXIoJmllZWUxMzk0X2J1c190eXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlIUFNCX0lORk8oImJ1cyByZWdpc3RlciBmYWlsZWQiKTsKKwkJZ290byByZWxlYXNlX2RldmZzOworCX0KKworCWZvciAoaSA9IDA7IGZ3X2J1c19hdHRyc1tpXTsgaSsrKSB7CisJCXJldCA9IGJ1c19jcmVhdGVfZmlsZSgmaWVlZTEzOTRfYnVzX3R5cGUsIGZ3X2J1c19hdHRyc1tpXSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQl3aGlsZSAoaSA+PSAwKSB7CisJCQkJYnVzX3JlbW92ZV9maWxlKCZpZWVlMTM5NF9idXNfdHlwZSwKKwkJCQkJCWZ3X2J1c19hdHRyc1tpLS1dKTsKKwkJCX0KKwkJCWJ1c191bnJlZ2lzdGVyKCZpZWVlMTM5NF9idXNfdHlwZSk7CisJCQlnb3RvIHJlbGVhc2VfZGV2ZnM7CisJCX0KKwl9CisKKwlyZXQgPSBjbGFzc19yZWdpc3RlcigmaHBzYl9ob3N0X2NsYXNzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byByZWxlYXNlX2FsbF9idXM7CisKKwlocHNiX3Byb3RvY29sX2NsYXNzID0gY2xhc3Nfc2ltcGxlX2NyZWF0ZShUSElTX01PRFVMRSwgImllZWUxMzk0X3Byb3RvY29sIik7CisJaWYgKElTX0VSUihocHNiX3Byb3RvY29sX2NsYXNzKSkgeworCQlyZXQgPSBQVFJfRVJSKGhwc2JfcHJvdG9jb2xfY2xhc3MpOworCQlnb3RvIHJlbGVhc2VfY2xhc3NfaG9zdDsKKwl9CisKKwlyZXQgPSBpbml0X2NzcigpOworCWlmIChyZXQpIHsKKwkJSFBTQl9JTkZPKCJpbml0IGNzciBmYWlsZWQiKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlX2NsYXNzX3Byb3RvY29sOworCX0KKworCWlmIChkaXNhYmxlX25vZGVtZ3IpIHsKKwkJSFBTQl9JTkZPKCJub2RlbWdyIGFuZCBJUk0gZnVuY3Rpb25hbGl0eSBkaXNhYmxlZCIpOworCQkvKiBXZSBzaG91bGRuJ3QgY29udGVuZCBmb3IgSVJNIHdpdGggbm9kZW1nciBkaXNhYmxlZCwgc2luY2UKKwkJICAgbm9kZW1nciBpbXBsZW1lbnRzIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgb2YgaWVlZTEzOTRhLTIwMDAKKwkJICAgSVJNcyAqLworCQlocHNiX2Rpc2FibGVfaXJtID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGhwc2JfZGlzYWJsZV9pcm0pIHsKKwkJSFBTQl9JTkZPKCJJUk0gZnVuY3Rpb25hbGl0eSBkaXNhYmxlZCIpOworCX0KKworCXJldCA9IGluaXRfaWVlZTEzOTRfbm9kZW1ncigpOworCWlmIChyZXQgPCAwKSB7CisJCUhQU0JfSU5GTygiaW5pdCBub2RlbWdyIGZhaWxlZCIpOworCQlnb3RvIGNsZWFudXBfY3NyOworCX0KKworCXJldHVybiAwOworCitjbGVhbnVwX2NzcjoKKwljbGVhbnVwX2NzcigpOworcmVsZWFzZV9jbGFzc19wcm90b2NvbDoKKwljbGFzc19zaW1wbGVfZGVzdHJveShocHNiX3Byb3RvY29sX2NsYXNzKTsKK3JlbGVhc2VfY2xhc3NfaG9zdDoKKwljbGFzc191bnJlZ2lzdGVyKCZocHNiX2hvc3RfY2xhc3MpOworcmVsZWFzZV9hbGxfYnVzOgorCWZvciAoaSA9IDA7IGZ3X2J1c19hdHRyc1tpXTsgaSsrKQorCQlidXNfcmVtb3ZlX2ZpbGUoJmllZWUxMzk0X2J1c190eXBlLCBmd19idXNfYXR0cnNbaV0pOworCWJ1c191bnJlZ2lzdGVyKCZpZWVlMTM5NF9idXNfdHlwZSk7CityZWxlYXNlX2RldmZzOgorCWRldmZzX3JlbW92ZSgiaWVlZTEzOTQiKTsKK3JlbGVhc2VfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihJRUVFMTM5NF9DT1JFX0RFViwgMjU2KTsKK2V4aXRfcmVsZWFzZV9rZXJuZWxfdGhyZWFkOgorCWlmIChraHBzYnBrdF9waWQgPj0gMCkgeworCQlraWxsX3Byb2Moa2hwc2Jwa3RfcGlkLCBTSUdURVJNLCAxKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigma2hwc2Jwa3RfY29tcGxldGUpOworCX0KK2V4aXRfY2xlYW51cF9jb25maWdfcm9tczoKKwlocHNiX2NsZWFudXBfY29uZmlnX3JvbXMoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWVlZTEzOTRfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJaWYgKCFkaXNhYmxlX25vZGVtZ3IpCisJCWNsZWFudXBfaWVlZTEzOTRfbm9kZW1ncigpOworCisJY2xlYW51cF9jc3IoKTsKKworCWNsYXNzX3NpbXBsZV9kZXN0cm95KGhwc2JfcHJvdG9jb2xfY2xhc3MpOworCWNsYXNzX3VucmVnaXN0ZXIoJmhwc2JfaG9zdF9jbGFzcyk7CisJZm9yIChpID0gMDsgZndfYnVzX2F0dHJzW2ldOyBpKyspCisJCWJ1c19yZW1vdmVfZmlsZSgmaWVlZTEzOTRfYnVzX3R5cGUsIGZ3X2J1c19hdHRyc1tpXSk7CisJYnVzX3VucmVnaXN0ZXIoJmllZWUxMzk0X2J1c190eXBlKTsKKworCWlmIChraHBzYnBrdF9waWQgPj0gMCkgeworCQlraHBzYnBrdF9raWxsID0gMTsKKwkJbWIoKTsKKwkJdXAoJmtocHNicGt0X3NpZyk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmtocHNicGt0X2NvbXBsZXRlKTsKKwl9CisKKwlocHNiX2NsZWFudXBfY29uZmlnX3JvbXMoKTsKKworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihJRUVFMTM5NF9DT1JFX0RFViwgMjU2KTsKKwlkZXZmc19yZW1vdmUoImllZWUxMzk0Iik7Cit9CisKK21vZHVsZV9pbml0KGllZWUxMzk0X2luaXQpOworbW9kdWxlX2V4aXQoaWVlZTEzOTRfY2xlYW51cCk7CisKKy8qIEV4cG9ydGVkIHN5bWJvbHMgKi8KKworLyoqIGhvc3RzLmMgKiovCitFWFBPUlRfU1lNQk9MKGhwc2JfYWxsb2NfaG9zdCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfYWRkX2hvc3QpOworRVhQT1JUX1NZTUJPTChocHNiX3JlbW92ZV9ob3N0KTsKK0VYUE9SVF9TWU1CT0woaHBzYl91cGRhdGVfY29uZmlnX3JvbV9pbWFnZSk7CisKKy8qKiBpZWVlMTM5NF9jb3JlLmMgKiovCitFWFBPUlRfU1lNQk9MKGhwc2Jfc3BlZWR0b19zdHIpOworRVhQT1JUX1NZTUJPTChocHNiX3Byb3RvY29sX2NsYXNzKTsKK0VYUE9SVF9TWU1CT0woaHBzYl9zZXRfcGFja2V0X2NvbXBsZXRlX3Rhc2spOworRVhQT1JUX1NZTUJPTChocHNiX2FsbG9jX3BhY2tldCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfZnJlZV9wYWNrZXQpOworRVhQT1JUX1NZTUJPTChocHNiX3NlbmRfcGh5X2NvbmZpZyk7CitFWFBPUlRfU1lNQk9MKGhwc2Jfc2VuZF9wYWNrZXQpOworRVhQT1JUX1NZTUJPTChocHNiX3NlbmRfcGFja2V0X2FuZF93YWl0KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9yZXNldF9idXMpOworRVhQT1JUX1NZTUJPTChocHNiX2J1c19yZXNldCk7CitFWFBPUlRfU1lNQk9MKGhwc2Jfc2VsZmlkX3JlY2VpdmVkKTsKK0VYUE9SVF9TWU1CT0woaHBzYl9zZWxmaWRfY29tcGxldGUpOworRVhQT1JUX1NZTUJPTChocHNiX3BhY2tldF9zZW50KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9wYWNrZXRfcmVjZWl2ZWQpOworRVhQT1JUX1NZTUJPTF9HUEwoaHBzYl9kaXNhYmxlX2lybSk7CisKKy8qKiBpZWVlMTM5NF90cmFuc2FjdGlvbnMuYyAqKi8KK0VYUE9SVF9TWU1CT0woaHBzYl9nZXRfdGxhYmVsKTsKK0VYUE9SVF9TWU1CT0woaHBzYl9mcmVlX3RsYWJlbCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfbWFrZV9yZWFkcGFja2V0KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9tYWtlX3dyaXRlcGFja2V0KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9tYWtlX3N0cmVhbXBhY2tldCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfbWFrZV9sb2NrcGFja2V0KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9tYWtlX2xvY2s2NHBhY2tldCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfbWFrZV9waHlwYWNrZXQpOworRVhQT1JUX1NZTUJPTChocHNiX21ha2VfaXNvcGFja2V0KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9yZWFkKTsKK0VYUE9SVF9TWU1CT0woaHBzYl93cml0ZSk7CitFWFBPUlRfU1lNQk9MKGhwc2JfbG9jayk7CitFWFBPUlRfU1lNQk9MKGhwc2JfcGFja2V0X3N1Y2Nlc3MpOworCisvKiogaGlnaGxldmVsLmMgKiovCitFWFBPUlRfU1lNQk9MKGhwc2JfcmVnaXN0ZXJfaGlnaGxldmVsKTsKK0VYUE9SVF9TWU1CT0woaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfcmVnaXN0ZXJfYWRkcnNwYWNlKTsKK0VYUE9SVF9TWU1CT0woaHBzYl91bnJlZ2lzdGVyX2FkZHJzcGFjZSk7CitFWFBPUlRfU1lNQk9MKGhwc2JfYWxsb2NhdGVfYW5kX3JlZ2lzdGVyX2FkZHJzcGFjZSk7CitFWFBPUlRfU1lNQk9MKGhwc2JfbGlzdGVuX2NoYW5uZWwpOworRVhQT1JUX1NZTUJPTChocHNiX3VubGlzdGVuX2NoYW5uZWwpOworRVhQT1JUX1NZTUJPTChocHNiX2dldF9ob3N0aW5mbyk7CitFWFBPUlRfU1lNQk9MKGhwc2JfY3JlYXRlX2hvc3RpbmZvKTsKK0VYUE9SVF9TWU1CT0woaHBzYl9kZXN0cm95X2hvc3RpbmZvKTsKK0VYUE9SVF9TWU1CT0woaHBzYl9zZXRfaG9zdGluZm9fa2V5KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9nZXRfaG9zdGluZm9fYnlrZXkpOworRVhQT1JUX1NZTUJPTChocHNiX3NldF9ob3N0aW5mbyk7CitFWFBPUlRfU1lNQk9MKGhpZ2hsZXZlbF9hZGRfaG9zdCk7CitFWFBPUlRfU1lNQk9MKGhpZ2hsZXZlbF9yZW1vdmVfaG9zdCk7CitFWFBPUlRfU1lNQk9MKGhpZ2hsZXZlbF9ob3N0X3Jlc2V0KTsKKworLyoqIG5vZGVtZ3IuYyAqKi8KK0VYUE9SVF9TWU1CT0woaHBzYl9ub2RlX2ZpbGxfcGFja2V0KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9ub2RlX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woaHBzYl9yZWdpc3Rlcl9wcm90b2NvbCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfdW5yZWdpc3Rlcl9wcm90b2NvbCk7CitFWFBPUlRfU1lNQk9MKGllZWUxMzk0X2J1c190eXBlKTsKK0VYUE9SVF9TWU1CT0wobm9kZW1ncl9mb3JfZWFjaF9ob3N0KTsKKworLyoqIGNzci5jICoqLworRVhQT1JUX1NZTUJPTChocHNiX3VwZGF0ZV9jb25maWdfcm9tKTsKKworLyoqIGRtYS5jICoqLworRVhQT1JUX1NZTUJPTChkbWFfcHJvZ19yZWdpb25faW5pdCk7CitFWFBPUlRfU1lNQk9MKGRtYV9wcm9nX3JlZ2lvbl9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKGRtYV9wcm9nX3JlZ2lvbl9mcmVlKTsKK0VYUE9SVF9TWU1CT0woZG1hX3JlZ2lvbl9pbml0KTsKK0VYUE9SVF9TWU1CT0woZG1hX3JlZ2lvbl9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKGRtYV9yZWdpb25fZnJlZSk7CitFWFBPUlRfU1lNQk9MKGRtYV9yZWdpb25fc3luY19mb3JfY3B1KTsKK0VYUE9SVF9TWU1CT0woZG1hX3JlZ2lvbl9zeW5jX2Zvcl9kZXZpY2UpOworRVhQT1JUX1NZTUJPTChkbWFfcmVnaW9uX21tYXApOworRVhQT1JUX1NZTUJPTChkbWFfcmVnaW9uX29mZnNldF90b19idXMpOworCisvKiogaXNvLmMgKiovCitFWFBPUlRfU1lNQk9MKGhwc2JfaXNvX3htaXRfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfaXNvX3JlY3ZfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfaXNvX3htaXRfc3RhcnQpOworRVhQT1JUX1NZTUJPTChocHNiX2lzb19yZWN2X3N0YXJ0KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9pc29fcmVjdl9saXN0ZW5fY2hhbm5lbCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfaXNvX3JlY3ZfdW5saXN0ZW5fY2hhbm5lbCk7CitFWFBPUlRfU1lNQk9MKGhwc2JfaXNvX3JlY3Zfc2V0X2NoYW5uZWxfbWFzayk7CitFWFBPUlRfU1lNQk9MKGhwc2JfaXNvX3N0b3ApOworRVhQT1JUX1NZTUJPTChocHNiX2lzb19zaHV0ZG93bik7CitFWFBPUlRfU1lNQk9MKGhwc2JfaXNvX3htaXRfcXVldWVfcGFja2V0KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9pc29feG1pdF9zeW5jKTsKK0VYUE9SVF9TWU1CT0woaHBzYl9pc29fcmVjdl9yZWxlYXNlX3BhY2tldHMpOworRVhQT1JUX1NZTUJPTChocHNiX2lzb19uX3JlYWR5KTsKK0VYUE9SVF9TWU1CT0woaHBzYl9pc29fcGFja2V0X3NlbnQpOworRVhQT1JUX1NZTUJPTChocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQpOworRVhQT1JUX1NZTUJPTChocHNiX2lzb193YWtlKTsKK0VYUE9SVF9TWU1CT0woaHBzYl9pc29fcmVjdl9mbHVzaCk7CisKKy8qKiBjc3IxMjEyLmMgKiovCitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfY3JlYXRlX2Nzcik7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfaW5pdF9sb2NhbF9jc3IpOworRVhQT1JUX1NZTUJPTChjc3IxMjEyX25ld19pbW1lZGlhdGUpOworRVhQT1JUX1NZTUJPTChjc3IxMjEyX25ld19kaXJlY3RvcnkpOworRVhQT1JUX1NZTUJPTChjc3IxMjEyX2Fzc29jaWF0ZV9rZXl2YWwpOworRVhQT1JUX1NZTUJPTChjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KTsKK0VYUE9SVF9TWU1CT0woY3NyMTIxMl9uZXdfc3RyaW5nX2Rlc2NyaXB0b3JfbGVhZik7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfZGV0YWNoX2tleXZhbF9mcm9tX2RpcmVjdG9yeSk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfcmVsZWFzZV9rZXl2YWwpOworRVhQT1JUX1NZTUJPTChjc3IxMjEyX2Rlc3Ryb3lfY3NyKTsKK0VYUE9SVF9TWU1CT0woY3NyMTIxMl9yZWFkKTsKK0VYUE9SVF9TWU1CT0woY3NyMTIxMl9nZW5lcmF0ZV9jc3JfaW1hZ2UpOworRVhQT1JUX1NZTUJPTChjc3IxMjEyX3BhcnNlX2tleXZhbCk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfcGFyc2VfY3NyKTsKK0VYUE9SVF9TWU1CT0woX2NzcjEyMTJfcmVhZF9rZXl2YWwpOworRVhQT1JUX1NZTUJPTChfY3NyMTIxMl9kZXN0cm95X2tleXZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuaCBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YjQ0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuaApAQCAtMCwwICsxLDIyOCBAQAorCisjaWZuZGVmIF9JRUVFMTM5NF9DT1JFX0gKKyNkZWZpbmUgX0lFRUUxMzk0X0NPUkVfSAorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSAiaG9zdHMuaCIKKworCitzdHJ1Y3QgaHBzYl9wYWNrZXQgeworICAgICAgICAvKiBUaGlzIHN0cnVjdCBpcyBiYXNpY2FsbHkgcmVhZC1vbmx5IGZvciBob3N0cyB3aXRoIHRoZSBleGNlcHRpb24gb2YKKyAgICAgICAgICogdGhlIGRhdGEgYnVmZmVyIGNvbnRlbnRzIGFuZCB4bmV4dCAtIHNlZSBiZWxvdy4gKi8KKworCS8qIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGhvc3QgZHJpdmVyIGludGVybmFsIGxpbmtpbmcuCisJICoKKwkgKiBOT1RFOiBUaGlzIG11c3QgYmUgbGVmdCBpbiBpbml0IHN0YXRlIHdoZW4gdGhlIGRyaXZlciBpcyBkb25lCisJICogd2l0aCBpdCAoZS5nLiBieSB1c2luZyBsaXN0X2RlbF9pbml0KCkpLCBzaW5jZSB0aGUgY29yZSBkb2VzCisJICogc29tZSBzYW5pdHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgcGFja2V0IGlzIG5vdCBvbiBhCisJICogZHJpdmVyX2xpc3Qgd2hlbiBmcmVlJ2luZyBpdC4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRyaXZlcl9saXN0OworCisgICAgICAgIG5vZGVpZF90IG5vZGVfaWQ7CisKKyAgICAgICAgLyogQXN5bmMgYW5kIElzbyB0eXBlcyBzaG91bGQgYmUgY2xlYXIsIHJhdyBtZWFucyBzZW5kLWFzLWlzLCBkbyBub3QKKyAgICAgICAgICogQ1JDISAgQnl0ZSBzd2FwcGluZyBzaGFsbCBzdGlsbCBiZSBkb25lIGluIHRoaXMgY2FzZS4gKi8KKyAgICAgICAgZW51bSB7IGhwc2JfYXN5bmMsIGhwc2JfaXNvLCBocHNiX3JhdyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHR5cGU7CisKKyAgICAgICAgLyogT2theSwgdGhpcyBpcyBjb3JlIGludGVybmFsIGFuZCBhIG5vIGNhcmUgZm9yIGhvc3RzLgorICAgICAgICAgKiBxdWV1ZWQgICA9IHF1ZXVlZCBmb3Igc2VuZGluZworICAgICAgICAgKiBwZW5kaW5nICA9IHNlbnQsIHdhaXRpbmcgZm9yIHJlc3BvbnNlCisgICAgICAgICAqIGNvbXBsZXRlID0gcHJvY2Vzc2luZyBjb21wbGV0ZWQsIHN1Y2Nlc3NmdWwgb3Igbm90CisgICAgICAgICAqLworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgICAgICBocHNiX3VudXNlZCwgaHBzYl9xdWV1ZWQsIGhwc2JfcGVuZGluZywgaHBzYl9jb21wbGV0ZQorICAgICAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHN0YXRlOworCisgICAgICAgIC8qIFRoZXNlIGFyZSBjb3JlIGludGVybmFsLiAqLworICAgICAgICBzaWduZWQgY2hhciB0bGFiZWw7CisgICAgICAgIGNoYXIgYWNrX2NvZGU7CisgICAgICAgIGNoYXIgdGNvZGU7CisKKyAgICAgICAgdW5zaWduZWQgZXhwZWN0X3Jlc3BvbnNlOjE7CisgICAgICAgIHVuc2lnbmVkIG5vX3dhaXRlcjoxOworCisgICAgICAgIC8qIFNwZWVkIHRvIHRyYW5zbWl0IHdpdGg6IDAgPSAxMDBNYnBzLCAxID0gMjAwTWJwcywgMiA9IDQwME1icHMgKi8KKyAgICAgICAgdW5zaWduZWQgc3BlZWRfY29kZToyOworCisgICAgICAgIC8qCisgICAgICAgICAqICpoZWFkZXIgYW5kICpkYXRhIGFyZSBndWFyYW50ZWVkIHRvIGJlIDMyLWJpdCBETUFhYmxlIGFuZCBtYXkgYmUKKyAgICAgICAgICogb3ZlcndyaXR0ZW4gdG8gYWxsb3cgaW4tcGxhY2UgYnl0ZSBzd2FwcGluZy4gIE5laXRoZXIgb2YgdGhlc2UgaXMKKyAgICAgICAgICogQ1JDZWQgKHRoZSBzaXplcyBhbHNvIGRvbid0IGluY2x1ZGUgQ1JDKSwgYnV0IGNvbnRhaW4gc3BhY2UgZm9yIGF0CisgICAgICAgICAqIGxlYXN0IG9uZSBhZGRpdGlvbmFsIHF1YWRsZXQgdG8gYWxsb3cgaW4tcGxhY2UgQ1JDaW5nLiAgVGhlIG1lbW9yeSBpcworICAgICAgICAgKiBhbHNvIGd1YXJhbnRlZWQgdG8gYmUgRE1BIG1hcHBhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgcXVhZGxldF90ICpoZWFkZXI7CisgICAgICAgIHF1YWRsZXRfdCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IGhlYWRlcl9zaXplOworICAgICAgICBzaXplX3QgZGF0YV9zaXplOworCisKKyAgICAgICAgc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKKyAgICAgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247CisKKwlhdG9taWNfdCByZWZjbnQ7CisKKwkvKiBGdW5jdGlvbiAoYW5kIHBvc3NpYmxlIGRhdGEgdG8gcGFzcyB0byBpdCkgdG8gY2FsbCB3aGVuIHRoaXMKKwkgKiBwYWNrZXQgaXMgY29tcGxldGVkLiAgKi8KKwl2b2lkICgqY29tcGxldGVfcm91dGluZSkodm9pZCAqKTsKKwl2b2lkICpjb21wbGV0ZV9kYXRhOworCisJLyogWFhYIFRoaXMgaXMganVzdCBhIGhhY2sgYXQgdGhlIG1vbWVudCAqLworCXN0cnVjdCBza19idWZmICpza2I7CisKKyAgICAgICAgLyogU3RvcmUgamlmZmllcyBmb3IgaW1wbGVtZW50aW5nIGJ1cyB0aW1lb3V0cy4gKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyBzZW5kdGltZTsKKworICAgICAgICBxdWFkbGV0X3QgZW1iZWRkZWRfaGVhZGVyWzVdOworfTsKKworLyogU2V0IGEgdGFzayBmb3Igd2hlbiBhIHBhY2tldCBjb21wbGV0ZXMgKi8KK3ZvaWQgaHBzYl9zZXRfcGFja2V0X2NvbXBsZXRlX3Rhc2soc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQsCisJCXZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICpkYXRhKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHBzYl9wYWNrZXQgKmRyaXZlcl9wYWNrZXQoc3RydWN0IGxpc3RfaGVhZCAqbCkKK3sKKwlyZXR1cm4gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgaHBzYl9wYWNrZXQsIGRyaXZlcl9saXN0KTsKK30KKwordm9pZCBhYm9ydF90aW1lZG91dHModW5zaWduZWQgbG9uZyBfX29wYXF1ZSk7CisKK3N0cnVjdCBocHNiX3BhY2tldCAqaHBzYl9hbGxvY19wYWNrZXQoc2l6ZV90IGRhdGFfc2l6ZSk7Cit2b2lkIGhwc2JfZnJlZV9wYWNrZXQoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpOworCisKKy8qCisgKiBHZW5lcmF0aW9uIGNvdW50ZXIgZm9yIHRoZSBjb21wbGV0ZSAxMzk0IHN1YnN5c3RlbS4gIEdlbmVyYXRpb24gZ2V0cworICogaW5jcmVtZW50ZWQgb24gZXZlcnkgY2hhbmdlIGluIHRoZSBzdWJzeXN0ZW0gKGUuZy4gYnVzIHJlc2V0KS4KKyAqCisgKiBVc2UgdGhlIGZ1bmN0aW9ucywgbm90IHRoZSB2YXJpYWJsZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X2hwc2JfZ2VuZXJhdGlvbihzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworICAgICAgICByZXR1cm4gYXRvbWljX3JlYWQoJmhvc3QtPmdlbmVyYXRpb24pOworfQorCisvKgorICogU2VuZCBhIFBIWSBjb25maWd1cmF0aW9uIHBhY2tldCwgcmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUKKyAqIGVycm5vIG9uIGZhaWx1cmUuCisgKi8KK2ludCBocHNiX3NlbmRfcGh5X2NvbmZpZyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgcm9vdGlkLCBpbnQgZ2FwY250KTsKKworLyoKKyAqIFF1ZXVlIHBhY2tldCBmb3IgdHJhbnNtaXR0aW5nLCByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubworICogb24gZmFpbHVyZS4KKyAqLworaW50IGhwc2Jfc2VuZF9wYWNrZXQoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpOworCisvKgorICogUXVldWUgcGFja2V0IGZvciB0cmFuc21pdHRpbmcsIGFuZCBibG9jayB1bnRpbCB0aGUgdHJhbnNhY3Rpb24KKyAqIGNvbXBsZXRlcy4gUmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS4KKyAqLworaW50IGhwc2Jfc2VuZF9wYWNrZXRfYW5kX3dhaXQoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpOworCisvKiBJbml0aWF0ZSBidXMgcmVzZXQgb24gdGhlIGdpdmVuIGhvc3QuICBSZXR1cm5zIDEgaWYgYnVzIHJlc2V0IGFscmVhZHkgaW4KKyAqIHByb2dyZXNzLCAwIG90aGVyd2lzZS4gKi8KK2ludCBocHNiX3Jlc2V0X2J1cyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgdHlwZSk7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZm9yIGhvc3QgZHJpdmVyIG1vZHVsZSB1c2FnZS4gIEFsbCBvZgorICogdGhlbSBhcmUgc2FmZSB0byB1c2UgaW4gaW50ZXJydXB0IGNvbnRleHRzLCBhbHRob3VnaCBzb21lIGFyZSBxdWl0ZQorICogY29tcGxpY2F0ZWQgc28geW91IG1heSB3YW50IHRvIHJ1biB0aGVtIGluIGJvdHRvbSBoYWx2ZXMgaW5zdGVhZCBvZiBjYWxsaW5nCisgKiB0aGVtIGRpcmVjdGx5LgorICovCisKKy8qIE5vdGlmeSBhIGJ1cyByZXNldCB0byB0aGUgY29yZS4gIFJldHVybnMgMSBpZiBidXMgcmVzZXQgYWxyZWFkeSBpbiBwcm9ncmVzcywKKyAqIDAgb3RoZXJ3aXNlLiAqLworaW50IGhwc2JfYnVzX3Jlc2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpOworCisvKgorICogSGFuZCBvdmVyIHJlY2VpdmVkIHNlbGZpZCBwYWNrZXQgdG8gdGhlIGNvcmUuICBDb21wbGVtZW50IGNoZWNrIChzZWNvbmQKKyAqIHF1YWRsZXQgaXMgY29tcGxlbWVudCBvZiBmaXJzdCkgaXMgZXhwZWN0ZWQgdG8gYmUgZG9uZSBhbmQgc3VjY2VzZnVsLgorICovCit2b2lkIGhwc2Jfc2VsZmlkX3JlY2VpdmVkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHF1YWRsZXRfdCBzaWQpOworCisvKgorICogTm90aWZ5IGNvbXBsZXRpb24gb2YgU2VsZklEIHN0YWdlIHRvIHRoZSBjb3JlIGFuZCByZXBvcnQgbmV3IHBoeXNpY2FsIElECisgKiBhbmQgd2hldGhlciBob3N0IGlzIHJvb3Qgbm93LgorICovCit2b2lkIGhwc2Jfc2VsZmlkX2NvbXBsZXRlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBwaHlpZCwgaW50IGlzcm9vdCk7CisKKy8qCisgKiBOb3RpZnkgY29yZSBvZiBzZW5kaW5nIGEgcGFja2V0LiAgQWNrY29kZSBpcyB0aGUgYWNrIGNvZGUgcmV0dXJuZWQgZm9yIGFzeW5jCisgKiB0cmFuc21pdHMgb3IgQUNLWF9TRU5EX0VSUk9SIGlmIHRoZSB0cmFuc21pc3Npb24gZmFpbGVkIGNvbXBsZXRlbHk7IEFDS1hfTk9ORQorICogZm9yIG90aGVyIGNhc2VzIChpbnRlcm5hbCBlcnJvcnMgdGhhdCBkb24ndCBqdXN0aWZ5IGEgcGFuaWMpLiAgU2FmZSB0byBjYWxsCisgKiBmcm9tIHdpdGhpbiBhIHRyYW5zbWl0IHBhY2tldCByb3V0aW5lLgorICovCit2b2lkIGhwc2JfcGFja2V0X3NlbnQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFja2NvZGUpOworCisvKgorICogSGFuZCBvdmVyIHJlY2VpdmVkIHBhY2tldCB0byB0aGUgY29yZS4gIFRoZSBjb250ZW50cyBvZiBkYXRhIGFyZSBleHBlY3RlZCB0bworICogYmUgdGhlIGZ1bGwgcGFja2V0IGJ1dCB3aXRoIHRoZSBDUkNzIGxlZnQgb3V0IChkYXRhIGJsb2NrIGZvbGxvd3MgaGVhZGVyCisgKiBpbW1lZGlhdGVseSksIHdpdGggdGhlIGhlYWRlciAoaS5lLiB0aGUgZmlyc3QgZm91ciBxdWFkbGV0cykgaW4gbWFjaGluZSBieXRlCisgKiBvcmRlciBhbmQgdGhlIGRhdGEgYmxvY2sgaW4gYmlnIGVuZGlhbi4gICpkYXRhIGNhbiBiZSBzYWZlbHkgb3ZlcndyaXR0ZW4KKyAqIGFmdGVyIHRoaXMgY2FsbC4KKyAqCisgKiBJZiB0aGUgcGFja2V0IGlzIGEgd3JpdGUgcmVxdWVzdCwgd3JpdGVfYWNrZWQgaXMgdG8gYmUgc2V0IHRvIHRydWUgaWYgaXQgd2FzCisgKiBhY2tfY29tcGxldGUnZCBhbHJlYWR5LCBmYWxzZSBvdGhlcndpc2UuICBUaGlzIGFyZyBpcyBpZ25vcmVkIGZvciBhbnkgb3RoZXIKKyAqIHBhY2tldCB0eXBlLgorICovCit2b2lkIGhwc2JfcGFja2V0X3JlY2VpdmVkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHF1YWRsZXRfdCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3cml0ZV9hY2tlZCk7CisKKworLyoKKyAqIENIQVJBQ1RFUiBERVZJQ0UgRElTUEFUQ0hJTkcKKyAqCisgKiBBbGwgaWVlZTEzOTQgY2hhcmFjdGVyIGRldmljZSBkcml2ZXJzIHNoYXJlIHRoZSBzYW1lIG1ham9yIG51bWJlcgorICogKG1ham9yIDE3MSkuICBUaGUgMjU2IG1pbm9yIG51bWJlcnMgYXJlIGFsbG9jYXRlZCB0byB0aGUgdmFyaW91cworICogdGFzay1zcGVjaWZpYyBpbnRlcmZhY2VzIChyYXcxMzk0LCB2aWRlbzEzOTQsIGR2MTM5NCwgZXRjKSBpbgorICogYmxvY2tzIG9mIDE2LgorICoKKyAqIFRoZSBjb3JlIGllZWUxMzk0Lm8gbW9kdWxlIGFsbG9jYXRlcyB0aGUgZGV2aWNlIG51bWJlciByZWdpb24KKyAqIDE3MTowLTI1NSwgdGhlIHZhcmlvdXMgZHJpdmVycyBtdXN0IHRoZW4gY2Rldl9hZGQoKSB0aGVpciBjZGV2CisgKiBvYmplY3RzIHRvIGhhbmRsZSB0aGVpciByZXNwZWN0aXZlIHN1Yi1yZWdpb25zLgorICoKKyAqIE1pbm9yIGRldmljZSBudW1iZXIgYmxvY2sgYWxsb2NhdGlvbnM6CisgKgorICogQmxvY2sgMCAgKCAgMC0gMTUpICByYXcxMzk0CisgKiBCbG9jayAxICAoIDE2LSAzMSkgIHZpZGVvMTM5NAorICogQmxvY2sgMiAgKCAzMi0gNDcpICBkdjEzOTQKKyAqCisgKiBCbG9ja3MgMy0xNCBmcmVlIGZvciBmdXR1cmUgYWxsb2NhdGlvbgorICoKKyAqIEJsb2NrIDE1ICgyNDAtMjU1KSAgcmVzZXJ2ZWQgZm9yIGRyaXZlcnMgdW5kZXIgZGV2ZWxvcG1lbnQsIGV0Yy4KKyAqLworCisjZGVmaW5lIElFRUUxMzk0X01BSk9SICAgICAgICAgICAgICAgMTcxCisKKyNkZWZpbmUgSUVFRTEzOTRfTUlOT1JfQkxPQ0tfUkFXMTM5NCAgICAgICAwCisjZGVmaW5lIElFRUUxMzk0X01JTk9SX0JMT0NLX1ZJREVPMTM5NCAgICAgMQorI2RlZmluZSBJRUVFMTM5NF9NSU5PUl9CTE9DS19EVjEzOTQgICAgICAgIDIKKyNkZWZpbmUgSUVFRTEzOTRfTUlOT1JfQkxPQ0tfQU1EVFAgICAgICAgICAzCisjZGVmaW5lIElFRUUxMzk0X01JTk9SX0JMT0NLX0VYUEVSSU1FTlRBTCAxNQorCisjZGVmaW5lIElFRUUxMzk0X0NPUkVfREVWCQlNS0RFVihJRUVFMTM5NF9NQUpPUiwgMCkKKyNkZWZpbmUgSUVFRTEzOTRfUkFXMTM5NF9ERVYJCU1LREVWKElFRUUxMzk0X01BSk9SLCBJRUVFMTM5NF9NSU5PUl9CTE9DS19SQVcxMzk0ICogMTYpCisjZGVmaW5lIElFRUUxMzk0X1ZJREVPMTM5NF9ERVYJCU1LREVWKElFRUUxMzk0X01BSk9SLCBJRUVFMTM5NF9NSU5PUl9CTE9DS19WSURFTzEzOTQgKiAxNikKKyNkZWZpbmUgSUVFRTEzOTRfRFYxMzk0X0RFVgkJTUtERVYoSUVFRTEzOTRfTUFKT1IsIElFRUUxMzk0X01JTk9SX0JMT0NLX0RWMTM5NCAqIDE2KQorI2RlZmluZSBJRUVFMTM5NF9BTURUUF9ERVYJCU1LREVWKElFRUUxMzk0X01BSk9SLCBJRUVFMTM5NF9NSU5PUl9CTE9DS19BTURUUCAqIDE2KQorI2RlZmluZSBJRUVFMTM5NF9FWFBFUklNRU5UQUxfREVWCU1LREVWKElFRUUxMzk0X01BSk9SLCBJRUVFMTM5NF9NSU5PUl9CTE9DS19FWFBFUklNRU5UQUwgKiAxNikKKworLyogcmV0dXJuIHRoZSBpbmRleCAod2l0aGluIGEgbWlub3IgbnVtYmVyIGJsb2NrKSBvZiBhIGZpbGUgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBpZWVlMTM5NF9maWxlX3RvX2luc3RhbmNlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9jaW5kZXg7Cit9CisKK2V4dGVybiBpbnQgaHBzYl9kaXNhYmxlX2lybTsKKworLyogT3VyIHN5c2ZzIGJ1cyBlbnRyeSAqLworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpZWVlMTM5NF9idXNfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgaHBzYl9ob3N0X2NsYXNzOworZXh0ZXJuIHN0cnVjdCBjbGFzc19zaW1wbGUgKmhwc2JfcHJvdG9jb2xfY2xhc3M7CisKKyNlbmRpZiAvKiBfSUVFRTEzOTRfQ09SRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2hvdHBsdWcuaCBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfaG90cGx1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTcwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2hvdHBsdWcuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9JRUVFMTM5NF9IT1RQTFVHX0gKKyNkZWZpbmUgX0lFRUUxMzk0X0hPVFBMVUdfSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKworLyogVW5pdCBzcGVjIGlkIGFuZCBzdyB2ZXJzaW9uIGVudHJ5IGZvciBzb21lIHByb3RvY29scyAqLworI2RlZmluZSBBVkNfVU5JVF9TUEVDX0lEX0VOVFJZCQkweDAwMDBBMDJECisjZGVmaW5lIEFWQ19TV19WRVJTSU9OX0VOVFJZCQkweDAwMDEwMDAxCisjZGVmaW5lIENBTUVSQV9VTklUX1NQRUNfSURfRU5UUlkJMHgwMDAwQTAyRAorI2RlZmluZSBDQU1FUkFfU1dfVkVSU0lPTl9FTlRSWQkJMHgwMDAwMDEwMAorCisvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhpcyBhbGwgaXNuJ3QgYWxyZWFkeSBkZWZpbmVkICovCisjaWZuZGVmIElFRUUxMzk0X01BVENIX1ZFTkRPUl9JRAorCisjZGVmaW5lIElFRUUxMzk0X01BVENIX1ZFTkRPUl9JRAkweDAwMDEKKyNkZWZpbmUgSUVFRTEzOTRfTUFUQ0hfTU9ERUxfSUQJCTB4MDAwMgorI2RlZmluZSBJRUVFMTM5NF9NQVRDSF9TUEVDSUZJRVJfSUQJMHgwMDA0CisjZGVmaW5lIElFRUUxMzk0X01BVENIX1ZFUlNJT04JCTB4MDAwOAorCitzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkIHsKKwl1MzIgbWF0Y2hfZmxhZ3M7CisJdTMyIHZlbmRvcl9pZDsKKwl1MzIgbW9kZWxfaWQ7CisJdTMyIHNwZWNpZmllcl9pZDsKKwl1MzIgdmVyc2lvbjsKKwl2b2lkICpkcml2ZXJfZGF0YTsKK307CisKKyNlbmRpZgorCisjZW5kaWYgLyogX0lFRUUxMzk0X0hPVFBMVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF90cmFuc2FjdGlvbnMuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfdHJhbnNhY3Rpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5MDhiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfdHJhbnNhY3Rpb25zLmMKQEAgLTAsMCArMSw2MDEgQEAKKy8qCisgKiBJRUVFIDEzOTQgZm9yIExpbnV4CisgKgorICogVHJhbnNhY3Rpb24gc3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQW5kcmVhcyBFLiBCb21iZQorICoKKyAqIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHJvb3QKKyAqIGRpcmVjdG9yeSBvZiB0aGUga2VybmVsIHNvdXJjZXMgZm9yIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjaW5jbHVkZSAiaWVlZTEzOTQuaCIKKyNpbmNsdWRlICJpZWVlMTM5NF90eXBlcy5oIgorI2luY2x1ZGUgImhvc3RzLmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfY29yZS5oIgorI2luY2x1ZGUgImhpZ2hsZXZlbC5oIgorI2luY2x1ZGUgIm5vZGVtZ3IuaCIKKworCisjZGVmaW5lIFBSRVBfQVNZTkNfSEVBRF9BRERSRVNTKHRjKSBcCisgICAgICAgIHBhY2tldC0+dGNvZGUgPSB0YzsgXAorICAgICAgICBwYWNrZXQtPmhlYWRlclswXSA9IChwYWNrZXQtPm5vZGVfaWQgPDwgMTYpIHwgKHBhY2tldC0+dGxhYmVsIDw8IDEwKSBcCisgICAgICAgICAgICAgICAgfCAoMSA8PCA4KSB8ICh0YyA8PCA0KTsgXAorICAgICAgICBwYWNrZXQtPmhlYWRlclsxXSA9IChwYWNrZXQtPmhvc3QtPm5vZGVfaWQgPDwgMTYpIHwgKGFkZHIgPj4gMzIpOyBcCisgICAgICAgIHBhY2tldC0+aGVhZGVyWzJdID0gYWRkciAmIDB4ZmZmZmZmZmYKKworCitzdGF0aWMgdm9pZCBmaWxsX2FzeW5jX3JlYWRxdWFkKHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0LCB1NjQgYWRkcikKK3sKKyAgICAgICAgUFJFUF9BU1lOQ19IRUFEX0FERFJFU1MoVENPREVfUkVBRFEpOworICAgICAgICBwYWNrZXQtPmhlYWRlcl9zaXplID0gMTI7CisgICAgICAgIHBhY2tldC0+ZGF0YV9zaXplID0gMDsKKyAgICAgICAgcGFja2V0LT5leHBlY3RfcmVzcG9uc2UgPSAxOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2FzeW5jX3JlYWRibG9jayhzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCwgdTY0IGFkZHIsIGludCBsZW5ndGgpCit7CisgICAgICAgIFBSRVBfQVNZTkNfSEVBRF9BRERSRVNTKFRDT0RFX1JFQURCKTsKKyAgICAgICAgcGFja2V0LT5oZWFkZXJbM10gPSBsZW5ndGggPDwgMTY7CisgICAgICAgIHBhY2tldC0+aGVhZGVyX3NpemUgPSAxNjsKKyAgICAgICAgcGFja2V0LT5kYXRhX3NpemUgPSAwOworICAgICAgICBwYWNrZXQtPmV4cGVjdF9yZXNwb25zZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfYXN5bmNfd3JpdGVxdWFkKHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0LCB1NjQgYWRkciwgcXVhZGxldF90IGRhdGEpCit7CisgICAgICAgIFBSRVBfQVNZTkNfSEVBRF9BRERSRVNTKFRDT0RFX1dSSVRFUSk7CisgICAgICAgIHBhY2tldC0+aGVhZGVyWzNdID0gZGF0YTsKKyAgICAgICAgcGFja2V0LT5oZWFkZXJfc2l6ZSA9IDE2OworICAgICAgICBwYWNrZXQtPmRhdGFfc2l6ZSA9IDA7CisgICAgICAgIHBhY2tldC0+ZXhwZWN0X3Jlc3BvbnNlID0gMTsKK30KKworc3RhdGljIHZvaWQgZmlsbF9hc3luY193cml0ZWJsb2NrKHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0LCB1NjQgYWRkciwgaW50IGxlbmd0aCkKK3sKKyAgICAgICAgUFJFUF9BU1lOQ19IRUFEX0FERFJFU1MoVENPREVfV1JJVEVCKTsKKyAgICAgICAgcGFja2V0LT5oZWFkZXJbM10gPSBsZW5ndGggPDwgMTY7CisgICAgICAgIHBhY2tldC0+aGVhZGVyX3NpemUgPSAxNjsKKyAgICAgICAgcGFja2V0LT5leHBlY3RfcmVzcG9uc2UgPSAxOworICAgICAgICBwYWNrZXQtPmRhdGFfc2l6ZSA9IGxlbmd0aCArIChsZW5ndGggJSA0ID8gNCAtIChsZW5ndGggJSA0KSA6IDApOworfQorCitzdGF0aWMgdm9pZCBmaWxsX2FzeW5jX2xvY2soc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQsIHU2NCBhZGRyLCBpbnQgZXh0Y29kZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpCit7CisgICAgICAgIFBSRVBfQVNZTkNfSEVBRF9BRERSRVNTKFRDT0RFX0xPQ0tfUkVRVUVTVCk7CisgICAgICAgIHBhY2tldC0+aGVhZGVyWzNdID0gKGxlbmd0aCA8PCAxNikgfCBleHRjb2RlOworICAgICAgICBwYWNrZXQtPmhlYWRlcl9zaXplID0gMTY7CisgICAgICAgIHBhY2tldC0+ZGF0YV9zaXplID0gbGVuZ3RoOworICAgICAgICBwYWNrZXQtPmV4cGVjdF9yZXNwb25zZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfaXNvX3BhY2tldChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCwgaW50IGxlbmd0aCwgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdGFnLCBpbnQgc3luYykKK3sKKyAgICAgICAgcGFja2V0LT5oZWFkZXJbMF0gPSAobGVuZ3RoIDw8IDE2KSB8ICh0YWcgPDwgMTQpIHwgKGNoYW5uZWwgPDwgOCkKKyAgICAgICAgICAgICAgICB8IChUQ09ERV9JU09fREFUQSA8PCA0KSB8IHN5bmM7CisKKyAgICAgICAgcGFja2V0LT5oZWFkZXJfc2l6ZSA9IDQ7CisgICAgICAgIHBhY2tldC0+ZGF0YV9zaXplID0gbGVuZ3RoOworICAgICAgICBwYWNrZXQtPnR5cGUgPSBocHNiX2lzbzsKKyAgICAgICAgcGFja2V0LT50Y29kZSA9IFRDT0RFX0lTT19EQVRBOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3BoeV9wYWNrZXQoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQsIHF1YWRsZXRfdCBkYXRhKQoreworICAgICAgICBwYWNrZXQtPmhlYWRlclswXSA9IGRhdGE7CisgICAgICAgIHBhY2tldC0+aGVhZGVyWzFdID0gfmRhdGE7CisgICAgICAgIHBhY2tldC0+aGVhZGVyX3NpemUgPSA4OworICAgICAgICBwYWNrZXQtPmRhdGFfc2l6ZSA9IDA7CisgICAgICAgIHBhY2tldC0+ZXhwZWN0X3Jlc3BvbnNlID0gMDsKKyAgICAgICAgcGFja2V0LT50eXBlID0gaHBzYl9yYXc7ICAgICAgICAgICAgIC8qIE5vIENSQyBhZGRlZCAqLworICAgICAgICBwYWNrZXQtPnNwZWVkX2NvZGUgPSBJRUVFMTM5NF9TUEVFRF8xMDA7IC8qIEZvcmNlIHNwZWVkIHRvIGJlIDEwME1icHMgKi8KK30KKworc3RhdGljIHZvaWQgZmlsbF9hc3luY19zdHJlYW1fcGFja2V0KHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0LCBpbnQgbGVuZ3RoLAorCQkJCSAgICAgaW50IGNoYW5uZWwsIGludCB0YWcsIGludCBzeW5jKQoreworCXBhY2tldC0+aGVhZGVyWzBdID0gKGxlbmd0aCA8PCAxNikgfCAodGFnIDw8IDE0KSB8IChjaGFubmVsIDw8IDgpCisJICAgICAgICAgICAgICAgICAgfCAoVENPREVfU1RSRUFNX0RBVEEgPDwgNCkgfCBzeW5jOworCisJcGFja2V0LT5oZWFkZXJfc2l6ZSA9IDQ7CisJcGFja2V0LT5kYXRhX3NpemUgPSBsZW5ndGg7CisJcGFja2V0LT50eXBlID0gaHBzYl9hc3luYzsKKwlwYWNrZXQtPnRjb2RlID0gVENPREVfSVNPX0RBVEE7Cit9CisKKy8qKgorICogaHBzYl9nZXRfdGxhYmVsIC0gYWxsb2NhdGUgYSB0cmFuc2FjdGlvbiBsYWJlbAorICogQHBhY2tldDogdGhlIHBhY2tldCB3aG8ncyB0bGFiZWwvdHBvb2wgd2Ugc2V0CisgKgorICogRXZlcnkgYXN5bmNocm9ub3VzIHRyYW5zYWN0aW9uIG9uIHRoZSAxMzk0IGJ1cyBuZWVkcyBhIHRyYW5zYWN0aW9uCisgKiBsYWJlbCB0byBtYXRjaCB0aGUgcmVzcG9uc2UgdG8gdGhlIHJlcXVlc3QuICBUaGlzIGxhYmVsIGhhcyB0byBiZQorICogZGlmZmVyZW50IGZyb20gYW55IG90aGVyIHRyYW5zYWN0aW9uIGxhYmVsIGluIGFuIG91dHN0YW5kaW5nIHJlcXVlc3QgdG8KKyAqIHRoZSBzYW1lIG5vZGUgdG8gbWFrZSBtYXRjaGluZyBwb3NzaWJsZSB3aXRob3V0IGFtYmlndWl0eS4KKyAqCisgKiBUaGVyZSBhcmUgNjQgZGlmZmVyZW50IHRsYWJlbHMsIHNvIGFuIGFsbG9jYXRlZCB0bGFiZWwgaGFzIHRvIGJlIGZyZWVkCisgKiB3aXRoIGhwc2JfZnJlZV90bGFiZWwoKSBhZnRlciB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUgKHVubGVzcyBpdCdzCisgKiByZXVzZWQgYWdhaW4gZm9yIHRoZSBzYW1lIHRhcmdldCBub2RlKS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IFplcm8gb24gc3VjY2Vzcywgb3RoZXJ3aXNlIG5vbi16ZXJvLiBBIG5vbi16ZXJvIHJldHVybgorICogZ2VuZXJhbGx5IG1lYW5zIHRoZXJlIGFyZSBubyBhdmFpbGFibGUgdGxhYmVscy4gSWYgdGhpcyBpcyBjYWxsZWQgb3V0CisgKiBvZiBpbnRlcnJ1cHQgb3IgYXRvbWljIGNvbnRleHQsIHRoZW4gaXQgd2lsbCBzbGVlcCB1bnRpbCBjYW4gcmV0dXJuIGEKKyAqIHRsYWJlbC4KKyAqLworaW50IGhwc2JfZ2V0X3RsYWJlbChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBocHNiX3RsYWJlbF9wb29sICp0cDsKKworCXRwID0gJnBhY2tldC0+aG9zdC0+dHBvb2xbcGFja2V0LT5ub2RlX2lkICYgTk9ERV9NQVNLXTsKKworCWlmIChpcnFzX2Rpc2FibGVkKCkgfHwgaW5fYXRvbWljKCkpIHsKKwkJaWYgKGRvd25fdHJ5bG9jaygmdHAtPmNvdW50KSkKKwkJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWRvd24oJnRwLT5jb3VudCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlwYWNrZXQtPnRsYWJlbCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh0cC0+cG9vbCwgNjQsIHRwLT5uZXh0KTsKKwlpZiAocGFja2V0LT50bGFiZWwgPiA2MykKKwkJcGFja2V0LT50bGFiZWwgPSBmaW5kX2ZpcnN0X3plcm9fYml0KHRwLT5wb29sLCA2NCk7CisJdHAtPm5leHQgPSAocGFja2V0LT50bGFiZWwgKyAxKSAlIDY0OworCS8qIFNob3VsZCBfbmV2ZXJfIGhhcHBlbiAqLworCUJVR19PTih0ZXN0X2FuZF9zZXRfYml0KHBhY2tldC0+dGxhYmVsLCB0cC0+cG9vbCkpOworCXRwLT5hbGxvY2F0aW9ucysrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBocHNiX2ZyZWVfdGxhYmVsIC0gZnJlZSBhbiBhbGxvY2F0ZWQgdHJhbnNhY3Rpb24gbGFiZWwKKyAqIEBwYWNrZXQ6IHBhY2tldCB3aG9zIHRsYWJlbC90cG9vbCBuZWVkcyB0byBiZSBjbGVhcmVkCisgKgorICogRnJlZXMgdGhlIHRyYW5zYWN0aW9uIGxhYmVsIGFsbG9jYXRlZCB3aXRoIGhwc2JfZ2V0X3RsYWJlbCgpLiAgVGhlCisgKiB0bGFiZWwgaGFzIHRvIGJlIGZyZWVkIGFmdGVyIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZSAoaS5lLiByZXNwb25zZQorICogd2FzIHJlY2VpdmVkIGZvciBhIHNwbGl0IHRyYW5zYWN0aW9uIG9yIHBhY2tldCB3YXMgc2VudCBmb3IgYSB1bmlmaWVkCisgKiB0cmFuc2FjdGlvbikuCisgKgorICogQSB0bGFiZWwgbXVzdCBub3QgYmUgZnJlZWQgdHdpY2UuCisgKi8KK3ZvaWQgaHBzYl9mcmVlX3RsYWJlbChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaHBzYl90bGFiZWxfcG9vbCAqdHA7CisKKwl0cCA9ICZwYWNrZXQtPmhvc3QtPnRwb29sW3BhY2tldC0+bm9kZV9pZCAmIE5PREVfTUFTS107CisKKwlCVUdfT04ocGFja2V0LT50bGFiZWwgPiA2MyB8fCBwYWNrZXQtPnRsYWJlbCA8IDApOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCUJVR19PTighdGVzdF9hbmRfY2xlYXJfYml0KHBhY2tldC0+dGxhYmVsLCB0cC0+cG9vbCkpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJdXAoJnRwLT5jb3VudCk7Cit9CisKKworCitpbnQgaHBzYl9wYWNrZXRfc3VjY2VzcyhzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCkKK3sKKyAgICAgICAgc3dpdGNoIChwYWNrZXQtPmFja19jb2RlKSB7CisgICAgICAgIGNhc2UgQUNLX1BFTkRJTkc6CisgICAgICAgICAgICAgICAgc3dpdGNoICgocGFja2V0LT5oZWFkZXJbMV0gPj4gMTIpICYgMHhmKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSQ09ERV9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGNhc2UgUkNPREVfQ09ORkxJQ1RfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgICAgICBjYXNlIFJDT0RFX0RBVEFfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVSRU1PVEVJTzsKKyAgICAgICAgICAgICAgICBjYXNlIFJDT0RFX1RZUEVfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKyAgICAgICAgICAgICAgICBjYXNlIFJDT0RFX0FERFJFU1NfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgSFBTQl9FUlIoInJlY2VpdmVkIHJlc2VydmVkIHJjb2RlICVkIGZyb20gbm9kZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFja2V0LT5oZWFkZXJbMV0gPj4gMTIpICYgMHhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5ub2RlX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIUFNCX1BBTklDKCJyZWFjaGVkIHVucmVhY2hhYmxlIGNvZGUgMSBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgY2FzZSBBQ0tfQlVTWV9YOgorICAgICAgICBjYXNlIEFDS19CVVNZX0E6CisgICAgICAgIGNhc2UgQUNLX0JVU1lfQjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworCisgICAgICAgIGNhc2UgQUNLX1RZUEVfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUNDRVM7CisKKyAgICAgICAgY2FzZSBBQ0tfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgaWYgKHBhY2tldC0+dGNvZGUgPT0gVENPREVfV1JJVEVRCisgICAgICAgICAgICAgICAgICAgIHx8IHBhY2tldC0+dGNvZGUgPT0gVENPREVfV1JJVEVCKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgSFBTQl9FUlIoImltcG9zc2libGUgYWNrX2NvbXBsZXRlIGZyb20gbm9kZSAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHRjb2RlICVkKSIsIHBhY2tldC0+bm9kZV9pZCwgcGFja2V0LT50Y29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICBjYXNlIEFDS19EQVRBX0VSUk9SOgorICAgICAgICAgICAgICAgIGlmIChwYWNrZXQtPnRjb2RlID09IFRDT0RFX1dSSVRFQgorICAgICAgICAgICAgICAgICAgICB8fCBwYWNrZXQtPnRjb2RlID09IFRDT0RFX0xPQ0tfUkVRVUVTVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhQU0JfRVJSKCJpbXBvc3NpYmxlIGFja19kYXRhX2Vycm9yIGZyb20gbm9kZSAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHRjb2RlICVkKSIsIHBhY2tldC0+bm9kZV9pZCwgcGFja2V0LT50Y29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBQ0tfQUREUkVTU19FUlJPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBjYXNlIEFDS19UQVJEWToKKyAgICAgICAgY2FzZSBBQ0tfQ09ORkxJQ1RfRVJST1I6CisgICAgICAgIGNhc2UgQUNLWF9OT05FOgorICAgICAgICBjYXNlIEFDS1hfU0VORF9FUlJPUjoKKyAgICAgICAgY2FzZSBBQ0tYX0FCT1JURUQ6CisgICAgICAgIGNhc2UgQUNLWF9USU1FT1VUOgorICAgICAgICAgICAgICAgIC8qIGVycm9yIHdoaWxlIHNlbmRpbmcgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEhQU0JfRVJSKCJnb3QgaW52YWxpZCBhY2sgJWQgZnJvbSBub2RlICVkICh0Y29kZSAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC0+YWNrX2NvZGUsIHBhY2tldC0+bm9kZV9pZCwgcGFja2V0LT50Y29kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgIH0KKworICAgICAgICBIUFNCX1BBTklDKCJyZWFjaGVkIHVucmVhY2hhYmxlIGNvZGUgMiBpbiAlcyIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3N0cnVjdCBocHNiX3BhY2tldCAqaHBzYl9tYWtlX3JlYWRwYWNrZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgbm9kZWlkX3Qgbm9kZSwKKwkJCQkJIHU2NCBhZGRyLCBzaXplX3QgbGVuZ3RoKQoreworICAgICAgICBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKKworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYWNrZXQgPSBocHNiX2FsbG9jX3BhY2tldChsZW5ndGgpOworCWlmICghcGFja2V0KQorCQlyZXR1cm4gTlVMTDsKKworCXBhY2tldC0+aG9zdCA9IGhvc3Q7CisJcGFja2V0LT5ub2RlX2lkID0gbm9kZTsKKworCWlmIChocHNiX2dldF90bGFiZWwocGFja2V0KSkgeworCQlocHNiX2ZyZWVfcGFja2V0KHBhY2tldCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChsZW5ndGggPT0gNCkKKwkJZmlsbF9hc3luY19yZWFkcXVhZChwYWNrZXQsIGFkZHIpOworCWVsc2UKKwkJZmlsbF9hc3luY19yZWFkYmxvY2socGFja2V0LCBhZGRyLCBsZW5ndGgpOworCisJcmV0dXJuIHBhY2tldDsKK30KKworc3RydWN0IGhwc2JfcGFja2V0ICpocHNiX21ha2Vfd3JpdGVwYWNrZXQgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsCisJCQkJCSAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKKworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYWNrZXQgPSBocHNiX2FsbG9jX3BhY2tldChsZW5ndGgpOworCWlmICghcGFja2V0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsZW5ndGggJSA0KSB7IC8qIHplcm8gcGFkZGluZyBieXRlcyAqLworCQlwYWNrZXQtPmRhdGFbbGVuZ3RoID4+IDJdID0gMDsKKwl9CisJcGFja2V0LT5ob3N0ID0gaG9zdDsKKwlwYWNrZXQtPm5vZGVfaWQgPSBub2RlOworCisJaWYgKGhwc2JfZ2V0X3RsYWJlbChwYWNrZXQpKSB7CisJCWhwc2JfZnJlZV9wYWNrZXQocGFja2V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGxlbmd0aCA9PSA0KSB7CisJCWZpbGxfYXN5bmNfd3JpdGVxdWFkKHBhY2tldCwgYWRkciwgYnVmZmVyID8gKmJ1ZmZlciA6IDApOworCX0gZWxzZSB7CisJCWZpbGxfYXN5bmNfd3JpdGVibG9jayhwYWNrZXQsIGFkZHIsIGxlbmd0aCk7CisJCWlmIChidWZmZXIpCisJCQltZW1jcHkocGFja2V0LT5kYXRhLCBidWZmZXIsIGxlbmd0aCk7CisJfQorCisJcmV0dXJuIHBhY2tldDsKK30KKworc3RydWN0IGhwc2JfcGFja2V0ICpocHNiX21ha2Vfc3RyZWFtcGFja2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHU4ICpidWZmZXIsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWwsIGludCB0YWcsIGludCBzeW5jKQoreworCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0OworCisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXBhY2tldCA9IGhwc2JfYWxsb2NfcGFja2V0KGxlbmd0aCk7CisJaWYgKCFwYWNrZXQpCisJCXJldHVybiBOVUxMOworCisJaWYgKGxlbmd0aCAlIDQpIHsgLyogemVybyBwYWRkaW5nIGJ5dGVzICovCisJCXBhY2tldC0+ZGF0YVtsZW5ndGggPj4gMl0gPSAwOworCX0KKwlwYWNrZXQtPmhvc3QgPSBob3N0OworCisJaWYgKGhwc2JfZ2V0X3RsYWJlbChwYWNrZXQpKSB7CisJCWhwc2JfZnJlZV9wYWNrZXQocGFja2V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZmlsbF9hc3luY19zdHJlYW1fcGFja2V0KHBhY2tldCwgbGVuZ3RoLCBjaGFubmVsLCB0YWcsIHN5bmMpOworCWlmIChidWZmZXIpCisJCW1lbWNweShwYWNrZXQtPmRhdGEsIGJ1ZmZlciwgbGVuZ3RoKTsKKworCXJldHVybiBwYWNrZXQ7Cit9CisKK3N0cnVjdCBocHNiX3BhY2tldCAqaHBzYl9tYWtlX2xvY2twYWNrZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgbm9kZWlkX3Qgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IGFkZHIsIGludCBleHRjb2RlLCBxdWFkbGV0X3QgKmRhdGEsCisJCQkJCSBxdWFkbGV0X3QgYXJnKQoreworCXN0cnVjdCBocHNiX3BhY2tldCAqcDsKKwl1MzIgbGVuZ3RoOworCisJcCA9IGhwc2JfYWxsb2NfcGFja2V0KDgpOworCWlmICghcCkgcmV0dXJuIE5VTEw7CisKKwlwLT5ob3N0ID0gaG9zdDsKKwlwLT5ub2RlX2lkID0gbm9kZTsKKwlpZiAoaHBzYl9nZXRfdGxhYmVsKHApKSB7CisJCWhwc2JfZnJlZV9wYWNrZXQocCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN3aXRjaCAoZXh0Y29kZSkgeworCWNhc2UgRVhUQ09ERV9GRVRDSF9BREQ6CisJY2FzZSBFWFRDT0RFX0xJVFRMRV9BREQ6CisJCWxlbmd0aCA9IDQ7CisJCWlmIChkYXRhKQorCQkJcC0+ZGF0YVswXSA9ICpkYXRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsZW5ndGggPSA4OworCQlpZiAoZGF0YSkgeworCQkJcC0+ZGF0YVswXSA9IGFyZzsKKwkJCXAtPmRhdGFbMV0gPSAqZGF0YTsKKwkJfQorCQlicmVhazsKKwl9CisJZmlsbF9hc3luY19sb2NrKHAsIGFkZHIsIGV4dGNvZGUsIGxlbmd0aCk7CisKKwlyZXR1cm4gcDsKK30KKworc3RydWN0IGhwc2JfcGFja2V0ICpocHNiX21ha2VfbG9jazY0cGFja2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IGFkZHIsIGludCBleHRjb2RlLCBvY3RsZXRfdCAqZGF0YSwKKwkJCQkJICAgb2N0bGV0X3QgYXJnKQoreworCXN0cnVjdCBocHNiX3BhY2tldCAqcDsKKwl1MzIgbGVuZ3RoOworCisJcCA9IGhwc2JfYWxsb2NfcGFja2V0KDE2KTsKKwlpZiAoIXApIHJldHVybiBOVUxMOworCisJcC0+aG9zdCA9IGhvc3Q7CisJcC0+bm9kZV9pZCA9IG5vZGU7CisJaWYgKGhwc2JfZ2V0X3RsYWJlbChwKSkgeworCQlocHNiX2ZyZWVfcGFja2V0KHApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzd2l0Y2ggKGV4dGNvZGUpIHsKKwljYXNlIEVYVENPREVfRkVUQ0hfQUREOgorCWNhc2UgRVhUQ09ERV9MSVRUTEVfQUREOgorCQlsZW5ndGggPSA4OworCQlpZiAoZGF0YSkgeworCQkJcC0+ZGF0YVswXSA9ICpkYXRhID4+IDMyOworCQkJcC0+ZGF0YVsxXSA9ICpkYXRhICYgMHhmZmZmZmZmZjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlsZW5ndGggPSAxNjsKKwkJaWYgKGRhdGEpIHsKKwkJCXAtPmRhdGFbMF0gPSBhcmcgPj4gMzI7CisJCQlwLT5kYXRhWzFdID0gYXJnICYgMHhmZmZmZmZmZjsKKwkJCXAtPmRhdGFbMl0gPSAqZGF0YSA+PiAzMjsKKwkJCXAtPmRhdGFbM10gPSAqZGF0YSAmIDB4ZmZmZmZmZmY7CisJCX0KKwkJYnJlYWs7CisJfQorCWZpbGxfYXN5bmNfbG9jayhwLCBhZGRyLCBleHRjb2RlLCBsZW5ndGgpOworCisJcmV0dXJuIHA7Cit9CisKK3N0cnVjdCBocHNiX3BhY2tldCAqaHBzYl9tYWtlX3BoeXBhY2tldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWRsZXRfdCBkYXRhKQoreworICAgICAgICBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnA7CisKKyAgICAgICAgcCA9IGhwc2JfYWxsb2NfcGFja2V0KDApOworICAgICAgICBpZiAoIXApIHJldHVybiBOVUxMOworCisgICAgICAgIHAtPmhvc3QgPSBob3N0OworICAgICAgICBmaWxsX3BoeV9wYWNrZXQocCwgZGF0YSk7CisKKyAgICAgICAgcmV0dXJuIHA7Cit9CisKK3N0cnVjdCBocHNiX3BhY2tldCAqaHBzYl9tYWtlX2lzb3BhY2tldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorCQkJCQlpbnQgbGVuZ3RoLCBpbnQgY2hhbm5lbCwKKwkJCQkJaW50IHRhZywgaW50IHN5bmMpCit7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwOworCisJcCA9IGhwc2JfYWxsb2NfcGFja2V0KGxlbmd0aCk7CisJaWYgKCFwKSByZXR1cm4gTlVMTDsKKworCXAtPmhvc3QgPSBob3N0OworCWZpbGxfaXNvX3BhY2tldChwLCBsZW5ndGgsIGNoYW5uZWwsIHRhZywgc3luYyk7CisKKwlwLT5nZW5lcmF0aW9uID0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KTsKKworCXJldHVybiBwOworfQorCisvKgorICogRklYTUUgLSB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIHByb2JhYmx5IHJlYWQgZnJvbSAvIHdyaXRlIHRvIHVzZXIgc3BhY2UgdG8KKyAqIGF2b2lkIGluIGtlcm5lbCBidWZmZXJzIGZvciB1c2VyIHNwYWNlIGNhbGxlcnMKKyAqLworCitpbnQgaHBzYl9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uLAorCSAgICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICAgICAgc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CisgICAgICAgIGludCByZXR2YWwgPSAwOworCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7IC8vIFdlIGNhbid0IGJlIGNhbGxlZCBpbiBhbiBpbnRlcnJ1cHQsIHlldAorCisJcGFja2V0ID0gaHBzYl9tYWtlX3JlYWRwYWNrZXQoaG9zdCwgbm9kZSwgYWRkciwgbGVuZ3RoKTsKKworICAgICAgICBpZiAoIXBhY2tldCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICB9CisKKwlwYWNrZXQtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgICAgICByZXR2YWwgPSBocHNiX3NlbmRfcGFja2V0X2FuZF93YWl0KHBhY2tldCk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gaHBzYl9yZWFkX2ZhaWw7CisKKyAgICAgICAgcmV0dmFsID0gaHBzYl9wYWNrZXRfc3VjY2VzcyhwYWNrZXQpOworCisgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHBhY2tldC0+aGVhZGVyWzNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLCBwYWNrZXQtPmRhdGEsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKK2hwc2JfcmVhZF9mYWlsOgorICAgICAgICBocHNiX2ZyZWVfdGxhYmVsKHBhY2tldCk7CisgICAgICAgIGhwc2JfZnJlZV9wYWNrZXQocGFja2V0KTsKKworICAgICAgICByZXR1cm4gcmV0dmFsOworfQorCisKK2ludCBocHNiX3dyaXRlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uLAorCSAgICAgICB1NjQgYWRkciwgcXVhZGxldF90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CisJaW50IHJldHZhbDsKKworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlCVUdfT04oaW5faW50ZXJydXB0KCkpOyAvLyBXZSBjYW4ndCBiZSBjYWxsZWQgaW4gYW4gaW50ZXJydXB0LCB5ZXQKKworCXBhY2tldCA9IGhwc2JfbWFrZV93cml0ZXBhY2tldCAoaG9zdCwgbm9kZSwgYWRkciwgYnVmZmVyLCBsZW5ndGgpOworCisJaWYgKCFwYWNrZXQpCisJCXJldHVybiAtRU5PTUVNOworCisJcGFja2V0LT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICAgICAgcmV0dmFsID0gaHBzYl9zZW5kX3BhY2tldF9hbmRfd2FpdChwYWNrZXQpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGhwc2Jfd3JpdGVfZmFpbDsKKworICAgICAgICByZXR2YWwgPSBocHNiX3BhY2tldF9zdWNjZXNzKHBhY2tldCk7CisKK2hwc2Jfd3JpdGVfZmFpbDoKKyAgICAgICAgaHBzYl9mcmVlX3RsYWJlbChwYWNrZXQpOworICAgICAgICBocHNiX2ZyZWVfcGFja2V0KHBhY2tldCk7CisKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKK30KKworCitpbnQgaHBzYl9sb2NrKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uLAorCSAgICAgIHU2NCBhZGRyLCBpbnQgZXh0Y29kZSwgcXVhZGxldF90ICpkYXRhLCBxdWFkbGV0X3QgYXJnKQoreworICAgICAgICBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKKyAgICAgICAgaW50IHJldHZhbCA9IDA7CisKKwlCVUdfT04oaW5faW50ZXJydXB0KCkpOyAvLyBXZSBjYW4ndCBiZSBjYWxsZWQgaW4gYW4gaW50ZXJydXB0LCB5ZXQKKworCXBhY2tldCA9IGhwc2JfbWFrZV9sb2NrcGFja2V0KGhvc3QsIG5vZGUsIGFkZHIsIGV4dGNvZGUsIGRhdGEsIGFyZyk7CisgICAgICAgIGlmICghcGFja2V0KQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworCisJcGFja2V0LT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICAgICAgcmV0dmFsID0gaHBzYl9zZW5kX3BhY2tldF9hbmRfd2FpdChwYWNrZXQpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGhwc2JfbG9ja19mYWlsOworCisgICAgICAgIHJldHZhbCA9IGhwc2JfcGFja2V0X3N1Y2Nlc3MocGFja2V0KTsKKworICAgICAgICBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgICAgICAgICAqZGF0YSA9IHBhY2tldC0+ZGF0YVswXTsKKyAgICAgICAgfQorCitocHNiX2xvY2tfZmFpbDoKKyAgICAgICAgaHBzYl9mcmVlX3RsYWJlbChwYWNrZXQpOworICAgICAgICBocHNiX2ZyZWVfcGFja2V0KHBhY2tldCk7CisKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKK30KKworCitpbnQgaHBzYl9zZW5kX2dhc3Aoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uLAorCQkgICBxdWFkbGV0X3QgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgdTMyIHNwZWNpZmllcl9pZCwKKwkJICAgdW5zaWduZWQgaW50IHZlcnNpb24pCit7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CisJaW50IHJldHZhbCA9IDA7CisJdTE2IHNwZWNpZmllcl9pZF9oaSA9IChzcGVjaWZpZXJfaWQgJiAweDAwZmZmZjAwKSA+PiA4OworCXU4IHNwZWNpZmllcl9pZF9sbyA9IHNwZWNpZmllcl9pZCAmIDB4ZmY7CisKKwlIUFNCX1ZFUkJPU0UoIlNlbmQgR0FTUDogY2hhbm5lbCA9ICVkLCBsZW5ndGggPSAlWmQiLCBjaGFubmVsLCBsZW5ndGgpOworCisJbGVuZ3RoICs9IDg7CisKKwlwYWNrZXQgPSBocHNiX21ha2Vfc3RyZWFtcGFja2V0KGhvc3QsIE5VTEwsIGxlbmd0aCwgY2hhbm5lbCwgMywgMCk7CisJaWYgKCFwYWNrZXQpCisJCXJldHVybiAtRU5PTUVNOworCisJcGFja2V0LT5kYXRhWzBdID0gY3B1X3RvX2JlMzIoKGhvc3QtPm5vZGVfaWQgPDwgMTYpIHwgc3BlY2lmaWVyX2lkX2hpKTsKKwlwYWNrZXQtPmRhdGFbMV0gPSBjcHVfdG9fYmUzMigoc3BlY2lmaWVyX2lkX2xvIDw8IDI0KSB8ICh2ZXJzaW9uICYgMHgwMGZmZmZmZikpOworCisJbWVtY3B5KCYocGFja2V0LT5kYXRhWzJdKSwgYnVmZmVyLCBsZW5ndGggLSA4KTsKKworCXBhY2tldC0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisKKwlwYWNrZXQtPm5vX3dhaXRlciA9IDE7CisKKwlyZXR2YWwgPSBocHNiX3NlbmRfcGFja2V0KHBhY2tldCk7CisJaWYgKHJldHZhbCA8IDApCisJCWhwc2JfZnJlZV9wYWNrZXQocGFja2V0KTsKKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X3RyYW5zYWN0aW9ucy5oIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF90cmFuc2FjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjZhNDNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF90cmFuc2FjdGlvbnMuaApAQCAtMCwwICsxLDY0IEBACisjaWZuZGVmIF9JRUVFMTM5NF9UUkFOU0FDVElPTlNfSAorI2RlZmluZSBfSUVFRTEzOTRfVFJBTlNBQ1RJT05TX0gKKworI2luY2x1ZGUgImllZWUxMzk0X2NvcmUuaCIKKworCisvKgorICogR2V0IGFuZCBmcmVlIHRyYW5zYWN0aW9uIGxhYmVscy4KKyAqLworaW50IGhwc2JfZ2V0X3RsYWJlbChzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCk7Cit2b2lkIGhwc2JfZnJlZV90bGFiZWwoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpOworCitzdHJ1Y3QgaHBzYl9wYWNrZXQgKmhwc2JfbWFrZV9yZWFkcGFja2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsCisJCQkJCSB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCk7CitzdHJ1Y3QgaHBzYl9wYWNrZXQgKmhwc2JfbWFrZV9sb2NrcGFja2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU2NCBhZGRyLCBpbnQgZXh0Y29kZSwgcXVhZGxldF90ICpkYXRhLAorCQkJCQkgcXVhZGxldF90IGFyZyk7CitzdHJ1Y3QgaHBzYl9wYWNrZXQgKmhwc2JfbWFrZV9sb2NrNjRwYWNrZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgbm9kZWlkX3Qgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU2NCBhZGRyLCBpbnQgZXh0Y29kZSwgb2N0bGV0X3QgKmRhdGEsCisJCQkJCSAgb2N0bGV0X3QgYXJnKTsKK3N0cnVjdCBocHNiX3BhY2tldCAqaHBzYl9tYWtlX3BoeXBhY2tldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWRsZXRfdCBkYXRhKSA7CitzdHJ1Y3QgaHBzYl9wYWNrZXQgKmhwc2JfbWFrZV9pc29wYWNrZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKKwkJCQkJaW50IGxlbmd0aCwgaW50IGNoYW5uZWwsCisJCQkJCWludCB0YWcsIGludCBzeW5jKTsKK3N0cnVjdCBocHNiX3BhY2tldCAqaHBzYl9tYWtlX3dyaXRlcGFja2V0IChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBub2RlaWRfdCBub2RlLAorCQkJCQkgICB1NjQgYWRkciwgcXVhZGxldF90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworc3RydWN0IGhwc2JfcGFja2V0ICpocHNiX21ha2Vfc3RyZWFtcGFja2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIHU4ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwgaW50IGNoYW5uZWwsIGludCB0YWcsIGludCBzeW5jKTsKKworLyoKKyAqIGhwc2JfcGFja2V0X3N1Y2Nlc3MgLSBNYWtlIHNlbnNlIG9mIHRoZSBhY2sgYW5kIHJlcGx5IGNvZGVzIGFuZAorICogcmV0dXJuIG1vcmUgY29udmVuaWVudCBlcnJvciBjb2RlczoKKyAqIDAgICAgICAgICAgIHN1Y2Nlc3MKKyAqIC1FQlVTWSAgICAgIG5vZGUgaXMgYnVzeSwgdHJ5IGFnYWluCisgKiAtRUFHQUlOICAgICBlcnJvciB3aGljaCBjYW4gcHJvYmFibHkgcmVzb2x2ZWQgYnkgcmV0cnkKKyAqIC1FUkVNT1RFSU8gIG5vZGUgc3VmZmVycyBmcm9tIGFuIGludGVybmFsIGVycm9yCisgKiAtRUFDQ0VTICAgICB0aGlzIHRyYW5zYWN0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIHJlcXVlc3RlZCBhZGRyZXNzCisgKiAtRUlOVkFMICAgICBpbnZhbGlkIGFkZHJlc3MgYXQgbm9kZQorICovCitpbnQgaHBzYl9wYWNrZXRfc3VjY2VzcyhzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCk7CisKKworLyoKKyAqIFRoZSBnZW5lcmljIHJlYWQsIHdyaXRlIGFuZCBsb2NrIGZ1bmN0aW9ucy4gIEFsbCByZWNvZ25pemUgdGhlIGxvY2FsIG5vZGUgSUQKKyAqIGFuZCBhY3QgYWNjb3JkaW5nbHkuICBSZWFkIGFuZCB3cml0ZSBhdXRvbWF0aWNhbGx5IHVzZSBxdWFkbGV0IGNvbW1hbmRzIGlmCisgKiBsZW5ndGggPT0gNCBhbmQgYW5kIGJsb2NrIGNvbW1hbmRzIG90aGVyd2lzZSAoaG93ZXZlciwgdGhleSBkbyBub3QgeWV0CisgKiBzdXBwb3J0IGxlbmd0aHMgdGhhdCBhcmUgbm90IGEgbXVsdGlwbGUgb2YgNCkuICBZb3UgbXVzdCBleHBsaWNpdGx5IHNwZWNpZml5CisgKiB0aGUgZ2VuZXJhdGlvbiBmb3Igd2hpY2ggdGhlIG5vZGUgSUQgaXMgdmFsaWQsIHRvIGF2b2lkIHNlbmRpbmcgcGFja2V0cyB0bworICogdGhlIHdyb25nIG5vZGVzIHdoZW4gd2UgcmFjZSB3aXRoIGEgYnVzIHJlc2V0LgorICovCitpbnQgaHBzYl9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uLAorCSAgICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CitpbnQgaHBzYl93cml0ZShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBub2RlaWRfdCBub2RlLCB1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbiwKKwkgICAgICAgdTY0IGFkZHIsIHF1YWRsZXRfdCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKK2ludCBocHNiX2xvY2soc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgbm9kZWlkX3Qgbm9kZSwgdW5zaWduZWQgaW50IGdlbmVyYXRpb24sCisJICAgICAgdTY0IGFkZHIsIGludCBleHRjb2RlLCBxdWFkbGV0X3QgKmRhdGEsIHF1YWRsZXRfdCBhcmcpOworaW50IGhwc2JfbG9jazY0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGUsIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uLAorCQl1NjQgYWRkciwgaW50IGV4dGNvZGUsIG9jdGxldF90ICpkYXRhLCBvY3RsZXRfdCBhcmcpOworaW50IGhwc2Jfc2VuZF9nYXNwKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICBxdWFkbGV0X3QgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgdTMyIHNwZWNpZmllcl9pZCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbik7CisKKyNlbmRpZiAvKiBfSUVFRTEzOTRfVFJBTlNBQ1RJT05TX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfdHlwZXMuaCBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY1NjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF90eXBlcy5oCkBAIC0wLDAgKzEsMTAxIEBACisKKyNpZm5kZWYgX0lFRUUxMzk0X1RZUEVTX0gKKyNkZWZpbmUgX0lFRUUxMzk0X1RZUEVTX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworCisvKiBUcmFuc2FjdGlvbiBMYWJlbCBoYW5kbGluZyAqLworc3RydWN0IGhwc2JfdGxhYmVsX3Bvb2wgeworCURFQ0xBUkVfQklUTUFQKHBvb2wsIDY0KTsKKwlzcGlubG9ja190IGxvY2s7CisJdTggbmV4dDsKKwl1MzIgYWxsb2NhdGlvbnM7CisJc3RydWN0IHNlbWFwaG9yZSBjb3VudDsKK307CisKKyNkZWZpbmUgSFBTQl9UUE9PTF9JTklUKF90cCkJCQlcCitkbyB7CQkJCQkJXAorCWJpdG1hcF96ZXJvKChfdHApLT5wb29sLCA2NCk7CQlcCisJc3Bpbl9sb2NrX2luaXQoJihfdHApLT5sb2NrKTsJCVwKKwkoX3RwKS0+bmV4dCA9IDA7CQkJXAorCShfdHApLT5hbGxvY2F0aW9ucyA9IDA7CQkJXAorCXNlbWFfaW5pdCgmKF90cCktPmNvdW50LCA2Myk7CQlcCit9IHdoaWxlICgwKQorCisKK3R5cGVkZWYgdTMyIHF1YWRsZXRfdDsKK3R5cGVkZWYgdTY0IG9jdGxldF90OwordHlwZWRlZiB1MTYgbm9kZWlkX3Q7CisKK3R5cGVkZWYgdTggIGJ5dGVfdDsKK3R5cGVkZWYgdTY0IG5vZGVhZGRyX3Q7Cit0eXBlZGVmIHUxNiBhcm1fbGVuZ3RoX3Q7CisKKyNkZWZpbmUgQlVTX01BU0sgIDB4ZmZjMAorI2RlZmluZSBCVVNfU0hJRlQgNgorI2RlZmluZSBOT0RFX01BU0sgMHgwMDNmCisjZGVmaW5lIExPQ0FMX0JVUyAweGZmYzAKKyNkZWZpbmUgQUxMX05PREVTIDB4MDAzZgorCisjZGVmaW5lIE5PREVJRF9UT19CVVMobm9kZWlkKQkoKG5vZGVpZCAmIEJVU19NQVNLKSA+PiBCVVNfU0hJRlQpCisjZGVmaW5lIE5PREVJRF9UT19OT0RFKG5vZGVpZCkJKG5vZGVpZCAmIE5PREVfTUFTSykKKworLyogQ2FuIGJlIHVzZWQgdG8gY29uc2lzdGVudGx5IHByaW50IGEgbm9kZS9idXMgSUQuICovCisjZGVmaW5lIE5PREVfQlVTX0ZNVAkJIiVkLSUwMmQ6JTA0ZCIKKyNkZWZpbmUgTk9ERV9CVVNfQVJHUyhfX2hvc3QsIF9fbm9kZWlkKQlcCisJX19ob3N0LT5pZCwgTk9ERUlEX1RPX05PREUoX19ub2RlaWQpLCBOT0RFSURfVE9fQlVTKF9fbm9kZWlkKQorCisjZGVmaW5lIEhQU0JfUFJJTlQobGV2ZWwsIGZtdCwgYXJncy4uLikgcHJpbnRrKGxldmVsICJpZWVlMTM5NDogIiBmbXQgIlxuIiAsICMjIGFyZ3MpCisKKyNkZWZpbmUgSFBTQl9ERUJVRyhmbXQsIGFyZ3MuLi4pIEhQU0JfUFJJTlQoS0VSTl9ERUJVRywgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSFBTQl9JTkZPKGZtdCwgYXJncy4uLikgSFBTQl9QUklOVChLRVJOX0lORk8sIGZtdCAsICMjIGFyZ3MpCisjZGVmaW5lIEhQU0JfTk9USUNFKGZtdCwgYXJncy4uLikgSFBTQl9QUklOVChLRVJOX05PVElDRSwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSFBTQl9XQVJOKGZtdCwgYXJncy4uLikgSFBTQl9QUklOVChLRVJOX1dBUk5JTkcsIGZtdCAsICMjIGFyZ3MpCisjZGVmaW5lIEhQU0JfRVJSKGZtdCwgYXJncy4uLikgSFBTQl9QUklOVChLRVJOX0VSUiwgZm10ICwgIyMgYXJncykKKworI2lmZGVmIENPTkZJR19JRUVFMTM5NF9WRVJCT1NFREVCVUcKKyNkZWZpbmUgSFBTQl9WRVJCT1NFKGZtdCwgYXJncy4uLikgSFBTQl9QUklOVChLRVJOX0RFQlVHLCBmbXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgSFBTQl9WRVJCT1NFKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIEhQU0JfUEFOSUMoZm10LCBhcmdzLi4uKSBwYW5pYygiaWVlZTEzOTQ6ICIgZm10ICJcbiIgLCAjIyBhcmdzKQorCisjZGVmaW5lIEhQU0JfVFJBQ0UoKSBIUFNCX1BSSU5UKEtFUk5fSU5GTywgIlRSQUNFIC0gJXMsICVzKCksIGxpbmUgJWQiLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKworCisjaWZkZWYgX19CSUdfRU5ESUFOCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgKm1lbWNweV9sZTMyKHUzMiAqZGVzdCwgY29uc3QgdTMyICpfX3NyYywgc2l6ZV90IGNvdW50KQoreworICAgICAgICB2b2lkICp0bXAgPSBkZXN0OworCXUzMiAqc3JjID0gKHUzMiAqKV9fc3JjOworCisgICAgICAgIGNvdW50IC89IDQ7CisKKyAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gc3dhYjMycChzcmMrKyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdG1wOworfQorCisjZWxzZQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkICptZW1jcHlfbGUzMih1MzIgKmRlc3QsIGNvbnN0IHUzMiAqc3JjLCBzaXplX3QgY291bnQpCit7CisgICAgICAgIHJldHVybiBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Cit9CisKKyNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KKworI2VuZGlmIC8qIF9JRUVFMTM5NF9UWVBFU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2lzby5jIGIvZHJpdmVycy9pZWVlMTM5NC9pc28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDU3NTkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pc28uYwpAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqIElFRUUgMTM5NCBmb3IgTGludXgKKyAqCisgKiBrZXJuZWwgSVNPIHRyYW5zbWlzc2lvbi9yZWNlcHRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTWFhcyBEaWdpdGFsIExMQworICoKKyAqIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHJvb3QKKyAqIGRpcmVjdG9yeSBvZiB0aGUga2VybmVsIHNvdXJjZXMgZm9yIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgImlzby5oIgorCit2b2lkIGhwc2JfaXNvX3N0b3Aoc3RydWN0IGhwc2JfaXNvICppc28pCit7CisJaWYgKCEoaXNvLT5mbGFncyAmIEhQU0JfSVNPX0RSSVZFUl9TVEFSVEVEKSkKKwkJcmV0dXJuOworCisJaXNvLT5ob3N0LT5kcml2ZXItPmlzb2N0bChpc28sIGlzby0+dHlwZSA9PSBIUFNCX0lTT19YTUlUID8KKwkJCQkgIFhNSVRfU1RPUCA6IFJFQ1ZfU1RPUCwgMCk7CisJaXNvLT5mbGFncyAmPSB+SFBTQl9JU09fRFJJVkVSX1NUQVJURUQ7Cit9CisKK3ZvaWQgaHBzYl9pc29fc2h1dGRvd24oc3RydWN0IGhwc2JfaXNvICppc28pCit7CisJaWYgKGlzby0+ZmxhZ3MgJiBIUFNCX0lTT19EUklWRVJfSU5JVCkgeworCQlocHNiX2lzb19zdG9wKGlzbyk7CisJCWlzby0+aG9zdC0+ZHJpdmVyLT5pc29jdGwoaXNvLCBpc28tPnR5cGUgPT0gSFBTQl9JU09fWE1JVCA/CisJCQkJCSAgWE1JVF9TSFVURE9XTiA6IFJFQ1ZfU0hVVERPV04sIDApOworCQlpc28tPmZsYWdzICY9IH5IUFNCX0lTT19EUklWRVJfSU5JVDsKKwl9CisKKwlkbWFfcmVnaW9uX2ZyZWUoJmlzby0+ZGF0YV9idWYpOworCWtmcmVlKGlzbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9pc28qIGhwc2JfaXNvX2NvbW1vbl9pbml0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGVudW0gaHBzYl9pc29fdHlwZSB0eXBlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkYXRhX2J1Zl9zaXplLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBidWZfcGFja2V0cywKKwkJCQkJICAgICBpbnQgY2hhbm5lbCwKKwkJCQkJICAgICBpbnQgZG1hX21vZGUsCisJCQkJCSAgICAgaW50IGlycV9pbnRlcnZhbCwKKwkJCQkJICAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBocHNiX2lzbyopKQoreworCXN0cnVjdCBocHNiX2lzbyAqaXNvOworCWludCBkbWFfZGlyZWN0aW9uOworCisJLyogbWFrZSBzdXJlIGRyaXZlciBzdXBwb3J0cyB0aGUgSVNPIEFQSSAqLworCWlmICghaG9zdC0+ZHJpdmVyLT5pc29jdGwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaWVlZTEzOTQ6IGhvc3QgZHJpdmVyICclcycgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmF3aXNvIEFQSVxuIiwKKwkJICAgICAgIGhvc3QtPmRyaXZlci0+bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHNhbml0aXplIHBhcmFtZXRlcnMgKi8KKworCWlmIChidWZfcGFja2V0cyA8IDIpCisJCWJ1Zl9wYWNrZXRzID0gMjsKKworCWlmICgoZG1hX21vZGUgPCBIUFNCX0lTT19ETUFfREVGQVVMVCkgfHwgKGRtYV9tb2RlID4gSFBTQl9JU09fRE1BX1BBQ0tFVF9QRVJfQlVGRkVSKSkKKwkJZG1hX21vZGU9SFBTQl9JU09fRE1BX0RFRkFVTFQ7CisKKwlpZiAoaXJxX2ludGVydmFsID09IDApICAgICAvKiByZWFsbHkgaW50ZXJydXB0IGZvciBlYWNoIHBhY2tldCovCisJCWlycV9pbnRlcnZhbCA9IDE7CisJZWxzZSBpZiAoKGlycV9pbnRlcnZhbCA8IDApIHx8IChpcnFfaW50ZXJ2YWwgPiBidWZfcGFja2V0cyAvIDQpKQorIAkJaXJxX2ludGVydmFsID0gYnVmX3BhY2tldHMgLyA0OworCisJaWYgKGNoYW5uZWwgPCAtMSB8fCBjaGFubmVsID49IDY0KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGNoYW5uZWwgPSAtMSBpcyBPSyBmb3IgbXVsdGktY2hhbm5lbCByZWN2IGJ1dCBub3QgZm9yIHhtaXQgKi8KKwlpZiAodHlwZSA9PSBIUFNCX0lTT19YTUlUICYmIGNoYW5uZWwgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGFsbG9jYXRlIGFuZCB3cml0ZSB0aGUgc3RydWN0IGhwc2JfaXNvICovCisKKwlpc28gPSBrbWFsbG9jKHNpemVvZigqaXNvKSArIGJ1Zl9wYWNrZXRzICogc2l6ZW9mKHN0cnVjdCBocHNiX2lzb19wYWNrZXRfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaXNvKQorCQlyZXR1cm4gTlVMTDsKKworCWlzby0+aW5mb3MgPSAoc3RydWN0IGhwc2JfaXNvX3BhY2tldF9pbmZvICopKGlzbyArIDEpOworCisJaXNvLT50eXBlID0gdHlwZTsKKwlpc28tPmhvc3QgPSBob3N0OworCWlzby0+aG9zdGRhdGEgPSBOVUxMOworCWlzby0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpc28tPndhaXRxKTsKKwlpc28tPmNoYW5uZWwgPSBjaGFubmVsOworCWlzby0+aXJxX2ludGVydmFsID0gaXJxX2ludGVydmFsOworCWlzby0+ZG1hX21vZGUgPSBkbWFfbW9kZTsKKwlkbWFfcmVnaW9uX2luaXQoJmlzby0+ZGF0YV9idWYpOworCWlzby0+YnVmX3NpemUgPSBQQUdFX0FMSUdOKGRhdGFfYnVmX3NpemUpOworCWlzby0+YnVmX3BhY2tldHMgPSBidWZfcGFja2V0czsKKwlpc28tPnBrdF9kbWEgPSAwOworCWlzby0+Zmlyc3RfcGFja2V0ID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmaXNvLT5sb2NrKTsKKworCWlmIChpc28tPnR5cGUgPT0gSFBTQl9JU09fWE1JVCkgeworCQlpc28tPm5fcmVhZHlfcGFja2V0cyA9IGlzby0+YnVmX3BhY2tldHM7CisJCWRtYV9kaXJlY3Rpb24gPSBQQ0lfRE1BX1RPREVWSUNFOworCX0gZWxzZSB7CisJCWlzby0+bl9yZWFkeV9wYWNrZXRzID0gMDsKKwkJZG1hX2RpcmVjdGlvbiA9IFBDSV9ETUFfRlJPTURFVklDRTsKKwl9CisKKwlhdG9taWNfc2V0KCZpc28tPm92ZXJmbG93cywgMCk7CisJaXNvLT5mbGFncyA9IDA7CisJaXNvLT5wcmVidWZmZXIgPSAwOworCisJLyogYWxsb2NhdGUgdGhlIHBhY2tldCBidWZmZXIgKi8KKwlpZiAoZG1hX3JlZ2lvbl9hbGxvYygmaXNvLT5kYXRhX2J1ZiwgaXNvLT5idWZfc2l6ZSwgaG9zdC0+cGRldiwgZG1hX2RpcmVjdGlvbikpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIGlzbzsKKworZXJyOgorCWhwc2JfaXNvX3NodXRkb3duKGlzbyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBocHNiX2lzb19uX3JlYWR5KHN0cnVjdCBocHNiX2lzbyogaXNvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpc28tPmxvY2ssIGZsYWdzKTsKKwl2YWwgPSBpc28tPm5fcmVhZHlfcGFja2V0czsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc28tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB2YWw7Cit9CisKKworc3RydWN0IGhwc2JfaXNvKiBocHNiX2lzb194bWl0X2luaXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGRhdGFfYnVmX3NpemUsCisJCQkJICAgIHVuc2lnbmVkIGludCBidWZfcGFja2V0cywKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCBzcGVlZCwKKwkJCQkgICAgaW50IGlycV9pbnRlcnZhbCwKKwkJCQkgICAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgaHBzYl9pc28qKSkKK3sKKwlzdHJ1Y3QgaHBzYl9pc28gKmlzbyA9IGhwc2JfaXNvX2NvbW1vbl9pbml0KGhvc3QsIEhQU0JfSVNPX1hNSVQsCisJCQkJCQkgICAgZGF0YV9idWZfc2l6ZSwgYnVmX3BhY2tldHMsCisJCQkJCQkgICAgY2hhbm5lbCwgSFBTQl9JU09fRE1BX0RFRkFVTFQsIGlycV9pbnRlcnZhbCwgY2FsbGJhY2spOworCWlmICghaXNvKQorCQlyZXR1cm4gTlVMTDsKKworCWlzby0+c3BlZWQgPSBzcGVlZDsKKworCS8qIHRlbGwgdGhlIGRyaXZlciB0byBzdGFydCB3b3JraW5nICovCisJaWYgKGhvc3QtPmRyaXZlci0+aXNvY3RsKGlzbywgWE1JVF9JTklULCAwKSkKKwkJZ290byBlcnI7CisKKwlpc28tPmZsYWdzIHw9IEhQU0JfSVNPX0RSSVZFUl9JTklUOworCXJldHVybiBpc287CisKK2VycjoKKwlocHNiX2lzb19zaHV0ZG93bihpc28pOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgaHBzYl9pc28qIGhwc2JfaXNvX3JlY3ZfaW5pdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YV9idWZfc2l6ZSwKKwkJCQkgICAgdW5zaWduZWQgaW50IGJ1Zl9wYWNrZXRzLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50IGRtYV9tb2RlLAorCQkJCSAgICBpbnQgaXJxX2ludGVydmFsLAorCQkJCSAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBocHNiX2lzbyopKQoreworCXN0cnVjdCBocHNiX2lzbyAqaXNvID0gaHBzYl9pc29fY29tbW9uX2luaXQoaG9zdCwgSFBTQl9JU09fUkVDViwKKwkJCQkJCSAgICBkYXRhX2J1Zl9zaXplLCBidWZfcGFja2V0cywKKwkJCQkJCSAgICBjaGFubmVsLCBkbWFfbW9kZSwgaXJxX2ludGVydmFsLCBjYWxsYmFjayk7CisJaWYgKCFpc28pCisJCXJldHVybiBOVUxMOworCisJLyogdGVsbCB0aGUgZHJpdmVyIHRvIHN0YXJ0IHdvcmtpbmcgKi8KKwlpZiAoaG9zdC0+ZHJpdmVyLT5pc29jdGwoaXNvLCBSRUNWX0lOSVQsIDApKQorCQlnb3RvIGVycjsKKworCWlzby0+ZmxhZ3MgfD0gSFBTQl9JU09fRFJJVkVSX0lOSVQ7CisJcmV0dXJuIGlzbzsKKworZXJyOgorCWhwc2JfaXNvX3NodXRkb3duKGlzbyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBocHNiX2lzb19yZWN2X2xpc3Rlbl9jaGFubmVsKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwpCit7CisJaWYgKGlzby0+dHlwZSAhPSBIUFNCX0lTT19SRUNWIHx8IGlzby0+Y2hhbm5lbCAhPSAtMSB8fCBjaGFubmVsID49IDY0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gaXNvLT5ob3N0LT5kcml2ZXItPmlzb2N0bChpc28sIFJFQ1ZfTElTVEVOX0NIQU5ORUwsIGNoYW5uZWwpOworfQorCitpbnQgaHBzYl9pc29fcmVjdl91bmxpc3Rlbl9jaGFubmVsKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwpCit7CisgICAgICAgaWYgKGlzby0+dHlwZSAhPSBIUFNCX0lTT19SRUNWIHx8IGlzby0+Y2hhbm5lbCAhPSAtMSB8fCBjaGFubmVsID49IDY0KQorICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgcmV0dXJuIGlzby0+aG9zdC0+ZHJpdmVyLT5pc29jdGwoaXNvLCBSRUNWX1VOTElTVEVOX0NIQU5ORUwsIGNoYW5uZWwpOworfQorCitpbnQgaHBzYl9pc29fcmVjdl9zZXRfY2hhbm5lbF9tYXNrKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1NjQgbWFzaykKK3sKKwlpZiAoaXNvLT50eXBlICE9IEhQU0JfSVNPX1JFQ1YgfHwgaXNvLT5jaGFubmVsICE9IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gaXNvLT5ob3N0LT5kcml2ZXItPmlzb2N0bChpc28sIFJFQ1ZfU0VUX0NIQU5ORUxfTUFTSywgKHVuc2lnbmVkIGxvbmcpICZtYXNrKTsKK30KKworaW50IGhwc2JfaXNvX3JlY3ZfZmx1c2goc3RydWN0IGhwc2JfaXNvICppc28pCit7CisJaWYgKGlzby0+dHlwZSAhPSBIUFNCX0lTT19SRUNWKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gaXNvLT5ob3N0LT5kcml2ZXItPmlzb2N0bChpc28sIFJFQ1ZfRkxVU0gsIDApOworfQorCitzdGF0aWMgaW50IGRvX2lzb194bWl0X3N0YXJ0KHN0cnVjdCBocHNiX2lzbyAqaXNvLCBpbnQgY3ljbGUpCit7CisJaW50IHJldHZhbCA9IGlzby0+aG9zdC0+ZHJpdmVyLT5pc29jdGwoaXNvLCBYTUlUX1NUQVJULCBjeWNsZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlzby0+ZmxhZ3MgfD0gSFBTQl9JU09fRFJJVkVSX1NUQVJURUQ7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGhwc2JfaXNvX3htaXRfc3RhcnQoc3RydWN0IGhwc2JfaXNvICppc28sIGludCBjeWNsZSwgaW50IHByZWJ1ZmZlcikKK3sKKwlpZiAoaXNvLT50eXBlICE9IEhQU0JfSVNPX1hNSVQpCisJCXJldHVybiAtMTsKKworCWlmIChpc28tPmZsYWdzICYgSFBTQl9JU09fRFJJVkVSX1NUQVJURUQpCisJCXJldHVybiAwOworCisJaWYgKGN5Y2xlIDwgLTEpCisJCWN5Y2xlID0gLTE7CisJZWxzZSBpZiAoY3ljbGUgPj0gODAwMCkKKwkJY3ljbGUgJT0gODAwMDsKKworCWlzby0+eG1pdF9jeWNsZSA9IGN5Y2xlOworCisJaWYgKHByZWJ1ZmZlciA8IDApCisJCXByZWJ1ZmZlciA9IGlzby0+YnVmX3BhY2tldHM7CisJZWxzZSBpZiAocHJlYnVmZmVyID09IDApCisJCXByZWJ1ZmZlciA9IDE7CisKKwlpZiAocHJlYnVmZmVyID4gaXNvLT5idWZfcGFja2V0cykKKwkJcHJlYnVmZmVyID0gaXNvLT5idWZfcGFja2V0czsKKworCWlzby0+cHJlYnVmZmVyID0gcHJlYnVmZmVyOworCisJLyogcmVtZW1iZXIgdGhlIHN0YXJ0aW5nIGN5Y2xlOyBETUEgd2lsbCBjb21tZW5jZSBmcm9tIHhtaXRfcXVldWVfcGFja2V0cygpCisJICAgb25jZSBlbm91Z2ggcGFja2V0cyBoYXZlIGJlZW4gYnVmZmVyZWQgKi8KKwlpc28tPnN0YXJ0X2N5Y2xlID0gY3ljbGU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhwc2JfaXNvX3JlY3Zfc3RhcnQoc3RydWN0IGhwc2JfaXNvICppc28sIGludCBjeWNsZSwgaW50IHRhZ19tYXNrLCBpbnQgc3luYykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaXNvY3RsX2FyZ3NbM107CisKKwlpZiAoaXNvLT50eXBlICE9IEhQU0JfSVNPX1JFQ1YpCisJCXJldHVybiAtMTsKKworCWlmIChpc28tPmZsYWdzICYgSFBTQl9JU09fRFJJVkVSX1NUQVJURUQpCisJCXJldHVybiAwOworCisJaWYgKGN5Y2xlIDwgLTEpCisJCWN5Y2xlID0gLTE7CisJZWxzZSBpZiAoY3ljbGUgPj0gODAwMCkKKwkJY3ljbGUgJT0gODAwMDsKKworCWlzb2N0bF9hcmdzWzBdID0gY3ljbGU7CisKKwlpZiAodGFnX21hc2sgPCAwKQorCQkvKiBtYXRjaCBhbGwgdGFncyAqLworCQl0YWdfbWFzayA9IDB4RjsKKwlpc29jdGxfYXJnc1sxXSA9IHRhZ19tYXNrOworCisJaXNvY3RsX2FyZ3NbMl0gPSBzeW5jOworCisJcmV0dmFsID0gaXNvLT5ob3N0LT5kcml2ZXItPmlzb2N0bChpc28sIFJFQ1ZfU1RBUlQsICh1bnNpZ25lZCBsb25nKSAmaXNvY3RsX2FyZ3NbMF0pOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpc28tPmZsYWdzIHw9IEhQU0JfSVNPX0RSSVZFUl9TVEFSVEVEOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciBoYXMgbm90IHN1cHBsaWVkIGJvZ3VzIHZhbHVlcyBvZiBvZmZzZXQvbGVuCisgICB0aGF0IHdvdWxkIGNhdXNlIHRoZSBrZXJuZWwgdG8gYWNjZXNzIG1lbW9yeSBvdXRzaWRlIHRoZSBidWZmZXIgKi8KKworc3RhdGljIGludCBocHNiX2lzb19jaGVja19vZmZzZXRfbGVuKHN0cnVjdCBocHNiX2lzbyAqaXNvLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpvdXRfb2Zmc2V0LCB1bnNpZ25lZCBzaG9ydCAqb3V0X2xlbikKK3sKKwlpZiAob2Zmc2V0ID49IGlzby0+YnVmX3NpemUpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogbWFrZSBzdXJlIHRoZSBwYWNrZXQgZG9lcyBub3QgZ28gYmV5b25kIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworCWlmIChvZmZzZXQgKyBsZW4gPiBpc28tPmJ1Zl9zaXplKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIGNoZWNrIGZvciB3cmFwLWFyb3VuZCAqLworCWlmIChvZmZzZXQgKyBsZW4gPCBvZmZzZXQpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogbm93IHdlIGNhbiB0cnVzdCAnb2Zmc2V0JyBhbmQgJ2xlbmd0aCcgKi8KKwkqb3V0X29mZnNldCA9IG9mZnNldDsKKwkqb3V0X2xlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCisKK2ludCBocHNiX2lzb194bWl0X3F1ZXVlX3BhY2tldChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdTMyIG9mZnNldCwgdTE2IGxlbiwgdTggdGFnLCB1OCBzeSkKK3sKKwlzdHJ1Y3QgaHBzYl9pc29fcGFja2V0X2luZm8gKmluZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnY7CisKKwlpZiAoaXNvLT50eXBlICE9IEhQU0JfSVNPX1hNSVQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogaXMgdGhlcmUgc3BhY2UgaW4gdGhlIGJ1ZmZlcj8gKi8KKwlpZiAoaXNvLT5uX3JlYWR5X3BhY2tldHMgPD0gMCkgeworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWluZm8gPSAmaXNvLT5pbmZvc1tpc28tPmZpcnN0X3BhY2tldF07CisKKwkvKiBjaGVjayBmb3IgYm9ndXMgb2Zmc2V0L2xlbmd0aCAqLworCWlmIChocHNiX2lzb19jaGVja19vZmZzZXRfbGVuKGlzbywgb2Zmc2V0LCBsZW4sICZpbmZvLT5vZmZzZXQsICZpbmZvLT5sZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluZm8tPnRhZyA9IHRhZzsKKwlpbmZvLT5zeSA9IHN5OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzby0+bG9jaywgZmxhZ3MpOworCisJcnYgPSBpc28tPmhvc3QtPmRyaXZlci0+aXNvY3RsKGlzbywgWE1JVF9RVUVVRSwgKHVuc2lnbmVkIGxvbmcpIGluZm8pOworCWlmIChydikKKwkJZ290byBvdXQ7CisKKwkvKiBpbmNyZW1lbnQgY3Vyc29ycyAqLworCWlzby0+Zmlyc3RfcGFja2V0ID0gKGlzby0+Zmlyc3RfcGFja2V0KzEpICUgaXNvLT5idWZfcGFja2V0czsKKwlpc28tPnhtaXRfY3ljbGUgPSAoaXNvLT54bWl0X2N5Y2xlKzEpICUgODAwMDsKKwlpc28tPm5fcmVhZHlfcGFja2V0cy0tOworCisJaWYgKGlzby0+cHJlYnVmZmVyICE9IDApIHsKKwkJaXNvLT5wcmVidWZmZXItLTsKKwkJaWYgKGlzby0+cHJlYnVmZmVyIDw9IDApIHsKKwkJCWlzby0+cHJlYnVmZmVyID0gMDsKKwkJCXJ2ID0gZG9faXNvX3htaXRfc3RhcnQoaXNvLCBpc28tPnN0YXJ0X2N5Y2xlKTsKKwkJfQorCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzby0+bG9jaywgZmxhZ3MpOworCXJldHVybiBydjsKK30KKworaW50IGhwc2JfaXNvX3htaXRfc3luYyhzdHJ1Y3QgaHBzYl9pc28gKmlzbykKK3sKKwlpZiAoaXNvLT50eXBlICE9IEhQU0JfSVNPX1hNSVQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpc28tPndhaXRxLCBocHNiX2lzb19uX3JlYWR5KGlzbykgPT0gaXNvLT5idWZfcGFja2V0cyk7Cit9CisKK3ZvaWQgaHBzYl9pc29fcGFja2V0X3NlbnQoc3RydWN0IGhwc2JfaXNvICppc28sIGludCBjeWNsZSwgaW50IGVycm9yKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzby0+bG9jaywgZmxhZ3MpOworCisJLyogcHJlZGljdCB0aGUgY3ljbGUgb2YgdGhlIG5leHQgcGFja2V0IHRvIGJlIHF1ZXVlZCAqLworCisJLyoganVtcCBhaGVhZCBieSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCBhcmUgYWxyZWFkeSBidWZmZXJlZCAqLworCWN5Y2xlICs9IGlzby0+YnVmX3BhY2tldHMgLSBpc28tPm5fcmVhZHlfcGFja2V0czsKKwljeWNsZSAlPSA4MDAwOworCisJaXNvLT54bWl0X2N5Y2xlID0gY3ljbGU7CisJaXNvLT5uX3JlYWR5X3BhY2tldHMrKzsKKwlpc28tPnBrdF9kbWEgPSAoaXNvLT5wa3RfZG1hICsgMSkgJSBpc28tPmJ1Zl9wYWNrZXRzOworCisJaWYgKGlzby0+bl9yZWFkeV9wYWNrZXRzID09IGlzby0+YnVmX3BhY2tldHMgfHwgZXJyb3IgIT0gMCkgeworCQkvKiB0aGUgYnVmZmVyIGhhcyBydW4gZW1wdHkhICovCisJCWF0b21pY19pbmMoJmlzby0+b3ZlcmZsb3dzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc28tPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQoc3RydWN0IGhwc2JfaXNvICppc28sIHUzMiBvZmZzZXQsIHUxNiBsZW4sCisJCQkgICAgICB1MTYgY3ljbGUsIHU4IGNoYW5uZWwsIHU4IHRhZywgdTggc3kpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaXNvLT5uX3JlYWR5X3BhY2tldHMgPT0gaXNvLT5idWZfcGFja2V0cykgeworCQkvKiBvdmVyZmxvdyEgKi8KKwkJYXRvbWljX2luYygmaXNvLT5vdmVyZmxvd3MpOworCX0gZWxzZSB7CisJCXN0cnVjdCBocHNiX2lzb19wYWNrZXRfaW5mbyAqaW5mbyA9ICZpc28tPmluZm9zW2lzby0+cGt0X2RtYV07CisJCWluZm8tPm9mZnNldCA9IG9mZnNldDsKKwkJaW5mby0+bGVuID0gbGVuOworCQlpbmZvLT5jeWNsZSA9IGN5Y2xlOworCQlpbmZvLT5jaGFubmVsID0gY2hhbm5lbDsKKwkJaW5mby0+dGFnID0gdGFnOworCQlpbmZvLT5zeSA9IHN5OworCisJCWlzby0+cGt0X2RtYSA9IChpc28tPnBrdF9kbWErMSkgJSBpc28tPmJ1Zl9wYWNrZXRzOworCQlpc28tPm5fcmVhZHlfcGFja2V0cysrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzby0+bG9jaywgZmxhZ3MpOworfQorCitpbnQgaHBzYl9pc29fcmVjdl9yZWxlYXNlX3BhY2tldHMoc3RydWN0IGhwc2JfaXNvICppc28sIHVuc2lnbmVkIGludCBuX3BhY2tldHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcnYgPSAwOworCisJaWYgKGlzby0+dHlwZSAhPSBIUFNCX0lTT19SRUNWKQorCQlyZXR1cm4gLTE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNvLT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG5fcGFja2V0czsgaSsrKSB7CisJCXJ2ID0gaXNvLT5ob3N0LT5kcml2ZXItPmlzb2N0bChpc28sIFJFQ1ZfUkVMRUFTRSwKKwkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSAmaXNvLT5pbmZvc1tpc28tPmZpcnN0X3BhY2tldF0pOworCQlpZiAocnYpCisJCQlicmVhazsKKworCQlpc28tPmZpcnN0X3BhY2tldCA9IChpc28tPmZpcnN0X3BhY2tldCsxKSAlIGlzby0+YnVmX3BhY2tldHM7CisJCWlzby0+bl9yZWFkeV9wYWNrZXRzLS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzby0+bG9jaywgZmxhZ3MpOworCXJldHVybiBydjsKK30KKwordm9pZCBocHNiX2lzb193YWtlKHN0cnVjdCBocHNiX2lzbyAqaXNvKQoreworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaXNvLT53YWl0cSk7CisKKwlpZiAoaXNvLT5jYWxsYmFjaykKKwkJaXNvLT5jYWxsYmFjayhpc28pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pc28uaCBiL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2NTRkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmgKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBJRUVFIDEzOTQgZm9yIExpbnV4CisgKgorICoga2VybmVsIElTTyB0cmFuc21pc3Npb24vcmVjZXB0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIE1hYXMgRGlnaXRhbCBMTEMKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSByb290CisgKiBkaXJlY3Rvcnkgb2YgdGhlIGtlcm5lbCBzb3VyY2VzIGZvciBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgSUVFRTEzOTRfSVNPX0gKKyNkZWZpbmUgSUVFRTEzOTRfSVNPX0gKKworI2luY2x1ZGUgImhvc3RzLmgiCisjaW5jbHVkZSAiZG1hLmgiCisKKy8qIGhpZ2gtbGV2ZWwgSVNPIGludGVyZmFjZSAqLworCisvKiBUaGlzIEFQSSBzZW5kcyBhbmQgcmVjZWl2ZXMgaXNvY2hyb25vdXMgcGFja2V0cyBvbiBhIGxhcmdlLAorICAgdmlydHVhbGx5LWNvbnRpZ3VvdXMga2VybmVsIG1lbW9yeSBidWZmZXIuIFRoZSBidWZmZXIgbWF5IGJlIG1hcHBlZAorICAgaW50byBhIHVzZXItc3BhY2UgcHJvY2VzcyBmb3IgemVyby1jb3B5IHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uLgorCisgICBUaGVyZSBhcmUgbm8gZXhwbGljaXQgYm91bmRhcmllcyBiZXR3ZWVuIHBhY2tldHMgaW4gdGhlIGJ1ZmZlci4gQQorICAgcGFja2V0IG1heSBiZSB0cmFuc21pdHRlZCBvciByZWNlaXZlZCBhdCBhbnkgbG9jYXRpb24uIEhvd2V2ZXIsCisgICBsb3ctbGV2ZWwgZHJpdmVycyBtYXkgaW1wb3NlIGNlcnRhaW4gcmVzdHJpY3Rpb25zIG9uIGFsaWdubWVudCBvcgorICAgc2l6ZSBvZiBwYWNrZXRzLiAoZS5nLiBpbiBPSENJIG5vIHBhY2tldCBtYXkgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LAorICAgYW5kIHBhY2tldHMgc2hvdWxkIGJlIHF1YWRsZXQtYWxpZ25lZCkKKyovCisKKy8qIFBhY2tldCBkZXNjcmlwdG9yIC0gdGhlIEFQSSBtYWludGFpbnMgYSByaW5nIGJ1ZmZlciBvZiB0aGVzZSBwYWNrZXQKKyAgIGRlc2NyaXB0b3JzIGluIGtlcm5lbCBtZW1vcnkgKGhwc2JfaXNvLmluZm9zW10pLiAgKi8KKworc3RydWN0IGhwc2JfaXNvX3BhY2tldF9pbmZvIHsKKwkvKiBvZmZzZXQgb2YgZGF0YSBwYXlsb2FkIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBidWZmZXIgKi8KKwlfX3UzMiBvZmZzZXQ7CisKKwkvKiBsZW5ndGggb2YgdGhlIGRhdGEgcGF5bG9hZCwgaW4gYnl0ZXMgKG5vdCBpbmNsdWRpbmcgdGhlIGlzb2Nocm9ub3VzIGhlYWRlcikgKi8KKwlfX3UxNiBsZW47CisKKwkvKiAocmVjdiBvbmx5KSB0aGUgY3ljbGUgbnVtYmVyIChtb2QgODAwMCkgb24gd2hpY2ggdGhlIHBhY2tldCB3YXMgcmVjZWl2ZWQgKi8KKwlfX3UxNiBjeWNsZTsKKworCS8qIChyZWN2IG9ubHkpIGNoYW5uZWwgb24gd2hpY2ggdGhlIHBhY2tldCB3YXMgcmVjZWl2ZWQgKi8KKwlfX3U4IGNoYW5uZWw7CisKKwkvKiAyLWJpdCAndGFnJyBhbmQgNC1iaXQgJ3N5JyBmaWVsZHMgb2YgdGhlIGlzb2Nocm9ub3VzIGhlYWRlciAqLworCV9fdTggdGFnOworCV9fdTggc3k7Cit9OworCitlbnVtIGhwc2JfaXNvX3R5cGUgeyBIUFNCX0lTT19SRUNWID0gMCwgSFBTQl9JU09fWE1JVCA9IDEgfTsKKworLyogVGhlIG1vZGUgb2YgdGhlIGRtYSB3aGVuIHJlY2VpdmluZyBpc28gZGF0YS4gTXVzdCBiZSBzdXBwb3J0ZWQgYnkgY2hpcCAqLworZW51bSByYXcxMzk0X2lzb19kbWFfcmVjdl9tb2RlIHsKKwlIUFNCX0lTT19ETUFfREVGQVVMVCA9IC0xLAorCUhQU0JfSVNPX0RNQV9PTERfQUJJID0gMCwKKwlIUFNCX0lTT19ETUFfQlVGRkVSRklMTCA9IDEsCisJSFBTQl9JU09fRE1BX1BBQ0tFVF9QRVJfQlVGRkVSID0gMgorfTsKKworc3RydWN0IGhwc2JfaXNvIHsKKwllbnVtIGhwc2JfaXNvX3R5cGUgdHlwZTsKKworCS8qIHBvaW50ZXIgdG8gbG93LWxldmVsIGRyaXZlciBhbmQgaXRzIHByaXZhdGUgZGF0YSAqLworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CisJdm9pZCAqaG9zdGRhdGE7CisKKwkvKiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCAoZnJvbSBpbnRlcnJ1cHQgY29udGV4dCkgYWZ0ZXIKKyAgICAgICAgICAgb3V0Z29pbmcgcGFja2V0cyBoYXZlIGJlZW4gc2VudCwgb3IgaW5jb21pbmcgcGFja2V0cyBoYXZlCisgICAgICAgICAgIGFycml2ZWQgKi8KKwl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBocHNiX2lzbyopOworCisJLyogd2FpdCBmb3IgYnVmZmVyIHNwYWNlICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CisKKwlpbnQgc3BlZWQ7IC8qIElFRUUxMzk0X1NQRUVEXzEwMCwgMjAwLCBvciA0MDAgKi8KKwlpbnQgY2hhbm5lbDsgLyogLTEgaWYgbXVsdGljaGFubmVsICovCisJaW50IGRtYV9tb2RlOyAvKiBkbWEgcmVjZWl2ZSBtb2RlICovCisKKworCS8qIGdyZWF0ZXN0ICMgb2YgcGFja2V0cyBiZXR3ZWVuIGludGVycnVwdHMgLSBjb250cm9scworCSAgIHRoZSBtYXhpbXVtIGxhdGVuY3kgb2YgdGhlIGJ1ZmZlciAqLworCWludCBpcnFfaW50ZXJ2YWw7CisKKwkvKiB0aGUgYnVmZmVyIGZvciBwYWNrZXQgZGF0YSBwYXlsb2FkcyAqLworCXN0cnVjdCBkbWFfcmVnaW9uIGRhdGFfYnVmOworCisJLyogc2l6ZSBvZiBkYXRhX2J1ZiwgaW4gYnl0ZXMgKGFsd2F5cyBhIG11bHRpcGxlIG9mIFBBR0VfU0laRSkgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3NpemU7CisKKwkvKiAjIG9mIHBhY2tldHMgaW4gdGhlIHJpbmdidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3BhY2tldHM7CisKKwkvKiBwcm90ZWN0cyBwYWNrZXQgY3Vyc29ycyAqLworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBwYWNrZXQgdGhhdCB3aWxsIGJlIHByb2R1Y2VkCisJICAgb3IgY29uc3VtZWQgYnkgdGhlIHVzZXIgKi8KKwlpbnQgZmlyc3RfcGFja2V0OworCisJLyogdGhlIGluZGV4IG9mIHRoZSBuZXh0IHBhY2tldCB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQKKwkgICBvciByZWNlaXZlZCBieSB0aGUgMTM5NCBoYXJkd2FyZSAqLworCWludCBwa3RfZG1hOworCisJLyogaG93IG1hbnkgcGFja2V0cywgc3RhcnRpbmcgYXQgZmlyc3RfcGFja2V0OgorCSAgICh0cmFuc21pdCkgYXJlIHJlYWR5IHRvIGJlIGZpbGxlZCB3aXRoIGRhdGEKKwkgICAocmVjZWl2ZSkgIGNvbnRhaW4gcmVjZWl2ZWQgZGF0YSAqLworCWludCBuX3JlYWR5X3BhY2tldHM7CisKKwkvKiBob3cgbWFueSB0aW1lcyB0aGUgYnVmZmVyIGhhcyBvdmVyZmxvd2VkIG9yIHVuZGVyZmxvd2VkICovCisJYXRvbWljX3Qgb3ZlcmZsb3dzOworCisJLyogcHJpdmF0ZSBmbGFncyB0byB0cmFjayBpbml0aWFsaXphdGlvbiBwcm9ncmVzcyAqLworI2RlZmluZSBIUFNCX0lTT19EUklWRVJfSU5JVCAgICAgKDE8PDApCisjZGVmaW5lIEhQU0JfSVNPX0RSSVZFUl9TVEFSVEVEICAoMTw8MSkKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwkvKiAjIG9mIHBhY2tldHMgbGVmdCB0byBwcmVidWZmZXIgKHhtaXQgb25seSkgKi8KKwlpbnQgcHJlYnVmZmVyOworCisJLyogc3RhcnRpbmcgY3ljbGUgZm9yIERNQSAoeG1pdCBvbmx5KSAqLworCWludCBzdGFydF9jeWNsZTsKKworCS8qIGN5Y2xlIGF0IHdoaWNoIG5leHQgcGFja2V0IHdpbGwgYmUgdHJhbnNtaXR0ZWQsCisJICAgLTEgaWYgbm90IGtub3duICovCisJaW50IHhtaXRfY3ljbGU7CisKKwkvKiByaW5nYnVmZmVyIG9mIHBhY2tldCBkZXNjcmlwdG9ycyBpbiByZWd1bGFyIGtlcm5lbCBtZW1vcnkKKwkgKiBYWFggS2VlcCB0aGlzIGxhc3QsIHNpbmNlIHdlIHVzZSBvdmVyLWFsbG9jYXRlZCBtZW1vcnkgZnJvbQorCSAqIHRoaXMgZW50cnkgdG8gZmlsbCB0aGlzIGZpZWxkLiAqLworCXN0cnVjdCBocHNiX2lzb19wYWNrZXRfaW5mbyAqaW5mb3M7Cit9OworCisvKiBmdW5jdGlvbnMgYXZhaWxhYmxlIHRvIGhpZ2gtbGV2ZWwgZHJpdmVycyAoZS5nLiByYXcxMzk0KSAqLworCisvKiBhbGxvY2F0ZSB0aGUgYnVmZmVyIGFuZCBETUEgY29udGV4dCAqLworCitzdHJ1Y3QgaHBzYl9pc28qIGhwc2JfaXNvX3htaXRfaW5pdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZGF0YV9idWZfc2l6ZSwKKwkJCQkgICAgdW5zaWduZWQgaW50IGJ1Zl9wYWNrZXRzLAorCQkJCSAgICBpbnQgY2hhbm5lbCwKKwkJCQkgICAgaW50IHNwZWVkLAorCQkJCSAgICBpbnQgaXJxX2ludGVydmFsLAorCQkJCSAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBocHNiX2lzbyopKTsKKworLyogbm90ZTogaWYgY2hhbm5lbCA9IC0xLCBtdWx0aS1jaGFubmVsIHJlY2VpdmUgaXMgZW5hYmxlZCAqLworc3RydWN0IGhwc2JfaXNvKiBocHNiX2lzb19yZWN2X2luaXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGRhdGFfYnVmX3NpemUsCisJCQkJICAgIHVuc2lnbmVkIGludCBidWZfcGFja2V0cywKKwkJCQkgICAgaW50IGNoYW5uZWwsCisJCQkJICAgIGludCBkbWFfbW9kZSwKKwkJCQkgICAgaW50IGlycV9pbnRlcnZhbCwKKwkJCQkgICAgdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgaHBzYl9pc28qKSk7CisKKy8qIG11bHRpLWNoYW5uZWwgb25seSAqLworaW50IGhwc2JfaXNvX3JlY3ZfbGlzdGVuX2NoYW5uZWwoc3RydWN0IGhwc2JfaXNvICppc28sIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCk7CitpbnQgaHBzYl9pc29fcmVjdl91bmxpc3Rlbl9jaGFubmVsKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwpOworaW50IGhwc2JfaXNvX3JlY3Zfc2V0X2NoYW5uZWxfbWFzayhzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdTY0IG1hc2spOworCisvKiBzdGFydC9zdG9wIERNQSAqLworaW50IGhwc2JfaXNvX3htaXRfc3RhcnQoc3RydWN0IGhwc2JfaXNvICppc28sIGludCBzdGFydF9vbl9jeWNsZSwgaW50IHByZWJ1ZmZlcik7CitpbnQgaHBzYl9pc29fcmVjdl9zdGFydChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgaW50IHN0YXJ0X29uX2N5Y2xlLCBpbnQgdGFnX21hc2ssIGludCBzeW5jKTsKK3ZvaWQgaHBzYl9pc29fc3RvcChzdHJ1Y3QgaHBzYl9pc28gKmlzbyk7CisKKy8qIGRlYWxsb2NhdGUgYnVmZmVyIGFuZCBETUEgY29udGV4dCAqLwordm9pZCBocHNiX2lzb19zaHV0ZG93bihzdHJ1Y3QgaHBzYl9pc28gKmlzbyk7CisKKy8qIHF1ZXVlIGEgcGFja2V0IGZvciB0cmFuc21pc3Npb24uICdvZmZzZXQnIGlzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgICBETUEgYnVmZmVyLCB3aGVyZSB0aGUgcGFja2V0J3MgZGF0YSBwYXlsb2FkIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBwbGFjZWQgKi8KK2ludCBocHNiX2lzb194bWl0X3F1ZXVlX3BhY2tldChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgdTMyIG9mZnNldCwgdTE2IGxlbiwgdTggdGFnLCB1OCBzeSk7CisKKy8qIHdhaXQgdW50aWwgYWxsIHF1ZXVlZCBwYWNrZXRzIGhhdmUgYmVlbiB0cmFuc21pdHRlZCB0byB0aGUgYnVzICovCitpbnQgaHBzYl9pc29feG1pdF9zeW5jKHN0cnVjdCBocHNiX2lzbyAqaXNvKTsKKworLyogTiBwYWNrZXRzIGhhdmUgYmVlbiByZWFkIG91dCBvZiB0aGUgYnVmZmVyLCByZS11c2UgdGhlIGJ1ZmZlciBzcGFjZSAqLworaW50ICBocHNiX2lzb19yZWN2X3JlbGVhc2VfcGFja2V0cyhzdHJ1Y3QgaHBzYl9pc28gKnJlY3YsIHVuc2lnbmVkIGludCBuX3BhY2tldHMpOworCisvKiBjaGVjayBmb3IgYXJyaXZhbCBvZiBuZXcgcGFja2V0cyBpbW1lZGlhdGVseSAoZXZlbiBpZiBpcnFfaW50ZXJ2YWwKKyAgIGhhcyBub3QgeWV0IGJlZW4gcmVhY2hlZCkgKi8KK2ludCBocHNiX2lzb19yZWN2X2ZsdXNoKHN0cnVjdCBocHNiX2lzbyAqaXNvKTsKKworLyogcmV0dXJucyAjIG9mIHBhY2tldHMgcmVhZHkgdG8gc2VuZCBvciByZWNlaXZlICovCitpbnQgaHBzYl9pc29fbl9yZWFkeShzdHJ1Y3QgaHBzYl9pc28gKmlzbyk7CisKKy8qIHRoZSBmb2xsb3dpbmcgYXJlIGNhbGxiYWNrcyBhdmFpbGFibGUgdG8gbG93LWxldmVsIGRyaXZlcnMgKi8KKworLyogY2FsbCBhZnRlciBhIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZCB0byB0aGUgYnVzIChpbnRlcnJ1cHQgY29udGV4dCBpcyBPSykKKyAgICdjeWNsZScgaXMgdGhlIF9leGFjdF8gY3ljbGUgdGhlIHBhY2tldCB3YXMgc2VudCBvbgorICAgJ2Vycm9yJyBzaG91bGQgYmUgbm9uLXplcm8gaWYgc29tZSBzb3J0IG9mIGVycm9yIG9jY3VycmVkIHdoZW4gc2VuZGluZyB0aGUgcGFja2V0CisqLwordm9pZCBocHNiX2lzb19wYWNrZXRfc2VudChzdHJ1Y3QgaHBzYl9pc28gKmlzbywgaW50IGN5Y2xlLCBpbnQgZXJyb3IpOworCisvKiBjYWxsIGFmdGVyIGEgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkIChpbnRlcnJ1cHQgY29udGV4dCBPSykgKi8KK3ZvaWQgaHBzYl9pc29fcGFja2V0X3JlY2VpdmVkKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1MzIgb2Zmc2V0LCB1MTYgbGVuLAorCQkJICAgICAgdTE2IGN5Y2xlLCB1OCBjaGFubmVsLCB1OCB0YWcsIHU4IHN5KTsKKworLyogY2FsbCB0byB3YWtlIHdhaXRpbmcgcHJvY2Vzc2VzIGFmdGVyIGJ1ZmZlciBzcGFjZSBoYXMgb3BlbmVkIHVwLiAqLwordm9pZCBocHNiX2lzb193YWtlKHN0cnVjdCBocHNiX2lzbyAqaXNvKTsKKworI2VuZGlmIC8qIElFRUUxMzk0X0lTT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZTMwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwpAQCAtMCwwICsxLDE3MzIgQEAKKy8qCisgKiBOb2RlIGluZm9ybWF0aW9uIChDb25maWdST00pIGNvbGxlY3Rpb24gYW5kIG1hbmFnZW1lbnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwCQlBbmRyZWFzIEUuIEJvbWJlCisgKiAgICAgICAgICAgICAgIDIwMDEtMjAwMwlCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm5ldD4KKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSByb290CisgKiBkaXJlY3Rvcnkgb2YgdGhlIGtlcm5lbCBzb3VyY2VzIGZvciBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjaW5jbHVkZSAiaWVlZTEzOTRfdHlwZXMuaCIKKyNpbmNsdWRlICJpZWVlMTM5NC5oIgorI2luY2x1ZGUgImllZWUxMzk0X2NvcmUuaCIKKyNpbmNsdWRlICJob3N0cy5oIgorI2luY2x1ZGUgImllZWUxMzk0X3RyYW5zYWN0aW9ucy5oIgorI2luY2x1ZGUgImhpZ2hsZXZlbC5oIgorI2luY2x1ZGUgImNzci5oIgorI2luY2x1ZGUgIm5vZGVtZ3IuaCIKKworc3RhdGljIGludCBpZ25vcmVfZHJpdmVycyA9IDA7Cittb2R1bGVfcGFyYW0oaWdub3JlX2RyaXZlcnMsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGlnbm9yZV9kcml2ZXJzLCAiRGlzYWJsZSBhdXRvbWF0aWMgcHJvYmluZyBmb3IgZHJpdmVycy4iKTsKKworc3RydWN0IG5vZGVtZ3JfY3NyX2luZm8geworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CisJbm9kZWlkX3Qgbm9kZWlkOworCXVuc2lnbmVkIGludCBnZW5lcmF0aW9uOworfTsKKworCitzdGF0aWMgY2hhciAqbm9kZW1ncl9maW5kX291aV9uYW1lKGludCBvdWkpCit7CisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X09VSV9EQgorCWV4dGVybiBzdHJ1Y3Qgb3VpX2xpc3Rfc3RydWN0IHsKKwkJaW50IG91aTsKKwkJY2hhciAqbmFtZTsKKwl9IG91aV9saXN0W107CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBvdWlfbGlzdFtpXS5uYW1lOyBpKyspCisJCWlmIChvdWlfbGlzdFtpXS5vdWkgPT0gb3VpKQorCQkJcmV0dXJuIG91aV9saXN0W2ldLm5hbWU7CisjZW5kaWYKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgaW50IG5vZGVtZ3JfYnVzX3JlYWQoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHU2NCBhZGRyLCB1MTYgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwgdm9pZCAqX19jaSkKK3sKKwlzdHJ1Y3Qgbm9kZW1ncl9jc3JfaW5mbyAqY2kgPSAoc3RydWN0IG5vZGVtZ3JfY3NyX2luZm8qKV9fY2k7CisJaW50IGksIHJldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJldCA9IGhwc2JfcmVhZChjaS0+aG9zdCwgY2ktPm5vZGVpZCwgY2ktPmdlbmVyYXRpb24sIGFkZHIsCisJCQkJYnVmZmVyLCBsZW5ndGgpOworCQlpZiAoIXJldCkKKwkJCWJyZWFrOworCisJCWlmIChtc2xlZXBfaW50ZXJydXB0aWJsZSgzMzQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5vZGVtZ3JfZ2V0X21heF9yb20ocXVhZGxldF90ICpidXNfaW5mb19kYXRhLCB2b2lkICpfX2NpKQoreworCXJldHVybiAoQ1NSMTIxMl9CRTMyX1RPX0NQVShidXNfaW5mb19kYXRhWzJdKSA+PiA4KSAmIDB4MzsKK30KKworc3RhdGljIHN0cnVjdCBjc3IxMjEyX2J1c19vcHMgbm9kZW1ncl9jc3Jfb3BzID0geworCS5idXNfcmVhZCA9CW5vZGVtZ3JfYnVzX3JlYWQsCisJLmdldF9tYXhfcm9tID0Jbm9kZW1ncl9nZXRfbWF4X3JvbQorfTsKKworCisvKgorICogQmFzaWNhbGx5IHdoYXQgd2UgZG8gaGVyZSBpcyBzdGFydCBvZmYgcmV0cmlldmluZyB0aGUgYnVzX2luZm8gYmxvY2suCisgKiBGcm9tIHRoZXJlIHdpbGwgZmlsbCBpbiBzb21lIGluZm8gYWJvdXQgdGhlIG5vZGUsIHZlcmlmeSBpdCBpcyBvZiBJRUVFCisgKiAxMzk0IHR5cGUsIGFuZCB0aGF0IHRoZSBjcmMgY2hlY2tzIG91dCBvay4gQWZ0ZXIgdGhhdCB3ZSBzdGFydCBvZmYgd2l0aAorICogdGhlIHJvb3QgZGlyZWN0b3J5LCBhbmQgc3ViZGlyZWN0b3JpZXMuIFRvIGRvIHRoaXMsIHdlIHJldHJpZXZlIHRoZQorICogcXVhZGxldCBoZWFkZXIgZm9yIGEgZGlyZWN0b3J5LCBmaW5kIG91dCB0aGUgbGVuZ3RoLCBhbmQgcmV0cmlldmUgdGhlCisgKiBjb21wbGV0ZSBkaXJlY3RvcnkgZW50cnkgKGJlIGl0IGEgbGVhZiBvciBhIGRpcmVjdG9yeSkuIFdlIHRoZW4gcHJvY2VzcworICogaXQgYW5kIGFkZCB0aGUgaW5mbyB0byBvdXIgc3RydWN0dXJlIGZvciB0aGF0IHBhcnRpY3VsYXIgbm9kZS4KKyAqCisgKiBXZSB2ZXJpZnkgQ1JDJ3MgYWxvbmcgdGhlIHdheSBmb3IgZWFjaCBkaXJlY3RvcnkvYmxvY2svbGVhZi4gVGhlIGVudGlyZQorICogbm9kZSBzdHJ1Y3R1cmUgaXMgZ2VuZXJpYywgYW5kIHNpbXBseSBzdG9yZXMgdGhlIGluZm9ybWF0aW9uIGluIGEgd2F5CisgKiB0aGF0J3MgZWFzeSB0byBwYXJzZSBieSB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qCisgKiBUaGUgbm9kZW1nciByZWxpZXMgaGVhdmlseSBvbiB0aGUgRHJpdmVyIE1vZGVsIGZvciBkZXZpY2UgY2FsbGJhY2tzIGFuZAorICogZHJpdmVyL2RldmljZSBtYXBwaW5ncy4gVGhlIG9sZCBub2RlbWdyIHVzZWQgdG8gaGFuZGxlIGFsbCB0aGlzIGl0c2VsZiwKKyAqIGJ1dCBub3cgd2UgYXJlIG11Y2ggc2ltcGxlciBiZWNhdXNlIG9mIHRoZSBMRE0uCisgKi8KKworc3RhdGljIERFQ0xBUkVfTVVURVgobm9kZW1ncl9zZXJpYWxpemUpOworCitzdHJ1Y3QgaG9zdF9pbmZvIHsKKwlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBleGl0ZWQ7CisJc3RydWN0IHNlbWFwaG9yZSByZXNldF9zZW07CisJaW50IHBpZDsKKwljaGFyIGRhZW1vbl9uYW1lWzE1XTsKKwlpbnQga2lsbF9tZTsKK307CisKK3N0YXRpYyBpbnQgbm9kZW1ncl9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpOworc3RhdGljIGludCBub2RlbWdyX2hvdHBsdWcoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwkJCSAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKTsKK3N0YXRpYyB2b2lkIG5vZGVtZ3JfcmVzdW1lX25lKHN0cnVjdCBub2RlX2VudHJ5ICpuZSk7CitzdGF0aWMgdm9pZCBub2RlbWdyX3JlbW92ZV9uZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUpOworc3RhdGljIHN0cnVjdCBub2RlX2VudHJ5ICpmaW5kX2VudHJ5X2J5X2d1aWQodTY0IGd1aWQpOworCitzdHJ1Y3QgYnVzX3R5cGUgaWVlZTEzOTRfYnVzX3R5cGUgPSB7CisJLm5hbWUJCT0gImllZWUxMzk0IiwKKwkubWF0Y2gJCT0gbm9kZW1ncl9idXNfbWF0Y2gsCit9OworCitzdGF0aWMgdm9pZCBob3N0X2Nsc19yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKK3sKKwlwdXRfZGV2aWNlKCZjb250YWluZXJfb2YoKGNsYXNzX2RldiksIHN0cnVjdCBocHNiX2hvc3QsIGNsYXNzX2RldiktPmRldmljZSk7Cit9CisKK3N0cnVjdCBjbGFzcyBocHNiX2hvc3RfY2xhc3MgPSB7CisJLm5hbWUJCT0gImllZWUxMzk0X2hvc3QiLAorCS5yZWxlYXNlCT0gaG9zdF9jbHNfcmVsZWFzZSwKK307CisKK3N0YXRpYyB2b2lkIG5lX2Nsc19yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKK3sKKwlwdXRfZGV2aWNlKCZjb250YWluZXJfb2YoKGNsYXNzX2RldiksIHN0cnVjdCBub2RlX2VudHJ5LCBjbGFzc19kZXYpLT5kZXZpY2UpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzIG5vZGVtZ3JfbmVfY2xhc3MgPSB7CisJLm5hbWUJCT0gImllZWUxMzk0X25vZGUiLAorCS5yZWxlYXNlCT0gbmVfY2xzX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCB1ZF9jbHNfcmVsZWFzZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpCit7CisJcHV0X2RldmljZSgmY29udGFpbmVyX29mKChjbGFzc19kZXYpLCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGNsYXNzX2RldiktPmRldmljZSk7Cit9CisKKy8qIFRoZSBuYW1lIGhlcmUgaXMgb25seSBzbyB0aGF0IHVuaXQgZGlyZWN0b3J5IGhvdHBsdWcgd29ya3Mgd2l0aCBvbGQKKyAqIHN0eWxlIGhvdHBsdWcsIHdoaWNoIG9ubHkgZXZlciBkaWQgdW5pdCBkaXJlY3RvcmllcyBhbnl3YXkuICovCitzdGF0aWMgc3RydWN0IGNsYXNzIG5vZGVtZ3JfdWRfY2xhc3MgPSB7CisJLm5hbWUJCT0gImllZWUxMzk0IiwKKwkucmVsZWFzZQk9IHVkX2Nsc19yZWxlYXNlLAorCS5ob3RwbHVnCT0gbm9kZW1ncl9ob3RwbHVnLAorfTsKKworc3RhdGljIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCBub2RlbWdyX2hpZ2hsZXZlbDsKKworCitzdGF0aWMgdm9pZCBub2RlbWdyX3JlbGVhc2VfdWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGRldmljZSk7CisKKwlpZiAodWQtPnZlbmRvcl9uYW1lX2t2KQorCQljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKHVkLT52ZW5kb3JfbmFtZV9rdik7CisJaWYgKHVkLT5tb2RlbF9uYW1lX2t2KQorCQljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKHVkLT5tb2RlbF9uYW1lX2t2KTsKKworCWtmcmVlKHVkKTsKK30KKworc3RhdGljIHZvaWQgbm9kZW1ncl9yZWxlYXNlX25lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgZGV2aWNlKTsKKworCWlmIChuZS0+dmVuZG9yX25hbWVfa3YpCisJCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwobmUtPnZlbmRvcl9uYW1lX2t2KTsKKworCWtmcmVlKG5lKTsKK30KKworCitzdGF0aWMgdm9pZCBub2RlbWdyX3JlbGVhc2VfaG9zdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhwc2JfaG9zdCAqaG9zdCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBocHNiX2hvc3QsIGRldmljZSk7CisKKwljc3IxMjEyX2Rlc3Ryb3lfY3NyKGhvc3QtPmNzci5yb20pOworCisJa2ZyZWUoaG9zdCk7Cit9CisKK3N0YXRpYyBpbnQgbm9kZW1ncl91ZF9wbGF0Zm9ybV9kYXRhOworCitzdGF0aWMgc3RydWN0IGRldmljZSBub2RlbWdyX2Rldl90ZW1wbGF0ZV91ZCA9IHsKKwkuYnVzCQk9ICZpZWVlMTM5NF9idXNfdHlwZSwKKwkucmVsZWFzZQk9IG5vZGVtZ3JfcmVsZWFzZV91ZCwKKwkucGxhdGZvcm1fZGF0YQk9ICZub2RlbWdyX3VkX3BsYXRmb3JtX2RhdGEsCit9OworCitzdGF0aWMgc3RydWN0IGRldmljZSBub2RlbWdyX2Rldl90ZW1wbGF0ZV9uZSA9IHsKKwkuYnVzCQk9ICZpZWVlMTM5NF9idXNfdHlwZSwKKwkucmVsZWFzZQk9IG5vZGVtZ3JfcmVsZWFzZV9uZSwKK307CisKK3N0cnVjdCBkZXZpY2Ugbm9kZW1ncl9kZXZfdGVtcGxhdGVfaG9zdCA9IHsKKwkuYnVzCQk9ICZpZWVlMTM5NF9idXNfdHlwZSwKKwkucmVsZWFzZQk9IG5vZGVtZ3JfcmVsZWFzZV9ob3N0LAorfTsKKworCisjZGVmaW5lIGZ3X2F0dHIoY2xhc3MsIGNsYXNzX3R5cGUsIGZpZWxkLCB0eXBlLCBmb3JtYXRfc3RyaW5nKQkJXAorc3RhdGljIHNzaXplX3QgZndfc2hvd18jI2NsYXNzIyNfIyNmaWVsZCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpXAorewkJCQkJCQkJCVwKKwljbGFzc190eXBlICpjbGFzczsJCQkJCQlcCisJY2xhc3MgPSBjb250YWluZXJfb2YoZGV2LCBjbGFzc190eXBlLCBkZXZpY2UpOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsIGZvcm1hdF9zdHJpbmcsICh0eXBlKWNsYXNzLT5maWVsZCk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyXyMjY2xhc3MjI18jI2ZpZWxkID0gewkJXAorCS5hdHRyID0gey5uYW1lID0gX19zdHJpbmdpZnkoZmllbGQpLCAubW9kZSA9IFNfSVJVR08gfSwJCVwKKwkuc2hvdyAgID0gZndfc2hvd18jI2NsYXNzIyNfIyNmaWVsZCwJCQkJXAorfTsKKworI2RlZmluZSBmd19hdHRyX3RkKGNsYXNzLCBjbGFzc190eXBlLCB0ZF9rdikJCQkJXAorc3RhdGljIHNzaXplX3QgZndfc2hvd18jI2NsYXNzIyNfIyN0ZF9rdiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpXAorewkJCQkJCQkJCVwKKwlpbnQgbGVuOwkJCQkJCQlcCisJY2xhc3NfdHlwZSAqY2xhc3MgPSBjb250YWluZXJfb2YoZGV2LCBjbGFzc190eXBlLCBkZXZpY2UpOwlcCisJbGVuID0gKGNsYXNzLT50ZF9rdi0+dmFsdWUubGVhZi5sZW4gLSAyKSAqIHNpemVvZihxdWFkbGV0X3QpOwlcCisJbWVtY3B5KGJ1ZiwJCQkJCQkJXAorCSAgICAgICBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0RBVEEoY2xhc3MtPnRkX2t2KSwJXAorCSAgICAgICBsZW4pOwkJCQkJCQlcCisJd2hpbGUgKChidWYgKyBsZW4gLSAxKSA9PSAnXDAnKQkJCQkJXAorCQlsZW4tLTsJCQkJCQkJXAorCWJ1ZltsZW4rK10gPSAnXG4nOwkJCQkJCVwKKwlidWZbbGVuXSA9ICdcMCc7CQkJCQkJXAorCXJldHVybiBsZW47CQkJCQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfIyNjbGFzcyMjXyMjdGRfa3YgPSB7CQlcCisJLmF0dHIgPSB7Lm5hbWUgPSBfX3N0cmluZ2lmeSh0ZF9rdiksIC5tb2RlID0gU19JUlVHTyB9LAkJXAorCS5zaG93ICAgPSBmd19zaG93XyMjY2xhc3MjI18jI3RkX2t2LAkJCQlcCit9OworCisKKyNkZWZpbmUgZndfZHJ2X2F0dHIoZmllbGQsIHR5cGUsIGZvcm1hdF9zdHJpbmcpCQkJXAorc3RhdGljIHNzaXplX3QgZndfZHJ2X3Nob3dfIyNmaWVsZCAoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwgY2hhciAqYnVmKSBcCit7CQkJCQkJCQlcCisJc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyICpkcml2ZXI7CQkJXAorCWRyaXZlciA9IGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciwgZHJpdmVyKTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm9ybWF0X3N0cmluZywgKHR5cGUpZHJpdmVyLT5maWVsZCk7XAorfQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlIGRyaXZlcl9hdHRyX2Rydl8jI2ZpZWxkID0gewlcCisgICAgICAgIC5hdHRyID0gey5uYW1lID0gX19zdHJpbmdpZnkoZmllbGQpLCAubW9kZSA9IFNfSVJVR08gfSwJXAorICAgICAgICAuc2hvdyAgID0gZndfZHJ2X3Nob3dfIyNmaWVsZCwJCQkJXAorfTsKKworCitzdGF0aWMgc3NpemVfdCBmd19zaG93X25lX2J1c19vcHRpb25zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBub2RlX2VudHJ5ICpuZSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBub2RlX2VudHJ5LCBkZXZpY2UpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiSVJNQyglZCkgQ01DKCVkKSBJU0MoJWQpIEJNQyglZCkgUE1DKCVkKSBHRU4oJWQpICIKKwkJICAgICAgICJMU1BEKCVkKSBNQVhfUkVDKCVkKSBNQVhfUk9NKCVkKSBDWUNfQ0xLX0FDQyglZClcbiIsCisJCSAgICAgICBuZS0+YnVzb3B0LmlybWMsCisJCSAgICAgICBuZS0+YnVzb3B0LmNtYywgbmUtPmJ1c29wdC5pc2MsIG5lLT5idXNvcHQuYm1jLAorCQkgICAgICAgbmUtPmJ1c29wdC5wbWMsIG5lLT5idXNvcHQuZ2VuZXJhdGlvbiwgbmUtPmJ1c29wdC5sbmtzcGQsCisJCSAgICAgICBuZS0+YnVzb3B0Lm1heF9yZWMsCisJCSAgICAgICBuZS0+YnVzb3B0Lm1heF9yb20sCisJCSAgICAgICBuZS0+YnVzb3B0LmN5Y19jbGtfYWNjKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihidXNfb3B0aW9ucyxTX0lSVUdPLGZ3X3Nob3dfbmVfYnVzX29wdGlvbnMsTlVMTCk7CisKKworc3RhdGljIHNzaXplX3QgZndfc2hvd19uZV90bGFiZWxzX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IG5vZGVfZW50cnkgKm5lID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG5vZGVfZW50cnksIGRldmljZSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGF0b21pY19yZWFkKCZuZS0+dHBvb2wtPmNvdW50LmNvdW50KSArIDEpOworfQorc3RhdGljIERFVklDRV9BVFRSKHRsYWJlbHNfZnJlZSxTX0lSVUdPLGZ3X3Nob3dfbmVfdGxhYmVsc19mcmVlLE5VTEwpOworCisKK3N0YXRpYyBzc2l6ZV90IGZ3X3Nob3dfbmVfdGxhYmVsc19hbGxvY2F0aW9ucyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgZGV2aWNlKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgbmUtPnRwb29sLT5hbGxvY2F0aW9ucyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIodGxhYmVsc19hbGxvY2F0aW9ucyxTX0lSVUdPLGZ3X3Nob3dfbmVfdGxhYmVsc19hbGxvY2F0aW9ucyxOVUxMKTsKKworCitzdGF0aWMgc3NpemVfdCBmd19zaG93X25lX3RsYWJlbHNfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgZGV2aWNlKTsKKyNpZiAoQklUU19QRVJfTE9ORyA8PSAzMikKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOGx4JTA4bHhcbiIsIG5lLT50cG9vbC0+cG9vbFswXSwgbmUtPnRwb29sLT5wb29sWzFdKTsKKyNlbHNlCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDE2bHhcbiIsIG5lLT50cG9vbC0+cG9vbFswXSk7CisjZW5kaWYKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih0bGFiZWxzX21hc2ssIFNfSVJVR08sIGZ3X3Nob3dfbmVfdGxhYmVsc19tYXNrLCBOVUxMKTsKKworCitzdGF0aWMgc3NpemVfdCBmd19zZXRfaWdub3JlX2RyaXZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGRldmljZSk7CisJaW50IHN0YXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlpZiAoc3RhdGUgPT0gMSkgeworCQlkb3duX3dyaXRlKCZkZXYtPmJ1cy0+c3Vic3lzLnJ3c2VtKTsKKwkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldik7CisJCXVkLT5pZ25vcmVfZHJpdmVyID0gMTsKKwkJdXBfd3JpdGUoJmRldi0+YnVzLT5zdWJzeXMucndzZW0pOworCX0gZWxzZSBpZiAoIXN0YXRlKQorCQl1ZC0+aWdub3JlX2RyaXZlciA9IDA7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBmd19nZXRfaWdub3JlX2RyaXZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCBkZXZpY2UpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHVkLT5pZ25vcmVfZHJpdmVyKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihpZ25vcmVfZHJpdmVyLCBTX0lXVVNSIHwgU19JUlVHTywgZndfZ2V0X2lnbm9yZV9kcml2ZXIsIGZ3X3NldF9pZ25vcmVfZHJpdmVyKTsKKworCitzdGF0aWMgc3NpemVfdCBmd19zZXRfZGVzdHJveV9ub2RlKHN0cnVjdCBidXNfdHlwZSAqYnVzLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmU7CisJdTY0IGd1aWQgPSAodTY0KXNpbXBsZV9zdHJ0b3VsbChidWYsIE5VTEwsIDE2KTsKKworCW5lID0gZmluZF9lbnRyeV9ieV9ndWlkKGd1aWQpOworCisJaWYgKG5lID09IE5VTEwgfHwgIW5lLT5pbl9saW1ibykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlub2RlbWdyX3JlbW92ZV9uZShuZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBmd19nZXRfZGVzdHJveV9ub2RlKHN0cnVjdCBidXNfdHlwZSAqYnVzLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiWW91IGNhbiBkZXN0cm95IGluX2xpbWJvIG5vZGVzIGJ5IHdyaXRpbmcgdGhlaXIgR1VJRCB0byB0aGlzIGZpbGVcbiIpOworfQorc3RhdGljIEJVU19BVFRSKGRlc3Ryb3lfbm9kZSwgU19JV1VTUiB8IFNfSVJVR08sIGZ3X2dldF9kZXN0cm95X25vZGUsIGZ3X3NldF9kZXN0cm95X25vZGUpOworCitzdGF0aWMgaW50IG5vZGVtZ3JfcmVzY2FuX2J1c190aHJlYWQodm9pZCAqX191bnVzZWQpCit7CisJLyogTm8gdXNlcmxldmVsIGFjY2VzcyBuZWVkZWQgKi8KKwlkYWVtb25pemUoImtmd3Jlc2NhbiIpOworCisJYnVzX3Jlc2Nhbl9kZXZpY2VzKCZpZWVlMTM5NF9idXNfdHlwZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZndfc2V0X3Jlc2NhbihzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHN0YXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwkvKiBEb24ndCB3YWl0IGZvciB0aGlzLCBvciBjYXJlIGFib3V0IGVycm9ycy4gUm9vdCBjb3VsZCBkbworCSAqIHNvbWV0aGluZyBzdHVwaWQgYW5kIHNwYXduIHRoaXMgYSBsb3Qgb2YgdGltZXMsIGJ1dCB0aGF0J3MKKwkgKiByb290J3MgZmF1bHQuICovCisJaWYgKHN0YXRlID09IDEpCisJCWtlcm5lbF90aHJlYWQobm9kZW1ncl9yZXNjYW5fYnVzX3RocmVhZCwgTlVMTCwgQ0xPTkVfS0VSTkVMKTsKKworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IGZ3X2dldF9yZXNjYW4oc3RydWN0IGJ1c190eXBlICpidXMsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJZb3UgY2FuIGZvcmNlIGEgcmVzY2FuIG9mIHRoZSBidXMgZm9yICIKKwkJCSJkcml2ZXJzIGJ5IHdyaXRpbmcgYSAxIHRvIHRoaXMgZmlsZVxuIik7Cit9CitzdGF0aWMgQlVTX0FUVFIocmVzY2FuLCBTX0lXVVNSIHwgU19JUlVHTywgZndfZ2V0X3Jlc2NhbiwgZndfc2V0X3Jlc2Nhbik7CisKKworc3RhdGljIHNzaXplX3QgZndfc2V0X2lnbm9yZV9kcml2ZXJzKHN0cnVjdCBidXNfdHlwZSAqYnVzLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgc3RhdGUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWlmIChzdGF0ZSA9PSAxKQorCQlpZ25vcmVfZHJpdmVycyA9IDE7CisJZWxzZSBpZiAoIXN0YXRlKQorCQlpZ25vcmVfZHJpdmVycyA9IDA7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBmd19nZXRfaWdub3JlX2RyaXZlcnMoc3RydWN0IGJ1c190eXBlICpidXMsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaWdub3JlX2RyaXZlcnMpOworfQorc3RhdGljIEJVU19BVFRSKGlnbm9yZV9kcml2ZXJzLCBTX0lXVVNSIHwgU19JUlVHTywgZndfZ2V0X2lnbm9yZV9kcml2ZXJzLCBmd19zZXRfaWdub3JlX2RyaXZlcnMpOworCisKK3N0cnVjdCBidXNfYXR0cmlidXRlICpjb25zdCBmd19idXNfYXR0cnNbXSA9IHsKKwkmYnVzX2F0dHJfZGVzdHJveV9ub2RlLAorCSZidXNfYXR0cl9yZXNjYW4sCisJJmJ1c19hdHRyX2lnbm9yZV9kcml2ZXJzLAorCU5VTEwKK307CisKKworZndfYXR0cihuZSwgc3RydWN0IG5vZGVfZW50cnksIGNhcGFiaWxpdGllcywgdW5zaWduZWQgaW50LCAiMHglMDZ4XG4iKQorZndfYXR0cihuZSwgc3RydWN0IG5vZGVfZW50cnksIG5vZGVpZCwgdW5zaWduZWQgaW50LCAiMHglMDR4XG4iKQorCitmd19hdHRyKG5lLCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgdmVuZG9yX2lkLCB1bnNpZ25lZCBpbnQsICIweCUwNnhcbiIpCitmd19hdHRyX3RkKG5lLCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgdmVuZG9yX25hbWVfa3YpCitmd19hdHRyKG5lLCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgdmVuZG9yX291aSwgY29uc3QgY2hhciAqLCAiJXNcbiIpCisKK2Z3X2F0dHIobmUsIHN0cnVjdCBub2RlX2VudHJ5LCBndWlkLCB1bnNpZ25lZCBsb25nIGxvbmcsICIweCUwMTZMeFxuIikKK2Z3X2F0dHIobmUsIHN0cnVjdCBub2RlX2VudHJ5LCBndWlkX3ZlbmRvcl9pZCwgdW5zaWduZWQgaW50LCAiMHglMDZ4XG4iKQorZndfYXR0cihuZSwgc3RydWN0IG5vZGVfZW50cnksIGd1aWRfdmVuZG9yX291aSwgY29uc3QgY2hhciAqLCAiJXNcbiIpCitmd19hdHRyKG5lLCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgaW5fbGltYm8sIGludCwgIiVkXG4iKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpjb25zdCBmd19uZV9hdHRyc1tdID0geworCSZkZXZfYXR0cl9uZV9ndWlkLAorCSZkZXZfYXR0cl9uZV9ndWlkX3ZlbmRvcl9pZCwKKwkmZGV2X2F0dHJfbmVfY2FwYWJpbGl0aWVzLAorCSZkZXZfYXR0cl9uZV92ZW5kb3JfaWQsCisJJmRldl9hdHRyX25lX25vZGVpZCwKKwkmZGV2X2F0dHJfYnVzX29wdGlvbnMsCisJJmRldl9hdHRyX3RsYWJlbHNfZnJlZSwKKwkmZGV2X2F0dHJfdGxhYmVsc19hbGxvY2F0aW9ucywKKwkmZGV2X2F0dHJfdGxhYmVsc19tYXNrLAorfTsKKworCisKK2Z3X2F0dHIodWQsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBsb25nLCAiMHglMDE2THhcbiIpCitmd19hdHRyKHVkLCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGxlbmd0aCwgaW50LCAiJWRcbiIpCisvKiBUaGVzZSBhcmUgYWxsIGRlcGVuZGVudCBvbiB0aGUgdmFsdWUgYmVpbmcgcHJvdmlkZWQgKi8KK2Z3X2F0dHIodWQsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgdmVuZG9yX2lkLCB1bnNpZ25lZCBpbnQsICIweCUwNnhcbiIpCitmd19hdHRyKHVkLCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIG1vZGVsX2lkLCB1bnNpZ25lZCBpbnQsICIweCUwNnhcbiIpCitmd19hdHRyKHVkLCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIHNwZWNpZmllcl9pZCwgdW5zaWduZWQgaW50LCAiMHglMDZ4XG4iKQorZndfYXR0cih1ZCwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCB2ZXJzaW9uLCB1bnNpZ25lZCBpbnQsICIweCUwNnhcbiIpCitmd19hdHRyX3RkKHVkLCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIHZlbmRvcl9uYW1lX2t2KQorZndfYXR0cih1ZCwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCB2ZW5kb3Jfb3VpLCBjb25zdCBjaGFyICosICIlc1xuIikKK2Z3X2F0dHJfdGQodWQsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgbW9kZWxfbmFtZV9rdikKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpjb25zdCBmd191ZF9hdHRyc1tdID0geworCSZkZXZfYXR0cl91ZF9hZGRyZXNzLAorCSZkZXZfYXR0cl91ZF9sZW5ndGgsCisJJmRldl9hdHRyX2lnbm9yZV9kcml2ZXIsCit9OworCisKK2Z3X2F0dHIoaG9zdCwgc3RydWN0IGhwc2JfaG9zdCwgbm9kZV9jb3VudCwgaW50LCAiJWRcbiIpCitmd19hdHRyKGhvc3QsIHN0cnVjdCBocHNiX2hvc3QsIHNlbGZpZF9jb3VudCwgaW50LCAiJWRcbiIpCitmd19hdHRyKGhvc3QsIHN0cnVjdCBocHNiX2hvc3QsIG5vZGVzX2FjdGl2ZSwgaW50LCAiJWRcbiIpCitmd19hdHRyKGhvc3QsIHN0cnVjdCBocHNiX2hvc3QsIGluX2J1c19yZXNldCwgaW50LCAiJWRcbiIpCitmd19hdHRyKGhvc3QsIHN0cnVjdCBocHNiX2hvc3QsIGlzX3Jvb3QsIGludCwgIiVkXG4iKQorZndfYXR0cihob3N0LCBzdHJ1Y3QgaHBzYl9ob3N0LCBpc19jeWNtc3QsIGludCwgIiVkXG4iKQorZndfYXR0cihob3N0LCBzdHJ1Y3QgaHBzYl9ob3N0LCBpc19pcm0sIGludCwgIiVkXG4iKQorZndfYXR0cihob3N0LCBzdHJ1Y3QgaHBzYl9ob3N0LCBpc19idXNtZ3IsIGludCwgIiVkXG4iKQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmNvbnN0IGZ3X2hvc3RfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfaG9zdF9ub2RlX2NvdW50LAorCSZkZXZfYXR0cl9ob3N0X3NlbGZpZF9jb3VudCwKKwkmZGV2X2F0dHJfaG9zdF9ub2Rlc19hY3RpdmUsCisJJmRldl9hdHRyX2hvc3RfaW5fYnVzX3Jlc2V0LAorCSZkZXZfYXR0cl9ob3N0X2lzX3Jvb3QsCisJJmRldl9hdHRyX2hvc3RfaXNfY3ljbXN0LAorCSZkZXZfYXR0cl9ob3N0X2lzX2lybSwKKwkmZGV2X2F0dHJfaG9zdF9pc19idXNtZ3IsCit9OworCisKK3N0YXRpYyBzc2l6ZV90IGZ3X3Nob3dfZHJ2X2RldmljZV9pZHMoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciAqZHJpdmVyOworCXN0cnVjdCBpZWVlMTM5NF9kZXZpY2VfaWQgKmlkOworCWludCBsZW5ndGggPSAwOworCWNoYXIgKnNjcmF0Y2ggPSBidWY7CisKKyAgICAgICAgZHJpdmVyID0gY29udGFpbmVyX29mKGRydiwgc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyLCBkcml2ZXIpOworCisJZm9yIChpZCA9IGRyaXZlci0+aWRfdGFibGU7IGlkLT5tYXRjaF9mbGFncyAhPSAwOyBpZCsrKSB7CisJCWludCBuZWVkX2NvbWEgPSAwOworCisJCWlmIChpZC0+bWF0Y2hfZmxhZ3MgJiBJRUVFMTM5NF9NQVRDSF9WRU5ET1JfSUQpIHsKKwkJCWxlbmd0aCArPSBzcHJpbnRmKHNjcmF0Y2gsICJ2ZW5kb3JfaWQ9MHglMDZ4IiwgaWQtPnZlbmRvcl9pZCk7CisJCQlzY3JhdGNoID0gYnVmICsgbGVuZ3RoOworCQkJbmVlZF9jb21hKys7CisJCX0KKworCQlpZiAoaWQtPm1hdGNoX2ZsYWdzICYgSUVFRTEzOTRfTUFUQ0hfTU9ERUxfSUQpIHsKKwkJCWxlbmd0aCArPSBzcHJpbnRmKHNjcmF0Y2gsICIlc21vZGVsX2lkPTB4JTA2eCIsCisJCQkJCSAgbmVlZF9jb21hKysgPyAiLCIgOiAiIiwKKwkJCQkJICBpZC0+bW9kZWxfaWQpOworCQkJc2NyYXRjaCA9IGJ1ZiArIGxlbmd0aDsKKwkJfQorCisJCWlmIChpZC0+bWF0Y2hfZmxhZ3MgJiBJRUVFMTM5NF9NQVRDSF9TUEVDSUZJRVJfSUQpIHsKKwkJCWxlbmd0aCArPSBzcHJpbnRmKHNjcmF0Y2gsICIlc3NwZWNpZmllcl9pZD0weCUwNngiLAorCQkJCQkgIG5lZWRfY29tYSsrID8gIiwiIDogIiIsCisJCQkJCSAgaWQtPnNwZWNpZmllcl9pZCk7CisJCQlzY3JhdGNoID0gYnVmICsgbGVuZ3RoOworCQl9CisKKwkJaWYgKGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX1ZFUlNJT04pIHsKKwkJCWxlbmd0aCArPSBzcHJpbnRmKHNjcmF0Y2gsICIlc3ZlcnNpb249MHglMDZ4IiwKKwkJCQkJICBuZWVkX2NvbWErKyA/ICIsIiA6ICIiLAorCQkJCQkgIGlkLT52ZXJzaW9uKTsKKwkJCXNjcmF0Y2ggPSBidWYgKyBsZW5ndGg7CisJCX0KKworCQlpZiAobmVlZF9jb21hKSB7CisJCQkqc2NyYXRjaCsrID0gJ1xuJzsKKwkJCWxlbmd0aCsrOworCQl9CisJfQorCisJcmV0dXJuIGxlbmd0aDsKK30KK3N0YXRpYyBEUklWRVJfQVRUUihkZXZpY2VfaWRzLFNfSVJVR08sZndfc2hvd19kcnZfZGV2aWNlX2lkcyxOVUxMKTsKKworCitmd19kcnZfYXR0cihuYW1lLCBjb25zdCBjaGFyICosICIlc1xuIikKKworc3RhdGljIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlICpjb25zdCBmd19kcnZfYXR0cnNbXSA9IHsKKwkmZHJpdmVyX2F0dHJfZHJ2X25hbWUsCisJJmRyaXZlcl9hdHRyX2RldmljZV9pZHMsCit9OworCisKK3N0YXRpYyB2b2lkIG5vZGVtZ3JfY3JlYXRlX2Rydl9maWxlcyhzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gJmRyaXZlci0+ZHJpdmVyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZndfZHJ2X2F0dHJzKTsgaSsrKQorCQlkcml2ZXJfY3JlYXRlX2ZpbGUoZHJ2LCBmd19kcnZfYXR0cnNbaV0pOworfQorCisKK3N0YXRpYyB2b2lkIG5vZGVtZ3JfcmVtb3ZlX2Rydl9maWxlcyhzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gJmRyaXZlci0+ZHJpdmVyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZndfZHJ2X2F0dHJzKTsgaSsrKQorCQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJ2LCBmd19kcnZfYXR0cnNbaV0pOworfQorCisKK3N0YXRpYyB2b2lkIG5vZGVtZ3JfY3JlYXRlX25lX2Rldl9maWxlcyhzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm5lLT5kZXZpY2U7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmd19uZV9hdHRycyk7IGkrKykKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgZndfbmVfYXR0cnNbaV0pOworfQorCisKK3N0YXRpYyB2b2lkIG5vZGVtZ3JfY3JlYXRlX2hvc3RfZGV2X2ZpbGVzKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmhvc3QtPmRldmljZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZ3X2hvc3RfYXR0cnMpOyBpKyspCisJCWRldmljZV9jcmVhdGVfZmlsZShkZXYsIGZ3X2hvc3RfYXR0cnNbaV0pOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgbm9kZV9lbnRyeSAqZmluZF9lbnRyeV9ieV9ub2RlaWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgbm9kZWlkX3Qgbm9kZWlkKTsKKworc3RhdGljIHZvaWQgbm9kZW1ncl91cGRhdGVfaG9zdF9kZXZfbGlua3Moc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaG9zdC0+ZGV2aWNlOworCXN0cnVjdCBub2RlX2VudHJ5ICpuZTsKKworCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJpcm1faWQiKTsKKwlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiYnVzbWdyX2lkIik7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImhvc3RfaWQiKTsKKworCWlmICgobmUgPSBmaW5kX2VudHJ5X2J5X25vZGVpZChob3N0LCBob3N0LT5pcm1faWQpKSkKKwkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJm5lLT5kZXZpY2Uua29iaiwgImlybV9pZCIpOworCWlmICgobmUgPSBmaW5kX2VudHJ5X2J5X25vZGVpZChob3N0LCBob3N0LT5idXNtZ3JfaWQpKSkKKwkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJm5lLT5kZXZpY2Uua29iaiwgImJ1c21ncl9pZCIpOworCWlmICgobmUgPSBmaW5kX2VudHJ5X2J5X25vZGVpZChob3N0LCBob3N0LT5ub2RlX2lkKSkpCisJCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZuZS0+ZGV2aWNlLmtvYmosICJob3N0X2lkIik7Cit9CisKK3N0YXRpYyB2b2lkIG5vZGVtZ3JfY3JlYXRlX3VkX2Rldl9maWxlcyhzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1ZC0+ZGV2aWNlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZndfdWRfYXR0cnMpOyBpKyspCisJCWRldmljZV9jcmVhdGVfZmlsZShkZXYsIGZ3X3VkX2F0dHJzW2ldKTsKKworCWlmICh1ZC0+ZmxhZ3MgJiBVTklUX0RJUkVDVE9SWV9TUEVDSUZJRVJfSUQpCisJCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl91ZF9zcGVjaWZpZXJfaWQpOworCisJaWYgKHVkLT5mbGFncyAmIFVOSVRfRElSRUNUT1JZX1ZFUlNJT04pCisJCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl91ZF92ZXJzaW9uKTsKKworCWlmICh1ZC0+ZmxhZ3MgJiBVTklUX0RJUkVDVE9SWV9WRU5ET1JfSUQpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3VkX3ZlbmRvcl9pZCk7CisJCWlmICh1ZC0+dmVuZG9yX25hbWVfa3YpCisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdWRfdmVuZG9yX25hbWVfa3YpOworCX0KKworCWlmICh1ZC0+ZmxhZ3MgJiBVTklUX0RJUkVDVE9SWV9NT0RFTF9JRCkgeworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdWRfbW9kZWxfaWQpOworCQlpZiAodWQtPm1vZGVsX25hbWVfa3YpCisJCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdWRfbW9kZWxfbmFtZV9rdik7CisJfQorfQorCisKK3N0YXRpYyBpbnQgbm9kZW1ncl9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpCit7CisgICAgICAgIHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciAqZHJpdmVyOworICAgICAgICBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOworCXN0cnVjdCBpZWVlMTM5NF9kZXZpY2VfaWQgKmlkOworCisJLyogV2Ugb25seSBtYXRjaCB1bml0IGRpcmVjdG9yaWVzICovCisJaWYgKGRldi0+cGxhdGZvcm1fZGF0YSAhPSAmbm9kZW1ncl91ZF9wbGF0Zm9ybV9kYXRhKQorCQlyZXR1cm4gMDsKKworCXVkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCBkZXZpY2UpOworCWRyaXZlciA9IGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciwgZHJpdmVyKTsKKworCWlmICh1ZC0+bmUtPmluX2xpbWJvIHx8IHVkLT5pZ25vcmVfZHJpdmVyKQorCQlyZXR1cm4gMDsKKworICAgICAgICBmb3IgKGlkID0gZHJpdmVyLT5pZF90YWJsZTsgaWQtPm1hdGNoX2ZsYWdzICE9IDA7IGlkKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX1ZFTkRPUl9JRCkgJiYKKyAgICAgICAgICAgICAgICAgICAgaWQtPnZlbmRvcl9pZCAhPSB1ZC0+dmVuZG9yX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAoKGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX01PREVMX0lEKSAmJgorICAgICAgICAgICAgICAgICAgICBpZC0+bW9kZWxfaWQgIT0gdWQtPm1vZGVsX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAoKGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX1NQRUNJRklFUl9JRCkgJiYKKyAgICAgICAgICAgICAgICAgICAgaWQtPnNwZWNpZmllcl9pZCAhPSB1ZC0+c3BlY2lmaWVyX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAoKGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX1ZFUlNJT04pICYmCisgICAgICAgICAgICAgICAgICAgIGlkLT52ZXJzaW9uICE9IHVkLT52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKwkJcmV0dXJuIDE7CisgICAgICAgIH0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIG5vZGVtZ3JfcmVtb3ZlX3VkcyhzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgKm5leHQ7CisJc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjZGV2LCBuZXh0LCAmbm9kZW1ncl91ZF9jbGFzcy5jaGlsZHJlbiwgbm9kZSkgeworCQl1ZCA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGNsYXNzX2Rldik7CisKKwkJaWYgKHVkLT5uZSAhPSBuZSkKKwkJCWNvbnRpbnVlOworCisJCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZ1ZC0+Y2xhc3NfZGV2KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJnVkLT5kZXZpY2UpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBub2RlbWdyX3JlbW92ZV9uZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm5lLT5kZXZpY2U7CisKKwlkZXYgPSBnZXRfZGV2aWNlKCZuZS0+ZGV2aWNlKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCisJSFBTQl9ERUJVRygiTm9kZSByZW1vdmVkOiBJRDpCVVNbIiBOT0RFX0JVU19GTVQgIl0gIEdVSURbJTAxNkx4XSIsCisJCSAgIE5PREVfQlVTX0FSR1MobmUtPmhvc3QsIG5lLT5ub2RlaWQpLCAodW5zaWduZWQgbG9uZyBsb25nKW5lLT5ndWlkKTsKKworCW5vZGVtZ3JfcmVtb3ZlX3VkcyhuZSk7CisKKwljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmbmUtPmNsYXNzX2Rldik7CisJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKworCXB1dF9kZXZpY2UoZGV2KTsKK30KKworCitzdGF0aWMgdm9pZCBub2RlbWdyX3JlbW92ZV9ob3N0X2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZSAqbmVfZGV2LCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuZV9kZXYsIG5leHQsICZkZXYtPmNoaWxkcmVuLCBub2RlKQorCQlub2RlbWdyX3JlbW92ZV9uZShjb250YWluZXJfb2YobmVfZGV2LCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgZGV2aWNlKSk7CisKKwlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiaXJtX2lkIik7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImJ1c21ncl9pZCIpOworCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJob3N0X2lkIik7Cit9CisKKworc3RhdGljIHZvaWQgbm9kZW1ncl91cGRhdGVfYnVzX29wdGlvbnMoc3RydWN0IG5vZGVfZW50cnkgKm5lKQoreworI2lmZGVmIENPTkZJR19JRUVFMTM5NF9WRVJCT1NFREVCVUcKKwlzdGF0aWMgY29uc3QgdTE2IG1yW10gPSB7IDQsIDY0LCAxMDI0LCAwfTsKKyNlbmRpZgorCXF1YWRsZXRfdCBidXNvcHRpb25zID0gYmUzMl90b19jcHUobmUtPmNzci0+YnVzX2luZm9fZGF0YVsyXSk7CisKKwluZS0+YnVzb3B0LmlybWMgICAgICAgICA9IChidXNvcHRpb25zID4+IDMxKSAmIDE7CisJbmUtPmJ1c29wdC5jbWMgICAgICAgICAgPSAoYnVzb3B0aW9ucyA+PiAzMCkgJiAxOworCW5lLT5idXNvcHQuaXNjICAgICAgICAgID0gKGJ1c29wdGlvbnMgPj4gMjkpICYgMTsKKwluZS0+YnVzb3B0LmJtYyAgICAgICAgICA9IChidXNvcHRpb25zID4+IDI4KSAmIDE7CisJbmUtPmJ1c29wdC5wbWMgICAgICAgICAgPSAoYnVzb3B0aW9ucyA+PiAyNykgJiAxOworCW5lLT5idXNvcHQuY3ljX2Nsa19hY2MgID0gKGJ1c29wdGlvbnMgPj4gMTYpICYgMHhmZjsKKwluZS0+YnVzb3B0Lm1heF9yZWMgICAgICA9IDEgPDwgKCgoYnVzb3B0aW9ucyA+PiAxMikgJiAweGYpICsgMSk7CisJbmUtPmJ1c29wdC5tYXhfcm9tCT0gKGJ1c29wdGlvbnMgPj4gOCkgJiAweDM7CisJbmUtPmJ1c29wdC5nZW5lcmF0aW9uICAgPSAoYnVzb3B0aW9ucyA+PiA0KSAmIDB4ZjsKKwluZS0+YnVzb3B0Lmxua3NwZCAgICAgICA9IGJ1c29wdGlvbnMgJiAweDc7CisKKwlIUFNCX1ZFUkJPU0UoIk5vZGVNZ3I6IHJhdz0weCUwOHggaXJtYz0lZCBjbWM9JWQgaXNjPSVkIGJtYz0lZCBwbWM9JWQgIgorCQkgICAgICJjeWNfY2xrX2FjYz0lZCBtYXhfcmVjPSVkIG1heF9yb209JWQgZ2VuPSVkIGxzcGQ9JWQiLAorCQkgICAgIGJ1c29wdGlvbnMsIG5lLT5idXNvcHQuaXJtYywgbmUtPmJ1c29wdC5jbWMsCisJCSAgICAgbmUtPmJ1c29wdC5pc2MsIG5lLT5idXNvcHQuYm1jLCBuZS0+YnVzb3B0LnBtYywKKwkJICAgICBuZS0+YnVzb3B0LmN5Y19jbGtfYWNjLCBuZS0+YnVzb3B0Lm1heF9yZWMsCisJCSAgICAgbXJbbmUtPmJ1c29wdC5tYXhfcm9tXSwKKwkJICAgICBuZS0+YnVzb3B0LmdlbmVyYXRpb24sIG5lLT5idXNvcHQubG5rc3BkKTsKK30KKworCitzdGF0aWMgc3RydWN0IG5vZGVfZW50cnkgKm5vZGVtZ3JfY3JlYXRlX25vZGUob2N0bGV0X3QgZ3VpZCwgc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsCisJCQkJCSAgICAgIHN0cnVjdCBob3N0X2luZm8gKmhpLCBub2RlaWRfdCBub2RlaWQsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uKQoreworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBoaS0+aG9zdDsKKyAgICAgICAgc3RydWN0IG5vZGVfZW50cnkgKm5lOworCisJbmUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZV9lbnRyeSksIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIW5lKSByZXR1cm4gTlVMTDsKKworCW1lbXNldChuZSwgMCwgc2l6ZW9mKHN0cnVjdCBub2RlX2VudHJ5KSk7CisKKwluZS0+dHBvb2wgPSAmaG9zdC0+dHBvb2xbbm9kZWlkICYgTk9ERV9NQVNLXTsKKworICAgICAgICBuZS0+aG9zdCA9IGhvc3Q7CisgICAgICAgIG5lLT5ub2RlaWQgPSBub2RlaWQ7CisJbmUtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworCW5lLT5uZWVkc19wcm9iZSA9IDE7CisKKyAgICAgICAgbmUtPmd1aWQgPSBndWlkOworCW5lLT5ndWlkX3ZlbmRvcl9pZCA9IChndWlkID4+IDQwKSAmIDB4ZmZmZmZmOworCW5lLT5ndWlkX3ZlbmRvcl9vdWkgPSBub2RlbWdyX2ZpbmRfb3VpX25hbWUobmUtPmd1aWRfdmVuZG9yX2lkKTsKKwluZS0+Y3NyID0gY3NyOworCisJbWVtY3B5KCZuZS0+ZGV2aWNlLCAmbm9kZW1ncl9kZXZfdGVtcGxhdGVfbmUsCisJICAgICAgIHNpemVvZihuZS0+ZGV2aWNlKSk7CisJbmUtPmRldmljZS5wYXJlbnQgPSAmaG9zdC0+ZGV2aWNlOworCXNucHJpbnRmKG5lLT5kZXZpY2UuYnVzX2lkLCBCVVNfSURfU0laRSwgIiUwMTZMeCIsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKShuZS0+Z3VpZCkpOworCisJbmUtPmNsYXNzX2Rldi5kZXYgPSAmbmUtPmRldmljZTsKKwluZS0+Y2xhc3NfZGV2LmNsYXNzID0gJm5vZGVtZ3JfbmVfY2xhc3M7CisJc25wcmludGYobmUtPmNsYXNzX2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsICIlMDE2THgiLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykobmUtPmd1aWQpKTsKKworCWRldmljZV9yZWdpc3RlcigmbmUtPmRldmljZSk7CisJY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZuZS0+Y2xhc3NfZGV2KTsKKwlnZXRfZGV2aWNlKCZuZS0+ZGV2aWNlKTsKKworCWlmIChuZS0+Z3VpZF92ZW5kb3Jfb3VpKQorCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5lLT5kZXZpY2UsICZkZXZfYXR0cl9uZV9ndWlkX3ZlbmRvcl9vdWkpOworCW5vZGVtZ3JfY3JlYXRlX25lX2Rldl9maWxlcyhuZSk7CisKKwlub2RlbWdyX3VwZGF0ZV9idXNfb3B0aW9ucyhuZSk7CisKKwlIUFNCX0RFQlVHKCIlcyBhZGRlZDogSUQ6QlVTWyIgTk9ERV9CVVNfRk1UICJdICBHVUlEWyUwMTZMeF0iLAorCQkgICAoaG9zdC0+bm9kZV9pZCA9PSBub2RlaWQpID8gIkhvc3QiIDogIk5vZGUiLAorCQkgICBOT0RFX0JVU19BUkdTKGhvc3QsIG5vZGVpZCksICh1bnNpZ25lZCBsb25nIGxvbmcpZ3VpZCk7CisKKyAgICAgICAgcmV0dXJuIG5lOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgbm9kZV9lbnRyeSAqZmluZF9lbnRyeV9ieV9ndWlkKHU2NCBndWlkKQoreworCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSAmbm9kZW1ncl9uZV9jbGFzczsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OworCXN0cnVjdCBub2RlX2VudHJ5ICpuZSwgKnJldF9uZSA9IE5VTEw7CisKKwlkb3duX3JlYWQoJmNsYXNzLT5zdWJzeXMucndzZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJmNsYXNzLT5jaGlsZHJlbiwgbm9kZSkgeworCQluZSA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgY2xhc3NfZGV2KTsKKworCQlpZiAobmUtPmd1aWQgPT0gZ3VpZCkgeworCQkJcmV0X25lID0gbmU7CisJCQlicmVhazsKKwkJfQorCX0KKwl1cF9yZWFkKCZjbGFzcy0+c3Vic3lzLnJ3c2VtKTsKKworICAgICAgICByZXR1cm4gcmV0X25lOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgbm9kZV9lbnRyeSAqZmluZF9lbnRyeV9ieV9ub2RlaWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgbm9kZWlkX3Qgbm9kZWlkKQoreworCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSAmbm9kZW1ncl9uZV9jbGFzczsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OworCXN0cnVjdCBub2RlX2VudHJ5ICpuZSwgKnJldF9uZSA9IE5VTEw7CisKKwlkb3duX3JlYWQoJmNsYXNzLT5zdWJzeXMucndzZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJmNsYXNzLT5jaGlsZHJlbiwgbm9kZSkgeworCQluZSA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3Qgbm9kZV9lbnRyeSwgY2xhc3NfZGV2KTsKKworCQlpZiAobmUtPmhvc3QgPT0gaG9zdCAmJiBuZS0+bm9kZWlkID09IG5vZGVpZCkgeworCQkJcmV0X25lID0gbmU7CisJCQlicmVhazsKKwkJfQorCX0KKwl1cF9yZWFkKCZjbGFzcy0+c3Vic3lzLnJ3c2VtKTsKKworCXJldHVybiByZXRfbmU7Cit9CisKKworc3RhdGljIHZvaWQgbm9kZW1ncl9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG5vZGVfZW50cnkgKm5lLCAKKwlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkLCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJbWVtY3B5KCZ1ZC0+ZGV2aWNlLCAmbm9kZW1ncl9kZXZfdGVtcGxhdGVfdWQsCisJICAgICAgIHNpemVvZih1ZC0+ZGV2aWNlKSk7CisKKwl1ZC0+ZGV2aWNlLnBhcmVudCA9IHBhcmVudDsKKworCXNucHJpbnRmKHVkLT5kZXZpY2UuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVzLSV1IiwKKwkJIG5lLT5kZXZpY2UuYnVzX2lkLCB1ZC0+aWQpOworCisJdWQtPmNsYXNzX2Rldi5kZXYgPSAmdWQtPmRldmljZTsKKwl1ZC0+Y2xhc3NfZGV2LmNsYXNzID0gJm5vZGVtZ3JfdWRfY2xhc3M7CisJc25wcmludGYodWQtPmNsYXNzX2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsICIlcy0ldSIsCisJCSBuZS0+ZGV2aWNlLmJ1c19pZCwgdWQtPmlkKTsKKworCWRldmljZV9yZWdpc3RlcigmdWQtPmRldmljZSk7CisJY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZ1ZC0+Y2xhc3NfZGV2KTsKKwlnZXRfZGV2aWNlKCZ1ZC0+ZGV2aWNlKTsKKworCWlmICh1ZC0+dmVuZG9yX291aSkKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZ1ZC0+ZGV2aWNlLCAmZGV2X2F0dHJfdWRfdmVuZG9yX291aSk7CisJbm9kZW1ncl9jcmVhdGVfdWRfZGV2X2ZpbGVzKHVkKTsKK30JCisKKworLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBjdXJyZW50bHkgb25seSBzY2FucyB0aGUgY29uZmlnIHJvbSBhbmQgaXRzCisgKiBpbW1lZGlhdGUgdW5pdCBkaXJlY3RvcmllcyBsb29raW5nIGZvciBzb2Z0d2FyZV9pZCBhbmQKKyAqIHNvZnR3YXJlX3ZlcnNpb24gZW50cmllcywgaW4gb3JkZXIgdG8gZ2V0IGRyaXZlciBhdXRvbG9hZGluZyB3b3JraW5nLiAqLworc3RhdGljIHN0cnVjdCB1bml0X2RpcmVjdG9yeSAqbm9kZW1ncl9wcm9jZXNzX3VuaXRfZGlyZWN0b3J5CisJKHN0cnVjdCBob3N0X2luZm8gKmhpLCBzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUsIHN0cnVjdCBjc3IxMjEyX2tleXZhbCAqdWRfa3YsCisJIHVuc2lnbmVkIGludCAqaWQsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSAqcGFyZW50KQoreworCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7CisJc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZF9jaGlsZCA9IE5VTEw7CisJc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdjsKKwl1OCBsYXN0X2tleV9pZCA9IDA7CisKKwl1ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1bml0X2RpcmVjdG9yeSksIEdGUF9LRVJORUwpOworCWlmICghdWQpCisJCWdvdG8gdW5pdF9kaXJlY3RvcnlfZXJyb3I7CisKKwltZW1zZXQgKHVkLCAwLCBzaXplb2Yoc3RydWN0IHVuaXRfZGlyZWN0b3J5KSk7CisKKwl1ZC0+bmUgPSBuZTsKKwl1ZC0+aWdub3JlX2RyaXZlciA9IGlnbm9yZV9kcml2ZXJzOworCXVkLT5hZGRyZXNzID0gdWRfa3YtPm9mZnNldCArIENTUjEyMTJfQ09ORklHX1JPTV9TUEFDRV9CQVNFOworCXVkLT51ZF9rdiA9IHVkX2t2OworCXVkLT5pZCA9ICgqaWQpKys7CisKKwljc3IxMjEyX2Zvcl9lYWNoX2Rpcl9lbnRyeShuZS0+Y3NyLCBrdiwgdWRfa3YsIGRlbnRyeSkgeworCQlzd2l0Y2ggKGt2LT5rZXkuaWQpIHsKKwkJY2FzZSBDU1IxMjEyX0tWX0lEX1ZFTkRPUjoKKwkJCWlmIChrdi0+a2V5LnR5cGUgPT0gQ1NSMTIxMl9LVl9UWVBFX0lNTUVESUFURSkgeworCQkJCXVkLT52ZW5kb3JfaWQgPSBrdi0+dmFsdWUuaW1tZWRpYXRlOworCQkJCXVkLT5mbGFncyB8PSBVTklUX0RJUkVDVE9SWV9WRU5ET1JfSUQ7CisKKwkJCQlpZiAodWQtPnZlbmRvcl9pZCkKKwkJCQkJdWQtPnZlbmRvcl9vdWkgPSBub2RlbWdyX2ZpbmRfb3VpX25hbWUodWQtPnZlbmRvcl9pZCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENTUjEyMTJfS1ZfSURfTU9ERUw6CisJCQl1ZC0+bW9kZWxfaWQgPSBrdi0+dmFsdWUuaW1tZWRpYXRlOworCQkJdWQtPmZsYWdzIHw9IFVOSVRfRElSRUNUT1JZX01PREVMX0lEOworCQkJYnJlYWs7CisKKwkJY2FzZSBDU1IxMjEyX0tWX0lEX1NQRUNJRklFUl9JRDoKKwkJCXVkLT5zcGVjaWZpZXJfaWQgPSBrdi0+dmFsdWUuaW1tZWRpYXRlOworCQkJdWQtPmZsYWdzIHw9IFVOSVRfRElSRUNUT1JZX1NQRUNJRklFUl9JRDsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1NSMTIxMl9LVl9JRF9WRVJTSU9OOgorCQkJdWQtPnZlcnNpb24gPSBrdi0+dmFsdWUuaW1tZWRpYXRlOworCQkJdWQtPmZsYWdzIHw9IFVOSVRfRElSRUNUT1JZX1ZFUlNJT047CisJCQlicmVhazsKKworCQljYXNlIENTUjEyMTJfS1ZfSURfREVTQ1JJUFRPUjoKKwkJCWlmIChrdi0+a2V5LnR5cGUgPT0gQ1NSMTIxMl9LVl9UWVBFX0xFQUYgJiYKKwkJCSAgICBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9UWVBFKGt2KSA9PSAwICYmCisJCQkgICAgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfU1BFQ0lGSUVSX0lEKGt2KSA9PSAwICYmCisJCQkgICAgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9XSURUSChrdikgPT0gMCAmJgorCQkJICAgIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfQ0hBUl9TRVQoa3YpID09IDAgJiYKKwkJCSAgICBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0xBTkdVQUdFKGt2KSA9PSAwKSB7CisJCQkJc3dpdGNoIChsYXN0X2tleV9pZCkgeworCQkJCWNhc2UgQ1NSMTIxMl9LVl9JRF9WRU5ET1I6CisJCQkJCXVkLT52ZW5kb3JfbmFtZV9rdiA9IGt2OworCQkJCQljc3IxMjEyX2tlZXBfa2V5dmFsKGt2KTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIENTUjEyMTJfS1ZfSURfTU9ERUw6CisJCQkJCXVkLT5tb2RlbF9uYW1lX2t2ID0ga3Y7CisJCQkJCWNzcjEyMTJfa2VlcF9rZXl2YWwoa3YpOworCQkJCQlicmVhazsKKworCQkJCX0KKwkJCX0gLyogZWxzZSBpZiAoa3YtPmtleS50eXBlID09IENTUjEyMTJfS1ZfVFlQRV9ESVJFQ1RPUlkpIC4uLiAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBDU1IxMjEyX0tWX0lEX0RFUEVOREVOVF9JTkZPOgorCQkJLyogTG9naWNhbCBVbml0IE51bWJlciAqLworCQkJaWYgKGt2LT5rZXkudHlwZSA9PSBDU1IxMjEyX0tWX1RZUEVfSU1NRURJQVRFKSB7CisJCQkJaWYgKHVkLT5mbGFncyAmIFVOSVRfRElSRUNUT1JZX0hBU19MVU4pIHsKKwkJCQkJdWRfY2hpbGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkpLCBHRlBfS0VSTkVMKTsKKwkJCQkJaWYgKCF1ZF9jaGlsZCkKKwkJCQkJCWdvdG8gdW5pdF9kaXJlY3RvcnlfZXJyb3I7CisJCQkJCW1lbWNweSh1ZF9jaGlsZCwgdWQsIHNpemVvZihzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkpKTsKKwkJCQkJbm9kZW1ncl9yZWdpc3Rlcl9kZXZpY2UobmUsIHVkX2NoaWxkLCAmbmUtPmRldmljZSk7CisJCQkJCXVkX2NoaWxkID0gTlVMTDsKKwkJCQkJCisJCQkJCXVkLT5pZCA9ICgqaWQpKys7CisJCQkJfQorCQkJCXVkLT5sdW4gPSBrdi0+dmFsdWUuaW1tZWRpYXRlOworCQkJCXVkLT5mbGFncyB8PSBVTklUX0RJUkVDVE9SWV9IQVNfTFVOOworCisJCQkvKiBMb2dpY2FsIFVuaXQgRGlyZWN0b3J5ICovCisJCQl9IGVsc2UgaWYgKGt2LT5rZXkudHlwZSA9PSBDU1IxMjEyX0tWX1RZUEVfRElSRUNUT1JZKSB7CisJCQkJLyogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGRvbmUgaW4gU0JQMiBhcyB0aGlzIGlzCisJCQkJICogZG9pbmcgU0JQMiBzcGVjaWZpYyBwYXJzaW5nLgorCQkJCSAqLworCQkJCQorCQkJCS8qIGZpcnN0IHJlZ2lzdGVyIHRoZSBwYXJlbnQgdW5pdCAqLworCQkJCXVkLT5mbGFncyB8PSBVTklUX0RJUkVDVE9SWV9IQVNfTFVOX0RJUkVDVE9SWTsKKwkJCQlpZiAodWQtPmRldmljZS5idXMgIT0gJmllZWUxMzk0X2J1c190eXBlKQorCQkJCQlub2RlbWdyX3JlZ2lzdGVyX2RldmljZShuZSwgdWQsICZuZS0+ZGV2aWNlKTsKKwkJCQkKKwkJCQkvKiBwcm9jZXNzIHRoZSBjaGlsZCB1bml0ICovCisJCQkJdWRfY2hpbGQgPSBub2RlbWdyX3Byb2Nlc3NfdW5pdF9kaXJlY3RvcnkoaGksIG5lLCBrdiwgaWQsIHVkKTsKKworCQkJCWlmICh1ZF9jaGlsZCA9PSBOVUxMKQorCQkJCQlicmVhazsKKwkJCQkKKwkJCQkvKiBpbmhlcml0IHVuc3BlY2lmaWVkIHZhbHVlcyBzbyBob3RwbHVnIHBpY2tzIGl0IHVwICovCisJCQkJaWYgKCh1ZC0+ZmxhZ3MgJiBVTklUX0RJUkVDVE9SWV9NT0RFTF9JRCkgJiYKKwkJCQkgICAgISh1ZF9jaGlsZC0+ZmxhZ3MgJiBVTklUX0RJUkVDVE9SWV9NT0RFTF9JRCkpCisJCQkJeworCQkJCQl1ZF9jaGlsZC0+ZmxhZ3MgfD0gIFVOSVRfRElSRUNUT1JZX01PREVMX0lEOworCQkJCQl1ZF9jaGlsZC0+bW9kZWxfaWQgPSB1ZC0+bW9kZWxfaWQ7CisJCQkJfQorCQkJCWlmICgodWQtPmZsYWdzICYgVU5JVF9ESVJFQ1RPUllfU1BFQ0lGSUVSX0lEKSAmJgorCQkJCSAgICAhKHVkX2NoaWxkLT5mbGFncyAmIFVOSVRfRElSRUNUT1JZX1NQRUNJRklFUl9JRCkpCisJCQkJeworCQkJCQl1ZF9jaGlsZC0+ZmxhZ3MgfD0gIFVOSVRfRElSRUNUT1JZX1NQRUNJRklFUl9JRDsKKwkJCQkJdWRfY2hpbGQtPnNwZWNpZmllcl9pZCA9IHVkLT5zcGVjaWZpZXJfaWQ7CisJCQkJfQorCQkJCWlmICgodWQtPmZsYWdzICYgVU5JVF9ESVJFQ1RPUllfVkVSU0lPTikgJiYKKwkJCQkgICAgISh1ZF9jaGlsZC0+ZmxhZ3MgJiBVTklUX0RJUkVDVE9SWV9WRVJTSU9OKSkKKwkJCQl7CisJCQkJCXVkX2NoaWxkLT5mbGFncyB8PSAgVU5JVF9ESVJFQ1RPUllfVkVSU0lPTjsKKwkJCQkJdWRfY2hpbGQtPnZlcnNpb24gPSB1ZC0+dmVyc2lvbjsKKwkJCQl9CisJCQkJCisJCQkJLyogcmVnaXN0ZXIgdGhlIGNoaWxkIHVuaXQgKi8KKwkJCQl1ZF9jaGlsZC0+ZmxhZ3MgfD0gVU5JVF9ESVJFQ1RPUllfTFVOX0RJUkVDVE9SWTsKKwkJCQlub2RlbWdyX3JlZ2lzdGVyX2RldmljZShuZSwgdWRfY2hpbGQsICZ1ZC0+ZGV2aWNlKTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWxhc3Rfa2V5X2lkID0ga3YtPmtleS5pZDsKKwl9CisJCisJLyogZG8gbm90IHByb2Nlc3MgY2hpbGQgdW5pdHMgaGVyZSBhbmQgb25seSBpZiBub3QgYWxyZWFkeSByZWdpc3RlcmVkICovCisJaWYgKCFwYXJlbnQgJiYgdWQtPmRldmljZS5idXMgIT0gJmllZWUxMzk0X2J1c190eXBlKQorCQlub2RlbWdyX3JlZ2lzdGVyX2RldmljZShuZSwgdWQsICZuZS0+ZGV2aWNlKTsKKworCXJldHVybiB1ZDsKKwordW5pdF9kaXJlY3RvcnlfZXJyb3I6CisJaWYgKHVkICE9IE5VTEwpCisJCWtmcmVlKHVkKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBub2RlbWdyX3Byb2Nlc3Nfcm9vdF9kaXJlY3Rvcnkoc3RydWN0IGhvc3RfaW5mbyAqaGksIHN0cnVjdCBub2RlX2VudHJ5ICpuZSkKK3sKKwl1bnNpZ25lZCBpbnQgdWRfaWQgPSAwOworCXN0cnVjdCBjc3IxMjEyX2RlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3Y7CisJdTggbGFzdF9rZXlfaWQgPSAwOworCisJbmUtPm5lZWRzX3Byb2JlID0gMDsKKworCWNzcjEyMTJfZm9yX2VhY2hfZGlyX2VudHJ5KG5lLT5jc3IsIGt2LCBuZS0+Y3NyLT5yb290X2t2LCBkZW50cnkpIHsKKwkJc3dpdGNoIChrdi0+a2V5LmlkKSB7CisJCWNhc2UgQ1NSMTIxMl9LVl9JRF9WRU5ET1I6CisJCQluZS0+dmVuZG9yX2lkID0ga3YtPnZhbHVlLmltbWVkaWF0ZTsKKworCQkJaWYgKG5lLT52ZW5kb3JfaWQpCisJCQkJbmUtPnZlbmRvcl9vdWkgPSBub2RlbWdyX2ZpbmRfb3VpX25hbWUobmUtPnZlbmRvcl9pZCk7CisJCQlicmVhazsKKworCQljYXNlIENTUjEyMTJfS1ZfSURfTk9ERV9DQVBBQklMSVRJRVM6CisJCQluZS0+Y2FwYWJpbGl0aWVzID0ga3YtPnZhbHVlLmltbWVkaWF0ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1NSMTIxMl9LVl9JRF9VTklUOgorCQkJbm9kZW1ncl9wcm9jZXNzX3VuaXRfZGlyZWN0b3J5KGhpLCBuZSwga3YsICZ1ZF9pZCwgTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlIENTUjEyMTJfS1ZfSURfREVTQ1JJUFRPUjoKKwkJCWlmIChsYXN0X2tleV9pZCA9PSBDU1IxMjEyX0tWX0lEX1ZFTkRPUikgeworCQkJCWlmIChrdi0+a2V5LnR5cGUgPT0gQ1NSMTIxMl9LVl9UWVBFX0xFQUYgJiYKKwkJCQkgICAgQ1NSMTIxMl9ERVNDUklQVE9SX0xFQUZfVFlQRShrdikgPT0gMCAmJgorCQkJCSAgICBDU1IxMjEyX0RFU0NSSVBUT1JfTEVBRl9TUEVDSUZJRVJfSUQoa3YpID09IDAgJiYKKwkJCQkgICAgQ1NSMTIxMl9URVhUVUFMX0RFU0NSSVBUT1JfTEVBRl9XSURUSChrdikgPT0gMCAmJgorCQkJCSAgICBDU1IxMjEyX1RFWFRVQUxfREVTQ1JJUFRPUl9MRUFGX0NIQVJfU0VUKGt2KSA9PSAwICYmCisJCQkJICAgIENTUjEyMTJfVEVYVFVBTF9ERVNDUklQVE9SX0xFQUZfTEFOR1VBR0Uoa3YpID09IDApIHsKKwkJCQkJbmUtPnZlbmRvcl9uYW1lX2t2ID0ga3Y7CisJCQkJCWNzcjEyMTJfa2VlcF9rZXl2YWwoa3YpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWxhc3Rfa2V5X2lkID0ga3YtPmtleS5pZDsKKwl9CisKKwlpZiAobmUtPnZlbmRvcl9vdWkpCisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmUtPmRldmljZSwgJmRldl9hdHRyX25lX3ZlbmRvcl9vdWkpOworCWlmIChuZS0+dmVuZG9yX25hbWVfa3YpCisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmUtPmRldmljZSwgJmRldl9hdHRyX25lX3ZlbmRvcl9uYW1lX2t2KTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHCisKK3N0YXRpYyBpbnQgbm9kZW1ncl9ob3RwbHVnKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisJCQkgICBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOworCWludCBpID0gMDsKKwlpbnQgbGVuZ3RoID0gMDsKKworCWlmICghY2RldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl1ZCA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGNsYXNzX2Rldik7CisKKwlpZiAodWQtPm5lLT5pbl9saW1ibyB8fCB1ZC0+aWdub3JlX2RyaXZlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKyNkZWZpbmUgUFVUX0VOVlAoZm10LHZhbCkgCQkJCQlcCitkbyB7CQkJCQkJCQlcCisgICAgCWludCBwcmludGVkOwkJCQkJCVwKKwllbnZwW2krK10gPSBidWZmZXI7CQkJCQlcCisJcHJpbnRlZCA9IHNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUgLSBsZW5ndGgsCVwKKwkJCSAgIGZtdCwgdmFsKTsJCQkJXAorCWlmICgoYnVmZmVyX3NpemUgLSAobGVuZ3RoK3ByaW50ZWQpIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkJXAorCQlyZXR1cm4gLUVOT01FTTsJCQkJCVwKKwlsZW5ndGggKz0gcHJpbnRlZCsxOwkJCQkJXAorCWJ1ZmZlciArPSBwcmludGVkKzE7CQkJCQlcCit9IHdoaWxlICgwKQorCisJUFVUX0VOVlAoIlZFTkRPUl9JRD0lMDZ4IiwgdWQtPnZlbmRvcl9pZCk7CisJUFVUX0VOVlAoIk1PREVMX0lEPSUwNngiLCB1ZC0+bW9kZWxfaWQpOworCVBVVF9FTlZQKCJHVUlEPSUwMTZMeCIsICh1bnNpZ25lZCBsb25nIGxvbmcpdWQtPm5lLT5ndWlkKTsKKwlQVVRfRU5WUCgiU1BFQ0lGSUVSX0lEPSUwNngiLCB1ZC0+c3BlY2lmaWVyX2lkKTsKKwlQVVRfRU5WUCgiVkVSU0lPTj0lMDZ4IiwgdWQtPnZlcnNpb24pOworCisjdW5kZWYgUFVUX0VOVlAKKworCWVudnBbaV0gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbnQgbm9kZW1ncl9ob3RwbHVnKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisJCQkgICBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHICovCisKKworaW50IGhwc2JfcmVnaXN0ZXJfcHJvdG9jb2woc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyICpkcml2ZXIpCit7CisJaW50IHJldDsKKworCS8qIFRoaXMgd2lsbCBjYXVzZSBhIHByb2JlIGZvciBkZXZpY2VzICovCisJcmV0ID0gZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7CisJaWYgKCFyZXQpCisJCW5vZGVtZ3JfY3JlYXRlX2Rydl9maWxlcyhkcml2ZXIpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBocHNiX3VucmVnaXN0ZXJfcHJvdG9jb2woc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyICpkcml2ZXIpCit7CisJbm9kZW1ncl9yZW1vdmVfZHJ2X2ZpbGVzKGRyaXZlcik7CisJLyogVGhpcyB3aWxsIHN1YnNlcXVlbnRseSBkaXNjb25uZWN0IGFsbCBkZXZpY2VzIHRoYXQgb3VyIGRyaXZlcgorCSAqIGlzIGF0dGFjaGVkIHRvLiAqLworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRyaXZlcik7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBub2RlcyB0aGF0IHdlcmUgcHJlc2VudCBvbiB0aGUgYnVzIGJlZm9yZSB0aGUKKyAqIHJlc2V0IGFuZCBzdGlsbCBhcmUgYWZ0ZXIgdGhlIHJlc2V0LiAgVGhlIG5vZGVpZCBhbmQgdGhlIGNvbmZpZyByb20KKyAqIG1heSBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgZHJpdmVycyBtYW5hZ2luZyB0aGlzIGRldmljZSBtdXN0IGJlCisgKiBpbmZvcm1lZCB0aGF0IHRoaXMgZGV2aWNlIGp1c3Qgd2VudCB0aHJvdWdoIGEgYnVzIHJlc2V0LCB0byBhbGxvdworICogdGhlIHRvIHRha2Ugd2hhdGV2ZXIgYWN0aW9ucyByZXF1aXJlZC4KKyAqLworc3RhdGljIHZvaWQgbm9kZW1ncl91cGRhdGVfbm9kZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUsIHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLAorCQkJCXN0cnVjdCBob3N0X2luZm8gKmhpLCBub2RlaWRfdCBub2RlaWQsCisJCQkJdW5zaWduZWQgaW50IGdlbmVyYXRpb24pCit7CisJaWYgKG5lLT5ub2RlaWQgIT0gbm9kZWlkKSB7CisJCUhQU0JfREVCVUcoIk5vZGUgY2hhbmdlZDogIiBOT0RFX0JVU19GTVQgIiAtPiAiIE5PREVfQlVTX0ZNVCwKKwkJCSAgIE5PREVfQlVTX0FSR1MobmUtPmhvc3QsIG5lLT5ub2RlaWQpLAorCQkJICAgTk9ERV9CVVNfQVJHUyhuZS0+aG9zdCwgbm9kZWlkKSk7CisJCW5lLT5ub2RlaWQgPSBub2RlaWQ7CisJfQorCisJaWYgKG5lLT5idXNvcHQuZ2VuZXJhdGlvbiAhPSAoKGJlMzJfdG9fY3B1KGNzci0+YnVzX2luZm9fZGF0YVsyXSkgPj4gNCkgJiAweGYpKSB7CisJCWtmcmVlKG5lLT5jc3ItPnByaXZhdGUpOworCQljc3IxMjEyX2Rlc3Ryb3lfY3NyKG5lLT5jc3IpOworCQluZS0+Y3NyID0gY3NyOworCisJCS8qIElmIHRoZSBub2RlJ3MgY29uZmlncm9tIGdlbmVyYXRpb24gaGFzIGNoYW5nZWQsIHdlCisJCSAqIHVucmVnaXN0ZXIgYWxsIHRoZSB1bml0IGRpcmVjdG9yaWVzLiAqLworCQlub2RlbWdyX3JlbW92ZV91ZHMobmUpOworCisJCW5vZGVtZ3JfdXBkYXRlX2J1c19vcHRpb25zKG5lKTsKKworCQkvKiBNYXJrIHRoZSBub2RlIGFzIG5ldywgc28gaXQgZ2V0cyByZS1wcm9iZWQgKi8KKwkJbmUtPm5lZWRzX3Byb2JlID0gMTsKKwl9IGVsc2UgeworCQkvKiBvbGQgY2FjaGUgaXMgdmFsaWQsIHNvIHVwZGF0ZSBpdHMgZ2VuZXJhdGlvbiAqLworCQlzdHJ1Y3Qgbm9kZW1ncl9jc3JfaW5mbyAqY2kgPSBuZS0+Y3NyLT5wcml2YXRlOworCQljaS0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisJCS8qIGZyZWUgdGhlIHBhcnRpYWxseSBmaWxsZWQgbm93IHVubmVlZGVkIG5ldyBjYWNoZSAqLworCQlrZnJlZShjc3ItPnByaXZhdGUpOworCQljc3IxMjEyX2Rlc3Ryb3lfY3NyKGNzcik7CisJfQorCisJaWYgKG5lLT5pbl9saW1ibykKKwkJbm9kZW1ncl9yZXN1bWVfbmUobmUpOworCisJLyogTWFyayB0aGUgbm9kZSBjdXJyZW50ICovCisJbmUtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworfQorCisKKworc3RhdGljIHZvaWQgbm9kZW1ncl9ub2RlX3NjYW5fb25lKHN0cnVjdCBob3N0X2luZm8gKmhpLAorCQkJCSAgbm9kZWlkX3Qgbm9kZWlkLCBpbnQgZ2VuZXJhdGlvbikKK3sKKwlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gaGktPmhvc3Q7CisJc3RydWN0IG5vZGVfZW50cnkgKm5lOworCW9jdGxldF90IGd1aWQ7CisJc3RydWN0IGNzcjEyMTJfY3NyICpjc3I7CisJc3RydWN0IG5vZGVtZ3JfY3NyX2luZm8gKmNpOworCisJY2kgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZW1ncl9jc3JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghY2kpCisJCXJldHVybjsKKworCWNpLT5ob3N0ID0gaG9zdDsKKwljaS0+bm9kZWlkID0gbm9kZWlkOworCWNpLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKworCS8qIFdlIG5lZWQgdG8gZGV0ZWN0IHdoZW4gdGhlIENvbmZpZ1JPTSdzIGdlbmVyYXRpb24gaGFzIGNoYW5nZWQsCisJICogc28gd2Ugb25seSB1cGRhdGUgdGhlIG5vZGUncyBpbmZvIHdoZW4gaXQgbmVlZHMgdG8gYmUuICAqLworCisJY3NyID0gY3NyMTIxMl9jcmVhdGVfY3NyKCZub2RlbWdyX2Nzcl9vcHMsIDUgKiBzaXplb2YocXVhZGxldF90KSwgY2kpOworCWlmICghY3NyIHx8IGNzcjEyMTJfcGFyc2VfY3NyKGNzcikgIT0gQ1NSMTIxMl9TVUNDRVNTKSB7CisJCUhQU0JfRVJSKCJFcnJvciBwYXJzaW5nIGNvbmZpZ3JvbSBmb3Igbm9kZSAiIE5PREVfQlVTX0ZNVCwKKwkJCSBOT0RFX0JVU19BUkdTKGhvc3QsIG5vZGVpZCkpOworCQlpZiAoY3NyKQorCQkJY3NyMTIxMl9kZXN0cm95X2Nzcihjc3IpOworCQlrZnJlZShjaSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY3NyLT5idXNfaW5mb19kYXRhWzFdICE9IElFRUUxMzk0X0JVU0lEX01BR0lDKSB7CisJCS8qIFRoaXMgaXNuJ3QgYSAxMzk0IGRldmljZSwgYnV0IHdlIGxldCBpdCBzbGlkZS4gVGhlcmUKKwkJICogd2FzIGEgcmVwb3J0IG9mIGEgZGV2aWNlIHdpdGggYnJva2VuIGZpcm13YXJlIHdoaWNoCisJCSAqIHJlcG9ydGVkICcyMzk0JyBpbnN0ZWFkIG9mICcxMzk0Jywgd2hpY2ggaXMgb2J2aW91c2x5IGEKKwkJICogbWlzdGFrZS4gT25lIHdvdWxkIGhvcGUgdGhhdCBhIG5vbi0xMzk0IGRldmljZSBuZXZlcgorCQkgKiBnZXRzIGNvbm5lY3RlZCB0byBGaXJld2lyZSBidXMuIElmIHNvbWVvbmUgZG9lcywgd2UKKwkJICogc2hvdWxkbid0IGJlIGhlbGQgcmVzcG9uc2libGUsIHNvIHdlJ2xsIGFsbG93IGl0IHdpdGggYQorCQkgKiB3YXJuaW5nLiAgKi8KKwkJSFBTQl9XQVJOKCJOb2RlICIgTk9ERV9CVVNfRk1UICIgaGFzIGludmFsaWQgYnVzSUQgbWFnaWMgWzB4JTA4eF0iLAorCQkJICBOT0RFX0JVU19BUkdTKGhvc3QsIG5vZGVpZCksIGNzci0+YnVzX2luZm9fZGF0YVsxXSk7CisJfQorCisJZ3VpZCA9ICgodTY0KWJlMzJfdG9fY3B1KGNzci0+YnVzX2luZm9fZGF0YVszXSkgPDwgMzIpIHwgYmUzMl90b19jcHUoY3NyLT5idXNfaW5mb19kYXRhWzRdKTsKKwluZSA9IGZpbmRfZW50cnlfYnlfZ3VpZChndWlkKTsKKworCWlmIChuZSAmJiBuZS0+aG9zdCAhPSBob3N0ICYmIG5lLT5pbl9saW1ibykgeworCQkvKiBNdXN0IGhhdmUgbW92ZWQgdGhpcyBkZXZpY2UgZnJvbSBvbmUgaG9zdCB0byBhbm90aGVyICovCisJCW5vZGVtZ3JfcmVtb3ZlX25lKG5lKTsKKwkJbmUgPSBOVUxMOworCX0KKworCWlmICghbmUpCisJCW5vZGVtZ3JfY3JlYXRlX25vZGUoZ3VpZCwgY3NyLCBoaSwgbm9kZWlkLCBnZW5lcmF0aW9uKTsKKwllbHNlCisJCW5vZGVtZ3JfdXBkYXRlX25vZGUobmUsIGNzciwgaGksIG5vZGVpZCwgZ2VuZXJhdGlvbik7CisKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgbm9kZW1ncl9ub2RlX3NjYW4oc3RydWN0IGhvc3RfaW5mbyAqaGksIGludCBnZW5lcmF0aW9uKQoreworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBoaS0+aG9zdDsKKyAgICAgICAgc3RydWN0IHNlbGZpZCAqc2lkID0gKHN0cnVjdCBzZWxmaWQgKilob3N0LT50b3BvbG9neV9tYXA7CisgICAgICAgIG5vZGVpZF90IG5vZGVpZCA9IExPQ0FMX0JVUzsKKworICAgICAgICAvKiBTY2FuIGVhY2ggbm9kZSBvbiB0aGUgYnVzICovCisgICAgICAgIGZvciAoY291bnQgPSBob3N0LT5zZWxmaWRfY291bnQ7IGNvdW50OyBjb3VudC0tLCBzaWQrKykgeworICAgICAgICAgICAgICAgIGlmIChzaWQtPmV4dGVuZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAoIXNpZC0+bGlua19hY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVpZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGVtZ3Jfbm9kZV9zY2FuX29uZShoaSwgbm9kZWlkKyssIGdlbmVyYXRpb24pOworICAgICAgICB9Cit9CisKKworc3RhdGljIHZvaWQgbm9kZW1ncl9zdXNwZW5kX25lKHN0cnVjdCBub2RlX2VudHJ5ICpuZSkKK3sKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OworCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7CisKKwlIUFNCX0RFQlVHKCJOb2RlIHN1c3BlbmRlZDogSUQ6QlVTWyIgTk9ERV9CVVNfRk1UICJdICBHVUlEWyUwMTZMeF0iLAorCQkgICBOT0RFX0JVU19BUkdTKG5lLT5ob3N0LCBuZS0+bm9kZWlkKSwgKHVuc2lnbmVkIGxvbmcgbG9uZyluZS0+Z3VpZCk7CisKKwluZS0+aW5fbGltYm8gPSAxOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmUtPmRldmljZSwgJmRldl9hdHRyX25lX2luX2xpbWJvKTsKKworCWRvd25fd3JpdGUoJm5lLT5kZXZpY2UuYnVzLT5zdWJzeXMucndzZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJm5vZGVtZ3JfdWRfY2xhc3MuY2hpbGRyZW4sIG5vZGUpIHsKKwkJdWQgPSBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IHVuaXRfZGlyZWN0b3J5LCBjbGFzc19kZXYpOworCisJCWlmICh1ZC0+bmUgIT0gbmUpCisJCQljb250aW51ZTsKKworCQlpZiAodWQtPmRldmljZS5kcml2ZXIgJiYKKwkJICAgICghdWQtPmRldmljZS5kcml2ZXItPnN1c3BlbmQgfHwKKwkJICAgICAgdWQtPmRldmljZS5kcml2ZXItPnN1c3BlbmQoJnVkLT5kZXZpY2UsIFBNU0dfU1VTUEVORCwgMCkpKQorCQkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCZ1ZC0+ZGV2aWNlKTsKKwl9CisJdXBfd3JpdGUoJm5lLT5kZXZpY2UuYnVzLT5zdWJzeXMucndzZW0pOworfQorCisKK3N0YXRpYyB2b2lkIG5vZGVtZ3JfcmVzdW1lX25lKHN0cnVjdCBub2RlX2VudHJ5ICpuZSkKK3sKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OworCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7CisKKwluZS0+aW5fbGltYm8gPSAwOworCWRldmljZV9yZW1vdmVfZmlsZSgmbmUtPmRldmljZSwgJmRldl9hdHRyX25lX2luX2xpbWJvKTsKKworCWRvd25fcmVhZCgmbmUtPmRldmljZS5idXMtPnN1YnN5cy5yd3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmbm9kZW1ncl91ZF9jbGFzcy5jaGlsZHJlbiwgbm9kZSkgeworCQl1ZCA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGNsYXNzX2Rldik7CisKKwkJaWYgKHVkLT5uZSAhPSBuZSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh1ZC0+ZGV2aWNlLmRyaXZlciAmJiB1ZC0+ZGV2aWNlLmRyaXZlci0+cmVzdW1lKQorCQkJdWQtPmRldmljZS5kcml2ZXItPnJlc3VtZSgmdWQtPmRldmljZSwgMCk7CisJfQorCXVwX3JlYWQoJm5lLT5kZXZpY2UuYnVzLT5zdWJzeXMucndzZW0pOworCisJSFBTQl9ERUJVRygiTm9kZSByZXN1bWVkOiBJRDpCVVNbIiBOT0RFX0JVU19GTVQgIl0gIEdVSURbJTAxNkx4XSIsCisJCSAgIE5PREVfQlVTX0FSR1MobmUtPmhvc3QsIG5lLT5ub2RlaWQpLCAodW5zaWduZWQgbG9uZyBsb25nKW5lLT5ndWlkKTsKK30KKworCitzdGF0aWMgdm9pZCBub2RlbWdyX3VwZGF0ZV9wZHJ2KHN0cnVjdCBub2RlX2VudHJ5ICpuZSkKK3sKKwlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOworCXN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciAqcGRydjsKKwlzdHJ1Y3QgY2xhc3MgKmNsYXNzID0gJm5vZGVtZ3JfdWRfY2xhc3M7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldjsKKworCWRvd25fcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmY2xhc3MtPmNoaWxkcmVuLCBub2RlKSB7CisJCXVkID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgY2xhc3NfZGV2KTsKKwkJaWYgKHVkLT5uZSAhPSBuZSB8fCAhdWQtPmRldmljZS5kcml2ZXIpCisJCQljb250aW51ZTsKKworCQlwZHJ2ID0gY29udGFpbmVyX29mKHVkLT5kZXZpY2UuZHJpdmVyLCBzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIsIGRyaXZlcik7CisKKwkJaWYgKHBkcnYtPnVwZGF0ZSAmJiBwZHJ2LT51cGRhdGUodWQpKSB7CisJCQlkb3duX3dyaXRlKCZ1ZC0+ZGV2aWNlLmJ1cy0+c3Vic3lzLnJ3c2VtKTsKKwkJCWRldmljZV9yZWxlYXNlX2RyaXZlcigmdWQtPmRldmljZSk7CisJCQl1cF93cml0ZSgmdWQtPmRldmljZS5idXMtPnN1YnN5cy5yd3NlbSk7CisJCX0KKwl9CisJdXBfcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7Cit9CisKKworc3RhdGljIHZvaWQgbm9kZW1ncl9wcm9iZV9uZShzdHJ1Y3QgaG9zdF9pbmZvICpoaSwgc3RydWN0IG5vZGVfZW50cnkgKm5lLCBpbnQgZ2VuZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlpZiAobmUtPmhvc3QgIT0gaGktPmhvc3QgfHwgbmUtPmluX2xpbWJvKQorCQlyZXR1cm47CisKKwlkZXYgPSBnZXRfZGV2aWNlKCZuZS0+ZGV2aWNlKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCisJLyogSWYgIm5lZWRzX3Byb2JlIiwgdGhlbiB0aGlzIGlzIGVpdGhlciBhIG5ldyBvciBjaGFuZ2VkIG5vZGUgd2UKKwkgKiByZXNjYW4gdG90YWxseS4gSWYgdGhlIGdlbmVyYXRpb24gbWF0Y2hlcyBmb3IgYW4gZXhpc3Rpbmcgbm9kZQorCSAqIChvbmUgdGhhdCBleGlzdGVkIHByaW9yIHRvIHRoZSBidXMgcmVzZXQpIHdlIHNlbmQgdXBkYXRlIGNhbGxzCisJICogZG93biB0byB0aGUgZHJpdmVycy4gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgZGVhZCBub2RlIGFuZCB3ZQorCSAqIHN1c3BlbmQgaXQuICovCisJaWYgKG5lLT5uZWVkc19wcm9iZSkKKwkJbm9kZW1ncl9wcm9jZXNzX3Jvb3RfZGlyZWN0b3J5KGhpLCBuZSk7CisJZWxzZSBpZiAobmUtPmdlbmVyYXRpb24gPT0gZ2VuZXJhdGlvbikKKwkJbm9kZW1ncl91cGRhdGVfcGRydihuZSk7CisJZWxzZQorCQlub2RlbWdyX3N1c3BlbmRfbmUobmUpOworCisJcHV0X2RldmljZShkZXYpOworfQorCisKK3N0YXRpYyB2b2lkIG5vZGVtZ3Jfbm9kZV9wcm9iZShzdHJ1Y3QgaG9zdF9pbmZvICpoaSwgaW50IGdlbmVyYXRpb24pCit7CisJc3RydWN0IGhwc2JfaG9zdCAqaG9zdCA9IGhpLT5ob3N0OworCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSAmbm9kZW1ncl9uZV9jbGFzczsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OworCisJLyogRG8gc29tZSBwcm9jZXNzaW5nIG9mIHRoZSBub2RlcyB3ZSd2ZSBwcm9iZWQuIFRoaXMgcHVsbHMgdGhlbQorCSAqIGludG8gdGhlIHN5c2ZzIGxheWVyIGlmIG5lZWRlZCwgYW5kIGNhbiByZXN1bHQgaW4gcHJvY2Vzc2luZyBvZgorCSAqIHVuaXQtZGlyZWN0b3JpZXMsIG9yIGp1c3QgdXBkYXRpbmcgdGhlIG5vZGUgYW5kIGl0J3MKKwkgKiB1bml0LWRpcmVjdG9yaWVzLiAqLworCWRvd25fcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmY2xhc3MtPmNoaWxkcmVuLCBub2RlKQorCQlub2RlbWdyX3Byb2JlX25lKGhpLCBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IG5vZGVfZW50cnksIGNsYXNzX2RldiksIGdlbmVyYXRpb24pOworICAgICAgICB1cF9yZWFkKCZjbGFzcy0+c3Vic3lzLnJ3c2VtKTsKKworCisJLyogSWYgd2UgaGFkIGEgYnVzIHJlc2V0IHdoaWxlIHdlIHdlcmUgc2Nhbm5pbmcgdGhlIGJ1cywgaXQgaXMKKwkgKiBwb3NzaWJsZSB0aGF0IHdlIGRpZCBub3QgcHJvYmUgYWxsIG5vZGVzLiAgSW4gdGhhdCBjYXNlLCB3ZQorCSAqIHNraXAgdGhlIGNsZWFuIHVwIGZvciBub3csIHNpbmNlIHdlIGNvdWxkIHJlbW92ZSBub2RlcyB0aGF0CisJICogd2VyZSBzdGlsbCBvbiB0aGUgYnVzLiAgVGhlIGJ1cyByZXNldCBpbmNyZWFzZWQgaGktPnJlc2V0X3NlbSwKKwkgKiBzbyB0aGVyZSdzIGEgYnVzIHNjYW4gcGVuZGluZyB3aGljaCB3aWxsIGRvIHRoZSBjbGVhbiB1cAorCSAqIGV2ZW50dWFsbHkuCisJICoKKwkgKiBOb3cgbGV0J3MgdGVsbCB0aGUgYnVzIHRvIHJlc2NhbiBvdXIgZGV2aWNlcy4gVGhpcyBtYXkgc2VlbQorCSAqIGxpa2Ugb3ZlcmhlYWQsIGJ1dCB0aGUgZHJpdmVyLW1vZGVsIGNvcmUgd2lsbCBvbmx5IHNjYW4gYQorCSAqIGRldmljZSBmb3IgYSBkcml2ZXIgd2hlbiBlaXRoZXIgdGhlIGRldmljZSBpcyBhZGRlZCwgb3Igd2hlbiBhCisJICogbmV3IGRyaXZlciBpcyBhZGRlZC4gQSBidXMgcmVzZXQgaXMgYSBnb29kIHJlYXNvbiB0byByZXNjYW4KKwkgKiBkZXZpY2VzIHRoYXQgd2VyZSB0aGVyZSBiZWZvcmUuICBGb3IgZXhhbXBsZSwgYW4gc2JwMiBkZXZpY2UKKwkgKiBtYXkgYmVjb21lIGF2YWlsYWJsZSBmb3IgbG9naW4sIGlmIHRoZSBob3N0IHRoYXQgaGVsZCBpdCB3YXMKKwkgKiBqdXN0IHJlbW92ZWQuICAqLworCisJaWYgKGdlbmVyYXRpb24gPT0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KSkKKwkJYnVzX3Jlc2Nhbl9kZXZpY2VzKCZpZWVlMTM5NF9idXNfdHlwZSk7CisKKwlyZXR1cm47Cit9CisKKy8qIEJlY2F1c2Ugd2UgYXJlIGEgMTM5NGEtMjAwMCBjb21wbGlhbnQgSVJNLCB3ZSBuZWVkIHRvIGluZm9ybSBhbGwgdGhlIG90aGVyCisgKiBub2RlcyBvZiB0aGUgYnJvYWRjYXN0IGNoYW5uZWwuICAoUmVhbGx5IHdlJ3JlIG9ubHkgc2V0dGluZyB0aGUgdmFsaWRpdHkKKyAqIGJpdCkuIE90aGVyIElSTSByZXNwb25zaWJpbGl0aWVzIGdvIGluIGhlcmUgYXMgd2VsbC4gKi8KK3N0YXRpYyBpbnQgbm9kZW1ncl9kb19pcm1fZHV0aWVzKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBjeWNsZXMpCit7CisJcXVhZGxldF90IGJjOworCisJLyogaWYgaXJtX2lkID09IC0xIHRoZW4gdGhlcmUgaXMgbm8gSVJNIG9uIHRoaXMgYnVzICovCisJaWYgKCFob3N0LT5pc19pcm0gfHwgaG9zdC0+aXJtX2lkID09IChub2RlaWRfdCktMSkKKwkJcmV0dXJuIDE7CisKKwlob3N0LT5jc3IuYnJvYWRjYXN0X2NoYW5uZWwgfD0gMHg0MDAwMDAwMDsgIC8qIHNldCB2YWxpZGl0eSBiaXQgKi8KKworCWJjID0gY3B1X3RvX2JlMzIoaG9zdC0+Y3NyLmJyb2FkY2FzdF9jaGFubmVsKTsKKworCWhwc2Jfd3JpdGUoaG9zdCwgTE9DQUxfQlVTIHwgQUxMX05PREVTLCBnZXRfaHBzYl9nZW5lcmF0aW9uKGhvc3QpLAorCQkgICAoQ1NSX1JFR0lTVEVSX0JBU0UgfCBDU1JfQlJPQURDQVNUX0NIQU5ORUwpLAorCQkgICAmYmMsIHNpemVvZihxdWFkbGV0X3QpKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIGJ1cyBtYW5hZ2VyIHRoZW4gd2Ugc2hvdWxkIHNldCB0aGUgcm9vdCBub2RlJ3MKKwkgKiBmb3JjZV9yb290IGJpdCB0byBwcm9tb3RlIGJ1cyBzdGFiaWxpdHkgcGVyIHRoZSAxMzk0CisJICogc3BlYy4gKDguNC4yLjYpICovCisJaWYgKGhvc3QtPmJ1c21ncl9pZCA9PSAweGZmZmYgJiYgaG9zdC0+bm9kZV9jb3VudCA+IDEpCisJeworCQl1MTYgcm9vdF9ub2RlID0gaG9zdC0+bm9kZV9jb3VudCAtIDE7CisJCXN0cnVjdCBub2RlX2VudHJ5ICpuZSA9IGZpbmRfZW50cnlfYnlfbm9kZWlkKGhvc3QsIHJvb3Rfbm9kZSB8IExPQ0FMX0JVUyk7CisKKwkJaWYgKG5lICYmIG5lLT5idXNvcHQuY21jKQorCQkJaHBzYl9zZW5kX3BoeV9jb25maWcoaG9zdCwgcm9vdF9ub2RlLCAtMSk7CisJCWVsc2UgeworCQkJSFBTQl9ERUJVRygiVGhlIHJvb3Qgbm9kZSBpcyBub3QgY3ljbGUgbWFzdGVyIGNhcGFibGU7ICIKKwkJCQkgICAic2VsZWN0aW5nIGEgbmV3IHJvb3Qgbm9kZSBhbmQgcmVzZXR0aW5nLi4uIik7CisKKwkJCWlmIChjeWNsZXMgPj0gNSkgeworCQkJCS8qIE9oIHNjcmV3IGl0ISBKdXN0IGxlYXZlIHRoZSBidXMgYXMgaXQgaXMgKi8KKwkJCQlIUFNCX0RFQlVHKCJTdG9wcGluZyByZXNldCBsb29wIGZvciBJUk0gc2FuaXR5Iik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCWhwc2Jfc2VuZF9waHlfY29uZmlnKGhvc3QsIE5PREVJRF9UT19OT0RFKGhvc3QtPm5vZGVfaWQpLCAtMSk7CisJCQlocHNiX3Jlc2V0X2J1cyhob3N0LCBMT05HX1JFU0VUX0ZPUkNFX1JPT1QpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCisvKiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGlmIHdlIGFyZSBub3QgdGhlIElSTSwgdGhhdCB0aGUgSVJNIG5vZGUgaXMgY2FwYWJsZSBvZgorICogZXZlcnl0aGluZyB3ZSBjYW4gZG8sIG90aGVyd2lzZSBpc3N1ZSBhIGJ1cyByZXNldCBhbmQgdHJ5IHRvIGJlY29tZSB0aGUgSVJNCisgKiBvdXJzZWx2ZXMuICovCitzdGF0aWMgaW50IG5vZGVtZ3JfY2hlY2tfaXJtX2NhcGFiaWxpdHkoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IGN5Y2xlcykKK3sKKwlxdWFkbGV0X3QgYmM7CisJaW50IHN0YXR1czsKKworCWlmIChocHNiX2Rpc2FibGVfaXJtIHx8IGhvc3QtPmlzX2lybSkKKwkJcmV0dXJuIDE7CisKKwlzdGF0dXMgPSBocHNiX3JlYWQoaG9zdCwgTE9DQUxfQlVTIHwgKGhvc3QtPmlybV9pZCksCisJCQkgICBnZXRfaHBzYl9nZW5lcmF0aW9uKGhvc3QpLAorCQkJICAgKENTUl9SRUdJU1RFUl9CQVNFIHwgQ1NSX0JST0FEQ0FTVF9DSEFOTkVMKSwKKwkJCSAgICZiYywgc2l6ZW9mKHF1YWRsZXRfdCkpOworCisJaWYgKHN0YXR1cyA8IDAgfHwgIShiZTMyX3RvX2NwdShiYykgJiAweDgwMDAwMDAwKSkgeworCQkvKiBUaGUgY3VycmVudCBpcm0gbm9kZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgQlJPQURDQVNUX0NIQU5ORUwKKwkJICogcmVnaXN0ZXIgYW5kIHdlIGRvLCBzbyByZXNldCB0aGUgYnVzIHdpdGggZm9yY2Vfcm9vdCBzZXQgKi8KKwkJSFBTQl9ERUJVRygiQ3VycmVudCByZW1vdGUgSVJNIGlzIG5vdCAxMzk0YS0yMDAwIGNvbXBsaWFudCwgcmVzZXR0aW5nLi4uIik7CisKKwkJaWYgKGN5Y2xlcyA+PSA1KSB7CisJCQkvKiBPaCBzY3JldyBpdCEgSnVzdCBsZWF2ZSB0aGUgYnVzIGFzIGl0IGlzICovCisJCQlIUFNCX0RFQlVHKCJTdG9wcGluZyByZXNldCBsb29wIGZvciBJUk0gc2FuaXR5Iik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWhwc2Jfc2VuZF9waHlfY29uZmlnKGhvc3QsIE5PREVJRF9UT19OT0RFKGhvc3QtPm5vZGVfaWQpLCAtMSk7CisJCWhwc2JfcmVzZXRfYnVzKGhvc3QsIExPTkdfUkVTRVRfRk9SQ0VfUk9PVCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbm9kZW1ncl9ob3N0X3RocmVhZCh2b2lkICpfX2hpKQoreworCXN0cnVjdCBob3N0X2luZm8gKmhpID0gKHN0cnVjdCBob3N0X2luZm8gKilfX2hpOworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBoaS0+aG9zdDsKKwlpbnQgcmVzZXRfY3ljbGVzID0gMDsKKworCS8qIE5vIHVzZXJsZXZlbCBhY2Nlc3MgbmVlZGVkICovCisJZGFlbW9uaXplKGhpLT5kYWVtb25fbmFtZSk7CisKKwkvKiBTZXR1cCBvdXIgZGV2aWNlLW1vZGVsIGVudHJpZXMgKi8KKwlub2RlbWdyX2NyZWF0ZV9ob3N0X2Rldl9maWxlcyhob3N0KTsKKworCS8qIFNpdCBhbmQgd2FpdCBmb3IgYSBzaWduYWwgdG8gcHJvYmUgdGhlIG5vZGVzIG9uIHRoZSBidXMuIFRoaXMKKwkgKiBoYXBwZW5zIHdoZW4gd2UgZ2V0IGEgYnVzIHJlc2V0LiAqLworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIGludCBnZW5lcmF0aW9uID0gMDsKKwkJaW50IGk7CisKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaGktPnJlc2V0X3NlbSkgfHwKKwkJICAgIGRvd25faW50ZXJydXB0aWJsZSgmbm9kZW1ncl9zZXJpYWxpemUpKSB7CisJCQlpZiAodHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRrKCJOb2RlTWdyOiByZWNlaXZlZCB1bmV4cGVjdGVkIHNpZ25hbD8hXG4iICk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChoaS0+a2lsbF9tZSkgeworCQkJdXAoJm5vZGVtZ3Jfc2VyaWFsaXplKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUGF1c2UgZm9yIDEvNCBzZWNvbmQgaW4gMS8xNiBzZWNvbmQgaW50ZXJ2YWxzLAorCQkgKiB0byBtYWtlIHN1cmUgdGhpbmdzIHNldHRsZSBkb3duLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgNCA7IGkrKykgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmIChtc2xlZXBfaW50ZXJydXB0aWJsZSg2MykpIHsKKwkJCQl1cCgmbm9kZW1ncl9zZXJpYWxpemUpOworCQkJCWdvdG8gY2F1Z2h0X3NpZ25hbDsKKwkJCX0KKworCQkJLyogTm93IGdldCB0aGUgZ2VuZXJhdGlvbiBpbiB3aGljaCB0aGUgbm9kZSBJRCdzIHdlIGNvbGxlY3QKKwkJCSAqIGFyZSB2YWxpZC4gIER1cmluZyB0aGUgYnVzIHNjYW4gd2Ugd2lsbCB1c2UgdGhpcyBnZW5lcmF0aW9uCisJCQkgKiBmb3IgdGhlIHJlYWQgdHJhbnNhY3Rpb25zLCBzbyB0aGF0IGlmIGFub3RoZXIgcmVzZXQgb2NjdXJzCisJCQkgKiBkdXJpbmcgdGhlIHNjYW4gdGhlIHRyYW5zYWN0aW9ucyB3aWxsIGZhaWwgaW5zdGVhZCBvZgorCQkJICogcmV0dXJuaW5nIGJvZ3VzIGRhdGEuICovCisJCQlnZW5lcmF0aW9uID0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KTsKKworCQkJLyogSWYgd2UgZ2V0IGEgcmVzZXQgYmVmb3JlIHdlIGFyZSBkb25lIHdhaXRpbmcsIHRoZW4KKwkJCSAqIHN0YXJ0IHRoZSB0aGUgd2FpdGluZyBvdmVyIGFnYWluICovCisJCQl3aGlsZSAoIWRvd25fdHJ5bG9jaygmaGktPnJlc2V0X3NlbSkpCisJCQkJaSA9IDA7CisKKwkJCS8qIENoZWNrIHRoZSBraWxsX21lIGFnYWluICovCisJCQlpZiAoaGktPmtpbGxfbWUpIHsKKwkJCQl1cCgmbm9kZW1ncl9zZXJpYWxpemUpOworCQkJCWdvdG8gY2F1Z2h0X3NpZ25hbDsKKwkJCX0KKwkJfQorCisJCWlmICghbm9kZW1ncl9jaGVja19pcm1fY2FwYWJpbGl0eShob3N0LCByZXNldF9jeWNsZXMpKSB7CisJCQlyZXNldF9jeWNsZXMrKzsKKwkJCXVwKCZub2RlbWdyX3NlcmlhbGl6ZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFNjYW4gb3VyIG5vZGVzIHRvIGdldCB0aGUgYnVzIG9wdGlvbnMgYW5kIGNyZWF0ZSBub2RlCisJCSAqIGVudHJpZXMuIFRoaXMgZG9lcyBub3QgZG8gdGhlIHN5c2ZzIHN0dWZmLCBzaW5jZSB0aGF0CisJCSAqIHdvdWxkIHRyaWdnZXIgaG90cGx1ZyBjYWxsYmFja3MgYW5kIHN1Y2gsIHdoaWNoIGlzIGEKKwkJICogYmFkIGlkZWEgYXQgdGhpcyBwb2ludC4gKi8KKwkJbm9kZW1ncl9ub2RlX3NjYW4oaGksIGdlbmVyYXRpb24pOworCQlpZiAoIW5vZGVtZ3JfZG9faXJtX2R1dGllcyhob3N0LCByZXNldF9jeWNsZXMpKSB7CisJCQlyZXNldF9jeWNsZXMrKzsKKwkJCXVwKCZub2RlbWdyX3NlcmlhbGl6ZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJlc2V0X2N5Y2xlcyA9IDA7CisKKwkJLyogVGhpcyBhY3R1YWxseSBkb2VzIHRoZSBmdWxsIHByb2JlLCB3aXRoIHN5c2ZzCisJCSAqIHJlZ2lzdHJhdGlvbi4gKi8KKwkJbm9kZW1ncl9ub2RlX3Byb2JlKGhpLCBnZW5lcmF0aW9uKTsKKworCQkvKiBVcGRhdGUgc29tZSBvZiBvdXIgc3lzZnMgc3ltbGlua3MgKi8KKwkJbm9kZW1ncl91cGRhdGVfaG9zdF9kZXZfbGlua3MoaG9zdCk7CisKKwkJdXAoJm5vZGVtZ3Jfc2VyaWFsaXplKTsKKwl9CisKK2NhdWdodF9zaWduYWw6CisJSFBTQl9WRVJCT1NFKCJOb2RlTWdyOiBFeGl0aW5nIHRocmVhZCIpOworCisJY29tcGxldGVfYW5kX2V4aXQoJmhpLT5leGl0ZWQsIDApOworfQorCitpbnQgbm9kZW1ncl9mb3JfZWFjaF9ob3N0KHZvaWQgKl9fZGF0YSwgaW50ICgqY2IpKHN0cnVjdCBocHNiX2hvc3QgKiwgdm9pZCAqKSkKK3sKKwlzdHJ1Y3QgY2xhc3MgKmNsYXNzID0gJmhwc2JfaG9zdF9jbGFzczsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CisJaW50IGVycm9yID0gMDsKKworCWRvd25fcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmY2xhc3MtPmNoaWxkcmVuLCBub2RlKSB7CisJCWhvc3QgPSBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IGhwc2JfaG9zdCwgY2xhc3NfZGV2KTsKKworCQlpZiAoKGVycm9yID0gY2IoaG9zdCwgX19kYXRhKSkpCisJCQlicmVhazsKKwl9CisJdXBfcmVhZCgmY2xhc3MtPnN1YnN5cy5yd3NlbSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgZm91ciBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdXNlIGEgc3RydWN0IG5vZGVfZW50cnkKKyAqIGZvciBhZGRyZXNzaW5nIGEgbm9kZSBvbiB0aGUgYnVzLiAgVGhleSBhcmUgaW50ZW5kZWQgZm9yIHVzZSBieSBhbnkKKyAqIHByb2Nlc3MgY29udGV4dCwgbm90IGp1c3QgdGhlIG5vZGVtZ3IgdGhyZWFkLCBzbyB3ZSBuZWVkIHRvIGJlIGEKKyAqIGxpdHRsZSBjYXJlZnVsIHdoZW4gcmVhZGluZyBvdXQgdGhlIG5vZGUgSUQgYW5kIGdlbmVyYXRpb24uICBUaGUKKyAqIHRoaW5nIHRoYXQgY2FuIGdvIHdyb25nIGlzIHRoYXQgd2UgZ2V0IHRoZSBub2RlIElELCB0aGVuIGEgYnVzCisgKiByZXNldCBvY2N1cnMsIGFuZCB0aGVuIHdlIHJlYWQgdGhlIGdlbmVyYXRpb24uICBUaGUgbm9kZSBJRCBpcworICogcG9zc2libHkgaW52YWxpZCwgYnV0IHRoZSBnZW5lcmF0aW9uIGlzIGN1cnJlbnQsIGFuZCB3ZSBlbmQgdXAKKyAqIHNlbmRpbmcgYSBwYWNrZXQgdG8gYSB0aGUgd3Jvbmcgbm9kZS4KKyAqCisgKiBUaGUgc29sdXRpb24gaXMgdG8gbWFrZSBzdXJlIHdlIHJlYWQgdGhlIGdlbmVyYXRpb24gZmlyc3QsIHNvIHRoYXQKKyAqIGlmIGEgcmVzZXQgb2NjdXJzIGluIHRoZSBwcm9jZXNzLCB3ZSBlbmQgdXAgd2l0aCBhIHN0YWxlIGdlbmVyYXRpb24KKyAqIGFuZCB0aGUgdHJhbnNhY3Rpb25zIHdpbGwgZmFpbCBpbnN0ZWFkIG9mIHNpbGVudGx5IHVzaW5nIHdyb25nIG5vZGUKKyAqIElEJ3MuCisgKi8KKwordm9pZCBocHNiX25vZGVfZmlsbF9wYWNrZXQoc3RydWN0IG5vZGVfZW50cnkgKm5lLCBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBrdCkKK3sKKyAgICAgICAgcGt0LT5ob3N0ID0gbmUtPmhvc3Q7CisgICAgICAgIHBrdC0+Z2VuZXJhdGlvbiA9IG5lLT5nZW5lcmF0aW9uOworCWJhcnJpZXIoKTsKKyAgICAgICAgcGt0LT5ub2RlX2lkID0gbmUtPm5vZGVpZDsKK30KKworaW50IGhwc2Jfbm9kZV93cml0ZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUsIHU2NCBhZGRyLAorCQkgICAgcXVhZGxldF90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisJdW5zaWduZWQgaW50IGdlbmVyYXRpb24gPSBuZS0+Z2VuZXJhdGlvbjsKKworCWJhcnJpZXIoKTsKKwlyZXR1cm4gaHBzYl93cml0ZShuZS0+aG9zdCwgbmUtPm5vZGVpZCwgZ2VuZXJhdGlvbiwKKwkJCSAgYWRkciwgYnVmZmVyLCBsZW5ndGgpOworfQorCitzdGF0aWMgdm9pZCBub2RlbWdyX2FkZF9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGhvc3RfaW5mbyAqaGk7CisKKwloaSA9IGhwc2JfY3JlYXRlX2hvc3RpbmZvKCZub2RlbWdyX2hpZ2hsZXZlbCwgaG9zdCwgc2l6ZW9mKCpoaSkpOworCisJaWYgKCFoaSkgeworCQlIUFNCX0VSUiAoIk5vZGVNZ3I6IG91dCBvZiBtZW1vcnkgaW4gYWRkIGhvc3QiKTsKKwkJcmV0dXJuOworCX0KKworCWhpLT5ob3N0ID0gaG9zdDsKKwlpbml0X2NvbXBsZXRpb24oJmhpLT5leGl0ZWQpOworICAgICAgICBzZW1hX2luaXQoJmhpLT5yZXNldF9zZW0sIDApOworCisJc3ByaW50ZihoaS0+ZGFlbW9uX25hbWUsICJrbm9kZW1ncmRfJWQiLCBob3N0LT5pZCk7CisKKwloaS0+cGlkID0ga2VybmVsX3RocmVhZChub2RlbWdyX2hvc3RfdGhyZWFkLCBoaSwgQ0xPTkVfS0VSTkVMKTsKKworCWlmIChoaS0+cGlkIDwgMCkgeworCQlIUFNCX0VSUiAoIk5vZGVNZ3I6IGZhaWxlZCB0byBzdGFydCAlcyB0aHJlYWQgZm9yICVzIiwKKwkJCSAgaGktPmRhZW1vbl9uYW1lLCBob3N0LT5kcml2ZXItPm5hbWUpOworCQlocHNiX2Rlc3Ryb3lfaG9zdGluZm8oJm5vZGVtZ3JfaGlnaGxldmVsLCBob3N0KTsKKwkJcmV0dXJuOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbm9kZW1ncl9ob3N0X3Jlc2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGhvc3RfaW5mbyAqaGkgPSBocHNiX2dldF9ob3N0aW5mbygmbm9kZW1ncl9oaWdobGV2ZWwsIGhvc3QpOworCisJaWYgKGhpICE9IE5VTEwpIHsKKwkJSFBTQl9WRVJCT1NFKCJOb2RlTWdyOiBQcm9jZXNzaW5nIGhvc3QgcmVzZXQgZm9yICVzIiwgaGktPmRhZW1vbl9uYW1lKTsKKwkJdXAoJmhpLT5yZXNldF9zZW0pOworCX0gZWxzZQorCQlIUFNCX0VSUiAoIk5vZGVNZ3I6IGNvdWxkIG5vdCBwcm9jZXNzIHJlc2V0IG9mIHVudXNlZCBob3N0Iik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG5vZGVtZ3JfcmVtb3ZlX2hvc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgaG9zdF9pbmZvICpoaSA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZub2RlbWdyX2hpZ2hsZXZlbCwgaG9zdCk7CisKKwlpZiAoaGkpIHsKKwkJaWYgKGhpLT5waWQgPj0gMCkgeworCQkJaGktPmtpbGxfbWUgPSAxOworCQkJbWIoKTsKKwkJCXVwKCZoaS0+cmVzZXRfc2VtKTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmhpLT5leGl0ZWQpOworCQkJbm9kZW1ncl9yZW1vdmVfaG9zdF9kZXYoJmhvc3QtPmRldmljZSk7CisJCX0KKwl9IGVsc2UKKwkJSFBTQl9FUlIoIk5vZGVNZ3I6IGhvc3QgJXMgZG9lcyBub3QgZXhpc3QsIGNhbm5vdCByZW1vdmUiLAorCQkJIGhvc3QtPmRyaXZlci0+bmFtZSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgbm9kZW1ncl9oaWdobGV2ZWwgPSB7CisJLm5hbWUgPQkJIk5vZGUgbWFuYWdlciIsCisJLmFkZF9ob3N0ID0Jbm9kZW1ncl9hZGRfaG9zdCwKKwkuaG9zdF9yZXNldCA9CW5vZGVtZ3JfaG9zdF9yZXNldCwKKwkucmVtb3ZlX2hvc3QgPQlub2RlbWdyX3JlbW92ZV9ob3N0LAorfTsKKworaW50IGluaXRfaWVlZTEzOTRfbm9kZW1ncih2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjbGFzc19yZWdpc3Rlcigmbm9kZW1ncl9uZV9jbGFzcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGFzc19yZWdpc3Rlcigmbm9kZW1ncl91ZF9jbGFzcyk7CisJaWYgKHJldCA8IDApIHsKKwkJY2xhc3NfdW5yZWdpc3Rlcigmbm9kZW1ncl9uZV9jbGFzcyk7CisJCXJldHVybiByZXQ7CisJfQorCisJaHBzYl9yZWdpc3Rlcl9oaWdobGV2ZWwoJm5vZGVtZ3JfaGlnaGxldmVsKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfaWVlZTEzOTRfbm9kZW1ncih2b2lkKQoreworICAgICAgICBocHNiX3VucmVnaXN0ZXJfaGlnaGxldmVsKCZub2RlbWdyX2hpZ2hsZXZlbCk7CisKKwljbGFzc191bnJlZ2lzdGVyKCZub2RlbWdyX3VkX2NsYXNzKTsKKwljbGFzc191bnJlZ2lzdGVyKCZub2RlbWdyX25lX2NsYXNzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5oIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyZjBjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5oCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwCUFuZHJlYXMgRS4gQm9tYmUKKyAqICAgICAgICAgICAgICAgMjAwMQlCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0lFRUUxMzk0X05PREVNR1JfSAorI2RlZmluZSBfSUVFRTEzOTRfTk9ERU1HUl9ICisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlICJjc3IxMjEyLmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfY29yZS5oIgorI2luY2x1ZGUgImllZWUxMzk0X2hvdHBsdWcuaCIKKworLyogJzEnICczJyAnOScgJzQnIGluIEFTQ0lJICovCisjZGVmaW5lIElFRUUxMzk0X0JVU0lEX01BR0lDCV9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCkKKworLyogVGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBOb2RlIGVudHJ5IHN0cnVjdHVyZS4gSXQgc2hvdWxkIGJlIGEgc3RhYmxlIEFQSQorICogZm9yIHdoaWNoIHRvIGdhdGhlciBpbmZvIGZyb20gdGhlIE5vZGUgTWFuYWdlciBhYm91dCBkZXZpY2VzIGF0dGFjaGVkCisgKiB0byB0aGUgYnVzLiAgKi8KK3N0cnVjdCBidXNfb3B0aW9ucyB7CisJdTgJaXJtYzsJCS8qIElzbyBSZXNvdXJjZSBNYW5hZ2VyIENhcGFibGUgKi8KKwl1OAljbWM7CQkvKiBDeWNsZSBNYXN0ZXIgQ2FwYWJsZSAqLworCXU4CWlzYzsJCS8qIElzbyBDYXBhYmxlICovCisJdTgJYm1jOwkJLyogQnVzIE1hc3RlciBDYXBhYmxlICovCisJdTgJcG1jOwkJLyogUG93ZXIgTWFuYWdlciBDYXBhYmxlIChQTlAgc3BlYykgKi8KKwl1OAljeWNfY2xrX2FjYzsJLyogQ3ljbGUgY2xvY2sgYWNjdXJhY3kgKi8KKwl1OAltYXhfcm9tOwkvKiBNYXhpbXVtIGJsb2NrIHJlYWQgc3VwcG9ydGVkIGluIHRoZSBDU1IgKi8KKwl1OAlnZW5lcmF0aW9uOwkvKiBJbmNyZW1lbnRlZCB3aGVuIGNvbmZpZ3JvbSBjaGFuZ2VzICovCisJdTgJbG5rc3BkOwkJLyogTGluayBzcGVlZCAqLworCXUxNgltYXhfcmVjOwkvKiBNYXhpbXVtIHBhY2tldCBzaXplIG5vZGUgY2FuIHJlY2VpdmUgKi8KK307CisKKworI2RlZmluZSBVTklUX0RJUkVDVE9SWV9WRU5ET1JfSUQJCTB4MDEKKyNkZWZpbmUgVU5JVF9ESVJFQ1RPUllfTU9ERUxfSUQJCQkweDAyCisjZGVmaW5lIFVOSVRfRElSRUNUT1JZX1NQRUNJRklFUl9JRAkJMHgwNAorI2RlZmluZSBVTklUX0RJUkVDVE9SWV9WRVJTSU9OCQkJMHgwOAorI2RlZmluZSBVTklUX0RJUkVDVE9SWV9IQVNfTFVOX0RJUkVDVE9SWQkweDEwCisjZGVmaW5lIFVOSVRfRElSRUNUT1JZX0xVTl9ESVJFQ1RPUlkJCTB4MjAKKyNkZWZpbmUgVU5JVF9ESVJFQ1RPUllfSEFTX0xVTgkJCTB4NDAKKworLyoKKyAqIEEgdW5pdCBkaXJlY3RvcnkgY29ycmVzcG9uZHMgdG8gYSBwcm90b2NvbCBzdXBwb3J0ZWQgYnkgdGhlCisgKiBub2RlLiBJZiBhIG5vZGUgc3VwcG9ydHMgZWcuIElQLzEzOTQgYW5kIEFWL0MsIGl0cyBjb25maWcgcm9tIGhhcyBhCisgKiB1bml0IGRpcmVjdG9yeSBmb3IgZWFjaCBvZiB0aGVzZSBwcm90b2NvbHMuCisgKi8KK3N0cnVjdCB1bml0X2RpcmVjdG9yeSB7CisJc3RydWN0IG5vZGVfZW50cnkgKm5lOyAgLyogVGhlIG5vZGUgd2hpY2ggdGhpcyBkaXJlY3RvcnkgYmVsb25ncyB0byAqLworCW9jdGxldF90IGFkZHJlc3M7ICAgICAgIC8qIEFkZHJlc3Mgb2YgdGhlIHVuaXQgZGlyZWN0b3J5IG9uIHRoZSBub2RlICovCisJdTggZmxhZ3M7CQkvKiBJbmRpY2F0ZXMgd2hpY2ggZW50cmllcyB3ZXJlIHJlYWQgKi8KKworCXF1YWRsZXRfdCB2ZW5kb3JfaWQ7CisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICp2ZW5kb3JfbmFtZV9rdjsKKwljb25zdCBjaGFyICp2ZW5kb3Jfb3VpOworCisJcXVhZGxldF90IG1vZGVsX2lkOworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqbW9kZWxfbmFtZV9rdjsKKwlxdWFkbGV0X3Qgc3BlY2lmaWVyX2lkOworCXF1YWRsZXRfdCB2ZXJzaW9uOworCisJdW5zaWduZWQgaW50IGlkOworCisJaW50IGlnbm9yZV9kcml2ZXI7CisKKwlpbnQgbGVuZ3RoOwkJLyogTnVtYmVyIG9mIHF1YWRsZXRzICovCisKKwlzdHJ1Y3QgZGV2aWNlIGRldmljZTsKKworCXN0cnVjdCBjbGFzc19kZXZpY2UgY2xhc3NfZGV2OworCisJc3RydWN0IGNzcjEyMTJfa2V5dmFsICp1ZF9rdjsKKwl1MzIgbHVuOyAgICAgICAgICAgICAgICAvKiBsb2dpY2FsIHVuaXQgbnVtYmVyIGltbWVkaWF0ZSB2YWx1ZSAqLworfTsKKworc3RydWN0IG5vZGVfZW50cnkgeworCXU2NCBndWlkOwkJCS8qIEdVSUQgb2YgdGhpcyBub2RlICovCisJdTMyIGd1aWRfdmVuZG9yX2lkOwkJLyogVG9wIDI0Yml0cyBvZiBndWlkICovCisJY29uc3QgY2hhciAqZ3VpZF92ZW5kb3Jfb3VpOwkvKiBPVUkgbmFtZSBvZiBndWlkIHZlbmRvciBpZCAqLworCisJc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsJCS8qIEhvc3QgdGhpcyBub2RlIGlzIGF0dGFjaGVkIHRvICovCisJbm9kZWlkX3Qgbm9kZWlkOwkJLyogTm9kZUlEICovCisJc3RydWN0IGJ1c19vcHRpb25zIGJ1c29wdDsJLyogQnVzIE9wdGlvbnMgKi8KKwlpbnQgbmVlZHNfcHJvYmU7CisJdW5zaWduZWQgaW50IGdlbmVyYXRpb247CS8qIFN5bmNlZCB3aXRoIGhwc2IgZ2VuZXJhdGlvbiAqLworCisJLyogVGhlIGZvbGxvd2luZyBpcyByZWFkIGZyb20gdGhlIGNvbmZpZyByb20gKi8KKwl1MzIgdmVuZG9yX2lkOworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqdmVuZG9yX25hbWVfa3Y7CisJY29uc3QgY2hhciAqdmVuZG9yX291aTsKKworCXUzMiBjYXBhYmlsaXRpZXM7CisJc3RydWN0IGhwc2JfdGxhYmVsX3Bvb2wgKnRwb29sOworCisJc3RydWN0IGRldmljZSBkZXZpY2U7CisKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlIGNsYXNzX2RldjsKKworCS8qIE1lYW5zIHRoaXMgbm9kZSBpcyBub3QgYXR0YWNoZWQgYW55bW9yZSAqLworCWludCBpbl9saW1ibzsKKworCXN0cnVjdCBjc3IxMjEyX2NzciAqY3NyOworfTsKKworc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyIHsKKwkvKiBUaGUgbmFtZSBvZiB0aGUgZHJpdmVyLCBlLmcuIFNCUDIgb3IgSVAxMzk0ICovCisJY29uc3QgY2hhciAqbmFtZTsKKworCS8qCisJICogVGhlIGRldmljZSBpZCB0YWJsZSBkZXNjcmliaW5nIHRoZSBwcm90b2NvbHMgYW5kL29yIGRldmljZXMKKwkgKiBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuICBUaGlzIGlzIHVzZWQgYnkgdGhlIG5vZGVtZ3IgdG8KKwkgKiBkZWNpZGUgaWYgYSBkcml2ZXIgY291bGQgc3VwcG9ydCBhIGdpdmVuIG5vZGUsIGJ1dCB0aGUKKwkgKiBwcm9iZSBmdW5jdGlvbiBiZWxvdyBjYW4gaW1wbGVtZW50IGZ1cnRoZXIgcHJvdG9jb2wKKwkgKiBkZXBlbmRlbnQgb3IgdmVuZG9yIGRlcGVuZGVudCBjaGVja2luZy4KKwkgKi8KKwlzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkICppZF90YWJsZTsKKworCS8qCisJICogVGhlIHVwZGF0ZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgbm9kZSBoYXMganVzdAorCSAqIHN1cnZpdmVkIGEgYnVzIHJlc2V0LCBpLmUuIGl0IGlzIHN0aWxsIHByZXNlbnQgb24gdGhlIGJ1cy4KKwkgKiBIb3dldmVyLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJlZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uCisJICogb3IgbG9naW4gaW50byB0aGUgbm9kZSBhZ2FpbiwgZGVwZW5kaW5nIG9uIHRoZSBwcm90b2NvbC4gSWYgdGhlCisJICogcHJvYmUgZmFpbHMgKHJldHVybnMgbm9uLXplcm8pLCB3ZSB1bmJpbmQgdGhlIGRyaXZlciBmcm9tIHRoaXMKKwkgKiBkZXZpY2UuCisJICovCisJaW50ICgqdXBkYXRlKShzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkKTsKKworCS8qIE91ciBMRE0gc3RydWN0dXJlICovCisJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOworfTsKKworaW50IGhwc2JfcmVnaXN0ZXJfcHJvdG9jb2woc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyICpkcml2ZXIpOwordm9pZCBocHNiX3VucmVnaXN0ZXJfcHJvdG9jb2woc3RydWN0IGhwc2JfcHJvdG9jb2xfZHJpdmVyICpkcml2ZXIpOworCitzdGF0aWMgaW5saW5lIGludCBocHNiX25vZGVfZW50cnlfdmFsaWQoc3RydWN0IG5vZGVfZW50cnkgKm5lKQoreworCXJldHVybiBuZS0+Z2VuZXJhdGlvbiA9PSBnZXRfaHBzYl9nZW5lcmF0aW9uKG5lLT5ob3N0KTsKK30KKworLyoKKyAqIFJldHVybnMgYSBub2RlIGVudHJ5ICh3aGljaCBoYXMgaXRzIHJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZCkgb3IgTlVMTCBpZgorICogdGhlIEdVSUQgaW4gcXVlc3Rpb24gaXMgbm90IGtub3duLiAgR2V0dGluZyBhIHZhbGlkIGVudHJ5IGRvZXMgbm90IG1lYW4gdGhhdAorICogdGhlIG5vZGUgd2l0aCB0aGlzIEdVSUQgaXMgY3VycmVudGx5IGFjY2Vzc2libGUgKG1pZ2h0IGJlIHBvd2VyZWQgZG93bikuCisgKi8KK3N0cnVjdCBub2RlX2VudHJ5ICpocHNiX2d1aWRfZ2V0X2VudHJ5KHU2NCBndWlkKTsKKworLyogU2FtZSBhcyBhYm92ZSwgYnV0IHVzZSB0aGUgbm9kZWlkIHRvIGdldCBhbiBub2RlIGVudHJ5LiBUaGlzIGlzIG5vdAorICogZm9vbC1wcm9vZiBieSBpdHNlbGYsIHNpbmNlIHRoZSBub2RlaWQgY2FuIGNoYW5nZS4gICovCitzdHJ1Y3Qgbm9kZV9lbnRyeSAqaHBzYl9ub2RlaWRfZ2V0X2VudHJ5KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIG5vZGVpZF90IG5vZGVpZCk7CisKKy8qCisgKiBJZiB0aGUgZW50cnkgcmVmZXJzIHRvIGEgbG9jYWwgaG9zdCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgcG9pbnRlcgorICogdG8gdGhlIGhwc2JfaG9zdCBzdHJ1Y3R1cmUuICBJdCB3aWxsIHJldHVybiBOVUxMIG90aGVyd2lzZS4gIE9uY2UgeW91IGhhdmUKKyAqIGVzdGFibGlzaGVkIGl0IGlzIGEgbG9jYWwgaG9zdCwgeW91IGNhbiB1c2UgdGhhdCBrbm93bGVkZ2UgZnJvbSB0aGVuIG9uICh0aGUKKyAqIEdVSUQgd29uJ3Qgd2FuZGVyIHRvIGFuIGV4dGVybmFsIG5vZGUpLiAgKi8KK3N0cnVjdCBocHNiX2hvc3QgKmhwc2JfZ2V0X2hvc3RfYnlfbmUoc3RydWN0IG5vZGVfZW50cnkgKm5lKTsKKworLyoKKyAqIFRoaXMgd2lsbCBmaWxsIGluIHRoZSBnaXZlbiwgcHJlLWluaXRpYWxpc2VkIGhwc2JfcGFja2V0IHdpdGggdGhlIGN1cnJlbnQKKyAqIGluZm9ybWF0aW9uIGZyb20gdGhlIG5vZGUgZW50cnkgKGhvc3QsIG5vZGUgSUQsIGdlbmVyYXRpb24gbnVtYmVyKS4gIEl0IHdpbGwKKyAqIHJldHVybiBmYWxzZSBpZiB0aGUgbm9kZSBvd25pbmcgdGhlIEdVSUQgaXMgbm90IGFjY2Vzc2libGUgKGFuZCBub3QgbW9kaWZ5IHRoZQorICogaHBzYl9wYWNrZXQpIGFuZCByZXR1cm4gdHJ1ZSBvdGhlcndpc2UuCisgKgorICogTm90ZSB0aGF0IHBhY2tldCBzZW5kaW5nIG1heSBzdGlsbCBmYWlsIGluIGhwc2Jfc2VuZF9wYWNrZXQgaWYgYSBidXMgcmVzZXQKKyAqIGhhcHBlbnMgd2hpbGUgeW91IGFyZSB0cnlpbmcgdG8gc2V0IHVwIHRoZSBwYWNrZXQgKGR1ZSB0byBvYnNvbGV0ZSBnZW5lcmF0aW9uCisgKiBudW1iZXIpLiAgSXQgd2lsbCBhdCBsZWFzdCByZWxpYWJseSBmYWlsIHNvIHRoYXQgeW91IGRvbid0IGFjY2lkZW50YWxseSBhbmQKKyAqIHVua25vd2luZ2x5IHNlbmQgeW91ciBwYWNrZXQgdG8gdGhlIHdyb25nIG5vZGUuCisgKi8KK3ZvaWQgaHBzYl9ub2RlX2ZpbGxfcGFja2V0KHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgc3RydWN0IGhwc2JfcGFja2V0ICpwa3QpOworCitpbnQgaHBzYl9ub2RlX3JlYWQoc3RydWN0IG5vZGVfZW50cnkgKm5lLCB1NjQgYWRkciwKKwkJICAgcXVhZGxldF90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworaW50IGhwc2Jfbm9kZV93cml0ZShzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmUsIHU2NCBhZGRyLAorCQkgICAgcXVhZGxldF90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpOworaW50IGhwc2Jfbm9kZV9sb2NrKHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgdTY0IGFkZHIsCisJCSAgIGludCBleHRjb2RlLCBxdWFkbGV0X3QgKmRhdGEsIHF1YWRsZXRfdCBhcmcpOworCisKKy8qIEl0ZXJhdGUgdGhlIGhvc3RzLCBjYWxsaW5nIGEgZ2l2ZW4gZnVuY3Rpb24gd2l0aCBzdXBwbGllZCBkYXRhIGZvciBlYWNoCisgKiBob3N0LiAqLworaW50IG5vZGVtZ3JfZm9yX2VhY2hfaG9zdCh2b2lkICpfX2RhdGEsIGludCAoKmNiKShzdHJ1Y3QgaHBzYl9ob3N0ICosIHZvaWQgKikpOworCisKK2ludCBpbml0X2llZWUxMzk0X25vZGVtZ3Iodm9pZCk7Cit2b2lkIGNsZWFudXBfaWVlZTEzOTRfbm9kZW1ncih2b2lkKTsKKworCisvKiBUaGUgdGVtcGxhdGUgZm9yIGEgaG9zdCBkZXZpY2UgKi8KK2V4dGVybiBzdHJ1Y3QgZGV2aWNlIG5vZGVtZ3JfZGV2X3RlbXBsYXRlX2hvc3Q7CisKKy8qIEJ1cyBhdHRyaWJ1dGVzIHdlIGV4cG9ydCAqLworZXh0ZXJuIHN0cnVjdCBidXNfYXR0cmlidXRlICpjb25zdCBmd19idXNfYXR0cnNbXTsKKworI2VuZGlmIC8qIF9JRUVFMTM5NF9OT0RFTUdSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2ZmMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCkBAIC0wLDAgKzEsMzcwNSBAQAorLyoKKyAqIG9oY2kxMzk0LmMgLSBkcml2ZXIgZm9yIE9IQ0kgMTM5NCBib2FyZHMKKyAqIENvcHlyaWdodCAoQykxOTk5LDIwMDAgU2ViYXN0aWVuIFJvdWdlYXV4IDxzZWJhc3RpZW4ucm91Z2VhdXhAYW51LmVkdS5hdT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgR29yZCBQZXRlcnMgPEdvcmRQZXRlcnNAc21hcnR0ZWNoLmNvbT4KKyAqICAgICAgICAgICAgICAyMDAxICAgICAgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisvKgorICogVGhpbmdzIGtub3duIHRvIGJlIHdvcmtpbmc6CisgKiAuIEFzeW5jIFJlcXVlc3QgVHJhbnNtaXQKKyAqIC4gQXN5bmMgUmVzcG9uc2UgUmVjZWl2ZQorICogLiBBc3luYyBSZXF1ZXN0IFJlY2VpdmUKKyAqIC4gQXN5bmMgUmVzcG9uc2UgVHJhbnNtaXQKKyAqIC4gSXNvIFJlY2VpdmUKKyAqIC4gRE1BIG1tYXAgZm9yIGlzbyByZWNlaXZlCisgKiAuIENvbmZpZyBST00gZ2VuZXJhdGlvbgorICoKKyAqIFRoaW5ncyBpbXBsZW1lbnRlZCwgYnV0IHN0aWxsIGluIHRlc3QgcGhhc2U6CisgKiAuIElzbyBUcmFuc21pdAorICogLiBBc3luYyBTdHJlYW0gUGFja2V0cyBUcmFuc21pdCAoUmVjZWl2ZSBkb25lIHZpYSBJc28gaW50ZXJmYWNlKQorICoKKyAqIFRoaW5ncyBub3QgaW1wbGVtZW50ZWQ6CisgKiAuIERNQSBlcnJvciByZWNvdmVyeQorICoKKyAqIEtub3duIGJ1Z3M6CisgKiAuIGRldmN0bCBCVVNfUkVTRVQgYXJnIGNvbmZ1c2lvbiAocmVzZXQgdHlwZSBvciByb290IGhvbGRvZmY/KQorICogICBhZGRlZCBMT05HX1JFU0VUX1JPT1QgYW5kIFNIT1JUX1JFU0VUX1JPT1QgZm9yIHJvb3QgaG9sZG9mZiAtLWtrCisgKi8KKworLyoKKyAqIEFja25vd2xlZGdtZW50czoKKyAqCisgKiBBZGFtIEogUmljaHRlciA8YWRhbUB5Z2dkcmFzaWwuY29tPgorICogIC4gVXNlIG9mIHBjaV9jbGFzcyB0byBmaW5kIGRldmljZQorICoKKyAqIEVtaWxpZSBDaHVuZwk8ZW1pbGllLmNodW5nQGF4aXMuY29tPgorICogIC4gVGlwIG9uIEFzeW5jIFJlcXVlc3QgRmlsdGVyCisgKgorICogUGFzY2FsIERyb2xldCA8cGFzY2FsLmRyb2xldEBpbmZvcm1pc3Npb24uY2E+CisgKiAgLiBWYXJpb3VzIHRpcHMgZm9yIG9wdGltaXphdGlvbiBhbmQgZnVuY3Rpb25uYWxpdGllcworICoKKyAqIFJvYmVydCBGaWNrbGluIDxyZmlja2xpbkB3ZXN0ZW5naW5lZXJpbmcuY29tPgorICogIC4gTG9vcCBpbiBpcnFfaGFuZGxlcgorICoKKyAqIEphbWVzIEdvb2R3aW4gPGphbWVzZ0BGaWxhbmV0LmNvbT4KKyAqICAuIFZhcmlvdXMgdGlwcyBvbiBpbml0aWFsaXphdGlvbiwgc2VsZi1pZCByZWNlcHRpb24sIGV0Yy4KKyAqCisgKiBBbGJyZWNodCBEcmVzcyA8YWRAbXBpZnItYm9ubi5tcGcuZGU+CisgKiAgLiBBcHBsZSBQb3dlckJvb2sgZGV0ZWN0aW9uCisgKgorICogRGFuaWVsIEtvYnJhcyA8ZGFuaWVsLmtvYnJhc0BzdHVkZW50LnVuaS10dWViaW5nZW4uZGU+CisgKiAgLiBSZXNldCB0aGUgYm9hcmQgcHJvcGVybHkgYmVmb3JlIGxlYXZpbmcgKyBtaXNjIGNsZWFudXBzCisgKgorICogTGVvbiB2YW4gU3R1aXZlbmJlcmcgPGxlb252c0BpYWUubmw+CisgKiAgLiBCdWcgZml4ZXMKKyAqCisgKiBCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4KKyAqICAuIFdvcmtpbmcgYmlnLWVuZGlhbiBzdXBwb3J0CisgKiAgLiBVcGRhdGVkIHRvIDIuNC54IG1vZHVsZSBzY2hlbWUgKFBDSSBhc3dlbGwpCisgKiAgLiBDb25maWcgUk9NIGdlbmVyYXRpb24KKyAqCisgKiBNYW5mcmVkIFdlaWhzIDx3ZWloc0BpY3QudHV3aWVuLmFjLmF0PgorICogIC4gUmV3b3JrZWQgY29kZSBmb3IgaW5pdGlhdGluZyBidXMgcmVzZXRzCisgKiAgICAobG9uZywgc2hvcnQsIHdpdGggb3Igd2l0aG91dCBob2xkLW9mZikKKyAqCisgKiBOYW5kdSBTYW50aGkgPGNvbnRhY3RuYW5kdUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiAgLiBBZGRlZCBzdXBwb3J0IGZvciBuVmlkaWEgbkZvcmNlMiBvbmJvYXJkIEZpcmV3aXJlIGNoaXBzZXQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2lmZGVmIENPTkZJR19QUENfUE1BQworI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiY3NyMTIxMi5oIgorI2luY2x1ZGUgImllZWUxMzk0LmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfdHlwZXMuaCIKKyNpbmNsdWRlICJob3N0cy5oIgorI2luY2x1ZGUgImRtYS5oIgorI2luY2x1ZGUgImlzby5oIgorI2luY2x1ZGUgImllZWUxMzk0X2NvcmUuaCIKKyNpbmNsdWRlICJoaWdobGV2ZWwuaCIKKyNpbmNsdWRlICJvaGNpMTM5NC5oIgorCisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1ZFUkJPU0VERUJVRworI2RlZmluZSBPSENJMTM5NF9ERUJVRworI2VuZGlmCisKKyNpZmRlZiBEQkdNU0cKKyN1bmRlZiBEQkdNU0cKKyNlbmRpZgorCisjaWZkZWYgT0hDSTEzOTRfREVCVUcKKyNkZWZpbmUgREJHTVNHKGZtdCwgYXJncy4uLikgXAorcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZ3LWhvc3QlZDogIiBmbXQgIlxuIiAsIE9IQ0kxMzk0X0RSSVZFUl9OQU1FLCBvaGNpLT5ob3N0LT5pZCAsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBEQkdNU0coZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfT0hDSV9ETUFfREVCVUcKKyNkZWZpbmUgT0hDSV9ETUFfQUxMT0MoZm10LCBhcmdzLi4uKSBcCisJSFBTQl9FUlIoIiVzKCVzKWFsbG9jKCVkKTogImZtdCwgT0hDSTEzOTRfRFJJVkVSX05BTUUsIF9fRlVOQ1RJT05fXywgXAorCQkrK2dsb2JhbF9vdXRzdGFuZGluZ19kbWFzLCAjIyBhcmdzKQorI2RlZmluZSBPSENJX0RNQV9GUkVFKGZtdCwgYXJncy4uLikgXAorCUhQU0JfRVJSKCIlcyglcylmcmVlKCVkKTogImZtdCwgT0hDSTEzOTRfRFJJVkVSX05BTUUsIF9fRlVOQ1RJT05fXywgXAorCQktLWdsb2JhbF9vdXRzdGFuZGluZ19kbWFzLCAjIyBhcmdzKQorc3RhdGljIGludCBnbG9iYWxfb3V0c3RhbmRpbmdfZG1hcyA9IDA7CisjZWxzZQorI2RlZmluZSBPSENJX0RNQV9BTExPQyhmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIE9IQ0lfRE1BX0ZSRUUoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qIHByaW50IGdlbmVyYWwgKGNhcmQgaW5kZXBlbmRlbnQpIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFBSSU5UX0cobGV2ZWwsIGZtdCwgYXJncy4uLikgXAorcHJpbnRrKGxldmVsICIlczogIiBmbXQgIlxuIiAsIE9IQ0kxMzk0X0RSSVZFUl9OQU1FICwgIyMgYXJncykKKworLyogcHJpbnQgY2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBQUklOVChsZXZlbCwgZm10LCBhcmdzLi4uKSBcCitwcmludGsobGV2ZWwgIiVzOiBmdy1ob3N0JWQ6ICIgZm10ICJcbiIgLCBPSENJMTM5NF9EUklWRVJfTkFNRSwgb2hjaS0+aG9zdC0+aWQgLCAjIyBhcmdzKQorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJIiRSZXY6IDEyNTAgJCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4iOworCisvKiBNb2R1bGUgUGFyYW1ldGVycyAqLworc3RhdGljIGludCBwaHlzX2RtYSA9IDE7Cittb2R1bGVfcGFyYW0ocGh5c19kbWEsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBoeXNfZG1hLCAiRW5hYmxlIHBoeXNpY2FsIGRtYSAoZGVmYXVsdCA9IDEpLiIpOworCitzdGF0aWMgdm9pZCBkbWFfdHJtX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGRtYV90cm1fcmVzZXQoc3RydWN0IGRtYV90cm1fY3R4ICpkKTsKKworc3RhdGljIGludCBhbGxvY19kbWFfcmN2X2N0eChzdHJ1Y3QgdGlfb2hjaSAqb2hjaSwgc3RydWN0IGRtYV9yY3ZfY3R4ICpkLAorCQkJICAgICBlbnVtIGNvbnRleHRfdHlwZSB0eXBlLCBpbnQgY3R4LCBpbnQgbnVtX2Rlc2MsCisJCQkgICAgIGludCBidWZfc2l6ZSwgaW50IHNwbGl0X2J1Zl9zaXplLCBpbnQgY29udGV4dF9iYXNlKTsKK3N0YXRpYyB2b2lkIHN0b3BfZG1hX3Jjdl9jdHgoc3RydWN0IGRtYV9yY3ZfY3R4ICpkKTsKK3N0YXRpYyB2b2lkIGZyZWVfZG1hX3Jjdl9jdHgoc3RydWN0IGRtYV9yY3ZfY3R4ICpkKTsKKworc3RhdGljIGludCBhbGxvY19kbWFfdHJtX2N0eChzdHJ1Y3QgdGlfb2hjaSAqb2hjaSwgc3RydWN0IGRtYV90cm1fY3R4ICpkLAorCQkJICAgICBlbnVtIGNvbnRleHRfdHlwZSB0eXBlLCBpbnQgY3R4LCBpbnQgbnVtX2Rlc2MsCisJCQkgICAgIGludCBjb250ZXh0X2Jhc2UpOworCitzdGF0aWMgdm9pZCBvaGNpMTM5NF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU4KK3N0YXRpYyB1bnNpZ25lZCBoZHJfc2l6ZXNbXSA9Cit7CisJMywJLyogVENPREVfV1JJVEVRICovCisJNCwJLyogVENPREVfV1JJVEVCICovCisJMywJLyogVENPREVfV1JJVEVfUkVTUE9OU0UgKi8KKwkwLAkvKiA/Pz8gKi8KKwkzLAkvKiBUQ09ERV9SRUFEUSAqLworCTQsCS8qIFRDT0RFX1JFQURCICovCisJMywJLyogVENPREVfUkVBRFFfUkVTUE9OU0UgKi8KKwk0LAkvKiBUQ09ERV9SRUFEQl9SRVNQT05TRSAqLworCTEsCS8qIFRDT0RFX0NZQ0xFX1NUQVJUICg/Pz8pICovCisJNCwJLyogVENPREVfTE9DS19SRVFVRVNUICovCisJMiwJLyogVENPREVfSVNPX0RBVEEgKi8KKwk0LAkvKiBUQ09ERV9MT0NLX1JFU1BPTlNFICovCit9OworCisvKiBTd2FwIGhlYWRlcnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwYWNrZXRfc3dhYihxdWFkbGV0X3QgKmRhdGEsIGludCB0Y29kZSkKK3sKKwlzaXplX3Qgc2l6ZSA9IGhkcl9zaXplc1t0Y29kZV07CisKKwlpZiAodGNvZGUgPiBUQ09ERV9MT0NLX1JFU1BPTlNFIHx8IGhkcl9zaXplc1t0Y29kZV0gPT0gMCkKKwkJcmV0dXJuOworCisJd2hpbGUgKHNpemUtLSkKKwkJZGF0YVtzaXplXSA9IHN3YWIzMihkYXRhW3NpemVdKTsKK30KKyNlbHNlCisvKiBEb24ndCB3YXN0ZSBjeWNsZXMgb24gc2FtZSBzZXggYnl0ZSBzd2FwcyAqLworI2RlZmluZSBwYWNrZXRfc3dhYih3LHgpCisjZW5kaWYgLyogIUxJVFRMRV9FTkRJQU4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRUVFLTEzOTQgZnVuY3Rpb25hbGl0eSBzZWN0aW9uICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHU4IGdldF9waHlfcmVnKHN0cnVjdCB0aV9vaGNpICpvaGNpLCB1OCBhZGRyKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcXVhZGxldF90IHI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJm9oY2ktPnBoeV9yZWdfbG9jaywgZmxhZ3MpOworCisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X1BoeUNvbnRyb2wsIChhZGRyIDw8IDgpIHwgMHgwMDAwODAwMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgT0hDSV9MT09QX0NPVU5UOyBpKyspIHsKKwkJaWYgKHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1BoeUNvbnRyb2wpICYgMHg4MDAwMDAwMCkKKwkJCWJyZWFrOworCisJCW1kZWxheSgxKTsKKwl9CisKKwlyID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfUGh5Q29udHJvbCk7CisKKwlpZiAoaSA+PSBPSENJX0xPT1BfQ09VTlQpCisJCVBSSU5UIChLRVJOX0VSUiwgIkdldCBQSFkgUmVnIHRpbWVvdXQgWzB4JTA4eC8weCUwOHgvJWRdIiwKKwkJICAgICAgIHIsIHIgJiAweDgwMDAwMDAwLCBpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZvaGNpLT5waHlfcmVnX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAociAmIDB4MDBmZjAwMDApID4+IDE2OworfQorCitzdGF0aWMgdm9pZCBzZXRfcGh5X3JlZyhzdHJ1Y3QgdGlfb2hjaSAqb2hjaSwgdTggYWRkciwgdTggZGF0YSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiByID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmb2hjaS0+cGh5X3JlZ19sb2NrLCBmbGFncyk7CisKKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfUGh5Q29udHJvbCwgKGFkZHIgPDwgOCkgfCBkYXRhIHwgMHgwMDAwNDAwMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgT0hDSV9MT09QX0NPVU5UOyBpKyspIHsKKwkJciA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1BoeUNvbnRyb2wpOworCQlpZiAoIShyICYgMHgwMDAwNDAwMCkpCisJCQlicmVhazsKKworCQltZGVsYXkoMSk7CisJfQorCisJaWYgKGkgPT0gT0hDSV9MT09QX0NPVU5UKQorCQlQUklOVCAoS0VSTl9FUlIsICJTZXQgUEhZIFJlZyB0aW1lb3V0IFsweCUwOHgvMHglMDh4LyVkXSIsCisJCSAgICAgICByLCByICYgMHgwMDAwNDAwMCwgaSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmb2hjaS0+cGh5X3JlZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm47Cit9CisKKy8qIE9yJ3Mgb3VyIHZhbHVlIGludG8gdGhlIGN1cnJlbnQgdmFsdWUgKi8KK3N0YXRpYyB2b2lkIHNldF9waHlfcmVnX21hc2soc3RydWN0IHRpX29oY2kgKm9oY2ksIHU4IGFkZHIsIHU4IGRhdGEpCit7CisJdTggb2xkOworCisJb2xkID0gZ2V0X3BoeV9yZWcgKG9oY2ksIGFkZHIpOworCW9sZCB8PSBkYXRhOworCXNldF9waHlfcmVnIChvaGNpLCBhZGRyLCBvbGQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfc2VsZmlkKHN0cnVjdCB0aV9vaGNpICpvaGNpLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAorCQkJCWludCBwaHlpZCwgaW50IGlzcm9vdCkKK3sKKwlxdWFkbGV0X3QgKnEgPSBvaGNpLT5zZWxmaWRfYnVmX2NwdTsKKwlxdWFkbGV0X3Qgc2VsZl9pZF9jb3VudD1yZWdfcmVhZChvaGNpLCBPSENJMTM5NF9TZWxmSURDb3VudCk7CisJc2l6ZV90IHNpemU7CisJcXVhZGxldF90IHEwLCBxMTsKKworCS8qIENoZWNrIHN0YXR1cyBvZiBzZWxmLWlkIHJlY2VwdGlvbiAqLworCisJaWYgKG9oY2ktPnNlbGZpZF9zd2FwKQorCQlxMCA9IGxlMzJfdG9fY3B1KHFbMF0pOworCWVsc2UKKwkJcTAgPSBxWzBdOworCisJaWYgKChzZWxmX2lkX2NvdW50ICYgMHg4MDAwMDAwMCkgfHwKKwkgICAgKChzZWxmX2lkX2NvdW50ICYgMHgwMEZGMDAwMCkgIT0gKHEwICYgMHgwMEZGMDAwMCkpKSB7CisJCVBSSU5UKEtFUk5fRVJSLAorCQkgICAgICAiRXJyb3IgaW4gcmVjZXB0aW9uIG9mIFNlbGZJRCBwYWNrZXRzIFsweCUwOHgvMHglMDh4XSAoY291bnQ6ICVkKSIsCisJCSAgICAgIHNlbGZfaWRfY291bnQsIHEwLCBvaGNpLT5zZWxmX2lkX2Vycm9ycyk7CisKKwkJLyogVGlwIGJ5IEphbWVzIEdvb2R3aW4gPGphbWVzZ0BGaWxhbmV0LmNvbT46CisJCSAqIFdlIGhhZCBhbiBlcnJvciwgZ2VuZXJhdGUgYW5vdGhlciBidXMgcmVzZXQgaW4gcmVzcG9uc2UuICAqLworCQlpZiAob2hjaS0+c2VsZl9pZF9lcnJvcnM8T0hDSTEzOTRfTUFYX1NFTEZfSURfRVJST1JTKSB7CisJCQlzZXRfcGh5X3JlZ19tYXNrIChvaGNpLCAxLCAweDQwKTsKKwkJCW9oY2ktPnNlbGZfaWRfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQlQUklOVChLRVJOX0VSUiwKKwkJCSAgICAgICJUb28gbWFueSBlcnJvcnMgb24gU2VsZklEIGVycm9yIHJlY2VwdGlvbiwgZ2l2aW5nIHVwISIpOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKiBTZWxmSUQgT2ssIHJlc2V0IGVycm9yIGNvdW50ZXIuICovCisJb2hjaS0+c2VsZl9pZF9lcnJvcnMgPSAwOworCisJc2l6ZSA9ICgoc2VsZl9pZF9jb3VudCAmIDB4MDAwMDFGRkMpID4+IDIpIC0gMTsKKwlxKys7CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJaWYgKG9oY2ktPnNlbGZpZF9zd2FwKSB7CisJCQlxMCA9IGxlMzJfdG9fY3B1KHFbMF0pOworCQkJcTEgPSBsZTMyX3RvX2NwdShxWzFdKTsKKwkJfSBlbHNlIHsKKwkJCXEwID0gcVswXTsKKwkJCXExID0gcVsxXTsKKwkJfQorCisJCWlmIChxMCA9PSB+cTEpIHsKKwkJCURCR01TRyAoIlNlbGZJRCBwYWNrZXQgMHgleCByZWNlaXZlZCIsIHEwKTsKKwkJCWhwc2Jfc2VsZmlkX3JlY2VpdmVkKGhvc3QsIGNwdV90b19iZTMyKHEwKSk7CisJCQlpZiAoKChxMCAmIDB4M2YwMDAwMDApID4+IDI0KSA9PSBwaHlpZCkKKwkJCQlEQkdNU0cgKCJTZWxmSUQgZm9yIHRoaXMgbm9kZSBpcyAweCUwOHgiLCBxMCk7CisJCX0gZWxzZSB7CisJCQlQUklOVChLRVJOX0VSUiwKKwkJCSAgICAgICJTZWxmSUQgaXMgaW5jb25zaXN0ZW50IFsweCUwOHgvMHglMDh4XSIsIHEwLCBxMSk7CisJCX0KKwkJcSArPSAyOworCQlzaXplIC09IDI7CisJfQorCisJREJHTVNHKCJTZWxmSUQgY29tcGxldGUiKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgb2hjaV9zb2Z0X3Jlc2V0KHN0cnVjdCB0aV9vaGNpICpvaGNpKSB7CisJaW50IGk7CisKKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSENDb250cm9sU2V0LCBPSENJMTM5NF9IQ0NvbnRyb2xfc29mdFJlc2V0KTsKKworCWZvciAoaSA9IDA7IGkgPCBPSENJX0xPT1BfQ09VTlQ7IGkrKykgeworCQlpZiAoIShyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9IQ0NvbnRyb2xTZXQpICYgT0hDSTEzOTRfSENDb250cm9sX3NvZnRSZXNldCkpCisJCQlicmVhazsKKwkJbWRlbGF5KDEpOworCX0KKwlEQkdNU0cgKCJTb2Z0IHJlc2V0IGZpbmlzaGVkIik7Cit9CisKKworLyogR2VuZXJhdGUgdGhlIGRtYSByZWNlaXZlIHByZ3MgYW5kIHN0YXJ0IHRoZSBjb250ZXh0ICovCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX2RtYV9yY3ZfY3R4KHN0cnVjdCBkbWFfcmN2X2N0eCAqZCwgaW50IGdlbmVyYXRlX2lycSkKK3sKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IChzdHJ1Y3QgdGlfb2hjaSopKGQtPm9oY2kpOworCWludCBpOworCisJb2hjaTEzOTRfc3RvcF9jb250ZXh0KG9oY2ksIGQtPmN0cmxDbGVhciwgTlVMTCk7CisKKwlmb3IgKGk9MDsgaTxkLT5udW1fZGVzYzsgaSsrKSB7CisJCXUzMiBjOworCisJCWMgPSBETUFfQ1RMX0lOUFVUX01PUkUgfCBETUFfQ1RMX1VQREFURSB8IERNQV9DVExfQlJBTkNIOworCQlpZiAoZ2VuZXJhdGVfaXJxKQorCQkJYyB8PSBETUFfQ1RMX0lSUTsKKworCQlkLT5wcmdfY3B1W2ldLT5jb250cm9sID0gY3B1X3RvX2xlMzIoYyB8IGQtPmJ1Zl9zaXplKTsKKworCQkvKiBFbmQgb2YgZGVzY3JpcHRvciBsaXN0PyAqLworCQlpZiAoaSArIDEgPCBkLT5udW1fZGVzYykgeworCQkJZC0+cHJnX2NwdVtpXS0+YnJhbmNoQWRkcmVzcyA9CisJCQkJY3B1X3RvX2xlMzIoKGQtPnByZ19idXNbaSsxXSAmIDB4ZmZmZmZmZjApIHwgMHgxKTsKKwkJfSBlbHNlIHsKKwkJCWQtPnByZ19jcHVbaV0tPmJyYW5jaEFkZHJlc3MgPQorCQkJCWNwdV90b19sZTMyKChkLT5wcmdfYnVzWzBdICYgMHhmZmZmZmZmMCkpOworCQl9CisKKwkJZC0+cHJnX2NwdVtpXS0+YWRkcmVzcyA9IGNwdV90b19sZTMyKGQtPmJ1Zl9idXNbaV0pOworCQlkLT5wcmdfY3B1W2ldLT5zdGF0dXMgPSBjcHVfdG9fbGUzMihkLT5idWZfc2l6ZSk7CisJfQorCisgICAgICAgIGQtPmJ1Zl9pbmQgPSAwOworICAgICAgICBkLT5idWZfb2Zmc2V0ID0gMDsKKworCWlmIChkLT50eXBlID09IERNQV9DVFhfSVNPKSB7CisJCS8qIENsZWFyIGNvbnRleHRDb250cm9sICovCisJCXJlZ193cml0ZShvaGNpLCBkLT5jdHJsQ2xlYXIsIDB4ZmZmZmZmZmYpOworCisJCS8qIFNldCBidWZmZXJGaWxsLCBpc29jaEhlYWRlciwgbXVsdGljaGFubmVsIGZvciBJUiBjb250ZXh0ICovCisJCXJlZ193cml0ZShvaGNpLCBkLT5jdHJsU2V0LCAweGQwMDAwMDAwKTsKKworCQkvKiBTZXQgdGhlIGNvbnRleHQgbWF0Y2ggcmVnaXN0ZXIgdG8gbWF0Y2ggb24gYWxsIHRhZ3MgKi8KKwkJcmVnX3dyaXRlKG9oY2ksIGQtPmN0eHRNYXRjaCwgMHhmMDAwMDAwMCk7CisKKwkJLyogQ2xlYXIgdGhlIG11bHRpIGNoYW5uZWwgbWFzayBoaWdoIGFuZCBsb3cgcmVnaXN0ZXJzICovCisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JUk11bHRpQ2hhbk1hc2tIaUNsZWFyLCAweGZmZmZmZmZmKTsKKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lSTXVsdGlDaGFuTWFza0xvQ2xlYXIsIDB4ZmZmZmZmZmYpOworCisJCS8qIFNldCB1cCBpc29SZWN2SW50TWFzayB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzICovCisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50TWFza1NldCwgMSA8PCBkLT5jdHgpOworCX0KKworCS8qIFRlbGwgdGhlIGNvbnRyb2xsZXIgd2hlcmUgdGhlIGZpcnN0IEFSIHByb2dyYW0gaXMgKi8KKwlyZWdfd3JpdGUob2hjaSwgZC0+Y21kUHRyLCBkLT5wcmdfYnVzWzBdIHwgMHgxKTsKKworCS8qIFJ1biBjb250ZXh0ICovCisJcmVnX3dyaXRlKG9oY2ksIGQtPmN0cmxTZXQsIDB4MDAwMDgwMDApOworCisJREJHTVNHKCJSZWNlaXZlIERNQSBjdHg9JWQgaW5pdGlhbGl6ZWQiLCBkLT5jdHgpOworfQorCisvKiBJbml0aWFsaXplIHRoZSBkbWEgdHJhbnNtaXQgY29udGV4dCAqLworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9kbWFfdHJtX2N0eChzdHJ1Y3QgZG1hX3RybV9jdHggKmQpCit7CisJc3RydWN0IHRpX29oY2kgKm9oY2kgPSAoc3RydWN0IHRpX29oY2kqKShkLT5vaGNpKTsKKworCS8qIFN0b3AgdGhlIGNvbnRleHQgKi8KKwlvaGNpMTM5NF9zdG9wX2NvbnRleHQob2hjaSwgZC0+Y3RybENsZWFyLCBOVUxMKTsKKworICAgICAgICBkLT5wcmdfaW5kID0gMDsKKwlkLT5zZW50X2luZCA9IDA7CisJZC0+ZnJlZV9wcmdzID0gZC0+bnVtX2Rlc2M7CisgICAgICAgIGQtPmJyYW5jaEFkZHJQdHIgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZkLT5maWZvX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkLT5wZW5kaW5nX2xpc3QpOworCisJaWYgKGQtPnR5cGUgPT0gRE1BX0NUWF9JU08pIHsKKwkJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRNYXNrU2V0LCAxIDw8IGQtPmN0eCk7CisJfQorCisJREJHTVNHKCJUcmFuc21pdCBETUEgY3R4PSVkIGluaXRpYWxpemVkIiwgZC0+Y3R4KTsKK30KKworLyogQ291bnQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgaXNvIGNvbnRleHRzICovCitzdGF0aWMgaW50IGdldF9uYl9pc29fY3R4KHN0cnVjdCB0aV9vaGNpICpvaGNpLCBpbnQgcmVnKQoreworCWludCBpLGN0eD0wOworCXUzMiB0bXA7CisKKwlyZWdfd3JpdGUob2hjaSwgcmVnLCAweGZmZmZmZmZmKTsKKwl0bXAgPSByZWdfcmVhZChvaGNpLCByZWcpOworCisJREJHTVNHKCJJc28gY29udGV4dHMgcmVnOiAlMDh4IGltcGxlbWVudGVkOiAlMDh4IiwgcmVnLCB0bXApOworCisJLyogQ291bnQgdGhlIG51bWJlciBvZiBjb250ZXh0cyAqLworCWZvciAoaT0wOyBpPDMyOyBpKyspIHsKKwkgICAgCWlmICh0bXAgJiAxKSBjdHgrKzsKKwkJdG1wID4+PSAxOworCX0KKwlyZXR1cm4gY3R4OworfQorCisvKiBHbG9iYWwgaW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyB2b2lkIG9oY2lfaW5pdGlhbGl6ZShzdHJ1Y3QgdGlfb2hjaSAqb2hjaSkKK3sKKwljaGFyIGlycV9idWZbMTZdOworCXF1YWRsZXRfdCBidWY7CisJaW50IG51bV9wb3J0cywgaTsKKworCXNwaW5fbG9ja19pbml0KCZvaGNpLT5waHlfcmVnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZvaGNpLT5ldmVudF9sb2NrKTsKKworCS8qIFB1dCBzb21lIGRlZmF1bHRzIHRvIHRoZXNlIHVuZGVmaW5lZCBidXMgb3B0aW9ucyAqLworCWJ1ZiA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0J1c09wdGlvbnMpOworCWJ1ZiB8PSAgMHg2MDAwMDAwMDsgLyogRW5hYmxlIENNQyBhbmQgSVNDICovCisJaWYgKCFocHNiX2Rpc2FibGVfaXJtKQorCQlidWYgfD0gIDB4ODAwMDAwMDA7IC8qIEVuYWJsZSBJUk1DICovCisJYnVmICY9IH4weDAwZmYwMDAwOyAvKiBYWFg6IFNldCBjeWNfY2xrX2FjYyB0byB6ZXJvIGZvciBub3cgKi8KKwlidWYgJj0gfjB4MTgwMDAwMDA7IC8qIERpc2FibGUgUE1DIGFuZCBCTUMgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfQnVzT3B0aW9ucywgYnVmKTsKKworCS8qIFNldCB0aGUgYnVzIG51bWJlciAqLworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Ob2RlSUQsIDB4MDAwMGZmYzApOworCisJLyogRW5hYmxlIHBvc3RlZCB3cml0ZXMgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSENDb250cm9sU2V0LCBPSENJMTM5NF9IQ0NvbnRyb2xfcG9zdGVkV3JpdGVFbmFibGUpOworCisJLyogQ2xlYXIgbGluayBjb250cm9sIHJlZ2lzdGVyICovCisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0xpbmtDb250cm9sQ2xlYXIsIDB4ZmZmZmZmZmYpOworCisJLyogRW5hYmxlIGN5Y2xlIHRpbWVyIGFuZCBjeWNsZSBtYXN0ZXIgYW5kIHNldCB0aGUgSVJNCisJICogY29udGVuZGVyIGJpdCBpbiBvdXIgc2VsZiBJRCBwYWNrZXRzIGlmIGFwcHJvcHJpYXRlLiAqLworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9MaW5rQ29udHJvbFNldCwKKwkJICBPSENJMTM5NF9MaW5rQ29udHJvbF9DeWNsZVRpbWVyRW5hYmxlIHwKKwkJICBPSENJMTM5NF9MaW5rQ29udHJvbF9DeWNsZU1hc3Rlcik7CisJc2V0X3BoeV9yZWdfbWFzayhvaGNpLCA0LCBQSFlfMDRfTENUUkwgfAorCQkJIChocHNiX2Rpc2FibGVfaXJtID8gMCA6IFBIWV8wNF9DT05URU5ERVIpKTsKKworCS8qIFNldCB1cCBzZWxmLWlkIGRtYSBidWZmZXIgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfU2VsZklEQnVmZmVyLCBvaGNpLT5zZWxmaWRfYnVmX2J1cyk7CisKKwkvKiBlbmFibGUgc2VsZi1pZCBhbmQgcGh5cyAqLworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9MaW5rQ29udHJvbFNldCwgT0hDSTEzOTRfTGlua0NvbnRyb2xfUmN2U2VsZklEIHwKKwkJICBPSENJMTM5NF9MaW5rQ29udHJvbF9SY3ZQaHlQa3QpOworCisJLyogU2V0IHRoZSBDb25maWcgUk9NIG1hcHBpbmcgcmVnaXN0ZXIgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfQ29uZmlnUk9NbWFwLCBvaGNpLT5jc3JfY29uZmlnX3JvbV9idXMpOworCisJLyogTm93IGdldCBvdXIgbWF4IHBhY2tldCBzaXplICovCisJb2hjaS0+bWF4X3BhY2tldF9zaXplID0KKwkJMTw8KCgocmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfQnVzT3B0aW9ucyk+PjEyKSYweGYpKzEpOworCQkKKwkvKiBEb24ndCBhY2NlcHQgcGh5IHBhY2tldHMgaW50byBBUiByZXF1ZXN0IGNvbnRleHQgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfTGlua0NvbnRyb2xDbGVhciwgMHgwMDAwMDQwMCk7CisKKwkvKiBDbGVhciB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludE1hc2tDbGVhciwgMHhmZmZmZmZmZik7CisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRFdmVudENsZWFyLCAweGZmZmZmZmZmKTsKKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgbWFzayAqLworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza0NsZWFyLCAweGZmZmZmZmZmKTsKKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvWG1pdEludEV2ZW50Q2xlYXIsIDB4ZmZmZmZmZmYpOworCisJLyogSW5pdGlhbGl6ZSBBUiBkbWEgKi8KKwlpbml0aWFsaXplX2RtYV9yY3ZfY3R4KCZvaGNpLT5hcl9yZXFfY29udGV4dCwgMCk7CisJaW5pdGlhbGl6ZV9kbWFfcmN2X2N0eCgmb2hjaS0+YXJfcmVzcF9jb250ZXh0LCAwKTsKKworCS8qIEluaXRpYWxpemUgQVQgZG1hICovCisJaW5pdGlhbGl6ZV9kbWFfdHJtX2N0eCgmb2hjaS0+YXRfcmVxX2NvbnRleHQpOworCWluaXRpYWxpemVfZG1hX3RybV9jdHgoJm9oY2ktPmF0X3Jlc3BfY29udGV4dCk7CisJCisJLyogSW5pdGlhbGl6ZSBJUiBMZWdhY3kgRE1BICovCisJb2hjaS0+aXJfbGVnYWN5X2NoYW5uZWxzID0gMDsKKwlpbml0aWFsaXplX2RtYV9yY3ZfY3R4KCZvaGNpLT5pcl9sZWdhY3lfY29udGV4dCwgMSk7CisJREJHTVNHKCJJU08gcmVjZWl2ZSBsZWdhY3kgY29udGV4dCBhY3RpdmF0ZWQiKTsKKworCS8qCisJICogQWNjZXB0IEFUIHJlcXVlc3RzIGZyb20gYWxsIG5vZGVzLiBUaGlzIHByb2JhYmx5CisJICogd2lsbCBoYXZlIHRvIGJlIGNvbnRyb2xsZWQgZnJvbSB0aGUgc3Vic3lzdGVtCisJICogb24gYSBwZXIgbm9kZSBiYXNpcy4KKwkgKi8KKwlyZWdfd3JpdGUob2hjaSxPSENJMTM5NF9Bc1JlcUZpbHRlckhpU2V0LCAweDgwMDAwMDAwKTsKKworCS8qIFNwZWNpZnkgQVQgcmV0cmllcyAqLworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9BVFJldHJpZXMsCisJCSAgT0hDSTEzOTRfTUFYX0FUX1JFUV9SRVRSSUVTIHwKKwkJICAoT0hDSTEzOTRfTUFYX0FUX1JFU1BfUkVUUklFUzw8NCkgfAorCQkgIChPSENJMTM5NF9NQVhfUEhZU19SRVNQX1JFVFJJRVM8PDgpKTsKKworCS8qIFdlIGRvbid0IHdhbnQgaGFyZHdhcmUgc3dhcHBpbmcgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSENDb250cm9sQ2xlYXIsIE9IQ0kxMzk0X0hDQ29udHJvbF9ub0J5dGVTd2FwKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludE1hc2tTZXQsCisJCSAgT0hDSTEzOTRfdW5yZWNvdmVyYWJsZUVycm9yIHwKKwkJICBPSENJMTM5NF9tYXN0ZXJJbnRFbmFibGUgfAorCQkgIE9IQ0kxMzk0X2J1c1Jlc2V0IHwKKwkJICBPSENJMTM5NF9zZWxmSURDb21wbGV0ZSB8CisJCSAgT0hDSTEzOTRfUlNQa3QgfAorCQkgIE9IQ0kxMzk0X1JRUGt0IHwKKwkJICBPSENJMTM5NF9yZXNwVHhDb21wbGV0ZSB8CisJCSAgT0hDSTEzOTRfcmVxVHhDb21wbGV0ZSB8CisJCSAgT0hDSTEzOTRfaXNvY2hSeCB8CisJCSAgT0hDSTEzOTRfaXNvY2hUeCB8CisJCSAgT0hDSTEzOTRfY3ljbGVJbmNvbnNpc3RlbnQpOworCisJLyogRW5hYmxlIGxpbmsgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSENDb250cm9sU2V0LCBPSENJMTM5NF9IQ0NvbnRyb2xfbGlua0VuYWJsZSk7CisKKwlidWYgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9WZXJzaW9uKTsKKyNpZm5kZWYgX19zcGFyY19fCisJc3ByaW50ZiAoaXJxX2J1ZiwgIiVkIiwgb2hjaS0+ZGV2LT5pcnEpOworI2Vsc2UKKwlzcHJpbnRmIChpcnFfYnVmLCAiJXMiLCBfX2lycV9pdG9hKG9oY2ktPmRldi0+aXJxKSk7CisjZW5kaWYKKwlQUklOVChLRVJOX0lORk8sICJPSENJLTEzOTQgJWQuJWQgKFBDSSk6IElSUT1bJXNdICAiCisJICAgICAgIk1NSU89WyVseC0lbHhdICBNYXggUGFja2V0PVslZF0iLAorCSAgICAgICgoKChidWYpID4+IDE2KSAmIDB4ZikgKyAoKChidWYpID4+IDIwKSAmIDB4ZikgKiAxMCksCisJICAgICAgKCgoKGJ1ZikgPj4gNCkgJiAweGYpICsgKChidWYpICYgMHhmKSAqIDEwKSwgaXJxX2J1ZiwKKwkgICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQob2hjaS0+ZGV2LCAwKSwKKwkgICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQob2hjaS0+ZGV2LCAwKSArIE9IQ0kxMzk0X1JFR0lTVEVSX1NJWkUgLSAxLAorCSAgICAgIG9oY2ktPm1heF9wYWNrZXRfc2l6ZSk7CisKKwkvKiBDaGVjayBhbGwgb2Ygb3VyIHBvcnRzIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIGFueXRoaW5nIGlzCisJICogY29ubmVjdGVkLCB3ZSBlbmFibGUgdGhhdCBwb3J0LiAqLworCW51bV9wb3J0cyA9IGdldF9waHlfcmVnKG9oY2ksIDIpICYgMHhmOworCWZvciAoaSA9IDA7IGkgPCBudW1fcG9ydHM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJCXNldF9waHlfcmVnKG9oY2ksIDcsIGkpOworCQlzdGF0dXMgPSBnZXRfcGh5X3JlZyhvaGNpLCA4KTsKKworCQlpZiAoc3RhdHVzICYgMHgyMCkKKwkJCXNldF9waHlfcmVnKG9oY2ksIDgsIHN0YXR1cyAmIH4xKTsKKwl9CisKKyAgICAgICAgLyogU2VyaWFsIEVFUFJPTSBTYW5pdHkgY2hlY2suICovCisgICAgICAgIGlmICgob2hjaS0+bWF4X3BhY2tldF9zaXplIDwgNTEyKSB8fAorCSAgICAob2hjaS0+bWF4X3BhY2tldF9zaXplID4gNDA5NikpIHsKKwkJLyogU2VyaWFsIEVFUFJPTSBjb250ZW50cyBhcmUgc3VzcGVjdCwgc2V0IGEgc2FuZSBtYXggcGFja2V0CisJCSAqIHNpemUgYW5kIHByaW50IHRoZSByYXcgY29udGVudHMgZm9yIGJ1ZyByZXBvcnRzIGlmIHZlcmJvc2UKKwkJICogZGVidWcgaXMgZW5hYmxlZC4gKi8KKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfVkVSQk9TRURFQlVHCisJCWludCBpOworI2VuZGlmCisKKwkJUFJJTlQoS0VSTl9ERUJVRywgIlNlcmlhbCBFRVBST00gaGFzIHN1c3BpY2lvdXMgdmFsdWVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgImF0dGVtcHRpbmcgdG8gc2V0dGluZyBtYXhfcGFja2V0X3NpemUgdG8gNTEyIGJ5dGVzIik7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9CdXNPcHRpb25zLAorCQkJICAocmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfQnVzT3B0aW9ucykgJiAweGYwMDcpIHwgMHg4MDAyKTsKKwkJb2hjaS0+bWF4X3BhY2tldF9zaXplID0gNTEyOworI2lmZGVmIENPTkZJR19JRUVFMTM5NF9WRVJCT1NFREVCVUcKKwkJUFJJTlQoS0VSTl9ERUJVRywgIiAgICBFRVBST00gUHJlc2VudDogJWQiLAorCQkgICAgICAocmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfVmVyc2lvbikgPj4gMjQpICYgMHgxKTsKKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0dVSURfUk9NLCAweDgwMDAwMDAwKTsKKworCQlmb3IgKGkgPSAwOworCQkgICAgICgoaSA8IDEwMDApICYmCisJCSAgICAgIChyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9HVUlEX1JPTSkgJiAweDgwMDAwMDAwKSk7IGkrKykKKwkJCXVkZWxheSgxMCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDB4MjA7IGkrKykgeworCQkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0dVSURfUk9NLCAweDAyMDAwMDAwKTsKKwkJCVBSSU5UKEtFUk5fREVCVUcsICIgICAgRUVQUk9NICUwMng6ICUwMngiLCBpLAorCQkJICAgICAgKHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0dVSURfUk9NKSA+PiAxNikgJiAweGZmKTsKKwkJfQorI2VuZGlmCisJfQorfQorCisvKgorICogSW5zZXJ0IGEgcGFja2V0IGluIHRoZSBETUEgZmlmbyBhbmQgZ2VuZXJhdGUgdGhlIERNQSBwcmcKKyAqIEZJWE1FOiByZXdyaXRlIHRoZSBwcm9ncmFtIGluIG9yZGVyIHRvIGFjY2VwdCBwYWNrZXRzIGNyb3NzaW5nCisgKiAgICAgICAgcGFnZSBib3VuZGFyaWVzLgorICogICAgICAgIGNoZWNrIGFsc28gdGhhdCBhIHNpbmdsZSBkbWEgZGVzY3JpcHRvciBkb2Vzbid0IGNyb3NzIGEKKyAqICAgICAgICBwYWdlIGJvdW5kYXJ5LgorICovCitzdGF0aWMgdm9pZCBpbnNlcnRfcGFja2V0KHN0cnVjdCB0aV9vaGNpICpvaGNpLAorCQkJICBzdHJ1Y3QgZG1hX3RybV9jdHggKmQsIHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0KQoreworCXUzMiBjeWNsZVRpbWVyOworCWludCBpZHggPSBkLT5wcmdfaW5kOworCisJREJHTVNHKCJJbnNlcnRpbmcgcGFja2V0IGZvciBub2RlICIgTk9ERV9CVVNfRk1UCisJICAgICAgICIsIHRsYWJlbD0lZCwgdGNvZGU9MHgleCwgc3BlZWQ9JWQiLAorCSAgICAgICBOT0RFX0JVU19BUkdTKG9oY2ktPmhvc3QsIHBhY2tldC0+bm9kZV9pZCksIHBhY2tldC0+dGxhYmVsLAorCSAgICAgICBwYWNrZXQtPnRjb2RlLCBwYWNrZXQtPnNwZWVkX2NvZGUpOworCisJZC0+cHJnX2NwdVtpZHhdLT5iZWdpbi5hZGRyZXNzID0gMDsKKwlkLT5wcmdfY3B1W2lkeF0tPmJlZ2luLmJyYW5jaEFkZHJlc3MgPSAwOworCisJaWYgKGQtPnR5cGUgPT0gRE1BX0NUWF9BU1lOQ19SRVNQKSB7CisJCS8qCisJCSAqIEZvciByZXNwb25zZSBwYWNrZXRzLCB3ZSBuZWVkIHRvIHB1dCBhIHRpbWVvdXQgdmFsdWUgaW4KKwkJICogdGhlIDE2IGxvd2VyIGJpdHMgb2YgdGhlIHN0YXR1cy4uLiBsZXQncyB0cnkgMSBzZWMgdGltZW91dAorCQkgKi8KKwkJY3ljbGVUaW1lciA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb2Nocm9ub3VzQ3ljbGVUaW1lcik7CisJCWQtPnByZ19jcHVbaWR4XS0+YmVnaW4uc3RhdHVzID0gY3B1X3RvX2xlMzIoCisJCQkoKCgoKGN5Y2xlVGltZXI+PjI1KSYweDcpKzEpJjB4Nyk8PDEzKSB8CisJCQkoKGN5Y2xlVGltZXImMHgwMWZmZjAwMCk+PjEyKSk7CisKKwkJREJHTVNHKCJjeWNsZVRpbWVyOiAlMDh4IHRpbWVTdGFtcDogJTA4eCIsCisJCSAgICAgICBjeWNsZVRpbWVyLCBkLT5wcmdfY3B1W2lkeF0tPmJlZ2luLnN0YXR1cyk7CisJfSBlbHNlIAorCQlkLT5wcmdfY3B1W2lkeF0tPmJlZ2luLnN0YXR1cyA9IDA7CisKKyAgICAgICAgaWYgKCAocGFja2V0LT50eXBlID09IGhwc2JfYXN5bmMpIHx8IChwYWNrZXQtPnR5cGUgPT0gaHBzYl9yYXcpICkgeworCisgICAgICAgICAgICAgICAgaWYgKHBhY2tldC0+dHlwZSA9PSBocHNiX3JhdykgeworCQkJZC0+cHJnX2NwdVtpZHhdLT5kYXRhWzBdID0gY3B1X3RvX2xlMzIoT0hDSTEzOTRfVENPREVfUEhZPDw0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPnByZ19jcHVbaWR4XS0+ZGF0YVsxXSA9IGNwdV90b19sZTMyKHBhY2tldC0+aGVhZGVyWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPnByZ19jcHVbaWR4XS0+ZGF0YVsyXSA9IGNwdV90b19sZTMyKHBhY2tldC0+aGVhZGVyWzFdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZC0+cHJnX2NwdVtpZHhdLT5kYXRhWzBdID0gcGFja2V0LT5zcGVlZF9jb2RlPDwxNiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrZXQtPmhlYWRlclswXSAmIDB4RkZGRik7CisKKwkJCWlmIChwYWNrZXQtPnRjb2RlID09IFRDT0RFX0lTT19EQVRBKSB7CisJCQkJLyogU2VuZGluZyBhbiBhc3luYyBzdHJlYW0gcGFja2V0ICovCisJCQkJZC0+cHJnX2NwdVtpZHhdLT5kYXRhWzFdID0gcGFja2V0LT5oZWFkZXJbMF0gJiAweEZGRkYwMDAwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTZW5kaW5nIGEgbm9ybWFsIGFzeW5jIHJlcXVlc3Qgb3IgcmVzcG9uc2UgKi8KKwkJCQlkLT5wcmdfY3B1W2lkeF0tPmRhdGFbMV0gPQorCQkJCQkocGFja2V0LT5oZWFkZXJbMV0gJiAweEZGRkYpIHwKKwkJCQkJKHBhY2tldC0+aGVhZGVyWzBdICYgMHhGRkZGMDAwMCk7CisJCQkJZC0+cHJnX2NwdVtpZHhdLT5kYXRhWzJdID0gcGFja2V0LT5oZWFkZXJbMl07CisJCQkJZC0+cHJnX2NwdVtpZHhdLT5kYXRhWzNdID0gcGFja2V0LT5oZWFkZXJbM107CisJCQl9CisJCQlwYWNrZXRfc3dhYihkLT5wcmdfY3B1W2lkeF0tPmRhdGEsIHBhY2tldC0+dGNvZGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwYWNrZXQtPmRhdGFfc2l6ZSkgeyAvKiBibG9jayB0cmFuc21pdCAqLworCQkJaWYgKHBhY2tldC0+dGNvZGUgPT0gVENPREVfU1RSRUFNX0RBVEEpeworCQkJCWQtPnByZ19jcHVbaWR4XS0+YmVnaW4uY29udHJvbCA9CisJCQkJCWNwdV90b19sZTMyKERNQV9DVExfT1VUUFVUX01PUkUgfAorCQkJCQkJICAgIERNQV9DVExfSU1NRURJQVRFIHwgMHg4KTsKKwkJCX0gZWxzZSB7CisJCQkJZC0+cHJnX2NwdVtpZHhdLT5iZWdpbi5jb250cm9sID0KKwkJCQkJY3B1X3RvX2xlMzIoRE1BX0NUTF9PVVRQVVRfTU9SRSB8CisJCQkJCQkgICAgRE1BX0NUTF9JTU1FRElBVEUgfCAweDEwKTsKKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPnByZ19jcHVbaWR4XS0+ZW5kLmNvbnRyb2wgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfdG9fbGUzMihETUFfQ1RMX09VVFBVVF9MQVNUIHwKKwkJCQkJICAgIERNQV9DVExfSVJRIHwKKwkJCQkJICAgIERNQV9DVExfQlJBTkNIIHwKKwkJCQkJICAgIHBhY2tldC0+ZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBDaGVjayB0aGF0IHRoZSBwYWNrZXQgZGF0YSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGRvZXMgbm90IGNyb3NzIGEgcGFnZSBib3VuZGFyeS4KKwkJCSAqCisJCQkgKiBYWFggRml4IHRoaXMgc29tZSBkYXkuIGV0aDEzOTQgc2VlbXMgdG8gdHJpZ2dlcgorCQkJICogaXQsIGJ1dCBpZ25vcmluZyBpdCBkb2Vzbid0IHNlZW0gdG8gY2F1c2UgYQorCQkJICogcHJvYmxlbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcm9zc19ib3VuZCgodW5zaWduZWQgbG9uZylwYWNrZXQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5kYXRhX3NpemUpPjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IGRvIHNvbWV0aGluZyBhYm91dCBpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX0VSUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBwYWNrZXQgZGF0YSBhZGRyOiAlcCBzaXplICVaZCBieXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9zcyBwYWdlIGJvdW5kYXJ5IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmRhdGEsIHBhY2tldC0+ZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgZC0+cHJnX2NwdVtpZHhdLT5lbmQuYWRkcmVzcyA9IGNwdV90b19sZTMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfbWFwX3NpbmdsZShvaGNpLT5kZXYsIHBhY2tldC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpKTsKKwkJCU9IQ0lfRE1BX0FMTE9DKCJzaW5nbGUsIGJsb2NrIHRyYW5zbWl0IHBhY2tldCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmVuZC5icmFuY2hBZGRyZXNzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPnByZ19jcHVbaWR4XS0+ZW5kLnN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC0+YnJhbmNoQWRkclB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihkLT5icmFuY2hBZGRyUHRyKSA9CisJCQkJCWNwdV90b19sZTMyKGQtPnByZ19idXNbaWR4XSB8IDB4Myk7CisgICAgICAgICAgICAgICAgICAgICAgICBkLT5icmFuY2hBZGRyUHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkLT5wcmdfY3B1W2lkeF0tPmVuZC5icmFuY2hBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBxdWFkbGV0IHRyYW5zbWl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFja2V0LT50eXBlID09IGhwc2JfcmF3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmJlZ2luLmNvbnRyb2wgPQorCQkJCQljcHVfdG9fbGUzMihETUFfQ1RMX09VVFBVVF9MQVNUIHwKKwkJCQkJCSAgICBETUFfQ1RMX0lNTUVESUFURSB8CisJCQkJCQkgICAgRE1BX0NUTF9JUlEgfAorCQkJCQkJICAgIERNQV9DVExfQlJBTkNIIHwKKwkJCQkJCSAgICAocGFja2V0LT5oZWFkZXJfc2l6ZSArIDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+cHJnX2NwdVtpZHhdLT5iZWdpbi5jb250cm9sID0KKwkJCQkJY3B1X3RvX2xlMzIoRE1BX0NUTF9PVVRQVVRfTEFTVCB8CisJCQkJCQkgICAgRE1BX0NUTF9JTU1FRElBVEUgfAorCQkJCQkJICAgIERNQV9DVExfSVJRIHwKKwkJCQkJCSAgICBETUFfQ1RMX0JSQU5DSCB8CisJCQkJCQkgICAgcGFja2V0LT5oZWFkZXJfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5icmFuY2hBZGRyUHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGQtPmJyYW5jaEFkZHJQdHIpID0KKwkJCQkJY3B1X3RvX2xlMzIoZC0+cHJnX2J1c1tpZHhdIHwgMHgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPmJyYW5jaEFkZHJQdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGQtPnByZ19jcHVbaWR4XS0+YmVnaW4uYnJhbmNoQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7IC8qIGlzbyBwYWNrZXQgKi8KKyAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmRhdGFbMF0gPSBwYWNrZXQtPnNwZWVkX2NvZGU8PDE2IHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrZXQtPmhlYWRlclswXSAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgZC0+cHJnX2NwdVtpZHhdLT5kYXRhWzFdID0gcGFja2V0LT5oZWFkZXJbMF0gJiAweEZGRkYwMDAwOworCQlwYWNrZXRfc3dhYihkLT5wcmdfY3B1W2lkeF0tPmRhdGEsIHBhY2tldC0+dGNvZGUpOworCisgICAgICAgICAgICAgICAgZC0+cHJnX2NwdVtpZHhdLT5iZWdpbi5jb250cm9sID0KKwkJCWNwdV90b19sZTMyKERNQV9DVExfT1VUUFVUX01PUkUgfAorCQkJCSAgICBETUFfQ1RMX0lNTUVESUFURSB8IDB4OCk7CisgICAgICAgICAgICAgICAgZC0+cHJnX2NwdVtpZHhdLT5lbmQuY29udHJvbCA9CisJCQljcHVfdG9fbGUzMihETUFfQ1RMX09VVFBVVF9MQVNUIHwKKwkJCQkgICAgRE1BX0NUTF9VUERBVEUgfAorCQkJCSAgICBETUFfQ1RMX0lSUSB8CisJCQkJICAgIERNQV9DVExfQlJBTkNIIHwKKwkJCQkgICAgcGFja2V0LT5kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGQtPnByZ19jcHVbaWR4XS0+ZW5kLmFkZHJlc3MgPSBjcHVfdG9fbGUzMigKKwkJCQlwY2lfbWFwX3NpbmdsZShvaGNpLT5kZXYsIHBhY2tldC0+ZGF0YSwKKwkJCQlwYWNrZXQtPmRhdGFfc2l6ZSwgUENJX0RNQV9UT0RFVklDRSkpOworCQlPSENJX0RNQV9BTExPQygic2luZ2xlLCBpc28gdHJhbnNtaXQgcGFja2V0Iik7CisKKyAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmVuZC5icmFuY2hBZGRyZXNzID0gMDsKKyAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmVuZC5zdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIERCR01TRygiSXNvIHhtaXQgY29udGV4dCBpbmZvOiBoZWFkZXJbJTA4eCAlMDh4XVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICBiZWdpbj0lMDh4ICUwOHggJTA4eCAlMDh4XG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUwOHggJTA4eCAlMDh4ICUwOHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgZW5kICA9JTA4eCAlMDh4ICUwOHggJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgIGQtPnByZ19jcHVbaWR4XS0+ZGF0YVswXSwgZC0+cHJnX2NwdVtpZHhdLT5kYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmJlZ2luLmNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgIGQtPnByZ19jcHVbaWR4XS0+YmVnaW4uYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgZC0+cHJnX2NwdVtpZHhdLT5iZWdpbi5icmFuY2hBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmJlZ2luLnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgZC0+cHJnX2NwdVtpZHhdLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmRhdGFbMV0sCisgICAgICAgICAgICAgICAgICAgICAgIGQtPnByZ19jcHVbaWR4XS0+ZGF0YVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgZC0+cHJnX2NwdVtpZHhdLT5kYXRhWzNdLAorICAgICAgICAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmVuZC5jb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmVuZC5hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmVuZC5icmFuY2hBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBkLT5wcmdfY3B1W2lkeF0tPmVuZC5zdGF0dXMpOworICAgICAgICAgICAgICAgIGlmIChkLT5icmFuY2hBZGRyUHRyKQorICAJCSAgICAgICAgKihkLT5icmFuY2hBZGRyUHRyKSA9IGNwdV90b19sZTMyKGQtPnByZ19idXNbaWR4XSB8IDB4Myk7CisgICAgICAgICAgICAgICAgZC0+YnJhbmNoQWRkclB0ciA9ICYoZC0+cHJnX2NwdVtpZHhdLT5lbmQuYnJhbmNoQWRkcmVzcyk7CisgICAgICAgIH0KKwlkLT5mcmVlX3ByZ3MtLTsKKworCS8qIHF1ZXVlIHRoZSBwYWNrZXQgaW4gdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgcXVldWUgKi8KKwlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmRyaXZlcl9saXN0LCAmZC0+Zmlmb19saXN0KTsKKwlkLT5wcmdfaW5kID0gKGQtPnByZ19pbmQgKyAxKSAlIGQtPm51bV9kZXNjOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmaWxscyB0aGUgRklGTyB3aXRoIHRoZSAoZXZlbnR1YWwpIHBlbmRpbmcgcGFja2V0cworICogYW5kIHJ1bnMgb3Igd2FrZXMgdXAgdGhlIERNQSBwcmcgaWYgbmVjZXNzYXJ5LgorICoKKyAqIFRoZSBmdW5jdGlvbiBNVVNUIGJlIGNhbGxlZCB3aXRoIHRoZSBkLT5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGRtYV90cm1fZmx1c2goc3RydWN0IHRpX29oY2kgKm9oY2ksIHN0cnVjdCBkbWFfdHJtX2N0eCAqZCkKK3sKKwlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCwgKnB0bXA7CisJaW50IGlkeCA9IGQtPnByZ19pbmQ7CisJaW50IHogPSAwOworCisJLyogaW5zZXJ0IHRoZSBwYWNrZXRzIGludG8gdGhlIGRtYSBmaWZvICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldCwgcHRtcCwgJmQtPnBlbmRpbmdfbGlzdCwgZHJpdmVyX2xpc3QpIHsKKwkJaWYgKCFkLT5mcmVlX3ByZ3MpCisJCQlicmVhazsKKworCQkvKiBGb3IgdGhlIGZpcnN0IHBhY2tldCBvbmx5ICovCisJCWlmICgheikKKwkJCXogPSAocGFja2V0LT5kYXRhX3NpemUpID8gMyA6IDI7CisKKwkJLyogSW5zZXJ0IHRoZSBwYWNrZXQgKi8KKwkJbGlzdF9kZWxfaW5pdCgmcGFja2V0LT5kcml2ZXJfbGlzdCk7CisJCWluc2VydF9wYWNrZXQob2hjaSwgZCwgcGFja2V0KTsKKwl9CisKKwkvKiBOb3RoaW5nIG11c3QgaGF2ZSBiZWVuIGRvbmUsIGVpdGhlciBubyBmcmVlX3ByZ3Mgb3Igbm8gcGFja2V0cyAqLworCWlmICh6ID09IDApCisJCXJldHVybjsKKworCS8qIElzIHRoZSBjb250ZXh0IHJ1bm5pbmcgPyAoc2hvdWxkIGJlIHVubGVzcyBpdCBpcworCSAgIHRoZSBmaXJzdCBwYWNrZXQgdG8gYmUgc2VudCBpbiB0aGlzIGNvbnRleHQpICovCisJaWYgKCEocmVnX3JlYWQob2hjaSwgZC0+Y3RybFNldCkgJiAweDgwMDApKSB7CisJCXUzMiBub2RlSWQgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Ob2RlSUQpOworCisJCURCR01TRygiU3RhcnRpbmcgdHJhbnNtaXQgRE1BIGN0eD0lZCIsZC0+Y3R4KTsKKwkJcmVnX3dyaXRlKG9oY2ksIGQtPmNtZFB0ciwgZC0+cHJnX2J1c1tpZHhdIHwgeik7CisKKwkJLyogQ2hlY2sgdGhhdCB0aGUgbm9kZSBpZCBpcyB2YWxpZCwgYW5kIG5vdCA2MyAqLworCQlpZiAoIShub2RlSWQgJiAweDgwMDAwMDAwKSB8fCAobm9kZUlkICYgMHgzZikgPT0gNjMpCisJCQlQUklOVChLRVJOX0VSUiwgIlJ1bm5pbmcgZG1hIGZhaWxlZCBiZWNhdXNlIE5vZGUgSUQgaXMgbm90IHZhbGlkIik7CisJCWVsc2UKKwkJCXJlZ193cml0ZShvaGNpLCBkLT5jdHJsU2V0LCAweDgwMDApOworCX0gZWxzZSB7CisJCS8qIFdha2UgdXAgdGhlIGRtYSBjb250ZXh0IGlmIG5lY2Vzc2FyeSAqLworCQlpZiAoIShyZWdfcmVhZChvaGNpLCBkLT5jdHJsU2V0KSAmIDB4NDAwKSkKKwkJCURCR01TRygiV2FraW5nIHRyYW5zbWl0IERNQSBjdHg9JWQiLGQtPmN0eCk7CisKKwkJLyogZG8gdGhpcyBhbHdheXMsIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uICovCisJCXJlZ193cml0ZShvaGNpLCBkLT5jdHJsU2V0LCAweDEwMDApOworCX0KKworCXJldHVybjsKK30KKworLyogVHJhbnNtaXNzaW9uIG9mIGFuIGFzeW5jIG9yIGlzbyBwYWNrZXQgKi8KK3N0YXRpYyBpbnQgb2hjaV90cmFuc21pdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IGhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBkbWFfdHJtX2N0eCAqZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHBhY2tldC0+ZGF0YV9zaXplID4gb2hjaS0+bWF4X3BhY2tldF9zaXplKSB7CisJCVBSSU5UKEtFUk5fRVJSLAorCQkgICAgICAiVHJhbnNtaXQgcGFja2V0IHNpemUgJVpkIGlzIHRvbyBiaWciLAorCQkgICAgICBwYWNrZXQtPmRhdGFfc2l6ZSk7CisJCXJldHVybiAtRU9WRVJGTE9XOworCX0KKworCS8qIERlY2lkZSB3aGV0aGVyIHdlIGhhdmUgYW4gaXNvLCBhIHJlcXVlc3QsIG9yIGEgcmVzcG9uc2UgcGFja2V0ICovCisJaWYgKHBhY2tldC0+dHlwZSA9PSBocHNiX3JhdykKKwkJZCA9ICZvaGNpLT5hdF9yZXFfY29udGV4dDsKKwllbHNlIGlmICgocGFja2V0LT50Y29kZSA9PSBUQ09ERV9JU09fREFUQSkgJiYgKHBhY2tldC0+dHlwZSA9PSBocHNiX2lzbykpIHsKKwkJLyogVGhlIGxlZ2FjeSBJVCBETUEgY29udGV4dCBpcyBpbml0aWFsaXplZCBvbiBmaXJzdAorCQkgKiB1c2UuICBIb3dldmVyLCB0aGUgYWxsb2MgY2Fubm90IGJlIHJ1biBmcm9tCisJCSAqIGludGVycnVwdCBjb250ZXh0LCBzbyB3ZSBiYWlsIG91dCBpZiB0aGF0IGlzIHRoZQorCQkgKiBjYXNlLiBJIGRvbid0IHNlZSBhbnlvbmUgc2VuZGluZyBJU08gcGFja2V0cyBmcm9tCisJCSAqIGludGVycnVwdCBjb250ZXh0IGFueXdheS4uLiAqLworCisJCWlmIChvaGNpLT5pdF9sZWdhY3lfY29udGV4dC5vaGNpID09IE5VTEwpIHsKKwkJCWlmIChpbl9pbnRlcnJ1cHQoKSkgeworCQkJCVBSSU5UKEtFUk5fRVJSLAorCQkJCSAgICAgICJsZWdhY3kgSVQgY29udGV4dCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nIGludGVycnVwdCIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlpZiAoYWxsb2NfZG1hX3RybV9jdHgob2hjaSwgJm9oY2ktPml0X2xlZ2FjeV9jb250ZXh0LAorCQkJCQkgICAgICBETUFfQ1RYX0lTTywgMCwgSVRfTlVNX0RFU0MsCisJCQkJCSAgICAgIE9IQ0kxMzk0X0lzb1htaXRDb250ZXh0QmFzZSkgPCAwKSB7CisJCQkJUFJJTlQoS0VSTl9FUlIsCisJCQkJICAgICAgImVycm9yIGluaXRpYWxpemluZyBsZWdhY3kgSVQgY29udGV4dCIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQlpbml0aWFsaXplX2RtYV90cm1fY3R4KCZvaGNpLT5pdF9sZWdhY3lfY29udGV4dCk7CisJCX0KKworCQlkID0gJm9oY2ktPml0X2xlZ2FjeV9jb250ZXh0OworCX0gZWxzZSBpZiAoKHBhY2tldC0+dGNvZGUgJiAweDAyKSAmJiAocGFja2V0LT50Y29kZSAhPSBUQ09ERV9JU09fREFUQSkpCisJCWQgPSAmb2hjaS0+YXRfcmVzcF9jb250ZXh0OworCWVsc2UKKwkJZCA9ICZvaGNpLT5hdF9yZXFfY29udGV4dDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkLT5sb2NrLGZsYWdzKTsKKworCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+ZHJpdmVyX2xpc3QsICZkLT5wZW5kaW5nX2xpc3QpOworCisJZG1hX3RybV9mbHVzaChvaGNpLCBkKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2hjaV9kZXZjdGwoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgZW51bSBkZXZjdGxfY21kIGNtZCwgaW50IGFyZykKK3sKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IGhvc3QtPmhvc3RkYXRhOworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBoeV9yZWc7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUkVTRVRfQlVTOgorCQlzd2l0Y2ggKGFyZykgeworCQljYXNlIFNIT1JUX1JFU0VUOgorCQkJcGh5X3JlZyA9IGdldF9waHlfcmVnKG9oY2ksIDUpOworCQkJcGh5X3JlZyB8PSAweDQwOworCQkJc2V0X3BoeV9yZWcob2hjaSwgNSwgcGh5X3JlZyk7IC8qIHNldCBJU0JSICovCisJCQlicmVhazsKKwkJY2FzZSBMT05HX1JFU0VUOgorCQkJcGh5X3JlZyA9IGdldF9waHlfcmVnKG9oY2ksIDEpOworCQkJcGh5X3JlZyB8PSAweDQwOworCQkJc2V0X3BoeV9yZWcob2hjaSwgMSwgcGh5X3JlZyk7IC8qIHNldCBJQlIgKi8KKwkJCWJyZWFrOworCQljYXNlIFNIT1JUX1JFU0VUX05PX0ZPUkNFX1JPT1Q6CisJCQlwaHlfcmVnID0gZ2V0X3BoeV9yZWcob2hjaSwgMSk7CisJCQlpZiAocGh5X3JlZyAmIDB4ODApIHsKKwkJCQlwaHlfcmVnICY9IH4weDgwOworCQkJCXNldF9waHlfcmVnKG9oY2ksIDEsIHBoeV9yZWcpOyAvKiBjbGVhciBSSEIgKi8KKwkJCX0KKworCQkJcGh5X3JlZyA9IGdldF9waHlfcmVnKG9oY2ksIDUpOworCQkJcGh5X3JlZyB8PSAweDQwOworCQkJc2V0X3BoeV9yZWcob2hjaSwgNSwgcGh5X3JlZyk7IC8qIHNldCBJU0JSICovCisJCQlicmVhazsKKwkJY2FzZSBMT05HX1JFU0VUX05PX0ZPUkNFX1JPT1Q6CisJCQlwaHlfcmVnID0gZ2V0X3BoeV9yZWcob2hjaSwgMSk7CisJCQlwaHlfcmVnICY9IH4weDgwOworCQkJcGh5X3JlZyB8PSAweDQwOworCQkJc2V0X3BoeV9yZWcob2hjaSwgMSwgcGh5X3JlZyk7IC8qIGNsZWFyIFJIQiwgc2V0IElCUiAqLworCQkJYnJlYWs7CisJCWNhc2UgU0hPUlRfUkVTRVRfRk9SQ0VfUk9PVDoKKwkJCXBoeV9yZWcgPSBnZXRfcGh5X3JlZyhvaGNpLCAxKTsKKwkJCWlmICghKHBoeV9yZWcgJiAweDgwKSkgeworCQkJCXBoeV9yZWcgfD0gMHg4MDsKKwkJCQlzZXRfcGh5X3JlZyhvaGNpLCAxLCBwaHlfcmVnKTsgLyogc2V0IFJIQiAqLworCQkJfQorCisJCQlwaHlfcmVnID0gZ2V0X3BoeV9yZWcob2hjaSwgNSk7CisJCQlwaHlfcmVnIHw9IDB4NDA7CisJCQlzZXRfcGh5X3JlZyhvaGNpLCA1LCBwaHlfcmVnKTsgLyogc2V0IElTQlIgKi8KKwkJCWJyZWFrOworCQljYXNlIExPTkdfUkVTRVRfRk9SQ0VfUk9PVDoKKwkJCXBoeV9yZWcgPSBnZXRfcGh5X3JlZyhvaGNpLCAxKTsKKwkJCXBoeV9yZWcgfD0gMHhjMDsKKwkJCXNldF9waHlfcmVnKG9oY2ksIDEsIHBoeV9yZWcpOyAvKiBzZXQgUkhCIGFuZCBJQlIgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dmFsID0gLTE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEdFVF9DWUNMRV9DT1VOVEVSOgorCQlyZXR2YWwgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Jc29jaHJvbm91c0N5Y2xlVGltZXIpOworCQlicmVhazsKKworCWNhc2UgU0VUX0NZQ0xFX0NPVU5URVI6CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29jaHJvbm91c0N5Y2xlVGltZXIsIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBTRVRfQlVTX0lEOgorCQlQUklOVChLRVJOX0VSUiwgImRldmN0bCBjb21tYW5kIFNFVF9CVVNfSUQgZXJyIik7CisJCWJyZWFrOworCisJY2FzZSBBQ1RfQ1lDTEVfTUFTVEVSOgorCQlpZiAoYXJnKSB7CisJCQkvKiBjaGVjayBpZiB3ZSBhcmUgcm9vdCBhbmQgb3RoZXIgbm9kZXMgYXJlIHByZXNlbnQgKi8KKwkJCXUzMiBub2RlSWQgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Ob2RlSUQpOworCQkJaWYgKChub2RlSWQgJiAoMTw8MzApKSAmJiAobm9kZUlkICYgMHgzZikpIHsKKwkJCQkvKgorCQkJCSAqIGVuYWJsZSBjeWNsZVRpbWVyLCBjeWNsZU1hc3RlcgorCQkJCSAqLworCQkJCURCR01TRygiQ3ljbGUgbWFzdGVyIGVuYWJsZWQiKTsKKwkJCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfTGlua0NvbnRyb2xTZXQsCisJCQkJCSAgT0hDSTEzOTRfTGlua0NvbnRyb2xfQ3ljbGVUaW1lckVuYWJsZSB8CisJCQkJCSAgT0hDSTEzOTRfTGlua0NvbnRyb2xfQ3ljbGVNYXN0ZXIpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogZGlzYWJsZSBjeWNsZVRpbWVyLCBjeWNsZU1hc3RlciwgY3ljbGVTb3VyY2UgKi8KKwkJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9MaW5rQ29udHJvbENsZWFyLAorCQkJCSAgT0hDSTEzOTRfTGlua0NvbnRyb2xfQ3ljbGVUaW1lckVuYWJsZSB8CisJCQkJICBPSENJMTM5NF9MaW5rQ29udHJvbF9DeWNsZU1hc3RlciB8CisJCQkJICBPSENJMTM5NF9MaW5rQ29udHJvbF9DeWNsZVNvdXJjZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENBTkNFTF9SRVFVRVNUUzoKKwkJREJHTVNHKCJDYW5jZWwgcmVxdWVzdCByZWNlaXZlZCIpOworCQlkbWFfdHJtX3Jlc2V0KCZvaGNpLT5hdF9yZXFfY29udGV4dCk7CisJCWRtYV90cm1fcmVzZXQoJm9oY2ktPmF0X3Jlc3BfY29udGV4dCk7CisJCWJyZWFrOworCisJY2FzZSBJU09fTElTVEVOX0NIQU5ORUw6CisgICAgICAgIHsKKwkJdTY0IG1hc2s7CisKKwkJaWYgKGFyZzwwIHx8IGFyZz42MykgeworCQkJUFJJTlQoS0VSTl9FUlIsCisJCQkgICAgICAiJXM6IElTMCBsaXN0ZW4gY2hhbm5lbCAlZCBpcyBvdXQgb2YgcmFuZ2UiLAorCQkJICAgICAgX19GVU5DVElPTl9fLCBhcmcpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQltYXNrID0gKHU2NCkweDE8PGFyZzsKKworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvaGNpLT5JUl9jaGFubmVsX2xvY2ssIGZsYWdzKTsKKworCQlpZiAob2hjaS0+SVNPX2NoYW5uZWxfdXNhZ2UgJiBtYXNrKSB7CisJCQlQUklOVChLRVJOX0VSUiwKKwkJCSAgICAgICIlczogSVMwIGxpc3RlbiBjaGFubmVsICVkIGlzIGFscmVhZHkgdXNlZCIsCisJCQkgICAgICBfX0ZVTkNUSU9OX18sIGFyZyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvaGNpLT5JUl9jaGFubmVsX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJb2hjaS0+SVNPX2NoYW5uZWxfdXNhZ2UgfD0gbWFzazsKKwkJb2hjaS0+aXJfbGVnYWN5X2NoYW5uZWxzIHw9IG1hc2s7CisKKwkJaWYgKGFyZz4zMSkKKwkJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JUk11bHRpQ2hhbk1hc2tIaVNldCwKKwkJCQkgIDE8PChhcmctMzIpKTsKKwkJZWxzZQorCQkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lSTXVsdGlDaGFuTWFza0xvU2V0LAorCQkJCSAgMTw8YXJnKTsKKworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9oY2ktPklSX2NoYW5uZWxfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIERCR01TRygiTGlzdGVuaW5nIGVuYWJsZWQgb24gY2hhbm5lbCAlZCIsIGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwljYXNlIElTT19VTkxJU1RFTl9DSEFOTkVMOgorICAgICAgICB7CisJCXU2NCBtYXNrOworCisJCWlmIChhcmc8MCB8fCBhcmc+NjMpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLAorCQkJICAgICAgIiVzOiBJUzAgdW5saXN0ZW4gY2hhbm5lbCAlZCBpcyBvdXQgb2YgcmFuZ2UiLAorCQkJICAgICAgX19GVU5DVElPTl9fLCBhcmcpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQltYXNrID0gKHU2NCkweDE8PGFyZzsKKworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvaGNpLT5JUl9jaGFubmVsX2xvY2ssIGZsYWdzKTsKKworCQlpZiAoIShvaGNpLT5JU09fY2hhbm5lbF91c2FnZSAmIG1hc2spKSB7CisJCQlQUklOVChLRVJOX0VSUiwKKwkJCSAgICAgICIlczogSVMwIHVubGlzdGVuIGNoYW5uZWwgJWQgaXMgbm90IHVzZWQiLAorCQkJICAgICAgX19GVU5DVElPTl9fLCBhcmcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2hjaS0+SVJfY2hhbm5lbF9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCW9oY2ktPklTT19jaGFubmVsX3VzYWdlICY9IH5tYXNrOworCQlvaGNpLT5pcl9sZWdhY3lfY2hhbm5lbHMgJj0gfm1hc2s7CisKKwkJaWYgKGFyZz4zMSkKKwkJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JUk11bHRpQ2hhbk1hc2tIaUNsZWFyLAorCQkJCSAgMTw8KGFyZy0zMikpOworCQllbHNlCisJCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSVJNdWx0aUNoYW5NYXNrTG9DbGVhciwKKwkJCQkgIDE8PGFyZyk7CisKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvaGNpLT5JUl9jaGFubmVsX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBEQkdNU0coIkxpc3RlbmluZyBkaXNhYmxlZCBvbiBjaGFubmVsICVkIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCWRlZmF1bHQ6CisJCVBSSU5UX0coS0VSTl9FUlIsICJvaGNpX2RldmN0bCBjbWQgJWQgbm90IGltcGxlbWVudGVkIHlldCIsCisJCQljbWQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByYXdpc28gSVNPIHJlY2VwdGlvbiAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAgV2UgdXNlIGVpdGhlciBidWZmZXItZmlsbCBvciBwYWNrZXQtcGVyLWJ1ZmZlciBETUEgbW9kZS4gVGhlIERNQQorICBidWZmZXIgaXMgc3BsaXQgaW50byAiYmxvY2tzIiAocmVnaW9ucyBkZXNjcmliZWQgYnkgb25lIERNQQorICBkZXNjcmlwdG9yKS4gRWFjaCBibG9jayBtdXN0IGJlIG9uZSBwYWdlIG9yIGxlc3MgaW4gc2l6ZSwgYW5kCisgIG11c3Qgbm90IGNyb3NzIGEgcGFnZSBib3VuZGFyeS4KKworICBUaGVyZSBpcyBvbmUgbGl0dGxlIHdyaW5rbGUgd2l0aCBidWZmZXItZmlsbCBtb2RlOiBhIHBhY2tldCB0aGF0CisgIHN0YXJ0cyBpbiB0aGUgZmluYWwgYmxvY2sgbWF5IHdyYXAgYXJvdW5kIGludG8gdGhlIGZpcnN0IGJsb2NrLiBCdXQKKyAgdGhlIHVzZXIgQVBJIGV4cGVjdHMgYWxsIHBhY2tldHMgdG8gYmUgY29udGlndW91cy4gT3VyIHNvbHV0aW9uIGlzCisgIHRvIGtlZXAgdGhlIHZlcnkgbGFzdCBwYWdlIG9mIHRoZSBETUEgYnVmZmVyIGluIHJlc2VydmUgLSBpZiBhCisgIHBhY2tldCBzcGFucyB0aGUgZ2FwLCB3ZSBjb3B5IGl0cyB0YWlsIGludG8gdGhpcyBwYWdlLgorKi8KKworc3RydWN0IG9oY2lfaXNvX3JlY3YgeworCXN0cnVjdCB0aV9vaGNpICpvaGNpOworCisJc3RydWN0IG9oY2kxMzk0X2lzb190YXNrbGV0IHRhc2s7CisJaW50IHRhc2tfYWN0aXZlOworCisJZW51bSB7IEJVRkZFUl9GSUxMX01PREUgPSAwLAorCSAgICAgICBQQUNLRVRfUEVSX0JVRkZFUl9NT0RFID0gMSB9IGRtYV9tb2RlOworCisJLyogbWVtb3J5IGFuZCBQQ0kgbWFwcGluZyBmb3IgdGhlIERNQSBkZXNjcmlwdG9ycyAqLworCXN0cnVjdCBkbWFfcHJvZ19yZWdpb24gcHJvZzsKKwlzdHJ1Y3QgZG1hX2NtZCAqYmxvY2s7IC8qID0gKHN0cnVjdCBkbWFfY21kKikgcHJvZy52aXJ0ICovCisKKwkvKiBob3cgbWFueSBETUEgYmxvY2tzIGZpdCBpbiB0aGUgYnVmZmVyICovCisJdW5zaWduZWQgaW50IG5ibG9ja3M7CisKKwkvKiBzdHJpZGUgb2YgRE1BIGJsb2NrcyAqLworCXVuc2lnbmVkIGludCBidWZfc3RyaWRlOworCisJLyogbnVtYmVyIG9mIGJsb2NrcyB0byBiYXRjaCBiZXR3ZWVuIGludGVycnVwdHMgKi8KKwlpbnQgYmxvY2tfaXJxX2ludGVydmFsOworCisJLyogYmxvY2sgdGhhdCBETUEgd2lsbCBmaW5pc2ggbmV4dCAqLworCWludCBibG9ja19kbWE7CisKKwkvKiAoYnVmZmVyLWZpbGwgb25seSkgYmxvY2sgdGhhdCB0aGUgcmVhZGVyIHdpbGwgcmVsZWFzZSBuZXh0ICovCisJaW50IGJsb2NrX3JlYWRlcjsKKworCS8qIChidWZmZXItZmlsbCBvbmx5KSBieXRlcyBvZiBidWZmZXIgdGhlIHJlYWRlciBoYXMgcmVsZWFzZWQsCisJICAgbGVzcyB0aGFuIG9uZSBibG9jayAqLworCWludCByZWxlYXNlZF9ieXRlczsKKworCS8qIChidWZmZXItZmlsbCBvbmx5KSBidWZmZXIgb2Zmc2V0IGF0IHdoaWNoIHRoZSBuZXh0IHBhY2tldCB3aWxsIGFwcGVhciAqLworCWludCBkbWFfb2Zmc2V0OworCisJLyogT0hDSSBETUEgY29udGV4dCBjb250cm9sIHJlZ2lzdGVycyAqLworCXUzMiBDb250ZXh0Q29udHJvbFNldDsKKwl1MzIgQ29udGV4dENvbnRyb2xDbGVhcjsKKwl1MzIgQ29tbWFuZFB0cjsKKwl1MzIgQ29udGV4dE1hdGNoOworfTsKKworc3RhdGljIHZvaWQgb2hjaV9pc29fcmVjdl90YXNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBvaGNpX2lzb19yZWN2X3N0b3Aoc3RydWN0IGhwc2JfaXNvICppc28pOworc3RhdGljIHZvaWQgb2hjaV9pc29fcmVjdl9zaHV0ZG93bihzdHJ1Y3QgaHBzYl9pc28gKmlzbyk7CitzdGF0aWMgaW50ICBvaGNpX2lzb19yZWN2X3N0YXJ0KHN0cnVjdCBocHNiX2lzbyAqaXNvLCBpbnQgY3ljbGUsIGludCB0YWdfbWFzaywgaW50IHN5bmMpOworc3RhdGljIHZvaWQgb2hjaV9pc29fcmVjdl9wcm9ncmFtKHN0cnVjdCBocHNiX2lzbyAqaXNvKTsKKworc3RhdGljIGludCBvaGNpX2lzb19yZWN2X2luaXQoc3RydWN0IGhwc2JfaXNvICppc28pCit7CisJc3RydWN0IHRpX29oY2kgKm9oY2kgPSBpc28tPmhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBvaGNpX2lzb19yZWN2ICpyZWN2OworCWludCBjdHg7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwlyZWN2ID0ga21hbGxvYyhzaXplb2YoKnJlY3YpLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFyZWN2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlzby0+aG9zdGRhdGEgPSByZWN2OworCXJlY3YtPm9oY2kgPSBvaGNpOworCXJlY3YtPnRhc2tfYWN0aXZlID0gMDsKKwlkbWFfcHJvZ19yZWdpb25faW5pdCgmcmVjdi0+cHJvZyk7CisJcmVjdi0+YmxvY2sgPSBOVUxMOworCisJLyogdXNlIGJ1ZmZlci1maWxsIG1vZGUsIHVubGVzcyBpcnFfaW50ZXJ2YWwgaXMgMQorCSAgIChub3RlOiBtdWx0aWNoYW5uZWwgcmVxdWlyZXMgYnVmZmVyLWZpbGwpICovCisKKwlpZiAoKChpc28tPmlycV9pbnRlcnZhbCA9PSAxICYmIGlzby0+ZG1hX21vZGUgPT0gSFBTQl9JU09fRE1BX09MRF9BQkkpIHx8CisJICAgICBpc28tPmRtYV9tb2RlID09IEhQU0JfSVNPX0RNQV9QQUNLRVRfUEVSX0JVRkZFUikgJiYgaXNvLT5jaGFubmVsICE9IC0xKSB7CisJCXJlY3YtPmRtYV9tb2RlID0gUEFDS0VUX1BFUl9CVUZGRVJfTU9ERTsKKwl9IGVsc2UgeworCQlyZWN2LT5kbWFfbW9kZSA9IEJVRkZFUl9GSUxMX01PREU7CisJfQorCisJLyogc2V0IG5ibG9ja3MsIGJ1Zl9zdHJpZGUsIGJsb2NrX2lycV9pbnRlcnZhbCAqLworCisJaWYgKHJlY3YtPmRtYV9tb2RlID09IEJVRkZFUl9GSUxMX01PREUpIHsKKwkJcmVjdi0+YnVmX3N0cmlkZSA9IFBBR0VfU0laRTsKKworCQkvKiBvbmUgYmxvY2sgcGVyIHBhZ2Ugb2YgZGF0YSBpbiB0aGUgRE1BIGJ1ZmZlciwgbWludXMgdGhlIGZpbmFsIGd1YXJkIHBhZ2UgKi8KKwkJcmVjdi0+bmJsb2NrcyA9IGlzby0+YnVmX3NpemUvUEFHRV9TSVpFIC0gMTsKKwkJaWYgKHJlY3YtPm5ibG9ja3MgPCAzKSB7CisJCQlEQkdNU0coIm9oY2lfaXNvX3JlY3ZfaW5pdDogRE1BIGJ1ZmZlciB0b28gc21hbGwiKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogaXNvLT5pcnFfaW50ZXJ2YWwgaXMgaW4gcGFja2V0cyAtIHRyYW5zbGF0ZSB0aGF0IHRvIGJsb2NrcyAqLworCQlpZiAoaXNvLT5pcnFfaW50ZXJ2YWwgPT0gMSkKKwkJCXJlY3YtPmJsb2NrX2lycV9pbnRlcnZhbCA9IDE7CisJCWVsc2UKKwkJCXJlY3YtPmJsb2NrX2lycV9pbnRlcnZhbCA9IGlzby0+aXJxX2ludGVydmFsICoKKwkJCQkJCQkoKHJlY3YtPm5ibG9ja3MrMSkvaXNvLT5idWZfcGFja2V0cyk7CisJCWlmIChyZWN2LT5ibG9ja19pcnFfaW50ZXJ2YWwqNCA+IHJlY3YtPm5ibG9ja3MpCisJCQlyZWN2LT5ibG9ja19pcnFfaW50ZXJ2YWwgPSByZWN2LT5uYmxvY2tzLzQ7CisJCWlmIChyZWN2LT5ibG9ja19pcnFfaW50ZXJ2YWwgPCAxKQorCQkJcmVjdi0+YmxvY2tfaXJxX2ludGVydmFsID0gMTsKKworCX0gZWxzZSB7CisJCWludCBtYXhfcGFja2V0X3NpemU7CisKKwkJcmVjdi0+bmJsb2NrcyA9IGlzby0+YnVmX3BhY2tldHM7CisJCXJlY3YtPmJsb2NrX2lycV9pbnRlcnZhbCA9IGlzby0+aXJxX2ludGVydmFsOworCQlpZiAocmVjdi0+YmxvY2tfaXJxX2ludGVydmFsICogNCA+IGlzby0+YnVmX3BhY2tldHMpCisJCQlyZWN2LT5ibG9ja19pcnFfaW50ZXJ2YWwgPSBpc28tPmJ1Zl9wYWNrZXRzIC8gNDsKKwkJaWYgKHJlY3YtPmJsb2NrX2lycV9pbnRlcnZhbCA8IDEpCisJCXJlY3YtPmJsb2NrX2lycV9pbnRlcnZhbCA9IDE7CisKKwkJLyogY2hvb3NlIGEgYnVmZmVyIHN0cmlkZSAqLworCQkvKiBtdXN0IGJlIGEgcG93ZXIgb2YgMiwgYW5kIDw9IFBBR0VfU0laRSAqLworCisJCW1heF9wYWNrZXRfc2l6ZSA9IGlzby0+YnVmX3NpemUgLyBpc28tPmJ1Zl9wYWNrZXRzOworCisJCWZvciAocmVjdi0+YnVmX3N0cmlkZSA9IDg7IHJlY3YtPmJ1Zl9zdHJpZGUgPCBtYXhfcGFja2V0X3NpemU7CisJCSAgICByZWN2LT5idWZfc3RyaWRlICo9IDIpOworCisJCWlmIChyZWN2LT5idWZfc3RyaWRlKmlzby0+YnVmX3BhY2tldHMgPiBpc28tPmJ1Zl9zaXplIHx8CisJCSAgIHJlY3YtPmJ1Zl9zdHJpZGUgPiBQQUdFX1NJWkUpIHsKKwkJCS8qIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGFueXdheS4uLiAqLworCQkJREJHTVNHKCJvaGNpX2lzb19yZWN2X2luaXQ6IHByb2JsZW0gY2hvb3NpbmcgYSBidWZmZXIgc3RyaWRlIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXJlY3YtPmJsb2NrX3JlYWRlciA9IDA7CisJcmVjdi0+cmVsZWFzZWRfYnl0ZXMgPSAwOworCXJlY3YtPmJsb2NrX2RtYSA9IDA7CisJcmVjdi0+ZG1hX29mZnNldCA9IDA7CisKKwkvKiBzaXplIG9mIERNQSBwcm9ncmFtID0gb25lIGRlc2NyaXB0b3IgcGVyIGJsb2NrICovCisJaWYgKGRtYV9wcm9nX3JlZ2lvbl9hbGxvYygmcmVjdi0+cHJvZywKKwkJCQkgc2l6ZW9mKHN0cnVjdCBkbWFfY21kKSAqIHJlY3YtPm5ibG9ja3MsCisJCQkJIHJlY3YtPm9oY2ktPmRldikpCisJCWdvdG8gZXJyOworCisJcmVjdi0+YmxvY2sgPSAoc3RydWN0IGRtYV9jbWQqKSByZWN2LT5wcm9nLmt2aXJ0OworCisJb2hjaTEzOTRfaW5pdF9pc29fdGFza2xldCgmcmVjdi0+dGFzaywKKwkJCQkgIGlzby0+Y2hhbm5lbCA9PSAtMSA/IE9IQ0lfSVNPX01VTFRJQ0hBTk5FTF9SRUNFSVZFIDoKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgIE9IQ0lfSVNPX1JFQ0VJVkUsCisJCQkJICBvaGNpX2lzb19yZWN2X3Rhc2ssICh1bnNpZ25lZCBsb25nKSBpc28pOworCisJaWYgKG9oY2kxMzk0X3JlZ2lzdGVyX2lzb190YXNrbGV0KHJlY3YtPm9oY2ksICZyZWN2LT50YXNrKSA8IDApCisJCWdvdG8gZXJyOworCisJcmVjdi0+dGFza19hY3RpdmUgPSAxOworCisJLyogcmVjdiBjb250ZXh0IHJlZ2lzdGVycyBhcmUgc3BhY2VkIDMyIGJ5dGVzIGFwYXJ0ICovCisJY3R4ID0gcmVjdi0+dGFzay5jb250ZXh0OworCXJlY3YtPkNvbnRleHRDb250cm9sU2V0ID0gT0hDSTEzOTRfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQgKyAzMiAqIGN0eDsKKwlyZWN2LT5Db250ZXh0Q29udHJvbENsZWFyID0gT0hDSTEzOTRfSXNvUmN2Q29udGV4dENvbnRyb2xDbGVhciArIDMyICogY3R4OworCXJlY3YtPkNvbW1hbmRQdHIgPSBPSENJMTM5NF9Jc29SY3ZDb21tYW5kUHRyICsgMzIgKiBjdHg7CisJcmVjdi0+Q29udGV4dE1hdGNoID0gT0hDSTEzOTRfSXNvUmN2Q29udGV4dE1hdGNoICsgMzIgKiBjdHg7CisKKwlpZiAoaXNvLT5jaGFubmVsID09IC0xKSB7CisJCS8qIGNsZWFyIG11bHRpLWNoYW5uZWwgc2VsZWN0aW9uIG1hc2sgKi8KKwkJcmVnX3dyaXRlKHJlY3YtPm9oY2ksIE9IQ0kxMzk0X0lSTXVsdGlDaGFuTWFza0hpQ2xlYXIsIDB4RkZGRkZGRkYpOworCQlyZWdfd3JpdGUocmVjdi0+b2hjaSwgT0hDSTEzOTRfSVJNdWx0aUNoYW5NYXNrTG9DbGVhciwgMHhGRkZGRkZGRik7CisJfQorCisJLyogd3JpdGUgdGhlIERNQSBwcm9ncmFtICovCisJb2hjaV9pc29fcmVjdl9wcm9ncmFtKGlzbyk7CisKKwlEQkdNU0coIm9oY2lfaXNvX3JlY3ZfaW5pdDogJXMgbW9kZSwgRE1BIGJ1ZmZlciBpcyAlbHUgcGFnZXMiCisJICAgICAgICIgKCV1IGJ5dGVzKSwgdXNpbmcgJXUgYmxvY2tzLCBidWZfc3RyaWRlICV1LCBibG9ja19pcnFfaW50ZXJ2YWwgJWQiLAorCSAgICAgICByZWN2LT5kbWFfbW9kZSA9PSBCVUZGRVJfRklMTF9NT0RFID8KKwkgICAgICAgImJ1ZmZlci1maWxsIiA6ICJwYWNrZXQtcGVyLWJ1ZmZlciIsCisJICAgICAgIGlzby0+YnVmX3NpemUvUEFHRV9TSVpFLCBpc28tPmJ1Zl9zaXplLAorCSAgICAgICByZWN2LT5uYmxvY2tzLCByZWN2LT5idWZfc3RyaWRlLCByZWN2LT5ibG9ja19pcnFfaW50ZXJ2YWwpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlvaGNpX2lzb19yZWN2X3NodXRkb3duKGlzbyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb2hjaV9pc29fcmVjdl9zdG9wKHN0cnVjdCBocHNiX2lzbyAqaXNvKQoreworCXN0cnVjdCBvaGNpX2lzb19yZWN2ICpyZWN2ID0gaXNvLT5ob3N0ZGF0YTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXJlZ193cml0ZShyZWN2LT5vaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50TWFza0NsZWFyLCAxIDw8IHJlY3YtPnRhc2suY29udGV4dCk7CisKKwkvKiBoYWx0IERNQSAqLworCW9oY2kxMzk0X3N0b3BfY29udGV4dChyZWN2LT5vaGNpLCByZWN2LT5Db250ZXh0Q29udHJvbENsZWFyLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgb2hjaV9pc29fcmVjdl9zaHV0ZG93bihzdHJ1Y3QgaHBzYl9pc28gKmlzbykKK3sKKwlzdHJ1Y3Qgb2hjaV9pc29fcmVjdiAqcmVjdiA9IGlzby0+aG9zdGRhdGE7CisKKwlpZiAocmVjdi0+dGFza19hY3RpdmUpIHsKKwkJb2hjaV9pc29fcmVjdl9zdG9wKGlzbyk7CisJCW9oY2kxMzk0X3VucmVnaXN0ZXJfaXNvX3Rhc2tsZXQocmVjdi0+b2hjaSwgJnJlY3YtPnRhc2spOworCQlyZWN2LT50YXNrX2FjdGl2ZSA9IDA7CisJfQorCisJZG1hX3Byb2dfcmVnaW9uX2ZyZWUoJnJlY3YtPnByb2cpOworCWtmcmVlKHJlY3YpOworCWlzby0+aG9zdGRhdGEgPSBOVUxMOworfQorCisvKiBzZXQgdXAgYSAiZ2FwcGVkIiByaW5nIGJ1ZmZlciBETUEgcHJvZ3JhbSAqLworc3RhdGljIHZvaWQgb2hjaV9pc29fcmVjdl9wcm9ncmFtKHN0cnVjdCBocHNiX2lzbyAqaXNvKQoreworCXN0cnVjdCBvaGNpX2lzb19yZWN2ICpyZWN2ID0gaXNvLT5ob3N0ZGF0YTsKKwlpbnQgYmxrOworCisJLyogYWRkcmVzcyBvZiAnYnJhbmNoJyBmaWVsZCBpbiBwcmV2aW91cyBETUEgZGVzY3JpcHRvciAqLworCXUzMiAqcHJldl9icmFuY2ggPSBOVUxMOworCisJZm9yIChibGsgPSAwOyBibGsgPCByZWN2LT5uYmxvY2tzOyBibGsrKykgeworCQl1MzIgY29udHJvbDsKKworCQkvKiB0aGUgRE1BIGRlc2NyaXB0b3IgKi8KKwkJc3RydWN0IGRtYV9jbWQgKmNtZCA9ICZyZWN2LT5ibG9ja1tibGtdOworCisJCS8qIG9mZnNldCBvZiB0aGUgRE1BIGRlc2NyaXB0b3IgcmVsYXRpdmUgdG8gdGhlIERNQSBwcm9nIGJ1ZmZlciAqLworCQl1bnNpZ25lZCBsb25nIHByb2dfb2Zmc2V0ID0gYmxrICogc2l6ZW9mKHN0cnVjdCBkbWFfY21kKTsKKworCQkvKiBvZmZzZXQgb2YgdGhpcyBwYWNrZXQncyBkYXRhIHdpdGhpbiB0aGUgRE1BIGJ1ZmZlciAqLworCQl1bnNpZ25lZCBsb25nIGJ1Zl9vZmZzZXQgPSBibGsgKiByZWN2LT5idWZfc3RyaWRlOworCisJCWlmIChyZWN2LT5kbWFfbW9kZSA9PSBCVUZGRVJfRklMTF9NT0RFKSB7CisJCQljb250cm9sID0gMiA8PCAyODsgLyogSU5QVVRfTU9SRSAqLworCQl9IGVsc2UgeworCQkJY29udHJvbCA9IDMgPDwgMjg7IC8qIElOUFVUX0xBU1QgKi8KKwkJfQorCisJCWNvbnRyb2wgfD0gOCA8PCAyNDsgLyogcyA9IDEsIHVwZGF0ZSB4ZmVyU3RhdHVzIGFuZCByZXNDb3VudCAqLworCisJCS8qIGludGVycnVwdCBvbiBsYXN0IGJsb2NrLCBhbmQgYXQgaW50ZXJ2YWxzICovCisJCWlmIChibGsgPT0gcmVjdi0+bmJsb2Nrcy0xIHx8IChibGsgJSByZWN2LT5ibG9ja19pcnFfaW50ZXJ2YWwpID09IDApIHsKKwkJCWNvbnRyb2wgfD0gMyA8PCAyMDsgLyogd2FudCBpbnRlcnJ1cHQgKi8KKwkJfQorCisJCWNvbnRyb2wgfD0gMyA8PCAxODsgLyogZW5hYmxlIGJyYW5jaCB0byBhZGRyZXNzICovCisJCWNvbnRyb2wgfD0gcmVjdi0+YnVmX3N0cmlkZTsKKworCQljbWQtPmNvbnRyb2wgPSBjcHVfdG9fbGUzMihjb250cm9sKTsKKwkJY21kLT5hZGRyZXNzID0gY3B1X3RvX2xlMzIoZG1hX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZpc28tPmRhdGFfYnVmLCBidWZfb2Zmc2V0KSk7CisJCWNtZC0+YnJhbmNoQWRkcmVzcyA9IDA7IC8qIGZpbGxlZCBpbiBvbiBuZXh0IGxvb3AgKi8KKwkJY21kLT5zdGF0dXMgPSBjcHVfdG9fbGUzMihyZWN2LT5idWZfc3RyaWRlKTsKKworCQkvKiBsaW5rIHRoZSBwcmV2aW91cyBkZXNjcmlwdG9yIHRvIHRoaXMgb25lICovCisJCWlmIChwcmV2X2JyYW5jaCkgeworCQkJKnByZXZfYnJhbmNoID0gY3B1X3RvX2xlMzIoZG1hX3Byb2dfcmVnaW9uX29mZnNldF90b19idXMoJnJlY3YtPnByb2csIHByb2dfb2Zmc2V0KSB8IDEpOworCQl9CisKKwkJcHJldl9icmFuY2ggPSAmY21kLT5icmFuY2hBZGRyZXNzOworCX0KKworCS8qIHRoZSBmaW5hbCBkZXNjcmlwdG9yJ3MgYnJhbmNoIGFkZHJlc3MgYW5kIFogc2hvdWxkIGJlIGxlZnQgYXQgMCAqLworfQorCisvKiBsaXN0ZW4gb3IgdW5saXN0ZW4gdG8gYSBzcGVjaWZpYyBjaGFubmVsIChtdWx0aS1jaGFubmVsIG1vZGUgb25seSkgKi8KK3N0YXRpYyB2b2lkIG9oY2lfaXNvX3JlY3ZfY2hhbmdlX2NoYW5uZWwoc3RydWN0IGhwc2JfaXNvICppc28sIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwgaW50IGxpc3RlbikKK3sKKwlzdHJ1Y3Qgb2hjaV9pc29fcmVjdiAqcmVjdiA9IGlzby0+aG9zdGRhdGE7CisJaW50IHJlZywgaTsKKworCWlmIChjaGFubmVsIDwgMzIpIHsKKwkJcmVnID0gbGlzdGVuID8gT0hDSTEzOTRfSVJNdWx0aUNoYW5NYXNrTG9TZXQgOiBPSENJMTM5NF9JUk11bHRpQ2hhbk1hc2tMb0NsZWFyOworCQlpID0gY2hhbm5lbDsKKwl9IGVsc2UgeworCQlyZWcgPSBsaXN0ZW4gPyBPSENJMTM5NF9JUk11bHRpQ2hhbk1hc2tIaVNldCA6IE9IQ0kxMzk0X0lSTXVsdGlDaGFuTWFza0hpQ2xlYXI7CisJCWkgPSBjaGFubmVsIC0gMzI7CisJfQorCisJcmVnX3dyaXRlKHJlY3YtPm9oY2ksIHJlZywgKDEgPDwgaSkpOworCisJLyogaXNzdWUgYSBkdW1teSByZWFkIHRvIGZvcmNlIGFsbCBQQ0kgd3JpdGVzIHRvIGJlIHBvc3RlZCBpbW1lZGlhdGVseSAqLworCW1iKCk7CisJcmVnX3JlYWQocmVjdi0+b2hjaSwgT0hDSTEzOTRfSXNvY2hyb25vdXNDeWNsZVRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgb2hjaV9pc29fcmVjdl9zZXRfY2hhbm5lbF9tYXNrKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1NjQgbWFzaykKK3sKKwlzdHJ1Y3Qgb2hjaV9pc29fcmVjdiAqcmVjdiA9IGlzby0+aG9zdGRhdGE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQlpZiAobWFzayAmICgxVUxMIDw8IGkpKSB7CisJCQlpZiAoaSA8IDMyKQorCQkJCXJlZ193cml0ZShyZWN2LT5vaGNpLCBPSENJMTM5NF9JUk11bHRpQ2hhbk1hc2tMb1NldCwgKDEgPDwgaSkpOworCQkJZWxzZQorCQkJCXJlZ193cml0ZShyZWN2LT5vaGNpLCBPSENJMTM5NF9JUk11bHRpQ2hhbk1hc2tIaVNldCwgKDEgPDwgKGktMzIpKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoaSA8IDMyKQorCQkJCXJlZ193cml0ZShyZWN2LT5vaGNpLCBPSENJMTM5NF9JUk11bHRpQ2hhbk1hc2tMb0NsZWFyLCAoMSA8PCBpKSk7CisJCQllbHNlCisJCQkJcmVnX3dyaXRlKHJlY3YtPm9oY2ksIE9IQ0kxMzk0X0lSTXVsdGlDaGFuTWFza0hpQ2xlYXIsICgxIDw8IChpLTMyKSkpOworCQl9CisJfQorCisJLyogaXNzdWUgYSBkdW1teSByZWFkIHRvIGZvcmNlIGFsbCBQQ0kgd3JpdGVzIHRvIGJlIHBvc3RlZCBpbW1lZGlhdGVseSAqLworCW1iKCk7CisJcmVnX3JlYWQocmVjdi0+b2hjaSwgT0hDSTEzOTRfSXNvY2hyb25vdXNDeWNsZVRpbWVyKTsKK30KKworc3RhdGljIGludCBvaGNpX2lzb19yZWN2X3N0YXJ0KHN0cnVjdCBocHNiX2lzbyAqaXNvLCBpbnQgY3ljbGUsIGludCB0YWdfbWFzaywgaW50IHN5bmMpCit7CisJc3RydWN0IG9oY2lfaXNvX3JlY3YgKnJlY3YgPSBpc28tPmhvc3RkYXRhOworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0gcmVjdi0+b2hjaTsKKwl1MzIgY29tbWFuZCwgY29udGV4dE1hdGNoOworCisJcmVnX3dyaXRlKHJlY3YtPm9oY2ksIHJlY3YtPkNvbnRleHRDb250cm9sQ2xlYXIsIDB4RkZGRkZGRkYpOworCXdtYigpOworCisJLyogYWx3YXlzIGtlZXAgSVNPIGhlYWRlcnMgKi8KKwljb21tYW5kID0gKDEgPDwgMzApOworCisJaWYgKHJlY3YtPmRtYV9tb2RlID09IEJVRkZFUl9GSUxMX01PREUpCisJCWNvbW1hbmQgfD0gKDEgPDwgMzEpOworCisJcmVnX3dyaXRlKHJlY3YtPm9oY2ksIHJlY3YtPkNvbnRleHRDb250cm9sU2V0LCBjb21tYW5kKTsKKworCS8qIG1hdGNoIG9uIHNwZWNpZmllZCB0YWdzICovCisJY29udGV4dE1hdGNoID0gdGFnX21hc2sgPDwgMjg7CisKKwlpZiAoaXNvLT5jaGFubmVsID09IC0xKSB7CisJCS8qIGVuYWJsZSBtdWx0aWNoYW5uZWwgcmVjZXB0aW9uICovCisJCXJlZ193cml0ZShyZWN2LT5vaGNpLCByZWN2LT5Db250ZXh0Q29udHJvbFNldCwgKDEgPDwgMjgpKTsKKwl9IGVsc2UgeworCQkvKiBsaXN0ZW4gb24gY2hhbm5lbCAqLworCQljb250ZXh0TWF0Y2ggfD0gaXNvLT5jaGFubmVsOworCX0KKworCWlmIChjeWNsZSAhPSAtMSkgeworCQl1MzIgc2Vjb25kczsKKworCQkvKiBlbmFibGUgY3ljbGVNYXRjaCAqLworCQlyZWdfd3JpdGUocmVjdi0+b2hjaSwgcmVjdi0+Q29udGV4dENvbnRyb2xTZXQsICgxIDw8IDI5KSk7CisKKwkJLyogc2V0IHN0YXJ0aW5nIGN5Y2xlICovCisJCWN5Y2xlICY9IDB4MUZGRjsKKworCQkvKiAnY3ljbGUnIGlzIG9ubHkgbW9kIDgwMDAsIGJ1dCB3ZSBhbHNvIG5lZWQgdHdvICdzZWNvbmRzJyBiaXRzIC0KKwkJICAganVzdCBzbmFyZiB0aGVtIGZyb20gdGhlIGN1cnJlbnQgdGltZSAqLworCQlzZWNvbmRzID0gcmVnX3JlYWQocmVjdi0+b2hjaSwgT0hDSTEzOTRfSXNvY2hyb25vdXNDeWNsZVRpbWVyKSA+PiAyNTsKKworCQkvKiBhZHZhbmNlIG9uZSBzZWNvbmQgdG8gZ2l2ZSBzb21lIGV4dHJhIHRpbWUgZm9yIERNQSB0byBzdGFydCAqLworCQlzZWNvbmRzICs9IDE7CisKKwkJY3ljbGUgfD0gKHNlY29uZHMgJiAzKSA8PCAxMzsKKworCQljb250ZXh0TWF0Y2ggfD0gY3ljbGUgPDwgMTI7CisJfQorCisJaWYgKHN5bmMgIT0gLTEpIHsKKwkJLyogc2V0IHN5bmMgZmxhZyBvbiBmaXJzdCBETUEgZGVzY3JpcHRvciAqLworCQlzdHJ1Y3QgZG1hX2NtZCAqY21kID0gJnJlY3YtPmJsb2NrW3JlY3YtPmJsb2NrX2RtYV07CisJCWNtZC0+Y29udHJvbCB8PSBjcHVfdG9fbGUzMihETUFfQ1RMX1dBSVQpOworCisJCS8qIG1hdGNoIHN5bmMgZmllbGQgKi8KKwkJY29udGV4dE1hdGNoIHw9IChzeW5jJjB4Zik8PDg7CisJfQorCisJcmVnX3dyaXRlKHJlY3YtPm9oY2ksIHJlY3YtPkNvbnRleHRNYXRjaCwgY29udGV4dE1hdGNoKTsKKworCS8qIGFkZHJlc3Mgb2YgZmlyc3QgZGVzY3JpcHRvciBibG9jayAqLworCWNvbW1hbmQgPSBkbWFfcHJvZ19yZWdpb25fb2Zmc2V0X3RvX2J1cygmcmVjdi0+cHJvZywKKwkJCQkJCXJlY3YtPmJsb2NrX2RtYSAqIHNpemVvZihzdHJ1Y3QgZG1hX2NtZCkpOworCWNvbW1hbmQgfD0gMTsgLyogWj0xICovCisKKwlyZWdfd3JpdGUocmVjdi0+b2hjaSwgcmVjdi0+Q29tbWFuZFB0ciwgY29tbWFuZCk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCXJlZ193cml0ZShyZWN2LT5vaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50TWFza1NldCwgMSA8PCByZWN2LT50YXNrLmNvbnRleHQpOworCisJd21iKCk7CisKKwkvKiBydW4gKi8KKwlyZWdfd3JpdGUocmVjdi0+b2hjaSwgcmVjdi0+Q29udGV4dENvbnRyb2xTZXQsIDB4ODAwMCk7CisKKwkvKiBpc3N1ZSBhIGR1bW15IHJlYWQgb2YgdGhlIGN5Y2xlIHRpbWVyIHJlZ2lzdGVyIHRvIGZvcmNlCisJICAgYWxsIFBDSSB3cml0ZXMgdG8gYmUgcG9zdGVkIGltbWVkaWF0ZWx5ICovCisJbWIoKTsKKwlyZWdfcmVhZChyZWN2LT5vaGNpLCBPSENJMTM5NF9Jc29jaHJvbm91c0N5Y2xlVGltZXIpOworCisJLyogY2hlY2sgUlVOICovCisJaWYgKCEocmVnX3JlYWQocmVjdi0+b2hjaSwgcmVjdi0+Q29udGV4dENvbnRyb2xTZXQpICYgMHg4MDAwKSkgeworCQlQUklOVChLRVJOX0VSUiwKKwkJICAgICAgIkVycm9yIHN0YXJ0aW5nIElSIERNQSAoQ29udGV4dENvbnRyb2wgMHglMDh4KVxuIiwKKwkJICAgICAgcmVnX3JlYWQocmVjdi0+b2hjaSwgcmVjdi0+Q29udGV4dENvbnRyb2xTZXQpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvaGNpX2lzb19yZWN2X3JlbGVhc2VfYmxvY2soc3RydWN0IG9oY2lfaXNvX3JlY3YgKnJlY3YsIGludCBibG9jaykKK3sKKwkvKiByZS11c2UgdGhlIERNQSBkZXNjcmlwdG9yIGZvciB0aGUgYmxvY2sgKi8KKwkvKiBieSBsaW5raW5nIHRoZSBwcmV2aW91cyBkZXNjcmlwdG9yIHRvIGl0ICovCisKKwlpbnQgbmV4dF9pID0gYmxvY2s7CisJaW50IHByZXZfaSA9IChuZXh0X2kgPT0gMCkgPyAocmVjdi0+bmJsb2NrcyAtIDEpIDogKG5leHRfaSAtIDEpOworCisJc3RydWN0IGRtYV9jbWQgKm5leHQgPSAmcmVjdi0+YmxvY2tbbmV4dF9pXTsKKwlzdHJ1Y3QgZG1hX2NtZCAqcHJldiA9ICZyZWN2LT5ibG9ja1twcmV2X2ldOworCisJLyogJ25leHQnIGJlY29tZXMgdGhlIG5ldyBlbmQgb2YgdGhlIERNQSBjaGFpbiwKKwkgICBzbyBkaXNhYmxlIGJyYW5jaCBhbmQgZW5hYmxlIGludGVycnVwdCAqLworCW5leHQtPmJyYW5jaEFkZHJlc3MgPSAwOworCW5leHQtPmNvbnRyb2wgfD0gY3B1X3RvX2xlMzIoMyA8PCAyMCk7CisJbmV4dC0+c3RhdHVzID0gY3B1X3RvX2xlMzIocmVjdi0+YnVmX3N0cmlkZSk7CisKKwkvKiBsaW5rIHByZXYgdG8gbmV4dCAqLworCXByZXYtPmJyYW5jaEFkZHJlc3MgPSBjcHVfdG9fbGUzMihkbWFfcHJvZ19yZWdpb25fb2Zmc2V0X3RvX2J1cygmcmVjdi0+cHJvZywKKwkJCQkJCQkJCXNpemVvZihzdHJ1Y3QgZG1hX2NtZCkgKiBuZXh0X2kpCisJCQkJCSAgfCAxKTsgLyogWj0xICovCisKKwkvKiBkaXNhYmxlIGludGVycnVwdCBvbiBwcmV2aW91cyBETUEgZGVzY3JpcHRvciwgZXhjZXB0IGF0IGludGVydmFscyAqLworCWlmICgocHJldl9pICUgcmVjdi0+YmxvY2tfaXJxX2ludGVydmFsKSA9PSAwKSB7CisJCXByZXYtPmNvbnRyb2wgfD0gY3B1X3RvX2xlMzIoMyA8PCAyMCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwl9IGVsc2UgeworCQlwcmV2LT5jb250cm9sICY9IGNwdV90b19sZTMyKH4oMzw8MjApKTsgLyogZGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwl9CisJd21iKCk7CisKKwkvKiB3YWtlIHVwIERNQSBpbiBjYXNlIGl0IGZlbGwgYXNsZWVwICovCisJcmVnX3dyaXRlKHJlY3YtPm9oY2ksIHJlY3YtPkNvbnRleHRDb250cm9sU2V0LCAoMSA8PCAxMikpOworfQorCitzdGF0aWMgdm9pZCBvaGNpX2lzb19yZWN2X2J1ZmZlcmZpbGxfcmVsZWFzZShzdHJ1Y3Qgb2hjaV9pc29fcmVjdiAqcmVjdiwKKwkJCQkJICAgICBzdHJ1Y3QgaHBzYl9pc29fcGFja2V0X2luZm8gKmluZm8pCit7CisJaW50IGxlbjsKKworCS8qIHJlbGVhc2UgdGhlIG1lbW9yeSB3aGVyZSB0aGUgcGFja2V0IHdhcyAqLworCWxlbiA9IGluZm8tPmxlbjsKKworCS8qIGFkZCB0aGUgd2FzdGVkIHNwYWNlIGZvciBwYWRkaW5nIHRvIDQgYnl0ZXMgKi8KKwlpZiAobGVuICUgNCkKKwkJbGVuICs9IDQgLSAobGVuICUgNCk7CisKKwkvKiBhZGQgOCBieXRlcyBmb3IgdGhlIE9IQ0kgRE1BIGRhdGEgZm9ybWF0IG92ZXJoZWFkICovCisJbGVuICs9IDg7CisKKwlyZWN2LT5yZWxlYXNlZF9ieXRlcyArPSBsZW47CisKKwkvKiBoYXZlIHdlIHJlbGVhc2VkIGVub3VnaCBtZW1vcnkgZm9yIG9uZSBibG9jaz8gKi8KKwl3aGlsZSAocmVjdi0+cmVsZWFzZWRfYnl0ZXMgPiByZWN2LT5idWZfc3RyaWRlKSB7CisJCW9oY2lfaXNvX3JlY3ZfcmVsZWFzZV9ibG9jayhyZWN2LCByZWN2LT5ibG9ja19yZWFkZXIpOworCQlyZWN2LT5ibG9ja19yZWFkZXIgPSAocmVjdi0+YmxvY2tfcmVhZGVyICsgMSkgJSByZWN2LT5uYmxvY2tzOworCQlyZWN2LT5yZWxlYXNlZF9ieXRlcyAtPSByZWN2LT5idWZfc3RyaWRlOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG9oY2lfaXNvX3JlY3ZfcmVsZWFzZShzdHJ1Y3QgaHBzYl9pc28gKmlzbywgc3RydWN0IGhwc2JfaXNvX3BhY2tldF9pbmZvICppbmZvKQoreworCXN0cnVjdCBvaGNpX2lzb19yZWN2ICpyZWN2ID0gaXNvLT5ob3N0ZGF0YTsKKwlpZiAocmVjdi0+ZG1hX21vZGUgPT0gQlVGRkVSX0ZJTExfTU9ERSkgeworCQlvaGNpX2lzb19yZWN2X2J1ZmZlcmZpbGxfcmVsZWFzZShyZWN2LCBpbmZvKTsKKwl9IGVsc2UgeworCQlvaGNpX2lzb19yZWN2X3JlbGVhc2VfYmxvY2socmVjdiwgaW5mbyAtIGlzby0+aW5mb3MpOworCX0KK30KKworLyogcGFyc2UgYWxsIHBhY2tldHMgZnJvbSBibG9ja3MgdGhhdCBoYXZlIGJlZW4gZnVsbHkgcmVjZWl2ZWQgKi8KK3N0YXRpYyB2b2lkIG9oY2lfaXNvX3JlY3ZfYnVmZmVyZmlsbF9wYXJzZShzdHJ1Y3QgaHBzYl9pc28gKmlzbywgc3RydWN0IG9oY2lfaXNvX3JlY3YgKnJlY3YpCit7CisJaW50IHdha2UgPSAwOworCWludCBydW5hd2F5ID0gMDsKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IHJlY3YtPm9oY2k7CisKKwl3aGlsZSAoMSkgeworCQkvKiB3ZSBleHBlY3QgdGhlIG5leHQgcGFyc2FibGUgcGFja2V0IHRvIGJlZ2luIGF0IHJlY3YtPmRtYV9vZmZzZXQgKi8KKwkJLyogbm90ZTogcGFja2V0IGxheW91dCBpcyBhcyBzaG93biBpbiBzZWN0aW9uIDEwLjYuMS4xIG9mIHRoZSBPSENJIHNwZWMgKi8KKworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCQl1bnNpZ25lZCBzaG9ydCBsZW4sIGN5Y2xlOworCQl1bnNpZ25lZCBjaGFyIGNoYW5uZWwsIHRhZywgc3k7CisKKwkJdW5zaWduZWQgY2hhciAqcCA9IGlzby0+ZGF0YV9idWYua3ZpcnQ7CisKKwkJdW5zaWduZWQgaW50IHRoaXNfYmxvY2sgPSByZWN2LT5kbWFfb2Zmc2V0L3JlY3YtPmJ1Zl9zdHJpZGU7CisKKwkJLyogZG9uJ3QgbG9vcCBpbmRlZmluaXRlbHkgKi8KKwkJaWYgKHJ1bmF3YXkrKyA+IDEwMDAwMCkgeworCQkJYXRvbWljX2luYygmaXNvLT5vdmVyZmxvd3MpOworCQkJUFJJTlQoS0VSTl9FUlIsCisJCQkgICAgICAiSVIgRE1BIGVycm9yIC0gUnVuYXdheSBkdXJpbmcgYnVmZmVyIHBhcnNpbmchXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogc3RvcCBwYXJzaW5nIG9uY2Ugd2UgYXJyaXZlIGF0IGJsb2NrX2RtYSAoaS5lLiBkb24ndCBnZXQgYWhlYWQgb2YgRE1BKSAqLworCQlpZiAodGhpc19ibG9jayA9PSByZWN2LT5ibG9ja19kbWEpCisJCQlicmVhazsKKworCQl3YWtlID0gMTsKKworCQkvKiBwYXJzZSBkYXRhIGxlbmd0aCwgdGFnLCBjaGFubmVsLCBhbmQgc3kgKi8KKworCQkvKiBub3RlOiB3ZSBrZWVwIG91ciBvd24gbG9jYWwgY29waWVzIG9mICdsZW4nIGFuZCAnb2Zmc2V0JworCQkgICBzbyB0aGUgdXNlciBjYW4ndCBtZXNzIHdpdGggdGhlbSBieSBwb2tpbmcgaW4gdGhlIG1tYXAgYXJlYSAqLworCisJCWxlbiA9IHBbcmVjdi0+ZG1hX29mZnNldCsyXSB8IChwW3JlY3YtPmRtYV9vZmZzZXQrM10gPDwgOCk7CisKKwkJaWYgKGxlbiA+IDQwOTYpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLAorCQkJICAgICAgIklSIERNQSBlcnJvciAtIGJvZ3VzICdsZW4nIHZhbHVlICV1XG4iLCBsZW4pOworCQl9CisKKwkJY2hhbm5lbCA9IHBbcmVjdi0+ZG1hX29mZnNldCsxXSAmIDB4M0Y7CisJCXRhZyA9IHBbcmVjdi0+ZG1hX29mZnNldCsxXSA+PiA2OworCQlzeSA9IHBbcmVjdi0+ZG1hX29mZnNldCswXSAmIDB4RjsKKworCQkvKiBhZHZhbmNlIHRvIGRhdGEgcGF5bG9hZCAqLworCQlyZWN2LT5kbWFfb2Zmc2V0ICs9IDQ7CisKKwkJLyogY2hlY2sgZm9yIHdyYXAtYXJvdW5kICovCisJCWlmIChyZWN2LT5kbWFfb2Zmc2V0ID49IHJlY3YtPmJ1Zl9zdHJpZGUqcmVjdi0+bmJsb2NrcykgeworCQkJcmVjdi0+ZG1hX29mZnNldCAtPSByZWN2LT5idWZfc3RyaWRlKnJlY3YtPm5ibG9ja3M7CisJCX0KKworCQkvKiBkbWFfb2Zmc2V0IG5vdyBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGRhdGEgcGF5bG9hZCAqLworCQlvZmZzZXQgPSByZWN2LT5kbWFfb2Zmc2V0OworCisJCS8qIGFkdmFuY2UgdG8geGZlclN0YXR1cy90aW1lU3RhbXAgKi8KKwkJcmVjdi0+ZG1hX29mZnNldCArPSBsZW47CisKKwkJLyogcGF5bG9hZCBpcyBwYWRkZWQgdG8gNCBieXRlcyAqLworCQlpZiAobGVuICUgNCkgeworCQkJcmVjdi0+ZG1hX29mZnNldCArPSA0IC0gKGxlbiU0KTsKKwkJfQorCisJCS8qIGNoZWNrIGZvciB3cmFwLWFyb3VuZCAqLworCQlpZiAocmVjdi0+ZG1hX29mZnNldCA+PSByZWN2LT5idWZfc3RyaWRlKnJlY3YtPm5ibG9ja3MpIHsKKwkJCS8qIHVoIG9oLCB0aGUgcGFja2V0IGRhdGEgd3JhcHMgZnJvbSB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGZpcnN0IERNQSBibG9jayAtIG1ha2UgdGhlIHBhY2tldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGlndW91cyBieSBjb3B5aW5nIGl0cyAidGFpbCIgaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1YXJkIHBhZ2UgKi8KKworCQkJaW50IGd1YXJkX29mZiA9IHJlY3YtPmJ1Zl9zdHJpZGUqcmVjdi0+bmJsb2NrczsKKwkJCWludCB0YWlsX2xlbiA9IGxlbiAtIChndWFyZF9vZmYgLSBvZmZzZXQpOworCisJCQlpZiAodGFpbF9sZW4gPiAwICAmJiB0YWlsX2xlbiA8IHJlY3YtPmJ1Zl9zdHJpZGUpIHsKKwkJCQltZW1jcHkoaXNvLT5kYXRhX2J1Zi5rdmlydCArIGd1YXJkX29mZiwKKwkJCQkgICAgICAgaXNvLT5kYXRhX2J1Zi5rdmlydCwKKwkJCQkgICAgICAgdGFpbF9sZW4pOworCQkJfQorCisJCQlyZWN2LT5kbWFfb2Zmc2V0IC09IHJlY3YtPmJ1Zl9zdHJpZGUqcmVjdi0+bmJsb2NrczsKKwkJfQorCisJCS8qIHBhcnNlIHRpbWVzdGFtcCAqLworCQljeWNsZSA9IHBbcmVjdi0+ZG1hX29mZnNldCswXSB8IChwW3JlY3YtPmRtYV9vZmZzZXQrMV08PDgpOworCQljeWNsZSAmPSAweDFGRkY7CisKKwkJLyogYWR2YW5jZSB0byBuZXh0IHBhY2tldCAqLworCQlyZWN2LT5kbWFfb2Zmc2V0ICs9IDQ7CisKKwkJLyogY2hlY2sgZm9yIHdyYXAtYXJvdW5kICovCisJCWlmIChyZWN2LT5kbWFfb2Zmc2V0ID49IHJlY3YtPmJ1Zl9zdHJpZGUqcmVjdi0+bmJsb2NrcykgeworCQkJcmVjdi0+ZG1hX29mZnNldCAtPSByZWN2LT5idWZfc3RyaWRlKnJlY3YtPm5ibG9ja3M7CisJCX0KKworCQlocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQoaXNvLCBvZmZzZXQsIGxlbiwgY3ljbGUsIGNoYW5uZWwsIHRhZywgc3kpOworCX0KKworCWlmICh3YWtlKQorCQlocHNiX2lzb193YWtlKGlzbyk7Cit9CisKK3N0YXRpYyB2b2lkIG9oY2lfaXNvX3JlY3ZfYnVmZmVyZmlsbF90YXNrKHN0cnVjdCBocHNiX2lzbyAqaXNvLCBzdHJ1Y3Qgb2hjaV9pc29fcmVjdiAqcmVjdikKK3sKKwlpbnQgbG9vcDsKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IHJlY3YtPm9oY2k7CisKKwkvKiBsb29wIG92ZXIgYWxsIGJsb2NrcyAqLworCWZvciAobG9vcCA9IDA7IGxvb3AgPCByZWN2LT5uYmxvY2tzOyBsb29wKyspIHsKKworCQkvKiBjaGVjayBibG9ja19kbWEgdG8gc2VlIGlmIGl0J3MgZG9uZSAqLworCQlzdHJ1Y3QgZG1hX2NtZCAqaW0gPSAmcmVjdi0+YmxvY2tbcmVjdi0+YmxvY2tfZG1hXTsKKworCQkvKiBjaGVjayB0aGUgRE1BIGRlc2NyaXB0b3IgZm9yIG5ldyB3cml0ZXMgdG8geGZlclN0YXR1cyAqLworCQl1MTYgeGZlcnN0YXR1cyA9IGxlMzJfdG9fY3B1KGltLT5zdGF0dXMpID4+IDE2OworCisJCS8qIHJlc2NvdW50IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgKnJlbWFpbmluZyB0byBiZSB3cml0dGVuKiBpbiB0aGUgYmxvY2sgKi8KKwkJdTE2IHJlc2NvdW50ID0gbGUzMl90b19jcHUoaW0tPnN0YXR1cykgJiAweEZGRkY7CisKKwkJdW5zaWduZWQgY2hhciBldmVudCA9IHhmZXJzdGF0dXMgJiAweDFGOworCisJCWlmICghZXZlbnQpIHsKKwkJCS8qIG5vdGhpbmcgaGFzIGhhcHBlbmVkIHRvIHRoaXMgYmxvY2sgeWV0ICovCisJCQlicmVhazsKKwkJfQorCisJCWlmIChldmVudCAhPSAweDExKSB7CisJCQlhdG9taWNfaW5jKCZpc28tPm92ZXJmbG93cyk7CisJCQlQUklOVChLRVJOX0VSUiwKKwkJCSAgICAgICJJUiBETUEgZXJyb3IgLSBPSENJIGVycm9yIGNvZGUgMHglMDJ4XG4iLCBldmVudCk7CisJCX0KKworCQlpZiAocmVzY291bnQgIT0gMCkgeworCQkJLyogdGhlIGNhcmQgaXMgc3RpbGwgd3JpdGluZyB0byB0aGlzIGJsb2NrOworCQkJICAgd2UgY2FuJ3QgdG91Y2ggaXQgdW50aWwgaXQncyBkb25lICovCisJCQlicmVhazsKKwkJfQorCisJCS8qIE9LLCB0aGUgYmxvY2sgaXMgZmluaXNoZWQuLi4gKi8KKworCQkvKiBzeW5jIG91ciB2aWV3IG9mIHRoZSBibG9jayAqLworCQlkbWFfcmVnaW9uX3N5bmNfZm9yX2NwdSgmaXNvLT5kYXRhX2J1ZiwgcmVjdi0+YmxvY2tfZG1hKnJlY3YtPmJ1Zl9zdHJpZGUsIHJlY3YtPmJ1Zl9zdHJpZGUpOworCisJCS8qIHJlc2V0IHRoZSBETUEgZGVzY3JpcHRvciAqLworCQlpbS0+c3RhdHVzID0gcmVjdi0+YnVmX3N0cmlkZTsKKworCQkvKiBhZHZhbmNlIGJsb2NrX2RtYSAqLworCQlyZWN2LT5ibG9ja19kbWEgPSAocmVjdi0+YmxvY2tfZG1hICsgMSkgJSByZWN2LT5uYmxvY2tzOworCisJCWlmICgocmVjdi0+YmxvY2tfZG1hKzEpICUgcmVjdi0+bmJsb2NrcyA9PSByZWN2LT5ibG9ja19yZWFkZXIpIHsKKwkJCWF0b21pY19pbmMoJmlzby0+b3ZlcmZsb3dzKTsKKwkJCURCR01TRygiSVNPIHJlY2VwdGlvbiBvdmVyZmxvdyAtICIKKwkJCSAgICAgICAicmFuIG91dCBvZiBETUEgYmxvY2tzIik7CisJCX0KKwl9CisKKwkvKiBwYXJzZSBhbnkgcGFja2V0cyB0aGF0IGhhdmUgYXJyaXZlZCAqLworCW9oY2lfaXNvX3JlY3ZfYnVmZmVyZmlsbF9wYXJzZShpc28sIHJlY3YpOworfQorCitzdGF0aWMgdm9pZCBvaGNpX2lzb19yZWN2X3BhY2tldHBlcmJ1Zl90YXNrKHN0cnVjdCBocHNiX2lzbyAqaXNvLCBzdHJ1Y3Qgb2hjaV9pc29fcmVjdiAqcmVjdikKK3sKKwlpbnQgY291bnQ7CisJaW50IHdha2UgPSAwOworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0gcmVjdi0+b2hjaTsKKworCS8qIGxvb3Agb3ZlciB0aGUgZW50aXJlIGJ1ZmZlciAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHJlY3YtPm5ibG9ja3M7IGNvdW50KyspIHsKKwkJdTMyIHBhY2tldF9sZW4gPSAwOworCisJCS8qIHBvaW50ZXIgdG8gdGhlIERNQSBkZXNjcmlwdG9yICovCisJCXN0cnVjdCBkbWFfY21kICppbCA9ICgoc3RydWN0IGRtYV9jbWQqKSByZWN2LT5wcm9nLmt2aXJ0KSArIGlzby0+cGt0X2RtYTsKKworCQkvKiBjaGVjayB0aGUgRE1BIGRlc2NyaXB0b3IgZm9yIG5ldyB3cml0ZXMgdG8geGZlclN0YXR1cyAqLworCQl1MTYgeGZlcnN0YXR1cyA9IGxlMzJfdG9fY3B1KGlsLT5zdGF0dXMpID4+IDE2OworCQl1MTYgcmVzY291bnQgPSBsZTMyX3RvX2NwdShpbC0+c3RhdHVzKSAmIDB4RkZGRjsKKworCQl1bnNpZ25lZCBjaGFyIGV2ZW50ID0geGZlcnN0YXR1cyAmIDB4MUY7CisKKwkJaWYgKCFldmVudCkgeworCQkJLyogdGhpcyBwYWNrZXQgaGFzbid0IGNvbWUgaW4geWV0OyB3ZSBhcmUgZG9uZSBmb3Igbm93ICovCisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChldmVudCA9PSAweDExKSB7CisJCQkvKiBwYWNrZXQgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5ISAqLworCisJCQkvKiByZXNjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzICpyZW1haW5pbmcqIGluIHRoZSBwYWNrZXQgYnVmZmVyLAorCQkJICAgYWZ0ZXIgdGhlIHBhY2tldCB3YXMgd3JpdHRlbiAqLworCQkJcGFja2V0X2xlbiA9IHJlY3YtPmJ1Zl9zdHJpZGUgLSByZXNjb3VudDsKKworCQl9IGVsc2UgaWYgKGV2ZW50ID09IDB4MDIpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCAiSVIgRE1BIGVycm9yIC0gcGFja2V0IHRvbyBsb25nIGZvciBidWZmZXJcbiIpOworCQl9IGVsc2UgaWYgKGV2ZW50KSB7CisJCQlQUklOVChLRVJOX0VSUiwgIklSIERNQSBlcnJvciAtIE9IQ0kgZXJyb3IgY29kZSAweCUwMnhcbiIsIGV2ZW50KTsKKwkJfQorCisJCS8qIHN5bmMgb3VyIHZpZXcgb2YgdGhlIGJ1ZmZlciAqLworCQlkbWFfcmVnaW9uX3N5bmNfZm9yX2NwdSgmaXNvLT5kYXRhX2J1ZiwgaXNvLT5wa3RfZG1hICogcmVjdi0+YnVmX3N0cmlkZSwgcmVjdi0+YnVmX3N0cmlkZSk7CisKKwkJLyogcmVjb3JkIHRoZSBwZXItcGFja2V0IGluZm8gKi8KKwkJeworCQkJLyogaXNvIGhlYWRlciBpcyA4IGJ5dGVzIGFoZWFkIG9mIHRoZSBkYXRhIHBheWxvYWQgKi8KKwkJCXVuc2lnbmVkIGNoYXIgKmhkcjsKKworCQkJdW5zaWduZWQgaW50IG9mZnNldDsKKwkJCXVuc2lnbmVkIHNob3J0IGN5Y2xlOworCQkJdW5zaWduZWQgY2hhciBjaGFubmVsLCB0YWcsIHN5OworCisJCQlvZmZzZXQgPSBpc28tPnBrdF9kbWEgKiByZWN2LT5idWZfc3RyaWRlOworCQkJaGRyID0gaXNvLT5kYXRhX2J1Zi5rdmlydCArIG9mZnNldDsKKworCQkJLyogc2tpcCBpc28gaGVhZGVyICovCisJCQlvZmZzZXQgKz0gODsKKwkJCXBhY2tldF9sZW4gLT0gODsKKworCQkJY3ljbGUgPSAoaGRyWzBdIHwgKGhkclsxXSA8PCA4KSkgJiAweDFGRkY7CisJCQljaGFubmVsID0gaGRyWzVdICYgMHgzRjsKKwkJCXRhZyA9IGhkcls1XSA+PiA2OworCQkJc3kgPSBoZHJbNF0gJiAweEY7CisKKwkJCWhwc2JfaXNvX3BhY2tldF9yZWNlaXZlZChpc28sIG9mZnNldCwgcGFja2V0X2xlbiwgY3ljbGUsIGNoYW5uZWwsIHRhZywgc3kpOworCQl9CisKKwkJLyogcmVzZXQgdGhlIERNQSBkZXNjcmlwdG9yICovCisJCWlsLT5zdGF0dXMgPSByZWN2LT5idWZfc3RyaWRlOworCisJCXdha2UgPSAxOworCQlyZWN2LT5ibG9ja19kbWEgPSBpc28tPnBrdF9kbWE7CisJfQorCitvdXQ6CisJaWYgKHdha2UpCisJCWhwc2JfaXNvX3dha2UoaXNvKTsKK30KKworc3RhdGljIHZvaWQgb2hjaV9pc29fcmVjdl90YXNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaHBzYl9pc28gKmlzbyA9IChzdHJ1Y3QgaHBzYl9pc28qKSBkYXRhOworCXN0cnVjdCBvaGNpX2lzb19yZWN2ICpyZWN2ID0gaXNvLT5ob3N0ZGF0YTsKKworCWlmIChyZWN2LT5kbWFfbW9kZSA9PSBCVUZGRVJfRklMTF9NT0RFKQorCQlvaGNpX2lzb19yZWN2X2J1ZmZlcmZpbGxfdGFzayhpc28sIHJlY3YpOworCWVsc2UKKwkJb2hjaV9pc29fcmVjdl9wYWNrZXRwZXJidWZfdGFzayhpc28sIHJlY3YpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJhd2lzbyBJU08gdHJhbnNtaXNzaW9uICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgb2hjaV9pc29feG1pdCB7CisJc3RydWN0IHRpX29oY2kgKm9oY2k7CisJc3RydWN0IGRtYV9wcm9nX3JlZ2lvbiBwcm9nOworCXN0cnVjdCBvaGNpMTM5NF9pc29fdGFza2xldCB0YXNrOworCWludCB0YXNrX2FjdGl2ZTsKKworCXUzMiBDb250ZXh0Q29udHJvbFNldDsKKwl1MzIgQ29udGV4dENvbnRyb2xDbGVhcjsKKwl1MzIgQ29tbWFuZFB0cjsKK307CisKKy8qIHRyYW5zbWlzc2lvbiBETUEgcHJvZ3JhbToKKyAgIG9uZSBPVVRQVVRfTU9SRV9JTU1FRElBVEUgZm9yIHRoZSBJVCBoZWFkZXIKKyAgIG9uZSBPVVRQVVRfTEFTVCBmb3IgdGhlIGJ1ZmZlciBkYXRhICovCisKK3N0cnVjdCBpc29feG1pdF9jbWQgeworCXN0cnVjdCBkbWFfY21kIG91dHB1dF9tb3JlX2ltbWVkaWF0ZTsKKwl1OCBpc29faGRyWzhdOworCXUzMiB1bnVzZWRbMl07CisJc3RydWN0IGRtYV9jbWQgb3V0cHV0X2xhc3Q7Cit9OworCitzdGF0aWMgaW50IG9oY2lfaXNvX3htaXRfaW5pdChzdHJ1Y3QgaHBzYl9pc28gKmlzbyk7CitzdGF0aWMgaW50IG9oY2lfaXNvX3htaXRfc3RhcnQoc3RydWN0IGhwc2JfaXNvICppc28sIGludCBjeWNsZSk7CitzdGF0aWMgdm9pZCBvaGNpX2lzb194bWl0X3NodXRkb3duKHN0cnVjdCBocHNiX2lzbyAqaXNvKTsKK3N0YXRpYyB2b2lkIG9oY2lfaXNvX3htaXRfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpOworCitzdGF0aWMgaW50IG9oY2lfaXNvX3htaXRfaW5pdChzdHJ1Y3QgaHBzYl9pc28gKmlzbykKK3sKKwlzdHJ1Y3Qgb2hjaV9pc29feG1pdCAqeG1pdDsKKwl1bnNpZ25lZCBpbnQgcHJvZ19zaXplOworCWludCBjdHg7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwl4bWl0ID0ga21hbGxvYyhzaXplb2YoKnhtaXQpLCBTTEFCX0tFUk5FTCk7CisJaWYgKCF4bWl0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlzby0+aG9zdGRhdGEgPSB4bWl0OworCXhtaXQtPm9oY2kgPSBpc28tPmhvc3QtPmhvc3RkYXRhOworCXhtaXQtPnRhc2tfYWN0aXZlID0gMDsKKworCWRtYV9wcm9nX3JlZ2lvbl9pbml0KCZ4bWl0LT5wcm9nKTsKKworCXByb2dfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXNvX3htaXRfY21kKSAqIGlzby0+YnVmX3BhY2tldHM7CisKKwlpZiAoZG1hX3Byb2dfcmVnaW9uX2FsbG9jKCZ4bWl0LT5wcm9nLCBwcm9nX3NpemUsIHhtaXQtPm9oY2ktPmRldikpCisJCWdvdG8gZXJyOworCisJb2hjaTEzOTRfaW5pdF9pc29fdGFza2xldCgmeG1pdC0+dGFzaywgT0hDSV9JU09fVFJBTlNNSVQsCisJCQkJICBvaGNpX2lzb194bWl0X3Rhc2ssICh1bnNpZ25lZCBsb25nKSBpc28pOworCisJaWYgKG9oY2kxMzk0X3JlZ2lzdGVyX2lzb190YXNrbGV0KHhtaXQtPm9oY2ksICZ4bWl0LT50YXNrKSA8IDApCisJCWdvdG8gZXJyOworCisJeG1pdC0+dGFza19hY3RpdmUgPSAxOworCisJLyogeG1pdCBjb250ZXh0IHJlZ2lzdGVycyBhcmUgc3BhY2VkIDE2IGJ5dGVzIGFwYXJ0ICovCisJY3R4ID0geG1pdC0+dGFzay5jb250ZXh0OworCXhtaXQtPkNvbnRleHRDb250cm9sU2V0ID0gT0hDSTEzOTRfSXNvWG1pdENvbnRleHRDb250cm9sU2V0ICsgMTYgKiBjdHg7CisJeG1pdC0+Q29udGV4dENvbnRyb2xDbGVhciA9IE9IQ0kxMzk0X0lzb1htaXRDb250ZXh0Q29udHJvbENsZWFyICsgMTYgKiBjdHg7CisJeG1pdC0+Q29tbWFuZFB0ciA9IE9IQ0kxMzk0X0lzb1htaXRDb21tYW5kUHRyICsgMTYgKiBjdHg7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCW9oY2lfaXNvX3htaXRfc2h1dGRvd24oaXNvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBvaGNpX2lzb194bWl0X3N0b3Aoc3RydWN0IGhwc2JfaXNvICppc28pCit7CisJc3RydWN0IG9oY2lfaXNvX3htaXQgKnhtaXQgPSBpc28tPmhvc3RkYXRhOworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0geG1pdC0+b2hjaTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXJlZ193cml0ZSh4bWl0LT5vaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza0NsZWFyLCAxIDw8IHhtaXQtPnRhc2suY29udGV4dCk7CisKKwkvKiBoYWx0IERNQSAqLworCWlmIChvaGNpMTM5NF9zdG9wX2NvbnRleHQoeG1pdC0+b2hjaSwgeG1pdC0+Q29udGV4dENvbnRyb2xDbGVhciwgTlVMTCkpIHsKKwkJLyogWFhYIHRoZSBETUEgY29udGV4dCB3aWxsIGxvY2sgdXAgaWYgeW91IHRyeSB0byBzZW5kIHRvbyBtdWNoIGRhdGEhICovCisJCVBSSU5UKEtFUk5fRVJSLAorCQkgICAgICAieW91IHByb2JhYmx5IGV4Y2VlZGVkIHRoZSBPSENJIGNhcmQncyBiYW5kd2lkdGggbGltaXQgLSAiCisJCSAgICAgICJyZWxvYWQgdGhlIG1vZHVsZSBhbmQgcmVkdWNlIHhtaXQgYmFuZHdpZHRoIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBvaGNpX2lzb194bWl0X3NodXRkb3duKHN0cnVjdCBocHNiX2lzbyAqaXNvKQoreworCXN0cnVjdCBvaGNpX2lzb194bWl0ICp4bWl0ID0gaXNvLT5ob3N0ZGF0YTsKKworCWlmICh4bWl0LT50YXNrX2FjdGl2ZSkgeworCQlvaGNpX2lzb194bWl0X3N0b3AoaXNvKTsKKwkJb2hjaTEzOTRfdW5yZWdpc3Rlcl9pc29fdGFza2xldCh4bWl0LT5vaGNpLCAmeG1pdC0+dGFzayk7CisJCXhtaXQtPnRhc2tfYWN0aXZlID0gMDsKKwl9CisKKwlkbWFfcHJvZ19yZWdpb25fZnJlZSgmeG1pdC0+cHJvZyk7CisJa2ZyZWUoeG1pdCk7CisJaXNvLT5ob3N0ZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG9oY2lfaXNvX3htaXRfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGhwc2JfaXNvICppc28gPSAoc3RydWN0IGhwc2JfaXNvKikgZGF0YTsKKwlzdHJ1Y3Qgb2hjaV9pc29feG1pdCAqeG1pdCA9IGlzby0+aG9zdGRhdGE7CisJc3RydWN0IHRpX29oY2kgKm9oY2kgPSB4bWl0LT5vaGNpOworCWludCB3YWtlID0gMDsKKwlpbnQgY291bnQ7CisKKwkvKiBjaGVjayB0aGUgd2hvbGUgYnVmZmVyIGlmIG5lY2Vzc2FyeSwgc3RhcnRpbmcgYXQgcGt0X2RtYSAqLworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGlzby0+YnVmX3BhY2tldHM7IGNvdW50KyspIHsKKwkJaW50IGN5Y2xlOworCisJCS8qIERNQSBkZXNjcmlwdG9yICovCisJCXN0cnVjdCBpc29feG1pdF9jbWQgKmNtZCA9IGRtYV9yZWdpb25faSgmeG1pdC0+cHJvZywgc3RydWN0IGlzb194bWl0X2NtZCwgaXNvLT5wa3RfZG1hKTsKKworCQkvKiBjaGVjayBmb3IgbmV3IHdyaXRlcyB0byB4ZmVyU3RhdHVzICovCisJCXUxNiB4ZmVyc3RhdHVzID0gbGUzMl90b19jcHUoY21kLT5vdXRwdXRfbGFzdC5zdGF0dXMpID4+IDE2OworCQl1OCAgZXZlbnQgPSB4ZmVyc3RhdHVzICYgMHgxRjsKKworCQlpZiAoIWV2ZW50KSB7CisJCQkvKiBwYWNrZXQgaGFzbid0IGJlZW4gc2VudCB5ZXQ7IHdlIGFyZSBkb25lIGZvciBub3cgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGV2ZW50ICE9IDB4MTEpCisJCQlQUklOVChLRVJOX0VSUiwKKwkJCSAgICAgICJJVCBETUEgZXJyb3IgLSBPSENJIGVycm9yIGNvZGUgMHglMDJ4XG4iLCBldmVudCk7CisKKwkJLyogYXQgbGVhc3Qgb25lIHBhY2tldCB3ZW50IG91dCwgc28gd2FrZSB1cCB0aGUgd3JpdGVyICovCisJCXdha2UgPSAxOworCisJCS8qIHBhcnNlIGN5Y2xlICovCisJCWN5Y2xlID0gbGUzMl90b19jcHUoY21kLT5vdXRwdXRfbGFzdC5zdGF0dXMpICYgMHgxRkZGOworCisJCS8qIHRlbGwgdGhlIHN1YnN5c3RlbSB0aGUgcGFja2V0IGhhcyBnb25lIG91dCAqLworCQlocHNiX2lzb19wYWNrZXRfc2VudChpc28sIGN5Y2xlLCBldmVudCAhPSAweDExKTsKKworCQkvKiByZXNldCB0aGUgRE1BIGRlc2NyaXB0b3IgZm9yIG5leHQgdGltZSAqLworCQljbWQtPm91dHB1dF9sYXN0LnN0YXR1cyA9IDA7CisJfQorCisJaWYgKHdha2UpCisJCWhwc2JfaXNvX3dha2UoaXNvKTsKK30KKworc3RhdGljIGludCBvaGNpX2lzb194bWl0X3F1ZXVlKHN0cnVjdCBocHNiX2lzbyAqaXNvLCBzdHJ1Y3QgaHBzYl9pc29fcGFja2V0X2luZm8gKmluZm8pCit7CisJc3RydWN0IG9oY2lfaXNvX3htaXQgKnhtaXQgPSBpc28tPmhvc3RkYXRhOworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0geG1pdC0+b2hjaTsKKworCWludCBuZXh0X2ksIHByZXZfaTsKKwlzdHJ1Y3QgaXNvX3htaXRfY21kICpuZXh0LCAqcHJldjsKKworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQgbGVuOworCXVuc2lnbmVkIGNoYXIgdGFnLCBzeTsKKworCS8qIGNoZWNrIHRoYXQgdGhlIHBhY2tldCBkb2Vzbid0IGNyb3NzIGEgcGFnZSBib3VuZGFyeQorCSAgICh3ZSBjb3VsZCBhbGxvdyB0aGlzIGlmIHdlIGFkZGVkIE9VVFBVVF9NT1JFIGRlc2NyaXB0b3Igc3VwcG9ydCkgKi8KKwlpZiAoY3Jvc3NfYm91bmQoaW5mby0+b2Zmc2V0LCBpbmZvLT5sZW4pKSB7CisJCVBSSU5UKEtFUk5fRVJSLAorCQkgICAgICAicmF3aXNvIHhtaXQ6IHBhY2tldCAldSBjcm9zc2VzIGEgcGFnZSBib3VuZGFyeSIsCisJCSAgICAgIGlzby0+Zmlyc3RfcGFja2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb2Zmc2V0ID0gaW5mby0+b2Zmc2V0OworCWxlbiA9IGluZm8tPmxlbjsKKwl0YWcgPSBpbmZvLT50YWc7CisJc3kgPSBpbmZvLT5zeTsKKworCS8qIHN5bmMgdXAgdGhlIGNhcmQncyB2aWV3IG9mIHRoZSBidWZmZXIgKi8KKwlkbWFfcmVnaW9uX3N5bmNfZm9yX2RldmljZSgmaXNvLT5kYXRhX2J1Ziwgb2Zmc2V0LCBsZW4pOworCisJLyogYXBwZW5kIGZpcnN0X3BhY2tldCB0byB0aGUgRE1BIGNoYWluICovCisJLyogYnkgbGlua2luZyB0aGUgcHJldmlvdXMgZGVzY3JpcHRvciB0byBpdCAqLworCS8qIChuZXh0IHdpbGwgYmVjb21lIHRoZSBuZXcgZW5kIG9mIHRoZSBETUEgY2hhaW4pICovCisKKwluZXh0X2kgPSBpc28tPmZpcnN0X3BhY2tldDsKKwlwcmV2X2kgPSAobmV4dF9pID09IDApID8gKGlzby0+YnVmX3BhY2tldHMgLSAxKSA6IChuZXh0X2kgLSAxKTsKKworCW5leHQgPSBkbWFfcmVnaW9uX2koJnhtaXQtPnByb2csIHN0cnVjdCBpc29feG1pdF9jbWQsIG5leHRfaSk7CisJcHJldiA9IGRtYV9yZWdpb25faSgmeG1pdC0+cHJvZywgc3RydWN0IGlzb194bWl0X2NtZCwgcHJldl9pKTsKKworCS8qIHNldCB1cCB0aGUgT1VUUFVUX01PUkVfSU1NRURJQVRFIGRlc2NyaXB0b3IgKi8KKwltZW1zZXQobmV4dCwgMCwgc2l6ZW9mKHN0cnVjdCBpc29feG1pdF9jbWQpKTsKKwluZXh0LT5vdXRwdXRfbW9yZV9pbW1lZGlhdGUuY29udHJvbCA9IGNwdV90b19sZTMyKDB4MDIwMDAwMDgpOworCisJLyogSVNPIHBhY2tldCBoZWFkZXIgaXMgZW1iZWRkZWQgaW4gdGhlIE9VVFBVVF9NT1JFX0lNTUVESUFURSAqLworCisJLyogdGNvZGUgPSAweEEsIGFuZCBzeSAqLworCW5leHQtPmlzb19oZHJbMF0gPSAweEEwIHwgKHN5ICYgMHhGKTsKKworCS8qIHRhZyBhbmQgY2hhbm5lbCBudW1iZXIgKi8KKwluZXh0LT5pc29faGRyWzFdID0gKHRhZyA8PCA2KSB8IChpc28tPmNoYW5uZWwgJiAweDNGKTsKKworCS8qIHRyYW5zbWlzc2lvbiBzcGVlZCAqLworCW5leHQtPmlzb19oZHJbMl0gPSBpc28tPnNwZWVkICYgMHg3OworCisJLyogcGF5bG9hZCBzaXplICovCisJbmV4dC0+aXNvX2hkcls2XSA9IGxlbiAmIDB4RkY7CisJbmV4dC0+aXNvX2hkcls3XSA9IGxlbiA+PiA4OworCisJLyogc2V0IHVwIHRoZSBPVVRQVVRfTEFTVCAqLworCW5leHQtPm91dHB1dF9sYXN0LmNvbnRyb2wgPSBjcHVfdG9fbGUzMigxIDw8IDI4KTsKKwluZXh0LT5vdXRwdXRfbGFzdC5jb250cm9sIHw9IGNwdV90b19sZTMyKDEgPDwgMjcpOyAvKiB1cGRhdGUgdGltZVN0YW1wICovCisJbmV4dC0+b3V0cHV0X2xhc3QuY29udHJvbCB8PSBjcHVfdG9fbGUzMigzIDw8IDIwKTsgLyogd2FudCBpbnRlcnJ1cHQgKi8KKwluZXh0LT5vdXRwdXRfbGFzdC5jb250cm9sIHw9IGNwdV90b19sZTMyKDMgPDwgMTgpOyAvKiBlbmFibGUgYnJhbmNoICovCisJbmV4dC0+b3V0cHV0X2xhc3QuY29udHJvbCB8PSBjcHVfdG9fbGUzMihsZW4pOworCisJLyogcGF5bG9hZCBidXMgYWRkcmVzcyAqLworCW5leHQtPm91dHB1dF9sYXN0LmFkZHJlc3MgPSBjcHVfdG9fbGUzMihkbWFfcmVnaW9uX29mZnNldF90b19idXMoJmlzby0+ZGF0YV9idWYsIG9mZnNldCkpOworCisJLyogbGVhdmUgYnJhbmNoQWRkcmVzcyBhdCB6ZXJvIGZvciBub3cgKi8KKworCS8qIHJlLXdyaXRlIHRoZSBwcmV2aW91cyBETUEgZGVzY3JpcHRvciB0byBjaGFpbiB0byB0aGlzIG9uZSAqLworCisJLyogc2V0IHByZXYgYnJhbmNoIGFkZHJlc3MgdG8gcG9pbnQgdG8gbmV4dCAoWj0zKSAqLworCXByZXYtPm91dHB1dF9sYXN0LmJyYW5jaEFkZHJlc3MgPSBjcHVfdG9fbGUzMigKKwkJZG1hX3Byb2dfcmVnaW9uX29mZnNldF90b19idXMoJnhtaXQtPnByb2csIHNpemVvZihzdHJ1Y3QgaXNvX3htaXRfY21kKSAqIG5leHRfaSkgfCAzKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0LCB1bmxlc3MgcmVxdWlyZWQgYnkgdGhlIElSUSBpbnRlcnZhbCAqLworCWlmIChwcmV2X2kgJSBpc28tPmlycV9pbnRlcnZhbCkgeworCQlwcmV2LT5vdXRwdXRfbGFzdC5jb250cm9sICY9IGNwdV90b19sZTMyKH4oMyA8PCAyMCkpOyAvKiBubyBpbnRlcnJ1cHQgKi8KKwl9IGVsc2UgeworCQlwcmV2LT5vdXRwdXRfbGFzdC5jb250cm9sIHw9IGNwdV90b19sZTMyKDMgPDwgMjApOyAvKiBlbmFibGUgaW50ZXJydXB0ICovCisJfQorCisJd21iKCk7CisKKwkvKiB3YWtlIERNQSBpbiBjYXNlIGl0IGlzIHNsZWVwaW5nICovCisJcmVnX3dyaXRlKHhtaXQtPm9oY2ksIHhtaXQtPkNvbnRleHRDb250cm9sU2V0LCAxIDw8IDEyKTsKKworCS8qIGlzc3VlIGEgZHVtbXkgcmVhZCBvZiB0aGUgY3ljbGUgdGltZXIgdG8gZm9yY2UgYWxsIFBDSQorCSAgIHdyaXRlcyB0byBiZSBwb3N0ZWQgaW1tZWRpYXRlbHkgKi8KKwltYigpOworCXJlZ19yZWFkKHhtaXQtPm9oY2ksIE9IQ0kxMzk0X0lzb2Nocm9ub3VzQ3ljbGVUaW1lcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvaGNpX2lzb194bWl0X3N0YXJ0KHN0cnVjdCBocHNiX2lzbyAqaXNvLCBpbnQgY3ljbGUpCit7CisJc3RydWN0IG9oY2lfaXNvX3htaXQgKnhtaXQgPSBpc28tPmhvc3RkYXRhOworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0geG1pdC0+b2hjaTsKKworCS8qIGNsZWFyIG91dCB0aGUgY29udHJvbCByZWdpc3RlciAqLworCXJlZ193cml0ZSh4bWl0LT5vaGNpLCB4bWl0LT5Db250ZXh0Q29udHJvbENsZWFyLCAweEZGRkZGRkZGKTsKKwl3bWIoKTsKKworCS8qIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBmaXJzdCBkZXNjcmlwdG9yIGJsb2NrIChaPTMpICovCisJcmVnX3dyaXRlKHhtaXQtPm9oY2ksIHhtaXQtPkNvbW1hbmRQdHIsCisJCSAgZG1hX3Byb2dfcmVnaW9uX29mZnNldF90b19idXMoJnhtaXQtPnByb2csIGlzby0+cGt0X2RtYSAqIHNpemVvZihzdHJ1Y3QgaXNvX3htaXRfY21kKSkgfCAzKTsKKworCS8qIGN5Y2xlIG1hdGNoICovCisJaWYgKGN5Y2xlICE9IC0xKSB7CisJCXUzMiBzdGFydCA9IGN5Y2xlICYgMHgxRkZGOworCisJCS8qICdjeWNsZScgaXMgb25seSBtb2QgODAwMCwgYnV0IHdlIGFsc28gbmVlZCB0d28gJ3NlY29uZHMnIGJpdHMgLQorCQkgICBqdXN0IHNuYXJmIHRoZW0gZnJvbSB0aGUgY3VycmVudCB0aW1lICovCisJCXUzMiBzZWNvbmRzID0gcmVnX3JlYWQoeG1pdC0+b2hjaSwgT0hDSTEzOTRfSXNvY2hyb25vdXNDeWNsZVRpbWVyKSA+PiAyNTsKKworCQkvKiBhZHZhbmNlIG9uZSBzZWNvbmQgdG8gZ2l2ZSBzb21lIGV4dHJhIHRpbWUgZm9yIERNQSB0byBzdGFydCAqLworCQlzZWNvbmRzICs9IDE7CisKKwkJc3RhcnQgfD0gKHNlY29uZHMgJiAzKSA8PCAxMzsKKworCQlyZWdfd3JpdGUoeG1pdC0+b2hjaSwgeG1pdC0+Q29udGV4dENvbnRyb2xTZXQsIDB4ODAwMDAwMDAgfCAoc3RhcnQgPDwgMTYpKTsKKwl9CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCXJlZ193cml0ZSh4bWl0LT5vaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza1NldCwgMSA8PCB4bWl0LT50YXNrLmNvbnRleHQpOworCisJLyogcnVuICovCisJcmVnX3dyaXRlKHhtaXQtPm9oY2ksIHhtaXQtPkNvbnRleHRDb250cm9sU2V0LCAweDgwMDApOworCW1iKCk7CisKKwkvKiB3YWl0IDEwMCB1c2VjIHRvIGdpdmUgdGhlIGNhcmQgdGltZSB0byBnbyBhY3RpdmUgKi8KKwl1ZGVsYXkoMTAwKTsKKworCS8qIGNoZWNrIHRoZSBSVU4gYml0ICovCisJaWYgKCEocmVnX3JlYWQoeG1pdC0+b2hjaSwgeG1pdC0+Q29udGV4dENvbnRyb2xTZXQpICYgMHg4MDAwKSkgeworCQlQUklOVChLRVJOX0VSUiwgIkVycm9yIHN0YXJ0aW5nIElUIERNQSAoQ29udGV4dENvbnRyb2wgMHglMDh4KVxuIiwKKwkJICAgICAgcmVnX3JlYWQoeG1pdC0+b2hjaSwgeG1pdC0+Q29udGV4dENvbnRyb2xTZXQpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9oY2lfaXNvY3RsKHN0cnVjdCBocHNiX2lzbyAqaXNvLCBlbnVtIGlzb2N0bF9jbWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFhNSVRfSU5JVDoKKwkJcmV0dXJuIG9oY2lfaXNvX3htaXRfaW5pdChpc28pOworCWNhc2UgWE1JVF9TVEFSVDoKKwkJcmV0dXJuIG9oY2lfaXNvX3htaXRfc3RhcnQoaXNvLCBhcmcpOworCWNhc2UgWE1JVF9TVE9QOgorCQlvaGNpX2lzb194bWl0X3N0b3AoaXNvKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBYTUlUX1FVRVVFOgorCQlyZXR1cm4gb2hjaV9pc29feG1pdF9xdWV1ZShpc28sIChzdHJ1Y3QgaHBzYl9pc29fcGFja2V0X2luZm8qKSBhcmcpOworCWNhc2UgWE1JVF9TSFVURE9XTjoKKwkJb2hjaV9pc29feG1pdF9zaHV0ZG93bihpc28pOworCQlyZXR1cm4gMDsKKworCWNhc2UgUkVDVl9JTklUOgorCQlyZXR1cm4gb2hjaV9pc29fcmVjdl9pbml0KGlzbyk7CisJY2FzZSBSRUNWX1NUQVJUOiB7CisJCWludCAqYXJncyA9IChpbnQqKSBhcmc7CisJCXJldHVybiBvaGNpX2lzb19yZWN2X3N0YXJ0KGlzbywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisJfQorCWNhc2UgUkVDVl9TVE9QOgorCQlvaGNpX2lzb19yZWN2X3N0b3AoaXNvKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBSRUNWX1JFTEVBU0U6CisJCW9oY2lfaXNvX3JlY3ZfcmVsZWFzZShpc28sIChzdHJ1Y3QgaHBzYl9pc29fcGFja2V0X2luZm8qKSBhcmcpOworCQlyZXR1cm4gMDsKKwljYXNlIFJFQ1ZfRkxVU0g6CisJCW9oY2lfaXNvX3JlY3ZfdGFzaygodW5zaWduZWQgbG9uZykgaXNvKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBSRUNWX1NIVVRET1dOOgorCQlvaGNpX2lzb19yZWN2X3NodXRkb3duKGlzbyk7CisJCXJldHVybiAwOworCWNhc2UgUkVDVl9MSVNURU5fQ0hBTk5FTDoKKwkJb2hjaV9pc29fcmVjdl9jaGFuZ2VfY2hhbm5lbChpc28sIGFyZywgMSk7CisJCXJldHVybiAwOworCWNhc2UgUkVDVl9VTkxJU1RFTl9DSEFOTkVMOgorCQlvaGNpX2lzb19yZWN2X2NoYW5nZV9jaGFubmVsKGlzbywgYXJnLCAwKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBSRUNWX1NFVF9DSEFOTkVMX01BU0s6CisJCW9oY2lfaXNvX3JlY3Zfc2V0X2NoYW5uZWxfbWFzayhpc28sICooKHU2NCopIGFyZykpOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCVBSSU5UX0coS0VSTl9FUlIsICJvaGNpX2lzb2N0bCBjbWQgJWQgbm90IGltcGxlbWVudGVkIHlldCIsCisJCQljbWQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElFRUUtMTM5NCBmdW5jdGlvbmFsaXR5IHNlY3Rpb24gRU5EICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHbG9iYWwgc3R1ZmYgKGludGVycnVwdCBoYW5kbGVyLCBpbml0L3NodXRkb3duIGNvZGUpICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZG1hX3RybV9yZXNldChzdHJ1Y3QgZG1hX3RybV9jdHggKmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlMSVNUX0hFQUQocGFja2V0X2xpc3QpOworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0gZC0+b2hjaTsKKwlzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldCwgKnB0bXA7CisKKwlvaGNpMTM5NF9zdG9wX2NvbnRleHQob2hjaSwgZC0+Y3RybENsZWFyLCBOVUxMKTsKKworCS8qIExvY2sgdGhlIGNvbnRleHQsIHJlc2V0IGl0IGFuZCByZWxlYXNlIGl0LiBNb3ZlIHRoZSBwYWNrZXRzCisJICogdGhhdCB3ZXJlIHBlbmRpbmcgaW4gdGhlIGNvbnRleHQgdG8gcGFja2V0X2xpc3QgYW5kIGZyZWUKKwkgKiB0aGVtIGFmdGVyIHJlbGVhc2luZyB0aGUgbG9jay4gKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkLT5sb2NrLCBmbGFncyk7CisKKwlsaXN0X3NwbGljZSgmZC0+Zmlmb19saXN0LCAmcGFja2V0X2xpc3QpOworCWxpc3Rfc3BsaWNlKCZkLT5wZW5kaW5nX2xpc3QsICZwYWNrZXRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmQtPmZpZm9fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmQtPnBlbmRpbmdfbGlzdCk7CisKKwlkLT5icmFuY2hBZGRyUHRyID0gTlVMTDsKKwlkLT5zZW50X2luZCA9IGQtPnByZ19pbmQ7CisJZC0+ZnJlZV9wcmdzID0gZC0+bnVtX2Rlc2M7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobGlzdF9lbXB0eSgmcGFja2V0X2xpc3QpKQorCQlyZXR1cm47CisKKwlQUklOVChLRVJOX0lORk8sICJBVCBkbWEgcmVzZXQgY3R4PSVkLCBhYm9ydGluZyB0cmFuc21pc3Npb24iLCBkLT5jdHgpOworCisJLyogTm93IHByb2Nlc3Mgc3Vic3lzdGVtIGNhbGxiYWNrcyBmb3IgdGhlIHBhY2tldHMgZnJvbSB0aGlzCisJICogY29udGV4dC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0LCBwdG1wLCAmcGFja2V0X2xpc3QsIGRyaXZlcl9saXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJnBhY2tldC0+ZHJpdmVyX2xpc3QpOworCQlocHNiX3BhY2tldF9zZW50KG9oY2ktPmhvc3QsIHBhY2tldCwgQUNLWF9BQk9SVEVEKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9oY2lfc2NoZWR1bGVfaXNvX3Rhc2tsZXRzKHN0cnVjdCB0aV9vaGNpICpvaGNpLAorCQkJCSAgICAgICBxdWFkbGV0X3QgcnhfZXZlbnQsCisJCQkJICAgICAgIHF1YWRsZXRfdCB0eF9ldmVudCkKK3sKKwlzdHJ1Y3Qgb2hjaTEzOTRfaXNvX3Rhc2tsZXQgKnQ7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJc3Bpbl9sb2NrKCZvaGNpLT5pc29fdGFza2xldF9saXN0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmb2hjaS0+aXNvX3Rhc2tsZXRfbGlzdCwgbGluaykgeworCQltYXNrID0gMSA8PCB0LT5jb250ZXh0OworCisJCWlmICh0LT50eXBlID09IE9IQ0lfSVNPX1RSQU5TTUlUICYmIHR4X2V2ZW50ICYgbWFzaykKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJnQtPnRhc2tsZXQpOworCQllbHNlIGlmIChyeF9ldmVudCAmIG1hc2spCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZ0LT50YXNrbGV0KTsKKwl9CisKKwlzcGluX3VubG9jaygmb2hjaS0+aXNvX3Rhc2tsZXRfbGlzdF9sb2NrKTsKKworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgb2hjaV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzX2FyZV91bnVzZWQpCit7CisJcXVhZGxldF90IGV2ZW50LCBub2RlX2lkOworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0gKHN0cnVjdCB0aV9vaGNpICopZGV2X2lkOworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBvaGNpLT5ob3N0OworCWludCBwaHlpZCA9IC0xLCBpc3Jvb3QgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBSZWFkIGFuZCBjbGVhciB0aGUgaW50ZXJydXB0IGV2ZW50IHJlZ2lzdGVyLiAgRG9uJ3QgY2xlYXIKKwkgKiB0aGUgYnVzUmVzZXQgZXZlbnQsIHRob3VnaC4gVGhpcyBpcyBkb25lIHdoZW4gd2UgZ2V0IHRoZQorCSAqIHNlbGZJRENvbXBsZXRlIGludGVycnVwdC4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2hjaS0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCWV2ZW50ID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSW50RXZlbnRDbGVhcik7CisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludEV2ZW50Q2xlYXIsIGV2ZW50ICYgfk9IQ0kxMzk0X2J1c1Jlc2V0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvaGNpLT5ldmVudF9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWV2ZW50KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBJZiBldmVudCBpcyB+KHUzMikwIGNhcmRidXMgY2FyZCB3YXMgZWplY3RlZC4gIEluIHRoaXMgY2FzZQorCSAqIHdlIGp1c3QgcmV0dXJuLCBhbmQgY2xlYW4gdXAgaW4gdGhlIG9oY2kxMzk0X3BjaV9yZW1vdmUKKwkgKiBmdW5jdGlvbi4gKi8KKwlpZiAoZXZlbnQgPT0gfih1MzIpIDApIHsKKwkJREJHTVNHKCJEZXZpY2UgcmVtb3ZlZC4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCURCR01TRygiSW50RXZlbnQ6ICUwOHgiLCBldmVudCk7CisKKwlpZiAoZXZlbnQgJiBPSENJMTM5NF91bnJlY292ZXJhYmxlRXJyb3IpIHsKKwkJaW50IGN0eDsKKwkJUFJJTlQoS0VSTl9FUlIsICJVbnJlY292ZXJhYmxlIGVycm9yISIpOworCisJCWlmIChyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Bc1JlcVRyQ29udGV4dENvbnRyb2xTZXQpICYgMHg4MDApCisJCQlQUklOVChLRVJOX0VSUiwgIkFzeW5jIFJlcSBUeCBDb250ZXh0IGRpZWQ6ICIKKwkJCQkiY3RybFslMDh4XSBjbWRwdHJbJTA4eF0iLAorCQkJCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0FzUmVxVHJDb250ZXh0Q29udHJvbFNldCksCisJCQkJcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfQXNSZXFUckNvbW1hbmRQdHIpKTsKKworCQlpZiAocmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfQXNSc3BUckNvbnRleHRDb250cm9sU2V0KSAmIDB4ODAwKQorCQkJUFJJTlQoS0VSTl9FUlIsICJBc3luYyBSc3AgVHggQ29udGV4dCBkaWVkOiAiCisJCQkJImN0cmxbJTA4eF0gY21kcHRyWyUwOHhdIiwKKwkJCQlyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Bc1JzcFRyQ29udGV4dENvbnRyb2xTZXQpLAorCQkJCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0FzUnNwVHJDb21tYW5kUHRyKSk7CisKKwkJaWYgKHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0FzUmVxUmN2Q29udGV4dENvbnRyb2xTZXQpICYgMHg4MDApCisJCQlQUklOVChLRVJOX0VSUiwgIkFzeW5jIFJlcSBSY3YgQ29udGV4dCBkaWVkOiAiCisJCQkJImN0cmxbJTA4eF0gY21kcHRyWyUwOHhdIiwKKwkJCQlyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Bc1JlcVJjdkNvbnRleHRDb250cm9sU2V0KSwKKwkJCQlyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Bc1JlcVJjdkNvbW1hbmRQdHIpKTsKKworCQlpZiAocmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfQXNSc3BSY3ZDb250ZXh0Q29udHJvbFNldCkgJiAweDgwMCkKKwkJCVBSSU5UKEtFUk5fRVJSLCAiQXN5bmMgUnNwIFJjdiBDb250ZXh0IGRpZWQ6ICIKKwkJCQkiY3RybFslMDh4XSBjbWRwdHJbJTA4eF0iLAorCQkJCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0FzUnNwUmN2Q29udGV4dENvbnRyb2xTZXQpLAorCQkJCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0FzUnNwUmN2Q29tbWFuZFB0cikpOworCisJCWZvciAoY3R4ID0gMDsgY3R4IDwgb2hjaS0+bmJfaXNvX3htaXRfY3R4OyBjdHgrKykgeworCQkJaWYgKHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRDb250ZXh0Q29udHJvbFNldCArICgxNiAqIGN0eCkpICYgMHg4MDApCisJCQkJUFJJTlQoS0VSTl9FUlIsICJJc28gWG1pdCAlZCBDb250ZXh0IGRpZWQ6ICIKKwkJCQkJImN0cmxbJTA4eF0gY21kcHRyWyUwOHhdIiwgY3R4LAorCQkJCQlyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9Jc29YbWl0Q29udGV4dENvbnRyb2xTZXQgKyAoMTYgKiBjdHgpKSwKKwkJCQkJcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSXNvWG1pdENvbW1hbmRQdHIgKyAoMTYgKiBjdHgpKSk7CisJCX0KKworCQlmb3IgKGN0eCA9IDA7IGN0eCA8IG9oY2ktPm5iX2lzb19yY3ZfY3R4OyBjdHgrKykgeworCQkJaWYgKHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1JjdkNvbnRleHRDb250cm9sU2V0ICsgKDMyICogY3R4KSkgJiAweDgwMCkKKwkJCQlQUklOVChLRVJOX0VSUiwgIklzbyBSZWN2ICVkIENvbnRleHQgZGllZDogIgorCQkJCQkiY3RybFslMDh4XSBjbWRwdHJbJTA4eF0gbWF0Y2hbJTA4eF0iLCBjdHgsCisJCQkJCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1JjdkNvbnRleHRDb250cm9sU2V0ICsgKDMyICogY3R4KSksCisJCQkJCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1JjdkNvbW1hbmRQdHIgKyAoMzIgKiBjdHgpKSwKKwkJCQkJcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSXNvUmN2Q29udGV4dE1hdGNoICsgKDMyICogY3R4KSkpOworCQl9CisKKwkJZXZlbnQgJj0gfk9IQ0kxMzk0X3VucmVjb3ZlcmFibGVFcnJvcjsKKwl9CisKKwlpZiAoZXZlbnQgJiBPSENJMTM5NF9jeWNsZUluY29uc2lzdGVudCkgeworCQkvKiBXZSBzdWJzY3JpYmUgdG8gdGhlIGN5Y2xlSW5jb25zaXN0ZW50IGV2ZW50IG9ubHkgdG8KKwkJICogY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQgYml0Li4uIG90aGVyd2lzZSwKKwkJICogaXNvY2hyb25vdXMgY3ljbGVNYXRjaCBETUEgd29uJ3Qgd29yay4gKi8KKwkJREJHTVNHKCJPSENJMTM5NF9jeWNsZUluY29uc2lzdGVudCIpOworCQlldmVudCAmPSB+T0hDSTEzOTRfY3ljbGVJbmNvbnNpc3RlbnQ7CisJfQorCisJaWYgKGV2ZW50ICYgT0hDSTEzOTRfYnVzUmVzZXQpIHsKKwkJLyogVGhlIGJ1c1Jlc2V0IGV2ZW50IGJpdCBjYW4ndCBiZSBjbGVhcmVkIGR1cmluZyB0aGUKKwkJICogc2VsZklEIHBoYXNlLCBzbyB3ZSBkaXNhYmxlIGJ1c1Jlc2V0IGludGVycnVwdHMsIHRvCisJCSAqIGF2b2lkIGJ1cnlpbmcgdGhlIGNwdSBpbiBpbnRlcnJ1cHQgcmVxdWVzdHMuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZvaGNpLT5ldmVudF9sb2NrLCBmbGFncyk7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRNYXNrQ2xlYXIsIE9IQ0kxMzk0X2J1c1Jlc2V0KTsKKworCQlpZiAob2hjaS0+Y2hlY2tfYnVzcmVzZXQpIHsKKwkJCWludCBsb29wX2NvdW50ID0gMDsKKworCQkJdWRlbGF5KDEwKTsKKworCQkJd2hpbGUgKHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0ludEV2ZW50U2V0KSAmIE9IQ0kxMzk0X2J1c1Jlc2V0KSB7CisJCQkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludEV2ZW50Q2xlYXIsIE9IQ0kxMzk0X2J1c1Jlc2V0KTsKKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9oY2ktPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwkJCQl1ZGVsYXkoMTApOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZvaGNpLT5ldmVudF9sb2NrLCBmbGFncyk7CisKKwkJCQkvKiBUaGUgbG9vcCBjb3VudGVyIGNoZWNrIGlzIHRvIHByZXZlbnQgdGhlIGRyaXZlcgorCQkJCSAqIGZyb20gcmVtYWluaW5nIGluIHRoaXMgc3RhdGUgZm9yZXZlci4gRm9yIHRoZQorCQkJCSAqIGluaXRpYWwgYnVzIHJlc2V0LCB0aGUgbG9vcCBjb250aW51ZXMgZm9yIGV2ZXIKKwkJCQkgKiBhbmQgdGhlIHN5c3RlbSBoYW5ncywgdW50aWwgc29tZSBkZXZpY2UgaXMgcGx1Z2dlZC1pbgorCQkJCSAqIG9yIG91dCBtYW51YWxseSBpbnRvIGEgcG9ydCEgVGhlIGZvcmNlZCByZXNldCBzZWVtcworCQkJCSAqIHRvIHNvbHZlIHRoaXMgcHJvYmxlbS4gVGhpcyBtYWlubHkgZWZmZWN0cyBuRm9yY2UyLiAqLworCQkJCWlmIChsb29wX2NvdW50ID4gMTAwMDApIHsKKwkJCQkJb2hjaV9kZXZjdGwoaG9zdCwgUkVTRVRfQlVTLCBMT05HX1JFU0VUKTsKKwkJCQkJREJHTVNHKCJEZXRlY3RlZCBidXMtcmVzZXQgbG9vcC4gRm9yY2VkIGEgYnVzIHJlc2V0ISIpOworCQkJCQlsb29wX2NvdW50ID0gMDsKKwkJCQl9CisKKwkJCQlsb29wX2NvdW50Kys7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2hjaS0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCQlpZiAoIWhvc3QtPmluX2J1c19yZXNldCkgeworCQkJREJHTVNHKCJpcnFfaGFuZGxlcjogQnVzIHJlc2V0IHJlcXVlc3RlZCIpOworCisJCQkvKiBTdWJzeXN0ZW0gY2FsbCAqLworCQkJaHBzYl9idXNfcmVzZXQob2hjaS0+aG9zdCk7CisJCX0KKwkJZXZlbnQgJj0gfk9IQ0kxMzk0X2J1c1Jlc2V0OworCX0KKworCWlmIChldmVudCAmIE9IQ0kxMzk0X3JlcVR4Q29tcGxldGUpIHsKKwkJc3RydWN0IGRtYV90cm1fY3R4ICpkID0gJm9oY2ktPmF0X3JlcV9jb250ZXh0OworCQlEQkdNU0coIkdvdCByZXFUeENvbXBsZXRlIGludGVycnVwdCAiCisJCSAgICAgICAic3RhdHVzPTB4JTA4WCIsIHJlZ19yZWFkKG9oY2ksIGQtPmN0cmxTZXQpKTsKKwkJaWYgKHJlZ19yZWFkKG9oY2ksIGQtPmN0cmxTZXQpICYgMHg4MDApCisJCQlvaGNpMTM5NF9zdG9wX2NvbnRleHQob2hjaSwgZC0+Y3RybENsZWFyLAorCQkJCQkgICAgICAicmVxVHhDb21wbGV0ZSIpOworCQllbHNlCisJCQlkbWFfdHJtX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpZCk7CisJCQkvL3Rhc2tsZXRfc2NoZWR1bGUoJmQtPnRhc2spOworCQlldmVudCAmPSB+T0hDSTEzOTRfcmVxVHhDb21wbGV0ZTsKKwl9CisJaWYgKGV2ZW50ICYgT0hDSTEzOTRfcmVzcFR4Q29tcGxldGUpIHsKKwkJc3RydWN0IGRtYV90cm1fY3R4ICpkID0gJm9oY2ktPmF0X3Jlc3BfY29udGV4dDsKKwkJREJHTVNHKCJHb3QgcmVzcFR4Q29tcGxldGUgaW50ZXJydXB0ICIKKwkJICAgICAgICJzdGF0dXM9MHglMDhYIiwgcmVnX3JlYWQob2hjaSwgZC0+Y3RybFNldCkpOworCQlpZiAocmVnX3JlYWQob2hjaSwgZC0+Y3RybFNldCkgJiAweDgwMCkKKwkJCW9oY2kxMzk0X3N0b3BfY29udGV4dChvaGNpLCBkLT5jdHJsQ2xlYXIsCisJCQkJCSAgICAgICJyZXNwVHhDb21wbGV0ZSIpOworCQllbHNlCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkLT50YXNrKTsKKwkJZXZlbnQgJj0gfk9IQ0kxMzk0X3Jlc3BUeENvbXBsZXRlOworCX0KKwlpZiAoZXZlbnQgJiBPSENJMTM5NF9SUVBrdCkgeworCQlzdHJ1Y3QgZG1hX3Jjdl9jdHggKmQgPSAmb2hjaS0+YXJfcmVxX2NvbnRleHQ7CisJCURCR01TRygiR290IFJRUGt0IGludGVycnVwdCBzdGF0dXM9MHglMDhYIiwKKwkJICAgICAgIHJlZ19yZWFkKG9oY2ksIGQtPmN0cmxTZXQpKTsKKwkJaWYgKHJlZ19yZWFkKG9oY2ksIGQtPmN0cmxTZXQpICYgMHg4MDApCisJCQlvaGNpMTM5NF9zdG9wX2NvbnRleHQob2hjaSwgZC0+Y3RybENsZWFyLCAiUlFQa3QiKTsKKwkJZWxzZQorCQkJdGFza2xldF9zY2hlZHVsZSgmZC0+dGFzayk7CisJCWV2ZW50ICY9IH5PSENJMTM5NF9SUVBrdDsKKwl9CisJaWYgKGV2ZW50ICYgT0hDSTEzOTRfUlNQa3QpIHsKKwkJc3RydWN0IGRtYV9yY3ZfY3R4ICpkID0gJm9oY2ktPmFyX3Jlc3BfY29udGV4dDsKKwkJREJHTVNHKCJHb3QgUlNQa3QgaW50ZXJydXB0IHN0YXR1cz0weCUwOFgiLAorCQkgICAgICAgcmVnX3JlYWQob2hjaSwgZC0+Y3RybFNldCkpOworCQlpZiAocmVnX3JlYWQob2hjaSwgZC0+Y3RybFNldCkgJiAweDgwMCkKKwkJCW9oY2kxMzk0X3N0b3BfY29udGV4dChvaGNpLCBkLT5jdHJsQ2xlYXIsICJSU1BrdCIpOworCQllbHNlCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkLT50YXNrKTsKKwkJZXZlbnQgJj0gfk9IQ0kxMzk0X1JTUGt0OworCX0KKwlpZiAoZXZlbnQgJiBPSENJMTM5NF9pc29jaFJ4KSB7CisJCXF1YWRsZXRfdCByeF9ldmVudDsKKworCQlyeF9ldmVudCA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRFdmVudFNldCk7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50RXZlbnRDbGVhciwgcnhfZXZlbnQpOworCQlvaGNpX3NjaGVkdWxlX2lzb190YXNrbGV0cyhvaGNpLCByeF9ldmVudCwgMCk7CisJCWV2ZW50ICY9IH5PSENJMTM5NF9pc29jaFJ4OworCX0KKwlpZiAoZXZlbnQgJiBPSENJMTM5NF9pc29jaFR4KSB7CisJCXF1YWRsZXRfdCB0eF9ldmVudDsKKworCQl0eF9ldmVudCA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRFdmVudFNldCk7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50RXZlbnRDbGVhciwgdHhfZXZlbnQpOworCQlvaGNpX3NjaGVkdWxlX2lzb190YXNrbGV0cyhvaGNpLCAwLCB0eF9ldmVudCk7CisJCWV2ZW50ICY9IH5PSENJMTM5NF9pc29jaFR4OworCX0KKwlpZiAoZXZlbnQgJiBPSENJMTM5NF9zZWxmSURDb21wbGV0ZSkgeworCQlpZiAoaG9zdC0+aW5fYnVzX3Jlc2V0KSB7CisJCQlub2RlX2lkID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfTm9kZUlEKTsKKworCQkJaWYgKCEobm9kZV9pZCAmIDB4ODAwMDAwMDApKSB7CisJCQkJUFJJTlQoS0VSTl9FUlIsCisJCQkJICAgICAgIlNlbGZJRCByZWNlaXZlZCwgYnV0IE5vZGVJRCBpbnZhbGlkICIKKwkJCQkgICAgICAiKHByb2JhYmx5IG5ldyBidXMgcmVzZXQgb2NjdXJyZWQpOiAlMDhYIiwKKwkJCQkgICAgICBub2RlX2lkKTsKKwkJCQlnb3RvIHNlbGZpZF9ub3RfdmFsaWQ7CisJCQl9CisKKwkJCXBoeWlkID0gIG5vZGVfaWQgJiAweDAwMDAwMDNmOworCQkJaXNyb290ID0gKG5vZGVfaWQgJiAweDQwMDAwMDAwKSAhPSAwOworCisJCQlEQkdNU0coIlNlbGZJRCBpbnRlcnJ1cHQgcmVjZWl2ZWQgIgorCQkJICAgICAgIihwaHlpZCAlZCwgJXMpIiwgcGh5aWQsCisJCQkgICAgICAoaXNyb290ID8gInJvb3QiIDogIm5vdCByb290IikpOworCisJCQloYW5kbGVfc2VsZmlkKG9oY2ksIGhvc3QsIHBoeWlkLCBpc3Jvb3QpOworCisJCQkvKiBDbGVhciB0aGUgYnVzIHJlc2V0IGV2ZW50IGFuZCByZS1lbmFibGUgdGhlCisJCQkgKiBidXNSZXNldCBpbnRlcnJ1cHQuICAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm9oY2ktPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwkJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRFdmVudENsZWFyLCBPSENJMTM5NF9idXNSZXNldCk7CisJCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50TWFza1NldCwgT0hDSTEzOTRfYnVzUmVzZXQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2hjaS0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCisJCQkvKiBBY2NlcHQgUGh5c2ljYWwgcmVxdWVzdHMgZnJvbSBhbGwgbm9kZXMuICovCisJCQlyZWdfd3JpdGUob2hjaSxPSENJMTM5NF9Bc1JlcUZpbHRlckhpU2V0LCAweGZmZmZmZmZmKTsKKwkJCXJlZ193cml0ZShvaGNpLE9IQ0kxMzk0X0FzUmVxRmlsdGVyTG9TZXQsIDB4ZmZmZmZmZmYpOworCisJCQkvKiBUdXJuIG9uIHBoeXMgZG1hIHJlY2VwdGlvbi4KKwkJCSAqCisJCQkgKiBUT0RPOiBFbmFibGUgc29tZSBzb3J0IG9mIGZpbHRlcmluZyBtYW5hZ2VtZW50LgorCQkJICovCisJCQlpZiAocGh5c19kbWEpIHsKKwkJCQlyZWdfd3JpdGUob2hjaSxPSENJMTM5NF9QaHlSZXFGaWx0ZXJIaVNldCwgMHhmZmZmZmZmZik7CisJCQkJcmVnX3dyaXRlKG9oY2ksT0hDSTEzOTRfUGh5UmVxRmlsdGVyTG9TZXQsIDB4ZmZmZmZmZmYpOworCQkJCXJlZ193cml0ZShvaGNpLE9IQ0kxMzk0X1BoeVVwcGVyQm91bmQsIDB4ZmZmZjAwMDApOworCQkJfSBlbHNlIHsKKwkJCQlyZWdfd3JpdGUob2hjaSxPSENJMTM5NF9QaHlSZXFGaWx0ZXJIaVNldCwgMHgwMDAwMDAwMCk7CisJCQkJcmVnX3dyaXRlKG9oY2ksT0hDSTEzOTRfUGh5UmVxRmlsdGVyTG9TZXQsIDB4MDAwMDAwMDApOworCQkJfQorCisJCQlEQkdNU0coIlBoeVJlcUZpbHRlcj0lMDh4JTA4eCIsCisJCQkgICAgICAgcmVnX3JlYWQob2hjaSxPSENJMTM5NF9QaHlSZXFGaWx0ZXJIaVNldCksCisJCQkgICAgICAgcmVnX3JlYWQob2hjaSxPSENJMTM5NF9QaHlSZXFGaWx0ZXJMb1NldCkpOworCisJCQlocHNiX3NlbGZpZF9jb21wbGV0ZShob3N0LCBwaHlpZCwgaXNyb290KTsKKwkJfSBlbHNlCisJCQlQUklOVChLRVJOX0VSUiwKKwkJCSAgICAgICJTZWxmSUQgcmVjZWl2ZWQgb3V0c2lkZSBvZiBidXMgcmVzZXQgc2VxdWVuY2UiKTsKKworc2VsZmlkX25vdF92YWxpZDoKKwkJZXZlbnQgJj0gfk9IQ0kxMzk0X3NlbGZJRENvbXBsZXRlOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBoYW5kbGUgZXZlcnl0aGluZywganVzdCBpbiBjYXNlIHdlIGFjY2lkZW50YWxseQorCSAqIGVuYWJsZWQgYW4gaW50ZXJydXB0IHRoYXQgd2UgZGlkbid0IHdyaXRlIGEgaGFuZGxlciBmb3IuICAqLworCWlmIChldmVudCkKKwkJUFJJTlQoS0VSTl9FUlIsICJVbmhhbmRsZWQgaW50ZXJydXB0KHMpIDB4JTA4eCIsCisJCSAgICAgIGV2ZW50KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogUHV0IHRoZSBidWZmZXIgYmFjayBpbnRvIHRoZSBkbWEgY29udGV4dCAqLworc3RhdGljIHZvaWQgaW5zZXJ0X2RtYV9idWZmZXIoc3RydWN0IGRtYV9yY3ZfY3R4ICpkLCBpbnQgaWR4KQoreworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0gKHN0cnVjdCB0aV9vaGNpKikoZC0+b2hjaSk7CisJREJHTVNHKCJJbnNlcnRpbmcgZG1hIGJ1ZiBjdHg9JWQgaWR4PSVkIiwgZC0+Y3R4LCBpZHgpOworCisJZC0+cHJnX2NwdVtpZHhdLT5zdGF0dXMgPSBjcHVfdG9fbGUzMihkLT5idWZfc2l6ZSk7CisJZC0+cHJnX2NwdVtpZHhdLT5icmFuY2hBZGRyZXNzICY9IGxlMzJfdG9fY3B1KDB4ZmZmZmZmZjApOworCWlkeCA9IChpZHggKyBkLT5udW1fZGVzYyAtIDEgKSAlIGQtPm51bV9kZXNjOworCWQtPnByZ19jcHVbaWR4XS0+YnJhbmNoQWRkcmVzcyB8PSBsZTMyX3RvX2NwdSgweDAwMDAwMDAxKTsKKworCS8qIFRvIGF2b2lkIGEgcmFjZSwgZW5zdXJlIDEzOTQgaW50ZXJmYWNlIGhhcmR3YXJlIHNlZXMgdGhlIGluc2VydGVkCisJICogY29udGV4dCBwcm9ncmFtIGRlc2NyaXB0b3JzIGJlZm9yZSBpdCBzZWVzIHRoZSB3YWtldXAgYml0IHNldC4gKi8KKwl3bWIoKTsKKwkKKwkvKiB3YWtlIHVwIHRoZSBkbWEgY29udGV4dCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoIShyZWdfcmVhZChvaGNpLCBkLT5jdHJsU2V0KSAmIDB4NDAwKSkgeworCQlQUklOVChLRVJOX0lORk8sCisJCSAgICAgICJXYWtpbmcgZG1hIGN0eD0lZCAuLi4gcHJvY2Vzc2luZyBpcyBwcm9iYWJseSB0b28gc2xvdyIsCisJCSAgICAgIGQtPmN0eCk7CisJfQorCisJLyogZG8gdGhpcyBhbHdheXMsIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uICovCisJcmVnX3dyaXRlKG9oY2ksIGQtPmN0cmxTZXQsIDB4MTAwMCk7Cit9CisKKyNkZWZpbmUgY29uZF9sZTMyX3RvX2NwdShkYXRhLCBub3N3YXApIFwKKwkobm9zd2FwID8gZGF0YSA6IGxlMzJfdG9fY3B1KGRhdGEpKQorCitzdGF0aWMgY29uc3QgaW50IFRDT0RFX1NJWkVbMTZdID0gezIwLCAwLCAxNiwgLTEsIDE2LCAyMCwgMjAsIDAsCisJCQkgICAgLTEsIDAsIC0xLCAwLCAtMSwgLTEsIDE2LCAtMX07CisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiBhIHBhY2tldCBpbiB0aGUgYnVmZmVyCisgKiBPcHRpbWl6YXRpb24gc3VnZ2VzdGVkIGJ5IFBhc2NhbCBEcm9sZXQgPHBhc2NhbC5kcm9sZXRAaW5mb3JtaXNzaW9uLmNhPgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcGFja2V0X2xlbmd0aChzdHJ1Y3QgZG1hX3Jjdl9jdHggKmQsIGludCBpZHgsIHF1YWRsZXRfdCAqYnVmX3B0ciwKKwkJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyIHRjb2RlLCBpbnQgbm9zd2FwKQoreworCWludCBsZW5ndGggPSAtMTsKKworCWlmIChkLT50eXBlID09IERNQV9DVFhfQVNZTkNfUkVRIHx8IGQtPnR5cGUgPT0gRE1BX0NUWF9BU1lOQ19SRVNQKSB7CisJCWxlbmd0aCA9IFRDT0RFX1NJWkVbdGNvZGVdOworCQlpZiAobGVuZ3RoID09IDApIHsKKwkJCWlmIChvZmZzZXQgKyAxMiA+PSBkLT5idWZfc2l6ZSkgeworCQkJCWxlbmd0aCA9IChjb25kX2xlMzJfdG9fY3B1KGQtPmJ1Zl9jcHVbKGlkeCArIDEpICUgZC0+bnVtX2Rlc2NdCisJCQkJCQlbMyAtICgoZC0+YnVmX3NpemUgLSBvZmZzZXQpID4+IDIpXSwgbm9zd2FwKSA+PiAxNik7CisJCQl9IGVsc2UgeworCQkJCWxlbmd0aCA9IChjb25kX2xlMzJfdG9fY3B1KGJ1Zl9wdHJbM10sIG5vc3dhcCkgPj4gMTYpOworCQkJfQorCQkJbGVuZ3RoICs9IDIwOworCQl9CisJfSBlbHNlIGlmIChkLT50eXBlID09IERNQV9DVFhfSVNPKSB7CisJCS8qIEFzc3VtcHRpb246IGJ1ZmZlciBmaWxsIG1vZGUgd2l0aCBoZWFkZXIvdHJhaWxlciAqLworCQlsZW5ndGggPSAoY29uZF9sZTMyX3RvX2NwdShidWZfcHRyWzBdLCBub3N3YXApID4+IDE2KSArIDg7CisJfQorCisJaWYgKGxlbmd0aCA+IDAgJiYgbGVuZ3RoICUgNCkKKwkJbGVuZ3RoICs9IDQgLSAobGVuZ3RoICUgNCk7CisKKwlyZXR1cm4gbGVuZ3RoOworfQorCisvKiBUYXNrbGV0IHRoYXQgcHJvY2Vzc2VzIGRtYSByZWNlaXZlIGJ1ZmZlcnMgKi8KK3N0YXRpYyB2b2lkIGRtYV9yY3ZfdGFza2xldCAodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBkbWFfcmN2X2N0eCAqZCA9IChzdHJ1Y3QgZG1hX3Jjdl9jdHgqKWRhdGE7CisJc3RydWN0IHRpX29oY2kgKm9oY2kgPSAoc3RydWN0IHRpX29oY2kqKShkLT5vaGNpKTsKKwl1bnNpZ25lZCBpbnQgc3BsaXRfbGVmdCwgaWR4LCBvZmZzZXQsIHJlc2NvdW50OworCXVuc2lnbmVkIGNoYXIgdGNvZGU7CisJaW50IGxlbmd0aCwgYnl0ZXNfbGVmdCwgYWNrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcXVhZGxldF90ICpidWZfcHRyOworCWNoYXIgKnNwbGl0X3B0cjsKKwljaGFyIG1zZ1syNTZdOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKKworCWlkeCA9IGQtPmJ1Zl9pbmQ7CisJb2Zmc2V0ID0gZC0+YnVmX29mZnNldDsKKwlidWZfcHRyID0gZC0+YnVmX2NwdVtpZHhdICsgb2Zmc2V0LzQ7CisKKwlyZXNjb3VudCA9IGxlMzJfdG9fY3B1KGQtPnByZ19jcHVbaWR4XS0+c3RhdHVzKSAmIDB4ZmZmZjsKKwlieXRlc19sZWZ0ID0gZC0+YnVmX3NpemUgLSByZXNjb3VudCAtIG9mZnNldDsKKworCXdoaWxlIChieXRlc19sZWZ0ID4gMCkgeworCQl0Y29kZSA9IChjb25kX2xlMzJfdG9fY3B1KGJ1Zl9wdHJbMF0sIG9oY2ktPm5vX3N3YXBfaW5jb21pbmcpID4+IDQpICYgMHhmOworCisJCS8qIHBhY2tldF9sZW5ndGgoKSB3aWxsIHJldHVybiA8IDQgZm9yIGFuIGVycm9yICovCisJCWxlbmd0aCA9IHBhY2tldF9sZW5ndGgoZCwgaWR4LCBidWZfcHRyLCBvZmZzZXQsIHRjb2RlLCBvaGNpLT5ub19zd2FwX2luY29taW5nKTsKKworCQlpZiAobGVuZ3RoIDwgNCkgeyAvKiBzb21ldGhpbmcgaXMgd3JvbmcgKi8KKwkJCXNwcmludGYobXNnLCJVbmV4cGVjdGVkIHRjb2RlIDB4JXgoMHglMDh4KSBpbiBBUiBjdHg9JWQsIGxlbmd0aD0lZCIsCisJCQkJdGNvZGUsIGNvbmRfbGUzMl90b19jcHUoYnVmX3B0clswXSwgb2hjaS0+bm9fc3dhcF9pbmNvbWluZyksCisJCQkJZC0+Y3R4LCBsZW5ndGgpOworCQkJb2hjaTEzOTRfc3RvcF9jb250ZXh0KG9oY2ksIGQtPmN0cmxDbGVhciwgbXNnKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFRoZSBmaXJzdCBjYXNlIGlzIHdoZXJlIHdlIGhhdmUgYSBwYWNrZXQgdGhhdCBjcm9zc2VzCisJCSAqIG92ZXIgbW9yZSB0aGFuIG9uZSBkZXNjcmlwdG9yLiBUaGUgbmV4dCBjYXNlIGlzIHdoZXJlCisJCSAqIGl0J3MgYWxsIGluIHRoZSBmaXJzdCBkZXNjcmlwdG9yLiAgKi8KKwkJaWYgKChvZmZzZXQgKyBsZW5ndGgpID4gZC0+YnVmX3NpemUpIHsKKwkJCURCR01TRygiU3BsaXQgcGFja2V0IHJjdidkIik7CisJCQlpZiAobGVuZ3RoID4gZC0+c3BsaXRfYnVmX3NpemUpIHsKKwkJCQlvaGNpMTM5NF9zdG9wX2NvbnRleHQob2hjaSwgZC0+Y3RybENsZWFyLAorCQkJCQkgICAgICJTcGxpdCBwYWNrZXQgc2l6ZSBleGNlZWRlZCIpOworCQkJCWQtPmJ1Zl9pbmQgPSBpZHg7CisJCQkJZC0+YnVmX29mZnNldCA9IG9mZnNldDsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpZiAobGUzMl90b19jcHUoZC0+cHJnX2NwdVsoaWR4KzEpJWQtPm51bV9kZXNjXS0+c3RhdHVzKQorCQkJICAgID09IGQtPmJ1Zl9zaXplKSB7CisJCQkJLyogT3RoZXIgcGFydCBvZiBwYWNrZXQgbm90IHdyaXR0ZW4geWV0LgorCQkJCSAqIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBJIHRoaW5rCisJCQkJICogYW55d2F5IHdlJ2xsIGdldCBpdCBvbiB0aGUgbmV4dCBjYWxsLiAgKi8KKwkJCQlQUklOVChLRVJOX0lORk8sCisJCQkJICAgICAgIkdvdCBvbmx5IGhhbGYgYSBwYWNrZXQhIik7CisJCQkJZC0+YnVmX2luZCA9IGlkeDsKKwkJCQlkLT5idWZfb2Zmc2V0ID0gb2Zmc2V0OworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXNwbGl0X2xlZnQgPSBsZW5ndGg7CisJCQlzcGxpdF9wdHIgPSAoY2hhciAqKWQtPnNwYjsKKwkJCW1lbWNweShzcGxpdF9wdHIsYnVmX3B0cixkLT5idWZfc2l6ZS1vZmZzZXQpOworCQkJc3BsaXRfbGVmdCAtPSBkLT5idWZfc2l6ZS1vZmZzZXQ7CisJCQlzcGxpdF9wdHIgKz0gZC0+YnVmX3NpemUtb2Zmc2V0OworCQkJaW5zZXJ0X2RtYV9idWZmZXIoZCwgaWR4KTsKKwkJCWlkeCA9IChpZHgrMSkgJSBkLT5udW1fZGVzYzsKKwkJCWJ1Zl9wdHIgPSBkLT5idWZfY3B1W2lkeF07CisJCQlvZmZzZXQ9MDsKKworCQkJd2hpbGUgKHNwbGl0X2xlZnQgPj0gZC0+YnVmX3NpemUpIHsKKwkJCQltZW1jcHkoc3BsaXRfcHRyLGJ1Zl9wdHIsZC0+YnVmX3NpemUpOworCQkJCXNwbGl0X3B0ciArPSBkLT5idWZfc2l6ZTsKKwkJCQlzcGxpdF9sZWZ0IC09IGQtPmJ1Zl9zaXplOworCQkJCWluc2VydF9kbWFfYnVmZmVyKGQsIGlkeCk7CisJCQkJaWR4ID0gKGlkeCsxKSAlIGQtPm51bV9kZXNjOworCQkJCWJ1Zl9wdHIgPSBkLT5idWZfY3B1W2lkeF07CisJCQl9CisKKwkJCWlmIChzcGxpdF9sZWZ0ID4gMCkgeworCQkJCW1lbWNweShzcGxpdF9wdHIsIGJ1Zl9wdHIsIHNwbGl0X2xlZnQpOworCQkJCW9mZnNldCA9IHNwbGl0X2xlZnQ7CisJCQkJYnVmX3B0ciArPSBvZmZzZXQvNDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURCR01TRygiU2luZ2xlIHBhY2tldCByY3YnZCIpOworCQkJbWVtY3B5KGQtPnNwYiwgYnVmX3B0ciwgbGVuZ3RoKTsKKwkJCW9mZnNldCArPSBsZW5ndGg7CisJCQlidWZfcHRyICs9IGxlbmd0aC80OworCQkJaWYgKG9mZnNldD09ZC0+YnVmX3NpemUpIHsKKwkJCQlpbnNlcnRfZG1hX2J1ZmZlcihkLCBpZHgpOworCQkJCWlkeCA9IChpZHgrMSkgJSBkLT5udW1fZGVzYzsKKwkJCQlidWZfcHRyID0gZC0+YnVmX2NwdVtpZHhdOworCQkJCW9mZnNldD0wOworCQkJfQorCQl9CisKKwkJLyogV2UgZ2V0IG9uZSBwaHkgcGFja2V0IHRvIHRoZSBhc3luYyBkZXNjcmlwdG9yIGZvciBlYWNoCisJCSAqIGJ1cyByZXNldC4gV2UgYWx3YXlzIGlnbm9yZSBpdC4gICovCisJCWlmICh0Y29kZSAhPSBPSENJMTM5NF9UQ09ERV9QSFkpIHsKKwkJCWlmICghb2hjaS0+bm9fc3dhcF9pbmNvbWluZykKKwkJCQlwYWNrZXRfc3dhYihkLT5zcGIsIHRjb2RlKTsKKwkJCURCR01TRygiUGFja2V0IHJlY2VpdmVkIGZyb20gbm9kZSIKKwkJCQkiICVkIGFjaz0weCUwMlggc3BkPSVkIHRjb2RlPTB4JVgiCisJCQkJIiBsZW5ndGg9JWQgY3R4PSVkIHRsYWJlbD0lZCIsCisJCQkJKGQtPnNwYlsxXT4+MTYpJjB4M2YsCisJCQkJKGNvbmRfbGUzMl90b19jcHUoZC0+c3BiW2xlbmd0aC80LTFdLCBvaGNpLT5ub19zd2FwX2luY29taW5nKT4+MTYpJjB4MWYsCisJCQkJKGNvbmRfbGUzMl90b19jcHUoZC0+c3BiW2xlbmd0aC80LTFdLCBvaGNpLT5ub19zd2FwX2luY29taW5nKT4+MjEpJjB4MywKKwkJCQl0Y29kZSwgbGVuZ3RoLCBkLT5jdHgsCisJCQkJKGNvbmRfbGUzMl90b19jcHUoZC0+c3BiW2xlbmd0aC80LTFdLCBvaGNpLT5ub19zd2FwX2luY29taW5nKT4+MTApJjB4M2YpOworCisJCQlhY2sgPSAoKChjb25kX2xlMzJfdG9fY3B1KGQtPnNwYltsZW5ndGgvNC0xXSwgb2hjaS0+bm9fc3dhcF9pbmNvbWluZyk+PjE2KSYweDFmKQorCQkJCT09IDB4MTEpID8gMSA6IDA7CisKKwkJCWhwc2JfcGFja2V0X3JlY2VpdmVkKG9oY2ktPmhvc3QsIGQtPnNwYiwKKwkJCQkJICAgICBsZW5ndGgtNCwgYWNrKTsKKwkJfQorI2lmZGVmIE9IQ0kxMzk0X0RFQlVHCisJCWVsc2UKKwkJCVBSSU5UIChLRVJOX0RFQlVHLCAiR290IHBoeSBwYWNrZXQgY3R4PSVkIC4uLiBkaXNjYXJkZWQiLAorCQkJICAgICAgIGQtPmN0eCk7CisjZW5kaWYKKworCSAgICAgICAJcmVzY291bnQgPSBsZTMyX3RvX2NwdShkLT5wcmdfY3B1W2lkeF0tPnN0YXR1cykgJiAweGZmZmY7CisKKwkJYnl0ZXNfbGVmdCA9IGQtPmJ1Zl9zaXplIC0gcmVzY291bnQgLSBvZmZzZXQ7CisKKwl9CisKKwlkLT5idWZfaW5kID0gaWR4OworCWQtPmJ1Zl9vZmZzZXQgPSBvZmZzZXQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIEJvdHRvbSBoYWxmIHRoYXQgcHJvY2Vzc2VzIHNlbnQgcGFja2V0cyAqLworc3RhdGljIHZvaWQgZG1hX3RybV90YXNrbGV0ICh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGRtYV90cm1fY3R4ICpkID0gKHN0cnVjdCBkbWFfdHJtX2N0eCopZGF0YTsKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IChzdHJ1Y3QgdGlfb2hjaSopKGQtPm9oY2kpOworCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0LCAqcHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0dXMsIGFjazsKKyAgICAgICAgc2l6ZV90IGRhdGFzaXplOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXQsIHB0bXAsICZkLT5maWZvX2xpc3QsIGRyaXZlcl9saXN0KSB7CisgICAgICAgICAgICAgICAgZGF0YXNpemUgPSBwYWNrZXQtPmRhdGFfc2l6ZTsKKwkJaWYgKGRhdGFzaXplICYmIHBhY2tldC0+dHlwZSAhPSBocHNiX3JhdykKKwkJCXN0YXR1cyA9IGxlMzJfdG9fY3B1KAorCQkJCWQtPnByZ19jcHVbZC0+c2VudF9pbmRdLT5lbmQuc3RhdHVzKSA+PiAxNjsKKwkJZWxzZQorCQkJc3RhdHVzID0gbGUzMl90b19jcHUoCisJCQkJZC0+cHJnX2NwdVtkLT5zZW50X2luZF0tPmJlZ2luLnN0YXR1cykgPj4gMTY7CisKKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJLyogdGhpcyBwYWNrZXQgaGFzbid0IGJlZW4gc2VudCB5ZXQqLworCQkJYnJlYWs7CisKKyNpZmRlZiBPSENJMTM5NF9ERUJVRworCQlpZiAoZGF0YXNpemUpCisJCQlpZiAoKChsZTMyX3RvX2NwdShkLT5wcmdfY3B1W2QtPnNlbnRfaW5kXS0+ZGF0YVswXSk+PjQpJjB4ZikgPT0gMHhhKQorCQkJCURCR01TRygiU3RyZWFtIHBhY2tldCBzZW50IHRvIGNoYW5uZWwgJWQgdGNvZGU9MHglWCAiCisJCQkJICAgICAgICJhY2s9MHglWCBzcGQ9JWQgZGF0YUxlbmd0aD0lZCBjdHg9JWQiLAorCQkJCSAgICAgICAobGUzMl90b19jcHUoZC0+cHJnX2NwdVtkLT5zZW50X2luZF0tPmRhdGFbMF0pPj44KSYweDNmLAorCQkJCSAgICAgICAobGUzMl90b19jcHUoZC0+cHJnX2NwdVtkLT5zZW50X2luZF0tPmRhdGFbMF0pPj40KSYweGYsCisJCQkJICAgICAgIHN0YXR1cyYweDFmLCAoc3RhdHVzPj41KSYweDMsCisJCQkJICAgICAgIGxlMzJfdG9fY3B1KGQtPnByZ19jcHVbZC0+c2VudF9pbmRdLT5kYXRhWzFdKT4+MTYsCisJCQkJICAgICAgIGQtPmN0eCk7CisJCQllbHNlCisJCQkJREJHTVNHKCJQYWNrZXQgc2VudCB0byBub2RlICVkIHRjb2RlPTB4JVggdExhYmVsPSIKKwkJCQkgICAgICAgIjB4JTAyWCBhY2s9MHglWCBzcGQ9JWQgZGF0YUxlbmd0aD0lZCBjdHg9JWQiLAorCQkJCSAgICAgICAobGUzMl90b19jcHUoZC0+cHJnX2NwdVtkLT5zZW50X2luZF0tPmRhdGFbMV0pPj4xNikmMHgzZiwKKwkJCQkgICAgICAgKGxlMzJfdG9fY3B1KGQtPnByZ19jcHVbZC0+c2VudF9pbmRdLT5kYXRhWzBdKT4+NCkmMHhmLAorCQkJCSAgICAgICAobGUzMl90b19jcHUoZC0+cHJnX2NwdVtkLT5zZW50X2luZF0tPmRhdGFbMF0pPj4xMCkmMHgzZiwKKwkJCQkgICAgICAgc3RhdHVzJjB4MWYsIChzdGF0dXM+PjUpJjB4MywKKwkJCQkgICAgICAgbGUzMl90b19jcHUoZC0+cHJnX2NwdVtkLT5zZW50X2luZF0tPmRhdGFbM10pPj4xNiwKKwkJCQkgICAgICAgZC0+Y3R4KTsKKwkJZWxzZQorCQkJREJHTVNHKCJQYWNrZXQgc2VudCB0byBub2RlICVkIHRjb2RlPTB4JVggdExhYmVsPSIKKwkJCSAgICAgICAiMHglMDJYIGFjaz0weCVYIHNwZD0lZCBkYXRhPTB4JTA4WCBjdHg9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGUzMl90b19jcHUoZC0+cHJnX2NwdVtkLT5zZW50X2luZF0tPmRhdGFbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4xNikmMHgzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlMzJfdG9fY3B1KGQtPnByZ19jcHVbZC0+c2VudF9pbmRdLT5kYXRhWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+NCkmMHhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGUzMl90b19jcHUoZC0+cHJnX2NwdVtkLT5zZW50X2luZF0tPmRhdGFbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4xMCkmMHgzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzJjB4MWYsIChzdGF0dXM+PjUpJjB4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoZC0+cHJnX2NwdVtkLT5zZW50X2luZF0tPmRhdGFbM10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5jdHgpOworI2VuZGlmCisKKwkJaWYgKHN0YXR1cyAmIDB4MTApIHsKKwkJCWFjayA9IHN0YXR1cyAmIDB4ZjsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoc3RhdHVzICYgMHgxZikgeworCQkJY2FzZSBFVlRfTk9fU1RBVFVTOiAvKiB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCWNhc2UgRVZUX1JFU0VSVkVEX0E6IC8qIHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJY2FzZSBFVlRfTE9OR19QQUNLRVQ6IC8qIHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJCVBSSU5UKEtFUk5fV0FSTklORywgIlJlY2VpdmVkIE9IQ0kgZXZ0XyogZXJyb3IgMHgleCIsIHN0YXR1cyAmIDB4MWYpOworCQkJCWFjayA9IEFDS1hfU0VORF9FUlJPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVZUX01JU1NJTkdfQUNLOgorCQkJCWFjayA9IEFDS1hfVElNRU9VVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVZUX1VOREVSUlVOOgorCQkJCWFjayA9IEFDS1hfU0VORF9FUlJPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVZUX09WRVJSVU46IC8qIHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJCVBSSU5UKEtFUk5fV0FSTklORywgIlJlY2VpdmVkIE9IQ0kgZXZ0XyogZXJyb3IgMHgleCIsIHN0YXR1cyAmIDB4MWYpOworCQkJCWFjayA9IEFDS1hfU0VORF9FUlJPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVZUX0RFU0NSSVBUT1JfUkVBRDoKKwkJCWNhc2UgRVZUX0RBVEFfUkVBRDoKKwkJCWNhc2UgRVZUX0RBVEFfV1JJVEU6CisJCQkJYWNrID0gQUNLWF9TRU5EX0VSUk9SOworCQkJCWJyZWFrOworCQkJY2FzZSBFVlRfQlVTX1JFU0VUOiAvKiB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCQlQUklOVChLRVJOX1dBUk5JTkcsICJSZWNlaXZlZCBPSENJIGV2dF8qIGVycm9yIDB4JXgiLCBzdGF0dXMgJiAweDFmKTsKKwkJCQlhY2sgPSBBQ0tYX1NFTkRfRVJST1I7CisJCQkJYnJlYWs7CisJCQljYXNlIEVWVF9USU1FT1VUOgorCQkJCWFjayA9IEFDS1hfVElNRU9VVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVZUX1RDT0RFX0VSUjoKKwkJCQlhY2sgPSBBQ0tYX1NFTkRfRVJST1I7CisJCQkJYnJlYWs7CisJCQljYXNlIEVWVF9SRVNFUlZFRF9COiAvKiB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCWNhc2UgRVZUX1JFU0VSVkVEX0M6IC8qIHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJCVBSSU5UKEtFUk5fV0FSTklORywgIlJlY2VpdmVkIE9IQ0kgZXZ0XyogZXJyb3IgMHgleCIsIHN0YXR1cyAmIDB4MWYpOworCQkJCWFjayA9IEFDS1hfU0VORF9FUlJPUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVZUX1VOS05PV046CisJCQljYXNlIEVWVF9GTFVTSEVEOgorCQkJCWFjayA9IEFDS1hfU0VORF9FUlJPUjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJUFJJTlQoS0VSTl9FUlIsICJVbmhhbmRsZWQgT0hDSSBldnRfKiBlcnJvciAweCV4Iiwgc3RhdHVzICYgMHgxZik7CisJCQkJYWNrID0gQUNLWF9TRU5EX0VSUk9SOworCQkJCUJVRygpOworCQkJfQorCQl9CisKKwkJbGlzdF9kZWxfaW5pdCgmcGFja2V0LT5kcml2ZXJfbGlzdCk7CisJCWhwc2JfcGFja2V0X3NlbnQob2hjaS0+aG9zdCwgcGFja2V0LCBhY2spOworCisJCWlmIChkYXRhc2l6ZSkgeworCQkJcGNpX3VubWFwX3NpbmdsZShvaGNpLT5kZXYsCisJCQkJCSBjcHVfdG9fbGUzMihkLT5wcmdfY3B1W2QtPnNlbnRfaW5kXS0+ZW5kLmFkZHJlc3MpLAorCQkJCQkgZGF0YXNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJT0hDSV9ETUFfRlJFRSgic2luZ2xlIFhtaXQgZGF0YSBwYWNrZXQiKTsKKwkJfQorCisJCWQtPnNlbnRfaW5kID0gKGQtPnNlbnRfaW5kKzEpJWQtPm51bV9kZXNjOworCQlkLT5mcmVlX3ByZ3MrKzsKKwl9CisKKwlkbWFfdHJtX2ZsdXNoKG9oY2ksIGQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2RtYV9yY3ZfY3R4KHN0cnVjdCBkbWFfcmN2X2N0eCAqZCkKK3sKKwlpZiAoZC0+Y3RybENsZWFyKSB7CisJCW9oY2kxMzk0X3N0b3BfY29udGV4dChkLT5vaGNpLCBkLT5jdHJsQ2xlYXIsIE5VTEwpOworCisJCWlmIChkLT50eXBlID09IERNQV9DVFhfSVNPKSB7CisJCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJCXJlZ193cml0ZShkLT5vaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50TWFza0NsZWFyLCAxIDw8IGQtPmN0eCk7CisJCQlvaGNpMTM5NF91bnJlZ2lzdGVyX2lzb190YXNrbGV0KGQtPm9oY2ksICZkLT5vaGNpLT5pcl9sZWdhY3lfdGFza2xldCk7CisJCX0gZWxzZSB7CisJCQl0YXNrbGV0X2tpbGwoJmQtPnRhc2spOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGZyZWVfZG1hX3Jjdl9jdHgoc3RydWN0IGRtYV9yY3ZfY3R4ICpkKQoreworCWludCBpOworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0gZC0+b2hjaTsKKworCWlmIChvaGNpID09IE5VTEwpCisJCXJldHVybjsKKworCURCR01TRygiRnJlZWluZyBkbWFfcmN2X2N0eCAlZCIsIGQtPmN0eCk7CisKKwlpZiAoZC0+YnVmX2NwdSkgeworCQlmb3IgKGk9MDsgaTxkLT5udW1fZGVzYzsgaSsrKQorCQkJaWYgKGQtPmJ1Zl9jcHVbaV0gJiYgZC0+YnVmX2J1c1tpXSkgeworCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoCisJCQkJCW9oY2ktPmRldiwgZC0+YnVmX3NpemUsCisJCQkJCWQtPmJ1Zl9jcHVbaV0sIGQtPmJ1Zl9idXNbaV0pOworCQkJCU9IQ0lfRE1BX0ZSRUUoImNvbnNpc3RlbnQgZG1hX3JjdiBidWZbJWRdIiwgaSk7CisJCQl9CisJCWtmcmVlKGQtPmJ1Zl9jcHUpOworCQlrZnJlZShkLT5idWZfYnVzKTsKKwl9CisJaWYgKGQtPnByZ19jcHUpIHsKKwkJZm9yIChpPTA7IGk8ZC0+bnVtX2Rlc2M7IGkrKykKKwkJCWlmIChkLT5wcmdfY3B1W2ldICYmIGQtPnByZ19idXNbaV0pIHsKKwkJCQlwY2lfcG9vbF9mcmVlKGQtPnByZ19wb29sLCBkLT5wcmdfY3B1W2ldLCBkLT5wcmdfYnVzW2ldKTsKKwkJCQlPSENJX0RNQV9GUkVFKCJjb25zaXN0ZW50IGRtYV9yY3YgcHJnWyVkXSIsIGkpOworCQkJfQorCQlwY2lfcG9vbF9kZXN0cm95KGQtPnByZ19wb29sKTsKKwkJT0hDSV9ETUFfRlJFRSgiZG1hX3JjdiBwcmcgcG9vbCIpOworCQlrZnJlZShkLT5wcmdfY3B1KTsKKwkJa2ZyZWUoZC0+cHJnX2J1cyk7CisJfQorCWlmIChkLT5zcGIpIGtmcmVlKGQtPnNwYik7CisKKwkvKiBNYXJrIHRoaXMgY29udGV4dCBhcyBmcmVlZC4gKi8KKwlkLT5vaGNpID0gTlVMTDsKK30KKworc3RhdGljIGludAorYWxsb2NfZG1hX3Jjdl9jdHgoc3RydWN0IHRpX29oY2kgKm9oY2ksIHN0cnVjdCBkbWFfcmN2X2N0eCAqZCwKKwkJICBlbnVtIGNvbnRleHRfdHlwZSB0eXBlLCBpbnQgY3R4LCBpbnQgbnVtX2Rlc2MsCisJCSAgaW50IGJ1Zl9zaXplLCBpbnQgc3BsaXRfYnVmX3NpemUsIGludCBjb250ZXh0X2Jhc2UpCit7CisJaW50IGksIGxlbjsKKwlzdGF0aWMgaW50IG51bV9hbGxvY3M7CisJc3RhdGljIGNoYXIgcG9vbF9uYW1lWzIwXTsKKworCWQtPm9oY2kgPSBvaGNpOworCWQtPnR5cGUgPSB0eXBlOworCWQtPmN0eCA9IGN0eDsKKworCWQtPm51bV9kZXNjID0gbnVtX2Rlc2M7CisJZC0+YnVmX3NpemUgPSBidWZfc2l6ZTsKKwlkLT5zcGxpdF9idWZfc2l6ZSA9IHNwbGl0X2J1Zl9zaXplOworCisJZC0+Y3RybFNldCA9IDA7CisJZC0+Y3RybENsZWFyID0gMDsKKwlkLT5jbWRQdHIgPSAwOworCisJZC0+YnVmX2NwdSA9IGttYWxsb2MoZC0+bnVtX2Rlc2MgKiBzaXplb2YocXVhZGxldF90KiksIEdGUF9BVE9NSUMpOworCWQtPmJ1Zl9idXMgPSBrbWFsbG9jKGQtPm51bV9kZXNjICogc2l6ZW9mKGRtYV9hZGRyX3QpLCBHRlBfQVRPTUlDKTsKKworCWlmIChkLT5idWZfY3B1ID09IE5VTEwgfHwgZC0+YnVmX2J1cyA9PSBOVUxMKSB7CisJCVBSSU5UKEtFUk5fRVJSLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRtYSBidWZmZXIiKTsKKwkJZnJlZV9kbWFfcmN2X2N0eChkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChkLT5idWZfY3B1LCAwLCBkLT5udW1fZGVzYyAqIHNpemVvZihxdWFkbGV0X3QqKSk7CisJbWVtc2V0KGQtPmJ1Zl9idXMsIDAsIGQtPm51bV9kZXNjICogc2l6ZW9mKGRtYV9hZGRyX3QpKTsKKworCWQtPnByZ19jcHUgPSBrbWFsbG9jKGQtPm51bV9kZXNjICogc2l6ZW9mKHN0cnVjdCBkbWFfY21kKiksCisJCQkJR0ZQX0FUT01JQyk7CisJZC0+cHJnX2J1cyA9IGttYWxsb2MoZC0+bnVtX2Rlc2MgKiBzaXplb2YoZG1hX2FkZHJfdCksIEdGUF9BVE9NSUMpOworCisJaWYgKGQtPnByZ19jcHUgPT0gTlVMTCB8fCBkLT5wcmdfYnVzID09IE5VTEwpIHsKKwkJUFJJTlQoS0VSTl9FUlIsICJGYWlsZWQgdG8gYWxsb2NhdGUgZG1hIHByZyIpOworCQlmcmVlX2RtYV9yY3ZfY3R4KGQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGQtPnByZ19jcHUsIDAsIGQtPm51bV9kZXNjICogc2l6ZW9mKHN0cnVjdCBkbWFfY21kKikpOworCW1lbXNldChkLT5wcmdfYnVzLCAwLCBkLT5udW1fZGVzYyAqIHNpemVvZihkbWFfYWRkcl90KSk7CisKKwlkLT5zcGIgPSBrbWFsbG9jKGQtPnNwbGl0X2J1Zl9zaXplLCBHRlBfQVRPTUlDKTsKKworCWlmIChkLT5zcGIgPT0gTlVMTCkgeworCQlQUklOVChLRVJOX0VSUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGxpdCBidWZmZXIiKTsKKwkJZnJlZV9kbWFfcmN2X2N0eChkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQorCWxlbiA9IHNwcmludGYocG9vbF9uYW1lLCAib2hjaTEzOTRfcmN2X3ByZyIpOworCXNwcmludGYocG9vbF9uYW1lK2xlbiwgIiVkIiwgbnVtX2FsbG9jcyk7CisJZC0+cHJnX3Bvb2wgPSBwY2lfcG9vbF9jcmVhdGUocG9vbF9uYW1lLCBvaGNpLT5kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBkbWFfY21kKSwgNCwgMCk7CisJaWYoZC0+cHJnX3Bvb2wgPT0gTlVMTCkKKwl7CisJCVBSSU5UKEtFUk5fRVJSLCAicGNpX3Bvb2xfY3JlYXRlIGZhaWxlZCBmb3IgJXMiLCBwb29sX25hbWUpOworCQlmcmVlX2RtYV9yY3ZfY3R4KGQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbnVtX2FsbG9jcysrOworCisJT0hDSV9ETUFfQUxMT0MoImRtYV9yY3YgcHJnIHBvb2wiKTsKKworCWZvciAoaT0wOyBpPGQtPm51bV9kZXNjOyBpKyspIHsKKwkJZC0+YnVmX2NwdVtpXSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG9oY2ktPmRldiwKKwkJCQkJCSAgICAgZC0+YnVmX3NpemUsCisJCQkJCQkgICAgIGQtPmJ1Zl9idXMraSk7CisJCU9IQ0lfRE1BX0FMTE9DKCJjb25zaXN0ZW50IGRtYV9yY3YgYnVmWyVkXSIsIGkpOworCisJCWlmIChkLT5idWZfY3B1W2ldICE9IE5VTEwpIHsKKwkJCW1lbXNldChkLT5idWZfY3B1W2ldLCAwLCBkLT5idWZfc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlQUklOVChLRVJOX0VSUiwKKwkJCSAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlciIpOworCQkJZnJlZV9kbWFfcmN2X2N0eChkKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJZC0+cHJnX2NwdVtpXSA9IHBjaV9wb29sX2FsbG9jKGQtPnByZ19wb29sLCBTTEFCX0tFUk5FTCwgZC0+cHJnX2J1cytpKTsKKwkJT0hDSV9ETUFfQUxMT0MoInBvb2wgZG1hX3JjdiBwcmdbJWRdIiwgaSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZC0+cHJnX2NwdVtpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZC0+cHJnX2NwdVtpXSwgMCwgc2l6ZW9mKHN0cnVjdCBkbWFfY21kKSk7CisJCX0gZWxzZSB7CisJCQlQUklOVChLRVJOX0VSUiwKKwkJCSAgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZG1hIHByZyIpOworCQkJZnJlZV9kbWFfcmN2X2N0eChkKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisgICAgICAgIHNwaW5fbG9ja19pbml0KCZkLT5sb2NrKTsKKworCWlmICh0eXBlID09IERNQV9DVFhfSVNPKSB7CisJCW9oY2kxMzk0X2luaXRfaXNvX3Rhc2tsZXQoJm9oY2ktPmlyX2xlZ2FjeV90YXNrbGV0LAorCQkJCQkgIE9IQ0lfSVNPX01VTFRJQ0hBTk5FTF9SRUNFSVZFLAorCQkJCQkgIGRtYV9yY3ZfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpIGQpOworCQlpZiAob2hjaTEzOTRfcmVnaXN0ZXJfaXNvX3Rhc2tsZXQob2hjaSwKKwkJCQkJCSAgJm9oY2ktPmlyX2xlZ2FjeV90YXNrbGV0KSA8IDApIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCAiTm8gSVIgRE1BIGNvbnRleHQgYXZhaWxhYmxlIik7CisJCQlmcmVlX2RtYV9yY3ZfY3R4KGQpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCS8qIHRoZSBJUiBjb250ZXh0IGNhbiBiZSBhc3NpZ25lZCB0byBhbnkgRE1BIGNvbnRleHQKKwkJICogYnkgb2hjaTEzOTRfcmVnaXN0ZXJfaXNvX3Rhc2tsZXQgKi8KKwkJZC0+Y3R4ID0gb2hjaS0+aXJfbGVnYWN5X3Rhc2tsZXQuY29udGV4dDsKKwkJZC0+Y3RybFNldCA9IE9IQ0kxMzk0X0lzb1JjdkNvbnRleHRDb250cm9sU2V0ICsgMzIqZC0+Y3R4OworCQlkLT5jdHJsQ2xlYXIgPSBPSENJMTM5NF9Jc29SY3ZDb250ZXh0Q29udHJvbENsZWFyICsgMzIqZC0+Y3R4OworCQlkLT5jbWRQdHIgPSBPSENJMTM5NF9Jc29SY3ZDb21tYW5kUHRyICsgMzIqZC0+Y3R4OworCQlkLT5jdHh0TWF0Y2ggPSBPSENJMTM5NF9Jc29SY3ZDb250ZXh0TWF0Y2ggKyAzMipkLT5jdHg7CisJfSBlbHNlIHsKKwkJZC0+Y3RybFNldCA9IGNvbnRleHRfYmFzZSArIE9IQ0kxMzk0X0NvbnRleHRDb250cm9sU2V0OworCQlkLT5jdHJsQ2xlYXIgPSBjb250ZXh0X2Jhc2UgKyBPSENJMTM5NF9Db250ZXh0Q29udHJvbENsZWFyOworCQlkLT5jbWRQdHIgPSBjb250ZXh0X2Jhc2UgKyBPSENJMTM5NF9Db250ZXh0Q29tbWFuZFB0cjsKKworCQl0YXNrbGV0X2luaXQgKCZkLT50YXNrLCBkbWFfcmN2X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9kbWFfdHJtX2N0eChzdHJ1Y3QgZG1hX3RybV9jdHggKmQpCit7CisJaW50IGk7CisJc3RydWN0IHRpX29oY2kgKm9oY2kgPSBkLT5vaGNpOworCisJaWYgKG9oY2kgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJREJHTVNHKCJGcmVlaW5nIGRtYV90cm1fY3R4ICVkIiwgZC0+Y3R4KTsKKworCWlmIChkLT5wcmdfY3B1KSB7CisJCWZvciAoaT0wOyBpPGQtPm51bV9kZXNjOyBpKyspCisJCQlpZiAoZC0+cHJnX2NwdVtpXSAmJiBkLT5wcmdfYnVzW2ldKSB7CisJCQkJcGNpX3Bvb2xfZnJlZShkLT5wcmdfcG9vbCwgZC0+cHJnX2NwdVtpXSwgZC0+cHJnX2J1c1tpXSk7CisJCQkJT0hDSV9ETUFfRlJFRSgicG9vbCBkbWFfdHJtIHByZ1slZF0iLCBpKTsKKwkJCX0KKwkJcGNpX3Bvb2xfZGVzdHJveShkLT5wcmdfcG9vbCk7CisJCU9IQ0lfRE1BX0ZSRUUoImRtYV90cm0gcHJnIHBvb2wiKTsKKwkJa2ZyZWUoZC0+cHJnX2NwdSk7CisJCWtmcmVlKGQtPnByZ19idXMpOworCX0KKworCS8qIE1hcmsgdGhpcyBjb250ZXh0IGFzIGZyZWVkLiAqLworCWQtPm9oY2kgPSBOVUxMOworfQorCitzdGF0aWMgaW50CithbGxvY19kbWFfdHJtX2N0eChzdHJ1Y3QgdGlfb2hjaSAqb2hjaSwgc3RydWN0IGRtYV90cm1fY3R4ICpkLAorCQkgIGVudW0gY29udGV4dF90eXBlIHR5cGUsIGludCBjdHgsIGludCBudW1fZGVzYywKKwkJICBpbnQgY29udGV4dF9iYXNlKQoreworCWludCBpLCBsZW47CisJc3RhdGljIGNoYXIgcG9vbF9uYW1lWzIwXTsKKwlzdGF0aWMgaW50IG51bV9hbGxvY3M9MDsKKworCWQtPm9oY2kgPSBvaGNpOworCWQtPnR5cGUgPSB0eXBlOworCWQtPmN0eCA9IGN0eDsKKwlkLT5udW1fZGVzYyA9IG51bV9kZXNjOworCWQtPmN0cmxTZXQgPSAwOworCWQtPmN0cmxDbGVhciA9IDA7CisJZC0+Y21kUHRyID0gMDsKKworCWQtPnByZ19jcHUgPSBrbWFsbG9jKGQtPm51bV9kZXNjICogc2l6ZW9mKHN0cnVjdCBhdF9kbWFfcHJnKiksCisJCQkgICAgIEdGUF9LRVJORUwpOworCWQtPnByZ19idXMgPSBrbWFsbG9jKGQtPm51bV9kZXNjICogc2l6ZW9mKGRtYV9hZGRyX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmIChkLT5wcmdfY3B1ID09IE5VTEwgfHwgZC0+cHJnX2J1cyA9PSBOVUxMKSB7CisJCVBSSU5UKEtFUk5fRVJSLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGF0IGRtYSBwcmciKTsKKwkJZnJlZV9kbWFfdHJtX2N0eChkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChkLT5wcmdfY3B1LCAwLCBkLT5udW1fZGVzYyAqIHNpemVvZihzdHJ1Y3QgYXRfZG1hX3ByZyopKTsKKwltZW1zZXQoZC0+cHJnX2J1cywgMCwgZC0+bnVtX2Rlc2MgKiBzaXplb2YoZG1hX2FkZHJfdCkpOworCisJbGVuID0gc3ByaW50Zihwb29sX25hbWUsICJvaGNpMTM5NF90cm1fcHJnIik7CisJc3ByaW50Zihwb29sX25hbWUrbGVuLCAiJWQiLCBudW1fYWxsb2NzKTsKKwlkLT5wcmdfcG9vbCA9IHBjaV9wb29sX2NyZWF0ZShwb29sX25hbWUsIG9oY2ktPmRldiwKKwkJCQlzaXplb2Yoc3RydWN0IGF0X2RtYV9wcmcpLCA0LCAwKTsKKwlpZiAoZC0+cHJnX3Bvb2wgPT0gTlVMTCkgeworCQlQUklOVChLRVJOX0VSUiwgInBjaV9wb29sX2NyZWF0ZSBmYWlsZWQgZm9yICVzIiwgcG9vbF9uYW1lKTsKKwkJZnJlZV9kbWFfdHJtX2N0eChkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW51bV9hbGxvY3MrKzsKKworCU9IQ0lfRE1BX0FMTE9DKCJkbWFfcmN2IHByZyBwb29sIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZC0+bnVtX2Rlc2M7IGkrKykgeworCQlkLT5wcmdfY3B1W2ldID0gcGNpX3Bvb2xfYWxsb2MoZC0+cHJnX3Bvb2wsIFNMQUJfS0VSTkVMLCBkLT5wcmdfYnVzK2kpOworCQlPSENJX0RNQV9BTExPQygicG9vbCBkbWFfdHJtIHByZ1slZF0iLCBpKTsKKworICAgICAgICAgICAgICAgIGlmIChkLT5wcmdfY3B1W2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkLT5wcmdfY3B1W2ldLCAwLCBzaXplb2Yoc3RydWN0IGF0X2RtYV9wcmcpKTsKKwkJfSBlbHNlIHsKKwkJCVBSSU5UKEtFUk5fRVJSLAorCQkJICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBhdCBkbWEgcHJnIik7CisJCQlmcmVlX2RtYV90cm1fY3R4KGQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmQtPmxvY2spOworCisJLyogaW5pdGlhbGl6ZSB0YXNrbGV0ICovCisJaWYgKHR5cGUgPT0gRE1BX0NUWF9JU08pIHsKKwkJb2hjaTEzOTRfaW5pdF9pc29fdGFza2xldCgmb2hjaS0+aXRfbGVnYWN5X3Rhc2tsZXQsIE9IQ0lfSVNPX1RSQU5TTUlULAorCQkJCQkgIGRtYV90cm1fdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpIGQpOworCQlpZiAob2hjaTEzOTRfcmVnaXN0ZXJfaXNvX3Rhc2tsZXQob2hjaSwKKwkJCQkJCSAgJm9oY2ktPml0X2xlZ2FjeV90YXNrbGV0KSA8IDApIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCAiTm8gSVQgRE1BIGNvbnRleHQgYXZhaWxhYmxlIik7CisJCQlmcmVlX2RtYV90cm1fY3R4KGQpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCS8qIElUIGNhbiBiZSBhc3NpZ25lZCB0byBhbnkgY29udGV4dCBieSByZWdpc3Rlcl9pc29fdGFza2xldCAqLworCQlkLT5jdHggPSBvaGNpLT5pdF9sZWdhY3lfdGFza2xldC5jb250ZXh0OworCQlkLT5jdHJsU2V0ID0gT0hDSTEzOTRfSXNvWG1pdENvbnRleHRDb250cm9sU2V0ICsgMTYgKiBkLT5jdHg7CisJCWQtPmN0cmxDbGVhciA9IE9IQ0kxMzk0X0lzb1htaXRDb250ZXh0Q29udHJvbENsZWFyICsgMTYgKiBkLT5jdHg7CisJCWQtPmNtZFB0ciA9IE9IQ0kxMzk0X0lzb1htaXRDb21tYW5kUHRyICsgMTYgKiBkLT5jdHg7CisJfSBlbHNlIHsKKwkJZC0+Y3RybFNldCA9IGNvbnRleHRfYmFzZSArIE9IQ0kxMzk0X0NvbnRleHRDb250cm9sU2V0OworCQlkLT5jdHJsQ2xlYXIgPSBjb250ZXh0X2Jhc2UgKyBPSENJMTM5NF9Db250ZXh0Q29udHJvbENsZWFyOworCQlkLT5jbWRQdHIgPSBjb250ZXh0X2Jhc2UgKyBPSENJMTM5NF9Db250ZXh0Q29tbWFuZFB0cjsKKwkJdGFza2xldF9pbml0ICgmZC0+dGFzaywgZG1hX3RybV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb2hjaV9zZXRfaHdfY29uZmlnX3JvbShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBxdWFkbGV0X3QgKmNvbmZpZ19yb20pCit7CisJc3RydWN0IHRpX29oY2kgKm9oY2kgPSBob3N0LT5ob3N0ZGF0YTsKKworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Db25maWdST01oZHIsIGJlMzJfdG9fY3B1KGNvbmZpZ19yb21bMF0pKTsKKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfQnVzT3B0aW9ucywgYmUzMl90b19jcHUoY29uZmlnX3JvbVsyXSkpOworCisJbWVtY3B5KG9oY2ktPmNzcl9jb25maWdfcm9tX2NwdSwgY29uZmlnX3JvbSwgT0hDSV9DT05GSUdfUk9NX0xFTik7Cit9CisKKworc3RhdGljIHF1YWRsZXRfdCBvaGNpX2h3X2Nzcl9yZWcoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IHJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWRsZXRfdCBkYXRhLCBxdWFkbGV0X3QgY29tcGFyZSkKK3sKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IGhvc3QtPmhvc3RkYXRhOworCWludCBpOworCisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0NTUkRhdGEsIGRhdGEpOworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9DU1JDb21wYXJlRGF0YSwgY29tcGFyZSk7CisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0NTUkNvbnRyb2wsIHJlZyAmIDB4Myk7CisKKwlmb3IgKGkgPSAwOyBpIDwgT0hDSV9MT09QX0NPVU5UOyBpKyspIHsKKwkJaWYgKHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0NTUkNvbnRyb2wpICYgMHg4MDAwMDAwMCkKKwkJCWJyZWFrOworCisJCW1kZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfQ1NSRGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9ob3N0X2RyaXZlciBvaGNpMTM5NF9kcml2ZXIgPSB7CisJLm93bmVyID0JCVRISVNfTU9EVUxFLAorCS5uYW1lID0JCQlPSENJMTM5NF9EUklWRVJfTkFNRSwKKwkuc2V0X2h3X2NvbmZpZ19yb20gPQlvaGNpX3NldF9od19jb25maWdfcm9tLAorCS50cmFuc21pdF9wYWNrZXQgPQlvaGNpX3RyYW5zbWl0LAorCS5kZXZjdGwgPQkJb2hjaV9kZXZjdGwsCisJLmlzb2N0bCA9ICAgICAgICAgICAgICAgb2hjaV9pc29jdGwsCisJLmh3X2Nzcl9yZWcgPQkJb2hjaV9od19jc3JfcmVnLAorfTsKKworDAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBDSSBEcml2ZXIgSW50ZXJmYWNlIGZ1bmN0aW9ucyAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZBSUwoZXJyLCBmbXQsIGFyZ3MuLi4pCQkJXAorZG8gewkJCQkJCVwKKwlQUklOVF9HKEtFUk5fRVJSLCBmbXQgLCAjIyBhcmdzKTsJXAorICAgICAgICBvaGNpMTM5NF9wY2lfcmVtb3ZlKGRldik7ICAgICAgICAgICAgICAgXAorCXJldHVybiBlcnI7CQkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG9oY2kxMzk0X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgdmVyc2lvbl9wcmludGVkID0gMDsKKworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CisJc3RydWN0IHRpX29oY2kgKm9oY2k7CS8qIHNob3J0Y3V0IHRvIGN1cnJlbnRseSBoYW5kbGVkIGRldmljZSAqLworCXVuc2lnbmVkIGxvbmcgb2hjaV9iYXNlOworCisJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCVBSSU5UX0coS0VSTl9JTkZPLCAiJXMiLCB2ZXJzaW9uKTsKKworICAgICAgICBpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKKwkJRkFJTCgtRU5YSU8sICJGYWlsZWQgdG8gZW5hYmxlIE9IQ0kgaGFyZHdhcmUiKTsKKyAgICAgICAgcGNpX3NldF9tYXN0ZXIoZGV2KTsKKworCWhvc3QgPSBocHNiX2FsbG9jX2hvc3QoJm9oY2kxMzk0X2RyaXZlciwgc2l6ZW9mKHN0cnVjdCB0aV9vaGNpKSwgJmRldi0+ZGV2KTsKKwlpZiAoIWhvc3QpIEZBSUwoLUVOT01FTSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBob3N0IHN0cnVjdHVyZSIpOworCisJb2hjaSA9IGhvc3QtPmhvc3RkYXRhOworCW9oY2ktPmRldiA9IGRldjsKKwlvaGNpLT5ob3N0ID0gaG9zdDsKKwlvaGNpLT5pbml0X3N0YXRlID0gT0hDSV9JTklUX0FMTE9DX0hPU1Q7CisJaG9zdC0+cGRldiA9IGRldjsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBvaGNpKTsKKworCS8qIFdlIGRvbid0IHdhbnQgaGFyZHdhcmUgc3dhcHBpbmcgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgT0hDSTEzOTRfUENJX0hDSV9Db250cm9sLCAwKTsKKworCS8qIFNvbWUgb2RkYmFsbCBBcHBsZSBjb250cm9sbGVycyBkbyBub3Qgb3JkZXIgdGhlIHNlbGZpZAorCSAqIHByb3Blcmx5LCBzbyB3ZSBtYWtlIHVwIGZvciBpdCBoZXJlLiAgKi8KKyNpZm5kZWYgX19MSVRUTEVfRU5ESUFOCisJLyogWFhYOiBOZWVkIGEgYmV0dGVyIHdheSB0byBjaGVjayB0aGlzLiBJJ20gd29uZGVyaW5nIGlmIHdlIGNhbgorCSAqIHJlYWQgdGhlIHZhbHVlcyBvZiB0aGUgT0hDSTEzOTRfUENJX0hDSV9Db250cm9sIGFuZCB0aGUKKwkgKiBub0J5dGVTd2FwRGF0YSByZWdpc3RlcnMgdG8gc2VlIGlmIHRoZXkgd2VyZSBub3QgY2xlYXJlZCB0bworCSAqIHplcm8uIFNob3VsZCB0aGlzIHdvcms/IE9idmlvdXNseSBpdCdzIG5vdCBkZWZpbmVkIHdoYXQgdGhlc2UKKwkgKiByZWdpc3RlcnMgd2lsbCByZWFkIHdoZW4gdGhleSBhcmVuJ3Qgc3VwcG9ydGVkLiBCbGVoISAqLworCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FQUExFICYmCisJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVBQTEVfVU5JX05fRlcpIHsKKwkJb2hjaS0+bm9fc3dhcF9pbmNvbWluZyA9IDE7CisJCW9oY2ktPnNlbGZpZF9zd2FwID0gMDsKKwl9IGVsc2UKKwkJb2hjaS0+c2VsZmlkX3N3YXAgPSAxOworI2VuZGlmCisKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UyX0ZXCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTJfRlcgMHgwMDZlCisjZW5kaWYKKworCS8qIFRoZXNlIGNoaXBzZXRzIHJlcXVpcmUgYSBiaXQgb2YgZXh0cmEgY2FyZSB3aGVuIGNoZWNraW5nIGFmdGVyCisJICogYSBidXNyZXNldC4gICovCisJaWYgKChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FQUExFICYmCisJICAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0ZXKSB8fAorCSAgICAoZGV2LT52ZW5kb3IgPT0gIFBDSV9WRU5ET1JfSURfTlZJRElBICYmCisJICAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UyX0ZXKSkKKwkJb2hjaS0+Y2hlY2tfYnVzcmVzZXQgPSAxOworCisJLyogV2UgaGFyZHdpcmUgdGhlIE1NSU8gbGVuZ3RoLCBzaW5jZSBzb21lIENhcmRCdXMgYWRhcHRvcnMKKwkgKiBmYWlsIHRvIHJlcG9ydCB0aGUgcmlnaHQgbGVuZ3RoLiAgQW55d2F5LCB0aGUgb2hjaSBzcGVjCisJICogY2xlYXJseSBzYXlzIGl0J3MgMmtiLCBzbyB0aGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0uICovCisJb2hjaV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CisJaWYgKHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSAhPSBPSENJMTM5NF9SRUdJU1RFUl9TSVpFKQorCQlQUklOVChLRVJOX1dBUk5JTkcsICJVbmV4cGVjdGVkIFBDSSByZXNvdXJjZSBsZW5ndGggb2YgJWx4ISIsCisJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSk7CisKKwkvKiBTZWVtcyBQQ01DSUEgaGFuZGxlcyB0aGlzIGludGVybmFsbHkuIE5vdCBzdXJlIHdoeS4gU2VlbXMKKwkgKiBwcmV0dHkgYm9ndXMgdG8gZm9yY2UgYSBkcml2ZXIgdG8gc3BlY2lhbCBjYXNlIHRoaXMuICAqLworI2lmbmRlZiBQQ01DSUEKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbiAob2hjaV9iYXNlLCBPSENJMTM5NF9SRUdJU1RFUl9TSVpFLCBPSENJMTM5NF9EUklWRVJfTkFNRSkpCisJCUZBSUwoLUVOT01FTSwgIk1NSU8gcmVzb3VyY2UgKDB4JWx4IC0gMHglbHgpIHVuYXZhaWxhYmxlIiwKKwkJICAgICBvaGNpX2Jhc2UsIG9oY2lfYmFzZSArIE9IQ0kxMzk0X1JFR0lTVEVSX1NJWkUpOworI2VuZGlmCisJb2hjaS0+aW5pdF9zdGF0ZSA9IE9IQ0lfSU5JVF9IQVZFX01FTV9SRUdJT047CisKKwlvaGNpLT5yZWdpc3RlcnMgPSBpb3JlbWFwKG9oY2lfYmFzZSwgT0hDSTEzOTRfUkVHSVNURVJfU0laRSk7CisJaWYgKG9oY2ktPnJlZ2lzdGVycyA9PSBOVUxMKQorCQlGQUlMKC1FTlhJTywgIkZhaWxlZCB0byByZW1hcCByZWdpc3RlcnMgLSBjYXJkIG5vdCBhY2Nlc3NpYmxlIik7CisJb2hjaS0+aW5pdF9zdGF0ZSA9IE9IQ0lfSU5JVF9IQVZFX0lPTUFQUElORzsKKwlEQkdNU0coIlJlbWFwcGVkIG1lbW9yeSBzcGFjZXMgcmVnIDB4JXAiLCBvaGNpLT5yZWdpc3RlcnMpOworCisJLyogY3NyX2NvbmZpZyByb20gYWxsb2NhdGlvbiAqLworCW9oY2ktPmNzcl9jb25maWdfcm9tX2NwdSA9CisJCXBjaV9hbGxvY19jb25zaXN0ZW50KG9oY2ktPmRldiwgT0hDSV9DT05GSUdfUk9NX0xFTiwKKwkJCQkgICAgICZvaGNpLT5jc3JfY29uZmlnX3JvbV9idXMpOworCU9IQ0lfRE1BX0FMTE9DKCJjb25zaXN0ZW50IGNzcl9jb25maWdfcm9tIik7CisJaWYgKG9oY2ktPmNzcl9jb25maWdfcm9tX2NwdSA9PSBOVUxMKQorCQlGQUlMKC1FTk9NRU0sICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGNvbmZpZyByb20iKTsKKwlvaGNpLT5pbml0X3N0YXRlID0gT0hDSV9JTklUX0hBVkVfQ09ORklHX1JPTV9CVUZGRVI7CisKKwkvKiBzZWxmLWlkIGRtYSBidWZmZXIgYWxsb2NhdGlvbiAqLworCW9oY2ktPnNlbGZpZF9idWZfY3B1ID0KKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQob2hjaS0+ZGV2LCBPSENJMTM5NF9TSV9ETUFfQlVGX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgJm9oY2ktPnNlbGZpZF9idWZfYnVzKTsKKwlPSENJX0RNQV9BTExPQygiY29uc2lzdGVudCBzZWxmaWRfYnVmIik7CisKKwlpZiAob2hjaS0+c2VsZmlkX2J1Zl9jcHUgPT0gTlVMTCkKKwkJRkFJTCgtRU5PTUVNLCAiRmFpbGVkIHRvIGFsbG9jYXRlIERNQSBidWZmZXIgZm9yIHNlbGYtaWQgcGFja2V0cyIpOworCW9oY2ktPmluaXRfc3RhdGUgPSBPSENJX0lOSVRfSEFWRV9TRUxGSURfQlVGRkVSOworCisJaWYgKCh1bnNpZ25lZCBsb25nKW9oY2ktPnNlbGZpZF9idWZfY3B1ICYgMHgxZmZmKQorCQlQUklOVChLRVJOX0lORk8sICJTZWxmSUQgYnVmZmVyICVwIGlzIG5vdCBhbGlnbmVkIG9uICIKKwkJICAgICAgIjhLYiBib3VuZGFyeS4uLiBtYXkgY2F1c2UgcHJvYmxlbXMgb24gc29tZSBDWEQzMjIyIGNoaXAiLAorCQkgICAgICBvaGNpLT5zZWxmaWRfYnVmX2NwdSk7CisKKwkvKiBObyBzZWxmLWlkIGVycm9ycyBhdCBzdGFydHVwICovCisJb2hjaS0+c2VsZl9pZF9lcnJvcnMgPSAwOworCisJb2hjaS0+aW5pdF9zdGF0ZSA9IE9IQ0lfSU5JVF9IQVZFX1RYUlhfQlVGRkVSU19fTUFZQkU7CisJLyogQVIgRE1BIHJlcXVlc3QgY29udGV4dCBhbGxvY2F0aW9uICovCisJaWYgKGFsbG9jX2RtYV9yY3ZfY3R4KG9oY2ksICZvaGNpLT5hcl9yZXFfY29udGV4dCwKKwkJCSAgICAgIERNQV9DVFhfQVNZTkNfUkVRLCAwLCBBUl9SRVFfTlVNX0RFU0MsCisJCQkgICAgICBBUl9SRVFfQlVGX1NJWkUsIEFSX1JFUV9TUExJVF9CVUZfU0laRSwKKwkJCSAgICAgIE9IQ0kxMzk0X0FzUmVxUmN2Q29udGV4dEJhc2UpIDwgMCkKKwkJRkFJTCgtRU5PTUVNLCAiRmFpbGVkIHRvIGFsbG9jYXRlIEFSIFJlcSBjb250ZXh0Iik7CisKKwkvKiBBUiBETUEgcmVzcG9uc2UgY29udGV4dCBhbGxvY2F0aW9uICovCisJaWYgKGFsbG9jX2RtYV9yY3ZfY3R4KG9oY2ksICZvaGNpLT5hcl9yZXNwX2NvbnRleHQsCisJCQkgICAgICBETUFfQ1RYX0FTWU5DX1JFU1AsIDAsIEFSX1JFU1BfTlVNX0RFU0MsCisJCQkgICAgICBBUl9SRVNQX0JVRl9TSVpFLCBBUl9SRVNQX1NQTElUX0JVRl9TSVpFLAorCQkJICAgICAgT0hDSTEzOTRfQXNSc3BSY3ZDb250ZXh0QmFzZSkgPCAwKQorCQlGQUlMKC1FTk9NRU0sICJGYWlsZWQgdG8gYWxsb2NhdGUgQVIgUmVzcCBjb250ZXh0Iik7CisKKwkvKiBBVCBETUEgcmVxdWVzdCBjb250ZXh0ICovCisJaWYgKGFsbG9jX2RtYV90cm1fY3R4KG9oY2ksICZvaGNpLT5hdF9yZXFfY29udGV4dCwKKwkJCSAgICAgIERNQV9DVFhfQVNZTkNfUkVRLCAwLCBBVF9SRVFfTlVNX0RFU0MsCisJCQkgICAgICBPSENJMTM5NF9Bc1JlcVRyQ29udGV4dEJhc2UpIDwgMCkKKwkJRkFJTCgtRU5PTUVNLCAiRmFpbGVkIHRvIGFsbG9jYXRlIEFUIFJlcSBjb250ZXh0Iik7CisKKwkvKiBBVCBETUEgcmVzcG9uc2UgY29udGV4dCAqLworCWlmIChhbGxvY19kbWFfdHJtX2N0eChvaGNpLCAmb2hjaS0+YXRfcmVzcF9jb250ZXh0LAorCQkJICAgICAgRE1BX0NUWF9BU1lOQ19SRVNQLCAxLCBBVF9SRVNQX05VTV9ERVNDLAorCQkJICAgICAgT0hDSTEzOTRfQXNSc3BUckNvbnRleHRCYXNlKSA8IDApCisJCUZBSUwoLUVOT01FTSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBBVCBSZXNwIGNvbnRleHQiKTsKKworCS8qIFN0YXJ0IG9mZiB3aXRoIGEgc29mdCByZXNldCwgdG8gY2xlYXIgZXZlcnl0aGluZyB0byBhIHNhbmUKKwkgKiBzdGF0ZS4gKi8KKwlvaGNpX3NvZnRfcmVzZXQob2hjaSk7CisKKwkvKiBOb3cgZW5hYmxlIExQUywgd2hpY2ggd2UgbmVlZCBpbiBvcmRlciB0byBzdGFydCBhY2Nlc3NpbmcKKwkgKiBtb3N0IG9mIHRoZSByZWdpc3RlcnMuICBJbiBmYWN0LCBvbiBzb21lIGNhcmRzIChBTEkgTTUyNTEpLAorCSAqIGFjY2Vzc2luZyByZWdpc3RlcnMgaW4gdGhlIFNDbGsgZG9tYWluIHdpdGhvdXQgTFBTIGVuYWJsZWQKKwkgKiB3aWxsIGxvY2sgdXAgdGhlIG1hY2hpbmUuICBXYWl0IDUwbXNlYyB0byBtYWtlIHN1cmUgd2UgaGF2ZQorCSAqIGZ1bGwgbGluayBlbmFibGVkLiAgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSENDb250cm9sU2V0LCBPSENJMTM5NF9IQ0NvbnRyb2xfTFBTKTsKKworCS8qIERpc2FibGUgYW5kIGNsZWFyIGludGVycnVwdHMgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50RXZlbnRDbGVhciwgMHhmZmZmZmZmZik7CisJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludE1hc2tDbGVhciwgMHhmZmZmZmZmZik7CisKKwltZGVsYXkoNTApOworCisJLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIElSIGFuZCBJVCBjb250ZXh0cy4gKi8KKwlvaGNpLT5uYl9pc29fcmN2X2N0eCA9CisJCWdldF9uYl9pc29fY3R4KG9oY2ksIE9IQ0kxMzk0X0lzb1JlY3ZJbnRNYXNrU2V0KTsKKwlEQkdNU0coIiVkIGlzbyByZWNlaXZlIGNvbnRleHRzIGF2YWlsYWJsZSIsCisJICAgICAgIG9oY2ktPm5iX2lzb19yY3ZfY3R4KTsKKworCW9oY2ktPm5iX2lzb194bWl0X2N0eCA9CisJCWdldF9uYl9pc29fY3R4KG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRNYXNrU2V0KTsKKwlEQkdNU0coIiVkIGlzbyB0cmFuc21pdCBjb250ZXh0cyBhdmFpbGFibGUiLAorCSAgICAgICBvaGNpLT5uYl9pc29feG1pdF9jdHgpOworCisJLyogU2V0IHRoZSB1c2FnZSBiaXRzIGZvciBub24tZXhpc3RlbnQgY29udGV4dHMgc28gdGhleSBjYW4ndAorCSAqIGJlIGFsbG9jYXRlZCAqLworCW9oY2ktPmlyX2N0eF91c2FnZSA9IH4wIDw8IG9oY2ktPm5iX2lzb19yY3ZfY3R4OworCW9oY2ktPml0X2N0eF91c2FnZSA9IH4wIDw8IG9oY2ktPm5iX2lzb194bWl0X2N0eDsKKworCUlOSVRfTElTVF9IRUFEKCZvaGNpLT5pc29fdGFza2xldF9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmb2hjaS0+aXNvX3Rhc2tsZXRfbGlzdF9sb2NrKTsKKwlvaGNpLT5JU09fY2hhbm5lbF91c2FnZSA9IDA7CisgICAgICAgIHNwaW5fbG9ja19pbml0KCZvaGNpLT5JUl9jaGFubmVsX2xvY2spOworCisJLyogQWxsb2NhdGUgdGhlIElSIERNQSBjb250ZXh0IHJpZ2h0IGhlcmUgc28gd2UgZG9uJ3QgaGF2ZQorCSAqIHRvIGRvIGl0IGluIGludGVycnVwdCBwYXRoIC0gbm90ZSB0aGF0IHRoaXMgZG9lc24ndAorCSAqIHdhc3RlIG11Y2ggbWVtb3J5IGFuZCBhdm9pZHMgdGhlIGp1Z2dsZXJ5IHJlcXVpcmVkIHRvCisJICogYWxsb2NhdGUgaXQgaW4gSVJRIHBhdGguICovCisJaWYgKGFsbG9jX2RtYV9yY3ZfY3R4KG9oY2ksICZvaGNpLT5pcl9sZWdhY3lfY29udGV4dCwKKwkJCSAgICAgIERNQV9DVFhfSVNPLCAwLCBJUl9OVU1fREVTQywKKwkJCSAgICAgIElSX0JVRl9TSVpFLCBJUl9TUExJVF9CVUZfU0laRSwKKwkJCSAgICAgIE9IQ0kxMzk0X0lzb1JjdkNvbnRleHRCYXNlKSA8IDApIHsKKwkJRkFJTCgtRU5PTUVNLCAiQ2Fubm90IGFsbG9jYXRlIElSIExlZ2FjeSBETUEgY29udGV4dCIpOworCX0KKworCS8qIFdlIGhvcGVmdWxseSBkb24ndCBoYXZlIHRvIHByZS1hbGxvY2F0ZSBJVCBETUEgbGlrZSB3ZSBkaWQKKwkgKiBmb3IgSVIgRE1BIGFib3ZlLiBBbGxvY2F0ZSBpdCBvbi1kZW1hbmQgYW5kIG1hcmsgaW5hY3RpdmUuICovCisJb2hjaS0+aXRfbGVnYWN5X2NvbnRleHQub2hjaSA9IE5VTEw7CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIG9oY2lfaXJxX2hhbmRsZXIsIFNBX1NISVJRLAorCQkJIE9IQ0kxMzk0X0RSSVZFUl9OQU1FLCBvaGNpKSkKKwkJRkFJTCgtRU5PTUVNLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHNoYXJlZCBpbnRlcnJ1cHQgJWQiLCBkZXYtPmlycSk7CisKKwlvaGNpLT5pbml0X3N0YXRlID0gT0hDSV9JTklUX0hBVkVfSVJROworCW9oY2lfaW5pdGlhbGl6ZShvaGNpKTsKKworCS8qIFNldCBjZXJ0YWluIGNzciB2YWx1ZXMgKi8KKwlob3N0LT5jc3IuZ3VpZF9oaSA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0dVSURIaSk7CisJaG9zdC0+Y3NyLmd1aWRfbG8gPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9HVUlETG8pOworCWhvc3QtPmNzci5jeWNfY2xrX2FjYyA9IDEwMDsgIC8qIGhvdyBkbyB3ZSBkZXRlcm1pbmUgY2xrIGFjY3VyYWN5PyAqLworCWhvc3QtPmNzci5tYXhfcmVjID0gKHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0J1c09wdGlvbnMpID4+IDEyKSAmIDB4ZjsKKwlob3N0LT5jc3IubG5rX3NwZCA9IHJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X0J1c09wdGlvbnMpICYgMHg3OworCisJLyogVGVsbCB0aGUgaGlnaGxldmVsIHRoaXMgaG9zdCBpcyByZWFkeSAqLworCWlmIChocHNiX2FkZF9ob3N0KGhvc3QpKQorCQlGQUlMKC1FTk9NRU0sICJGYWlsZWQgdG8gcmVnaXN0ZXIgaG9zdCB3aXRoIGhpZ2hsZXZlbCIpOworCisJb2hjaS0+aW5pdF9zdGF0ZSA9IE9IQ0lfSU5JVF9ET05FOworCisJcmV0dXJuIDA7CisjdW5kZWYgRkFJTAorfQorCitzdGF0aWMgdm9pZCBvaGNpMTM5NF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCB0aV9vaGNpICpvaGNpOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCW9oY2kgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaWYgKCFvaGNpKQorCQlyZXR1cm47CisKKwlkZXYgPSBnZXRfZGV2aWNlKCZvaGNpLT5ob3N0LT5kZXZpY2UpOworCisJc3dpdGNoIChvaGNpLT5pbml0X3N0YXRlKSB7CisJY2FzZSBPSENJX0lOSVRfRE9ORToKKwkJc3RvcF9kbWFfcmN2X2N0eCgmb2hjaS0+aXJfbGVnYWN5X2NvbnRleHQpOworCQlocHNiX3JlbW92ZV9ob3N0KG9oY2ktPmhvc3QpOworCisJCS8qIENsZWFyIG91dCBCVVMgT3B0aW9ucyAqLworCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfQ29uZmlnUk9NaGRyLCAwKTsKKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0J1c09wdGlvbnMsCisJCQkgIChyZWdfcmVhZChvaGNpLCBPSENJMTM5NF9CdXNPcHRpb25zKSAmIDB4MDAwMGYwMDcpIHwKKwkJCSAgMHgwMGZmMDAwMCk7CisJCW1lbXNldChvaGNpLT5jc3JfY29uZmlnX3JvbV9jcHUsIDAsIE9IQ0lfQ09ORklHX1JPTV9MRU4pOworCisJY2FzZSBPSENJX0lOSVRfSEFWRV9JUlE6CisJCS8qIENsZWFyIGludGVycnVwdCByZWdpc3RlcnMgKi8KKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0ludE1hc2tDbGVhciwgMHhmZmZmZmZmZik7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRFdmVudENsZWFyLCAweGZmZmZmZmZmKTsKKwkJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0lzb1htaXRJbnRNYXNrQ2xlYXIsIDB4ZmZmZmZmZmYpOworCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvWG1pdEludEV2ZW50Q2xlYXIsIDB4ZmZmZmZmZmYpOworCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludE1hc2tDbGVhciwgMHhmZmZmZmZmZik7CisJCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29SZWN2SW50RXZlbnRDbGVhciwgMHhmZmZmZmZmZik7CisKKwkJLyogRGlzYWJsZSBJUk0gQ29udGVuZGVyICovCisJCXNldF9waHlfcmVnKG9oY2ksIDQsIH4weGMwICYgZ2V0X3BoeV9yZWcob2hjaSwgNCkpOworCisJCS8qIENsZWFyIGxpbmsgY29udHJvbCByZWdpc3RlciAqLworCQlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfTGlua0NvbnRyb2xDbGVhciwgMHhmZmZmZmZmZik7CisKKwkJLyogTGV0IGFsbCBvdGhlciBub2RlcyBrbm93IHRvIGlnbm9yZSB1cyAqLworCQlvaGNpX2RldmN0bChvaGNpLT5ob3N0LCBSRVNFVF9CVVMsIExPTkdfUkVTRVRfTk9fRk9SQ0VfUk9PVCk7CisKKwkJLyogU29mdCByZXNldCBiZWZvcmUgd2Ugc3RhcnQgLSB0aGlzIGRpc2FibGVzCisJCSAqIGludGVycnVwdHMgYW5kIGNsZWFycyBsaW5rRW5hYmxlIGFuZCBMUFMuICovCisJCW9oY2lfc29mdF9yZXNldChvaGNpKTsKKwkJZnJlZV9pcnEob2hjaS0+ZGV2LT5pcnEsIG9oY2kpOworCisJY2FzZSBPSENJX0lOSVRfSEFWRV9UWFJYX0JVRkZFUlNfX01BWUJFOgorCQkvKiBUaGUgb2hjaV9zb2Z0X3Jlc2V0KCkgc3RvcHMgYWxsIERNQSBjb250ZXh0cywgc28gd2UKKwkJICogZG9udCBuZWVkIHRvIGRvIHRoaXMuICAqLworCQkvKiBGcmVlIEFSIGRtYSAqLworCQlmcmVlX2RtYV9yY3ZfY3R4KCZvaGNpLT5hcl9yZXFfY29udGV4dCk7CisJCWZyZWVfZG1hX3Jjdl9jdHgoJm9oY2ktPmFyX3Jlc3BfY29udGV4dCk7CisKKwkJLyogRnJlZSBBVCBkbWEgKi8KKwkJZnJlZV9kbWFfdHJtX2N0eCgmb2hjaS0+YXRfcmVxX2NvbnRleHQpOworCQlmcmVlX2RtYV90cm1fY3R4KCZvaGNpLT5hdF9yZXNwX2NvbnRleHQpOworCisJCS8qIEZyZWUgSVIgZG1hICovCisJCWZyZWVfZG1hX3Jjdl9jdHgoJm9oY2ktPmlyX2xlZ2FjeV9jb250ZXh0KTsKKworCQkvKiBGcmVlIElUIGRtYSAqLworCQlmcmVlX2RtYV90cm1fY3R4KCZvaGNpLT5pdF9sZWdhY3lfY29udGV4dCk7CisKKwkJLyogRnJlZSBJUiBsZWdhY3kgZG1hICovCisJCWZyZWVfZG1hX3Jjdl9jdHgoJm9oY2ktPmlyX2xlZ2FjeV9jb250ZXh0KTsKKworCisJY2FzZSBPSENJX0lOSVRfSEFWRV9TRUxGSURfQlVGRkVSOgorCQlwY2lfZnJlZV9jb25zaXN0ZW50KG9oY2ktPmRldiwgT0hDSTEzOTRfU0lfRE1BX0JVRl9TSVpFLAorCQkJCSAgICBvaGNpLT5zZWxmaWRfYnVmX2NwdSwKKwkJCQkgICAgb2hjaS0+c2VsZmlkX2J1Zl9idXMpOworCQlPSENJX0RNQV9GUkVFKCJjb25zaXN0ZW50IHNlbGZpZF9idWYiKTsKKworCWNhc2UgT0hDSV9JTklUX0hBVkVfQ09ORklHX1JPTV9CVUZGRVI6CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQob2hjaS0+ZGV2LCBPSENJX0NPTkZJR19ST01fTEVOLAorCQkJCSAgICBvaGNpLT5jc3JfY29uZmlnX3JvbV9jcHUsCisJCQkJICAgIG9oY2ktPmNzcl9jb25maWdfcm9tX2J1cyk7CisJCU9IQ0lfRE1BX0ZSRUUoImNvbnNpc3RlbnQgY3NyX2NvbmZpZ19yb20iKTsKKworCWNhc2UgT0hDSV9JTklUX0hBVkVfSU9NQVBQSU5HOgorCQlpb3VubWFwKG9oY2ktPnJlZ2lzdGVycyk7CisKKwljYXNlIE9IQ0lfSU5JVF9IQVZFX01FTV9SRUdJT046CisjaWZuZGVmIFBDTUNJQQorCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KG9oY2ktPmRldiwgMCksCisJCQkJICAgT0hDSTEzOTRfUkVHSVNURVJfU0laRSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUENfUE1BQworCS8qIE9uIFVuaU5vcnRoLCBwb3dlciBkb3duIHRoZSBjYWJsZSBhbmQgdHVybiBvZmYgdGhlIGNoaXAKKwkgKiBjbG9jayB3aGVuIHRoZSBtb2R1bGUgaXMgcmVtb3ZlZCB0byBzYXZlIHBvd2VyIG9uCisJICogbGFwdG9wcy4gVHVybmluZyBpdCBiYWNrIE9OIGlzIGRvbmUgYnkgdGhlIGFyY2ggY29kZSB3aGVuCisJICogcGNpX2VuYWJsZV9kZXZpY2UoKSBpcyBjYWxsZWQgKi8KKwl7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSogb2Zfbm9kZTsKKworCQlvZl9ub2RlID0gcGNpX2RldmljZV90b19PRl9ub2RlKG9oY2ktPmRldik7CisJCWlmIChvZl9ub2RlKSB7CisJCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl8xMzk0X0VOQUJMRSwgb2Zfbm9kZSwgMCwgMCk7CisJCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl8xMzk0X0NBQkxFX1BPV0VSLCBvZl9ub2RlLCAwLCAwKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KKworCWNhc2UgT0hDSV9JTklUX0FMTE9DX0hPU1Q6CisJCXBjaV9zZXRfZHJ2ZGF0YShvaGNpLT5kZXYsIE5VTEwpOworCX0KKworCWlmIChkZXYpCisJCXB1dF9kZXZpY2UoZGV2KTsKK30KKworCitzdGF0aWMgaW50IG9oY2kxMzk0X3BjaV9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisJeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisKKwkJLyogUmUtZW5hYmxlIDEzOTQgKi8KKwkJb2Zfbm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZSAocGRldik7CisJCWlmIChvZl9ub2RlKQorCQkJcG1hY19jYWxsX2ZlYXR1cmUgKFBNQUNfRlRSXzEzOTRfRU5BQkxFLCBvZl9ub2RlLCAwLCAxKTsKKwl9CisjZW5kaWYKKworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBvaGNpMTM5NF9wY2lfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKyNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworCXsKKwkJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOworCisJCS8qIERpc2FibGUgMTM5NCAqLworCQlvZl9ub2RlID0gcGNpX2RldmljZV90b19PRl9ub2RlIChwZGV2KTsKKwkJaWYgKG9mX25vZGUpCisJCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl8xMzk0X0VOQUJMRSwgb2Zfbm9kZSwgMCwgMCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIFBDSV9DTEFTU19GSVJFV0lSRV9PSENJICAgICAoKFBDSV9DTEFTU19TRVJJQUxfRklSRVdJUkUgPDwgOCkgfCAweDEwKQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgb2hjaTEzOTRfcGNpX3RibFtdID0geworCXsKKwkJLmNsYXNzID0gCVBDSV9DTEFTU19GSVJFV0lSRV9PSENJLAorCQkuY2xhc3NfbWFzayA9IAlQQ0lfQU5ZX0lELAorCQkudmVuZG9yID0JUENJX0FOWV9JRCwKKwkJLmRldmljZSA9CVBDSV9BTllfSUQsCisJCS5zdWJ2ZW5kb3IgPQlQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0JUENJX0FOWV9JRCwKKwl9LAorCXsgMCwgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBvaGNpMTM5NF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG9oY2kxMzk0X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPQkJT0hDSTEzOTRfRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlID0Jb2hjaTEzOTRfcGNpX3RibCwKKwkucHJvYmUgPQlvaGNpMTM5NF9wY2lfcHJvYmUsCisJLnJlbW92ZSA9CW9oY2kxMzk0X3BjaV9yZW1vdmUsCisJLnJlc3VtZSA9CW9oY2kxMzk0X3BjaV9yZXN1bWUsCisJLnN1c3BlbmQgPQlvaGNpMTM5NF9wY2lfc3VzcGVuZCwKK307CisKKwwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPSENJMTM5NCBWaWRlbyBJbnRlcmZhY2UgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZXNzZW50aWFsbHkgdGhlIG9ubHkgcHVycG9zZSBvZiB0aGlzIGNvZGUgaXMgdG8gYWxsb3cgYW5vdGhlcgorICAgbW9kdWxlIHRvIGhvb2sgaW50byBvaGNpJ3MgaW50ZXJydXB0IGhhbmRsZXIgKi8KKworaW50IG9oY2kxMzk0X3N0b3BfY29udGV4dChzdHJ1Y3QgdGlfb2hjaSAqb2hjaSwgaW50IHJlZywgY2hhciAqbXNnKQoreworCWludCBpPTA7CisKKwkvKiBzdG9wIHRoZSBjaGFubmVsIHByb2dyYW0gaWYgaXQncyBzdGlsbCBydW5uaW5nICovCisJcmVnX3dyaXRlKG9oY2ksIHJlZywgMHg4MDAwKTsKKworCS8qIFdhaXQgdW50aWwgaXQgZWZmZWN0aXZlbHkgc3RvcHMgKi8KKwl3aGlsZSAocmVnX3JlYWQob2hjaSwgcmVnKSAmIDB4NDAwKSB7CisJCWkrKzsKKwkJaWYgKGk+NTAwMCkgeworCQkJUFJJTlQoS0VSTl9FUlIsCisJCQkgICAgICAiUnVuYXdheSBsb29wIHdoaWxlIHN0b3BwaW5nIGNvbnRleHQ6ICVzLi4uIiwgbXNnID8gbXNnIDogIiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQltYigpOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAobXNnKSBQUklOVChLRVJOX0VSUiwgIiVzOiBkbWEgcHJnIHN0b3BwZWQiLCBtc2cpOworCXJldHVybiAwOworfQorCit2b2lkIG9oY2kxMzk0X2luaXRfaXNvX3Rhc2tsZXQoc3RydWN0IG9oY2kxMzk0X2lzb190YXNrbGV0ICp0YXNrbGV0LCBpbnQgdHlwZSwKKwkJCSAgICAgICB2b2lkICgqZnVuYykodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl0YXNrbGV0X2luaXQoJnRhc2tsZXQtPnRhc2tsZXQsIGZ1bmMsIGRhdGEpOworCXRhc2tsZXQtPnR5cGUgPSB0eXBlOworCS8qIFdlIGluaXQgdGhlIHRhc2tsZXQtPmxpbmsgZmllbGQsIHNvIHdlIGNhbiBsaXN0X2RlbCgpIGl0CisJICogd2l0aG91dCB3b3JyeWluZyB3aGV0aGVyIGl0IHdhcyBhZGRlZCB0byB0aGUgbGlzdCBvciBub3QuICovCisJSU5JVF9MSVNUX0hFQUQoJnRhc2tsZXQtPmxpbmspOworfQorCitpbnQgb2hjaTEzOTRfcmVnaXN0ZXJfaXNvX3Rhc2tsZXQoc3RydWN0IHRpX29oY2kgKm9oY2ksCisJCQkJICBzdHJ1Y3Qgb2hjaTEzOTRfaXNvX3Rhc2tsZXQgKnRhc2tsZXQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgKnVzYWdlOworCWludCBuLCBpLCByID0gLUVCVVNZOworCisJaWYgKHRhc2tsZXQtPnR5cGUgPT0gT0hDSV9JU09fVFJBTlNNSVQpIHsKKwkJbiA9IG9oY2ktPm5iX2lzb194bWl0X2N0eDsKKwkJdXNhZ2UgPSAmb2hjaS0+aXRfY3R4X3VzYWdlOworCX0KKwllbHNlIHsKKwkJbiA9IG9oY2ktPm5iX2lzb19yY3ZfY3R4OworCQl1c2FnZSA9ICZvaGNpLT5pcl9jdHhfdXNhZ2U7CisKKwkJLyogb25seSBvbmUgcmVjZWl2ZSBjb250ZXh0IGNhbiBiZSBtdWx0aWNoYW5uZWwgKE9IQ0kgc2VjIDEwLjQuMSkgKi8KKwkJaWYgKHRhc2tsZXQtPnR5cGUgPT0gT0hDSV9JU09fTVVMVElDSEFOTkVMX1JFQ0VJVkUpIHsKKwkJCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZvaGNpLT5pcl9tdWx0aWNoYW5uZWxfdXNlZCkpIHsKKwkJCQlyZXR1cm4gcjsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZvaGNpLT5pc29fdGFza2xldF9saXN0X2xvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChpLCB1c2FnZSkpIHsKKwkJCXRhc2tsZXQtPmNvbnRleHQgPSBpOworCQkJbGlzdF9hZGRfdGFpbCgmdGFza2xldC0+bGluaywgJm9oY2ktPmlzb190YXNrbGV0X2xpc3QpOworCQkJciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2hjaS0+aXNvX3Rhc2tsZXRfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcjsKK30KKwordm9pZCBvaGNpMTM5NF91bnJlZ2lzdGVyX2lzb190YXNrbGV0KHN0cnVjdCB0aV9vaGNpICpvaGNpLAorCQkJCSAgICAgc3RydWN0IG9oY2kxMzk0X2lzb190YXNrbGV0ICp0YXNrbGV0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0YXNrbGV0X2tpbGwoJnRhc2tsZXQtPnRhc2tsZXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9oY2ktPmlzb190YXNrbGV0X2xpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHRhc2tsZXQtPnR5cGUgPT0gT0hDSV9JU09fVFJBTlNNSVQpCisJCWNsZWFyX2JpdCh0YXNrbGV0LT5jb250ZXh0LCAmb2hjaS0+aXRfY3R4X3VzYWdlKTsKKwllbHNlIHsKKwkJY2xlYXJfYml0KHRhc2tsZXQtPmNvbnRleHQsICZvaGNpLT5pcl9jdHhfdXNhZ2UpOworCisJCWlmICh0YXNrbGV0LT50eXBlID09IE9IQ0lfSVNPX01VTFRJQ0hBTk5FTF9SRUNFSVZFKSB7CisJCQljbGVhcl9iaXQoMCwgJm9oY2ktPmlyX211bHRpY2hhbm5lbF91c2VkKTsKKwkJfQorCX0KKworCWxpc3RfZGVsKCZ0YXNrbGV0LT5saW5rKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9oY2ktPmlzb190YXNrbGV0X2xpc3RfbG9jaywgZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKG9oY2kxMzk0X3N0b3BfY29udGV4dCk7CitFWFBPUlRfU1lNQk9MKG9oY2kxMzk0X2luaXRfaXNvX3Rhc2tsZXQpOworRVhQT1JUX1NZTUJPTChvaGNpMTM5NF9yZWdpc3Rlcl9pc29fdGFza2xldCk7CitFWFBPUlRfU1lNQk9MKG9oY2kxMzk0X3VucmVnaXN0ZXJfaXNvX3Rhc2tsZXQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2VuZXJhbCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK01PRFVMRV9BVVRIT1IoIlNlYmFzdGllbiBSb3VnZWF1eCA8c2ViYXN0aWVuLnJvdWdlYXV4QGFudS5lZHUuYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgUENJIE9IQ0kgSUVFRS0xMzk0IGNvbnRyb2xsZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvaGNpMTM5NF9jbGVhbnVwICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmb2hjaTEzOTRfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9oY2kxMzk0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmb2hjaTEzOTRfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG9oY2kxMzk0X2luaXQpOworbW9kdWxlX2V4aXQob2hjaTEzOTRfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmggYi9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NThkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuaApAQCAtMCwwICsxLDQ1NiBAQAorLyoKKyAqIG9oY2kxMzk0LmggLSBkcml2ZXIgZm9yIE9IQ0kgMTM5NCBib2FyZHMKKyAqIENvcHlyaWdodCAoQykxOTk5LDIwMDAgU2ViYXN0aWVuIFJvdWdlYXV4IDxzZWJhc3RpZW4ucm91Z2VhdXhAYW51LmVkdS5hdT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgR29yZCBQZXRlcnMgPEdvcmRQZXRlcnNAc21hcnR0ZWNoLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX09IQ0kxMzk0X0gKKyNkZWZpbmUgX09IQ0kxMzk0X0gKKworI2luY2x1ZGUgImllZWUxMzk0X3R5cGVzLmgiCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgT0hDSTEzOTRfRFJJVkVSX05BTUUgICAgICAib2hjaTEzOTQiCisKKyNkZWZpbmUgT0hDSTEzOTRfTUFYX0FUX1JFUV9SRVRSSUVTCTB4MgorI2RlZmluZSBPSENJMTM5NF9NQVhfQVRfUkVTUF9SRVRSSUVTCTB4MgorI2RlZmluZSBPSENJMTM5NF9NQVhfUEhZU19SRVNQX1JFVFJJRVMJMHg4CisjZGVmaW5lIE9IQ0kxMzk0X01BWF9TRUxGX0lEX0VSUk9SUwkxNgorCisjZGVmaW5lIEFSX1JFUV9OVU1fREVTQwkJNAkJLyogbnVtYmVyIG9mIEFSIHJlcSBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBBUl9SRVFfQlVGX1NJWkUJCVBBR0VfU0laRQkvKiBzaXplIG9mIEFSIHJlcSBidWZmZXJzICovCisjZGVmaW5lIEFSX1JFUV9TUExJVF9CVUZfU0laRQlQQUdFX1NJWkUJLyogc3BsaXQgcGFja2V0IGJ1ZmZlciAqLworCisjZGVmaW5lIEFSX1JFU1BfTlVNX0RFU0MJNAkJLyogbnVtYmVyIG9mIEFSIHJlc3AgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgQVJfUkVTUF9CVUZfU0laRQlQQUdFX1NJWkUJLyogc2l6ZSBvZiBBUiByZXNwIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgQVJfUkVTUF9TUExJVF9CVUZfU0laRQlQQUdFX1NJWkUJLyogc3BsaXQgcGFja2V0IGJ1ZmZlciAqLworCisjZGVmaW5lIElSX05VTV9ERVNDCQkxNgkJLyogbnVtYmVyIG9mIElSIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIElSX0JVRl9TSVpFCQlQQUdFX1NJWkUJLyogNDA5NiBieXRlcy9idWZmZXIgKi8KKyNkZWZpbmUgSVJfU1BMSVRfQlVGX1NJWkUJUEFHRV9TSVpFCS8qIHNwbGl0IHBhY2tldCBidWZmZXIgKi8KKworI2RlZmluZSBJVF9OVU1fREVTQwkJMTYJLyogbnVtYmVyIG9mIElUIGRlc2NyaXB0b3JzICovCisKKyNkZWZpbmUgQVRfUkVRX05VTV9ERVNDCQkzMgkvKiBudW1iZXIgb2YgQVQgcmVxIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIEFUX1JFU1BfTlVNX0RFU0MJMzIJLyogbnVtYmVyIG9mIEFUIHJlc3AgZGVzY3JpcHRvcnMgKi8KKworI2RlZmluZSBPSENJX0xPT1BfQ09VTlQJCTEwMAkvKiBOdW1iZXIgb2YgbG9vcHMgZm9yIHJlZyByZWFkIHdhaXRzICovCisKKyNkZWZpbmUgT0hDSV9DT05GSUdfUk9NX0xFTgkxMDI0CS8qIExlbmd0aCBvZiB0aGUgbWFwcGVkIGNvbmZpZ3JvbSBzcGFjZSAqLworCisjZGVmaW5lIE9IQ0kxMzk0X1NJX0RNQV9CVUZfU0laRQk4MTkyIC8qIGxlbmd0aCBvZiB0aGUgc2VsZmlkIGJ1ZmZlciAqLworCisvKiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgT0hDSTEzOTRfUENJX0hDSV9Db250cm9sIDB4NDAKKworc3RydWN0IGRtYV9jbWQgeworICAgICAgICB1MzIgY29udHJvbDsKKyAgICAgICAgdTMyIGFkZHJlc3M7CisgICAgICAgIHUzMiBicmFuY2hBZGRyZXNzOworICAgICAgICB1MzIgc3RhdHVzOworfTsKKworLyoKKyAqIEZJWE1FOgorICogSXQgaXMgaW1wb3J0YW50IHRoYXQgYSBzaW5nbGUgYXRfZG1hX3ByZyBkb2VzIG5vdCBjcm9zcyBhIHBhZ2UgYm91bmRhcnkKKyAqIFRoZSBwcm9wZXIgd2F5IHRvIGRvIGl0IHdvdWxkIGJlIHRvIGRvIHRoZSBjaGVjayBkeW5hbWljYWxseSBhcyB0aGUKKyAqIHByb2dyYW1zIGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBBVCBmaWZvLgorICovCitzdHJ1Y3QgYXRfZG1hX3ByZyB7CisJc3RydWN0IGRtYV9jbWQgYmVnaW47CisJcXVhZGxldF90IGRhdGFbNF07CisJc3RydWN0IGRtYV9jbWQgZW5kOworCXF1YWRsZXRfdCBwYWRbNF07IC8qIEZJWE1FOiBxdWljayBoYWNrIGZvciBtZW1vcnkgYWxpZ25tZW50ICovCit9OworCisvKiBpZGVudGlmeSB3aGV0aGVyIGEgRE1BIGNvbnRleHQgaXMgYXN5bmNocm9ub3VzIG9yIGlzb2Nocm9ub3VzICovCitlbnVtIGNvbnRleHRfdHlwZSB7IERNQV9DVFhfQVNZTkNfUkVRLCBETUFfQ1RYX0FTWU5DX1JFU1AsIERNQV9DVFhfSVNPIH07CisKKy8qIERNQSByZWNlaXZlIGNvbnRleHQgKi8KK3N0cnVjdCBkbWFfcmN2X2N0eCB7CisJc3RydWN0IHRpX29oY2kgKm9oY2k7CisJZW51bSBjb250ZXh0X3R5cGUgdHlwZTsKKwlpbnQgY3R4OworCXVuc2lnbmVkIGludCBudW1fZGVzYzsKKworCXVuc2lnbmVkIGludCBidWZfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc3BsaXRfYnVmX3NpemU7CisKKwkvKiBkbWEgYmxvY2sgZGVzY3JpcHRvcnMgKi8KKyAgICAgICAgc3RydWN0IGRtYV9jbWQgKipwcmdfY3B1OworICAgICAgICBkbWFfYWRkcl90ICpwcmdfYnVzOworCXN0cnVjdCBwY2lfcG9vbCAqcHJnX3Bvb2w7CisKKwkvKiBkbWEgYnVmZmVycyAqLworICAgICAgICBxdWFkbGV0X3QgKipidWZfY3B1OworICAgICAgICBkbWFfYWRkcl90ICpidWZfYnVzOworCisgICAgICAgIHVuc2lnbmVkIGludCBidWZfaW5kOworICAgICAgICB1bnNpZ25lZCBpbnQgYnVmX29mZnNldDsKKyAgICAgICAgcXVhZGxldF90ICpzcGI7CisgICAgICAgIHNwaW5sb2NrX3QgbG9jazsKKyAgICAgICAgc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2s7CisJaW50IGN0cmxDbGVhcjsKKwlpbnQgY3RybFNldDsKKwlpbnQgY21kUHRyOworCWludCBjdHh0TWF0Y2g7Cit9OworCisvKiBETUEgdHJhbnNtaXQgY29udGV4dCAqLworc3RydWN0IGRtYV90cm1fY3R4IHsKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaTsKKwllbnVtIGNvbnRleHRfdHlwZSB0eXBlOworCWludCBjdHg7CisJdW5zaWduZWQgaW50IG51bV9kZXNjOworCisJLyogZG1hIGJsb2NrIGRlc2NyaXB0b3JzICovCisgICAgICAgIHN0cnVjdCBhdF9kbWFfcHJnICoqcHJnX2NwdTsKKwlkbWFfYWRkcl90ICpwcmdfYnVzOworCXN0cnVjdCBwY2lfcG9vbCAqcHJnX3Bvb2w7CisKKyAgICAgICAgdW5zaWduZWQgaW50IHByZ19pbmQ7CisgICAgICAgIHVuc2lnbmVkIGludCBzZW50X2luZDsKKwlpbnQgZnJlZV9wcmdzOworICAgICAgICBxdWFkbGV0X3QgKmJyYW5jaEFkZHJQdHI7CisKKwkvKiBsaXN0IG9mIHBhY2tldHMgaW5zZXJ0ZWQgaW4gdGhlIEFUIEZJRk8gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZpZm9fbGlzdDsKKworCS8qIGxpc3Qgb2YgcGVuZGluZyBwYWNrZXRzIHRvIGJlIGluc2VydGVkIGluIHRoZSBBVCBGSUZPICovCisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nX2xpc3Q7CisKKyAgICAgICAgc3BpbmxvY2tfdCBsb2NrOworICAgICAgICBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFzazsKKwlpbnQgY3RybENsZWFyOworCWludCBjdHJsU2V0OworCWludCBjbWRQdHI7Cit9OworCitzdHJ1Y3Qgb2hjaTEzOTRfaXNvX3Rhc2tsZXQgeworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKKwlpbnQgY29udGV4dDsKKwllbnVtIHsgT0hDSV9JU09fVFJBTlNNSVQsIE9IQ0lfSVNPX1JFQ0VJVkUsCisJICAgICAgIE9IQ0lfSVNPX01VTFRJQ0hBTk5FTF9SRUNFSVZFIH0gdHlwZTsKK307CisKK3N0cnVjdCB0aV9vaGNpIHsKKyAgICAgICAgc3RydWN0IHBjaV9kZXYgKmRldjsKKworCWVudW0geworCQlPSENJX0lOSVRfQUxMT0NfSE9TVCwKKwkJT0hDSV9JTklUX0hBVkVfTUVNX1JFR0lPTiwKKwkJT0hDSV9JTklUX0hBVkVfSU9NQVBQSU5HLAorCQlPSENJX0lOSVRfSEFWRV9DT05GSUdfUk9NX0JVRkZFUiwKKwkJT0hDSV9JTklUX0hBVkVfU0VMRklEX0JVRkZFUiwKKwkJT0hDSV9JTklUX0hBVkVfVFhSWF9CVUZGRVJTX19NQVlCRSwKKwkJT0hDSV9JTklUX0hBVkVfSVJRLAorCQlPSENJX0lOSVRfRE9ORSwKKwl9IGluaXRfc3RhdGU7CisKKyAgICAgICAgLyogcmVtYXBwZWQgbWVtb3J5IHNwYWNlcyAqLworICAgICAgICB2b2lkIF9faW9tZW0gKnJlZ2lzdGVyczsKKworCS8qIGRtYSBidWZmZXIgZm9yIHNlbGYtaWQgcGFja2V0cyAqLworICAgICAgICBxdWFkbGV0X3QgKnNlbGZpZF9idWZfY3B1OworICAgICAgICBkbWFfYWRkcl90IHNlbGZpZF9idWZfYnVzOworCisJLyogYnVmZmVyIGZvciBjc3IgY29uZmlnIHJvbSAqLworICAgICAgICBxdWFkbGV0X3QgKmNzcl9jb25maWdfcm9tX2NwdTsKKyAgICAgICAgZG1hX2FkZHJfdCBjc3JfY29uZmlnX3JvbV9idXM7CisJaW50IGNzcl9jb25maWdfcm9tX2xlbmd0aDsKKworCXVuc2lnbmVkIGludCBtYXhfcGFja2V0X3NpemU7CisKKyAgICAgICAgLyogYXN5bmMgcmVjZWl2ZSAqLworCXN0cnVjdCBkbWFfcmN2X2N0eCBhcl9yZXNwX2NvbnRleHQ7CisJc3RydWN0IGRtYV9yY3ZfY3R4IGFyX3JlcV9jb250ZXh0OworCisJLyogYXN5bmMgdHJhbnNtaXQgKi8KKwlzdHJ1Y3QgZG1hX3RybV9jdHggYXRfcmVzcF9jb250ZXh0OworCXN0cnVjdCBkbWFfdHJtX2N0eCBhdF9yZXFfY29udGV4dDsKKworICAgICAgICAvKiBpc28gcmVjZWl2ZSAqLworCWludCBuYl9pc29fcmN2X2N0eDsKKwl1bnNpZ25lZCBsb25nIGlyX2N0eF91c2FnZTsgLyogdXNlIHRlc3RfYW5kX3NldF9iaXQoKSBmb3IgYXRvbWljaXR5ICovCisJdW5zaWduZWQgbG9uZyBpcl9tdWx0aWNoYW5uZWxfdXNlZDsgLyogZGl0dG8gKi8KKyAgICAgICAgc3BpbmxvY2tfdCBJUl9jaGFubmVsX2xvY2s7CisKKwkvKiBpc28gcmVjZWl2ZSAobGVnYWN5IEFQSSkgKi8KKwl1NjQgaXJfbGVnYWN5X2NoYW5uZWxzOyAvKiBub3RlOiB0aGlzIGRpZmZlcnMgZnJvbSBJU09fY2hhbm5lbF91c2FnZTsKKwkJCQkgICBpdCBvbmx5IGFjY291bnRzIGZvciBjaGFubmVscyBsaXN0ZW5lZCB0bworCQkJCSAgIGJ5IHRoZSBsZWdhY3kgQVBJLCBzbyB0aGF0IHdlIGNhbiBrbm93IHdoZW4KKwkJCQkgICBpdCBpcyBzYWZlIHRvIGZyZWUgdGhlIGxlZ2FjeSBBUEkgY29udGV4dCAqLworCisJc3RydWN0IGRtYV9yY3ZfY3R4IGlyX2xlZ2FjeV9jb250ZXh0OworCXN0cnVjdCBvaGNpMTM5NF9pc29fdGFza2xldCBpcl9sZWdhY3lfdGFza2xldDsKKworICAgICAgICAvKiBpc28gdHJhbnNtaXQgKi8KKwlpbnQgbmJfaXNvX3htaXRfY3R4OworCXVuc2lnbmVkIGxvbmcgaXRfY3R4X3VzYWdlOyAvKiB1c2UgdGVzdF9hbmRfc2V0X2JpdCgpIGZvciBhdG9taWNpdHkgKi8KKworCS8qIGlzbyB0cmFuc21pdCAobGVnYWN5IEFQSSkgKi8KKwlzdHJ1Y3QgZG1hX3RybV9jdHggaXRfbGVnYWN5X2NvbnRleHQ7CisJc3RydWN0IG9oY2kxMzk0X2lzb190YXNrbGV0IGl0X2xlZ2FjeV90YXNrbGV0OworCisgICAgICAgIHU2NCBJU09fY2hhbm5lbF91c2FnZTsKKworICAgICAgICAvKiBJRUVFLTEzOTQgcGFydCBmb2xsb3dzICovCisgICAgICAgIHN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CisKKyAgICAgICAgaW50IHBoeWlkLCBpc3Jvb3Q7CisKKyAgICAgICAgc3BpbmxvY2tfdCBwaHlfcmVnX2xvY2s7CisJc3BpbmxvY2tfdCBldmVudF9sb2NrOworCisJaW50IHNlbGZfaWRfZXJyb3JzOworCisJLyogVGFza2xldHMgZm9yIGlzbyByZWNlaXZlIGFuZCB0cmFuc21pdCwgdXNlZCBieSB2aWRlbzEzOTQsCisJICogYW1kdHAgYW5kIGR2MTM5NCAqLworCisJc3RydWN0IGxpc3RfaGVhZCBpc29fdGFza2xldF9saXN0OworCXNwaW5sb2NrX3QgaXNvX3Rhc2tsZXRfbGlzdF9sb2NrOworCisJLyogU3dhcCB0aGUgc2VsZmlkIGJ1ZmZlcj8gKi8KKwl1bnNpZ25lZCBpbnQgc2VsZmlkX3N3YXA6MTsKKwkvKiBTb21lIEFwcGxlIGNoaXBzZXQgc2VlbSB0byBzd2FwIGluY29taW5nIGhlYWRlcnMgZm9yIHVzICovCisJdW5zaWduZWQgaW50IG5vX3N3YXBfaW5jb21pbmc6MTsKKworCS8qIEZvcmNlIGV4dHJhIHBhcmFub2lhIGNoZWNraW5nIG9uIGJ1cy1yZXNldCBoYW5kbGluZyAqLworCXVuc2lnbmVkIGludCBjaGVja19idXNyZXNldDoxOworfTsKKworc3RhdGljIGlubGluZSBpbnQgY3Jvc3NfYm91bmQodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoYWRkciA+PiBQQUdFX1NISUZUICE9IChhZGRyICsgc2l6ZSAtIDEpID4+IFBBR0VfU0hJRlQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWdpc3RlciByZWFkIGFuZCB3cml0ZSBoZWxwZXIgZnVuY3Rpb25zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnX3dyaXRlKGNvbnN0IHN0cnVjdCB0aV9vaGNpICpvaGNpLCBpbnQgb2Zmc2V0LCB1MzIgZGF0YSkKK3sKKyAgICAgICAgd3JpdGVsKGRhdGEsIG9oY2ktPnJlZ2lzdGVycyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJlZ19yZWFkKGNvbnN0IHN0cnVjdCB0aV9vaGNpICpvaGNpLCBpbnQgb2Zmc2V0KQoreworICAgICAgICByZXR1cm4gcmVhZGwob2hjaS0+cmVnaXN0ZXJzICsgb2Zmc2V0KTsKK30KKworCisvKiAyIEtpbG9CeXRlcyBvZiByZWdpc3RlciBzcGFjZSAqLworI2RlZmluZSBPSENJMTM5NF9SRUdJU1RFUl9TSVpFICAgICAgICAgICAgICAgIDB4ODAwCisKKy8qIE9mZnNldHMgcmVsYXRpdmUgdG8gY29udGV4dCBiYXNlcyBkZWZpbmVkIGJlbG93ICovCisKKyNkZWZpbmUgT0hDSTEzOTRfQ29udGV4dENvbnRyb2xTZXQgICAgICAgICAgICAweDAwMAorI2RlZmluZSBPSENJMTM5NF9Db250ZXh0Q29udHJvbENsZWFyICAgICAgICAgIDB4MDA0CisjZGVmaW5lIE9IQ0kxMzk0X0NvbnRleHRDb21tYW5kUHRyICAgICAgICAgICAgMHgwMEMKKworLyogcmVnaXN0ZXIgbWFwICovCisjZGVmaW5lIE9IQ0kxMzk0X1ZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgMHgwMDAKKyNkZWZpbmUgT0hDSTEzOTRfR1VJRF9ST00gICAgICAgICAgICAgICAgICAgICAweDAwNAorI2RlZmluZSBPSENJMTM5NF9BVFJldHJpZXMgICAgICAgICAgICAgICAgICAgIDB4MDA4CisjZGVmaW5lIE9IQ0kxMzk0X0NTUkRhdGEgICAgICAgICAgICAgICAgICAgICAgMHgwMEMKKyNkZWZpbmUgT0hDSTEzOTRfQ1NSQ29tcGFyZURhdGEgICAgICAgICAgICAgICAweDAxMAorI2RlZmluZSBPSENJMTM5NF9DU1JDb250cm9sICAgICAgICAgICAgICAgICAgIDB4MDE0CisjZGVmaW5lIE9IQ0kxMzk0X0NvbmZpZ1JPTWhkciAgICAgICAgICAgICAgICAgMHgwMTgKKyNkZWZpbmUgT0hDSTEzOTRfQnVzSUQgICAgICAgICAgICAgICAgICAgICAgICAweDAxQworI2RlZmluZSBPSENJMTM5NF9CdXNPcHRpb25zICAgICAgICAgICAgICAgICAgIDB4MDIwCisjZGVmaW5lIE9IQ0kxMzk0X0dVSURIaSAgICAgICAgICAgICAgICAgICAgICAgMHgwMjQKKyNkZWZpbmUgT0hDSTEzOTRfR1VJRExvICAgICAgICAgICAgICAgICAgICAgICAweDAyOAorI2RlZmluZSBPSENJMTM5NF9Db25maWdST01tYXAgICAgICAgICAgICAgICAgIDB4MDM0CisjZGVmaW5lIE9IQ0kxMzk0X1Bvc3RlZFdyaXRlQWRkcmVzc0xvICAgICAgICAgMHgwMzgKKyNkZWZpbmUgT0hDSTEzOTRfUG9zdGVkV3JpdGVBZGRyZXNzSGkgICAgICAgICAweDAzQworI2RlZmluZSBPSENJMTM5NF9WZW5kb3JJRCAgICAgICAgICAgICAgICAgICAgIDB4MDQwCisjZGVmaW5lIE9IQ0kxMzk0X0hDQ29udHJvbFNldCAgICAgICAgICAgICAgICAgMHgwNTAKKyNkZWZpbmUgT0hDSTEzOTRfSENDb250cm9sQ2xlYXIgICAgICAgICAgICAgICAweDA1NAorI2RlZmluZSAgT0hDSTEzOTRfSENDb250cm9sX25vQnl0ZVN3YXAJCTB4NDAwMDAwMDAKKyNkZWZpbmUgIE9IQ0kxMzk0X0hDQ29udHJvbF9wcm9ncmFtUGh5RW5hYmxlCTB4MDA4MDAwMDAKKyNkZWZpbmUgIE9IQ0kxMzk0X0hDQ29udHJvbF9hUGh5RW5oYW5jZUVuYWJsZQkweDAwNDAwMDAwCisjZGVmaW5lICBPSENJMTM5NF9IQ0NvbnRyb2xfTFBTCQkJMHgwMDA4MDAwMAorI2RlZmluZSAgT0hDSTEzOTRfSENDb250cm9sX3Bvc3RlZFdyaXRlRW5hYmxlCTB4MDAwNDAwMDAKKyNkZWZpbmUgIE9IQ0kxMzk0X0hDQ29udHJvbF9saW5rRW5hYmxlCQkweDAwMDIwMDAwCisjZGVmaW5lICBPSENJMTM5NF9IQ0NvbnRyb2xfc29mdFJlc2V0CQkweDAwMDEwMDAwCisjZGVmaW5lIE9IQ0kxMzk0X1NlbGZJREJ1ZmZlciAgICAgICAgICAgICAgICAgMHgwNjQKKyNkZWZpbmUgT0hDSTEzOTRfU2VsZklEQ291bnQgICAgICAgICAgICAgICAgICAweDA2OAorI2RlZmluZSBPSENJMTM5NF9JUk11bHRpQ2hhbk1hc2tIaVNldCAgICAgICAgIDB4MDcwCisjZGVmaW5lIE9IQ0kxMzk0X0lSTXVsdGlDaGFuTWFza0hpQ2xlYXIgICAgICAgMHgwNzQKKyNkZWZpbmUgT0hDSTEzOTRfSVJNdWx0aUNoYW5NYXNrTG9TZXQgICAgICAgICAweDA3OAorI2RlZmluZSBPSENJMTM5NF9JUk11bHRpQ2hhbk1hc2tMb0NsZWFyICAgICAgIDB4MDdDCisjZGVmaW5lIE9IQ0kxMzk0X0ludEV2ZW50U2V0ICAgICAgICAgICAgICAgICAgMHgwODAKKyNkZWZpbmUgT0hDSTEzOTRfSW50RXZlbnRDbGVhciAgICAgICAgICAgICAgICAweDA4NAorI2RlZmluZSBPSENJMTM5NF9JbnRNYXNrU2V0ICAgICAgICAgICAgICAgICAgIDB4MDg4CisjZGVmaW5lIE9IQ0kxMzk0X0ludE1hc2tDbGVhciAgICAgICAgICAgICAgICAgMHgwOEMKKyNkZWZpbmUgT0hDSTEzOTRfSXNvWG1pdEludEV2ZW50U2V0ICAgICAgICAgICAweDA5MAorI2RlZmluZSBPSENJMTM5NF9Jc29YbWl0SW50RXZlbnRDbGVhciAgICAgICAgIDB4MDk0CisjZGVmaW5lIE9IQ0kxMzk0X0lzb1htaXRJbnRNYXNrU2V0ICAgICAgICAgICAgMHgwOTgKKyNkZWZpbmUgT0hDSTEzOTRfSXNvWG1pdEludE1hc2tDbGVhciAgICAgICAgICAweDA5QworI2RlZmluZSBPSENJMTM5NF9Jc29SZWN2SW50RXZlbnRTZXQgICAgICAgICAgIDB4MEEwCisjZGVmaW5lIE9IQ0kxMzk0X0lzb1JlY3ZJbnRFdmVudENsZWFyICAgICAgICAgMHgwQTQKKyNkZWZpbmUgT0hDSTEzOTRfSXNvUmVjdkludE1hc2tTZXQgICAgICAgICAgICAweDBBOAorI2RlZmluZSBPSENJMTM5NF9Jc29SZWN2SW50TWFza0NsZWFyICAgICAgICAgIDB4MEFDCisjZGVmaW5lIE9IQ0kxMzk0X0luaXRpYWxCYW5kd2lkdGhBdmFpbGFibGUgICAgMHgwQjAKKyNkZWZpbmUgT0hDSTEzOTRfSW5pdGlhbENoYW5uZWxzQXZhaWxhYmxlSGkgICAweDBCNAorI2RlZmluZSBPSENJMTM5NF9Jbml0aWFsQ2hhbm5lbHNBdmFpbGFibGVMbyAgIDB4MEI4CisjZGVmaW5lIE9IQ0kxMzk0X0ZhaXJuZXNzQ29udHJvbCAgICAgICAgICAgICAgMHgwREMKKyNkZWZpbmUgT0hDSTEzOTRfTGlua0NvbnRyb2xTZXQgICAgICAgICAgICAgICAweDBFMAorI2RlZmluZSBPSENJMTM5NF9MaW5rQ29udHJvbENsZWFyICAgICAgICAgICAgIDB4MEU0CisjZGVmaW5lICBPSENJMTM5NF9MaW5rQ29udHJvbF9SY3ZTZWxmSUQJCTB4MDAwMDAyMDAKKyNkZWZpbmUgIE9IQ0kxMzk0X0xpbmtDb250cm9sX1JjdlBoeVBrdAkJMHgwMDAwMDQwMAorI2RlZmluZSAgT0hDSTEzOTRfTGlua0NvbnRyb2xfQ3ljbGVUaW1lckVuYWJsZQkweDAwMTAwMDAwCisjZGVmaW5lICBPSENJMTM5NF9MaW5rQ29udHJvbF9DeWNsZU1hc3RlcgkweDAwMjAwMDAwCisjZGVmaW5lICBPSENJMTM5NF9MaW5rQ29udHJvbF9DeWNsZVNvdXJjZQkweDAwNDAwMDAwCisjZGVmaW5lIE9IQ0kxMzk0X05vZGVJRCAgICAgICAgICAgICAgICAgICAgICAgMHgwRTgKKyNkZWZpbmUgT0hDSTEzOTRfUGh5Q29udHJvbCAgICAgICAgICAgICAgICAgICAweDBFQworI2RlZmluZSBPSENJMTM5NF9Jc29jaHJvbm91c0N5Y2xlVGltZXIgICAgICAgIDB4MEYwCisjZGVmaW5lIE9IQ0kxMzk0X0FzUmVxRmlsdGVySGlTZXQgICAgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgT0hDSTEzOTRfQXNSZXFGaWx0ZXJIaUNsZWFyICAgICAgICAgICAweDEwNAorI2RlZmluZSBPSENJMTM5NF9Bc1JlcUZpbHRlckxvU2V0ICAgICAgICAgICAgIDB4MTA4CisjZGVmaW5lIE9IQ0kxMzk0X0FzUmVxRmlsdGVyTG9DbGVhciAgICAgICAgICAgMHgxMEMKKyNkZWZpbmUgT0hDSTEzOTRfUGh5UmVxRmlsdGVySGlTZXQgICAgICAgICAgICAweDExMAorI2RlZmluZSBPSENJMTM5NF9QaHlSZXFGaWx0ZXJIaUNsZWFyICAgICAgICAgIDB4MTE0CisjZGVmaW5lIE9IQ0kxMzk0X1BoeVJlcUZpbHRlckxvU2V0ICAgICAgICAgICAgMHgxMTgKKyNkZWZpbmUgT0hDSTEzOTRfUGh5UmVxRmlsdGVyTG9DbGVhciAgICAgICAgICAweDExQworI2RlZmluZSBPSENJMTM5NF9QaHlVcHBlckJvdW5kICAgICAgICAgICAgICAgIDB4MTIwCisKKyNkZWZpbmUgT0hDSTEzOTRfQXNSZXFUckNvbnRleHRCYXNlICAgICAgICAgICAweDE4MAorI2RlZmluZSBPSENJMTM5NF9Bc1JlcVRyQ29udGV4dENvbnRyb2xTZXQgICAgIDB4MTgwCisjZGVmaW5lIE9IQ0kxMzk0X0FzUmVxVHJDb250ZXh0Q29udHJvbENsZWFyICAgMHgxODQKKyNkZWZpbmUgT0hDSTEzOTRfQXNSZXFUckNvbW1hbmRQdHIgICAgICAgICAgICAweDE4QworCisjZGVmaW5lIE9IQ0kxMzk0X0FzUnNwVHJDb250ZXh0QmFzZSAgICAgICAgICAgMHgxQTAKKyNkZWZpbmUgT0hDSTEzOTRfQXNSc3BUckNvbnRleHRDb250cm9sU2V0ICAgICAweDFBMAorI2RlZmluZSBPSENJMTM5NF9Bc1JzcFRyQ29udGV4dENvbnRyb2xDbGVhciAgIDB4MUE0CisjZGVmaW5lIE9IQ0kxMzk0X0FzUnNwVHJDb21tYW5kUHRyICAgICAgICAgICAgMHgxQUMKKworI2RlZmluZSBPSENJMTM5NF9Bc1JlcVJjdkNvbnRleHRCYXNlICAgICAgICAgIDB4MUMwCisjZGVmaW5lIE9IQ0kxMzk0X0FzUmVxUmN2Q29udGV4dENvbnRyb2xTZXQgICAgMHgxQzAKKyNkZWZpbmUgT0hDSTEzOTRfQXNSZXFSY3ZDb250ZXh0Q29udHJvbENsZWFyICAweDFDNAorI2RlZmluZSBPSENJMTM5NF9Bc1JlcVJjdkNvbW1hbmRQdHIgICAgICAgICAgIDB4MUNDCisKKyNkZWZpbmUgT0hDSTEzOTRfQXNSc3BSY3ZDb250ZXh0QmFzZSAgICAgICAgICAweDFFMAorI2RlZmluZSBPSENJMTM5NF9Bc1JzcFJjdkNvbnRleHRDb250cm9sU2V0ICAgIDB4MUUwCisjZGVmaW5lIE9IQ0kxMzk0X0FzUnNwUmN2Q29udGV4dENvbnRyb2xDbGVhciAgMHgxRTQKKyNkZWZpbmUgT0hDSTEzOTRfQXNSc3BSY3ZDb21tYW5kUHRyICAgICAgICAgICAweDFFQworCisvKiBJc29jaHJvbm91cyB0cmFuc21pdCByZWdpc3RlcnMgKi8KKy8qIEFkZCAoMTYgKiBuKSBmb3IgY29udGV4dCBuICovCisjZGVmaW5lIE9IQ0kxMzk0X0lzb1htaXRDb250ZXh0QmFzZSAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUgT0hDSTEzOTRfSXNvWG1pdENvbnRleHRDb250cm9sU2V0ICAgICAweDIwMAorI2RlZmluZSBPSENJMTM5NF9Jc29YbWl0Q29udGV4dENvbnRyb2xDbGVhciAgIDB4MjA0CisjZGVmaW5lIE9IQ0kxMzk0X0lzb1htaXRDb21tYW5kUHRyICAgICAgICAgICAgMHgyMEMKKworLyogSXNvY2hyb25vdXMgcmVjZWl2ZSByZWdpc3RlcnMgKi8KKy8qIEFkZCAoMzIgKiBuKSBmb3IgY29udGV4dCBuICovCisjZGVmaW5lIE9IQ0kxMzk0X0lzb1JjdkNvbnRleHRCYXNlICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgT0hDSTEzOTRfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQgICAgICAweDQwMAorI2RlZmluZSBPSENJMTM5NF9Jc29SY3ZDb250ZXh0Q29udHJvbENsZWFyICAgIDB4NDA0CisjZGVmaW5lIE9IQ0kxMzk0X0lzb1JjdkNvbW1hbmRQdHIgICAgICAgICAgICAgMHg0MEMKKyNkZWZpbmUgT0hDSTEzOTRfSXNvUmN2Q29udGV4dE1hdGNoICAgICAgICAgICAweDQxMAorCisvKiBJbnRlcnJ1cHRzIE1hc2svRXZlbnRzICovCisKKyNkZWZpbmUgT0hDSTEzOTRfcmVxVHhDb21wbGV0ZSAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBPSENJMTM5NF9yZXNwVHhDb21wbGV0ZSAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE9IQ0kxMzk0X0FSUlEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgT0hDSTEzOTRfQVJSUyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBPSENJMTM5NF9SUVBrdCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE9IQ0kxMzk0X1JTUGt0ICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgT0hDSTEzOTRfaXNvY2hUeCAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBPSENJMTM5NF9pc29jaFJ4ICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIE9IQ0kxMzk0X3Bvc3RlZFdyaXRlRXJyICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgT0hDSTEzOTRfbG9ja1Jlc3BFcnIgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBPSENJMTM5NF9zZWxmSURDb21wbGV0ZSAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE9IQ0kxMzk0X2J1c1Jlc2V0ICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgT0hDSTEzOTRfcGh5ICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBPSENJMTM5NF9jeWNsZVN5bmNoICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIE9IQ0kxMzk0X2N5Y2xlNjRTZWNvbmRzICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgT0hDSTEzOTRfY3ljbGVMb3N0ICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBPSENJMTM5NF9jeWNsZUluY29uc2lzdGVudCAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIE9IQ0kxMzk0X3VucmVjb3ZlcmFibGVFcnJvciAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgT0hDSTEzOTRfY3ljbGVUb29Mb25nICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBPSENJMTM5NF9waHlSZWdSY3ZkICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIE9IQ0kxMzk0X21hc3RlckludEVuYWJsZSAgICAgICAgIDB4ODAwMDAwMDAKKworLyogRE1BIENvbnRyb2wgZmxhZ3MgKi8KKyNkZWZpbmUgRE1BX0NUTF9PVVRQVVRfTU9SRSAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBETUFfQ1RMX09VVFBVVF9MQVNUICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIERNQV9DVExfSU5QVVRfTU9SRSAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgRE1BX0NUTF9JTlBVVF9MQVNUICAgICAgICAgICAgICAgMHgzMDAwMDAwMAorI2RlZmluZSBETUFfQ1RMX1VQREFURSAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIERNQV9DVExfSU1NRURJQVRFICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgRE1BX0NUTF9JUlEgICAgICAgICAgICAgICAgICAgICAgMHgwMDMwMDAwMAorI2RlZmluZSBETUFfQ1RMX0JSQU5DSCAgICAgICAgICAgICAgICAgICAweDAwMGMwMDAwCisjZGVmaW5lIERNQV9DVExfV0FJVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKworLyogT0hDSSBldnRfKiBlcnJvciB0eXBlcywgdGFibGUgMy0yIG9mIHRoZSBPSENJIDEuMSBzcGVjLiAqLworI2RlZmluZSBFVlRfTk9fU1RBVFVTCQkweDAJLyogTm8gZXZlbnQgc3RhdHVzICovCisjZGVmaW5lIEVWVF9SRVNFUlZFRF9BCQkweDEJLyogUmVzZXJ2ZWQsIG5vdCB1c2VkICEhISAqLworI2RlZmluZSBFVlRfTE9OR19QQUNLRVQJCTB4MgkvKiBUaGUgcmV2YyBkYXRhIHdhcyBsb25nZXIgdGhhbiB0aGUgYnVmICovCisjZGVmaW5lIEVWVF9NSVNTSU5HX0FDSwkJMHgzCS8qIEEgc3ViYWN0aW9uIGdhcCB3YXMgZGV0ZWN0ZWQgYmVmb3JlIGFuIGFjaworCQkJCQkgICBhcnJpdmVkLCBvciByZWN2J2QgYWNrIGhhZCBhIHBhcml0eSBlcnJvciAqLworI2RlZmluZSBFVlRfVU5ERVJSVU4JCTB4NAkvKiBVbmRlcnJ1biBvbiBjb3JyZXNwb25kaW5nIEZJRk8sIHBhY2tldAorCQkJCQkgICB0cnVuY2F0ZWQgKi8KKyNkZWZpbmUgRVZUX09WRVJSVU4JCTB4NQkvKiBBIHJlY3YgRklGTyBvdmVyZmxvd2VkIG9uIHJlY2VwdGlvbiBvZiBJU08KKwkJCQkJICAgcGFja2V0ICovCisjZGVmaW5lIEVWVF9ERVNDUklQVE9SX1JFQUQJMHg2CS8qIEFuIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgd2hpbGUgaG9zdCB3YXMKKwkJCQkJICAgcmVhZGluZyBhIGRlc2NyaXB0b3IgYmxvY2sgKi8KKyNkZWZpbmUgRVZUX0RBVEFfUkVBRAkJMHg3CS8qIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhvc3QgY29udHJvbGxlciB3YXMKKwkJCQkJICAgYXR0ZW1wdGluZyB0byByZWFkIGZyb20gaG9zdCBtZW1vcnkgaW4gdGhlIGRhdGEKKwkJCQkJICAgc3RhZ2Ugb2YgZGVzY3JpcHRvciBwcm9jZXNzaW5nICovCisjZGVmaW5lIEVWVF9EQVRBX1dSSVRFCQkweDgJLyogQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaG9zdCBjb250cm9sbGVyIHdhcworCQkJCQkgICBhdHRlbXB0aW5nIHRvIHdyaXRlIGVpdGhlciBkdXJpbmcgdGhlIGRhdGEgc3RhZ2UKKwkJCQkJICAgb2YgZGVzY3JpcHRvciBwcm9jZXNzaW5nLCBvciB3aGVuIHByb2Nlc3NpbmcgYSBzaW5nbGUKKwkJCQkJICAgMTYtYml0IGhvc3QgbWVtb3J5IHdyaXRlICovCisjZGVmaW5lIEVWVF9CVVNfUkVTRVQJCTB4OQkvKiBJZGVudGlmaWVzIGEgUEhZIHBhY2tldCBpbiB0aGUgcmVjdiBidWZmZXIgYXMKKwkJCQkJICAgYmVpbmcgYSBzeW50aGVzaXplZCBidXMgcmVzZXQgcGFja2V0ICovCisjZGVmaW5lIEVWVF9USU1FT1VUCQkweGEJLyogSW5kaWNhdGVzIHRoYXQgdGhlIGFzeW5jaHJvbm91cyB0cmFuc21pdCByZXNwb25zZQorCQkJCQkgICBwYWNrZXQgZXhwaXJlZCBhbmQgd2FzIG5vdCB0cmFuc21pdHRlZCwgb3IgdGhhdCBhbgorCQkJCQkgICBJVCBETUEgY29udGV4dCBleHBlcmllbmNlZCBhIHNraXAgcHJvY2Vzc2luZyBvdmVyZmxvdyAqLworI2RlZmluZSBFVlRfVENPREVfRVJSCQkweGIJLyogQSBiYWQgdENvZGUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2V0LgorCQkJCQkgICBUaGUgcGFja2V0IHdhcyBmbHVzaGVkICovCisjZGVmaW5lIEVWVF9SRVNFUlZFRF9CCQkweGMJLyogUmVzZXJ2ZWQsIG5vdCB1c2VkICEhISAqLworI2RlZmluZSBFVlRfUkVTRVJWRURfQwkJMHhkCS8qIFJlc2VydmVkLCBub3QgdXNlZCAhISEgKi8KKyNkZWZpbmUgRVZUX1VOS05PV04JCTB4ZQkvKiBBbiBlcnJvciBjb25kaXRpb24gaGFzIG9jY3VycmVkIHRoYXQgY2Fubm90IGJlCisJCQkJCSAgIHJlcHJlc2VudGVkIGJ5IGFueSBvdGhlciBldmVudCBjb2RlcyBkZWZpbmVkIGhlcmVpbi4gKi8KKyNkZWZpbmUgRVZUX0ZMVVNIRUQJCTB4ZgkvKiBTZW5kIGJ5IHRoZSBsaW5rIHNpZGUgb2Ygb3V0cHV0IEZJRk8gd2hlbiBhc3luY2hyb25vdXMKKwkJCQkJICAgcGFja2V0cyBhcmUgYmVpbmcgZmx1c2hlZCBkdWUgdG8gYSBidXMgcmVzZXQuICovCisKKyNkZWZpbmUgT0hDSTEzOTRfVENPREVfUEhZICAgICAgICAgICAgICAgMHhFCisKK3ZvaWQgb2hjaTEzOTRfaW5pdF9pc29fdGFza2xldChzdHJ1Y3Qgb2hjaTEzOTRfaXNvX3Rhc2tsZXQgKnRhc2tsZXQsCisJCQkgICAgICAgaW50IHR5cGUsCisJCQkgICAgICAgdm9pZCAoKmZ1bmMpKHVuc2lnbmVkIGxvbmcpLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSk7CitpbnQgb2hjaTEzOTRfcmVnaXN0ZXJfaXNvX3Rhc2tsZXQoc3RydWN0IHRpX29oY2kgKm9oY2ksCisJCQkJICBzdHJ1Y3Qgb2hjaTEzOTRfaXNvX3Rhc2tsZXQgKnRhc2tsZXQpOwordm9pZCBvaGNpMTM5NF91bnJlZ2lzdGVyX2lzb190YXNrbGV0KHN0cnVjdCB0aV9vaGNpICpvaGNpLAorCQkJCSAgICAgc3RydWN0IG9oY2kxMzk0X2lzb190YXNrbGV0ICp0YXNrbGV0KTsKKworLyogcmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG9uZSBpZiBETUEgY29udGV4dCBpcyBsb2NrZWQgdXAgKi8KK2ludCBvaGNpMTM5NF9zdG9wX2NvbnRleHQgICAgICAoc3RydWN0IHRpX29oY2kgKm9oY2ksIGludCByZWcsIGNoYXIgKm1zZyk7CitzdHJ1Y3QgdGlfb2hjaSAqb2hjaTEzOTRfZ2V0X3N0cnVjdChpbnQgY2FyZF9udW0pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvb3VpLmRiIGIvZHJpdmVycy9pZWVlMTM5NC9vdWkuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyYzhhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvb3VpLmRiCkBAIC0wLDAgKzEsNzA0OCBAQAorMDAwMDAwIFhFUk9YIENPUlBPUkFUSU9OCiswMDAwMDEgWEVST1ggQ09SUE9SQVRJT04KKzAwMDAwMiBYRVJPWCBDT1JQT1JBVElPTgorMDAwMDAzIFhFUk9YIENPUlBPUkFUSU9OCiswMDAwMDQgWEVST1ggQ09SUE9SQVRJT04KKzAwMDAwNSBYRVJPWCBDT1JQT1JBVElPTgorMDAwMDA2IFhFUk9YIENPUlBPUkFUSU9OCiswMDAwMDcgWEVST1ggQ09SUE9SQVRJT04KKzAwMDAwOCBYRVJPWCBDT1JQT1JBVElPTgorMDAwMDA5IFhFUk9YIENPUlBPUkFUSU9OCiswMDAwMEEgT01ST04gVEFURUlTSSBFTEVDVFJPTklDUyBDTy4KKzAwMDAwQiBNQVRSSVggQ09SUE9SQVRJT04KKzAwMDAwQyBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDAwMEQgRklCUk9OSUNTIExURC4KKzAwMDAwRSBGVUpJVFNVIExJTUlURUQKKzAwMDAwRiBORVhULCBJTkMuCiswMDAwMTAgU1lURUsgSU5DLgorMDAwMDExIE5PUk1FUkVMIFNZU1RFTUVTCiswMDAwMTIgSU5GT1JNQVRJT04gVEVDSE5PTE9HWSBMSU1JVEVECiswMDAwMTMgQ0FNRVgKKzAwMDAxNCBORVRST05JWAorMDAwMDE1IERBVEFQT0lOVCBDT1JQT1JBVElPTgorMDAwMDE2IERVIFBPTlQgUElYRUwgU1lTVEVNUyAgICAgLgorMDAwMDE3IFRFS0VMRUMKKzAwMDAxOCBXRUJTVEVSIENPTVBVVEVSIENPUlBPUkFUSU9OCiswMDAwMTkgQVBQTElFRCBEWU5BTUlDUyBJTlRFUk5BVElPTkFMCiswMDAwMUEgQURWQU5DRUQgTUlDUk8gREVWSUNFUworMDAwMDFCIE5PVkVMTCBJTkMuCiswMDAwMUMgQkVMTCBURUNITk9MT0dJRVMKKzAwMDAxRCBDQUJMRVRST04gU1lTVEVNUywgSU5DLgorMDAwMDFFIFRFTFNJU1QgSU5EVVNUUklBIEVMRUNUUk9OSUNBCiswMDAwMUYgVGVsY28gU3lzdGVtcywgSW5jLgorMDAwMDIwIERBVEFJTkRVU1RSSUVSIERJQUIgQUIKKzAwMDAyMSBTVVJFTUFOIENPTVAuICYgQ09NTVVOLiBDT1JQLgorMDAwMDIyIFZJU1VBTCBURUNITk9MT0dZIElOQy4KKzAwMDAyMyBBQkIgSU5EVVNUUklBTCBTWVNURU1TIEFCCiswMDAwMjQgQ09OTkVDVCBBUworMDAwMDI1IFJBTVRFSyBDT1JQLgorMDAwMDI2IFNIQS1LRU4gQ08uLCBMVEQuCiswMDAwMjcgSkFQQU4gUkFESU8gQ09NUEFOWQorMDAwMDI4IFBST0RJR1kgU1lTVEVNUyBDT1JQT1JBVElPTgorMDAwMDI5IElNQyBORVRXT1JLUyBDT1JQLgorMDAwMDJBIFRSVyAtIFNFREQvSU5QCiswMDAwMkIgQ1JJU1AgQVVUT01BVElPTiwgSU5DCiswMDAwMkMgQVVUT1RPVEUgTElNSVRFRAorMDAwMDJEIENIUk9NQVRJQ1MgSU5DCiswMDAwMkUgU09DSUVURSBFVklSQQorMDAwMDJGIFRJTUVQTEVYIElOQy4KKzAwMDAzMCBWRyBMQUJPUkFUT1JZIFNZU1RFTVMgTFRECiswMDAwMzEgUVBTWCBDT01NVU5JQ0FUSU9OUyBQVFkgTFRECiswMDAwMzIgTWFyY29uaSBwbGMKKzAwMDAzMyBFR0FOIE1BQ0hJTkVSWSBDT01QQU5ZCiswMDAwMzQgTkVUV09SSyBSRVNPVVJDRVMgQ09SUE9SQVRJT04KKzAwMDAzNSBTUEVDVFJBR1JBUEhJQ1MgQ09SUE9SQVRJT04KKzAwMDAzNiBBVEFSSSBDT1JQT1JBVElPTgorMDAwMDM3IE9YRk9SRCBNRVRSSUNTIExJTUlURUQKKzAwMDAzOCBDU1MgTEFCUworMDAwMDM5IFRPU0hJQkEgQ09SUE9SQVRJT04KKzAwMDAzQSBDSFlST04gQ09SUE9SQVRJT04KKzAwMDAzQiBpIENvbnRyb2xzLCBJbmMuCiswMDAwM0MgQVVTUEVYIFNZU1RFTVMgSU5DLgorMDAwMDNEIFVOSVNZUworMDAwMDNFIFNJTVBBQ1QKKzAwMDAzRiBTWU5UUkVYLCBJTkMuCiswMDAwNDAgQVBQTElDT04sIElOQy4KKzAwMDA0MSBJQ0UgQ09SUE9SQVRJT04KKzAwMDA0MiBNRVRJRVIgTUFOQUdFTUVOVCBTWVNURU1TIExURC4KKzAwMDA0MyBNSUNSTyBURUNITk9MT0dZCiswMDAwNDQgQ0FTVEVMTEUgQ09SUE9SQVRJT04KKzAwMDA0NSBGT1JEIEFFUk9TUEFDRSAmIENPTU0uIENPUlAuCiswMDAwNDYgT0xJVkVUVEkgTk9SVEggQU1FUklDQQorMDAwMDQ3IE5JQ09MRVQgSU5TVFJVTUVOVFMgQ09SUC4KKzAwMDA0OCBTRUlLTyBFUFNPTiBDT1JQT1JBVElPTgorMDAwMDQ5IEFQUklDT1QgQ09NUFVURVJTLCBMVEQKKzAwMDA0QSBBREMgQ09ERU5PTEwgVEVDSE5PTE9HWSBDT1JQLgorMDAwMDRCIElDTCBEQVRBIE9ZCiswMDAwNEMgTkVDIENPUlBPUkFUSU9OCiswMDAwNEQgRENJIENPUlBPUkFUSU9OCiswMDAwNEUgQU1QRVggQ09SUE9SQVRJT04KKzAwMDA0RiBMT0dJQ1JBRlQsIElOQy4KKzAwMDA1MCBSQURJU1lTIENPUlBPUkFUSU9OCiswMDAwNTEgSE9CIEVMRUNUUk9OSUMgR01CSCAmIENPLiBLRworMDAwMDUyIEludHJ1c2lvbi5jb20sIEluYy4KKzAwMDA1MyBDT01QVUNPUlAKKzAwMDA1NCBNT0RJQ09OLCBJTkMuCiswMDAwNTUgQ09NTUlTU0FSSUFUIEEgTGBFTkVSR0lFIEFUT00uCiswMDAwNTYgRFIuIEIuIFNUUlVDSworMDAwMDU3IFNDSVRFWCBDT1JQT1JBVElPTiBMVEQuCiswMDAwNTggUkFDT1JFIENPTVBVVEVSIFBST0RVQ1RTIElOQy4KKzAwMDA1OSBIRUxMSUdFIEdNQkgKKzAwMDA1QSBTeXNLb25uZWN0IEdtYkgKKzAwMDA1QiBFTFRFQyBFTEVLVFJPTklLIEFHCiswMDAwNUMgVEVMRU1BVElDUyBJTlRFUk5BVElPTkFMIElOQy4KKzAwMDA1RCBDUyBURUxFQ09NCiswMDAwNUUgVVNDIElORk9STUFUSU9OIFNDSUVOQ0VTIElOU1QKKzAwMDA1RiBTVU1JVE9NTyBFTEVDVFJJQyBJTkQuLCBMVEQuCiswMDAwNjAgS09OVFJPTiBFTEVLVFJPTklLIEdNQkgKKzAwMDA2MSBHQVRFV0FZIENPTU1VTklDQVRJT05TCiswMDAwNjIgQlVMTCBITiBJTkZPUk1BVElPTiBTWVNURU1TCiswMDAwNjMgRFIuSU5HLlNFVUZFUlQgR01CSAorMDAwMDY0IFlPS09HQVdBIERJR0lUQUwgQ09NUFVURVIgQ09SUAorMDAwMDY1IE5FVFdPUksgQVNTT0NJQVRFUywgSU5DLgorMDAwMDY2IFRBTEFSSVMgU1lTVEVNUywgSU5DLgorMDAwMDY3IFNPRlQgKiBSSVRFLCBJTkMuCiswMDAwNjggUk9TRU1PVU5UIENPTlRST0xTCiswMDAwNjkgQ09OQ09SRCBDT01NVU5JQ0FUSU9OUyBJTkMKKzAwMDA2QSBDT01QVVRFUiBDT05TT0xFUyBJTkMuCiswMDAwNkIgU0lMSUNPTiBHUkFQSElDUyBJTkMuL01JUFMKKzAwMDA2RCBDUkFZIENPTU1VTklDQVRJT05TLCBMVEQuCiswMDAwNkUgQVJUSVNPRlQsIElOQy4KKzAwMDA2RiBNYWRnZSBMdGQuCiswMDAwNzAgSENMIExJTUlURUQKKzAwMDA3MSBBRFJBIFNZU1RFTVMgSU5DLgorMDAwMDcyIE1JTklXQVJFIFRFQ0hOT0xPR1kKKzAwMDA3MyBTSUVDT1IgQ09SUE9SQVRJT04KKzAwMDA3NCBSSUNPSCBDT01QQU5ZIExURC4KKzAwMDA3NSBOb3J0ZWwgTmV0d29ya3MKKzAwMDA3NiBBQkVLQVMgVklERU8gU1lTVEVNCiswMDAwNzcgSU5URVJQSEFTRSBDT1JQT1JBVElPTgorMDAwMDc4IExBQlRBTSBMSU1JVEVECiswMDAwNzkgTkVUV09SVEggSU5DT1JQT1JBVEVECiswMDAwN0EgREFOQSBDT01QVVRFUiBJTkMuCiswMDAwN0IgUkVTRUFSQ0ggTUFDSElORVMKKzAwMDA3QyBBTVBFUkUgSU5DT1JQT1JBVEVECiswMDAwN0QgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgorMDAwMDdFIENMVVNUUklYIENPUlBPUkFUSU9OCiswMDAwN0YgTElOT1RZUEUtSEVMTCBBRworMDAwMDgwIENSQVkgQ09NTVVOSUNBVElPTlMgQS9TCiswMDAwODEgQkFZIE5FVFdPUktTCiswMDAwODIgTEVDVFJBIFNZU1RFTUVTIFNBCiswMDAwODMgVEFEUE9MRSBURUNITk9MT0dZIFBMQworMDAwMDg0IFNVUEVSTkVUCiswMDAwODUgQ0FOT04gSU5DLgorMDAwMDg2IE1FR0FIRVJUWiBDT1JQT1JBVElPTgorMDAwMDg3IEhJVEFDSEksIExURC4KKzAwMDA4OCBDT01QVVRFUiBORVRXT1JLIFRFQ0guIENPUlAuCiswMDAwODkgQ0FZTUFOIFNZU1RFTVMgSU5DLgorMDAwMDhBIERBVEFIT1VTRSBJTkZPUk1BVElPTiBTWVNURU1TCiswMDAwOEIgSU5GT1RST04KKzAwMDA4QyBBbGxveSBDb21wdXRlciBQcm9kdWN0cyAoQXVzdHJhbGlhKSBQdHkgTHRkCiswMDAwOEQgVkVSRElYIENPUlBPUkFUSU9OCiswMDAwOEUgU09MQk9VUk5FIENPTVBVVEVSLCBJTkMuCiswMDAwOEYgUkFZVEhFT04gQ09NUEFOWQorMDAwMDkwIE1JQ1JPQ09NCiswMDAwOTEgQU5SSVRTVSBDT1JQT1JBVElPTgorMDAwMDkyIENPR0VOVCBEQVRBIFRFQ0hOT0xPR0lFUworMDAwMDkzIFBST1RFT04gSU5DLgorMDAwMDk0IEFTQU5URSBURUNITk9MT0dJRVMKKzAwMDA5NSBTT05ZIFRFS1RST05JWCBDT1JQLgorMDAwMDk2IE1BUkNPTkkgRUxFQ1RST05JQ1MgTFRELgorMDAwMDk3IEVQT0NIIFNZU1RFTVMKKzAwMDA5OCBDUk9TU0NPTU0gQ09SUE9SQVRJT04KKzAwMDA5OSBNVFgsIElOQy4KKzAwMDA5QSBSQyBDT01QVVRFUiBBL1MKKzAwMDA5QiBJTkZPUk1BVElPTiBJTlRFUk5BVElPTkFMLCBJTkMKKzAwMDA5QyBST0xNIE1JTC1TUEVDIENPTVBVVEVSUworMDAwMDlEIExPQ1VTIENPTVBVVElORyBDT1JQT1JBVElPTgorMDAwMDlFIE1BUkxJIFMuQS4KKzAwMDA5RiBBTUVSSVNUQVIgVEVDSE5PTE9HSUVTIElOQy4KKzAwMDBBMCBUT0tZTyBTQU5ZTyBFTEVDVFJJQyBDTy4gTFRELgorMDAwMEExIE1BUlFVRVRURSBFTEVDVFJJQyBDTy4KKzAwMDBBMiBCQVkgTkVUV09SS1MKKzAwMDBBMyBORVRXT1JLIEFQUExJQ0FUSU9OIFRFQ0hOT0xPR1kKKzAwMDBBNCBBQ09STiBDT01QVVRFUlMgTElNSVRFRAorMDAwMEE1IENPTVBBVElCTEUgU1lTVEVNUyBDT1JQLgorMDAwMEE2IE5FVFdPUksgR0VORVJBTCBDT1JQT1JBVElPTgorMDAwMEE3IE5FVFdPUksgQ09NUFVUSU5HIERFVklDRVMgSU5DLgorMDAwMEE4IFNUUkFUVVMgQ09NUFVURVIgSU5DLgorMDAwMEE5IE5FVFdPUksgU1lTVEVNUyBDT1JQLgorMDAwMEFBIFhFUk9YIENPUlBPUkFUSU9OCiswMDAwQUIgTE9HSUMgTU9ERUxJTkcgQ09SUE9SQVRJT04KKzAwMDBBQyBDT05XQVJFIENPTVBVVEVSIENPTlNVTFRJTkcKKzAwMDBBRCBCUlVLRVIgSU5TVFJVTUVOVFMgSU5DLgorMDAwMEFFIERBU1NBVUxUIEVMRUNUUk9OSVFVRQorMDAwMEFGIE5VQ0xFQVIgREFUQSBJTlNUUlVNRU5UQVRJT04KKzAwMDBCMCBSTkQtUkFEIE5FVFdPUksgREVWSUNFUworMDAwMEIxIEFMUEhBIE1JQ1JPU1lTVEVNUyBJTkMuCiswMDAwQjIgVEVMRVZJREVPIFNZU1RFTVMsIElOQy4KKzAwMDBCMyBDSU1MSU5DIElOQ09SUE9SQVRFRAorMDAwMEI0IEVESU1BWCBDT01QVVRFUiBDT01QQU5ZCiswMDAwQjUgREFUQUJJTElUWSBTT0ZUV0FSRSBTWVMuIElOQy4KKzAwMDBCNiBNSUNSTy1NQVRJQyBSRVNFQVJDSAorMDAwMEI3IERPVkUgQ09NUFVURVIgQ09SUE9SQVRJT04KKzAwMDBCOCBTRUlLT1NIQSBDTy4sIExURC4KKzAwMDBCOSBNQ0RPTk5FTEwgRE9VR0xBUyBDT01QVVRFUiBTWVMKKzAwMDBCQSBTSUlHLCBJTkMuCiswMDAwQkIgVFJJLURBVEEKKzAwMDBCQyBBTExFTi1CUkFETEVZIENPLiBJTkMuCiswMDAwQkQgTUlUU1VCSVNISSBDQUJMRSBDT01QQU5ZCiswMDAwQkUgVEhFIE5USSBHUk9VUAorMDAwMEJGIFNZTU1FVFJJQyBDT01QVVRFUiBTWVNURU1TCiswMDAwQzAgV0VTVEVSTiBESUdJVEFMIENPUlBPUkFUSU9OCiswMDAwQzEgTWFkZ2UgTHRkLgorMDAwMEMyIElORk9STUFUSU9OIFBSRVNFTlRBVElPTiBURUNILgorMDAwMEMzIEhBUlJJUyBDT1JQIENPTVBVVEVSIFNZUyBESVYKKzAwMDBDNCBXQVRFUlMgRElWLiBPRiBNSUxMSVBPUkUKKzAwMDBDNSBGQVJBTExPTiBDT01QVVRJTkcvTkVUT1BJQQorMDAwMEM2IEVPTiBTWVNURU1TCiswMDAwQzcgQVJJWCBDT1JQT1JBVElPTgorMDAwMEM4IEFMVE9TIENPTVBVVEVSIFNZU1RFTVMKKzAwMDBDOSBFTVVMRVggQ09SUE9SQVRJT04KKzAwMDBDQSBBUFBMSVRFSworMDAwMENCIENPTVBVLVNIQUNLIEVMRUNUUk9OSUMgR01CSAorMDAwMENDIERFTlNBTiBDTy4sIExURC4KKzAwMDBDRCBBbGxpZWQgVGVsZXN5biBSZXNlYXJjaCBMdGQuCiswMDAwQ0UgTUVHQURBVEEgQ09SUC4KKzAwMDBDRiBIQVlFUyBNSUNST0NPTVBVVEVSIFBST0RVQ1RTCiswMDAwRDAgREVWRUxDT04gRUxFQ1RST05JQ1MgTFRELgorMDAwMEQxIEFEQVBURUMgSU5DT1JQT1JBVEVECiswMDAwRDIgU0JFLCBJTkMuCiswMDAwRDMgV0FORyBMQUJPUkFUT1JJRVMgSU5DLgorMDAwMEQ0IFBVUkUgREFUQSBMVEQuCiswMDAwRDUgTUlDUk9HTk9TSVMgSU5URVJOQVRJT05BTAorMDAwMEQ2IFBVTkNIIExJTkUgSE9MRElORworMDAwMEQ3IERBUlRNT1VUSCBDT0xMRUdFCiswMDAwRDggTk9WRUxMLCBJTkMuCiswMDAwRDkgTklQUE9OIFRFTEVHUkFQSCAmIFRFTEVQSE9ORQorMDAwMERBIEFURVgKKzAwMDBEQiBCUklUSVNIIFRFTEVDT01NVU5JQ0FUSU9OUyBQTEMKKzAwMDBEQyBIQVlFUyBNSUNST0NPTVBVVEVSIFBST0RVQ1RTCiswMDAwREQgVENMIElOQ09SUE9SQVRFRAorMDAwMERFIENFVElBCiswMDAwREYgQkVMTCAmIEhPV0VMTCBQVUIgU1lTIERJVgorMDAwMEUwIFFVQURSQU0gQ09SUC4KKzAwMDBFMSBHUklEIFNZU1RFTVMKKzAwMDBFMiBBQ0VSIFRFQ0hOT0xPR0lFUyBDT1JQLgorMDAwMEUzIElOVEVHUkFURUQgTUlDUk8gUFJPRFVDVFMgTFRECiswMDAwRTQgSU4yIEdST1VQRSBJTlRFUlRFQ0hOSVFVRQorMDAwMEU1IFNJR01FWCBMVEQuCiswMDAwRTYgQVBUT1IgUFJPRFVJVFMgREUgQ09NTSBJTkRVU1QKKzAwMDBFNyBTVEFSIEdBVEUgVEVDSE5PTE9HSUVTCiswMDAwRTggQUNDVE9OIFRFQ0hOT0xPR1kgQ09SUC4KKzAwMDBFOSBJU0lDQUQsIElOQy4KKzAwMDBFQSBVUE5PRCBBQgorMDAwMEVCIE1BVFNVU0hJVEEgQ09NTS4gSU5ELiBDTy4gTFRELgorMDAwMEVDIE1JQ1JPUFJPQ0VTUworMDAwMEVEIEFQUklMCiswMDAwRUUgTkVUV09SSyBERVNJR05FUlMsIExURC4KKzAwMDBFRiBLVEkKKzAwMDBGMCBTQU1TVU5HIEVMRUNUUk9OSUNTIENPLiwgTFRELgorMDAwMEYxIE1BR05BIENPTVBVVEVSIENPUlBPUkFUSU9OCiswMDAwRjIgU1BJREVSIENPTU1VTklDQVRJT05TCiswMDAwRjMgR0FOREFMRiBEQVRBIExJTUlURUQKKzAwMDBGNCBBTExJRUQgVEVMRVNZTiBJTlRFUk5BVElPTkFMCiswMDAwRjUgRElBTU9ORCBTQUxFUyBMSU1JVEVECiswMDAwRjYgQVBQTElFRCBNSUNST1NZU1RFTVMgQ09SUC4KKzAwMDBGNyBZT1VUSCBLRUVQIEVOVEVSUFJJU0UgQ08gTFRECiswMDAwRjggRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04KKzAwMDBGOSBRVU9UUk9OIFNZU1RFTVMgSU5DLgorMDAwMEZBIE1JQ1JPU0FHRSBDT01QVVRFUiBTWVNURU1TIElOQworMDAwMEZCIFJFQ0hORVIgWlVSIEtPTU1VTklLQVRJT04KKzAwMDBGQyBNRUlLTworMDAwMEZEIEhJR0ggTEVWRUwgSEFSRFdBUkUKKzAwMDBGRSBBTk5BUE9MSVMgTUlDUk8gU1lTVEVNUworMDAwMEZGIENBTVRFQyBFTEVDVFJPTklDUyBMVEQuCiswMDAxMDAgRVFVSVAnVFJBTlMKKzAwMDEwMiAzQ09NIENPUlBPUkFUSU9OCiswMDAxMDMgM0NPTSBDT1JQT1JBVElPTgorMDAwMTA0IERWSUNPIENvLiwgTHRkLgorMDAwMTA1IEJFQ0tIT0ZGIEdtYkgKKzAwMDEwNiBUZXdzIERhdGVudGVjaG5payBHbWJICiswMDAxMDcgTGVpc2VyIEdtYkgKKzAwMDEwOCBBVkxBQiBUZWNobm9sb2d5LCBJbmMuCiswMDAxMDkgTmFnYW5vIEphcGFuIFJhZGlvIENvLiwgTHRkLgorMDAwMTBBIENJUyBURUNITk9MT0dZIElOQy4KKzAwMDEwQiBTcGFjZSBDeWJlckxpbmssIEluYy4KKzAwMDEwQyBTeXN0ZW0gVGFsa3MgSW5jLgorMDAwMTBEIENPUkVDTywgSU5DLgorMDAwMTBFIEJyaS1MaW5rIFRlY2hub2xvZ2llcyBDby4sIEx0ZAorMDAwMTBGIE5pc2hhbiBTeXN0ZW1zLCBJbmMuCiswMDAxMTAgR290aGFtIE5ldHdvcmtzCiswMDAxMTEgaURpZ20gSW5jLgorMDAwMTEyIFNoYXJrIE11bHRpbWVkaWEgSW5jLgorMDAwMTEzIE9MWU1QVVMgQ09SUE9SQVRJT04KKzAwMDExNCBLQU5EQSBUU1VTSElOIEtPR1lPIENPLiwgTFRELgorMDAwMTE1IEVYVFJBVEVDSCBDT1JQT1JBVElPTgorMDAwMTE2IE5ldHNwZWN0IFRlY2hub2xvZ2llcywgSW5jLgorMDAwMTE3IENBTkFMICsKKzAwMDExOCBFWiBEaWdpdGFsIENvLiwgTHRkLgorMDAwMTE5IEFjdGlvbiBDb250cm9scyBQdHkuIEx0ZC4KKzAwMDExQSBFRUggRGF0YUxpbmsgR21iSAorMDAwMTFCIFVuaXpvbmUgVGVjaG5vbG9naWVzLCBJbmMuCiswMDAxMUMgVW5pdmVyc2FsIFRhbGt3YXJlIENvcnBvcmF0aW9uCiswMDAxMUQgQ2VudGlsbGl1bSBDb21tdW5pY2F0aW9ucworMDAwMTFFIFByZWNpZGlhIFRlY2hub2xvZ2llcywgSW5jLgorMDAwMTFGIFJDIE5ldHdvcmtzLCBJbmMuCiswMDAxMjAgT1NDSUxMT1FVQVJUWiBTLkEuCiswMDAxMjEgUmFwaWRTdHJlYW0gSW5jLgorMDAwMTIyIFRyZW5kIENvbW11bmljYXRpb25zLCBMdGQuCiswMDAxMjMgRElHSVRBTCBFTEVDVFJPTklDUyBDT1JQLgorMDAwMTI0IEFjZXIgSW5jb3Jwb3JhdGVkCiswMDAxMjUgWUFFU1UgTVVTRU4gQ08uLCBMVEQuCiswMDAxMjYgUEFDIExhYnMKKzAwMDEyNyBUaGUgT1BFTiBHcm91cCBMaW1pdGVkCiswMDAxMjggRW5qb3lXZWIsIEluYy4KKzAwMDEyOSBERkkgSW5jLgorMDAwMTJBIFRlbGVtYXRpY2EgU2lzdGVtcyBJbnRlbGlnZW50ZQorMDAwMTJCIFRFTEVORVQgQ28uLCBMdGQuCiswMDAxMkMgQXJhdm94IFRlY2hub2xvZ2llcywgSW5jLgorMDAwMTJEIEtvbW9kbyBUZWNobm9sb2d5CiswMDAxMkUgUEMgUGFydG5lciBMdGQuCiswMDAxMkYgVHdpbmhlYWQgSW50ZXJuYXRpb25hbCBDb3JwCiswMDAxMzAgRXh0cmVtZSBOZXR3b3JrcworMDAwMTMxIERldGVjdGlvbiBTeXN0ZW1zLCBJbmMuCiswMDAxMzIgRHJhbmV0eiAtIEJNSQorMDAwMTMzIEtZT1dBIEVsZWN0cm9uaWMgSW5zdHJ1bWVudHMgQworMDAwMTM0IFNJRyBQb3NpdGVjIFN5c3RlbXMgQUcKKzAwMDEzNSBLREMgQ29ycC4KKzAwMDEzNiBDeWJlclRBTiBUZWNobm9sb2d5LCBJbmMuCiswMDAxMzcgSVQgRmFybSBDb3Jwb3JhdGlvbgorMDAwMTM4IFhBVmkgVGVjaG5vbG9naWVzIENvcnAuCiswMDAxMzkgUG9pbnQgTXVsdGltZWRpYSBTeXN0ZW1zCiswMDAxM0EgU0hFTENBRCBDT01NVU5JQ0FUSU9OUywgTFRELgorMDAwMTNCIEJOQSBTWVNURU1TCiswMDAxM0MgVElXIFNZU1RFTVMKKzAwMDEzRCBSaXNjU3RhdGlvbiBMdGQuCiswMDAxM0UgQXNjb20gVGF0ZWNvIEFCCiswMDAxM0YgTmVpZ2hib3IgV29ybGQgQ28uLCBMdGQuCiswMDAxNDAgU2VuZHRlayBDb3Jwb3JhdGlvbgorMDAwMTQxIENBQkxFIFBSSU5UCiswMDAxNDIgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwMTQzIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDE0NCBDZXJldmEgTmV0d29ya3MsIEluYy4KKzAwMDE0NSBXSU5TWVNURU1TLCBJTkMuCiswMDAxNDYgVGVzY28gQ29udHJvbHMsIEluYy4KKzAwMDE0NyBaaG9uZSBUZWNobm9sb2dpZXMKKzAwMDE0OCBYLXRyYVdlYiBJbmMuCiswMDAxNDkgVC5ELlQuIFRyYW5zZmVyIERhdGEgVGVzdCBHbWJICiswMDAxNEEgU09OWSBDT01QVVRFUiBTQ0lFTkNFIExBQlMuLCBJCiswMDAxNEIgRW5ub3ZhdGUgTmV0d29ya3MsIEluYy4KKzAwMDE0QyBCZXJrZWxleSBQcm9jZXNzIENvbnRyb2wKKzAwMDE0RCBTaGluIEtpbiBFbnRlcnByaXNlcyBDby4sIEx0ZAorMDAwMTRFIFdJTiBFbnRlcnByaXNlcywgSW5jLgorMDAwMTRGIExVTUlOT1VTIE5ldHdvcmtzLCBJbmMuCiswMDAxNTAgR0lMQVQgQ09NTVVOSUNBVElPTlMsIExURC4KKzAwMDE1MSBFbnNlbWJsZSBDb21tdW5pY2F0aW9ucworMDAwMTUyIENIUk9NQVRFSyBJTkMuCiswMDAxNTMgQVJDSFRFSyBURUxFQ09NIENPUlBPUkFUSU9OCiswMDAxNTQgRzNNIENvcnBvcmF0aW9uCiswMDAxNTUgUHJvbWlzZSBUZWNobm9sb2d5LCBJbmMuCiswMDAxNTYgRklSRVdJUkVESVJFQ1QuQ09NLCBJTkMuCiswMDAxNTcgU1lTV0FWRSBDTy4sIExURAorMDAwMTU4IEVsZWN0cm8gSW5kdXN0cmllcy9HYXVnZSBUZWNoCiswMDAxNTkgUzEgQ29ycG9yYXRpb24KKzAwMDE1QSBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZworMDAwMTVCIElUQUxURUwgUy5wLkEvUkYtVVAtSQorMDAwMTVDIENBREFOVCBJTkMuCiswMDAxNUQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jCiswMDAxNUUgQkVTVCBURUNITk9MT0dZIENPLiwgTFRELgorMDAwMTVGIERJR0lUQUwgREVTSUdOIEdtYkgKKzAwMDE2MCBFTE1FWCBDby4sIExURC4KKzAwMDE2MSBNZXRhIE1hY2hpbmUgVGVjaG5vbG9neQorMDAwMTYyIEN5Z25ldCBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDE2MyBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDAxNjQgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwMTY1IEFpclN3aXRjaCBDb3Jwb3JhdGlvbgorMDAwMTY2IFRDIEdST1VQIEEvUworMDAwMTY3IEhJT0tJIEUuRS4gQ09SUE9SQVRJT04KKzAwMDE2OCBWSVRBTkEgQ09SUE9SQVRJT04KKzAwMDE2OSBDZWxlc3RpeCBOZXR3b3JrcyBQdGUgTHRkLgorMDAwMTZBIEFMSVRFQworMDAwMTZCIExpZ2h0Q2hpcCwgSW5jLgorMDAwMTZDIEZPWENPTk4KKzAwMDE2RCBDYXJyaWVyQ29tbSBJbmMuCiswMDAxNkUgQ29ua2xpbiBDb3Jwb3JhdGlvbgorMDAwMTZGIEhBSVRBSSBFTEVDVFJPTklDUyBDTy4sIExURC4KKzAwMDE3MCBFU0UgRW1iZWRkZWQgU3lzdGVtIEVuZ2luZWVyJ2cKKzAwMDE3MSBBbGxpZWQgRGF0YSBUZWNobm9sb2dpZXMKKzAwMDE3MiBUZWNobm9MYW5kIENvLiwgTFRELgorMDAwMTczIEpOSSBDb3Jwb3JhdGlvbgorMDAwMTc0IEN5YmVyT3B0aWNzIENvcnBvcmF0aW9uCiswMDAxNzUgUmFkaWFudCBDb21tdW5pY2F0aW9ucyBDb3JwLgorMDAwMTc2IE9yaWVudCBTaWx2ZXIgRW50ZXJwcmlzZXMKKzAwMDE3NyBFRFNMCiswMDAxNzggTUFSR0kgU3lzdGVtcywgSW5jLgorMDAwMTc5IFdJUkVMRVNTIFRFQ0hOT0xPR1ksIElOQy4KKzAwMDE3QSBDaGVuZ2R1IE1haXB1IEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCiswMDAxN0IgSGVpZGVsYmVyZ2VyIERydWNrbWFzY2hpbmVuIEFHCiswMDAxN0MgQUctRSBHbWJICiswMDAxN0QgVGhlcm1vUXVlc3QKKzAwMDE3RSBBRFRFSyBTeXN0ZW0gU2NpZW5jZSBDby4sIEx0ZC4KKzAwMDE3RiBFeHBlcmllbmNlIE11c2ljIFByb2plY3QKKzAwMDE4MCBBT3BlbiwgSW5jLgorMDAwMTgxIE5vcnRlbCBOZXR3b3JrcworMDAwMTgyIERJQ0EgVEVDSE5PTE9HSUVTIEFHCiswMDAxODMgQU5JVEUgVEVMRUNPTVMKKzAwMDE4NCBTSUVCICYgTUVZRVIgQUcKKzAwMDE4NSBBbG9rYSBDby4sIEx0ZC4KKzAwMDE4NiBESVNDSCBHbWJICiswMDAxODcgaTJTRSBHbWJICiswMDAxODggTFhDTyBUZWNobm9sb2dpZXMgYWcKKzAwMDE4OSBSZWZyYWN0aW9uIFRlY2hub2xvZ3ksIEluYy4KKzAwMDE4QSBST0kgQ09NUFVURVIgQUcKKzAwMDE4QiBOZXRMaW5rcyBDby4sIEx0ZC4KKzAwMDE4QyBNZWdhIFZpc2lvbgorMDAwMThEIEF1ZGVTaSBUZWNobm9sb2dpZXMKKzAwMDE4RSBMb2dpdGVjIENvcnBvcmF0aW9uCiswMDAxOEYgS2VuZXRlYywgSW5jLgorMDAwMTkwIFNNSy1NCiswMDAxOTEgU1lSRUQgRGF0YSBTeXN0ZW1zCiswMDAxOTIgVGV4YXMgRGlnaXRhbCBTeXN0ZW1zCiswMDAxOTMgSGFuYnl1bCBUZWxlY29tIENvLiwgTHRkLgorMDAwMTk0IENhcGl0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uCiswMDAxOTUgU2VuYSBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDE5NiBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDAxOTcgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwMTk4IERhcmltIFZpc2lvbgorMDAwMTk5IEhlaVNlaSBFbGVjdHJvbmljcworMDAwMTlBIExFVU5JRyBHbWJICiswMDAxOUIgS3lvdG8gTWljcm9jb21wdXRlciBDby4sIEx0ZC4KKzAwMDE5QyBKRFMgVW5pcGhhc2UgSW5jLgorMDAwMTlEIEUtQ29udHJvbCBTeXN0ZW1zLCBJbmMuCiswMDAxOUUgRVNTIFRlY2hub2xvZ3ksIEluYy4KKzAwMDE5RiBQaG9uZXggQnJvYWRiYW5kCiswMDAxQTAgSW5maW5pbGluayBDb3Jwb3JhdGlvbgorMDAwMUExIE1hZy1UZWssIEluYy4KKzAwMDFBMiBMb2dpY2FsIENvLiwgTHRkLgorMDAwMUEzIEdFTkVTWVMgTE9HSUMsIElOQy4KKzAwMDFBNCBNaWNyb2xpbmsgQ29ycG9yYXRpb24KKzAwMDFBNSBOZXh0Y29tbSwgSW5jLgorMDAwMUE2IFNjaWVudGlmaWMtQXRsYW50YSBBcmNvZGFuIEEvUworMDAwMUE3IFVORVggVEVDSE5PTE9HWSBDT1JQT1JBVElPTgorMDAwMUE4IFdlbGx0ZWNoIENvbXB1dGVyIENvLiwgTHRkLgorMDAwMUE5IEJNVyBBRworMDAwMUFBIEFpcnNwYW4gQ29tbXVuaWNhdGlvbnMsIEx0ZC4KKzAwMDFBQiBNYWluIFN0cmVldCBOZXR3b3JrcworMDAwMUFDIFNpdGFyYSBOZXR3b3JrcywgSW5jLgorMDAwMUFEIENvYWNoIE1hc3RlciBJbnRlcm5hdGlvbmFsICBkLmIuYS4gQ01JIFdvcmxkd2lkZSwgSW5jLgorMDAwMUFFIFRyZXggRW50ZXJwcmlzZXMKKzAwMDFBRiBNb3Rvcm9sYSBDb21wdXRlciBHcm91cAorMDAwMUIwIEZ1bGx0ZWsgVGVjaG5vbG9neSBDby4sIEx0ZC4KKzAwMDFCMSBHZW5lcmFsIEJhbmR3aWR0aAorMDAwMUIyIERpZ2l0YWwgUHJvY2Vzc2luZyBTeXN0ZW1zLCBJbmMuCiswMDAxQjMgUHJlY2lzaW9uIEVsZWN0cm9uaWMgTWFudWZhY3R1cmluZworMDAwMUI0IFdheXBvcnQsIEluYy4KKzAwMDFCNSBUdXJpbiBOZXR3b3JrcywgSW5jLgorMDAwMUI2IFNBRUpJTiBUJk0gQ28uLCBMdGQuCiswMDAxQjcgQ2VudG9zLCBJbmMuCiswMDAxQjggTmV0c2Vuc2l0eSwgSW5jLgorMDAwMUI5IFNLRiBDb25kaXRpb24gTW9uaXRvcmluZworMDAwMUJBIElDLU5ldCwgSW5jLgorMDAwMUJCIEZyZXF1ZW50aXMKKzAwMDFCQyBCcmFpbnMgQ29ycG9yYXRpb24KKzAwMDFCRCBQZXRlcnNvbiBFbGVjdHJvLU11c2ljYWwgUHJvZHVjdHMsIEluYy4KKzAwMDFCRSBHaWdhbGluayBDby4sIEx0ZC4KKzAwMDFCRiBUZWxlZm9yY2UgQ28uLCBMdGQuCiswMDAxQzAgQ29tcHVMYWIsIEx0ZC4KKzAwMDFDMSBWaXRlc3NlIFNlbWljb25kdWN0b3IgQ29ycG9yYXRpb24KKzAwMDFDMiBBUksgUmVzZWFyY2ggQ29ycC4KKzAwMDFDMyBBY3JvbWFnLCBJbmMuCiswMDAxQzQgTmVvV2F2ZSwgSW5jLgorMDAwMUM1IFNpbXBsZXIgTmV0d29ya3MKKzAwMDFDNiBRdWFycnkgVGVjaG5vbG9naWVzCiswMDAxQzcgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwMUM4IFRIT01BUyBDT05SQUQgQ09SUC4KKzAwMDFDOCBDT05SQUQgQ09SUC4KKzAwMDFDOSBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDAxQ0EgR2VvY2FzdCBOZXR3b3JrIFN5c3RlbXMsIEluYy4KKzAwMDFDQiBOZXRHYW1lLCBMdGQuCiswMDAxQ0MgSmFwYW4gVG90YWwgRGVzaWduIENvbW11bmljYXRpb24gQ28uLCBMdGQuCiswMDAxQ0QgQVJ0ZW0KKzAwMDFDRSBDdXN0b20gTWljcm8gUHJvZHVjdHMsIEx0ZC4KKzAwMDFDRiBBbHBoYSBEYXRhIFBhcmFsbGVsIFN5c3RlbXMsIEx0ZC4KKzAwMDFEMCBWaXRhbFBvaW50LCBJbmMuCiswMDAxRDEgQ29OZXQgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDFEMiBNYWNQb3dlciBQZXJpcGhlcmFscywgTHRkLgorMDAwMUQzIFBBWENPTU0sIEluYy4KKzAwMDFENCBMZWlzdXJlIFRpbWUsIEluYy4KKzAwMDFENSBIQUVET05HIElORk8gJiBDT01NIENPLiwgTFRECiswMDAxRDYgTUFOIFJvbGFuZCBEcnVja21hc2NoaW5lbiBBRworMDAwMUQ3IEY1IE5ldHdvcmtzLCBJbmMuCiswMDAxRDggVGVsdHJvbmljcywgSW5jLgorMDAwMUQ5IFNpZ21hLCBJbmMuCiswMDAxREEgV0lOQ09NTSBDb3Jwb3JhdGlvbgorMDAwMURCIEZyZWVjb20gVGVjaG5vbG9naWVzIEdtYkgKKzAwMDFEQyBBY3RpdmV0ZWxjbworMDAwMUREIEF2YWlsIE5ldHdvcmtzCiswMDAxREUgVHJhbmdvIFN5c3RlbXMsIEluYy4KKzAwMDFERiBJU0ROIENvbW11bmljYXRpb25zLCBMdGQuCiswMDAxRTAgRmFzdCBTeXN0ZW1zLCBJbmMuCiswMDAxRTEgS2lucG8gRWxlY3Ryb25pY3MsIEluYy4KKzAwMDFFMiBBbmRvIEVsZWN0cmljIENvcnBvcmF0aW9uCiswMDAxRTMgU2llbWVucyBBRworMDAwMUU0IFNpdGVyYSwgSW5jLgorMDAwMUU1IFN1cGVybmV0LCBJbmMuCiswMDAxRTYgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKzAwMDFFNyBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorMDAwMUU4IEZvcmNlMTAgTmV0d29ya3MsIEluYy4KKzAwMDFFOSBMaXR0b24gTWFyaW5lIFN5c3RlbXMgQi5WLgorMDAwMUVBIENpcmlsaXVtIENvcnAuCiswMDAxRUIgQy1DT00gQ29ycG9yYXRpb24KKzAwMDFFQyBFcmljc3NvbiBHcm91cAorMDAwMUVEIFNFVEEgQ29ycC4KKzAwMDFFRSBDb210cm9sIEV1cm9wZSwgTHRkLgorMDAwMUVGIENhbXRlbCBUZWNobm9sb2d5IENvcnAuCiswMDAxRjAgVHJpZGl1bSwgSW5jLgorMDAwMUYxIElubm92YXRpdmUgQ29uY2VwdHMsIEluYy4KKzAwMDFGMiBNYXJrIG9mIHRoZSBVbmljb3JuLCBJbmMuCiswMDAxRjMgUVBTLCBJbmMuCiswMDAxRjQgRW50ZXJhc3lzIE5ldHdvcmtzCiswMDAxRjUgRVJJTSBTLkEuCiswMDAxRjYgQXNzb2NpYXRpb24gb2YgTXVzaWNhbCBFbGVjdHJvbmljcyBJbmR1c3RyeQorMDAwMUY3IEltYWdlIERpc3BsYXkgU3lzdGVtcywgSW5jLgorMDAwMUY4IEFkaGVyZW50IFN5c3RlbXMsIEx0ZC4KKzAwMDFGOSBUZXJhR2xvYmFsIENvbW11bmljYXRpb25zIENvcnAuCiswMDAxRkEgSE9ST1NDQVMKKzAwMDFGQiBEb1RvcCBUZWNobm9sb2d5LCBJbmMuCiswMDAxRkMgS2V5ZW5jZSBDb3Jwb3JhdGlvbgorMDAwMUZEIERpZ2l0YWwgVm9pY2UgU3lzdGVtcywgSW5jLgorMDAwMUZFIERJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OCiswMDAxRkYgRGF0YSBEaXJlY3QgTmV0d29ya3MsIEluYy4KKzAwMDIwMCBOZXQgJiBTeXMgQ28uLCBMdGQuCiswMDAyMDEgSUZNIEVsZWN0cm9uaWMgZ21iaAorMDAwMjAyIEFtaW5vIENvbW11bmljYXRpb25zLCBMdGQuCiswMDAyMDMgV29vbnNhbmcgVGVsZWNvbSwgSW5jLgorMDAwMjA0IEJvZG1hbm4gSW5kdXN0cmllcyBFbGVrdHJvbmlrIEdtYkgKKzAwMDIwNSBIaXRhY2hpIERlbnNoaSwgTHRkLgorMDAwMjA2IFRlbGl0YWwgUiZEIERlbm1hcmsgQS9TCiswMDAyMDcgVmlzaW9uR2xvYmFsIE5ldHdvcmsgQ29ycC4KKzAwMDIwOCBVbmlmeSBOZXR3b3JrcywgSW5jLgorMDAwMjA5IFNoZW56aGVuIFNFRCBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwMjBBIEdlZnJhbiBTcGEKKzAwMDIwQiBOYXRpdmUgTmV0d29ya3MsIEluYy4KKzAwMDIwQyBNZXRyby1PcHRpeAorMDAwMjBEIE1pY3JvbnBjLmNvbQorMDAwMjBFIExhdXJlbCBOZXR3b3JrcywgSW5jLgorMDAwMjBGIEFBVFIKKzAwMDIxMCBGZW5lY29tCiswMDAyMTEgTmF0dXJlIFdvcmxkd2lkZSBUZWNobm9sb2d5IENvcnAuCiswMDAyMTIgU2llcnJhQ29tCiswMDAyMTMgUy5ELkUuTC4KKzAwMDIxNCBEVFZSTworMDAwMjE1IENvdGFzIENvbXB1dGVyIFRlY2hub2xvZ3kgQS9CCiswMDAyMTYgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwMjE3IENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDIxOCBBZHZhbmNlZCBTY2llbnRpZmljIENvcnAKKzAwMDIxOSBQYXJhbG9uIFRlY2hub2xvZ2llcworMDAwMjFBIFp1bWEgTmV0d29ya3MKKzAwMDIxQiBLb2xsbW9yZ2VuLVNlcnZvdHJvbml4CiswMDAyMUMgTmV0d29yayBFbGVtZW50cywgSW5jLgorMDAwMjFEIERhdGEgR2VuZXJhbCBDb21tdW5pY2F0aW9uIEx0ZC4KKzAwMDIxRSBTSU1URUwgUy5SLkwuCiswMDAyMUYgQWN1bGFiIFBMQworMDAwMjIwIENhbm9uIEFwdGV4LCBJbmMuCiswMDAyMjEgRFNQIEFwcGxpY2F0aW9uLCBMdGQuCiswMDAyMjIgQ2hyb21pc3lzLCBJbmMuCiswMDAyMjMgQ2xpY2tUVgorMDAwMjI0IExhbnRlcm4gQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDIyNSBDZXJ0dXMgVGVjaG5vbG9neSwgSW5jLgorMDAwMjI2IFhFU3lzdGVtcywgSW5jLgorMDAwMjI3IEVTRCBHbWJICiswMDAyMjggTmVjc29tLCBMdGQuCiswMDAyMjkgQWR0ZWMgQ29ycG9yYXRpb24KKzAwMDIyQSBBc291bmQgRWxlY3Ryb25pYworMDAwMjJCIFRhbXVyYSBFbGVjdHJpYyBXb3JrcywgTHRkLgorMDAwMjJDIEFCQiBCb21lbSwgSW5jLgorMDAwMjJEIEFnZXJlIFN5c3RlbXMKKzAwMDIyRSBURUFDIENvcnAuIFImIEQKKzAwMDIyRiBQLUN1YmUsIEx0ZC4KKzAwMDIzMCBJbnRlcnNvZnQgRWxlY3Ryb25pY3MKKzAwMDIzMSBJbmdlcnNvbGwtUmFuZAorMDAwMjMyIEF2aXNpb24sIEluYy4KKzAwMDIzMyBNYW50cmEgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDIzNCBJbXBlcmlhbCBUZWNobm9sb2d5LCBJbmMuCiswMDAyMzUgUGFyYWdvbiBOZXR3b3JrcyBJbnRlcm5hdGlvbmFsCiswMDAyMzYgSU5JVCBHbWJICiswMDAyMzcgQ29zbW8gUmVzZWFyY2ggQ29ycC4KKzAwMDIzOCBTZXJvbWUgVGVjaG5vbG9neSwgSW5jLgorMDAwMjM5IFZpc2ljb20KKzAwMDIzQSBaU0sgU3RpY2ttYXNjaGluZW4gR21iSAorMDAwMjNCIFJlZGJhY2sgTmV0d29ya3MKKzAwMDIzQyBDcmVhdGl2ZSBUZWNobm9sb2d5LCBMdGQuCiswMDAyM0QgTnVTcGVlZCwgSW5jLgorMDAwMjNFIFNlbHRhIFRlbGVtYXRpY2EgUy5wLmEKKzAwMDIzRiBDb21wYWwgRWxlY3Ryb25pY3MsIEluYy4KKzAwMDI0MCBTZWVkZWsgQ28uLCBMdGQuCiswMDAyNDEgQW1lci5jb20KKzAwMDI0MiBWaWRlb2ZyYW1lIFN5c3RlbXMKKzAwMDI0MyBSYXlzaXMgQ28uLCBMdGQuCiswMDAyNDQgU1VSRUNPTSBUZWNobm9sb2d5IENvLgorMDAwMjQ1IExhbXB1cyBDbywgTHRkLgorMDAwMjQ2IEFsbC1XaW4gVGVjaCBDby4sIEx0ZC4KKzAwMDI0NyBHcmVhdCBEcmFnb24gSW5mb3JtYXRpb24gVGVjaG5vbG9neSAoR3JvdXApIENvLiwgTHRkLgorMDAwMjQ4IFBpbHogR21iSCAmIENvLgorMDAwMjQ5IEF2aXYgSW5mb2NvbSBDbywgTHRkLgorMDAwMjRBIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDI0QiBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDAyNEMgU2lCeXRlLCBJbmMuCiswMDAyNEQgTWFubmVzbWFuIERlbWF0aWMgQ29sYnkgUHR5LiBMdGQuCiswMDAyNEUgRGF0YWNhcmQgR3JvdXAKKzAwMDI0RiBJUE0gRGF0YWNvbSBTLlIuTC4KKzAwMDI1MCBHZXlzZXIgTmV0d29ya3MsIEluYy4KKzAwMDI1MSBTb21hIE5ldHdvcmtzCiswMDAyNTIgQ2FycmllciBDb3Jwb3JhdGlvbgorMDAwMjUzIFRlbGV2aWRlbywgSW5jLgorMDAwMjU0IFdvcmxkR2F0ZQorMDAwMjU1IElCTSBDb3Jwb3JhdGlvbgorMDAwMjU2IEFscGhhIFByb2Nlc3NvciwgSW5jLgorMDAwMjU3IE1pY3JvY29tIENvcnAuCiswMDAyNTggRmx5aW5nIFBhY2tldHMgQ29tbXVuaWNhdGlvbnMKKzAwMDI1OSBUc2FubiBLdWVuIENoaW5hIChTaGFuZ2hhaSlFbnRlcnByaXNlIENvLiwgTHRkLiBJVCBHcm91cAorMDAwMjVBIENhdGVuYSBOZXR3b3JrcworMDAwMjVCIENhbWJyaWRnZSBTaWxpY29uIFJhZGlvCiswMDAyNUMgU0NJIFN5c3RlbXMgKEt1bnNoYW4pIENvLiwgTHRkLgorMDAwMjVEIENhbGl4IE5ldHdvcmtzCiswMDAyNUUgSGlnaCBUZWNobm9sb2d5IEx0ZAorMDAwMjVGIE5vcnRlbCBOZXR3b3JrcworMDAwMjYwIEFjY29yZGlvbiBOZXR3b3JrcywgSW5jLgorMDAwMjYxIGkzIE1pY3JvIFRlY2hub2xvZ3kgQUIKKzAwMDI2MiBTb3lvIEdyb3VwIFNveW8gQ29tIFRlY2ggQ28uLCBMdGQKKzAwMDI2MyBVUFMgTWFudWZhY3R1cmluZyBTUkwKKzAwMDI2NCBBdWRpb1JhbXAuY29tCiswMDAyNjUgVmlyZGl0ZWNoIENvLiBMdGQuCiswMDAyNjYgVGhlcm1hbG9naWMgQ29ycG9yYXRpb24KKzAwMDI2NyBOT0RFIFJVTk5FUiwgSU5DLgorMDAwMjY4IEhhcnJpcyBHb3Zlcm5tZW50IENvbW11bmljYXRpb25zCiswMDAyNjkgTmFkYXRlbCBDby4sIEx0ZAorMDAwMjZBIENvY2VzcyBUZWxlY29tIENvLiwgTHRkLgorMDAwMjZCIEJDTSBDb21wdXRlcnMgQ28uLCBMdGQuCiswMDAyNkMgUGhpbGlwcyBDRlQKKzAwMDI2RCBBZGVwdCBUZWxlY29tCiswMDAyNkUgTmVHZU4gQWNjZXNzLCBJbmMuCiswMDAyNkYgU2VuYW8gSW50ZXJuYXRpb25hbCBDby4sIEx0ZC4KKzAwMDI3MCBDcmV3YXZlIENvLiwgTHRkLgorMDAwMjcxIFZwYWNrZXQgQ29tbXVuaWNhdGlvbnMKKzAwMDI3MiBDQyZDIFRlY2hub2xvZ2llcywgSW5jLgorMDAwMjczIENvcmlvbGlzIE5ldHdvcmtzCiswMDAyNzQgVG9tbXkgVGVjaG5vbG9naWVzIENvcnAuCiswMDAyNzUgU01BUlQgVGVjaG5vbG9naWVzLCBJbmMuCiswMDAyNzYgUHJpbWF4IEVsZWN0cm9uaWNzIEx0ZC4KKzAwMDI3NyBDYXNoIFN5c3RlbWVzIEluZHVzdHJpZQorMDAwMjc4IFNhbXN1bmcgRWxlY3Ryby1NZWNoYW5pY3MgQ28uLCBMdGQuCiswMDAyNzkgQ29udHJvbCBBcHBsaWNhdGlvbnMsIEx0ZC4KKzAwMDI3QSBJT0kgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorMDAwMjdCIEFtcGxpZnkgTmV0LCBJbmMuCiswMDAyN0MgVHJpbGl0aGljLCBJbmMuCiswMDAyN0QgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwMjdFIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDI3RiBhc2stdGVjaG5vbG9naWVzLmNvbQorMDAwMjgwIE11IE5ldCwgSW5jLgorMDAwMjgxIE1hZGdlIEx0ZC4KKzAwMDI4MiBWaWFDbGl4LCBJbmMuCiswMDAyODMgU3BlY3RydW0gQ29udHJvbHMsIEluYy4KKzAwMDI4NCBBbHN0b20gVCZEIFAmQworMDAwMjg1IFJpdmVyc3RvbmUgTmV0d29ya3MKKzAwMDI4NiBPY2NhbSBOZXR3b3JrcworMDAwMjg3IEFkYXBjb20KKzAwMDI4OCBHTE9CQUwgVklMTEFHRSBDT01NVU5JQ0FUSU9OCiswMDAyODkgRE5FIFRlY2hub2xvZ2llcworMDAwMjhBIEFtYml0IE1pY3Jvc3lzdGVtcyBDb3Jwb3JhdGlvbgorMDAwMjhCIFZEU0wgU3lzdGVtcyBPWQorMDAwMjhDIE1pY3JlbC1TeW5lcmd5IFNlbWljb25kdWN0b3IKKzAwMDI4RCBNb3ZpdGEgVGVjaG5vbG9naWVzLCBJbmMuCiswMDAyOEUgUmFwaWQgNSBOZXR3b3JrcywgSW5jLgorMDAwMjhGIEdsb2JldGVrLCBJbmMuCiswMDAyOTAgV29vcmlnaXNvb2wsIEluYy4KKzAwMDI5MSBPcGVuIE5ldHdvcmsgQ28uLCBMdGQuCiswMDAyOTIgTG9naWMgSW5ub3ZhdGlvbnMsIEluYy4KKzAwMDI5MyBTb2xpZCBEYXRhIFN5c3RlbXMKKzAwMDI5NCBUb2t5byBTb2t1c2hpbiBDby4sIEx0ZC4KKzAwMDI5NSBJUC5BY2Nlc3MgTGltaXRlZAorMDAwMjk2IExlY3Ryb24gQ28sLiBMdGQuCiswMDAyOTcgQy1DT1IubmV0CiswMDAyOTggQnJvYWRmcmFtZSBDb3Jwb3JhdGlvbgorMDAwMjk5IEFwZXgsIEluYy4KKzAwMDI5QSBTdG9yYWdlIEFwcHMKKzAwMDI5QiBLcmVhdGVsIENvbW11bmljYXRpb25zIEFCCiswMDAyOUMgM0NPTQorMDAwMjlEIE1lcml4IENvcnAuCiswMDAyOUUgSW5mb3JtYXRpb24gRXF1aXBtZW50IENvLiwgTHRkLgorMDAwMjlGIEwtMyBDb21tdW5pY2F0aW9uIEF2aWF0aW9uIFJlY29yZGVycworMDAwMkEwIEZsYXRzdGFjayBMdGQuCiswMDAyQTEgV29ybGQgV2lkZSBQYWNrZXRzCiswMDAyQTIgSGlsc2NoZXIgR21iSAorMDAwMkEzIEFCQiBQb3dlciBBdXRvbWF0aW9uCiswMDAyQTQgQWRkUGFjIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDAyQTUgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uCiswMDAyQTYgRWZmaW5ldCBTeXN0ZW1zIENvLiwgTHRkLgorMDAwMkE3IFZpdmFjZSBOZXR3b3JrcworMDAwMkE4IEFpciBMaW5rIFRlY2hub2xvZ3kKKzAwMDJBOSBSQUNPTSwgcy5yLm8uCiswMDAyQUEgUExjb20gQ28uLCBMdGQuCiswMDAyQUIgQ1RDIFVuaW9uIFRlY2hub2xvZ2llcyBDby4sIEx0ZC4KKzAwMDJBQyAzUEFSIGRhdGEKKzAwMDJBRCBQZW50YXggQ29ycG90YXRpb24KKzAwMDJBRSBTY2FubmV4IEVsZWN0cm9uaWNzIEx0ZC4KKzAwMDJBRiBUZWxlQ3J1eiBUZWNobm9sb2d5LCBJbmMuCiswMDAyQjAgSG9rdWJ1IENvbW11bmljYXRpb24gJiBJbmR1c3RyaWFsIENvLiwgTHRkLgorMDAwMkIxIEFucml0c3UsIEx0ZC4KKzAwMDJCMiBDYWJsZXZpc2lvbgorMDAwMkIzIEludGVsIENvcnBvcmF0aW9uCiswMDAyQjQgREFQSE5FCiswMDAyQjUgQXZuZXQsIEluYy4KKzAwMDJCNiBBY3Jvc3NlciBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwMkI3IFdhdGFuYWJlIEVsZWN0cmljIEluZHVzdHJ5IENvLiwgTHRkLgorMDAwMkI4IFdISSBLT05TVUxUIEFCCiswMDAyQjkgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwMkJBIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDJCQiBDb250aW51b3VzIENvbXB1dGluZworMDAwMkJDIExWTCA3IFN5c3RlbXMsIEluYy4KKzAwMDJCRCBCaW9uZXQgQ28uLCBMdGQuCiswMDAyQkUgVG90c3UgRW5naW5lZXJpbmcsIEluYy4KKzAwMDJCRiBkb3RSb2NrZXQsIEluYy4KKzAwMDJDMCBCZW5jZW50IFR6ZW5nIEluZHVzdHJ5IENvLiwgTHRkLgorMDAwMkMxIElubm92YXRpdmUgRWxlY3Ryb25pYyBEZXNpZ25zLCBJbmMuCiswMDAyQzIgTmV0IFZpc2lvbiBUZWxlY29tCiswMDAyQzMgQXJlbG5ldCBMdGQuCiswMDAyQzQgVmVjdG9yIEludGVybmF0aW9uYWwgQlVCQQorMDAwMkM1IEV2ZXJ0eiBNaWNyb3N5c3RlbXMgTHRkLgorMDAwMkM2IERhdGEgVHJhY2sgVGVjaG5vbG9neSBQTEMKKzAwMDJDNyBBTFBTIEVMRUNUUklDIENvLiwgTHRkLgorMDAwMkM4IFRlY2hub2NvbSBDb21tdW5pY2F0aW9ucyBUZWNobm9sb2d5IChwdGUpIEx0ZAorMDAwMkM5IE1lbGxhbm94IFRlY2hub2xvZ2llcworMDAwMkNBIEVuZFBvaW50cywgSW5jLgorMDAwMkNCIFRyaVN0YXRlIEx0ZC4KKzAwMDJDQyBNLkMuQy5JCiswMDAyQ0QgVGVsZURyZWFtLCBJbmMuCiswMDAyQ0UgRm94SmV0LCBJbmMuCiswMDAyQ0YgWnlHYXRlIENvbW11bmljYXRpb25zLCBJbmMuCiswMDAyRDAgQ29tZGlhbCBDb3Jwb3JhdGlvbgorMDAwMkQxIFZpdm90ZWssIEluYy4KKzAwMDJEMiBXb3Jrc3RhdGlvbiBBRworMDAwMkQzIE5ldEJvdHosIEluYy4KKzAwMDJENCBQREEgUGVyaXBoZXJhbHMsIEluYy4KKzAwMDJENSBBQ1IKKzAwMDJENiBOSUNFIFN5c3RlbXMKKzAwMDJENyBFTVBFRyBMdGQKKzAwMDJEOCBCUkVDSVMgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24KKzAwMDJEOSBSZWxpYWJsZSBDb250cm9scworMDAwMkRBIEV4aU8gQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDJEQiBORVRTRUMKKzAwMDJEQyBGdWppdHN1IEdlbmVyYWwgTGltaXRlZAorMDAwMkREIEJyb21heCBDb21tdW5pY2F0aW9ucywgTHRkLgorMDAwMkRFIEFzdHJvZGVzaWduLCBJbmMuCiswMDAyREYgTmV0IENvbSBTeXN0ZW1zLCBJbmMuCiswMDAyRTAgRVRBUyBHbWJICiswMDAyRTEgSW50ZWdyYXRlZCBOZXR3b3JrIENvcnBvcmF0aW9uCiswMDAyRTIgTkRDIEluZmFyZWQgRW5naW5lZXJpbmcKKzAwMDJFMyBMSVRFLU9OIENvbW11bmljYXRpb25zLCBJbmMuCiswMDAyRTQgSkMgSFlVTiBTeXN0ZW1zLCBJbmMuCiswMDAyRTUgVGltZXdhcmUgTHRkLgorMDAwMkU2IEdvdWxkIEluc3RydW1lbnQgU3lzdGVtcywgSW5jLgorMDAwMkU3IENBQiBHbWJIICYgQ28gS0cKKzAwMDJFOCBFLkQuJkEuCiswMDAyRTkgQ1MgU3lzdGVtZXMgRGUgU2VjdXJpdGUgLSBDM1MKKzAwMDJFQSBWaWRlb25pY3MsIEluYy4KKzAwMDJFQiBQaWNvIENvbW11bmljYXRpb25zCiswMDAyRUMgTWFzY2hvZmYgRGVzaWduIEVuZ2luZWVyaW5nCiswMDAyRUQgRFhPIFRlbGVjb20gQ28uLCBMdGQuCiswMDAyRUUgTm9raWEgRGFubWFyayBBL1MKKzAwMDJFRiBDQ0MgTmV0d29yayBTeXN0ZW1zIEdyb3VwIEx0ZC4KKzAwMDJGMCBBTUUgT3B0aW1lZGlhIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDAyRjEgUGluZXRyb24gQ28uLCBMdGQuCiswMDAyRjIgZURldmljZSwgSW5jLgorMDAwMkYzIE1lZGlhIFNlcnZlIENvLiwgTHRkLgorMDAwMkY0IFBDVEVMLCBJbmMuCiswMDAyRjUgVklWRSBTeW5lcmdpZXMsIEluYy4KKzAwMDJGNiBFcXVpcGUgQ29tbXVuaWNhdGlvbnMKKzAwMDJGNyBBUk0KKzAwMDJGOCBTRUFLUiBFbmdpbmVlcmluZywgSW5jLgorMDAwMkY5IE1pbW9zIFNlbWljb25kdWN0b3IgU0ROIEJIRAorMDAwMkZBIERYIEFudGVubmEgQ28uLCBMdGQuCiswMDAyRkIgQmF1bXVsbGVyIEF1bHVnZW4tU3lzdGVtdGVjaG5payBHbWJICiswMDAyRkMgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwMkZEIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDJGRSBWaWRpdGVjLCBJbmMuCiswMDAyRkYgSGFuZGFuIEJyb2FkSW5mb0NvbQorMDAwMzAwIE5ldENvbnRpbnV1bSwgSW5jLgorMDAwMzAxIEF2YW50YXMgTmV0d29ya3MgQ29ycG9yYXRpb24KKzAwMDMwMiBPYXN5cyBUZWxlY29tLCBJbmMuCiswMDAzMDMgSkFNQSBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKzAwMDMwNCBQYWNpZmljIEJyb2FkYmFuZCBDb21tdW5pY2F0aW9ucworMDAwMzA1IFNtYXJ0IE5ldHdvcmsgRGV2aWNlcyBHbWJICiswMDAzMDYgRnVzaW9uIEluIFRlY2ggQ28uLCBMdGQuCiswMDAzMDcgU2VjdXJlIFdvcmtzLCBJbmMuCiswMDAzMDggQU0gQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDMwOSBUZXhjZWwgVGVjaG5vbG9neSBQTEMKKzAwMDMwQSBBcmd1cyBUZWNobm9sb2dpZXMKKzAwMDMwQiBIdW50ZXIgVGVjaG5vbG9neSwgSW5jLgorMDAwMzBDIFRlbGVzb2Z0IFRlY2hub2xvZ2llcyBMdGQuCiswMDAzMEQgVW5pd2lsbCBDb21wdXRlciBDb3JwLgorMDAwMzBFIENvcmUgQ29tbXVuaWNhdGlvbnMgQ28uLCBMdGQuCiswMDAzMEYgRGlnaXRhbCBDaGluYSAoU2hhbmdoYWkpIE5ldHdvcmtzIEx0ZC4KKzAwMDMxMCBMaW5rIEV2b2x1dGlvbiBDb3JwLgorMDAwMzExIE1pY3JvIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDAzMTIgVFItU3lzdGVtdGVjaG5payBHbWJICiswMDAzMTMgQWNjZXNzIE1lZGlhIFNQQQorMDAwMzE0IFRlbGV3YXJlIE5ldHdvcmsgU3lzdGVtcworMDAwMzE1IENpZGNvIEluY29ycG9yYXRlZAorMDAwMzE2IE5vYmVsbCBDb21tdW5pY2F0aW9ucywgSW5jLgorMDAwMzE3IE1lcmxpbiBTeXN0ZW1zLCBJbmMuCiswMDAzMTggQ3lyYXMgU3lzdGVtcywgSW5jLgorMDAwMzE5IEluZmluZW9uIEFHCiswMDAzMUEgQmVpamluZyBCcm9hZCBUZWxlY29tIEx0ZC4sIENoaW5hCiswMDAzMUIgQ2VsbHZpc2lvbiBTeXN0ZW1zLCBJbmMuCiswMDAzMUMgU3ZlbnNrYSBIYXJkdmFydWZhYnJpa2VuIEFCCiswMDAzMUQgVGFpd2FuIENvbW1hdGUgQ29tcHV0ZXIsIEluYy4KKzAwMDMxRSBPcHRyYW5ldCwgSW5jLgorMDAwMzFGIENvbmRldiBMdGQuCiswMDAzMjAgWHBlZWQsIEluYy4KKzAwMDMyMSBSZWNvIFJlc2VhcmNoIENvLiwgTHRkLgorMDAwMzIyIElESVMgQ28uLCBMdGQuCiswMDAzMjMgQ29ybmV0IFRlY2hub2xvZ3ksIEluYy4KKzAwMDMyNCBTQU5ZTyBNdWx0aW1lZGlhIFRvdHRvcmkgQ28uLCBMdGQuCiswMDAzMjUgQXJpbWEgQ29tcHV0ZXIgQ29ycC4KKzAwMDMyNiBJd2FzYWtpIEluZm9ybWF0aW9uIFN5c3RlbXMgQ28uLCBMdGQuCiswMDAzMjcgQUNUJ0wKKzAwMDMyOCBNYWNlIEdyb3VwLCBJbmMuCiswMDAzMjkgRjMsIEluYy4KKzAwMDMyQSBVbmlEYXRhIENvbW11bmljYXRpb24gU3lzdGVtcywgSW5jLgorMDAwMzJCIEdBSSBEYXRlbmZ1bmtzeXN0ZW1lIEdtYkgKKzAwMDMyQyBBQkIgSW5kdXN0cmllIEFHCiswMDAzMkQgSUJBU0UgVGVjaG5vbG9neSwgSW5jLgorMDAwMzJFIFNjb3BlIEluZm9ybWF0aW9uIE1hbmFnZW1lbnQsIEx0ZC4KKzAwMDMyRiBHbG9iYWwgU3VuIFRlY2hub2xvZ3ksIEluYy4KKzAwMDMzMCBJbWFnZW5pY3MsIENvLiwgTHRkLgorMDAwMzMxIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDMzMiBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDAzMzMgRGlnaXRlbCBDby4sIEx0ZC4KKzAwMDMzNCBOZXdwb3J0IEVsZWN0cm9uaWNzCiswMDAzMzUgTWlyYWUgVGVjaG5vbG9neQorMDAwMzM2IFpldGVzIFRlY2hub2xvZ2llcworMDAwMzM3IFZhb25lLCBJbmMuCiswMDAzMzggT2FrIFRlY2hub2xvZ3kKKzAwMDMzOSBFdXJvbG9naWMgU3lzdGVtcywgTHRkLgorMDAwMzNBIFNpbGljb24gV2F2ZSwgSW5jLgorMDAwMzNCIFRBTUkgVGVjaCBDby4sIEx0ZC4KKzAwMDMzQyBEYWlkZW4gQ28uLCBMdGQuCiswMDAzM0QgSUxTSGluIExhYgorMDAwMzNFIFRhdGV5YW1hIFN5c3RlbSBMYWJvcmF0b3J5IENvLiwgTHRkLgorMDAwMzNGIEJpZ0JhbmQgTmV0d29ya3MsIEx0ZC4KKzAwMDM0MCBGbG93YXJlIFdpcmVsZXNzIFN5c3RlbXMsIEx0ZC4KKzAwMDM0MSBBeG9uIERpZ2l0YWwgRGVzaWduCiswMDAzNDIgTm9ydGVsIE5ldHdvcmtzCiswMDAzNDMgTWFydGluIFByb2Zlc3Npb25hbCBBL1MKKzAwMDM0NCBUaWV0ZWNoLkNvLiwgTHRkLgorMDAwMzQ1IFJvdXRyZWsgTmV0d29ya3MgQ29ycG9yYXRpb24KKzAwMDM0NiBIaXRhY2hpIEtva3VzYWkgRWxlY3RyaWMsIEluYy4KKzAwMDM0NyBJbnRlbCBDb3Jwb3JhdGlvbgorMDAwMzQ4IE5vcnNjYW4gSW5zdHJ1bWVudHMsIEx0ZC4KKzAwMDM0OSBWaWRpY29kZSBEYXRhY29tbXVuaWNhdGllIEIuVi4KKzAwMDM0QSBSSUFTIENvcnBvcmF0aW9uCiswMDAzNEIgTm9ydGVsIE5ldHdvcmtzCiswMDAzNEMgU2hhbmdoYWkgRGlnaVZpc2lvbiBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwMzREIENoaWFybyBOZXR3b3JrcywgTHRkLgorMDAwMzRFIFBvcyBEYXRhIENvbXBhbnksIEx0ZC4KKzAwMDM0RiBTdXItR2FyZCBTZWN1cml0eQorMDAwMzUwIEJUSUNJTk8gU1BBCiswMDAzNTEgRGllYm9sZCwgSW5jLgorMDAwMzUyIENvbHVicmlzIE5ldHdvcmtzCiswMDAzNTMgTWl0YWMsIEluYy4KKzAwMDM1NCBGaWJlciBMb2dpYyBDb21tdW5pY2F0aW9ucworMDAwMzU1IFRlcmFCZWFtIEludGVybmV0IFN5c3RlbXMKKzAwMDM1NiBXaW5jb3IgTml4ZG9yZiBHbWJIICYgQ28gS0cKKzAwMDM1NyBJbnRlcnZvaWNlLUJyaXRlLCBJbmMuCiswMDAzNTggaUNhYmxlIFN5c3RlbSBDby4sIEx0ZC4KKzAwMDM1OSBEaWdpdGFsU2lzCiswMDAzNUEgUGhvdHJvbiBMaW1pdGVkCiswMDAzNUIgQnJpZGdlV2F2ZSBDb21tdW5pY2F0aW9ucworMDAwMzVDIFNhaW50IFNvbmcgQ29ycC4KKzAwMDM1RCBCb3N1bmcgSGktTmV0IENvLiwgTHRkLgorMDAwMzVFIE1ldHJvcG9saXRhbiBBcmVhIE5ldHdvcmtzLCBJbmMuCiswMDAzNUYgUHJ1ZWZ0ZWNobmlrIENvbmRpdGlvbiBNb25pdG9yaW5nIEdtYkggJiBDby4gS0cKKzAwMDM2MCBQQUMgSW50ZXJhY3RpdmUgVGVjaG5vbG9neSwgSW5jLgorMDAwMzYxIFdpZGNvbW0sIEluYy4KKzAwMDM2MiBWb2R0ZWwgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDM2MyBNaXJhZXN5cyBDby4sIEx0ZC4KKzAwMDM2NCBTY2VuaXggU2VtaWNvbmR1Y3RvciwgSW5jLgorMDAwMzY1IEtpcmEgSW5mb3JtYXRpb24gJiBDb21tdW5pY2F0aW9ucywgTHRkLgorMDAwMzY2IEFTTSBQYWNpZmljIFRlY2hub2xvZ3kKKzAwMDM2NyBKYXNtaW5lIE5ldHdvcmtzLCBJbmMuCiswMDAzNjggRW1iZWRvbmUgQ28uLCBMdGQuCiswMDAzNjkgTmlwcG9uIEFudGVubmEgQ28uLCBMdGQuCiswMDAzNkEgTWFpbm5ldCwgTHRkLgorMDAwMzZCIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDM2QyBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDAzNkQgUnVudG9wLCBJbmMuCiswMDAzNkUgTmljb24gU3lzdGVtcyAoUHR5KSBMaW1pdGVkCiswMDAzNkYgVGVsc2V5IFNQQQorMDAwMzcwIE5YVFYsIEluYy4KKzAwMDM3MSBBY29teiBOZXR3b3JrcyBDb3JwLgorMDAwMzcyIFVMQU4KKzAwMDM3MyBBc2Vsc2FuIEEuUworMDAwMzc0IEh1bnRlciBXYXRlcnRlY2gKKzAwMDM3NSBOZXRNZWRpYSwgSW5jLgorMDAwMzc2IEdyYXBodGVjIFRlY2hub2xvZ3ksIEluYy4KKzAwMDM3NyBHaWdhYml0IFdpcmVsZXNzCiswMDAzNzggSFVNQVggQ28uLCBMdGQuCiswMDAzNzkgUHJvc2NlbmQgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDM3QSBUYWl5byBZdWRlbiBDby4sIEx0ZC4KKzAwMDM3QiBJREVDIElaVU1JIENvcnBvcmF0aW9uCiswMDAzN0MgQ29heCBNZWRpYQorMDAwMzdEIFN0ZWxsY29tCiswMDAzN0UgUE9SVGVjaCBDb21tdW5pY2F0aW9ucywgSW5jLgorMDAwMzdGIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDM4MCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycC4KKzAwMDM4MSBJbmdlbmljbyBJbnRlcm5hdGlvbmFsCiswMDAzODIgQS1PbmUgQ28uLCBMdGQuCiswMDAzODMgTWV0ZXJhIE5ldHdvcmtzLCBJbmMuCiswMDAzODQgQUVUQQorMDAwMzg1IEFjdGVsaXMgTmV0d29ya3MsIEluYy4KKzAwMDM4NiBIbyBOZXQsIEluYy4KKzAwMDM4NyBCbGF6ZSBOZXR3b3JrIFByb2R1Y3RzCiswMDAzODggRmFzdGZhbWUgVGVjaG5vbG9neSBDby4sIEx0ZC4KKzAwMDM4OSBQbGFudHJvbmljcworMDAwMzhBIEFtZXJpY2EgT25saW5lLCBJbmMuCiswMDAzOEIgUExVUy1PTkUgSSZULCBJbmMuCiswMDAzOEMgVG90YWwgSW1wYWN0CiswMDAzOEQgUENTIFJldmVudWUgQ29udHJvbCBTeXN0ZW1zLCBJbmMuCiswMDAzOEUgQXRvZ2EgU3lzdGVtcywgSW5jLgorMDAwMzhGIFdlaW5zY2hlbCBDb3Jwb3JhdGlvbgorMDAwMzkwIERpZ2l0YWwgVmlkZW8gQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDM5MiBIeXVuZGFpIFRlbGV0ZWsgQ28uLCBMdGQuCiswMDAzOTMgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKzAwMDM5NCBDb25uZWN0IE9uZQorMDAwMzk1IENhbGlmb3JuaWEgQW1wbGlmaWVyCiswMDAzOTYgRVogQ2FzdCBDby4sIEx0ZC4KKzAwMDM5NyBXYXRjaGZyb250IEVsZWN0cm9uaWNzCiswMDAzOTggV0lTSQorMDAwMzk5IERvbmdqdSBJbmZvcm1hdGlvbnMgJiBDb21tdW5pY2F0aW9ucyBDby4sIEx0ZC4KKzAwMDM5QSBuU2luZSwgTHRkLgorMDAwMzlCIE5ldENoaXAgVGVjaG5vbG9neSwgSW5jLgorMDAwMzlDIE9wdGlNaWdodCBDb21tdW5pY2F0aW9ucywgSW5jLgorMDAwMzlEIEJFTlEgQ09SUE9SQVRJT04KKzAwMDM5RSBUZXJhIFN5c3RlbSBDby4sIEx0ZC4KKzAwMDM5RiBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDAzQTAgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwM0ExIEhJUEVSIEluZm9ybWF0aW9uICYgQ29tbXVuaWNhdGlvbiwgSW5jLgorMDAwM0EyIENhdGFwdWx0IENvbW11bmljYXRpb25zCiswMDAzQTMgTUFWSVgsIEx0ZC4KKzAwMDNBNCBEYXRhIFN0b3JhZ2UgYW5kIEluZm9ybWF0aW9uIE1hbmFnZW1lbnQKKzAwMDNBNSBNZWRlYSBDb3Jwb3JhdGlvbgorMDAwM0E3IFVuaXh0YXIgVGVjaG5vbG9neSwgSW5jLgorMDAwM0E4IElET1QgQ29tcHV0ZXJzLCBJbmMuCiswMDAzQTkgQVhDRU5UIE1lZGlhIEFHCiswMDAzQUEgV2F0bG93CiswMDAzQUIgQnJpZGdlIEluZm9ybWF0aW9uIFN5c3RlbXMKKzAwMDNBQyBGcm9uaXVzIFNjaHdlaXNzbWFzY2hpbmVuCiswMDAzQUQgRW1lcnNvbiBFbmVyZ3kgU3lzdGVtcyBBQgorMDAwM0FFIEFsbGllZCBBZHZhbmNlZCBNYW51ZmFjdHVyaW5nIFB0ZSwgTHRkLgorMDAwM0FGIFBhcmFnZWEgQ29tbXVuaWNhdGlvbnMKKzAwMDNCMCBYc2Vuc2UgVGVjaG5vbG9neSBDb3JwLgorMDAwM0IxIEFiYm90dCBMYWJvcmF0b3JpZXMgSFBECiswMDAzQjIgUmFkd2FyZQorMDAwM0IzIElBIExpbmsgU3lzdGVtcyBDby4sIEx0ZC4KKzAwMDNCNCBNYWNyb3RlayBJbnRlcm5hdGlvbmFsIENvcnAuCiswMDAzQjUgRW50cmEgVGVjaG5vbG9neSBDby4KKzAwMDNCNiBRU0kgQ29ycG9yYXRpb24KKzAwMDNCNyBaQUNDRVNTIFN5c3RlbXMKKzAwMDNCOCBOZXRLaXQgU29sdXRpb25zLCBMTEMKKzAwMDNCOSBIdWFsb25nIFRlbGVjb20gQ28uLCBMdGQuCiswMDAzQkEgU3VuIE1pY3Jvc3lzdGVtcworMDAwM0JCIFNpZ25hbCBDb21tdW5pY2F0aW9ucyBMaW1pdGVkCiswMDAzQkMgQ09UIEdtYkgKKzAwMDNCRCBPbW5pQ2x1c3RlciBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDNCRSBOZXRpbGl0eQorMDAwM0JGIENlbnRlcnBvaW50IEJyb2FkYmFuZCBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDNDMCBSRlROQyBDby4sIEx0ZC4KKzAwMDNDMSBQYWNrZXQgRHluYW1pY3MgTHRkCiswMDAzQzIgU29scGhvbmUgSy5LLgorMDAwM0MzIE1pY3JvbmlrIE11bHRpbWVkaWEKKzAwMDNDNCBUb21yYSBTeXN0ZW1zIEFTQQorMDAwM0M1IE1vYm90aXggQUcKKzAwMDNDNiBJQ1VFIFN5c3RlbXMsIEluYy4KKzAwMDNDNyBob3BmIEVsZWt0cm9uaWsgR21iSAorMDAwM0M4IENNTCBFbWVyZ2VuY3kgU2VydmljZXMKKzAwMDNDOSBURUNPTSBDby4sIEx0ZC4KKzAwMDNDQSBNVFMgU3lzdGVtcyBDb3JwLgorMDAwM0NCIE5pcHBvbiBTeXN0ZW1zIERldmVsb3BtZW50IENvLiwgTHRkLgorMDAwM0NDIE1vbWVudHVtIENvbXB1dGVyLCBJbmMuCiswMDAzQ0QgQ2xvdmVydGVjaCwgSW5jLgorMDAwM0NFIEVURU4gVGVjaG5vbG9naWVzLCBJbmMuCiswMDAzQ0YgTXV4Y29tLCBJbmMuCiswMDAzRDAgS09BTktFSVNPIENvLiwgTHRkLgorMDAwM0QxIFRha2F5YSBDb3Jwb3JhdGlvbgorMDAwM0QyIENyb3NzYmVhbSBTeXN0ZW1zLCBJbmMuCiswMDAzRDMgSW50ZXJuZXQgRW5lcmd5IFN5c3RlbXMsIEluYy4KKzAwMDNENCBBbGxvcHRpYywgSW5jLgorMDAwM0Q1IEFkdmFuY2VkIENvbW11bmljYXRpb25zIENvLiwgTHRkLgorMDAwM0Q2IFJBRFZpc2lvbiwgTHRkLgorMDAwM0Q3IE5leHROZXQgV2lyZWxlc3MsIEluYy4KKzAwMDNEOCBpTVBhdGggTmV0d29ya3MsIEluYy4KKzAwMDNEOSBTZWNoZXJvbiBTQQorMDAwM0RBIFRha2FtaXNhd2EgQ3liZXJuZXRpY3MgQ28uLCBMdGQuCiswMDAzREIgQXBvZ2VlIEVsZWN0cm9uaWNzIENvcnAuCiswMDAzREMgTGV4YXIgTWVkaWEsIEluYy4KKzAwMDNERCBDb21hcmsgQ29ycC4KKzAwMDNERSBPVEMgV2lyZWxlc3MKKzAwMDNERiBEZXNhbmEgU3lzdGVtcworMDAwM0UwIFJhZGlvRnJhbWUgTmV0d29ya3MsIEluYy4KKzAwMDNFMSBXaW5tYXRlIENvbW11bmljYXRpb24sIEluYy4KKzAwMDNFMiBDb21zcGFjZSBDb3Jwb3JhdGlvbgorMDAwM0UzIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDNFNCBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDAzRTUgSGVybXN0ZWR0IFNHCiswMDAzRTYgRW50b25lIFRlY2hub2xvZ2llcywgSW5jLgorMDAwM0U3IExvZ29zdGVrIENvLiBMdGQuCiswMDAzRTggV2F2ZWxlbmd0aCBEaWdpdGFsIExpbWl0ZWQKKzAwMDNFOSBBa2FyYSBDYW5hZGEsIEluYy4KKzAwMDNFQSBNZWdhIFN5c3RlbSBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDNFQiBBdHJpY2EKKzAwMDNFQyBJQ0cgUmVzZWFyY2gsIEluYy4KKzAwMDNFRCBTaGlua2F3YSBFbGVjdHJpYyBDby4sIEx0ZC4KKzAwMDNFRSBNS05ldCBDb3Jwb3JhdGlvbgorMDAwM0VGIE9uZWxpbmUgQUcKKzAwMDNGMCBSZWRmZXJuIEJyb2FkYmFuZCBOZXR3b3JrcworMDAwM0YxIENpY2FkYSBTZW1pY29uZHVjdG9yLCBJbmMuCiswMDAzRjIgU2VuZWNhIE5ldHdvcmtzCiswMDAzRjMgRGF6emxlIE11bHRpbWVkaWEsIEluYy4KKzAwMDNGNCBOZXRCdXJuZXIKKzAwMDNGNSBDaGlwMkNoaXAKKzAwMDNGNiBBbGxlZ3JvIE5ldHdvcmtzLCBJbmMuCiswMDAzRjcgUGxhc3QtQ29udHJvbCBHbWJICiswMDAzRjggU2FuQ2FzdGxlIFRlY2hub2xvZ2llcywgSW5jLgorMDAwM0Y5IFBsZWlhZGVzIENvbW11bmljYXRpb25zLCBJbmMuCiswMDAzRkEgVGlNZXRyYSBOZXR3b3JrcworMDAwM0ZCIFRva28gU2Vpa2kgQ29tcGFueSwgTHRkLgorMDAwM0ZDIEludGVydGV4IERhdGEgQUIKKzAwMDNGRCBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDAzRkUgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwM0ZGIENvbm5lY3RpeAorMDAwNDAwIExFWE1BUksgSU5URVJOQVRJT05BTCwgSU5DLgorMDAwNDAxIE9zYWtpIEVsZWN0cmljIENvLiwgTHRkLgorMDAwNDAyIE5leHNhbiBUZWNobm9sb2dpZXMsIEx0ZC4KKzAwMDQwMyBOZXhzaSBDb3Jwb3JhdGlvbgorMDAwNDA0IE1ha2lubyBNaWxsaW5nIE1hY2hpbmUgQ28uLCBMdGQuCiswMDA0MDUgQUNOIFRlY2hub2xvZ2llcworMDAwNDA2IEZhLiBNZXRhYm94IEFHCiswMDA0MDcgVG9wY29uIFBvc2l0aW9uaW5nIFN5c3RlbXMsIEluYy4KKzAwMDQwOCBTYW5rbyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKzAwMDQwOSBDcmF0b3MgTmV0d29ya3MKKzAwMDQwQSBTYWdlIFN5c3RlbXMKKzAwMDQwQiAzY29tIEV1cm9wZSBMdGQuCiswMDA0MEMgS0FOTk8gV29yaydzIEx0ZC4KKzAwMDQwRCBBdmF5YSwgSW5jLgorMDAwNDBFIEFWTSBHbWJICiswMDA0MEYgQXN1cyBOZXR3b3JrIFRlY2hub2xvZ2llcywgSW5jLgorMDAwNDEwIFNwaW5uYWtlciBOZXR3b3JrcywgSW5jLgorMDAwNDExIElua3JhIE5ldHdvcmtzLCBJbmMuCiswMDA0MTIgV2F2ZVNtaXRoIE5ldHdvcmtzLCBJbmMuCiswMDA0MTMgU05PTSBUZWNobm9sb2d5IEFHCiswMDA0MTQgVW1lemF3YSBNdXNlbiBEZW5raSBDby4sIEx0ZC4KKzAwMDQxNSBSYXN0ZW1lIFN5c3RlbXMgQ28uLCBMdGQuCiswMDA0MTYgUGFya3MgUy9BIENvbXVuaWNhY29lcyBEaWdpdGFpcworMDAwNDE3IEVMQVUgQUcKKzAwMDQxOCBUZWx0cm9uaWMgUy5BLlUuCiswMDA0MTkgRmliZXJjeWNsZSBOZXR3b3JrcywgSW5jLgorMDAwNDFBIGluZXMgR21iSAorMDAwNDFCIERpZ2l0YWwgSW50ZXJmYWNlcyBMdGQuCiswMDA0MUMgaXBEaWFsb2csIEluYy4KKzAwMDQxRCBDb3JlZ2Egb2YgQW1lcmljYQorMDAwNDFFIFNoaWtva3UgSW5zdHJ1bWVudGF0aW9uIENvLiwgTHRkLgorMDAwNDFGIFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCwgSW5jLgorMDAwNDIwIFNsaW0gRGV2aWNlcywgSW5jLgorMDAwNDIxIE9jdWxhciBOZXR3b3JrcworMDAwNDIyIEdvcmRvbiBLYXBlcywgSW5jLgorMDAwNDIzIEludGVsIENvcnBvcmF0aW9uCiswMDA0MjQgVE1DIHMuci5sLgorMDAwNDI1IEF0bWVsIENvcnBvcmF0aW9uCiswMDA0MjYgQXV0b3N5cworMDAwNDI3IENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDQyOCBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA0MjkgUGl4b3JkIENvcnBvcmF0aW9uCiswMDA0MkEgV2lyZWxlc3MgTmV0d29ya3MsIEluYy4KKzAwMDQyQiBJVCBBY2Nlc3MgQ28uLCBMdGQuCiswMDA0MkMgTWluZXQsIEluYy4KKzAwMDQyRCBTYXJpYW4gU3lzdGVtcywgTHRkLgorMDAwNDJFIE5ldG91cyBUZWNobm9sb2dpZXMsIEx0ZC4KKzAwMDQyRiBJbnRlcm5hdGlvbmFsIENvbW11bmljYXRpb25zIFByb2R1Y3RzLCBJbmMuCiswMDA0MzAgTmV0Z2VtCiswMDA0MzEgR2xvYmFsU3RyZWFtcywgSW5jLgorMDAwNDMyIFZveWV0cmEgVHVydGxlIEJlYWNoLCBJbmMuCiswMDA0MzMgQ3liZXJib2FyZCBBL1MKKzAwMDQzNCBBY2NlbGVudCBTeXN0ZW1zLCBJbmMuCiswMDA0MzUgQ29tcHRlayBJbnRlcm5hdGlvbmFsLCBJbmMuCiswMDA0MzYgRUxBTnNhdCBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDQzNyBQb3dpbiBJbmZvcm1hdGlvbiBUZWNobm9sb2d5LCBJbmMuCiswMDA0MzggTm9ydGVsIE5ldHdvcmtzCiswMDA0MzkgUm9zY28gRW50ZXJ0YWlubWVudCBUZWNobm9sb2d5LCBJbmMuCiswMDA0M0EgSW50ZWxsaWdlbnQgVGVsZWNvbW11bmljYXRpb25zLCBJbmMuCiswMDA0M0IgTGF2YSBDb21wdXRlciBNZmcuLCBJbmMuCiswMDA0M0MgU09OT1MgQ28uLCBMdGQuCiswMDA0M0QgSU5ERUwgQUcKKzAwMDQzRSBUZWxlbmNvbW0KKzAwMDQzRiBFbGVjdHJvbmljIFN5c3RlbXMgVGVjaG5vbG9neSwgSW5jLgorMDAwNDQwIGN5YmVyUElYSUUsIEluYy4KKzAwMDQ0MSBIYWxmIERvbWUgU3lzdGVtcywgSW5jLgorMDAwNDQyIE5BQ1QKKzAwMDQ0MyBBZ2lsZW50IFRlY2hub2xvZ2llcywgSW5jLgorMDAwNDQ0IFdlc3Rlcm4gTXVsdGlwbGV4IENvcnBvcmF0aW9uCiswMDA0NDUgTE1TIFNrYWxhciBJbnN0cnVtZW50cyBHbWJICiswMDA0NDYgQ1laRU5URUNIIENvLiwgTHRkLgorMDAwNDQ3IEFjcm93YXZlIFN5c3RlbXMgQ28uLCBMdGQuCiswMDA0NDggUG9sYXJvaWQgUHJvZmVzc2lvbmFsIEltYWdpbmcKKzAwMDQ0OSBNYXBsZXRyZWUgTmV0d29ya3MKKzAwMDQ0QSBpUG9saWN5IE5ldHdvcmtzLCBJbmMuCiswMDA0NEIgTlZJRElBCiswMDA0NEMgSkVOT1BUSUsKKzAwMDQ0RCBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA0NEUgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwNDRGIExldWtoYXJkdCBTeXN0ZW1lbGVrdHJvbmlrIEdtYkgKKzAwMDQ1MCBETUQgQ29tcHV0ZXJzIFNSTAorMDAwNDUxIE1lZHJhZCwgSW5jLgorMDAwNDUyIFJvY2tldExvZ2l4LCBJbmMuCiswMDA0NTMgWW90dGFZb3R0YSwgSW5jLgorMDAwNDU0IFF1YWRyaWdhIFVLCiswMDA0NTUgQU5UQVJBLm5ldAorMDAwNDU2IFBpcGluZ0hvdCBOZXR3b3JrcworMDAwNDU3IFVuaXZlcnNhbCBBY2Nlc3MgVGVjaG5vbG9neSwgSW5jLgorMDAwNDU4IEZ1c2lvbiBYIENvLiwgTHRkLgorMDAwNDU5IFZlcmlzdGFyIENvcnBvcmF0aW9uCiswMDA0NUEgVGhlIExpbmtzeXMgR3JvdXAsIEluYy4KKzAwMDQ1QiBUZWNoc2FuIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorMDAwNDVDIE1vYml3YXZlIFB0ZSBMdGQKKzAwMDQ1RCBCRUtBIEVsZWt0cm9uaWsKKzAwMDQ1RSBQb2x5VHJheCBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IEFHCiswMDA0NUYgRXZhbHVlIFRlY2hub2xvZ3ksIEluYy4KKzAwMDQ2MCBLbmlsaW5rIFRlY2hub2xvZ3ksIEluYy4KKzAwMDQ2MSBFUE9YIENvbXB1dGVyIENvLiwgTHRkLgorMDAwNDYyIERBS09TIERhdGEgJiBDb21tdW5pY2F0aW9uIENvLiwgTHRkLgorMDAwNDYzIEJvc2NoIFNlY3VyaXR5IFN5c3RlbXMKKzAwMDQ2NCBGYW50YXNtYSBOZXR3b3JrcywgSW5jLgorMDAwNDY1IGkucy50IGlzZG4tc3VwcG9ydCB0ZWNobmlrIEdtYkgKKzAwMDQ2NiBBUk1JVEVMIENvLgorMDAwNDY3IFd1aGFuIFJlc2VhcmNoIEluc3RpdHV0ZSBvZiBNSUkKKzAwMDQ2OCBWaXZpdHksIEluYy4KKzAwMDQ2OSBJbm5vY29tLCBJbmMuCiswMDA0NkEgTmF2aW5pIE5ldHdvcmtzCiswMDA0NkIgUGFsbSBXaXJlbGVzcywgSW5jLgorMDAwNDZDIEN5YmVyIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDA0NkQgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwNDZFIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDQ2RiBEaWdpdGVsIFMvQSBJbmR1c3RyaWEgRWxldHJvbmljYQorMDAwNDcwIGlwVW5wbHVnZ2VkIEFCCiswMDA0NzEgSVByYWQKKzAwMDQ3MiBUZWxlbHlueCwgSW5jLgorMDAwNDczIFBob3RvbmV4IENvcnBvcmF0aW9uCiswMDA0NzQgTEVHUkFORAorMDAwNDc1IDMgQ29tIENvcnBvcmF0aW9uCiswMDA0NzYgMyBDb20gQ29ycG9yYXRpb24KKzAwMDQ3NyBTY2FsYW50IFN5c3RlbXMsIEluYy4KKzAwMDQ3OCBHLiBTdGFyIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKzAwMDQ3OSBSYWRpdXMgQ28uLCBMdGQuCiswMDA0N0EgQVhYRVNTSVQgQVNBCiswMDA0N0IgU2NobHVtYmVyZ2VyCiswMDA0N0MgU2tpZGF0YSBBRworMDAwNDdEIFBlbGNvCiswMDA0N0UgTktGIEVsZWN0cm9uaWNzCiswMDA0N0YgQ2hyLiBNYXlyIEdtYkggJiBDby4gS0cKKzAwMDQ4MCBGb3VuZHJ5IE5ldHdvcmtzLCBJbmMuCiswMDA0ODEgRWNvbm9saXRlIENvbnRyb2wgUHJvZHVjdHMsIEluYy4KKzAwMDQ4MiBNZWRpYWxvZ2ljIENvcnAuCiswMDA0ODMgRGVsdHJvbiBUZWNobm9sb2d5LCBJbmMuCiswMDA0ODQgQW1hbm4gR21iSAorMDAwNDg1IFBpY29MaWdodAorMDAwNDg2IElUVEMsIFVuaXZlcnNpdHkgb2YgS2Fuc2FzCiswMDA0ODcgQ29nZW5jeSBTZW1pY29uZHVjdG9yLCBJbmMuCiswMDA0ODggRXVyb3RoZXJtIEFjdGlvbiBJbmNvcnBvcmF0ZWQuCiswMDA0ODkgWUFGTyBOZXR3b3JrcywgSW5jLgorMDAwNDhBIFRlbWlhIFZlcnRyaWVicyBHbWJICiswMDA0OEIgUG9zY29uIENvcnBvcmF0aW9uCiswMDA0OEMgTmF5bmEgTmV0d29ya3MsIEluYy4KKzAwMDQ4RCBUb25lIENvbW1hbmRlciBTeXN0ZW1zLCBJbmMuCiswMDA0OEUgT2htIFRlY2ggTGFicywgSW5jLgorMDAwNDhGIFREIFN5c3RlbXMgQ29ycC4KKzAwMDQ5MCBPcHRpY2FsIEFjY2VzcworMDAwNDkxIFRlY2hub3Zpc2lvbiwgSW5jLgorMDAwNDkyIEhpdmUgSW50ZXJuZXQsIEx0ZC4KKzAwMDQ5MyBUc2luZ2h1YSBVbmlzcGxlbmRvdXIgQ28uLCBMdGQuCiswMDA0OTQgQnJlZXplY29tLCBMdGQuCiswMDA0OTUgVGVqYXMgTmV0d29ya3MKKzAwMDQ5NiBFeHRyZW1lIE5ldHdvcmtzCiswMDA0OTcgTWFjcm9TeXN0ZW0gRGlnaXRhbCBWaWRlbyBBRworMDAwNDk5IENoaW5vIENvcnBvcmF0aW9uCiswMDA0OUEgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwNDlCIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDQ5QyBTdXJnaWVudCBOZXR3b3JrcywgSW5jLgorMDAwNDlEIElwYW5lbWEgVGVjaG5vbG9naWVzCiswMDA0OUUgV2lyZWxpbmsgQ28uLCBMdGQuCiswMDA0OUYgTWV0cm93ZXJrcworMDAwNEEwIFZlcml0eSBJbnN0cnVtZW50cywgSW5jLgorMDAwNEExIFBhdGh3YXkgQ29ubmVjdGl2aXR5CiswMDA0QTIgTC5TLkkuIEphcGFuIENvLiwgTHRkLgorMDAwNEEzIE1pY3JvY2hpcCBUZWNobm9sb2d5LCBJbmMuCiswMDA0QTQgTmV0RW5hYmxlZCwgSW5jLgorMDAwNEE1IEJhcmNvIFByb2plY3Rpb24gU3lzdGVtcyBOVgorMDAwNEE2IFNBRiBUZWhuaWthIEx0ZC4KKzAwMDRBNyBGYWJpYVRlY2ggQ29ycG9yYXRpb24KKzAwMDRBOCBCcm9hZG1heCBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDRBOSBTYW5kU3RyZWFtIFRlY2hub2xvZ2llcywgSW5jLgorMDAwNEFBIEpldHN0cmVhbSBDb21tdW5pY2F0aW9ucworMDAwNEFCIENvbXZlcnNlIE5ldHdvcmsgU3lzdGVtcywgSW5jLgorMDAwNEFDIElCTSBDT1JQLgorMDAwNEFEIE1hbGlidSBOZXR3b3JrcworMDAwNEFFIExpcXVpZCBNZXRyb25pY3MKKzAwMDRBRiBEaWdpdGFsIEZvdW50YWluLCBJbmMuCiswMDA0QjAgRUxFU0lHTiBDby4sIEx0ZC4KKzAwMDRCMSBTaWduYWwgVGVjaG5vbG9neSwgSW5jLgorMDAwNEIyIEVTU0VHSSBTUkwKKzAwMDRCMyBWaWRlb3RlaywgSW5jLgorMDAwNEI0IENJQUMKKzAwMDRCNSBFcXVpdHJhYyBDb3Jwb3JhdGlvbgorMDAwNEI2IFN0cmF0ZXggTmV0d29ya3MsIEluYy4KKzAwMDRCNyBBTUIgaS50LiBIb2xkaW5nCiswMDA0QjggS3VtYWhpcmEgQ28uLCBMdGQuCiswMDA0QjkgUy5JLiBTb3Vib3UsIEluYy4KKzAwMDRCQSBLREQgTWVkaWEgV2lsbCBDb3Jwb3JhdGlvbgorMDAwNEJCIEJhcmRhYyBDb3Jwb3JhdGlvbgorMDAwNEJDIEdpYW50ZWMsIEluYy4KKzAwMDRCRCBNb3Rvcm9sYSBCQ1MKKzAwMDRCRSBPcHRYQ29uLCBJbmMuCiswMDA0QkYgVmVyc2FMb2dpYyBDb3JwLgorMDAwNEMwIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDRDMSBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA0QzIgTWFnbmlwaXgsIEluYy4KKzAwMDRDMyBDQVNUT1IgSW5mb3JtYXRpcXVlCiswMDA0QzQgQWxsZW4gJiBIZWF0aCBMaW1pdGVkCiswMDA0QzUgQVNFIFRlY2hub2xvZ2llcywgVVNBCiswMDA0QzYgWWFtYWhhIE1vdG9yIENvLiwgTHRkLgorMDAwNEM3IE5ldE1vdW50CiswMDA0QzggTElCQSBNYXNjaGluZW5mYWJyaWsgR21iSAorMDAwNEM5IE1pY3JvIEVsZWN0cm9uIENvLiwgTHRkLgorMDAwNENBIEZyZWVNcyBDb3JwLgorMDAwNENCIFRkc29mdCBDb21tdW5pY2F0aW9uLCBMdGQuCiswMDA0Q0MgUGVlayBUcmFmZmljIEIuVi4KKzAwMDRDRCBJbmZvcm1lZGlhIFJlc2VhcmNoIEdyb3VwCiswMDA0Q0UgUGF0cmlhIEFpbG9uCiswMDA0Q0YgU2VhZ2F0ZSBUZWNobm9sb2d5CiswMDA0RDAgU29mdGxpbmsgcy5yLm8uCiswMDA0RDEgRHJldyBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDREMiBBZGNvbiBUZWxlbWV0cnkgQUcKKzAwMDREMyBUb3lva2Vpa2kgQ28uLCBMdGQuCiswMDA0RDQgUHJvdmlldyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKzAwMDRENSBIaXRhY2hpIENvbW11bmljYXRpb24gU3lzdGVtcywgSW5jLgorMDAwNEQ2IFRha2FnaSBJbmR1c3RyaWFsIENvLiwgTHRkLgorMDAwNEQ3IE9taXRlYyBJbnN0cnVtZW50YXRpb24gTHRkLgorMDAwNEQ4IElQV2lyZWxlc3MsIEluYy4KKzAwMDREOSBUaXRhbiBFbGVjdHJvbmljcywgSW5jLgorMDAwNERBIFJlbGF4IFRlY2hub2xvZ3ksIEluYy4KKzAwMDREQiBUZWxsdXMgR3JvdXAgQ29ycC4KKzAwMDREQyBOb3J0ZWwgTmV0d29ya3MKKzAwMDRERCBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA0REUgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwNERGIFRlcmFjb20gVGVsZW1hdGljYSBMdGRhLgorMDAwNEUwIFByb2NrZXQgTmV0d29ya3MKKzAwMDRFMSBJbmZpbmlvciBNaWNyb3N5c3RlbXMKKzAwMDRFMiBTTUMgTmV0d29ya3MsIEluYy4KKzAwMDRFMyBBY2N0b24gVGVjaG5vbG9neSBDb3JwLgorMDAwNEU0IERhZXJ5dW5nIEluZC4sIEluYy4KKzAwMDRFNSBHbG9uZXQgU3lzdGVtcywgSW5jLgorMDAwNEU2IEJhbnlhbiBOZXR3b3JrIFByaXZhdGUgTGltaXRlZAorMDAwNEU3IExpZ2h0cG9pbnRlIENvbW11bmljYXRpb25zLCBJbmMKKzAwMDRFOCBJRVIsIEluYy4KKzAwMDRFOSBJbmZpbmlzd2l0Y2ggQ29ycG9yYXRpb24KKzAwMDRFQSBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorMDAwNEVCIFBheG9uZXQgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDRFQyBNZW1vYm94IFNBCiswMDA0RUQgQmlsbGlvbiBFbGVjdHJpYyBDby4sIEx0ZC4KKzAwMDRFRSBMaW5jb2xuIEVsZWN0cmljIENvbXBhbnkKKzAwMDRFRiBQb2xlc3RhciBDb3JwLgorMDAwNEYwIEludGVybmF0aW9uYWwgQ29tcHV0ZXJzLCBMdGQKKzAwMDRGMSBXaGVyZU5ldAorMDAwNEYyIENpcmNhIENvbW11bmljYXRpb25zLCBMdGQuCiswMDA0RjMgRlMgRk9SVEgtU1lTVEVNRSBHbWJICiswMDA0RjQgSW5maW5pdGUgRWxlY3Ryb25pY3MgSW5jLgorMDAwNEY1IFNub3dTaG9yZSBOZXR3b3JrcywgSW5jLgorMDAwNEY2IEFtcGh1cworMDAwNEY3IE9tZWdhIEJhbmQsIEluYy4KKzAwMDRGOCBRVUFMSUNBQkxFIFRWIEluZHVzdHJpYSBFIENvbS4sIEx0ZGEKKzAwMDRGOSBYdGVyYSBDb21tdW5pY2F0aW9ucywgSW5jLgorMDAwNEZBIE1JU1QgSW5jLgorMDAwNEZCIENvbW10ZWNoLCBJbmMuCiswMDA0RkMgU3RyYXR1cyBDb21wdXRlciAoREUpLCBJbmMuCiswMDA0RkQgSmFwYW4gQ29udHJvbCBFbmdpbmVlcmluZyBDby4sIEx0ZC4KKzAwMDRGRSBQZWxhZ28gTmV0d29ya3MKKzAwMDRGRiBBY3JvbmV0IENvLiwgTHRkLgorMDAwNTAwIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDUwMSBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA1MDIgQVBQTEUgQ09NUFVURVIKKzAwMDUwMyBJQ09OQUcKKzAwMDUwNCBOYXJheSBJbmZvcm1hdGlvbiAmIENvbW11bmljYXRpb24gRW50ZXJwcmlzZQorMDAwNTA1IFN5c3RlbXMgSW50ZWdyYXRpb24gU29sdXRpb25zLCBJbmMuCiswMDA1MDYgUmVkZG8gTmV0d29ya3MgQUIKKzAwMDUwNyBGaW5lIEFwcGxpYW5jZSBDb3JwLgorMDAwNTA4IEluZXRjYW0sIEluYy4KKzAwMDUwOSBBVk9DIE5pc2hpbXVyYSBMdGQuCiswMDA1MEEgSUNTIFNwYQorMDAwNTBCIFNJQ09NIFN5c3RlbXMsIEluYy4KKzAwMDUwQyBOZXR3b3JrIFBob3RvbmljcywgSW5jLgorMDAwNTBEIE1pZHN0cmVhbSBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDUwRSAzd2FyZSwgSW5jLgorMDAwNTBGIFRhbmFrYSBTL1MgTHRkLgorMDAwNTEwIEluZmluaXRlIFNoYW5naGFpIENvbW11bmljYXRpb24gVGVybWluYWxzIEx0ZC4KKzAwMDUxMSBDb21wbGVtZW50YXJ5IFRlY2hub2xvZ2llcyBMdGQKKzAwMDUxMiBNZXNoTmV0d29ya3MsIEluYy4KKzAwMDUxMyBWVExpbnggTXVsdGltZWRpYSBTeXN0ZW1zLCBJbmMuCiswMDA1MTQgS0RUIFN5c3RlbXMgQ28uLCBMdGQuCiswMDA1MTUgTnVhcmsgQ28uLCBMdGQuCiswMDA1MTYgU01BUlQgTW9kdWxhciBUZWNobm9sb2dpZXMKKzAwMDUxNyBTaGVsbGNvbW0sIEluYy4KKzAwMDUxOCBKdXBpdGVycyBUZWNobm9sb2d5CiswMDA1MTkgU2llbWVucyBCdWlsZGluZyBUZWNobm9sb2dpZXMgQUcsCiswMDA1MUEgM0NvbSBFdXJvcGUgTHRkLgorMDAwNTFCIE1hZ2ljIENvbnRyb2wgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorMDAwNTFDIFhuZXQgVGVjaG5vbG9neSBDb3JwLgorMDAwNTFEIEFpcm9jb24sIEluYy4KKzAwMDUxRSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKzAwMDUxRiBUYWlqaW4gTWVkaWEgQ28uLCBMdGQuCiswMDA1MjAgU21hcnRyb25peCwgSW5jLgorMDAwNTIxIENvbnRyb2wgTWljcm9zeXN0ZW1zCiswMDA1MjIgTEVBKkQgQ29ycG9yYXRpb24sIEluYy4KKzAwMDUyMyBBVkwgTGlzdCBHbWJICiswMDA1MjQgQlRMIFN5c3RlbSAoSEspIExpbWl0ZWQKKzAwMDUyNSBQdXJldGVrIEluZHVzdHJpYWwgQ28uLCBMdGQuCiswMDA1MjYgSVBBUyBHbWJICiswMDA1MjcgU0ogVGVrIENvLiBMdGQKKzAwMDUyOCBOZXcgRm9jdXMsIEluYy4KKzAwMDUyOSBTaGFuZ2hhaSBCcm9hZGFuIENvbW11bmljYXRpb24gVGVjaG5vbG9neSBDby4sIEx0ZAorMDAwNTJBIElrZWdhbWkgVHN1c2hpbmtpIENvLiwgTHRkLgorMDAwNTJCIEhPUklCQSwgTHRkLgorMDAwNTJDIFN1cHJlbWUgTWFnaWMgQ29ycG9yYXRpb24KKzAwMDUyRCBab2x0cml4IEludGVybmF0aW9uYWwgTGltaXRlZAorMDAwNTJFIENpbnRhIE5ldHdvcmtzCiswMDA1MkYgTGV2aXRvbiBWb2ljZSBhbmQgRGF0YQorMDAwNTMwIEFuZGlhbW8gU3lzdGVtcywgSW5jLgorMDAwNTMxIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDUzMiBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA1MzMgU2FuZXJhIFN5c3RlbXMsIEluYy4KKzAwMDUzNCBOb3J0aHN0YXIgRW5naW5lZXJpbmcgTHRkLgorMDAwNTM1IENoaXAgUEMgTHRkLgorMDAwNTM2IERhbmFtIENvbW11bmljYXRpb25zLCBJbmMuCiswMDA1MzcgTmV0cyBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwNTM4IE1lcmlsdXMsIEluYy4KKzAwMDUzOSBBIEJyYW5kIE5ldyBXb3JsZCBpbiBTd2VkZW4gQUIKKzAwMDUzQSBXaWxsb3dnbGVuIFNlcnZpY2VzIFB0ZSBMdGQKKzAwMDUzQiBIYXJib3VyIE5ldHdvcmtzIEx0ZC4sIENvLiBCZWlqaW5nCiswMDA1M0MgWGlyY29tCiswMDA1M0QgQWdlcmUgU3lzdGVtcworMDAwNTNFIEtJRCBTeXN0ZW1lIEdtYkgKKzAwMDUzRiBWaXNpb25UZWssIEluYy4KKzAwMDU0MCBGQVNUIENvcnBvcmF0aW9uCiswMDA1NDEgQWR2YW5jZWQgU3lzdGVtcyBDby4sIEx0ZC4KKzAwMDU0MiBPdGFyaSwgSW5jLgorMDAwNTQzIElRIFdpcmVsZXNzIEdtYkgKKzAwMDU0NCBWYWxsZXkgVGVjaG5vbG9naWVzLCBJbmMuCiswMDA1NDUgSW50ZXJuZXQgUGhvdG9uaWNzCiswMDA1NDYgSy1Tb2x1dGlvbnMgSW5jLgorMDAwNTQ3IFN0YXJlbnQgTmV0d29ya3MKKzAwMDU0OCBEaXNjbyBDb3Jwb3JhdGlvbgorMDAwNTQ5IFNhbGlyYSBPcHRpY2FsIE5ldHdvcmsgU3lzdGVtcworMDAwNTRBIEFyaW8gRGF0YSBOZXR3b3JrcywgSW5jLgorMDAwNTRCIE1pY3JvIElubm92YXRpb24gQUcKKzAwMDU0QyBSRiBJbm5vdmF0aW9ucyBQdHkgTHRkCiswMDA1NEQgQnJhbnMgVGVjaG5vbG9naWVzLCBJbmMuCiswMDA1NEUgUGhpbGlwcyBDb21wb25lbnRzCiswMDA1NTAgRGlnaS1UZWNoIENvbW11bmljYXRpb25zIExpbWl0ZWQKKzAwMDU1MSBGICYgUyBFbGVrdHJvbmlrIFN5c3RlbWUgR21iSAorMDAwNTUyIFh5Y290ZWMgQ29tcHV0ZXIgR21iSAorMDAwNTUzIERWQyBDb21wYW55LCBJbmMuCiswMDA1NTQgUmFuZ2VzdGFyIFdpcmVsZXNzCiswMDA1NTUgSmFwYW4gQ2FzaCBNYWNoaW5lIENvLiwgTHRkLgorMDAwNTU2IDM2MCBTeXN0ZW1zCiswMDA1NTcgQWdpbGUgVFYgQ29ycG9yYXRpb24KKzAwMDU1OCBTeW5jaHJvbm91cywgSW5jLgorMDAwNTU5IEludHJhY29tIFMuQS4KKzAwMDU1QSBQb3dlciBEc2luZSBMdGQuCiswMDA1NUIgQ2hhcmxlcyBJbmR1c3RyaWVzLCBMdGQuCiswMDA1NUMgS293YSBDb21wYW55LCBMdGQuCiswMDA1NUQgRC1MaW5rIFN5c3RlbXMsIEluYy4KKzAwMDU1RSBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA1NUYgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwNTYwIExFQURFUiBDT01NLkNPLiwgTFRECiswMDA1NjEgbmFjIEltYWdlIFRlY2hub2xvZ3ksIEluYy4KKzAwMDU2MiBEaWdpdGFsIFZpZXcgTGltaXRlZAorMDAwNTYzIEotV29ya3MsIEluYy4KKzAwMDU2NCBUc2luZ2h1YSBCaXR3YXkgQ28uLCBMdGQuCiswMDA1NjUgVGFpbHluIENvbW11bmljYXRpb24gQ29tcGFueSBMdGQuCiswMDA1NjYgU2VjdWkuY29tIENvcnBvcmF0aW9uCiswMDA1NjcgRXR5bW9uaWMgRGVzaWduLCBJbmMuCiswMDA1NjggUGlsdG9maXNoIE5ldHdvcmtzIEFCCiswMDA1NjkgVk1XQVJFLCBJbmMuCiswMDA1NkEgSGV1ZnQgU3lzdGVtdGVjaG5payBHbWJICiswMDA1NkIgQy5QLiBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwNTZDIEh1bmcgQ2hhbmcgQ28uLCBMdGQuCiswMDA1NkQgUGFjaWZpYyBDb3Jwb3JhdGlvbgorMDAwNTZFIE5hdGlvbmFsIEVuaGFuY2UgVGVjaG5vbG9neSwgSW5jLgorMDAwNTZGIElubm9tZWRpYSBUZWNobm9sb2dpZXMgUHZ0LiBMdGQuCiswMDA1NzAgQmF5ZGVsIEx0ZC4KKzAwMDU3MSBTZWl3YSBFbGVjdHJvbmljcyBDby4KKzAwMDU3MiBEZW9uZXQgQ28uLCBMdGQuCiswMDA1NzMgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwNTc0IENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDU3NSBDRFMtRWxlY3Ryb25pY3MgQlYKKzAwMDU3NiBOU00gVGVjaG5vbG9neSBMdGQuCiswMDA1NzcgU00gSW5mb3JtYXRpb24gJiBDb21tdW5pY2F0aW9uCiswMDA1NzkgVW5pdmVyc2FsIENvbnRyb2wgU29sdXRpb24gQ29ycC4KKzAwMDU3QSBIYXR0ZXJhcyBOZXR3b3JrcworMDAwNTdCIENodW5nIE5hbSBFbGVjdHJvbmljIENvLiwgTHRkLgorMDAwNTdDIFJDTyBTZWN1cml0eSBBQgorMDAwNTdEIFN1biBDb21tdW5pY2F0aW9ucywgSW5jLgorMDAwNTdFIEVja2VsbWFubiBTdGV1ZXJ1bmdzdGVjaG5payBHbWJICiswMDA1N0YgQWNxaXMgVGVjaG5vbG9neQorMDAwNTgwIEZpYnJvbGFuIEx0ZC4KKzAwMDU4MSBTbmVsbCAmIFdpbGNveCBMdGQuCiswMDA1ODIgQ2xlYXJDdWJlIFRlY2hub2xvZ3kKKzAwMDU4MyBJbWFnZUNvbSBMaW1pdGVkCiswMDA1ODQgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuCiswMDA1ODUgSnVuaXBlciBOZXR3b3JrcywgSW5jLgorMDAwNTg2IEx1Y2VudCBUZWNobm9sb2dpZXMKKzAwMDU4NyBMb2N1cywgSW5jb3Jwb3JhdGVkCiswMDA1ODggU2Vuc29yaWEgQ29ycC4KKzAwMDU4OSBOYXRpb25hbCBEYXRhY29tcHV0ZXIKKzAwMDU4QSBOZXRjb20gQ28uLCBMdGQuCiswMDA1OEIgSVBtZW50YWwsIEluYy4KKzAwMDU4QyBPcGVudGVjaCBJbmMuCiswMDA1OEQgTHlueCBQaG90b25pYyBOZXR3b3JrcywgSW5jLgorMDAwNThFIEZsZXh0cm9uaWNzIEludGVybmF0aW9uYWwgR21iSCAmIENvLiBOZmcuIEtHCiswMDA1OEYgQ0xDc29mdCBjby4KKzAwMDU5MCBTd2lzc3ZvaWNlIEx0ZC4KKzAwMDU5MSBBY3RpdmUgU2lsaWNvbiBMdGQuCiswMDA1OTIgUHVsdGVrIENvcnAuCiswMDA1OTMgR3JhbW1hciBFbmdpbmUgSW5jLgorMDAwNTk0IElYWEFUIEF1dG9tYXRpb24gR21iSAorMDAwNTk1IEFsZXNpcyBDb3Jwb3JhdGlvbgorMDAwNTk2IEdlbm90ZWNoIENvLiwgTHRkLgorMDAwNTk3IEVhZ2xlIFRyYWZmaWMgQ29udHJvbCBTeXN0ZW1zCiswMDA1OTggQ1JPTk9TIFMuci5sLgorMDAwNTk5IERSUyBUZXN0IGFuZCBFbmVyZ3kgTWFuYWdlbWVudCBvciBEUlMtVEVNCiswMDA1OUEgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwNTlCIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDU5QyBLbGVpbmtuZWNodCBHbWJILCBJbmcuIEJ1ZXJvCiswMDA1OUQgRGFuaWVsIENvbXB1dGluZyBTeXN0ZW1zLCBJbmMuCiswMDA1OUUgWmlud2VsbCBDb3Jwb3JhdGlvbgorMDAwNTlGIFlvdHRhIE5ldHdvcmtzLCBJbmMuCiswMDA1QTAgTU9CSUxJTkUgS2Z0LgorMDAwNUExIFplbm9jb20KKzAwMDVBMiBDRUxPWCBOZXR3b3JrcworMDAwNUEzIFFFSSwgSW5jLgorMDAwNUE0IEx1Y2lkIFZvaWNlIEx0ZC4KKzAwMDVBNSBLT1RUCiswMDA1QTYgRXh0cm9uIEVsZWN0cm9uaWNzCiswMDA1QTcgSHlwZXJjaGlwLCBJbmMuCiswMDA1QTggV1lMRSBFTEVDVFJPTklDUworMDAwNUE5IFByaW5jZXRvbiBOZXR3b3JrcywgSW5jLgorMDAwNUFBIE1vb3JlIEluZHVzdHJpZXMgSW50ZXJuYXRpb25hbCBJbmMuCiswMDA1QUIgQ3liZXIgRm9uZSwgSW5jLgorMDAwNUFDIE5vcnRoZXJuIERpZ2l0YWwsIEluYy4KKzAwMDVBRCBUb3BzcGluIENvbW11bmljYXRpb25zLCBJbmMuCiswMDA1QUUgTWVkaWFwb3J0IFVTQQorMDAwNUFGIElubm9TY2FuIENvbXB1dGluZyBBL1MKKzAwMDVCMCBLb3JlYSBDb21wdXRlciBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwNUIxIEFTQiBUZWNobm9sb2d5IEJWCiswMDA1QjIgTWVkaXNvbiBDby4sIEx0ZC4KKzAwMDVCMyBBc2FoaS1FbmdpbmVlcmluZyBDby4sIEx0ZC4KKzAwMDVCNCBBY2VleCBDb3Jwb3JhdGlvbgorMDAwNUI1IEJyb2FkY29tIFRlY2hub2xvZ2llcworMDAwNUI2IElOU1lTIE1pY3JvZWxlY3Ryb25pY3MgR21iSAorMDAwNUI3IEFyYm9yIFRlY2hub2xvZ3kgQ29ycC4KKzAwMDVCOCBFbGVjdHJvbmljIERlc2lnbiBBc3NvY2lhdGVzLCBJbmMuCiswMDA1QjkgQWlydmFuYSwgSW5jLgorMDAwNUJBIEFyZWEgTmV0d29la3MsIEluYy4KKzAwMDVCQiBNeXNwYWNlIEFCCiswMDA1QkMgUmVzb3JzeXMgTHRkLgorMDAwNUJEIFJPQVggQlYKKzAwMDVCRSBLb25nc2JlcmcgU2VhdGV4IEFTCiswMDA1QkYgSnVzdEV6eSBUZWNobm9sb2d5LCBJbmMuCiswMDA1QzAgRGlnaXRhbCBOZXR3b3JrIEFsYWNhcnRlIENvLiwgTHRkLgorMDAwNUMxIEEtS3l1bmcgTW90aW9uLCBJbmMuCiswMDA1QzIgU29yb250aSwgSW5jLgorMDAwNUMzIFBhY2lmaWMgSW5zdHJ1bWVudHMsIEluYy4KKzAwMDVDNCBUZWxlY3QsIEluYy4KKzAwMDVDNSBGbGFnYSBIRgorMDAwNUM2IFRyaXogQ29tbXVuaWNhdGlvbnMKKzAwMDVDNyBJL0YtQ09NIEEvUworMDAwNUM4IFZFUllURUNICiswMDA1QzkgTEcgSW5ub3RlaworMDAwNUNBIEhpdHJvbiBUZWNobm9sb2d5LCBJbmMuCiswMDA1Q0IgUk9JUyBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDVDQyBTdW10ZWwgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDVDRCBEZW5vbiwgTHRkLgorMDAwNUNFIFByb2xpbmsgTWljcm9zeXN0ZW1zIENvcnBvcmF0aW9uCiswMDA1Q0YgVGh1bmRlciBSaXZlciBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDVEMCBTb2xpbmV0IFN5c3RlbXMKKzAwMDVEMSBNZXRhdmVjdG9yIFRlY2hub2xvZ2llcworMDAwNUQyIERBUCBUZWNobm9sb2dpZXMKKzAwMDVEMyBlUHJvZHVjdGlvbiBTb2x1dGlvbnMsIEluYy4KKzAwMDVENCBGdXR1cmVTbWFydCBOZXR3b3JrcywgSW5jLgorMDAwNUQ1IFNwZWVkY29tIFdpcmVsZXNzCiswMDA1RDYgVGl0YW4gV2lyZWxlc3MKKzAwMDVENyBWaXN0YSBJbWFnaW5nLCBJbmMuCiswMDA1RDggQXJlc2NvbSwgSW5jLgorMDAwNUQ5IFRlY2hubyBWYWxsZXksIEluYy4KKzAwMDVEQSBBcGV4IEF1dG9tYXRpb25zdGVjaG5paworMDAwNURCIE5lbnRlYyBHbWJICiswMDA1REMgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwNUREIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDVERSBHaSBGb25lIEtvcmVhLCBJbmMuCiswMDA1REYgRWxlY3Ryb25pYyBJbm5vdmF0aW9uLCBJbmMuCiswMDA1RTAgRW1waXJpeCBDb3JwLgorMDAwNUUxIFRyZWxsaXMgUGhvdG9uaWNzLCBMdGQuCiswMDA1RTIgQ3JlYXRpdiBOZXR3b3JrIFRlY2hub2xvZ2llcworMDAwNUUzIExpZ2h0U2FuZCBDb21tdW5pY2F0aW9ucywgSW5jLgorMDAwNUU0IFJlZCBMaW9uIENvbnRyb2xzIEwuUC4KKzAwMDVFNSBSZW5pc2hhdyBQTEMKKzAwMDVFNiBFZ2VuZXJhLCBJbmMuCiswMDA1RTcgTmV0cmFrZSBDb3JwLgorMDAwNUU4IFR1cmJvV2F2ZSwgSW5jLgorMDAwNUU5IFVuaWNlc3MgTmV0d29yaywgSW5jLgorMDAwNUVBIFJlZG5peAorMDAwNUVCIEJsdWUgUmlkZ2UgTmV0d29ya3MsIEluYy4KKzAwMDVFQyBNb3NhaWMgU3lzdGVtcyBJbmMuCiswMDA1RUQgVGVjaG5pa3VtIEpvYW5uZXVtIEdtYkgKKzAwMDVFRSBCRVdBVE9SIEdyb3VwCiswMDA1RUYgQURPSVIgRGlnaXRhbCBUZWNobm9sb2d5CiswMDA1RjAgU0FURUMKKzAwMDVGMSBWcmNvbSwgSW5jLgorMDAwNUYyIFBvd2VyIFIsIEluYy4KKzAwMDVGMyBXZWJveW4KKzAwMDVGNCBTeXN0ZW0gQmFzZSBDby4sIEx0ZC4KKzAwMDVGNSBPWU8gR2Vvc3BhY2UgQ29ycC4KKzAwMDVGNiBZb3VuZyBDaGFuZyBDby4gTHRkLgorMDAwNUY3IEFuYWxvZyBEZXZpY2VzLCBJbmMuCiswMDA1RjggUmVhbCBUaW1lIEFjY2VzcywgSW5jLgorMDAwNUY5IFRPQSBDb3Jwb3JhdGlvbgorMDAwNUZBIElQT3B0aWNhbCwgSW5jLgorMDAwNUZCIFNoYXJlR2F0ZSwgSW5jLgorMDAwNUZDIFNjaGVuY2sgUGVnYXN1cyBDb3JwLgorMDAwNUZEIFBhY2tldExpZ2h0IE5ldHdvcmtzIEx0ZC4KKzAwMDVGRSBUcmFmaWNvbiBOLlYuCiswMDA1RkYgU05TIFNvbHV0aW9ucywgSW5jLgorMDAwNjAwIFRva3lvIEVsZWN0cm9uaWMgSW5kdXN0cnkgQ28uLCBMdGQuCiswMDA2MDEgT3RhbmlrZWlraSBDby4sIEx0ZC4KKzAwMDYwMiBDaXJraXRlY2ggRWxlY3Ryb25pY3MgQ28uCiswMDA2MDMgQmFrZXIgSHVnaGVzIEluYy4KKzAwMDYwNCBAVHJhY2sgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDYwNSBJbm5jb20gSW50ZXJuYXRpb25hbCwgSW5jLgorMDAwNjA2IFJhcGlkV0FOLCBJbmMuCiswMDA2MDcgT21uaSBEaXJlY3Rpb25hbCBDb250cm9sIFRlY2hub2xvZ3kgSW5jLgorMDAwNjA4IEF0LVNreSBTQVMKKzAwMDYwOSBDcm9zc3BvcnQgU3lzdGVtcworMDAwNjBBIEJsdWUyc3BhY2UKKzAwMDYwQiBQYWNlbGluZSBTeXN0ZW1zIENvcnBvcmF0aW9uCiswMDA2MEMgTWVsY28gSW5kdXN0cmllcywgSW5jLgorMDAwNjBEIFdhdmU3IE9wdGljcworMDAwNjBFIElHWVMgU3lzdGVtcywgSW5jLgorMDAwNjBGIE5hcmFkIE5ldHdvcmtzIEluYworMDAwNjEwIEFiZW9uYSBOZXR3b3JrcyBJbmMKKzAwMDYxMSBaZXVzIFdpcmVsZXNzLCBJbmMuCiswMDA2MTIgQWNjdXN5cywgSW5jLgorMDAwNjEzIEthd2FzYWtpIE1pY3JvZWxlY3Ryb25pY3MgSW5jb3Jwb3JhdGVkCiswMDA2MTQgUHJpc20gSG9sZGluZ3MKKzAwMDYxNSBLaW1vdG8gRWxlY3RyaWMgQ28uLCBMdGQuCiswMDA2MTYgVGVsIE5ldCBDby4sIEx0ZC4KKzAwMDYxNyBSZWRzd2l0Y2ggSW5jLgorMDAwNjE4IERpZ2lQb3dlciBNYW51ZmFjdHVyaW5nIEluYy4KKzAwMDYxOSBDb25uZWN0aW9uIFRlY2hub2xvZ3kgU3lzdGVtcworMDAwNjFBIFpldGFyaSBJbmMuCiswMDA2MUIgUG9ydGFibGUgU3lzdGVtcywgSUJNIEphcGFuIENvLCBMdGQKKzAwMDYxQyBIb3NoaW5vIE1ldGFsIEluZHVzdHJpZXMsIEx0ZC4KKzAwMDYxRCBNSVAgVGVsZWNvbSwgSW5jLgorMDAwNjFFIE1heGFuIFN5c3RlbXMKKzAwMDYxRiBWaXNpb24gQ29tcG9uZW50cyBHbWJICiswMDA2MjAgU2VyaWFsIFN5c3RlbSBMdGQuCiswMDA2MjEgSGlub3gsIENvLiwgTHRkLgorMDAwNjIyIENodW5nIEZ1IENoZW4gWWVoIEVudGVycHJpc2UgQ29ycC4KKzAwMDYyMyBNR0UgVVBTIFN5c3RlbXMgRnJhbmNlCiswMDA2MjQgR2VudG5lciBDb21tdW5pY2F0aW9ucyBDb3JwLgorMDAwNjI1IFRoZSBMaW5rc3lzIEdyb3VwLCBJbmMuCiswMDA2MjYgTVdFIEdtYkgKKzAwMDYyNyBVbml3aWRlIFRlY2hub2xvZ2llcywgSW5jLgorMDAwNjI4IENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDYyOSBJQk0gQ09SUE9SQVRJT04KKzAwMDYyQSBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA2MkIgSU5UUkFTRVJWRVIgVEVDSE5PTE9HWQorMDAwNjJDIE5ldHdvcmsgUm9ib3RzLCBJbmMuCiswMDA2MkQgVG91Y2hTdGFyIFRlY2hub2xvZ2llcywgTC5MLkMuCiswMDA2MkUgQXJpc3RvcyBMb2dpYyBDb3JwLgorMDAwNjJGIFBpdm90ZWNoIFN5c3RlbXMgSW5jLgorMDAwNjMwIEFkdHJhbnogU3dlZGVuCiswMDA2MzEgT3B0aWNhbCBTb2x1dGlvbnMsIEluYy4KKzAwMDYzMiBNZXNjbyBFbmdpbmVlcmluZyBHbWJICiswMDA2MzMgSGVpbWFubiBCaW9tZXRyaWMgU3lzdGVtcyBHbWJICiswMDA2MzQgR1RFIEFpcmZvbmUgSW5jLgorMDAwNjM1IFBhY2tldEFpciBOZXR3b3JrcywgSW5jLgorMDAwNjM2IEplZGFpIEJyb2FkYmFuZCBOZXR3b3JrcworMDAwNjM3IFRvcHRyZW5kLU1ldGEgSW5mb3JtYXRpb24gKFNoZW5aaGVuKSBJbmMuCiswMDA2MzggU3VuZ2ppbiBDJkMgQ28uLCBMdGQuCiswMDA2MzkgTmV3dGVjCiswMDA2M0EgRHVyYSBNaWNybywgSW5jLgorMDAwNjNCIEFyY3R1cnVzIE5ldHdvcmtzLCBJbmMuCiswMDA2M0MgTk1JIEVsZWN0cm9uaWNzIEx0ZAorMDAwNjNEIE1pY3Jvd2F2ZSBEYXRhIFN5c3RlbXMgSW5jLgorMDAwNjNFIE9wdGhvcyBJbmMuCiswMDA2M0YgRXZlcmV4IENvbW11bmljYXRpb25zIEluYy4KKzAwMDY0MCBXaGl0ZSBSb2NrIE5ldHdvcmtzCiswMDA2NDEgSVRDTgorMDAwNjQyIEdlbmV0ZWwgU3lzdGVtcyBJbmMuCiswMDA2NDMgU09OTyBDb21wdXRlciBDby4sIEx0ZC4KKzAwMDY0NCBORUlYIEluYy4KKzAwMDY0NSBNZWlzZWkgRWxlY3RyaWMgQ28uIEx0ZC4KKzAwMDY0NiBTaGVuWmhlbiBYdW5CYW8gTmV0d29yayBUZWNobm9sb2d5IENvIEx0ZAorMDAwNjQ3IEV0cmFsaSBTLkEuCiswMDA2NDggU2VlZHN3YXJlLCBJbmMuCiswMDA2NDkgUXVhbnRlCiswMDA2NEEgSG9uZXl3ZWxsIENvLiwgTHRkLiAoS09SRUEpCiswMDA2NEIgQWxleG9uIENvLiwgTHRkLgorMDAwNjRDIEludmljdGEgTmV0d29ya3MsIEluYy4KKzAwMDY0RCBTZW5jb3JlCiswMDA2NEUgQnJvYWQgTmV0IFRlY2hub2xvZ3kgSW5jLgorMDAwNjRGIFBSTy1ORVRTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKzAwMDY1MCBUaWJ1cm9uIE5ldHdvcmtzLCBJbmMuCiswMDA2NTEgQXNwZW4gTmV0d29ya3MgSW5jLgorMDAwNjUyIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDY1MyBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA2NTQgTWF4eGlvIFRlY2hub2xvZ2llcworMDAwNjU1IFlpcGVlLCBJbmMuCiswMDA2NTYgVGFjdGVsIEFCCiswMDA2NTcgTWFya2V0IENlbnRyYWwsIEluYy4KKzAwMDY1OCBIZWxtdXQgRmlzY2hlciBHbWJIICYgQ28uIEtHCiswMDA2NTkgRUFMIChBcGVsZG9vcm4pIEIuVi4KKzAwMDY1QSBTdHJpeCBTeXN0ZW1zCiswMDA2NUIgRGVsbCBDb21wdXRlciBDb3JwLgorMDAwNjVDIE1hbGFjaGl0ZSBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDY1RCBIZWlkZWxiZXJnIFdlYiBTeXN0ZW1zCiswMDA2NUUgUGhvdHVyaXMsIEluYy4KKzAwMDY1RiBFQ0kgVGVsZWNvbSAtIE5HVFMgTHRkLgorMDAwNjYwIE5BREVYIENvLiwgTHRkLgorMDAwNjYxIE5JQSBIb21lIFRlY2hub2xvZ2llcyBDb3JwLgorMDAwNjYyIE1CTSBUZWNobm9sb2d5IEx0ZC4KKzAwMDY2MyBIdW1hbiBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwNjY0IEZvc3RleCBDb3Jwb3JhdGlvbgorMDAwNjY1IFN1bm55IEdpa2VuLCBJbmMuCiswMDA2NjYgUm92aW5nIE5ldHdvcmtzCiswMDA2NjcgVHJpcHAgTGl0ZQorMDAwNjY4IFZpY29uIEluZHVzdHJpZXMgSW5jLgorMDAwNjY5IERhdGFzb3VuZCBMYWJvcmF0b3JpZXMgTHRkCiswMDA2NkEgSW5maW5pQ29uIFN5c3RlbXMsIEluYy4KKzAwMDY2QiBTeXNtZXggQ29ycG9yYXRpb24KKzAwMDY2QyBSb2JpbnNvbiBDb3Jwb3JhdGlvbgorMDAwNjZEIENvbXB1cHJpbnQgUy5QLkEuCiswMDA2NkUgRGVsdGEgRWxlY3Ryb25pY3MsIEluYy4KKzAwMDY2RiBLb3JlYSBEYXRhIFN5c3RlbXMKKzAwMDY3MCBVcHBvbmV0dGkgT3kKKzAwMDY3MSBTb2Z0aW5nIEFHCiswMDA2NzIgTmV0ZXp6YQorMDAwNjczIE9wdGVsZWNvbSwgSW5jLgorMDAwNjc0IFNwZWN0cnVtIENvbnRyb2wsIEluYy4KKzAwMDY3NSBCYW5kZXJhY29tLCBJbmMuCiswMDA2NzYgTm92cmEgVGVjaG5vbG9naWVzIEluYy4KKzAwMDY3NyBTSUNLIEFHCiswMDA2NzggTWFyYW50eiBKYXBhbiwgSW5jLgorMDAwNjc5IEtvbmFtaSBDb3Jwb3JhdGlvbgorMDAwNjdBIEpNUCBTeXN0ZW1zCiswMDA2N0IgVG9wbGluayBDJkMgQ29ycG9yYXRpb24KKzAwMDY3QyBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDA2N0QgVGFrYXNhZ28gTHRkLgorMDAwNjdFIFdpbkNvbSBTeXN0ZW1zLCBJbmMuCiswMDA2N0YgUmVhcmRlbiBTdGVlbCBUZWNobm9sb2dpZXMKKzAwMDY4MCBDYXJkIEFjY2VzcywgSW5jLgorMDAwNjgxIEdvZXBlbCBFbGVjdHJvbmljIEdtYkgKKzAwMDY4MiBDb252ZWRpYQorMDAwNjgzIEJyYXZhcmEgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDY4NCBCaWFjb3JlIEFCCiswMDA2ODUgTmV0TmVhclUgQ29ycG9yYXRpb24KKzAwMDY4NiBaQVJEQ09NIENvLiwgTHRkLgorMDAwNjg3IE9tbml0cm9uIFN5c3RlbXMgVGVjaG5vbG9neSwgSW5jLgorMDAwNjg4IFRlbHdheXMgQ29tbXVuaWNhdGlvbiBDby4sIEx0ZC4KKzAwMDY4OSB5TGV6IFRlY2hub2xvZ2llcyBQdGUgTHRkCiswMDA2OEEgTmV1cm9uTmV0IENvLiBMdGQuIFImRCBDZW50ZXIKKzAwMDY4QiBBaXJSdW5uZXIgVGVjaG5vbG9naWVzLCBJbmMuCiswMDA2OEMgM0NvbSBDb3Jwb3JhdGlvbgorMDAwNjhEIFNBTmdhdGUgU3lzdGVtcworMDAwNjhFIEhJRCBDb3Jwb3JhdGlvbgorMDAwNjhGIFRlbGVtb25pdG9yLCBJbmMuCiswMDA2OTAgRXVyYWNvbSBDb21tdW5pY2F0aW9uIEdtYkgKKzAwMDY5MSBQVCBJbm92YWNhbworMDAwNjkyIEludHJ1dmVydCBOZXR3b3JrcywgSW5jLgorMDAwNjkzIEZsZXh1cyBDb21wdXRlciBUZWNobm9sb2d5LCBJbmMuCiswMDA2OTQgTW9iaWxsaWFuIENvcnBvcmF0aW9uCiswMDA2OTUgRW5zdXJlIFRlY2hub2xvZ2llcywgSW5jLgorMDAwNjk2IEFkdmVudCBOZXR3b3JrcworMDAwNjk3IFIgJiBEIENlbnRlcgorMDAwNjk4IGVnbml0ZSBTb2Z0d2FyZSBHbWJICiswMDA2OTkgVmlkYSBEZXNpZ24gQ28uCiswMDA2OUEgZSAmIFRlbAorMDAwNjlCIEFWVCBBdWRpbyBWaWRlbyBUZWNobm9sb2dpZXMgR21iSAorMDAwNjlDIFRyYW5zbW9kZSBTeXN0ZW1zIEFCCiswMDA2OUQgUGV0YXJkcyBNb2JpbGUgSW50ZWxsaWdlbmNlCiswMDA2OUUgVU5JUUEsIEluYy4KKzAwMDY5RiBLdW9rb2EgTmV0d29ya3MKKzAwMDZBMCBNeCBJbWFnaW5nCiswMDA2QTEgQ2Vsc2lhbiBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDZBMiBNaWNyb3R1bmUsIEluYy4KKzAwMDZBMyBCaXRyYW4gQ29ycG9yYXRpb24KKzAwMDZBNCBJTk5PV0VMTCBDb3JwLgorMDAwNkE1IFBJTk9OIENvcnAuCiswMDA2QTYgQXJ0aXN0aWMgTGljZW5jZSAoVUspIEx0ZAorMDAwNkE3IFByaW1hcmlvbgorMDAwNkE4IEtDIFRlY2hub2xvZ3ksIEluYy4KKzAwMDZBOSBVbml2ZXJzYWwgSW5zdHJ1bWVudHMgQ29ycC4KKzAwMDZBQSBNaWx0b3BlIENvcnBvcmF0aW9uCiswMDA2QUIgVy1MaW5rIFN5c3RlbXMsIEluYy4KKzAwMDZBQyBJbnRlcnNvZnQgQ28uCiswMDA2QUQgS0IgRWxlY3Ryb25pY3MgTHRkLgorMDAwNkFFIEhpbWFjaGFsIEZ1dHVyaXN0aWMgQ29tbXVuaWNhdGlvbnMgTHRkCiswMDA2QjAgQ29tdGVjaCBFRiBEYXRhIENvcnAuCiswMDA2QjEgU29uaWN3YWxsCiswMDA2QjIgTGlueHRlayBDby4KKzAwMDZCMyBEaWFncmFwaCBDb3Jwb3JhdGlvbgorMDAwNkI0IFZvcm5lIEluZHVzdHJpZXMsIEluYy4KKzAwMDZCNSBMdW1pbmVudCwgSW5jLgorMDAwNkI2IE5pci1PciBJc3JhZWwgTHRkLgorMDAwNkI3IFRFTEVNIEdtYkgKKzAwMDZCOCBCYW5kc3BlZWQgUHR5IEx0ZAorMDAwNkI5IEE1VEVLIENvcnAuCiswMDA2QkEgV2VzdHdhdmUgQ29tbXVuaWNhdGlvbnMKKzAwMDZCQiBBVEkgVGVjaG5vbG9naWVzIEluYy4KKzAwMDZCQyBNYWNyb2xpbmssIEluYy4KKzAwMDZCRCBCTlRFQ0hOT0xPR1kgQ28uLCBMdGQuCiswMDA2QkUgQmF1bWVyIE9wdHJvbmljIEdtYkgKKzAwMDZCRiBBY2NlbGxhIFRlY2hub2xvZ2llcyBDby4sIEx0ZC4KKzAwMDZDMCBVbml0ZWQgSW50ZXJuZXR3b3JrcywgSW5jLgorMDAwNkMxIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwMDZDMiBTbWFydG1hdGljIENvcnBvcmF0aW9uCiswMDA2QzMgU2NoaW5kbGVyIEVsZXZhdG9ycyBMdGQuCiswMDA2QzQgUGlvbGluayBJbmMuCiswMDA2QzUgSU5OT1ZJIFRlY2hub2xvZ2llcyBMaW1pdGVkCiswMDA2QzYgbGVzc3dpcmUgQUcKKzAwMDZDNyBSRk5FVCBUZWNobm9sb2dpZXMgUHRlIEx0ZCAoUykKKzAwMDZDOCBTdW1pdG9tbyBNZXRhbCBNaWNybyBEZXZpY2VzLCBJbmMuCiswMDA2QzkgVGVjaG5pY2FsIE1hcmtldGluZyBSZXNlYXJjaCwgSW5jLgorMDAwNkNBIEFtZXJpY2FuIENvbXB1dGVyICYgRGlnaXRhbCBDb21wb25lbnRzLCBJbmMuIChBQ0RDKQorMDAwNkNCIEpvdHJvbiBFbGVjdHJvbmljcyBBL1MKKzAwMDZDQyBKTUkgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCiswMDA2Q0QgQ3Jlb1NjaXRleCBDb3Jwb3JhdGlvbiBMdGQuCiswMDA2Q0UgREFURU5PCiswMDA2Q0YgVGhhbGVzIEF2aW9uaWNzIEluLUZsaWdodCBTeXN0ZW1zLCBMTEMKKzAwMDZEMCBFbGdhciBFbGVjdHJvbmljcyBDb3JwLgorMDAwNkQxIFRhaG9lIE5ldHdvcmtzLCBJbmMuCiswMDA2RDIgVHVuZHJhIFNlbWljb25kdWN0b3IgQ29ycC4KKzAwMDZEMyBBbHBoYSBUZWxlY29tLCBJbmMuIFUuUy5BLgorMDAwNkQ0IEludGVyYWN0aXZlIE9iamVjdHMsIEluYy4KKzAwMDZENSBEaWFtb25kIFN5c3RlbXMgQ29ycC4KKzAwMDZENiBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA2RDcgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAwNkQ4IE1hcGxlIE9wdGljYWwgU3lzdGVtcworMDAwNkQ5IElQTS1OZXQgUy5wLkEuCiswMDA2REEgSVRSQU4gQ29tbXVuaWNhdGlvbnMgTHRkLgorMDAwNkRCIElDSElQUyBDby4sIEx0ZC4KKzAwMDZEQyBTeWFiYXMgVGVjaG5vbG9neSAoQW1xdWVzdCkKKzAwMDZERCBBVCAmIFQgTGFib3JhdG9yaWVzIC0gQ2FtYnJpZGdlIEx0ZAorMDAwNkRFIEZsYXNoIFRlY2hub2xvZ3kKKzAwMDZERiBBSURPTklDIENvcnBvcmF0aW9uCiswMDA2RTAgTUFUIENvLiwgTHRkLgorMDAwNkUxIFRlY2hubyBUcmFkZSBzLmEKKzAwMDZFMiBDZWVtYXggVGVjaG5vbG9neSBDby4sIEx0ZC4KKzAwMDZFMyBRdWFudGl0YXRpdmUgSW1hZ2luZyBDb3Jwb3JhdGlvbgorMDAwNkU0IENpdGVsIFRlY2hub2xvZ2llcyBMdGQuCiswMDA2RTUgRnVqaWFuIE5ld2xhbmQgQ29tcHV0ZXIgTHRkLiBDby4KKzAwMDZFNiBEb25nWWFuZyBUZWxlY29tIENvLiwgTHRkLgorMDAwNkU3IEJpdCBCbGl0eiBDb21tdW5pY2F0aW9ucyBJbmMuCiswMDA2RTggT3B0aWNhbCBOZXR3b3JrIFRlc3RpbmcsIEluYy4KKzAwMDZFOSBJbnRpbWUgQ29ycC4KKzAwMDZFQSBFTFpFVDgwIE1pa3JvY29tcHV0ZXIgR21iSCZDby4gS0cKKzAwMDZFQiBHbG9iYWwgRGF0YQorMDAwNkVDIE0vQSBDT00gUHJpdmF0ZSBSYWRpbyBTeXN0ZW0gSW5jLgorMDAwNkVEIEluYXJhIE5ldHdvcmtzCiswMDA2RUUgU2hlbnlhbmcgTmV1LWVyYSBJbmZvcm1hdGlvbiAmIFRlY2hub2xvZ3kgU3RvY2sgQ28uLCBMdGQKKzAwMDZFRiBNYXh4YW4gU3lzdGVtcywgSW5jLgorMDAwNkYwIERpZ2VvLCBJbmMuCiswMDA2RjEgT3B0aWxsaW9uCiswMDA2RjIgUGxhdHlzIENvbW11bmljYXRpb25zCiswMDA2RjMgQWNjZUxpZ2h0IE5ldHdvcmtzCiswMDA2RjQgUHJpbWUgRWxlY3Ryb25pY3MgJiBTYXRlbGxpdGljcyBJbmMuCiswMDA2RjkgTWl0c3VpIFpvc2VuIFN5c3RlbXMgUmVzZWFyY2ggSW5jLgorMDAwNkZBIElQIFNRVUFSRSBDbywgTHRkLgorMDAwNkZCIEhpdGFjaGkgUHJpbnRpbmcgU29sdXRpb25zLCBMdGQuCiswMDA2RkMgRm5ldCBDby4sIEx0ZC4KKzAwMDZGRCBDb21qZXQgSW5mb3JtYXRpb24gU3lzdGVtcyBDb3JwLgorMDAwNkZFIENlbGlvbiBOZXR3b3JrcywgSW5jLgorMDAwNkZGIFNoZWJhIFN5c3RlbXMgQ28uLCBMdGQuCiswMDA3MDAgWmV0dGFtZWRpYSBLb3JlYQorMDAwNzAxIFJBQ0FMLURBVEFDT00KKzAwMDcwMiBWYXJpYW4gTWVkaWNhbCBTeXN0ZW1zCiswMDA3MDMgQ1NFRSBUcmFuc3BvcnQKKzAwMDcwNSBFbmRyZXNzICYgSGF1c2VyIEdtYkggJiBDbworMDAwNzA2IFNhbnJpdHogQ29ycG9yYXRpb24KKzAwMDcwNyBJbnRlcmFsaWEgSW5jLgorMDAwNzA4IEJpdHJhZ2UgSW5jLgorMDAwNzA5IFdlc3RlcnN0cmFuZCBVcmZhYnJpayBBQgorMDAwNzBBIFVuaWNvbSBBdXRvbWF0aW9uIENvLiwgTHRkLgorMDAwNzBCIE9jdGFsLCBTQQorMDAwNzBDIFNWQS1JbnRydXNpb24uY29tIENvLiBMdGQuCiswMDA3MEQgQ2lzY28gU3lzdGVtcyBJbmMuCiswMDA3MEUgQ2lzY28gU3lzdGVtcyBJbmMuCiswMDA3MEYgRnVqYW50LCBJbmMuCiswMDA3MTAgQWRheCwgSW5jLgorMDAwNzExIEFjdGVybmEKKzAwMDcxMiBKQUwgSW5mb3JtYXRpb24gVGVjaG5vbG9neQorMDAwNzEzIElQIE9uZSwgSW5jLgorMDAwNzE0IEJyaWdodGNvbQorMDAwNzE1IEdlbmVyYWwgUmVzZWFyY2ggb2YgRWxlY3Ryb25pY3MsIEluYy4KKzAwMDcxNiBKICYgUyBNYXJpbmUgTHRkLgorMDAwNzE3IFdpZWxhbmQgRWxlY3RyaWMgR21iSAorMDAwNzE4IGlDYW5UZWsgQ28uLCBMdGQuCiswMDA3MTkgTW9iaWlzIENvLiwgTHRkLgorMDAwNzFBIEZpbmVkaWdpdGFsIEluYy4KKzAwMDcxQiBQb3NpdGlvbiBUZWNobm9sb2d5IEluYy4KKzAwMDcxQyBBVCZUIEZpeGVkIFdpcmVsZXNzIFNlcnZpY2VzCiswMDA3MUQgU2F0ZWxzYSBTaXN0ZW1hcyBZIEFwbGljYWNpb25lcyBEZSBUZWxlY29tdW5pY2FjaW9uZXMsIFMuQS4KKzAwMDcxRSBUcmktTSBFbmdpbmVlcmluZyAvIE51cGFrIERldi4gQ29ycC4KKzAwMDcxRiBFdXJvcGVhbiBTeXN0ZW1zIEludGVncmF0aW9uCiswMDA3MjAgVHJ1dHpzY2hsZXIgR21iSCAmIENvLiBLRworMDAwNzIxIEZvcm1hYyBFbGVrdHJvbmlrIEdtYkgKKzAwMDcyMiBOaWVsc2VuIE1lZGlhIFJlc2VhcmNoCiswMDA3MjMgRUxDT04gU3lzdGVtdGVjaG5payBHbWJICiswMDA3MjQgVGVsZW1heCBDby4sIEx0ZC4KKzAwMDcyNSBCZW1hdGVjaCBJbnRlcm5hdGlvbmFsIENvcnAuCiswMDA3MjcgWmkgQ29ycG9yYXRpb24gKEhLKSBMdGQuCiswMDA3MjggTmVvIFRlbGVjb20KKzAwMDcyOSBLaXN0bGVyIEluc3RydW1lbnRlIEFHCiswMDA3MkEgSW5ub3ZhbmNlIE5ldHdvcmtzCiswMDA3MkIgSnVuZyBNeXVuZyBUZWxlY29tIENvLiwgTHRkLgorMDAwNzJDIEZhYnJpY29tCiswMDA3MkQgQ05TeXN0ZW1zCiswMDA3MkUgTm9ydGggTm9kZSBBQgorMDAwNzJGIEluc3RyYW5zYSwgSW5jLgorMDAwNzMwIEh1dGNoaXNvbiBPUFRFTCBUZWxlY29tIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDA3MzEgU3Bpcmljb24sIEluYy4KKzAwMDczMiBBQUVPTiBUZWNobm9sb2d5IEluYy4KKzAwMDczMyBEQU5DT05UUk9MIEVuZ2luZWVyaW5nCiswMDA3MzQgT05TdG9yLCBJbmMuCiswMDA3MzUgRmxhcmlvbiBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDczNiBEYXRhIFZpZGVvIFRlY2hub2xvZ2llcyBDby4sIEx0ZC4KKzAwMDczNyBTb3JpeWEgQ28uIEx0ZC4KKzAwMDczOCBZb3VuZyBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwNzM5IE1vdGlvbiBNZWRpYSBUZWNobm9sb2d5IEx0ZC4KKzAwMDczQSBJbnZlbnRlbCBTeXN0ZW1lcworMDAwNzNCIFRlbm92aXMgR21iSCAmIENvIEtHCiswMDA3M0MgVGVsZWNvbSBEZXNpZ24KKzAwMDczRCBOYW5qaW5nIFBvc3RlbCBUZWxlY29tbXVuaWNhdGlvbnMgQ28uLCBMdGQuCiswMDA3M0UgQ2hpbmEgR3JlYXQtV2FsbCBDb21wdXRlciBTaGVuemhlbiBDby4sIEx0ZC4KKzAwMDczRiBXb29qeXVuIFN5c3RlYyBDby4sIEx0ZC4KKzAwMDc0MCBNZWxjbyBJbmMuCiswMDA3NDEgU2llcnJhIEF1dG9tYXRlZCBTeXN0ZW1zCiswMDA3NDIgQ3VycmVudCBUZWNobm9sb2dpZXMKKzAwMDc0MyBDaGVsc2lvIENvbW11bmljYXRpb25zCiswMDA3NDQgVW5pY28sIEluYy4KKzAwMDc0NSBSYWRsYW4gQ29tcHV0ZXIgQ29tbXVuaWNhdGlvbnMgTHRkLgorMDAwNzQ2IEludGVybGluayBCVCwgTExDCiswMDA3NDcgTWVjYWxjCiswMDA3NDggVGhlIEltYWdpbmcgU291cmNlIEV1cm9wZQorMDAwNzQ5IENFTmlYIEluYy4KKzAwMDc0QSBDYXJsIFZhbGVudGluIEdtYkgKKzAwMDc0QiBEYWloZW4gQ29ycG9yYXRpb24KKzAwMDc0QyBCZWljb20gSW5jLgorMDAwNzREIFplYnJhIFRlY2hub2xvZ2llcyBDb3JwLgorMDAwNzRFIE5hdWdodHkgYm95IGNvLiwgTHRkLgorMDAwNzRGIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMDc1MCBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA3NTEgbS51LnQuIC0gR21iSAorMDAwNzUyIFJoeXRobSBXYXRjaCBDby4sIEx0ZC4KKzAwMDc1MyBCZWlqaW5nIFF4Y29tbSBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwNzU0IFh5dGVycmEgQ29tcHV0aW5nLCBJbmMuCiswMDA3NTUgTGFmb24gU0EKKzAwMDc1NiBKdXlvdW5nIFRlbGVjb20KKzAwMDc1NyBUb3BjYWxsIEludGVybmF0aW9uYWwgQUcKKzAwMDc1OCBEcmFnb253YXZlCiswMDA3NTkgQm9yaXMgTWFudWZhY3R1cmluZyBDb3JwLgorMDAwNzVBIEFpciBQcm9kdWN0cyBhbmQgQ2hlbWljYWxzLCBJbmMuCiswMDA3NUIgR2lic29uIEd1aXRhcnMKKzAwMDc1QyBFTkNBRCwgSW5jLgorMDAwNzVEIENlbGxlcml0YXMgSW5jLgorMDAwNzVFIFB1bHNhciBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDc1RiBWQ1MgVmlkZW8gQ29tbXVuaWNhdGlvbiBTeXN0ZW1zIEFHCiswMDA3NjAgVE9NSVMgSW5mb3JtYXRpb24gJiBUZWxlY29tIENvcnAuCiswMDA3NjEgTG9naXRlY2ggU0EKKzAwMDc2MiBHcm91cCBTZW5zZSBMaW1pdGVkCiswMDA3NjMgU3Vubml3ZWxsIEN5YmVyIFRlY2guIENvLiwgTHRkLgorMDAwNzY0IFlvdW5nV29vIFRlbGVjb20gQ28uIEx0ZC4KKzAwMDc2NSBKYWRlIFF1YW50dW0gVGVjaG5vbG9naWVzLCBJbmMuCiswMDA3NjYgQ2hvdSBDaGluIEluZHVzdHJpYWwgQ28uLCBMdGQuCiswMDA3NjcgWXV4aW5nIEVsZWN0cm9uaWNzIENvbXBhbnkgTGltaXRlZAorMDAwNzY4IERhbmZvc3MgQS9TCiswMDA3NjkgSXRhbGlhbmEgTWFjY2hpIFNwQQorMDAwNzZBIE5FWFRFWUUgQ28uLCBMdGQuCiswMDA3NkIgU3RyYWxmb3JzIEFCCiswMDA3NkMgRGFlaGFuZXQsIEluYy4KKzAwMDc2RCBGbGV4bGlnaHQgTmV0d29ya3MKKzAwMDc2RSBTaW5ldGljYSBDb3Jwb3JhdGlvbiBMdGQuCiswMDA3NkYgU3lub3B0aWNzIExpbWl0ZWQKKzAwMDc3MCBMb2N1c25ldHdvcmtzIENvcnBvcmF0aW9uCiswMDA3NzEgRW1iZWRkZWQgU3lzdGVtIENvcnBvcmF0aW9uCiswMDA3NzIgQWxjYXRlbCBTaGFuZ2hhaSBCZWxsIENvLiwgTHRkLgorMDAwNzczIEFzY29tIFBvd2VybGluZSBDb21tdW5pY2F0aW9ucyBMdGQuCiswMDA3NzQgR3VhbmdaaG91IFRoaW5rZXIgVGVjaG5vbG9neSBDby4gTHRkLgorMDAwNzc1IFZhbGVuY2UgU2VtaWNvbmR1Y3RvciwgSW5jLgorMDAwNzc2IEZlZGVyYWwgQVBECiswMDA3NzcgTW90YWggTHRkLgorMDAwNzc4IEdFUlNURUwgR21iSCAmIENvLiBLRworMDAwNzc5IFN1bmdpbCBUZWxlY29tIENvLiwgTHRkLgorMDAwNzdBIEluZm93YXJlIFN5c3RlbSBDby4sIEx0ZC4KKzAwMDc3QiBNaWxsaW1ldHJpeCBCcm9hZGJhbmQgTmV0d29ya3MKKzAwMDc3QyBPblRpbWUgTmV0d29ya3MKKzAwMDc3RSBFbHJlc3QgR21iSAorMDAwNzdGIEogQ29tbXVuaWNhdGlvbnMgQ28uLCBMdGQuCiswMDA3ODAgQmx1ZWdpZ2EgVGVjaG5vbG9naWVzIE9ZCiswMDA3ODEgSXRyb24gSW5jLgorMDAwNzgyIE5hdXRpY3VzIE5ldHdvcmtzLCBJbmMuCiswMDA3ODMgU3luQ29tIE5ldHdvcmssIEluYy4KKzAwMDc4NCBDaXNjbyBTeXN0ZW1zIEluYy4KKzAwMDc4NSBDaXNjbyBTeXN0ZW1zIEluYy4KKzAwMDc4NiBXaXJlbGVzcyBOZXR3b3JrcyBJbmMuCiswMDA3ODcgSWRlYSBTeXN0ZW0gQ28uLCBMdGQuCiswMDA3ODggQ2xpcGNvbW0sIEluYy4KKzAwMDc4OSBFYXN0ZWwgU3lzdGVtcyBDb3Jwb3JhdGlvbgorMDAwNzhBIE1lbnRvciBEYXRhIFN5c3RlbSBJbmMuCiswMDA3OEIgV2VnZW5lciBDb21tdW5pY2F0aW9ucywgSW5jLgorMDAwNzhDIEVsZWt0cm9uaWtzcGVjaWFsaXN0ZW4gaSBCb3JsYW5nZSBBQgorMDAwNzhEIE5ldEVuZ2luZXMgTHRkLgorMDAwNzhFIEdhcnogJiBGcmljaGUgR21iSAorMDAwNzhGIEVta2F5IElubm92YXRpdmUgUHJvZHVjdHMKKzAwMDc5MCBUcmktTSBUZWNobm9sb2dpZXMgKHMpIExpbWl0ZWQKKzAwMDc5MSBJbnRlcm5hdGlvbmFsIERhdGEgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDc5MiBTdWV0cm9uIEVsZWN0cm9uaWMgR21iSAorMDAwNzk0IFNpbXBsZSBEZXZpY2VzLCBJbmMuCiswMDA3OTUgRWxpdGVncm91cCBDb21wdXRlciBTeXN0ZW0gQ28uIChFQ1MpCiswMDA3OTYgTFNJIFN5c3RlbXMsIEluYy4KKzAwMDc5NyBOZXRwb3dlciBDby4sIEx0ZC4KKzAwMDc5OCBTZWxlYSBTUkwKKzAwMDc5OSBUaXBwaW5nIFBvaW50IFRlY2hub2xvZ2llcywgSW5jLgorMDAwNzlBIFNtYXJ0U2lnaHQgTmV0d29ya3MgSW5jLgorMDAwNzlCIEF1cm9yYSBOZXR3b3JrcworMDAwNzlDIEdvbGRlbiBFbGVjdHJvbmljcyBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwNzlEIE11c2FzaGkgQ28uLCBMdGQuCiswMDA3OUUgSWxpbnggQ28uLCBMdGQuCiswMDA3OUYgQWN0aW9uIERpZ2l0YWwgSW5jLgorMDAwN0EwIGUtV2F0Y2ggSW5jLgorMDAwN0ExIFZJQVNZUyBIZWFsdGhjYXJlIEdtYkgKKzAwMDdBMiBPcHRlb24gQ29ycG9yYXRpb24KKzAwMDdBMyBPc2l0aXMgU29mdHdhcmUsIEluYy4KKzAwMDdBNCBHTiBOZXRjb20gTHRkLgorMDAwN0E1IFkuRC5LIENvLiBMdGQuCiswMDA3QTYgSG9tZSBBdXRvbWF0aW9uLCBJbmMuCiswMDA3QTcgQS1aIEluYy4KKzAwMDdBOCBIYWllciBHcm91cCBUZWNobm9sb2dpZXMgTHRkLgorMDAwN0E5IE5vdmFzb25pY3MKKzAwMDdBQSBRdWFudHVtIERhdGEgSW5jLgorMDAwN0FDIEVvbHJpbmcKKzAwMDdBRCBQZW50YWNvbiBHbWJIIEZvdG8tdW5kIEZlaW53ZXJrdGVjaG5paworMDAwN0FFIExheWVyIE4gTmV0d29ya3MKKzAwMDdBRiBOLVRyb24gQ29ycC4KKzAwMDdCMCBPZmZpY2UgRGV0YWlscywgSW5jLgorMDAwN0IxIEVxdWF0b3IgVGVjaG5vbG9naWVzCiswMDA3QjIgVHJhbnNhY2Nlc3MgUy5BLgorMDAwN0IzIENpc2NvIFN5c3RlbXMgSW5jLgorMDAwN0I0IENpc2NvIFN5c3RlbXMgSW5jLgorMDAwN0I1IEFueSBPbmUgV2lyZWxlc3MgTHRkLgorMDAwN0I2IFRlbGVjb20gVGVjaG5vbG9neSBMdGQuCiswMDA3QjcgU2FtdXJhaSBJbmQuIFByb2RzIEVsZXRyb25pY29zIEx0ZGEKKzAwMDdCOCBBbWVyaWNhbiBQcmVkYXRvciBDb3JwLgorMDAwN0I5IEdpbmdhbmV0IENvcnBvcmF0aW9uCiswMDA3QkEgWGViZW8gQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDdCQiBDYW5kZXJhIEluYy4KKzAwMDdCQyBJZGVudGl4IEluYy4KKzAwMDdCRCBSYWRpb25ldCBMdGQuCiswMDA3QkUgRGF0YUxvZ2ljIFNwQQorMDAwN0JGIEFybWlsbGFpcmUgVGVjaG5vbG9naWVzLCBJbmMuCiswMDA3QzAgTmV0WmVydmVyIEluYy4KKzAwMDdDMSBPdmVydHVyZSBOZXR3b3JrcywgSW5jLgorMDAwN0MyIE5ldHN5cyBUZWxlY29tCiswMDA3QzMgQ2lycGFjaworMDAwN0M0IEpFQU4gQ28uIEx0ZC4KKzAwMDdDNSBHY29tLCBJbmMuCiswMDA3QzYgVkRTIFZvc3NrdWhsZXIgR21iSAorMDAwN0M3IFN5bmVjdGljcyBTeXN0ZW1zIExpbWl0ZWQKKzAwMDdDOCBCcmFpbjIxLCBJbmMuCiswMDA3QzkgVGVjaG5vbCBTZXZlbiBDby4sIEx0ZC4KKzAwMDdDQSBDcmVhdGl4IFBvbHltZWRpYSBHZXMgRnVyIEtvbW11bmlrYWl0b25zc3lzdGVtZQorMDAwN0NCIEZyZWVib3ggU0EKKzAwMDdDQyBLYWJhIEJlbnppbmcgR21iSAorMDAwN0NEIE5NVEVMIENvLiwgTHRkLgorMDAwN0NFIENhYmxldGltZSBMaW1pdGVkCiswMDA3Q0YgQW5vdG8gQUIKKzAwMDdEMCBBdXRvbWF0IEVuZ2VuaGFyaWEgZGUgQXV0b21hb2EgTHRkYS4KKzAwMDdEMSBTcGVjdHJ1bSBTaWduYWwgUHJvY2Vzc2luZyBJbmMuCiswMDA3RDIgTG9nb3BhayBTeXN0ZW1lCiswMDA3RDMgU3RvcmsgRGlnaXRhbCBJbWFnaW5nIEIuVi4KKzAwMDdENCBaaGVqaWFuZyBZdXRvbmcgTmV0d29yayBDb21tdW5pY2F0aW9uIENvIEx0ZC4KKzAwMDdENSAzZSBUZWNobm9sb2dpZXMgSW50Oy4sIEluYy4KKzAwMDdENiBDb21taWwgTHRkLgorMDAwN0Q3IENhcG9yaXMgTmV0d29ya3MgQUcKKzAwMDdEOCBIaXRyb24gU3lzdGVtcyBJbmMuCiswMDA3RDkgU3BsaWNlY29tCiswMDA3REEgTmV1cm8gVGVsZWNvbSBDby4sIEx0ZC4KKzAwMDdEQiBLaXJhbmEgTmV0d29ya3MsIEluYy4KKzAwMDdEQyBBdGVrIENvLCBMdGQuCiswMDA3REQgQ3JhZGxlIFRlY2hub2xvZ2llcworMDAwN0RFIGVDb3BpbHQgQUIKKzAwMDdERiBWYnJpY2sgU3lzdGVtcyBJbmMuCiswMDA3RTAgUGFsbSBJbmMuCiswMDA3RTEgV0lTIENvbW11bmljYXRpb25zIENvLiBMdGQuCiswMDA3RTIgQml0d29ya3MsIEluYy4KKzAwMDdFMyBOYXZjb20gVGVjaG5vbG9neSwgSW5jLgorMDAwN0U0IFNvZnRSYWRpbyBDby4sIEx0ZC4KKzAwMDdFNSBDb3VwIENvcnBvcmF0aW9uCiswMDA3RTYgZWRnZWZsb3cgQ2FuYWRhIEluYy4KKzAwMDdFNyBGcmVlV2F2ZSBUZWNobm9sb2dpZXMKKzAwMDdFOCBTdC4gQmVybmFyZCBTb2Z0d2FyZQorMDAwN0U5IEludGVsIENvcnBvcmF0aW9uCiswMDA3RUEgTWFzc2FuYSwgSW5jLgorMDAwN0VCIENpc2NvIFN5c3RlbXMgSW5jLgorMDAwN0VDIENpc2NvIFN5c3RlbXMgSW5jLgorMDAwN0VEIEFsdGVyYSBDb3Jwb3JhdGlvbgorMDAwN0VFIHRlbGNvIEluZm9ybWF0aW9uc3N5c3RlbWUgR21iSAorMDAwN0VGIExvY2toZWVkIE1hcnRpbiBUYWN0aWNhbCBTeXN0ZW1zCiswMDA3RjAgTG9naVN5bmMgQ29ycG9yYXRpb24KKzAwMDdGMSBUZXJhQnVyc3QgTmV0d29ya3MgSW5jLgorMDAwN0YyIElPQSBDb3Jwb3JhdGlvbgorMDAwN0YzIFRoaW5rIEVuZ2luZSBOZXR3b3JrcworMDAwN0Y0IEVsZXRleCBDby4sIEx0ZC4KKzAwMDdGNSBCcmlkZ2VjbyBDbyBBRworMDAwN0Y2IFFxZXN0IFNvZnR3YXJlIFN5c3RlbXMKKzAwMDdGNyBHYWx0cm9uaWNzCiswMDA3RjggSVREZXZpY2VzLCBJbmMuCiswMDA3RjkgUGhvbmV0aWNzLCBJbmMuCiswMDA3RkEgSVRUIENvLiwgTHRkLgorMDAwN0ZCIEdpZ2EgU3RyZWFtIFVNVFMgVGVjaG5vbG9naWVzIEdtYkgKKzAwMDdGQyBBZGVwdCBTeXN0ZW1zIEluYy4KKzAwMDdGRCBMQU5lcmd5IEx0ZC4KKzAwMDdGRSBSaWdha3UgQ29ycG9yYXRpb24KKzAwMDdGRiBHbHVvbiBOZXR3b3JrcworMDAwODAwIE1VTFRJVEVDSCBTWVNURU1TLCBJTkMuCiswMDA4MDEgSGlnaFNwZWVkIFN1cmZpbmcgSW5jLgorMDAwODAyIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbgorMDAwODAzIENvcyBUcm9uCiswMDA4MDQgSUNBIEluYy4KKzAwMDgwNSBUZWNobm8tSG9sb24gQ29ycG9yYXRpb24KKzAwMDgwNiBSYW9uZXQgU3lzdGVtcywgSW5jLgorMDAwODA3IEFjY2VzcyBEZXZpY2VzIExpbWl0ZWQKKzAwMDgwOCBQUFQgVmlzaW9uLCBJbmMuCiswMDA4MDkgU3lzdGVtb25pYyBBRworMDAwODBBIEVzcGVyYS1XZXJrZSBHbWJICiswMDA4MEIgQmlya2EgQlBBIEluZm9ybWF0aW9uc3N5c3RlbSBBQgorMDAwODBDIFZEQSBlbGV0dHJvbmljYSBTckwKKzAwMDgwRCBUb3NoaWJhCiswMDA4MEUgTW90b3JvbGEsIEJDUworMDAwODBGIFByb3hpbWlvbiBGaWJlciBPcHRpY3MgQUIKKzAwMDgxMCBLZXkgVGVjaG5vbG9neSwgSW5jLgorMDAwODExIFZPSVggQ29ycG9yYXRpb24KKzAwMDgxMiBHTS0yIENvcnBvcmF0aW9uCiswMDA4MTMgRGlza2JhbmssIEluYy4KKzAwMDgxNCBUSUwgVGVjaG5vbG9naWVzCiswMDA4MTUgQ0FUUyBDby4sIEx0ZC4KKzAwMDgxNiBCbHVldGFncyBBL1MKKzAwMDgxNyBFbWVyZ2VDb3JlIE5ldHdvcmtzIExMQworMDAwODE4IFBpeGVsd29ya3MsIEluYy4KKzAwMDgxOSBCYW5rc3lzCiswMDA4MUEgU2FucmFkIEludGVsbGlnZW5jZSBTdG9yYWdlIENvbW11bmljYXRpb25zICgyMDAwKSBMdGQuCiswMDA4MUIgV2luZGlnbyBTeXN0ZW1zCiswMDA4MUMgQHBvcy5jb20KKzAwMDgxRCBJcHNpbCwgSW5jb3Jwb3JhdGVkCiswMDA4MUUgUmVwZWF0aXQgQUIKKzAwMDgxRiBQb3UgWXVlbiBUZWNoIENvcnAuIEx0ZC4KKzAwMDgyMCBDaXNjbyBTeXN0ZW1zIEluYy4KKzAwMDgyMSBDaXNjbyBTeXN0ZW1zIEluYy4KKzAwMDgyMiBJblBybyBDb21tCiswMDA4MjMgVGV4YSBDb3JwLgorMDAwODI0IFByb21hdGVrIEluZHVzdHJpZXMgTHRkLgorMDAwODI1IEFjbWUgUGFja2V0CiswMDA4MjYgQ29sb3JhZG8gTWVkIFRlY2gKKzAwMDgyNyBQaXJlbGxpIENhYmxlcyAmIFN5c3RlbXMKKzAwMDgyOCBLb2VpIEVuZ2luZWVyaW5nIEx0ZC4KKzAwMDgyOSBBdmFsIE5hZ2FzYWtpIENvcnBvcmF0aW9uCiswMDA4MkEgUG93ZXJ3YWxseiBOZXR3b3JrIFNlY3VyaXR5CiswMDA4MkIgV29va3N1bmcgRWxlY3Ryb25pY3MsIEluYy4KKzAwMDgyQyBIb21hZyBBRworMDAwODJEIEluZHVzIFRlcXNpdGUgUHJpdmF0ZSBMaW1pdGVkCiswMDA4MkUgTXVsdGl0b25lIEVsZWN0cm9uaWNzIFBMQworMDAwODRFIERpdmVyZ2VOZXQsIEluYy4KKzAwMDg0RiBRdWFsc3RhciBDb3Jwb3JhdGlvbgorMDAwODUwIEFyaXpvbmEgSW5zdHJ1bWVudCBDb3JwLgorMDAwODUxIENhbmFkaWFuIEJhbmsgTm90ZSBDb21wYW55LCBMdGQuCiswMDA4NTIgRGF2b2xpbmsgQ28uIEluYy4KKzAwMDg1MyBTY2hsZWljaGVyIEdtYkggJiBDby4gUmVsYWlzd2Vya2UgS0cKKzAwMDg1NCBOZXRyb25peCwgSW5jLgorMDAwODU1IE5BU0EtR29kZGFyZCBTcGFjZSBGbGlnaHQgQ2VudGVyCiswMDA4NTYgR2FtYXRyb25pYyBFbGVjdHJvbmljIEluZHVzdHJpZXMgTHRkLgorMDAwODU3IFBvbGFyaXMgTmV0d29ya3MsIEluYy4KKzAwMDg1OCBOb3ZhdGVjaG5vbG9neSBJbmMuCiswMDA4NTkgU2hlblpoZW4gVW5pdG9uZSBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKzAwMDg1QSBJbnRpR2F0ZSBJbmMuCiswMDA4NUIgSGFuYml0IEVsZWN0cm9uaWNzIENvLiwgTHRkLgorMDAwODVDIFNoYW5naGFpIERhcmUgVGVjaG5vbG9naWVzIENvLiBMdGQuCiswMDA4NUQgQWFzdHJhCiswMDA4NUUgUENPIEFHCiswMDA4NUYgUGljYW5vbCBOLlYuCiswMDA4NjAgTG9kZ2VOZXQgRW50ZXJ0YWlubWVudCBDb3JwLgorMDAwODYxIFNvZnRFbmVyZ3kgQ28uLCBMdGQuCiswMDA4NjIgTkVDIEVsdW1pbmFudCBUZWNobm9sb2dpZXMsIEluYy4KKzAwMDg2MyBFbnRyaXNwaGVyZSBJbmMuCiswMDA4NjQgRmFzeSBTLnAuQS4KKzAwMDg2NSBKQVNDT00gQ08uLCBMVEQKKzAwMDg2NiBEU1ggQWNjZXNzIFN5c3RlbXMsIEluYy4KKzAwMDg2NyBVcHRpbWUgRGV2aWNlcworMDAwODY4IFB1ck9wdGl4CiswMDA4NjkgQ29tbWFuZC1lIFRlY2hub2xvZ3kgQ28uLEx0ZC4KKzAwMDg2QSBJbmR1c3RyaWUgVGVjaG5payBJUFMgR21iSAorMDAwODZCIE1JUFNZUworMDAwODZDIFBsYXNtb24gTE1TCiswMDA4NkQgTWlzc291cmkgRnJlZU5ldAorMDAwODZFIEh5Z2xvIEFCCiswMDA4NkYgUmVzb3VyY2VzIENvbXB1dGVyIE5ldHdvcmsgTHRkLgorMDAwODcwIFJhc3ZpYSBTeXN0ZW1zLCBJbmMuCiswMDA4NzEgTk9SVEhEQVRBIENvLiwgTHRkLgorMDAwODcyIFNvcmVuc29uIFRlY2hub2xvZ2llcywgSW5jLgorMDAwODczIERBUCBEZXNpZ24gQi5WLgorMDAwODc0IERlbGwgQ29tcHV0ZXIgQ29ycC4KKzAwMDg3NSBBY29ycCBFbGVjdHJvbmljcyBDb3JwLgorMDAwODc2IFNEU3lzdGVtCiswMDA4NzcgTGllYmVydCBISVJPU1MgUy5wLkEuCiswMDA4NzggQmVuY2htYXJrIFN0b3JhZ2UgSW5ub3ZhdGlvbnMKKzAwMDg3OSBDRU0gQ29ycG9yYXRpb24KKzAwMDg3QSBXaXBvdGVjIEdtYkgKKzAwMDg3QiBSVFggVGVsZWNvbSBBL1MKKzAwMDg3QyBDaXNjbyBTeXN0ZW1zLCBJbmMuCiswMDA4N0QgQ2lzY28gU3lzdGVtcyBJbmMuCiswMDA4N0UgQm9uIEVsZWN0cm8tVGVsZWNvbSBJbmMuCiswMDA4N0YgU1BBVU4gZWxlY3Ryb25pYyBHbWJIICYgQ28uIEtHCiswMDA4ODAgQnJvYWRUZWwgQ2FuYWRhIENvbW11bmljYXRpb25zIGluYy4KKzAwMDg4MSBESUdJVEFMIEhBTkRTIENPLixMVEQuCiswMDA4ODIgU0lHTUEgQ09SUE9SQVRJT04KKzAwMDg4MyBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorMDAwODg0IEluZGV4IEJyYWlsbGUgQUIKKzAwMDg4NSBFTVMgRHIuIFRob21hcyBXdWVuc2NoZQorMDAwODg2IEhhbnN1bmcgVGVsaWFubiwgSW5jLgorMDAwODg3IE1hc2NoaW5lbmZhYnJpayBSZWluaGF1c2VuIEdtYkgKKzAwMDg4OCBPVUxMSU0gSW5mb3JtYXRpb24gVGVjaG5vbG9neSBJbmMsLgorMDAwODg5IEVjaG9zdGFyIFRlY2hub2xvZ2llcyBDb3JwCiswMDA4OEEgTWluZHNAV29yaworMDAwODhCIFRyb3BpYyBOZXR3b3JrcyBJbmMuCiswMDA4OEMgUXVhbnRhIE5ldHdvcmsgU3lzdGVtcyBJbmMuCiswMDA4OEQgU2lnbWEtTGlua3MgSW5jLgorMDAwODhFIE5paG9uIENvbXB1dGVyIENvLiwgTHRkLgorMDAwODhGIEFEVkFOQ0VEIERJR0lUQUwgVEVDSE5PTE9HWQorMDAwODkwIEFWSUxJTktTIFNBCiswMDA4OTEgTHlhbiBJbmMuCiswMDA4OTIgRU0gU29sdXRpb25zCiswMDA4OTQgSW5ub1ZJU0lPTiBNdWx0aW1lZGlhIEx0ZC4KKzAwMDg5NSBESVJDIFRlY2hub2xvZ2llIEdtYkggJiBDby5LRworMDAwODk2IFByaW50cm9uaXgsIEluYy4KKzAwMDg5NyBRdWFrZSBUZWNobm9sb2dpZXMKKzAwMDg5OCBHaWdhYml0IE9wdGljcyBDb3Jwb3JhdGlvbgorMDAwODk5IE5ldGJpbmQsIEluYy4KKzAwMDg5QSBBbGNhdGVsIE1pY3JvZWxlY3Ryb25pY3MKKzAwMDg5QiBJQ1AgRWxlY3Ryb25pY3MgSW5jLgorMDAwODlDIEVsZWNzIEluZHVzdHJ5IENvLiwgTHRkLgorMDAwODlEIFVIRC1FbGVrdHJvbmlrCiswMDA4OUUgQmVpamluZyBFbnRlci1OZXQgY28uTFRECiswMDA4OUYgRUZNIE5ldHdvcmtzCiswMDA4QTAgU3RvdHogRmVpbm1lc3N0ZWNobmlrIEdtYkgKKzAwMDhBMSBDTmV0IFRlY2hub2xvZ3kgSW5jLgorMDAwOEEyIEFESSBFbmdpbmVlcmluZywgSW5jLgorMDAwOEEzIENpc2NvIFN5c3RlbXMKKzAwMDhBNCBDaXNjbyBTeXN0ZW1zCiswMDA4QTUgUGVuaW5zdWxhIFN5c3RlbXMgSW5jLgorMDAwOEE2IE11bHRpd2FyZSAmIEltYWdlIENvLiwgTHRkLgorMDAwOEE3IGlMb2dpYyBJbmMuCiswMDA4QTggU3lzdGVjIENvLiwgTHRkLgorMDAwOEE5IFNhbmdTYW5nIFRlY2hub2xvZ3ksIEluYy4KKzAwMDhBQSBLQVJBTQorMDAwOEFCIEVuZXJMaW54LmNvbSwgSW5jLgorMDAwOEFEIFRveW8tTGlueCBDby4sIEx0ZC4KKzAwMDhBRSBQYWNrZXRmcm9udAorMDAwOEFGIE5vdmF0ZWMgQ29ycG9yYXRpb24KKzAwMDhCMCBCS3RlbCBjb21tdW5pY2F0aW9ucyBHbWJICiswMDA4QjEgUHJvUXVlbnQgU3lzdGVtcworMDAwOEIyIFNIRU5aSEVOIENPTVBBU1MgVEVDSE5PTE9HWSBERVZFTE9QTUVOVCBDTy4sTFRECiswMDA4QjMgRmFzdHdlbAorMDAwOEI0IFNZU1BPTAorMDAwOEI1IFRBSSBHVUVOIEVOVEVSUFJJU0UgQ08uLCBMVEQKKzAwMDhCNiBSb3V0ZUZyZWUsIEluYy4KKzAwMDhCNyBISVQgSW5jb3Jwb3JhdGVkCiswMDA4QjggRS5GLiBKb2huc29uCiswMDA4QjkgS0FPTiBNRURJQSBDby4sIEx0ZC4KKzAwMDhCQSBFcnNraW5lIFN5c3RlbXMgTHRkCiswMDA4QkIgTmV0RXhjZWxsCiswMDA4QkMgSWxldm8gQUIKKzAwMDhCRCBURVBHLVVTCiswMDA4QkUgWEVOUEFLIE1TQSBHcm91cAorMDAwOEJGIEFwdHVzIEVsZWt0cm9uaWsgQUIKKzAwMDhDMCBBU0EgU1lTVEVNUworMDAwOEMxIEF2aXN0YXIgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24KKzAwMDhDMiBDaXNjbyBTeXN0ZW1zCiswMDA4QzMgQ29udGV4IEEvUworMDAwOEM0IEhpa2FyaSBDby4sTHRkLgorMDAwOEM1IExpb250ZWNoIENvLiwgTHRkLgorMDAwOEM2IFBoaWxpcHMgQ29uc3VtZXIgQ29tbXVuaWNhdGlvbnMKKzAwMDhDNyBDT01QQVEgQ09NUFVURVIgQ09SUE9SQVRJT04KKzAwMDhDOCBTb25ldGljb20sIEluYy4KKzAwMDhDOSBUZWNobmlTYXQgRGlnaXRhbCBHbWJICiswMDA4Q0EgVHdpbkhhbiBUZWNobm9sb2d5IENvLixMdGQKKzAwMDhDQiBaZXRhIEJyb2FkYmFuZCBJbmMuCiswMDA4Q0MgUmVtb3RlYywgSW5jLgorMDAwOENEIFdpdGgtTmV0IEluYworMDAwOENGIE5pcHBvbiBLb2VpIFBvd2VyIFN5c3RlbXMgQ28uLCBMdGQuCiswMDA4RDAgTXVzYXNoaSBFbmdpbmVlcmluZyBDby4sIExURC4KKzAwMDhEMSBLQVJFTCBJTkMuCiswMDA4RDIgWk9PTSBOZXR3b3JrcyBJbmMuCiswMDA4RDMgSGVyY3VsZXMgVGVjaG5vbG9naWVzIFMuQS4KKzAwMDhENCBJbmVvUXVlc3QgVGVjaG5vbG9naWVzLCBJbmMKKzAwMDhENSBWYW5ndWFyZCBNYW5hZ2VkIFNvbHV0aW9ucworMDAwOEQ2IEhBU1NORVQgSW5jLgorMDAwOEQ3IEhPVyBDT1JQT1JBVElPTgorMDAwOEQ4IERvd2tleSBNaWNyb3dhdmUKKzAwMDhEOSBNaXRhZGVuc2hpIENvLixMVEQKKzAwMDhEQSBTb2ZhV2FyZSBUZWNobm9sb2dpZXMgTHRkLgorMDAwOERCIENvcnJpZ2VudCBTeXN0ZW1zCiswMDA4REMgV2l6bmV0CiswMDA4REQgVGVsZW5hIENvbW11bmljYXRpb25zLCBJbmMuCiswMDA4REUgM1VQIFN5c3RlbXMKKzAwMDhERiBBbGlzdGVsIEluYy4KKzAwMDhFMCBBVE8gVGVjaG5vbG9neSBMdGQuCiswMDA4RTEgQmFyaXggQUcKKzAwMDhFMiBDaXNjbyBTeXN0ZW1zCiswMDA4RTMgQ2lzY28gU3lzdGVtcworMDAwOEU0IEVudmVuZXJneSBJbmMKKzAwMDhFNSBJREsgQ29ycG9yYXRpb24KKzAwMDhFNiBMaXR0bGVmZWV0CiswMDA4RTcgU0hJIENvbnRyb2xTeXN0ZW1zLEx0ZC4KKzAwMDhFOCBFeGNlbCBNYXN0ZXIgTHRkLgorMDAwOEU5IE5leHRHaWcKKzAwMDhFQSBNb3Rpb24gQ29udHJvbCBFbmdpbmVlcmluZywgSW5jCiswMDA4RUIgUk9NV2luIENvLixMdGQuCiswMDA4RUMgWm9udSwgSW5jLgorMDAwOEVEIFNUJlQgSW5zdHJ1bWVudCBDb3JwLgorMDAwOEVFIExvZ2ljIFByb2R1Y3QgRGV2ZWxvcG1lbnQKKzAwMDhFRiBESUJBTCxTLkEuCiswMDA4RjAgTmV4dCBHZW5lcmF0aW9uIFN5c3RlbXMsIEluYy4KKzAwMDhGMSBWb2x0YWlyZQorMDAwOEYyIEMmUyBUZWNobm9sb2d5CiswMDA4RjMgV0FOWQorMDAwOEY0IEJsdWV0YWtlIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDA4RjUgWUVTVEVDSE5PTE9HWSBDby4sTHRkLgorMDAwOEY2IFNVTUlUT01PIEVMRUNUUklDIEhJR0hURUNIUy5jby4sbHRkLgorMDAwOEY3IEhpdGFjaGkgTHRkLCBTZW1pY29uZHVjdG9yICZhbXA7IEludGVncmF0ZWQgQ2lyY3VpdHMgR3IKKzAwMDhGOCBHdWFyZGFsbCBMdGQKKzAwMDhGOSBQYWRjb20sIEluYy4KKzAwMDhGQSBLYXJsIEUuQnJpbmttYW5uIEdtYkgKKzAwMDhGQiBTb25vU2l0ZSwgSW5jLgorMDAwOEZDIEdpZ2FwaG90b24gSW5jLgorMDAwOEZEIEJsdWVLb3JlYSBDby4sIEx0ZC4KKzAwMDhGRSBVTklLIEMmQyBDby4sTHRkLgorMDAwOEZGIFRyaWxvZ3kgQnJvYWRjYXN0IChIb2xkaW5ncykgTHRkCiswMDA5MDAgVE1UCiswMDA5MDEgU2hlbnpoZW4gU2hpeHVudG9uZyBJbmZvcm1hdGlvbiAmIFRlY2hub2xpZ3kgQ28KKzAwMDkwMiBSZWRsaW5lIENvbW11bmljYXRpb25zIEluYy4KKzAwMDkwMyBQYW5hc2FzLCBJbmMKKzAwMDkwNCBNT05ESUFMIGVsZWN0cm9uaWMKKzAwMDkwNSBpVEVDIFRlY2hub2xvZ2llcyBMdGQuCiswMDA5MDYgRXN0ZWVtIE5ldHdvcmtzCiswMDA5MDcgQ2hyeXNhbGlzIERldmVsb3BtZW50CiswMDA5MDggVlRlY2ggVGVjaG5vbG9neSBDb3JwLgorMDAwOTA5IFRlbGVub3IgQ29ubmVjdCBBL1MKKzAwMDkwQSBTbmVkRmFyIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDA5MEIgTVRMICBJbnN0cnVtZW50cyBQTEMKKzAwMDkwQyBNYXlla2F3YSBNZmcuIENvLiBMdGQuCiswMDA5MEQgTEVBREVSIEVMRUNUUk9OSUNTIENPUlAuCiswMDA5MEUgSGVsaXggVGVjaG5vbG9neSBJbmMuCiswMDA5MEYgRm9ydGluZXQgSW5jLgorMDAwOTEwIFNpbXBsZSBBY2Nlc3MgSW5jLgorMDAwOTExIENpc2NvIFN5c3RlbXMKKzAwMDkxMiBDaXNjbyBTeXN0ZW1zCiswMDA5MTQgQ09NUFVUUk9MUyBJTkMuCiswMDA5MTUgQ0FTIENvcnAuCiswMDA5MTYgTGlzdG1hbiBIb21lIFRlY2hub2xvZ2llcywgSW5jLgorMDAwOTE3IFdFTSBUZWNobm9sb2d5IEluYworMDAwOTE4IFNBTVNVTkcgVEVDSFdJTiBDTy4sTFRECiswMDA5MTkgTURTIEdhdGV3YXlzCiswMDA5MUEgTWFjYXQgT3B0aWNzICYgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCiswMDA5MUIgRGlnaXRhbCBHZW5lcmF0aW9uIEluYy4KKzAwMDkxQyBDYWNoZVZpc2lvbiwgSW5jCiswMDA5MUQgUHJvdGVhbSBDb21wdXRlciBDb3Jwb3JhdGlvbgorMDAwOTFFIEZpcnN0ZWNoIFRlY2hub2xvZ3kgQ29ycC4KKzAwMDkxRiBBJmFtcDtEIENvLiwgTHRkLgorMDAwOTIwIEVwb1ggQ09NUFVURVIgQ08uLExURC4KKzAwMDkyMSBQbGFubWVjYSBPeQorMDAwOTIyIFRvdWNobGVzcyBTZW5zb3IgVGVjaG5vbG9neSBBRworMDAwOTIzIEhlYW1hbiBTeXN0ZW0gQ28uLCBMdGQKKzAwMDkyNCBUZWxlYmF1IEdtYkgKKzAwMDkyNSBWU04gU3lzdGVtZW4gQlYKKzAwMDkyNiBZT0RBIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDA5MjcgVE9ZT0tFSUtJIENPLixMVEQuCiswMDA5MjggVGVsZWNvcmUgSW5jCiswMDA5MjkgU2FueW8gSW5kdXN0cmllcyAoVUspIExpbWl0ZWQKKzAwMDkyQSBNWVRFQ1MgQ28uLEx0ZC4KKzAwMDkyQiBpUXN0b3IgTmV0d29ya3MsIEluYy4KKzAwMDkyQyBIaXRwb2ludCBJbmMuCiswMDA5MkQgSGlnaCBUZWNoIENvbXB1dGVyLCBDb3JwLgorMDAwOTJFIEImVGVjaCBTeXN0ZW0gSW5jLgorMDAwOTJGIEFrb20gVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorMDAwOTMwIEFlcm9Db25jaWVyZ2UgSW5jLgorMDAwOTMxIEZ1dHVyZSBJbnRlcm5ldCwgSW5jLgorMDAwOTMyIE9tbmlsdXgKKzAwMDkzMyBPUFRPVkFMTEVZIENvLiBMdGQuCiswMDA5MzQgRHJlYW0tTXVsdGltZWRpYS1UdiBHbWJICiswMDA5MzUgU2FuZHZpbmUgSW5jb3Jwb3JhdGVkCiswMDA5MzYgSXBldHJvbmlrIEdtYkggJiBDby5LRworMDAwOTM3IEludmVudGVjIEFwcGxpYW5jZSBDb3JwCiswMDA5MzggQWxsb3QgQ29tbXVuaWNhdGlvbnMKKzAwMDkzOSBTaGliYVNva3UgQ28uLEx0ZC4KKzAwMDkzQSBNb2xleCBGaWJlciBPcHRpY3MKKzAwMDkzQiBIWVVOREFJIE5FVFdPUktTIElOQy4KKzAwMDkzQyBKYWNxdWVzIFRlY2hub2xvZ2llcyBQL0wKKzAwMDkzRCBOZXdpc3lzLEluYy4KKzAwMDkzRSBDJkkgVGVjaG5vbG9naWVzCiswMDA5M0YgRG91YmxlLVdpbiBFbnRlcnBpcnNlIENPLiwgTFRECiswMDA5NDAgQUdGRU8gR21iSCAmIENvLiBLRworMDAwOTQxIEFsbGllZCBUZWxlc2lzIEsuSy4KKzAwMDk0MiBDUkVTQ08sIExURC4KKzAwMDk0MyBDaXNjbyBTeXN0ZW1zCiswMDA5NDQgQ2lzY28gU3lzdGVtcworMDAwOTQ1IFBhbG1taWNybyBDb21tdW5pY2F0aW9ucyBJbmMKKzAwMDk0NiBDbHVzdGVyIExhYnMgR21iSAorMDAwOTQ3IEF6dGVrLCBJbmMuCiswMDA5NDggVmlzdGEgQ29udHJvbCBTeXN0ZW1zLCBDb3JwLgorMDAwOTQ5IEdseXBoIFRlY2hub2xvZ2llcyBJbmMuCiswMDA5NEEgSG9tZW5ldCBDb21tdW5pY2F0aW9ucworMDAwOTRCIEZpbGxGYWN0b3J5IE5WCiswMDA5NEMgQ29tbXVuaWNhdGlvbiBXZWF2ZXIgQ28uLEx0ZC4KKzAwMDk0RCBCcmFpbnRyZWUgQ29tbXVuaWNhdGlvbnMgUHR5IEx0ZAorMDAwOTRFIEJBUlRFQ0ggU1lTVEVNUyBJTlRFUk5BVElPTkFMLCBJTkMKKzAwMDk0RiBlbG1lZ3QgR21iSCAmIENvLiBLRworMDAwOTUwIEluZGVwZW5kZW50IFN0b3JhZ2UgQ29ycG9yYXRpb24KKzAwMDk1MSBBcG9nZWUgSW5zdHJ1bWVudHMsIEluYworMDAwOTUyIEF1ZXJzd2FsZCBHbWJIICYgQ28uIEtHCiswMDA5NTMgTGlua2FnZSBTeXN0ZW0gSW50ZWdyYXRpb24gQ28uTHRkLgorMDAwOTU0IEFNaVQgc3BvbC4gcy4gci4gby4KKzAwMDk1NSBZb3VuZyBHZW5lcmF0aW9uIEludGVybmF0aW9uYWwgQ29ycC4KKzAwMDk1NiBOZXR3b3JrIFN5c3RlbXMgR3JvdXAsIEx0ZC4gKE5TRykKKzAwMDk1NyBTdXBlcmNhbGxlciwgSW5jLgorMDAwOTU4IElOVEVMTkVUIFMuQS4KKzAwMDk1OSBTaXRlY3NvZnQKKzAwMDk1QSBSQUNFV09PRCBURUNITk9MT0dZCiswMDA5NUIgTmV0Z2VhciwgSW5jLgorMDAwOTVDIFBoaWxpcHMgTWVkaWNhbCBTeXN0ZW1zIC0gQ2FyZGlhYyBhbmQgTW9uaXRvcmluZyBTeXN0ZW1zIChDTQorMDAwOTVEIERpYWxvZ3VlIFRlY2hub2xvZ3kgQ29ycC4KKzAwMDk1RSBNYXNzdGVjaCBHcm91cCBJbmMuCiswMDA5NUYgVGVsZWJ5dGUsIEluYy4KKzAwMDk2MCBZT1pBTiBJbmMuCiswMDA5NjEgU3dpdGNoZ2VhciBhbmQgSW5zdHJ1bWVudGF0aW9uIEx0ZAorMDAwOTYyIEZpbGV0cmFjIEFTCiswMDA5NjMgRG9taW5pb24gTGFzZXJjb20gSW5jLgorMDAwOTY0IEhpLVRlY2huaXF1ZXMKKzAwMDk2NiBUaGFsZXMgTmF2aWdhdGlvbgorMDAwOTY3IFRhY2h5b24sIEluYworMDAwOTY4IFRFQ0hOT1ZFTlRVUkUsIElOQy4KKzAwMDk2OSBNZXJldCBPcHRpY2FsIENvbW11bmljYXRpb25zCiswMDA5NkEgQ2xvdmVybGVhZiBDb21tdW5pY2F0aW9ucyBJbmMuCiswMDA5NkIgSUJNIENvcnBvcmF0aW9uCiswMDA5NkMgSW1lZGlhIFNlbWljb25kdWN0b3IgQ29ycC4KKzAwMDk2RCBQb3dlcm5ldCBUZWNobm9sb2dpZXMgQ29ycC4KKzAwMDk2RSBHSUFOVCBFTEVDVFJPTklDUyBMVEQuCiswMDA5NkYgQmVpamluZyBaaG9uZ3FpbmcgRWxlZ2FudCBUZWNoLiBDb3JwLixMaW1pdGVkCiswMDA5NzAgVmlicmF0aW9uIFJlc2VhcmNoIENvcnBvcmF0aW9uCiswMDA5NzEgVGltZSBNYW5hZ2VtZW50LCBJbmMuCiswMDA5NzIgU2VjdXJlYmFzZSxJbmMKKzAwMDk3MyBMZW50ZW4gVGVjaG5vbG9neSBDby4sIEx0ZC4KKzAwMDk3NCBJbm5vcGlhIFRlY2hub2xvZ2llcywgSW5jLgorMDAwOTc1IGZTT05BIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uCiswMDA5NzYgRGF0YXNvZnQgSVNETiBTeXN0ZW1zIEdtYkgKKzAwMDk3NyBCcnVubmVyIEVsZWt0cm9uaWsgQUcKKzAwMDk3OCBBSUpJIFN5c3RlbSBDby4sIEx0ZC4KKzAwMDk3OSBBZHZhbmNlZCBUZWxldmlzaW9uIFN5c3RlbXMgQ29tbWl0dGVlLCBJbmMuCiswMDA5N0EgTG91aXMgRGVzaWduIExhYnMuCiswMDA5N0IgQ2lzY28gU3lzdGVtcworMDAwOTdDIENpc2NvIFN5c3RlbXMKKzAwMDk3RCBTZWNXZWxsIE5ldHdvcmtzIE95CiswMDA5N0UgSU1JIFRFQ0hOT0xPR1kgQ08uLCBMVEQKKzAwMDk3RiBWc2VjdXJlIDIwMDAgTFRELgorMDAwOTgwIFBvd2VyIFplbml0aCBJbmMuCiswMDA5ODEgTmV3cG9ydCBOZXR3b3JrcworMDAwOTgyIExvZXdlIE9wdGEgR21iSAorMDAwOTgzIEd2aXNpb24gSW5jb3Jwb3JhdGVkCiswMDA5ODQgTXlDYXNhIE5ldHdvcmsgSW5jLgorMDAwOTg1IEF1dG8gVGVsZWNvbSBDb21wYW55CiswMDA5ODYgTWV0YWxpbmsgTFRELgorMDAwOTg3IE5JU0hJIE5JUFBPTiBFTEVDVFJJQyBXSVJFICYgQ0FCTEUgQ08uLExURC4KKzAwMDk4OCBOdWRpYW4gRWxlY3Ryb24gQ28uLCBMdGQuCiswMDA5ODkgVml2aWRMb2dpYyBJbmMuCiswMDA5OEEgRXF1YWxMb2dpYyBJbmMKKzAwMDk4QiBFbnRyb3BpYyBDb21tdW5pY2F0aW9ucywgSW5jLgorMDAwOThDIFBvc3NpbyBBQgorMDAwOThEIERDVCBMdGQgKERpZ2l0YWwgQ29tbXVuaWNhdGlvbiBUZWNobm9sb2dpZXMgTHRkKQorMDAwOThFIGlwY2FzIEdtYkgKKzAwMDk4RiBDZXRhY2VhbiBOZXR3b3JrcworMDAwOTkwIEFDS1NZUyBDb21tdW5pY2F0aW9ucyAmIHN5c3RlbXMKKzAwMDk5MSBHRSBGYW51YyBBdXRvbWF0aW9uIE1hbnVmYWN0dXJpbmcsIEluYy4KKzAwMDk5MiBJbnRlckVwb2NoIFRlY2hub2xvZ3ksSU5DLgorMDAwOTkzIFZpc3Rlb24gQ29ycG9yYXRpb24KKzAwMDk5NCBDcm9ueXggRW5naW5lZXJpbmcKKzAwMDk5NSBDYXN0bGUgVGVjaG5vbG9neSBMdGQKKzAwMDk5NiBSREkKKzAwMDk5NyBOb3J0ZWwgTmV0d29ya3MKKzAwMDk5OCBDYXBpbmZvIENvbXBhbnkgTGltaXRlZAorMDAwOTk5IENQIEdFT1JHRVMgUkVOQVVMVAorMDAwOTlBIEVMTU8gQ09NUEFOWSwgTElNSVRFRAorMDAwOTlCIFdlc3Rlcm4gVGVsZW1hdGljIEluYy4KKzAwMDk5QyBOYXZhbCBSZXNlYXJjaCBMYWJvcmF0b3J5CiswMDA5OUQgSGFsaXBsZXggQ29tbXVuaWNhdGlvbnMKKzAwMDk5RSBUZXN0ZWNoLCBJbmMuCiswMDA5OUYgVklERVggSU5DLgorMDAwOUEwIE1pY3JvdGVjaG5vIENvcnBvcmF0aW9uCiswMDA5QTEgVGVsZXdpc2UgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMDlBMiBJbnRlcmZhY2UgQ28uLCBMdGQuCiswMDA5QTMgTGVhZGZseSBUZWNob2xvZ2llcyBDb3JwLiBMdGQuCiswMDA5QTQgSEFSVEVDIENvcnBvcmF0aW9uCiswMDA5QTUgSEFOU1VORyBFTEVUUk9OSUMgSU5EVVNUUklFUyBERVZFTE9QTUVOVCBDTy4sIExURAorMDAwOUE2IElnbmlzIE9wdGljcywgSW5jLgorMDAwOUE3IEJhbmcgJiBPbHVmc2VuIEEvUworMDAwOUE4IEVhc3Rtb2RlIFB0ZSBMdGQKKzAwMDlBOSBJa2Fub3MgQ29tbXVuaWNhdGlvbnMKKzAwMDlBQSBEYXRhIENvbW0gZm9yIEJ1c2luZXNzLCBJbmMuCiswMDA5QUIgTmV0Y29udHJvbCBPeQorMDAwOUFDIExBTlZPSUNFCiswMDA5QUQgSFlVTkRBSSBTWVNDT01NLCBJTkMuCiswMDA5QUUgT0tBTk8gRUxFQ1RSSUMgQ08uLExURAorMDAwOUFGIGUtZ2VuZXJpcworMDAwOUIwIE9ua3lvIENvcnBvcmF0aW9uCiswMDA5QjEgS2FuZW1hdHN1IEVsZWN0cm9uaWNzLCBMdGQuCiswMDA5QjIgTCZGIEluYy4KKzAwMDlCMyBNQ00gU3lzdGVtcyBMdGQKKzAwMDlCNCBLSVNBTiBURUxFQ09NIENPLiwgTFRELgorMDAwOUI1IDNKIFRlY2guIENvLiwgTHRkLgorMDAwOUI2IENpc2NvIFN5c3RlbXMKKzAwMDlCNyBDaXNjbyBTeXN0ZW1zCiswMDA5QjggRW50aXNlIFN5c3RlbXMKKzAwMDlCOSBBY3Rpb24gSW1hZ2luZyBTb2x1dGlvbnMKKzAwMDlCQSBNQUtVIEluZm9ybWF0aW9uc3RlY2hpayBHbWJICiswMDA5QkIgTWF0aFN0YXIsIEluYy4KKzAwMDlCQyBEaWdpdGFsIFNhZmV0eSBUZWNobm9sb2dpZXMgSW5jLgorMDAwOUJEIEVweWdpIFRlY2hub2xvZ2llcywgTHRkLgorMDAwOUJFIE1hbWl5YS1PUCBDby4sTHRkLgorMDAwOUJGIE5pbnRlbmRvIENvLixMdGQuCiswMDA5QzAgNldJTkQKKzAwMDlDMSBQUk9DRVMtREFUQSBBL1MKKzAwMDlDMyBORVRBUworMDAwOUM0IE1lZGljb3JlIENvLiwgTHRkCiswMDA5QzUgS0lOR0VORSBUZWNobm9sb2d5IENvcnBvcmF0aW9uCiswMDA5QzYgVmlzaW9uaWNzIENvcnBvcmF0aW9uCiswMDA5QzcgTW92aXN0ZWMKKzAwMDlDOCBTSU5BR0FXQSBUU1VTSElOIEtFSVNPVSBTRVJWSUNFCiswMDA5QzkgQmx1ZVdJTkMgQ28uLCBMdGQuCiswMDA5Q0EgaU1heE5ldHdvcmtzKFNoZW56aGVuKUxpbWl0ZWQuCiswMDA5Q0IgSEJyYWluCiswMDA5Q0MgTW9vZyBHbWJICiswMDA5Q0QgSFVEU09OIFNPRlQgQ08uLExURC4KKzAwMDlDRSBTcGFjZUJyaWRnZSBTZW1pY29uZHVjdG9yIENvcnAuCiswMDA5Q0YgaUFkIEdtYkgKKzAwMDlEMCBWZXJzYXRlbCBOZXR3b3JrcworMDAwOUQxIFNFUkFOT0EgTkVUV09SS1MgSU5DCiswMDA5RDIgTWFpIExvZ2ljIEluYy4KKzAwMDlEMyBXZXN0ZXJuIERhdGFDb20gQ28uLCBJbmMuCiswMDA5RDQgVHJhbnN0ZWNoIE5ldHdvcmtzCiswMDA5RDUgU2lnbmFsIENvbW11bmljYXRpb24sIEluYy4KKzAwMDlENiBLTkMgT25lIEdtYkgKKzAwMDlENyBEQyBTZWN1cml0eSBQcm9kdWN0cworMDAwOUQ5IE5lb3NjYWxlIFN5c3RlbXMsIEluYworMDAwOURBIENvbnRyb2wgTW9kdWxlIEluYy4KKzAwMDlEQiBlU3BhY2UKKzAwMDlEQyBHYWxheGlzIFRlY2hub2xvZ3kgQUcKKzAwMDlERCBNYXZpbiBUZWNobm9sb2d5IEluYy4KKzAwMDlERSBTYW1qaW4gSW5mb3JtYXRpb24gJiBDb21tdW5pY2F0aW9ucyBDby4sIEx0ZC4KKzAwMDlERiBWZXN0ZWwgS29tdW5pa2FzeW9uIFNhbmF5aSB2ZSBUaWNhcmV0IEEuUy4KKzAwMDlFMCBYRU1JQ1MgUy5BLgorMDAwOUUxIEdlbXRlayBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwOUUyIFNpbmJvbiBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKzAwMDlFMyBBbmdlbCBJZ2xlc2lhcyBTLkEuCiswMDA5RTQgSyBUZWNoIEluZm9zeXN0ZW0gSW5jLgorMDAwOUU1IEhvdHRpbmdlciBCYWxkd2luIE1lc3N0ZWNobmlrIEdtYkgKKzAwMDlFNiBDeWJlciBTd2l0Y2hpbmcgSW5jLgorMDAwOUU3IEFEQyBUZWNob25vbG9neQorMDAwOUU4IENpc2NvIFN5c3RlbXMKKzAwMDlFOSBDaXNjbyBTeXN0ZW1zCiswMDA5RUEgWUVNIEluYy4KKzAwMDlFQiBIdU1BTkRBVEEgTFRELgorMDAwOUVDIERha3Ryb25pY3MsIEluYy4KKzAwMDlFRCBDaXBoZXJPcHRpY3MKKzAwMDlFRSBNRUlLWU8gRUxFQ1RSSUMgQ08uLExURAorMDAwOUVGIFZvY2VyYSBDb21tdW5pY2F0aW9ucworMDAwOUYwIFNoaW1penUgVGVjaG5vbG9neSBJbmMuCiswMDA5RjEgWWFtYWtpIEVsZWN0cmljIENvcnBvcmF0aW9uCiswMDA5RjIgQ29odSwgSW5jLiwgRWxlY3Ryb25pY3MgRGl2aXNpb24KKzAwMDlGMyBXRUxMIENvbW11bmljYXRpb24gQ29ycC4KKzAwMDlGNCBBbGNvbiBMYWJvcmF0b3JpZXMsIEluYy4KKzAwMDlGNSBFbWVyc29uIE5ldHdvcmsgUG93ZXIgQ28uLEx0ZAorMDAwOUY2IFNoZW56aGVuIEVhc3Rlcm4gRGlnaXRhbCBUZWNoIEx0ZC4KKzAwMDlGNyBTRUQsIGEgZGl2aXNpb24gb2YgQ2FsaWFuCiswMDA5RjggVU5JTU8gVEVDSE5PTE9HWSBDTy4sIExURC4KKzAwMDlGOSBBUlQgSkFQQU4gQ08uLCBMVEQuCiswMDA5RkIgUGhpbGlwcyBNZWRpemluc3lzdGVtZSBCb2VibGluZ2VuIEdtYkgKKzAwMDlGQyBJUEZMRVggSW5jLgorMDAwOUZEIFViaW5ldGljcyBMaW1pdGVkCiswMDA5RkUgRGFpc3kgVGVjaG5vbG9naWVzLCBJbmMuCiswMDA5RkYgWC5uZXQgMjAwMCBHbWJICiswMDBBMDAgTWVkaWF0ZWsgQ29ycC4KKzAwMEEwMSBTT0hPd2FyZSwgSW5jLgorMDAwQTAyIEFOTlNPIENPLiwgTFRELgorMDAwQTAzIEVOREVTQSBTRVJWSUNJT1MsIFMuTC4KKzAwMEEwNCAzQ29tIEV1cm9wZSBMdGQKKzAwMEEwNSBXaWRheCBDb3JwLgorMDAwQTA2IFRlbGVkZXggTExDCiswMDBBMDcgV2ViV2F5T25lIEx0ZAorMDAwQTA4IEFMUElORSBFTEVDVFJPTklDUywgSU5DLgorMDAwQTA5IFRhcmFDb20gSW50ZWdyYXRlZCBQcm9kdWN0cywgSW5jLgorMDAwQTBBIFNVTklYIENvLiwgTHRkLgorMDAwQTBCIFNlYWxldmVsIFN5c3RlbXMsIEluYy4KKzAwMEEwQyBTY2llbnRpZmljIFJlc2VhcmNoIENvcnBvcmF0aW9uCiswMDBBMEQgTWVyZ2VPcHRpY3MgR21iSAorMDAwQTBFIEludml2byBSZXNlYXJjaCBJbmMuCiswMDBBMEYgSWxyeXVuZyBUZWxlc3lzLCBJbmMKKzAwMEExMCBGQVNUIG1lZGlhIGludGVncmF0aW9ucyBBRworMDAwQTExIEV4UGV0IFRlY2hub2xvZ2llcywgSW5jCiswMDBBMTIgQXp5bGV4IFRlY2hub2xvZ3ksIEluYworMDAwQTEzIFNpbGVudCBXaXRuZXNzCiswMDBBMTQgVEVDTyBhLnMuCiswMDBBMTUgU2lsaWNvbiBEYXRhLCBJbmMKKzAwMEExNiBMYXNzZW4gUmVzZWFyY2gKKzAwMEExNyBORVNUQVIgQ09NTVVOSUNBVElPTlMsIElOQworMDAwQTE4IFZpY2hlbCBJbmMuCiswMDBBMTkgVmFsZXJlIFBvd2VyLCBJbmMuCiswMDBBMUEgSW1lcmdlIEx0ZAorMDAwQTFCIFN0cmVhbSBMYWJzCiswMDBBMUMgQnJpZGdlIEluZm9ybWF0aW9uIENvLiwgTHRkLgorMDAwQTFEIE9wdGljYWwgQ29tbXVuaWNhdGlvbnMgUHJvZHVjdHMgSW5jLgorMDAwQTFFIFJlZC1NIChDb21tdW5pY2F0aW9ucykgTGltaXRlZAorMDAwQTFGIEFSVCBXQVJFIFRlbGVjb21tdW5pY2F0aW9uIENvLiwgTHRkLgorMDAwQTIwIFNWQSBOZXR3b3JrcywgSW5jLgorMDAwQTIxIEludGVncmEgVGVsZWNvbSBDby4gTHRkCiswMDBBMjIgQW1wZXJpb24gSW5jCiswMDBBMjMgUGFyYW1hIE5ldHdvcmtzIEluYworMDAwQTI0IE9jdGF2ZSBDb21tdW5pY2F0aW9ucworMDAwQTI1IENFUkFHT04gTkVUV09SS1MKKzAwMEEyNiBDRUlBIFMucC5BLgorMDAwQTI3IEFwcGxlIENvbXB1dGVyLCBJbmMuCiswMDBBMjggTW90b3JvbGEKKzAwMEEyOSBQYW4gRGFjb20gTmV0d29ya2luZyBBRworMDAwQTJBIFFTSSBTeXN0ZW1zIEluYy4KKzAwMEEyQiBFdGhlcnN0dWZmCiswMDBBMkMgQWN0aXZlIFRjaG5vbG9neSBDb3Jwb3JhdGlvbgorMDAwQTJFIE1BUExFIE5FVFdPUktTIENPLiwgTFRECiswMDBBMkYgQXJ0bml4IEluYy4KKzAwMEEzMCBKb2huc29uIENvbnRyb2xzLUFTRworMDAwQTMxIEhDViBXaXJlbGVzcworMDAwQTMyIFhzaWRvIENvcnBvcmF0aW9uCiswMDBBMzMgU2llcnJhIExvZ2ljLCBJbmMuCiswMDBBMzQgSWRlbnRpY2FyZCBTeXN0ZW1zIEluY29ycG9yYXRlZAorMDAwQTM1IFhpbGlueAorMDAwQTM2IFN5bmVsZWMgVGVsZWNvbSBNdWx0aW1lZGlhCiswMDBBMzcgUHJvY2VyYSBOZXR3b3JrcywgSW5jLgorMDAwQTM4IE5ldGxvY2sgVGVjaG5vbG9naWVzLCBJbmMuCiswMDBBMzkgTG9QQSBJbmZvcm1hdGlvbiBUZWNobm9sb2d5CiswMDBBM0EgSi1USFJFRSBJTlRFUk5BVElPTkFMIEhvbGRpbmcgQ28uLCBMdGQuCiswMDBBM0IgR0NUIFNlbWljb25kdWN0b3IsIEluYworMDAwQTNDIEVuZXJwb2ludCBMdGQuCiswMDBBM0QgRWxvIFNpc3RlbWFzIEVsZXRyb25pY29zIFMuQS4KKzAwMEEzRSBFQURTIFRlbGVjb20KKzAwMEEzRiBEYXRhIEVhc3QgQ29ycG9yYXRpb24KKzAwMEE0MCBDcm93biBBdWRpbworMDAwQTQxIENpc2NvIFN5c3RlbXMKKzAwMEE0MiBDaXNjbyBTeXN0ZW1zCiswMDBBNDMgQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4KKzAwMEE0NCBBdmVyeSBEZW5uaXNvbiBEZXV0c2NobGFuZCBHbWJICiswMDBBNDUgQXVkaW8tVGVjaG5pY2EgQ29ycC4KKzAwMEE0NiBBUk8gQ29udHJvbHMgU0FTCiswMDBBNDcgQWxsaWVkIFZpc2lvbiBUZWNobm9sb2dpZXMKKzAwMEE0OCBBbGJhdHJvbiBUZWNobm9sb2d5CiswMDBBNDkgQWNvcGlhIE5ldHdvcmtzCiswMDBBNEEgVGFyZ2EgU3lzdGVtcyBMdGQuCiswMDBBNEIgRGF0YVBvd2VyIFRlY2hub2xvZ3ksIEluYy4KKzAwMEE0QyBNb2xlY3VsYXIgRGV2aWNlcyBDb3Jwb3JhdGlvbgorMDAwQTREIE5vcml0eiBDb3Jwb3JhdGlvbgorMDAwQTRFIFVOSVRFSyBFbGVjdHJvbmljcyBJTkMuCiswMDBBNEYgQnJhaW4gQm94ZXMgTGltaXRlZAorMDAwQTUwIFJFTU9URUsgQ09SUE9SQVRJT04KKzAwMEE1MSBHeXJvU2lnbmFsIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDBBNTIgVmVuaXRlayBDby4gTHRkLgorMDAwQTUzIEludHJvbmljcywgSW5jb3Jwb3JhdGVkCiswMDBBNTQgTGFndW5hIEhpbGxzLCBJbmMuCiswMDBBNTUgTUFSS0VNIENvcnBvcmF0aW9uCiswMDBBNTYgSElUQUNISSBNYXhlbGwgTHRkLgorMDAwQTU3IEhld2xldHQtUGFja2FyZCBDb21wYW55IC0gU3RhbmRhcmRzCiswMDBBNTggSW5nZW5pZXVyLUJ1ZXJvIEZyZXllciAmIFNpZWdlbAorMDAwQTU5IEhXIHNlcnZlcgorMDAwQTVBIEdyZWVuTkVUIFRlY2hub2xvZ2llcyBDby4sTHRkLgorMDAwQTVCIFBvd2VyLU9uZSBhcworMDAwQTVDIENhcmVsIHMucC5hLgorMDAwQTVEIFBVQyBGb3VuZGVyIChNU0MpIEJlcmhhZAorMDAwQTVFIDNDT00gQ29ycG9yYXRpb24KKzAwMEE1RiBhbG1lZGlvIGluYy4KKzAwMEE2MCBBdXRvc3RhciBUZWNobm9sb2d5IFB0ZSBMdGQKKzAwMEE2MSBDZWxsaW54IFN5c3RlbXMgSW5jLgorMDAwQTYyIENyaW5pcyBOZXR3b3JrcywgSW5jLgorMDAwQTYzIERIRCBHbWJICiswMDBBNjQgRXJhY29tIFRlY2hub2xvZ2llcworMDAwQTY1IEdlbnRlY2hNZWRpYS5jby4sbHRkLgorMDAwQTY2IE1JVFNVQklTSEkgRUxFQ1RSSUMgU1lTVEVNICYgU0VSVklDRSBDTy4sTFRELgorMDAwQTY3IE9uZ0NvcnAKKzAwMEE2OCBTb2xhckZsYXJlIENvbW11bmljYXRpb25zLCBJbmMuCiswMDBBNjkgU1VOTlkgYmVsbCBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwQTZBIFNWTSBNaWNyb3dhdmVzIHMuci5vLgorMDAwQTZCIFRhZGlyYW4gVGVsZWNvbSBCdXNpbmVzcyBTeXN0ZW1zIExURAorMDAwQTZDIFdhbGNoZW0gQ29ycG9yYXRpb24KKzAwMEE2RCBFS1MgRWxla3Ryb25pa3NlcnZpY2UgR21iSAorMDAwQTZFIEJyb2FkY2FzdCBUZWNobm9sb2d5IExpbWl0ZWQKKzAwMEE2RiBaeVRlcmEgVGVjaG5vbG9naWVzIEluYy4KKzAwMEE3MCBNUExTIEZvcnVtCiswMDBBNzEgQXZyaW8gVGVjaG5vbG9naWVzLCBJbmMKKzAwMEE3MiBTaW1wbGVUZWNoLCBJbmMuCiswMDBBNzMgU2NpZW50aWZpYyBBdGxhbnRhCiswMDBBNzQgTWFudGljb20gTmV0d29ya3MgSW5jLgorMDAwQTc1IENhdCBFbGVjdHJvbmljcworMDAwQTc2IEJlaWRhIEphZGUgQmlyZCBIdWFndWFuZyBUZWNobm9sb2d5IENvLixMdGQKKzAwMEE3NyBCbHVld2lyZSBUZWNobm9sb2dpZXMgTExDCiswMDBBNzggT0xJVEVDCiswMDBBNzkgY29yZWdhIEsuSy4KKzAwMEE3QSBLeW9yaXRzdSBFbGVjdHJpYyBDby4sIEx0ZC4KKzAwMEE3QiBDb3JuZWxpdXMgQ29uc3VsdAorMDAwQTdDIFRlY3RvbiBMdGQKKzAwMEE3RCBWYWxvLCBJbmMuCiswMDBBN0UgVGhlIEFkdmFudGFnZSBHcm91cAorMDAwQTdGIFRlcmFkb24gSW5kdXN0cmllcywgSW5jCiswMDBBODAgVGVsa29uZXQgSW5jLgorMDAwQTgxIFRFSU1BIEF1ZGlvdGV4IFMuTC4KKzAwMEE4MiBUQVRTVVRBIFNZU1RFTSBFTEVDVFJPTklDUyBDTy4sTFRELgorMDAwQTgzIFNBTFRPIFNZU1RFTVMgUy5MLgorMDAwQTg0IFJhaW5zdW4gRW50ZXJwcmlzZSBDby4sIEx0ZC4KKzAwMEE4NSBQTEFUJ0MyLEluYworMDAwQTg2IExlbnplCiswMDBBODcgSW50ZWdyYXRlZCBNaWNyb21hY2hpbmVzIEluYy4KKzAwMEE4OCBJbkN5cGhlciBTLkEuCiswMDBBODkgQ3JldmFsIFN5c3RlbXMsIEluYy4KKzAwMEE4QSBDaXNjbyBTeXN0ZW1zCiswMDBBOEIgQ2lzY28gU3lzdGVtcworMDAwQThDIEd1YXJkd2FyZSBTeXN0ZW1zIEx0ZC4KKzAwMEE4RCBFVVJPVEhFUk0gTElNSVRFRAorMDAwQThFIEludmFjb20gTHRkCiswMDBBOEYgQXNrYSBJbnRlcm5hdGlvbmFsIEluYy4KKzAwMEE5MCBCYXlzaWRlIEludGVyYWN0aXZlLCBJbmMuCiswMDBBOTEgSGVtb0N1ZSBBQgorMDAwQTkyIFByZXNvbnVzIENvcnBvcmF0aW9uCiswMDBBOTMgVzIgTmV0d29ya3MsIEluYy4KKzAwMEE5NCBTaGFuZ0hhaSBjZWxsaW5rIENPLiwgTFRECiswMDBBOTUgQXBwbGUgQ29tcHV0ZXIsIEluYy4KKzAwMEE5NiBNRVdURUwgVEVDSE5PTE9HWSBJTkMuCiswMDBBOTcgU09OSUNibHVlLCBJbmMuCiswMDBBOTggTStGIEd3aW5uZXIgR21iSCAmIENvCiswMDBBOTkgRGF0YXJhZGlvIEluYy4KKzAwMEE5QSBBaXB0ZWsgSW50ZXJuYXRpb25hbCBJbmMKKzAwMEE5QiBUb3dhIE1lY2NzIENvcnBvcmF0aW9uCiswMDBBOUMgU2VydmVyIFRlY2hub2xvZ3ksIEluYy4KKzAwMEE5RCBLaW5nIFlvdW5nIFRlY2hub2xvZ3kgQ28uIEx0ZC4KKzAwMEE5RSBCcm9hZFdlYiBDb3Jwb3J0YXRpb24KKzAwMEE5RiBQYW5uYXdheSBUZWNobm9sb2dpZXMsIEluYy4KKzAwMEFBMCBDZWRhciBQb2ludCBDb21tdW5pY2F0aW9ucworMDAwQUExIFYgViBTIExpbWl0ZWQKKzAwMEFBMiBTWVNURUsgSU5DLgorMDAwQUEzIFNISU1BRlVKSSBFTEVDVFJJQyBDTy4sTFRELgorMDAwQUE0IFNIQU5HSEFJIFNVUlZFSUxMQU5DRSBURUNITk9MT0dZIENPLExURAorMDAwQUE1IE1BWExJTksgSU5EVVNUUklFUyBMSU1JVEVECiswMDBBQTYgSG9jaGlraSBDb3Jwb3JhdGlvbgorMDAwQUE3IEZFSSBDb21wYW55CiswMDBBQTggZVBpcGUgUHR5LiBMdGQuCiswMDBBQTkgQnJvb2tzIEF1dG9tYXRpb24gR21iSAorMDAwQUFBIEFsdGlHZW4gQ29tbXVuaWNhdGlvbnMgSW5jLgorMDAwQUFCIFRPWU9UQSBNQUNTLCBJTkMuCiswMDBBQUMgVGVycmFUZWMgRWxlY3Ryb25pYyBHbWJICiswMDBBQUQgU3RhcmdhbWVzIENvcnBvcmF0aW9uCiswMDBBQUUgUm9zZW1vdW50IFByb2Nlc3MgQW5hbHl0aWNhbAorMDAwQUFGIFBpcGFsIFN5c3RlbXMKKzAwMEFCMCBMT1lURUMgZWxlY3Ryb25pY3MgR21iSAorMDAwQUIxIEdFTkVURUMgQ29ycG9yYXRpb24KKzAwMEFCMiBGcmVzbmVsIFdpcmVsZXNzIFN5c3RlbXMKKzAwMEFCMyBGYS4gR0lSQQorMDAwQUI0IEVUSUMgVGVsZWNvbW11bmljYXRpb25zCiswMDBBQjUgRGlnaXRhbCBFbGVjdHJvbmljIE5ldHdvcmsKKzAwMEFCNiBDT01QVU5FVElYLCBJTkMKKzAwMEFCNyBDaXNjbyBTeXN0ZW1zCiswMDBBQjggQ2lzY28gU3lzdGVtcworMDAwQUI5IEFzdGVyYSBUZWNobm9sb2dpZXMgQ29ycC4KKzAwMEFCQSBBcmNvbiBUZWNobm9sb2d5IExpbWl0ZWQKKzAwMEFCQiBUYWl3YW4gU2Vjb20gQ28sLiBMdGQKKzAwMEFCQyBTZWFicmlkZ2UgTHRkLgorMDAwQUJEIFJ1cHByZWNodCAmIFBhdGFzaG5pY2sgQ28uCiswMDBBQkUgT1BORVQgVGVjaG5vbG9naWVzIENPLiwgTFRELgorMDAwQUJGIEhJUk9UQSBTUworMDAwQUMwIEZ1eW9oIFZpZGVvIEluZHVzdHJ5IENPLiwgTFRELgorMDAwQUMxIEZ1dHVyZXRlbAorMDAwQUMyIEZpYmVySG9tZSBUZWxlY29tbXVuaWNhdGlvbiBUZWNobm9sb2dpZXMgQ08uLExURAorMDAwQUMzIGVNIFRlY2huaWNzIENvLiwgTHRkLgorMDAwQUM0IERhZXdvbyBUZWxldGVjaCBDby4sIEx0ZAorMDAwQUM1IENvbG9yIEtpbmV0aWNzCiswMDBBQzcgVW5pY2F0aW9uIEdyb3VwCiswMDBBQzggWlBTWVMgQ08uLExURC4gKFBsYW5uaW5nJk1hbmFnZW1lbnQpCiswMDBBQzkgWmFtYmVlbCBJbmMKKzAwMEFDQSBZT0tPWUFNQSBTSE9LQUkgQ08uLEx0ZC4KKzAwMEFDQiBYUEFLIE1TQSBHcm91cAorMDAwQUNDIFdpbm5vdyBOZXR3b3JrcywgSW5jLgorMDAwQUNEIFN1bnJpY2ggVGVjaG5vbG9neSBMaW1pdGVkCiswMDBBQ0UgUkFESUFOVEVDSCwgSU5DLgorMDAwQUNGIFBST1ZJREVPIE11bHRpbWVkaWEgQ28uIEx0ZC4KKzAwMEFEMCBOaWlnYXRhIERldmVsb21lbnQgQ2VudGVyLCAgRi5JLlQuIENvLiwgTHRkLgorMDAwQUQxIE1XUworMDAwQUQyIEpFUElDTyBDb3Jwb3JhdGlvbgorMDAwQUQzIElOSVRFQ0ggQ28uLCBMdGQKKzAwMEFENCBDb3JlQmVsbCBTeXN0ZW1zIEluYy4KKzAwMEFENSBCcmFpbmNoaWxkIEVsZWN0cm9uaWMgQ28uLCBMdGQuCiswMDBBRDYgQmVhbVJlYWNoIE5ldHdvcmtzCiswMDBBRDggSVBDc2VydiBUZWNobm9sb2d5IENvcnAuCiswMDBBRDkgU29ueSBFcmljc3NvbiBNb2JpbGUgQ29tbXVuaWNhdGlvbnMgQUIKKzAwMEFEQiBTa3lQaWxvdCBOZXR3b3JrLCBJbmMKKzAwMEFEQyBSdWdnZWRDb20gSW5jLgorMDAwQUREIEluU2NpVGVrIE1pY3Jvc3lzdGVtcywgSW5jLgorMDAwQURFIEhhcHB5IENvbW11bmljYXRpb24gQ28uLCBMdGQuCiswMDBBREYgR2VubnVtIENvcnBvcmF0aW9uCiswMDBBRTAgRnVqaXRzdSBTb2Z0ZWsKKzAwMEFFMSBFRyBUZWNobm9sb2d5CiswMDBBRTIgQmluYXRvbmUgRWxlY3Ryb25pY3MgSW50ZXJuYXRpb25hbCwgTHRkCiswMDBBRTMgWUFORyBNRUkgVEVDSE5PTE9HWSBDTy4sIExURAorMDAwQUU0IFdpc3Ryb24gQ29ycC4KKzAwMEFFNSBTY290dENhcmUgQ29ycG9yYXRpb24KKzAwMEFFNiBFbGl0ZWdyb3VwIENvbXB1dGVyIFN5c3RlbSBDby4gKEVDUykKKzAwMEFFNyBFTElPUCBTLkEuCiswMDBBRTggQ2F0aGF5IFJveHVzIEluZm9ybWF0aW9uIFRlY2hub2xvZ3kgQ28uIExURAorMDAwQUU5IEFpclZhc3QgVGVjaG5vbG9neSBJbmMuCiswMDBBRUEgQURBTSBFTEVLVFJPTklLIExURC5TVEkuCiswMDBBRUIgU2hlbnpoZW4gVHAtbGluayBUZWNobm9sb2d5IENvOyBMdGQuCiswMDBBRUMgS29hdHN1IEdhcyBLb2d5byBDby4sIEx0ZC4KKzAwMEFFRCBIQVJUSU5HIFZlbmRpbmcgRy5tLmIuSC4gJiBDTyBLRworMDAwQUVFIEdDRCBIYXJkLSAmIFNvZnR3YXJlIEdtYkgKKzAwMEFFRiBPVFJVTSBBU0EKKzAwMEFGMCBTSElOLU9IIEVMRUNUUk9OSUNTIENPLiwgTFRELiBSJkQKKzAwMEFGMSBDbGFyaXR5IERlc2lnbiwgSW5jLgorMDAwQUYyIE5lb0F4aW9tIENvcnAuCiswMDBBRjMgQ2lzY28gU3lzdGVtcworMDAwQUY0IENpc2NvIFN5c3RlbXMKKzAwMEFGNSBBaXJnbyBOZXR3b3JrcywgSW5jLgorMDAwQUY2IENvbXB1dGVyIFByb2Nlc3MgQ29udHJvbHMKKzAwMEFGNyBCcm9hZGNvbSBDb3JwLgorMDAwQUY4IEFtZXJpY2FuIFRlbGVjYXJlIEluYy4KKzAwMEFGQSBUcmF2ZXJzZSBUZWNobm9sb2dpZXMgQXVzdHJhbGlhCiswMDBBRkIgQW1icmkgTGltaXRlZAorMDAwQUZDIENvcmUgVGVjIENvbW11bmljYXRpb25zLCBMTEMKKzAwMEFGRCBWaWtpbmcgRWxlY3Ryb25pYyBTZXJ2aWNlcworMDAwQUZFIE5vdmFQYWwgTHRkCiswMDBBRkYgS2lsY2hoZXJyIEVsZWt0cm9uaWsgQUcKKzAwMEIwMCBGVUpJQU4gU1RBUlQgQ09NUFVURVIgRVFVSVBNRU5UIENPLixMVEQKKzAwMEIwMSBEQUlJQ0hJIEVMRUNUUk9OSUNTIENPLiwgTFRELgorMDAwQjAyIERhbGxtZWllciBlbGVjdHJvbmljCiswMDBCMDMgVGFla3dhbmcgSW5kdXN0cmlhbCBDby4sIEx0ZAorMDAwQjA0IFZvbGt0ZWsgQ29ycG9yYXRpb24KKzAwMEIwNSBQYWNpZmljIEJyb2FkYmFuZCBOZXR3b3JrcworMDAwQjA2IE1vdG9yb2xhIEJDUworMDAwQjA3IFZveHBhdGggTmV0d29ya3MKKzAwMEIwOCBQaWxsYXIgRGF0YSBTeXN0ZW1zCiswMDBCMDkgSWZvdW5kcnkgU3lzdGVtcyBTaW5nYXBvcmUKKzAwMEIwQSBkQm0gT3B0aWNzCiswMDBCMEIgQ29ycmVudCBDb3Jwb3JhdGlvbgorMDAwQjBDIEFnaWxlIFN5c3RlbXMgSW5jLgorMDAwQjBEIEFpcjJVLCBJbmMuCiswMDBCMEUgVHJhcGV6ZSBOZXR3b3JrcworMDAwQjBGIE55cXVpc3QgSW5kdXN0cmlhbCBDb250cm9sIEJWCiswMDBCMTAgMTF3YXZlIFRlY2hub25sb2d5IENvLixMdGQKKzAwMEIxMSBISU1FSkkgQUJDIFRSQURJTkcgQ08uLExURC4KKzAwMEIxMyBaRVRST04gSU5DCiswMDBCMTQgVmlld1NvbmljIENvcnBvcmF0aW9uCiswMDBCMTUgUGxhdHlwdXMgVGVjaG5vbG9neQorMDAwQjE2IENvbW11bmljYXRpb24gTWFjaGluZXJ5IENvcnBvcmF0aW9uCiswMDBCMTcgTUtTIEluc3RydW1lbnRzCiswMDBCMTkgVmVybmllciBOZXR3b3JrcywgSW5jLgorMDAwQjFBIFRlbHRvbmUgQ29ycG9yYXRpb24KKzAwMEIxQiBTeXN0cm9uaXgsIEluYy4KKzAwMEIxRCBMYXllclplcm8gUG93ZXIgU3lzdGVtcywgSW5jLgorMDAwQjFFIEtBUFBBIG9wdG8tZWxlY3Ryb25pY3MgR21iSAorMDAwQjFGIEkgQ09OIENvbXB1dGVyIENvLgorMDAwQjIwIEhpcmF0YSBjb3Jwb3JhdGlvbgorMDAwQjIxIEctU3RhciBDb21tdW5pY2F0aW9ucyBJbmMuCiswMDBCMjIgRW52aXJvbm1lbnRhbCBTeXN0ZW1zIGFuZCBTZXJ2aWNlcworMDAwQjIzIEVmZmljaWVudCBOZXR3b3JrcywgSW5jLgorMDAwQjI0IEFpckxvZ2ljCiswMDBCMjUgQWVsdXJvcworMDAwQjI2IFdldGVrIENvcnBvcmF0aW9uCiswMDBCMjcgU2Npb24gQ29ycG9yYXRpb24KKzAwMEIyOCBRdWF0ZWNoIEluYy4KKzAwMEIyOSBMRyBJbmR1c3RyaWFsIFN5c3RlbXMgQ28uLEx0ZC4KKzAwMEIyQSBIT1dURUwgQ28uLCBMdGQuCiswMDBCMkIgSE9TVE5FVCBDT1JQT1JBVElPTgorMDAwQjJDIEVpa2kgSW5kdXN0cmlhbCBDby4gTHRkLgorMDAwQjJEIERhbmZvc3MgSW5jLgorMDAwQjJFIENhbC1Db21wIEVsZWN0cm9uaWNzIChUaGFpbGFuZCkgUHVibGljIENvbXBhbnkgTGltaXRlZCBUYWlwZQorMDAwQjJGIGJwbGFuIEdtYkgKKzAwMEIzMCBCZWlqaW5nIEdvbmd5ZSBTY2llbmNlICYgVGVjaG5vbG9neSBDby4sTHRkCiswMDBCMzEgWWFudGFpIFpoaVlhbmcgU2NpZW50aWZpYyBhbmQgdGVjaG5vbG9neSBpbmR1c3RyeSBDTy4sIExURAorMDAwQjMyIFZPUk1FVFJJQywgSU5DLgorMDAwQjMzIFZpdmF0bworMDAwQjM0IFNoYW5nSGFpIEJyb2FkYmFuZCBUZWNobm9sb2dpZXMgQ08uTFRECiswMDBCMzUgUXVhZCBCaXQgU3lzdGVtIGNvLiwgTHRkLgorMDAwQjM2IFByb2R1Y3Rpdml0eSBTeXN0ZW1zLCBJbmMuCiswMDBCMzcgTUFOVUZBQ1RVUkUgREVTIE1PTlRSRVMgUk9MRVggU0EKKzAwMEIzOCBLbnVlcnIgQUcKKzAwMEIzOSBLZWlzb2t1IEdpa2VuIENvLixMdGQuCiswMDBCM0EgRm9ydGVsIERUViwgSW5jLgorMDAwQjNCIGRldm9sbyBBRworMDAwQjNDIEN5Z25hbCBJbnRlZ3JhdGVkIFByb2R1Y3RzLCBJbmMuCiswMDBCM0QgQ09OVEFMIE9LIEx0ZC4KKzAwMEIzRSBCaXR0V2FyZSwgSW5jCiswMDBCM0YgQW50aG9sb2d5IFNvbHV0aW9ucyBJbmMuCiswMDBCNDAgT3BOZXh0IEluYy4KKzAwMEI0MSBJbmcuIEJ1ZXJvIERyLiBCZXV0bGhhdXNlcgorMDAwQjQyIGNvbW1heCBDby4sIEx0ZC4KKzAwMEI0MyBNaWNyb3NjYW4gU3lzdGVtcywgSW5jLgorMDAwQjQ0IENvbmNvcmQgSURlYSBDb3JwLgorMDAwQjQ1IENpc2NvCiswMDBCNDYgQ2lzY28KKzAwMEI0NyBBZHZhbmNlZCBFbmVyZ3kKKzAwMEI0OCBzb2ZyZWwKKzAwMEI0OSBSRi1MaW5rIFN5c3RlbSBJbmMuCiswMDBCNEEgVmlzaW1ldHJpY3MgKFVLKSBMdGQKKzAwMEI0QiBWSVNJT1dBVkUgU0EKKzAwMEI0QyBDbGFyaW9uIChNKSBTZG4gQmhkCiswMDBCNEQgRW11emVkCiswMDBCNEUgVmVydGV4UlNJIEFudGVubmEgUHJvZHVjdHMgRGl2aXNpb24KKzAwMEI0RiBWZXJpZm9uZSwgSU5DLgorMDAwQjUwIE94eWduZXQKKzAwMEI1MSBNaWNldGVrIEludGVybmF0aW9uYWwgSW5jLgorMDAwQjUyIEpPWU1BWCBFTEVDVFJPTklDUyBDT1JQLgorMDAwQjUzIElOSVRJVU0gQ28uLCBMdGQuCiswMDBCNTQgQmlUTUlDUk8gTmV0d29ya3MsIEluYy4KKzAwMEI1NSBBREluc3RydW1lbnRzCiswMDBCNTYgQ3liZXJuZXRpY3MKKzAwMEI1NyBTaWxpY29uIExhYm9yYXRvcmllcworMDAwQjU4IEFzdHJvbmF1dGljcyBDLkEgIExURAorMDAwQjU5IFNjcmlwdFBybywgTExDCiswMDBCNUEgSHlwZXJFZGdlCiswMDBCNUIgUmluY29uIFJlc2VhcmNoIENvcnBvcmF0aW9uCiswMDBCNUMgTmV3dGVjaCBDby4sTHRkCiswMDBCNUQgRlVKSVRTVSBMSU1JVEVECiswMDBCNUUgQVRNQVZBIEx0ZAorMDAwQjVGIENpc2NvIFN5c3RlbXMKKzAwMEI2MCBDaXNjbyBTeXN0ZW1zCiswMDBCNjEgRnJpZWRyaWNoIEz8dHplIEdtYkggJkNvLgorMDAwQjYyIEluZ2VuaWV1cmL8cm8gSW5nbyBNb2huZW4KKzAwMEI2NCBLaWViYWNrICYgUGV0ZXIgR21iSCAmIENvIEtHCiswMDBCNjUgU3kuQS5DLiBzcmwKKzAwMEI2NiBUZXJhbGluayBDb21tdW5pY2F0aW9ucworMDAwQjY3IFRvcHZpZXcgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorMDAwQjY4IEFkZHZhbHVlIENvbW11bmljYXRpb25zIFB0ZSBMdGQKKzAwMEI2OSBGcmFua2UgRmlubGFuZCBPeQorMDAwQjZBIEFzaWFyb2NrIEluY29ycG9yYXRpb24KKzAwMEI2QiBXaXN0cm9uIE5ld2ViIENvcnAuCiswMDBCNkMgU3ljaGlwIEluYy4KKzAwMEI2RCBTT0xFQ1RST04gSkFQQU4gTkFLQU5JSURBCiswMDBCNkUgTmVmZiBJbnN0cnVtZW50IENvcnAuCiswMDBCNkYgTWVkaWEgU3RyZWFtaW5nIE5ldHdvcmtzIEluYworMDAwQjcwIExvYWQgVGVjaG5vbG9neSwgSW5jLgorMDAwQjcxIExpdGNoZmllbGQgQ29tbXVuaWNhdGlvbnMgSW5jLgorMDAwQjcyIExhd28gQUcKKzAwMEI3MyBLb2Rlb3MgQ29tbXVuaWNhdGlvbnMKKzAwMEI3NCBLaW5nd2F2ZSBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwQjc1IElvc29mdCBMdGQuCiswMDBCNzYgRVQmVCBDby4gTHRkLgorMDAwQjc3IENvZ2VudCBTeXN0ZW1zLCBJbmMuCiswMDBCNzggVEFJRkFURUNIIElOQy4KKzAwMEI3OSBYLUNPTSwgSW5jLgorMDAwQjdCIFRlc3QtVW0gSW5jLgorMDAwQjdDIFRlbGV4IENvbW11bmljYXRpb25zCiswMDBCN0QgU09MT01PTiBFWFRSRU1FIElOVEVSTkFUSU9OQUwgTFRELgorMDAwQjdFIFNBR0lOT01JWUEgU2Vpc2FrdXNobyBJbmMuCiswMDBCN0YgT21uaVdlcmtzCiswMDBCODEgS2FwYXJlbCBDb3Jwb3JhdGlvbgorMDAwQjgyIEdyYW5kc3RyZWFtIE5ldHdvcmtzLCBJbmMuCiswMDBCODMgREFUQVdBVFQgQi5WLgorMDAwQjg0IEJPREVUCiswMDBCODUgQWlyZXNwYWNlLCBJbmMuCiswMDBCODYgQXJ1YmEgTmV0d29ya3MKKzAwMEI4NyBBbWVyaWNhbiBSZWxpYW5jZSBJbmMuCiswMDBCODggVmlkaXNjbyBsdGQuCiswMDBCODkgVG9wIEdsb2JhbCBUZWNobm9sb2d5LCBMdGQuCiswMDBCOEEgTUlURVEgSW5jLgorMDAwQjhCIEtFUkFKRVQsIFMuQS4KKzAwMEI4QyBmbGV4dHJvbmljcyBpc3JhZWwKKzAwMEI4RCBBdnZpbyBOZXR3b3JrcworMDAwQjhFIEFzY2VudCBDb3Jwb3JhdGlvbgorMDAwQjhGIEFLSVRBIEVMRUNUUk9OSUNTIFNZU1RFTVMgQ08uLExURC4KKzAwMEI5MCBDb3Zhcm8gTmV0d29ya3MsIEluYy4KKzAwMEI5MSBBZ2xhaWEgR2VzZWxsc2NoYWZ0IGb8ciBCaWxkdmVyYXJiZWl0dW5nIHVuZCBLb21tdW5pa2F0aW9uIG0KKzAwMEI5MiBBc2NvbSBEYW5tYXJrIEEvUworMDAwQjkzIEJhcm1hZyBFbGVjdHJvbmljCiswMDBCOTQgRGlnaXRhbCBNb25pdG9yaW5nIFByb2R1Y3RzLCBJbmMuCiswMDBCOTUgZUJldCBHYW1pbmcgU3lzdGVtcyBQdHkgTHRkCiswMDBCOTYgSW5ub3RyYWMgRGlhZ25vc3RpY3MgT3kKKzAwMEI5NyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLEx0ZC4KKzAwMEI5OCBOaWNlVGVjaFZpc2lvbgorMDAwQjk5IFNlbnNBYmxlIFRlY2hub2xvZ2llcywgSW5jLgorMDAwQjlBIFNoYW5naGFpIFVsaW5rIFRlbGVjb20gRXF1aXBtZW50IENvLiBMdGQuCiswMDBCOUIgU2lyaXVzIFN5c3RlbSBDbywgTHRkLgorMDAwQjlDIFRyaUJlYW0gVGVjaG5vbG9naWVzLCBJbmMuCiswMDBCOUQgVHdpbk1PUyBUZWNobm9sb2dpZXMgSW5jLgorMDAwQjlFIFlhc2luZyBUZWNobm9sb2d5IENvcnAuCiswMDBCOUYgTmV1ZSBFTFNBIEdtYkgKKzAwMEJBMCBUJkwgSW5mb3JtYXRpb24gSW5jLgorMDAwQkExIFNZU0NPTSBMdGQuCiswMDBCQTIgU3VtaXRvbW8gRWxlY3RyaWMgTmV0d29ya3MsIEluYworMDAwQkEzIFNpZW1lbnMgQUcsIEkmUworMDAwQkE0IFNoaXJvbiBTYXRlbGxpdGUgQ29tbXVuaWNhdGlvbnMgTHRkLiAoMTk5NikKKzAwMEJBNSBRdWFzYXIgQ2lwdGEgTWFuZGlyaSwgUFQKKzAwMEJBNiBNaXlha2F3YSBFbGVjdHJpYyBXb3JrcyBMdGQuCiswMDBCQTcgTWFyYW50aSBOZXR3b3JrcworMDAwQkE4IEhBTkJBQ0sgRUxFQ1RST05JQ1MgQ08uLCBMVEQuCiswMDBCQUEgQWlwaG9uZSBjby4sTHRkCiswMDBCQUIgQWR2YW50ZWNoIFRlY2hub2xvZ3kgKENISU5BKSBDby4sIEx0ZC4KKzAwMEJBQyAzQ29tIEV1cm9wZSBMdGQuCiswMDBCQUQgUEMtUG9TIEluYy4KKzAwMEJBRSBWaXRhbHMgU3lzdGVtIEluYy4KKzAwMEJCMCBTeXNuZXQgVGVsZW1hdGljYSBzcmwKKzAwMEJCMSBTdXBlciBTdGFyIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDBCQjIgU01BTExCSUcgVEVDSE5PTE9HWQorMDAwQkIzIFJpVCB0ZWNobm9sb2dpZXMgTHRkLgorMDAwQkI0IFJEQyBTZW1pY29uZHVjdG9yIEluYy4sCiswMDBCQjUgblN0b3IgVGVjaG5vbG9naWVzLCBJbmMuCiswMDBCQjYgTW90b3RlY2ggSW5jLgorMDAwQkI3IE1pY3JvIFN5c3RlbXMgQ28uLEx0ZC4KKzAwMEJCOCBLaWhva3UgRWxlY3Ryb25pYyBDby4KKzAwMEJCOSBJbXN5cyBBQgorMDAwQkJBIEhhcm1vbmljIEJyb2FkYmFuZCBBY2Nlc3MgTmV0d29ya3MKKzAwMEJCQiBFdGluIFN5c3RlbXMgQ28uLCBMdGQKKzAwMEJCQyBFbiBHYXJkZSBTeXN0ZW1zLCBJbmMuCiswMDBCQkQgQ29ubmV4aW9ueiBMaW1pdGVkCiswMDBCQkUgQ2lzY28gU3lzdGVtcworMDAwQkJGIENpc2NvIFN5c3RlbXMKKzAwMEJDMCBDaGluYSBJV05Db21tIENvLiwgTHRkLgorMDAwQkMxIEJheSBNaWNyb3N5c3RlbXMsIEluYy4KKzAwMEJDMiBDb3JpbmV4IENvbW11bmljYXRpb24gQ29ycC4KKzAwMEJDMyBNdWx0aXBsZXgsIEluYy4KKzAwMEJDNCBCSU9UUk9OSUsgR21iSCAmIENvCiswMDBCQzUgU01DIE5ldHdvcmtzLCBJbmMuCiswMDBCQzYgSVNBQywgSW5jLgorMDAwQkM3IElDRVQgUy5wLkEuCiswMDBCQzggQWlyRmxvdyBOZXR3b3JrcworMDAwQkM5IEVsZWN0cm9saW5lIEVxdWlwbWVudAorMDAwQkNBIERBVEFWQU4gSW50ZXJuYXRpb25hbCBDb3Jwb3JhdGlvbgorMDAwQkNCIEZhZ29yIEF1dG9tYXRpb24gLCBTLiBDb29wCiswMDBCQ0MgSlVTQU4sIFMuQS4KKzAwMEJDRCBDb21wYXEgKEhQKQorMDAwQkNFIEZyZWUybW92ZSBBQgorMDAwQkNGIEFHRkEgTkRUIElOQy4KKzAwMEJEMCBYaU1ldGEgVGVjaG5vbG9neSBBbWVyaWNhcyBJbmMuCiswMDBCRDEgQWVyb25peCwgSW5jLgorMDAwQkQyIFJlbW9wcm8gVGVjaG5vbG9neSBJbmMuCiswMDBCRDMgY2QzbworMDAwQkQ0IEJlaWppbmcgV2lzZSBUZWNobm9sb2d5ICYgU2NpZW5jZSBEZXZlbG9wbWVudCBDby5MdGQKKzAwMEJENSBOdmVyZ2VuY2UsIEluYy4KKzAwMEJENiBQYXh0b24gQWNjZXNzIEx0ZAorMDAwQkQ3IE1CQiBHZWxtYSBHbWJICiswMDBCRDggSW5kdXN0cmlhbCBTY2llbnRpZmljIENvcnAuCiswMDBCRDkgR2VuZXJhbCBIeWRyb2dlbgorMDAwQkRBIEV5ZUNyb3NzIENvLixJbmMuCiswMDBCREIgRGVsbCBFU0cgUENCQSBUZXN0CiswMDBCREMgQUtDUAorMDAwQkREIFRPSE9LVSBSSUNPSCBDby4sIExURC4KKzAwMEJERiBTaGVuemhlbiBSb3V0ZXJEIE5ldHdvcmtzIExpbWl0ZWQKKzAwMEJFMCBTZXJjb05ldCBMdGQuCiswMDBCRTIgTHVtZW5lcmEgQ29ycG9yYXRpb24KKzAwMEJFMyBLZXkgU3RyZWFtIENvLiwgTHRkLgorMDAwQkU0IEhvc2lkZW4gQ29ycG9yYXRpb24KKzAwMEJFNSBISU1TIEtvcmVhIENvLiwgTHRkLgorMDAwQkU2IERhdGVsIEVsZWN0cm9uaWNzCiswMDBCRTcgQ09NRkxVWCBURUNITk9MT0dZIElOQy4KKzAwMEJFOCBBT0lQCiswMDBCRUEgWnVsdHlzIFRlY2hub2xvZ2llcworMDAwQkVCIFN5c3RlZ3JhIEFHCiswMDBCRUMgTklQUE9OIEVMRUNUUklDIElOU1RSVU1FTlQsIElOQy4KKzAwMEJFRCBFTE0gSW5jLgorMDAwQkVFIGluYy5qZXQsIEluY29ycG9yYXRlZAorMDAwQkVGIENvZGUgQ29ycG9yYXRpb24KKzAwMEJGMCBNb1RFWCBQcm9kdWN0cyBDby4sIEx0ZC4KKzAwMEJGMSBMQVAgTGFzZXIgQXBwbGlrYXRpb25zCiswMDBCRjIgQ2hpaC1LYW4gVGVjaG5vbG9neSBDby4sIEx0ZC4KKzAwMEJGMyBCQUUgU1lTVEVNUworMDAwQkY1IFNoYW5naGFpIFNpYm8gVGVsZWNvbSBUZWNobm9sb2d5IENvLixMdGQKKzAwMEJGNiBOaXRnZW4gQ28uLCBMdGQKKzAwMEJGNyBOSURFSyBDTy4sTFRECiswMDBCRjggSW5maW5lcmEKKzAwMEJGOSBHZW1zdG9uZSBjb21tdW5pY2F0aW9ucywgSW5jLgorMDAwQkZCIEQtTkVUIEludGVybmF0aW9uYWwgQ29ycG9yYXRpb24KKzAwMEJGQyBDaXNjbyBTeXN0ZW1zCiswMDBCRkQgQ2lzY28gU3lzdGVtcworMDAwQkZFIENBU1RFTCBCcm9hZGJhbmQgTGltaXRlZAorMDAwQkZGIEJlcmtlbGV5IENhbWVyYSBFbmdpbmVlcmluZworMDAwQzAwIEJFQiBJbmR1c3RyaWUtRWxla3Ryb25payBBRworMDAwQzAxIEFiYXRyb24gQUcKKzAwMEMwMiBBQkIgT3kKKzAwMEMwMyBIRE1JIExpY2Vuc2luZywgTExDCiswMDBDMDQgVGVjbm92YQorMDAwQzA1IFJQQSBSZXNlcmNoIENvLiwgTHRkLgorMDAwQzA2IE5peHZ1ZSBTeXN0ZW1zICBQdGUgTHRkCiswMDBDMDcgSWZ0ZXN0IEFHCiswMDBDMDggSFVNRVggVGVjaG5vbG9naWVzIENvcnAuCiswMDBDMDkgSGl0YWNoaSBJRSBTeXN0ZW1zIENvLiwgTHRkCiswMDBDMEEgR3Vhbmdkb25nIFByb3ZpbmNlIEVsZWN0cm9uaWMgVGVjaG5vbG9neSBSZXNlYXJjaCBJbnN0aXR1dGUKKzAwMEMwQiBCcm9hZGJ1cyBUZWNobm9sb2dpZXMKKzAwMEMwQyBBUFBSTyBURUNITk9MT0dZIElOQy4KKzAwMEMwRCBDb21tdW5pY2F0aW9ucyAmIFBvd2VyIEluZHVzdHJpZXMgLyBTYXRjb20gRGl2aXNpb24KKzAwMEMwRSBYdHJlbWVTcGVjdHJ1bSwgSW5jLgorMDAwQzBGIFRlY2huby1PbmUgQ28uLCBMdGQKKzAwMEMxMCBQTkkgQ29ycG9yYXRpb24KKzAwMEMxMSBOSVBQT04gREVNUEEgQ08uLExURC4KKzAwMEMxMiBNaWNyby1PcHRyb25pYy1NZXNzdGVjaG5payBHbWJICiswMDBDMTMgTWVkaWFRCiswMDBDMTQgRGlhZ25vc3RpYyBJbnN0cnVtZW50cywgSW5jLgorMDAwQzE1IEN5YmVyUG93ZXIgU3lzdGVtcywgSW5jLgorMDAwQzE2IENvbmNvcmRlIE1pY3Jvc3lzdGVtcyBJbmMuCiswMDBDMTcgQUpBIFZpZGVvIFN5c3RlbXMgSW5jCiswMDBDMTggWmVuaXN1IEtlaXNva3UgSW5jLgorMDAwQzE5IFRlbGlvIENvbW11bmljYXRpb25zIEdtYkgKKzAwMEMxQSBRdWVzdCBUZWNobmljYWwgU29sdXRpb25zIEluYy4KKzAwMEMxQiBPUkFDT00gQ28sIEx0ZC4KKzAwMEMxQyBNaWNyb1dlYiBDby4sIEx0ZC4KKzAwMEMxRCBNZXR0bGVyICYgRnVjaHMgQUcKKzAwMEMxRSBHbG9iYWwgQ2FjaGUKKzAwMEMxRiBHbGltbWVyZ2xhc3MgTmV0d29ya3MKKzAwMEMyMCBGaSBXSW4sIEluYy4KKzAwMEMyMSBGYWN1bHR5IG9mIFNjaWVuY2UgYW5kIFRlY2hub2xvZ3ksIEtlaW8gVW5pdmVyc2l0eQorMDAwQzIyIERvdWJsZSBEIEVsZWN0cm9uaWNzIEx0ZAorMDAwQzIzIEJlaWppbmcgTGFuY2h1YW4gVGVjaC4gQ28uLCBMdGQuCiswMDBDMjUgQWxsaWVkIFRlbGVzeW4gTmV0d29ya3MKKzAwMEMyNiBXZWludGVrIExhYnMuIEluYy4KKzAwMEMyNyBTYW1teSBDb3Jwb3JhdGlvbgorMDAwQzI4IFJJRkFUUk9OCiswMDBDMjkgVk13YXJlLCBJbmMuCiswMDBDMkEgT0NUVEVMIENvbW11bmljYXRpb24gQ28uLCBMdGQuCiswMDBDMkIgRUxJQVMgVGVjaG5vbG9neSwgSW5jLgorMDAwQzJDIEVud2lzZXIgSW5jLgorMDAwQzJEIEZ1bGxXYXZlIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDBDMkUgT3BlbmV0IGluZm9ybWF0aW9uIHRlY2hub2xvZ3koc2hlbnpoZW4pIENvLiwgTHRkLgorMDAwQzJGIFNlb3JpbVRlY2hub2xvZ3kgQ28uLEx0ZC4KKzAwMEMzMCBDaXNjbworMDAwQzMxIENpc2NvCiswMDBDMzIgQXZpb25pYyBEZXNpZ24gRGV2ZWxvcG1lbnQgR21iSAorMDAwQzMzIENvbXB1Y2FzZSBFbnRlcnByaXNlIENvLiBMdGQuCiswMDBDMzQgVml4ZW4gQ28uLCBMdGQuCiswMDBDMzUgS2FWbyBEZW50YWwgR21iSCAmIENvLiBLRworMDAwQzM2IFNIQVJQIFRBS0FZQSBFTEVDVFJPTklDUyBJTkRVU1RSWSBDTy4sTFRELgorMDAwQzM3IEdlb21hdGlvbiwgSW5jLgorMDAwQzM4IFRlbGNvQnJpZGdlcyBJbmMuCiswMDBDMzkgU2VudGluZWwgV2lyZWxlc3MgSW5jLgorMDAwQzNBIE94YW5jZQorMDAwQzNCIE9yaW9uIEVsZWN0cmljIENvLiwgTHRkLgorMDAwQzNDIE1lZGlhQ2hvcnVzLCBJbmMuCiswMDBDM0QgR2xzeXN0ZWNoIENvLiwgTHRkLgorMDAwQzNFIENyZXN0IEF1ZGlvCiswMDBDM0YgQ29nZW50IERlZmVuY2UgJiBTZWN1cml0eSBOZXR3b3JrcywKKzAwMEM0MCBBbHRlY2ggQ29udHJvbHMKKzAwMEM0MSBUaGUgTGlua3N5cyBHcm91cCwgSW5jLgorMDAwQzQyIFJvdXRlcmJvYXJkLmNvbQorMDAwQzQzIFJhbGluayBUZWNobm9sb2d5LCBDb3JwLgorMDAwQzQ0IEF1dG9tYXRlZCBJbnRlcmZhY2VzLCBJbmMuCiswMDBDNDUgQW5pbWF0aW9uIFRlY2hub2xvZ2llcyBJbmMuCiswMDBDNDYgQWxsaWVkIFRlbGVzeW4gSW5jLgorMDAwQzQ3IFNLIFRlbGV0ZWNoKFImRCBQbGFubmluZyBUZWFtKQorMDAwQzQ4IFFvU3RlayBDb3Jwb3JhdGlvbgorMDAwQzQ5IERhbmdhYXJkIFRlbGVjb20gUlRDIERpdmlzaW9uIEEvUworMDAwQzRBIEN5Z251cyBNaWNyb3N5c3RlbXMgUHJpdmF0ZSBMaW1pdGVkCiswMDBDNEIgQ2hlb3BzIEVsZWt0cm9uaWsKKzAwMEM0QyBBcmNvciBBRyZDby4KKzAwMEM0RCBBQ1JBIENPTlRST0wKKzAwMEM0RSBXaW5iZXN0IFRlY2hub2xvZ3kgQ08sTFQKKzAwMEM0RiBVRFRlY2ggSmFwYW4gQ29ycG9yYXRpb24KKzAwMEM1MCBTZWFnYXRlIFRlY2hub2xvZ3kKKzAwMEM1MSBTY2llbnRpZmljIFRlY2hub2xvZ2llcyBJbmMuCiswMDBDNTIgUm9sbCBTeXN0ZW1zIEluYy4KKzAwMEM1NCBQZWRlc3RhbCBOZXR3b3JrcywgSW5jCiswMDBDNTUgTWljcm9saW5rIENvbW11bmljYXRpb25zIEluYy4KKzAwMEM1NiBNZWdhdGVsIENvbXB1dGVyICgxOTg2KSBDb3JwLgorMDAwQzU3IE1BQ0tJRSBFbmdpbmVlcmluZyBTZXJ2aWNlcyBCZWxnaXVtIEJWQkEKKzAwMEM1OCBNJlMgU3lzdGVtcworMDAwQzU5IEluZHltZSBFbGVjdHJvbmljcywgSW5jLgorMDAwQzVBIElCU21tIEluZHVzdHJpZWVsZWt0cm9uaWsgTXVsdGltZWRpYQorMDAwQzVCIEhBTldBTkcgVEVDSE5PTE9HWSBDTy4sTFRECiswMDBDNUMgR1ROIFN5c3RlbXMgQi5WLgorMDAwQzVEIENISUMgVEVDSE5PTE9HWSAoQ0hJTkEpIENPUlAuCiswMDBDNUYgQXZ0ZWMsIEluYy4KKzAwMEM2MCBBQ00gU3lzdGVtcworMDAwQzYxIEFDIFRlY2ggY29ycG9yYXRpb24gREJBIEFkdmFuY2VkIERpZ2l0YWwKKzAwMEM2MiBBQkIgQXV0b21hdGlvbiBUZWNobm9sb2d5IFByb2R1Y3RzIEFCLCBDb250cm9sCiswMDBDNjMgWmVuaXRoIEVsZWN0cm9uaWNzIENvcnBvcmF0aW9uCiswMDBDNjQgWDIgTVNBIEdyb3VwCiswMDBDNjUgU3VuaW4gVGVsZWNvbQorMDAwQzY2IFByb250byBOZXR3b3JrcyBJbmMKKzAwMEM2NyBPWU8gRUxFQ1RSSUMgQ08uLExURAorMDAwQzY4IE9hc2lzIFNlbWljb25kdWN0b3IsIEluYy4KKzAwMEM2OSBOYXRpb25hbCBSYWRpbyBBc3Ryb25vbXkgT2JzZXJ2YXRvcnkKKzAwMEM2QSBNQkFSSQorMDAwQzZCIEt1cnogSW5kdXN0cmllLUVsZWt0cm9uaWsgR21iSAorMDAwQzZDIEVsZ2F0byBTeXN0ZW1zIExMQworMDAwQzZEIEJPQyBFZHdhcmRzCiswMDBDNkUgQVNVU1RFSyBDT01QVVRFUiBJTkMuCiswMDBDNkYgQW10ZWsgc3lzdGVtIGNvLixMVEQuCiswMDBDNzAgQUNDIEdtYkgKKzAwMEM3MSBXeWJyb24sIEluYworMDAwQzcyIFRlbXBlYXJsIEluZHVzdHJpYWwgQ28uLCBMdGQuCiswMDBDNzMgVEVMU09OIEVMRUNUUk9OSUNTIENPLiwgTFRECiswMDBDNzQgUklWRVJURUMgQ09SUE9SQVRJT04KKzAwMEM3NSBPcmllbnRhbCBpbnRlZ3JhdGVkIGVsZWN0cm9uaWNzLiBMVEQKKzAwMEM3NiBNSUNSTy1TVEFSIElOVEVSTkFUSU9OQUwgQ08uLCBMVEQuCiswMDBDNzcgTGlmZSBSYWNpbmcgTHRkCiswMDBDNzggSW4tVGVjaCBFbGVjdHJvbmljcyBMaW1pdGVkCiswMDBDNzkgRXh0ZWwgQ29tbXVuaWNhdGlvbnMgUC9MCiswMDBDN0EgRGFUQVJJVVMgVGVjaG5vbG9naWVzIEdtYkgKKzAwMEM3QiBBTFBIQSBQUk9KRUNUIENvLixMdGQuCiswMDBDN0MgSW50ZXJuZXQgSW5mb3JtYXRpb24gSW1hZ2UgSW5jLgorMDAwQzdEIFRFSUtPS1UgRUxFQ1RSSUMgTUZHLiBDTy4sIExURAorMDAwQzdFIFRlbGxpdW0gSW5jb3Jwb3JhdGVkCiswMDBDN0Ygc3luZXJ0cm9uaXh4IEdtYkgKKzAwMEM4MCBPcGVsY29tbSBJbmMuCiswMDBDODEgTnVsZWMgSW5kdXN0cmllcyBQdHkgTHRkCiswMDBDODIgTkVUV09SSyBURUNITk9MT0dJRVMgSU5DCiswMDBDODMgTG9naWNhbCBTb2x1dGlvbnMKKzAwMEM4NCBFYXppeCwgSW5jLgorMDAwQzg1IENpc2NvIFN5c3RlbXMKKzAwMEM4NiBDaXNjbyBTeXN0ZW1zCiswMDBDODcgQVRJCiswMDBDODggQXBhY2hlIE1pY3JvIFBlcmlwaGVyYWxzLCBJbmMuCiswMDBDODkgQUMgRWxlY3RyaWMgVmVoaWNsZXMsIEx0ZC4KKzAwMEM4QSBCb3NlIENvcnBvcmF0aW9uCiswMDBDOEIgQ29ubmVjdCBUZWNoIEluYworMDAwQzhDIEtPRElDT00gQ08uLExURC4KKzAwMEM4RCBNQVRSSVggVklTSU9OIEdtYkgKKzAwMEM4RSBNZW50b3IgRW5naW5lZXJpbmcgSW5jCiswMDBDOEYgTmVyZ2FsIHMuci5sLgorMDAwQzkwIE9jdGFzaWMgSW5jLgorMDAwQzkxIFJpdmVyaGVhZCBOZXR3b3JrcyBJbmMuCiswMDBDOTIgV29sZlZpc2lvbiBHbWJoCiswMDBDOTMgWGVsaW5lIENvLiwgTHRkLgorMDAwQzk0IFVuaXRlZCBFbGVjdHJvbmljIEluZHVzdHJpZXMsIEluYy4KKzAwMEM5NSBQcmltZU5ldAorMDAwQzk2IE9RTywgSW5jLgorMDAwQzk3IE5WIEFEQiBUVFYgVGVjaG5vbG9naWVzIFNBCiswMDBDOTggTEVURUsgQ29tbXVuaWNhdGlvbnMgSW5jLgorMDAwQzk5IEhJVEVMIExJTksgQ28uLEx0ZAorMDAwQzlBIEhpdGVjaCBFbGVjdHJvbmljcyBDb3JwLgorMDAwQzlCIEVFIFNvbHV0aW9ucywgSW5jCiswMDBDOUMgQ2hvbmdobyBpbmZvcm1hdGlvbiAmIGNvbW11bmljYXRpb25zCiswMDBDOUQgQWlyV2FsayBDb21tdW5pY2F0aW9ucywgSW5jLgorMDAwQzlFIE1lbW9yeUxpbmsgQ29ycC4KKzAwMEM5RiBOS0UgQ29ycG9yYXRpb24KKzAwMENBMCBTdG9yQ2FzZSBUZWNobm9sb2d5LCBJbmMuCiswMDBDQTEgU0lHTUFDT00gQ28uLCBMVEQuCiswMDBDQTIgU2NvcHVzIE5ldHdvcmsgVGVjaG5vbG9naWVzIEx0ZAorMDAwQ0EzIFJhbmNobyBUZWNobm9sb2d5LCBJbmMuCiswMDBDQTQgUHJvbXB0dGVjIFByb2R1Y3QgTWFuYWdlbWVudCBHbWJICiswMDBDQTYgTWludGVyYSBDb3Jwb3JhdGlvbgorMDAwQ0E3IE1ldHJvIChTdXpob3UpIFRlY2hub2xvZ2llcyBDby4sIEx0ZC4KKzAwMENBOCBHYXJ1ZGEgTmV0d29ya3MgQ29ycG9yYXRpb24KKzAwMENBOSBFYnRyb24gSW5jLgorMDAwQ0FBIEN1YmljIFRyYW5zcG9ydGF0aW9uIFN5c3RlbXMgSW5jCiswMDBDQUIgQ09NTUVORCBJbnRlcm5hdGlvbmFsCiswMDBDQUMgQ2l0aXplbiBXYXRjaCBDby4sIEx0ZC4KKzAwMENBRCBCVFUgSW50ZXJuYXRpb25hbAorMDAwQ0FFIEFpbG9jb20gT3kKKzAwMENBRiBUUkkgVEVSTSBDTy4sTFRELgorMDAwQ0IwIFN0YXIgU2VtaWNvbmR1Y3RvciBDb3Jwb3JhdGlvbgorMDAwQ0IxIFNhbGxhbmQgRW5naW5lZXJpbmcgKEV1cm9wZSkgQlYKKzAwMENCMiBzYWZlaSBDby4sIEx0ZC4KKzAwMENCMyBST1VORCBDby4sTHRkLgorMDAwQ0I0IFByb3BhZ2F0ZSBOZXR3b3JrcywgSW5jCiswMDBDQjUgUHJlbWllciBUZWNobm9sZ2llcywgSW5jCiswMDBDQjYgTkFOSklORyBTRVUgTU9CSUxFICYgSU5URVJORVQgVEVDSE5PTE9HWSBDTy4sTFRECiswMDBDQjcgTmFuamluZyBIdWF6aHVvIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorMDAwQ0I4IE1FRElPTiBBRworMDAwQ0I5IExFQQorMDAwQ0JBIEphbWV4CiswMDBDQkIgSVNLUkFFTUVDTworMDAwQ0JDIElzY3V0dW0KKzAwMENCRCBJbnRlcmZhY2UgTWFzdGVycywgSW5jCiswMDBDQkYgSG9seSBTdG9uZSBFbnQuIENvLiwgTHRkLgorMDAwQ0MwIEdlbmVyYSBPeQorMDAwQ0MxIENvb3BlciBJbmR1c3RyaWVzIEluYy4KKzAwMENDMyBCZVdBTiBzeXN0ZW1zCiswMDBDQzQgVGlwdGVsIEFHCiswMDBDQzUgTmV4dGxpbmsgQ28uLCBMdGQuCiswMDBDQzYgS2EtUm8gZWxlY3Ryb25pY3MgR21iSAorMDAwQ0M3IEludGVsbGlnZW50IENvbXB1dGVyIFNvbHV0aW9ucyBJbmMuCiswMDBDQzggSW50ZWdyYXRlZCBEaWdpdGFsIFN5c3RlbXMsIEluYy4KKzAwMENDOSBJTFdPTyBEQVRBICYgVEVDSE5PTE9HWSBDTy4sTFRECiswMDBDQ0EgSGl0YWNoaSBHbG9iYWwgU3RvcmFnZSBUZWNobm9sb2dpZXMKKzAwMENDQiBEZXNpZ24gQ29tYnVzIEx0ZAorMDAwQ0NDIEJsdWVzb2Z0IEx0ZC4KKzAwMENDRCBJRUMgLSBUQzU3CiswMDBDQ0UgQ2lzY28gU3lzdGVtcworMDAwQ0NGIENpc2NvIFN5c3RlbXMKKzAwMENEMCBTeW1ldHJpeAorMDAwQ0QxIFNGT00gVGVjaG5vbG9neSBDb3JwLgorMDAwQ0QyIFNjaGFmZm5lciBFTVYgQUcKKzAwMENEMyBQcmV0dGwgRWxla3Ryb25payBSYWRlYmVyZyBHbWJICiswMDBDRDQgUG9zaXRyb24gUHVibGljIFNhZmV0eSBTeXN0ZW1zIGluYy4KKzAwMENENSBQYXNzYXZlIEluYy4KKzAwMENENiBQQVJUTkVSIFRFQ0gKKzAwMENENyBOYWxsYXRlY2ggTHRkCiswMDBDRDggTS4gSy4gSnVjaGhlaW0gR21iSCAmIENvCiswMDBDRDkgSXRjYXJlIENvLiwgTHRkCiswMDBDREEgRnJlZUhhbmQgU3lzdGVtcywgSW5jLgorMDAwQ0RCIEZvdW5kcnkgTmV0d29ya3MKKzAwMENEQyBCRUNTIFRlY2hub2xvZ3ksIEluYworMDAwQ0REIEFPUyBUZWNobm9sb2dpZXMgQUcKKzAwMENERSBBQkIgU1RPVFotS09OVEFLVCBHbWJICiswMDBDREYgUFVMTmlYIEFtZXJpY2EsIEluYworMDAwQ0UwIFRyZWsgRGlhZ25vc3RpY3MgSW5jLgorMDAwQ0UxIFRoZSBPcGVuIEdyb3VwCiswMDBDRTIgUm9sbHMtUm95Y2UKKzAwMENFMyBPcHRpb24gSW50ZXJuYXRpb25hbCBOLlYuCiswMDBDRTQgTmV1cm9Db20gSW50ZXJuYXRpb25hbCwgSW5jLgorMDAwQ0U1IE1vdG9yb2xhIEJDUworMDAwQ0U2IE1lcnUgTmV0d29ya3MgSW5jCiswMDBDRTcgTWVkaWFUZWsgSW5jLgorMDAwQ0U4IEd1YW5nWmhvdSBBbkp1QmFvIENvLiwgTHRkCiswMDBDRTkgQkxPT01CRVJHIEwuUC4KKzAwMENFQSBhcGhvbmEgS29tbXVuaWthdGlvbnNzeXN0ZW1lCiswMDBDRUIgQ05NUCBOZXR3b3JrcywgSW5jLgorMDAwQ0VDIFNwZWN0cmFjb20gQ29ycC4KKzAwMENFRCBSZWFsIERpZ2l0YWwgTWVkaWEKKzAwMENFRSBRLU5ldHdvcmtzCiswMDBDRUYgT3BlbiBOZXR3b3JrcyBFbmdpbmVlcmluZyBMdGQKKzAwMENGMCBNICYgTiBHbWJICiswMDBDRjEgSW50ZWwgQ29ycG9yYXRpb24KKzAwMENGMiBHQU1FU0EgRdNMSUNBCiswMDBDRjMgQ0FMTCBJTUFHRSBTQQorMDAwQ0Y0IEFLQVRTVUtJIEVMRUNUUklDIE1GRy5DTy4sTFRELgorMDAwQ0Y1IEluZm9FeHByZXNzCiswMDBDRjYgU2l0ZWNvbSBFdXJvcGUgQlYKKzAwMENGNyBOb3J0ZWwgTmV0d29ya3MKKzAwMENGOCBOb3J0ZWwgTmV0d29ya3MKKzAwMENGOSBJVFQgRmx5Z3QgQUIKKzAwMENGQSBEaWdpdGFsIFN5c3RlbXMgQ29ycAorMDAwQ0ZCIEtvcmVhIE5ldHdvcmsgU3lzdGVtcworMDAwQ0ZDIFMyaW8gVGVjaG5vbG9naWVzIENvcnAKKzAwMENGRSBHcmFuZCBFbGVjdHJvbmljIENvLiwgTHRkCiswMDBDRkYgTVJPLVRFSyBMSU1JVEVECiswMDBEMDAgU2Vhd2F5IE5ldHdvcmtzIEluYy4KKzAwMEQwMSBQJkUgTWljcm9jb21wdXRlciBTeXN0ZW1zLCBJbmMuCiswMDBEMDIgTkVDIEFjY2VzcyBUZWNobmljYSxMdGQKKzAwMEQwMyBNYXRyaWNzLCBJbmMuCiswMDBEMDQgRm94Ym9ybyBFY2thcmR0IERldmVsb3BtZW50IEdtYkgKKzAwMEQwNSBjeWJlcm5ldCBtYW51ZmFjdHVyaW5nIGluYy4KKzAwMEQwNiBDb21wdWxvZ2ljIExpbWl0ZWQKKzAwMEQwNyBDYWxyZWMgQXVkaW8gTHRkCiswMDBEMDggQWJvdmVDYWJsZSwgSW5jLgorMDAwRDA5IFl1ZWh1YShaaHVoYWkpIEVsZWN0cm9uaWMgQ08uIExURAorMDAwRDBBIFByb2plY3Rpb25kZXNpZ24gYXMKKzAwMEQwQiBNZWxjbyBJbmMuCiswMDBEMEMgTURJIFNlY3VyaXR5IFN5c3RlbXMKKzAwMEQwRCBJVFN1cHBvcnRlZCwgTExDCiswMDBEMEUgSW5xbmV0IFN5c3RlbXMsIEluYy4KKzAwMEQwRiBGaW5sdXggTHRkCiswMDBEMTAgRW1iZWR0cm9uaWNzIE95CiswMDBEMTEgREVOVFNQTFkgLSBHZW5kZXgKKzAwMEQxMiBBWEVMTCBDb3Jwb3JhdGlvbgorMDAwRDEzIFdpbGhlbG0gUnV0ZW5iZWNrIEdtYkgmQ28uCiswMDBEMTQgVnRlY2ggSW5ub3ZhdGlvbiBMUCBkYmEgQWR2YW5jZWQgQW1lcmljYW4gVGVsZXBob25lcworMDAwRDE1IFZvaXBhYyBzLnIuby4KKzAwMEQxNiBVSFMgU3lzdGVtcyBQdHkgTHRkCiswMDBEMTcgVHVyYm8gTmV0d29ya3MgQ28uTHRkCiswMDBEMTggU3VuaXRlYyBFbnRlcnByaXNlIENvLiwgTHRkLgorMDAwRDE5IFJPQkUgU2hvdyBsaWdodGluZworMDAwRDFBIE11c3RlayBTeXN0ZW0gSW5jLgorMDAwRDFCIEt5b3RvIEVsZWN0cm9uaWNzIE1hbnVmYWN0dXJpbmcgQ28uLCBMdGQuCiswMDBEMUMgSTJFIFRFTEVDT00KKzAwMEQxRCBISUdILVRFSyBIQVJORVNTIEVOVC4gQ08uLCBMVEQuCiswMDBEMUUgQ29udHJvbCBUZWNobmlxdWVzCiswMDBEMUYgQVYgRGlnaXRhbAorMDAwRDIwIEFTQUhJS0FTRUkgVEVDSE5PU1lTVEVNIENPLixMVEQuCiswMDBEMjEgV0lTQ09SRSBJbmMuCiswMDBEMjIgVW5pdHJvbmljcworMDAwRDIzIFNtYXJ0IFNvbHV0aW9uLCBJbmMKKzAwMEQyNCBTRU5URUMgRSZFIENPLiwgTFRELgorMDAwRDI1IFNBTkRFTiBDT1JQT1JBVElPTgorMDAwRDI2IFByaW1hZ3JhcGhpY3MgTGltaXRlZAorMDAwRDI3IE1JQ1JPUExFWCBQcmludHdhcmUgQUcKKzAwMEQyOCBDaXNjbworMDAwRDI5IENpc2NvCiswMDBEMkEgU2Nhbm1hdGljIEFTCiswMDBEMkIgUmFjYWwgSW5zdHJ1bWVudHMKKzAwMEQyQyBQYXRhcHNjbyBEZXNpZ25zIEx0ZAorMDAwRDJEIE5DVCBEZXV0c2NobGFuZCBHbWJICiswMDBEMkUgTWF0c3VzaGl0YSBBdmlvbmljcyBTeXN0ZW1zIENvcnBvcmF0aW9uCiswMDBEMkYgQUlOIENvbW0uVGVjaC5Dby4sIExURAorMDAwRDMwIEljZUZ5cmUgU2VtaWNvbmR1Y3RvcgorMDAwRDMxIENvbXBlbGxlbnQgVGVjaG5vbG9naWVzLCBJbmMuCiswMDBEMzIgRGlzcGVuc2VTb3VyY2UsIEluYy4KKzAwMEQzMyBQcmVkaXdhdmUgQ29ycC4KKzAwMEQzNCBTaGVsbCBJbnRlcm5hdGlvbmFsIEV4cGxvcmF0aW9uIGFuZCBQcm9kdWN0aW9uLCBJbmMuCiswMDBEMzUgUEFDIEludGVybmF0aW9uYWwgTHRkCiswMDBEMzYgV3UgSGFuIFJvdXRvbiBFbGVjdHJvbmljIENvLiwgTHRkCiswMDBEMzcgV0lQTFVHCiswMDBEMzggTklTU0lOIElOQy4KKzAwMEQzOSBOZXR3b3JrIEVsZWN0cm9uaWNzCiswMDBEM0EgTWljcm9zb2Z0IENvcnAuCiswMDBEM0IgTWljcm9lbGVjdHJvbmljcyBUZWNobm9sb2d5IEluYy4KKzAwMEQzQyBpLlRlY2ggRHluYW1pYyBMdGQKKzAwMEQzRSBBUExVWCBDb21tdW5pY2F0aW9ucyBMdGQuCiswMDBEM0YgVlhJIFRlY2hub2xvZ3kKKzAwMEQ0MCBWZXJpbnQgTG9yb25peCBWaWRlbyBTb2x1dGlvbnMKKzAwMEQ0MSBTaWVtZW5zIEFHIElDTSBNUCBVQyBSRCBJVCBLTEYxCiswMDBENDIgTmV3YmVzdCBEZXZlbG9wbWVudCBMaW1pdGVkCiswMDBENDMgRFJTIFRhY3RpY2FsIFN5c3RlbXMgSW5jLgorMDAwRDQ1IFRvdHRvcmkgU0FOWU8gRWxlY3RyaWMgQ28uLCBMdGQuCiswMDBENDYgRXVyb3RoZXJtIERyaXZlcywgTHRkLgorMDAwRDQ3IENvbGxleAorMDAwRDQ4IEFFV0lOIFRlY2hub2xvZ2llcyBDby4sIEx0ZC4KKzAwMEQ0OSBUcml0b24gU3lzdGVtcyBvZiBEZWxhd2FyZSwgSW5jLgorMDAwRDRBIFN0ZWFnIEVUQS1PcHRpaworMDAwRDRCIFJva3UsIExMQworMDAwRDRDIE91dGxpbmUgRWxlY3Ryb25pY3MgTHRkLgorMDAwRDREIE5pbmVsYW5lcworMDAwRDRFIE5EUiBDby4sTFRELgorMDAwRDRGIEtlbndvb2QgQ29ycG9yYXRpb24KKzAwMEQ1MCBHYWxhemFyIE5ldHdvcmtzCiswMDBENTEgRElWUiBTeXN0ZW1zLCBJbmMuCiswMDBENTIgQ29tYXJ0IHN5c3RlbQorMDAwRDUzIEJlaWppbmcgNXcgQ29tbXVuaWNhdGlvbiBDb3JwLgorMDAwRDU0IDNDb20gRXVyb3BlIEx0ZAorMDAwRDU1IFNBTllDT00gVGVjaG5vbG9neSBDby4sTHRkCiswMDBENTYgRGVsbCBQQ0JBIFRlc3QKKzAwMEQ1NyBGdWppdHN1IEktTmV0d29yayBTeXN0ZW1zIExpbWl0ZWQuCiswMDBENTkgQW1pdHkgU3lzdGVtcywgSW5jLgorMDAwRDVBIFRpZXNzZSBTcEEKKzAwMEQ1QiBTbWFydCBFbXBpcmUgSW52ZXN0bWVudHMgTGltaXRlZAorMDAwRDVDIFJvYmVydCBCb3NjaCBHbWJILCBWVC1BVE1PCiswMDBENUQgUmFyaXRhbiBDb21wdXRlciwgSW5jCiswMDBENUUgTkVDIEN1c3RvbVRlY2huaWNhLCBMdGQuCiswMDBENUYgTWluZHMgSW5jCiswMDBENjAgSUJNIENvcnBvcmF0aW9uCiswMDBENjEgR2lnYS1CeXRlIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDBENjIgRnVua3dlcmsgRGFiZW5kb3JmIEdtYkgKKzAwMEQ2MyBERU5UIEluc3RydW1lbnRzLCBJbmMuCiswMDBENjQgQ09NQUcgSGFuZGVscyBBRworMDAwRDY1IENpc2NvIFN5c3RlbXMKKzAwMEQ2NiBDaXNjbyBTeXN0ZW1zCiswMDBENjcgQmVsQWlyIE5ldHdvcmtzIEluYy4KKzAwMEQ2OCBWaW5jaSBTeXN0ZW1zLCBJbmMuCiswMDBENjkgVE1UJkQgQ29ycG9yYXRpb24KKzAwMEQ2QSBSZWR3b29kIFRlY2hub2xvZ2llcyBMVEQKKzAwMEQ2QiBNaXRhLVRla25payBBL1MKKzAwMEQ2QyBNLUF1ZGlvCiswMDBENkQgSy1UZWNoIERldmljZXMgQ29ycC4KKzAwMEQ2RSBLLVBhdGVudHMgT3kKKzAwMEQ2RiBFbWJlciBDb3Jwb3JhdGlvbgorMDAwRDcwIERhdGFtYXggQ29ycG9yYXRpb24KKzAwMEQ3MSBib2NhIHN5c3RlbXMKKzAwMEQ3MiAyV2lyZSwgSW5jCiswMDBENzMgVGVjaG5pY2FsIFN1cHBvcnQsIEluYy4KKzAwMEQ3NCBTYW5kIE5ldHdvcmsgU3lzdGVtcywgSW5jLgorMDAwRDc1IEtvYmlhbiBQdGUgTHRkIC0gVGFpd2FuIEJyYW5jaAorMDAwRDc2IEhva3V0byBEZW5zaGkgQ28sLiBMdGQuCiswMDBENzcgRmFsY29uU3RvciBTb2Z0d2FyZQorMDAwRDc4IEVuZ2luZWVyaW5nICYgU2VjdXJpdHkKKzAwMEQ3OSBEeW5hbWljIFNvbHV0aW9ucyBDbywuTHRkLgorMDAwRDdBIERpR0FUVE8gQXNpYSBQYWNpZmljIFB0ZSBMdGQKKzAwMEQ3QiBDb25zZW5zeXMgQ29tcHV0ZXJzIEluYy4KKzAwMEQ3QyBDb2RpYW4gTHRkCiswMDBEN0QgQWZjbyBTeXN0ZW1zCiswMDBEN0UgQXhpb3dhdmUgTmV0d29ya3MsIEluYy4KKzAwMEQ3RiBNSURBUyAgQ09NTVVOSUNBVElPTiBURUNITk9MT0dJRVMgUFRFIExURCAoIEZvcmVpZ24gQnJhbmNoKQorMDAwRDgwIE9ubGluZSBEZXZlbG9wbWVudCBJbmMKKzAwMEQ4MSBQZXBwZXJsK0Z1Y2hzIEdtYkgKKzAwMEQ4MiBQSFMgc3JsCiswMDBEODMgU2FubWluYS1TQ0kgSHVuZ2FyeSAgTHRkLgorMDAwRDg0IFNlb2R1IEluY2hpcCwgSW5jLgorMDAwRDg1IFRhcHdhdmUsIEluYy4KKzAwMEQ4NiBIdWJlciArIFN1aG5lciBBRworMDAwRDg3IEVsaXRlZ3JvdXAgQ29tcHV0ZXIgU3lzdGVtIENvLiAoRUNTKQorMDAwRDg4IEQtTGluayBDb3Jwb3JhdGlvbgorMDAwRDg5IEJpbHMgVGVjaG5vbG9neSBJbmMKKzAwMEQ4QSBXaW5uZXJzIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorMDAwRDhCIFQmRCBDb3Jwb3JhdGlvbgorMDAwRDhDIFNoYW5naGFpIFdlZG9uZSBEaWdpdGFsIEx0ZC4gQ08uCiswMDBEOEQgUHJvTGlueCBDb21tdW5pY2F0aW9uIEdhdGV3YXlzLCBJbmMuCiswMDBEOEUgS29kZW4gRWxlY3Ryb25pY3MgQ28uLCBMdGQuCiswMDBEOEYgS2luZyBUc3VzaGluIEtvZ3lvIENvLiwgTFRELgorMDAwRDkwIEZhY3R1bSBFbGVjdHJvbmljcyBBQgorMDAwRDkxIEVjbGlwc2UgKEhRIEVzcGFuYSkgUy5MLgorMDAwRDkyIEFyaW1hIENvbW11bmljYXRpb24gQ29ycG9yYXRpb24KKzAwMEQ5MyBBcHBsZSBDb21wdXRlcgorMDAwRDk0IEFGQVIgQ29tbXVuaWNhdGlvbnMsSW5jCiswMDBEOTYgVnRlcmEgVGVjaG5vbG9neSBJbmMuCiswMDBEOTcgVHJvcG9zIE5ldHdvcmtzLCBJbmMuCiswMDBEOTggUy5XLkEuQy4gU2NobWl0dC1XYWx0ZXIgQXV0b21hdGlvbiBDb25zdWx0IEdtYkgKKzAwMEQ5OSBPcmJpdGFsIFNjaWVuY2VzIENvcnAuOyBMYXVuY2ggU3lzdGVtcyBHcm91cAorMDAwRDlBIElORk9URUMgTFRECiswMDBEOUMgRWxhbiBHbWJIICYgQ28gS0cKKzAwMEQ5RCBIZXdsZXR0IFBhY2thcmQKKzAwMEQ5RSBUT0tVREVOIE9ISVpVTUkgU0VJU0FLVVNZTyBDby4sTHRkLgorMDAwRDlGIFJGIE1pY3JvIERldmljZXMKKzAwMERBMCBORURBUCBOLlYuCiswMDBEQTEgTUlSQUUgSVRTIENvLixMVEQuCiswMDBEQTIgSW5mcmFudCBUZWNobm9sb2dpZXMsIEluYy4KKzAwMERBMyBFbWVyZ2luZyBUZWNobm9sb2dpZXMgTGltaXRlZAorMDAwREE0IERPU0NIICYgQU1BTkQgU1lTVEVNUyBBRworMDAwREE1IEZhYnJpYzcgU3lzdGVtcywgSW5jCiswMDBEQTYgVW5pdmVyc2FsIFN3aXRjaGluZyBDb3Jwb3JhdGlvbgorMDAwREE4IFRlbGV0cm9uaWNzIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKzAwMERBOSBULkUuQS5NLiBTLkwuCiswMDBEQUEgUy5BLlRlaG5vbG9neSBjby4sTHRkLgorMDAwREFCIFBhcmtlciBIYW5uaWZpbiBHbWJIIEVsZWN0cm9tZWNoYW5pY2FsIERpdmlzaW9uIEV1cm9wZQorMDAwREFDIEphcGFuIENCTSBDb3Jwb3JhdGlvbgorMDAwREFEIERhdGFwcm9iZSBJbmMKKzAwMERBRSBTQU1TVU5HIEhFQVZZIElORFVTVFJJRVMgQ08uLCBMVEQuCiswMDBEQUYgUGxleHVzIENvcnAgKFVLKSBMdGQKKzAwMERCMCBPbHltLXRlY2ggQ28uLEx0ZC4KKzAwMERCMSBKYXBhbiBOZXR3b3JrIFNlcnZpY2UgQ28uLCBMdGQuCiswMDBEQjIgQW1tYXNzbywgSW5jLgorMDAwREIzIFNETyBDb21tdW5pY2F0aW9uIENvcnBlcmF0aW9uCiswMDBEQjQgTkVUQVNRCiswMDBEQjUgR0xPQkFMU0FUIFRFQ0hOT0xPR1kgQ09SUE9SQVRJT04KKzAwMERCNiBUZWtub3Z1cywgSW5jLgorMDAwREI3IFNBTktPIEVMRUNUUklDIENPLC5MVEQKKzAwMERCOCBTQ0hJTExFUiBBRworMDAwREI5IFBDIEVuZ2luZXMgR21iSAorMDAwREJBIE9j6SBEb2N1bWVudCBUZWNobm9sb2dpZXMgR21iSAorMDAwREJCIE5pcHBvbiBEZW50c3UgQ28uLEx0ZC4KKzAwMERCQyBDaXNjbyBTeXN0ZW1zCiswMDBEQkQgQ2lzY28gU3lzdGVtcworMDAwREJFIEJlbCBGdXNlIEV1cm9wZSBMdGQuLFVLCiswMDBEQkYgVGVrVG9uZSBTb3VuZCAmIFNpZ25hbCBNZmcuLCBJbmMuCiswMDBEQzAgU3BhZ2F0IEFTCiswMDBEQzEgU2FmZVdlYiBJbmMKKzAwMERDMyBGaXJzdCBDb21tdW5pY2F0aW9uLCBJbmMuCiswMDBEQzQgRW1jb3JlIENvcnBvcmF0aW9uCiswMDBEQzUgRWNob1N0YXIgSW50ZXJuYXRpb25hbCBDb3Jwb3JhdGlvbgorMDAwREM2IERpZ2lSb3NlIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDBEQzcgQ09TTUlDIEVOR0lORUVSSU5HIElOQy4KKzAwMERDOCBBaXJNYWduZXQsIEluYworMDAwREM5IFRIQUxFUyBFbGVrdHJvbmlrIFN5c3RlbWUgR21iSAorMDAwRENBIFRhaXQgRWxlY3Ryb25pY3MKKzAwMERDQiBQZXRjb21rb3JlYSBDby4sIEx0ZC4KKzAwMERDQyBORU9TTUFSVCBDb3JwLgorMDAwRENEIEdST1VQRSBUWENPTQorMDAwRENFIER5bmF2YWMgVGVjaG5vbG9neSBQdGUgTHRkCiswMDBEQ0YgQ2lkcmEgQ29ycC4KKzAwMEREMCBUZXRyYVRlYyBJbnN0cnVtZW50cyBHbWJICiswMDBERDEgU3RyeWtlciBDb3Jwb3JhdGlvbgorMDAwREQyIFNpbXJhZCBPcHRyb25pY3MgQVNBCiswMDBERDMgU0FNV09PIFRlbGVjb21tdW5pY2F0aW9uIENvLixMdGQuCiswMDBERDQgUmV2aXZpbyBJbmMuCiswMDBERDUgTydSSVRFIFRFQ0hOT0xPR1kgQ08uLExURAorMDAwREQ3IEJyaWdodAorMDAwREQ4IEJCTgorMDAwREQ5IEFudG9uIFBhYXIgR21iSAorMDAwRERBIEFMTElFRCBURUxFU0lTIEsuSy4KKzAwMEREQiBBSVJXQVZFIFRFQ0hOT0xPR0lFUyBJTkMuCiswMDBEREMgVkFDCiswMDBEREQgUFJPRt1MTyBURUxSQSBFTEVLVFJPTt1LIFNBTkFZ3SBWRSBU3UNBUkVUIEEu3i4KKzAwMERERSBKb3l0ZWNrIENvLiwgTHRkLgorMDAwRERGIEphcGFuIEltYWdlICYgTmV0d29yayBJbmMuCiswMDBERTAgSUNQREFTIENvLixMVEQKKzAwMERFMSBDb250cm9sIFByb2R1Y3RzLCBJbmMuCiswMDBERTIgQ01aIFNpc3RlbWkgRWxldHRyb25pY2kKKzAwMERFMyBBVCBTd2VkZW4gQUIKKzAwMERFNCBESUdJTklDUywgSW5jLgorMDAwREU1IFNhbXN1bmcgVGhhbGVzCiswMDBERTYgWU9VTkdCTyBFTkdJTkVFUklORyBDTy4sTFRECiswMDBERTcgU25hcC1vbiBPRU0gR3JvdXAKKzAwMERFOCBOYXNhY28gRWxlY3Ryb25pY3MgUHRlLiBMdGQKKzAwMERFOSBOYXBhdGVjaCBBcHMKKzAwMERFQSBLaW5ndGVsIFRlbGVjb21tdW5pY2F0aW9uIENvcnAuCiswMDBERUIgQ29tcFhzIExpbWl0ZWQKKzAwMERFQyBDaXNjbyBTeXN0ZW1zCiswMDBERUQgQ2lzY28gU3lzdGVtcworMDAwREVGIFNvYy4gQ29vcC4gQmlsYW5jaWFpCiswMDBERjAgUUNPTSBURUNITk9MT0dZIElOQy4KKzAwMERGMSBJT05JWCBJTkMuCiswMDBERjMgQXNtYXggU29sdXRpb25zCiswMDBERjQgV2F0ZXJ0ZWsgQ28uCiswMDBERjUgVGVsZXRyb25pY3MgSW50ZXJuYXRpb25hbCBJbmMuCiswMDBERjYgVGVjaG5vbG9neSBUaGVzYXVydXMgQ29ycC4KKzAwMERGNyBTcGFjZSBEeW5hbWljcyBMYWIKKzAwMERGOCBPUkdBIEthcnRlbnN5c3RlbWUgR21iSAorMDAwREY5IE5EUyBMaW1pdGVkCiswMDBERkEgTWljcm8gQ29udHJvbCBTeXN0ZW1zIEx0ZC4KKzAwMERGQiBLb21heCBBRworMDAwREZDIElURk9SIEluYy4gcmVzYXJjaCBhbmQgZGV2ZWxvcG1lbnQKKzAwMERGRCBIdWdlcyBIaS1UZWNoIEluYy4sCiswMDBERkUgSGF1cHBhdWdlIENvbXB1dGVyIFdvcmtzLCBJbmMuCiswMDBERkYgQ0hFTk1JTkcgTU9MRCBJTkRVU1RSWSBDT1JQLgorMDAwRTAxIEFTSVAgVGVjaG5vbG9naWVzIEluYy4KKzAwMEUwMiBBZHZhbnRlY2ggQU1UIEluYy4KKzAwMEUwMyBBYXJvaGkgQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMEUwNSBXSVJFTEVTUyBNQVRSSVggQ09SUC4KKzAwMEUwNiBUZWFtIFNpbW9jbyBMdGQKKzAwMEUwNyBTb255IEVyaWNzc29uIE1vYmlsZSBDb21tdW5pY2F0aW9ucyBBQgorMDAwRTA4IFNpcHVyYSBUZWNobm9sb2d5LCBJbmMuCiswMDBFMDkgU2hlbnpoZW4gQ29zaGlwIFNvZnR3YXJlIENvLixMVEQuCiswMDBFMEIgTmV0YWMgVGVjaG5vbG9neSBDby4sIEx0ZC4KKzAwMEUwQyBJbnRlbCBDb3Jwb3JhdGlvbgorMDAwRTBEIEhFU0NIIFNjaHL2ZGVyIEdtYkgKKzAwMEUwRSBFU0EgZWxldHRyb25pY2EgUy5QLkEuCiswMDBFMEYgRVJNTUUKKzAwMEUxMSBCRFQgQvxyby0gdW5kIERhdGVudGVjaG5payBHbWJIICYgQ28uIEtHCiswMDBFMTIgQWRhcHRpdmUgTWljcm8gU3lzdGVtcyBJbmMuCiswMDBFMTMgQWNjdS1Tb3J0IFN5c3RlbXMgaW5jLgorMDAwRTE0IFZpc2lvbmFyeSBTb2x1dGlvbnMsIEluYy4KKzAwMEUxNSBUYWRseXMgTFRECiswMDBFMTYgU291dGhXaW5nCiswMDBFMTggTXlBIFRlY2hub2xvZ3kKKzAwMEUxOSBMb2dpY2FDTUcgUHR5IEx0ZAorMDAwRTFCIElBViBHbWJICiswMDBFMUMgSGFjaCBDb21wYW55CiswMDBFMUYgVENMIE5ldHdvcmtzIEVxdWlwbWVudCBDby4sIEx0ZC4KKzAwMEUyMCBQYWxtU291cmNlLCBJbmMuCiswMDBFMjEgTVRVIEZyaWVkcmljaHNoYWZlbiBHbWJICiswMDBFMjMgSW5jaXBpZW50LCBJbmMuCiswMDBFMjUgSGFubmFlIFRlY2hub2xvZ3kgQ28uLCBMdGQKKzAwMEUyNiBHaW5jb20gVGVjaG5vbG9neSBDb3JwLgorMDAwRTI3IENyZXJlIE5ldHdvcmtzLCBJbmMuCiswMDBFMjggRHluYW1pYyBSYXRpbmdzIFAvTAorMDAwRTI5IFNoZXN0ZXIgQ29tbXVuaWNhdGlvbnMgSW5jCiswMDBFMkIgU2FmYXJpIFRlY2hub2xvZ2llcworMDAwRTJDIE5ldGNvZGVjIGNvLgorMDAwRTJEIEh5dW5kYWkgRGlnaXRhbCBUZWNobm9sb2d5IENvLixMdGQuCiswMDBFMkUgRWRpbWF4IFRlY2hub2xvZ3kgQ28uLCBMdGQuCiswMDBFMkYgRGlzZXRyb25pYyBNZWRpY2FsIFN5c3RlbXMgQUcKKzAwMEUzMCBBRVJBUyBOZXR3b3JrcywgSW5jLgorMDAwRTMxIE9seW1wdXMgQmlvU3lzdGVtcyBHbWJICiswMDBFMzIgS29udHJvbiBNZWRpY2FsCiswMDBFMzMgU2h1a28gRWxlY3Ryb25pY3MgQ28uLEx0ZAorMDAwRTM0IE5leHhHZW5DaXR5CiswMDBFMzUgSW50ZWwgQ29ycAorMDAwRTM2IEhFSU5FU1lTLCBJbmMuCiswMDBFMzcgSGFybXMgJiBXZW5kZSBHbWJIICYgQ28uS0cKKzAwMEUzOCBDaXNjbyBTeXN0ZW1zCiswMDBFMzkgQ2lzY28gU3lzdGVtcworMDAwRTNBIENpcnJ1cyBMb2dpYworMDAwRTNCIEhhd2tpbmcgVGVjaG5vbG9naWVzLCBJbmMuCiswMDBFM0MgVHJhbnNBY3QgVGVjaG5vbG9pZ2VzIEluYy4KKzAwMEUzRCBUZWxldmljIE4uVi4KKzAwMEUzRSBTdW4gT3B0cm9uaWNzIEluYworMDAwRTNGIFNvcm9udGksIEluYy4KKzAwMEU0MCBOb3J0ZWwgTmV0d29ya3MKKzAwMEU0MSBOSUhPTiBNRUNIQVRST05JQ1MgQ08uLExURC4KKzAwMEU0MiBNb3RpYyBJbmNvcG9yYXRpb24gTHRkLgorMDAwRTQzIEctVGVrIEVsZWN0cm9uaWNzIFNkbi4gQmhkLgorMDAwRTQ0IERpZ2l0YWwgNSwgSW5jLgorMDAwRTQ1IEJlaWppbmcgTmV3dHJ5IEVsZWN0cm9uaWMgVGVjaG5vbG9neSBMdGQKKzAwMEU0NiBOaWlnYXRhIFNlaW1pdHN1IENvLixMdGQuCiswMDBFNDcgTkNJIFN5c3RlbSBDby4sTHRkLgorMDAwRTQ4IExpcG1hbiBUcmFuc0FjdGlvbiBTb2x1dGlvbnMKKzAwMEU0OSBGb3Jzd2F5IFNjYW5kaW5hdmlhIEFCCiswMDBFNEEgQ2hhbmdjaHVuIEh1YXl1IFdFQlBBRCBDby4sTFRECiswMDBFNEIgYXRyaXVtIGMgYW5kIGkKKzAwMEU0QyBCZXJtYWkgSW5jLgorMDAwRTREIE51bWVzYSBJbmMuCiswMDBFNEUgV2F2ZXBsdXMgVGVjaG5vbG9neSBDby4sIEx0ZC4KKzAwMEU0RiBUcmFqZXQgR21iSAorMDAwRTUwIFRob21zb24gTXVsdGkgTWVkaWEKKzAwMEU1MSB0ZWNuYSBlbGV0dHJvbmljYSBzcmwKKzAwMEU1MiBPcHRpdW0gQ29ycG9yYXRpb24KKzAwMEU1MyBBViBURUNIIENPUlBPUkFUSU9OCiswMDBFNTQgQWxwaGFDZWxsIFdpcmVsZXNzIEx0ZC4KKzAwMEU1NSBBVVZJVFJBTgorMDAwRTU2IDRHIFN5c3RlbXMgR21iSAorMDAwRTU3IEl3b3JsZCBOZXR3b3JraW5nLCBJbmMuCiswMDBFNTggUmluY29uIE5ldHdvcmtzCiswMDBFNUEgVEVMRUZJRUxEIGluYy4KKzAwMEU1QiBQYXJrZXJWaXNpb24gLSBEaXJlY3QyRGF0YQorMDAwRTVDIE1vdG9yb2xhIEJDUworMDAwRTVEIENvbS1YIE5ldHdvcmtzCiswMDBFNUUgQmVpamluZyBSYWlzZWNvbSBTY2llbmNlICYgVGVjaG5vbG9neSBEZXZlbG9wbWVudCBDby4sTHRkCiswMDBFNUYgYWN0aXYtbmV0IEdtYkggJiBDby4gS0cKKzAwMEU2MCAzNjBTVU4gRGlnaXRhbCBCcm9hZGJhbmQgQ29ycG9yYXRpb24KKzAwMEU2MSBNSUNST1RST0wgTElNSVRFRAorMDAwRTYyIE5vcnRlbCBOZXR3b3JrcworMDAwRTYzIExlbWtlIERpYWdub3N0aWNzIEdtYkgKKzAwMEU2NCBFbHBoZWwsIEluYworMDAwRTY1IFRyYW5zQ29yZQorMDAwRTY2IEhpdGFjaGkgQWR2YW5jZWQgRGlnaXRhbCwgSW5jLgorMDAwRTY3IEVsdGlzIE1pY3JvZWxlY3Ryb25pY3MgTHRkLgorMDAwRTY4IEUtVE9QIE5ldHdvcmsgVGVjaG5vbG9neSBJbmMuCiswMDBFNjkgQ2hpbmEgRWxlY3RyaWMgUG93ZXIgUmVzZWFyY2ggSW5zdGl0dXRlCiswMDBFNkEgM0NPTSBFVVJPUEUgTFRECiswMDBFNkIgSmFuaXR6YSBlbGVjdHJvbmljcyBHbWJICiswMDBFNkMgRGV2aWNlIERyaXZlcnMgTGltaXRlZAorMDAwRTZEIE11cmF0YSBNYW51ZmFjdHVyaW5nIENvLiwgTHRkLgorMDAwRTZFIE1JQ1JFTEVDICBFTEVDVFJPTklDUyBTLkEKKzAwMEU2RiBJUklTIENvcnBvcmF0aW9uIEJlcmhhZAorMDAwRTcwIGluMiBOZXR3b3JrcworMDAwRTcxIEdlbXN0YXIgVGVjaG5vbG9neSBEZXZlbG9wbWVudCBMdGQuCiswMDBFNzIgQ1RTIGVsZWN0cm9uaWNzCiswMDBFNzMgVHBhY2sgQS9TCiswMDBFNzQgU29sYXIgVGVsZWNvbS4gVGVjaAorMDAwRTc1IE5ldyBZb3JrIEFpciBCcmFrZSBDb3JwLgorMDAwRTc2IEdFTVNPQyBJTk5PVklTSU9OIElOQy4KKzAwMEU3NyBEZWNydSwgSW5jLgorMDAwRTc4IEFtdGVsY28KKzAwMEU3OSBBbXBsZSBDb21tdW5pY2F0aW9ucyBJbmMuCiswMDBFN0IgVG9zaGliYQorMDAwRTdEIEVsZWN0cm9uaWNzIExpbmUgMzAwMCBMdGQuCiswMDBFN0UgQ29tcHJvZyBPeQorMDAwRTdGIEhld2xldHQgUGFja2FyZAorMDAwRTgxIEluc3RhbnQ4MDIgTmV0d29ya3MgSW5jLgorMDAwRTgyIENvbW10ZWNoIFdpcmVsZXNzCiswMDBFODMgQ2lzY28gU3lzdGVtcworMDAwRTg0IENpc2NvIFN5c3RlbXMKKzAwMEU4NSBDYXRhbHlzdCBFbnRlcnByaXNlcywgSW5jLgorMDAwRTg2IEFsY2F0ZWwgTm9ydGggQW1lcmljYQorMDAwRTg3IGFkcCBHYXVzZWxtYW5uIEdtYkgKKzAwMEU4OCBWSURFT1RST04gQ09SUC4KKzAwMEU4OSBDTEVNQVRJQworMDAwRThBIEF2YXJhIFRlY2hub2xvZ2llcyBQdHkuIEx0ZC4KKzAwMEU4QiBBc3RhcnRlIFRlY2hub2xvZ3kgQ28sIEx0ZC4KKzAwMEU4QyBTaWVtZW5zIEFHIEEmRCBFVAorMDAwRThEIFN5c3RlbXMgaW4gUHJvZ3Jlc3MgSG9sZGluZyBHbWJICiswMDBFOEUgU3BhcmtMQU4gQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwMEU4RiBTZXJjb21tIENvcnAuCiswMDBFOTAgUE9OSUNPIENPUlAuCiswMDBFOTIgTWlsbGluZXQgQ28uLCBMdGQuCiswMDBFOTMgTWls6W5pbyAzIFNpc3RlbWFzIEVsZWN0cvNuaWNvcywgTGRhLgorMDAwRTk0IE1hYXMgSW50ZXJuYXRpb25hbCBCVgorMDAwRTk1IEZ1aml5YSBEZW5raSBTZWlzYWt1c2hvIENvLixMdGQuCiswMDBFOTYgQ3ViaWMgRGVmZW5zZSBBcHBsaWNhdGlvbnMsIEluYy4KKzAwMEU5NyBVbHRyYWNrZXIgVGVjaG5vbG9neSBDTy4sIEluYworMDAwRTk4IFZpdGVjIENDLCBJTkMuCiswMDBFOTkgU3BlY3RydW0gRGlnaXRhbCwgSW5jCiswMDBFOUEgQk9FIFRFQ0hOT0xPR1kgR1JPVVAgQ08uLExURAorMDAwRTlDIFBlbXN0YXIKKzAwMEU5RCBWaWRlbyBOZXR3b3JrcyBMdGQKKzAwMEU5RSBUb3BmaWVsZCBDby4sIEx0ZAorMDAwRTlGIFRFTUlDIFNEUyBHbWJICiswMDBFQTAgTmV0S2xhc3MgVGVjaG5vbG9neSBJbmMuCiswMDBFQTEgRm9ybW9zYSBUZWxldGVrIENvcnBvcmF0aW9uCiswMDBFQTIgQ3liZXJHdWFyZCBDb3Jwb3JhdGlvbgorMDAwRUEzIENOQ1ItSVQgQ08uLExURCxIYW5nWmhvdSBQLlIuQ0hJTkEKKzAwMEVBNCBDZXJ0YW5jZSBJbmMuCiswMDBFQTUgQkxJUCBTeXN0ZW1zCiswMDBFQTYgQVNVU1RFSyBDT01QVVRFUiBJTkMuCiswMDBFQTcgRW5kYWNlIEluYyBMdGQuCiswMDBFQTggVW5pdGVkIFRlY2hub2xvZ2lzdHMgRXVyb3BlIExpbWl0ZWQKKzAwMEVBOSBTaGFuZ2hhaSBYdW4gU2hpIENvbW11bmljYXRpb25zIEVxdWlwbWVudCBMdGQuIENvLgorMDAwRUFDIE1JTlRST04gRU5URVJQUklTRSBDTy4sIExURC4KKzAwMEVBRCBNZXRhbm9pYSBUZWNobm9sb2dpZXMsIEluYy4KKzAwMEVBRSBHQVdFTEwgVEVDSE5PTE9HSUVTIENPUlAuCiswMDBFQUYgQ0FTVEVMCiswMDBFQjAgU29sdXRpb25zIFJhZGlvIEJWCiswMDBFQjEgTmV3Y290ZWNoLEx0ZAorMDAwRUIyIE1pY3JvLVJlc2VhcmNoIEZpbmxhbmQgT3kKKzAwMEVCMyBMZWZ0SGFuZCBOZXR3b3JrcworMDAwRUI0IEdVQU5HWkhPVSBHQU9LRSBDT01NVU5JQ0FUSU9OUyBURUNITk9MT0dZIENPLkxURC4KKzAwMEVCNSBFY2FzdGxlIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorMDAwRUI2IFJpdmVyYmVkIFRlY2hub2xvZ3ksIEluYy4KKzAwMEVCNyBLbm92YXRpdmUsIEluYy4KKzAwMEVCOCBJaWdhIGNvLixMdGQKKzAwMEVCOSBIQVNISU1PVE8gRWxlY3Ryb25pY3MgSW5kdXN0cnkgQ28uLEx0ZC4KKzAwMEVCQSBIQU5NSSBTRU1JQ09ORFVDVE9SIENPLiwgTFRELgorMDAwRUJCIEV2ZXJiZWUgTmV0d29ya3MKKzAwMEVCQyBDdWxsbWFubiBHbWJICiswMDBFQkQgQnVyZGljaywgYSBRdWludG9uIENvbXBueQorMDAwRUJFIEImQiBFbGVjdHJvbmljcyBNYW51ZmFjdHVyaW5nIENvLgorMDAwRUMwIE5vcnRlbCBOZXR3b3JrcworMDAwRUMxIE1ZTkFIIFRlY2hub2xvZ2llcworMDAwRUMyIExvd3JhbmNlIEVsZWN0cm9uaWNzLCBJbmMuCiswMDBFQzMgTG9naWMgQ29udHJvbHMsIEluYy4KKzAwMEVDNCBJc2tyYSBUcmFuc21pc3Npb24gZC5kLgorMDAwRUM2IEFTSVggRUxFQ1RST05JQ1MgQ09SUC4KKzAwMEVDNyBBcHBlYWwgVGVsZWNvbSBDby4sTHRkLgorMDAwRUM4IFpvcmFuIENvcnBvcmF0aW9uCiswMDBFQzkgWU9LTyBUZWNobm9sb2d5IENvcnAuCiswMDBFQ0IgVmluZVN5cyBUZWNobm9sb2d5CiswMDBFQ0MgVGFibGVhdQorMDAwRUNEIFNLT1YgQS9TCiswMDBFQ0UgUy5JLlQuVC5JLiBTLnAuQS4KKzAwMEVDRiBQUk9GSUJVUyBOdXR6ZXJvcmdhbmlzYXRpb24gZS5WLgorMDAwRUQwIFByaXZhcmlzLCBJbmMuCiswMDBFRDEgT3Nha2EgTWljcm8gQ29tcHV0ZXIuCiswMDBFRDIgRmlsdHJvbmljIHBsYworMDAwRUQzIEVwaWNlbnRlciwgSW5jLgorMDAwRUQ0IENSRVNJVFQgSU5EVVNUUklFCiswMDBFRDUgQ09QQU4gU3lzdGVtcyBJbmMuCiswMDBFRDYgQ2lzY28gU3lzdGVtcworMDAwRUQ3IENpc2NvIFN5c3RlbXMKKzAwMEVEOCBBa3Rpbm8sIEluYy4KKzAwMEVEOSBBa3N5cywgTHRkLgorMDAwRURBIEMtVEVDSCBVTklURUQgQ09SUC4KKzAwMEVEQiBYaU5DT00gQ29ycC4KKzAwMEVEQyBUZWxsaW9uIElOQy4KKzAwMEVERCBTSFVSRSBJTkNPUlBPUkFURUQKKzAwMEVERSBSRU1FQywgSW5jLgorMDAwRURGIFBMWCBUZWNobm9sb2d5CiswMDBFRTAgTWNoYXJnZQorMDAwRUUxIEV4dHJlbWVTcGVlZCBJbmMuCiswMDBFRTIgQ3VzdG9tIEVuZ2luZWVyaW5nIFMucC5BLgorMDAwRUUzIENoaXl1IFRlY2hub2xvZ3kgQ28uLEx0ZAorMDAwRUU1IGJpdFdhbGxldCwgSW5jLgorMDAwRUU2IEFkaW1vcyBTeXN0ZW1zIExURAorMDAwRUU3IEFBQyBFTEVDVFJPTklDUyBDT1JQLgorMDAwRUU4IHppb25jb20KKzAwMEVFOSBXYXlUZWNoIERldmVsb3BtZW50LCBJbmMuCiswMDBFRUEgU2hhZG9uZyBMdW5lbmcgSmljaGVuZyBFbGVjdHJvbmljcyxDby4sTHRkCiswMDBFRUIgU2FuZG1hcnRpbih6aG9uZyBzaGFuKUVsZWN0cm9uaWNzIENvLixMdGQKKzAwMEVFQyBPcmJhbgorMDAwRUVEIE5va2lhIERhbm1hcmsgQS9TCiswMDBFRUUgTXVjbyBJbmR1c3RyaWUgQlYKKzAwMEVGMCBGZXN0byBBRyAmIENvLiBLRworMDAwRUYxIEVaUVVFU1QgSU5DLgorMDAwRUYzIFNtYXJ0aG9tZQorMDAwRUY0IFNoZW56aGVuIEthc2RhIERpZ2l0YWwgVGVjaG5vbG9neSBDby4sTHRkCiswMDBFRjUgaVBBQyBUZWNobm9sb2d5IENvLiwgTHRkLgorMDAwRUY2IEUtVEVOIEluZm9ybWF0aW9uIFN5c3RlbXMgQ28uLCBMdGQuCiswMDBFRjcgVnVsY2FuIFBvcnRhbHMgSW5jCiswMDBFRjggU0JDIEFTSQorMDAwRUY5IFJFQSBFbGVrdHJvbmlrIEdtYkgKKzAwMEVGQSBPcHRvd2F5IFRlY2hub2xvZ3kgSW5jb3Jwb3JhdGlvbgorMDAwRUZCIE1hY2V5IEVudGVycHJpc2VzCiswMDBFRkMgSlRBRyBUZWNobm9sb2dpZXMgQi5WLgorMDAwRUZEIEZVSkkgUEhPVE8gT1BUSUNBTCBDTy4sIExURC4KKzAwMEVGRSBFbmRSdW4gVGVjaG5vbG9naWVzIExMQworMDAwRUZGIE1lZ2Fzb2x1dGlvbixJbmMuCiswMDBGMDAgTGVncmEgU3lzdGVtcywgSW5jLgorMDAwRjAxIERJR0lUQUxLUyBJTkMKKzAwMEYwMiBEaWdpY3ViZSBUZWNobm9sb2d5IENvLiwgTHRkCiswMDBGMDMgQ09NJkMgQ08uLCBMVEQKKzAwMEYwNCBjaW0tdXNhIGluYworMDAwRjA1IDNCIFNZU1RFTSBJTkMuCiswMDBGMDYgTm9ydGVsIE5ldHdvcmtzCiswMDBGMDcgTWFuZ3JvdmUgU3lzdGVtcywgSW5jLgorMDAwRjA4IEluZGFnb24gT3kKKzAwMEYwQiBLZW50aW1hIFRlY2hub2xvZ2llcyBBQgorMDAwRjBDIFNZTkNIUk9OSUMgRU5HSU5FRVJJTkcKKzAwMEYwRCBIdW50IEVsZWN0cm9uaWMgQ28uLCBMdGQuCiswMDBGMEUgV2F2ZVNwbGl0dGVyIFRlY2hub2xvZ2llcywgSW5jLgorMDAwRjBGIFJlYWwgSUQgVGVjaG5vbG9neSBDby4sIEx0ZC4KKzAwMEYxMCBSRE0gQ29ycG9yYXRpb24KKzAwMEYxMSBQcm9kcml2ZSBCLlYuCiswMDBGMTIgUGFuYXNvbmljIEFWQyBOZXR3b3JrcyBHZXJtYW55IEdtYkgKKzAwMEYxMyBOaXNjYSBjb3Jwb3JhdGlvbgorMDAwRjE0IE1pbmRyYXkgQ28uLCBMdGQuCiswMDBGMTUgS2phZXJ1bGZmMSBBL1MKKzAwMEYxNiBKQVkgSE9XIFRFQ0hOT0xPR1kgQ08uLAorMDAwRjE3IEluc3RhIEVsZWt0cm8gR21iSAorMDAwRjE4IEluZHVzdHJpYWwgQ29udHJvbCBTeXN0ZW1zCiswMDBGMTkgR3VpZGFudCBDb3Jwb3JhdGlvbgorMDAwRjFBIEdhbWluZyBTdXBwb3J0IEIuVi4KKzAwMEYxQiBFZ28gU3lzdGVtcyBJbmMuCiswMDBGMUMgRGlnaXRBbGwgV29ybGQgQ28uLCBMdGQKKzAwMEYxRCBDb3NtbyBUZWNocyBDby4sIEx0ZC4KKzAwMEYxRSBDaGVuZ2R1IEtUIEVsZWN0cmljIENvLm9mIEhpZ2ggJiBOZXcgVGVjaG5vbG9neQorMDAwRjFGIFdXIFBDQkEgVGVzdAorMDAwRjIwIFdXIE9wcworMDAwRjIxIFNjaWVudGlmaWMgQXRsYW50YSwgSW5jCiswMDBGMjIgSGVsaXVzLCBJbmMuCiswMDBGMjMgQ2lzY28gU3lzdGVtcworMDAwRjI0IENpc2NvIFN5c3RlbXMKKzAwMEYyNSBBaW1WYWxsZXkgQi5WLgorMDAwRjI2IFdvcmxkQWNjeHggIExMQworMDAwRjI3IFRFQUwgRWxlY3Ryb25pY3MsIEluYy4KKzAwMEYyOCBJdHJvbml4IENvcnBvcmF0aW9uCiswMDBGMjkgQXVnbWVudGl4IENvcnBvcmF0aW9uCiswMDBGMkEgQ2FibGV3YXJlIEVsZWN0cm9uaWNzCiswMDBGMkIgR1JFRU5CRUxMIFNZU1RFTVMKKzAwMEYyQyBVcGxvZ2l4LCBJbmMuCiswMDEwMDAgQ0FCTEUgVEVMRVZJU0lPTiBMQUJPUkFUT1JJRVMsIElOQy4KKzAwMTAwMSBNQ0sgQ09NTVVOSUNBVElPTlMKKzAwMTAwMiBBQ1RJQQorMDAxMDAzIElNQVRST04sIElOQy4KKzAwMTAwNCBUSEUgQlJBTlRMRVkgQ09JTEUgQ09NUEFOWSxJTkMKKzAwMTAwNSBVRUMgQ09NTUVSQ0lBTAorMDAxMDA2IFRoYWxlcyBDb250YWN0IFNvbHV0aW9ucyBMdGQuCiswMDEwMDcgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAxMDA4IFZJRU5OQSBTWVNURU1TIENPUlBPUkFUSU9OCiswMDEwMDkgSE9STyBRVUFSVFoKKzAwMTAwQSBXSUxMSUFNUyBDT01NVU5JQ0FUSU9OUyBHUk9VUAorMDAxMDBCIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwMTAwQyBJVE8gQ08uLCBMVEQuCiswMDEwMEQgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAxMDBFIE1JQ1JPIExJTkVBUiBDT1BPUkFUSU9OCiswMDEwMEYgSU5EVVNUUklBTCBDUFUgU1lTVEVNUworMDAxMDEwIElOSVRJTyBDT1JQT1JBVElPTgorMDAxMDExIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwMTAxMiBQUk9DRVNTT1IgU1lTVEVNUyAoSSkgUFZUIExURAorMDAxMDEzIElORFVTVFJJQUwgQ09NUFVURVIgU09VUkNFCiswMDEwMTQgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAxMDE1IE9PbW9uIEluYy4KKzAwMTAxNiBULlNRV0FSRQorMDAxMDE3IE1JQ09TIEdtYkgKKzAwMTAxOCBCUk9BRENPTSBDT1JQT1JBVElPTgorMDAxMDE5IFNJUk9OQSBERU5UQUwgU1lTVEVNUyBHbWJIICYgQ28uIEtHCiswMDEwMUEgUGljdHVyZVRlbCBDb3JwLgorMDAxMDFCIENPUk5FVCBURUNITk9MT0dZLCBJTkMuCiswMDEwMUMgT0hNIFRFQ0hOT0xPR0lFUyBJTlRMLCBMTEMKKzAwMTAxRCBXSU5CT05EIEVMRUNUUk9OSUNTIENPUlAuCiswMDEwMUUgTUFUU1VTSElUQSBFTEVDVFJPTklDIElOU1RSVU1FTlRTIENPUlAuCiswMDEwMUYgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAxMDIwIFdFTENIIEFMTFlOLCBEQVRBIENPTExFQ1RJT04KKzAwMTAyMSBFTkNBTlRPIE5FVFdPUktTLCBJTkMuCiswMDEwMjIgU2F0Q29tIE1lZGlhIENvcnBvcmF0aW9uCiswMDEwMjMgRkxPV1dJU0UgTkVUV09SS1MsIElOQy4KKzAwMTAyNCBOQUdPWUEgRUxFQ1RSSUMgV09SS1MgQ08uLCBMVEQKKzAwMTAyNSBHUkFZSElMTCBJTkMuCiswMDEwMjYgQUNDRUxFUkFURUQgTkVUV09SS1MsIElOQy4KKzAwMTAyNyBMLTMgQ09NTVVOSUNBVElPTlMgRUFTVAorMDAxMDI4IENPTVBVVEVSIFRFQ0hOSUNBLCBJTkMuCiswMDEwMjkgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAxMDJBIFpGIE1JQ1JPU1lTVEVNUywgSU5DLgorMDAxMDJCIFVNQVggREFUQSBTWVNURU1TLCBJTkMuCiswMDEwMkMgTGFzYXQgTmV0d29ya3MgQS9TCiswMDEwMkQgSElUQUNISSBTT0ZUV0FSRSBFTkdJTkVFUklORworMDAxMDJFIE5FVFdPUksgU1lTVEVNUyAmIFRFQ0hOT0xPR0lFUyBQVlQuIExURC4KKzAwMTAyRiBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDEwMzAgV2ktTEFOLCBJbmMuCiswMDEwMzEgT0JKRUNUSVZFIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDEwMzIgQUxUQSBURUNITk9MT0dZCiswMDEwMzMgQUNDRVNTTEFOIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDEwMzQgR05QIENvbXB1dGVycworMDAxMDM1IEVMSVRFR1JPVVAgQ09NUFVURVIgU1lTVEVNUyBDTy4sIExURAorMDAxMDM2IElOVEVSLVRFTCBJTlRFR1JBVEVEIFNZU1RFTVMKKzAwMTAzNyBDWVEndmUgVGVjaG5vbG9neSBDby4sIEx0ZC4KKzAwMTAzOCBNSUNSTyBSRVNFQVJDSCBJTlNUSVRVVEUsIElOQy4KKzAwMTAzOSBWZWN0cm9uIFN5c3RlbXMgQUcKKzAwMTAzQSBESUFNT05EIE5FVFdPUksgVEVDSAorMDAxMDNCIEhJUFBJIE5FVFdPUktJTkcgRk9SVU0KKzAwMTAzQyBJQyBFTlNFTUJMRSwgSU5DLgorMDAxMDNEIFBIQVNFQ09NLCBMVEQuCiswMDEwM0UgTkVUU0NIT09MUyBDT1JQT1JBVElPTgorMDAxMDNGIFRPTExHUkFERSBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDAxMDQwIElOVEVSTUVDIENPUlBPUkFUSU9OCiswMDEwNDEgQlJJU1RPTCBCQUJDT0NLLCBJTkMuCiswMDEwNDIgQWxhY3JpVGVjaAorMDAxMDQzIEEyIENPUlBPUkFUSU9OCiswMDEwNDQgSW5ub0xhYnMgQ29ycG9yYXRpb24KKzAwMTA0NSBOb3J0ZWwgTmV0d29ya3MKKzAwMTA0NiBBTENPUk4gTUNCUklERSBJTkMuCiswMDEwNDcgRUNITyBFTEVUUklDIENPLiBMVEQuCiswMDEwNDggSFRSQyBBVVRPTUFUSU9OLCBJTkMuCiswMDEwNDkgU0hPUkVMSU5FIFRFTEVXT1JLUywgSU5DLgorMDAxMDRBIFRIRSBQQVJWVUMgQ09SUE9SQVRJT04KKzAwMTA0QiAzQ09NIENPUlBPUkFUSU9OCiswMDEwNEMgQ09NUFVURVIgQUNDRVNTIFRFQ0hOT0xPR1kKKzAwMTA0RCBTVVJURUMgSU5EVVNUUklFUywgSU5DLgorMDAxMDRFIENFT0xPR0lDCiswMDEwNEYgU1RPUkFHRSBURUNITk9MT0dZIENPUlBPUkFUSU9OCiswMDEwNTAgUklPTiBDTy4sIExURC4KKzAwMTA1MSBDTUlDUk8gQ09SUE9SQVRJT04KKzAwMTA1MiBNRVRUTEVSLVRPTEVETyAoQUxCU1RBRFQpIEdNQkgKKzAwMTA1MyBDT01QVVRFUiBURUNITk9MT0dZIENPUlAuCiswMDEwNTQgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAxMDU1IEZVSklUU1UgTUlDUk9FTEVDVFJPTklDUywgSU5DLgorMDAxMDU2IFNPRElDSyBDTy4sIExURC4KKzAwMTA1NyBSZWJlbC5jb20sIEluYy4KKzAwMTA1OCBBcnJvd1BvaW50IENvbW11bmljYXRpb25zCiswMDEwNTkgRElBQkxPIFJFU0VBUkNIIENPLiBMTEMKKzAwMTA1QSAzQ09NIENPUlBPUkFUSU9OCiswMDEwNUIgTkVUIElOU0lHSFQgQUIKKzAwMTA1QyBRVUFOVFVNIERFU0lHTlMgKEguSy4pIExURC4KKzAwMTA1RCBEcmFlZ2VyIE1lZGljYWwKKzAwMTA1RSBIRUtJTUlBTiBMQUJPUkFUT1JJRVMsIElOQy4KKzAwMTA1RiBJTi1TTkVDCiswMDEwNjAgQklMTElPTlRPTiBTWVNURU1TLCBJTkMuCiswMDEwNjEgSE9TVExJTksgQ09SUC4KKzAwMTA2MiBOWCBTRVJWRVIsIElMTkMuCiswMDEwNjMgU1RBUkdVSURFIERJR0lUQUwgTkVUV09SS1MKKzAwMTA2NCBESUdJVEFMIEVRVUlQTUVOVCBDT1JQLgorMDAxMDY1IFJBRFlORSBDT1JQT1JBVElPTgorMDAxMDY2IEFEVkFOQ0VEIENPTlRST0wgU1lTVEVNUywgSU5DLgorMDAxMDY3IFJFREJBQ0sgTkVUV09SS1MsIElOQy4KKzAwMTA2OCBDT01PUyBURUxFQ09NCiswMDEwNjkgSEVMSU9TUyBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDAxMDZBIERJR0lUQUwgTUlDUk9XQVZFIENPUlBPUkFUSU9OCiswMDEwNkIgU09OVVMgTkVUV09SS1MsIElOQy4KKzAwMTA2QyBJTkZSQVRFQyBQTFVTIEdtYkgKKzAwMTA2RCBJTlRFR1JJVFkgQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwMTA2RSBUQURJUkFOIENPTS4gTFRELgorMDAxMDZGIFRSRU5UT04gVEVDSE5PTE9HWSBJTkMuCiswMDEwNzAgQ0FSQURPTiBUUkVORCBMVEQuCiswMDEwNzEgQURWQU5FVCBJTkMuCiswMDEwNzIgR1ZOIFRFQ0hOT0xPR0lFUywgSU5DLgorMDAxMDczIFRFQ0hOT0JPWCwgSU5DLgorMDAxMDc0IEFURU4gSU5URVJOQVRJT05BTCBDTy4sIExURC4KKzAwMTA3NSBNYXh0b3IgQ29ycG9yYXRpb24KKzAwMTA3NiBFVVJFTSBHbWJICiswMDEwNzcgU0FGIERSSVZFIFNZU1RFTVMsIExURC4KKzAwMTA3OCBOVUVSQSBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDAxMDc5IENJU0NPIFNZU1RFTVMsIElOQy4KKzAwMTA3QSBBbWJpQ29tLCBJbmMuCiswMDEwN0IgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAxMDdDIFAtQ09NLCBJTkMuCiswMDEwN0QgQVVST1JBIENPTU1VTklDQVRJT05TLCBMVEQuCiswMDEwN0UgQkFDSE1BTk4gRUxFQ1RST05JQyBHbWJICiswMDEwN0YgQ1JFU1RST04gRUxFQ1RST05JQ1MsIElOQy4KKzAwMTA4MCBNRVRBV0FWRSBDT01NVU5JQ0FUSU9OUworMDAxMDgxIERQUywgSU5DLgorMDAxMDgyIEpOQSBURUxFQ09NTVVOSUNBVElPTlMgTElNSVRFRAorMDAxMDgzIEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZCiswMDEwODQgSy1CT1QgQ09NTVVOSUNBVElPTlMKKzAwMTA4NSBQT0xBUklTIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDEwODYgQVRUTyBURUNITk9MT0dZLCBJTkMuCiswMDEwODcgWHN0cmVhbWlzIFBMQworMDAxMDg4IEFNRVJJQ0FOIE5FVFdPUktTIElOQy4KKzAwMTA4OSBXZWJTb25pYworMDAxMDhBIFRlcmFMb2dpYywgSW5jLgorMDAxMDhCIExBU0VSQU5JTUFUSU9OIFNPTExJTkdFUiBHbWJICiswMDEwOEMgRlVKSVRTVSBURUxFQ09NTVVOSUNBVElPTlMgRVVST1BFLCBMVEQuCiswMDEwOEQgSk9ITlNPTiBDT05UUk9MUywgSU5DLgorMDAxMDhFIEhVR0ggU1lNT05TIENPTkNFUFQgVGVjaG5vbG9naWVzIEx0ZC4KKzAwMTA4RiBSQVBUT1IgU1lTVEVNUworMDAxMDkwIENJTUVUUklDUywgSU5DLgorMDAxMDkxIE5PIFdJUkVTIE5FRURFRCBCVgorMDAxMDkyIE5FVENPUkUgSU5DLgorMDAxMDkzIENNUyBDT01QVVRFUlMsIExURC4KKzAwMTA5NCBQZXJmb3JtYW5jZSBBbmFseXNpcyBCcm9hZGJhbmQsIFNwaXJlbnQgcGxjCiswMDEwOTUgVGhvbXNvbiBNdWx0aW1lZGlhLCBJbmMuCiswMDEwOTYgVFJBQ0VXRUxMIFNZU1RFTVMsIElOQy4KKzAwMTA5NyBXaW5OZXQgTWV0cm9wb2xpdGFuIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKzAwMTA5OCBTVEFSTkVUIFRFQ0hOT0xPR0lFUywgSU5DLgorMDAxMDk5IElubm9NZWRpYSwgSW5jLgorMDAxMDlBIE5FVExJTkUKKzAwMTA5QiBWSVhFTCBDT1JQT1JBVElPTgorMDAxMDlDIE0tU1lTVEVNIENPLiwgTFRELgorMDAxMDlEIENMQVJJTkVUIFNZU1RFTVMsIElOQy4KKzAwMTA5RSBBV0FSRSwgSU5DLgorMDAxMDlGIFBBVk8sIElOQy4KKzAwMTBBMCBJTk5PVkVYIFRFQ0hOT0xPR0lFUywgSU5DLgorMDAxMEExIEtFTkRJTiBTRU1JQ09ORFVDVE9SLCBJTkMuCiswMDEwQTIgVE5TCiswMDEwQTMgT01OSVRST05JWCwgSU5DLgorMDAxMEE0IFhJUkNPTQorMDAxMEE1IE9YRk9SRCBJTlNUUlVNRU5UUworMDAxMEE2IENJU0NPIFNZU1RFTVMsIElOQy4KKzAwMTBBNyBVTkVYIFRFQ0hOT0xPR1kgQ09SUE9SQVRJT04KKzAwMTBBOCBSRUxJQU5DRSBDT01QVVRFUiBDT1JQLgorMDAxMEE5IEFESE9DIFRFQ0hOT0xPR0lFUworMDAxMEFBIE1FRElBNCwgSU5DLgorMDAxMEFCIEtPSVRPIElORFVTVFJJRVMsIExURC4KKzAwMTBBQyBJTUNJIFRFQ0hOT0xPR0lFUworMDAxMEFEIFNPRlRST05JQ1MgVVNCLCBJTkMuCiswMDEwQUUgU0hJTktPIEVMRUNUUklDIElORFVTVFJJRVMgQ08uCiswMDEwQUYgVEFDIFNZU1RFTVMsIElOQy4KKzAwMTBCMCBNRVJJRElBTiBURUNITk9MT0dZIENPUlAuCiswMDEwQjEgRk9SLUEgQ08uLCBMVEQuCiswMDEwQjIgQ09BQ1RJVkUgQUVTVEhFVElDUworMDAxMEIzIE5PS0lBIE1VTFRJTUVESUEgVEVSTUlOQUxTCiswMDEwQjQgQVRNT1NQSEVSRSBORVRXT1JLUworMDAxMEI1IEFDQ1RPTiBURUNITk9MT0dZIENPUlBPUkFUSU9OCiswMDEwQjYgRU5UUkFUQSBDT01NVU5JQ0FUSU9OUyBDT1JQLgorMDAxMEI3IENPWU9URSBURUNITk9MT0dJRVMsIExMQworMDAxMEI4IElTSElHQUtJIENPTVBVVEVSIFNZU1RFTSBDTy4KKzAwMTBCOSBNQVhUT1IgQ09SUC4KKzAwMTBCQSBNQVJUSU5ITy1EQVZJUyBTWVNURU1TLCBJTkMuCiswMDEwQkIgREFUQSAmIElORk9STUFUSU9OIFRFQ0hOT0xPR1kKKzAwMTBCQyBBYXN0cmEgVGVsZWNvbQorMDAxMEJEIFRIRSBURUxFQ09NTVVOSUNBVElPTiBURUNITk9MT0dZIENPTU1JVFRFRQorMDAxMEJFIFRFTEVYSVMgQ09SUC4KKzAwMTBCRiBJbnRlckFpciBXaXJlbGVzcworMDAxMEMwIEFSTUEsIElOQy4KKzAwMTBDMSBPSSBFTEVDVFJJQyBDTy4sIExURC4KKzAwMTBDMiBXSUxMTkVULCBJTkMuCiswMDEwQzMgQ1NJLUNPTlRST0wgU1lTVEVNUworMDAxMEM0IE1FRElBIExJTktTIENPLiwgTFRELgorMDAxMEM1IFBST1RPQ09MIFRFQ0hOT0xPR0lFUywgSU5DLgorMDAxMEM2IFVTSQorMDAxMEM3IERBVEEgVFJBTlNNSVNTSU9OIE5FVFdPUksKKzAwMTBDOCBDT01NVU5JQ0FUSU9OUyBFTEVDVFJPTklDUyBTRUNVUklUWSBHUk9VUAorMDAxMEM5IE1JVFNVQklTSEkgRUxFQ1RST05JQ1MgTE9HSVNUSUMgU1VQUE9SVCBDTy4KKzAwMTBDQSBJTlRFR1JBTCBBQ0NFU1MKKzAwMTBDQiBGQUNJVCBLLksuCiswMDEwQ0MgQ0xQIENPTVBVVEVSIExPR0lTVElLIFBMQU5VTkcgR21iSAorMDAxMENEIElOVEVSRkFDRSBDT05DRVBUCiswMDEwQ0UgVk9MQU1QLCBMVEQuCiswMDEwQ0YgRklCRVJMQU5FIENPTU1VTklDQVRJT05TCiswMDEwRDAgV0lUQ09NLCBMVEQuCiswMDEwRDEgVG9wIExheWVyIE5ldHdvcmtzLCBJbmMuCiswMDEwRDIgTklUVE8gVFNVU0hJTktJIENPLiwgTFRECiswMDEwRDMgR1JJUFMgRUxFQ1RST05JQyBHTUJICiswMDEwRDQgU1RPUkFHRSBDT01QVVRFUiBDT1JQT1JBVElPTgorMDAxMEQ1IElNQVNERSBDQU5BUklBUywgUy5BLgorMDAxMEQ2IElUVCAtIEEvQ0QKKzAwMTBENyBBUkdPU1kgUkVTRUFSQ0ggSU5DLgorMDAxMEQ4IENBTElTVEEKKzAwMTBEOSBJQk0gSkFQQU4sIEZVSklTQVdBIE1UK0QKKzAwMTBEQSBNT1RJT04gRU5HSU5FRVJJTkcsIElOQy4KKzAwMTBEQiBOZXRTY3JlZW4gVGVjaG5vbG9naWVzLCBJbmMuCiswMDEwREMgTUlDUk8tU1RBUiBJTlRFUk5BVElPTkFMIENPLiwgTFRELgorMDAxMEREIEVOQUJMRSBTRU1JQ09ORFVDVE9SLCBJTkMuCiswMDEwREUgSU5URVJOQVRJT05BTCBEQVRBQ0FTVElORyBDT1JQT1JBVElPTgorMDAxMERGIFJJU0UgQ09NUFVURVIgSU5DLgorMDAxMEUwIENPQkFMVCBNSUNST1NFUlZFUiwgSU5DLgorMDAxMEUxIFMuSS4gVEVDSCwgSU5DLgorMDAxMEUyIEFycmF5Q29tbSwgSW5jLgorMDAxMEUzIENPTVBBUSBDT01QVVRFUiBDT1JQT1JBVElPTgorMDAxMEU0IE5TSSBDT1JQT1JBVElPTgorMDAxMEU1IFNPTEVDVFJPTiBURVhBUworMDAxMEU2IEFQUExJRUQgSU5URUxMSUdFTlQgU1lTVEVNUywgSU5DLgorMDAxMEU3IEJyZWV6ZUNvbQorMDAxMEU4IFRFTE9DSVRZLCBJTkNPUlBPUkFURUQKKzAwMTBFOSBSQUlEVEVDIExURC4KKzAwMTBFQSBBREVQVCBURUNITk9MT0dZCiswMDEwRUIgU0VMU0lVUyBTWVNURU1TLCBJTkMuCiswMDEwRUMgUlBDRywgTExDCiswMDEwRUQgU1VOREFOQ0UgVEVDSE5PTE9HWSwgSU5DLgorMDAxMEVFIENUSSBQUk9EVUNUUywgSU5DLgorMDAxMEVGIERCVEVMIElOQ09SUE9SQVRFRAorMDAxMEYxIEktTyBDT1JQT1JBVElPTgorMDAxMEYyIEFOVEVDCiswMDEwRjMgTmV4Y29tIEludGVybmF0aW9uYWwgQ28uLCBMdGQuCiswMDEwRjQgVkVSVElDQUwgTkVUV09SS1MsIElOQy4KKzAwMTBGNSBBTUhFUlNUIFNZU1RFTVMsIElOQy4KKzAwMTBGNiBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDEwRjcgSVJJSUNISSBURUNITk9MT0dJRVMgSW5jLgorMDAxMEY4IEtFTldPT0QgVE1JIENPUlBPUkFUSU9OCiswMDEwRjkgVU5JUVVFIFNZU1RFTVMsIElOQy4KKzAwMTBGQSBaQVlBTlRFLCBJTkMuCiswMDEwRkIgWklEQSBURUNITk9MT0dJRVMgTElNSVRFRAorMDAxMEZDIEJST0FEQkFORCBORVRXT1JLUywgSU5DLgorMDAxMEZEIENPQ09NIEEvUworMDAxMEZFIERJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OCiswMDEwRkYgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAxQzdDIFBFUlEgU1lTVEVNUyBDT1JQT1JBVElPTgorMDAyMDAwIExFWE1BUksgSU5URVJOQVRJT05BTCwgSU5DLgorMDAyMDAxIERTUCBTT0xVVElPTlMsIElOQy4KKzAwMjAwMiBTRVJJVEVDSCBFTlRFUlBSSVNFIENPLiwgTFRELgorMDAyMDAzIFBJWEVMIFBPV0VSIExURC4KKzAwMjAwNCBZQU1BVEFLRS1IT05FWVdFTEwgQ08uLCBMVEQuCiswMDIwMDUgU0lNUExFIFRFQ0hOT0xPR1kKKzAwMjAwNiBHQVJSRVRUIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDIwMDcgU0ZBLCBJTkMuCiswMDIwMDggQ0FCTEUgJiBDT01QVVRFUiBURUNITk9MT0dZCiswMDIwMDkgUEFDS0FSRCBCRUxMIEVMRUMuLCBJTkMuCiswMDIwMEEgU09VUkNFLUNPTU0gQ09SUC4KKzAwMjAwQiBPQ1RBR09OIFNZU1RFTVMgQ09SUC4KKzAwMjAwQyBBREFTVFJBIFNZU1RFTVMgQ09SUC4KKzAwMjAwRCBDQVJMIFpFSVNTCiswMDIwMEUgU0FURUxMSVRFIFRFQ0hOT0xPR1kgTUdNVCwgSU5DCiswMDIwMEYgVEFOQkFDIENPLiwgTFRELgorMDAyMDEwIEpFT0wgU1lTVEVNIFRFQ0hOT0xPR1kgQ08uIExURAorMDAyMDExIENBTk9QVVMgQ08uLCBMVEQuCiswMDIwMTIgQ0FNVFJPTklDUyBNRURJQ0FMIFNZU1RFTVMKKzAwMjAxMyBESVZFUlNJRklFRCBURUNITk9MT0dZLCBJTkMuCiswMDIwMTQgR0xPQkFMIFZJRVcgQ08uLCBMVEQuCiswMDIwMTUgQUNUSVMgQ09NUFVURVIgU0EKKzAwMjAxNiBTSE9XQSBFTEVDVFJJQyBXSVJFICYgQ0FCTEUgQ08KKzAwMjAxNyBPUkJPVEVDSAorMDAyMDE4IENJUyBURUNITk9MT0dZIElOQy4KKzAwMjAxOSBPSExFUiBHbWJICiswMDIwMUEgTi1CQVNFIFNXSVRDSCBDT01NVU5JQ0FUSU9OUworMDAyMDFCIE5PUlRIRVJOIFRFTEVDT00vTkVUV09SSworMDAyMDFDIEVYQ0VMLCBJTkMuCiswMDIwMUQgS0FUQU5BIFBST0RVQ1RTCiswMDIwMUUgTkVUUVVFU1QgQ09SUE9SQVRJT04KKzAwMjAxRiBCRVNUIFBPV0VSIFRFQ0hOT0xPR1ksIElOQy4KKzAwMjAyMCBNRUdBVFJPTiBDT01QVVRFUiBJTkRVU1RSSUVTIFBUWSwgTFRELgorMDAyMDIxIEFMR09SSVRITVMgU09GVFdBUkUgUFZULiBMVEQuCiswMDIwMjIgVEVLTklRVUUsIElOQy4KKzAwMjAyMyBULkMuIFRFQ0hOT0xPR0lFUyBQVFkuIExURAorMDAyMDI0IFBBQ0lGSUMgQ09NTVVOSUNBVElPTiBTQ0lFTkNFUworMDAyMDI1IENPTlRST0wgVEVDSE5PTE9HWSwgSU5DLgorMDAyMDI2IEFNS0xZIFNZU1RFTVMsIElOQy4KKzAwMjAyNyBNSU5HIEZPUlRVTkUgSU5EVVNUUlkgQ08uLCBMVEQKKzAwMjAyOCBXRVNUIEVHRyBTWVNURU1TLCBJTkMuCiswMDIwMjkgVEVMRVBST0NFU1NJTkcgUFJPRFVDVFMsIElOQy4KKzAwMjAyQSBOLlYuIERaSU5FCiswMDIwMkIgQURWQU5DRUQgVEVMRUNPTU1VTklDQVRJT05TIE1PRFVMRVMsIExURC4KKzAwMjAyQyBXRUxMVFJPTklYIENPLiwgTFRELgorMDAyMDJEIFRBSVlPIENPUlBPUkFUSU9OCiswMDIwMkUgREFZU1RBUiBESUdJVEFMCiswMDIwMkYgWkVUQSBDT01NVU5JQ0FUSU9OUywgTFRELgorMDAyMDMwIEFOQUxPRyAmIERJR0lUQUwgU1lTVEVNUworMDAyMDMxIEVSVEVDIEdtYkgKKzAwMjAzMiBBTENBVEVMIFRBSVNFTAorMDAyMDMzIFNZTkFQU0UgVEVDSE5PTE9HSUVTLCBJTkMuCiswMDIwMzQgUk9URUMgSU5EVVNUUklFQVVUT01BVElPTiBHTUJICiswMDIwMzUgSUJNIENPUlBPUkFUSU9OCiswMDIwMzYgQk1DIFNPRlRXQVJFCiswMDIwMzcgU0VBR0FURSBURUNITk9MT0dZCiswMDIwMzggVk1FIE1JQ1JPU1lTVEVNUyBJTlRFUk5BVElPTkFMIENPUlBPUkFUSU9OCiswMDIwMzkgU0NJTkVUUworMDAyMDNBIERJR0lUQUwgQkkwTUVUUklDUyBJTkMuCiswMDIwM0IgV0lTRE0gTFRELgorMDAyMDNDIEVVUk9USU1FIEFCCiswMDIwM0QgTk9WQVIgRUxFQ1RST05JQ1MgQ09SUE9SQVRJT04KKzAwMjAzRSBMb2dpQ2FuIFRlY2hub2xvZ2llcywgSW5jLgorMDAyMDNGIEpVS0kgQ09SUE9SQVRJT04KKzAwMjA0MCBNb3Rvcm9sYSBCcm9hZGJhbmQgQ29tbXVuaWNhdGlvbnMgU2VjdG9yCiswMDIwNDEgREFUQSBORVQKKzAwMjA0MiBEQVRBTUVUUklDUyBDT1JQLgorMDAyMDQzIE5FVVJPTiBDT01QQU5ZIExJTUlURUQKKzAwMjA0NCBHRU5JVEVDSCBQVFkgTFRECiswMDIwNDUgSU9OIE5ldHdvcmtzLCBJbmMuCiswMDIwNDYgQ0lQUklDTywgSU5DLgorMDAyMDQ3IFNURUlOQlJFQ0hFUiBDT1JQLgorMDAyMDQ4IE1hcmNvbmkgQ29tbXVuaWNhdGlvbnMKKzAwMjA0OSBDT01UUk9OLCBJTkMuCiswMDIwNEEgUFJPTkVUIEdNQkgKKzAwMjA0QiBBVVRPQ09NUFVURVIgQ08uLCBMVEQuCiswMDIwNEMgTUlUUk9OIENPTVBVVEVSIFBURSBMVEQuCiswMDIwNEQgSU5PVklTIEdNQkgKKzAwMjA0RSBORVRXT1JLIFNFQ1VSSVRZIFNZU1RFTVMsIElOQy4KKzAwMjA0RiBERVVUU0NIRSBBRVJPU1BBQ0UgQUcKKzAwMjA1MCBLT1JFQSBDT01QVVRFUiBJTkMuCiswMDIwNTEgVmVyaWxpbmsgQ29ycG9yYXRpb24KKzAwMjA1MiBSQUdVTEEgU1lTVEVNUworMDAyMDUzIEhVTlRTVklMTEUgTUlDUk9TWVNURU1TLCBJTkMuCiswMDIwNTQgRUFTVEVSTiBSRVNFQVJDSCwgSU5DLgorMDAyMDU1IEFMVEVDSCBDTy4sIExURC4KKzAwMjA1NiBORU9QUk9EVUNUUworMDAyMDU3IFRJVFpFIERBVEVOVEVDSE5JSyBHbWJICiswMDIwNTggQUxMSUVEIFNJR05BTCBJTkMuCiswMDIwNTkgTUlSTyBDT01QVVRFUiBQUk9EVUNUUyBBRworMDAyMDVBIENPTVBVVEVSIElERU5USUNTCiswMDIwNUIgU0tZTElORSBURUNITk9MT0dZCiswMDIwNUMgSW50ZXJOZXQgU3lzdGVtcyBvZiBGbG9yaWRhLCBJbmMuCiswMDIwNUQgTkFOT01BVElDIE9ZCiswMDIwNUUgQ0FTVExFIFJPQ0ssIElOQy4KKzAwMjA1RiBHQU1NQURBVEEgQ09NUFVURVIgR01CSAorMDAyMDYwIEFMQ0FURUwgSVRBTElBIFMucC5BLgorMDAyMDYxIERZTkFURUNIIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDIwNjIgU0NPUlBJT04gTE9HSUMsIExURC4KKzAwMjA2MyBXSVBSTyBJTkZPVEVDSCBMVEQuCiswMDIwNjQgUFJPVEVDIE1JQ1JPU1lTVEVNUywgSU5DLgorMDAyMDY1IFNVUEVSTkVUIE5FVFdPUktJTkcgSU5DLgorMDAyMDY2IEdFTkVSQUwgTUFHSUMsIElOQy4KKzAwMjA2OCBJU0RZTkUKKzAwMjA2OSBJU0ROIFNZU1RFTVMgQ09SUE9SQVRJT04KKzAwMjA2QSBPU0FLQSBDT01QVVRFUiBDT1JQLgorMDAyMDZCIEtPTklDQSBNSU5PTFRBIEhPTERJTkdTLCBJTkMuCiswMDIwNkMgRVZFUkdSRUVOIFRFQ0hOT0xPR1kgQ09SUC4KKzAwMjA2RCBEQVRBIFJBQ0UsIElOQy4KKzAwMjA2RSBYQUNULCBJTkMuCiswMDIwNkYgRkxPV1BPSU5UIENPUlBPUkFUSU9OCiswMDIwNzAgSFlORVQsIExURC4KKzAwMjA3MSBJQlIgR01CSAorMDAyMDcyIFdPUktMSU5LIElOTk9WQVRJT05TCiswMDIwNzMgRlVTSU9OIFNZU1RFTVMgQ09SUE9SQVRJT04KKzAwMjA3NCBTVU5HV09PTiBTWVNURU1TCiswMDIwNzUgTU9UT1JPTEEgQ09NTVVOSUNBVElPTiBJU1JBRUwKKzAwMjA3NiBSRVVETyBDT1JQT1JBVElPTgorMDAyMDc3IEtBUkRJT1MgU1lTVEVNUyBDT1JQLgorMDAyMDc4IFJVTlRPUCwgSU5DLgorMDAyMDc5IE1JS1JPTiBHTUJICiswMDIwN0EgV2lTRSBDb21tdW5pY2F0aW9ucywgSW5jLgorMDAyMDdCIEludGVsIENvcnBvcmF0aW9uCiswMDIwN0MgQVVURUMgR21iSAorMDAyMDdEIEFEVkFOQ0VEIENPTVBVVEVSIEFQUExJQ0FUSU9OUworMDAyMDdFIEZJTkVDT00gQ28uLCBMdGQuCiswMDIwN0YgS1lPRUkgU0FOR1lPIENPLiwgTFRELgorMDAyMDgwIFNZTkVSR1kgKFVLKSBMVEQuCiswMDIwODEgVElUQU4gRUxFQ1RST05JQ1MKKzAwMjA4MiBPTkVBQyBDT1JQT1JBVElPTgorMDAyMDgzIFBSRVNUSUNPTSBJTkNPUlBPUkFURUQKKzAwMjA4NCBPQ0UgUFJJTlRJTkcgU1lTVEVNUywgR01CSAorMDAyMDg1IEVYSURFIEVMRUNUUk9OSUNTCiswMDIwODYgTUlDUk9URUNIIEVMRUNUUk9OSUNTIExJTUlURUQKKzAwMjA4NyBNRU1PVEVDIENPTU1VTklDQVRJT05TIENPUlAuCiswMDIwODggR0xPQkFMIFZJTExBR0UgQ09NTVVOSUNBVElPTgorMDAyMDg5IFQzUExVUyBORVRXT1JLSU5HLCBJTkMuCiswMDIwOEEgU09OSVggQ09NTVVOSUNBVElPTlMsIExURC4KKzAwMjA4QiBMQVBJUyBURUNITk9MT0dJRVMsIElOQy4KKzAwMjA4QyBHQUxBWFkgTkVUV09SS1MsIElOQy4KKzAwMjA4RCBDTUQgVEVDSE5PTE9HWQorMDAyMDhFIENIRVZJTiBTT0ZUV0FSRSBFTkcuIExURC4KKzAwMjA4RiBFQ0kgVEVMRUNPTSBMVEQuCiswMDIwOTAgQURWQU5DRUQgQ09NUFJFU1NJT04gVEVDSE5PTE9HWSwgSU5DLgorMDAyMDkxIEoxMjUsIE5BVElPTkFMIFNFQ1VSSVRZIEFHRU5DWQorMDAyMDkyIENIRVNTIEVOR0lORUVSSU5HIEIuVi4KKzAwMjA5MyBMQU5ESU5HUyBURUNITk9MT0dZIENPUlAuCiswMDIwOTQgQ1VCSVggQ09SUE9SQVRJT04KKzAwMjA5NSBSSVZBIEVMRUNUUk9OSUNTCiswMDIwOTYgSW52ZW5zeXMKKzAwMjA5NyBBUFBMSUVEIFNJR05BTCBURUNITk9MT0dZCiswMDIwOTggSEVDVFJPTklDIEFCCiswMDIwOTkgQk9OIEVMRUNUUklDIENPLiwgTFRELgorMDAyMDlBIFRIRSAzRE8gQ09NUEFOWQorMDAyMDlCIEVSU0FUIEVMRUNUUk9OSUMgR01CSAorMDAyMDlDIFBSSU1BUlkgQUNDRVNTIENPUlAuCiswMDIwOUQgTElQUEVSVCBBVVRPTUFUSU9OU1RFQ0hOSUsKKzAwMjA5RSBCUk9XTidTIE9QRVJBVElORyBTWVNURU0gU0VSVklDRVMsIExURC4KKzAwMjA5RiBNRVJDVVJZIENPTVBVVEVSIFNZU1RFTVMsIElOQy4KKzAwMjBBMCBPQSBMQUJPUkFUT1JZIENPLiwgTFRELgorMDAyMEExIERPVkFUUk9OCiswMDIwQTIgR0FMQ09NIE5FVFdPUktJTkcgTFRELgorMDAyMEEzIERJVklDT00gSU5DLgorMDAyMEE0IE1VTFRJUE9JTlQgTkVUV09SS1MKKzAwMjBBNSBBUEkgRU5HSU5FRVJJTkcKKzAwMjBBNiBQUk9YSU0sIElOQy4KKzAwMjBBNyBQQUlSR0FJTiBURUNITk9MT0dJRVMsIElOQy4KKzAwMjBBOCBTQVNUIFRFQ0hOT0xPR1kgQ09SUC4KKzAwMjBBOSBXSElURSBIT1JTRSBJTkRVU1RSSUFMCiswMDIwQUEgRElHSU1FRElBIFZJU0lPTiBMVEQuCiswMDIwQUIgTUlDUk8gSU5EVVNUUklFUyBDT1JQLgorMDAyMEFDIElOVEVSRkxFWCBEQVRFTlNZU1RFTUUgR01CSAorMDAyMEFEIExJTlEgU1lTVEVNUworMDAyMEFFIE9STkVUIERBVEEgQ09NTVVOSUNBVElPTiBURUNILgorMDAyMEFGIDNDT00gQ09SUE9SQVRJT04KKzAwMjBCMCBHQVRFV0FZIERFVklDRVMsIElOQy4KKzAwMjBCMSBDT01URUNIIFJFU0VBUkNIIElOQy4KKzAwMjBCMiBHS0QgR2VzZWxsc2NoYWZ0IEZ1ciBLb21tdW5pa2F0aW9uIFVuZCBEYXRlbnRlY2huaWsKKzAwMjBCMyBTQ0xURUMgQ09NTVVOSUNBVElPTlMgU1lTVEVNUworMDAyMEI0IFRFUk1BIEVMRUtUUk9OSUsgQVMKKzAwMjBCNSBZQVNLQVdBIEVMRUNUUklDIENPUlBPUkFUSU9OCiswMDIwQjYgQUdJTEUgTkVUV09SS1MsIElOQy4KKzAwMjBCNyBOQU1BUVVBIENPTVBVVEVSV0FSRQorMDAyMEI4IFBSSU1FIE9QVElPTiwgSU5DLgorMDAyMEI5IE1FVFJJQ09NLCBJTkMuCiswMDIwQkEgQ0VOVEVSIEZPUiBISUdIIFBFUkZPUk1BTkNFCiswMDIwQkIgWkFYIENPUlBPUkFUSU9OCiswMDIwQkMgSlRFQyBQVFkgTFRELgorMDAyMEJEIE5JT0JSQVJBIFIgJiBEIENPUlBPUkFUSU9OCiswMDIwQkUgTEFOIEFDQ0VTUyBDT1JQLgorMDAyMEJGIEFFSFIgVEVTVCBTWVNURU1TCiswMDIwQzAgUFVMU0UgRUxFQ1RST05JQ1MsIElOQy4KKzAwMjBDMSBUQUlLTyBFTEVDVFJJQyBXT1JLUywgTFRELgorMDAyMEMyIFRFWEFTIE1FTU9SWSBTWVNURU1TLCBJTkMuCiswMDIwQzMgQ09VTlRFUiBTT0xVVElPTlMgTFRELgorMDAyMEM0IElORVQsSU5DLgorMDAyMEM1IEVBR0xFIFRFQ0hOT0xPR1kKKzAwMjBDNiBORUNURUMKKzAwMjBDNyBBS0FJIFByb2Zlc3Npb25hbCBNLkkuIENvcnAuCiswMDIwQzggTEFSU0NPTSBJTkNPUlBPUkFURUQKKzAwMjBDOSBWSUNUUk9OIEJWCiswMDIwQ0EgRElHSVRBTCBPQ0VBTgorMDAyMENCIFBSRVRFQyBFTEVDVFJPTklDUyBDT1JQLgorMDAyMENDIERJR0lUQUwgU0VSVklDRVMsIExURC4KKzAwMjBDRCBIWUJSSUQgTkVUV09SS1MsIElOQy4KKzAwMjBDRSBMT0dJQ0FMIERFU0lHTiBHUk9VUCwgSU5DLgorMDAyMENGIFRFU1QgJiBNRUFTVVJFTUVOVCBTWVNURU1TIElOQworMDAyMEQwIFZFUlNBTFlOWCBDT1JQT1JBVElPTgorMDAyMEQxIE1JQ1JPQ09NUFVURVIgU1lTVEVNUyAoTSkgU0ROLgorMDAyMEQyIFJBRCBEQVRBIENPTU1VTklDQVRJT05TLCBMVEQuCiswMDIwRDMgT1NUIChPVUVTVCBTVEFOREFSRCBURUxFTUFUSVFVCiswMDIwRDQgQ0FCTEVUUk9OIC0gWkVJVFRORVQgSU5DLgorMDAyMEQ1IFZJUEEgR01CSAorMDAyMEQ2IEJSRUVaRUNPTQorMDAyMEQ3IEpBUEFOIE1JTklDT01QVVRFUiBTWVNURU1TIENPLiwgTHRkLgorMDAyMEQ4IE5vcnRlbCBOZXR3b3JrcworMDAyMEQ5IFBBTkFTT05JQyBURUNITk9MT0dJRVMsIElOQy4vTUlFQ08tVVMKKzAwMjBEQSBYWUxBTiBDT1JQT1JBVElPTgorMDAyMERCIFhORVQgVEVDSE5PTE9HWSwgSU5DLgorMDAyMERDIERFTlNJVFJPTiBUQUlXQU4gTFRELgorMDAyMEREIEN5YmVydGVjIFB0eSBMdGQKKzAwMjBERSBKQVBBTiBESUdJVEFMIExBQk9SQVQnWSBDTy5MVEQKKzAwMjBERiBLWU9TQU4gRUxFQ1RSSUMgTUZHLiBDTy4sIExURC4KKzAwMjBFMCBQUkVNQVggRUxFQ1RST05JQ1MsIElOQy4KKzAwMjBFMSBBTEFNQVIgRUxFQ1RST05JQ1MKKzAwMjBFMiBJTkZPUk1BVElPTiBSRVNPVVJDRSBFTkdJTkVFUklORworMDAyMEUzIE1DRCBLRU5DT00gQ09SUE9SQVRJT04KKzAwMjBFNCBIU0lORyBURUNIIEVOVEVSUFJJU0UgQ08uLCBMVEQKKzAwMjBFNSBBUEVYIERBVEEsIElOQy4KKzAwMjBFNiBMSURLT1BJTkcgTUFDSElORSBUT09MUyBBQgorMDAyMEU3IEImVyBOVUNMRUFSIFNFUlZJQ0UgQ09NUEFOWQorMDAyMEU4IERBVEFUUkVLIENPUlBPUkFUSU9OCiswMDIwRTkgREFOVEVMCiswMDIwRUEgRUZGSUNJRU5UIE5FVFdPUktTLCBJTkMuCiswMDIwRUIgQ0lOQ0lOTkFUSSBNSUNST1dBVkUsIElOQy4KKzAwMjBFQyBURUNIV0FSRSBTWVNURU1TIENPUlAuCiswMDIwRUQgR0lHQS1CWVRFIFRFQ0hOT0xPR1kgQ08uLCBMVEQuCiswMDIwRUUgR1RFQ0ggQ09SUE9SQVRJT04KKzAwMjBFRiBVU0MgQ09SUE9SQVRJT04KKzAwMjBGMCBVTklWRVJTQUwgTUlDUk9FTEVDVFJPTklDUyBDTy4KKzAwMjBGMSBBTFRPUyBJTkRJQSBMSU1JVEVECiswMDIwRjIgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLgorMDAyMEYzIFJBWU5FVCBDT1JQT1JBVElPTgorMDAyMEY0IFNQRUNUUklYIENPUlBPUkFUSU9OCiswMDIwRjUgUEFOREFURUwgQUcKKzAwMjBGNiBORVQgVEVLICBBTkQgS0FSTE5FVCwgSU5DLgorMDAyMEY3IENZQkVSREFUQQorMDAyMEY4IENBUlJFUkEgQ09NUFVURVJTLCBJTkMuCiswMDIwRjkgUEFSQUxJTksgTkVUV09SS1MsIElOQy4KKzAwMjBGQSBHREUgU1lTVEVNUywgSU5DLgorMDAyMEZCIE9DVEVMIENPTU1VTklDQVRJT05TIENPUlAuCiswMDIwRkMgTUFUUk9YCiswMDIwRkQgSVRWIFRFQ0hOT0xPR0lFUywgSU5DLgorMDAyMEZFIFRPUFdBUkUgSU5DLiAvIEdSQU5EIENPTVBVVEVSCiswMDIwRkYgU1lNTUVUUklDQUwgVEVDSE5PTE9HSUVTCiswMDMwMDAgQUxMV0VMTCBURUNITk9MT0dZIENPUlAuCiswMDMwMDEgU01QCiswMDMwMDIgRXhwYW5kIE5ldHdvcmtzCiswMDMwMDMgUGhhc3lzIEx0ZC4KKzAwMzAwNCBMRUFEVEVLIFJFU0VBUkNIIElOQy4KKzAwMzAwNSBGdWppdHN1IFNpZW1lbnMgQ29tcHV0ZXJzCiswMDMwMDYgU1VQRVJQT1dFUiBDT01QVVRFUgorMDAzMDA3IE9QVEksIElOQy4KKzAwMzAwOCBBVklPIERJR0lUQUwsIElOQy4KKzAwMzAwOSBUYWNoaW9uIE5ldHdvcmtzLCBJbmMuCiswMDMwMEEgQVpURUNIIFNZU1RFTVMgTFRELgorMDAzMDBCIG1QSEFTRSBUZWNobm9sb2dpZXMsIEluYy4KKzAwMzAwQyBDT05HUlVFTkNZLCBMVEQuCiswMDMwMEQgTU1DIFRlY2hub2xvZ3ksIEluYy4KKzAwMzAwRSBLbG90eiBEaWdpdGFsIEFHCiswMDMwMEYgSU1UIC0gSW5mb3JtYXRpb24gTWFuYWdlbWVudCBUCiswMDMwMTAgVklTSU9ORVRJQ1MgSU5URVJOQVRJT05BTAorMDAzMDExIEhNUyBGSUVMREJVUyBTWVNURU1TIEFCCiswMDMwMTIgRElHSVRBTCBFTkdJTkVFUklORyBMVEQuCiswMDMwMTMgTkVDIENvcnBvcmF0aW9uCiswMDMwMTQgRElWSU8sIElOQy4KKzAwMzAxNSBDUCBDTEFSRSBDT1JQLgorMDAzMDE2IElTSElEQSBDTy4sIExURC4KKzAwMzAxNyBURVJBU1RBQ0sgTFRELgorMDAzMDE4IEpldHdheSBJbmZvcm1hdGlvbiBDby4sIEx0ZC4KKzAwMzAxOSBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDMwMUEgU01BUlRCUklER0VTIFBURS4gTFRELgorMDAzMDFCIFNIVVRUTEUsIElOQy4KKzAwMzAxQyBBTFRWQVRFUiBBSVJEQVRBIFNZU1RFTVMKKzAwMzAxRCBTS1lTVFJFQU0sIElOQy4KKzAwMzAxRSAzQ09NIEV1cm9wZSBMdGQuCiswMDMwMUYgT1BUSUNBTCBORVRXT1JLUywgSU5DLgorMDAzMDIwIFRTSSwgSW5jLi4KKzAwMzAyMSBIU0lORyBURUNILiBFTlRFUlBSSVNFIENPLixMVEQKKzAwMzAyMiBGb25nIEthaSBJbmR1c3RyaWFsIENvLiwgTHRkLgorMDAzMDIzIENPR0VOVCBDT01QVVRFUiBTWVNURU1TLCBJTkMuCiswMDMwMjQgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAzMDI1IENIRUNLT1VUIENPTVBVVEVSIFNZU1RFTVMsIExURAorMDAzMDI2IEhFSVRFTAorMDAzMDI3IEtFUkJBTkdPLCBJTkMuCiswMDMwMjggRkFTRSBTYWxkYXR1cmEgc3JsCiswMDMwMjkgT1BJQ09NCiswMDMwMkEgU09VVEhFUk4gSU5GT1JNQVRJT04KKzAwMzAyQiBJTkFMUCBORVRXT1JLUywgSU5DLgorMDAzMDJDIFNZTEFOVFJPIFNZU1RFTVMgQ09SUE9SQVRJT04KKzAwMzAyRCBRVUFOVFVNIEJSSURHRSBDT01NVU5JQ0FUSU9OUworMDAzMDJFIEhvZnQgJiBXZXNzZWwgQUcKKzAwMzAyRiBTbWl0aHMgSW5kdXN0cmllcworMDAzMDMwIEhBUk1PTklYIENPUlBPUkFUSU9OCiswMDMwMzEgTElHSFRXQVZFIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDMwMzIgTWFnaWNSYW0sIEluYy4KKzAwMzAzMyBPUklFTlQgVEVMRUNPTSBDTy4sIExURC4KKzAwMzAzNiBSTVAgRUxFS1RST05JS1NZU1RFTUUgR01CSAorMDAzMDM3IFBhY2thcmQgQmVsbCBOZWMgU2VydmljZXMKKzAwMzAzOCBYQ1AsIElOQy4KKzAwMzAzOSBTT0ZUQk9PSyBQUkVTUworMDAzMDNBIE1BQVRFTAorMDAzMDNCIFBvd2VyQ29tIFRlY2hub2xvZ3kKKzAwMzAzQyBPTk5UTyBDT1JQLgorMDAzMDNEIElWQSBDT1JQT1JBVElPTgorMDAzMDNFIFJhZGNvbSBMdGQuCiswMDMwM0YgVHVyYm9Db21tIFRlY2ggSW5jLgorMDAzMDQwIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwMzA0MSBTQUVKSU4gVCAmIE0gQ08uLCBMVEQuCiswMDMwNDIgRGVUZVdlLURldXRzY2hlIFRlbGVwaG9ud2Vya2UKKzAwMzA0MyBJRFJFQU0gVEVDSE5PTE9HSUVTLCBQVEUuIExURC4KKzAwMzA0NCBQb3J0c21pdGggTExDCiswMDMwNDUgVmlsbGFnZSBOZXR3b3JrcywgSW5jLiAoVk5JKQorMDAzMDQ2IENvbnRyb2xsZWQgRWxlY3Ryb25pYyBNYW5hZ2VtZQorMDAzMDQ3IE5JU1NFSSBFTEVDVFJJQyBDTy4sIExURC4KKzAwMzA0OCBTdXBlcm1pY3JvIENvbXB1dGVyLCBJbmMuCiswMDMwNDkgQlJZQU5UIFRFQ0hOT0xPR1ksIExURC4KKzAwMzA0QSBGUkFVTkhPRkVSIElOU1RJVFVURSBJTVMKKzAwMzA0QiBPUkJBQ09NIFNZU1RFTVMsIElOQy4KKzAwMzA0QyBBUFBJQU4gQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwMzA0RCBFU0kKKzAwMzA0RSBCVVNURUMgUFJPRFVDVElPTiBMVEQuCiswMDMwNEYgUExBTkVUIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KKzAwMzA1MCBWZXJzYSBUZWNobm9sb2d5CiswMDMwNTEgT1JCSVQgQVZJT05JQyAmIENPTU1VTklDQVRJT04KKzAwMzA1MiBFTEFTVElDIE5FVFdPUktTCiswMDMwNTMgQmFzbGVyIEFHCiswMDMwNTQgQ0FTVExFTkVUIFRFQ0hOT0xPR1ksIElOQy4KKzAwMzA1NSBIaXRhY2hpIFNlbWljb25kdWN0b3IgQW1lcmljYSwKKzAwMzA1NiBCZWNrIElQQyBHbWJICiswMDMwNTcgRS1UZWwgQ29ycG9yYXRpb24KKzAwMzA1OCBBUEkgTU9USU9OCiswMDMwNTkgRElHSVRBTC1MT0dJQyBBRworMDAzMDVBIFRFTEdFTiBDT1JQT1JBVElPTgorMDAzMDVCIE1PRFVMRSBERVBBUlRNRU5UCiswMDMwNUMgU01BUiBMYWJvcmF0b3JpZXMgQ29ycC4KKzAwMzA1RCBESUdJVFJBIFNZU1RFTVMsIElOQy4KKzAwMzA1RSBBYmVsa28gSW5ub3ZhdGlvbgorMDAzMDVGIElNQUNPTiBBUFMKKzAwMzA2MCBTVEFSTUFUSVgsIElOQy4KKzAwMzA2MSBNb2J5VEVMCiswMDMwNjIgUEFUSCAxIE5FVFdPUksgVEVDSE5PTCdTIElOQy4KKzAwMzA2MyBTQU5URVJBIFNZU1RFTVMsIElOQy4KKzAwMzA2NCBBRExJTksgVEVDSE5PTE9HWSwgSU5DLgorMDAzMDY1IEFQUExFIENPTVBVVEVSLCBJTkMuCiswMDMwNjYgRElHSVRBTCBXSVJFTEVTUyBDT1JQT1JBVElPTgorMDAzMDY3IEJJT1NUQVIgTUlDUk9URUNIIElOVCdMIENPUlAuCiswMDMwNjggQ1lCRVJORVRJQ1MgVEVDSC4gQ08uLCBMVEQuCiswMDMwNjkgSU1QQUNDVCBURUNITk9MT0dZIENPUlAuCiswMDMwNkEgUEVOVEEgTUVESUEgQ08uLCBMVEQuCiswMDMwNkIgQ01PUyBTWVNURU1TLCBJTkMuCiswMDMwNkMgSGl0ZXggSG9sZGluZyBHbWJICiswMDMwNkQgTFVDRU5UIFRFQ0hOT0xPR0lFUworMDAzMDZFIEhFV0xFVFQgUEFDS0FSRAorMDAzMDZGIFNFWUVPTiBURUNILiBDTy4sIExURC4KKzAwMzA3MCAxTmV0IENvcnBvcmF0aW9uCiswMDMwNzEgQ2lzY28gU3lzdGVtcywgSW5jLgorMDAzMDcyIElOVEVMTElCWVRFIElOQy4KKzAwMzA3MyBJbnRlcm5hdGlvbmFsIE1pY3Jvc3lzdGVtcywgSW4KKzAwMzA3NCBFUVVJSU5FVCBMVEQuCiswMDMwNzUgQURURUNICiswMDMwNzYgQWthbWJhIENvcnBvcmF0aW9uCiswMDMwNzcgT05QUkVNIE5FVFdPUktTCiswMDMwNzggQ2lzY28gU3lzdGVtcywgSW5jLgorMDAzMDc5IENRT1MsIElOQy4KKzAwMzA3QSBBZHZhbmNlZCBUZWNobm9sb2d5ICYgU3lzdGVtcworMDAzMDdCIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMzA3QyBBRElEIFNBCiswMDMwN0QgR1JFIEFNRVJJQ0EsIElOQy4KKzAwMzA3RSBSZWRmbGV4IENvbW11bmljYXRpb24gU3lzdGVtcworMDAzMDdGIElSTEFOIExURC4KKzAwMzA4MCBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDMwODEgQUxUT1MgQyZDCiswMDMwODIgVEFJSEFOIEVMRUNUUklDIFdJUkUgQ08uLCBMVEQuCiswMDMwODMgSXZyb24gU3lzdGVtcworMDAzMDg0IEFMTElFRCBURUxFU1lOIElOVEVSTkFJT05BTAorMDAzMDg1IENJU0NPIFNZU1RFTVMsIElOQy4KKzAwMzA4NiBUcmFuc2lzdG9yIERldmljZXMsIEluYy4KKzAwMzA4NyBWRUdBIEdSSUVTSEFCRVIgS0cKKzAwMzA4OCBTaWFyYSBTeXN0ZW1zLCBJbmMuCiswMDMwODkgU3BlY3RyYXBvaW50IFdpcmVsZXNzLCBMTEMKKzAwMzA4QSBOSUNPVFJBIFNJU1RFTUkgUy5QLkEKKzAwMzA4QiBCcml4IE5ldHdvcmtzCiswMDMwOEMgQURWQU5DRUQgRElHSVRBTCBJTkZPUk1BVElPTgorMDAzMDhEIFBJTk5BQ0xFIFNZU1RFTVMsIElOQy4KKzAwMzA4RSBDUk9TUyBNQVRDSCBURUNITk9MT0dJRVMsIElOQy4KKzAwMzA4RiBNSUNSSUxPUiwgSW5jLgorMDAzMDkwIENZUkEgVEVDSE5PTE9HSUVTLCBJTkMuCiswMDMwOTEgVEFJV0FOIEZJUlNUIExJTkUgRUxFQy4gQ09SUC4KKzAwMzA5MiBNb2R1Tk9STSBHbWJICiswMDMwOTMgU09OTkVUIFRFQ0hOT0xPR0lFUywgSU5DLgorMDAzMDk0IENpc2NvIFN5c3RlbXMsIEluYy4KKzAwMzA5NSBQcm9jb21wIEluZm9ybWF0aWNzLCBMdGQuCiswMDMwOTYgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAzMDk3IEVYT01BVElDIEFCCiswMDMwOTggR2xvYmFsIENvbnZlcmdpbmcgVGVjaG5vbG9naWVzCiswMDMwOTkgQk9FTklHIFVORCBLQUxMRU5CQUNIIE9IRworMDAzMDlBIEFTVFJPIFRFUlJBIENPUlAuCiswMDMwOUIgU21hcnR3YXJlCiswMDMwOUMgVGltaW5nIEFwcGxpY2F0aW9ucywgSW5jLgorMDAzMDlEIE5pbWJsZSBNaWNyb3N5c3RlbXMsIEluYy4KKzAwMzA5RSBXT1JLQklUIENPUlBPUkFUSU9OLgorMDAzMDlGIEFNQkVSIE5FVFdPUktTCiswMDMwQTAgVFlDTyBTVUJNQVJJTkUgU1lTVEVNUywgTFRELgorMDAzMEExIFdFQkdBVEUgSW5jLgorMDAzMEEyIExpZ2h0bmVyIEVuZ2luZWVyaW5nCiswMDMwQTMgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDAzMEE0IFdvb2R3aW5kIENvbW11bmljYXRpb25zIFN5c3RlbQorMDAzMEE1IEFDVElWRSBQT1dFUgorMDAzMEE2IFZJQU5FVCBURUNITk9MT0dJRVMsIExURC4KKzAwMzBBNyBTQ0hXRUlUWkVSIEVOR0lORUVSSU5HCiswMDMwQTggT0wnRSBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDAzMEE5IE5ldGl2ZXJzZSwgSW5jLgorMDAzMEFBIEFYVVMgTUlDUk9TWVNURU1TLCBJTkMuCiswMDMwQUIgREVMVEEgTkVUV09SS1MsIElOQy4KKzAwMzBBQyBTeXN0ZW1lIExhdWVyIEdtYkggJiBDby4sIEx0ZC4KKzAwMzBBRCBTSEFOR0hBSSBDT01NVU5JQ0FUSU9OCiswMDMwQUUgVGltZXMgTiBTeXN0ZW0sIEluYy4KKzAwMzBBRiBIb25leXdlbGwgR21iSAorMDAzMEIwIENvbnZlcmdlbmV0IFRlY2hub2xvZ2llcworMDAzMEIxIEdPQyBHRVNFTExTQ0hBRlQgRlVSIE9QVElTQ0hFCiswMDMwQjIgV0VTQ0FNIC0gSEVBTERTQlVSRworMDAzMEIzIFNhbiBWYWxsZXkgU3lzdGVtcywgSW5jLgorMDAzMEI0IElOVEVSU0lMIENPUlAuCiswMDMwQjUgVGFkaXJhbiBNaWNyb3dhdmUgTmV0d29ya3MKKzAwMzBCNiBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDMwQjcgVGVsZXRyb2wgU3lzdGVtcywgSW5jLgorMDAzMEI4IFJpdmVyRGVsdGEgTmV0d29ya3MKKzAwMzBCOSBFQ1RFTAorMDAzMEJBIEFDJlQgU1lTVEVNIENPLiwgTFRELgorMDAzMEJCIENhY2hlRmxvdywgSW5jLgorMDAzMEJDIE9wdHJvbmljIEFHCiswMDMwQkQgQkVMS0lOIENPTVBPTkVOVFMKKzAwMzBCRSBDaXR5LU5ldCBUZWNobm9sb2d5LCBJbmMuCiswMDMwQkYgTVVMVElEQVRBIEdNQkgKKzAwMzBDMCBMYXJhIFRlY2hub2xvZ3ksIEluYy4KKzAwMzBDMSBIRVdMRVRULVBBQ0tBUkQKKzAwMzBDMiBDT01PTkUKKzAwMzBDMyBGTFVFQ0tJR0VSIEVMRUtUUk9OSUsgQUcKKzAwMzBDNCBOaWlnYXRhIENhbm90ZWMgQ28uLCBJbmMuCiswMDMwQzUgQ0FERU5DRSBERVNJR04gU1lTVEVNUworMDAzMEM2IENPTlRST0wgU09MVVRJT05TLCBJTkMuCiswMDMwQzcgTUFDUk9NQVRFIENPUlAuCiswMDMwQzggR0FEIExJTkUsIExURC4KKzAwMzBDOSBMdXhOLCBOCiswMDMwQ0EgRGlzY292ZXJ5IENvbQorMDAzMENCIE9NTkkgRkxPVyBDT01QVVRFUlMsIElOQy4KKzAwMzBDQyBUZW5vciBOZXR3b3JrcywgSW5jLgorMDAzMENEIENPTkVYQU5UIFNZU1RFTVMsIElOQy4KKzAwMzBDRSBaYWZmaXJlCiswMDMwQ0YgVFdPIFRFQ0hOT0xPR0lFUywgSU5DLgorMDAzMEQxIElOT1ZBIENPUlBPUkFUSU9OCiswMDMwRDIgV0lOIFRFQ0hOT0xPR0lFUywgQ08uLCBMVEQuCiswMDMwRDMgQWdpbGVudCBUZWNobm9sb2dpZXMKKzAwMzBENCBDT01USUVSCiswMDMwRDUgRFJlc2VhcmNoIEdtYkgKKzAwMzBENiBNU0MgVkVSVFJJRUJTIEdNQkgKKzAwMzBENyBJbm5vdmF0aXZlIFN5c3RlbXMsIEwuTC5DLgorMDAzMEQ4IFNJVEVLCiswMDMwRDkgREFUQUNPUkUgU09GVFdBUkUgQ09SUC4KKzAwMzBEQSBDT01UUkVORCBDTy4KKzAwMzBEQiBNaW5kcmVhZHkgU29sdXRpb25zLCBJbmMuCiswMDMwREMgUklHSFRFQ0ggQ09SUE9SQVRJT04KKzAwMzBERCBJTkRJR0lUQSBDT1JQT1JBVElPTgorMDAzMERFIFdBR08gS29udGFrdHRlY2huaWsgR21iSAorMDAzMERGIEtCL1RFTCBURUxFQ09NVU5JQ0FDSU9ORVMKKzAwMzBFMCBPWEZPUkQgU0VNSUNPTkRVQ1RPUiBMVEQuCiswMDMwRTEgQUNST1RST04gU1lTVEVNUywgSU5DLgorMDAzMEUyIEdBUk5FVCBTWVNURU1TIENPLiwgTFRELgorMDAzMEUzIFNFRE9OQSBORVRXT1JLUyBDT1JQLgorMDAzMEU0IENISVlPREEgU1lTVEVNIFJJS0VOCiswMDMwRTUgQW1wZXIgRGF0b3MgUy5BLgorMDAzMEU2IFNJRU1FTlMgTUVESUNBTCBTWVNURU1TCiswMDMwRTcgQ05GIE1PQklMRSBTT0xVVElPTlMsIElOQy4KKzAwMzBFOCBFTlNJTSBDT1JQLgorMDAzMEU5IEdNQSBDT01NVU5JQ0FUSU9OIE1BTlVGQUNUJ0cKKzAwMzBFQSBUZXJhRm9yY2UgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgorMDAzMEVCIFRVUkJPTkVUIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDMwRUMgQk9SR0FSRFQKKzAwMzBFRCBFeHBlcnQgTWFnbmV0aWNzIENvcnAuCiswMDMwRUUgRFNHIFRlY2hub2xvZ3ksIEluYy4KKzAwMzBFRiBORU9OIFRFQ0hOT0xPR1ksIElOQy4KKzAwMzBGMCBVbmlmb3JtIEluZHVzdHJpYWwgQ29ycC4KKzAwMzBGMSBBY2N0b24gVGVjaG5vbG9neSBDb3JwLgorMDAzMEYyIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwMzBGMyBBdCBXb3JrIENvbXB1dGVycworMDAzMEY0IFNUQVJET1QgVEVDSE5PTE9HSUVTCiswMDMwRjUgV2lsZCBMYWIuIEx0ZC4KKzAwMzBGNiBTRUNVUkVMT0dJWCBDT1JQT1JBVElPTgorMDAzMEY3IFJBTUlYIElOQy4KKzAwMzBGOCBEeW5hcHJvIFN5c3RlbXMsIEluYy4KKzAwMzBGOSBTb2xsYWUgU3lzdGVtcyBDby4sIEx0ZC4KKzAwMzBGQSBURUxJQ0EsIElOQy4KKzAwMzBGQiBBWlMgVGVjaG5vbG9neSBBRworMDAzMEZDIFRlcmF3YXZlIENvbW11bmljYXRpb25zLCBJbmMuCiswMDMwRkQgSU5URUdSQVRFRCBTWVNURU1TIERFU0lHTgorMDAzMEZFIERTQSBHbWJICiswMDMwRkYgREFUQUZBQiBTWVNURU1TLCBJTkMuCiswMDQwMDAgUENJIENPTVBPTkVOVEVTIERBIEFNWk9OSUEgTFRECiswMDQwMDEgWllYRUwgQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwNDAwMiBQRVJMRSBTWVNURU1TIExJTUlURUQKKzAwNDAwMyBXRVNUSU5HSE9VU0UgUFJPQ0VTUyBDT05UUk9MCiswMDQwMDQgSUNNIENPLiBMVEQuCiswMDQwMDUgQU5JIENPTU1VTklDQVRJT05TIElOQy4KKzAwNDAwNiBTQU1QTyBURUNITk9MT0dZIENPUlBPUkFUSU9OCiswMDQwMDcgVEVMTUFUIElORk9STUFUSVFVRQorMDA0MDA4IEEgUExVUyBJTkZPIENPUlBPUkFUSU9OCiswMDQwMDkgVEFDSElCQU5BIFRFQ1RST04gQ08uLCBMVEQuCiswMDQwMEEgUElWT1RBTCBURUNITk9MT0dJRVMsIElOQy4KKzAwNDAwQiBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDQwMEMgR0VORVJBTCBNSUNSTyBTWVNURU1TLCBJTkMuCiswMDQwMEQgTEFOTkVUIERBVEEgQ09NTVVOSUNBVElPTlMsTFRECiswMDQwMEUgTUVNT1RFQyBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDA0MDBGIERBVEFDT00gVEVDSE5PTE9HSUVTCiswMDQwMTAgU09OSUMgU1lTVEVNUywgSU5DLgorMDA0MDExIEFORE9WRVIgQ09OVFJPTFMgQ09SUE9SQVRJT04KKzAwNDAxMiBXSU5EQVRBLCBJTkMuCiswMDQwMTMgTlRUIERBVEEgQ09NTS4gU1lTVEVNUyBDT1JQLgorMDA0MDE0IENPTVNPRlQgR01CSAorMDA0MDE1IEFTQ09NIElORlJBU1lTIEFHCiswMDQwMTYgSEFEQVggRUxFQ1RST05JQ1MsIElOQy4KKzAwNDAxNyBYQ0QgSU5DLgorMDA0MDE4IEFET0JFIFNZU1RFTVMsIElOQy4KKzAwNDAxOSBBRU9OIFNZU1RFTVMsIElOQy4KKzAwNDAxQSBGVUpJIEVMRUNUUklDIENPLiwgTFRELgorMDA0MDFCIFBSSU5URVIgU1lTVEVNUyBDT1JQLgorMDA0MDFDIEFTVCBSRVNFQVJDSCwgSU5DLgorMDA0MDFEIElOVklTSUJMRSBTT0ZUV0FSRSwgSU5DLgorMDA0MDFFIElDQworMDA0MDFGIENPTE9SR1JBUEggTFRECiswMDQwMjAgUElOQUNMIENPTU1VTklDQVRJT04KKzAwNDAyMSBSQVNURVIgR1JBUEhJQ1MKKzAwNDAyMiBLTEVWRVIgQ09NUFVURVJTLCBJTkMuCiswMDQwMjMgTE9HSUMgQ09SUE9SQVRJT04KKzAwNDAyNCBDT01QQUMgSU5DLgorMDA0MDI1IE1PTEVDVUxBUiBEWU5BTUlDUworMDA0MDI2IE1FTENPLCBJTkMuCiswMDQwMjcgU01DIE1BU1NBQ0hVU0VUVFMsIElOQy4KKzAwNDAyOCBORVRDT01NIExJTUlURUQKKzAwNDAyOSBDT01QRVgKKzAwNDAyQSBDQU5PR0EtUEVSS0lOUworMDA0MDJCIFRSSUdFTSBDT01QVVRFUiwgSU5DLgorMDA0MDJDIElTSVMgRElTVFJJQlVURUQgU1lTVEVNUywgSU5DLgorMDA0MDJEIEhBUlJJUyBBREFDT00gQ09SUE9SQVRJT04KKzAwNDAyRSBQUkVDSVNJT04gU09GVFdBUkUsIElOQy4KKzAwNDAyRiBYTE5UIERFU0lHTlMgSU5DLgorMDA0MDMwIEdLIENPTVBVVEVSCiswMDQwMzEgS09LVVNBSSBFTEVDVFJJQyBDTy4sIExURAorMDA0MDMyIERJR0lUQUwgQ09NTVVOSUNBVElPTlMKKzAwNDAzMyBBRERUUk9OIFRFQ0hOT0xPR1kgQ08uLCBMVEQuCiswMDQwMzQgQlVTVEVLIENPUlBPUkFUSU9OCiswMDQwMzUgT1BDT00KKzAwNDAzNiBUUklCRSBDT01QVVRFUiBXT1JLUywgSU5DLgorMDA0MDM3IFNFQS1JTEFOLCBJTkMuCiswMDQwMzggVEFMRU5UIEVMRUNUUklDIElOQ09SUE9SQVRFRAorMDA0MDM5IE9QVEVDIERBSUlDSEkgREVOS08gQ08uLCBMVEQuCiswMDQwM0EgSU1QQUNUIFRFQ0hOT0xPR0lFUworMDA0MDNCIFNZTkVSSkVUIElOVEVSTkFUSU9OQUwgQ09SUC4KKzAwNDAzQyBGT1JLUywgSU5DLgorMDA0MDNEIFRFUkFEQVRBCiswMDQwM0UgUkFTVEVSIE9QUyBDT1JQT1JBVElPTgorMDA0MDNGIFNTQU5HWU9ORyBDT01QVVRFUiBTWVNURU1TCiswMDQwNDAgUklORyBBQ0NFU1MsIElOQy4KKzAwNDA0MSBGVUpJS1VSQSBMVEQuCiswMDQwNDIgTi5BLlQuIEdNQkgKKzAwNDA0MyBOT0tJQSBURUxFQ09NTVVOSUNBVElPTlMKKzAwNDA0NCBRTklYIENPTVBVVEVSIENPLiwgTFRELgorMDA0MDQ1IFRXSU5IRUFEIENPUlBPUkFUSU9OCiswMDQwNDYgVURDIFJFU0VBUkNIIExJTUlURUQKKzAwNDA0NyBXSU5EIFJJVkVSIFNZU1RFTVMKKzAwNDA0OCBTTUQgSU5GT1JNQVRJQ0EgUy5BLgorMDA0MDQ5IFRFR0lNRU5UQSBBRworMDA0MDRBIFdFU1QgQVVTVFJBTElBTiBERVBBUlRNRU5UCiswMDQwNEIgTUFQTEUgQ09NUFVURVIgU1lTVEVNUworMDA0MDRDIEhZUEVSVEVDIFBUWSBMVEQuCiswMDQwNEQgVEVMRUNPTU1VTklDQVRJT05TIFRFQ0hOSVFVRVMKKzAwNDA0RSBGTFVFTlQsIElOQy4KKzAwNDA0RiBTUEFDRSAmIE5BVkFMIFdBUkZBUkUgU1lTVEVNUworMDA0MDUwIElST05JQ1MsIElOQ09SUE9SQVRFRAorMDA0MDUxIEdSQUNJTElTLCBJTkMuCiswMDQwNTIgU1RBUiBURUNITk9MT0dJRVMsIElOQy4KKzAwNDA1MyBBTVBSTyBDT01QVVRFUlMKKzAwNDA1NCBDT05ORUNUSU9OIE1BQ0hJTkVTIFNFUlZJQ0VTCiswMDQwNTUgTUVUUk9OSVggR01CSAorMDA0MDU2IE1DTSBKQVBBTiBMVEQuCiswMDQwNTcgTE9DS0hFRUQgLSBTQU5ERVJTCiswMDQwNTggS1JPTk9TLCBJTkMuCiswMDQwNTkgWU9TSElEQSBLT0dZTyBLLiBLLgorMDA0MDVBIEdPTERTVEFSIElORk9STUFUSU9OICYgQ09NTS4KKzAwNDA1QiBGVU5BU1NFVCBMSU1JVEVECiswMDQwNUMgRlVUVVJFIFNZU1RFTVMsIElOQy4KKzAwNDA1RCBTVEFSLVRFSywgSU5DLgorMDA0MDVFIE5PUlRIIEhJTExTIElTUkFFTAorMDA0MDVGIEFGRSBDT01QVVRFUlMgTFRELgorMDA0MDYwIENPTUVOREVDIExURAorMDA0MDYxIERBVEFURUNIIEVOVEVSUFJJU0VTIENPLiwgTFRELgorMDA0MDYyIEUtU1lTVEVNUywgSU5DLi9HQVJMQU5EIERJVi4KKzAwNDA2MyBWSUEgVEVDSE5PTE9HSUVTLCBJTkMuCiswMDQwNjQgS0xBIElOU1RSVU1FTlRTIENPUlBPUkFUSU9OCiswMDQwNjUgR1RFIFNQQUNFTkVUCiswMDQwNjYgSElUQUNISSBDQUJMRSwgTFRELgorMDA0MDY3IE9NTklCWVRFIENPUlBPUkFUSU9OCiswMDQwNjggRVhURU5ERUQgU1lTVEVNUworMDA0MDY5IExFTUNPTSBTWVNURU1TLCBJTkMuCiswMDQwNkEgS0VOVEVLIElORk9STUFUSU9OIFNZU1RFTVMsSU5DCiswMDQwNkIgU1lTR0VOCiswMDQwNkMgQ09QRVJOSVFVRQorMDA0MDZEIExBTkNPLCBJTkMuCiswMDQwNkUgQ09ST0xMQVJZLCBJTkMuCiswMDQwNkYgU1lOQyBSRVNFQVJDSCBJTkMuCiswMDQwNzAgSU5URVJXQVJFIENPLiwgTFRELgorMDA0MDcxIEFUTSBDT01QVVRFUiBHTUJICiswMDQwNzIgQXBwbGllZCBJbm5vdmF0aW9uIEluYy4KKzAwNDA3MyBCQVNTIEFTU09DSUFURVMKKzAwNDA3NCBDQUJMRSBBTkQgV0lSRUxFU1MKKzAwNDA3NSBNLVRSQURFIChVSykgTFRECiswMDQwNzYgU3VuIENvbnZlcnNpb24gVGVjaG5vbG9naWVzCiswMDQwNzcgTUFYVE9OIFRFQ0hOT0xPR1kgQ09SUE9SQVRJT04KKzAwNDA3OCBXRUFSTkVTIEFVVE9NQVRJT04gUFRFIExURAorMDA0MDc5IEpVS08gTUFOVUZBQ1RVUkUgQ09NUEFOWSwgTFRELgorMDA0MDdBIFNPQ0lFVEUgRCdFWFBMT0lUQVRJT04gRFUgQ05JVAorMDA0MDdCIFNDSUVOVElGSUMgQVRMQU5UQQorMDA0MDdDIFFVTUUgQ09SUE9SQVRJT04KKzAwNDA3RCBFWFRFTlNJT04gVEVDSE5PTE9HWSBDT1JQLgorMDA0MDdFIEVWRVJHUkVFTiBTWVNURU1TLCBJTkMuCiswMDQwN0YgRkxJUiBTeXN0ZW1zCiswMDQwODAgQVRIRU5JWCBDT1JQT1JBVElPTgorMDA0MDgxIE1BTk5FU01BTk4gU0NBTkdSQVBISUMgR01CSAorMDA0MDgyIExBQk9SQVRPUlkgRVFVSVBNRU5UIENPUlAuCiswMDQwODMgVERBIElORFVTVFJJQSBERSBQUk9EVVRPUworMDA0MDg0IEhPTkVZV0VMTCBJTkMuCiswMDQwODUgU0FBQiBJTlNUUlVNRU5UUyBBQgorMDA0MDg2IE1JQ0hFTFMgJiBLTEVCRVJIT0ZGIENPTVBVVEVSCiswMDQwODcgVUJJVFJFWCBDT1JQT1JBVElPTgorMDA0MDg4IE1PQklVUyBURUNITk9MT0dJRVMsIElOQy4KKzAwNDA4OSBNRUlERU5TSEEgQ09SUE9SQVRJT04KKzAwNDA4QSBUUFMgVEVMRVBST0NFU1NJTkcgU1lTLiBHTUJICiswMDQwOEIgUkFZTEFOIENPUlBPUkFUSU9OCiswMDQwOEMgQVhJUyBDT01NVU5JQ0FUSU9OUyBBQgorMDA0MDhEIFRIRSBHT09EWUVBUiBUSVJFICYgUlVCQkVSIENPLgorMDA0MDhFIERJR0lMT0csIElOQy4KKzAwNDA4RiBXTS1EQVRBIE1JTkZPIEFCCiswMDQwOTAgQU5TRUwgQ09NTVVOSUNBVElPTlMKKzAwNDA5MSBQUk9DT01QIElORFVTVFJJQSBFTEVUUk9OSUNBCiswMDQwOTIgQVNQIENPTVBVVEVSIFBST0RVQ1RTLCBJTkMuCiswMDQwOTMgUEFYREFUQSBORVRXT1JLUyBMVEQuCiswMDQwOTQgU0hPR1JBUEhJQ1MsIElOQy4KKzAwNDA5NSBSLlAuVC4gSU5URVJHUk9VUFMgSU5UJ0wgTFRELgorMDA0MDk2IEFpcm9uZXQgV2lyZWxlc3MgQ29tbXVuaWNhdGlvbgorMDA0MDk3IERBVEVYIERJVklTSU9OIE9GCiswMDQwOTggRFJFU1NMRVIgR01CSCAmIENPLgorMDA0MDk5IE5FV0dFTiBTWVNURU1TIENPUlAuCiswMDQwOUEgTkVUV09SSyBFWFBSRVNTLCBJTkMuCiswMDQwOUIgSEFMIENPTVBVVEVSIFNZU1RFTVMgSU5DLgorMDA0MDlDIFRSQU5TV0FSRQorMDA0MDlEIERJR0lCT0FSRCwgSU5DLgorMDA0MDlFIENPTkNVUlJFTlQgVEVDSE5PTE9HSUVTICBMVEQuCiswMDQwOUYgTEFOQ0FTVC9DQVNBVCBURUNITk9MT0dZLCBJTkMuCiswMDQwQTAgR09MRFNUQVIgQ08uLCBMVEQuCiswMDQwQTEgRVJHTyBDT01QVVRJTkcKKzAwNDBBMiBLSU5HU1RBUiBURUNITk9MT0dZIElOQy4KKzAwNDBBMyBNSUNST1VOSVRZIFNZU1RFTVMgRU5HSU5FRVJJTkcKKzAwNDBBNCBST1NFIEVMRUNUUk9OSUNTCiswMDQwQTUgQ0xJTklDT01QIElOVEwuCiswMDQwQTYgQ3JheSwgSW5jLgorMDA0MEE3IElUQVVURUMgUEhJTENPIFMuQS4KKzAwNDBBOCBJTUYgSU5URVJOQVRJT05BTCBMVEQuCiswMDQwQTkgREFUQUNPTSBJTkMuCiswMDQwQUEgVkFMTUVUIEFVVE9NQVRJT04gSU5DLgorMDA0MEFCIFJPTEFORCBERyBDT1JQT1JBVElPTgorMDA0MEFDIFNVUEVSIFdPUktTVEFUSU9OLCBJTkMuCiswMDQwQUQgU01BIFJFR0VMU1lTVEVNRSBHTUJICiswMDQwQUUgREVMVEEgQ09OVFJPTFMsIElOQy4KKzAwNDBBRiBESUdJVEFMIFBST0RVQ1RTLCBJTkMuCiswMDQwQjAgQllURVggQ09SUE9SQVRJT04sIEVOR0lORUVSSU5HCiswMDQwQjEgQ09ET05JQ1MgSU5DLgorMDA0MEIyIFNZU1RFTUZPUlNDSFVORworMDA0MEIzIFBBUiBNSUNST1NZU1RFTVMgQ09SUE9SQVRJT04KKzAwNDBCNCBORVhUQ09NIEsuSy4KKzAwNDBCNSBWSURFTyBURUNITk9MT0dZIENPTVBVVEVSUyBMVEQKKzAwNDBCNiBDT01QVVRFUk0gIENPUlBPUkFUSU9OCiswMDQwQjcgU1RFQUxUSCBDT01QVVRFUiBTWVNURU1TCiswMDQwQjggSURFQSBBU1NPQ0lBVEVTCiswMDQwQjkgTUFDUSBFTEVDVFJPTklRVUUgU0EKKzAwNDBCQSBBTExJQU5UIENPTVBVVEVSIFNZU1RFTVMgQ09SUC4KKzAwNDBCQiBHT0xEU1RBUiBDQUJMRSBDTy4sIExURC4KKzAwNDBCQyBBTEdPUklUSE1JQ1MgTFRELgorMDA0MEJEIFNUQVJMSUdIVCBORVRXT1JLUywgSU5DLgorMDA0MEJFIEJPRUlORyBERUZFTlNFICYgU1BBQ0UKKzAwNDBCRiBDSEFOTkVMIFNZU1RFTVMgSU5URVJOJ0wgSU5DLgorMDA0MEMwIFZJU1RBIENPTlRST0xTIENPUlBPUkFUSU9OCiswMDQwQzEgQklaRVJCQS1XRVJLRSBXSUxIRUlNIEtSQVVUCiswMDQwQzIgQVBQTElFRCBDT01QVVRJTkcgREVWSUNFUworMDA0MEMzIEZJU0NIRVIgQU5EIFBPUlRFUiBDTy4KKzAwNDBDNCBLSU5LRUkgU1lTVEVNIENPUlBPUkFUSU9OCiswMDQwQzUgTUlDT00gQ09NTVVOSUNBVElPTlMgSU5DLgorMDA0MEM2IEZJQkVSTkVUIFJFU0VBUkNILCBJTkMuCiswMDQwQzcgUlVCWSBURUNIIENPUlBPUkFUSU9OCiswMDQwQzggTUlMQU4gVEVDSE5PTE9HWSBDT1JQT1JBVElPTgorMDA0MEM5IE5DVUJFCiswMDQwQ0EgRklSU1QgSU5URVJOQVQnTCBDT01QVVRFUiwgSU5DCiswMDQwQ0IgTEFOV0FOIFRFQ0hOT0xPR0lFUworMDA0MENDIFNJTENPTSBNQU5VRidHIFRFQ0hOT0xPR1kgSU5DLgorMDA0MENEIFRFUkEgTUlDUk9TWVNURU1TLCBJTkMuCiswMDQwQ0UgTkVULVNPVVJDRSwgSU5DLgorMDA0MENGIFNUUkFXQkVSUlkgVFJFRSwgSU5DLgorMDA0MEQwIE1JVEFDIElOVEVSTkFUSU9OQUwgQ09SUC4KKzAwNDBEMSBGVUtVREEgREVOU0hJIENPLiwgTFRELgorMDA0MEQyIFBBR0lORSBDT1JQT1JBVElPTgorMDA0MEQzIEtJTVBTSU9OIElOVEVSTkFUSU9OQUwgQ09SUC4KKzAwNDBENCBHQUdFIFRBTEtFUiBDT1JQLgorMDA0MEQ1IFNBUlRPUklVUyBBRworMDA0MEQ2IExPQ0FNQVRJT04gQi5WLgorMDA0MEQ3IFNUVURJTyBHRU4gSU5DLgorMDA0MEQ4IE9DRUFOIE9GRklDRSBBVVRPTUFUSU9OIExURC4KKzAwNDBEOSBBTUVSSUNBTiBNRUdBVFJFTkRTIElOQy4KKzAwNDBEQSBURUxTUEVDIExURAorMDA0MERCIEFEVkFOQ0VEIFRFQ0hOSUNBTCBTT0xVVElPTlMKKzAwNDBEQyBUUklURUMgRUxFQ1RST05JQyBHTUJICiswMDQwREQgSE9ORyBURUNITk9MT0dJRVMKKzAwNDBERSBFTEVUVFJPTklDQSBTQU4gR0lPUkdJTworMDA0MERGIERJR0FMT0cgU1lTVEVNUywgSU5DLgorMDA0MEUwIEFUT01XSURFIExURC4KKzAwNDBFMSBNQVJORVIgSU5URVJOQVRJT05BTCwgSU5DLgorMDA0MEUyIE1FU0EgUklER0UgVEVDSE5PTE9HSUVTLCBJTkMuCiswMDQwRTMgUVVJTiBTWVNURU1TIExURAorMDA0MEU0IEUtTSBURUNITk9MT0dZLCBJTkMuCiswMDQwRTUgU1lCVVMgQ09SUE9SQVRJT04KKzAwNDBFNiBDLkEuRS5OLgorMDA0MEU3IEFSTk9TIElOU1RSVU1FTlRTICYgQ09NUFVURVIKKzAwNDBFOCBDSEFSTEVTIFJJVkVSIERBVEEgU1lTVEVNUyxJTkMKKzAwNDBFOSBBQ0NPUkQgU1lTVEVNUywgSU5DLgorMDA0MEVBIFBMQUlOIFRSRUUgU1lTVEVNUyBJTkMKKzAwNDBFQiBNQVJUSU4gTUFSSUVUVEEgQ09SUE9SQVRJT04KKzAwNDBFQyBNSUtBU0EgU1lTVEVNIEVOR0lORUVSSU5HCiswMDQwRUQgTkVUV09SSyBDT05UUk9MUyBJTlQnTkFUTCBJTkMuCiswMDQwRUUgT1BUSU1FTQorMDA0MEVGIEhZUEVSQ09NLCBJTkMuCiswMDQwRjAgTUlDUk8gU1lTVEVNUywgSU5DLgorMDA0MEYxIENIVU8gRUxFQ1RST05JQ1MgQ08uLCBMVEQuCiswMDQwRjIgSkFOSUNIICYgS0xBU1MgQ09NUFVURVJURUNITklLCiswMDQwRjMgTkVUQ09SCiswMDQwRjQgQ0FNRU8gQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwNDBGNSBPRU0gRU5HSU5FUworMDA0MEY2IEtBVFJPTiBDT01QVVRFUlMgSU5DLgorMDA0MEY3IFBPTEFST0lEIE1FRElDQUwgSU1BR0lORyBTWVMuCiswMDQwRjggU1lTVEVNSEFVUyBESVNDT00KKzAwNDBGOSBDT01CSU5FVAorMDA0MEZBIE1JQ1JPQk9BUkRTLCBJTkMuCiswMDQwRkIgQ0FTQ0FERSBDT01NVU5JQ0FUSU9OUyBDT1JQLgorMDA0MEZDIElCUiBDT01QVVRFUiBURUNITklLIEdNQkgKKzAwNDBGRCBMWEUKKzAwNDBGRSBTWU1QTEVYIENPTU1VTklDQVRJT05TCiswMDQwRkYgVEVMRUJJVCBDT1JQT1JBVElPTgorMDA0MjUyIFJMWCBUZWNobm9sb2dpZXMKKzAwNTAwMCBORVhPIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDUwMDEgWUFNQVNISVRBIFNZU1RFTVMgQ09SUC4KKzAwNTAwMiBPTU5JU0VDIEFHCiswMDUwMDMgR1JFVEFHIE1BQ0JFVEggQUcKKzAwNTAwNCAzQ09NIENPUlBPUkFUSU9OCiswMDUwMDYgVEFDIEFCCiswMDUwMDcgU0lFTUVOUyBURUxFQ09NTVVOSUNBVElPTiBTWVNURU1TIExJTUlURUQKKzAwNTAwOCBUSVZBIE1JQ1JPQ09NUFVURVIgQ09SUC4gKFRNQykKKzAwNTAwOSBQSElMSVBTIEJST0FEQkFORCBORVRXT1JLUworMDA1MDBBIElSSVMgVEVDSE5PTE9HSUVTLCBJTkMuCiswMDUwMEIgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA1MDBDIGUtVGVrIExhYnMsIEluYy4KKzAwNTAwRCBTQVRPUkkgRUxFQ1RPUklDIENPLiwgTFRELgorMDA1MDBFIENIUk9NQVRJUyBORVRXT1JLUywgSU5DLgorMDA1MDBGIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNTAxMCBOb3ZhTkVUIExlYXJuaW5nLCBJbmMuCiswMDUwMTIgQ0JMIC0gR01CSAorMDA1MDEzIENoYXBhcnJhbCBOZXR3b3JrIFN0b3JhZ2UKKzAwNTAxNCBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDUwMTUgQlJJR0hUIFNUQVIgRU5HSU5FRVJJTkcKKzAwNTAxNiBTU1QvV09PREhFQUQgSU5EVVNUUklFUworMDA1MDE3IFJTUiBTLlIuTC4KKzAwNTAxOCBBRFZBTkNFRCBNVUxUSU1FRElBIElOVEVSTkVUIFRFQ0hOT0xPR1kgSU5DLgorMDA1MDE5IFNQUklORyBUSURFIE5FVFdPUktTLCBJTkMuCiswMDUwMUEgVUlTSVFOCiswMDUwMUIgQUJMIENBTkFEQSwgSU5DLgorMDA1MDFDIEpBVE9NIFNZU1RFTVMsIElOQy4KKzAwNTAxRSBNaXJhbmRhIFRlY2hub2xvZ2llcywgSW5jLgorMDA1MDFGIE1SRyBTWVNURU1TLCBMVEQuCiswMDUwMjAgTUVESUFTVEFSIENPLiwgTFRELgorMDA1MDIxIEVJUyBJTlRFUk5BVElPTkFMLCBJTkMuCiswMDUwMjIgWk9ORVQgVEVDSE5PTE9HWSwgSU5DLgorMDA1MDIzIFBHIERFU0lHTiBFTEVDVFJPTklDUywgSU5DLgorMDA1MDI0IE5BVklDIFNZU1RFTVMsIElOQy4KKzAwNTAyNiBDT1NZU1RFTVMsIElOQy4KKzAwNTAyNyBHRU5JQ09NIENPUlBPUkFUSU9OCiswMDUwMjggQVZBTCBDT01NVU5JQ0FUSU9OUworMDA1MDI5IDEzOTQgUFJJTlRFUiBXT1JLSU5HIEdST1VQCiswMDUwMkEgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA1MDJCIEdFTlJBRCBMVEQuCiswMDUwMkMgU09ZTyBDT01QVVRFUiwgSU5DLgorMDA1MDJEIEFDQ0VMLCBJTkMuCiswMDUwMkUgQ0FNQkVYIENPUlBPUkFUSU9OCiswMDUwMkYgVG9sbEJyaWRnZSBUZWNobm9sb2dpZXMsIEluYy4KKzAwNTAzMCBGVVRVUkUgUExVUyBTWVNURU1TCiswMDUwMzEgQUVST0ZMRVggTEFCT1JBVE9SSUVTLCBJTkMuCiswMDUwMzIgUElDQVpPIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDUwMzMgTUFZQU4gTkVUV09SS1MKKzAwNTAzNiBORVRDQU0sIExURC4KKzAwNTAzNyBLT0dBIEVMRUNUUk9OSUNTIENPLgorMDA1MDM4IERBSU4gVEVMRUNPTSBDTy4sIExURC4KKzAwNTAzOSBNQVJJTkVSIE5FVFdPUktTCiswMDUwM0EgREFUT05HIEVMRUNUUk9OSUNTIExURC4KKzAwNTAzQiBNRURJQUZJUkUgQ09SUE9SQVRJT04KKzAwNTAzQyBUU0lOR0hVQSBOT1ZFTCBFTEVDVFJPTklDUworMDA1MDNFIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNTAzRiBBTkNIT1IgR0FNRVMKKzAwNTA0MCBFTVdBUkUsIElOQy4KKzAwNTA0MSBDVFggT1BUTyBFTEVDVFJPTklDIENPUlAuCiswMDUwNDIgU0NJIE1BTlVGQUNUVVJJTkcgU0lOR0FQT1JFIFBURSwgTFRELgorMDA1MDQzIE1BUlZFTEwgU0VNSUNPTkRVQ1RPUiwgSU5DLgorMDA1MDQ0IEFTQUNBIENPUlBPUkFUSU9OCiswMDUwNDUgUklPV09SS1MgU09MVVRJT05TLCBJTkMuCiswMDUwNDYgTUVOSUNYIElOVEVSTkFUSU9OQUwgQ08uLCBMVEQuCiswMDUwNDggSU5GT0xJQlJJQQorMDA1MDQ5IEVMTEFDT1lBIE5FVFdPUktTLCBJTkMuCiswMDUwNEEgRUxURUNPIEEuUy4KKzAwNTA0QiBCQVJDT05FVCBOLlYuCiswMDUwNEMgR0FMSUwgTU9USU9OIENPTlRST0wsIElOQy4KKzAwNTA0RCBUT0tZTyBFTEVDVFJPTiBERVZJQ0UgTFRELgorMDA1MDRFIFNJRVJSQSBNT05JVE9SIENPUlAuCiswMDUwNEYgT0xFTkNPTSBFTEVDVFJPTklDUworMDA1MDUwIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNTA1MSBJV0FUU1UgRUxFQ1RSSUMgQ08uLCBMVEQuCiswMDUwNTIgVElBUkEgTkVUV09SS1MsIElOQy4KKzAwNTA1MyBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDUwNTQgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA1MDU1IERPTVMgQS9TCiswMDUwNTYgVk1XYXJlLCBJbmMuCiswMDUwNTcgQlJPQURCQU5EIEFDQ0VTUyBTWVNURU1TCiswMDUwNTggVkVHQVNUUkVBTSBMSU1JVEVECiswMDUwNTkgU1VJVEUgVEVDSE5PTE9HWSBTWVNURU1TIE5FVFdPUksKKzAwNTA1QSBORVRXT1JLIEFMQ0hFTVksIElOQy4KKzAwNTA1QiBLQVdBU0FLSSBMU0kgVS5TLkEuLCBJTkMuCiswMDUwNUMgVFVORE8gQ09SUE9SQVRJT04KKzAwNTA1RSBESUdJVEVLIE1JQ1JPTE9HSUMgUy5BLgorMDA1MDVGIEJSQU5EIElOTk9WQVRPUlMKKzAwNTA2MCBUQU5EQkVSRyBURUxFQ09NIEFTCiswMDUwNjIgS09VV0VMTCBFTEVDVFJPTklDUyBDT1JQLiAgKioKKzAwNTA2MyBPWSBDT01TRUwgU1lTVEVNIEFCCiswMDUwNjQgQ0FFIEVMRUNUUk9OSUNTCiswMDUwNjUgREVOU0VJLUxBTUJBRCBDby4sIEx0ZC4KKzAwNTA2NiBBdGVjb00gR21iSCBhZHZhbmNlZCB0ZWxlY29tdW5pY2F0aW9uIG1vZHVsZXMKKzAwNTA2NyBBRVJPQ09NTSwgSU5DLgorMDA1MDY4IEVMRUNUUk9OSUMgSU5EVVNUUklFUyBBU1NPQ0lBVElPTgorMDA1MDY5IFBpeFN0cmVhbSBJbmNvcnBvcmF0ZWQKKzAwNTA2QSBFREVWQSwgSU5DLgorMDA1MDZCIFNQWC1BVEVHCiswMDUwNkMgRyAmIEwgQkVJSkVSIEVMRUNUUk9OSUNTIEFCCiswMDUwNkQgVklERU9KRVQgU1lTVEVNUworMDA1MDZFIENPUkRFUiBFTkdJTkVFUklORyBDT1JQT1JBVElPTgorMDA1MDZGIEctQ09OTkVDVAorMDA1MDcwIENIQUlOVEVDSCBDT01QVVRFUiBDTy4sIExURC4KKzAwNTA3MSBBSVdBIENPLiwgTFRELgorMDA1MDcyIENPUlZJUyBDT1JQT1JBVElPTgorMDA1MDczIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNTA3NCBBRFZBTkNFRCBISS1URUNIIENPUlAuCiswMDUwNzUgS0VTVFJFTCBTT0xVVElPTlMKKzAwNTA3NiBJQk0KKzAwNTA3NyBQUk9MSUZJQyBURUNITk9MT0dZLCBJTkMuCiswMDUwNzggTUVHQVRPTiBIT1VTRSwgTFRELgorMDA1MDdBIFhQRUVELCBJTkMuCiswMDUwN0IgTUVSTE9UIENPTU1VTklDQVRJT05TCiswMDUwN0MgVklERU9DT04gQUcKKzAwNTA3RCBJRlAKKzAwNTA3RSBORVdFUiBURUNITk9MT0dZCiswMDUwN0YgRHJheVRlayBDb3JwLgorMDA1MDgwIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNTA4MSBNVVJBVEEgTUFDSElORVJZLCBMVEQuCiswMDUwODIgRk9SRVNTT04gQ09SUE9SQVRJT04KKzAwNTA4MyBHSUxCQVJDTywgSU5DLgorMDA1MDg0IEFUTCBQUk9EVUNUUworMDA1MDg2IFRFTEtPTSBTQSwgTFRELgorMDA1MDg3IFRFUkFTQUtJIEVMRUNUUklDIENPLiwgTFRELgorMDA1MDg4IEFNQU5PIENPUlBPUkFUSU9OCiswMDUwODkgU0FGRVRZIE1BTkFHRU1FTlQgU1lTVEVNUworMDA1MDhCIENPTVBBUSBDT01QVVRFUiBDT1JQT1JBVElPTgorMDA1MDhDIFJTSSBTWVNURU1TCiswMDUwOEQgQUJJVCBDT01QVVRFUiBDT1JQT1JBVElPTgorMDA1MDhFIE9QVElNQVRJT04sIElOQy4KKzAwNTA4RiBBU0lUQSBURUNITk9MT0dJRVMgSU5UJ0wgTFRELgorMDA1MDkwIERDVFJJCiswMDUwOTEgTkVUQUNDRVNTLCBJTkMuCiswMDUwOTIgUklHQUtVIElORFVTVFJJQUwgQ09SUE9SQVRJT04KKzAwNTA5MyBCT0VJTkcKKzAwNTA5NCBQQUNFIE1JQ1JPIFRFQ0hOT0xPR1kgUExDCiswMDUwOTUgUEVSQUNPTSBORVRXT1JLUworMDA1MDk2IFNBTElYIFRFQ0hOT0xPR0lFUywgSU5DLgorMDA1MDk3IE1NQy1FTUJFRERFRCBDT01QVVRFUlRFQ0hOSUsgR21iSAorMDA1MDk4IEdMT0JBTE9PUCwgTFRELgorMDA1MDk5IDNDT00gRVVST1BFLCBMVEQuCiswMDUwOUEgVEFHIEVMRUNUUk9OSUMgU1lTVEVNUworMDA1MDlCIFNXSVRDSENPUkUgQUIKKzAwNTA5QyBCRVRBIFJFU0VBUkNICiswMDUwOUQgVEhFIElORFVTVFJFRSBCLlYuCiswMDUwOUUgTGVzIFRlY2hub2xvZ2llcyBTb2Z0QWNvdXN0aWsgSW5jLgorMDA1MDlGIEhPUklaT04gQ09NUFVURVIKKzAwNTBBMCBERUxUQSBDT01QVVRFUiBTWVNURU1TLCBJTkMuCiswMDUwQTEgQ0FSTE8gR0FWQVpaSSwgSU5DLgorMDA1MEEyIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNTBBMyBUcmFuc01lZGlhIENvbW11bmljYXRpb25zLCBJbmMuCiswMDUwQTQgSU8gVEVDSCwgSU5DLgorMDA1MEE1IENBUElUT0wgQlVTSU5FU1MgU1lTVEVNUywgTFRELgorMDA1MEE2IE9QVFJPTklDUworMDA1MEE3IENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNTBBOCBPcGVuQ29uIFN5c3RlbXMsIEluYy4KKzAwNTBBOSBNT0xEQVQgV0lSRUxFU1MgVEVDSE5PTEdJRVMKKzAwNTBBQSBLT05JQ0EgTUlOT0xUQSBIT0xESU5HUywgSU5DLgorMDA1MEFCIE5BTFRFQywgSU5DLgorMDA1MEFDIE1BUExFIENPTVBVVEVSIENPUlBPUkFUSU9OCiswMDUwQUQgQ29tbVVuaXF1ZSBXaXJlbGVzcyBDb3JwLgorMDA1MEFFIElXQUtJIEVMRUNUUk9OSUNTIENPLiwgTFRELgorMDA1MEFGIElOVEVSR09OLCBJTkMuCiswMDUwQjAgVEVDSE5PTE9HWSBBVExBTlRBIENPUlBPUkFUSU9OCiswMDUwQjEgR0lERElOR1MgJiBMRVdJUworMDA1MEIyIEJST0RFTCBBVVRPTUFUSU9OCiswMDUwQjMgVk9JQ0VCT0FSRCBDT1JQT1JBVElPTgorMDA1MEI0IFNBVENIV0VMTCBDT05UUk9MIFNZU1RFTVMsIExURAorMDA1MEI1IEZJQ0hFVC1CQVVDSEUKKzAwNTBCNiBHT09EIFdBWSBJTkQuIENPLiwgTFRELgorMDA1MEI3IEJPU0VSIFRFQ0hOT0xPR1kgQ08uLCBMVEQuCiswMDUwQjggSU5PVkEgQ09NUFVURVJTIEdNQkggJiBDTy4gS0cKKzAwNTBCOSBYSVRST04gVEVDSE5PTE9HSUVTLCBJTkMuCiswMDUwQkEgRC1MSU5LCiswMDUwQkIgQ01TIFRFQ0hOT0xPR0lFUworMDA1MEJDIEhBTU1FUiBTVE9SQUdFIFNPTFVUSU9OUworMDA1MEJEIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNTBCRSBGQVNUIE1VTFRJTUVESUEgQUcKKzAwNTBCRiBNT1RPVEVDSCBJTkMuCiswMDUwQzAgR0FUQU4sIElOQy4KKzAwNTBDMSBHRU1GTEVYIE5FVFdPUktTLCBMVEQuCiswMDUwQzIgSUVFRSBSRUdJU1RSQVRJT04gQVVUSE9SSVRZCiswMDUwQzQgSU1ECiswMDUwQzUgQURTIFRFQ0hOT0xPR0lFUywgSU5DLgorMDA1MEM2IExPT1AgVEVMRUNPTU1VTklDQVRJT04gSU5URVJOQVRJT05BTCwgSU5DLgorMDA1MEM4IEFERE9OSUNTIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDUwQzkgTUFTUFJPIERFTktPSCBDT1JQLgorMDA1MENBIE5FVCBUTyBORVQgVEVDSE5PTE9HSUVTCiswMDUwQ0IgSkVUVEVSCiswMDUwQ0MgWFlSQVRFWAorMDA1MENEIERJR0lBTlNXRVIgQS9TCiswMDUwQ0UgTEcgSU5URVJOQVRJT05BTCBDT1JQLgorMDA1MENGIFZBTkxJTksgQ09NTVVOSUNBVElPTiBURUNITk9MT0dZIFJFU0VBUkNIIElOU1RJVFVURQorMDA1MEQwIE1JTkVSVkEgU1lTVEVNUworMDA1MEQxIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNTBEMiBCQUUgU3lzdGVtcyBDYW5hZGEsIEluYy4KKzAwNTBEMyBESUdJVEFMIEFVRElPIFBST0NFU1NJTkcgUFRZLiBMVEQuCiswMDUwRDQgSk9PSE9ORyBJTkZPUk1BVElPTiAmCiswMDUwRDUgQUQgU1lTVEVNUyBDT1JQLgorMDA1MEQ2IEFUTEFTIENPUENPIFRPT0xTIEFCCiswMDUwRDcgVEVMU1RSQVQKKzAwNTBEOCBVTklDT1JOIENPTVBVVEVSIENPUlAuCiswMDUwRDkgRU5HRVRST04tRU5HRU5IQVJJQSBFTEVUUk9OSUNBIElORC4gZSBDT00uIExUREEKKzAwNTBEQSAzQ09NIENPUlBPUkFUSU9OCiswMDUwREIgQ09OVEVNUE9SQVJZIENPTlRST0wKKzAwNTBEQyBUQVMgVEVMRUZPTkJBVSBBLiBTQ0hXQUJFIEdNQkggJiBDTy4gS0cKKzAwNTBERCBTRVJSQSBTT0xEQURVUkEsIFMuQS4KKzAwNTBERSBTSUdOVU0gU1lTVEVNUyBDT1JQLgorMDA1MERGIEFpckZpYmVyLCBJbmMuCiswMDUwRTEgTlMgVEVDSCBFTEVDVFJPTklDUyBTRE4gQkhECiswMDUwRTIgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA1MEUzIFRlcmF5b24gQ29tbXVuaWNhdGlvbnMgU3lzdGVtcworMDA1MEU0IEFQUExFIENPTVBVVEVSLCBJTkMuCiswMDUwRTYgSEFLVVNBTiBDT1JQT1JBVElPTgorMDA1MEU3IFBBUkFESVNFIElOTk9WQVRJT05TIChBU0lBKQorMDA1MEU4IE5PTUFESVggSU5DLgorMDA1MEVBIFhFTCBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDA1MEVCIEFMUEhBLVRPUCBDT1JQT1JBVElPTgorMDA1MEVDIE9MSUNPTSBBL1MKKzAwNTBFRCBBTkRBIE5FVFdPUktTCiswMDUwRUUgVEVLIERJR0lURUwgQ09SUE9SQVRJT04KKzAwNTBFRiBTUEUgU3lzdGVtaGF1cyBHbWJICiswMDUwRjAgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA1MEYxIExJQklUIFNJR05BTCBQUk9DRVNTSU5HLCBMVEQuCiswMDUwRjIgTUlDUk9TT0ZUIENPUlAuCiswMDUwRjMgR0xPQkFMIE5FVCBJTkZPUk1BVElPTiBDTy4sIEx0ZC4KKzAwNTBGNCBTSUdNQVRFSyBHTUJIICYgQ08uIEtHCiswMDUwRjYgUEFOLUlOVEVSTkFUSU9OQUwgSU5EVVNUUklBTCBDT1JQLgorMDA1MEY3IFZFTlRVUkUgTUFOVUZBQ1RVUklORyAoU0lOR0FQT1JFKSBMVEQuCiswMDUwRjggRU5UUkVHQSBURUNITk9MT0dJRVMsIElOQy4KKzAwNTBGQSBPWFRFTCwgTFRELgorMDA1MEZCIFZTSyBFTEVDVFJPTklDUworMDA1MEZDIEVESU1BWCBURUNITk9MT0dZIENPLiwgTFRELgorMDA1MEZEIFZJU0lPTkNPTU0gQ08uLCBMVEQuCiswMDUwRkUgUENUVm5ldCBBU0EKKzAwNTBGRiBIQUtLTyBFTEVDVFJPTklDUyBDTy4sIExURC4KKzAwNjAwMCBYWUNPTSBJTkMuCiswMDYwMDEgSW5ub1N5cywgSW5jLgorMDA2MDAyIFNDUkVFTiBTVUJUSVRMSU5HIFNZU1RFTVMsIExURAorMDA2MDAzIFRFUkFPS0EgV0VJR0ggU1lTVEVNIFBURSwgTFRELgorMDA2MDA0IENPTVBVVEFET1JFUyBNT0RVTEFSRVMgU0EKKzAwNjAwNSBGRUVEQkFDSyBEQVRBIExURC4KKzAwNjAwNiBTT1RFQyBDTy4sIExURAorMDA2MDA3IEFDUkVTIEdBTUlORywgSU5DLgorMDA2MDA4IDNDT00gQ09SUE9SQVRJT04KKzAwNjAwOSBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDYwMEEgU09SRCBDT01QVVRFUiBDT1JQT1JBVElPTgorMDA2MDBCIExPR1dBUkUgR21iSAorMDA2MDBDIEFQUExJRUQgREFUQSBTWVNURU1TLCBJTkMuCiswMDYwMEQgRGlnaXRhbCBMb2dpYyBHbWJICiswMDYwMEUgV0FWRU5FVCBJTlRFUk5BVElPTkFMLCBJTkMuCiswMDYwMEYgV0VTVEVMTCwgSU5DLgorMDA2MDEwIE5FVFdPUksgTUFDSElORVMsIElOQy4KKzAwNjAxMSBDUllTVEFMIFNFTUlDT05EVUNUT1IgQ09SUC4KKzAwNjAxMiBQT1dFUiBDT01QVVRJTkcgQ09SUE9SQVRJT04KKzAwNjAxMyBORVRTVEFMIE1BU0NISU5FTiBBRworMDA2MDE0IEVERUMgQ08uLCBMVEQuCiswMDYwMTUgTkVUMk5FVCBDT1JQT1JBVElPTgorMDA2MDE2IENMQVJJSU9OCiswMDYwMTcgVE9LSU1FQyBJTkMuCiswMDYwMTggU1RFTExBUiBPTkUgQ09SUE9SQVRJT04KKzAwNjAxOSBSb2NoZSBEaWFnbm9zdGljcworMDA2MDFBIEtFSVRITEVZIElOU1RSVU1FTlRTCiswMDYwMUIgTUVTQSBFTEVDVFJPTklDUworMDA2MDFDIFRFTFhPTiBDT1JQT1JBVElPTgorMDA2MDFEIExVQ0VOVCBURUNITk9MT0dJRVMKKzAwNjAxRSBTT0ZUTEFCLCBJTkMuCiswMDYwMUYgU1RBTExJT04gVEVDSE5PTE9HSUVTCiswMDYwMjAgUElWT1RBTCBORVRXT1JLSU5HLCBJTkMuCiswMDYwMjEgRFNDIENPUlBPUkFUSU9OCiswMDYwMjIgVklDT00gU1lTVEVNUywgSU5DLgorMDA2MDIzIFBFUklDT00gU0VNSUNPTkRVQ1RPUiBDT1JQLgorMDA2MDI0IEdSQURJRU5UIFRFQ0hOT0xPR0lFUywgSU5DLgorMDA2MDI1IEFDVElWRSBJTUFHSU5HIFBMQworMDA2MDI2IFZJS0lORyBDT01QT05FTlRTLCBJTkMuCiswMDYwMjcgU3VwZXJpb3IgTW9kdWxhciBQcm9kdWN0cworMDA2MDI4IE1BQ1JPVklTSU9OIENPUlBPUkFUSU9OCiswMDYwMjkgQ0FSWSBQRVJJUEhFUkFMUyBJTkMuCiswMDYwMkEgU1lNSUNST04gQ09NUFVURVIgQ09NTVVOSUNBVElPTlMsIExURC4KKzAwNjAyQiBQRUFLIEFVRElPCiswMDYwMkMgTElOWCBEYXRhIFRlcm1pbmFscywgSW5jLgorMDA2MDJEIEFMRVJUT04gVEVDSE5PTE9HSUVTLCBJTkMuCiswMDYwMkUgQ1lDTEFERVMgQ09SUE9SQVRJT04KKzAwNjAyRiBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDYwMzAgVklMTEFHRSBUUk9OSUMgRU5UV0lDS0xVTkcKKzAwNjAzMSBIUksgU1lTVEVNUworMDA2MDMyIEktQ1VCRSwgSU5DLgorMDA2MDMzIEFDVUlUWSBJTUFHSU5HLCBJTkMuCiswMDYwMzQgUk9CRVJUIEJPU0NIIEdtYkgKKzAwNjAzNSBEQUxMQVMgU0VNSUNPTkRVQ1RPUiwgSU5DLgorMDA2MDM2IEFVU1RSSUFOIFJFU0VBUkNIIENFTlRFUiBTRUlCRVJTRE9SRgorMDA2MDM3IFBISUxJUFMgU0VNSUNPTkRVQ1RPUlMKKzAwNjAzOCBOb3J0ZWwgTmV0d29ya3MKKzAwNjAzOSBTYW5Db20gVGVjaG5vbG9neSwgSW5jLgorMDA2MDNBIFFVSUNLIENPTlRST0xTIExURC4KKzAwNjAzQiBBTVRFQyBzcGEKKzAwNjAzQyBIQUdJV0FSQSBTWVMtQ09NIENPLiwgTFRELgorMDA2MDNEIDNDWAorMDA2MDNFIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNjAzRiBQQVRBUFNDTyBERVNJR05TCiswMDYwNDAgTkVUUk8gQ09SUC4KKzAwNjA0MSBZb2tvZ2F3YSBFbGVjdHJpYyBDb3Jwb3JhdGlvbgorMDA2MDQyIFRLUyAoVVNBKSwgSU5DLgorMDA2MDQzIENvbVNvZnQgU3lzdGVtcywgSW5jLgorMDA2MDQ0IExJVFRPTi9QT0xZLVNDSUVOVElGSUMKKzAwNjA0NSBQQVRITElHSFQgVEVDSE5PTE9HSUVTCiswMDYwNDYgVk1FVFJPLCBJTkMuCiswMDYwNDcgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA2MDQ4IEVNQyBDT1JQT1JBVElPTgorMDA2MDQ5IFZJTkEgVEVDSE5PTE9HSUVTCiswMDYwNEEgU0FJQyBJREVBUyBHUk9VUAorMDA2MDRCIEJJT0RBVEEgR21iSAorMDA2MDRDIFNBVAorMDA2MDREIE1NQyBORVRXT1JLUywgSU5DLgorMDA2MDRFIENZQ0xFIENPTVBVVEVSIENPUlBPUkFUSU9OLCBJTkMuCiswMDYwNEYgU1VaVUtJIE1GRy4gQ08uLCBMVEQuCiswMDYwNTAgSU5URVJOSVggSU5DLgorMDA2MDUxIFFVQUxJVFkgU0VNSUNPTkRVQ1RPUgorMDA2MDUyIFBFUklQSEVSQUxTIEVOVEVSUFJJU0UgQ08uLCBMdGQuCiswMDYwNTMgVE9ZT0RBIE1BQ0hJTkUgV09SS1MsIExURC4KKzAwNjA1NCBDT05UUk9MV0FSRSBHTUJICiswMDYwNTUgQ09STkVMTCBVTklWRVJTSVRZCiswMDYwNTYgTkVUV09SSyBUT09MUywgSU5DLgorMDA2MDU3IE1VUkFUQSBNQU5VRkFDVFVSSU5HIENPLiwgTFRELgorMDA2MDU4IENPUFBFUiBNT1VOVEFJTiBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDA2MDU5IFRFQ0hOSUNBTCBDT01NVU5JQ0FUSU9OUyBDT1JQLgorMDA2MDVBIENFTENPUkUsIElOQy4KKzAwNjA1QiBJbnRyYVNlcnZlciBUZWNobm9sb2d5LCBJbmMuCiswMDYwNUMgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA2MDVEIFNDQU5JVkFMVkUgQ09SUC4KKzAwNjA1RSBMSUJFUlRZIFRFQ0hOT0xPR1kgTkVUV09SS0lORworMDA2MDVGIE5JUFBPTiBVTklTT0ZUIENPUlBPUkFUSU9OCiswMDYwNjAgREFXTklORyBURUNITk9MT0dJRVMsIElOQy4KKzAwNjA2MSBXSElTVExFIENPTU1VTklDQVRJT05TIENPUlAuCiswMDYwNjIgVEVMRVNZTkMsIElOQy4KKzAwNjA2MyBQU0lPTiBEQUNPTSBQTEMuCiswMDYwNjQgTkVUQ09NTSBMSU1JVEVECiswMDYwNjUgQkVSTkVDS0VSICYgUkFJTkVSIElORFVTVFJJRS1FTEVLVFJPTklDIEdtYkgKKzAwNjA2NiBMQUNST0lYIFRFQ0hOT0xHSUUKKzAwNjA2NyBBQ0VSIE5FVFhVUyBJTkMuCiswMDYwNjggRUlDT04gVEVDSE5PTE9HWSBDT1JQT1JBVElPTgorMDA2MDY5IEJST0NBREUgQ09NTVVOSUNBVElPTlMgU1lTVEVNUywgSW5jLgorMDA2MDZBIE1JVFNVQklTSEkgV0lSRUxFU1MgQ09NTVVOSUNBVElPTlMuIElOQy4KKzAwNjA2QiBTeW5jbGF5ZXIgSW5jLgorMDA2MDZDIEFSRVNDT00KKzAwNjA2RCBESUdJVEFMIEVRVUlQTUVOVCBDT1JQLgorMDA2MDZFIERBVklDT00gU0VNSUNPTkRVQ1RPUiwgSU5DLgorMDA2MDZGIENMQVJJT04gQ09SUE9SQVRJT04gT0YgQU1FUklDQQorMDA2MDcwIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwNjA3MSBNSURBUyBMQUIsIElOQy4KKzAwNjA3MiBWWEwgSU5TVFJVTUVOVFMsIExJTUlURUQKKzAwNjA3MyBSRURDUkVFSyBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDA2MDc0IFFTQyBBVURJTyBQUk9EVUNUUworMDA2MDc1IFBFTlRFSywgSU5DLgorMDA2MDc2IFNDSExVTUJFUkdFUiBURUNITk9MT0dJRVMgUkVUQUlMIFBFVFJPTEVVTSBTWVNURU1TCiswMDYwNzcgUFJJU0EgTkVUV09SS1MKKzAwNjA3OCBQT1dFUiBNRUFTVVJFTUVOVCBMVEQuCiswMDYwNzkgTWFpbnN0cmVhbSBEYXRhLCBJbmMuCiswMDYwN0EgRFZTIEdtYkgKKzAwNjA3QiBGT1JFIFNZU1RFTVMsIElOQy4KKzAwNjA3QyBXYXZlQWNjZXNzLCBMdGQuCiswMDYwN0QgU0VOVElFTlQgTkVUV09SS1MgSU5DLgorMDA2MDdFIEdJR0FMQUJTLCBJTkMuCiswMDYwN0YgQVVST1JBIFRFQ0hOT0xPR0lFUywgSU5DLgorMDA2MDgwIE1JQ1JPVFJPTklYIERBVEFDT00gTFRELgorMDA2MDgxIFRWL0NPTSBJTlRFUk5BVElPTkFMCiswMDYwODIgTk9WQUxJTksgVEVDSE5PTE9HSUVTLCBJTkMuCiswMDYwODMgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA2MDg0IERJR0lUQUwgVklERU8KKzAwNjA4NSBTdG9yYWdlIENvbmNlcHRzCiswMDYwODYgTE9HSUMgUkVQTEFDRU1FTlQgVEVDSC4gTFRELgorMDA2MDg3IEtBTlNBSSBFTEVDVFJJQyBDTy4sIExURC4KKzAwNjA4OCBXSElURSBNT1VOVEFJTiBEU1AsIElOQy4KKzAwNjA4OSBYQVRBCiswMDYwOEEgQ0lUQURFTCBDT01QVVRFUgorMDA2MDhCIENvbmZlclRlY2ggSW50ZXJuYXRpb25hbAorMDA2MDhDIDNDT00gQ09SUE9SQVRJT04KKzAwNjA4RCBVTklQVUxTRSBDT1JQLgorMDA2MDhFIEhFIEVMRUNUUk9OSUNTLCBURUNITk9MT0dJRSAmIFNZU1RFTVRFQ0hOSUsgR21iSAorMDA2MDhGIFRFS1JBTSBURUNITk9MT0dZIENPLiwgTFRELgorMDA2MDkwIEFCTEUgQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwNjA5MSBGSVJTVCBQQUNJRklDIE5FVFdPUktTLCBJTkMuCiswMDYwOTIgTUlDUk8vU1lTLCBJTkMuCiswMDYwOTMgVkFSSUFOCiswMDYwOTQgSUJNIENPUlAuCiswMDYwOTUgQUNDVS1USU1FIFNZU1RFTVMsIElOQy4KKzAwNjA5NiBULlMuIE1JQ1JPVEVDSCBJTkMuCiswMDYwOTcgM0NPTSBDT1JQT1JBVElPTgorMDA2MDk4IEhUIENPTU1VTklDQVRJT05TCiswMDYwOTkgTEFOIE1FRElBIENPUlBPUkFUSU9OCiswMDYwOUEgTkpLIFRFQ0hOTyBDTy4KKzAwNjA5QiBBU1RSTy1NRUQsIElOQy4KKzAwNjA5QyBQZXJraW4tRWxtZXIgSW5jb3Jwb3JhdGVkCiswMDYwOUQgUE1JIEZPT0QgRVFVSVBNRU5UIEdST1VQCiswMDYwOUUgQVNDIFgzIC0gSU5GT1JNQVRJT04gVEVDSE5PTE9HWSBTVEFOREFSRFMgU0VDUkVUQVJJQVRTCiswMDYwOUYgUEhBU1QgQ09SUE9SQVRJT04KKzAwNjBBMCBTV0lUQ0hFRCBORVRXT1JLIFRFQ0hOT0xPR0lFUywgSU5DLgorMDA2MEExIFZQTmV0LCBJbmMuCiswMDYwQTIgTklIT04gVU5JU1lTIExJTUlURUQgQ08uCiswMDYwQTMgQ09OVElOVVVNIFRFQ0hOT0xPR1kgQ09SUC4KKzAwNjBBNCBHUklOQUtFUiBTWVNURU0gVEVDSE5PTE9HSUVTCiswMDYwQTUgUEVSRk9STUFOQ0UgVEVMRUNPTSBDT1JQLgorMDA2MEE2IFBBUlRJQ0xFIE1FQVNVUklORyBTWVNURU1TCiswMDYwQTcgTUlDUk9TRU5TIEdtYkggJiBDTy4gS0cKKzAwNjBBOCBUSURPTUFUIEFCCiswMDYwQTkgR0VTWVRFQyBNYkgKKzAwNjBBQSBJTlRFTExJR0VOVCBERVZJQ0VTIElOQy4gKElESSkKKzAwNjBBQiBMQVJTQ09NIElOQ09SUE9SQVRFRAorMDA2MEFDIFJFU0lMSUVOQ0UgQ09SUE9SQVRJT04KKzAwNjBBRCBNZWdhQ2hpcHMgQ29ycG9yYXRpb24KKzAwNjBBRSBUUklPIElORk9STUFUSU9OIFNZU1RFTVMgQUIKKzAwNjBBRiBQQUNJRklDIE1JQ1JPIERBVEEsIElOQy4KKzAwNjBCMCBIRVdMRVRULVBBQ0tBUkQgQ08uCiswMDYwQjEgSU5QVVQvT1VUUFVULCBJTkMuCiswMDYwQjIgUFJPQ0VTUyBDT05UUk9MIENPUlAuCiswMDYwQjMgWi1DT00sIElOQy4KKzAwNjBCNCBHTEVOQVlSRSBSJkQgSU5DLgorMDA2MEI1IEtFQkEgR21iSAorMDA2MEI2IExBTkQgQ09NUFVURVIgQ08uLCBMVEQuCiswMDYwQjcgQ0hBTk5FTE1BVElDLCBJTkMuCiswMDYwQjggQ09SRUxJUyBJTkMuCiswMDYwQjkgTklUU1VLTyBDT1JQT1JBVElPTgorMDA2MEJBIFNBSEFSQSBORVRXT1JLUywgSU5DLgorMDA2MEJCIENBQkxFVFJPTiAtIE5FVExJTkssIElOQy4KKzAwNjBCQyBLZXVuWW91bmcgRWxlY3Ryb25pY3MgJiBDb21tdW5pY2F0aW9uIENvLiwgTHRkLgorMDA2MEJEIEhVQkJFTEwtUFVMU0VDT00KKzAwNjBCRSBXRUJUUk9OSUNTCiswMDYwQkYgTUFDUkFJR09SIFNZU1RFTVMsIElOQy4KKzAwNjBDMCBORVJBIEFTCiswMDYwQzEgV2F2ZVNwYW4gQ29ycG9yYXRpb24KKzAwNjBDMiBNUEwgQUcKKzAwNjBDMyBORVRWSVNJT04gQ09SUE9SQVRJT04KKzAwNjBDNCBTT0xJVE9OIFNZU1RFTVMgSy5LLgorMDA2MEM1IEFOQ09UIENPUlAuCiswMDYwQzYgRENTIEFHCiswMDYwQzcgQU1BVEkgQ09NTVVOSUNBVElPTlMgQ09SUC4KKzAwNjBDOCBLVUtBIFdFTERJTkcgU1lTVEVNUyAmIFJPQk9UUworMDA2MEM5IENvbnRyb2xOZXQsIEluYy4KKzAwNjBDQSBIQVJNT05JQyBTWVNURU1TIElOQ09SUE9SQVRFRAorMDA2MENCIEhJVEFDSEkgWk9TRU4gQ09SUE9SQVRJT04KKzAwNjBDQyBFTVRSQUssIElOQ09SUE9SQVRFRAorMDA2MENEIFZpZGVvU2VydmVyLCBJbmMuCiswMDYwQ0UgQUNDTEFJTSBDT01NVU5JQ0FUSU9OUworMDA2MENGIEFMVEVPTiBORVRXT1JLUywgSU5DLgorMDA2MEQwIFNOTVAgUkVTRUFSQ0ggSU5DT1JQT1JBVEVECiswMDYwRDEgQ0FTQ0FERSBDT01NVU5JQ0FUSU9OUworMDA2MEQyIExVQ0VOVCBURUNITk9MT0dJRVMgVEFJV0FOIFRFTEVDT01NVU5JQ0FUSU9OUyBDTy4sIExURC4KKzAwNjBEMyBBVCZUCiswMDYwRDQgRUxEQVQgQ09NTVVOSUNBVElPTiBMVEQuCiswMDYwRDUgTUlZQUNISSBURUNITk9TIENPUlAuCiswMDYwRDYgTm92QXRlbCBXaXJlbGVzcyBUZWNobm9sb2dpZXMgTHRkLgorMDA2MEQ3IEVDT0xFIFBPTFlURUNITklRVUUgRkVERVJBTEUgREUgTEFVU0FOTkUgKEVQRkwpCiswMDYwRDggRUxNSUMgU1lTVEVNUywgSU5DLgorMDA2MEQ5IFRSQU5TWVMgTkVUV09SS1MgSU5DLgorMDA2MERBIEpCTSBFTEVDVFJPTklDUyBDTy4KKzAwNjBEQiBOVFAgRUxFS1RST05JSyBBL1MKKzAwNjBEQyBUT1lPIENPTU1VTklDQVRJT04gRVFVSVBNRU5UIENvLiwgTHRkLgorMDA2MEREIE1ZUklDT00sIElOQy4KKzAwNjBERSBLQVlTRVItVEhSRURFIEdtYkgKKzAwNjBERiBDTlQgQ29ycG9yYXRpb24KKzAwNjBFMCBBWElPTSBURUNITk9MT0dZIENPLiwgTFRELgorMDA2MEUxIE9SQ0tJVCBDT01NVU5JQ0FUSU9OUyBMVEQuCiswMDYwRTIgUVVFU1QgRU5HSU5FRVJJTkcgJiBERVZFTE9QTUVOVAorMDA2MEUzIEFSQklOIElOU1RSVU1FTlRTCiswMDYwRTQgQ09NUFVTRVJWRSwgSU5DLgorMDA2MEU1IEZVSkkgQVVUT01BVElPTiBDTy4sIExURC4KKzAwNjBFNiBTSE9NSVRJIFNZU1RFTVMgSU5DT1JQT1JBVEVECiswMDYwRTcgUkFOREFUQQorMDA2MEU4IEhJVEFDSEkgQ09NUFVURVIgUFJPRFVDVFMgKEFNRVJJQ0EpLCBJTkMuCiswMDYwRTkgQVRPUCBURUNITk9MT0dJRVMsIElOQy4KKzAwNjBFQSBTdHJlYW1Mb2dpYworMDA2MEVCIEZPVVJUSFRSQUNLIFNZU1RFTVMKKzAwNjBFQyBIRVJNQVJZIE9QVE8gRUxFQ1RST05JQ1MgSU5DLgorMDA2MEVEIFJJQ0FSRE8gVEVTVCBBVVRPTUFUSU9OIExURC4KKzAwNjBFRSBBUE9MTE8KKzAwNjBFRiBGTFlURUNIIFRFQ0hOT0xPR1kgQ08uLCBMVEQuCiswMDYwRjAgSk9ITlNPTiAmIEpPSE5TT04gTUVESUNBTCwgSU5DCiswMDYwRjEgRVhQIENPTVBVVEVSLCBJTkMuCiswMDYwRjIgTEFTRVJHUkFQSElDUywgSU5DLgorMDA2MEYzIFBlcmZvcm1hbmNlIEFuYWx5c2lzIEJyb2FkYmFuZCwgU3BpcmVudCBwbGMKKzAwNjBGNCBBRFZBTkNFRCBDT01QVVRFUiBTT0xVVElPTlMsIEluYy4KKzAwNjBGNSBJQ09OIFdFU1QsIElOQy4KKzAwNjBGNiBORVhURVNUIENPTU1VTklDQVRJT05TIFBST0RVQ1RTLCBJTkMuCiswMDYwRjcgREFUQUZVU0lPTiBTWVNURU1TCiswMDYwRjggTG9yYW4gSW50ZXJuYXRpb25hbCBUZWNobm9sb2dpZXMgSW5jLgorMDA2MEY5IERJQU1PTkQgTEFORSBDT01NVU5JQ0FUSU9OUworMDA2MEZBIEVEVUNBVElPTkFMIFRFQ0hOT0xPR1kgUkVTT1VSQ0VTLCBJTkMuCiswMDYwRkIgUEFDS0VURUVSLCBJTkMuCiswMDYwRkMgQ09OU0VSVkFUSU9OIFRIUk9VR0ggSU5OT1ZBVElPTiBMVEQuCiswMDYwRkQgTmV0SUNzLCBJbmMuCiswMDYwRkUgTFlOWCBTWVNURU0gREVWRUxPUEVSUywgSU5DLgorMDA2MEZGIFF1VmlzLCBJbmMuCiswMDcwQjAgTS9BLUNPTSBJTkMuIENPTVBBTklFUworMDA3MEIzIERBVEEgUkVDQUxMIExURC4KKzAwODAwMCBNVUxUSVRFQ0ggU1lTVEVNUywgSU5DLgorMDA4MDAxIFBFUklQSE9OSUNTIENPUlBPUkFUSU9OCiswMDgwMDIgU0FURUxDT00gKFVLKSBMVEQKKzAwODAwMyBIWVRFQyBFTEVDVFJPTklDUyBMVEQuCiswMDgwMDQgQU5UTE9XIENPTU1VTklDQVRJT05TLCBMVEQuCiswMDgwMDUgQ0FDVFVTIENPTVBVVEVSIElOQy4KKzAwODAwNiBDT01QVUFERCBDT1JQT1JBVElPTgorMDA4MDA3IERMT0cgTkMtU1lTVEVNRQorMDA4MDA4IERZTkFURUNIIENPTVBVVEVSIFNZU1RFTVMKKzAwODAwOSBKVVBJVEVSIFNZU1RFTVMsIElOQy4KKzAwODAwQSBKQVBBTiBDT01QVVRFUiBDT1JQLgorMDA4MDBCIENTSyBDT1JQT1JBVElPTgorMDA4MDBDIFZJREVDT00gTElNSVRFRAorMDA4MDBEIFZPU1NXSU5LRUwgRi5VLgorMDA4MDBFIEFUTEFOVElYIENPUlBPUkFUSU9OCiswMDgwMEYgU1RBTkRBUkQgTUlDUk9TWVNURU1TCiswMDgwMTAgQ09NTU9ET1JFIElOVEVSTkFUSU9OQUwKKzAwODAxMSBESUdJVEFMIFNZU1RFTVMgSU5UJ0wuIElOQy4KKzAwODAxMiBJTlRFR1JBVEVEIE1FQVNVUkVNRU5UIFNZU1RFTVMKKzAwODAxMyBUSE9NQVMtQ09OUkFEIENPUlBPUkFUSU9OCiswMDgwMTQgRVNQUklUIFNZU1RFTVMKKzAwODAxNSBTRUlLTyBTWVNURU1TLCBJTkMuCiswMDgwMTYgV0FOREVMIEFORCBHT0xURVJNQU5OCiswMDgwMTcgUEZVIExJTUlURUQKKzAwODAxOCBLT0JFIFNURUVMLCBMVEQuCiswMDgwMTkgREFZTkEgQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwODAxQSBCRUxMIEFUTEFOVElDCiswMDgwMUIgS09ESUFLIFRFQ0hOT0xPR1kKKzAwODAxQyBORVdQT1JUIFNZU1RFTVMgU09MVVRJT05TCiswMDgwMUQgSU5URUdSQVRFRCBJTkZFUkVOQ0UgTUFDSElORVMKKzAwODAxRSBYSU5FVFJPTiwgSU5DLgorMDA4MDFGIEtSVVBQIEFUTEFTIEVMRUNUUk9OSUsgR01CSAorMDA4MDIwIE5FVFdPUksgUFJPRFVDVFMKKzAwODAyMSBBbGNhdGVsIENhbmFkYSBJbmMuCiswMDgwMjIgU0NBTi1PUFRJQ1MKKzAwODAyMyBJTlRFR1JBVEVEIEJVU0lORVNTIE5FVFdPUktTCiswMDgwMjQgS0FMUEFOQSwgSU5DLgorMDA4MDI1IFNUT0xMTUFOTiBHTUJICiswMDgwMjYgTkVUV09SSyBQUk9EVUNUUyBDT1JQT1JBVElPTgorMDA4MDI3IEFEQVBUSVZFIFNZU1RFTVMsIElOQy4KKzAwODAyOCBUUkFEUE9TVCAoSEspIExURAorMDA4MDI5IEVBR0xFIFRFQ0hOT0xPR1ksIElOQy4KKzAwODAyQSBURVNUIFNZU1RFTVMgJiBTSU1VTEFUSU9OUyBJTkMKKzAwODAyQiBJTlRFR1JBVEVEIE1BUktFVElORyBDTworMDA4MDJDIFRIRSBTQUdFIEdST1VQIFBMQworMDA4MDJEIFhZTE9HSUNTIElOQworMDA4MDJFIENBU1RMRSBST0NLIENPTVBVVElORworMDA4MDJGIE5BVElPTkFMIElOU1RSVU1FTlRTIENPUlAuCiswMDgwMzAgTkVYVVMgRUxFQ1RST05JQ1MKKzAwODAzMSBCQVNZUywgQ09SUC4KKzAwODAzMiBBQ0NFU1MgQ08uLCBMVEQuCiswMDgwMzMgRk9STUFUSU9OLCBJTkMuCiswMDgwMzQgU01UIEdPVVBJTAorMDA4MDM1IFRFQ0hOT0xPR1kgV09SS1MsIElOQy4KKzAwODAzNiBSRUZMRVggTUFOVUZBQ1RVUklORyBTWVNURU1TCiswMDgwMzcgRXJpY3Nzb24gR3JvdXAKKzAwODAzOCBEQVRBIFJFU0VBUkNIICYgQVBQTElDQVRJT05TCiswMDgwMzkgQUxDQVRFTCBTVEMgQVVTVFJBTElBCiswMDgwM0EgVkFSSVRZUEVSLCBJTkMuCiswMDgwM0IgQVBUIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDgwM0MgVFZTIEVMRUNUUk9OSUNTIExURAorMDA4MDNEIFNVUklHSUtFTiBDTy4sICBMVEQuCiswMDgwM0UgU1lORVJORVRJQ1MKKzAwODAzRiBUQVRVTkcgQ09NUEFOWQorMDA4MDQwIEpPSE4gRkxVS0UgTUFOVUZBQ1RVUklORyBDTy4KKzAwODA0MSBWRUIgS09NQklOQVQgUk9CT1RST04KKzAwODA0MiBGT1JDRSBDT01QVVRFUlMKKzAwODA0MyBORVRXT1JMRCwgSU5DLgorMDA4MDQ0IFNZU1RFQ0ggQ09NUFVURVIgQ09SUC4KKzAwODA0NSBNQVRTVVNISVRBIEVMRUNUUklDIElORC4gQ08KKzAwODA0NiBVTklWRVJTSVRZIE9GIFRPUk9OVE8KKzAwODA0NyBJTi1ORVQgQ09SUC4KKzAwODA0OCBDT01QRVggSU5DT1JQT1JBVEVECiswMDgwNDkgTklTU0lOIEVMRUNUUklDIENPLiwgTFRELgorMDA4MDRBIFBSTy1MT0cKKzAwODA0QiBFQUdMRSBURUNITk9MT0dJRVMgUFRZLkxURC4KKzAwODA0QyBDT05URUMgQ08uLCBMVEQuCiswMDgwNEQgQ1lDTE9ORSBNSUNST1NZU1RFTVMsIElOQy4KKzAwODA0RSBBUEVYIENPTVBVVEVSIENPTVBBTlkKKzAwODA0RiBEQUlLSU4gSU5EVVNUUklFUywgTFRELgorMDA4MDUwIFpJQVRFQ0ggQ09SUE9SQVRJT04KKzAwODA1MSBGSUJFUk1VWAorMDA4MDUyIFRFQ0hOSUNBTExZIEVMSVRFIENPTkNFUFRTCiswMDgwNTMgSU5URUxMSUNPTSwgSU5DLgorMDA4MDU0IEZST05USUVSIFRFQ0hOT0xPR0lFUyBDT1JQLgorMDA4MDU1IEZFUk1JTEFCCiswMDgwNTYgU1BISU5YIEVMRUtUUk9OSUsgR01CSAorMDA4MDU3IEFEU09GVCwgTFRELgorMDA4MDU4IFBSSU5URVIgU1lTVEVNUyBDT1JQT1JBVElPTgorMDA4MDU5IFNUQU5MRVkgRUxFQ1RSSUMgQ08uLCBMVEQKKzAwODA1QSBUVUxJUCBDT01QVVRFUlMgSU5URVJOQVQnTCBCLlYKKzAwODA1QiBDT05ET1IgU1lTVEVNUywgSU5DLgorMDA4MDVDIEFHSUxJUyBDT1JQT1JBVElPTgorMDA4MDVEIENBTlNUQVIKKzAwODA1RSBMU0kgTE9HSUMgQ09SUE9SQVRJT04KKzAwODA1RiBDT01QQVEgQ09NUFVURVIgQ09SUE9SQVRJT04KKzAwODA2MCBORVRXT1JLIElOVEVSRkFDRSBDT1JQT1JBVElPTgorMDA4MDYxIExJVFRPTiBTWVNURU1TLCBJTkMuCiswMDgwNjIgSU5URVJGQUNFICBDTy4KKzAwODA2MyBSSUNIQVJEIEhJUlNDSE1BTk4gR01CSCAmIENPLgorMDA4MDY0IFdZU0UgVEVDSE5PTE9HWQorMDA4MDY1IENZQkVSR1JBUEhJQyBTWVNURU1TIFBUWSBMVEQuCiswMDgwNjYgQVJDT00gQ09OVFJPTCBTWVNURU1TLCBMVEQuCiswMDgwNjcgU1FVQVJFIEQgQ09NUEFOWQorMDA4MDY4IFlBTUFURUNIIFNDSUVOVElGSUMgTFRELgorMDA4MDY5IENPTVBVVE9ORSBTWVNURU1TCiswMDgwNkEgRVJJIChFTVBBQyBSRVNFQVJDSCBJTkMuKQorMDA4MDZCIFNDSE1JRCBURUxFQ09NTVVOSUNBVElPTgorMDA4MDZDIENFR0VMRUMgUFJPSkVDVFMgTFRECiswMDgwNkQgQ0VOVFVSWSBTWVNURU1TIENPUlAuCiswMDgwNkUgTklQUE9OIFNURUVMIENPUlBPUkFUSU9OCiswMDgwNkYgT05FTEFOIExURC4KKzAwODA3MCBDT01QVVRBRE9SQVMgTUlDUk9OCiswMDgwNzEgU0FJIFRFQ0hOT0xPR1kKKzAwODA3MiBNSUNST1BMRVggU1lTVEVNUyBMVEQuCiswMDgwNzMgRFdCIEFTU09DSUFURVMKKzAwODA3NCBGSVNIRVIgQ09OVFJPTFMKKzAwODA3NSBQQVJTWVRFQyBHTUJICiswMDgwNzYgTUNOQworMDA4MDc3IEJST1RIRVIgSU5EVVNUUklFUywgTFRELgorMDA4MDc4IFBSQUNUSUNBTCBQRVJJUEhFUkFMUywgSU5DLgorMDA4MDc5IE1JQ1JPQlVTIERFU0lHTlMgTFRELgorMDA4MDdBIEFJVEVDSCBTWVNURU1TIExURC4KKzAwODA3QiBBUlRFTCBDT01NVU5JQ0FUSU9OUyBDT1JQLgorMDA4MDdDIEZJQkVSQ09NLCBJTkMuCiswMDgwN0QgRVFVSU5PWCBTWVNURU1TIElOQy4KKzAwODA3RSBTT1VUSEVSTiBQQUNJRklDIExURC4KKzAwODA3RiBEWS00IElOQ09SUE9SQVRFRAorMDA4MDgwIERBVEFNRURJQSBDT1JQT1JBVElPTgorMDA4MDgxIEtFTkRBTEwgU1FVQVJFIFJFU0VBUkNIIENPUlAuCiswMDgwODIgUEVQIE1PRFVMQVIgQ09NUFVURVJTIEdNQkgKKzAwODA4MyBBTURBSEwKKzAwODA4NCBUSEUgQ0xPVUQgSU5DLgorMDA4MDg1IEgtVEhSRUUgU1lTVEVNUyBDT1JQT1JBVElPTgorMDA4MDg2IENPTVBVVEVSIEdFTkVSQVRJT04gSU5DLgorMDA4MDg3IE9LSSBFTEVDVFJJQyBJTkRVU1RSWSBDTy4sIExURAorMDA4MDg4IFZJQ1RPUiBDT01QQU5ZIE9GIEpBUEFOLCBMVEQuCiswMDgwODkgVEVDTkVUSUNTIChQVFkpIExURC4KKzAwODA4QSBTVU1NSVQgTUlDUk9TWVNURU1TIENPUlAuCiswMDgwOEIgREFDT0xMIExJTUlURUQKKzAwODA4QyBOZXRTY291dCBTeXN0ZW1zLCBJbmMuCiswMDgwOEQgV0VTVENPQVNUIFRFQ0hOT0xPR1kgQi5WLgorMDA4MDhFIFJBRFNUT05FIFRFQ0hOT0xPR1kKKzAwODA4RiBDLiBJVE9IIEVMRUNUUk9OSUNTLCBJTkMuCiswMDgwOTAgTUlDUk9URUsgSU5URVJOQVRJT05BTCwgSU5DLgorMDA4MDkxIFRPS1lPIEVMRUNUUklDIENPLixMVEQKKzAwODA5MiBKQVBBTiBDT01QVVRFUiBJTkRVU1RSWSwgSU5DLgorMDA4MDkzIFhZUk9OIENPUlBPUkFUSU9OCiswMDgwOTQgQUxGQSBMQVZBTCBBVVRPTUFUSU9OIEFCCiswMDgwOTUgQkFTSUMgTUVSVE9OIEhBTkRFTFNHRVMuTS5CLkguCiswMDgwOTYgSFVNQU4gREVTSUdORUQgU1lTVEVNUywgSU5DLgorMDA4MDk3IENFTlRSQUxQIEFVVE9NQVRJU01FUworMDA4MDk4IFRESyBDT1JQT1JBVElPTgorMDA4MDk5IEtMT0NLTkVSIE1PRUxMRVIgSVBDCiswMDgwOUEgTk9WVVMgTkVUV09SS1MgTFRECiswMDgwOUIgSlVTVFNZU1RFTSBDT1JQT1JBVElPTgorMDA4MDlDIExVWENPTSwgSU5DLgorMDA4MDlEIENvbW1zY3JhZnQgTHRkLgorMDA4MDlFIERBVFVTIEdNQkgKKzAwODA5RiBBTENBVEVMIEJVU0lORVNTIFNZU1RFTVMKKzAwODBBMCBFRElTQSBIRVdMRVRUIFBBQ0tBUkQgUy9BCiswMDgwQTEgTUlDUk9URVNULCBJTkMuCiswMDgwQTIgQ1JFQVRJVkUgRUxFQ1RST05JQyBTWVNURU1TCiswMDgwQTMgTEFOVFJPTklYCiswMDgwQTQgTElCRVJUWSBFTEVDVFJPTklDUworMDA4MEE1IFNQRUVEIElOVEVSTkFUSU9OQUwKKzAwODBBNiBSRVBVQkxJQyBURUNITk9MT0dZLCBJTkMuCiswMDgwQTcgTUVBU1VSRVggQ09SUC4KKzAwODBBOCBWSVRBQ09NIENPUlBPUkFUSU9OCiswMDgwQTkgQ0xFQVJQT0lOVCBSRVNFQVJDSAorMDA4MEFBIE1BWFBFRUQKKzAwODBBQiBEVUtBTkUgTkVUV09SSyBJTlRFR1JBVElPTgorMDA4MEFDIElNTE9HSVgsIERJVklTSU9OIE9GIEdFTkVTWVMKKzAwODBBRCBDTkVUIFRFQ0hOT0xPR1ksIElOQy4KKzAwODBBRSBIVUdIRVMgTkVUV09SSyBTWVNURU1TCiswMDgwQUYgQUxMVU1FUiBDTy4sIExURC4KKzAwODBCMCBBRFZBTkNFRCBJTkZPUk1BVElPTgorMDA4MEIxIFNPRlRDT00gQS9TCiswMDgwQjIgTkVUV09SSyBFUVVJUE1FTlQgVEVDSE5PTE9HSUVTCiswMDgwQjMgQVZBTCBEQVRBIENPUlBPUkFUSU9OCiswMDgwQjQgU09QSElBIFNZU1RFTVMKKzAwODBCNSBVTklURUQgTkVUV09SS1MgSU5DLgorMDA4MEI2IFRIRU1JUyBDT01QVVRFUgorMDA4MEI3IFNURUxMQVIgQ09NUFVURVIKKzAwODBCOCBCVUcsIElOQ09SUE9SQVRFRAorMDA4MEI5IEFSQ0hFIFRFQ0hOT0xJR0lFUyBJTkMuCiswMDgwQkEgU1BFQ0lBTElYIChBU0lBKSBQVEUsIExURAorMDA4MEJCIEhVR0hFUyBMQU4gU1lTVEVNUworMDA4MEJDIEhJVEFDSEkgRU5HSU5FRVJJTkcgQ08uLCBMVEQKKzAwODBCRCBUSEUgRlVSVUtBV0EgRUxFQ1RSSUMgQ08uLCBMVEQKKzAwODBCRSBBUklFUyBSRVNFQVJDSAorMDA4MEJGIFRBS0FPS0EgRUxFQ1RSSUMgTUZHLiBDTy4gTFRELgorMDA4MEMwIFBFTlJJTCBEQVRBQ09NTQorMDA4MEMxIExBTkVYIENPUlBPUkFUSU9OCiswMDgwQzIgSUVFRSA4MDIuMSBDT01NSVRURUUKKzAwODBDMyBCSUNDIElORk9STUFUSU9OIFNZU1RFTVMgJiBTVkMKKzAwODBDNCBET0NVTUVOVCBURUNITk9MT0dJRVMsIElOQy4KKzAwODBDNSBOT1ZFTExDTyBERSBNRVhJQ08KKzAwODBDNiBOQVRJT05BTCBEQVRBQ09NTSBDT1JQT1JBVElPTgorMDA4MEM3IFhJUkNPTQorMDA4MEM4IEQtTElOSyBTWVNURU1TLCBJTkMuCiswMDgwQzkgQUxCRVJUQSBNSUNST0VMRUNUUk9OSUMgQ0VOVFJFCiswMDgwQ0EgTkVUQ09NIFJFU0VBUkNIIElOQ09SUE9SQVRFRAorMDA4MENCIEZBTENPIERBVEEgUFJPRFVDVFMKKzAwODBDQyBNSUNST1dBVkUgQllQQVNTIFNZU1RFTVMKKzAwODBDRCBNSUNST05JQ1MgQ09NUFVURVIsIElOQy4KKzAwODBDRSBCUk9BRENBU1QgVEVMRVZJU0lPTiBTWVNURU1TCiswMDgwQ0YgRU1CRURERUQgUEVSRk9STUFOQ0UgSU5DLgorMDA4MEQwIENPTVBVVEVSIFBFUklQSEVSQUxTLCBJTkMuCiswMDgwRDEgS0lNVFJPTiBDT1JQT1JBVElPTgorMDA4MEQyIFNISU5OSUhPTkRFTktPIENPLiwgTFRELgorMDA4MEQzIFNISVZBIENPUlAuCiswMDgwRDQgQ0hBU0UgUkVTRUFSQ0ggTFRELgorMDA4MEQ1IENBRFJFIFRFQ0hOT0xPR0lFUworMDA4MEQ2IE5VVk9URUNILCBJTkMuCiswMDgwRDcgRmFudHVtIEVuZ2luZWVyaW5nCiswMDgwRDggTkVUV09SSyBQRVJJUEhFUkFMUyBJTkMuCiswMDgwRDkgRU1LIEVMRUtUUk9OSUsKKzAwODBEQSBCUlVFTCAmIEtKQUVSCiswMDgwREIgR1JBUEhPTiBDT1JQT1JBVElPTgorMDA4MERDIFBJQ0tFUiBJTlRFUk5BVElPTkFMCiswMDgwREQgR01YIElOQy9HSU1JWAorMDA4MERFIEdJUFNJIFMuQS4KKzAwODBERiBBREMgQ09ERU5PTEwgVEVDSE5PTE9HWSBDT1JQLgorMDA4MEUwIFhUUCBTWVNURU1TLCBJTkMuCiswMDgwRTEgU1RNSUNST0VMRUNUUk9OSUNTCiswMDgwRTIgVC5ELkkuIENPLiwgTFRELgorMDA4MEUzIENPUkFMIE5FVFdPUksgQ09SUE9SQVRJT04KKzAwODBFNCBOT1JUSFdFU1QgRElHSVRBTCBTWVNURU1TLCBJTkMKKzAwODBFNSBNWUxFWCBDT1JQT1JBVElPTgorMDA4MEU2IFBFRVIgTkVUV09SS1MsIElOQy4KKzAwODBFNyBMWU5XT09EIFNDSUVOVElGSUMgREVWLiBMVEQuCiswMDgwRTggQ1VNVUxVUyBDT1JQT1JBVElJT04KKzAwODBFOSBNYWRnZSBMdGQuCiswMDgwRUEgQURWQSBPcHRpY2FsIE5ldHdvcmtpbmcgTHRkLgorMDA4MEVCIENPTVBDT05UUk9MIEIuVi4KKzAwODBFQyBTVVBFUkNPTVBVVElORyBTT0xVVElPTlMsIElOQy4KKzAwODBFRCBJUSBURUNITk9MT0dJRVMsIElOQy4KKzAwODBFRSBUSE9NU09OIENTRgorMDA4MEVGIFJBVElPTkFMCiswMDgwRjAgUGFuYXNvbmljIENvbW11bmljYXRpb25zIENvLiwgTHRkLgorMDA4MEYxIE9QVVMgU1lTVEVNUworMDA4MEYyIFJBWUNPTSBTWVNURU1TIElOQworMDA4MEYzIFNVTiBFTEVDVFJPTklDUyBDT1JQLgorMDA4MEY0IFRFTEVNRUNBTklRVUUgRUxFQ1RSSVFVRQorMDA4MEY1IFFVQU5URUwgTFRECiswMDgwRjYgU1lORVJHWSBNSUNST1NZU1RFTVMKKzAwODBGNyBaRU5JVEggRUxFQ1RST05JQ1MKKzAwODBGOCBNSVpBUiwgSU5DLgorMDA4MEY5IEhFVVJJS09OIENPUlBPUkFUSU9OCiswMDgwRkEgUldUIEdNQkgKKzAwODBGQiBCVk0gTElNSVRFRAorMDA4MEZDIEFWQVRBUiBDT1JQT1JBVElPTgorMDA4MEZEIEVYU0NFRUQgQ09SUFJBVElPTgorMDA4MEZFIEFaVVJFIFRFQ0hOT0xPR0lFUywgSU5DLgorMDA4MEZGIFNPQy4gREUgVEVMRUlORk9STUFUSVFVRSBSVEMKKzAwOTAwMCBESUFNT05EIE1VTFRJTUVESUEKKzAwOTAwMSBOSVNISU1VIEVMRUNUUk9OSUNTIElORFVTVFJJRVMgQ08uLCBMVEQuCiswMDkwMDIgQUxMR09OIEFCCiswMDkwMDMgQVBMSU8KKzAwOTAwNCAzQ09NIEVVUk9QRSBMVEQuCiswMDkwMDUgUFJPVEVDSCBTWVNURU1TIENPLiwgTFRELgorMDA5MDA2IEhBTUFNQVRTVSBQSE9UT05JQ1MgSy5LLgorMDA5MDA3IERPTUVYIFRFQ0hOT0xPR1kgQ09SUC4KKzAwOTAwOCBIYW5BIFN5c3RlbXMgSW5jLgorMDA5MDA5IGkgQ29udHJvbHMsIEluYy4KKzAwOTAwQSBQUk9UT04gRUxFQ1RST05JQyBJTkRVU1RSSUFMIENPLiwgTFRELgorMDA5MDBCIExBTk5FUiBFTEVDVFJPTklDUywgSU5DLgorMDA5MDBDIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwOTAwRCBPVkVSTEFORCBEQVRBIElOQy4KKzAwOTAwRSBIQU5ETElOSyBURUNITk9MT0dJRVMsIElOQy4KKzAwOTAwRiBLQVdBU0FLSSBIRUFWWSBJTkRVU1RSSUVTLCBMVEQKKzAwOTAxMCBTSU1VTEFUSU9OIExBQk9SQVRPUklFUywgSU5DLgorMDA5MDExIFdBVlRyYWNlLCBJbmMuCiswMDkwMTIgR0xPQkVTUEFOIFNFTUlDT05EVUNUT1IsIElOQy4KKzAwOTAxMyBTQU1TQU4gQ09SUC4KKzAwOTAxNCBST1RPUksgSU5TVFJVTUVOVFMsIExURC4KKzAwOTAxNSBDRU5USUdSQU0gQ09NTVVOSUNBVElPTlMgQ09SUC4KKzAwOTAxNiBaQUMKKzAwOTAxNyBaWVBDT00sIElOQy4KKzAwOTAxOCBJVE8gRUxFQ1RSSUMgSU5EVVNUUlkgQ08sIExURC4KKzAwOTAxOSBIRVJNRVMgRUxFQ1RST05JQ1MgQ08uLCBMVEQuCiswMDkwMUEgVU5JU1BIRVJFIFNPTFVUSU9OUworMDA5MDFCIERJR0lUQUwgQ09OVFJPTFMKKzAwOTAxQyBtcHMgU29mdHdhcmUgR21iaAorMDA5MDFEIFBFQyAoTlopIExURC4KKzAwOTAxRSBTRUxFU1RBIElOR0VHTkUgUklBIFMuUC5BLgorMDA5MDFGIEFEVEVDIFBST0RVQ1RJT05TLCBJTkMuCiswMDkwMjAgUEhJTElQUyBBTkFMWVRJQ0FMIFgtUkFZIEIuVi4KKzAwOTAyMSBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDkwMjIgSVZFWAorMDA5MDIzIFpJTE9HIElOQy4KKzAwOTAyNCBQSVBFTElOS1MsIElOQy4KKzAwOTAyNSBWSVNJT04gU1lTVEVNUyBMVEQuIFBUWQorMDA5MDI2IEFEVkFOQ0VEIFNXSVRDSElORyBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDA5MDI3IElOVEVMIENPUlBPUkFUSU9OCiswMDkwMjggTklQUE9OIFNJR05BTCBDTy4sIExURC4KKzAwOTAyOSBDUllQVE8gQUcKKzAwOTAyQSBDT01NVU5JQ0FUSU9OIERFVklDRVMsIElOQy4KKzAwOTAyQiBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDkwMkMgREFUQSAmIENPTlRST0wgRVFVSVBNRU5UIExURC4KKzAwOTAyRCBEQVRBIEVMRUNUUk9OSUNTIChBVVNULikgUFRZLCBMVEQuCiswMDkwMkUgTkFNQ08gTElNSVRFRAorMDA5MDJGIE5FVENPUkUgU1lTVEVNUywgSU5DLgorMDA5MDMwIEhPTkVZV0VMTC1EQVRJTkcKKzAwOTAzMSBNWVNUSUNPTSwgTFRELgorMDA5MDMyIFBFTENPTUJFIEdST1VQIExURC4KKzAwOTAzMyBJTk5PVkFQSE9ORSBHbWJICiswMDkwMzQgSU1BR0lDLCBJTkMuCiswMDkwMzUgQUxQSEEgVEVMRUNPTSwgSU5DLgorMDA5MDM2IGVucywgaW5jLgorMDA5MDM3IEFDVUNPTU0sIElOQy4KKzAwOTAzOCBGT1VOVEFJTiBURUNITk9MT0dJRVMsIElOQy4KKzAwOTAzOSBTSEFTVEEgTkVUV09SS1MKKzAwOTAzQSBOSUhPTiBNRURJQSBUT09MIElOQy4KKzAwOTAzQiBUcmlFTVMgUmVzZWFyY2ggTGFiLCBJbmMuCiswMDkwM0MgQVRMQU5USUMgTkVUV09SSyBTWVNURU1TCiswMDkwM0QgQklPUEFDIFNZU1RFTVMsIElOQy4KKzAwOTAzRSBOLlYuIFBISUxJUFMgSU5EVVNUUklBTCBBQ1RJVklUSUVTCiswMDkwM0YgQVpURUMgUkFESU9NRURJQQorMDA5MDQwIFNpZW1lbnMgTmV0d29yayBDb252ZXJnZW5jZSBMTEMKKzAwOTA0MSBBUFBMSUVEIERJR0lUQUwgQUNDRVNTCiswMDkwNDIgRUNDUywgSW5jLgorMDA5MDQzIE5JQ0hJQkVJIERFTlNISSBDTy4sIExURC4KKzAwOTA0NCBBU1NVUkVEIERJR0lUQUwsIElOQy4KKzAwOTA0NSBNYXJjb25pIENvbW11bmljYXRpb25zCiswMDkwNDYgREVYRFlORSwgTFRELgorMDA5MDQ3IEdJR0EgRkFTVCBFLiBMVEQuCiswMDkwNDggWkVBTCBDT1JQT1JBVElPTgorMDA5MDQ5IEVOVFJJRElBIENPUlBPUkFUSU9OCiswMDkwNEEgQ09OQ1VSIFNZU1RFTSBURUNITk9MT0dJRVMKKzAwOTA0QiBHZW1UZWsgVGVjaG5vbG9neSBDby4sIEx0ZC4KKzAwOTA0QyBFUElHUkFNLCBJTkMuCiswMDkwNEQgU1BFQyBTLkEuCiswMDkwNEUgREVMRU0gQlYKKzAwOTA0RiBBQkIgUE9XRVIgVCZEIENPTVBBTlksIElOQy4KKzAwOTA1MCBURUxFU1RFIE9ZCiswMDkwNTEgVUxUSU1BVEUgVEVDSE5PTE9HWSBDT1JQLgorMDA5MDUyIFNFTENPTSBFTEVUVFJPTklDQSBTLlIuTC4KKzAwOTA1MyBEQUVXT08gRUxFQ1RST05JQ1MgQ08uLCBMVEQuCiswMDkwNTQgSU5OT1ZBVElWRSBTRU1JQ09ORFVDVE9SUywgSU5DCiswMDkwNTUgUEFSS0VSIEhBTk5JRklOIENPUlBPUkFUSU9OIENPTVBVTU9UT1IgRElWSVNJT04KKzAwOTA1NiBURUxFU1RSRUFNLCBJTkMuCiswMDkwNTcgQUFOZXRjb20sIEluYy4KKzAwOTA1OCBVbHRyYSBFbGVjdHJvbmljcyBMdGQuLCBDb21tYW5kIGFuZCBDb250cm9sIFN5c3RlbXMKKzAwOTA1OSBURUxFQ09NIERFVklDRSBLLksuCiswMDkwNUEgREVBUkJPUk4gR1JPVVAsIElOQy4KKzAwOTA1QiBSQVlNT05EIEFORCBMQUUgRU5HSU5FRVJJTkcKKzAwOTA1QyBFRE1JCiswMDkwNUQgTkVUQ09NIFNJQ0hFUkhFSVRTVEVDSE5JSyBHbWJICiswMDkwNUUgUkFVTEFORC1CT1JHIENPUlBPUkFUSU9OCiswMDkwNUYgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA5MDYwIFNZU1RFTSBDUkVBVEUgQ09SUC4KKzAwOTA2MSBQQUNJRklDIFJFU0VBUkNIICYgRU5HSU5FRVJJTkcgQ09SUE9SQVRJT04KKzAwOTA2MiBJQ1AgVk9SVEVYIENPTVBVVEVSU1lTVEVNRSBHbWJICiswMDkwNjMgQ09IRVJFTlQgQ09NTVVOSUNBVElPTlMgU1lTVEVNUyBDT1JQT1JBVElPTgorMDA5MDY0IFRIT01TT04gQlJPQURDQVNUIFNZU1RFTVMKKzAwOTA2NSBGSU5JU0FSIENPUlBPUkFUSU9OCiswMDkwNjYgVHJvaWthIE5ldHdvcmtzLCBJbmMuCiswMDkwNjcgV2Fsa0Fib3V0IENvbXB1dGVycywgSW5jLgorMDA5MDY4IERWVCBDT1JQLgorMDA5MDY5IEpVTklQRVIgTkVUV09SS1MsIElOQy4KKzAwOTA2QSBUVVJOU1RPTkUgU1lTVEVNUywgSU5DLgorMDA5MDZCIEFQUExJRUQgUkVTT1VSQ0VTLCBJTkMuCiswMDkwNkMgR1dUIEdMT0JBTCBXRUlHSElORyBURUNITk9MT0dJRVMgR21iSAorMDA5MDZEIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwOTA2RSBQUkFYT04sIElOQy4KKzAwOTA2RiBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDkwNzAgTkVPIE5FVFdPUktTLCBJTkMuCiswMDkwNzEgQXBwbGllZCBJbm5vdmF0aW9uIEluYy4KKzAwOTA3MiBTSU1SQUQgQVMKKzAwOTA3MyBHQUlPIFRFQ0hOT0xPR1kKKzAwOTA3NCBBUkdPTiBORVRXT1JLUywgSU5DLgorMDA5MDc1IE5FQyBETyBCUkFTSUwgUy5BLgorMDA5MDc2IEZNVCBBSVJDUkFGVCBHQVRFIFNVUFBPUlQgU1lTVEVNUyBBQgorMDA5MDc3IEFEVkFOQ0VEIEZJQlJFIENPTU1VTklDQVRJT05TCiswMDkwNzggTUVSIFRFTEVNQU5BR0VNRU5UIFNPTFVUSU9OUywgTFRELgorMDA5MDc5IENsZWFyT25lLCBJbmMuCiswMDkwN0EgU1BFQ1RSQUxJTksgQ09SUC4KKzAwOTA3QiBFLVRFQ0gsIElOQy4KKzAwOTA3QyBESUdJVEFMQ0FTVCwgSU5DLgorMDA5MDdEIExha2UgQ29tbXVuaWNhdGlvbnMKKzAwOTA3RSBWRVRST05JWCBDT1JQLgorMDA5MDdGIFdhdGNoR3VhcmQgVGVjaG5vbG9naWVzLCBJbmMuCiswMDkwODAgTk9UIExJTUlURUQsIElOQy4KKzAwOTA4MSBBTE9IQSBORVRXT1JLUywgSU5DLgorMDA5MDgyIEZPUkNFIElOU1RJVFVURQorMDA5MDgzIFRVUkJPIENPTU1VTklDQVRJT04sIElOQy4KKzAwOTA4NCBBVEVDSCBTWVNURU0KKzAwOTA4NSBHT0xERU4gRU5URVJQUklTRVMsIElOQy4KKzAwOTA4NiBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDkwODcgSVRJUworMDA5MDg4IEJBWEFMTCBTRUNVUklUWSBMVEQuCiswMDkwODkgU09GVENPTSBNSUNST1NZU1RFTVMsIElOQy4KKzAwOTA4QSBCQVlMWSBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDA5MDhCIENFTEwgQ09NUFVUSU5HLCBJTkMuCiswMDkwOEMgRVRSRU5EIEVMRUNUUk9OSUNTLCBJTkMuCiswMDkwOEQgVklDS0VSUyBFTEVDVFJPTklDUyBTWVNURU1TCiswMDkwOEUgTm9ydGVsIE5ldHdvcmtzIEJyb2FkYmFuZCBBY2Nlc3MKKzAwOTA4RiBBVURJTyBDT0RFUyBMVEQuCiswMDkwOTAgSS1CVVMKKzAwOTA5MSBEaWdpdGFsU2NhcGUsIEluYy4KKzAwOTA5MiBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDkwOTMgTkFOQU8gQ09SUE9SQVRJT04KKzAwOTA5NCBPU1BSRVkgVEVDSE5PTE9HSUVTLCBJTkMuCiswMDkwOTUgVU5JVkVSU0FMIEFWSU9OSUNTCiswMDkwOTYgQVNLRVkgQ09NUFVURVIgQ09SUC4KKzAwOTA5NyBTWUNBTU9SRSBORVRXT1JLUworMDA5MDk4IFNCQyBERVNJR05TLCBJTkMuCiswMDkwOTkgQUxMSUVEIFRFTEVTSVMsIEsuSy4KKzAwOTA5QSBPTkUgV09STEQgU1lTVEVNUywgSU5DLgorMDA5MDlCIE1BUktQT0lOVCBBQgorMDA5MDlDIFRlcmF5b24gQ29tbXVuaWNhdGlvbnMgU3lzdGVtcworMDA5MDlEIEdTRSBTWVNURU1TLCBJTkMuCiswMDkwOUUgQ3JpdGljYWwgSU8sIExMQworMDA5MDlGIERJR0ktREFUQSBDT1JQT1JBVElPTgorMDA5MEEwIDhYOCBJTkMuCiswMDkwQTEgRkxZSU5HIFBJRyBTWVNURU1TLCBMVEQuCiswMDkwQTIgQ1lCRVJUQU4gVEVDSE5PTE9HWSwgSU5DLgorMDA5MEEzIENvcmVjZXNzIEluYy4KKzAwOTBBNCBBTFRJR0EgTkVUV09SS1MKKzAwOTBBNSBTUEVDVFJBIExPR0lDCiswMDkwQTYgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA5MEE3IENMSUVOVEVDIENPUlBPUkFUSU9OCiswMDkwQTggTmluZVRpbGVzIE5ldHdvcmtzLCBMdGQuCiswMDkwQTkgV0VTVEVSTiBESUdJVEFMCiswMDkwQUEgSU5ESUdPIEFDVElWRSBWSVNJT04gU1lTVEVNUyBMSU1JVEVECiswMDkwQUIgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA5MEFDIE9QVElWSVNJT04sIElOQy4KKzAwOTBBRCBBU1BFQ1QgRUxFQ1RST05JQ1MsIElOQy4KKzAwOTBBRSBJVEFMVEVMIFMucC5BLgorMDA5MEFGIEouIE1PUklUQSBNRkcuIENPUlAuCiswMDkwQjAgVkFERU0KKzAwOTBCMSBDSVNDTyBTWVNURU1TLCBJTkMuCiswMDkwQjIgQVZJQ0kgU1lTVEVNUyBJTkMuCiswMDkwQjMgQUdSQU5BVCBTWVNURU1TCiswMDkwQjQgV0lMTE9XQlJPT0sgVEVDSE5PTE9HSUVTCiswMDkwQjUgTklLT04gQ09SUE9SQVRJT04KKzAwOTBCNiBGSUJFWCBTWVNURU1TCiswMDkwQjcgRElHSVRBTCBMSUdIVFdBVkUsIElOQy4KKzAwOTBCOCBST0hERSAmIFNDSFdBUlogR01CSCAmIENPLiBLRworMDA5MEI5IEJFUkFOIElOU1RSVU1FTlRTIExURC4KKzAwOTBCQSBWQUxJRCBORVRXT1JLUywgSU5DLgorMDA5MEJCIFRBSU5FVCBDT01NVU5JQ0FUSU9OIFNZU1RFTSBDb3JwLgorMDA5MEJDIFRFTEVNQU5OIENPLiwgTFRELgorMDA5MEJEIE9NTklBIENPTU1VTklDQVRJT05TLCBJTkMuCiswMDkwQkUgSUJDL0lOVEVHUkFURUQgQlVTSU5FU1MgQ09NUFVURVJTCiswMDkwQkYgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA5MEMwIEsuSi4gTEFXIEVOR0lORUVSUywgSU5DLgorMDA5MEMxIFBlY28gSUksIEluYy4KKzAwOTBDMiBKSyBtaWNyb3N5c3RlbXMsIEluYy4KKzAwOTBDMyBUT1BJQyBTRU1JQ09ORFVDVE9SIENPUlAuCiswMDkwQzQgSkFWRUxJTiBTWVNURU1TLCBJTkMuCiswMDkwQzUgSU5URVJORVQgTUFHSUMsIElOQy4KKzAwOTBDNiBPUFRJTSBTWVNURU1TLCBJTkMuCiswMDkwQzcgSUNPTSBJTkMuCiswMDkwQzggV0FWRVJJREVSIENPTU1VTklDQVRJT05TIChDQU5BREEpIElOQy4KKzAwOTBDOSBEUEFDIFRlY2hub2xvZ2llcworMDA5MENBIEFDQ09SRCBWSURFTyBURUxFQ09NTVVOSUNBVElPTlMsIExURC4KKzAwOTBDQiBXaXJlbGVzcyBPbkxpbmUsIEluYy4KKzAwOTBDQyBQTEFORVQgQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwOTBDRCBFTlQtRU1QUkVTQSBOQUNJT05BTCBERSBURUxFQ09NTVVOSUNBQ09FUywgUy5BLgorMDA5MENFIFRFVFJBIEdtYkgKKzAwOTBDRiBOT1JURUwKKzAwOTBEMCBUaG9tc29uIEJlbGdpdW0KKzAwOTBEMSBMRUlDSFUgRU5URVJQUklTRSBDTy4sIExURC4KKzAwOTBEMiBBUlRFTCBWSURFTyBTWVNURU1TCiswMDkwRDMgR0lFU0VDS0UgJiBERVZSSUVOVCBHbWJICiswMDkwRDQgQmluZFZpZXcgRGV2ZWxvcG1lbnQgQ29ycC4KKzAwOTBENSBFVVBIT05JWCwgSU5DLgorMDA5MEQ2IENSWVNUQUwgR1JPVVAKKzAwOTBENyBOZXRCb29zdCBDb3JwLgorMDA5MEQ4IFdISVRFQ1JPU1MgU1lTVEVNUworMDA5MEQ5IENJU0NPIFNZU1RFTVMsIElOQy4KKzAwOTBEQSBEWU5BUkMsIElOQy4KKzAwOTBEQiBORVhUIExFVkVMIENPTU1VTklDQVRJT05TCiswMDkwREMgVEVDTyBJTkZPUk1BVElPTiBTWVNURU1TCiswMDkwREQgVEhFIE1JSEFSVSBDT01NVU5JQ0FUSU9OUyBDTy4sIExURC4KKzAwOTBERSBDQVJES0VZIFNZU1RFTVMsIElOQy4KKzAwOTBERiBNSVRTVUJJU0hJIENIRU1JQ0FMIEFNRVJJQ0EsIElOQy4KKzAwOTBFMCBTWVNUUkFOIENPUlAuCiswMDkwRTEgVEVMRU5BIFMuUC5BLgorMDA5MEUyIERJU1RSSUJVVEVEIFBST0NFU1NJTkcgVEVDSE5PTE9HWQorMDA5MEUzIEFWRVggRUxFQ1RST05JQ1MgSU5DLgorMDA5MEU0IE5FQyBBTUVSSUNBLCBJTkMuCiswMDkwRTUgVEVLTkVNQSwgSU5DLgorMDA5MEU2IEFDRVIgTEFCT1JBVE9SSUVTLCBJTkMuCiswMDkwRTcgSE9SU0NIIEVMRUtUUk9OSUsgQUcKKzAwOTBFOCBNT1hBIFRFQ0hOT0xPR0lFUyBDT1JQLiwgTFRELgorMDA5MEU5IEpBTlogQ09NUFVURVIgQUcKKzAwOTBFQSBBTFBIQSBURUNITk9MT0dJRVMsIElOQy4KKzAwOTBFQiBTRU5UUlkgVEVMRUNPTSBTWVNURU1TCiswMDkwRUMgUFlSRVNDT00KKzAwOTBFRCBDRU5UUkFMIFNZU1RFTSBSRVNFQVJDSCBDTy4sIExURC4KKzAwOTBFRSBQRVJTT05BTCBDT01NVU5JQ0FUSU9OUyBURUNITk9MT0dJRVMKKzAwOTBFRiBJTlRFR1JJWCwgSU5DLgorMDA5MEYwIEhBUk1PTklDIExJR0hUV0FWRVMsIExURC4KKzAwOTBGMSBET1QgSElMTCBTWVNURU1TIENPUlBPUkFUSU9OCiswMDkwRjIgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDA5MEYzIEFTUEVDVCBDT01NVU5JQ0FUSU9OUworMDA5MEY0IExJR0hUTklORyBJTlNUUlVNRU5UQVRJT04KKzAwOTBGNSBDTEVWTyBDTy4KKzAwOTBGNiBFU0NBTEFURSBORVRXT1JLUywgSU5DLgorMDA5MEY3IE5CQVNFIENPTU1VTklDQVRJT05TIExURC4KKzAwOTBGOCBNRURJQVRSSVggVEVMRUNPTQorMDA5MEY5IExFSVRDSAorMDA5MEZBIEdpZ2FOZXQsIEluYy4KKzAwOTBGQiBQT1JUV0VMTCwgSU5DLgorMDA5MEZDIE5FVFdPUksgQ09NUFVUSU5HIERFVklDRVMKKzAwOTBGRCBDb3BwZXJDb20sIEluYy4KKzAwOTBGRSBFTEVDT00gQ08uLCBMVEQuICAoTEFORUVEIERJVi4pCiswMDkwRkYgVEVMTFVTIFRFQ0hOT0xPR1kgSU5DLgorMDA5MUQ2IENyeXN0YWwgR3JvdXAsIEluYy4KKzAwOUQ4RSBDQVJESUFDIFJFQ09SREVSUywgSU5DLgorMDBBMDAwIENFTlRJTExJT04gTkVUV09SS1MsIElOQy4KKzAwQTAwMSBXQVRLSU5TLUpPSE5TT04gQ09NUEFOWQorMDBBMDAyIExFRURTICYgTk9SVEhSVVAgQVVTVFJBTElBIFBUWSBMVEQKKzAwQTAwMyBTVEFFRkEgQ09OVFJPTCBTWVNURU0KKzAwQTAwNCBORVRQT1dFUiwgSU5DLgorMDBBMDA1IERBTklFTCBJTlNUUlVNRU5UUywgTFRELgorMDBBMDA2IElNQUdFIERBVEEgUFJPQ0VTU0lORyBTWVNURU0gR1JPVVAKKzAwQTAwNyBBUEVYWCBURUNITk9MT0dZLCBJTkMuCiswMEEwMDggTkVUQ09SUAorMDBBMDA5IFdISVRFVFJFRSBORVRXT1JLCiswMEEwMEEgUi5ELkMuIENPTU1VTklDQVRJT04KKzAwQTAwQiBDT01QVVRFWCBDTy4sIExURC4KKzAwQTAwQyBLSU5HTUFYIFRFQ0hOT0xPR1ksIElOQy4KKzAwQTAwRCBUSEUgUEFOREEgUFJPSkVDVAorMDBBMDBFIFZJU1VBTCBORVRXT1JLUywgSU5DLgorMDBBMDBGIEJyb2FkYmFuZCBUZWNobm9sb2dpZXMKKzAwQTAxMCBTWVNMT0dJQyBEQVRFTlRFQ0hOSUsgQUcKKzAwQTAxMSBNVVRPSCBJTkRVU1RSSUVTIExURC4KKzAwQTAxMiBCLkEuVC5NLiBBRFZBTkNFRCBURUNITk9MT0dJRVMKKzAwQTAxMyBURUxUUkVORCBMVEQuCiswMEEwMTQgQ1NJUgorMDBBMDE1IFdZTEUKKzAwQTAxNiBNSUNST1BPTElTIENPUlAuCiswMEEwMTcgSiBCIE0gQ09SUE9SQVRJT04KKzAwQTAxOCBDUkVBVElWRSBDT05UUk9MTEVSUywgSU5DLgorMDBBMDE5IE5FQlVMQSBDT05TVUxUQU5UUywgSU5DLgorMDBBMDFBIEJJTkFSIEVMRUtUUk9OSUsgQUIKKzAwQTAxQiBQUkVNSVNZUyBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDBBMDFDIE5BU0NFTlQgTkVUV09SS1MgQ09SUE9SQVRJT04KKzAwQTAxRCBTSVhORVQKKzAwQTAxRSBFU1QgQ09SUE9SQVRJT04KKzAwQTAxRiBUUklDT1JEIFNZU1RFTVMsIElOQy4KKzAwQTAyMCBDSVRJQ09SUC9UVEkKKzAwQTAyMSBHRU5FUkFMIERZTkFNSUNTLQorMDBBMDIyIENFTlRSRSBGT1IgREVWRUxPUE1FTlQgT0YgQURWQU5DRUQgQ09NUFVUSU5HCiswMEEwMjMgQVBQTElFRCBDUkVBVElWRSBURUNITk9MT0dZLCBJTkMuCiswMEEwMjQgM0NPTSBDT1JQT1JBVElPTgorMDBBMDI1IFJFRENPTSBMQUJTIElOQy4KKzAwQTAyNiBURUxEQVQsIFMuQS4KKzAwQTAyNyBGSVJFUE9XRVIgU1lTVEVNUywgSU5DLgorMDBBMDI4IENPTk5FUiBQRVJJUEhFUkFMUworMDBBMDI5IENPVUxURVIgQ09SUE9SQVRJT04KKzAwQTAyQSBUUkFOQ0VMTCBTWVNURU1TCiswMEEwMkIgVFJBTlNJVElPTlMgUkVTRUFSQ0ggQ09SUC4KKzAwQTAyQyBpbnRlcldBVkUgQ29tbXVuaWNhdGlvbnMKKzAwQTAyRCAxMzk0IFRyYWRlIEFzc29jaWF0aW9uCiswMEEwMkUgQlJBTkQgQ09NTVVOSUNBVElPTlMsIExURC4KKzAwQTAyRiBQSVJFTExJIENBVkkKKzAwQTAzMCBDQVBUT1IgTlYvU0EKKzAwQTAzMSBIQVpFTFRJTkUgQ09SUE9SQVRJT04sIE1TIDEtMTcKKzAwQTAzMiBHRVMgU0lOR0FQT1JFIFBURS4gTFRELgorMDBBMDMzIGltYyBNZUJzeXN0ZW1lIEdtYkgKKzAwQTAzNCBBWEVMCiswMEEwMzUgQ1lMSU5LIENPUlBPUkFUSU9OCiswMEEwMzYgQVBQTElFRCBORVRXT1JLIFRFQ0hOT0xPR1kKKzAwQTAzNyBEQVRBU0NPUEUgQ09SUE9SQVRJT04KKzAwQTAzOCBFTUFJTCBFTEVDVFJPTklDUworMDBBMDM5IFJPU1MgVEVDSE5PTE9HWSwgSU5DLgorMDBBMDNBIEtVQk9URUsgQ09SUE9SQVRJT04KKzAwQTAzQiBUT1NISU4gRUxFQ1RSSUMgQ08uLCBMVEQuCiswMEEwM0MgRUcmRyBOVUNMRUFSIElOU1RSVU1FTlRTCiswMEEwM0QgT1BUTy0yMgorMDBBMDNFIEFUTSBGT1JVTQorMDBBMDNGIENPTVBVVEVSIFNPQ0lFVFkgTUlDUk9QUk9DRVNTT1IgJiBNSUNST1BST0NFU1NPUiBTVEFOREFSRFMgQworMDBBMDQwIEFQUExFIENPTVBVVEVSCiswMEEwNDEgTEVZQk9MRC1JTkZJQ09OCiswMEEwNDIgU1BVUiBQUk9EVUNUUyBDT1JQLgorMDBBMDQzIEFNRVJJQ0FOIFRFQ0hOT0xPR1kgTEFCUywgSU5DLgorMDBBMDQ0IE5UVCBJVCBDTy4sIExURC4KKzAwQTA0NSBQSE9FTklYIENPTlRBQ1QgR01CSCAmIENPLgorMDBBMDQ2IFNDSVRFWCBDT1JQLiBMVEQuCiswMEEwNDcgSU5URUdSQVRFRCBGSVRORVNTIENPUlAuCiswMEEwNDggUVVFU1RFQ0gsIExURC4KKzAwQTA0OSBESUdJVEVDSCBJTkRVU1RSSUVTLCBJTkMuCiswMEEwNEEgTklTU0hJTiBFTEVDVFJJQyBDTy4sIExURC4KKzAwQTA0QiBURkwgTEFOIElOQy4KKzAwQTA0QyBJTk5PVkFUSVZFIFNZU1RFTVMgJiBURUNITk9MT0dJRVMsIElOQy4KKzAwQTA0RCBFREEgSU5TVFJVTUVOVFMsIElOQy4KKzAwQTA0RSBWT0VMS0VSIFRFQ0hOT0xPR0lFUywgSU5DLgorMDBBMDRGIEFNRVJJVEVDIENPUlAuCiswMEEwNTAgQ1lQUkVTUyBTRU1JQ09ORFVDVE9SCiswMEEwNTEgQU5HSUEgQ09NTVVOSUNBVElPTlMuIElOQy4KKzAwQTA1MiBTVEFOSUxJVEUgRUxFQ1RST05JQ1MgUFRZLiBMVEQKKzAwQTA1MyBDT01QQUNUIERFVklDRVMsIElOQy4KKzAwQTA1NSBEYXRhIERldmljZSBDb3Jwb3JhdGlvbgorMDBBMDU2IE1JQ1JPUFJPU1MKKzAwQTA1NyBMQU5DT00gU3lzdGVtcyBHbWJICiswMEEwNTggR0xPUlksIExURC4KKzAwQTA1OSBIQU1JTFRPTiBIQUxMTUFSSworMDBBMDVBIEtPRkFYIElNQUdFIFBST0RVQ1RTCiswMEEwNUIgTUFSUVVJUCwgSU5DLgorMDBBMDVDIElOVkVOVE9SWSBDT05WRVJTSU9OLCBJTkMuLworMDBBMDVEIENTIENPTVBVVEVSIFNZU1RFTUUgR21iSAorMDBBMDVFIE1ZUklBRCBMT0dJQyBJTkMuCiswMEEwNUYgQlRHIEVOR0lORUVSSU5HIEJWCiswMEEwNjAgQUNFUiBQRVJJUEhFUkFMUywgSU5DLgorMDBBMDYxIFBVUklUQU4gQkVOTkVUVAorMDBBMDYyIEFFUyBQUk9EQVRBCiswMEEwNjMgSlJMIFNZU1RFTVMsIElOQy4KKzAwQTA2NCBLVkIvQU5BTEVDVAorMDBBMDY1IE5FWExBTkQsIElOQy4KKzAwQTA2NiBJU0EgQ08uLCBMVEQuCiswMEEwNjcgTkVUV09SSyBTRVJWSUNFUyBHUk9VUAorMDBBMDY4IEJIUCBMSU1JVEVECiswMEEwNjkgU3ltbWV0cmljb20sIEluYy4KKzAwQTA2QSBWZXJpbGluayBDb3Jwb3JhdGlvbgorMDBBMDZCIERNUyBET1JTQ0ggTUlLUk9TWVNURU0gR01CSAorMDBBMDZDIFNISU5ERU5HRU4gRUxFQ1RSSUMgTUZHLiBDTy4sIExURC4KKzAwQTA2RCBNQU5ORVNNQU5OIFRBTExZIENPUlBPUkFUSU9OCiswMEEwNkUgQVVTVFJPTiwgSU5DLgorMDBBMDZGIFRIRSBBUFBDT04gR1JPVVAsIElOQy4KKzAwQTA3MCBDT0FTVENPTQorMDBBMDcxIFZJREVPIExPVFRFUlkgVEVDSE5PTE9HSUVTLElOQworMDBBMDcyIE9WQVRJT04gU1lTVEVNUyBMVEQuCiswMEEwNzMgQ09NMjEsIElOQy4KKzAwQTA3NCBQRVJDRVBUSU9OIFRFQ0hOT0xPR1kKKzAwQTA3NSBNSUNST04gVEVDSE5PTE9HWSwgSU5DLgorMDBBMDc2IENBUkRXQVJFIExBQiwgSU5DLgorMDBBMDc3IEZVSklUU1UgTkVYSU9OLCBJTkMuCiswMEEwNzggTWFyY29uaSBDb21tdW5pY2F0aW9ucworMDBBMDc5IEFMUFMgRUxFQ1RSSUMgKFVTQSksIElOQy4KKzAwQTA3QSBBRFZBTkNFRCBQRVJJUEhFUkFMUyBURUNITk9MT0dJRVMsIElOQy4KKzAwQTA3QiBEQVdOIENPTVBVVEVSIElOQ09SUE9SQVRJT04KKzAwQTA3QyBUT05ZQU5HIE5ZTE9OIENPLiwgTFRELgorMDBBMDdEIFNFRVEgVEVDSE5PTE9HWSwgSU5DLgorMDBBMDdFIEFWSUQgVEVDSE5PTE9HWSwgSU5DLgorMDBBMDdGIEdTTS1TWU5URUwsIExURC4KKzAwQTA4MCBBTlRBUkVTIE1JQ1JPU1lTVEVNUworMDBBMDgxIEFMQ0FURUwgREFUQSBORVRXT1JLUworMDBBMDgyIE5LVCBFTEVLVFJPTklLIEEvUworMDBBMDgzIEFTSU1NUEhPTlkgVFVSS0VZCiswMEEwODQgREFUQVBMRVggUFRZLiBMVEQuCiswMEEwODYgQU1CRVIgV0FWRSBTWVNURU1TLCBJTkMuCiswMEEwODcgWmFybGluayBTZW1pY29uZHVjdG9yIEx0ZC4KKzAwQTA4OCBFU1NFTlRJQUwgQ09NTVVOSUNBVElPTlMKKzAwQTA4OSBYUE9JTlQgVEVDSE5PTE9HSUVTLCBJTkMuCiswMEEwOEEgQlJPT0tUUk9VVCBURUNITk9MT0dZLCBJTkMuCiswMEEwOEIgQVNUT04gRUxFQ1RST05JQyBERVNJR05TIExURC4KKzAwQTA4QyBNdWx0aU1lZGlhIExBTnMsIEluYy4KKzAwQTA4RCBKQUNPTU8gQ09SUE9SQVRJT04KKzAwQTA4RSBOb2tpYSBJbnRlcm5ldCBDb21tdW5pY2F0aW9ucworMDBBMDhGIERFU0tORVQgU1lTVEVNUywgSU5DLgorMDBBMDkwIFRpbWVTdGVwIENvcnBvcmF0aW9uCiswMEEwOTEgQVBQTElDT00gSU5URVJOQVRJT05BTAorMDBBMDkyIEguIEJPTExNQU5OIE1BTlVGQUNUVVJFUlMsIExURAorMDBBMDkzIEIvRSBBRVJPU1BBQ0UsIEluYy4KKzAwQTA5NCBDT01TQVQgQ09SUE9SQVRJT04KKzAwQTA5NSBBQ0FDSUEgTkVUV09SS1MsIElOQy4KKzAwQTA5NiBNSVRVTUkgRUxFQ1RSSUMgQ08uLCBMVEQuCiswMEEwOTcgSkMgSU5GT1JNQVRJT04gU1lTVEVNUworMDBBMDk4IE5FVFdPUksgQVBQTElBTkNFIENPUlAuCiswMEEwOTkgSy1ORVQgTFRELgorMDBBMDlBIE5JSE9OIEtPSERFTiBBTUVSSUNBCiswMEEwOUIgUVBTWCBDT01NVU5JQ0FUSU9OUywgTFRELgorMDBBMDlDIFh5cGxleCwgSW5jLgorMDBBMDlEIEpPSE5BVEhPTiBGUkVFTUFOIFRFQ0hOT0xPR0lFUworMDBBMDlFIElDVFYKKzAwQTA5RiBDT01NVklTSU9OIENPUlAuCiswMEEwQTAgQ09NUEFDVCBEQVRBLCBMVEQuCiswMEEwQTEgRVBJQyBEQVRBIElOQy4KKzAwQTBBMiBESUdJQ09NIFMuUC5BLgorMDBBMEEzIFJFTElBQkxFIFBPV0VSIE1FVEVSUworMDBBMEE0IE1JQ1JPUyBTWVNURU1TLCBJTkMuCiswMEEwQTUgVEVLTk9SIE1JQ1JPU1lTVEVNRSwgSU5DLgorMDBBMEE2IE0uSS4gU1lTVEVNUywgSy5LLgorMDBBMEE3IFZPUkFYIENPUlBPUkFUSU9OCiswMEEwQTggUkVORVggQ09SUE9SQVRJT04KKzAwQTBBOSBHTiBORVRURVNUIChDQU5BREEpIE5BVlRFTCBESVZJU0lPTgorMDBBMEFBIFNQQUNFTEFCUyBNRURJQ0FMCiswMEEwQUIgTkVUQ1MgSU5GT1JNQVRJT05TVEVDSE5JSyBHTUJICiswMEEwQUMgR0lMQVQgU0FURUxMSVRFIE5FVFdPUktTLCBMVEQuCiswMEEwQUQgTUFSQ09OSSBTUEEKKzAwQTBBRSBOVUNPTSBTWVNURU1TLCBJTkMuCiswMEEwQUYgV01TIElORFVTVFJJRVMKKzAwQTBCMCBJLU8gREFUQSBERVZJQ0UsIElOQy4KKzAwQTBCMSBGSVJTVCBWSVJUVUFMIENPUlBPUkFUSU9OCiswMEEwQjIgU0hJTUEgU0VJS0kKKzAwQTBCMyBaWUtST05JWAorMDBBMEI0IFRFWEFTIE1JQ1JPU1lTVEVNUywgSU5DLgorMDBBMEI1IDNIIFRFQ0hOT0xPR1kKKzAwQTBCNiBTQU5SSVRaIEFVVE9NQVRJT04gQ08uLCBMVEQuCiswMEEwQjcgQ09SREFOVCwgSU5DLgorMDBBMEI4IFNZTUJJT1MgTE9HSUMgSU5DLgorMDBBMEI5IEVBR0xFIFRFQ0hOT0xPR1ksIElOQy4KKzAwQTBCQSBQQVRUT04gRUxFQ1RST05JQ1MgQ08uCiswMEEwQkIgSElMQU4gR01CSAorMDBBMEJDIFZJQVNBVCwgSU5DT1JQT1JBVEVECiswMEEwQkQgSS1URUNIIENPUlAuCiswMEEwQkUgSU5URUdSQVRFRCBDSVJDVUlUIFNZU1RFTVMsIElOQy4gQ09NTVVOSUNBVElPTlMgR1JPVVAKKzAwQTBCRiBXSVJFTEVTUyBEQVRBIEdST1VQIE1PVE9ST0xBCiswMEEwQzAgRElHSVRBTCBMSU5LIENPUlAuCiswMEEwQzEgT1JUSVZVUyBNRURJQ0FMIEFCCiswMEEwQzIgUi5BLiBTWVNURU1TIENPLiwgTFRELgorMDBBMEMzIFVOSUNPTVBVVEVSIEdNQkgKKzAwQTBDNCBDUklTVElFIEVMRUNUUk9OSUNTIExURC4KKzAwQTBDNSBaWVhFTCBDT01NVU5JQ0FUSU9OCiswMEEwQzYgUVVBTENPTU0gSU5DT1JQT1JBVEVECiswMEEwQzcgVEFESVJBTiBURUxFQ09NTVVOSUNBVElPTlMKKzAwQTBDOCBBRFRSQU4gSU5DLgorMDBBMEM5IElOVEVMIENPUlBPUkFUSU9OIC0gSEYxLTA2CiswMEEwQ0EgRlVKSVRTVSBERU5TTyBMVEQuCiswMEEwQ0IgQVJLIFRFTEVDT01NVU5JQ0FUSU9OUywgSU5DLgorMDBBMENDIExJVEUtT04gQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwQTBDRCBEUi4gSk9IQU5ORVMgSEVJREVOSEFJTiBHbWJICiswMEEwQ0UgQVNUUk9DT00gQ09SUE9SQVRJT04KKzAwQTBDRiBTT1RBUywgSU5DLgorMDBBMEQwIFRFTiBYIFRFQ0hOT0xPR1ksIElOQy4KKzAwQTBEMSBJTlZFTlRFQyBDT1JQT1JBVElPTgorMDBBMEQyIEFMTElFRCBURUxFU0lTIElOVEVSTkFUSU9OQUwgQ09SUE9SQVRJT04KKzAwQTBEMyBJTlNURU0gQ09NUFVURVIgU1lTVEVNUywgTFRELgorMDBBMEQ0IFJBRElPTEFOLCAgSU5DLgorMDBBMEQ1IFNJRVJSQSBXSVJFTEVTUyBJTkMuCiswMEEwRDYgU0JFLCBJTkMuCiswMEEwRDcgS0FTVEVOIENIQVNFIEFQUExJRUQgUkVTRUFSQ0gKKzAwQTBEOCBTUEVDVFJBIC0gVEVLCiswMEEwRDkgQ09OVkVYIENPTVBVVEVSIENPUlBPUkFUSU9OCiswMEEwREEgSU5URUdSQVRFRCBTWVNURU1TIFRlY2hub2xvZ3ksIEluYy4KKzAwQTBEQiBGSVNIRVIgJiBQQVlLRUwgUFJPRFVDVElPTgorMDBBMERDIE8uTi4gRUxFQ1RST05JQyBDTy4sIExURC4KKzAwQTBERCBBWk9OSVggQ09SUE9SQVRJT04KKzAwQTBERSBZQU1BSEEgQ09SUE9SQVRJT04KKzAwQTBERiBTVFMgVEVDSE5PTE9HSUVTLCBJTkMuCiswMEEwRTAgVEVOTllTT04gVEVDSE5PTE9HSUVTIFBUWSBMVEQKKzAwQTBFMSBXRVNUUE9SVCBSRVNFQVJDSCBBU1NPQ0lBVEVTLCBJTkMuCiswMEEwRTIgS0VJU09LVSBHSUtFTiBDT1JQLgorMDBBMEUzIFhLTCBTWVNURU1TIENPUlAuCiswMEEwRTQgT1BUSVFVRVNUCiswMEEwRTUgTkhDIENPTU1VTklDQVRJT05TCiswMEEwRTYgRElBTE9HSUMgQ09SUE9SQVRJT04KKzAwQTBFNyBDRU5UUkFMIERBVEEgQ09SUE9SQVRJT04KKzAwQTBFOCBSRVVURVJTIEhPTERJTkdTIFBMQworMDBBMEU5IEVMRUNUUk9OSUMgUkVUQUlMSU5HIFNZU1RFTVMgSU5URVJOQVRJT05BTAorMDBBMEVBIEVUSEVSQ09NIENPUlAuCiswMEEwRUIgRW5jb3JlIE5ldHdvcmtzCiswMEEwRUMgVFJBTlNNSVRUT04gTFRELgorMDBBMEVEIFBSSSBBVVRPTUFUSU9OCiswMEEwRUUgTkFTSE9CQSBORVRXT1JLUworMDBBMEVGIExVQ0lEQVRBIExURC4KKzAwQTBGMCBUT1JPTlRPIE1JQ1JPRUxFQ1RST05JQ1MgSU5DLgorMDBBMEYxIE1USQorMDBBMEYyIElORk9URUsgQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwQTBGMyBTVEFVQkxJCiswMEEwRjQgR0UKKzAwQTBGNSBSQURHVUFSRCBMVEQuCiswMEEwRjYgQXV0b0dhcyBTeXN0ZW1zIEluYy4KKzAwQTBGNyBWLkkgQ09NUFVURVIgQ09SUC4KKzAwQTBGOCBTWU1CT0wgVEVDSE5PTE9HSUVTLCBJTkMuCiswMEEwRjkgQklOVEVDIENPTU1VTklDQVRJT05TIEdNQkgKKzAwQTBGQSBNYXJjb25pIENvbW11bmljYXRpb24gR21iSAorMDBBMEZCIFRPUkFZIEVOR0lORUVSSU5HIENPLiwgTFRELgorMDBBMEZDIElNQUdFIFNDSUVOQ0VTLCBJTkMuCiswMEEwRkQgU0NJVEVYIERJR0lUQUwgUFJJTlRJTkcsIElOQy4KKzAwQTBGRSBCT1NUT04gVEVDSE5PTE9HWSwgSU5DLgorMDBBMEZGIFRFTExBQlMgT1BFUkFUSU9OUywgSU5DLgorMDBBQTAwIElOVEVMIENPUlBPUkFUSU9OCiswMEFBMDEgSU5URUwgQ09SUE9SQVRJT04KKzAwQUEwMiBJTlRFTCBDT1JQT1JBVElPTgorMDBBQTNDIE9MSVZFVFRJIFRFTEVDT00gU1BBIChPTFRFQ08pCiswMEIwMDkgR3Jhc3MgVmFsbGV5IEdyb3VwCiswMEIwMTcgSW5mb0dlYXIgVGVjaG5vbG9neSBDb3JwLgorMDBCMDE5IENhc2ktUnVzY28KKzAwQjAxQyBXZXN0cG9ydCBUZWNobm9sb2dpZXMKKzAwQjAxRSBSYW50aWMgTGFicywgSW5jLgorMDBCMDJBIE9SU1lTIEdtYkgKKzAwQjAyRCBWaWFHYXRlIFRlY2hub2xvZ2llcywgSW5jLgorMDBCMDNCIEhpUSBOZXR3b3JrcworMDBCMDQ4IE1hcmNvbmkgQ29tbXVuaWNhdGlvbnMgSW5jLgorMDBCMDRBIENpc2NvIFN5c3RlbXMsIEluYy4KKzAwQjA1MiBJbnRlbGxvbiBDb3Jwb3JhdGlvbgorMDBCMDY0IENpc2NvIFN5c3RlbXMsIEluYy4KKzAwQjA2OSBIb25ld2VsbCBPeQorMDBCMDZEIEpvbmVzIEZ1dHVyZXggSW5jLgorMDBCMDgwIE1hbm5lc21hbm4gSXB1bHN5cyBCLlYuCiswMEIwODYgTG9jU29mdCBMaW1pdGVkCiswMEIwOEUgQ2lzY28gU3lzdGVtcywgSW5jLgorMDBCMDkxIFRyYW5zbWV0YSBDb3JwLgorMDBCMDk0IEFsYXJpcywgSW5jLgorMDBCMDlBIE1vcnJvdyBUZWNobm9sb2dpZXMgQ29ycC4KKzAwQjA5RCBQb2ludCBHcmV5IFJlc2VhcmNoIEluYy4KKzAwQjBBQyBTSUFFLU1pY3JvZWxldHRyb25pY2EgUy5wLkEuCiswMEIwQUUgU3ltbWV0cmljb20KKzAwQjBCMyBYc3RyZWFtaXMgUExDCiswMEIwQzIgQ2lzY28gU3lzdGVtcywgSW5jLgorMDBCMEM3IFRlbGxhYnMgT3BlcmF0aW9ucywgSW5jLgorMDBCMENFIFRFQ0hOT0xPR1kgUkVTQ1VFCiswMEIwRDAgRGVsbCBDb21wdXRlciBDb3JwLgorMDBCMERCIE5leHRjZWxsLCBJbmMuCiswMEIwREYgUmVsaWFibGUgRGF0YSBUZWNobm9sb2d5LCBJbmMuCiswMEIwRTcgQnJpdGlzaCBGZWRlcmFsIEx0ZC4KKzAwQjBFQyBFQUNFTQorMDBCMEVFIEFqaWxlIFN5c3RlbXMsIEluYy4KKzAwQjBGMCBDQUxZIE5FVFdPUktTCiswMEIwRjUgTmV0V29ydGggVGVjaG5vbG9naWVzLCBJbmMuCiswMEJCMDEgT0NUT1RIT1JQRSBDT1JQLgorMDBCQkYwIFVOR0VSTUFOTi1CQVNTIElOQy4KKzAwQzAwMCBMQU5PUFRJQ1MsIExURC4KKzAwQzAwMSBESUFURUsgUEFUSUVOVCBNQU5BR01FTlQKKzAwQzAwMiBTRVJDT01NIENPUlBPUkFUSU9OCiswMEMwMDMgR0xPQkFMTkVUIENPTU1VTklDQVRJT05TCiswMEMwMDQgSkFQQU4gQlVTSU5FU1MgQ09NUFVURVIgQ08uTFRECiswMEMwMDUgTElWSU5HU1RPTiBFTlRFUlBSSVNFUywgSU5DLgorMDBDMDA2IE5JUFBPTiBBVklPTklDUyBDTy4sIExURC4KKzAwQzAwNyBQSU5OQUNMRSBEQVRBIFNZU1RFTVMsIElOQy4KKzAwQzAwOCBTRUNPIFNSTAorMDBDMDA5IEtUIFRFQ0hOT0xPR1kgKFMpIFBURSBMVEQKKzAwQzAwQSBNSUNSTyBDUkFGVAorMDBDMDBCIE5PUkNPTlRST0wgQS5TLgorMDBDMDBDIFJFTElBIFRFQ0hOT0xHSUVTCiswMEMwMEQgQURWQU5DRUQgTE9HSUMgUkVTRUFSQ0gsIElOQy4KKzAwQzAwRSBQU0lURUNILCBJTkMuCiswMEMwMEYgUVVBTlRVTSBTT0ZUV0FSRSBTWVNURU1TIExURC4KKzAwQzAxMCBISVJBS0FXQSBIRVdURUNIIENPUlAuCiswMEMwMTEgSU5URVJBQ1RJVkUgQ09NUFVUSU5HIERFVklDRVMKKzAwQzAxMiBORVRTUEFOIENPUlBPUkFUSU9OCiswMEMwMTMgTkVUUklYCiswMEMwMTQgVEVMRU1BVElDUyBDQUxBQkFTQVMgSU5UJ0wsSU5DCiswMEMwMTUgTkVXIE1FRElBIENPUlBPUkFUSU9OCiswMEMwMTYgRUxFQ1RST05JQyBUSEVBVFJFIENPTlRST0xTCiswMEMwMTcgRk9SVEUgTkVUV09SS1MKKzAwQzAxOCBMQU5BUlQgQ09SUE9SQVRJT04KKzAwQzAxOSBMRUFQIFRFQ0hOT0xPR1ksIElOQy4KKzAwQzAxQSBDT1JPTUVUUklDUyBNRURJQ0FMIFNZU1RFTVMKKzAwQzAxQiBTT0NLRVQgQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwQzAxQyBJTlRFUkxJTksgQ09NTVVOSUNBVElPTlMgTFRELgorMDBDMDFEIEdSQU5EIEpVTkNUSU9OIE5FVFdPUktTLCBJTkMuCiswMEMwMUUgTEEgRlJBTkNBSVNFIERFUyBKRVVYCiswMEMwMUYgUy5FLlIuQy5FLkwuCiswMEMwMjAgQVJDTyBFTEVDVFJPTklDLCBDT05UUk9MIExURC4KKzAwQzAyMSBORVRFWFBSRVNTCiswMEMwMjIgTEFTRVJNQVNURVIgVEVDSE5PTE9HSUVTLCBJTkMuCiswMEMwMjMgVFVUQU5LSEFNT04gRUxFQ1RST05JQ1MKKzAwQzAyNCBFREVOIFNJU1RFTUFTIERFIENPTVBVVEFDQU8gU0EKKzAwQzAyNSBEQVRBUFJPRFVDVFMgQ09SUE9SQVRJT04KKzAwQzAyNiBMQU5TIFRFQ0hOT0xPR1kgQ08uLCBMVEQuCiswMEMwMjcgQ0lQSEVSIFNZU1RFTVMsIElOQy4KKzAwQzAyOCBKQVNDTyBDT1JQT1JBVElPTgorMDBDMDI5IE5leGFucyBEZXV0c2NobGFuZCBBRyAtIEFOUworMDBDMDJBIE9IS1VSQSBFTEVDVFJJQyBDTy4sIExURC4KKzAwQzAyQiBHRVJMT0ZGIEdFU0VMTFNDSEFGVCBGVVIKKzAwQzAyQyBDRU5UUlVNIENPTU1VTklDQVRJT05TLCBJTkMuCiswMEMwMkQgRlVKSSBQSE9UTyBGSUxNIENPLiwgTFRELgorMDBDMDJFIE5FVFdJWgorMDBDMDJGIE9LVU1BIENPUlBPUkFUSU9OCiswMEMwMzAgSU5URUdSQVRFRCBFTkdJTkVFUklORyBCLiBWLgorMDBDMDMxIERFU0lHTiBSRVNFQVJDSCBTWVNURU1TLCBJTkMuCiswMEMwMzIgSS1DVUJFRCBMSU1JVEVECiswMEMwMzMgVEVMRUJJVCBDT01NVU5JQ0FUSU9OUyBBUFMKKzAwQzAzNCBUUkFOU0FDVElPTiBORVRXT1JLCiswMEMwMzUgUVVJTlRBUiBDT01QQU5ZCiswMEMwMzYgUkFZVEVDSCBFTEVDVFJPTklDIENPUlAuCiswMEMwMzcgRFlOQVRFTQorMDBDMDM4IFJBU1RFUiBJTUFHRSBQUk9DRVNTSU5HIFNZU1RFTQorMDBDMDM5IFRESyBTRU1JQ09ORFVDVE9SIENPUlBPUkFUSU9OCiswMEMwM0EgTUVOLU1JS1JPIEVMRUtUUk9OSUsgR01CSAorMDBDMDNCIE1VTFRJQUNDRVNTIENPTVBVVElORyBDT1JQLgorMDBDMDNDIFRPV0VSIFRFQ0ggUy5SLkwuCiswMEMwM0QgV0lFU0VNQU5OICYgVEhFSVMgR01CSAorMDBDMDNFIEZBLiBHRUJSLiBIRUxMRVIgR01CSAorMDBDMDNGIFNUT1JFUyBBVVRPTUFURUQgU1lTVEVNUywgSU5DLgorMDBDMDQwIEVDQ0kKKzAwQzA0MSBESUdJVEFMIFRSQU5TTUlTU0lPTiBTWVNURU1TCiswMEMwNDIgREFUQUxVWCBDT1JQLgorMDBDMDQzIFNUUkFUQUNPTQorMDBDMDQ0IEVNQ09NIENPUlBPUkFUSU9OCiswMEMwNDUgSVNPTEFUSU9OIFNZU1RFTVMsIExURC4KKzAwQzA0NiBLRU1JVFJPTiBMVEQuCiswMEMwNDcgVU5JTUlDUk8gU1lTVEVNUywgSU5DLgorMDBDMDQ4IEJBWSBURUNITklDQUwgQVNTT0NJQVRFUworMDBDMDQ5IFUuUy4gUk9CT1RJQ1MsIElOQy4KKzAwQzA0QSBHUk9VUCAyMDAwIEFHCiswMEMwNEIgQ1JFQVRJVkUgTUlDUk9TWVNURU1TCiswMEMwNEMgREVQQVJUTUVOVCBPRiBGT1JFSUdOIEFGRkFJUlMKKzAwQzA0RCBNSVRFQywgSU5DLgorMDBDMDRFIENPTVRST0wgQ09SUE9SQVRJT04KKzAwQzA0RiBERUxMIENPTVBVVEVSIENPUlBPUkFUSU9OCiswMEMwNTAgVE9ZTyBERU5LSSBTRUlaTyBLLksuCiswMEMwNTEgQURWQU5DRUQgSU5URUdSQVRJT04gUkVTRUFSQ0gKKzAwQzA1MiBCVVJSLUJST1dOCiswMEMwNTMgREFWT1ggQ09SUE9SQVRJT04KKzAwQzA1NCBORVRXT1JLIFBFUklQSEVSQUxTLCBMVEQuCiswMEMwNTUgTU9EVUxBUiBDT01QVVRJTkcgVEVDSE5PTE9HSUVTCiswMEMwNTYgU09NRUxFQworMDBDMDU3IE1ZQ08gRUxFQ1RST05JQ1MKKzAwQzA1OCBEQVRBRVhQRVJUIENPUlAuCiswMEMwNTkgTklQUE9OIERFTlNPIENPLiwgTFRELgorMDBDMDVBIFNFTUFQSE9SRSBDT01NVU5JQ0FUSU9OUyBDT1JQLgorMDBDMDVCIE5FVFdPUktTIE5PUlRIV0VTVCwgSU5DLgorMDBDMDVDIEVMT05FWCBQTEMKKzAwQzA1RCBMJk4gVEVDSE5PTE9HSUVTCiswMEMwNUUgVkFSSS1MSVRFLCBJTkMuCiswMEMwNUYgRklORS1QQUwgQ09NUEFOWSBMSU1JVEVECiswMEMwNjAgSUQgU0NBTkRJTkFWSUEgQVMKKzAwQzA2MSBTT0xFQ1RFSyBDT1JQT1JBVElPTgorMDBDMDYyIElNUFVMU0UgVEVDSE5PTE9HWQorMDBDMDYzIE1PUk5JTkcgU1RBUiBURUNITk9MT0dJRVMsIElOQworMDBDMDY0IEdFTkVSQUwgREFUQUNPTU0gSU5ELiBJTkMuCiswMEMwNjUgU0NPUEUgQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwQzA2NiBET0NVUE9JTlQsIElOQy4KKzAwQzA2NyBVTklURUQgQkFSQ09ERSBJTkRVU1RSSUVTCiswMEMwNjggUEhJTElQIERSQUtFIEVMRUNUUk9OSUNTIExURC4KKzAwQzA2OSBBeHhjZWxlcmEgQnJvYWRiYW5kIFdpcmVsZXNzCiswMEMwNkEgWkFITkVSLUVMRUtUUklLIEdNQkggJiBDTy4gS0cKKzAwQzA2QiBPU0kgUExVUyBDT1JQT1JBVElPTgorMDBDMDZDIFNWRUMgQ09NUFVURVIgQ09SUC4KKzAwQzA2RCBCT0NBIFJFU0VBUkNILCBJTkMuCiswMEMwNkUgSEFGVCBURUNITk9MT0dZLCBJTkMuCiswMEMwNkYgS09NQVRTVSBMVEQuCiswMEMwNzAgU0VDVFJBIFNFQ1VSRS1UUkFOU01JU1NJT04gQUIKKzAwQzA3MSBBUkVBTkVYIENPTU1VTklDQVRJT05TLCBJTkMuCiswMEMwNzIgS05YIExURC4KKzAwQzA3MyBYRURJQSBDT1JQT1JBVElPTgorMDBDMDc0IFRPWU9EQSBBVVRPTUFUSUMgTE9PTQorMDBDMDc1IFhBTlRFIENPUlBPUkFUSU9OCiswMEMwNzYgSS1EQVRBIElOVEVSTkFUSU9OQUwgQS1TCiswMEMwNzcgREFFV09PIFRFTEVDT00gTFRELgorMDBDMDc4IENPTVBVVEVSIFNZU1RFTVMgRU5HSU5FRVJJTkcKKzAwQzA3OSBGT05TWVMgQ08uLExURC4KKzAwQzA3QSBQUklWQSBCLlYuCiswMEMwN0IgQVNDRU5EIENPTU1VTklDQVRJT05TLCBJTkMuCiswMEMwN0MgSElHSFRFQ0ggSU5GT1JNQVRJT04KKzAwQzA3RCBSSVNDIERFVkVMT1BNRU5UUyBMVEQuCiswMEMwN0UgS1VCT1RBIENPUlBPUkFUSU9OIEVMRUNUUk9OSUMKKzAwQzA3RiBOVVBPTiBDT01QVVRJTkcgQ09SUC4KKzAwQzA4MCBORVRTVEFSLCBJTkMuCiswMEMwODEgTUVUUk9EQVRBIExURC4KKzAwQzA4MiBNT09SRSBQUk9EVUNUUyBDTy4KKzAwQzA4MyBUUkFDRSBNT1VOVEFJTiBQUk9EVUNUUywgSU5DLgorMDBDMDg0IERBVEEgTElOSyBDT1JQLiBMVEQuCiswMEMwODUgRUxFQ1RST05JQ1MgRk9SIElNQUdJTkcsIElOQy4KKzAwQzA4NiBUSEUgTFlOSyBDT1JQT1JBVElPTgorMDBDMDg3IFVVTkVUIFRFQ0hOT0xPR0lFUywgSU5DLgorMDBDMDg4IEVLRiBFTEVLVFJPTklLIEdNQkgKKzAwQzA4OSBURUxJTkRVUyBESVNUUklCVVRJT04KKzAwQzA4QSBMQVVURVJCQUNIIERBVEVOVEVDSE5JSyBHTUJICiswMEMwOEIgUklTUSBNT0RVTEFSIFNZU1RFTVMsIElOQy4KKzAwQzA4QyBQRVJGT1JNQU5DRSBURUNITk9MT0dJRVMsIElOQy4KKzAwQzA4RCBUUk9OSVggUFJPRFVDVCBERVZFTE9QTUVOVAorMDBDMDhFIE5FVFdPUksgSU5GT1JNQVRJT04gVEVDSE5PTE9HWQorMDBDMDhGIE1BVFNVU0hJVEEgRUxFQ1RSSUMgV09SS1MsIExURAorMDBDMDkwIFBSQUlNIFMuUi5MLgorMDBDMDkxIEpBQklMIENJUkNVSVQsIElOQy4KKzAwQzA5MiBNRU5ORU4gTUVESUNBTCBJTkMuCiswMEMwOTMgQUxUQSBSRVNFQVJDSCBDT1JQLgorMDBDMDk0IFZNWCBJTkMuCiswMEMwOTUgWk5ZWAorMDBDMDk2IFRBTVVSQSBDT1JQT1JBVElPTgorMDBDMDk3IEFSQ0hJUEVMIFNBCiswMEMwOTggQ0hVTlRFWCBFTEVDVFJPTklDIENPLiwgTFRELgorMDBDMDk5IFlPU0hJS0kgSU5EVVNUUklBTCBDTy4sTFRELgorMDBDMDlBIFBIT1RPTklDUyBDT1JQT1JBVElPTgorMDBDMDlCIFJFTElBTkNFIENPTU0vVEVDLCBSLVRFQworMDBDMDlDIFRPQSBFTEVDVFJPTklDIExURC4KKzAwQzA5RCBESVNUUklCVVRFRCBTWVNURU1TIElOVCdMLCBJTkMKKzAwQzA5RSBDQUNIRSBDT01QVVRFUlMsIElOQy4KKzAwQzA5RiBRVUFOVEEgQ09NUFVURVIsIElOQy4KKzAwQzBBMCBBRFZBTkNFIE1JQ1JPIFJFU0VBUkNILCBJTkMuCiswMEMwQTEgVE9LWU8gREVOU0hJIFNFS0VJIENPLgorMDBDMEEyIElOVEVSTUVESVVNIEEvUworMDBDMEEzIERVQUwgRU5URVJQUklTRVMgQ09SUE9SQVRJT04KKzAwQzBBNCBVTklHUkFGIE9ZCiswMEMwQTUgRElDS0VOUyBEQVRBIFNZU1RFTVMKKzAwQzBBNiBFWElDT00gQVVTVFJBTElBIFBUWS4gTFRECiswMEMwQTcgU0VFTCBMVEQuCiswMEMwQTggR1ZDIENPUlBPUkFUSU9OCiswMEMwQTkgQkFSUk9OIE1DQ0FOTiBMVEQuCiswMEMwQUEgU0lMSUNPTiBWQUxMRVkgQ09NUFVURVIKKzAwQzBBQiBUZWxjbyBTeXN0ZW1zLCBJbmMuCiswMEMwQUMgR0FNQklUIENPTVBVVEVSIENPTU1VTklDQVRJT05TCiswMEMwQUQgTUFSQkVOIENPTU1VTklDQVRJT04gU1lTVEVNUworMDBDMEFFIFRPV0VSQ09NIENPLiBJTkMuIERCQSBQQyBIT1VTRQorMDBDMEFGIFRFS0xPR0lYIElOQy4KKzAwQzBCMCBHQ0MgVEVDSE5PTE9HSUVTLElOQy4KKzAwQzBCMSBHRU5JVVMgTkVUIENPLgorMDBDMEIyIE5PUkFORCBDT1JQT1JBVElPTgorMDBDMEIzIENPTVNUQVQgREFUQUNPTU0gQ09SUE9SQVRJT04KKzAwQzBCNCBNWVNPTiBURUNITk9MT0dZLCBJTkMuCiswMEMwQjUgQ09SUE9SQVRFIE5FVFdPUksgU1lTVEVNUyxJTkMuCiswMEMwQjYgU25hcCBBcHBsaWFuY2UsIEluYy4KKzAwQzBCNyBBTUVSSUNBTiBQT1dFUiBDT05WRVJTSU9OIENPUlAKKzAwQzBCOCBGUkFTRVInUyBISUxMIExURC4KKzAwQzBCOSBGVU5LIFNPRlRXQVJFLCBJTkMuCiswMEMwQkEgTkVUVkFOVEFHRQorMDBDMEJCIEZPUlZBTCBDUkVBVElWRSwgSU5DLgorMDBDMEJDIFRFTEVDT00gQVVTVFJBTElBL0NTU0MKKzAwQzBCRCBJTkVYIFRFQ0hOT0xPR0lFUywgSU5DLgorMDBDMEJFIEFMQ0FURUwgLSBTRUwKKzAwQzBCRiBURUNITk9MT0dZIENPTkNFUFRTLCBMVEQuCiswMEMwQzAgU0hPUkUgTUlDUk9TWVNURU1TLCBJTkMuCiswMEMwQzEgUVVBRC9HUkFQSElDUywgSU5DLgorMDBDMEMyIElORklOSVRFIE5FVFdPUktTIExURC4KKzAwQzBDMyBBQ1VTT04gQ09NUFVURUQgU09OT0dSQVBIWQorMDBDMEM0IENPTVBVVEVSIE9QRVJBVElPTkFMCiswMEMwQzUgU0lEIElORk9STUFUSUNBCiswMEMwQzYgUEVSU09OQUwgTUVESUEgQ09SUC4KKzAwQzBDNyBTUEFSS1RSVU0gTUlDUk9TWVNURU1TLCBJTkMuCiswMEMwQzggTUlDUk8gQllURSBQVFkuIExURC4KKzAwQzBDOSBFTFNBRyBCQUlMRVkgUFJPQ0VTUworMDBDMENBIEFMRkEsIElOQy4KKzAwQzBDQiBDT05UUk9MIFRFQ0hOT0xPR1kgQ09SUE9SQVRJT04KKzAwQzBDQyBURUxFU0NJRU5DRVMgQ08gU1lTVEVNUywgSU5DLgorMDBDMENEIENPTUVMVEEsIFMuQS4KKzAwQzBDRSBDRUkgU1lTVEVNUyAmIEVOR0lORUVSSU5HIFBURQorMDBDMENGIElNQVRSQU4gVk9JTUEgT1kKKzAwQzBEMCBSQVRPQyBTWVNURU0gSU5DLgorMDBDMEQxIENPTVRSRUUgVEVDSE5PTE9HWSBDT1JQT1JBVElPTgorMDBDMEQyIFNZTlRFTExFQ1QsIElOQy4KKzAwQzBEMyBPTFlNUFVTIElNQUdFIFNZU1RFTVMsIElOQy4KKzAwQzBENCBBWE9OIE5FVFdPUktTLCBJTkMuCiswMEMwRDUgUVVBTkNPTSBFTEVDVFJPTklDIEdNQkgKKzAwQzBENiBKMSBTWVNURU1TLCBJTkMuCiswMEMwRDcgVEFJV0FOIFRSQURJTkcgQ0VOVEVSIERCQQorMDBDMEQ4IFVOSVZFUlNBTCBEQVRBIFNZU1RFTVMKKzAwQzBEOSBRVUlOVEUgTkVUV09SSyBDT05GSURFTlRJQUxJVFkKKzAwQzBEQSBOSUNFIFNZU1RFTVMgTFRELgorMDBDMERCIElQQyBDT1JQT1JBVElPTiAoUFRFKSBMVEQuCiswMEMwREMgRU9TIFRFQ0hOT0xPR0lFUywgSU5DLgorMDBDMEREIFFMb2dpYyBDb3Jwb3JhdGlvbgorMDBDMERFIFpDT01NLCBJTkMuCiswMEMwREYgS1lFIFN5c3RlbXMgQ29ycC4KKzAwQzBFMCBEU0MgQ09NTVVOSUNBVElPTiBDT1JQLgorMDBDMEUxIFNPTklDIFNPTFVUSU9OUworMDBDMEUyIENBTENPTVAsIElOQy4KKzAwQzBFMyBPU0lURUNIIENPTU1VTklDQVRJT05TLCBJTkMuCiswMEMwRTQgU0lFTUVOUyBCVUlMRElORworMDBDMEU1IEdFU1BBQywgUy5BLgorMDBDMEU2IFZlcmlsaW5rIENvcnBvcmF0aW9uCiswMEMwRTcgRklCRVJEQVRBIEFCCiswMEMwRTggUExFWENPTSwgSU5DLgorMDBDMEU5IE9BSyBTT0xVVElPTlMsIExURC4KKzAwQzBFQSBBUlJBWSBURUNITk9MT0dZIExURC4KKzAwQzBFQiBTRUggQ09NUFVURVJURUNITklLIEdNQkgKKzAwQzBFQyBEQVVQSElOIFRFQ0hOT0xPR1kKKzAwQzBFRCBVUyBBUk1ZIEVMRUNUUk9OSUMKKzAwQzBFRSBLWU9DRVJBIENPUlBPUkFUSU9OCiswMEMwRUYgQUJJVCBDT1JQT1JBVElPTgorMDBDMEYwIEtJTkdTVE9OIFRFQ0hOT0xPR1kgQ09SUC4KKzAwQzBGMSBTSElOS08gRUxFQ1RSSUMgQ08uLCBMVEQuCiswMEMwRjIgVFJBTlNJVElPTiBORVRXT1JLUworMDBDMEYzIE5FVFdPUksgQ09NTVVOSUNBVElPTlMgQ09SUC4KKzAwQzBGNCBJTlRFUkxJTksgU1lTVEVNIENPLiwgTFRELgorMDBDMEY1IE1FVEFDT01QLCBJTkMuCiswMEMwRjYgQ0VMQU4gVEVDSE5PTE9HWSBJTkMuCiswMEMwRjcgRU5HQUdFIENPTU1VTklDQVRJT04sIElOQy4KKzAwQzBGOCBBQk9VVCBDT01QVVRJTkcgSU5DLgorMDBDMEY5IEhBUlJJUyBBTkQgSkVGRlJJRVMsIElOQy4KKzAwQzBGQSBDQU5BUlkgQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwQzBGQiBBRFZBTkNFRCBURUNITk9MT0dZIExBQlMKKzAwQzBGQyBFTEFTVElDIFJFQUxJVFksIElOQy4KKzAwQzBGRCBQUk9TVU0KKzAwQzBGRSBBUFRFQyBDT01QVVRFUiBTWVNURU1TLCBJTkMuCiswMEMwRkYgRE9UIEhJTEwgU1lTVEVNUyBDT1JQT1JBVElPTgorMDBDQkJEIENhbWJyaWRnZSBCcm9hZGJhbmQgTHRkLgorMDBDRjFDIENPTU1VTklDQVRJT04gTUFDSElORVJZIENPUlAuCiswMEQwMDAgRkVSUkFOIFNDSUVOVElGSUMsIElOQy4KKzAwRDAwMSBWU1QgVEVDSE5PTE9HSUVTLCBJTkMuCiswMEQwMDIgRElURUNIIENPUlBPUkFUSU9OCiswMEQwMDMgQ09NREEgRU5URVJQUklTRVMgQ09SUC4KKzAwRDAwNCBQRU5UQUNPTSBMVEQuCiswMEQwMDUgWkhTIFpFSVRNQU5BR0VNRU5UU1lTVEVNRQorMDBEMDA2IENJU0NPIFNZU1RFTVMsIElOQy4KKzAwRDAwNyBNSUMgQVNTT0NJQVRFUywgSU5DLgorMDBEMDA4IE1BQ1RFTEwgQ09SUE9SQVRJT04KKzAwRDAwOSBIU0lORyBURUNILiBFTlRFUlBSSVNFIENPLiBMVEQKKzAwRDAwQSBMQU5BQ0NFU1MgVEVMRUNPTSBTLkEuCiswMEQwMEIgUkhLIFRFQ0hOT0xPR1ksIElOQy4KKzAwRDAwQyBTTklKREVSIE1JQ1JPIFNZU1RFTVMKKzAwRDAwRCBNSUNST01FUklUSUNTIElOU1RSVU1FTlQKKzAwRDAwRSBQTFVSSVMsIElOQy4KKzAwRDAwRiBTUEVFQ0ggREVTSUdOIEdNQkgKKzAwRDAxMCBDT05WRVJHRU5UIE5FVFdPUktTLCBJTkMuCiswMEQwMTEgUFJJU00gVklERU8sIElOQy4KKzAwRDAxMiBHQVRFV09SS1MgQ09SUC4KKzAwRDAxMyBQUklNRVggQUVST1NQQUNFIENPTVBBTlkKKzAwRDAxNCBST09ULCBJTkMuCiswMEQwMTUgVU5JVkVYIE1JQ1JPVEVDSE5PTE9HWSBDT1JQLgorMDBEMDE2IFNDTSBNSUNST1NZU1RFTVMsIElOQy4KKzAwRDAxNyBTWU5URUNIIElORk9STUFUSU9OIENPLiwgTFRELgorMDBEMDE4IFFXRVMuIENPTSwgSU5DLgorMDBEMDE5IERBSU5JUFBPTiBTQ1JFRU4gQ09SUE9SQVRFCiswMEQwMUEgVVJNRVQgU1VEIFMuUC5BLgorMDBEMDFCIE1JTUFLSSBFTkdJTkVFUklORyBDTy4sIExURC4KKzAwRDAxQyBTQlMgVEVDSE5PTE9HSUVTLAorMDBEMDFEIEZVUlVOTyBFTEVDVFJJQyBDTy4sIExURC4KKzAwRDAxRSBQSU5HVEVMIENPUlAuCiswMEQwMUYgQ1RBTSBQVFkuIExURC4KKzAwRDAyMCBBSU0gU1lTVEVNLCBJTkMuCiswMEQwMjEgUkVHRU5UIEVMRUNUUk9OSUNTIENPUlAuCiswMEQwMjIgSU5DUkVESUJMRSBURUNITk9MT0dJRVMsIElOQy4KKzAwRDAyMyBJTkZPUlRSRU5EIFRFQ0hOT0xPR1ksIElOQy4KKzAwRDAyNCBDb2duZXggQ29ycG9yYXRpb24KKzAwRDAyNSBYUk9TU1RFQ0gsIElOQy4KKzAwRDAyNiBISVJTQ0hNQU5OIEFVU1RSSUEgR01CSAorMDBEMDI3IEFQUExJRUQgQVVUT01BVElPTiwgSU5DLgorMDBEMDI4IE9NTkVPTiBWSURFTyBORVRXT1JLUworMDBEMDI5IFdBS0VGRVJOIEZPT0QgQ09SUE9SQVRJT04KKzAwRDAyQSBWb3hlbnQgU3lzdGVtcyBMdGQuCiswMEQwMkIgSkVUQ0VMTCwgSU5DLgorMDBEMDJDIENBTVBCRUxMIFNDSUVOVElGSUMsIElOQy4KKzAwRDAyRCBBREVNQ08KKzAwRDAyRSBDT01NVU5JQ0FUSU9OIEFVVE9NQVRJT04gQ09SUC4KKzAwRDAyRiBWTFNJIFRFQ0hOT0xPR1kgSU5DLgorMDBEMDMwIFNBRkVUUkFOIFNZU1RFTVMgQ09SUC4KKzAwRDAzMSBJTkRVU1RSSUFMIExPR0lDIENPUlBPUkFUSU9OCiswMEQwMzIgWUFOTyBFTEVDVFJJQyBDTy4sIExURC4KKzAwRDAzMyBEQUxJQU4gREFYSUFOIE5FVFdPUksKKzAwRDAzNCBPUk1FQyBTWVNURU1TIENPUlAuCiswMEQwMzUgQkVIQVZJT1IgVEVDSC4gQ09NUFVURVIgQ09SUC4KKzAwRDAzNiBURUNITk9MT0dZIEFUTEFOVEEgQ09SUC4KKzAwRDAzNyBQSElMSVBTLURWUy1MTyBCRFIKKzAwRDAzOCBGSVZFTUVSRSwgTFRELgorMDBEMDM5IFVUSUxJQ09NLCBJTkMuCiswMEQwM0EgWk9ORVdPUlgsIElOQy4KKzAwRDAzQiBWSVNJT04gUFJPRFVDVFMgUFRZLiBMVEQuCiswMEQwM0MgVmllbywgSW5jLgorMDBEMDNEIEdBTElMRU8gVEVDSE5PTE9HWSwgTFRELgorMDBEMDNFIFJPQ0tFVENISVBTLCBJTkMuCiswMEQwM0YgQU1FUklDQU4gQ09NTVVOSUNBVElPTgorMDBEMDQwIFNZU01BVEUgQ08uLCBMVEQuCiswMEQwNDEgQU1JR08gVEVDSE5PTE9HWSBDTy4sIExURC4KKzAwRDA0MiBNQUhMTyBHTUJIICYgQ08uIFVHCiswMEQwNDMgWk9OQUwgUkVUQUlMIERBVEEgU1lTVEVNUworMDBEMDQ0IEFMSURJQU4gTkVUV09SS1MsIElOQy4KKzAwRDA0NSBLVkFTRVIgQUIKKzAwRDA0NiBET0xCWSBMQUJPUkFUT1JJRVMsIElOQy4KKzAwRDA0NyBYTiBURUNITk9MT0dJRVMKKzAwRDA0OCBFQ1RPTiwgSU5DLgorMDBEMDQ5IElNUFJFU1NURUsgQ08uLCBMVEQuCiswMEQwNEEgUFJFU0VOQ0UgVEVDSE5PTE9HWSBHTUJICiswMEQwNEIgTEEgQ0lFIEdST1VQIFMuQS4KKzAwRDA0QyBFVVJPVEVMIFRFTEVDT00gTFRELgorMDBEMDREIERJViBPRiBSRVNFQVJDSCAmIFNUQVRJU1RJQ1MKKzAwRDA0RSBMT0dJQkFHCiswMEQwNEYgQklUUk9OSUNTLCBJTkMuCiswMEQwNTAgSVNLUkFURUwKKzAwRDA1MSBPMiBNSUNSTywgSU5DLgorMDBEMDUyIEFTQ0VORCBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDBEMDUzIENPTk5FQ1RFRCBTWVNURU1TCiswMEQwNTQgU0FTIElOU1RJVFVURSBJTkMuCiswMEQwNTUgS0FUSFJFSU4tV0VSS0UgS0cKKzAwRDA1NiBTT01BVCBDT1JQT1JBVElPTgorMDBEMDU3IFVMVFJBSywgSU5DLgorMDBEMDU4IENJU0NPIFNZU1RFTVMsIElOQy4KKzAwRDA1OSBBTUJJVCBNSUNST1NZU1RFTVMgQ09SUC4KKzAwRDA1QSBTWU1CSU9OSUNTLCBMVEQuCiswMEQwNUIgQUNST0xPT1AgTU9USU9OIENPTlRST0wKKzAwRDA1QyBURUNITk9UUkVORCBTWVNURU1URUNITklLIEdNQkgKKzAwRDA1RCBJTlRFTExJV09SWFgsIElOQy4KKzAwRDA1RSBTVFJBVEFCRUFNIFRFQ0hOT0xPR1ksIElOQy4KKzAwRDA1RiBWQUxDT00sIElOQy4KKzAwRDA2MCBQQU5BU09OSUMgRVVST1BFQU4KKzAwRDA2MSBUUkVNT04gRU5URVJQUklTRVMgQ08uLCBMVEQuCiswMEQwNjIgRElHSUdSQU0KKzAwRDA2MyBDSVNDTyBTWVNURU1TLCBJTkMuCiswMEQwNjQgTVVMVElURUwKKzAwRDA2NSBUT0tPIEVMRUNUUklDCiswMEQwNjYgV0lOVFJJU1MgRU5HSU5FRVJJTkcgQ09SUC4KKzAwRDA2NyBDQU1QSU8gQ09NTVVOSUNBVElPTlMKKzAwRDA2OCBJV0lMTCBDT1JQT1JBVElPTgorMDBEMDY5IFRFQ0hOT0xPR0lDIFNZU1RFTVMKKzAwRDA2QSBMSU5LVVAgU1lTVEVNUyBDT1JQT1JBVElPTgorMDBEMDZCIFNSIFRFTEVDT00gSU5DLgorMDBEMDZDIFNIQVJFV0FWRSwgSU5DLgorMDBEMDZEIEFDUklTT04sIElOQy4KKzAwRDA2RSBUUkVORFZJRVcgUkVDT1JERVJTIExURC4KKzAwRDA2RiBLTUMgQ09OVFJPTFMKKzAwRDA3MCBMT05HIFdFTEwgRUxFQ1RST05JQ1MgQ09SUC4KKzAwRDA3MSBFQ0hFTE9OIENPUlAuCiswMEQwNzIgQlJPQURMT0dJQworMDBEMDczIEFDTiBBRFZBTkNFRCBDT01NVU5JQ0FUSU9OUworMDBEMDc0IFRBUVVBIFNZU1RFTVMsIElOQy4KKzAwRDA3NSBBTEFSSVMgTUVESUNBTCBTWVNURU1TLCBJTkMuCiswMEQwNzYgTUVSUklMTCBMWU5DSCAmIENPLiwgSU5DLgorMDBEMDc3IExVQ0VOVCBURUNITk9MT0dJRVMKKzAwRDA3OCBFTFRFWCBPRiBTV0VERU4gQUIKKzAwRDA3OSBDSVNDTyBTWVNURU1TLCBJTkMuCiswMEQwN0EgQU1BUVVFU1QgQ09NUFVURVIgQ09SUC4KKzAwRDA3QiBDT01DQU0gSU5URVJOQVRJT05BTCBMVEQuCiswMEQwN0MgS09ZTyBFTEVDVFJPTklDUyBJTkMuIENPLixMVEQuCiswMEQwN0QgQ09TSU5FIENPTU1VTklDQVRJT05TCiswMEQwN0UgS0VZQ09SUCBMVEQuCiswMEQwN0YgU1RSQVRFR1kgJiBURUNITk9MT0dZLCBMSU1JVEVECiswMEQwODAgRVhBQllURSBDT1JQT1JBVElPTgorMDBEMDgxIFJFQUwgVElNRSBERVZJQ0VTIFVTQSwgSU5DLgorMDBEMDgyIElPV0FWRSBJTkMuCiswMEQwODMgSU5WRVJURVgsIElOQy4KKzAwRDA4NCBORVhDT01NIFNZU1RFTVMsIElOQy4KKzAwRDA4NSBPVElTIEVMRVZBVE9SIENPTVBBTlkKKzAwRDA4NiBGT1ZFT04sIElOQy4KKzAwRDA4NyBNSUNST0ZJUlNUIElOQy4KKzAwRDA4OCBUZXJheW9uIENvbW11bmljYXRpb25zIFN5c3RlbXMKKzAwRDA4OSBEWU5BQ09MT1IsIElOQy4KKzAwRDA4QSBQSE9UUk9OIFVTQQorMDBEMDhCIEFEVkEgTGltaXRlZAorMDBEMDhDIEdFTk9BIFRFQ0hOT0xPR1ksIElOQy4KKzAwRDA4RCBQSE9FTklYIEdST1VQLCBJTkMuCiswMEQwOEUgTlZJU0lPTiBJTkMuCiswMEQwOEYgQVJERU5UIFRFQ0hOT0xPR0lFUywgSU5DLgorMDBEMDkwIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwRDA5MSBTTUFSVFNBTiBTWVNURU1TLCBJTkMuCiswMEQwOTIgR0xFTkFZUkUgV0VTVEVSTiBNVUxUSVBMRVgKKzAwRDA5MyBUUSAtIENPTVBPTkVOVFMgR01CSAorMDBEMDk0IFRJTUVMSU5FIFZJU1RBLCBJTkMuCiswMEQwOTUgWFlMQU4gQ09SUE9SQVRJT04KKzAwRDA5NiAzQ09NIEVVUk9QRSBMVEQuCiswMEQwOTcgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDBEMDk4IFBob3RvbiBEeW5hbWljcyBDYW5hZGEgSW5jLgorMDBEMDk5IEVMQ0FSRCBPWQorMDBEMDlBIEZJTEFORVQgQ09SUE9SQVRJT04KKzAwRDA5QiBTUEVDVEVMIExURC4KKzAwRDA5QyBLQVBBRElBIENPTU1VTklDQVRJT05TCiswMEQwOUQgVkVSSVMgSU5EVVNUUklFUworMDBEMDlFIDJXSVJFLCBJTkMuCiswMEQwOUYgTk9WVEVLIFRFU1QgU1lTVEVNUworMDBEMEEwIE1JUFMgREVOTUFSSworMDBEMEExIE9TS0FSIFZJRVJMSU5HIEdNQkggKyBDTy4gS0cKKzAwRDBBMiBJTlRFR1JBVEVEIERFVklDRQorMDBEMEEzIFZPQ0FMIERBVEEsIElOQy4KKzAwRDBBNCBBTEFOVFJPIENPTU1VTklDQVRJT05TCiswMEQwQTUgQU1FUklDQU4gQVJJVU0KKzAwRDBBNiBMQU5CSVJEIFRFQ0hOT0xPR1kgQ08uLCBMVEQuCiswMEQwQTcgVE9LWU8gU09LS0kgS0VOS1lVSk8gQ08uLCBMVEQuCiswMEQwQTggTkVUV09SSyBFTkdJTkVTLCBJTkMuCiswMEQwQTkgU0hJTkFOTyBLRU5TSEkgQ08uLCBMVEQuCiswMEQwQUEgQ0hBU0UgQ09NTVVOSUNBVElPTlMKKzAwRDBBQiBERUxUQUtBQkVMIFRFTEVDT00gQ1YKKzAwRDBBQyBHUkFZU09OIFdJUkVMRVNTCiswMEQwQUQgVEwgSU5EVVNUUklFUworMDBEMEFFIE9SRVNJUyBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDBEMEFGIENVVExFUi1IQU1NRVIsIElOQy4KKzAwRDBCMCBCSVRTV0lUQ0ggTFRELgorMDBEMEIxIE9NRUdBIEVMRUNUUk9OSUNTIFNBCiswMEQwQjIgWElPVEVDSCBDT1JQT1JBVElPTgorMDBEMEIzIERSUyBGTElHSFQgU0FGRVRZIEFORAorMDBEMEI0IEtBVFNVSklNQSBDTy4sIExURC4KKzAwRDBCNSBJUHJpY290IGZvcm1lcmx5IERvdENvbQorMDBEMEI2IENSRVNDRU5UIE5FVFdPUktTLCBJTkMuCiswMEQwQjcgSU5URUwgQ09SUE9SQVRJT04KKzAwRDBCOCBJT01FR0EgQ09SUC4KKzAwRDBCOSBNSUNST1RFSyBJTlRFUk5BVElPTkFMLCBJTkMuCiswMEQwQkEgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDBEMEJCIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwRDBCQyBDSVNDTyBTWVNURU1TLCBJTkMuCiswMEQwQkQgU0lDQU4gR01CSAorMDBEMEJFIEVNVVRFQyBJTkMuCiswMEQwQkYgUElWT1RBTCBURUNITk9MT0dJRVMKKzAwRDBDMCBDSVNDTyBTWVNURU1TLCBJTkMuCiswMEQwQzEgSEFSTU9OSUMgREFUQSBTWVNURU1TLCBMVEQuCiswMEQwQzIgQkFMVEhBWkFSIFRFQ0hOT0xPR1kgQUIKKzAwRDBDMyBWSVZJRCBURUNITk9MT0dZIFBURSwgTFRELgorMDBEMEM0IFRFUkFURUNIIENPUlBPUkFUSU9OCiswMEQwQzUgQ09NUFVUQVRJT05BTCBTWVNURU1TLCBJTkMuCiswMEQwQzYgVEhPTUFTICYgQkVUVFMgQ09SUC4KKzAwRDBDNyBQQVRIV0FZLCBJTkMuCiswMEQwQzggSS9PIENPTlNVTFRJTkcgQS9TCiswMEQwQzkgQURWQU5URUNIIENPLiwgTFRELgorMDBEMENBIElOVFJJTlNZQyBTT0ZUV0FSRSBJTkMuCiswMEQwQ0IgREFTQU4gQ08uLCBMVEQuCiswMEQwQ0MgVEVDSE5PTE9HSUVTIExZUkUgSU5DLgorMDBEMENEIEFUQU4gVEVDSE5PTE9HWSBJTkMuCiswMEQwQ0UgQVNZU1QgRUxFQ1RST05JQworMDBEMENGIE1PUkVUT04gQkFZCiswMEQwRDAgWkhPTkdYSU5HIFRFTEVDT00gTFRELgorMDBEMEQxIFNJUk9DQ08gU1lTVEVNUywgSU5DLgorMDBEMEQyIEVQSUxPRyBDT1JQT1JBVElPTgorMDBEMEQzIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwRDBENCBWLUJJVFMsIElOQy4KKzAwRDBENSBHUlVORElHIEFHCiswMEQwRDYgQUVUSFJBIFRFTEVDT01VTklDQVpJT05JCiswMEQwRDcgQjJDMiwgSU5DLgorMDBEMEQ4IDNDb20gQ29ycG9yYXRpb24KKzAwRDBEOSBERURJQ0FURUQgTUlDUk9DT01QVVRFUlMKKzAwRDBEQSBUQUlDT00gREFUQSBTWVNURU1TIENPLiwgTFRELgorMDBEMERCIE1DUVVBWSBJTlRFUk5BVElPTkFMCiswMEQwREMgTU9EVUxBUiBNSU5JTkcgU1lTVEVNUywgSU5DLgorMDBEMEREIFNVTlJJU0UgVEVMRUNPTSwgSU5DLgorMDBEMERFIFBISUxJUFMgTVVMVElNRURJQSBORVRXT1JLCiswMEQwREYgS1VaVU1JIEVMRUNUUk9OSUNTLCBJTkMuCiswMEQwRTAgRE9PSU4gRUxFQ1RST05JQ1MgQ08uCiswMEQwRTEgQVZJT05JVEVLIElTUkFFTCBJTkMuCiswMEQwRTIgTVJUIE1JQ1JPLCBJTkMuCiswMEQwRTMgRUxFLUNIRU0gRU5HSU5FRVJJTkcgQ08uLCBMVEQuCiswMEQwRTQgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDBEMEU1IFNPTElEVU0gU1lTVEVNUyBDT1JQLgorMDBEMEU2IElCT05EIElOQy4KKzAwRDBFNyBWQ09OIFRFTEVDT01NVU5JQ0FUSU9OIExURC4KKzAwRDBFOCBNQUMgU1lTVEVNIENPLiwgTFRELgorMDBEMEU5IEFEVkFOVEFHRSBDRU5UVVJZCiswMEQwRUEgTkVYVE9ORSBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDBEMEVCIExJR0hURVJBIE5FVFdPUktTLCBJTkMuCiswMEQwRUMgTkFLQVlPIFRFTEVDT01NVU5JQ0FUSU9OUywgSU5DCiswMEQwRUQgWElPWAorMDBEMEVFIERJQ1RBUEhPTkUgQ09SUE9SQVRJT04KKzAwRDBFRiBJR1QKKzAwRDBGMCBDT05WSVNJT04gVEVDSE5PTE9HWSBHTUJICiswMEQwRjEgU0VHQSBFTlRFUlBSSVNFUywgTFRELgorMDBEMEYyIE1PTlRFUkVZIE5FVFdPUktTCiswMEQwRjMgU09MQVJJIERJIFVESU5FIFNQQQorMDBEMEY0IENBUklOVEhJQU4gVEVDSCBJTlNUSVRVVEUKKzAwRDBGNSBPUkFOR0UgTUlDUk8sIElOQy4KKzAwRDBGNiBBbGNhdGVsIENhbmFkYQorMDBEMEY3IE5FWFQgTkVUUyBDT1JQT1JBVElPTgorMDBEMEY4IEZVSklBTiBTVEFSIFRFUk1JTkFMCiswMEQwRjkgQUNVVEUgQ09NTVVOSUNBVElPTlMgQ09SUC4KKzAwRDBGQSBSQUNBTCBHVUFSREFUQQorMDBEMEZCIFRFSyBNSUNST1NZU1RFTVMsIElOQ09SUE9SQVRFRAorMDBEMEZDIEdSQU5JVEUgTUlDUk9TWVNURU1TCiswMEQwRkQgT1BUSU1BIFRFTEUuQ09NLCBJTkMuCiswMEQwRkUgQVNUUkFMIFBPSU5UCiswMEQwRkYgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDBERDAwIFVOR0VSTUFOTi1CQVNTIElOQy4KKzAwREQwMSBVTkdFUk1BTk4tQkFTUyBJTkMuCiswMEREMDIgVU5HRVJNQU5OLUJBU1MgSU5DLgorMDBERDAzIFVOR0VSTUFOTi1CQVNTIElOQy4KKzAwREQwNCBVTkdFUk1BTk4tQkFTUyBJTkMuCiswMEREMDUgVU5HRVJNQU5OLUJBU1MgSU5DLgorMDBERDA2IFVOR0VSTUFOTi1CQVNTIElOQy4KKzAwREQwNyBVTkdFUk1BTk4tQkFTUyBJTkMuCiswMEREMDggVU5HRVJNQU5OLUJBU1MgSU5DLgorMDBERDA5IFVOR0VSTUFOTi1CQVNTIElOQy4KKzAwREQwQSBVTkdFUk1BTk4tQkFTUyBJTkMuCiswMEREMEIgVU5HRVJNQU5OLUJBU1MgSU5DLgorMDBERDBDIFVOR0VSTUFOTi1CQVNTIElOQy4KKzAwREQwRCBVTkdFUk1BTk4tQkFTUyBJTkMuCiswMEREMEUgVU5HRVJNQU5OLUJBU1MgSU5DLgorMDBERDBGIFVOR0VSTUFOTi1CQVNTIElOQy4KKzAwRTAwMCBGVUpJVFNVLCBMVEQKKzAwRTAwMSBTVFJBTkQgTElHSFRJTkcgTElNSVRFRAorMDBFMDAyIENST1NTUk9BRFMgU1lTVEVNUywgSU5DLgorMDBFMDAzIE5PS0lBIFdJUkVMRVNTIEJVU0lORVNTIENPTU1VTgorMDBFMDA0IFBNQy1TSUVSUkEsIElOQy4KKzAwRTAwNSBURUNITklDQUwgQ09SUC4KKzAwRTAwNiBTSUxJQ09OIElOVEVHUkFURUQgU1lTLiBDT1JQLgorMDBFMDA3IE5FVFdPUksgQUxDSEVNWSBMVEQuCiswMEUwMDggQU1BWklORyBDT05UUk9MUyEgSU5DLgorMDBFMDA5IE1BUkFUSE9OIFRFQ0hOT0xPR0lFUyBDT1JQLgorMDBFMDBBIERJQkEsIElOQy4KKzAwRTAwQiBST09GVE9QIENPTU1VTklDQVRJT05TIENPUlAuCiswMEUwMEMgTU9UT1JPTEEKKzAwRTAwRCBSQURJQU5UIFNZU1RFTVMKKzAwRTAwRSBBVkFMT04gSU1BR0lORyBTWVNURU1TLCBJTkMuCiswMEUwMEYgU0hBTkdIQUkgQkFVRCBEQVRBCiswMEUwMTAgSEVTUyBTQi1BVVRPTUFURU5CQVUgR21iSAorMDBFMDExIFVOSURFTiBTQU4gRElFR08gUiZEIENFTlRFUiwgSU5DLgorMDBFMDEyIFBMVVRPIFRFQ0hOT0xPR0lFUyBJTlRFUk5BVElPTkFMIElOQy4KKzAwRTAxMyBFQVNURVJOIEVMRUNUUk9OSUMgQ08uLCBMVEQuCiswMEUwMTQgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDBFMDE1IEhFSVdBIENPUlBPUkFUSU9OCiswMEUwMTYgUkFQSUQgQ0lUWSBDT01NVU5JQ0FUSU9OUworMDBFMDE3IEVYWEFDVCBHbWJICiswMEUwMTggQVNVU1RFSyBDT01QVVRFUiBJTkMuCiswMEUwMTkgSU5HLiBHSU9SREFOTyBFTEVUVFJPTklDQQorMDBFMDFBIENPTVRFQyBTWVNURU1TLiBDTy4sIExURC4KKzAwRTAxQiBTUEhFUkUgQ09NTVVOSUNBVElPTlMsIElOQy4KKzAwRTAxQyBNT0JJTElUWSBFTEVDVFJPTklDU1kKKzAwRTAxRCBXZWJUViBORVRXT1JLUywgSU5DLgorMDBFMDFFIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwRTAxRiBBVklESUEgU3lzdGVtcywgSW5jLgorMDBFMDIwIFRFQ05PTUVOIE9ZCiswMEUwMjEgRlJFRUdBVEUgQ09SUC4KKzAwRTAyMiBNZWRpYUxpZ2h0LCBJbmMuCiswMEUwMjMgVEVMUkFECiswMEUwMjQgR0FEWk9PWCBORVRXT1JLUworMDBFMDI1IGRpdCBDTy4sIExURC4KKzAwRTAyNiBFQVNUTUFOIEtPREFLIENPLgorMDBFMDI3IERVWCwgSU5DLgorMDBFMDI4IEFQVElYIENPUlBPUkFUSU9OCiswMEUwMjkgU1RBTkRBUkQgTUlDUk9TWVNURU1TIENPUlAuCiswMEUwMkEgVEFOREJFUkcgVEVMRVZJU0lPTiBBUworMDBFMDJCIEVYVFJFTUUgTkVUV09SS1MKKzAwRTAyQyBBU1QgQ09NUFVURVIKKzAwRTAyRCBJbm5vTWVkaWFMb2dpYywgSW5jLgorMDBFMDJFIFNQQyBFTEVDVFJPTklDUyBDT1JQT1JBVElPTgorMDBFMDJGIE1DTlMgSE9MRElOR1MsIEwuUC4KKzAwRTAzMCBNRUxJVEEgSU5URVJOQVRJT05BTCBDT1JQLgorMDBFMDMxIEhBR0lXQVJBIEVMRUNUUklDIENPLiwgTFRELgorMDBFMDMyIE1JU1lTIEZJTkFOQ0lBTCBTWVNURU1TLCBMVEQuCiswMEUwMzMgRS5FLlAuRC4gR21iSAorMDBFMDM0IENJU0NPIFNZU1RFTVMsIElOQy4KKzAwRTAzNSBMT1VHSEJPUk9VR0ggU09VTkQgSU1BR0VTLCBQTEMKKzAwRTAzNiBQSU9ORUVSIENPUlBPUkFUSU9OCiswMEUwMzcgQ0VOVFVSWSBDT1JQT1JBVElPTgorMDBFMDM4IFBST1hJTUEgQ09SUE9SQVRJT04KKzAwRTAzOSBQQVJBRFlORSBDT1JQLgorMDBFMDNBIENBQkxFVFJPTiBTWVNURU1TLCBJTkMuCiswMEUwM0IgUFJPTUlORVQgQ09SUE9SQVRJT04KKzAwRTAzQyBBZHZhblN5cworMDBFMDNEIEZPQ09OIEVMRUNUUk9OSUMgU1lTVEVNUyBBL1MKKzAwRTAzRSBBTEZBVEVDSCwgSU5DLgorMDBFMDNGIEpBVE9OIENPUlBPUkFUSU9OCiswMEUwNDAgRGVza1N0YXRpb24gVGVjaG5vbG9neSwgSW5jLgorMDBFMDQxIENTUEkKKzAwRTA0MiBQYWNvbSBTeXN0ZW1zIEx0ZC4KKzAwRTA0MyBWaXRhbENvbQorMDBFMDQ0IExTSUNTIENPUlBPUkFUSU9OCiswMEUwNDUgVE9VQ0hXQVZFLCBJTkMuCiswMEUwNDYgQkVOVExZIE5FVkFEQSBDT1JQLgorMDBFMDQ3IElORk9DVVMgU1lTVEVNUworMDBFMDQ4IFNETCBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDBFMDQ5IE1JQ1JPV0kgRUxFQ1RST05JQyBHbWJICiswMEUwNEEgRU5IQU5DRUQgTUVTU0FHSU5HIFNZU1RFTVMsIElOQworMDBFMDRCIEpVTVAgSU5EVVNUUklFTExFIENPTVBVVEVSVEVDSE5JSyBHbWJICiswMEUwNEMgUkVBTFRFSyBTRU1JQ09ORFVDVE9SIENPUlAuCiswMEUwNEQgSU5URVJORVQgSU5JVElBVElWRSBKQVBBTiwgSU5DCiswMEUwNEUgU0FOWU8gREVOS0kgQ08uLCBMVEQuCiswMEUwNEYgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDBFMDUwIEVYRUNVVE9ORSBJTkZPUk1BVElPTiBTWVNURU1TLCBJTkMuCiswMEUwNTEgVEFMWCBDT1JQT1JBVElPTgorMDBFMDUyIEZPVU5EUlkgTkVUV09SS1MsIElOQy4KKzAwRTA1MyBDRUxMUE9SVCBMQUJTLCBJTkMuCiswMEUwNTQgS09EQUkgSElURUMgQ08uLCBMVEQuCiswMEUwNTUgSU5HRU5JRVJJQSBFTEVDVFJPTklDQSBDT01FUkNJQUwgSU5FTENPTSBTLkEuCiswMEUwNTYgSE9MT05URUNIIENPUlBPUkFUSU9OCiswMEUwNTcgSEFOIE1JQ1JPVEVMRUNPTS4gQ08uLCBMVEQuCiswMEUwNTggUEhBU0UgT05FIERFTk1BUksgQS9TCiswMEUwNTkgQ09OVFJPTExFRCBFTlZJUk9OTUVOVFMsIExURC4KKzAwRTA1QSBHQUxFQSBORVRXT1JLIFNFQ1VSSVRZCiswMEUwNUIgV0VTVCBFTkQgU1lTVEVNUyBDT1JQLgorMDBFMDVDIE1BVFNVU0hJVEEgS09UT0JVS0kgRUxFQ1RST05JQ1MgSU5EVVNUUklFUywgTFRELgorMDBFMDVEIFVOSVRFQyBDTy4sIExURC4KKzAwRTA1RSBKQVBBTiBBVklBVElPTiBFTEVDVFJPTklDUyBJTkRVU1RSWSwgTFRELgorMDBFMDVGIGUtTmV0LCBJbmMuCiswMEUwNjAgU0hFUldPT0QKKzAwRTA2MSBFZGdlUG9pbnQgTmV0d29ya3MsIEluYy4KKzAwRTA2MiBIT1NUIEVOR0lORUVSSU5HCiswMEUwNjMgQ0FCTEVUUk9OIC0gWUFHTyBTWVNURU1TLCBJTkMuCiswMEUwNjQgU0FNU1VORyBFTEVDVFJPTklDUworMDBFMDY1IE9QVElDQUwgQUNDRVNTIElOVEVSTkFUSU9OQUwKKzAwRTA2NiBQcm9NYXggU3lzdGVtcywgSW5jLgorMDBFMDY3IGVhYyBBVVRPTUFUSU9OLUNPTlNVTFRJTkcgR21iSAorMDBFMDY4IE1FUlJJTUFDIFNZU1RFTVMgSU5DLgorMDBFMDY5IEpBWUNPUgorMDBFMDZBIEtBUFNDSCBBRworMDBFMDZCIFcmRyBTUEVDSUFMIFBST0RVQ1RTCiswMEUwNkMgQUVQIFN5c3RlbXMgSW50ZXJuYXRpb25hbCBMdGQKKzAwRTA2RCBDT01QVVdBUkUgQ09SUE9SQVRJT04KKzAwRTA2RSBGQVIgU1lTVEVNUyBTLnAuQS4KKzAwRTA2RiBUZXJheW9uIENvbW11bmljYXRpb25zIFN5c3RlbXMKKzAwRTA3MCBESCBURUNITk9MT0dZCiswMEUwNzEgRVBJUyBNSUNST0NPTVBVVEVSCiswMEUwNzIgTFlOSworMDBFMDczIE5BVElPTkFMIEFNVVNFTUVOVCBORVRXT1JLLCBJTkMuCiswMEUwNzQgVElFUk5BTiBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDBFMDc1IFZlcmlsaW5rIENvcnBvcmF0aW9uCiswMEUwNzYgREVWRUxPUE1FTlQgQ09OQ0VQVFMsIElOQy4KKzAwRTA3NyBXRUJHRUFSLCBJTkMuCiswMEUwNzggQkVSS0VMRVkgTkVUV09SS1MKKzAwRTA3OSBBLlQuTi5SLgorMDBFMDdBIE1JS1JPRElEQUtUIEFCCiswMEUwN0IgQkFZIE5FVFdPUktTCiswMEUwN0MgTUVUVExFUi1UT0xFRE8sIElOQy4KKzAwRTA3RCBORVRST05JWCwgSU5DLgorMDBFMDdFIFdBTFQgRElTTkVZIElNQUdJTkVFUklORworMDBFMDdGIExPR0lTVElTVEVNIHMuci5sLgorMDBFMDgwIENPTlRST0wgUkVTT1VSQ0VTIENPUlBPUkFUSU9OCiswMEUwODEgVFlBTiBDT01QVVRFUiBDT1JQLgorMDBFMDgyIEFORVJNQQorMDBFMDgzIEpBVE8gVEVDSE5PTE9HSUVTLCBJTkMuCiswMEUwODQgQ09NUFVMSVRFIFImRAorMDBFMDg1IEdMT0JBTCBNQUlOVEVDSCwgSU5DLgorMDBFMDg2IENZQkVYIENPTVBVVEVSIFBST0RVQ1RTCiswMEUwODcgTGVDcm95IC0gTmV0d29ya2luZyBQcm9kdWN0aW9ucyBEaXZpc2lvbgorMDBFMDg4IExUWCBDT1JQT1JBVElPTgorMDBFMDg5IElPTiBOZXR3b3JrcywgSW5jLgorMDBFMDhBIEdFQyBBVkVSWSwgTFRELgorMDBFMDhCIFFMb2dpYyBDb3JwLgorMDBFMDhDIE5FT1BBUkFESUdNIExBQlMsIElOQy4KKzAwRTA4RCBQUkVTU1VSRSBTWVNURU1TLCBJTkMuCiswMEUwOEUgVVRTVEFSQ09NCiswMEUwOEYgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDBFMDkwIEJFQ0tNQU4gTEFCLiBBVVRPTUFUSU9OIERJVi4KKzAwRTA5MSBMRyBFTEVDVFJPTklDUywgSU5DLgorMDBFMDkyIEFETVRFSyBJTkNPUlBPUkFURUQKKzAwRTA5MyBBQ0tGSU4gTkVUV09SS1MKKzAwRTA5NCBPU0FJIFNSTAorMDBFMDk1IEFEVkFOQ0VELVZJU0lPTiBURUNITk9MR0lFUyBDT1JQLgorMDBFMDk2IFNISU1BRFpVIENPUlBPUkFUSU9OCiswMEUwOTcgQ0FSUklFUiBBQ0NFU1MgQ09SUE9SQVRJT04KKzAwRTA5OCBBYm9Db20gU3lzdGVtcywgSW5jLgorMDBFMDk5IFNBTVNPTiBBRworMDBFMDlBIFBPU0lUUk9OIElORFVTVFJJRVMsIElOQy4KKzAwRTA5QiBFTkdBR0UgTkVUV09SS1MsIElOQy4KKzAwRTA5QyBNSUkKKzAwRTA5RCBTQVJOT0ZGIENPUlBPUkFUSU9OCiswMEUwOUUgUVVBTlRVTSBDT1JQT1JBVElPTgorMDBFMDlGIFBJWEVMIFZJU0lPTgorMDBFMEEwIFdJTFRST04gQ08uCiswMEUwQTEgSElNQSBQQVVMIEhJTERFQlJBTkRUIEdtYkggQ28uIEtHCiswMEUwQTIgTUlDUk9TTEFURSBJTkMuCiswMEUwQTMgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDBFMEE0IEVTQU9URSBTLnAuQS4KKzAwRTBBNSBDb21Db3JlIFNlbWljb25kdWN0b3IsIEluYy4KKzAwRTBBNiBURUxPR1kgTkVUV09SS1MsIElOQy4KKzAwRTBBNyBJUEMgSU5GT1JNQVRJT04gU1lTVEVNUywgSU5DLgorMDBFMEE4IFNBVCBHbWJIICYgQ28uCiswMEUwQTkgRlVOQUkgRUxFQ1RSSUMgQ08uLCBMVEQuCiswMEUwQUEgRUxFQ1RST1NPTklDIExURC4KKzAwRTBBQiBESU1BVCBTLkEuCiswMEUwQUMgTUlEU0NPLCBJTkMuCiswMEUwQUQgRUVTIFRFQ0hOT0xPR1ksIExURC4KKzAwRTBBRSBYQVFUSSBDT1JQT1JBVElPTgorMDBFMEFGIEdFTkVSQUwgRFlOQU1JQ1MgSU5GT1JNQVRJT04gU1lTVEVNUworMDBFMEIwIENJU0NPIFNZU1RFTVMsIElOQy4KKzAwRTBCMSBQQUNLRVQgRU5HSU5FUywgSU5DLgorMDBFMEIyIFRFTE1BWCBDT01NVU5JQ0FUSU9OUyBDT1JQLgorMDBFMEIzIEV0aGVyV0FOIFN5c3RlbXMsIEluYy4KKzAwRTBCNCBURUNITk8gU0NPUEUgQ08uLCBMVEQuCiswMEUwQjUgQVJERU5UIENPTU1VTklDQVRJT05TIENPUlAuCiswMEUwQjYgRW50cmFkYSBOZXR3b3JrcworMDBFMEI3IFBJIEdST1VQLCBMVEQuCiswMEUwQjggR0FURVdBWSAyMDAwCiswMEUwQjkgQllBUyBTWVNURU1TCiswMEUwQkEgQkVSR0hPRiBBVVRPTUFUSU9OU1RFQ0hOSUsgR21iSAorMDBFMEJCIE5CWCBDT1JQT1JBVElPTgorMDBFMEJDIFNZTU9OIENPTU1VTklDQVRJT05TLCBJTkMuCiswMEUwQkQgSU5URVJGQUNFIFNZU1RFTVMsIElOQy4KKzAwRTBCRSBHRU5ST0NPIElOVEVSTkFUSU9OQUwsIElOQy4KKzAwRTBCRiBUT1JSRU5UIE5FVFdPUktJTkcgVEVDSE5PTE9HSUVTIENPUlAuCiswMEUwQzAgU0VJV0EgRUxFQ1RSSUMgTUZHLiBDTy4sIExURC4KKzAwRTBDMSBNRU1PUkVYIFRFTEVYIEpBUEFOLCBMVEQuCiswMEUwQzIgTkVDU1kgUy5wLkEuCiswMEUwQzMgU0FLQUkgU1lTVEVNIERFVkVMT1BNRU5UIENPUlAuCiswMEUwQzQgSE9STkVSIEVMRUNUUklDLCBJTkMuCiswMEUwQzUgQkNPTSBFTEVDVFJPTklDUyBJTkMuCiswMEUwQzYgTElOSzJJVCwgTC5MLkMuCiswMEUwQzcgRVVST1RFQ0ggU1JMCiswMEUwQzggVklSVFVBTCBBQ0NFU1MsIExURC4KKzAwRTBDOSBBdXRvbWF0ZWRMb2dpYyBDb3Jwb3JhdGlvbgorMDBFMENBIEJFU1QgREFUQSBQUk9EVUNUUworMDBFMENCIFJFU09OLCBJTkMuCiswMEUwQ0MgSEVSTyBTWVNURU1TLCBMVEQuCiswMEUwQ0QgU0VOU0lTIENPUlBPUkFUSU9OCiswMEUwQ0UgQVJOCiswMEUwQ0YgSU5URUdSQVRFRCBERVZJQ0UgVEVDSE5PTE9HWSwgSU5DLgorMDBFMEQwIE5FVFNQRUVELCBJTkMuCiswMEUwRDEgVEVMU0lTIExJTUlURUQKKzAwRTBEMiBWRVJTQU5FVCBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDBFMEQzIERBVEVOVEVDSE5JSyBHbWJICiswMEUwRDQgRVhDRUxMRU5UIENPTVBVVEVSCiswMEUwRDUgQVJDWEVMIFRFQ0hOT0xPR0lFUywgSU5DLgorMDBFMEQ2IENPTVBVVEVSICYgQ09NTVVOSUNBVElPTiBSRVNFQVJDSCBMQUIuCiswMEUwRDcgU1VOU0hJTkUgRUxFQ1RST05JQ1MsIElOQy4KKzAwRTBEOCBMQU5CaXQgQ29tcHV0ZXIsIEluYy4KKzAwRTBEOSBUQVpNTyBDTy4sIExURC4KKzAwRTBEQSBBU1NVUkVEIEFDQ0VTUyBURUNITk9MT0dZLCBJTkMuCiswMEUwREIgVmlhVmlkZW8gQ29tbXVuaWNhdGlvbnMsIEluYy4KKzAwRTBEQyBORVhXQVJFIENPUlAuCiswMEUwREQgWkVOSVRIIEVMRUNUUk9OSUNTIENPUlBPUkFUSU9OCiswMEUwREUgREFUQVggTlYKKzAwRTBERiBLRSBLT01NVU5JS0FUSU9OUy1FTEVDVFJPTklLCiswMEUwRTAgU0kgRUxFQ1RST05JQ1MsIExURC4KKzAwRTBFMSBHMiBORVRXT1JLUywgSU5DLgorMDBFMEUyIElOTk9WQSBDT1JQLgorMDBFMEUzIFNLLUVMRUtUUk9OSUsgR21iSAorMDBFMEU0IEZBTlVDIFJPQk9USUNTIE5PUlRIIEFNRVJJQ0EsIEluYy4KKzAwRTBFNSBDSU5DTyBORVRXT1JLUywgSU5DLgorMDBFMEU2IElOQ0FBIERBVEFDT00gQi5WLgorMDBFMEU3IFJBWVRIRU9OIEUtU1lTVEVNUywgSU5DLgorMDBFMEU4IEdSRVRBQ09ERVIgRGF0YSBTeXN0ZW1zIEFHCiswMEUwRTkgREFUQSBMQUJTLCBJTkMuCiswMEUwRUEgSU5OT1ZBVCBDT01NVU5JQ0FUSU9OUywgSU5DLgorMDBFMEVCIERJR0lDT00gU1lTVEVNUywgSU5DT1JQT1JBVEVECiswMEUwRUMgQ0VMRVNUSUNBIElOQy4KKzAwRTBFRCBTSUxJQ09NLCBMVEQuCiswMEUwRUUgTUFSRUwgSEYKKzAwRTBFRiBESU9ORVgKKzAwRTBGMCBBQkxFUiBURUNITk9MT0dZLCBJTkMuCiswMEUwRjEgVEhBVCBDT1JQT1JBVElPTgorMDBFMEYyIEFSTE9UVE8gQ09NTkVULCBJTkMuCiswMEUwRjMgV2ViU3ByaW50IENvbW11bmljYXRpb25zLCBJbmMuCiswMEUwRjQgSU5TSURFIFRlY2hub2xvZ3kgQS9TCiswMEUwRjUgVEVMRVMgQUcKKzAwRTBGNiBERUNJU0lPTiBFVVJPUEUKKzAwRTBGNyBDSVNDTyBTWVNURU1TLCBJTkMuCiswMEUwRjggRElDTkEgQ09OVFJPTCBBQgorMDBFMEY5IENJU0NPIFNZU1RFTVMsIElOQy4KKzAwRTBGQSBUUkwgVEVDSE5PTE9HWSwgTFRELgorMDBFMEZCIExFSUdIVFJPTklYLCBJTkMuCiswMEUwRkMgSFVBV0VJIFRFQ0hOT0xPR0lFUyBDTy4sIExURC4KKzAwRTBGRCBBLVRSRU5EIFRFQ0hOT0xPR1kgQ08uLCBMVEQuCiswMEUwRkUgQ0lTQ08gU1lTVEVNUywgSU5DLgorMDBFMEZGIFNFQ1VSSVRZIERZTkFNSUNTIFRFQ0hOT0xPR0lFUywgSW5jLgorMDBFNkQzIE5JWERPUkYgQ09NUFVURVIgQ09SUC4KKzAyMDcwMSBSQUNBTC1EQVRBQ09NCiswMjFDN0MgUEVSUSBTWVNURU1TIENPUlBPUkFUSU9OCiswMjYwODYgTE9HSUMgUkVQTEFDRU1FTlQgVEVDSC4gTFRELgorMDI2MDhDIDNDT00gQ09SUE9SQVRJT04KKzAyNzAwMSBSQUNBTC1EQVRBQ09NCiswMjcwQjAgTS9BLUNPTSBJTkMuIENPTVBBTklFUworMDI3MEIzIERBVEEgUkVDQUxMIExURAorMDI5RDhFIENBUkRJQUMgUkVDT1JERVJTIElOQy4KKzAyQUEzQyBPTElWRVRUSSBURUxFQ09NTSBTUEEgKE9MVEVDTykKKzAyQkIwMSBPQ1RPVEhPUlBFIENPUlAuCiswMkMwOEMgM0NPTSBDT1JQT1JBVElPTgorMDJDRjFDIENPTU1VTklDQVRJT04gTUFDSElORVJZIENPUlAuCiswMkU2RDMgTklYRE9SRiBDT01QVVRFUiBDT1JQT1JBVElPTgorMDQwQUUwIFhNSVQgQUcgQ09NUFVURVIgTkVUV09SS1MKKzA0RTBDNCBUUklVTVBILUFETEVSIEFHCiswODAwMDEgQ09NUFVURVJWSVNJT04gQ09SUE9SQVRJT04KKzA4MDAwMiBCUklER0UgQ09NTVVOSUNBVElPTlMgSU5DLgorMDgwMDAzIEFEVkFOQ0VEIENPTVBVVEVSIENPTU0uCiswODAwMDQgQ1JPTUVNQ08gSU5DT1JQT1JBVEVECiswODAwMDUgU1lNQk9MSUNTIElOQy4KKzA4MDAwNiBTSUVNRU5TIEFHCiswODAwMDcgQVBQTEUgQ09NUFVURVIgSU5DLgorMDgwMDA4IEJPTFQgQkVSQU5FSyBBTkQgTkVXTUFOIElOQy4KKzA4MDAwOSBIRVdMRVRUIFBBQ0tBUkQKKzA4MDAwQSBORVNUQVIgU1lTVEVNUyBJTkNPUlBPUkFURUQKKzA4MDAwQiBVTklTWVMgQ09SUE9SQVRJT04KKzA4MDAwQyBNSUtMWU4gREVWRUxPUE1FTlQgQ08uCiswODAwMEQgSU5URVJOQVRJT05BTCBDT01QVVRFUlMgTFRELgorMDgwMDBFIE5DUiBDT1JQT1JBVElPTgorMDgwMDBGIE1JVEVMIENPUlBPUkFUSU9OCiswODAwMTEgVEVLVFJPTklYIElOQy4KKzA4MDAxMiBCRUxMIEFUTEFOVElDIElOVEVHUkFURUQgU1lTVC4KKzA4MDAxMyBFWFhPTgorMDgwMDE0IEVYQ0VMQU4KKzA4MDAxNSBTVEMgQlVTSU5FU1MgU1lTVEVNUworMDgwMDE2IEJBUlJJU1RFUiBJTkZPIFNZUyBDT1JQCiswODAwMTcgTkFUSU9OQUwgU0VNSUNPTkRVQ1RPUgorMDgwMDE4IFBJUkVMTEkgRk9DT00gTkVUV09SS1MKKzA4MDAxOSBHRU5FUkFMIEVMRUNUUklDIENPUlBPUkFUSU9OCiswODAwMUEgVElBUkEvIDEwTkVUCiswODAwMUIgREFUQSBHRU5FUkFMCiswODAwMUMgS0RELUtPS1VTQUkgREVCTlNJTiBERU5XQSBDTy4KKzA4MDAxRCBBQkxFIENPTU1VTklDQVRJT05TIElOQy4KKzA4MDAxRSBBUE9MTE8gQ09NUFVURVIgSU5DLgorMDgwMDFGIFNIQVJQIENPUlBPUkFUSU9OCiswODAwMjAgU1VOIE1JQ1JPU1lTVEVNUyBJTkMuCiswODAwMjEgM00gQ09NUEFOWQorMDgwMDIyIE5CSSBJTkMuCiswODAwMjMgUGFuYXNvbmljIENvbW11bmljYXRpb25zIENvLiwgTHRkLgorMDgwMDI0IDEwTkVUIENPTU1VTklDQVRJT05TL0RDQQorMDgwMDI1IENPTlRST0wgREFUQQorMDgwMDI2IE5PUlNLIERBVEEgQS5TLgorMDgwMDI3IENBRE1VUyBDT01QVVRFUiBTWVNURU1TCiswODAwMjggVGV4YXMgSW5zdHJ1bWVudHMKKzA4MDAyOSBNRUdBVEVLIENPUlBPUkFUSU9OCiswODAwMkEgTU9TQUlDIFRFQ0hOT0xPR0lFUyBJTkMuCiswODAwMkIgRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04KKzA4MDAyQyBCUklUVE9OIExFRSBJTkMuCiswODAwMkQgTEFOLVRFQyBJTkMuCiswODAwMkUgTUVUQVBIT1IgQ09NUFVURVIgU1lTVEVNUworMDgwMDJGIFBSSU1FIENPTVBVVEVSIElOQy4KKzA4MDAzMCBORVRXT1JLIFJFU0VBUkNIIENPUlBPUkFUSU9OCiswODAwMzAgQ0VSTgorMDgwMDMwIFJPWUFMIE1FTEJPVVJORSBJTlNUIE9GIFRFQ0gKKzA4MDAzMSBMSVRUTEUgTUFDSElORVMgSU5DLgorMDgwMDMyIFRJR0FOIElOQ09SUE9SQVRFRAorMDgwMDMzIEJBVVNDSCAmIExPTUIKKzA4MDAzNCBGSUxFTkVUIENPUlBPUkFUSU9OCiswODAwMzUgTUlDUk9GSVZFIENPUlBPUkFUSU9OCiswODAwMzYgSU5URVJHUkFQSCBDT1JQT1JBVElPTgorMDgwMDM3IEZVSkktWEVST1ggQ08uIExURC4KKzA4MDAzOCBDSUkgSE9ORVlXRUxMIEJVTEwKKzA4MDAzOSBTUElERVIgU1lTVEVNUyBMSU1JVEVECiswODAwM0EgT1JDQVRFQ0ggSU5DLgorMDgwMDNCIFRPUlVTIFNZU1RFTVMgTElNSVRFRAorMDgwMDNDIFNDSExVTUJFUkdFUiBXRUxMIFNFUlZJQ0VTCiswODAwM0QgQ0FETkVUSVggQ09SUE9SQVRJT05TCiswODAwM0UgQ09ERVggQ09SUE9SQVRJT04KKzA4MDAzRiBGUkVEIEtPU0NIQVJBIEVOVEVSUFJJU0VTCiswODAwNDAgRkVSUkFOVEkgQ09NUFVURVIgU1lTLiBMSU1JVEVECiswODAwNDEgUkFDQUwtTUlMR08gSU5GT1JNQVRJT04gU1lTLi4KKzA4MDA0MiBKQVBBTiBNQUNOSUNTIENPUlAuCiswODAwNDMgUElYRUwgQ09NUFVURVIgSU5DLgorMDgwMDQ0IERBVklEIFNZU1RFTVMgSU5DLgorMDgwMDQ1IENPTkNVUlJFTlQgQ09NUFVURVIgQ09SUC4KKzA4MDA0NiBTT05ZIENPUlBPUkFUSU9OIExURC4KKzA4MDA0NyBTRVFVRU5UIENPTVBVVEVSIFNZU1RFTVMgSU5DLgorMDgwMDQ4IEVVUk9USEVSTSBHQVVHSU5HIFNZU1RFTVMKKzA4MDA0OSBVTklWQVRJT04KKzA4MDA0QSBCQU5ZQU4gU1lTVEVNUyBJTkMuCiswODAwNEIgUExBTk5JTkcgUkVTRUFSQ0ggQ09SUC4KKzA4MDA0QyBIWURSQSBDT01QVVRFUiBTWVNURU1TIElOQy4KKzA4MDA0RCBDT1JWVVMgU1lTVEVNUyBJTkMuCiswODAwNEUgM0NPTSBFVVJPUEUgTFRELgorMDgwMDRGIENZR05FVCBTWVNURU1TCiswODAwNTAgREFJU1kgU1lTVEVNUyBDT1JQLgorMDgwMDUxIEVYUEVSREFUQQorMDgwMDUyIElOU1lTVEVDCiswODAwNTMgTUlERExFIEVBU1QgVEVDSC4gVU5JVkVSU0lUWQorMDgwMDU1IFNUQU5GT1JEIFRFTEVDT01NLiBJTkMuCiswODAwNTYgU1RBTkZPUkQgTElORUFSIEFDQ0VMLiBDRU5URVIKKzA4MDA1NyBFVkFOUyAmIFNVVEhFUkxBTkQKKzA4MDA1OCBTWVNURU1TIENPTkNFUFRTCiswODAwNTkgQS9TIE1ZQ1JPTgorMDgwMDVBIElCTSBDT1JQT1JBVElPTgorMDgwMDVCIFZUQSBURUNITk9MT0dJRVMgSU5DLgorMDgwMDVDIEZPVVIgUEhBU0UgU1lTVEVNUworMDgwMDVEIEdPVUxEIElOQy4KKzA4MDA1RSBDT1VOVEVSUE9JTlQgQ09NUFVURVIgSU5DLgorMDgwMDVGIFNBQkVSIFRFQ0hOT0xPR1kgQ09SUC4KKzA4MDA2MCBJTkRVU1RSSUFMIE5FVFdPUktJTkcgSU5DLgorMDgwMDYxIEpBUk9HQVRFIExURC4KKzA4MDA2MiBHRU5FUkFMIERZTkFNSUNTCiswODAwNjMgUExFU1NFWQorMDgwMDY0IEFVVE9QSE9OIEFHCiswODAwNjUgR0VOUkFEIElOQy4KKzA4MDA2NiBBR0ZBIENPUlBPUkFUSU9OCiswODAwNjcgQ09NREVTSUdOCiswODAwNjggUklER0UgQ09NUFVURVJTCiswODAwNjkgU0lMSUNPTiBHUkFQSElDUyBJTkMuCiswODAwNkEgQVRUIEJFTEwgTEFCT1JBVE9SSUVTCiswODAwNkIgQUNDRUwgVEVDSE5PTE9HSUVTIElOQy4KKzA4MDA2QyBTVU5URUsgVEVDSE5PTE9HWSBJTlQnTAorMDgwMDZEIFdISVRFQ0hBUEVMIENPTVBVVEVSIFdPUktTCiswODAwNkUgTUFTU0NPTVAKKzA4MDA2RiBQSElMSVBTIEFQRUxET09STiBCLlYuCiswODAwNzAgTUlUU1VCSVNISSBFTEVDVFJJQyBDT1JQLgorMDgwMDcxIE1BVFJBIChEU0lFKQorMDgwMDcyIFhFUk9YIENPUlAgVU5JViBHUkFOVCBQUk9HUkFNCiswODAwNzMgVEVDTUFSIElOQy4KKzA4MDA3NCBDQVNJTyBDT01QVVRFUiBDTy4gTFRELgorMDgwMDc1IERBTlNLIERBVEEgRUxFQ1RST05JSworMDgwMDc2IFBDIExBTiBURUNITk9MT0dJRVMKKzA4MDA3NyBUU0wgQ09NTVVOSUNBVElPTlMgTFRELgorMDgwMDc4IEFDQ0VMTCBDT1JQT1JBVElPTgorMDgwMDc5IFRIRSBEUk9JRCBXT1JLUworMDgwMDdBIElOREFUQQorMDgwMDdCIFNBTllPIEVMRUNUUklDIENPLiBMVEQuCiswODAwN0MgVklUQUxJTksgQ09NTVVOSUNBVElPTlMgQ09SUC4KKzA4MDA3RSBBTUFMR0FNQVRFRCBXSVJFTEVTUyhBVVMpIExURAorMDgwMDdGIENBUk5FR0lFLU1FTExPTiBVTklWRVJTSVRZCiswODAwODAgQUVTIERBVEEgSU5DLgorMDgwMDgxICxBU1RFQ0ggSU5DLgorMDgwMDgyIFZFUklUQVMgU09GVFdBUkUKKzA4MDA4MyBTZWlrbyBJbnN0cnVtZW50cyBJbmMuCiswODAwODQgVE9NRU4gRUxFQ1RST05JQ1MgQ09SUC4KKzA4MDA4NSBFTFhTSQorMDgwMDg2IEtPTklDQSBNSU5PTFRBIEhPTERJTkdTLCBJTkMuCiswODAwODcgWFlQTEVYCiswODAwODggTUNEQVRBIENPUlBPUkFUSU9OCiswODAwODkgS0lORVRJQ1MKKzA4MDA4QSBQRVJGT1JNQU5DRSBURUNITk9MT0dZCiswODAwOEIgUFlSQU1JRCBURUNITk9MT0dZIENPUlAuCiswODAwOEMgTkVUV09SSyBSRVNFQVJDSCBDT1JQT1JBVElPTgorMDgwMDhEIFhZVklTSU9OIElOQy4KKzA4MDA4RSBUQU5ERU0gQ09NUFVURVJTCiswODAwOEYgQ0hJUENPTSBDT1JQT1JBVElPTgorMDgwMDkwIFNPTk9NQSBTWVNURU1TCiswODE0NDMgVU5JQlJBSU4gUy5BLgorMDhCQkNDIEFLLU5PUkQgRURWIFZFUlRSSUVCU0dFUy4gbWJICisxMDAwNUEgSUJNIENPUlBPUkFUSU9OCisxMDAwRTggTkFUSU9OQUwgU0VNSUNPTkRVQ1RPUgorODAwMDEwIEFUVCBCRUxMIExBQk9SQVRPUklFUworQTA2QTAwIFZlcmlsaW5rIENvcnBvcmF0aW9uCitBQTAwMDAgRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04KK0FBMDAwMSBESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTgorQUEwMDAyIERJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OCitBQTAwMDMgRElHSVRBTCBFUVVJUE1FTlQgQ09SUE9SQVRJT04KK0FBMDAwNCBESUdJVEFMIEVRVUlQTUVOVCBDT1JQT1JBVElPTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9vdWkyYy5zaCBiL2RyaXZlcnMvaWVlZTEzOTQvb3VpMmMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwZGM3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvb3VpMmMuc2gKQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCisKK2NhdCA8PEVPRgorLyogR2VuZXJhdGVkIGZpbGUgZm9yIE9VSSBkYXRhYmFzZSAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfT1VJX0RCCitzdHJ1Y3Qgb3VpX2xpc3Rfc3RydWN0IHsKKwlpbnQgb3VpOworCWNoYXIgKm5hbWU7Cit9IG91aV9saXN0W10gPSB7CitFT0YKKword2hpbGUgcmVhZCBvdWkgbmFtZTsgZG8KKwllY2hvICIJeyAweCRvdWksIFwiJG5hbWVcIiB9LCIKK2RvbmUKKworY2F0IDw8RU9GCit9OworCisjZW5kaWYgLyogQ09ORklHX0lFRUUxMzk0X09VSV9EQiAqLworRU9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYyBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjFkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYwpAQCAtMCwwICsxLDE5ODIgQEAKKy8qCisgKiBwY2lseW54LmMgLSBUZXhhcyBJbnN0cnVtZW50cyBQQ0lMeW54IGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgQW5kcmVhcyBCb21iZSA8YW5kcmVhcy5ib21iZUBtdW5pY2gubmV0c3VyZi5kZT4sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBTdGVwaGFuIExpbnogPGxpbnpAbWF6ZXQuZGU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBNYW5mcmVkIFdlaWhzIDx3ZWloc0BpY3QudHV3aWVuLmFjLmF0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyoKKyAqIENvbnRyaWJ1dGlvbnM6CisgKgorICogTWFuZnJlZCBXZWlocyA8d2VpaHNAaWN0LnR1d2llbi5hYy5hdD4KKyAqICAgICAgICByZWFkaW5nIGJ1cyBpbmZvIGJsb2NrIChjb250YWluaW5nIEdVSUQpIGZyb20gc2VyaWFsCisgKiAgICAgICAgICAgIGVlcHJvbSB2aWEgaTJjIGFuZCBzdG9yaW5nIGl0IGluIGNvbmZpZyBST00KKyAqICAgICAgICBSZXdvcmtlZCBjb2RlIGZvciBpbml0aWF0aW5nIGJ1cyByZXNldHMKKyAqICAgICAgICAgICAgKGxvbmcsIHNob3J0LCB3aXRoIG9yIHdpdGhvdXQgaG9sZC1vZmYpCisgKiAgICAgICAgRW5oYW5jZW1lbnRzIGluIGFzeW5jIGFuZCBpc28gc2VuZCBjb2RlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAiY3NyMTIxMi5oIgorI2luY2x1ZGUgImllZWUxMzk0LmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfdHlwZXMuaCIKKyNpbmNsdWRlICJob3N0cy5oIgorI2luY2x1ZGUgImllZWUxMzk0X2NvcmUuaCIKKyNpbmNsdWRlICJoaWdobGV2ZWwuaCIKKyNpbmNsdWRlICJwY2lseW54LmgiCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKworLyogcHJpbnQgZ2VuZXJhbCAoY2FyZCBpbmRlcGVuZGVudCkgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFJJTlRfRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBwcmludGsobGV2ZWwgInBjaWx5bng6ICIgZm10ICJcbiIgLCAjIyBhcmdzKQorLyogcHJpbnQgY2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBQUklOVChsZXZlbCwgY2FyZCwgZm10LCBhcmdzLi4uKSBwcmludGsobGV2ZWwgInBjaWx5bnglZDogIiBmbXQgIlxuIiAsIGNhcmQgLCAjIyBhcmdzKQorCisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1ZFUkJPU0VERUJVRworI2RlZmluZSBQUklOVF9HRChsZXZlbCwgZm10LCBhcmdzLi4uKSBwcmludGsobGV2ZWwgInBjaWx5bng6ICIgZm10ICJcbiIgLCAjIyBhcmdzKQorI2RlZmluZSBQUklOVEQobGV2ZWwsIGNhcmQsIGZtdCwgYXJncy4uLikgcHJpbnRrKGxldmVsICJwY2lseW54JWQ6ICIgZm10ICJcbiIgLCBjYXJkICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFBSSU5UX0dEKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBQUklOVEQobGV2ZWwsIGNhcmQsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworCisvKiBNb2R1bGUgUGFyYW1ldGVycyAqLworc3RhdGljIGludCBza2lwX2VlcHJvbSA9IDA7Cittb2R1bGVfcGFyYW0oc2tpcF9lZXByb20sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHNraXBfZWVwcm9tLCAiVXNlIGdlbmVyaWMgYnVzIGluZm8gYmxvY2sgaW5zdGVhZCBvZiBzZXJpYWwgZWVwcm9tIChkZWZhdWx0ID0gMCkuIik7CisKKworc3RhdGljIHN0cnVjdCBocHNiX2hvc3RfZHJpdmVyIGx5bnhfZHJpdmVyOworc3RhdGljIHVuc2lnbmVkIGludCBjYXJkX2lkOworCisKKworLyoKKyAqIEkyQyBzdHVmZgorICovCisKKy8qIHRoZSBpMmMgc3R1ZmYgd2FzIGluc3BpcmVkIGJ5IGkyYy1waGlsaXBzLXBhci5jICovCisKK3N0YXRpYyB2b2lkIGJpdF9zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQoreworCWlmIChzdGF0ZSkgeworCQkgICgoc3RydWN0IHRpX2x5bnggKikgZGF0YSktPmkyY19kcml2ZW5fc3RhdGUgfD0gMHgwMDAwMDA0MDsKKwl9IGVsc2UgeworCQkgICgoc3RydWN0IHRpX2x5bnggKikgZGF0YSktPmkyY19kcml2ZW5fc3RhdGUgJj0gfjB4MDAwMDAwNDA7CisJfQorCXJlZ193cml0ZSgoc3RydWN0IHRpX2x5bnggKikgZGF0YSwgU0VSSUFMX0VFUFJPTV9DT05UUk9MLCAoKHN0cnVjdCB0aV9seW54ICopIGRhdGEpLT5pMmNfZHJpdmVuX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgYml0X3NldHNkYSh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJaWYgKHN0YXRlKSB7CisJCSAgKChzdHJ1Y3QgdGlfbHlueCAqKSBkYXRhKS0+aTJjX2RyaXZlbl9zdGF0ZSB8PSAweDAwMDAwMDEwOworCX0gZWxzZSB7CisJCSAgKChzdHJ1Y3QgdGlfbHlueCAqKSBkYXRhKS0+aTJjX2RyaXZlbl9zdGF0ZSAmPSB+MHgwMDAwMDAxMDsKKwl9CisJcmVnX3dyaXRlKChzdHJ1Y3QgdGlfbHlueCAqKSBkYXRhLCBTRVJJQUxfRUVQUk9NX0NPTlRST0wsICgoc3RydWN0IHRpX2x5bnggKikgZGF0YSktPmkyY19kcml2ZW5fc3RhdGUpOworfQorCitzdGF0aWMgaW50IGJpdF9nZXRzY2wodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gcmVnX3JlYWQoKHN0cnVjdCB0aV9seW54ICopIGRhdGEsIFNFUklBTF9FRVBST01fQ09OVFJPTCkgJiAweDAwMDAwMDQwOworfQorCitzdGF0aWMgaW50IGJpdF9nZXRzZGEodm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gcmVnX3JlYWQoKHN0cnVjdCB0aV9seW54ICopIGRhdGEsIFNFUklBTF9FRVBST01fQ09OVFJPTCkgJiAweDAwMDAwMDEwOworfQorCitzdGF0aWMgaW50IGJpdF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaXRfdW5yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSBiaXRfZGF0YSA9IHsKKwkuc2V0c2RhCQkJPSBiaXRfc2V0c2RhLAorCS5zZXRzY2wJCQk9IGJpdF9zZXRzY2wsCisJLmdldHNkYQkJCT0gYml0X2dldHNkYSwKKwkuZ2V0c2NsCQkJPSBiaXRfZ2V0c2NsLAorCS51ZGVsYXkJCQk9IDUsCisJLm1kZWxheQkJCT0gNSwKKwkudGltZW91dAkJPSAxMDAsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGJpdF9vcHMgPSB7CisJLmlkIAkJCT0gMHhBQSwgLy9GSVhNRTogcHJvYmFibHkgd2Ugc2hvdWxkIGdldCBhbiBpZCBpbiBpMmMtaWQuaAorCS5jbGllbnRfcmVnaXN0ZXIJPSBiaXRfcmVnLAorCS5jbGllbnRfdW5yZWdpc3Rlcgk9IGJpdF91bnJlZywKKwkubmFtZQkJCT0gIlBDSUx5bnggSTJDIiwKK307CisKKworCisvKgorICogUENMIGhhbmRsaW5nIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgcGNsX3QgYWxsb2NfcGNsKHN0cnVjdCB0aV9seW54ICpseW54KQoreworICAgICAgICB1OCBtOworICAgICAgICBpbnQgaSwgajsKKworICAgICAgICBzcGluX2xvY2soJmx5bngtPmxvY2spOworICAgICAgICAvKiBGSVhNRSAtIHVzZSBmZnooKSB0byBtYWtlIHRoaXMgcmVhZGFibGUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChMT0NBTFJBTV9TSVpFIC8gMTAyNCk7IGkrKykgeworICAgICAgICAgICAgICAgIG0gPSBseW54LT5wY2xfYm1hcFtpXTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmIDE8PGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtIHw9IDE8PGo7CisgICAgICAgICAgICAgICAgICAgICAgICBseW54LT5wY2xfYm1hcFtpXSA9IG07CisgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmbHlueC0+bG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOCAqIGkgKyBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9jaygmbHlueC0+bG9jayk7CisKKyAgICAgICAgcmV0dXJuIC0xOworfQorCisKKyNpZiAwCitzdGF0aWMgdm9pZCBmcmVlX3BjbChzdHJ1Y3QgdGlfbHlueCAqbHlueCwgcGNsX3QgcGNsaWQpCit7CisgICAgICAgIGludCBvZmYsIGJpdDsKKworICAgICAgICBvZmYgPSBwY2xpZCAvIDg7CisgICAgICAgIGJpdCA9IHBjbGlkICUgODsKKworICAgICAgICBpZiAocGNsaWQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3Bpbl9sb2NrKCZseW54LT5sb2NrKTsKKyAgICAgICAgaWYgKGx5bngtPnBjbF9ibWFwW29mZl0gJiAxPDxiaXQpIHsKKyAgICAgICAgICAgICAgICBseW54LT5wY2xfYm1hcFtvZmZdICY9IH4oMTw8Yml0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQUklOVChLRVJOX0VSUiwgbHlueC0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgImF0dGVtcHRlZCB0byBmcmVlIHVuYWxsb2NhdGVkIFBDTCAlZCIsIHBjbGlkKTsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9jaygmbHlueC0+bG9jayk7Cit9CisKKy8qIGZ1bmN0aW9ucyB1c2VmdWwgZm9yIGRlYnVnZ2luZyAqLworc3RhdGljIHZvaWQgcHJldHR5X3ByaW50X3BjbChjb25zdCBzdHJ1Y3QgdGlfcGNsICpwY2wpCit7CisgICAgICAgIGludCBpOworCisgICAgICAgIHByaW50aygiUENMIG5leHQgJTA4eCwgdXNlcmRhdGEgJTA4eCwgc3RhdHVzICUwOHgsIHJlbXRyYW5zICUwOHgsIG5leHRidWYgJTA4eFxuIiwKKyAgICAgICAgICAgICAgIHBjbC0+bmV4dCwgcGNsLT51c2VyX2RhdGEsIHBjbC0+cGNsX3N0YXR1cywKKyAgICAgICAgICAgICAgIHBjbC0+cmVtYWluaW5nX3RyYW5zZmVyX2NvdW50LCBwY2wtPm5leHRfZGF0YV9idWZmZXIpOworCisgICAgICAgIHByaW50aygiUENMIik7CisgICAgICAgIGZvciAoaT0wOyBpPDEzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIiBjJXg6JTA4eCBkJXg6JTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgIGksIHBjbC0+YnVmZmVyW2ldLmNvbnRyb2wsIGksIHBjbC0+YnVmZmVyW2ldLnBvaW50ZXIpOworICAgICAgICAgICAgICAgIGlmICghKGkgJiAweDMpICYmIChpICE9IDEyKSkgcHJpbnRrKCJcblBDTCIpOworICAgICAgICB9CisgICAgICAgIHByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcGNsKGNvbnN0IHN0cnVjdCB0aV9seW54ICpseW54LCBwY2xfdCBwY2xpZCkKK3sKKyAgICAgICAgc3RydWN0IHRpX3BjbCBwY2w7CisKKyAgICAgICAgZ2V0X3BjbChseW54LCBwY2xpZCwgJnBjbCk7CisgICAgICAgIHByZXR0eV9wcmludF9wY2woJnBjbCk7Cit9CisjZW5kaWYKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSUVFRS0xMzk0IGZ1bmN0aW9uYWxpdHkgc2VjdGlvbiAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIGludCBnZXRfcGh5X3JlZyhzdHJ1Y3QgdGlfbHlueCAqbHlueCwgaW50IGFkZHIpCit7CisgICAgICAgIGludCByZXR2YWw7CisgICAgICAgIGludCBpID0gMDsKKworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIGlmIChhZGRyID4gMTUpIHsKKyAgICAgICAgICAgICAgICBQUklOVChLRVJOX0VSUiwgbHlueC0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBQSFkgcmVnaXN0ZXIgYWRkcmVzcyAlZCBvdXQgb2YgcmFuZ2UiLAorCQkgICAgICBfX0ZVTkNUSU9OX18sIGFkZHIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZseW54LT5waHlfcmVnX2xvY2ssIGZsYWdzKTsKKworICAgICAgICByZWdfd3JpdGUobHlueCwgTElOS19QSFksIExJTktfUEhZX1JFQUQgfCBMSU5LX1BIWV9BRERSKGFkZHIpKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHJldHZhbCA9IHJlZ19yZWFkKGx5bngsIExJTktfUEhZKTsKKworICAgICAgICAgICAgICAgIGlmIChpID4gMTAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwgIiVzOiBydW5hd2F5IGxvb3AsIGFib3J0aW5nIiwKKwkJCSAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgIH0gd2hpbGUgKChyZXR2YWwgJiAweGYwMCkgIT0gTElOS19QSFlfUkFERFIoYWRkcikpOworCisgICAgICAgIHJlZ193cml0ZShseW54LCBMSU5LX0lOVF9TVEFUVVMsIExJTktfSU5UX1BIWV9SRUdfUkNWRCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx5bngtPnBoeV9yZWdfbG9jaywgZmxhZ3MpOworCisgICAgICAgIGlmIChyZXR2YWwgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsICYgMHhmZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBzZXRfcGh5X3JlZyhzdHJ1Y3QgdGlfbHlueCAqbHlueCwgaW50IGFkZHIsIGludCB2YWwpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAgICAgaWYgKGFkZHIgPiAxNSkgeworICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6IFBIWSByZWdpc3RlciBhZGRyZXNzICVkIG91dCBvZiByYW5nZSIsIF9fRlVOQ1RJT05fXywgYWRkcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbCA+IDB4ZmYpIHsKKyAgICAgICAgICAgICAgICBQUklOVChLRVJOX0VSUiwgbHlueC0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBQSFkgcmVnaXN0ZXIgdmFsdWUgJWQgb3V0IG9mIHJhbmdlIiwgX19GVU5DVElPTl9fLCB2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZseW54LT5waHlfcmVnX2xvY2ssIGZsYWdzKTsKKworICAgICAgICByZWdfd3JpdGUobHlueCwgTElOS19QSFksIExJTktfUEhZX1dSSVRFIHwgTElOS19QSFlfQUREUihhZGRyKQorICAgICAgICAgICAgICAgICAgfCBMSU5LX1BIWV9XREFUQSh2YWwpKTsKKworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZseW54LT5waHlfcmVnX2xvY2ssIGZsYWdzKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZWxfcGh5X3JlZ19wYWdlKHN0cnVjdCB0aV9seW54ICpseW54LCBpbnQgcGFnZSkKK3sKKyAgICAgICAgaW50IHJlZzsKKworICAgICAgICBpZiAocGFnZSA+IDcpIHsKKyAgICAgICAgICAgICAgICBQUklOVChLRVJOX0VSUiwgbHlueC0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBQSFkgcGFnZSAlZCBvdXQgb2YgcmFuZ2UiLCBfX0ZVTkNUSU9OX18sIHBhZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJlZyA9IGdldF9waHlfcmVnKGx5bngsIDcpOworICAgICAgICBpZiAocmVnICE9IC0xKSB7CisgICAgICAgICAgICAgICAgcmVnICY9IDB4MWY7CisgICAgICAgICAgICAgICAgcmVnIHw9IChwYWdlIDw8IDUpOworICAgICAgICAgICAgICAgIHNldF9waHlfcmVnKGx5bngsIDcsIHJlZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9Cit9CisKKyNpZiAwIC8qIG5vdCBuZWVkZWQgYXQgdGhpcyB0aW1lICovCitzdGF0aWMgaW50IHNlbF9waHlfcmVnX3BvcnQoc3RydWN0IHRpX2x5bnggKmx5bngsIGludCBwb3J0KQoreworICAgICAgICBpbnQgcmVnOworCisgICAgICAgIGlmIChwb3J0ID4gMTUpIHsKKyAgICAgICAgICAgICAgICBQUklOVChLRVJOX0VSUiwgbHlueC0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBQSFkgcG9ydCAlZCBvdXQgb2YgcmFuZ2UiLCBfX0ZVTkNUSU9OX18sIHBvcnQpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJlZyA9IGdldF9waHlfcmVnKGx5bngsIDcpOworICAgICAgICBpZiAocmVnICE9IC0xKSB7CisgICAgICAgICAgICAgICAgcmVnICY9IDB4ZjA7CisgICAgICAgICAgICAgICAgcmVnIHw9IHBvcnQ7CisgICAgICAgICAgICAgICAgc2V0X3BoeV9yZWcobHlueCwgNywgcmVnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdTMyIGdldF9waHlfdmVuZG9yaWQoc3RydWN0IHRpX2x5bnggKmx5bngpCit7CisgICAgICAgIHUzMiBwdmlkID0gMDsKKyAgICAgICAgc2VsX3BoeV9yZWdfcGFnZShseW54LCAxKTsKKyAgICAgICAgcHZpZCB8PSAoZ2V0X3BoeV9yZWcobHlueCwgMTApIDw8IDE2KTsKKyAgICAgICAgcHZpZCB8PSAoZ2V0X3BoeV9yZWcobHlueCwgMTEpIDw8IDgpOworICAgICAgICBwdmlkIHw9IGdldF9waHlfcmVnKGx5bngsIDEyKTsKKyAgICAgICAgUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwgIlBIWSB2ZW5kb3IgaWQgMHglMDZ4IiwgcHZpZCk7CisgICAgICAgIHJldHVybiBwdmlkOworfQorCitzdGF0aWMgdTMyIGdldF9waHlfcHJvZHVjdGlkKHN0cnVjdCB0aV9seW54ICpseW54KQoreworICAgICAgICB1MzIgaWQgPSAwOworICAgICAgICBzZWxfcGh5X3JlZ19wYWdlKGx5bngsIDEpOworICAgICAgICBpZCB8PSAoZ2V0X3BoeV9yZWcobHlueCwgMTMpIDw8IDE2KTsKKyAgICAgICAgaWQgfD0gKGdldF9waHlfcmVnKGx5bngsIDE0KSA8PCA4KTsKKyAgICAgICAgaWQgfD0gZ2V0X3BoeV9yZWcobHlueCwgMTUpOworICAgICAgICBQUklOVChLRVJOX0lORk8sIGx5bngtPmlkLCAiUEhZIHByb2R1Y3QgaWQgMHglMDZ4IiwgaWQpOworICAgICAgICByZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyBxdWFkbGV0X3QgZ2VuZXJhdGVfb3duX3NlbGZpZChzdHJ1Y3QgdGlfbHlueCAqbHlueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworICAgICAgICBxdWFkbGV0X3QgbHNpZDsKKyAgICAgICAgY2hhciBwaHlyZWdbN107CisgICAgICAgIGludCBpOworCisgICAgICAgIHBoeXJlZ1swXSA9IGx5bngtPnBoeV9yZWcwOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKSB7CisgICAgICAgICAgICAgICAgcGh5cmVnW2ldID0gZ2V0X3BoeV9yZWcobHlueCwgaSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGSVhNRT8gV2UgYXNzdW1lIGEgVFNCMjFMVjAzQSBwaHkgaGVyZS4gIFRoaXMgY29kZSBkb2Vzbid0IHN1cHBvcnQKKyAgICAgICAgICAgbW9yZSB0aGFuIDMgcG9ydHMgb24gdGhlIFBIWSBhbnl3YXkuICovCisKKyAgICAgICAgbHNpZCA9IDB4ODA0MDAwMDAgfCAoKHBoeXJlZ1swXSAmIDB4ZmMpIDw8IDIyKTsKKyAgICAgICAgbHNpZCB8PSAocGh5cmVnWzFdICYgMHgzZikgPDwgMTY7IC8qIGdhcCBjb3VudCAqLworICAgICAgICBsc2lkIHw9IChwaHlyZWdbMl0gJiAweGMwKSA8PCA4OyAvKiBtYXggc3BlZWQgKi8KKwlpZiAoIWhwc2JfZGlzYWJsZV9pcm0pCisJCWxzaWQgfD0gKHBoeXJlZ1s2XSAmIDB4MDEpIDw8IDExOyAvKiBjb250ZW5kZXIgKHBoeSBkZXBlbmRlbnQpICovCisgICAgICAgIC8qIGxzaWQgfD0gMSA8PCAxMTsgKi8vKiBzZXQgY29udGVuZGVyIChoYWNrKSAqLworICAgICAgICBsc2lkIHw9IChwaHlyZWdbNl0gJiAweDEwKSA+PiAzOyAvKiBpbml0aWF0ZWQgcmVzZXQgKi8KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHBoeXJlZ1syXSAmIDB4Zik7IGkrKykgeyAvKiBwb3J0cyAqLworICAgICAgICAgICAgICAgIGlmIChwaHlyZWdbMyArIGldICYgMHg0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsc2lkIHw9ICgoKHBoeXJlZ1szICsgaV0gJiAweDgpIHwgMHgxMCkgPj4gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKDYgLSBpKjIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsc2lkIHw9IDEgPDwgKDYgLSBpKjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNwdV90b19iZTMycygmbHNpZCk7CisgICAgICAgIFBSSU5UKEtFUk5fREVCVUcsIGx5bngtPmlkLCAiZ2VuZXJhdGVkIG93biBzZWxmaWQgMHgleCIsIGxzaWQpOworICAgICAgICByZXR1cm4gbHNpZDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3NlbGZpZChzdHJ1Y3QgdGlfbHlueCAqbHlueCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKyAgICAgICAgcXVhZGxldF90ICpxID0gbHlueC0+cmN2X3BhZ2U7CisgICAgICAgIGludCBwaHlpZCwgaXNyb290LCBzaXplOworICAgICAgICBxdWFkbGV0X3QgbHNpZCA9IDA7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmIChseW54LT5waHlfcmVnMCA9PSAtMSB8fCBseW54LT5zZWxmaWRfc2l6ZSA9PSAtMSkgcmV0dXJuOworCisgICAgICAgIHNpemUgPSBseW54LT5zZWxmaWRfc2l6ZTsKKyAgICAgICAgcGh5aWQgPSBseW54LT5waHlfcmVnMDsKKworICAgICAgICBpID0gKHNpemUgPiAxNiA/IDE2IDogc2l6ZSkgLyA0IC0gMTsKKyAgICAgICAgd2hpbGUgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgIGNwdV90b19iZTMycygmcVtpXSk7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFseW54LT5waHlpYy5yZWdfMTM5NGEpIHsKKyAgICAgICAgICAgICAgICBsc2lkID0gZ2VuZXJhdGVfb3duX3NlbGZpZChseW54LCBob3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlzcm9vdCA9IChwaHlpZCAmIDIpICE9IDA7CisgICAgICAgIHBoeWlkID4+PSAyOworICAgICAgICBQUklOVChLRVJOX0lORk8sIGx5bngtPmlkLCAiU2VsZklEIHByb2Nlc3MgZmluaXNoZWQgKHBoeWlkICVkLCAlcykiLAorICAgICAgICAgICAgICBwaHlpZCwgKGlzcm9vdCA/ICJyb290IiA6ICJub3Qgcm9vdCIpKTsKKyAgICAgICAgcmVnX3dyaXRlKGx5bngsIExJTktfSUQsICgweGZmYzAgfCBwaHlpZCkgPDwgMTYpOworCisgICAgICAgIGlmICghbHlueC0+cGh5aWMucmVnXzEzOTRhICYmICFzaXplKSB7CisgICAgICAgICAgICAgICAgaHBzYl9zZWxmaWRfcmVjZWl2ZWQoaG9zdCwgbHNpZCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VsZmlkICpzaWQgPSAoc3RydWN0IHNlbGZpZCAqKXE7CisKKyAgICAgICAgICAgICAgICBpZiAoIWx5bngtPnBoeWljLnJlZ18xMzk0YSAmJiAhc2lkLT5leHRlbmRlZAorICAgICAgICAgICAgICAgICAgICAmJiAoc2lkLT5waHlfaWQgPT0gKHBoeWlkICsgMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBocHNiX3NlbGZpZF9yZWNlaXZlZChob3N0LCBsc2lkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocVswXSA9PSB+cVsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9ERUJVRywgbHlueC0+aWQsICJTZWxmSUQgcGFja2V0IDB4JXggcmN2ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwc2Jfc2VsZmlkX3JlY2VpdmVkKGhvc3QsIHFbMF0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX0lORk8sIGx5bngtPmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudCBzZWxmaWQgMHgleC8weCV4IiwgcVswXSwgcVsxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHEgKz0gMjsKKyAgICAgICAgICAgICAgICBzaXplIC09IDg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWx5bngtPnBoeWljLnJlZ18xMzk0YSAmJiBpc3Jvb3QgJiYgcGh5aWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGhwc2Jfc2VsZmlkX3JlY2VpdmVkKGhvc3QsIGxzaWQpOworICAgICAgICB9CisKKyAgICAgICAgaHBzYl9zZWxmaWRfY29tcGxldGUoaG9zdCwgcGh5aWQsIGlzcm9vdCk7CisKKyAgICAgICAgaWYgKGhvc3QtPmluX2J1c19yZXNldCkgcmV0dXJuOyAvKiBpbiBidXMgcmVzZXQgYWdhaW4gKi8KKworICAgICAgICBpZiAoaXNyb290KSByZWdfc2V0X2JpdHMobHlueCwgTElOS19DT05UUk9MLCBMSU5LX0NPTlRST0xfQ1lDTUFTVEVSKTsgLy9GSVhNRTogSSBkbyBub3QgdGhpbmssIHdlIG5lZWQgdGhpcyBoZXJlCisgICAgICAgIHJlZ19zZXRfYml0cyhseW54LCBMSU5LX0NPTlRST0wsCisgICAgICAgICAgICAgICAgICAgICBMSU5LX0NPTlRST0xfUkNWX0NNUF9WQUxJRCB8IExJTktfQ09OVFJPTF9UWF9BU1lOQ19FTgorICAgICAgICAgICAgICAgICAgICAgfCBMSU5LX0NPTlRST0xfUlhfQVNZTkNfRU4gfCBMSU5LX0NPTlRST0xfQ1lDVElNRVJFTik7Cit9CisKKworCisvKiBUaGlzIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHJlc3BlY3RpdmUgcXVldWVfbG9jayBoZWxkLiAqLworc3RhdGljIHZvaWQgc2VuZF9uZXh0KHN0cnVjdCB0aV9seW54ICpseW54LCBpbnQgd2hhdCkKK3sKKyAgICAgICAgc3RydWN0IHRpX3BjbCBwY2w7CisgICAgICAgIHN0cnVjdCBseW54X3NlbmRfZGF0YSAqZDsKKyAgICAgICAgc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CisKKyAgICAgICAgZCA9ICh3aGF0ID09IGhwc2JfaXNvID8gJmx5bngtPmlzb19zZW5kIDogJmx5bngtPmFzeW5jKTsKKyAgICAgICAgaWYgKCFsaXN0X2VtcHR5KCZkLT5wY2xfcXVldWUpKSB7CisgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9FUlIsIGx5bngtPmlkLCAidHJ5aW5nIHRvIHF1ZXVlIGEgbmV3IHBhY2tldCBpbiBub25lbXB0eSBmaWZvIik7CisgICAgICAgICAgICAgICAgQlVHKCk7CisgICAgICAgIH0KKworICAgICAgICBwYWNrZXQgPSBkcml2ZXJfcGFja2V0KGQtPnF1ZXVlLm5leHQpOworCWxpc3RfbW92ZV90YWlsKCZwYWNrZXQtPmRyaXZlcl9saXN0LCAmZC0+cGNsX3F1ZXVlKTsKKworICAgICAgICBkLT5oZWFkZXJfZG1hID0gcGNpX21hcF9zaW5nbGUobHlueC0+ZGV2LCBwYWNrZXQtPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC0+aGVhZGVyX3NpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworICAgICAgICBpZiAocGFja2V0LT5kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBkLT5kYXRhX2RtYSA9IHBjaV9tYXBfc2luZ2xlKGx5bngtPmRldiwgcGFja2V0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkLT5kYXRhX2RtYSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwY2wubmV4dCA9IFBDTF9ORVhUX0lOVkFMSUQ7CisgICAgICAgIHBjbC5hc3luY19lcnJvcl9uZXh0ID0gUENMX05FWFRfSU5WQUxJRDsKKyAgICAgICAgcGNsLnBjbF9zdGF0dXMgPSAwOworICAgICAgICBwY2wuYnVmZmVyWzBdLmNvbnRyb2wgPSBwYWNrZXQtPnNwZWVkX2NvZGUgPDwgMTQgfCBwYWNrZXQtPmhlYWRlcl9zaXplOworI2lmbmRlZiBfX0JJR19FTkRJQU4KKyAgICAgICAgcGNsLmJ1ZmZlclswXS5jb250cm9sIHw9IFBDTF9CSUdFTkRJQU47CisjZW5kaWYKKyAgICAgICAgcGNsLmJ1ZmZlclswXS5wb2ludGVyID0gZC0+aGVhZGVyX2RtYTsKKyAgICAgICAgcGNsLmJ1ZmZlclsxXS5jb250cm9sID0gUENMX0xBU1RfQlVGRiB8IHBhY2tldC0+ZGF0YV9zaXplOworICAgICAgICBwY2wuYnVmZmVyWzFdLnBvaW50ZXIgPSBkLT5kYXRhX2RtYTsKKworICAgICAgICBzd2l0Y2ggKHBhY2tldC0+dHlwZSkgeworICAgICAgICBjYXNlIGhwc2JfYXN5bmM6CisgICAgICAgICAgICAgICAgcGNsLmJ1ZmZlclswXS5jb250cm9sIHw9IFBDTF9DTURfWE1UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhwc2JfaXNvOgorICAgICAgICAgICAgICAgIHBjbC5idWZmZXJbMF0uY29udHJvbCB8PSBQQ0xfQ01EX1hNVCB8IFBDTF9JU09NT0RFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhwc2JfcmF3OgorICAgICAgICAgICAgICAgIHBjbC5idWZmZXJbMF0uY29udHJvbCB8PSBQQ0xfQ01EX1VORlhNVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHB1dF9wY2wobHlueCwgZC0+cGNsLCAmcGNsKTsKKyAgICAgICAgcnVuX3BjbChseW54LCBkLT5wY2xfc3RhcnQsIGQtPmNoYW5uZWwpOworfQorCisKKy8qIGNhbGxlZCBmcm9tIHN1YnN5c3RlbSBjb3JlICovCitzdGF0aWMgaW50IGx5bnhfdHJhbnNtaXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpCit7CisgICAgICAgIHN0cnVjdCB0aV9seW54ICpseW54ID0gaG9zdC0+aG9zdGRhdGE7CisgICAgICAgIHN0cnVjdCBseW54X3NlbmRfZGF0YSAqZDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBpZiAocGFja2V0LT5kYXRhX3NpemUgPj0gNDA5NikgeworICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwgInRyYW5zbWl0IHBhY2tldCBkYXRhIHRvbyBiaWcgKCVaZCkiLAorICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC0+ZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVPVkVSRkxPVzsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAocGFja2V0LT50eXBlKSB7CisgICAgICAgIGNhc2UgaHBzYl9hc3luYzoKKyAgICAgICAgY2FzZSBocHNiX3JhdzoKKyAgICAgICAgICAgICAgICBkID0gJmx5bngtPmFzeW5jOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhwc2JfaXNvOgorICAgICAgICAgICAgICAgIGQgPSAmbHlueC0+aXNvX3NlbmQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9FUlIsIGx5bngtPmlkLCAiaW52YWxpZCBwYWNrZXQgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT50eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYWNrZXQtPnRjb2RlID09IFRDT0RFX1dSSVRFUQorICAgICAgICAgICAgfHwgcGFja2V0LT50Y29kZSA9PSBUQ09ERV9SRUFEUV9SRVNQT05TRSkgeworICAgICAgICAgICAgICAgIGNwdV90b19iZTMycygmcGFja2V0LT5oZWFkZXJbM10pOworICAgICAgICB9CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmQtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+ZHJpdmVyX2xpc3QsICZkLT5xdWV1ZSk7CisJaWYgKGxpc3RfZW1wdHkoJmQtPnBjbF9xdWV1ZSkpCisgICAgICAgICAgICAgICAgc2VuZF9uZXh0KGx5bngsIHBhY2tldC0+dHlwZSk7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+cXVldWVfbG9jaywgZmxhZ3MpOworCisgICAgICAgIHJldHVybiAwOworfQorCisKKy8qIGNhbGxlZCBmcm9tIHN1YnN5c3RlbSBjb3JlICovCitzdGF0aWMgaW50IGx5bnhfZGV2Y3RsKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGVudW0gZGV2Y3RsX2NtZCBjbWQsIGludCBhcmcpCit7CisgICAgICAgIHN0cnVjdCB0aV9seW54ICpseW54ID0gaG9zdC0+aG9zdGRhdGE7CisgICAgICAgIGludCByZXR2YWwgPSAwOworICAgICAgICBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKKwlMSVNUX0hFQUQocGFja2V0X2xpc3QpOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwaHlfcmVnOworCisgICAgICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIGNhc2UgUkVTRVRfQlVTOgorICAgICAgICAgICAgICAgIGlmIChyZWdfcmVhZChseW54LCBMSU5LX0lOVF9TVEFUVVMpICYgTElOS19JTlRfUEhZX0JVU1JFU0VUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisJCXN3aXRjaCAoYXJnKSB7CisJCWNhc2UgU0hPUlRfUkVTRVQ6CisJCQlpZiAobHlueC0+cGh5aWMucmVnXzEzOTRhKSB7CisJCQkJcGh5X3JlZyA9IGdldF9waHlfcmVnKGx5bngsIDUpOworCQkJCWlmIChwaHlfcmVnID09IC0xKSB7CisJCQkJCVBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwgImNhbm5vdCByZXNldCBidXMsIGJlY2F1c2UgcmVhZCBwaHkgcmVnIGZhaWxlZCIpOworCQkJCQlyZXR2YWwgPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBoeV9yZWcgfD0gMHg0MDsKKworCQkJCVBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJyZXNldHRpbmcgYnVzIChzaG9ydCBidXMgcmVzZXQpIG9uIHJlcXVlc3QiKTsKKworCQkJCWx5bngtPnNlbGZpZF9zaXplID0gLTE7CisJCQkJbHlueC0+cGh5X3JlZzAgPSAtMTsKKwkJCQlzZXRfcGh5X3JlZyhseW54LCA1LCBwaHlfcmVnKTsgLyogc2V0IElTQlIgKi8KKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwgImNhbm5vdCBkbyBzaG9ydCBidXMgcmVzZXQsIGJlY2F1c2Ugb2Ygb2xkIHBoeSIpOworCQkJCS8qIGZhbGwgdGhyb3VnaCB0byBsb25nIGJ1cyByZXNldCAqLworCQkJfQorCQljYXNlIExPTkdfUkVTRVQ6CisJCQlwaHlfcmVnID0gZ2V0X3BoeV9yZWcobHlueCwgMSk7CisJCQlpZiAocGh5X3JlZyA9PSAtMSkgeworCQkJCVBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwgImNhbm5vdCByZXNldCBidXMsIGJlY2F1c2UgcmVhZCBwaHkgcmVnIGZhaWxlZCIpOworCQkJCXJldHZhbCA9IC0xOworCQkJCWJyZWFrOworCQkJfQorCQkJcGh5X3JlZyB8PSAweDQwOworCisJCQlQUklOVChLRVJOX0lORk8sIGx5bngtPmlkLCAicmVzZXR0aW5nIGJ1cyAobG9uZyBidXMgcmVzZXQpIG9uIHJlcXVlc3QiKTsKKworCQkJbHlueC0+c2VsZmlkX3NpemUgPSAtMTsKKwkJCWx5bngtPnBoeV9yZWcwID0gLTE7CisJCQlzZXRfcGh5X3JlZyhseW54LCAxLCBwaHlfcmVnKTsgLyogY2xlYXIgUkhCLCBzZXQgSUJSICovCisJCQlicmVhazsKKwkJY2FzZSBTSE9SVF9SRVNFVF9OT19GT1JDRV9ST09UOgorCQkJaWYgKGx5bngtPnBoeWljLnJlZ18xMzk0YSkgeworCQkJCXBoeV9yZWcgPSBnZXRfcGh5X3JlZyhseW54LCAxKTsKKwkJCQlpZiAocGh5X3JlZyA9PSAtMSkgeworCQkJCQlQUklOVChLRVJOX0VSUiwgbHlueC0+aWQsICJjYW5ub3QgcmVzZXQgYnVzLCBiZWNhdXNlIHJlYWQgcGh5IHJlZyBmYWlsZWQiKTsKKwkJCQkJcmV0dmFsID0gLTE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAocGh5X3JlZyAmIDB4ODApIHsKKwkJCQkJcGh5X3JlZyAmPSB+MHg4MDsKKwkJCQkJc2V0X3BoeV9yZWcobHlueCwgMSwgcGh5X3JlZyk7IC8qIGNsZWFyIFJIQiAqLworCQkJCX0KKworCQkJCXBoeV9yZWcgPSBnZXRfcGh5X3JlZyhseW54LCA1KTsKKwkJCQlpZiAocGh5X3JlZyA9PSAtMSkgeworCQkJCQlQUklOVChLRVJOX0VSUiwgbHlueC0+aWQsICJjYW5ub3QgcmVzZXQgYnVzLCBiZWNhdXNlIHJlYWQgcGh5IHJlZyBmYWlsZWQiKTsKKwkJCQkJcmV0dmFsID0gLTE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwaHlfcmVnIHw9IDB4NDA7CisKKwkJCQlQUklOVChLRVJOX0lORk8sIGx5bngtPmlkLCAicmVzZXR0aW5nIGJ1cyAoc2hvcnQgYnVzIHJlc2V0LCBubyBmb3JjZV9yb290KSBvbiByZXF1ZXN0Iik7CisKKwkJCQlseW54LT5zZWxmaWRfc2l6ZSA9IC0xOworCQkJCWx5bngtPnBoeV9yZWcwID0gLTE7CisJCQkJc2V0X3BoeV9yZWcobHlueCwgNSwgcGh5X3JlZyk7IC8qIHNldCBJU0JSICovCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCVBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJjYW5ub3QgZG8gc2hvcnQgYnVzIHJlc2V0LCBiZWNhdXNlIG9mIG9sZCBwaHkiKTsKKwkJCQkvKiBmYWxsIHRocm91Z2ggdG8gbG9uZyBidXMgcmVzZXQgKi8KKwkJCX0KKwkJY2FzZSBMT05HX1JFU0VUX05PX0ZPUkNFX1JPT1Q6CisJCQlwaHlfcmVnID0gZ2V0X3BoeV9yZWcobHlueCwgMSk7CisJCQlpZiAocGh5X3JlZyA9PSAtMSkgeworCQkJCVBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwgImNhbm5vdCByZXNldCBidXMsIGJlY2F1c2UgcmVhZCBwaHkgcmVnIGZhaWxlZCIpOworCQkJCXJldHZhbCA9IC0xOworCQkJCWJyZWFrOworCQkJfQorCQkJcGh5X3JlZyAmPSB+MHg4MDsKKwkJCXBoeV9yZWcgfD0gMHg0MDsKKworCQkJUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwgInJlc2V0dGluZyBidXMgKGxvbmcgYnVzIHJlc2V0LCBubyBmb3JjZV9yb290KSBvbiByZXF1ZXN0Iik7CisKKwkJCWx5bngtPnNlbGZpZF9zaXplID0gLTE7CisJCQlseW54LT5waHlfcmVnMCA9IC0xOworCQkJc2V0X3BoeV9yZWcobHlueCwgMSwgcGh5X3JlZyk7IC8qIGNsZWFyIFJIQiwgc2V0IElCUiAqLworCQkJYnJlYWs7CisJCWNhc2UgU0hPUlRfUkVTRVRfRk9SQ0VfUk9PVDoKKwkJCWlmIChseW54LT5waHlpYy5yZWdfMTM5NGEpIHsKKwkJCQlwaHlfcmVnID0gZ2V0X3BoeV9yZWcobHlueCwgMSk7CisJCQkJaWYgKHBoeV9yZWcgPT0gLTEpIHsKKwkJCQkJUFJJTlQoS0VSTl9FUlIsIGx5bngtPmlkLCAiY2Fubm90IHJlc2V0IGJ1cywgYmVjYXVzZSByZWFkIHBoeSByZWcgZmFpbGVkIik7CisJCQkJCXJldHZhbCA9IC0xOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCEocGh5X3JlZyAmIDB4ODApKSB7CisJCQkJCXBoeV9yZWcgfD0gMHg4MDsKKwkJCQkJc2V0X3BoeV9yZWcobHlueCwgMSwgcGh5X3JlZyk7IC8qIHNldCBSSEIgKi8KKwkJCQl9CisKKwkJCQlwaHlfcmVnID0gZ2V0X3BoeV9yZWcobHlueCwgNSk7CisJCQkJaWYgKHBoeV9yZWcgPT0gLTEpIHsKKwkJCQkJUFJJTlQoS0VSTl9FUlIsIGx5bngtPmlkLCAiY2Fubm90IHJlc2V0IGJ1cywgYmVjYXVzZSByZWFkIHBoeSByZWcgZmFpbGVkIik7CisJCQkJCXJldHZhbCA9IC0xOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcGh5X3JlZyB8PSAweDQwOworCisJCQkJUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwgInJlc2V0dGluZyBidXMgKHNob3J0IGJ1cyByZXNldCwgZm9yY2Vfcm9vdCBzZXQpIG9uIHJlcXVlc3QiKTsKKworCQkJCWx5bngtPnNlbGZpZF9zaXplID0gLTE7CisJCQkJbHlueC0+cGh5X3JlZzAgPSAtMTsKKwkJCQlzZXRfcGh5X3JlZyhseW54LCA1LCBwaHlfcmVnKTsgLyogc2V0IElTQlIgKi8KKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwgImNhbm5vdCBkbyBzaG9ydCBidXMgcmVzZXQsIGJlY2F1c2Ugb2Ygb2xkIHBoeSIpOworCQkJCS8qIGZhbGwgdGhyb3VnaCB0byBsb25nIGJ1cyByZXNldCAqLworCQkJfQorCQljYXNlIExPTkdfUkVTRVRfRk9SQ0VfUk9PVDoKKwkJCXBoeV9yZWcgPSBnZXRfcGh5X3JlZyhseW54LCAxKTsKKwkJCWlmIChwaHlfcmVnID09IC0xKSB7CisJCQkJUFJJTlQoS0VSTl9FUlIsIGx5bngtPmlkLCAiY2Fubm90IHJlc2V0IGJ1cywgYmVjYXVzZSByZWFkIHBoeSByZWcgZmFpbGVkIik7CisJCQkJcmV0dmFsID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwaHlfcmVnIHw9IDB4YzA7CisKKwkJCVBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJyZXNldHRpbmcgYnVzIChsb25nIGJ1cyByZXNldCwgZm9yY2Vfcm9vdCBzZXQpIG9uIHJlcXVlc3QiKTsKKworCQkJbHlueC0+c2VsZmlkX3NpemUgPSAtMTsKKwkJCWx5bngtPnBoeV9yZWcwID0gLTE7CisJCQlzZXRfcGh5X3JlZyhseW54LCAxLCBwaHlfcmVnKTsgLyogc2V0IElCUiBhbmQgUkhCICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwgInVua25vd24gYXJndW1lbnQgZm9yIHJlc2V0X2J1cyBjb21tYW5kICVkIiwgYXJnKTsKKwkJCXJldHZhbCA9IC0xOworCQl9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9DWUNMRV9DT1VOVEVSOgorICAgICAgICAgICAgICAgIHJldHZhbCA9IHJlZ19yZWFkKGx5bngsIENZQ0xFX1RJTUVSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9DWUNMRV9DT1VOVEVSOgorICAgICAgICAgICAgICAgIHJlZ193cml0ZShseW54LCBDWUNMRV9USU1FUiwgYXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9CVVNfSUQ6CisgICAgICAgICAgICAgICAgcmVnX3dyaXRlKGx5bngsIExJTktfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChhcmcgPDwgMjIpIHwgKHJlZ19yZWFkKGx5bngsIExJTktfSUQpICYgMHgwMDNmMDAwMCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQUNUX0NZQ0xFX01BU1RFUjoKKyAgICAgICAgICAgICAgICBpZiAoYXJnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdfc2V0X2JpdHMobHlueCwgTElOS19DT05UUk9MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTktfQ09OVFJPTF9DWUNNQVNURVIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdfY2xlYXJfYml0cyhseW54LCBMSU5LX0NPTlRST0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5LX0NPTlRST0xfQ1lDTUFTVEVSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDQU5DRUxfUkVRVUVTVFM6CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmx5bngtPmFzeW5jLnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIHJlZ193cml0ZShseW54LCBETUFfQ0hBTl9DVFJMKENIQU5ORUxfQVNZTkNfU0VORCksIDApOworCQlsaXN0X3NwbGljZSgmbHlueC0+YXN5bmMucXVldWUsICZwYWNrZXRfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZseW54LT5hc3luYy5xdWV1ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobGlzdF9lbXB0eSgmbHlueC0+YXN5bmMucGNsX3F1ZXVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHlueC0+YXN5bmMucXVldWVfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlREKEtFUk5fREVCVUcsIGx5bngtPmlkLCAibm8gYXN5bmMgcGFja2V0IGluIFBDTCB0byBjYW5jZWwiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpX3BjbCBwY2w7CisgICAgICAgICAgICAgICAgICAgICAgICB1MzIgYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJjYW5jZWxsaW5nIGFzeW5jIHBhY2tldCwgdGhhdCB3YXMgYWxyZWFkeSBpbiBQQ0wiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3BjbChseW54LCBseW54LT5hc3luYy5wY2wsICZwY2wpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQgPSBkcml2ZXJfcGFja2V0KGx5bngtPmFzeW5jLnBjbF9xdWV1ZS5uZXh0KTsKKwkJCWxpc3RfZGVsX2luaXQoJnBhY2tldC0+ZHJpdmVyX2xpc3QpOworCisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfdW5tYXBfc2luZ2xlKGx5bngtPmRldiwgbHlueC0+YXN5bmMuaGVhZGVyX2RtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5oZWFkZXJfc2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFja2V0LT5kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3VubWFwX3NpbmdsZShseW54LT5kZXYsIGx5bngtPmFzeW5jLmRhdGFfZG1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC0+ZGF0YV9zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHlueC0+YXN5bmMucXVldWVfbG9jaywgZmxhZ3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGNsLnBjbF9zdGF0dXMgJiBETUFfQ0hBTl9TVEFUX1BLVENNUEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBjbC5wY2xfc3RhdHVzICYgRE1BX0NIQU5fU1RBVF9TUEVDSUFMQUNLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNrID0gKHBjbC5wY2xfc3RhdHVzID4+IDE1KSAmIDB4ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVEQoS0VSTl9JTkZPLCBseW54LT5pZCwgInNwZWNpYWwgYWNrICVkIiwgYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2sgPSAoYWNrID09IDEgPyBBQ0tYX1RJTUVPVVQgOiBBQ0tYX1NFTkRfRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjayA9IChwY2wucGNsX3N0YXR1cyA+PiAxNSkgJiAweGY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJhc3luYyBwYWNrZXQgd2FzIG5vdCBjb21wbGV0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNrID0gQUNLWF9BQk9SVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaHBzYl9wYWNrZXRfc2VudChob3N0LCBwYWNrZXQsIGFjayk7CisgICAgICAgICAgICAgICAgfQorCisJCXdoaWxlICghbGlzdF9lbXB0eSgmcGFja2V0X2xpc3QpKSB7CisJCQlwYWNrZXQgPSBkcml2ZXJfcGFja2V0KHBhY2tldF9saXN0Lm5leHQpOworCQkJbGlzdF9kZWxfaW5pdCgmcGFja2V0LT5kcml2ZXJfbGlzdCk7CisJCQlocHNiX3BhY2tldF9zZW50KGhvc3QsIHBhY2tldCwgQUNLWF9BQk9SVEVEKTsKKwkJfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJU09fTElTVEVOX0NIQU5ORUw6CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmx5bngtPmlzb19yY3YubG9jaywgZmxhZ3MpOworCisgICAgICAgICAgICAgICAgaWYgKGx5bngtPmlzb19yY3YuY2hhbl9jb3VudCsrID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ193cml0ZShseW54LCBETUFfV09SRDFfQ01QX0VOQUJMRShDSEFOTkVMX0lTT19SQ1YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9XT1JEMV9DTVBfRU5BQkxFX01BU1RFUik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHlueC0+aXNvX3Jjdi5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJU09fVU5MSVNURU5fQ0hBTk5FTDoKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHlueC0+aXNvX3Jjdi5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgICAgICAgICBpZiAoLS1seW54LT5pc29fcmN2LmNoYW5fY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVnX3dyaXRlKGx5bngsIERNQV9XT1JEMV9DTVBfRU5BQkxFKENIQU5ORUxfSVNPX1JDViksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHlueC0+aXNvX3Jjdi5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBQUklOVChLRVJOX0VSUiwgbHlueC0+aWQsICJ1bmtub3duIGRldmN0bCBjb21tYW5kICVkIiwgY21kKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXR2YWw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSUVFRS0xMzk0IGZ1bmN0aW9uYWxpdHkgc2VjdGlvbiBFTkQgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX1BPUlRTCisvKiBWRlMgZnVuY3Rpb25zIGZvciBsb2NhbCBidXMgLyBhdXggZGV2aWNlIGFjY2Vzcy4gIEFjY2VzcyB0byB0aG9zZQorICogaXMgaW1wbGVtZW50ZWQgYXMgYSBjaGFyYWN0ZXIgZGV2aWNlIGluc3RlYWQgb2YgYmxvY2sgZGV2aWNlcworICogYmVjYXVzZSBidWZmZXJzIGFyZSBub3Qgd2FudGVkIGZvciB0aGlzLiAgVGhlcmVmb3JlIGxsc2VlayAoZnJvbQorICogVkZTKSBjYW4gYmUgdXNlZCBmb3IgdGhlc2UgY2hhciBkZXZpY2VzIHdpdGggb2J2aW91cyBlZmZlY3RzLgorICovCitzdGF0aWMgaW50IG1lbV9vcGVuKHN0cnVjdCBpbm9kZSosIHN0cnVjdCBmaWxlKik7CitzdGF0aWMgaW50IG1lbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSosIHN0cnVjdCBmaWxlKik7CitzdGF0aWMgdW5zaWduZWQgaW50IGF1eF9wb2xsKHN0cnVjdCBmaWxlKiwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0Kik7CitzdGF0aWMgbG9mZl90IG1lbV9sbHNlZWsoc3RydWN0IGZpbGUqLCBsb2ZmX3QsIGludCk7CitzdGF0aWMgc3NpemVfdCBtZW1fcmVhZCAoc3RydWN0IGZpbGUqLCBjaGFyKiwgc2l6ZV90LCBsb2ZmX3QqKTsKK3N0YXRpYyBzc2l6ZV90IG1lbV93cml0ZShzdHJ1Y3QgZmlsZSosIGNvbnN0IGNoYXIqLCBzaXplX3QsIGxvZmZfdCopOworCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1eF9vcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisgICAgICAgIC5yZWFkID0gICAgICAgICBtZW1fcmVhZCwKKyAgICAgICAgLndyaXRlID0gICAgICAgIG1lbV93cml0ZSwKKyAgICAgICAgLnBvbGwgPSAgICAgICAgIGF1eF9wb2xsLAorICAgICAgICAubGxzZWVrID0gICAgICAgbWVtX2xsc2VlaywKKyAgICAgICAgLm9wZW4gPSAgICAgICAgIG1lbV9vcGVuLAorICAgICAgICAucmVsZWFzZSA9ICAgICAgbWVtX3JlbGVhc2UsCit9OworCisKK3N0YXRpYyB2b2lkIGF1eF9zZXR1cF9wY2xzKHN0cnVjdCB0aV9seW54ICpseW54KQoreworICAgICAgICBzdHJ1Y3QgdGlfcGNsIHBjbDsKKworICAgICAgICBwY2wubmV4dCA9IFBDTF9ORVhUX0lOVkFMSUQ7CisgICAgICAgIHBjbC51c2VyX2RhdGEgPSBwY2xfYnVzKGx5bngsIGx5bngtPmRtZW1fcGNsKTsKKyAgICAgICAgcHV0X3BjbChseW54LCBseW54LT5kbWVtX3BjbCwgJnBjbCk7Cit9CisKK3N0YXRpYyBpbnQgbWVtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgICAgIGludCBjaWQgPSBpbWlub3IoaW5vZGUpOworICAgICAgICBlbnVtIHsgdF9yb20sIHRfYXV4LCB0X3JhbSB9IHR5cGU7CisgICAgICAgIHN0cnVjdCBtZW1kYXRhICptZDsKKworICAgICAgICBpZiAoY2lkIDwgUENJTFlOWF9NSU5PUl9BVVhfU1RBUlQpIHsKKyAgICAgICAgICAgICAgICAvKiBqdXN0IGZvciBjb21wbGV0ZW5lc3MgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOworICAgICAgICB9IGVsc2UgaWYgKGNpZCA8IFBDSUxZTlhfTUlOT1JfUk9NX1NUQVJUKSB7CisgICAgICAgICAgICAgICAgY2lkIC09IFBDSUxZTlhfTUlOT1JfQVVYX1NUQVJUOworICAgICAgICAgICAgICAgIGlmIChjaWQgPj0gbnVtX29mX2NhcmRzIHx8ICFjYXJkc1tjaWRdLmF1eF9wb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKKyAgICAgICAgICAgICAgICB0eXBlID0gdF9hdXg7CisgICAgICAgIH0gZWxzZSBpZiAoY2lkIDwgUENJTFlOWF9NSU5PUl9SQU1fU1RBUlQpIHsKKyAgICAgICAgICAgICAgICBjaWQgLT0gUENJTFlOWF9NSU5PUl9ST01fU1RBUlQ7CisgICAgICAgICAgICAgICAgaWYgKGNpZCA+PSBudW1fb2ZfY2FyZHMgfHwgIWNhcmRzW2NpZF0ubG9jYWxfcm9tKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKKyAgICAgICAgICAgICAgICB0eXBlID0gdF9yb207CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogV0FSTklORzogS25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgd2hlbiBvcGVuaW5nIFJBTS4KKyAgICAgICAgICAgICAgICAgKiBJdCBpcyBjdXJyZW50bHkgdXNlZCBpbnNpZGUgdGhlIGRyaXZlciEgKi8KKyAgICAgICAgICAgICAgICBjaWQgLT0gUENJTFlOWF9NSU5PUl9SQU1fU1RBUlQ7CisgICAgICAgICAgICAgICAgaWYgKGNpZCA+PSBudW1fb2ZfY2FyZHMgfHwgIWNhcmRzW2NpZF0ubG9jYWxfcmFtKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKKyAgICAgICAgICAgICAgICB0eXBlID0gdF9yYW07CisgICAgICAgIH0KKworICAgICAgICBtZCA9IChzdHJ1Y3QgbWVtZGF0YSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZW1kYXRhKSwgU0xBQl9LRVJORUwpOworICAgICAgICBpZiAobWQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgICAgICBtZC0+bHlueCA9ICZjYXJkc1tjaWRdOworICAgICAgICBtZC0+Y2lkID0gY2lkOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIHRfcm9tOgorICAgICAgICAgICAgICAgIG1kLT50eXBlID0gcm9tOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfcmFtOgorICAgICAgICAgICAgICAgIG1kLT50eXBlID0gcmFtOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYXV4OgorICAgICAgICAgICAgICAgIGF0b21pY19zZXQoJm1kLT5hdXhfaW50cl9sYXN0X3NlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdG9taWNfcmVhZCgmY2FyZHNbY2lkXS5hdXhfaW50cl9zZWVuKSk7CisgICAgICAgICAgICAgICAgbWQtPnR5cGUgPSBhdXg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBtZDsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZW1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICAgICAga2ZyZWUoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXV4X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKnB0KQoreworICAgICAgICBzdHJ1Y3QgbWVtZGF0YSAqbWQgPSAoc3RydWN0IG1lbWRhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIGludCBjaWQgPSBtZC0+Y2lkOworICAgICAgICB1bnNpZ25lZCBpbnQgbWFzazsKKworICAgICAgICAvKiByZWFkaW5nIGFuZCB3cml0aW5nIGlzIGFsd2F5cyBhbGxvd2VkICovCisgICAgICAgIG1hc2sgPSBQT0xMSU4gfCBQT0xMUkROT1JNIHwgUE9MTE9VVCB8IFBPTExXUk5PUk07CisKKyAgICAgICAgaWYgKG1kLT50eXBlID09IGF1eCkgeworICAgICAgICAgICAgICAgIHBvbGxfd2FpdChmaWxlLCAmY2FyZHNbY2lkXS5hdXhfaW50cl93YWl0LCBwdCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYXRvbWljX3JlYWQoJm1kLT5hdXhfaW50cl9sYXN0X3NlZW4pCisgICAgICAgICAgICAgICAgICAgICE9IGF0b21pY19yZWFkKCZjYXJkc1tjaWRdLmF1eF9pbnRyX3NlZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IFBPTExQUkk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdG9taWNfaW5jKCZtZC0+YXV4X2ludHJfbGFzdF9zZWVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWFzazsKK30KKworbG9mZl90IG1lbV9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzLCBpbnQgb3JpZykKK3sKKyAgICAgICAgbG9mZl90IG5ld29mZnM7CisKKyAgICAgICAgc3dpdGNoIChvcmlnKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBuZXdvZmZzID0gb2ZmczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIG5ld29mZnMgPSBvZmZzICsgZmlsZS0+Zl9wb3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBuZXdvZmZzID0gUENJTFlOWF9NQVhfTUVNT1JZICsgMSArIG9mZnM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3b2ZmcyA8IDAgfHwgbmV3b2ZmcyA+IFBDSUxZTlhfTUFYX01FTU9SWSArIDEpIHJldHVybiAtRUlOVkFMOworCisgICAgICAgIGZpbGUtPmZfcG9zID0gbmV3b2ZmczsKKyAgICAgICAgcmV0dXJuIG5ld29mZnM7Cit9CisKKy8qCisgKiBkbyBub3QgRE1BIGlmIGNvdW50IGlzIHRvbyBzbWFsbCBiZWNhdXNlIHRoaXMgd2lsbCBoYXZlIGEgc2VyaW91cyBpbXBhY3QKKyAqIG9uIHBlcmZvcm1hbmNlIC0gdGhlIHZhbHVlIDI0MDAgd2FzIGZvdW5kIGJ5IGV4cGVyaW1lbnQgYW5kIG1heSBub3Qgd29yaworICogZXZlcnl3aGVyZSBhcyBnb29kIGFzIGhlcmUgLSB1c2UgbWVtX21pbmRtYSBvcHRpb24gZm9yIG1vZHVsZXMgdG8gY2hhbmdlCisgKi8KK3N0YXRpYyBzaG9ydCBtZW1fbWluZG1hID0gMjQwMDsKK21vZHVsZV9wYXJhbShtZW1fbWluZG1hLCBzaG9ydCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1lbV9taW5kbWEsICJNaW5pbXVtIGFtb3VudCBvZiBkYXRhIHJlcXVpcmVkIHRvIHVzZSBETUEiKTsKKworc3RhdGljIHNzaXplX3QgbWVtX2RtYXJlYWQoc3RydWN0IG1lbWRhdGEgKm1kLCB1MzIgcGh5c2J1Ziwgc3NpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQpCit7CisgICAgICAgIHBjbHRtcF90IHBjbHRtcDsKKyAgICAgICAgc3RydWN0IHRpX3BjbCAqcGNsOworICAgICAgICBzaXplX3QgcmV0dmFsOworICAgICAgICBpbnQgaTsKKyAgICAgICAgREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKyAgICAgICAgY291bnQgJj0gfjM7CisgICAgICAgIGNvdW50ID0gbWluKGNvdW50LCA1MzE5Nik7CisgICAgICAgIHJldHZhbCA9IGNvdW50OworCisgICAgICAgIGlmIChyZWdfcmVhZChtZC0+bHlueCwgRE1BX0NIQU5fQ1RSTChDSEFOTkVMX0xPQ0FMQlVTKSkKKyAgICAgICAgICAgICYgRE1BX0NIQU5fQ1RSTF9CVVNZKSB7CisgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9XQVJOSU5HLCBtZC0+bHlueC0+aWQsICJETUEgQUxSRUFEWSBBQ1RJVkUhIik7CisgICAgICAgIH0KKworICAgICAgICByZWdfd3JpdGUobWQtPmx5bngsIExCVVNfQUREUiwgbWQtPnR5cGUgfCBvZmZzZXQpOworCisgICAgICAgIHBjbCA9IGVkaXRfcGNsKG1kLT5seW54LCBtZC0+bHlueC0+ZG1lbV9wY2wsICZwY2x0bXApOworICAgICAgICBwY2wtPmJ1ZmZlclswXS5jb250cm9sID0gUENMX0NNRF9MQlVTX1RPX1BDSSB8IG1pbihjb3VudCwgNDA5Mik7CisgICAgICAgIHBjbC0+YnVmZmVyWzBdLnBvaW50ZXIgPSBwaHlzYnVmOworICAgICAgICBjb3VudCAtPSA0MDkyOworCisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHBjbC0+YnVmZmVyW2ldLmNvbnRyb2wgPSBtaW4oY291bnQsIDQwOTIpOworICAgICAgICAgICAgICAgIHBjbC0+YnVmZmVyW2ldLnBvaW50ZXIgPSBwaHlzYnVmICsgaSAqIDQwOTI7CisgICAgICAgICAgICAgICAgY291bnQgLT0gNDA5MjsKKyAgICAgICAgfQorICAgICAgICBwY2wtPmJ1ZmZlcltpXS5jb250cm9sIHw9IFBDTF9MQVNUX0JVRkY7CisgICAgICAgIGNvbW1pdF9wY2wobWQtPmx5bngsIG1kLT5seW54LT5kbWVtX3BjbCwgJnBjbHRtcCk7CisKKyAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJm1kLT5seW54LT5tZW1fZG1hX2ludHJfd2FpdCwgJndhaXQpOworICAgICAgICBydW5fc3ViX3BjbChtZC0+bHlueCwgbWQtPmx5bngtPmRtZW1fcGNsLCAyLCBDSEFOTkVMX0xPQ0FMQlVTKTsKKworICAgICAgICBzY2hlZHVsZSgpOworICAgICAgICB3aGlsZSAocmVnX3JlYWQobWQtPmx5bngsIERNQV9DSEFOX0NUUkwoQ0hBTk5FTF9MT0NBTEJVUykpCisgICAgICAgICAgICAgICAmIERNQV9DSEFOX0NUUkxfQlVTWSkgeworICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gLUVJTlRSOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNjaGVkdWxlKCk7CisgICAgICAgIH0KKworICAgICAgICByZWdfd3JpdGUobWQtPmx5bngsIERNQV9DSEFOX0NUUkwoQ0hBTk5FTF9MT0NBTEJVUyksIDApOworICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmbWQtPmx5bngtPm1lbV9kbWFfaW50cl93YWl0LCAmd2FpdCk7CisKKyAgICAgICAgaWYgKHJlZ19yZWFkKG1kLT5seW54LCBETUFfQ0hBTl9DVFJMKENIQU5ORUxfTE9DQUxCVVMpKQorICAgICAgICAgICAgJiBETUFfQ0hBTl9DVFJMX0JVU1kpIHsKKyAgICAgICAgICAgICAgICBQUklOVChLRVJOX0VSUiwgbWQtPmx5bngtPmlkLCAiRE1BIFNUSUxMIEFDVElWRSEiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1lbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqb2Zmc2V0KQoreworICAgICAgICBzdHJ1Y3QgbWVtZGF0YSAqbWQgPSAoc3RydWN0IG1lbWRhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHNzaXplX3QgYmNvdW50OworICAgICAgICBzaXplX3QgYWxpZ25maXg7CisJbG9mZl90IG9mZiA9ICpvZmZzZXQ7IC8qIGF2b2lkIHVzZWxlc3MgNjRiaXQtYXJpdGhtZXRpYyAqLworICAgICAgICBzc2l6ZV90IHJldHZhbDsKKyAgICAgICAgdm9pZCAqbWVtYmFzZTsKKworICAgICAgICBpZiAoKG9mZiArIGNvdW50KSA+IFBDSUxZTlhfTUFYX01FTU9SWSsxKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSBQQ0lMWU5YX01BWF9NRU1PUlkrMSAtIG9mZjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPT0gMCB8fCBvZmYgPiBQQ0lMWU5YX01BWF9NRU1PUlkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT1NQQzsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobWQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSByb206CisgICAgICAgICAgICAgICAgbWVtYmFzZSA9IG1kLT5seW54LT5sb2NhbF9yb207CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgcmFtOgorICAgICAgICAgICAgICAgIG1lbWJhc2UgPSBtZC0+bHlueC0+bG9jYWxfcmFtOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGF1eDoKKyAgICAgICAgICAgICAgICBtZW1iYXNlID0gbWQtPmx5bngtPmF1eF9wb3J0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHBhbmljKCJwY2lseW54JWQ6IHVuc3VwcG9ydGVkIG1kLT50eXBlICVkIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBtZC0+bHlueC0+aWQsIG1kLT50eXBlLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKKyAgICAgICAgZG93bigmbWQtPmx5bngtPm1lbV9kbWFfbXV0ZXgpOworCisgICAgICAgIGlmIChjb3VudCA8IG1lbV9taW5kbWEpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHlfZnJvbWlvKG1kLT5seW54LT5tZW1fZG1hX2J1ZmZlciwgbWVtYmFzZStvZmYsIGNvdW50KTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIGJjb3VudCA9IGNvdW50OworICAgICAgICBhbGlnbmZpeCA9IDQgLSAob2ZmICUgNCk7CisgICAgICAgIGlmIChhbGlnbmZpeCAhPSA0KSB7CisgICAgICAgICAgICAgICAgaWYgKGJjb3VudCA8IGFsaWduZml4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbmZpeCA9IGJjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5X2Zyb21pbyhtZC0+bHlueC0+bWVtX2RtYV9idWZmZXIsIG1lbWJhc2Urb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25maXgpOworICAgICAgICAgICAgICAgIGlmIChiY291bnQgPT0gYWxpZ25maXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiY291bnQgLT0gYWxpZ25maXg7CisgICAgICAgICAgICAgICAgb2ZmICs9IGFsaWduZml4OworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGJjb3VudCA+PSA0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gbWVtX2RtYXJlYWQobWQsIG1kLT5seW54LT5tZW1fZG1hX2J1ZmZlcl9kbWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvdW50IC0gYmNvdW50LCBiY291bnQsIG9mZik7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA8IDApIHJldHVybiByZXR2YWw7CisKKyAgICAgICAgICAgICAgICBiY291bnQgLT0gcmV0dmFsOworICAgICAgICAgICAgICAgIG9mZiArPSByZXR2YWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmNvdW50KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5X2Zyb21pbyhtZC0+bHlueC0+bWVtX2RtYV9idWZmZXIgKyBjb3VudCAtIGJjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJhc2Urb2ZmLCBiY291bnQpOworICAgICAgICB9CisKKyBvdXQ6CisgICAgICAgIHJldHZhbCA9IGNvcHlfdG9fdXNlcihidWZmZXIsIG1kLT5seW54LT5tZW1fZG1hX2J1ZmZlciwgY291bnQpOworICAgICAgICB1cCgmbWQtPmx5bngtPm1lbV9kbWFfbXV0ZXgpOworCisJaWYgKHJldHZhbCkgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICpvZmZzZXQgKz0gY291bnQ7CisgICAgICAgIHJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgc3NpemVfdCBtZW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqb2Zmc2V0KQoreworICAgICAgICBzdHJ1Y3QgbWVtZGF0YSAqbWQgPSAoc3RydWN0IG1lbWRhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKyAgICAgICAgaWYgKCgoKm9mZnNldCkgKyBjb3VudCkgPiBQQ0lMWU5YX01BWF9NRU1PUlkrMSkgeworICAgICAgICAgICAgICAgIGNvdW50ID0gUENJTFlOWF9NQVhfTUVNT1JZKzEgLSAqb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA9PSAwIHx8ICpvZmZzZXQgPiBQQ0lMWU5YX01BWF9NRU1PUlkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT1NQQzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZJWE1FOiBkZXJlZmVyZW5jaW5nIHBvaW50ZXJzIHRvIFBDSSBtZW0gZG9lc24ndCB3b3JrIGV2ZXJ5d2hlcmUgKi8KKyAgICAgICAgc3dpdGNoIChtZC0+dHlwZSkgeworICAgICAgICBjYXNlIGF1eDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKG1kLT5seW54LT5hdXhfcG9ydCsoKm9mZnNldCksIGJ1ZmZlciwgY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgcmFtOgorCQlpZiAoY29weV9mcm9tX3VzZXIobWQtPmx5bngtPmxvY2FsX3JhbSsoKm9mZnNldCksIGJ1ZmZlciwgY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugcm9tOgorICAgICAgICAgICAgICAgIC8qIHRoZSBST00gbWF5IGJlIHdyaXRlYWJsZSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIobWQtPmx5bngtPmxvY2FsX3JvbSsoKm9mZnNldCksIGJ1ZmZlciwgY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBmaWxlLT5mX3BvcyArPSBjb3VudDsKKyAgICAgICAgcmV0dXJuIGNvdW50OworfQorI2VuZGlmIC8qIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX1BPUlRTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHbG9iYWwgc3R1ZmYgKGludGVycnVwdCBoYW5kbGVyLCBpbml0L3NodXRkb3duIGNvZGUpICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgbHlueF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzX2FyZV91bnVzZWQpCit7CisgICAgICAgIHN0cnVjdCB0aV9seW54ICpseW54ID0gKHN0cnVjdCB0aV9seW54ICopZGV2X2lkOworICAgICAgICBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0gbHlueC0+aG9zdDsKKyAgICAgICAgdTMyIGludG1hc2s7CisgICAgICAgIHUzMiBsaW5raW50OworCisgICAgICAgIGxpbmtpbnQgPSByZWdfcmVhZChseW54LCBMSU5LX0lOVF9TVEFUVVMpOworICAgICAgICBpbnRtYXNrID0gcmVnX3JlYWQobHlueCwgUENJX0lOVF9TVEFUVVMpOworCisgICAgICAgIGlmICghKGludG1hc2sgJiBQQ0lfSU5UX0lOVF9QRU5EKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisgICAgICAgIFBSSU5URChLRVJOX0RFQlVHLCBseW54LT5pZCwgImludGVycnVwdDogMHglMDh4IC8gMHglMDh4IiwgaW50bWFzaywKKyAgICAgICAgICAgICAgIGxpbmtpbnQpOworCisgICAgICAgIHJlZ193cml0ZShseW54LCBMSU5LX0lOVF9TVEFUVVMsIGxpbmtpbnQpOworICAgICAgICByZWdfd3JpdGUobHlueCwgUENJX0lOVF9TVEFUVVMsIGludG1hc2spOworCisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMKKyAgICAgICAgaWYgKGludG1hc2sgJiBQQ0lfSU5UX0FVWF9JTlQpIHsKKyAgICAgICAgICAgICAgICBhdG9taWNfaW5jKCZseW54LT5hdXhfaW50cl9zZWVuKTsKKyAgICAgICAgICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmx5bngtPmF1eF9pbnRyX3dhaXQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGludG1hc2sgJiBQQ0lfSU5UX0RNQV9ITFQoQ0hBTk5FTF9MT0NBTEJVUykpIHsKKyAgICAgICAgICAgICAgICB3YWtlX3VwX2ludGVycnVwdGlibGUoJmx5bngtPm1lbV9kbWFfaW50cl93YWl0KTsKKyAgICAgICAgfQorI2VuZGlmCisKKworICAgICAgICBpZiAoaW50bWFzayAmIFBDSV9JTlRfMTM5NCkgeworICAgICAgICAgICAgICAgIGlmIChsaW5raW50ICYgTElOS19JTlRfUEhZX1RJTUVPVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJQSFkgdGltZW91dCBvY2N1cnJlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGlua2ludCAmIExJTktfSU5UX1BIWV9CVVNSRVNFVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwgImJ1cyByZXNldCBpbnRlcnJ1cHQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGx5bngtPnNlbGZpZF9zaXplID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBseW54LT5waHlfcmVnMCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFob3N0LT5pbl9idXNfcmVzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwc2JfYnVzX3Jlc2V0KGhvc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGlua2ludCAmIExJTktfSU5UX1BIWV9SRUdfUkNWRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdTMyIHJlZzsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCZseW54LT5waHlfcmVnX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gcmVnX3JlYWQobHlueCwgTElOS19QSFkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmx5bngtPnBoeV9yZWdfbG9jayk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaG9zdC0+aW5fYnVzX3Jlc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaHkgcmVnIHJlY2VpdmVkIHdpdGhvdXQgcmVzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVnICYgMHhmMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc29saWNpdGVkIHBoeSByZWcgJWQgcmVjZWl2ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVnID4+IDgpICYgMHhmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx5bngtPnBoeV9yZWcwID0gcmVnICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX3NlbGZpZChseW54LCBob3N0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpbmtpbnQgJiBMSU5LX0lOVF9JU09fU1RVQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJpc29jaHJvbm91cyB0cmFuc21pdHRlciBzdHVjayIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGlua2ludCAmIExJTktfSU5UX0FTWU5DX1NUVUNLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX0lORk8sIGx5bngtPmlkLCAiYXN5bmNocm9ub3VzIHRyYW5zbWl0dGVyIHN0dWNrIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaW5raW50ICYgTElOS19JTlRfU0VOVF9SRUpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJzZW50IHJlamVjdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGlua2ludCAmIExJTktfSU5UX1RYX0lOVkFMSURfVEMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJpbnZhbGlkIHRyYW5zYWN0aW9uIGNvZGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpbmtpbnQgJiBMSU5LX0lOVF9HUkZfT1ZFUkZMT1cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoIEZJRk8gaWYgb3ZlcmZsb3cgaGFwcGVucyBkdXJpbmcgcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3N0LT5pbl9idXNfcmVzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ193cml0ZShseW54LCBGSUZPX0NPTlRST0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUZPX0NPTlRST0xfR1JGX0ZMVVNIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJHUkYgb3ZlcmZsb3ciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpbmtpbnQgJiBMSU5LX0lOVF9JVEZfVU5ERVJGTE9XKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX0lORk8sIGx5bngtPmlkLCAiSVRGIHVuZGVyZmxvdyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGlua2ludCAmIExJTktfSU5UX0FURl9VTkRFUkZMT1cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJBVEYgdW5kZXJmbG93Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGludG1hc2sgJiBQQ0lfSU5UX0RNQV9ITFQoQ0hBTk5FTF9JU09fUkNWKSkgeworICAgICAgICAgICAgICAgIFBSSU5URChLRVJOX0RFQlVHLCBseW54LT5pZCwgImlzbyByZWNlaXZlIik7CisKKyAgICAgICAgICAgICAgICBzcGluX2xvY2soJmx5bngtPmlzb19yY3YubG9jayk7CisKKyAgICAgICAgICAgICAgICBseW54LT5pc29fcmN2LnN0YXRbbHlueC0+aXNvX3Jjdi5uZXh0XSA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWdfcmVhZChseW54LCBETUFfQ0hBTl9TVEFUKENIQU5ORUxfSVNPX1JDVikpOworCisgICAgICAgICAgICAgICAgbHlueC0+aXNvX3Jjdi51c2VkKys7CisgICAgICAgICAgICAgICAgbHlueC0+aXNvX3Jjdi5uZXh0ID0gKGx5bngtPmlzb19yY3YubmV4dCArIDEpICUgTlVNX0lTT1JDVl9QQ0w7CisKKyAgICAgICAgICAgICAgICBpZiAoKGx5bngtPmlzb19yY3YubmV4dCA9PSBseW54LT5pc29fcmN2Lmxhc3QpCisgICAgICAgICAgICAgICAgICAgIHx8ICFseW54LT5pc29fcmN2LmNoYW5fY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5URChLRVJOX0RFQlVHLCBseW54LT5pZCwgInN0b3BwZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ193cml0ZShseW54LCBETUFfV09SRDFfQ01QX0VOQUJMRShDSEFOTkVMX0lTT19SQ1YpLCAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBydW5fc3ViX3BjbChseW54LCBseW54LT5pc29fcmN2LnBjbF9zdGFydCwgbHlueC0+aXNvX3Jjdi5uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfSVNPX1JDVik7CisKKyAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmbHlueC0+aXNvX3Jjdi5sb2NrKTsKKworCQl0YXNrbGV0X3NjaGVkdWxlKCZseW54LT5pc29fcmN2LnRxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRtYXNrICYgUENJX0lOVF9ETUFfSExUKENIQU5ORUxfQVNZTkNfU0VORCkpIHsKKyAgICAgICAgICAgICAgICBQUklOVEQoS0VSTl9ERUJVRywgbHlueC0+aWQsICJhc3luYyBzZW50Iik7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCZseW54LT5hc3luYy5xdWV1ZV9sb2NrKTsKKworICAgICAgICAgICAgICAgIGlmIChsaXN0X2VtcHR5KCZseW54LT5hc3luYy5wY2xfcXVldWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmbHlueC0+YXN5bmMucXVldWVfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX1dBUk5JTkcsIGx5bngtPmlkLCAiYXN5bmMgZG1hIGhhbHRlZCwgYnV0IG5vIHF1ZXVlZCBwYWNrZXQgKG1heWJlIGl0IHdhcyBjYW5jZWxsZWQpIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aV9wY2wgcGNsOworICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGFjazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0OworCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcGNsKGx5bngsIGx5bngtPmFzeW5jLnBjbCwgJnBjbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldCA9IGRyaXZlcl9wYWNrZXQobHlueC0+YXN5bmMucGNsX3F1ZXVlLm5leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9kZWxfaW5pdCgmcGFja2V0LT5kcml2ZXJfbGlzdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV91bm1hcF9zaW5nbGUobHlueC0+ZGV2LCBseW54LT5hc3luYy5oZWFkZXJfZG1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmhlYWRlcl9zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrZXQtPmRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfdW5tYXBfc2luZ2xlKGx5bngtPmRldiwgbHlueC0+YXN5bmMuZGF0YV9kbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5kYXRhX3NpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3RfZW1wdHkoJmx5bngtPmFzeW5jLnF1ZXVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX25leHQobHlueCwgaHBzYl9hc3luYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZseW54LT5hc3luYy5xdWV1ZV9sb2NrKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBjbC5wY2xfc3RhdHVzICYgRE1BX0NIQU5fU1RBVF9QS1RDTVBMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwY2wucGNsX3N0YXR1cyAmIERNQV9DSEFOX1NUQVRfU1BFQ0lBTEFDSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjayA9IChwY2wucGNsX3N0YXR1cyA+PiAxNSkgJiAweGY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlREKEtFUk5fSU5GTywgbHlueC0+aWQsICJzcGVjaWFsIGFjayAlZCIsIGFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNrID0gKGFjayA9PSAxID8gQUNLWF9USU1FT1VUIDogQUNLWF9TRU5EX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2sgPSAocGNsLnBjbF9zdGF0dXMgPj4gMTUpICYgMHhmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX0lORk8sIGx5bngtPmlkLCAiYXN5bmMgcGFja2V0IHdhcyBub3QgY29tcGxldGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjayA9IEFDS1hfU0VORF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhwc2JfcGFja2V0X3NlbnQoaG9zdCwgcGFja2V0LCBhY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRtYXNrICYgUENJX0lOVF9ETUFfSExUKENIQU5ORUxfSVNPX1NFTkQpKSB7CisgICAgICAgICAgICAgICAgUFJJTlREKEtFUk5fREVCVUcsIGx5bngtPmlkLCAiaXNvIHNlbnQiKTsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2soJmx5bngtPmlzb19zZW5kLnF1ZXVlX2xvY2spOworCisgICAgICAgICAgICAgICAgaWYgKGxpc3RfZW1wdHkoJmx5bngtPmlzb19zZW5kLnBjbF9xdWV1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZseW54LT5pc29fc2VuZC5xdWV1ZV9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwgImlzbyBzZW5kIGRtYSBoYWx0ZWQsIGJ1dCBubyBxdWV1ZWQgcGFja2V0Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aV9wY2wgcGNsOworICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGFjazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0OworCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcGNsKGx5bngsIGx5bngtPmlzb19zZW5kLnBjbCwgJnBjbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldCA9IGRyaXZlcl9wYWNrZXQobHlueC0+aXNvX3NlbmQucGNsX3F1ZXVlLm5leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9kZWxfaW5pdCgmcGFja2V0LT5kcml2ZXJfbGlzdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV91bm1hcF9zaW5nbGUobHlueC0+ZGV2LCBseW54LT5pc29fc2VuZC5oZWFkZXJfZG1hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmhlYWRlcl9zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrZXQtPmRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfdW5tYXBfc2luZ2xlKGx5bngtPmRldiwgbHlueC0+aXNvX3NlbmQuZGF0YV9kbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5kYXRhX3NpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3RfZW1wdHkoJmx5bngtPmlzb19zZW5kLnF1ZXVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX25leHQobHlueCwgaHBzYl9pc28pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmbHlueC0+aXNvX3NlbmQucXVldWVfbG9jayk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwY2wucGNsX3N0YXR1cyAmIERNQV9DSEFOX1NUQVRfUEtUQ01QTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGNsLnBjbF9zdGF0dXMgJiBETUFfQ0hBTl9TVEFUX1NQRUNJQUxBQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2sgPSAocGNsLnBjbF9zdGF0dXMgPj4gMTUpICYgMHhmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5URChLRVJOX0lORk8sIGx5bngtPmlkLCAic3BlY2lhbCBhY2sgJWQiLCBhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjayA9IChhY2sgPT0gMSA/IEFDS1hfVElNRU9VVCA6IEFDS1hfU0VORF9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNrID0gKHBjbC5wY2xfc3RhdHVzID4+IDE1KSAmIDB4ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwgImlzbyBzZW5kIHBhY2tldCB3YXMgbm90IGNvbXBsZXRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2sgPSBBQ0tYX1NFTkRfRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGhwc2JfcGFja2V0X3NlbnQoaG9zdCwgcGFja2V0LCBhY2spOyAvL0ZJWE1FOiBtYXliZSB3ZSBzaG91bGQganVzdCB1c2UgQUNLX0NPTVBMRVRFIGFuZCBBQ0tYX1NFTkRfRVJST1IKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW50bWFzayAmIFBDSV9JTlRfRE1BX0hMVChDSEFOTkVMX0FTWU5DX1JDVikpIHsKKyAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIHJlY2VpdmUgRE1BIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgIGludCBzdGF0ID0gcmVnX3JlYWQobHlueCwgRE1BX0NIQU5fU1RBVChDSEFOTkVMX0FTWU5DX1JDVikpOworCisgICAgICAgICAgICAgICAgUFJJTlREKEtFUk5fREVCVUcsIGx5bngtPmlkLCAicmVjZWl2ZWQgcGFja2V0IHNpemUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0ICYgMHgxZmZmKTsKKworICAgICAgICAgICAgICAgIGlmIChzdGF0ICYgRE1BX0NIQU5fU1RBVF9TRUxGSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGx5bngtPnNlbGZpZF9zaXplID0gc3RhdCAmIDB4MWZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9zZWxmaWQobHlueCwgaG9zdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1YWRsZXRfdCAqcV9kYXRhID0gbHlueC0+cmN2X3BhZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCpxX2RhdGEgPj4gNCAmIDB4ZikgPT0gVENPREVfUkVBRFFfUkVTUE9OU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKnFfZGF0YSA+PiA0ICYgMHhmKSA9PSBUQ09ERV9XUklURVEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X3RvX2JlMzJzKHFfZGF0YSArIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaHBzYl9wYWNrZXRfcmVjZWl2ZWQoaG9zdCwgcV9kYXRhLCBzdGF0ICYgMHgxZmZmLCAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBydW5fcGNsKGx5bngsIGx5bngtPnJjdl9wY2xfc3RhcnQsIENIQU5ORUxfQVNZTkNfUkNWKTsKKyAgICAgICAgfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyB2b2lkIGlzb19yY3ZfYmgoc3RydWN0IHRpX2x5bnggKmx5bngpCit7CisgICAgICAgIHVuc2lnbmVkIGludCBpZHg7CisgICAgICAgIHF1YWRsZXRfdCAqZGF0YTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHlueC0+aXNvX3Jjdi5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgd2hpbGUgKGx5bngtPmlzb19yY3YudXNlZCkgeworICAgICAgICAgICAgICAgIGlkeCA9IGx5bngtPmlzb19yY3YubGFzdDsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZseW54LT5pc29fcmN2LmxvY2ssIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIGRhdGEgPSBseW54LT5pc29fcmN2LnBhZ2VbaWR4IC8gSVNPUkNWX1BFUl9QQUdFXQorICAgICAgICAgICAgICAgICAgICAgICAgKyAoaWR4ICUgSVNPUkNWX1BFUl9QQUdFKSAqIE1BWF9JU09SQ1ZfU0laRTsKKworICAgICAgICAgICAgICAgIGlmICgoKmRhdGEgPj4gMTYpICsgNCAhPSAobHlueC0+aXNvX3Jjdi5zdGF0W2lkeF0gJiAweDFmZmYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX0VSUiwgbHlueC0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNvIGxlbmd0aCBtaXNtYXRjaCAweCUwOHgvMHglMDh4IiwgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBseW54LT5pc29fcmN2LnN0YXRbaWR4XSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGx5bngtPmlzb19yY3Yuc3RhdFtpZHhdCisgICAgICAgICAgICAgICAgICAgICYgKERNQV9DSEFOX1NUQVRfUENJRVJSIHwgRE1BX0NIQU5fU1RBVF9QS1RFUlIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX0lORk8sIGx5bngtPmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzbyByZWNlaXZlIGVycm9yIG9uICVkIHRvIDB4JXAiLCBpZHgsIGRhdGEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBocHNiX3BhY2tldF9yZWNlaXZlZChseW54LT5ob3N0LCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlueC0+aXNvX3Jjdi5zdGF0W2lkeF0gJiAweDFmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHlueC0+aXNvX3Jjdi5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgbHlueC0+aXNvX3Jjdi5sYXN0ID0gKGlkeCArIDEpICUgTlVNX0lTT1JDVl9QQ0w7CisgICAgICAgICAgICAgICAgbHlueC0+aXNvX3Jjdi51c2VkLS07CisgICAgICAgIH0KKworICAgICAgICBpZiAobHlueC0+aXNvX3Jjdi5jaGFuX2NvdW50KSB7CisgICAgICAgICAgICAgICAgcmVnX3dyaXRlKGx5bngsIERNQV9XT1JEMV9DTVBfRU5BQkxFKENIQU5ORUxfSVNPX1JDViksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9XT1JEMV9DTVBfRU5BQkxFX01BU1RFUik7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHlueC0+aXNvX3Jjdi5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgcmVtb3ZlX2NhcmQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKyAgICAgICAgc3RydWN0IHRpX2x5bnggKmx5bng7CisJc3RydWN0IGRldmljZSAqbHlueF9kZXY7CisgICAgICAgIGludCBpOworCisgICAgICAgIGx5bnggPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKyAgICAgICAgaWYgKCFseW54KSByZXR1cm47CisgICAgICAgIHBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCisJbHlueF9kZXYgPSBnZXRfZGV2aWNlKCZseW54LT5ob3N0LT5kZXZpY2UpOworCisgICAgICAgIHN3aXRjaCAobHlueC0+c3RhdGUpIHsKKyAgICAgICAgY2FzZSBpc19ob3N0OgorICAgICAgICAgICAgICAgIHJlZ193cml0ZShseW54LCBQQ0lfSU5UX0VOQUJMRSwgMCk7CisgICAgICAgICAgICAgICAgaHBzYl9yZW1vdmVfaG9zdChseW54LT5ob3N0KTsKKyAgICAgICAgY2FzZSBoYXZlX2ludHI6CisgICAgICAgICAgICAgICAgcmVnX3dyaXRlKGx5bngsIFBDSV9JTlRfRU5BQkxFLCAwKTsKKyAgICAgICAgICAgICAgICBmcmVlX2lycShseW54LT5kZXYtPmlycSwgbHlueCk7CisKKwkJLyogRGlzYWJsZSBJUk0gQ29udGVuZGVyIGFuZCBMQ3RybCAqLworCQlpZiAobHlueC0+cGh5aWMucmVnXzEzOTRhKQorCQkJc2V0X3BoeV9yZWcobHlueCwgNCwgfjB4YzAgJiBnZXRfcGh5X3JlZyhseW54LCA0KSk7CisKKwkJLyogTGV0IGFsbCBvdGhlciBub2RlcyBrbm93IHRvIGlnbm9yZSB1cyAqLworCQlseW54X2RldmN0bChseW54LT5ob3N0LCBSRVNFVF9CVVMsIExPTkdfUkVTRVRfTk9fRk9SQ0VfUk9PVCk7CisKKyAgICAgICAgY2FzZSBoYXZlX2lvbWFwcGluZ3M6CisgICAgICAgICAgICAgICAgcmVnX3NldF9iaXRzKGx5bngsIE1JU0NfQ09OVFJPTCwgTUlTQ19DT05UUk9MX1NXUkVTRVQpOworICAgICAgICAgICAgICAgIC8qIEZpeCBidWdneSBjYXJkcyB3aXRoIGF1dG9ib290IHBpbiBub3QgdGllZCBsb3c6ICovCisgICAgICAgICAgICAgICAgcmVnX3dyaXRlKGx5bngsIERNQTBfQ0hBTl9DVFJMLCAwKTsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGx5bngtPnJlZ2lzdGVycyk7CisgICAgICAgICAgICAgICAgaW91bm1hcChseW54LT5sb2NhbF9yb20pOworICAgICAgICAgICAgICAgIGlvdW5tYXAobHlueC0+bG9jYWxfcmFtKTsKKyAgICAgICAgICAgICAgICBpb3VubWFwKGx5bngtPmF1eF9wb3J0KTsKKyAgICAgICAgY2FzZSBoYXZlXzEzOTRfYnVmZmVyczoKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSVNPUkNWX1BBR0VTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChseW54LT5pc29fcmN2LnBhZ2VbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChseW54LT5kZXYsIFBBR0VfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBseW54LT5pc29fcmN2LnBhZ2VbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlueC0+aXNvX3Jjdi5wYWdlX2RtYVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQobHlueC0+ZGV2LCBQQUdFX1NJWkUsIGx5bngtPnJjdl9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlueC0+cmN2X3BhZ2VfZG1hKTsKKyAgICAgICAgY2FzZSBoYXZlX2F1eF9idWY6CisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMKKyAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGx5bngtPmRldiwgNjU1MzYsIGx5bngtPm1lbV9kbWFfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlueC0+bWVtX2RtYV9idWZmZXJfZG1hKTsKKyNlbmRpZgorICAgICAgICBjYXNlIGhhdmVfcGNsX21lbToKKyNpZm5kZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfTE9DQUxSQU0KKyAgICAgICAgICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGx5bngtPmRldiwgTE9DQUxSQU1fU0laRSwgbHlueC0+cGNsX21lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx5bngtPnBjbF9tZW1fZG1hKTsKKyNlbmRpZgorICAgICAgICBjYXNlIGNsZWFyOgorICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgLSBhbHJlYWR5IGZyZWVkICovCisgICAgICAgICAgICAgICAgOworICAgICAgICB9CisKKwl0YXNrbGV0X2tpbGwoJmx5bngtPmlzb19yY3YudHEpOworCisJaWYgKGx5bnhfZGV2KQorCQlwdXRfZGV2aWNlKGx5bnhfZGV2KTsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGRfY2FyZChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmRldmlkX2lzX3VudXNlZCkKK3sKKyNkZWZpbmUgRkFJTChmbXQsIGFyZ3MuLi4pIGRvIHsgXAorICAgICAgICBQUklOVF9HKEtFUk5fRVJSLCBmbXQgLCAjIyBhcmdzKTsgXAorICAgICAgICByZW1vdmVfY2FyZChkZXYpOyBcCisgICAgICAgIHJldHVybiBlcnJvcjsgXAorICAgICAgICB9IHdoaWxlICgwKQorCisJY2hhciBpcnFfYnVmWzE2XTsKKwlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OworICAgICAgICBzdHJ1Y3QgdGlfbHlueCAqbHlueDsgLyogc2hvcnRjdXQgdG8gY3VycmVudGx5IGhhbmRsZWQgZGV2aWNlICovCisgICAgICAgIHN0cnVjdCB0aV9wY2wgcGNsOworICAgICAgICB1MzIgKnBjbGk7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgZXJyb3I7CisKKyAgICAgICAgZXJyb3IgPSAtRU5YSU87CisKKyAgICAgICAgaWYgKHBjaV9zZXRfZG1hX21hc2soZGV2LCAweGZmZmZmZmZmKSkKKyAgICAgICAgICAgICAgICBGQUlMKCJETUEgYWRkcmVzcyBsaW1pdHMgbm90IHN1cHBvcnRlZCBmb3IgUENJTHlueCBoYXJkd2FyZSIpOworICAgICAgICBpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKKyAgICAgICAgICAgICAgICBGQUlMKCJmYWlsZWQgdG8gZW5hYmxlIFBDSUx5bnggaGFyZHdhcmUiKTsKKyAgICAgICAgcGNpX3NldF9tYXN0ZXIoZGV2KTsKKworICAgICAgICBlcnJvciA9IC1FTk9NRU07CisKKwlob3N0ID0gaHBzYl9hbGxvY19ob3N0KCZseW54X2RyaXZlciwgc2l6ZW9mKHN0cnVjdCB0aV9seW54KSwgJmRldi0+ZGV2KTsKKyAgICAgICAgaWYgKCFob3N0KSBGQUlMKCJmYWlsZWQgdG8gYWxsb2NhdGUgY29udHJvbCBzdHJ1Y3R1cmUgbWVtb3J5Iik7CisKKyAgICAgICAgbHlueCA9IGhvc3QtPmhvc3RkYXRhOworCWx5bngtPmlkID0gY2FyZF9pZCsrOworICAgICAgICBseW54LT5kZXYgPSBkZXY7CisgICAgICAgIGx5bngtPnN0YXRlID0gY2xlYXI7CisJbHlueC0+aG9zdCA9IGhvc3Q7CisgICAgICAgIGhvc3QtPnBkZXYgPSBkZXY7CisgICAgICAgIHBjaV9zZXRfZHJ2ZGF0YShkZXYsIGx5bngpOworCisgICAgICAgIHNwaW5fbG9ja19pbml0KCZseW54LT5sb2NrKTsKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmx5bngtPnBoeV9yZWdfbG9jayk7CisKKyNpZm5kZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfTE9DQUxSQU0KKyAgICAgICAgbHlueC0+cGNsX21lbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldiwgTE9DQUxSQU1fU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZseW54LT5wY2xfbWVtX2RtYSk7CisKKyAgICAgICAgaWYgKGx5bngtPnBjbF9tZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGx5bngtPnN0YXRlID0gaGF2ZV9wY2xfbWVtOworICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgImFsbG9jYXRlZCBQQ0wgbWVtb3J5ICVkIEJ5dGVzIEAgMHglcCIsIExPQ0FMUkFNX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgbHlueC0+cGNsX21lbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRkFJTCgiZmFpbGVkIHRvIGFsbG9jYXRlIFBDTCBtZW1vcnkgYXJlYSIpOworICAgICAgICB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX1BPUlRTCisgICAgICAgIGx5bngtPm1lbV9kbWFfYnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LCA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHlueC0+bWVtX2RtYV9idWZmZXJfZG1hKTsKKyAgICAgICAgaWYgKGx5bngtPm1lbV9kbWFfYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBGQUlMKCJmYWlsZWQgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlciBmb3IgYXV4Iik7CisgICAgICAgIH0KKyAgICAgICAgbHlueC0+c3RhdGUgPSBoYXZlX2F1eF9idWY7CisjZW5kaWYKKworICAgICAgICBseW54LT5yY3ZfcGFnZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldiwgUEFHRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZseW54LT5yY3ZfcGFnZV9kbWEpOworICAgICAgICBpZiAobHlueC0+cmN2X3BhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEZBSUwoImZhaWxlZCB0byBhbGxvY2F0ZSByZWNlaXZlIGJ1ZmZlciIpOworICAgICAgICB9CisgICAgICAgIGx5bngtPnN0YXRlID0gaGF2ZV8xMzk0X2J1ZmZlcnM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IElTT1JDVl9QQUdFUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgbHlueC0+aXNvX3Jjdi5wYWdlW2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGRldiwgUEFHRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx5bngtPmlzb19yY3YucGFnZV9kbWFbaV0pOworICAgICAgICAgICAgICAgIGlmIChseW54LT5pc29fcmN2LnBhZ2VbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRkFJTCgiZmFpbGVkIHRvIGFsbG9jYXRlIGlzbyByZWNlaXZlIGJ1ZmZlcnMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBseW54LT5yZWdpc3RlcnMgPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSUxZTlhfTUFYX1JFR0lTVEVSKTsKKyAgICAgICAgbHlueC0+bG9jYWxfcmFtID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LDEpLCBQQ0lMWU5YX01BWF9NRU1PUlkpOworICAgICAgICBseW54LT5hdXhfcG9ydCAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsMiksIFBDSUxZTlhfTUFYX01FTU9SWSk7CisgICAgICAgIGx5bngtPmxvY2FsX3JvbSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldixQQ0lfUk9NX1JFU09VUkNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lMWU5YX01BWF9NRU1PUlkpOworICAgICAgICBseW54LT5zdGF0ZSA9IGhhdmVfaW9tYXBwaW5nczsKKworICAgICAgICBpZiAobHlueC0+cmVnaXN0ZXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBGQUlMKCJmYWlsZWQgdG8gcmVtYXAgcmVnaXN0ZXJzIC0gY2FyZCBub3QgYWNjZXNzaWJsZSIpOworICAgICAgICB9CisKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9MT0NBTFJBTQorICAgICAgICBpZiAobHlueC0+bG9jYWxfcmFtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBGQUlMKCJmYWlsZWQgdG8gcmVtYXAgbG9jYWwgUkFNIHdoaWNoIGlzIHJlcXVpcmVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9uIik7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJlZ19zZXRfYml0cyhseW54LCBNSVNDX0NPTlRST0wsIE1JU0NfQ09OVFJPTF9TV1JFU0VUKTsKKyAgICAgICAgLyogRml4IGJ1Z2d5IGNhcmRzIHdpdGggYXV0b2Jvb3QgcGluIG5vdCB0aWVkIGxvdzogKi8KKyAgICAgICAgcmVnX3dyaXRlKGx5bngsIERNQTBfQ0hBTl9DVFJMLCAwKTsKKworI2lmbmRlZiBfX3NwYXJjX18KKwlzcHJpbnRmIChpcnFfYnVmLCAiJWQiLCBkZXYtPmlycSk7CisjZWxzZQorCXNwcmludGYgKGlycV9idWYsICIlcyIsIF9faXJxX2l0b2EoZGV2LT5pcnEpKTsKKyNlbmRpZgorCisgICAgICAgIGlmICghcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGx5bnhfaXJxX2hhbmRsZXIsIFNBX1NISVJRLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBDSUxZTlhfRFJJVkVSX05BTUUsIGx5bngpKSB7CisgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwgImFsbG9jYXRlZCBpbnRlcnJ1cHQgJXMiLCBpcnFfYnVmKTsKKyAgICAgICAgICAgICAgICBseW54LT5zdGF0ZSA9IGhhdmVfaW50cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBGQUlMKCJmYWlsZWQgdG8gYWxsb2NhdGUgc2hhcmVkIGludGVycnVwdCAlcyIsIGlycV9idWYpOworICAgICAgICB9CisKKyAgICAgICAgLyogYWxsb2NfcGNsIHJldHVybiB2YWx1ZXMgYXJlIG5vdCBjaGVja2VkLCBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZQorICAgICAgICAgKiBwcm92aWRlZCBQQ0wgc3BhY2UgaXMgc3VmZmljaWVudCBmb3IgdGhlIGluaXRpYWwgYWxsb2NhdGlvbnMgKi8KKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9QT1JUUworICAgICAgICBpZiAobHlueC0+YXV4X3BvcnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGx5bngtPmRtZW1fcGNsID0gYWxsb2NfcGNsKGx5bngpOworICAgICAgICAgICAgICAgIGF1eF9zZXR1cF9wY2xzKGx5bngpOworICAgICAgICAgICAgICAgIHNlbWFfaW5pdCgmbHlueC0+bWVtX2RtYV9tdXRleCwgMSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBseW54LT5yY3ZfcGNsID0gYWxsb2NfcGNsKGx5bngpOworICAgICAgICBseW54LT5yY3ZfcGNsX3N0YXJ0ID0gYWxsb2NfcGNsKGx5bngpOworICAgICAgICBseW54LT5hc3luYy5wY2wgPSBhbGxvY19wY2wobHlueCk7CisgICAgICAgIGx5bngtPmFzeW5jLnBjbF9zdGFydCA9IGFsbG9jX3BjbChseW54KTsKKyAgICAgICAgbHlueC0+aXNvX3NlbmQucGNsID0gYWxsb2NfcGNsKGx5bngpOworICAgICAgICBseW54LT5pc29fc2VuZC5wY2xfc3RhcnQgPSBhbGxvY19wY2wobHlueCk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9JU09SQ1ZfUENMOyBpKyspIHsKKyAgICAgICAgICAgICAgICBseW54LT5pc29fcmN2LnBjbFtpXSA9IGFsbG9jX3BjbChseW54KTsKKyAgICAgICAgfQorICAgICAgICBseW54LT5pc29fcmN2LnBjbF9zdGFydCA9IGFsbG9jX3BjbChseW54KTsKKworICAgICAgICAvKiBhbGwgYWxsb2NhdGlvbnMgc3VjY2Vzc2Z1bCAtIHNpbXBsZSBpbml0IHN0dWZmIGZvbGxvd3MgKi8KKworICAgICAgICByZWdfd3JpdGUobHlueCwgUENJX0lOVF9FTkFCTEUsIFBDSV9JTlRfRE1BX0FMTCk7CisKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9QT1JUUworICAgICAgICByZWdfc2V0X2JpdHMobHlueCwgUENJX0lOVF9FTkFCTEUsIFBDSV9JTlRfQVVYX0lOVCk7CisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmx5bngtPm1lbV9kbWFfaW50cl93YWl0KTsKKyAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmbHlueC0+YXV4X2ludHJfd2FpdCk7CisjZW5kaWYKKworCXRhc2tsZXRfaW5pdCgmbHlueC0+aXNvX3Jjdi50cSwgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKWlzb19yY3ZfYmgsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpbHlueCk7CisKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmx5bngtPmlzb19yY3YubG9jayk7CisKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmx5bngtPmFzeW5jLnF1ZXVlX2xvY2spOworICAgICAgICBseW54LT5hc3luYy5jaGFubmVsID0gQ0hBTk5FTF9BU1lOQ19TRU5EOworICAgICAgICBzcGluX2xvY2tfaW5pdCgmbHlueC0+aXNvX3NlbmQucXVldWVfbG9jayk7CisgICAgICAgIGx5bngtPmlzb19zZW5kLmNoYW5uZWwgPSBDSEFOTkVMX0lTT19TRU5EOworCisgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJyZW1hcHBlZCBtZW1vcnkgc3BhY2VzIHJlZyAweCVwLCByb20gMHglcCwgIgorICAgICAgICAgICAgICAicmFtIDB4JXAsIGF1eCAweCVwIiwgbHlueC0+cmVnaXN0ZXJzLCBseW54LT5sb2NhbF9yb20sCisgICAgICAgICAgICAgIGx5bngtPmxvY2FsX3JhbSwgbHlueC0+YXV4X3BvcnQpOworCisgICAgICAgIC8qIG5vdywgbG9va2luZyBmb3IgUEhZIHJlZ2lzdGVyIHNldCAqLworICAgICAgICBpZiAoKGdldF9waHlfcmVnKGx5bngsIDIpICYgMHhlMCkgPT0gMHhlMCkgeworICAgICAgICAgICAgICAgIGx5bngtPnBoeWljLnJlZ18xMzk0YSA9IDE7CisgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9JTkZPLCBseW54LT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgMTM5NGEgY29uZm9ybSBQSFkgKHVzaW5nIGV4dGVuZGVkIHJlZ2lzdGVyIHNldCkiKTsKKyAgICAgICAgICAgICAgICBseW54LT5waHlpYy52ZW5kb3IgPSBnZXRfcGh5X3ZlbmRvcmlkKGx5bngpOworICAgICAgICAgICAgICAgIGx5bngtPnBoeWljLnByb2R1Y3QgPSBnZXRfcGh5X3Byb2R1Y3RpZChseW54KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBseW54LT5waHlpYy5yZWdfMTM5NGEgPSAwOworICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fSU5GTywgbHlueC0+aWQsICJmb3VuZCBvbGQgMTM5NCBQSFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGx5bngtPnNlbGZpZF9zaXplID0gLTE7CisgICAgICAgIGx5bngtPnBoeV9yZWcwID0gLTE7CisKKwlJTklUX0xJU1RfSEVBRCgmbHlueC0+YXN5bmMucXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZseW54LT5hc3luYy5wY2xfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZseW54LT5pc29fc2VuZC5xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmx5bngtPmlzb19zZW5kLnBjbF9xdWV1ZSk7CisKKyAgICAgICAgcGNsLm5leHQgPSBwY2xfYnVzKGx5bngsIGx5bngtPnJjdl9wY2wpOworICAgICAgICBwdXRfcGNsKGx5bngsIGx5bngtPnJjdl9wY2xfc3RhcnQsICZwY2wpOworCisgICAgICAgIHBjbC5uZXh0ID0gUENMX05FWFRfSU5WQUxJRDsKKyAgICAgICAgcGNsLmFzeW5jX2Vycm9yX25leHQgPSBQQ0xfTkVYVF9JTlZBTElEOworCisgICAgICAgIHBjbC5idWZmZXJbMF0uY29udHJvbCA9IFBDTF9DTURfUkNWIHwgMTY7CisjaWZuZGVmIF9fQklHX0VORElBTgorCXBjbC5idWZmZXJbMF0uY29udHJvbCB8PSBQQ0xfQklHRU5ESUFOOworI2VuZGlmCisJcGNsLmJ1ZmZlclsxXS5jb250cm9sID0gUENMX0xBU1RfQlVGRiB8IDQwODA7CisKKyAgICAgICAgcGNsLmJ1ZmZlclswXS5wb2ludGVyID0gbHlueC0+cmN2X3BhZ2VfZG1hOworICAgICAgICBwY2wuYnVmZmVyWzFdLnBvaW50ZXIgPSBseW54LT5yY3ZfcGFnZV9kbWEgKyAxNjsKKyAgICAgICAgcHV0X3BjbChseW54LCBseW54LT5yY3ZfcGNsLCAmcGNsKTsKKworICAgICAgICBwY2wubmV4dCA9IHBjbF9idXMobHlueCwgbHlueC0+YXN5bmMucGNsKTsKKyAgICAgICAgcGNsLmFzeW5jX2Vycm9yX25leHQgPSBwY2xfYnVzKGx5bngsIGx5bngtPmFzeW5jLnBjbCk7CisgICAgICAgIHB1dF9wY2wobHlueCwgbHlueC0+YXN5bmMucGNsX3N0YXJ0LCAmcGNsKTsKKworICAgICAgICBwY2wubmV4dCA9IHBjbF9idXMobHlueCwgbHlueC0+aXNvX3NlbmQucGNsKTsKKyAgICAgICAgcGNsLmFzeW5jX2Vycm9yX25leHQgPSBQQ0xfTkVYVF9JTlZBTElEOworICAgICAgICBwdXRfcGNsKGx5bngsIGx5bngtPmlzb19zZW5kLnBjbF9zdGFydCwgJnBjbCk7CisKKyAgICAgICAgcGNsLm5leHQgPSBQQ0xfTkVYVF9JTlZBTElEOworICAgICAgICBwY2wuYXN5bmNfZXJyb3JfbmV4dCA9IFBDTF9ORVhUX0lOVkFMSUQ7CisgICAgICAgIHBjbC5idWZmZXJbMF0uY29udHJvbCA9IFBDTF9DTURfUkNWIHwgNDsKKyNpZm5kZWYgX19CSUdfRU5ESUFOCisgICAgICAgIHBjbC5idWZmZXJbMF0uY29udHJvbCB8PSBQQ0xfQklHRU5ESUFOOworI2VuZGlmCisgICAgICAgIHBjbC5idWZmZXJbMV0uY29udHJvbCA9IFBDTF9MQVNUX0JVRkYgfCAyMDQ0OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fSVNPUkNWX1BDTDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHBhZ2UgPSBpIC8gSVNPUkNWX1BFUl9QQUdFOworICAgICAgICAgICAgICAgIGludCBzZWMgPSBpICUgSVNPUkNWX1BFUl9QQUdFOworCisgICAgICAgICAgICAgICAgcGNsLmJ1ZmZlclswXS5wb2ludGVyID0gbHlueC0+aXNvX3Jjdi5wYWdlX2RtYVtwYWdlXQorICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWMgKiBNQVhfSVNPUkNWX1NJWkU7CisgICAgICAgICAgICAgICAgcGNsLmJ1ZmZlclsxXS5wb2ludGVyID0gcGNsLmJ1ZmZlclswXS5wb2ludGVyICsgNDsKKyAgICAgICAgICAgICAgICBwdXRfcGNsKGx5bngsIGx5bngtPmlzb19yY3YucGNsW2ldLCAmcGNsKTsKKyAgICAgICAgfQorCisgICAgICAgIHBjbGkgPSAodTMyICopJnBjbDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9JU09SQ1ZfUENMOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwY2xpW2ldID0gcGNsX2J1cyhseW54LCBseW54LT5pc29fcmN2LnBjbFtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcHV0X3BjbChseW54LCBseW54LT5pc29fcmN2LnBjbF9zdGFydCwgJnBjbCk7CisKKyAgICAgICAgLyogRklGTyBzaXplcyBmcm9tIGxlZnQgdG8gcmlnaHQ6IElURj00OCBBVEY9NDggR1JGPTE2MCAqLworICAgICAgICByZWdfd3JpdGUobHlueCwgRklGT19TSVpFUywgMHgwMDMwMzBhMCk7CisgICAgICAgIC8qIDIwIGJ5dGUgdGhyZXNob2xkIGJlZm9yZSB0cmlnZ2VyaW5nIFBDSSB0cmFuc2ZlciAqLworICAgICAgICByZWdfd3JpdGUobHlueCwgRE1BX0dMT0JBTF9SRUdJU1RFUiwgMHgyPDwyNCk7CisgICAgICAgIC8qIHRocmVzaG9sZCBvbiBib3RoIHNlbmQgRklGT3MgYmVmb3JlIHRyYW5zbWl0dGluZzoKKyAgICAgICAgICAgRklGTyBzaXplIC0gY2FjaGUgbGluZSBzaXplIC0gMSAqLworICAgICAgICBpID0gcmVnX3JlYWQobHlueCwgUENJX0xBVEVOQ1lfQ0FDSEVMSU5FKSAmIDB4ZmY7CisgICAgICAgIGkgPSAweDMwIC0gaSAtIDE7CisgICAgICAgIHJlZ193cml0ZShseW54LCBGSUZPX1hNSVRfVEhSRVNIT0xELCAoaSA8PCA4KSB8IGkpOworCisgICAgICAgIHJlZ19zZXRfYml0cyhseW54LCBQQ0lfSU5UX0VOQUJMRSwgUENJX0lOVF8xMzk0KTsKKworICAgICAgICByZWdfd3JpdGUobHlueCwgTElOS19JTlRfRU5BQkxFLCBMSU5LX0lOVF9QSFlfVElNRU9VVAorICAgICAgICAgICAgICAgICAgfCBMSU5LX0lOVF9QSFlfUkVHX1JDVkQgIHwgTElOS19JTlRfUEhZX0JVU1JFU0VUCisgICAgICAgICAgICAgICAgICB8IExJTktfSU5UX0lTT19TVFVDSyAgICAgfCBMSU5LX0lOVF9BU1lOQ19TVFVDSworICAgICAgICAgICAgICAgICAgfCBMSU5LX0lOVF9TRU5UX1JFSkVDVCAgIHwgTElOS19JTlRfVFhfSU5WQUxJRF9UQworICAgICAgICAgICAgICAgICAgfCBMSU5LX0lOVF9HUkZfT1ZFUkZMT1cgIHwgTElOS19JTlRfSVRGX1VOREVSRkxPVworICAgICAgICAgICAgICAgICAgfCBMSU5LX0lOVF9BVEZfVU5ERVJGTE9XKTsKKworICAgICAgICByZWdfd3JpdGUobHlueCwgRE1BX1dPUkQwX0NNUF9WQUxVRShDSEFOTkVMX0FTWU5DX1JDViksIDApOworICAgICAgICByZWdfd3JpdGUobHlueCwgRE1BX1dPUkQwX0NNUF9FTkFCTEUoQ0hBTk5FTF9BU1lOQ19SQ1YpLCAweGE8PDQpOworICAgICAgICByZWdfd3JpdGUobHlueCwgRE1BX1dPUkQxX0NNUF9WQUxVRShDSEFOTkVMX0FTWU5DX1JDViksIDApOworICAgICAgICByZWdfd3JpdGUobHlueCwgRE1BX1dPUkQxX0NNUF9FTkFCTEUoQ0hBTk5FTF9BU1lOQ19SQ1YpLAorICAgICAgICAgICAgICAgICAgRE1BX1dPUkQxX0NNUF9NQVRDSF9MT0NBTF9OT0RFIHwgRE1BX1dPUkQxX0NNUF9NQVRDSF9CUk9BRENBU1QKKyAgICAgICAgICAgICAgICAgIHwgRE1BX1dPUkQxX0NNUF9NQVRDSF9FWEFDVCAgICB8IERNQV9XT1JEMV9DTVBfTUFUQ0hfQlVTX0JDQVNUCisgICAgICAgICAgICAgICAgICB8IERNQV9XT1JEMV9DTVBfRU5BQkxFX1NFTEZfSUQgfCBETUFfV09SRDFfQ01QX0VOQUJMRV9NQVNURVIpOworCisgICAgICAgIHJ1bl9wY2wobHlueCwgbHlueC0+cmN2X3BjbF9zdGFydCwgQ0hBTk5FTF9BU1lOQ19SQ1YpOworCisgICAgICAgIHJlZ193cml0ZShseW54LCBETUFfV09SRDBfQ01QX1ZBTFVFKENIQU5ORUxfSVNPX1JDViksIDApOworICAgICAgICByZWdfd3JpdGUobHlueCwgRE1BX1dPUkQwX0NNUF9FTkFCTEUoQ0hBTk5FTF9JU09fUkNWKSwgMHg5PDw0KTsKKyAgICAgICAgcmVnX3dyaXRlKGx5bngsIERNQV9XT1JEMV9DTVBfVkFMVUUoQ0hBTk5FTF9JU09fUkNWKSwgMCk7CisgICAgICAgIHJlZ193cml0ZShseW54LCBETUFfV09SRDFfQ01QX0VOQUJMRShDSEFOTkVMX0lTT19SQ1YpLCAwKTsKKworICAgICAgICBydW5fc3ViX3BjbChseW54LCBseW54LT5pc29fcmN2LnBjbF9zdGFydCwgMCwgQ0hBTk5FTF9JU09fUkNWKTsKKworICAgICAgICByZWdfd3JpdGUobHlueCwgTElOS19DT05UUk9MLCBMSU5LX0NPTlRST0xfUkNWX0NNUF9WQUxJRAorICAgICAgICAgICAgICAgICAgfCBMSU5LX0NPTlRST0xfVFhfSVNPX0VOICAgfCBMSU5LX0NPTlRST0xfUlhfSVNPX0VOCisgICAgICAgICAgICAgICAgICB8IExJTktfQ09OVFJPTF9UWF9BU1lOQ19FTiB8IExJTktfQ09OVFJPTF9SWF9BU1lOQ19FTgorICAgICAgICAgICAgICAgICAgfCBMSU5LX0NPTlRST0xfUkVTRVRfVFggICAgfCBMSU5LX0NPTlRST0xfUkVTRVRfUlgpOworCisJaWYgKCFseW54LT5waHlpYy5yZWdfMTM5NGEpIHsKKwkJaWYgKCFocHNiX2Rpc2FibGVfaXJtKSB7CisJCQkvKiBhdHRlbXB0IHRvIGVuYWJsZSBjb250ZW5kZXIgYml0IC1GSVhNRS0gd291bGQgdGhpcworCQkJICogd29yayBlbHNld2hlcmU/ICovCisJCQlyZWdfc2V0X2JpdHMobHlueCwgR1BJT19DVFJMX0EsIDB4MSk7CisJCQlyZWdfd3JpdGUobHlueCwgR1BJT19EQVRBX0JBU0UgKyAweDNjLCAweDEpOworCQl9CisJfSBlbHNlIHsKKwkJLyogc2V0IHRoZSBjb250ZW5kZXIgKGlmIGFwcHJvcHJpYXRlKSBhbmQgTEN0cmwgYml0IGluIHRoZQorCQkgKiBleHRlbmRlZCBQSFkgcmVnaXN0ZXIgc2V0LiAoU2hvdWxkIGNoZWNrIHRoYXQgUEhZXzAyX0VYVEVOREVECisJCSAqIGlzIHNldCBpbiByZWdpc3RlciAyPykKKwkJICovCisJCWkgPSBnZXRfcGh5X3JlZyhseW54LCA0KTsKKwkJaSB8PSBQSFlfMDRfTENUUkw7CisJCWlmIChocHNiX2Rpc2FibGVfaXJtKQorCQkJaSAmPSAhUEhZXzA0X0NPTlRFTkRFUjsKKwkJZWxzZQorCQkJaSB8PSBQSFlfMDRfQ09OVEVOREVSOworCQlpZiAoaSAhPSAtMSkgc2V0X3BoeV9yZWcobHlueCwgNCwgaSk7CisJfQorCQorICAgICAgICBpZiAoIXNraXBfZWVwcm9tKQorICAgICAgICB7CisgICAgICAgIAkvKiBuZWVkZWQgZm9yIGkyYyBjb21tdW5pY2F0aW9uIHdpdGggc2VyaWFsIGVlcHJvbSAqLworICAgICAgICAJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWQ7CisgICAgICAgIAlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgaTJjX2FkYXB0ZXJfZGF0YTsKKworICAgICAgICAJZXJyb3IgPSAtRU5PTUVNOworCQlpMmNfYWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2FkYXB0ZXIpLCBTTEFCX0tFUk5FTCk7CisgICAgICAgIAlpZiAoIWkyY19hZCkgRkFJTCgiZmFpbGVkIHRvIGFsbG9jYXRlIEkyQyBhZGFwdGVyIG1lbW9yeSIpOworCisJCW1lbWNweShpMmNfYWQsICZiaXRfb3BzLCBzaXplb2Yoc3RydWN0IGkyY19hZGFwdGVyKSk7CisgICAgICAgICAgICAgICAgaTJjX2FkYXB0ZXJfZGF0YSA9IGJpdF9kYXRhOworICAgICAgICAgICAgICAgIGkyY19hZC0+YWxnb19kYXRhID0gJmkyY19hZGFwdGVyX2RhdGE7CisgICAgICAgICAgICAgICAgaTJjX2FkYXB0ZXJfZGF0YS5kYXRhID0gbHlueDsKKworCQlQUklOVEQoS0VSTl9ERUJVRywgbHlueC0+aWQsIm9yaWdpbmFsIGVlcHJvbSBjb250cm9sOiAlZCIsCisJCSAgICAgICByZWdfcmVhZChseW54LCBTRVJJQUxfRUVQUk9NX0NPTlRST0wpKTsKKworICAgICAgICAJLyogcmVzZXQgaGFyZHdhcmUgdG8gc2FuZSBzdGF0ZSAqLworICAgICAgICAJbHlueC0+aTJjX2RyaXZlbl9zdGF0ZSA9IDB4MDAwMDAwNzA7CisgICAgICAgIAlyZWdfd3JpdGUobHlueCwgU0VSSUFMX0VFUFJPTV9DT05UUk9MLCBseW54LT5pMmNfZHJpdmVuX3N0YXRlKTsKKworICAgICAgICAJaWYgKGkyY19iaXRfYWRkX2J1cyhpMmNfYWQpIDwgMCkKKyAgICAgICAgCXsKKwkJCWtmcmVlKGkyY19hZCk7CisJCQllcnJvciA9IC1FTlhJTzsKKwkJCUZBSUwoInVuYWJsZSB0byByZWdpc3RlciBpMmMiKTsKKyAgICAgICAgCX0KKyAgICAgICAgCWVsc2UKKyAgICAgICAgCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGkyYyBzdHVmZiAqLworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpMmNfY21kID0gMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsgeyAweDUwLCAwLCAxLCAmaTJjX2NtZCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4NTAsIEkyQ19NX1JELCAyMCwgKHVuc2lnbmVkIGNoYXIqKSBseW54LT5idXNfaW5mb19ibG9jayB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfVkVSQk9TRURFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaTJjX3NtYnVzX3hmZXIoaTJjX2FkLCA4MCwgMCwgSTJDX1NNQlVTX1dSSVRFLCAwLCBJMkNfU01CVVNfQllURSxOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9FUlIsIGx5bngtPmlkLCJlZXByb20gcmVhZCBzdGFydCBoYXMgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBhZGRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGFkZHI9MHgwMDsgYWRkciA8IDB4MTAwOyBhZGRyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaTJjX3NtYnVzX3hmZXIoaTJjX2FkLCA4MCwgMCwgSTJDX1NNQlVTX1JFQUQsIDAsIEkyQ19TTUJVU19CWVRFLCYgZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwgInVuYWJsZSB0byByZWFkIGkyYyAleCIsIGFkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fREVCVUcsIGx5bngtPmlkLCJnb3Qgc2VyaWFsIGVlcHJvbSBkYXRhIGF0ICV4OiAleCIsYWRkciwgZGF0YS5ieXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHVzZSBpMmNfdHJhbnNmZXIsIGJlY2F1c2UgaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IGFuZCB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gaXQgbW9yZSBlZmZpY2llbnRseSBpbiBvbmUgdHJhbnNhY3Rpb24gcmF0aGVyIHRoZW4gdXNpbmcgc2V2ZXJhbCByZWFkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkyY190cmFuc2ZlcihpMmNfYWQsIG1zZywgMikgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5UKEtFUk5fRVJSLCBseW54LT5pZCwgInVuYWJsZSB0byByZWFkIGJ1cyBpbmZvIGJsb2NrIGZyb20gaTJjIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX0lORk8sIGx5bngtPmlkLCAiZ290IGJ1cyBpbmZvIGJsb2NrIGZyb20gc2VyaWFsIGVlcHJvbSIpOworCQkJCS8qIEZJWE1FOiBwcm9iYWJseSB3ZSBzaG91ZCByZXdyaXRlIHRoZSBtYXhfcmVjLCBtYXhfUk9NKDEzOTRhKSwKKwkJCQkgKiBnZW5lcmF0aW9uKDEzOTRhKSBhbmQgbGlua19zcGQoMTM5NGEpIGZpZWxkIGFuZCByZWNhbGN1bGF0ZQorCQkJCSAqIHRoZSBDUkMgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNSA7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVEQoS0VSTl9ERUJVRywgbHlueC0+aWQsICJCdXNpbmZvIGJsb2NrIHF1YWRsZXQgJWk6ICUwOHgiLAorCQkJCQkgICAgICAgaSwgYmUzMl90b19jcHUobHlueC0+YnVzX2luZm9fYmxvY2tbaV0pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmZvX2xlbmd0aCwgY3JjX2xlbmd0aCBhbmQgMTM5NCBtYWdpYyBudW1iZXIgdG8gY2hlY2ssIGlmIGl0IGlzIHJlYWxseSBhIGJ1cyBpbmZvIGJsb2NrICovCisJCQkJaWYgKCgoYmUzMl90b19jcHUobHlueC0+YnVzX2luZm9fYmxvY2tbMF0pICYgMHhmZmZmMDAwMCkgPT0gMHgwNDA0MDAwMCkgJiYKKwkJCQkgICAgKGx5bngtPmJ1c19pbmZvX2Jsb2NrWzFdID09IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlQoS0VSTl9ERUJVRywgbHlueC0+aWQsICJyZWFkIGEgdmFsaWQgYnVzIGluZm8gYmxvY2sgZnJvbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJCQlrZnJlZShpMmNfYWQpOworCQkJCQllcnJvciA9IC1FTlhJTzsKKwkJCQkJRkFJTCgicmVhZCBzb21ldGhpbmcgZnJvbSBzZXJpYWwgZWVwcm9tLCBidXQgaXQgZG9lcyBub3Qgc2VlbSB0byBiZSBhIHZhbGlkIGJ1cyBpbmZvIGJsb2NrIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpMmNfYml0X2RlbF9idXMoaTJjX2FkKTsKKwkJCWtmcmVlKGkyY19hZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKwlob3N0LT5jc3IuZ3VpZF9oaSA9IGJlMzJfdG9fY3B1KGx5bngtPmJ1c19pbmZvX2Jsb2NrWzNdKTsKKwlob3N0LT5jc3IuZ3VpZF9sbyA9IGJlMzJfdG9fY3B1KGx5bngtPmJ1c19pbmZvX2Jsb2NrWzRdKTsKKwlob3N0LT5jc3IuY3ljX2Nsa19hY2MgPSAoYmUzMl90b19jcHUobHlueC0+YnVzX2luZm9fYmxvY2tbMl0pID4+IDE2KSAmIDB4ZmY7CisJaG9zdC0+Y3NyLm1heF9yZWMgPSAoYmUzMl90b19jcHUobHlueC0+YnVzX2luZm9fYmxvY2tbMl0pID4+IDEyKSAmIDB4ZjsKKwlpZiAoIWx5bngtPnBoeWljLnJlZ18xMzk0YSkKKwkJaG9zdC0+Y3NyLmxua19zcGQgPSAoZ2V0X3BoeV9yZWcobHlueCwgMikgJiAweGMwKSA+PiA2OworCWVsc2UKKwkJaG9zdC0+Y3NyLmxua19zcGQgPSBiZTMyX3RvX2NwdShseW54LT5idXNfaW5mb19ibG9ja1syXSkgJiAweDc7CisKKwlpZiAoaHBzYl9hZGRfaG9zdChob3N0KSkgeworCQllcnJvciA9IC1FTk9NRU07CisJCUZBSUwoIkZhaWxlZCB0byByZWdpc3RlciBob3N0IHdpdGggaGlnaGxldmVsIik7CisJfQorCisJbHlueC0+c3RhdGUgPSBpc19ob3N0OworCisJcmV0dXJuIDA7CisjdW5kZWYgRkFJTAorfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGFibGVbXSA9IHsKKwl7CisgICAgICAgICAgICAgICAgLnZlbmRvciA9ICAgIFBDSV9WRU5ET1JfSURfVEksCisgICAgICAgICAgICAgICAgLmRldmljZSA9ICAgIFBDSV9ERVZJQ0VfSURfVElfUENJTFlOWCwKKyAgICAgICAgICAgICAgICAuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKyAgICAgICAgICAgICAgICAuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwl9LAorCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbHlueF9wY2lfZHJpdmVyID0geworICAgICAgICAubmFtZSA9ICAgICBQQ0lMWU5YX0RSSVZFUl9OQU1FLAorICAgICAgICAuaWRfdGFibGUgPSBwY2lfdGFibGUsCisgICAgICAgIC5wcm9iZSA9ICAgIGFkZF9jYXJkLAorICAgICAgICAucmVtb3ZlID0gICByZW1vdmVfY2FyZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9ob3N0X2RyaXZlciBseW54X2RyaXZlciA9IHsKKwkub3duZXIgPQkgICBUSElTX01PRFVMRSwKKwkubmFtZSA9CQkgICBQQ0lMWU5YX0RSSVZFUl9OQU1FLAorCS5zZXRfaHdfY29uZmlnX3JvbSA9IE5VTEwsCisgICAgICAgIC50cmFuc21pdF9wYWNrZXQgPSBseW54X3RyYW5zbWl0LAorICAgICAgICAuZGV2Y3RsID0gICAgICAgICAgbHlueF9kZXZjdGwsCisJLmlzb2N0bCA9ICAgICAgICAgIE5VTEwsCit9OworCitNT0RVTEVfQVVUSE9SKCJBbmRyZWFzIEUuIEJvbWJlIDxhbmRyZWFzLmJvbWJlQG11bmljaC5uZXRzdXJmLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIFRleGFzIEluc3RydW1lbnRzIFBDSSBMeW54IElFRUUtMTM5NCBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgicGNpbHlueCIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV90YWJsZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaWx5bnhfaW5pdCh2b2lkKQoreworICAgICAgICBpbnQgcmV0OworCisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMKKyAgICAgICAgaWYgKHJlZ2lzdGVyX2NocmRldihQQ0lMWU5YX01BSk9SLCBQQ0lMWU5YX0RSSVZFUl9OQU1FLCAmYXV4X29wcykpIHsKKyAgICAgICAgICAgICAgICBQUklOVF9HKEtFUk5fRVJSLCAiYWxsb2NhdGlvbiBvZiBjaGFyIG1ham9yIG51bWJlciAlZCBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgUENJTFlOWF9NQUpPUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbHlueF9wY2lfZHJpdmVyKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBQUklOVF9HKEtFUk5fRVJSLCAiUENJIG1vZHVsZSBpbml0IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIGdvdG8gZnJlZV9jaGFyX2RldjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworCisgZnJlZV9jaGFyX2RldjoKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9QT1JUUworICAgICAgICB1bnJlZ2lzdGVyX2NocmRldihQQ0lMWU5YX01BSk9SLCBQQ0lMWU5YX0RSSVZFUl9OQU1FKTsKKyNlbmRpZgorCisgICAgICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY2lseW54X2NsZWFudXAodm9pZCkKK3sKKyAgICAgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZseW54X3BjaV9kcml2ZXIpOworCisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMKKyAgICAgICAgdW5yZWdpc3Rlcl9jaHJkZXYoUENJTFlOWF9NQUpPUiwgUENJTFlOWF9EUklWRVJfTkFNRSk7CisjZW5kaWYKK30KKworCittb2R1bGVfaW5pdChwY2lseW54X2luaXQpOworbW9kdWxlX2V4aXQocGNpbHlueF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5oIGIvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0ZWM1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5oCkBAIC0wLDAgKzEsNTE2IEBACisjaWZuZGVmIF9fUENJTFlOWF9IX18KKyNkZWZpbmUgX19QQ0lMWU5YX0hfXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNkZWZpbmUgUENJTFlOWF9EUklWRVJfTkFNRSAgICAgICJwY2lseW54IgorI2RlZmluZSBQQ0lMWU5YX01BSk9SICAgICAgICAgICAgMTc3CisKKyNkZWZpbmUgUENJTFlOWF9NSU5PUl9BVVhfU1RBUlQgIDAKKyNkZWZpbmUgUENJTFlOWF9NSU5PUl9ST01fU1RBUlQgIDE2CisjZGVmaW5lIFBDSUxZTlhfTUlOT1JfUkFNX1NUQVJUICAzMgorCisjZGVmaW5lIFBDSUxZTlhfTUFYX1JFR0lTVEVSICAgICAweGZmZgorI2RlZmluZSBQQ0lMWU5YX01BWF9NRU1PUlkgICAgICAgMHhmZmZmCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9USV9QQ0lMWU5YIDB4ODAwMAorI2RlZmluZSBNQVhfUENJTFlOWF9DQVJEUyAgICAgICAgNAorI2RlZmluZSBMT0NBTFJBTV9TSVpFICAgICAgICAgICAgNDA5NgorCisjZGVmaW5lIE5VTV9JU09SQ1ZfUENMICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9JU09SQ1ZfU0laRSAgICAgICAgICAyMDQ4CisjZGVmaW5lIElTT1JDVl9QRVJfUEFHRSAgICAgICAgICAoUEFHRV9TSVpFIC8gTUFYX0lTT1JDVl9TSVpFKQorI2RlZmluZSBJU09SQ1ZfUEFHRVMgICAgICAgICAgICAgKE5VTV9JU09SQ1ZfUENMIC8gSVNPUkNWX1BFUl9QQUdFKQorCisjZGVmaW5lIENIQU5ORUxfTE9DQUxCVVMgICAgICAgICAwCisjZGVmaW5lIENIQU5ORUxfQVNZTkNfUkNWICAgICAgICAxCisjZGVmaW5lIENIQU5ORUxfSVNPX1JDViAgICAgICAgICAyCisjZGVmaW5lIENIQU5ORUxfQVNZTkNfU0VORCAgICAgICAzCisjZGVmaW5lIENIQU5ORUxfSVNPX1NFTkQgICAgICAgICA0CisKKyNkZWZpbmUgUENJTFlOWF9DT05GSUdfUk9NX0xFTkdUSCAgIDEwMjQKKwordHlwZWRlZiBpbnQgcGNsX3Q7CisKK3N0cnVjdCB0aV9seW54IHsKKyAgICAgICAgaW50IGlkOyAvKiBzZXF1ZW50aWFsIGNhcmQgbnVtYmVyICovCisKKyAgICAgICAgc3BpbmxvY2tfdCBsb2NrOworCisgICAgICAgIHN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCByZWdfMTM5NGE6MTsKKyAgICAgICAgICAgICAgICB1MzIgdmVuZG9yOworICAgICAgICAgICAgICAgIHUzMiBwcm9kdWN0OworICAgICAgICB9IHBoeWljOworCisgICAgICAgIGVudW0geyBjbGVhciwgaGF2ZV9pbnRyLCBoYXZlX2F1eF9idWYsIGhhdmVfcGNsX21lbSwKKyAgICAgICAgICAgICAgIGhhdmVfMTM5NF9idWZmZXJzLCBoYXZlX2lvbWFwcGluZ3MsIGlzX2hvc3QgfSBzdGF0ZTsKKworICAgICAgICAvKiByZW1hcHBlZCBtZW1vcnkgc3BhY2VzICovCisgICAgICAgIHZvaWQgX19pb21lbSAqcmVnaXN0ZXJzOworICAgICAgICB2b2lkIF9faW9tZW0gKmxvY2FsX3JvbTsKKyAgICAgICAgdm9pZCBfX2lvbWVtICpsb2NhbF9yYW07CisgICAgICAgIHZvaWQgX19pb21lbSAqYXV4X3BvcnQ7CisJcXVhZGxldF90IGJ1c19pbmZvX2Jsb2NrWzVdOworCisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfUE9SVFMKKyAgICAgICAgYXRvbWljX3QgYXV4X2ludHJfc2VlbjsKKyAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgYXV4X2ludHJfd2FpdDsKKworICAgICAgICB2b2lkICptZW1fZG1hX2J1ZmZlcjsKKyAgICAgICAgZG1hX2FkZHJfdCBtZW1fZG1hX2J1ZmZlcl9kbWE7CisgICAgICAgIHN0cnVjdCBzZW1hcGhvcmUgbWVtX2RtYV9tdXRleDsKKyAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgbWVtX2RtYV9pbnRyX3dhaXQ7CisjZW5kaWYKKworICAgICAgICAvKgorICAgICAgICAgKiB1c2UgbG9jYWwgUkFNIG9mIExPQ0FMUkFNX1NJWkUgYnl0ZXMgZm9yIFBDTHMsIHdoaWNoIGFsbG93cyBmb3IKKyAgICAgICAgICogTE9DQUxSQU1fU0laRSAqIDggUENMcyAoZWFjaCBzaXplZCAxMjggYnl0ZXMpOworICAgICAgICAgKiB0aGUgZm9sbG93aW5nIGlzIGFuIGFsbG9jYXRpb24gYml0bWFwCisgICAgICAgICAqLworICAgICAgICB1OCBwY2xfYm1hcFtMT0NBTFJBTV9TSVpFIC8gMTAyNF07CisKKyNpZm5kZWYgQ09ORklHX0lFRUUxMzk0X1BDSUxZTlhfTE9DQUxSQU0KKwkvKiBwb2ludCB0byBQQ0xzIG1lbW9yeSBhcmVhIGlmIG5lZWRlZCAqLworCXZvaWQgKnBjbF9tZW07CisgICAgICAgIGRtYV9hZGRyX3QgcGNsX21lbV9kbWE7CisjZW5kaWYKKworICAgICAgICAvKiBQQ0xzIGZvciBsb2NhbCBtZW0gLyBhdXggdHJhbnNmZXJzICovCisgICAgICAgIHBjbF90IGRtZW1fcGNsOworCisgICAgICAgIC8qIElFRUUtMTM5NCBwYXJ0IGZvbGxvd3MgKi8KKyAgICAgICAgc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKKworICAgICAgICBpbnQgcGh5aWQsIGlzcm9vdDsKKyAgICAgICAgaW50IHNlbGZpZF9zaXplOworICAgICAgICBpbnQgcGh5X3JlZzA7CisKKyAgICAgICAgc3BpbmxvY2tfdCBwaHlfcmVnX2xvY2s7CisKKyAgICAgICAgcGNsX3QgcmN2X3BjbF9zdGFydCwgcmN2X3BjbDsKKyAgICAgICAgdm9pZCAqcmN2X3BhZ2U7CisgICAgICAgIGRtYV9hZGRyX3QgcmN2X3BhZ2VfZG1hOworICAgICAgICBpbnQgcmN2X2FjdGl2ZTsKKworICAgICAgICBzdHJ1Y3QgbHlueF9zZW5kX2RhdGEgeworICAgICAgICAgICAgICAgIHBjbF90IHBjbF9zdGFydCwgcGNsOworICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisgICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBwY2xfcXVldWU7IC8qIHRoaXMgcXVldWUgY29udGFpbnMgYXQgbW9zdCBvbmUgcGFja2V0ICovCisgICAgICAgICAgICAgICAgc3BpbmxvY2tfdCBxdWV1ZV9sb2NrOworICAgICAgICAgICAgICAgIGRtYV9hZGRyX3QgaGVhZGVyX2RtYSwgZGF0YV9kbWE7CisgICAgICAgICAgICAgICAgaW50IGNoYW5uZWw7CisgICAgICAgIH0gYXN5bmMsIGlzb19zZW5kOworCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgcGNsX3QgcGNsW05VTV9JU09SQ1ZfUENMXTsKKyAgICAgICAgICAgICAgICB1MzIgc3RhdFtOVU1fSVNPUkNWX1BDTF07CisgICAgICAgICAgICAgICAgdm9pZCAqcGFnZVtJU09SQ1ZfUEFHRVNdOworICAgICAgICAgICAgICAgIGRtYV9hZGRyX3QgcGFnZV9kbWFbSVNPUkNWX1BBR0VTXTsKKyAgICAgICAgICAgICAgICBwY2xfdCBwY2xfc3RhcnQ7CisgICAgICAgICAgICAgICAgaW50IGNoYW5fY291bnQ7CisgICAgICAgICAgICAgICAgaW50IG5leHQsIGxhc3QsIHVzZWQsIHJ1bm5pbmc7CisgICAgICAgICAgICAgICAgc3RydWN0IHRhc2tsZXRfc3RydWN0IHRxOworICAgICAgICAgICAgICAgIHNwaW5sb2NrX3QgbG9jazsKKyAgICAgICAgfSBpc29fcmN2OworCisJdTMyIGkyY19kcml2ZW5fc3RhdGU7IC8qIHRoZSBzdGF0ZSB3ZSBjdXJyZW50bHkgZHJpdmUgdGhlIFNlcmlhbCBFRVBST00gQ29udHJvbCByZWdpc3RlciAqLworfTsKKworLyogdGhlIHBlci1maWxlIGRhdGEgc3RydWN0dXJlIGZvciBtZW0gc3BhY2UgYWNjZXNzICovCitzdHJ1Y3QgbWVtZGF0YSB7CisgICAgICAgIHN0cnVjdCB0aV9seW54ICpseW54OworICAgICAgICBpbnQgY2lkOworICAgICAgICBhdG9taWNfdCBhdXhfaW50cl9sYXN0X3NlZW47CisJLyogZW51bSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIExCVVNfQUREUl9TRUxfKiB2YWx1ZXMgYmVsb3cgKi8KKyAgICAgICAgZW51bSB7IHJvbSA9IDB4MTAwMDAsIGF1eCA9IDB4MjAwMDAsIHJhbSA9IDAgfSB0eXBlOworfTsKKworCisKKy8qCisgKiBSZWdpc3RlciByZWFkIGFuZCB3cml0ZSBoZWxwZXIgZnVuY3Rpb25zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnX3dyaXRlKGNvbnN0IHN0cnVjdCB0aV9seW54ICpseW54LCBpbnQgb2Zmc2V0LCB1MzIgZGF0YSkKK3sKKyAgICAgICAgd3JpdGVsKGRhdGEsIGx5bngtPnJlZ2lzdGVycyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJlZ19yZWFkKGNvbnN0IHN0cnVjdCB0aV9seW54ICpseW54LCBpbnQgb2Zmc2V0KQoreworICAgICAgICByZXR1cm4gcmVhZGwobHlueC0+cmVnaXN0ZXJzICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlZ19zZXRfYml0cyhjb25zdCBzdHJ1Y3QgdGlfbHlueCAqbHlueCwgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIG1hc2spCit7CisgICAgICAgIHJlZ193cml0ZShseW54LCBvZmZzZXQsIChyZWdfcmVhZChseW54LCBvZmZzZXQpIHwgbWFzaykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnX2NsZWFyX2JpdHMoY29uc3Qgc3RydWN0IHRpX2x5bnggKmx5bngsIGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIG1hc2spCit7CisgICAgICAgIHJlZ193cml0ZShseW54LCBvZmZzZXQsIChyZWdfcmVhZChseW54LCBvZmZzZXQpICYgfm1hc2spKTsKK30KKworCisKKy8qIGNoaXAgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9sbG93ICovCisKKyNkZWZpbmUgUENJX0xBVEVOQ1lfQ0FDSEVMSU5FICAgICAgICAgICAgIDB4MGMKKworI2RlZmluZSBNSVNDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBNSVNDX0NPTlRST0xfU1dSRVNFVCAgICAgICAgICAgICAgKDE8PDApCisKKyNkZWZpbmUgU0VSSUFMX0VFUFJPTV9DT05UUk9MICAgICAgICAgICAgIDB4NDQKKworI2RlZmluZSBQQ0lfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg0OAorI2RlZmluZSBQQ0lfSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgMHg0YworLyogc3RhdHVzIGFuZCBlbmFibGUgaGF2ZSBpZGVudGljYWwgYml0IG51bWJlcnMgKi8KKyNkZWZpbmUgUENJX0lOVF9JTlRfUEVORCAgICAgICAgICAgICAgICAgICgxPDwzMSkKKyNkZWZpbmUgUENJX0lOVF9GT1JDRURfSU5UICAgICAgICAgICAgICAgICgxPDwzMCkKKyNkZWZpbmUgUENJX0lOVF9TTFZfQURSX1BFUlIgICAgICAgICAgICAgICgxPDwyOCkKKyNkZWZpbmUgUENJX0lOVF9TTFZfREFUX1BFUlIgICAgICAgICAgICAgICgxPDwyNykKKyNkZWZpbmUgUENJX0lOVF9NU1RfREFUX1BFUlIgICAgICAgICAgICAgICgxPDwyNikKKyNkZWZpbmUgUENJX0lOVF9NU1RfREVWX1RJTUVPVVQgICAgICAgICAgICgxPDwyNSkKKyNkZWZpbmUgUENJX0lOVF9JTlRFUk5BTF9TTFZfVElNRU9VVCAgICAgICgxPDwyMykKKyNkZWZpbmUgUENJX0lOVF9BVVhfVElNRU9VVCAgICAgICAgICAgICAgICgxPDwxOCkKKyNkZWZpbmUgUENJX0lOVF9BVVhfSU5UICAgICAgICAgICAgICAgICAgICgxPDwxNykKKyNkZWZpbmUgUENJX0lOVF8xMzk0ICAgICAgICAgICAgICAgICAgICAgICgxPDwxNikKKyNkZWZpbmUgUENJX0lOVF9ETUE0X1BDTCAgICAgICAgICAgICAgICAgICgxPDw5KQorI2RlZmluZSBQQ0lfSU5UX0RNQTRfSExUICAgICAgICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIFBDSV9JTlRfRE1BM19QQ0wgICAgICAgICAgICAgICAgICAoMTw8NykKKyNkZWZpbmUgUENJX0lOVF9ETUEzX0hMVCAgICAgICAgICAgICAgICAgICgxPDw2KQorI2RlZmluZSBQQ0lfSU5UX0RNQTJfUENMICAgICAgICAgICAgICAgICAgKDE8PDUpCisjZGVmaW5lIFBDSV9JTlRfRE1BMl9ITFQgICAgICAgICAgICAgICAgICAoMTw8NCkKKyNkZWZpbmUgUENJX0lOVF9ETUExX1BDTCAgICAgICAgICAgICAgICAgICgxPDwzKQorI2RlZmluZSBQQ0lfSU5UX0RNQTFfSExUICAgICAgICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFBDSV9JTlRfRE1BMF9QQ0wgICAgICAgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgUENJX0lOVF9ETUEwX0hMVCAgICAgICAgICAgICAgICAgICgxPDwwKQorLyogYWxsIERNQSBpbnRlcnJ1cHRzIGNvbWJpbmVkOiAqLworI2RlZmluZSBQQ0lfSU5UX0RNQV9BTEwgICAgICAgICAgICAgICAgICAgMHgzZmYKKworI2RlZmluZSBQQ0lfSU5UX0RNQV9ITFQoY2hhbikgICAgICAgICAgICAgKDEgPDwgKGNoYW4gKiAyKSkKKyNkZWZpbmUgUENJX0lOVF9ETUFfUENMKGNoYW4pICAgICAgICAgICAgICgxIDw8IChjaGFuICogMiArIDEpKQorCisjZGVmaW5lIExCVVNfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAweGI0CisjZGVmaW5lIExCVVNfQUREUl9TRUxfUkFNICAgICAgICAgICAgICAgICAoMHgwPDwxNikKKyNkZWZpbmUgTEJVU19BRERSX1NFTF9ST00gICAgICAgICAgICAgICAgICgweDE8PDE2KQorI2RlZmluZSBMQlVTX0FERFJfU0VMX0FVWCAgICAgICAgICAgICAgICAgKDB4Mjw8MTYpCisjZGVmaW5lIExCVVNfQUREUl9TRUxfWlYgICAgICAgICAgICAgICAgICAoMHgzPDwxNikKKworI2RlZmluZSBHUElPX0NUUkxfQSAgICAgICAgICAgICAgICAgICAgICAgMHhiOAorI2RlZmluZSBHUElPX0NUUkxfQiAgICAgICAgICAgICAgICAgICAgICAgMHhiYworI2RlZmluZSBHUElPX0RBVEFfQkFTRSAgICAgICAgICAgICAgICAgICAgMHhjMAorCisjZGVmaW5lIERNQV9CUkVHKGJhc2UsIGNoYW4pICAgICAgICAgICAgICAoYmFzZSArIGNoYW4gKiAweDIwKQorI2RlZmluZSBETUFfU1JFRyhiYXNlLCBjaGFuKSAgICAgICAgICAgICAgKGJhc2UgKyBjaGFuICogMHgxMCkKKworI2RlZmluZSBETUEwX1BSRVZfUENMICAgICAgICAgICAgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgRE1BMV9QUkVWX1BDTCAgICAgICAgICAgICAgICAgICAgIDB4MTIwCisjZGVmaW5lIERNQTJfUFJFVl9QQ0wgICAgICAgICAgICAgICAgICAgICAweDE0MAorI2RlZmluZSBETUEzX1BSRVZfUENMICAgICAgICAgICAgICAgICAgICAgMHgxNjAKKyNkZWZpbmUgRE1BNF9QUkVWX1BDTCAgICAgICAgICAgICAgICAgICAgIDB4MTgwCisjZGVmaW5lIERNQV9QUkVWX1BDTChjaGFuKSAgICAgICAgICAgICAgICAoRE1BX0JSRUcoRE1BMF9QUkVWX1BDTCwgY2hhbikpCisKKyNkZWZpbmUgRE1BMF9DVVJSRU5UX1BDTCAgICAgICAgICAgICAgICAgIDB4MTA0CisjZGVmaW5lIERNQTFfQ1VSUkVOVF9QQ0wgICAgICAgICAgICAgICAgICAweDEyNAorI2RlZmluZSBETUEyX0NVUlJFTlRfUENMICAgICAgICAgICAgICAgICAgMHgxNDQKKyNkZWZpbmUgRE1BM19DVVJSRU5UX1BDTCAgICAgICAgICAgICAgICAgIDB4MTY0CisjZGVmaW5lIERNQTRfQ1VSUkVOVF9QQ0wgICAgICAgICAgICAgICAgICAweDE4NAorI2RlZmluZSBETUFfQ1VSUkVOVF9QQ0woY2hhbikgICAgICAgICAgICAgKERNQV9CUkVHKERNQTBfQ1VSUkVOVF9QQ0wsIGNoYW4pKQorCisjZGVmaW5lIERNQTBfQ0hBTl9TVEFUICAgICAgICAgICAgICAgICAgICAweDEwYworI2RlZmluZSBETUExX0NIQU5fU1RBVCAgICAgICAgICAgICAgICAgICAgMHgxMmMKKyNkZWZpbmUgRE1BMl9DSEFOX1NUQVQgICAgICAgICAgICAgICAgICAgIDB4MTRjCisjZGVmaW5lIERNQTNfQ0hBTl9TVEFUICAgICAgICAgICAgICAgICAgICAweDE2YworI2RlZmluZSBETUE0X0NIQU5fU1RBVCAgICAgICAgICAgICAgICAgICAgMHgxOGMKKyNkZWZpbmUgRE1BX0NIQU5fU1RBVChjaGFuKSAgICAgICAgICAgICAgIChETUFfQlJFRyhETUEwX0NIQU5fU1RBVCwgY2hhbikpCisvKiBDSEFOX1NUQVRVUyByZWdpc3RlcnMgc2hhcmUgYml0cyAqLworI2RlZmluZSBETUFfQ0hBTl9TVEFUX1NFTEZJRCAgICAgICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBETUFfQ0hBTl9TVEFUX0lTT1BLVCAgICAgICAgICAgICAgKDE8PDMwKQorI2RlZmluZSBETUFfQ0hBTl9TVEFUX1BDSUVSUiAgICAgICAgICAgICAgKDE8PDI5KQorI2RlZmluZSBETUFfQ0hBTl9TVEFUX1BLVEVSUiAgICAgICAgICAgICAgKDE8PDI4KQorI2RlZmluZSBETUFfQ0hBTl9TVEFUX1BLVENNUEwgICAgICAgICAgICAgKDE8PDI3KQorI2RlZmluZSBETUFfQ0hBTl9TVEFUX1NQRUNJQUxBQ0sgICAgICAgICAgKDE8PDE0KQorCisKKyNkZWZpbmUgRE1BMF9DSEFOX0NUUkwgICAgICAgICAgICAgICAgICAgIDB4MTEwCisjZGVmaW5lIERNQTFfQ0hBTl9DVFJMICAgICAgICAgICAgICAgICAgICAweDEzMAorI2RlZmluZSBETUEyX0NIQU5fQ1RSTCAgICAgICAgICAgICAgICAgICAgMHgxNTAKKyNkZWZpbmUgRE1BM19DSEFOX0NUUkwgICAgICAgICAgICAgICAgICAgIDB4MTcwCisjZGVmaW5lIERNQTRfQ0hBTl9DVFJMICAgICAgICAgICAgICAgICAgICAweDE5MAorI2RlZmluZSBETUFfQ0hBTl9DVFJMKGNoYW4pICAgICAgICAgICAgICAgKERNQV9CUkVHKERNQTBfQ0hBTl9DVFJMLCBjaGFuKSkKKy8qIENIQU5fQ1RSTCByZWdpc3RlcnMgc2hhcmUgYml0cyAqLworI2RlZmluZSBETUFfQ0hBTl9DVFJMX0VOQUJMRSAgICAgICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBETUFfQ0hBTl9DVFJMX0JVU1kgICAgICAgICAgICAgICAgKDE8PDMwKQorI2RlZmluZSBETUFfQ0hBTl9DVFJMX0xJTksgICAgICAgICAgICAgICAgKDE8PDI5KQorCisjZGVmaW5lIERNQTBfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgICAweDExNAorI2RlZmluZSBETUExX1JFQURZICAgICAgICAgICAgICAgICAgICAgICAgMHgxMzQKKyNkZWZpbmUgRE1BMl9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTU0CisjZGVmaW5lIERNQTNfUkVBRFkgICAgICAgICAgICAgICAgICAgICAgICAweDE3NAorI2RlZmluZSBETUE0X1JFQURZICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTQKKyNkZWZpbmUgRE1BX1JFQURZKGNoYW4pICAgICAgICAgICAgICAgICAgIChETUFfQlJFRyhETUEwX1JFQURZLCBjaGFuKSkKKworI2RlZmluZSBETUFfR0xPQkFMX1JFR0lTVEVSICAgICAgICAgICAgICAgMHg5MDgKKworI2RlZmluZSBGSUZPX1NJWkVTICAgICAgICAgICAgICAgICAgICAgICAgMHhhMDAKKworI2RlZmluZSBGSUZPX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgMHhhMTAKKyNkZWZpbmUgRklGT19DT05UUk9MX0dSRl9GTFVTSCAgICAgICAgICAgICgxPDw0KQorI2RlZmluZSBGSUZPX0NPTlRST0xfSVRGX0ZMVVNIICAgICAgICAgICAgKDE8PDMpCisjZGVmaW5lIEZJRk9fQ09OVFJPTF9BVEZfRkxVU0ggICAgICAgICAgICAoMTw8MikKKworI2RlZmluZSBGSUZPX1hNSVRfVEhSRVNIT0xEICAgICAgICAgICAgICAgMHhhMTQKKworI2RlZmluZSBETUEwX1dPUkQwX0NNUF9WQUxVRSAgICAgICAgICAgICAgMHhiMDAKKyNkZWZpbmUgRE1BMV9XT1JEMF9DTVBfVkFMVUUgICAgICAgICAgICAgIDB4YjEwCisjZGVmaW5lIERNQTJfV09SRDBfQ01QX1ZBTFVFICAgICAgICAgICAgICAweGIyMAorI2RlZmluZSBETUEzX1dPUkQwX0NNUF9WQUxVRSAgICAgICAgICAgICAgMHhiMzAKKyNkZWZpbmUgRE1BNF9XT1JEMF9DTVBfVkFMVUUgICAgICAgICAgICAgIDB4YjQwCisjZGVmaW5lIERNQV9XT1JEMF9DTVBfVkFMVUUoY2hhbikgICAgICAgICAoRE1BX1NSRUcoRE1BMF9XT1JEMF9DTVBfVkFMVUUsIGNoYW4pKQorCisjZGVmaW5lIERNQTBfV09SRDBfQ01QX0VOQUJMRSAgICAgICAgICAgICAweGIwNAorI2RlZmluZSBETUExX1dPUkQwX0NNUF9FTkFCTEUgICAgICAgICAgICAgMHhiMTQKKyNkZWZpbmUgRE1BMl9XT1JEMF9DTVBfRU5BQkxFICAgICAgICAgICAgIDB4YjI0CisjZGVmaW5lIERNQTNfV09SRDBfQ01QX0VOQUJMRSAgICAgICAgICAgICAweGIzNAorI2RlZmluZSBETUE0X1dPUkQwX0NNUF9FTkFCTEUgICAgICAgICAgICAgMHhiNDQKKyNkZWZpbmUgRE1BX1dPUkQwX0NNUF9FTkFCTEUoY2hhbikgICAgICAgIChETUFfU1JFRyhETUEwX1dPUkQwX0NNUF9FTkFCTEUsY2hhbikpCisKKyNkZWZpbmUgRE1BMF9XT1JEMV9DTVBfVkFMVUUgICAgICAgICAgICAgIDB4YjA4CisjZGVmaW5lIERNQTFfV09SRDFfQ01QX1ZBTFVFICAgICAgICAgICAgICAweGIxOAorI2RlZmluZSBETUEyX1dPUkQxX0NNUF9WQUxVRSAgICAgICAgICAgICAgMHhiMjgKKyNkZWZpbmUgRE1BM19XT1JEMV9DTVBfVkFMVUUgICAgICAgICAgICAgIDB4YjM4CisjZGVmaW5lIERNQTRfV09SRDFfQ01QX1ZBTFVFICAgICAgICAgICAgICAweGI0OAorI2RlZmluZSBETUFfV09SRDFfQ01QX1ZBTFVFKGNoYW4pICAgICAgICAgKERNQV9TUkVHKERNQTBfV09SRDFfQ01QX1ZBTFVFLCBjaGFuKSkKKworI2RlZmluZSBETUEwX1dPUkQxX0NNUF9FTkFCTEUgICAgICAgICAgICAgMHhiMGMKKyNkZWZpbmUgRE1BMV9XT1JEMV9DTVBfRU5BQkxFICAgICAgICAgICAgIDB4YjFjCisjZGVmaW5lIERNQTJfV09SRDFfQ01QX0VOQUJMRSAgICAgICAgICAgICAweGIyYworI2RlZmluZSBETUEzX1dPUkQxX0NNUF9FTkFCTEUgICAgICAgICAgICAgMHhiM2MKKyNkZWZpbmUgRE1BNF9XT1JEMV9DTVBfRU5BQkxFICAgICAgICAgICAgIDB4YjRjCisjZGVmaW5lIERNQV9XT1JEMV9DTVBfRU5BQkxFKGNoYW4pICAgICAgICAoRE1BX1NSRUcoRE1BMF9XT1JEMV9DTVBfRU5BQkxFLGNoYW4pKQorLyogd29yZCAxIGNvbXBhcmUgZW5hYmxlIGZsYWdzICovCisjZGVmaW5lIERNQV9XT1JEMV9DTVBfTUFUQ0hfT1RIRVJCVVMgICAgICAoMTw8MTUpCisjZGVmaW5lIERNQV9XT1JEMV9DTVBfTUFUQ0hfQlJPQURDQVNUICAgICAoMTw8MTQpCisjZGVmaW5lIERNQV9XT1JEMV9DTVBfTUFUQ0hfQlVTX0JDQVNUICAgICAoMTw8MTMpCisjZGVmaW5lIERNQV9XT1JEMV9DTVBfTUFUQ0hfTE9DQUxfTk9ERSAgICAoMTw8MTIpCisjZGVmaW5lIERNQV9XT1JEMV9DTVBfTUFUQ0hfRVhBQ1QgICAgICAgICAoMTw8MTEpCisjZGVmaW5lIERNQV9XT1JEMV9DTVBfRU5BQkxFX1NFTEZfSUQgICAgICAoMTw8MTApCisjZGVmaW5lIERNQV9XT1JEMV9DTVBfRU5BQkxFX01BU1RFUiAgICAgICAoMTw8OCkKKworI2RlZmluZSBMSU5LX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMDAKKyNkZWZpbmUgTElOS19JRF9CVVMoaWQpICAgICAgICAgICAgICAgICAgIChpZDw8MjIpCisjZGVmaW5lIExJTktfSURfTk9ERShpZCkgICAgICAgICAgICAgICAgICAoaWQ8PDE2KQorCisjZGVmaW5lIExJTktfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAweGYwNAorI2RlZmluZSBMSU5LX0NPTlRST0xfQlVTWSAgICAgICAgICAgICAgICAgKDE8PDI5KQorI2RlZmluZSBMSU5LX0NPTlRST0xfVFhfSVNPX0VOICAgICAgICAgICAgKDE8PDI2KQorI2RlZmluZSBMSU5LX0NPTlRST0xfUlhfSVNPX0VOICAgICAgICAgICAgKDE8PDI1KQorI2RlZmluZSBMSU5LX0NPTlRST0xfVFhfQVNZTkNfRU4gICAgICAgICAgKDE8PDI0KQorI2RlZmluZSBMSU5LX0NPTlRST0xfUlhfQVNZTkNfRU4gICAgICAgICAgKDE8PDIzKQorI2RlZmluZSBMSU5LX0NPTlRST0xfUkVTRVRfVFggICAgICAgICAgICAgKDE8PDIxKQorI2RlZmluZSBMSU5LX0NPTlRST0xfUkVTRVRfUlggICAgICAgICAgICAgKDE8PDIwKQorI2RlZmluZSBMSU5LX0NPTlRST0xfQ1lDTUFTVEVSICAgICAgICAgICAgKDE8PDExKQorI2RlZmluZSBMSU5LX0NPTlRST0xfQ1lDU09VUkNFICAgICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBMSU5LX0NPTlRST0xfQ1lDVElNRVJFTiAgICAgICAgICAgKDE8PDkpCisjZGVmaW5lIExJTktfQ09OVFJPTF9SQ1ZfQ01QX1ZBTElEICAgICAgICAoMTw8NykKKyNkZWZpbmUgTElOS19DT05UUk9MX1NOT09QX0VOQUJMRSAgICAgICAgICgxPDw2KQorCisjZGVmaW5lIENZQ0xFX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAweGYwOAorCisjZGVmaW5lIExJTktfUEhZICAgICAgICAgICAgICAgICAgICAgICAgICAweGYwYworI2RlZmluZSBMSU5LX1BIWV9SRUFEICAgICAgICAgICAgICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBMSU5LX1BIWV9XUklURSAgICAgICAgICAgICAgICAgICAgKDE8PDMwKQorI2RlZmluZSBMSU5LX1BIWV9BRERSKGFkZHIpICAgICAgICAgICAgICAgKGFkZHI8PDI0KQorI2RlZmluZSBMSU5LX1BIWV9XREFUQShkYXRhKSAgICAgICAgICAgICAgKGRhdGE8PDE2KQorI2RlZmluZSBMSU5LX1BIWV9SQUREUihhZGRyKSAgICAgICAgICAgICAgKGFkZHI8PDgpCisKKworI2RlZmluZSBMSU5LX0lOVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHhmMTQKKyNkZWZpbmUgTElOS19JTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgIDB4ZjE4CisvKiBzdGF0dXMgYW5kIGVuYWJsZSBoYXZlIGlkZW50aWNhbCBiaXQgbnVtYmVycyAqLworI2RlZmluZSBMSU5LX0lOVF9MSU5LX0lOVCAgICAgICAgICAgICAgICAgKDE8PDMxKQorI2RlZmluZSBMSU5LX0lOVF9QSFlfVElNRU9VVCAgICAgICAgICAgICAgKDE8PDMwKQorI2RlZmluZSBMSU5LX0lOVF9QSFlfUkVHX1JDVkQgICAgICAgICAgICAgKDE8PDI5KQorI2RlZmluZSBMSU5LX0lOVF9QSFlfQlVTUkVTRVQgICAgICAgICAgICAgKDE8PDI4KQorI2RlZmluZSBMSU5LX0lOVF9UWF9SRFkgICAgICAgICAgICAgICAgICAgKDE8PDI2KQorI2RlZmluZSBMSU5LX0lOVF9SWF9EQVRBX1JEWSAgICAgICAgICAgICAgKDE8PDI1KQorI2RlZmluZSBMSU5LX0lOVF9JU09fU1RVQ0sgICAgICAgICAgICAgICAgKDE8PDIwKQorI2RlZmluZSBMSU5LX0lOVF9BU1lOQ19TVFVDSyAgICAgICAgICAgICAgKDE8PDE5KQorI2RlZmluZSBMSU5LX0lOVF9TRU5UX1JFSkVDVCAgICAgICAgICAgICAgKDE8PDE3KQorI2RlZmluZSBMSU5LX0lOVF9IRFJfRVJSICAgICAgICAgICAgICAgICAgKDE8PDE2KQorI2RlZmluZSBMSU5LX0lOVF9UWF9JTlZBTElEX1RDICAgICAgICAgICAgKDE8PDE1KQorI2RlZmluZSBMSU5LX0lOVF9DWUNfU0VDT05EICAgICAgICAgICAgICAgKDE8PDExKQorI2RlZmluZSBMSU5LX0lOVF9DWUNfU1RBUlQgICAgICAgICAgICAgICAgKDE8PDEwKQorI2RlZmluZSBMSU5LX0lOVF9DWUNfRE9ORSAgICAgICAgICAgICAgICAgKDE8PDkpCisjZGVmaW5lIExJTktfSU5UX0NZQ19QRU5ESU5HICAgICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgTElOS19JTlRfQ1lDX0xPU1QgICAgICAgICAgICAgICAgICgxPDw3KQorI2RlZmluZSBMSU5LX0lOVF9DWUNfQVJCX0ZBSUxFRCAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIExJTktfSU5UX0dSRl9PVkVSRkxPVyAgICAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgTElOS19JTlRfSVRGX1VOREVSRkxPVyAgICAgICAgICAgICgxPDw0KQorI2RlZmluZSBMSU5LX0lOVF9BVEZfVU5ERVJGTE9XICAgICAgICAgICAgKDE8PDMpCisjZGVmaW5lIExJTktfSU5UX0lTT0FSQl9GQUlMRUQgICAgICAgICAgICAoMTw8MCkKKworLyogUEhZIHNwZWNpZmljcyAqLworI2RlZmluZSBQSFlfVkVORE9SSURfVEkgICAgICAgICAgICAgICAgIDB4ODAwMDI4CisjZGVmaW5lIFBIWV9QUk9EVUNUSURfVFNCNDFMVjAzICAgICAgICAgMHgwMDAwMDAKKworCisvKiB0aGlzIGlzIHRoZSBwaHlzaWNhbCBsYXlvdXQgb2YgYSBQQ0wsIGl0cyBzaXplIGlzIDEyOCBieXRlcyAqLworc3RydWN0IHRpX3BjbCB7CisgICAgICAgIHUzMiBuZXh0OworICAgICAgICB1MzIgYXN5bmNfZXJyb3JfbmV4dDsKKyAgICAgICAgdTMyIHVzZXJfZGF0YTsKKyAgICAgICAgdTMyIHBjbF9zdGF0dXM7CisgICAgICAgIHUzMiByZW1haW5pbmdfdHJhbnNmZXJfY291bnQ7CisgICAgICAgIHUzMiBuZXh0X2RhdGFfYnVmZmVyOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIHUzMiBjb250cm9sOworICAgICAgICAgICAgICAgIHUzMiBwb2ludGVyOworICAgICAgICB9IGJ1ZmZlclsxM10gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNkZWZpbmUgcGNsb2ZmcyhNRU1CRVIpIChvZmZzZXRvZihzdHJ1Y3QgdGlfcGNsLCBNRU1CRVIpKQorCisKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9MT0NBTFJBTQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3BjbChjb25zdCBzdHJ1Y3QgdGlfbHlueCAqbHlueCwgcGNsX3QgcGNsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGlfcGNsICpwY2wpCit7CisgICAgICAgIGludCBpOworICAgICAgICB1MzIgKmluID0gKHUzMiAqKXBjbDsKKyAgICAgICAgdTMyICpvdXQgPSAodTMyICopKGx5bngtPmxvY2FsX3JhbSArIHBjbGlkICogc2l6ZW9mKHN0cnVjdCB0aV9wY2wpKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKywgb3V0KyssIGluKyspIHsKKyAgICAgICAgICAgICAgICB3cml0ZWwoKmluLCBvdXQpOworICAgICAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfcGNsKGNvbnN0IHN0cnVjdCB0aV9seW54ICpseW54LCBwY2xfdCBwY2xpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aV9wY2wgKnBjbCkKK3sKKyAgICAgICAgaW50IGk7CisgICAgICAgIHUzMiAqb3V0ID0gKHUzMiAqKXBjbDsKKyAgICAgICAgdTMyICppbiA9ICh1MzIgKikobHlueC0+bG9jYWxfcmFtICsgcGNsaWQgKiBzaXplb2Yoc3RydWN0IHRpX3BjbCkpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrLCBvdXQrKywgaW4rKykgeworICAgICAgICAgICAgICAgICpvdXQgPSByZWFkbChpbik7CisgICAgICAgIH0KK30KKworc3RhdGljIGlubGluZSB1MzIgcGNsX2J1cyhjb25zdCBzdHJ1Y3QgdGlfbHlueCAqbHlueCwgcGNsX3QgcGNsaWQpCit7CisgICAgICAgIHJldHVybiBwY2lfcmVzb3VyY2Vfc3RhcnQobHlueC0+ZGV2LCAxKSArIHBjbGlkICogc2l6ZW9mKHN0cnVjdCB0aV9wY2wpOworfQorCisjZWxzZSAvKiBDT05GSUdfSUVFRTEzOTRfUENJTFlOWF9MT0NBTFJBTSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3BjbChjb25zdCBzdHJ1Y3QgdGlfbHlueCAqbHlueCwgcGNsX3QgcGNsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGlfcGNsICpwY2wpCit7CisgICAgICAgIG1lbWNweV9sZTMyKCh1MzIgKikobHlueC0+cGNsX21lbSArIHBjbGlkICogc2l6ZW9mKHN0cnVjdCB0aV9wY2wpKSwKKyAgICAgICAgICAgICAgICAgICAgKHUzMiAqKXBjbCwgc2l6ZW9mKHN0cnVjdCB0aV9wY2wpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdldF9wY2woY29uc3Qgc3RydWN0IHRpX2x5bnggKmx5bngsIHBjbF90IHBjbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpX3BjbCAqcGNsKQoreworICAgICAgICBtZW1jcHlfbGUzMigodTMyICopcGNsLAorICAgICAgICAgICAgICAgICAgICAodTMyICopKGx5bngtPnBjbF9tZW0gKyBwY2xpZCAqIHNpemVvZihzdHJ1Y3QgdGlfcGNsKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgdGlfcGNsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHBjbF9idXMoY29uc3Qgc3RydWN0IHRpX2x5bnggKmx5bngsIHBjbF90IHBjbGlkKQoreworICAgICAgICByZXR1cm4gbHlueC0+cGNsX21lbV9kbWEgKyBwY2xpZCAqIHNpemVvZihzdHJ1Y3QgdGlfcGNsKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX0xPQ0FMUkFNICovCisKKworI2lmIGRlZmluZWQgKENPTkZJR19JRUVFMTM5NF9QQ0lMWU5YX0xPQ0FMUkFNKSB8fCBkZWZpbmVkIChfX0JJR19FTkRJQU4pCit0eXBlZGVmIHN0cnVjdCB0aV9wY2wgcGNsdG1wX3Q7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRpX3BjbCAqZWRpdF9wY2woY29uc3Qgc3RydWN0IHRpX2x5bnggKmx5bngsIHBjbF90IHBjbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2x0bXBfdCAqdG1wKQoreworICAgICAgICBnZXRfcGNsKGx5bngsIHBjbGlkLCB0bXApOworICAgICAgICByZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29tbWl0X3BjbChjb25zdCBzdHJ1Y3QgdGlfbHlueCAqbHlueCwgcGNsX3QgcGNsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2x0bXBfdCAqdG1wKQoreworICAgICAgICBwdXRfcGNsKGx5bngsIHBjbGlkLCB0bXApOworfQorCisjZWxzZQordHlwZWRlZiBpbnQgcGNsdG1wX3Q7IC8qIGp1c3QgYSBkdW1teSAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aV9wY2wgKmVkaXRfcGNsKGNvbnN0IHN0cnVjdCB0aV9seW54ICpseW54LCBwY2xfdCBwY2xpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNsdG1wX3QgKnRtcCkKK3sKKyAgICAgICAgcmV0dXJuIGx5bngtPnBjbF9tZW0gKyBwY2xpZCAqIHNpemVvZihzdHJ1Y3QgdGlfcGNsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbW1pdF9wY2woY29uc3Qgc3RydWN0IHRpX2x5bnggKmx5bngsIHBjbF90IHBjbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNsdG1wX3QgKnRtcCkKK3sKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydW5fc3ViX3BjbChjb25zdCBzdHJ1Y3QgdGlfbHlueCAqbHlueCwgcGNsX3QgcGNsaWQsIGludCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRtYWNoYW4pCit7CisgICAgICAgIHJlZ193cml0ZShseW54LCBETUEwX0NVUlJFTlRfUENMICsgZG1hY2hhbiAqIDB4MjAsCisgICAgICAgICAgICAgICAgICBwY2xfYnVzKGx5bngsIHBjbGlkKSArIGlkeCAqIDQpOworICAgICAgICByZWdfd3JpdGUobHlueCwgRE1BMF9DSEFOX0NUUkwgKyBkbWFjaGFuICogMHgyMCwKKyAgICAgICAgICAgICAgICAgIERNQV9DSEFOX0NUUkxfRU5BQkxFIHwgRE1BX0NIQU5fQ1RSTF9MSU5LKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ1bl9wY2woY29uc3Qgc3RydWN0IHRpX2x5bnggKmx5bngsIHBjbF90IHBjbGlkLCBpbnQgZG1hY2hhbikKK3sKKyAgICAgICAgcnVuX3N1Yl9wY2wobHlueCwgcGNsaWQsIDAsIGRtYWNoYW4pOworfQorCisjZGVmaW5lIFBDTF9ORVhUX0lOVkFMSUQgKDE8PDApCisKKy8qIHRyYW5zZmVyIGNvbW1hbmRzICovCisjZGVmaW5lIFBDTF9DTURfUkNWICAgICAgICAgICAgKDB4MTw8MjQpCisjZGVmaW5lIFBDTF9DTURfUkNWX0FORF9VUERBVEUgKDB4YTw8MjQpCisjZGVmaW5lIFBDTF9DTURfWE1UICAgICAgICAgICAgKDB4Mjw8MjQpCisjZGVmaW5lIFBDTF9DTURfVU5GWE1UICAgICAgICAgKDB4Yzw8MjQpCisjZGVmaW5lIFBDTF9DTURfUENJX1RPX0xCVVMgICAgKDB4ODw8MjQpCisjZGVmaW5lIFBDTF9DTURfTEJVU19UT19QQ0kgICAgKDB4OTw8MjQpCisKKy8qIGF1eCBjb21tYW5kcyAqLworI2RlZmluZSBQQ0xfQ01EX05PUCAgICAgICAgICAgICgweDA8PDI0KQorI2RlZmluZSBQQ0xfQ01EX0xPQUQgICAgICAgICAgICgweDM8PDI0KQorI2RlZmluZSBQQ0xfQ01EX1NUT1JFUSAgICAgICAgICgweDQ8PDI0KQorI2RlZmluZSBQQ0xfQ01EX1NUT1JFRCAgICAgICAgICgweGI8PDI0KQorI2RlZmluZSBQQ0xfQ01EX1NUT1JFMCAgICAgICAgICgweDU8PDI0KQorI2RlZmluZSBQQ0xfQ01EX1NUT1JFMSAgICAgICAgICgweDY8PDI0KQorI2RlZmluZSBQQ0xfQ01EX0NPTVBBUkUgICAgICAgICgweGU8PDI0KQorI2RlZmluZSBQQ0xfQ01EX1NXQVBfQ09NUEFSRSAgICgweGY8PDI0KQorI2RlZmluZSBQQ0xfQ01EX0FERCAgICAgICAgICAgICgweGQ8PDI0KQorI2RlZmluZSBQQ0xfQ01EX0JSQU5DSCAgICAgICAgICgweDc8PDI0KQorCisvKiBCUkFOQ0ggY29uZGl0aW9uIGNvZGVzICovCisjZGVmaW5lIFBDTF9DT05EX0RNQVJEWV9TRVQgICAgKDB4MTw8MjApCisjZGVmaW5lIFBDTF9DT05EX0RNQVJEWV9DTEVBUiAgKDB4Mjw8MjApCisKKyNkZWZpbmUgUENMX0dFTl9JTlRSICAgICAgICAgICAoMTw8MTkpCisjZGVmaW5lIFBDTF9MQVNUX0JVRkYgICAgICAgICAgKDE8PDE4KQorI2RlZmluZSBQQ0xfTEFTVF9DTUQgICAgICAgICAgIChQQ0xfTEFTVF9CVUZGKQorI2RlZmluZSBQQ0xfV0FJVFNUQVQgICAgICAgICAgICgxPDwxNykKKyNkZWZpbmUgUENMX0JJR0VORElBTiAgICAgICAgICAoMTw8MTYpCisjZGVmaW5lIFBDTF9JU09NT0RFICAgICAgICAgICAgKDE8PDEyKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC1wcml2YXRlLmggYi9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQtcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzU4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQtcHJpdmF0ZS5oCkBAIC0wLDAgKzEsODYgQEAKKyNpZm5kZWYgSUVFRTEzOTRfUkFXMTM5NF9QUklWQVRFX0gKKyNkZWZpbmUgSUVFRTEzOTRfUkFXMTM5NF9QUklWQVRFX0gKKworLyogaGVhZGVyIGZvciBkZWZpbml0aW9ucyB0aGF0IGFyZSBwcml2YXRlIHRvIHRoZSByYXcxMzk0IGRyaXZlcgorICAgYW5kIG5vdCB2aXNpYmxlIHRvIHVzZXItc3BhY2UgKi8KKworI2RlZmluZSBSQVcxMzk0X0RFVklDRV9NQUpPUiAgICAgIDE3MQorI2RlZmluZSBSQVcxMzk0X0RFVklDRV9OQU1FICAgICAgICJyYXcxMzk0IgorCisjZGVmaW5lIFJBVzEzOTRfTUFYX1VTRVJfQ1NSX0RJUlMJMTYKKworc3RydWN0IGlzb19ibG9ja19zdG9yZSB7CisgICAgICAgIGF0b21pY190IHJlZmNvdW50OworICAgICAgICBzaXplX3QgZGF0YV9zaXplOworICAgICAgICBxdWFkbGV0X3QgZGF0YVswXTsKK307CisKK2VudW0gcmF3MTM5NF9pc29fc3RhdGUgeyBSQVcxMzk0X0lTT19JTkFDVElWRSA9IDAsCisJCQkgUkFXMTM5NF9JU09fUkVDViA9IDEsCisJCQkgUkFXMTM5NF9JU09fWE1JVCA9IDIgfTsKKworc3RydWN0IGZpbGVfaW5mbyB7CisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworICAgICAgICBlbnVtIHsgb3BlbmVkLCBpbml0aWFsaXplZCwgY29ubmVjdGVkIH0gc3RhdGU7CisgICAgICAgIHVuc2lnbmVkIGludCBwcm90b2NvbF92ZXJzaW9uOworCisgICAgICAgIHN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CisKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCByZXFfcGVuZGluZzsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCByZXFfY29tcGxldGU7CisgICAgICAgIHN0cnVjdCBzZW1hcGhvcmUgY29tcGxldGVfc2VtOworICAgICAgICBzcGlubG9ja190IHJlcWxpc3RzX2xvY2s7CisgICAgICAgIHdhaXRfcXVldWVfaGVhZF90IHBvbGxfd2FpdF9jb21wbGV0ZTsKKworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGFkZHJfbGlzdDsKKworICAgICAgICB1OCBfX3VzZXIgKmZjcF9idWZmZXI7CisKKwkvKiBvbGQgSVNPIEFQSSAqLworICAgICAgICB1NjQgbGlzdGVuX2NoYW5uZWxzOworICAgICAgICBxdWFkbGV0X3QgX191c2VyICppc29fYnVmZmVyOworICAgICAgICBzaXplX3QgaXNvX2J1ZmZlcl9sZW5ndGg7CisKKyAgICAgICAgdTggbm90aWZpY2F0aW9uOyAvKiAoYnVzcmVzZXQtbm90aWZpY2F0aW9uKSBSQVcxMzk0X05PVElGWV9PRkYvT04gKi8KKworCS8qIG5ldyByYXdpc28gQVBJICovCisJZW51bSByYXcxMzk0X2lzb19zdGF0ZSBpc29fc3RhdGU7CisJc3RydWN0IGhwc2JfaXNvICppc29faGFuZGxlOworCisJLyogVXNlciBzcGFjZSdzIENTUjEyMTIgZHluYW1pYyBDb25maWdST00gZGlyZWN0b3JpZXMgKi8KKwlzdHJ1Y3QgY3NyMTIxMl9rZXl2YWwgKmNzcjEyMTJfZGlyc1tSQVcxMzk0X01BWF9VU0VSX0NTUl9ESVJTXTsKKworCS8qIExlZ2FjeSBDb25maWdST00gdXBkYXRlIGZsYWcgKi8KKwl1OCBjZmdyb21fdXBkOworfTsKKworc3RydWN0IGFybV9hZGRyIHsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBhZGRyX2xpc3Q7IC8qIGZpbGVfaW5mbyBsaXN0ICovCisgICAgICAgIHU2NCAgICBzdGFydCwgZW5kOworICAgICAgICB1NjQgICAgYXJtX3RhZzsKKyAgICAgICAgdTggICAgIGFjY2Vzc19yaWdodHM7CisgICAgICAgIHU4ICAgICBub3RpZmljYXRpb25fb3B0aW9uczsKKyAgICAgICAgdTggICAgIGNsaWVudF90cmFuc2FjdGlvbnM7CisgICAgICAgIHU2NCAgICByZWN2YjsKKyAgICAgICAgdTE2ICAgIHJlY19sZW5ndGg7CisgICAgICAgIHU4ICAgICAqYWRkcl9zcGFjZV9idWZmZXI7IC8qIGFjY2Vzc2VkIGJ5IHJlYWQvd3JpdGUvbG9jayAqLworfTsKKworc3RydWN0IHBlbmRpbmdfcmVxdWVzdCB7CisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKyAgICAgICAgc3RydWN0IGZpbGVfaW5mbyAqZmlsZV9pbmZvOworICAgICAgICBzdHJ1Y3QgaHBzYl9wYWNrZXQgKnBhY2tldDsKKyAgICAgICAgc3RydWN0IGlzb19ibG9ja19zdG9yZSAqaWJzOworICAgICAgICBxdWFkbGV0X3QgKmRhdGE7CisgICAgICAgIGludCBmcmVlX2RhdGE7CisgICAgICAgIHN0cnVjdCByYXcxMzk0X3JlcXVlc3QgcmVxOworfTsKKworc3RydWN0IGhvc3RfaW5mbyB7CisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKyAgICAgICAgc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBmaWxlX2luZm9fbGlzdDsKK307CisKKyNlbmRpZiAgLyogSUVFRTEzOTRfUkFXMTM5NF9QUklWQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwOGE4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jCkBAIC0wLDAgKzEsMjk1OCBAQAorLyoKKyAqIElFRUUgMTM5NCBmb3IgTGludXgKKyAqCisgKiBSYXcgaW50ZXJmYWNlIHRvIHRoZSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgQW5kcmVhcyBFLiBCb21iZQorICogICAgICAgICAgICAgICAyMDAxLCAyMDAyIE1hbmZyZWQgV2VpaHMgPHdlaWhzQGljdC50dXdpZW4uYWMuYXQ+CisgKiAgICAgICAgICAgICAgICAgICAgIDIwMDIgQ2hyaXN0aWFuIFRvZWdlbCA8Y2hyaXN0aWFuLnRvZWdlbEBnbXguYXQ+CisgKgorICogVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgcm9vdAorICogZGlyZWN0b3J5IG9mIHRoZSBrZXJuZWwgc291cmNlcyBmb3IgZGV0YWlscy4KKyAqCisgKgorICogQ29udHJpYnV0aW9uczoKKyAqCisgKiBNYW5mcmVkIFdlaWhzIDx3ZWloc0BpY3QudHV3aWVuLmFjLmF0PgorICogICAgICAgIGNvbmZpZ3VyYXRpb24gUk9NIG1hbmlwdWxhdGlvbgorICogICAgICAgIGFkZHJlc3MgcmFuZ2UgbWFwcGluZworICogICAgICAgIGFkYXB0YXRpb24gZm9yIG5ldyAodHJhbnNwYXJlbnQpIGxvb3BiYWNrIG1lY2hhbmlzbQorICogICAgICAgIHNlbmRpbmcgb2YgYXJiaXRyYXJ5IGFzeW5jIHBhY2tldHMKKyAqIENocmlzdGlhbiBUb2VnZWwgPGNocmlzdGlhbi50b2VnZWxAZ214LmF0PgorICogICAgICAgIGFkZHJlc3MgcmFuZ2UgbWFwcGluZworICogICAgICAgIGxvY2s2NCByZXF1ZXN0CisgKiAgICAgICAgdHJhbnNtaXQgcGh5c2ljYWwgcGFja2V0CisgKiAgICAgICAgYnVzcmVzZXQgbm90aWZpY2F0aW9uIGNvbnRyb2wgKHN3aXRjaCBvbi9vZmYpCisgKiAgICAgICAgYnVzcmVzZXQgd2l0aCBzZWxlY3Rpb24gb2YgdHlwZSAoc2hvcnQvbG9uZykKKyAqICAgICAgICByZXF1ZXN0X3JlcGx5CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKworI2luY2x1ZGUgImNzcjEyMTIuaCIKKyNpbmNsdWRlICJpZWVlMTM5NC5oIgorI2luY2x1ZGUgImllZWUxMzk0X3R5cGVzLmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfY29yZS5oIgorI2luY2x1ZGUgIm5vZGVtZ3IuaCIKKyNpbmNsdWRlICJob3N0cy5oIgorI2luY2x1ZGUgImhpZ2hsZXZlbC5oIgorI2luY2x1ZGUgImlzby5oIgorI2luY2x1ZGUgImllZWUxMzk0X3RyYW5zYWN0aW9ucy5oIgorI2luY2x1ZGUgInJhdzEzOTQuaCIKKyNpbmNsdWRlICJyYXcxMzk0LXByaXZhdGUuaCIKKworI2RlZmluZSBpbnQycHRyKHgpICgodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyl4KQorI2RlZmluZSBwdHIyaW50KHgpICgodTY0KSh1bnNpZ25lZCBsb25nKSh2b2lkIF9fdXNlciAqKXgpCisKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfVkVSQk9TRURFQlVHCisjZGVmaW5lIFJBVzEzOTRfREVCVUcKKyNlbmRpZgorCisjaWZkZWYgUkFXMTM5NF9ERUJVRworI2RlZmluZSBEQkdNU0coZm10LCBhcmdzLi4uKSBcCitwcmludGsoS0VSTl9JTkZPICJyYXcxMzk0OiIgZm10ICJcbiIgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREJHTVNHKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgTElTVF9IRUFEKGhvc3RfaW5mb19saXN0KTsKK3N0YXRpYyBpbnQgaG9zdF9jb3VudDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaG9zdF9pbmZvX2xvY2spOworc3RhdGljIGF0b21pY190IGludGVybmFsX2dlbmVyYXRpb24gPSBBVE9NSUNfSU5JVCgwKTsKKworc3RhdGljIGF0b21pY190IGlzb19idWZmZXJfc2l6ZTsKK3N0YXRpYyBjb25zdCBpbnQgaXNvX2J1ZmZlcl9tYXggPSA0ICogMTAyNCAqIDEwMjQ7CS8qIDQgTUIgKi8KKworc3RhdGljIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCByYXcxMzk0X2hpZ2hsZXZlbDsKKworc3RhdGljIGludCBhcm1fcmVhZChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBxdWFkbGV0X3QgKiBidWZmZXIsCisJCSAgICB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsYWdzKTsKK3N0YXRpYyBpbnQgYXJtX3dyaXRlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIGludCBkZXN0aWQsCisJCSAgICAgcXVhZGxldF90ICogZGF0YSwgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbGFncyk7CitzdGF0aWMgaW50IGFybV9sb2NrKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHF1YWRsZXRfdCAqIHN0b3JlLAorCQkgICAgdTY0IGFkZHIsIHF1YWRsZXRfdCBkYXRhLCBxdWFkbGV0X3QgYXJnLCBpbnQgZXh0X3Rjb2RlLAorCQkgICAgdTE2IGZsYWdzKTsKK3N0YXRpYyBpbnQgYXJtX2xvY2s2NChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBvY3RsZXRfdCAqIHN0b3JlLAorCQkgICAgICB1NjQgYWRkciwgb2N0bGV0X3QgZGF0YSwgb2N0bGV0X3QgYXJnLCBpbnQgZXh0X3Rjb2RlLAorCQkgICAgICB1MTYgZmxhZ3MpOworc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGFybV9vcHMgPSB7CisJLnJlYWQgPSBhcm1fcmVhZCwKKwkud3JpdGUgPSBhcm1fd3JpdGUsCisJLmxvY2sgPSBhcm1fbG9jaywKKwkubG9jazY0ID0gYXJtX2xvY2s2NCwKK307CisKK3N0YXRpYyB2b2lkIHF1ZXVlX2NvbXBsZXRlX2NiKHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdChpbnQgZmxhZ3MpCit7CisJc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxOworCisJcmVxID0gKHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0KSwKKwkJCQkJCWZsYWdzKTsKKwlpZiAocmVxICE9IE5VTEwpIHsKKwkJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnJlcS0+bGlzdCk7CisJfQorCisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICphbGxvY19wZW5kaW5nX3JlcXVlc3Qodm9pZCkKK3sKKwlyZXR1cm4gX19hbGxvY19wZW5kaW5nX3JlcXVlc3QoU0xBQl9LRVJORUwpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BlbmRpbmdfcmVxdWVzdChzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXEpCit7CisJaWYgKHJlcS0+aWJzKSB7CisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyZXEtPmlicy0+cmVmY291bnQpKSB7CisJCQlhdG9taWNfc3ViKHJlcS0+aWJzLT5kYXRhX3NpemUsICZpc29fYnVmZmVyX3NpemUpOworCQkJa2ZyZWUocmVxLT5pYnMpOworCQl9CisJfSBlbHNlIGlmIChyZXEtPmZyZWVfZGF0YSkgeworCQlrZnJlZShyZXEtPmRhdGEpOworCX0KKwlocHNiX2ZyZWVfcGFja2V0KHJlcS0+cGFja2V0KTsKKwlrZnJlZShyZXEpOworfQorCisvKiBmaS0+cmVxbGlzdHNfbG9jayBtdXN0IGJlIHRha2VuICovCitzdGF0aWMgdm9pZCBfX3F1ZXVlX2NvbXBsZXRlX3JlcShzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGZpbGVfaW5mbyAqZmkgPSByZXEtPmZpbGVfaW5mbzsKKwlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZmaS0+cmVxX2NvbXBsZXRlKTsKKworCXVwKCZmaS0+Y29tcGxldGVfc2VtKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZpLT5wb2xsX3dhaXRfY29tcGxldGUpOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9jb21wbGV0ZV9yZXEoc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGZpbGVfaW5mbyAqZmkgPSByZXEtPmZpbGVfaW5mbzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmaS0+cmVxbGlzdHNfbG9jaywgZmxhZ3MpOworCV9fcXVldWVfY29tcGxldGVfcmVxKHJlcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmktPnJlcWxpc3RzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcXVldWVfY29tcGxldGVfY2Ioc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0ID0gcmVxLT5wYWNrZXQ7CisJaW50IHJjb2RlID0gKHBhY2tldC0+aGVhZGVyWzFdID4+IDEyKSAmIDB4ZjsKKworCXN3aXRjaCAocGFja2V0LT5hY2tfY29kZSkgeworCWNhc2UgQUNLWF9OT05FOgorCWNhc2UgQUNLWF9TRU5EX0VSUk9SOgorCQlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfU0VORF9FUlJPUjsKKwkJYnJlYWs7CisJY2FzZSBBQ0tYX0FCT1JURUQ6CisJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9BQk9SVEVEOworCQlicmVhazsKKwljYXNlIEFDS1hfVElNRU9VVDoKKwkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX1RJTUVPVVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlcS0+cmVxLmVycm9yID0gKHBhY2tldC0+YWNrX2NvZGUgPDwgMTYpIHwgcmNvZGU7CisJCWJyZWFrOworCX0KKworCWlmICghKChwYWNrZXQtPmFja19jb2RlID09IEFDS19QRU5ESU5HKSAmJiAocmNvZGUgPT0gUkNPREVfQ09NUExFVEUpKSkgeworCQlyZXEtPnJlcS5sZW5ndGggPSAwOworCX0KKworCWlmICgocmVxLT5yZXEudHlwZSA9PSBSQVcxMzk0X1JFUV9BU1lOQ19SRUFEKSB8fAorCSAgICAocmVxLT5yZXEudHlwZSA9PSBSQVcxMzk0X1JFUV9BU1lOQ19XUklURSkgfHwKKwkgICAgKHJlcS0+cmVxLnR5cGUgPT0gUkFXMTM5NF9SRVFfQVNZTkNfU1RSRUFNKSB8fAorCSAgICAocmVxLT5yZXEudHlwZSA9PSBSQVcxMzk0X1JFUV9MT0NLKSB8fAorCSAgICAocmVxLT5yZXEudHlwZSA9PSBSQVcxMzk0X1JFUV9MT0NLNjQpKQorCQlocHNiX2ZyZWVfdGxhYmVsKHBhY2tldCk7CisKKwlxdWV1ZV9jb21wbGV0ZV9yZXEocmVxKTsKK30KKworc3RhdGljIHZvaWQgYWRkX2hvc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgaG9zdF9pbmZvICpoaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaGkgPSAoc3RydWN0IGhvc3RfaW5mbyAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBob3N0X2luZm8pLCBHRlBfS0VSTkVMKTsKKworCWlmIChoaSAhPSBOVUxMKSB7CisJCUlOSVRfTElTVF9IRUFEKCZoaS0+bGlzdCk7CisJCWhpLT5ob3N0ID0gaG9zdDsKKwkJSU5JVF9MSVNUX0hFQUQoJmhpLT5maWxlX2luZm9fbGlzdCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJmhpLT5saXN0LCAmaG9zdF9pbmZvX2xpc3QpOworCQlob3N0X2NvdW50Kys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJfQorCisJYXRvbWljX2luYygmaW50ZXJuYWxfZ2VuZXJhdGlvbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaG9zdF9pbmZvICpmaW5kX2hvc3RfaW5mbyhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworCXN0cnVjdCBob3N0X2luZm8gKmhpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShoaSwgJmhvc3RfaW5mb19saXN0LCBsaXN0KQorCSAgICBpZiAoaGktPmhvc3QgPT0gaG9zdCkKKwkJcmV0dXJuIGhpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9ob3N0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGhvc3RfaW5mbyAqaGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0X2luZm9fbG9jaywgZmxhZ3MpOworCWhpID0gZmluZF9ob3N0X2luZm8oaG9zdCk7CisKKwlpZiAoaGkgIT0gTlVMTCkgeworCQlsaXN0X2RlbCgmaGktPmxpc3QpOworCQlob3N0X2NvdW50LS07CisJCS8qCisJCSAgIEZJWE1FOiBhZGRyZXNzIHJhbmdlcyBzaG91bGQgYmUgcmVtb3ZlZAorCQkgICBhbmQgZmlsZWluZm8gc3RhdGVzIHNob3VsZCBiZSBpbml0aWFsaXplZAorCQkgICAoaW5jbHVkaW5nIHNldHRpbmcgZ2VuZXJhdGlvbiB0bworCQkgICBpbnRlcm5hbC1nZW5lcmF0aW9uIC4uLikKKwkJICovCisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisKKwlpZiAoaGkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInJhdzEzOTQ6IGF0dGVtcHQgdG8gcmVtb3ZlIHVua25vd24gaG9zdCAiCisJCSAgICAgICAiMHglcFxuIiwgaG9zdCk7CisJCXJldHVybjsKKwl9CisKKwlrZnJlZShoaSk7CisKKwlhdG9taWNfaW5jKCZpbnRlcm5hbF9nZW5lcmF0aW9uKTsKK30KKworc3RhdGljIHZvaWQgaG9zdF9yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGhvc3RfaW5mbyAqaGk7CisJc3RydWN0IGZpbGVfaW5mbyAqZmk7CisJc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJaGkgPSBmaW5kX2hvc3RfaW5mbyhob3N0KTsKKworCWlmIChoaSAhPSBOVUxMKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmksICZoaS0+ZmlsZV9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChmaS0+bm90aWZpY2F0aW9uID09IFJBVzEzOTRfTk9USUZZX09OKSB7CisJCQkJcmVxID0gX19hbGxvY19wZW5kaW5nX3JlcXVlc3QoU0xBQl9BVE9NSUMpOworCisJCQkJaWYgKHJlcSAhPSBOVUxMKSB7CisJCQkJCXJlcS0+ZmlsZV9pbmZvID0gZmk7CisJCQkJCXJlcS0+cmVxLnR5cGUgPSBSQVcxMzk0X1JFUV9CVVNfUkVTRVQ7CisJCQkJCXJlcS0+cmVxLmdlbmVyYXRpb24gPQorCQkJCQkgICAgZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KTsKKwkJCQkJcmVxLT5yZXEubWlzYyA9IChob3N0LT5ub2RlX2lkIDw8IDE2KQorCQkJCQkgICAgfCBob3N0LT5ub2RlX2NvdW50OworCQkJCQlpZiAoZmktPnByb3RvY29sX3ZlcnNpb24gPiAzKSB7CisJCQkJCQlyZXEtPnJlcS5taXNjIHw9CisJCQkJCQkgICAgKE5PREVJRF9UT19OT0RFCisJCQkJCQkgICAgIChob3N0LT5pcm1faWQpCisJCQkJCQkgICAgIDw8IDgpOworCQkJCQl9CisKKwkJCQkJcXVldWVfY29tcGxldGVfcmVxKHJlcSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGlzb19yZWNlaXZlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBjaGFubmVsLCBxdWFkbGV0X3QgKiBkYXRhLAorCQkJc2l6ZV90IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBob3N0X2luZm8gKmhpOworCXN0cnVjdCBmaWxlX2luZm8gKmZpOworCXN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSwgKnJlcV9uZXh0OworCXN0cnVjdCBpc29fYmxvY2tfc3RvcmUgKmlicyA9IE5VTEw7CisJTElTVF9IRUFEKHJlcXMpOworCisJaWYgKChhdG9taWNfcmVhZCgmaXNvX2J1ZmZlcl9zaXplKSArIGxlbmd0aCkgPiBpc29fYnVmZmVyX21heCkgeworCQlIUFNCX0lORk8oImRyb3BwZWQgaXNvIHBhY2tldCIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJaGkgPSBmaW5kX2hvc3RfaW5mbyhob3N0KTsKKworCWlmIChoaSAhPSBOVUxMKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmksICZoaS0+ZmlsZV9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJCWlmICghKGZpLT5saXN0ZW5fY2hhbm5lbHMgJiAoMVVMTCA8PCBjaGFubmVsKSkpCisJCQkJY29udGludWU7CisKKwkJCXJlcSA9IF9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KFNMQUJfQVRPTUlDKTsKKwkJCWlmICghcmVxKQorCQkJCWJyZWFrOworCisJCQlpZiAoIWlicykgeworCQkJCWlicyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpc29fYmxvY2tfc3RvcmUpCisJCQkJCSAgICAgICsgbGVuZ3RoLCBTTEFCX0FUT01JQyk7CisJCQkJaWYgKCFpYnMpIHsKKwkJCQkJa2ZyZWUocmVxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJYXRvbWljX2FkZChsZW5ndGgsICZpc29fYnVmZmVyX3NpemUpOworCQkJCWF0b21pY19zZXQoJmlicy0+cmVmY291bnQsIDApOworCQkJCWlicy0+ZGF0YV9zaXplID0gbGVuZ3RoOworCQkJCW1lbWNweShpYnMtPmRhdGEsIGRhdGEsIGxlbmd0aCk7CisJCQl9CisKKwkJCWF0b21pY19pbmMoJmlicy0+cmVmY291bnQpOworCisJCQlyZXEtPmZpbGVfaW5mbyA9IGZpOworCQkJcmVxLT5pYnMgPSBpYnM7CisJCQlyZXEtPmRhdGEgPSBpYnMtPmRhdGE7CisJCQlyZXEtPnJlcS50eXBlID0gUkFXMTM5NF9SRVFfSVNPX1JFQ0VJVkU7CisJCQlyZXEtPnJlcS5nZW5lcmF0aW9uID0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KTsKKwkJCXJlcS0+cmVxLm1pc2MgPSAwOworCQkJcmVxLT5yZXEucmVjdmIgPSBwdHIyaW50KGZpLT5pc29fYnVmZmVyKTsKKwkJCXJlcS0+cmVxLmxlbmd0aCA9IG1pbihsZW5ndGgsIGZpLT5pc29fYnVmZmVyX2xlbmd0aCk7CisKKwkJCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJnJlcXMpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByZXFfbmV4dCwgJnJlcXMsIGxpc3QpCisJICAgIHF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworfQorCitzdGF0aWMgdm9pZCBmY3BfcmVxdWVzdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBpbnQgZGlyZWN0aW9uLAorCQkJaW50IGN0cywgdTggKiBkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGhvc3RfaW5mbyAqaGk7CisJc3RydWN0IGZpbGVfaW5mbyAqZmk7CisJc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxLCAqcmVxX25leHQ7CisJc3RydWN0IGlzb19ibG9ja19zdG9yZSAqaWJzID0gTlVMTDsKKwlMSVNUX0hFQUQocmVxcyk7CisKKwlpZiAoKGF0b21pY19yZWFkKCZpc29fYnVmZmVyX3NpemUpICsgbGVuZ3RoKSA+IGlzb19idWZmZXJfbWF4KSB7CisJCUhQU0JfSU5GTygiZHJvcHBlZCBmY3AgcmVxdWVzdCIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJaGkgPSBmaW5kX2hvc3RfaW5mbyhob3N0KTsKKworCWlmIChoaSAhPSBOVUxMKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmksICZoaS0+ZmlsZV9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJCWlmICghZmktPmZjcF9idWZmZXIpCisJCQkJY29udGludWU7CisKKwkJCXJlcSA9IF9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KFNMQUJfQVRPTUlDKTsKKwkJCWlmICghcmVxKQorCQkJCWJyZWFrOworCisJCQlpZiAoIWlicykgeworCQkJCWlicyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpc29fYmxvY2tfc3RvcmUpCisJCQkJCSAgICAgICsgbGVuZ3RoLCBTTEFCX0FUT01JQyk7CisJCQkJaWYgKCFpYnMpIHsKKwkJCQkJa2ZyZWUocmVxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJYXRvbWljX2FkZChsZW5ndGgsICZpc29fYnVmZmVyX3NpemUpOworCQkJCWF0b21pY19zZXQoJmlicy0+cmVmY291bnQsIDApOworCQkJCWlicy0+ZGF0YV9zaXplID0gbGVuZ3RoOworCQkJCW1lbWNweShpYnMtPmRhdGEsIGRhdGEsIGxlbmd0aCk7CisJCQl9CisKKwkJCWF0b21pY19pbmMoJmlicy0+cmVmY291bnQpOworCisJCQlyZXEtPmZpbGVfaW5mbyA9IGZpOworCQkJcmVxLT5pYnMgPSBpYnM7CisJCQlyZXEtPmRhdGEgPSBpYnMtPmRhdGE7CisJCQlyZXEtPnJlcS50eXBlID0gUkFXMTM5NF9SRVFfRkNQX1JFUVVFU1Q7CisJCQlyZXEtPnJlcS5nZW5lcmF0aW9uID0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KTsKKwkJCXJlcS0+cmVxLm1pc2MgPSBub2RlaWQgfCAoZGlyZWN0aW9uIDw8IDE2KTsKKwkJCXJlcS0+cmVxLnJlY3ZiID0gcHRyMmludChmaS0+ZmNwX2J1ZmZlcik7CisJCQlyZXEtPnJlcS5sZW5ndGggPSBsZW5ndGg7CisKKwkJCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJnJlcXMpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCByZXFfbmV4dCwgJnJlcXMsIGxpc3QpCisJICAgIHF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworfQorCitzdGF0aWMgc3NpemVfdCByYXcxMzk0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogb2Zmc2V0X2lzX2lnbm9yZWQpCit7CisJc3RydWN0IGZpbGVfaW5mbyAqZmkgPSAoc3RydWN0IGZpbGVfaW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKKwlzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXE7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoY291bnQgIT0gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCWlmIChkb3duX3RyeWxvY2soJmZpLT5jb21wbGV0ZV9zZW0pKSB7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmZpLT5jb21wbGV0ZV9zZW0pKSB7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycSgmZmktPnJlcWxpc3RzX2xvY2spOworCWxoID0gZmktPnJlcV9jb21wbGV0ZS5uZXh0OworCWxpc3RfZGVsKGxoKTsKKwlzcGluX3VubG9ja19pcnEoJmZpLT5yZXFsaXN0c19sb2NrKTsKKworCXJlcSA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QsIGxpc3QpOworCisJaWYgKHJlcS0+cmVxLmxlbmd0aCkgeworCQlpZiAoY29weV90b191c2VyKGludDJwdHIocmVxLT5yZXEucmVjdmIpLCByZXEtPmRhdGEsCisJCQkJIHJlcS0+cmVxLmxlbmd0aCkpIHsKKwkJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9NRU1GQVVMVDsKKwkJfQorCX0KKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgJnJlcS0+cmVxLCBzaXplb2YocmVxLT5yZXEpKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAoc3NpemVfdCkgc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworICAgICAgb3V0OgorCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzdGF0ZV9vcGVuZWQoc3RydWN0IGZpbGVfaW5mbyAqZmksIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSkKK3sKKwlpZiAocmVxLT5yZXEudHlwZSA9PSBSQVcxMzk0X1JFUV9JTklUSUFMSVpFKSB7CisJCXN3aXRjaCAocmVxLT5yZXEubWlzYykgeworCQljYXNlIFJBVzEzOTRfS0VSTkVMQVBJX1ZFUlNJT046CisJCWNhc2UgMzoKKwkJCWZpLT5zdGF0ZSA9IGluaXRpYWxpemVkOworCQkJZmktPnByb3RvY29sX3ZlcnNpb24gPSByZXEtPnJlcS5taXNjOworCQkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX05PTkU7CisJCQlyZXEtPnJlcS5nZW5lcmF0aW9uID0gYXRvbWljX3JlYWQoJmludGVybmFsX2dlbmVyYXRpb24pOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9DT01QQVQ7CisJCQlyZXEtPnJlcS5taXNjID0gUkFXMTM5NF9LRVJORUxBUElfVkVSU0lPTjsKKwkJfQorCX0gZWxzZSB7CisJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9TVEFURV9PUkRFUjsKKwl9CisKKwlyZXEtPnJlcS5sZW5ndGggPSAwOworCXF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworCXJldHVybiBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7Cit9CisKK3N0YXRpYyBpbnQgc3RhdGVfaW5pdGlhbGl6ZWQoc3RydWN0IGZpbGVfaW5mbyAqZmksIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgaG9zdF9pbmZvICpoaTsKKwlzdHJ1Y3QgcmF3MTM5NF9raG9zdF9saXN0ICpraGw7CisKKwlpZiAocmVxLT5yZXEuZ2VuZXJhdGlvbiAhPSBhdG9taWNfcmVhZCgmaW50ZXJuYWxfZ2VuZXJhdGlvbikpIHsKKwkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX0dFTkVSQVRJT047CisJCXJlcS0+cmVxLmdlbmVyYXRpb24gPSBhdG9taWNfcmVhZCgmaW50ZXJuYWxfZ2VuZXJhdGlvbik7CisJCXJlcS0+cmVxLmxlbmd0aCA9IDA7CisJCXF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworCX0KKworCXN3aXRjaCAocmVxLT5yZXEudHlwZSkgeworCWNhc2UgUkFXMTM5NF9SRVFfTElTVF9DQVJEUzoKKwkJc3Bpbl9sb2NrX2lycSgmaG9zdF9pbmZvX2xvY2spOworCQlraGwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9raG9zdF9saXN0KSAqIGhvc3RfY291bnQsCisJCQkgICAgICBTTEFCX0FUT01JQyk7CisKKwkJaWYgKGtobCAhPSBOVUxMKSB7CisJCQlyZXEtPnJlcS5taXNjID0gaG9zdF9jb3VudDsKKwkJCXJlcS0+ZGF0YSA9IChxdWFkbGV0X3QgKikga2hsOworCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhpLCAmaG9zdF9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJCQlraGwtPm5vZGVzID0gaGktPmhvc3QtPm5vZGVfY291bnQ7CisJCQkJc3RyY3B5KGtobC0+bmFtZSwgaGktPmhvc3QtPmRyaXZlci0+bmFtZSk7CisJCQkJa2hsKys7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxKCZob3N0X2luZm9fbG9jayk7CisKKwkJaWYgKGtobCAhPSBOVUxMKSB7CisJCQlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfTk9ORTsKKwkJCXJlcS0+cmVxLmxlbmd0aCA9IG1pbihyZXEtPnJlcS5sZW5ndGgsCisJCQkJCSAgICAgICh1MzIpIChzaXplb2YKKwkJCQkJCSAgICAgKHN0cnVjdCByYXcxMzk0X2tob3N0X2xpc3QpCisJCQkJCQkgICAgICogcmVxLT5yZXEubWlzYykpOworCQkJcmVxLT5mcmVlX2RhdGEgPSAxOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJBVzEzOTRfUkVRX1NFVF9DQVJEOgorCQlzcGluX2xvY2tfaXJxKCZob3N0X2luZm9fbG9jayk7CisJCWlmIChyZXEtPnJlcS5taXNjIDwgaG9zdF9jb3VudCkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShoaSwgJmhvc3RfaW5mb19saXN0LCBsaXN0KSB7CisJCQkJaWYgKCFyZXEtPnJlcS5taXNjLS0pCisJCQkJCWJyZWFrOworCQkJfQorCQkJZ2V0X2RldmljZSgmaGktPmhvc3QtPmRldmljZSk7CS8vIFhYWCBOZWVkIHRvIGhhbmRsZSBmYWlsdXJlIGNhc2UKKwkJCWxpc3RfYWRkX3RhaWwoJmZpLT5saXN0LCAmaGktPmZpbGVfaW5mb19saXN0KTsKKwkJCWZpLT5ob3N0ID0gaGktPmhvc3Q7CisJCQlmaS0+c3RhdGUgPSBjb25uZWN0ZWQ7CisKKwkJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9OT05FOworCQkJcmVxLT5yZXEuZ2VuZXJhdGlvbiA9IGdldF9ocHNiX2dlbmVyYXRpb24oZmktPmhvc3QpOworCQkJcmVxLT5yZXEubWlzYyA9IChmaS0+aG9zdC0+bm9kZV9pZCA8PCAxNikKKwkJCSAgICB8IGZpLT5ob3N0LT5ub2RlX2NvdW50OworCQkJaWYgKGZpLT5wcm90b2NvbF92ZXJzaW9uID4gMykgeworCQkJCXJlcS0+cmVxLm1pc2MgfD0KKwkJCQkgICAgTk9ERUlEX1RPX05PREUoZmktPmhvc3QtPmlybV9pZCkgPDwgODsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9JTlZBTElEX0FSRzsKKwkJfQorCQlzcGluX3VubG9ja19pcnEoJmhvc3RfaW5mb19sb2NrKTsKKworCQlyZXEtPnJlcS5sZW5ndGggPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9TVEFURV9PUkRFUjsKKwkJcmVxLT5yZXEubGVuZ3RoID0gMDsKKwkJYnJlYWs7CisJfQorCisJcXVldWVfY29tcGxldGVfcmVxKHJlcSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2lzb19saXN0ZW4oc3RydWN0IGZpbGVfaW5mbyAqZmksIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgY2hhbm5lbCA9IHJlcS0+cmVxLm1pc2M7CisKKwlzcGluX2xvY2tfaXJxKCZob3N0X2luZm9fbG9jayk7CisJaWYgKChjaGFubmVsID4gNjMpIHx8IChjaGFubmVsIDwgLTY0KSkgeworCQlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfSU5WQUxJRF9BUkc7CisJfSBlbHNlIGlmIChjaGFubmVsID49IDApIHsKKwkJLyogYWxsb2NhdGUgY2hhbm5lbCByZXEubWlzYyAqLworCQlpZiAoZmktPmxpc3Rlbl9jaGFubmVscyAmICgxVUxMIDw8IGNoYW5uZWwpKSB7CisJCQlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfQUxSRUFEWTsKKwkJfSBlbHNlIHsKKwkJCWlmIChocHNiX2xpc3Rlbl9jaGFubmVsCisJCQkgICAgKCZyYXcxMzk0X2hpZ2hsZXZlbCwgZmktPmhvc3QsIGNoYW5uZWwpKSB7CisJCQkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX0FMUkVBRFk7CisJCQl9IGVsc2UgeworCQkJCWZpLT5saXN0ZW5fY2hhbm5lbHMgfD0gMVVMTCA8PCBjaGFubmVsOworCQkJCWZpLT5pc29fYnVmZmVyID0gaW50MnB0cihyZXEtPnJlcS5yZWN2Yik7CisJCQkJZmktPmlzb19idWZmZXJfbGVuZ3RoID0gcmVxLT5yZXEubGVuZ3RoOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogZGVhbGxvY2F0ZSBjaGFubmVsIChvbmUncyBjb21wbGVtZW50IG5lZykgcmVxLm1pc2MgKi8KKwkJY2hhbm5lbCA9IH5jaGFubmVsOworCisJCWlmIChmaS0+bGlzdGVuX2NoYW5uZWxzICYgKDFVTEwgPDwgY2hhbm5lbCkpIHsKKwkJCWhwc2JfdW5saXN0ZW5fY2hhbm5lbCgmcmF3MTM5NF9oaWdobGV2ZWwsIGZpLT5ob3N0LAorCQkJCQkgICAgICBjaGFubmVsKTsKKwkJCWZpLT5saXN0ZW5fY2hhbm5lbHMgJj0gfigxVUxMIDw8IGNoYW5uZWwpOworCQl9IGVsc2UgeworCQkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX0lOVkFMSURfQVJHOworCQl9CisJfQorCisJcmVxLT5yZXEubGVuZ3RoID0gMDsKKwlxdWV1ZV9jb21wbGV0ZV9yZXEocmVxKTsKKwlzcGluX3VubG9ja19pcnEoJmhvc3RfaW5mb19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2ZjcF9saXN0ZW4oc3RydWN0IGZpbGVfaW5mbyAqZmksIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSkKK3sKKwlpZiAocmVxLT5yZXEubWlzYykgeworCQlpZiAoZmktPmZjcF9idWZmZXIpIHsKKwkJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9BTFJFQURZOworCQl9IGVsc2UgeworCQkJZmktPmZjcF9idWZmZXIgPSBpbnQycHRyKHJlcS0+cmVxLnJlY3ZiKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghZmktPmZjcF9idWZmZXIpIHsKKwkJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9BTFJFQURZOworCQl9IGVsc2UgeworCQkJZmktPmZjcF9idWZmZXIgPSBOVUxMOworCQl9CisJfQorCisJcmVxLT5yZXEubGVuZ3RoID0gMDsKKwlxdWV1ZV9jb21wbGV0ZV9yZXEocmVxKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfYXN5bmNfcmVxdWVzdChzdHJ1Y3QgZmlsZV9pbmZvICpmaSwKKwkJCQlzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXEsIGludCBub2RlKQoreworCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0ID0gTlVMTDsKKwl1NjQgYWRkciA9IHJlcS0+cmVxLmFkZHJlc3MgJiAweGZmZmZmZmZmZmZmZlVMTDsKKworCXN3aXRjaCAocmVxLT5yZXEudHlwZSkgeworCWNhc2UgUkFXMTM5NF9SRVFfQVNZTkNfUkVBRDoKKwkJREJHTVNHKCJyZWFkX3JlcXVlc3QgY2FsbGVkIik7CisJCXBhY2tldCA9CisJCSAgICBocHNiX21ha2VfcmVhZHBhY2tldChmaS0+aG9zdCwgbm9kZSwgYWRkciwgcmVxLT5yZXEubGVuZ3RoKTsKKworCQlpZiAoIXBhY2tldCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlmIChyZXEtPnJlcS5sZW5ndGggPT0gNCkKKwkJCXJlcS0+ZGF0YSA9ICZwYWNrZXQtPmhlYWRlclszXTsKKwkJZWxzZQorCQkJcmVxLT5kYXRhID0gcGFja2V0LT5kYXRhOworCisJCWJyZWFrOworCisJY2FzZSBSQVcxMzk0X1JFUV9BU1lOQ19XUklURToKKwkJREJHTVNHKCJ3cml0ZV9yZXF1ZXN0IGNhbGxlZCIpOworCisJCXBhY2tldCA9IGhwc2JfbWFrZV93cml0ZXBhY2tldChmaS0+aG9zdCwgbm9kZSwgYWRkciwgTlVMTCwKKwkJCQkJICAgICAgIHJlcS0+cmVxLmxlbmd0aCk7CisJCWlmICghcGFja2V0KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaWYgKHJlcS0+cmVxLmxlbmd0aCA9PSA0KSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJnBhY2tldC0+aGVhZGVyWzNdLCBpbnQycHRyKHJlcS0+cmVxLnNlbmRiKSwKKwkJCSAgICAgcmVxLT5yZXEubGVuZ3RoKSkKKwkJCQlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfTUVNRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAocGFja2V0LT5kYXRhLCBpbnQycHRyKHJlcS0+cmVxLnNlbmRiKSwKKwkJCSAgICAgcmVxLT5yZXEubGVuZ3RoKSkKKwkJCQlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfTUVNRkFVTFQ7CisJCX0KKworCQlyZXEtPnJlcS5sZW5ndGggPSAwOworCQlicmVhazsKKworCWNhc2UgUkFXMTM5NF9SRVFfQVNZTkNfU1RSRUFNOgorCQlEQkdNU0coInN0cmVhbV9yZXF1ZXN0IGNhbGxlZCIpOworCisJCXBhY2tldCA9CisJCSAgICBocHNiX21ha2Vfc3RyZWFtcGFja2V0KGZpLT5ob3N0LCBOVUxMLCByZXEtPnJlcS5sZW5ndGgsCisJCQkJCSAgIG5vZGUgJiAweDNmIC8qY2hhbm5lbCAqLyAsCisJCQkJCSAgIChyZXEtPnJlcS5taXNjID4+IDE2KSAmIDB4MywKKwkJCQkJICAgcmVxLT5yZXEubWlzYyAmIDB4Zik7CisJCWlmICghcGFja2V0KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHBhY2tldC0+ZGF0YSwgaW50MnB0cihyZXEtPnJlcS5zZW5kYiksCisJCQkJICAgcmVxLT5yZXEubGVuZ3RoKSkKKwkJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9NRU1GQVVMVDsKKworCQlyZXEtPnJlcS5sZW5ndGggPSAwOworCQlicmVhazsKKworCWNhc2UgUkFXMTM5NF9SRVFfTE9DSzoKKwkJREJHTVNHKCJsb2NrX3JlcXVlc3QgY2FsbGVkIik7CisJCWlmICgocmVxLT5yZXEubWlzYyA9PSBFWFRDT0RFX0ZFVENIX0FERCkKKwkJICAgIHx8IChyZXEtPnJlcS5taXNjID09IEVYVENPREVfTElUVExFX0FERCkpIHsKKwkJCWlmIChyZXEtPnJlcS5sZW5ndGggIT0gNCkgeworCQkJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9JTlZBTElEX0FSRzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChyZXEtPnJlcS5sZW5ndGggIT0gOCkgeworCQkJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9JTlZBTElEX0FSRzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXBhY2tldCA9IGhwc2JfbWFrZV9sb2NrcGFja2V0KGZpLT5ob3N0LCBub2RlLCBhZGRyLAorCQkJCQkgICAgICByZXEtPnJlcS5taXNjLCBOVUxMLCAwKTsKKwkJaWYgKCFwYWNrZXQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIocGFja2V0LT5kYXRhLCBpbnQycHRyKHJlcS0+cmVxLnNlbmRiKSwKKwkJCQkgICByZXEtPnJlcS5sZW5ndGgpKSB7CisJCQlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfTUVNRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXJlcS0+ZGF0YSA9IHBhY2tldC0+ZGF0YTsKKwkJcmVxLT5yZXEubGVuZ3RoID0gNDsKKwkJYnJlYWs7CisKKwljYXNlIFJBVzEzOTRfUkVRX0xPQ0s2NDoKKwkJREJHTVNHKCJsb2NrNjRfcmVxdWVzdCBjYWxsZWQiKTsKKwkJaWYgKChyZXEtPnJlcS5taXNjID09IEVYVENPREVfRkVUQ0hfQUREKQorCQkgICAgfHwgKHJlcS0+cmVxLm1pc2MgPT0gRVhUQ09ERV9MSVRUTEVfQUREKSkgeworCQkJaWYgKHJlcS0+cmVxLmxlbmd0aCAhPSA4KSB7CisJCQkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX0lOVkFMSURfQVJHOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHJlcS0+cmVxLmxlbmd0aCAhPSAxNikgeworCQkJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9JTlZBTElEX0FSRzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwYWNrZXQgPSBocHNiX21ha2VfbG9jazY0cGFja2V0KGZpLT5ob3N0LCBub2RlLCBhZGRyLAorCQkJCQkJcmVxLT5yZXEubWlzYywgTlVMTCwgMCk7CisJCWlmICghcGFja2V0KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHBhY2tldC0+ZGF0YSwgaW50MnB0cihyZXEtPnJlcS5zZW5kYiksCisJCQkJICAgcmVxLT5yZXEubGVuZ3RoKSkgeworCQkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX01FTUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlyZXEtPmRhdGEgPSBwYWNrZXQtPmRhdGE7CisJCXJlcS0+cmVxLmxlbmd0aCA9IDg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX1NUQVRFX09SREVSOworCX0KKworCXJlcS0+cGFja2V0ID0gcGFja2V0OworCisJaWYgKHJlcS0+cmVxLmVycm9yKSB7CisJCXJlcS0+cmVxLmxlbmd0aCA9IDA7CisJCXF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworCX0KKworCWhwc2Jfc2V0X3BhY2tldF9jb21wbGV0ZV90YXNrKHBhY2tldCwKKwkJCQkgICAgICAodm9pZCAoKikodm9pZCAqKSlxdWV1ZV9jb21wbGV0ZV9jYiwgcmVxKTsKKworCXNwaW5fbG9ja19pcnEoJmZpLT5yZXFsaXN0c19sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZmaS0+cmVxX3BlbmRpbmcpOworCXNwaW5fdW5sb2NrX2lycSgmZmktPnJlcWxpc3RzX2xvY2spOworCisJcGFja2V0LT5nZW5lcmF0aW9uID0gcmVxLT5yZXEuZ2VuZXJhdGlvbjsKKworCWlmIChocHNiX3NlbmRfcGFja2V0KHBhY2tldCkgPCAwKSB7CisJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9TRU5EX0VSUk9SOworCQlyZXEtPnJlcS5sZW5ndGggPSAwOworCQlocHNiX2ZyZWVfdGxhYmVsKHBhY2tldCk7CisJCXF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworCX0KKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9pc29fc2VuZChzdHJ1Y3QgZmlsZV9pbmZvICpmaSwgc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxLAorCQkJICAgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CisKKwlwYWNrZXQgPSBocHNiX21ha2VfaXNvcGFja2V0KGZpLT5ob3N0LCByZXEtPnJlcS5sZW5ndGgsIGNoYW5uZWwgJiAweDNmLAorCQkJCSAgICAgKHJlcS0+cmVxLm1pc2MgPj4gMTYpICYgMHgzLAorCQkJCSAgICAgcmVxLT5yZXEubWlzYyAmIDB4Zik7CisJaWYgKCFwYWNrZXQpCisJCXJldHVybiAtRU5PTUVNOworCisJcGFja2V0LT5zcGVlZF9jb2RlID0gcmVxLT5yZXEuYWRkcmVzcyAmIDB4MzsKKworCXJlcS0+cGFja2V0ID0gcGFja2V0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKHBhY2tldC0+ZGF0YSwgaW50MnB0cihyZXEtPnJlcS5zZW5kYiksCisJCQkgICByZXEtPnJlcS5sZW5ndGgpKSB7CisJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9NRU1GQVVMVDsKKwkJcmVxLT5yZXEubGVuZ3RoID0gMDsKKwkJcXVldWVfY29tcGxldGVfcmVxKHJlcSk7CisJCXJldHVybiBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7CisJfQorCisJcmVxLT5yZXEubGVuZ3RoID0gMDsKKwlocHNiX3NldF9wYWNrZXRfY29tcGxldGVfdGFzayhwYWNrZXQsCisJCQkJICAgICAgKHZvaWQgKCopKHZvaWQgKikpcXVldWVfY29tcGxldGVfcmVxLAorCQkJCSAgICAgIHJlcSk7CisKKwlzcGluX2xvY2tfaXJxKCZmaS0+cmVxbGlzdHNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZmktPnJlcV9wZW5kaW5nKTsKKwlzcGluX3VubG9ja19pcnEoJmZpLT5yZXFsaXN0c19sb2NrKTsKKworCS8qIFVwZGF0ZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgcGFja2V0IGp1c3QgYmVmb3JlIHNlbmRpbmcuICovCisJcGFja2V0LT5nZW5lcmF0aW9uID0gcmVxLT5yZXEuZ2VuZXJhdGlvbjsKKworCWlmIChocHNiX3NlbmRfcGFja2V0KHBhY2tldCkgPCAwKSB7CisJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9TRU5EX0VSUk9SOworCQlxdWV1ZV9jb21wbGV0ZV9yZXEocmVxKTsKKwl9CisKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9hc3luY19zZW5kKHN0cnVjdCBmaWxlX2luZm8gKmZpLCBzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CisJaW50IGhlYWRlcl9sZW5ndGggPSByZXEtPnJlcS5taXNjICYgMHhmZmZmOworCWludCBleHBlY3RfcmVzcG9uc2UgPSByZXEtPnJlcS5taXNjID4+IDE2OworCisJaWYgKChoZWFkZXJfbGVuZ3RoID4gcmVxLT5yZXEubGVuZ3RoKSB8fCAoaGVhZGVyX2xlbmd0aCA8IDEyKSkgeworCQlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfSU5WQUxJRF9BUkc7CisJCXJlcS0+cmVxLmxlbmd0aCA9IDA7CisJCXF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworCX0KKworCXBhY2tldCA9IGhwc2JfYWxsb2NfcGFja2V0KHJlcS0+cmVxLmxlbmd0aCAtIGhlYWRlcl9sZW5ndGgpOworCXJlcS0+cGFja2V0ID0gcGFja2V0OworCWlmICghcGFja2V0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihwYWNrZXQtPmhlYWRlciwgaW50MnB0cihyZXEtPnJlcS5zZW5kYiksCisJCQkgICBoZWFkZXJfbGVuZ3RoKSkgeworCQlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfTUVNRkFVTFQ7CisJCXJlcS0+cmVxLmxlbmd0aCA9IDA7CisJCXF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcgorCSAgICAocGFja2V0LT5kYXRhLCBpbnQycHRyKHJlcS0+cmVxLnNlbmRiKSArIGhlYWRlcl9sZW5ndGgsCisJICAgICBwYWNrZXQtPmRhdGFfc2l6ZSkpIHsKKwkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX01FTUZBVUxUOworCQlyZXEtPnJlcS5sZW5ndGggPSAwOworCQlxdWV1ZV9jb21wbGV0ZV9yZXEocmVxKTsKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKKwl9CisKKwlwYWNrZXQtPnR5cGUgPSBocHNiX2FzeW5jOworCXBhY2tldC0+bm9kZV9pZCA9IHBhY2tldC0+aGVhZGVyWzBdID4+IDE2OworCXBhY2tldC0+dGNvZGUgPSAocGFja2V0LT5oZWFkZXJbMF0gPj4gNCkgJiAweGY7CisJcGFja2V0LT50bGFiZWwgPSAocGFja2V0LT5oZWFkZXJbMF0gPj4gMTApICYgMHgzZjsKKwlwYWNrZXQtPmhvc3QgPSBmaS0+aG9zdDsKKwlwYWNrZXQtPmV4cGVjdF9yZXNwb25zZSA9IGV4cGVjdF9yZXNwb25zZTsKKwlwYWNrZXQtPmhlYWRlcl9zaXplID0gaGVhZGVyX2xlbmd0aDsKKwlwYWNrZXQtPmRhdGFfc2l6ZSA9IHJlcS0+cmVxLmxlbmd0aCAtIGhlYWRlcl9sZW5ndGg7CisKKwlyZXEtPnJlcS5sZW5ndGggPSAwOworCWhwc2Jfc2V0X3BhY2tldF9jb21wbGV0ZV90YXNrKHBhY2tldCwKKwkJCQkgICAgICAodm9pZCAoKikodm9pZCAqKSlxdWV1ZV9jb21wbGV0ZV9jYiwgcmVxKTsKKworCXNwaW5fbG9ja19pcnEoJmZpLT5yZXFsaXN0c19sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZmaS0+cmVxX3BlbmRpbmcpOworCXNwaW5fdW5sb2NrX2lycSgmZmktPnJlcWxpc3RzX2xvY2spOworCisJLyogVXBkYXRlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBwYWNrZXQganVzdCBiZWZvcmUgc2VuZGluZy4gKi8KKwlwYWNrZXQtPmdlbmVyYXRpb24gPSByZXEtPnJlcS5nZW5lcmF0aW9uOworCisJaWYgKGhwc2Jfc2VuZF9wYWNrZXQocGFja2V0KSA8IDApIHsKKwkJcmVxLT5yZXEuZXJyb3IgPSBSQVcxMzk0X0VSUk9SX1NFTkRfRVJST1I7CisJCXF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworCX0KKworCXJldHVybiBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3JlYWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICogYnVmZmVyLAorCQkgICAgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbGFncykKK3sKKwlzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGhvc3RfaW5mbyAqaGk7CisJc3RydWN0IGZpbGVfaW5mbyAqZmkgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCBhcm1fYWRkciAqYXJtX2FkZHIgPSBOVUxMOworCXN0cnVjdCBhcm1fcmVxdWVzdCAqYXJtX3JlcSA9IE5VTEw7CisJc3RydWN0IGFybV9yZXNwb25zZSAqYXJtX3Jlc3AgPSBOVUxMOworCWludCBmb3VuZCA9IDAsIHNpemUgPSAwLCByY29kZSA9IC0xOworCXN0cnVjdCBhcm1fcmVxdWVzdF9yZXNwb25zZSAqYXJtX3JlcV9yZXNwID0gTlVMTDsKKworCURCR01TRygiYXJtX3JlYWQgIGNhbGxlZCBieSBub2RlOiAlWCIKKwkgICAgICAgImFkZHI6ICU0LjR4ICU4Ljh4IGxlbmd0aDogJVp1Iiwgbm9kZWlkLAorCSAgICAgICAodTE2KSAoKGFkZHIgPj4gMzIpICYgMHhGRkZGKSwgKHUzMikgKGFkZHIgJiAweEZGRkZGRkZGKSwKKwkgICAgICAgbGVuZ3RoKTsKKwlzcGluX2xvY2soJmhvc3RfaW5mb19sb2NrKTsKKwloaSA9IGZpbmRfaG9zdF9pbmZvKGhvc3QpOwkvKiBzZWFyY2ggYWRkcmVzcy1lbnRyeSAqLworCWlmIChoaSAhPSBOVUxMKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmksICZoaS0+ZmlsZV9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJCWVudHJ5ID0gZmktPmFkZHJfbGlzdC5uZXh0OworCQkJd2hpbGUgKGVudHJ5ICE9ICYoZmktPmFkZHJfbGlzdCkpIHsKKwkJCQlhcm1fYWRkciA9CisJCQkJICAgIGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBhcm1fYWRkciwKKwkJCQkJICAgICAgIGFkZHJfbGlzdCk7CisJCQkJaWYgKCgoYXJtX2FkZHItPnN0YXJ0KSA8PSAoYWRkcikpCisJCQkJICAgICYmICgoYXJtX2FkZHItPmVuZCkgPj0gKGFkZHIgKyBsZW5ndGgpKSkgeworCQkJCQlmb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQkJfQorCQkJaWYgKGZvdW5kKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmNvZGUgPSAtMTsKKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmF3MTM5NDogYXJtX3JlYWQgRkFJTEVEIGFkZHJfZW50cnkgbm90IGZvdW5kIgorCQkgICAgICAgIiAtPiByY29kZV9hZGRyZXNzX2Vycm9yXG4iKTsKKwkJc3Bpbl91bmxvY2soJmhvc3RfaW5mb19sb2NrKTsKKwkJcmV0dXJuIChSQ09ERV9BRERSRVNTX0VSUk9SKTsKKwl9IGVsc2UgeworCQlEQkdNU0coImFybV9yZWFkIGFkZHJfZW50cnkgRk9VTkQiKTsKKwl9CisJaWYgKGFybV9hZGRyLT5yZWNfbGVuZ3RoIDwgbGVuZ3RoKSB7CisJCURCR01TRygiYXJtX3JlYWQgYmxvY2tsZW5ndGggdG9vIGJpZyAtPiByY29kZV9kYXRhX2Vycm9yIik7CisJCXJjb2RlID0gUkNPREVfREFUQV9FUlJPUjsJLyogaGFyZHdhcmUgZXJyb3IsIGRhdGEgaXMgdW5hdmFpbGFibGUgKi8KKwl9CisJaWYgKHJjb2RlID09IC0xKSB7CisJCWlmIChhcm1fYWRkci0+YWNjZXNzX3JpZ2h0cyAmIEFSTV9SRUFEKSB7CisJCQlpZiAoIShhcm1fYWRkci0+Y2xpZW50X3RyYW5zYWN0aW9ucyAmIEFSTV9SRUFEKSkgeworCQkJCW1lbWNweShidWZmZXIsCisJCQkJICAgICAgIChhcm1fYWRkci0+YWRkcl9zcGFjZV9idWZmZXIpICsgKGFkZHIgLQorCQkJCQkJCQkJKGFybV9hZGRyLT4KKwkJCQkJCQkJCSBzdGFydCkpLAorCQkJCSAgICAgICBsZW5ndGgpOworCQkJCURCR01TRygiYXJtX3JlYWQgLT4gKHJjb2RlX2NvbXBsZXRlKSIpOworCQkJCXJjb2RlID0gUkNPREVfQ09NUExFVEU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyY29kZSA9IFJDT0RFX1RZUEVfRVJST1I7CS8qIGZ1bmN0aW9uIG5vdCBhbGxvd2VkICovCisJCQlEQkdNU0coImFybV9yZWFkIC0+IHJjb2RlX3R5cGVfZXJyb3IgKGFjY2VzcyBkZW5pZWQpIik7CisJCX0KKwl9CisJaWYgKGFybV9hZGRyLT5ub3RpZmljYXRpb25fb3B0aW9ucyAmIEFSTV9SRUFEKSB7CisJCURCR01TRygiYXJtX3JlYWQgLT4gZW50ZXJpbmcgbm90aWZpY2F0aW9uLXNlY3Rpb24iKTsKKwkJcmVxID0gX19hbGxvY19wZW5kaW5nX3JlcXVlc3QoU0xBQl9BVE9NSUMpOworCQlpZiAoIXJlcSkgeworCQkJREJHTVNHKCJhcm1fcmVhZCAtPiByY29kZV9jb25mbGljdF9lcnJvciIpOworCQkJc3Bpbl91bmxvY2soJmhvc3RfaW5mb19sb2NrKTsKKwkJCXJldHVybiAoUkNPREVfQ09ORkxJQ1RfRVJST1IpOwkvKiBBIHJlc291cmNlIGNvbmZsaWN0IHdhcyBkZXRlY3RlZC4KKwkJCQkJCQkgICBUaGUgcmVxdWVzdCBtYXkgYmUgcmV0cmllZCAqLworCQl9CisJCWlmIChyY29kZSA9PSBSQ09ERV9DT01QTEVURSkgeworCQkJc2l6ZSA9CisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdCkgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3Jlc3BvbnNlKSArCisJCQkgICAgbGVuZ3RoICogc2l6ZW9mKGJ5dGVfdCkgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UpOworCQl9IGVsc2UgeworCQkJc2l6ZSA9CisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdCkgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3Jlc3BvbnNlKSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdF9yZXNwb25zZSk7CisJCX0KKwkJcmVxLT5kYXRhID0ga21hbGxvYyhzaXplLCBTTEFCX0FUT01JQyk7CisJCWlmICghKHJlcS0+ZGF0YSkpIHsKKwkJCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CisJCQlEQkdNU0coImFybV9yZWFkIC0+IHJjb2RlX2NvbmZsaWN0X2Vycm9yIik7CisJCQlzcGluX3VubG9jaygmaG9zdF9pbmZvX2xvY2spOworCQkJcmV0dXJuIChSQ09ERV9DT05GTElDVF9FUlJPUik7CS8qIEEgcmVzb3VyY2UgY29uZmxpY3Qgd2FzIGRldGVjdGVkLgorCQkJCQkJCSAgIFRoZSByZXF1ZXN0IG1heSBiZSByZXRyaWVkICovCisJCX0KKwkJcmVxLT5mcmVlX2RhdGEgPSAxOworCQlyZXEtPmZpbGVfaW5mbyA9IGZpOworCQlyZXEtPnJlcS50eXBlID0gUkFXMTM5NF9SRVFfQVJNOworCQlyZXEtPnJlcS5nZW5lcmF0aW9uID0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KTsKKwkJcmVxLT5yZXEubWlzYyA9CisJCSAgICAoKChsZW5ndGggPDwgMTYpICYgKDB4RkZGRjAwMDApKSB8IChBUk1fUkVBRCAmIDB4RkYpKTsKKwkJcmVxLT5yZXEudGFnID0gYXJtX2FkZHItPmFybV90YWc7CisJCXJlcS0+cmVxLnJlY3ZiID0gYXJtX2FkZHItPnJlY3ZiOworCQlyZXEtPnJlcS5sZW5ndGggPSBzaXplOworCQlhcm1fcmVxX3Jlc3AgPSAoc3RydWN0IGFybV9yZXF1ZXN0X3Jlc3BvbnNlICopKHJlcS0+ZGF0YSk7CisJCWFybV9yZXEgPSAoc3RydWN0IGFybV9yZXF1ZXN0ICopKChieXRlX3QgKikgKHJlcS0+ZGF0YSkgKworCQkJCQkJIChzaXplb2YKKwkJCQkJCSAgKHN0cnVjdAorCQkJCQkJICAgYXJtX3JlcXVlc3RfcmVzcG9uc2UpKSk7CisJCWFybV9yZXNwID0KKwkJICAgIChzdHJ1Y3QgYXJtX3Jlc3BvbnNlICopKChieXRlX3QgKikgKGFybV9yZXEpICsKKwkJCQkJICAgIChzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0KSkpOworCQlhcm1fcmVxLT5idWZmZXIgPSBOVUxMOworCQlhcm1fcmVzcC0+YnVmZmVyID0gTlVMTDsKKwkJaWYgKHJjb2RlID09IFJDT0RFX0NPTVBMRVRFKSB7CisJCQlieXRlX3QgKmJ1ZiA9CisJCQkgICAgKGJ5dGVfdCAqKSBhcm1fcmVzcCArIHNpemVvZihzdHJ1Y3QgYXJtX3Jlc3BvbnNlKTsKKwkJCW1lbWNweShidWYsCisJCQkgICAgICAgKGFybV9hZGRyLT5hZGRyX3NwYWNlX2J1ZmZlcikgKyAoYWRkciAtCisJCQkJCQkJCShhcm1fYWRkci0+CisJCQkJCQkJCSBzdGFydCkpLAorCQkJICAgICAgIGxlbmd0aCk7CisJCQlhcm1fcmVzcC0+YnVmZmVyID0KKwkJCSAgICBpbnQycHRyKChhcm1fYWRkci0+cmVjdmIpICsKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdF9yZXNwb25zZSkgKworCQkJCSAgICBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0KSArCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3Jlc3BvbnNlKSk7CisJCX0KKwkJYXJtX3Jlc3AtPmJ1ZmZlcl9sZW5ndGggPQorCQkgICAgKHJjb2RlID09IFJDT0RFX0NPTVBMRVRFKSA/IGxlbmd0aCA6IDA7CisJCWFybV9yZXNwLT5yZXNwb25zZV9jb2RlID0gcmNvZGU7CisJCWFybV9yZXEtPmJ1ZmZlcl9sZW5ndGggPSAwOworCQlhcm1fcmVxLT5nZW5lcmF0aW9uID0gcmVxLT5yZXEuZ2VuZXJhdGlvbjsKKwkJYXJtX3JlcS0+ZXh0ZW5kZWRfdHJhbnNhY3Rpb25fY29kZSA9IDA7CisJCWFybV9yZXEtPmRlc3RpbmF0aW9uX29mZnNldCA9IGFkZHI7CisJCWFybV9yZXEtPnNvdXJjZV9ub2RlaWQgPSBub2RlaWQ7CisJCWFybV9yZXEtPmRlc3RpbmF0aW9uX25vZGVpZCA9IGhvc3QtPm5vZGVfaWQ7CisJCWFybV9yZXEtPnRsYWJlbCA9IChmbGFncyA+PiAxMCkgJiAweDNmOworCQlhcm1fcmVxLT50Y29kZSA9IChmbGFncyA+PiA0KSAmIDB4MGY7CisJCWFybV9yZXFfcmVzcC0+cmVxdWVzdCA9IGludDJwdHIoKGFybV9hZGRyLT5yZWN2YikgKworCQkJCQkJc2l6ZW9mKHN0cnVjdAorCQkJCQkJICAgICAgIGFybV9yZXF1ZXN0X3Jlc3BvbnNlKSk7CisJCWFybV9yZXFfcmVzcC0+cmVzcG9uc2UgPQorCQkgICAgaW50MnB0cigoYXJtX2FkZHItPnJlY3ZiKSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdF9yZXNwb25zZSkgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3QpKTsKKwkJcXVldWVfY29tcGxldGVfcmVxKHJlcSk7CisJfQorCXNwaW5fdW5sb2NrKCZob3N0X2luZm9fbG9jayk7CisJcmV0dXJuIChyY29kZSk7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3dyaXRlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIGludCBkZXN0aWQsCisJCSAgICAgcXVhZGxldF90ICogZGF0YSwgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbGFncykKK3sKKwlzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGhvc3RfaW5mbyAqaGk7CisJc3RydWN0IGZpbGVfaW5mbyAqZmkgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCBhcm1fYWRkciAqYXJtX2FkZHIgPSBOVUxMOworCXN0cnVjdCBhcm1fcmVxdWVzdCAqYXJtX3JlcSA9IE5VTEw7CisJc3RydWN0IGFybV9yZXNwb25zZSAqYXJtX3Jlc3AgPSBOVUxMOworCWludCBmb3VuZCA9IDAsIHNpemUgPSAwLCByY29kZSA9IC0xLCBsZW5ndGhfY29uZmxpY3QgPSAwOworCXN0cnVjdCBhcm1fcmVxdWVzdF9yZXNwb25zZSAqYXJtX3JlcV9yZXNwID0gTlVMTDsKKworCURCR01TRygiYXJtX3dyaXRlIGNhbGxlZCBieSBub2RlOiAlWCIKKwkgICAgICAgImFkZHI6ICU0LjR4ICU4Ljh4IGxlbmd0aDogJVp1Iiwgbm9kZWlkLAorCSAgICAgICAodTE2KSAoKGFkZHIgPj4gMzIpICYgMHhGRkZGKSwgKHUzMikgKGFkZHIgJiAweEZGRkZGRkZGKSwKKwkgICAgICAgbGVuZ3RoKTsKKwlzcGluX2xvY2soJmhvc3RfaW5mb19sb2NrKTsKKwloaSA9IGZpbmRfaG9zdF9pbmZvKGhvc3QpOwkvKiBzZWFyY2ggYWRkcmVzcy1lbnRyeSAqLworCWlmIChoaSAhPSBOVUxMKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmksICZoaS0+ZmlsZV9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJCWVudHJ5ID0gZmktPmFkZHJfbGlzdC5uZXh0OworCQkJd2hpbGUgKGVudHJ5ICE9ICYoZmktPmFkZHJfbGlzdCkpIHsKKwkJCQlhcm1fYWRkciA9CisJCQkJICAgIGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBhcm1fYWRkciwKKwkJCQkJICAgICAgIGFkZHJfbGlzdCk7CisJCQkJaWYgKCgoYXJtX2FkZHItPnN0YXJ0KSA8PSAoYWRkcikpCisJCQkJICAgICYmICgoYXJtX2FkZHItPmVuZCkgPj0gKGFkZHIgKyBsZW5ndGgpKSkgeworCQkJCQlmb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQkJfQorCQkJaWYgKGZvdW5kKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmNvZGUgPSAtMTsKKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmF3MTM5NDogYXJtX3dyaXRlIEZBSUxFRCBhZGRyX2VudHJ5IG5vdCBmb3VuZCIKKwkJICAgICAgICIgLT4gcmNvZGVfYWRkcmVzc19lcnJvclxuIik7CisJCXNwaW5fdW5sb2NrKCZob3N0X2luZm9fbG9jayk7CisJCXJldHVybiAoUkNPREVfQUREUkVTU19FUlJPUik7CisJfSBlbHNlIHsKKwkJREJHTVNHKCJhcm1fd3JpdGUgYWRkcl9lbnRyeSBGT1VORCIpOworCX0KKwlpZiAoYXJtX2FkZHItPnJlY19sZW5ndGggPCBsZW5ndGgpIHsKKwkJREJHTVNHKCJhcm1fd3JpdGUgYmxvY2tsZW5ndGggdG9vIGJpZyAtPiByY29kZV9kYXRhX2Vycm9yIik7CisJCWxlbmd0aF9jb25mbGljdCA9IDE7CisJCXJjb2RlID0gUkNPREVfREFUQV9FUlJPUjsJLyogaGFyZHdhcmUgZXJyb3IsIGRhdGEgaXMgdW5hdmFpbGFibGUgKi8KKwl9CisJaWYgKHJjb2RlID09IC0xKSB7CisJCWlmIChhcm1fYWRkci0+YWNjZXNzX3JpZ2h0cyAmIEFSTV9XUklURSkgeworCQkJaWYgKCEoYXJtX2FkZHItPmNsaWVudF90cmFuc2FjdGlvbnMgJiBBUk1fV1JJVEUpKSB7CisJCQkJbWVtY3B5KChhcm1fYWRkci0+YWRkcl9zcGFjZV9idWZmZXIpICsKKwkJCQkgICAgICAgKGFkZHIgLSAoYXJtX2FkZHItPnN0YXJ0KSksIGRhdGEsCisJCQkJICAgICAgIGxlbmd0aCk7CisJCQkJREJHTVNHKCJhcm1fd3JpdGUgLT4gKHJjb2RlX2NvbXBsZXRlKSIpOworCQkJCXJjb2RlID0gUkNPREVfQ09NUExFVEU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyY29kZSA9IFJDT0RFX1RZUEVfRVJST1I7CS8qIGZ1bmN0aW9uIG5vdCBhbGxvd2VkICovCisJCQlEQkdNU0coImFybV93cml0ZSAtPiByY29kZV90eXBlX2Vycm9yIChhY2Nlc3MgZGVuaWVkKSIpOworCQl9CisJfQorCWlmIChhcm1fYWRkci0+bm90aWZpY2F0aW9uX29wdGlvbnMgJiBBUk1fV1JJVEUpIHsKKwkJREJHTVNHKCJhcm1fd3JpdGUgLT4gZW50ZXJpbmcgbm90aWZpY2F0aW9uLXNlY3Rpb24iKTsKKwkJcmVxID0gX19hbGxvY19wZW5kaW5nX3JlcXVlc3QoU0xBQl9BVE9NSUMpOworCQlpZiAoIXJlcSkgeworCQkJREJHTVNHKCJhcm1fd3JpdGUgLT4gcmNvZGVfY29uZmxpY3RfZXJyb3IiKTsKKwkJCXNwaW5fdW5sb2NrKCZob3N0X2luZm9fbG9jayk7CisJCQlyZXR1cm4gKFJDT0RFX0NPTkZMSUNUX0VSUk9SKTsJLyogQSByZXNvdXJjZSBjb25mbGljdCB3YXMgZGV0ZWN0ZWQuCisJCQkJCQkJICAgVGhlIHJlcXVlc3QgbXkgYmUgcmV0cmllZCAqLworCQl9CisJCXNpemUgPQorCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdCkgKyBzaXplb2Yoc3RydWN0IGFybV9yZXNwb25zZSkgKworCQkgICAgKGxlbmd0aCkgKiBzaXplb2YoYnl0ZV90KSArCisJCSAgICBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0X3Jlc3BvbnNlKTsKKwkJcmVxLT5kYXRhID0ga21hbGxvYyhzaXplLCBTTEFCX0FUT01JQyk7CisJCWlmICghKHJlcS0+ZGF0YSkpIHsKKwkJCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CisJCQlEQkdNU0coImFybV93cml0ZSAtPiByY29kZV9jb25mbGljdF9lcnJvciIpOworCQkJc3Bpbl91bmxvY2soJmhvc3RfaW5mb19sb2NrKTsKKwkJCXJldHVybiAoUkNPREVfQ09ORkxJQ1RfRVJST1IpOwkvKiBBIHJlc291cmNlIGNvbmZsaWN0IHdhcyBkZXRlY3RlZC4KKwkJCQkJCQkgICBUaGUgcmVxdWVzdCBtYXkgYmUgcmV0cmllZCAqLworCQl9CisJCXJlcS0+ZnJlZV9kYXRhID0gMTsKKwkJcmVxLT5maWxlX2luZm8gPSBmaTsKKwkJcmVxLT5yZXEudHlwZSA9IFJBVzEzOTRfUkVRX0FSTTsKKwkJcmVxLT5yZXEuZ2VuZXJhdGlvbiA9IGdldF9ocHNiX2dlbmVyYXRpb24oaG9zdCk7CisJCXJlcS0+cmVxLm1pc2MgPQorCQkgICAgKCgobGVuZ3RoIDw8IDE2KSAmICgweEZGRkYwMDAwKSkgfCAoQVJNX1dSSVRFICYgMHhGRikpOworCQlyZXEtPnJlcS50YWcgPSBhcm1fYWRkci0+YXJtX3RhZzsKKwkJcmVxLT5yZXEucmVjdmIgPSBhcm1fYWRkci0+cmVjdmI7CisJCXJlcS0+cmVxLmxlbmd0aCA9IHNpemU7CisJCWFybV9yZXFfcmVzcCA9IChzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UgKikocmVxLT5kYXRhKTsKKwkJYXJtX3JlcSA9IChzdHJ1Y3QgYXJtX3JlcXVlc3QgKikoKGJ5dGVfdCAqKSAocmVxLT5kYXRhKSArCisJCQkJCQkgKHNpemVvZgorCQkJCQkJICAoc3RydWN0CisJCQkJCQkgICBhcm1fcmVxdWVzdF9yZXNwb25zZSkpKTsKKwkJYXJtX3Jlc3AgPQorCQkgICAgKHN0cnVjdCBhcm1fcmVzcG9uc2UgKikoKGJ5dGVfdCAqKSAoYXJtX3JlcSkgKworCQkJCQkgICAgKHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3QpKSk7CisJCWFybV9yZXNwLT5idWZmZXIgPSBOVUxMOworCQltZW1jcHkoKGJ5dGVfdCAqKSBhcm1fcmVzcCArIHNpemVvZihzdHJ1Y3QgYXJtX3Jlc3BvbnNlKSwKKwkJICAgICAgIGRhdGEsIGxlbmd0aCk7CisJCWFybV9yZXEtPmJ1ZmZlciA9IGludDJwdHIoKGFybV9hZGRyLT5yZWN2YikgKworCQkJCQkgIHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UpICsKKwkJCQkJICBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0KSArCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVzcG9uc2UpKTsKKwkJYXJtX3JlcS0+YnVmZmVyX2xlbmd0aCA9IGxlbmd0aDsKKwkJYXJtX3JlcS0+Z2VuZXJhdGlvbiA9IHJlcS0+cmVxLmdlbmVyYXRpb247CisJCWFybV9yZXEtPmV4dGVuZGVkX3RyYW5zYWN0aW9uX2NvZGUgPSAwOworCQlhcm1fcmVxLT5kZXN0aW5hdGlvbl9vZmZzZXQgPSBhZGRyOworCQlhcm1fcmVxLT5zb3VyY2Vfbm9kZWlkID0gbm9kZWlkOworCQlhcm1fcmVxLT5kZXN0aW5hdGlvbl9ub2RlaWQgPSBkZXN0aWQ7CisJCWFybV9yZXEtPnRsYWJlbCA9IChmbGFncyA+PiAxMCkgJiAweDNmOworCQlhcm1fcmVxLT50Y29kZSA9IChmbGFncyA+PiA0KSAmIDB4MGY7CisJCWFybV9yZXNwLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkJYXJtX3Jlc3AtPnJlc3BvbnNlX2NvZGUgPSByY29kZTsKKwkJYXJtX3JlcV9yZXNwLT5yZXF1ZXN0ID0gaW50MnB0cigoYXJtX2FkZHItPnJlY3ZiKSArCisJCQkJCQlzaXplb2Yoc3RydWN0CisJCQkJCQkgICAgICAgYXJtX3JlcXVlc3RfcmVzcG9uc2UpKTsKKwkJYXJtX3JlcV9yZXNwLT5yZXNwb25zZSA9CisJCSAgICBpbnQycHRyKChhcm1fYWRkci0+cmVjdmIpICsKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0X3Jlc3BvbnNlKSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdCkpOworCQlxdWV1ZV9jb21wbGV0ZV9yZXEocmVxKTsKKwl9CisJc3Bpbl91bmxvY2soJmhvc3RfaW5mb19sb2NrKTsKKwlyZXR1cm4gKHJjb2RlKTsKK30KKworc3RhdGljIGludCBhcm1fbG9jayhzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBxdWFkbGV0X3QgKiBzdG9yZSwKKwkJICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgZGF0YSwgcXVhZGxldF90IGFyZywgaW50IGV4dF90Y29kZSwKKwkJICAgIHUxNiBmbGFncykKK3sKKwlzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGhvc3RfaW5mbyAqaGk7CisJc3RydWN0IGZpbGVfaW5mbyAqZmkgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCBhcm1fYWRkciAqYXJtX2FkZHIgPSBOVUxMOworCXN0cnVjdCBhcm1fcmVxdWVzdCAqYXJtX3JlcSA9IE5VTEw7CisJc3RydWN0IGFybV9yZXNwb25zZSAqYXJtX3Jlc3AgPSBOVUxMOworCWludCBmb3VuZCA9IDAsIHNpemUgPSAwLCByY29kZSA9IC0xOworCXF1YWRsZXRfdCBvbGQsIG5ldzsKKwlzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UgKmFybV9yZXFfcmVzcCA9IE5VTEw7CisKKwlpZiAoKChleHRfdGNvZGUgJiAweEZGKSA9PSBFWFRDT0RFX0ZFVENIX0FERCkgfHwKKwkgICAgKChleHRfdGNvZGUgJiAweEZGKSA9PSBFWFRDT0RFX0xJVFRMRV9BREQpKSB7CisJCURCR01TRygiYXJtX2xvY2sgIGNhbGxlZCBieSBub2RlOiAlWCAiCisJCSAgICAgICAiYWRkcjogJTQuNHggJTguOHggZXh0Y29kZTogJTIuMlggZGF0YTogJTguOFgiLAorCQkgICAgICAgbm9kZWlkLCAodTE2KSAoKGFkZHIgPj4gMzIpICYgMHhGRkZGKSwKKwkJICAgICAgICh1MzIpIChhZGRyICYgMHhGRkZGRkZGRiksIGV4dF90Y29kZSAmIDB4RkYsCisJCSAgICAgICBiZTMyX3RvX2NwdShkYXRhKSk7CisJfSBlbHNlIHsKKwkJREJHTVNHKCJhcm1fbG9jayAgY2FsbGVkIGJ5IG5vZGU6ICVYICIKKwkJICAgICAgICJhZGRyOiAlNC40eCAlOC44eCBleHRjb2RlOiAlMi4yWCBkYXRhOiAlOC44WCBhcmc6ICU4LjhYIiwKKwkJICAgICAgIG5vZGVpZCwgKHUxNikgKChhZGRyID4+IDMyKSAmIDB4RkZGRiksCisJCSAgICAgICAodTMyKSAoYWRkciAmIDB4RkZGRkZGRkYpLCBleHRfdGNvZGUgJiAweEZGLAorCQkgICAgICAgYmUzMl90b19jcHUoZGF0YSksIGJlMzJfdG9fY3B1KGFyZykpOworCX0KKwlzcGluX2xvY2soJmhvc3RfaW5mb19sb2NrKTsKKwloaSA9IGZpbmRfaG9zdF9pbmZvKGhvc3QpOwkvKiBzZWFyY2ggYWRkcmVzcy1lbnRyeSAqLworCWlmIChoaSAhPSBOVUxMKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmksICZoaS0+ZmlsZV9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJCWVudHJ5ID0gZmktPmFkZHJfbGlzdC5uZXh0OworCQkJd2hpbGUgKGVudHJ5ICE9ICYoZmktPmFkZHJfbGlzdCkpIHsKKwkJCQlhcm1fYWRkciA9CisJCQkJICAgIGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBhcm1fYWRkciwKKwkJCQkJICAgICAgIGFkZHJfbGlzdCk7CisJCQkJaWYgKCgoYXJtX2FkZHItPnN0YXJ0KSA8PSAoYWRkcikpCisJCQkJICAgICYmICgoYXJtX2FkZHItPmVuZCkgPj0KKwkJCQkJKGFkZHIgKyBzaXplb2YoKnN0b3JlKSkpKSB7CisJCQkJCWZvdW5kID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQl9CisJCQlpZiAoZm91bmQpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyY29kZSA9IC0xOworCWlmICghZm91bmQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYXcxMzk0OiBhcm1fbG9jayBGQUlMRUQgYWRkcl9lbnRyeSBub3QgZm91bmQiCisJCSAgICAgICAiIC0+IHJjb2RlX2FkZHJlc3NfZXJyb3JcbiIpOworCQlzcGluX3VubG9jaygmaG9zdF9pbmZvX2xvY2spOworCQlyZXR1cm4gKFJDT0RFX0FERFJFU1NfRVJST1IpOworCX0gZWxzZSB7CisJCURCR01TRygiYXJtX2xvY2sgYWRkcl9lbnRyeSBGT1VORCIpOworCX0KKwlpZiAocmNvZGUgPT0gLTEpIHsKKwkJaWYgKGFybV9hZGRyLT5hY2Nlc3NfcmlnaHRzICYgQVJNX0xPQ0spIHsKKwkJCWlmICghKGFybV9hZGRyLT5jbGllbnRfdHJhbnNhY3Rpb25zICYgQVJNX0xPQ0spKSB7CisJCQkJbWVtY3B5KCZvbGQsCisJCQkJICAgICAgIChhcm1fYWRkci0+YWRkcl9zcGFjZV9idWZmZXIpICsgKGFkZHIgLQorCQkJCQkJCQkJKGFybV9hZGRyLT4KKwkJCQkJCQkJCSBzdGFydCkpLAorCQkJCSAgICAgICBzaXplb2Yob2xkKSk7CisJCQkJc3dpdGNoIChleHRfdGNvZGUpIHsKKwkJCQljYXNlIChFWFRDT0RFX01BU0tfU1dBUCk6CisJCQkJCW5ldyA9IGRhdGEgfCAob2xkICYgfmFyZyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgKEVYVENPREVfQ09NUEFSRV9TV0FQKToKKwkJCQkJaWYgKG9sZCA9PSBhcmcpIHsKKwkJCQkJCW5ldyA9IGRhdGE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQluZXcgPSBvbGQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAoRVhUQ09ERV9GRVRDSF9BREQpOgorCQkJCQluZXcgPQorCQkJCQkgICAgY3B1X3RvX2JlMzIoYmUzMl90b19jcHUoZGF0YSkgKworCQkJCQkJCWJlMzJfdG9fY3B1KG9sZCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIChFWFRDT0RFX0xJVFRMRV9BREQpOgorCQkJCQluZXcgPQorCQkJCQkgICAgY3B1X3RvX2xlMzIobGUzMl90b19jcHUoZGF0YSkgKworCQkJCQkJCWxlMzJfdG9fY3B1KG9sZCkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIChFWFRDT0RFX0JPVU5ERURfQUREKToKKwkJCQkJaWYgKG9sZCAhPSBhcmcpIHsKKwkJCQkJCW5ldyA9CisJCQkJCQkgICAgY3B1X3RvX2JlMzIoYmUzMl90b19jcHUKKwkJCQkJCQkJKGRhdGEpICsKKwkJCQkJCQkJYmUzMl90b19jcHUKKwkJCQkJCQkJKG9sZCkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbmV3ID0gb2xkOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgKEVYVENPREVfV1JBUF9BREQpOgorCQkJCQlpZiAob2xkICE9IGFyZykgeworCQkJCQkJbmV3ID0KKwkJCQkJCSAgICBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdQorCQkJCQkJCQkoZGF0YSkgKworCQkJCQkJCQliZTMyX3RvX2NwdQorCQkJCQkJCQkob2xkKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQluZXcgPSBkYXRhOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJjb2RlID0gUkNPREVfVFlQRV9FUlJPUjsJLyogZnVuY3Rpb24gbm90IGFsbG93ZWQgKi8KKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSAgICAgICAicmF3MTM5NDogYXJtX2xvY2sgRkFJTEVEICIKKwkJCQkJICAgICAgICJleHRfdGNvZGUgbm90IGFsbG93ZWQgLT4gcmNvZGVfdHlwZV9lcnJvclxuIik7CisJCQkJCWJyZWFrOworCQkJCX0JLypzd2l0Y2ggKi8KKwkJCQlpZiAocmNvZGUgPT0gLTEpIHsKKwkJCQkJREJHTVNHKCJhcm1fbG9jayAtPiAocmNvZGVfY29tcGxldGUpIik7CisJCQkJCXJjb2RlID0gUkNPREVfQ09NUExFVEU7CisJCQkJCW1lbWNweShzdG9yZSwgJm9sZCwgc2l6ZW9mKCpzdG9yZSkpOworCQkJCQltZW1jcHkoKGFybV9hZGRyLT5hZGRyX3NwYWNlX2J1ZmZlcikgKworCQkJCQkgICAgICAgKGFkZHIgLSAoYXJtX2FkZHItPnN0YXJ0KSksCisJCQkJCSAgICAgICAmbmV3LCBzaXplb2YoKnN0b3JlKSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcmNvZGUgPSBSQ09ERV9UWVBFX0VSUk9SOwkvKiBmdW5jdGlvbiBub3QgYWxsb3dlZCAqLworCQkJREJHTVNHKCJhcm1fbG9jayAtPiByY29kZV90eXBlX2Vycm9yIChhY2Nlc3MgZGVuaWVkKSIpOworCQl9CisJfQorCWlmIChhcm1fYWRkci0+bm90aWZpY2F0aW9uX29wdGlvbnMgJiBBUk1fTE9DSykgeworCQlieXRlX3QgKmJ1ZjEsICpidWYyOworCQlEQkdNU0coImFybV9sb2NrIC0+IGVudGVyaW5nIG5vdGlmaWNhdGlvbi1zZWN0aW9uIik7CisJCXJlcSA9IF9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KFNMQUJfQVRPTUlDKTsKKwkJaWYgKCFyZXEpIHsKKwkJCURCR01TRygiYXJtX2xvY2sgLT4gcmNvZGVfY29uZmxpY3RfZXJyb3IiKTsKKwkJCXNwaW5fdW5sb2NrKCZob3N0X2luZm9fbG9jayk7CisJCQlyZXR1cm4gKFJDT0RFX0NPTkZMSUNUX0VSUk9SKTsJLyogQSByZXNvdXJjZSBjb25mbGljdCB3YXMgZGV0ZWN0ZWQuCisJCQkJCQkJICAgVGhlIHJlcXVlc3QgbWF5IGJlIHJldHJpZWQgKi8KKwkJfQorCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdCkgKyBzaXplb2Yoc3RydWN0IGFybV9yZXNwb25zZSkgKyAzICogc2l6ZW9mKCpzdG9yZSkgKyBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0X3Jlc3BvbnNlKTsJLyogbWF4aW11bSAqLworCQlyZXEtPmRhdGEgPSBrbWFsbG9jKHNpemUsIFNMQUJfQVRPTUlDKTsKKwkJaWYgKCEocmVxLT5kYXRhKSkgeworCQkJZnJlZV9wZW5kaW5nX3JlcXVlc3QocmVxKTsKKwkJCURCR01TRygiYXJtX2xvY2sgLT4gcmNvZGVfY29uZmxpY3RfZXJyb3IiKTsKKwkJCXNwaW5fdW5sb2NrKCZob3N0X2luZm9fbG9jayk7CisJCQlyZXR1cm4gKFJDT0RFX0NPTkZMSUNUX0VSUk9SKTsJLyogQSByZXNvdXJjZSBjb25mbGljdCB3YXMgZGV0ZWN0ZWQuCisJCQkJCQkJICAgVGhlIHJlcXVlc3QgbWF5IGJlIHJldHJpZWQgKi8KKwkJfQorCQlyZXEtPmZyZWVfZGF0YSA9IDE7CisJCWFybV9yZXFfcmVzcCA9IChzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UgKikocmVxLT5kYXRhKTsKKwkJYXJtX3JlcSA9IChzdHJ1Y3QgYXJtX3JlcXVlc3QgKikoKGJ5dGVfdCAqKSAocmVxLT5kYXRhKSArCisJCQkJCQkgKHNpemVvZgorCQkJCQkJICAoc3RydWN0CisJCQkJCQkgICBhcm1fcmVxdWVzdF9yZXNwb25zZSkpKTsKKwkJYXJtX3Jlc3AgPQorCQkgICAgKHN0cnVjdCBhcm1fcmVzcG9uc2UgKikoKGJ5dGVfdCAqKSAoYXJtX3JlcSkgKworCQkJCQkgICAgKHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3QpKSk7CisJCWJ1ZjEgPSAoYnl0ZV90ICopIGFybV9yZXNwICsgc2l6ZW9mKHN0cnVjdCBhcm1fcmVzcG9uc2UpOworCQlidWYyID0gYnVmMSArIDIgKiBzaXplb2YoKnN0b3JlKTsKKwkJaWYgKChleHRfdGNvZGUgPT0gRVhUQ09ERV9GRVRDSF9BREQpIHx8CisJCSAgICAoZXh0X3Rjb2RlID09IEVYVENPREVfTElUVExFX0FERCkpIHsKKwkJCWFybV9yZXEtPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoKnN0b3JlKTsKKwkJCW1lbWNweShidWYxLCAmZGF0YSwgc2l6ZW9mKCpzdG9yZSkpOworCisJCX0gZWxzZSB7CisJCQlhcm1fcmVxLT5idWZmZXJfbGVuZ3RoID0gMiAqIHNpemVvZigqc3RvcmUpOworCQkJbWVtY3B5KGJ1ZjEsICZhcmcsIHNpemVvZigqc3RvcmUpKTsKKwkJCW1lbWNweShidWYxICsgc2l6ZW9mKCpzdG9yZSksICZkYXRhLCBzaXplb2YoKnN0b3JlKSk7CisJCX0KKwkJaWYgKHJjb2RlID09IFJDT0RFX0NPTVBMRVRFKSB7CisJCQlhcm1fcmVzcC0+YnVmZmVyX2xlbmd0aCA9IHNpemVvZigqc3RvcmUpOworCQkJbWVtY3B5KGJ1ZjIsICZvbGQsIHNpemVvZigqc3RvcmUpKTsKKwkJfSBlbHNlIHsKKwkJCWFybV9yZXNwLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkJfQorCQlyZXEtPmZpbGVfaW5mbyA9IGZpOworCQlyZXEtPnJlcS50eXBlID0gUkFXMTM5NF9SRVFfQVJNOworCQlyZXEtPnJlcS5nZW5lcmF0aW9uID0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihob3N0KTsKKwkJcmVxLT5yZXEubWlzYyA9ICgoKChzaXplb2YoKnN0b3JlKSkgPDwgMTYpICYgKDB4RkZGRjAwMDApKSB8CisJCQkJIChBUk1fTE9DSyAmIDB4RkYpKTsKKwkJcmVxLT5yZXEudGFnID0gYXJtX2FkZHItPmFybV90YWc7CisJCXJlcS0+cmVxLnJlY3ZiID0gYXJtX2FkZHItPnJlY3ZiOworCQlyZXEtPnJlcS5sZW5ndGggPSBzaXplOworCQlhcm1fcmVxLT5nZW5lcmF0aW9uID0gcmVxLT5yZXEuZ2VuZXJhdGlvbjsKKwkJYXJtX3JlcS0+ZXh0ZW5kZWRfdHJhbnNhY3Rpb25fY29kZSA9IGV4dF90Y29kZTsKKwkJYXJtX3JlcS0+ZGVzdGluYXRpb25fb2Zmc2V0ID0gYWRkcjsKKwkJYXJtX3JlcS0+c291cmNlX25vZGVpZCA9IG5vZGVpZDsKKwkJYXJtX3JlcS0+ZGVzdGluYXRpb25fbm9kZWlkID0gaG9zdC0+bm9kZV9pZDsKKwkJYXJtX3JlcS0+dGxhYmVsID0gKGZsYWdzID4+IDEwKSAmIDB4M2Y7CisJCWFybV9yZXEtPnRjb2RlID0gKGZsYWdzID4+IDQpICYgMHgwZjsKKwkJYXJtX3Jlc3AtPnJlc3BvbnNlX2NvZGUgPSByY29kZTsKKwkJYXJtX3JlcV9yZXNwLT5yZXF1ZXN0ID0gaW50MnB0cigoYXJtX2FkZHItPnJlY3ZiKSArCisJCQkJCQlzaXplb2Yoc3RydWN0CisJCQkJCQkgICAgICAgYXJtX3JlcXVlc3RfcmVzcG9uc2UpKTsKKwkJYXJtX3JlcV9yZXNwLT5yZXNwb25zZSA9CisJCSAgICBpbnQycHRyKChhcm1fYWRkci0+cmVjdmIpICsKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0X3Jlc3BvbnNlKSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdCkpOworCQlhcm1fcmVxLT5idWZmZXIgPQorCQkgICAgaW50MnB0cigoYXJtX2FkZHItPnJlY3ZiKSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdF9yZXNwb25zZSkgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3QpICsKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFybV9yZXNwb25zZSkpOworCQlhcm1fcmVzcC0+YnVmZmVyID0KKwkJICAgIGludDJwdHIoKGFybV9hZGRyLT5yZWN2YikgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UpICsKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0KSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVzcG9uc2UpICsgMiAqIHNpemVvZigqc3RvcmUpKTsKKwkJcXVldWVfY29tcGxldGVfcmVxKHJlcSk7CisJfQorCXNwaW5fdW5sb2NrKCZob3N0X2luZm9fbG9jayk7CisJcmV0dXJuIChyY29kZSk7Cit9CisKK3N0YXRpYyBpbnQgYXJtX2xvY2s2NChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBvY3RsZXRfdCAqIHN0b3JlLAorCQkgICAgICB1NjQgYWRkciwgb2N0bGV0X3QgZGF0YSwgb2N0bGV0X3QgYXJnLCBpbnQgZXh0X3Rjb2RlLAorCQkgICAgICB1MTYgZmxhZ3MpCit7CisJc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBob3N0X2luZm8gKmhpOworCXN0cnVjdCBmaWxlX2luZm8gKmZpID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgYXJtX2FkZHIgKmFybV9hZGRyID0gTlVMTDsKKwlzdHJ1Y3QgYXJtX3JlcXVlc3QgKmFybV9yZXEgPSBOVUxMOworCXN0cnVjdCBhcm1fcmVzcG9uc2UgKmFybV9yZXNwID0gTlVMTDsKKwlpbnQgZm91bmQgPSAwLCBzaXplID0gMCwgcmNvZGUgPSAtMTsKKwlvY3RsZXRfdCBvbGQsIG5ldzsKKwlzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UgKmFybV9yZXFfcmVzcCA9IE5VTEw7CisKKwlpZiAoKChleHRfdGNvZGUgJiAweEZGKSA9PSBFWFRDT0RFX0ZFVENIX0FERCkgfHwKKwkgICAgKChleHRfdGNvZGUgJiAweEZGKSA9PSBFWFRDT0RFX0xJVFRMRV9BREQpKSB7CisJCURCR01TRygiYXJtX2xvY2s2NCBjYWxsZWQgYnkgbm9kZTogJVggIgorCQkgICAgICAgImFkZHI6ICU0LjR4ICU4Ljh4IGV4dGNvZGU6ICUyLjJYIGRhdGE6ICU4LjhYICU4LjhYICIsCisJCSAgICAgICBub2RlaWQsICh1MTYpICgoYWRkciA+PiAzMikgJiAweEZGRkYpLAorCQkgICAgICAgKHUzMikgKGFkZHIgJiAweEZGRkZGRkZGKSwKKwkJICAgICAgIGV4dF90Y29kZSAmIDB4RkYsCisJCSAgICAgICAodTMyKSAoKGJlNjRfdG9fY3B1KGRhdGEpID4+IDMyKSAmIDB4RkZGRkZGRkYpLAorCQkgICAgICAgKHUzMikgKGJlNjRfdG9fY3B1KGRhdGEpICYgMHhGRkZGRkZGRikpOworCX0gZWxzZSB7CisJCURCR01TRygiYXJtX2xvY2s2NCBjYWxsZWQgYnkgbm9kZTogJVggIgorCQkgICAgICAgImFkZHI6ICU0LjR4ICU4Ljh4IGV4dGNvZGU6ICUyLjJYIGRhdGE6ICU4LjhYICU4LjhYIGFyZzogIgorCQkgICAgICAgIiU4LjhYICU4LjhYICIsCisJCSAgICAgICBub2RlaWQsICh1MTYpICgoYWRkciA+PiAzMikgJiAweEZGRkYpLAorCQkgICAgICAgKHUzMikgKGFkZHIgJiAweEZGRkZGRkZGKSwKKwkJICAgICAgIGV4dF90Y29kZSAmIDB4RkYsCisJCSAgICAgICAodTMyKSAoKGJlNjRfdG9fY3B1KGRhdGEpID4+IDMyKSAmIDB4RkZGRkZGRkYpLAorCQkgICAgICAgKHUzMikgKGJlNjRfdG9fY3B1KGRhdGEpICYgMHhGRkZGRkZGRiksCisJCSAgICAgICAodTMyKSAoKGJlNjRfdG9fY3B1KGFyZykgPj4gMzIpICYgMHhGRkZGRkZGRiksCisJCSAgICAgICAodTMyKSAoYmU2NF90b19jcHUoYXJnKSAmIDB4RkZGRkZGRkYpKTsKKwl9CisJc3Bpbl9sb2NrKCZob3N0X2luZm9fbG9jayk7CisJaGkgPSBmaW5kX2hvc3RfaW5mbyhob3N0KTsJLyogc2VhcmNoIGFkZHJlc3NlbnRyeSBpbiBmaWxlX2luZm8ncyBmb3IgaG9zdCAqLworCWlmIChoaSAhPSBOVUxMKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmksICZoaS0+ZmlsZV9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJCWVudHJ5ID0gZmktPmFkZHJfbGlzdC5uZXh0OworCQkJd2hpbGUgKGVudHJ5ICE9ICYoZmktPmFkZHJfbGlzdCkpIHsKKwkJCQlhcm1fYWRkciA9CisJCQkJICAgIGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBhcm1fYWRkciwKKwkJCQkJICAgICAgIGFkZHJfbGlzdCk7CisJCQkJaWYgKCgoYXJtX2FkZHItPnN0YXJ0KSA8PSAoYWRkcikpCisJCQkJICAgICYmICgoYXJtX2FkZHItPmVuZCkgPj0KKwkJCQkJKGFkZHIgKyBzaXplb2YoKnN0b3JlKSkpKSB7CisJCQkJCWZvdW5kID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQl9CisJCQlpZiAoZm91bmQpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyY29kZSA9IC0xOworCWlmICghZm91bmQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAicmF3MTM5NDogYXJtX2xvY2s2NCBGQUlMRUQgYWRkcl9lbnRyeSBub3QgZm91bmQiCisJCSAgICAgICAiIC0+IHJjb2RlX2FkZHJlc3NfZXJyb3JcbiIpOworCQlzcGluX3VubG9jaygmaG9zdF9pbmZvX2xvY2spOworCQlyZXR1cm4gKFJDT0RFX0FERFJFU1NfRVJST1IpOworCX0gZWxzZSB7CisJCURCR01TRygiYXJtX2xvY2s2NCBhZGRyX2VudHJ5IEZPVU5EIik7CisJfQorCWlmIChyY29kZSA9PSAtMSkgeworCQlpZiAoYXJtX2FkZHItPmFjY2Vzc19yaWdodHMgJiBBUk1fTE9DSykgeworCQkJaWYgKCEoYXJtX2FkZHItPmNsaWVudF90cmFuc2FjdGlvbnMgJiBBUk1fTE9DSykpIHsKKwkJCQltZW1jcHkoJm9sZCwKKwkJCQkgICAgICAgKGFybV9hZGRyLT5hZGRyX3NwYWNlX2J1ZmZlcikgKyAoYWRkciAtCisJCQkJCQkJCQkoYXJtX2FkZHItPgorCQkJCQkJCQkJIHN0YXJ0KSksCisJCQkJICAgICAgIHNpemVvZihvbGQpKTsKKwkJCQlzd2l0Y2ggKGV4dF90Y29kZSkgeworCQkJCWNhc2UgKEVYVENPREVfTUFTS19TV0FQKToKKwkJCQkJbmV3ID0gZGF0YSB8IChvbGQgJiB+YXJnKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAoRVhUQ09ERV9DT01QQVJFX1NXQVApOgorCQkJCQlpZiAob2xkID09IGFyZykgeworCQkJCQkJbmV3ID0gZGF0YTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5ldyA9IG9sZDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIChFWFRDT0RFX0ZFVENIX0FERCk6CisJCQkJCW5ldyA9CisJCQkJCSAgICBjcHVfdG9fYmU2NChiZTY0X3RvX2NwdShkYXRhKSArCisJCQkJCQkJYmU2NF90b19jcHUob2xkKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgKEVYVENPREVfTElUVExFX0FERCk6CisJCQkJCW5ldyA9CisJCQkJCSAgICBjcHVfdG9fbGU2NChsZTY0X3RvX2NwdShkYXRhKSArCisJCQkJCQkJbGU2NF90b19jcHUob2xkKSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgKEVYVENPREVfQk9VTkRFRF9BREQpOgorCQkJCQlpZiAob2xkICE9IGFyZykgeworCQkJCQkJbmV3ID0KKwkJCQkJCSAgICBjcHVfdG9fYmU2NChiZTY0X3RvX2NwdQorCQkJCQkJCQkoZGF0YSkgKworCQkJCQkJCQliZTY0X3RvX2NwdQorCQkJCQkJCQkob2xkKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQluZXcgPSBvbGQ7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAoRVhUQ09ERV9XUkFQX0FERCk6CisJCQkJCWlmIChvbGQgIT0gYXJnKSB7CisJCQkJCQluZXcgPQorCQkJCQkJICAgIGNwdV90b19iZTY0KGJlNjRfdG9fY3B1CisJCQkJCQkJCShkYXRhKSArCisJCQkJCQkJCWJlNjRfdG9fY3B1CisJCQkJCQkJCShvbGQpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5ldyA9IGRhdGE7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSAgICAgICAicmF3MTM5NDogYXJtX2xvY2s2NCBGQUlMRUQgIgorCQkJCQkgICAgICAgImV4dF90Y29kZSBub3QgYWxsb3dlZCAtPiByY29kZV90eXBlX2Vycm9yXG4iKTsKKwkJCQkJcmNvZGUgPSBSQ09ERV9UWVBFX0VSUk9SOwkvKiBmdW5jdGlvbiBub3QgYWxsb3dlZCAqLworCQkJCQlicmVhazsKKwkJCQl9CS8qc3dpdGNoICovCisJCQkJaWYgKHJjb2RlID09IC0xKSB7CisJCQkJCURCR01TRworCQkJCQkgICAgKCJhcm1fbG9jazY0IC0+IChyY29kZV9jb21wbGV0ZSkiKTsKKwkJCQkJcmNvZGUgPSBSQ09ERV9DT01QTEVURTsKKwkJCQkJbWVtY3B5KHN0b3JlLCAmb2xkLCBzaXplb2YoKnN0b3JlKSk7CisJCQkJCW1lbWNweSgoYXJtX2FkZHItPmFkZHJfc3BhY2VfYnVmZmVyKSArCisJCQkJCSAgICAgICAoYWRkciAtIChhcm1fYWRkci0+c3RhcnQpKSwKKwkJCQkJICAgICAgICZuZXcsIHNpemVvZigqc3RvcmUpKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlyY29kZSA9IFJDT0RFX1RZUEVfRVJST1I7CS8qIGZ1bmN0aW9uIG5vdCBhbGxvd2VkICovCisJCQlEQkdNU0cKKwkJCSAgICAoImFybV9sb2NrNjQgLT4gcmNvZGVfdHlwZV9lcnJvciAoYWNjZXNzIGRlbmllZCkiKTsKKwkJfQorCX0KKwlpZiAoYXJtX2FkZHItPm5vdGlmaWNhdGlvbl9vcHRpb25zICYgQVJNX0xPQ0spIHsKKwkJYnl0ZV90ICpidWYxLCAqYnVmMjsKKwkJREJHTVNHKCJhcm1fbG9jazY0IC0+IGVudGVyaW5nIG5vdGlmaWNhdGlvbi1zZWN0aW9uIik7CisJCXJlcSA9IF9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KFNMQUJfQVRPTUlDKTsKKwkJaWYgKCFyZXEpIHsKKwkJCXNwaW5fdW5sb2NrKCZob3N0X2luZm9fbG9jayk7CisJCQlEQkdNU0coImFybV9sb2NrNjQgLT4gcmNvZGVfY29uZmxpY3RfZXJyb3IiKTsKKwkJCXJldHVybiAoUkNPREVfQ09ORkxJQ1RfRVJST1IpOwkvKiBBIHJlc291cmNlIGNvbmZsaWN0IHdhcyBkZXRlY3RlZC4KKwkJCQkJCQkgICBUaGUgcmVxdWVzdCBtYXkgYmUgcmV0cmllZCAqLworCQl9CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0KSArIHNpemVvZihzdHJ1Y3QgYXJtX3Jlc3BvbnNlKSArIDMgKiBzaXplb2YoKnN0b3JlKSArIHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UpOwkvKiBtYXhpbXVtICovCisJCXJlcS0+ZGF0YSA9IGttYWxsb2Moc2l6ZSwgU0xBQl9BVE9NSUMpOworCQlpZiAoIShyZXEtPmRhdGEpKSB7CisJCQlmcmVlX3BlbmRpbmdfcmVxdWVzdChyZXEpOworCQkJc3Bpbl91bmxvY2soJmhvc3RfaW5mb19sb2NrKTsKKwkJCURCR01TRygiYXJtX2xvY2s2NCAtPiByY29kZV9jb25mbGljdF9lcnJvciIpOworCQkJcmV0dXJuIChSQ09ERV9DT05GTElDVF9FUlJPUik7CS8qIEEgcmVzb3VyY2UgY29uZmxpY3Qgd2FzIGRldGVjdGVkLgorCQkJCQkJCSAgIFRoZSByZXF1ZXN0IG1heSBiZSByZXRyaWVkICovCisJCX0KKwkJcmVxLT5mcmVlX2RhdGEgPSAxOworCQlhcm1fcmVxX3Jlc3AgPSAoc3RydWN0IGFybV9yZXF1ZXN0X3Jlc3BvbnNlICopKHJlcS0+ZGF0YSk7CisJCWFybV9yZXEgPSAoc3RydWN0IGFybV9yZXF1ZXN0ICopKChieXRlX3QgKikgKHJlcS0+ZGF0YSkgKworCQkJCQkJIChzaXplb2YKKwkJCQkJCSAgKHN0cnVjdAorCQkJCQkJICAgYXJtX3JlcXVlc3RfcmVzcG9uc2UpKSk7CisJCWFybV9yZXNwID0KKwkJICAgIChzdHJ1Y3QgYXJtX3Jlc3BvbnNlICopKChieXRlX3QgKikgKGFybV9yZXEpICsKKwkJCQkJICAgIChzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0KSkpOworCQlidWYxID0gKGJ5dGVfdCAqKSBhcm1fcmVzcCArIHNpemVvZihzdHJ1Y3QgYXJtX3Jlc3BvbnNlKTsKKwkJYnVmMiA9IGJ1ZjEgKyAyICogc2l6ZW9mKCpzdG9yZSk7CisJCWlmICgoZXh0X3Rjb2RlID09IEVYVENPREVfRkVUQ0hfQUREKSB8fAorCQkgICAgKGV4dF90Y29kZSA9PSBFWFRDT0RFX0xJVFRMRV9BREQpKSB7CisJCQlhcm1fcmVxLT5idWZmZXJfbGVuZ3RoID0gc2l6ZW9mKCpzdG9yZSk7CisJCQltZW1jcHkoYnVmMSwgJmRhdGEsIHNpemVvZigqc3RvcmUpKTsKKworCQl9IGVsc2UgeworCQkJYXJtX3JlcS0+YnVmZmVyX2xlbmd0aCA9IDIgKiBzaXplb2YoKnN0b3JlKTsKKwkJCW1lbWNweShidWYxLCAmYXJnLCBzaXplb2YoKnN0b3JlKSk7CisJCQltZW1jcHkoYnVmMSArIHNpemVvZigqc3RvcmUpLCAmZGF0YSwgc2l6ZW9mKCpzdG9yZSkpOworCQl9CisJCWlmIChyY29kZSA9PSBSQ09ERV9DT01QTEVURSkgeworCQkJYXJtX3Jlc3AtPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoKnN0b3JlKTsKKwkJCW1lbWNweShidWYyLCAmb2xkLCBzaXplb2YoKnN0b3JlKSk7CisJCX0gZWxzZSB7CisJCQlhcm1fcmVzcC0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCX0KKwkJcmVxLT5maWxlX2luZm8gPSBmaTsKKwkJcmVxLT5yZXEudHlwZSA9IFJBVzEzOTRfUkVRX0FSTTsKKwkJcmVxLT5yZXEuZ2VuZXJhdGlvbiA9IGdldF9ocHNiX2dlbmVyYXRpb24oaG9zdCk7CisJCXJlcS0+cmVxLm1pc2MgPSAoKCgoc2l6ZW9mKCpzdG9yZSkpIDw8IDE2KSAmICgweEZGRkYwMDAwKSkgfAorCQkJCSAoQVJNX0xPQ0sgJiAweEZGKSk7CisJCXJlcS0+cmVxLnRhZyA9IGFybV9hZGRyLT5hcm1fdGFnOworCQlyZXEtPnJlcS5yZWN2YiA9IGFybV9hZGRyLT5yZWN2YjsKKwkJcmVxLT5yZXEubGVuZ3RoID0gc2l6ZTsKKwkJYXJtX3JlcS0+Z2VuZXJhdGlvbiA9IHJlcS0+cmVxLmdlbmVyYXRpb247CisJCWFybV9yZXEtPmV4dGVuZGVkX3RyYW5zYWN0aW9uX2NvZGUgPSBleHRfdGNvZGU7CisJCWFybV9yZXEtPmRlc3RpbmF0aW9uX29mZnNldCA9IGFkZHI7CisJCWFybV9yZXEtPnNvdXJjZV9ub2RlaWQgPSBub2RlaWQ7CisJCWFybV9yZXEtPmRlc3RpbmF0aW9uX25vZGVpZCA9IGhvc3QtPm5vZGVfaWQ7CisJCWFybV9yZXEtPnRsYWJlbCA9IChmbGFncyA+PiAxMCkgJiAweDNmOworCQlhcm1fcmVxLT50Y29kZSA9IChmbGFncyA+PiA0KSAmIDB4MGY7CisJCWFybV9yZXNwLT5yZXNwb25zZV9jb2RlID0gcmNvZGU7CisJCWFybV9yZXFfcmVzcC0+cmVxdWVzdCA9IGludDJwdHIoKGFybV9hZGRyLT5yZWN2YikgKworCQkJCQkJc2l6ZW9mKHN0cnVjdAorCQkJCQkJICAgICAgIGFybV9yZXF1ZXN0X3Jlc3BvbnNlKSk7CisJCWFybV9yZXFfcmVzcC0+cmVzcG9uc2UgPQorCQkgICAgaW50MnB0cigoYXJtX2FkZHItPnJlY3ZiKSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdF9yZXNwb25zZSkgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3QpKTsKKwkJYXJtX3JlcS0+YnVmZmVyID0KKwkJICAgIGludDJwdHIoKGFybV9hZGRyLT5yZWN2YikgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UpICsKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0KSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVzcG9uc2UpKTsKKwkJYXJtX3Jlc3AtPmJ1ZmZlciA9CisJCSAgICBpbnQycHRyKChhcm1fYWRkci0+cmVjdmIpICsKKwkJCSAgICBzaXplb2Yoc3RydWN0IGFybV9yZXF1ZXN0X3Jlc3BvbnNlKSArCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhcm1fcmVxdWVzdCkgKworCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJtX3Jlc3BvbnNlKSArIDIgKiBzaXplb2YoKnN0b3JlKSk7CisJCXF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworCX0KKwlzcGluX3VubG9jaygmaG9zdF9pbmZvX2xvY2spOworCXJldHVybiAocmNvZGUpOworfQorCitzdGF0aWMgaW50IGFybV9yZWdpc3RlcihzdHJ1Y3QgZmlsZV9pbmZvICpmaSwgc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGFybV9hZGRyICphZGRyOworCXN0cnVjdCBob3N0X2luZm8gKmhpOworCXN0cnVjdCBmaWxlX2luZm8gKmZpX2hscCA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJc3RydWN0IGFybV9hZGRyICphcm1fYWRkciA9IE5VTEw7CisJaW50IHNhbWVfaG9zdCwgYW5vdGhlcl9ob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEQkdNU0coImFybV9yZWdpc3RlciBjYWxsZWQgIgorCSAgICAgICAiYWRkcihPZmZzZXQpOiAlOC44eCAlOC44eCBsZW5ndGg6ICV1ICIKKwkgICAgICAgInJpZ2h0czogJTIuMlggbm90aWZ5OiAlMi4yWCAiCisJICAgICAgICJtYXhfYmxrX2xlbjogJTQuNFgiLAorCSAgICAgICAodTMyKSAoKHJlcS0+cmVxLmFkZHJlc3MgPj4gMzIpICYgMHhGRkZGKSwKKwkgICAgICAgKHUzMikgKHJlcS0+cmVxLmFkZHJlc3MgJiAweEZGRkZGRkZGKSwKKwkgICAgICAgcmVxLT5yZXEubGVuZ3RoLCAoKHJlcS0+cmVxLm1pc2MgPj4gOCkgJiAweEZGKSwKKwkgICAgICAgKHJlcS0+cmVxLm1pc2MgJiAweEZGKSwgKChyZXEtPnJlcS5taXNjID4+IDE2KSAmIDB4RkZGRikpOworCS8qIGNoZWNrIGFkZHJlc3NyYW5nZSAqLworCWlmICgoKChyZXEtPnJlcS5hZGRyZXNzKSAmIH4oMHhGRkZGRkZGRkZGRkZVTEwpKSAhPSAwKSB8fAorCSAgICAoKChyZXEtPnJlcS5hZGRyZXNzICsgcmVxLT5yZXEubGVuZ3RoKSAmIH4oMHhGRkZGRkZGRkZGRkZVTEwpKSAhPQorCSAgICAgMCkpIHsKKwkJcmVxLT5yZXEubGVuZ3RoID0gMDsKKwkJcmV0dXJuICgtRUlOVkFMKTsKKwl9CisJLyogYWRkci1saXN0LWVudHJ5IGZvciBmaWxlaW5mbyAqLworCWFkZHIgPSAoc3RydWN0IGFybV9hZGRyICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGFybV9hZGRyKSwgU0xBQl9LRVJORUwpOworCWlmICghYWRkcikgeworCQlyZXEtPnJlcS5sZW5ndGggPSAwOworCQlyZXR1cm4gKC1FTk9NRU0pOworCX0KKwkvKiBhbGxvY2F0aW9uIG9mIGFkZHJfc3BhY2VfYnVmZmVyICovCisJYWRkci0+YWRkcl9zcGFjZV9idWZmZXIgPSAodTggKikgdm1hbGxvYyhyZXEtPnJlcS5sZW5ndGgpOworCWlmICghKGFkZHItPmFkZHJfc3BhY2VfYnVmZmVyKSkgeworCQlrZnJlZShhZGRyKTsKKwkJcmVxLT5yZXEubGVuZ3RoID0gMDsKKwkJcmV0dXJuICgtRU5PTUVNKTsKKwl9CisJLyogaW5pdGlhbGl6YXRpb24gb2YgYWRkcl9zcGFjZV9idWZmZXIgKi8KKwlpZiAoKHJlcS0+cmVxLnNlbmRiKSA9PSAodW5zaWduZWQgbG9uZylOVUxMKSB7CisJCS8qIGluaXQ6IHNldCAwICovCisJCW1lbXNldChhZGRyLT5hZGRyX3NwYWNlX2J1ZmZlciwgMCwgcmVxLT5yZXEubGVuZ3RoKTsKKwl9IGVsc2UgeworCQkvKiBpbml0OiB1c2VyIC0+IGtlcm5lbCAqLworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJICAgIChhZGRyLT5hZGRyX3NwYWNlX2J1ZmZlciwgaW50MnB0cihyZXEtPnJlcS5zZW5kYiksCisJCSAgICAgcmVxLT5yZXEubGVuZ3RoKSkgeworCQkJdmZyZWUoYWRkci0+YWRkcl9zcGFjZV9idWZmZXIpOworCQkJa2ZyZWUoYWRkcik7CisJCQlyZXR1cm4gKC1FRkFVTFQpOworCQl9CisJfQorCUlOSVRfTElTVF9IRUFEKCZhZGRyLT5hZGRyX2xpc3QpOworCWFkZHItPmFybV90YWcgPSByZXEtPnJlcS50YWc7CisJYWRkci0+c3RhcnQgPSByZXEtPnJlcS5hZGRyZXNzOworCWFkZHItPmVuZCA9IHJlcS0+cmVxLmFkZHJlc3MgKyByZXEtPnJlcS5sZW5ndGg7CisJYWRkci0+YWNjZXNzX3JpZ2h0cyA9ICh1OCkgKHJlcS0+cmVxLm1pc2MgJiAweDBGKTsKKwlhZGRyLT5ub3RpZmljYXRpb25fb3B0aW9ucyA9ICh1OCkgKChyZXEtPnJlcS5taXNjID4+IDQpICYgMHgwRik7CisJYWRkci0+Y2xpZW50X3RyYW5zYWN0aW9ucyA9ICh1OCkgKChyZXEtPnJlcS5taXNjID4+IDgpICYgMHgwRik7CisJYWRkci0+YWNjZXNzX3JpZ2h0cyB8PSBhZGRyLT5jbGllbnRfdHJhbnNhY3Rpb25zOworCWFkZHItPm5vdGlmaWNhdGlvbl9vcHRpb25zIHw9IGFkZHItPmNsaWVudF90cmFuc2FjdGlvbnM7CisJYWRkci0+cmVjdmIgPSByZXEtPnJlcS5yZWN2YjsKKwlhZGRyLT5yZWNfbGVuZ3RoID0gKHUxNikgKChyZXEtPnJlcS5taXNjID4+IDE2KSAmIDB4RkZGRik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJaGkgPSBmaW5kX2hvc3RfaW5mbyhmaS0+aG9zdCk7CisJc2FtZV9ob3N0ID0gMDsKKwlhbm90aGVyX2hvc3QgPSAwOworCS8qIHNhbWUgaG9zdCB3aXRoIGFkZHJlc3MtZW50cnkgY29udGFpbmluZyBzYW1lIGFkZHJlc3NyYW5nZSA/ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaV9obHAsICZoaS0+ZmlsZV9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJZW50cnkgPSBmaV9obHAtPmFkZHJfbGlzdC5uZXh0OworCQl3aGlsZSAoZW50cnkgIT0gJihmaV9obHAtPmFkZHJfbGlzdCkpIHsKKwkJCWFybV9hZGRyID0KKwkJCSAgICBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgYXJtX2FkZHIsIGFkZHJfbGlzdCk7CisJCQlpZiAoKGFybV9hZGRyLT5zdGFydCA9PSBhZGRyLT5zdGFydCkKKwkJCSAgICAmJiAoYXJtX2FkZHItPmVuZCA9PSBhZGRyLT5lbmQpKSB7CisJCQkJREJHTVNHKCJzYW1lIGhvc3Qgb3duZXMgc2FtZSAiCisJCQkJICAgICAgICJhZGRyZXNzcmFuZ2UgLT4gRUFMUkVBRFkiKTsKKwkJCQlzYW1lX2hvc3QgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwkJfQorCQlpZiAoc2FtZV9ob3N0KSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoc2FtZV9ob3N0KSB7CisJCS8qIGFkZHJlc3NyYW5nZSBvY2N1cGllZCBieSBzYW1lIGhvc3QgKi8KKwkJdmZyZWUoYWRkci0+YWRkcl9zcGFjZV9idWZmZXIpOworCQlrZnJlZShhZGRyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9pbmZvX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuICgtRUFMUkVBRFkpOworCX0KKwkvKiBhbm90aGVyIGhvc3Qgd2l0aCB2YWxpZCBhZGRyZXNzLWVudHJ5IGNvbnRhaW5pbmcgc2FtZSBhZGRyZXNzcmFuZ2UgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhpLCAmaG9zdF9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGhpLT5ob3N0ICE9IGZpLT5ob3N0KSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpX2hscCwgJmhpLT5maWxlX2luZm9fbGlzdCwgbGlzdCkgeworCQkJCWVudHJ5ID0gZmlfaGxwLT5hZGRyX2xpc3QubmV4dDsKKwkJCQl3aGlsZSAoZW50cnkgIT0gJihmaV9obHAtPmFkZHJfbGlzdCkpIHsKKwkJCQkJYXJtX2FkZHIgPQorCQkJCQkgICAgbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGFybV9hZGRyLAorCQkJCQkJICAgICAgIGFkZHJfbGlzdCk7CisJCQkJCWlmICgoYXJtX2FkZHItPnN0YXJ0ID09IGFkZHItPnN0YXJ0KQorCQkJCQkgICAgJiYgKGFybV9hZGRyLT5lbmQgPT0gYWRkci0+ZW5kKSkgeworCQkJCQkJREJHTVNHCisJCQkJCQkgICAgKCJhbm90aGVyIGhvc3Qgb3duZXMgc2FtZSAiCisJCQkJCQkgICAgICJhZGRyZXNzcmFuZ2UiKTsKKwkJCQkJCWFub3RoZXJfaG9zdCA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQkJCX0KKwkJCQlpZiAoYW5vdGhlcl9ob3N0KSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoYW5vdGhlcl9ob3N0KSB7CisJCURCR01TRygiYW5vdGhlciBob3N0cyBlbnRyeSBpcyB2YWxpZCAtPiBTVUNDRVNTIik7CisJCWlmIChjb3B5X3RvX3VzZXIoaW50MnB0cihyZXEtPnJlcS5yZWN2YiksCisJCQkJICZhZGRyLT5zdGFydCwgc2l6ZW9mKHU2NCkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInJhdzEzOTQ6IGFybV9yZWdpc3RlciBmYWlsZWQgIgorCQkJICAgICAgICIgYWRkcmVzcy1yYW5nZS1lbnRyeSBpcyBpbnZhbGlkIC0+IEVGQVVMVCAhISFcbiIpOworCQkJdmZyZWUoYWRkci0+YWRkcl9zcGFjZV9idWZmZXIpOworCQkJa2ZyZWUoYWRkcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0X2luZm9fbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJfQorCQlmcmVlX3BlbmRpbmdfcmVxdWVzdChyZXEpOwkvKiBpbW1lZGlhdGUgc3VjY2VzcyBvciBmYWlsICovCisJCS8qIElOU0VSVCBFTlRSWSAqLworCQlsaXN0X2FkZF90YWlsKCZhZGRyLT5hZGRyX2xpc3QsICZmaS0+YWRkcl9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9pbmZvX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKKwl9CisJcmV0dmFsID0KKwkgICAgaHBzYl9yZWdpc3Rlcl9hZGRyc3BhY2UoJnJhdzEzOTRfaGlnaGxldmVsLCBmaS0+aG9zdCwgJmFybV9vcHMsCisJCQkJICAgIHJlcS0+cmVxLmFkZHJlc3MsCisJCQkJICAgIHJlcS0+cmVxLmFkZHJlc3MgKyByZXEtPnJlcS5sZW5ndGgpOworCWlmIChyZXR2YWwpIHsKKwkJLyogSU5TRVJUIEVOVFJZICovCisJCWxpc3RfYWRkX3RhaWwoJmFkZHItPmFkZHJfbGlzdCwgJmZpLT5hZGRyX2xpc3QpOworCX0gZWxzZSB7CisJCURCR01TRygiYXJtX3JlZ2lzdGVyIGZhaWxlZCBlcnJubzogJWQgXG4iLCByZXR2YWwpOworCQl2ZnJlZShhZGRyLT5hZGRyX3NwYWNlX2J1ZmZlcik7CisJCWtmcmVlKGFkZHIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0X2luZm9fbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gKC1FQUxSRUFEWSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJZnJlZV9wZW5kaW5nX3JlcXVlc3QocmVxKTsJLyogaW1tZWRpYXRlIHN1Y2Nlc3Mgb3IgZmFpbCAqLworCXJldHVybiBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7Cit9CisKK3N0YXRpYyBpbnQgYXJtX3VucmVnaXN0ZXIoc3RydWN0IGZpbGVfaW5mbyAqZmksIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgZm91bmQgPSAwOworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXN0cnVjdCBhcm1fYWRkciAqYWRkciA9IE5VTEw7CisJc3RydWN0IGhvc3RfaW5mbyAqaGk7CisJc3RydWN0IGZpbGVfaW5mbyAqZmlfaGxwID0gTlVMTDsKKwlzdHJ1Y3QgYXJtX2FkZHIgKmFybV9hZGRyID0gTlVMTDsKKwlpbnQgYW5vdGhlcl9ob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEQkdNU0coImFybV9VbnJlZ2lzdGVyIGNhbGxlZCBhZGRyKE9mZnNldCk6ICIKKwkgICAgICAgIiU4Ljh4ICU4Ljh4IiwKKwkgICAgICAgKHUzMikgKChyZXEtPnJlcS5hZGRyZXNzID4+IDMyKSAmIDB4RkZGRiksCisJICAgICAgICh1MzIpIChyZXEtPnJlcS5hZGRyZXNzICYgMHhGRkZGRkZGRikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0X2luZm9fbG9jaywgZmxhZ3MpOworCS8qIGdldCBhZGRyICovCisJZW50cnkgPSBmaS0+YWRkcl9saXN0Lm5leHQ7CisJd2hpbGUgKGVudHJ5ICE9ICYoZmktPmFkZHJfbGlzdCkpIHsKKwkJYWRkciA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBhcm1fYWRkciwgYWRkcl9saXN0KTsKKwkJaWYgKGFkZHItPnN0YXJ0ID09IHJlcS0+cmVxLmFkZHJlc3MpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJfQorCWlmICghZm91bmQpIHsKKwkJREJHTVNHKCJhcm1fVW5yZWdpc3RlciBhZGRyIG5vdCBmb3VuZCIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0X2luZm9fbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gKC1FSU5WQUwpOworCX0KKwlEQkdNU0coImFybV9VbnJlZ2lzdGVyIGFkZHIgZm91bmQiKTsKKwlhbm90aGVyX2hvc3QgPSAwOworCS8qIGFub3RoZXIgaG9zdCB3aXRoIHZhbGlkIGFkZHJlc3MtZW50cnkgY29udGFpbmluZworCSAgIHNhbWUgYWRkcmVzc3JhbmdlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShoaSwgJmhvc3RfaW5mb19saXN0LCBsaXN0KSB7CisJCWlmIChoaS0+aG9zdCAhPSBmaS0+aG9zdCkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmaV9obHAsICZoaS0+ZmlsZV9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJCQllbnRyeSA9IGZpX2hscC0+YWRkcl9saXN0Lm5leHQ7CisJCQkJd2hpbGUgKGVudHJ5ICE9ICYoZmlfaGxwLT5hZGRyX2xpc3QpKSB7CisJCQkJCWFybV9hZGRyID0gbGlzdF9lbnRyeShlbnRyeSwKKwkJCQkJCQkgICAgICBzdHJ1Y3QgYXJtX2FkZHIsCisJCQkJCQkJICAgICAgYWRkcl9saXN0KTsKKwkJCQkJaWYgKGFybV9hZGRyLT5zdGFydCA9PSBhZGRyLT5zdGFydCkgeworCQkJCQkJREJHTVNHKCJhbm90aGVyIGhvc3Qgb3duZXMgIgorCQkJCQkJICAgICAgICJzYW1lIGFkZHJlc3NyYW5nZSIpOworCQkJCQkJYW5vdGhlcl9ob3N0ID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQkJfQorCQkJCWlmIChhbm90aGVyX2hvc3QpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChhbm90aGVyX2hvc3QpIHsKKwkJREJHTVNHKCJkZWxldGUgZW50cnkgZnJvbSBsaXN0IC0+IHN1Y2Nlc3MiKTsKKwkJbGlzdF9kZWwoJmFkZHItPmFkZHJfbGlzdCk7CisJCXZmcmVlKGFkZHItPmFkZHJfc3BhY2VfYnVmZmVyKTsKKwkJa2ZyZWUoYWRkcik7CisJCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CS8qIGltbWVkaWF0ZSBzdWNjZXNzIG9yIGZhaWwgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9pbmZvX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKKwl9CisJcmV0dmFsID0KKwkgICAgaHBzYl91bnJlZ2lzdGVyX2FkZHJzcGFjZSgmcmF3MTM5NF9oaWdobGV2ZWwsIGZpLT5ob3N0LAorCQkJCSAgICAgIGFkZHItPnN0YXJ0KTsKKwlpZiAoIXJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgInJhdzEzOTQ6IGFybV9VbnJlZ2lzdGVyIGZhaWxlZCAtPiBFSU5WQUxcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0X2luZm9fbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gKC1FSU5WQUwpOworCX0KKwlEQkdNU0coImRlbGV0ZSBlbnRyeSBmcm9tIGxpc3QgLT4gc3VjY2VzcyIpOworCWxpc3RfZGVsKCZhZGRyLT5hZGRyX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJdmZyZWUoYWRkci0+YWRkcl9zcGFjZV9idWZmZXIpOworCWtmcmVlKGFkZHIpOworCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CS8qIGltbWVkaWF0ZSBzdWNjZXNzIG9yIGZhaWwgKi8KKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworfQorCisvKiBDb3B5IGRhdGEgZnJvbSBBUk0gYnVmZmVyKHMpIHRvIHVzZXIgYnVmZmVyLiAqLworc3RhdGljIGludCBhcm1fZ2V0X2J1ZihzdHJ1Y3QgZmlsZV9pbmZvICpmaSwgc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBhcm1fYWRkciAqYXJtX2FkZHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCURCR01TRygiYXJtX2dldF9idWYgIgorCSAgICAgICAiYWRkcihPZmZzZXQpOiAlMDRYICUwOFggbGVuZ3RoOiAldSIsCisJICAgICAgICh1MzIpICgocmVxLT5yZXEuYWRkcmVzcyA+PiAzMikgJiAweEZGRkYpLAorCSAgICAgICAodTMyKSAocmVxLT5yZXEuYWRkcmVzcyAmIDB4RkZGRkZGRkYpLCAodTMyKSByZXEtPnJlcS5sZW5ndGgpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJZW50cnkgPSBmaS0+YWRkcl9saXN0Lm5leHQ7CisJd2hpbGUgKGVudHJ5ICE9ICYoZmktPmFkZHJfbGlzdCkpIHsKKwkJYXJtX2FkZHIgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgYXJtX2FkZHIsIGFkZHJfbGlzdCk7CisJCWlmICgoYXJtX2FkZHItPnN0YXJ0IDw9IHJlcS0+cmVxLmFkZHJlc3MpICYmCisJCSAgICAoYXJtX2FkZHItPmVuZCA+IHJlcS0+cmVxLmFkZHJlc3MpKSB7CisJCQlpZiAocmVxLT5yZXEuYWRkcmVzcyArIHJlcS0+cmVxLmxlbmd0aCA8PSBhcm1fYWRkci0+ZW5kKSB7CisJCQkJb2Zmc2V0ID0gcmVxLT5yZXEuYWRkcmVzcyAtIGFybV9hZGRyLT5zdGFydDsKKworCQkJCURCR01TRworCQkJCSAgICAoImFybV9nZXRfYnVmIGNvcHlfdG9fdXNlciggJTA4WCwgJXAsICV1ICkiLAorCQkJCSAgICAgKHUzMikgcmVxLT5yZXEucmVjdmIsCisJCQkJICAgICBhcm1fYWRkci0+YWRkcl9zcGFjZV9idWZmZXIgKyBvZmZzZXQsCisJCQkJICAgICAodTMyKSByZXEtPnJlcS5sZW5ndGgpOworCisJCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJCSAgICAoaW50MnB0cihyZXEtPnJlcS5yZWN2YiksCisJCQkJICAgICBhcm1fYWRkci0+YWRkcl9zcGFjZV9idWZmZXIgKyBvZmZzZXQsCisJCQkJICAgICByZXEtPnJlcS5sZW5ndGgpKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLAorCQkJCQkJCSAgICAgICBmbGFncyk7CisJCQkJCXJldHVybiAoLUVGQVVMVCk7CisJCQkJfQorCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9pbmZvX2xvY2ssIGZsYWdzKTsKKwkJCQkvKiBXZSBoYXZlIHRvIGZyZWUgdGhlIHJlcXVlc3QsIGJlY2F1c2Ugd2UKKwkJCQkgKiBxdWV1ZSBubyByZXNwb25zZSwgYW5kIHRoZXJlZm9yZSBub2JvZHkKKwkJCQkgKiB3aWxsIGZyZWUgaXQuICovCisJCQkJZnJlZV9wZW5kaW5nX3JlcXVlc3QocmVxKTsKKwkJCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworCQkJfSBlbHNlIHsKKwkJCQlEQkdNU0coImFybV9nZXRfYnVmIHJlcXVlc3QgZXhjZWVkZWQgbWFwcGluZyIpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuICgtRUlOVkFMKTsKKwkJCX0KKwkJfQorCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0X2luZm9fbG9jaywgZmxhZ3MpOworCXJldHVybiAoLUVJTlZBTCk7Cit9CisKKy8qIENvcHkgZGF0YSBmcm9tIHVzZXIgYnVmZmVyIHRvIEFSTSBidWZmZXIocykuICovCitzdGF0aWMgaW50IGFybV9zZXRfYnVmKHN0cnVjdCBmaWxlX2luZm8gKmZpLCBzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGFybV9hZGRyICphcm1fYWRkciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJREJHTVNHKCJhcm1fc2V0X2J1ZiAiCisJICAgICAgICJhZGRyKE9mZnNldCk6ICUwNFggJTA4WCBsZW5ndGg6ICV1IiwKKwkgICAgICAgKHUzMikgKChyZXEtPnJlcS5hZGRyZXNzID4+IDMyKSAmIDB4RkZGRiksCisJICAgICAgICh1MzIpIChyZXEtPnJlcS5hZGRyZXNzICYgMHhGRkZGRkZGRiksICh1MzIpIHJlcS0+cmVxLmxlbmd0aCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdF9pbmZvX2xvY2ssIGZsYWdzKTsKKwllbnRyeSA9IGZpLT5hZGRyX2xpc3QubmV4dDsKKwl3aGlsZSAoZW50cnkgIT0gJihmaS0+YWRkcl9saXN0KSkgeworCQlhcm1fYWRkciA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBhcm1fYWRkciwgYWRkcl9saXN0KTsKKwkJaWYgKChhcm1fYWRkci0+c3RhcnQgPD0gcmVxLT5yZXEuYWRkcmVzcykgJiYKKwkJICAgIChhcm1fYWRkci0+ZW5kID4gcmVxLT5yZXEuYWRkcmVzcykpIHsKKwkJCWlmIChyZXEtPnJlcS5hZGRyZXNzICsgcmVxLT5yZXEubGVuZ3RoIDw9IGFybV9hZGRyLT5lbmQpIHsKKwkJCQlvZmZzZXQgPSByZXEtPnJlcS5hZGRyZXNzIC0gYXJtX2FkZHItPnN0YXJ0OworCisJCQkJREJHTVNHCisJCQkJICAgICgiYXJtX3NldF9idWYgY29weV9mcm9tX3VzZXIoICVwLCAlMDhYLCAldSApIiwKKwkJCQkgICAgIGFybV9hZGRyLT5hZGRyX3NwYWNlX2J1ZmZlciArIG9mZnNldCwKKwkJCQkgICAgICh1MzIpIHJlcS0+cmVxLnNlbmRiLAorCQkJCSAgICAgKHUzMikgcmVxLT5yZXEubGVuZ3RoKTsKKworCQkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJCSAgICAoYXJtX2FkZHItPmFkZHJfc3BhY2VfYnVmZmVyICsgb2Zmc2V0LAorCQkJCSAgICAgaW50MnB0cihyZXEtPnJlcS5zZW5kYiksCisJCQkJICAgICByZXEtPnJlcS5sZW5ndGgpKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLAorCQkJCQkJCSAgICAgICBmbGFncyk7CisJCQkJCXJldHVybiAoLUVGQVVMVCk7CisJCQkJfQorCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9pbmZvX2xvY2ssIGZsYWdzKTsKKwkJCQlmcmVlX3BlbmRpbmdfcmVxdWVzdChyZXEpOwkvKiB3ZSBoYXZlIHRvIGZyZWUgdGhlIHJlcXVlc3QsIGJlY2F1c2Ugd2UgcXVldWUgbm8gcmVzcG9uc2UsIGFuZCB0aGVyZWZvcmUgbm9ib2R5IHdpbGwgZnJlZSBpdCAqLworCQkJCXJldHVybiBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7CisJCQl9IGVsc2UgeworCQkJCURCR01TRygiYXJtX3NldF9idWYgcmVxdWVzdCBleGNlZWRlZCBtYXBwaW5nIik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdF9pbmZvX2xvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gKC1FSU5WQUwpOworCQkJfQorCQl9CisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7CisJcmV0dXJuICgtRUlOVkFMKTsKK30KKworc3RhdGljIGludCByZXNldF9ub3RpZmljYXRpb24oc3RydWN0IGZpbGVfaW5mbyAqZmksIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSkKK3sKKwlEQkdNU0coInJlc2V0X25vdGlmaWNhdGlvbiBjYWxsZWQgLSBzd2l0Y2ggJXMgIiwKKwkgICAgICAgKHJlcS0+cmVxLm1pc2MgPT0gUkFXMTM5NF9OT1RJRllfT0ZGKSA/ICJPRkYiIDogIk9OIik7CisJaWYgKChyZXEtPnJlcS5taXNjID09IFJBVzEzOTRfTk9USUZZX09GRikgfHwKKwkgICAgKHJlcS0+cmVxLm1pc2MgPT0gUkFXMTM5NF9OT1RJRllfT04pKSB7CisJCWZpLT5ub3RpZmljYXRpb24gPSAodTgpIHJlcS0+cmVxLm1pc2M7CisJCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CS8qIHdlIGhhdmUgdG8gZnJlZSB0aGUgcmVxdWVzdCwgYmVjYXVzZSB3ZSBxdWV1ZSBubyByZXNwb25zZSwgYW5kIHRoZXJlZm9yZSBub2JvZHkgd2lsbCBmcmVlIGl0ICovCisJCXJldHVybiBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7CisJfQorCS8qIGVycm9yIEVJTlZBTCAoMjIpIGludmFsaWQgYXJndW1lbnQgKi8KKwlyZXR1cm4gKC1FSU5WQUwpOworfQorCitzdGF0aWMgaW50IHdyaXRlX3BoeXBhY2tldChzdHJ1Y3QgZmlsZV9pbmZvICpmaSwgc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBocHNiX3BhY2tldCAqcGFja2V0ID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gMDsKKwlxdWFkbGV0X3QgZGF0YTsKKworCWRhdGEgPSBiZTMyX3RvX2NwdSgodTMyKSByZXEtPnJlcS5zZW5kYik7CisJREJHTVNHKCJ3cml0ZV9waHlwYWNrZXQgY2FsbGVkIC0gcXVhZGxldCAweCU4Ljh4ICIsIGRhdGEpOworCXBhY2tldCA9IGhwc2JfbWFrZV9waHlwYWNrZXQoZmktPmhvc3QsIGRhdGEpOworCWlmICghcGFja2V0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXEtPnJlcS5sZW5ndGggPSAwOworCXJlcS0+cGFja2V0ID0gcGFja2V0OworCWhwc2Jfc2V0X3BhY2tldF9jb21wbGV0ZV90YXNrKHBhY2tldCwKKwkJCQkgICAgICAodm9pZCAoKikodm9pZCAqKSlxdWV1ZV9jb21wbGV0ZV9jYiwgcmVxKTsKKwlzcGluX2xvY2tfaXJxKCZmaS0+cmVxbGlzdHNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZmktPnJlcV9wZW5kaW5nKTsKKwlzcGluX3VubG9ja19pcnEoJmZpLT5yZXFsaXN0c19sb2NrKTsKKwlwYWNrZXQtPmdlbmVyYXRpb24gPSByZXEtPnJlcS5nZW5lcmF0aW9uOworCXJldHZhbCA9IGhwc2Jfc2VuZF9wYWNrZXQocGFja2V0KTsKKwlEQkdNU0coIndyaXRlX3BoeXBhY2tldCBzZW5kX3BhY2tldCBjYWxsZWQgPT4gcmV0dmFsOiAlZCAiLCByZXR2YWwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9TRU5EX0VSUk9SOworCQlyZXEtPnJlcS5sZW5ndGggPSAwOworCQlxdWV1ZV9jb21wbGV0ZV9yZXEocmVxKTsKKwl9CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKK30KKworc3RhdGljIGludCBnZXRfY29uZmlnX3JvbShzdHJ1Y3QgZmlsZV9pbmZvICpmaSwgc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKQoreworCWludCByZXQgPSBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7CisJcXVhZGxldF90ICpkYXRhID0ga21hbGxvYyhyZXEtPnJlcS5sZW5ndGgsIFNMQUJfS0VSTkVMKTsKKwlpbnQgc3RhdHVzOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXR1cyA9CisJICAgIGNzcjEyMTJfcmVhZChmaS0+aG9zdC0+Y3NyLnJvbSwgQ1NSMTIxMl9DT05GSUdfUk9NX1NQQUNFX09GRlNFVCwKKwkJCSBkYXRhLCByZXEtPnJlcS5sZW5ndGgpOworCWlmIChjb3B5X3RvX3VzZXIoaW50MnB0cihyZXEtPnJlcS5yZWN2YiksIGRhdGEsIHJlcS0+cmVxLmxlbmd0aCkpCisJCXJldCA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcgorCSAgICAoaW50MnB0cihyZXEtPnJlcS50YWcpLCAmZmktPmhvc3QtPmNzci5yb20tPmNhY2hlX2hlYWQtPmxlbiwKKwkgICAgIHNpemVvZihmaS0+aG9zdC0+Y3NyLnJvbS0+Y2FjaGVfaGVhZC0+bGVuKSkpCisJCXJldCA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihpbnQycHRyKHJlcS0+cmVxLmFkZHJlc3MpLCAmZmktPmhvc3QtPmNzci5nZW5lcmF0aW9uLAorCQkJIHNpemVvZihmaS0+aG9zdC0+Y3NyLmdlbmVyYXRpb24pKSkKKwkJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKGludDJwdHIocmVxLT5yZXEuc2VuZGIpLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSkpCisJCXJldCA9IC1FRkFVTFQ7CisJa2ZyZWUoZGF0YSk7CisJaWYgKHJldCA+PSAwKSB7CisJCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CS8qIHdlIGhhdmUgdG8gZnJlZSB0aGUgcmVxdWVzdCwgYmVjYXVzZSB3ZSBxdWV1ZSBubyByZXNwb25zZSwgYW5kIHRoZXJlZm9yZSBub2JvZHkgd2lsbCBmcmVlIGl0ICovCisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2NvbmZpZ19yb20oc3RydWN0IGZpbGVfaW5mbyAqZmksIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmV0ID0gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworCXF1YWRsZXRfdCAqZGF0YSA9IGttYWxsb2MocmVxLT5yZXEubGVuZ3RoLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgaW50MnB0cihyZXEtPnJlcS5zZW5kYiksIHJlcS0+cmVxLmxlbmd0aCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9IGVsc2UgeworCQlpbnQgc3RhdHVzID0gaHBzYl91cGRhdGVfY29uZmlnX3JvbShmaS0+aG9zdCwKKwkJCQkJCSAgICBkYXRhLCByZXEtPnJlcS5sZW5ndGgsCisJCQkJCQkgICAgKHVuc2lnbmVkIGNoYXIpcmVxLT5yZXEuCisJCQkJCQkgICAgbWlzYyk7CisJCWlmIChjb3B5X3RvX3VzZXIKKwkJICAgIChpbnQycHRyKHJlcS0+cmVxLnJlY3ZiKSwgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpKQorCQkJcmV0ID0gLUVOT01FTTsKKwl9CisJa2ZyZWUoZGF0YSk7CisJaWYgKHJldCA+PSAwKSB7CisJCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CS8qIHdlIGhhdmUgdG8gZnJlZSB0aGUgcmVxdWVzdCwgYmVjYXVzZSB3ZSBxdWV1ZSBubyByZXNwb25zZSwgYW5kIHRoZXJlZm9yZSBub2JvZHkgd2lsbCBmcmVlIGl0ICovCisJCWZpLT5jZmdyb21fdXBkID0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtb2RpZnlfY29uZmlnX3JvbShzdHJ1Y3QgZmlsZV9pbmZvICpmaSwgc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3Y7CisJc3RydWN0IGNzcjEyMTJfY3NyX3JvbV9jYWNoZSAqY2FjaGU7CisJc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpkZW50cnk7CisJdTMyIGRyOworCWludCByZXQgPSAwOworCisJaWYgKHJlcS0+cmVxLm1pc2MgPT0gfjApIHsKKwkJaWYgKHJlcS0+cmVxLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogRmluZCBhbiB1bnVzZWQgc2xvdCAqLworCQlmb3IgKGRyID0gMDsKKwkJICAgICBkciA8IFJBVzEzOTRfTUFYX1VTRVJfQ1NSX0RJUlMgJiYgZmktPmNzcjEyMTJfZGlyc1tkcl07CisJCSAgICAgZHIrKykgOworCisJCWlmIChkciA9PSBSQVcxMzk0X01BWF9VU0VSX0NTUl9ESVJTKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJZmktPmNzcjEyMTJfZGlyc1tkcl0gPQorCQkgICAgY3NyMTIxMl9uZXdfZGlyZWN0b3J5KENTUjEyMTJfS1ZfSURfVkVORE9SKTsKKwkJaWYgKCFmaS0+Y3NyMTIxMl9kaXJzW2RyXSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCWRyID0gcmVxLT5yZXEubWlzYzsKKwkJaWYgKCFmaS0+Y3NyMTIxMl9kaXJzW2RyXSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIERlbGV0ZSBvbGQgc3R1ZmYgKi8KKwkJZm9yIChkZW50cnkgPQorCQkgICAgIGZpLT5jc3IxMjEyX2RpcnNbZHJdLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfaGVhZDsKKwkJICAgICBkZW50cnk7IGRlbnRyeSA9IGRlbnRyeS0+bmV4dCkgeworCQkJY3NyMTIxMl9kZXRhY2hfa2V5dmFsX2Zyb21fZGlyZWN0b3J5KGZpLT5ob3N0LT5jc3Iucm9tLT4KKwkJCQkJCQkgICAgIHJvb3Rfa3YsCisJCQkJCQkJICAgICBkZW50cnktPmt2KTsKKwkJfQorCisJCWlmIChyZXEtPnJlcS5sZW5ndGggPT0gMCkgeworCQkJY3NyMTIxMl9yZWxlYXNlX2tleXZhbChmaS0+Y3NyMTIxMl9kaXJzW2RyXSk7CisJCQlmaS0+Y3NyMTIxMl9kaXJzW2RyXSA9IE5VTEw7CisKKwkJCWhwc2JfdXBkYXRlX2NvbmZpZ19yb21faW1hZ2UoZmktPmhvc3QpOworCQkJZnJlZV9wZW5kaW5nX3JlcXVlc3QocmVxKTsKKwkJCXJldHVybiBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7CisJCX0KKwl9CisKKwljYWNoZSA9IGNzcjEyMTJfcm9tX2NhY2hlX21hbGxvYygwLCByZXEtPnJlcS5sZW5ndGgpOworCWlmICghY2FjaGUpIHsKKwkJY3NyMTIxMl9yZWxlYXNlX2tleXZhbChmaS0+Y3NyMTIxMl9kaXJzW2RyXSk7CisJCWZpLT5jc3IxMjEyX2RpcnNbZHJdID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2FjaGUtPmZpbGxlZF9oZWFkID0KKwkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IGNzcjEyMTJfY2FjaGVfcmVnaW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYWNoZS0+ZmlsbGVkX2hlYWQpIHsKKwkJY3NyMTIxMl9yZWxlYXNlX2tleXZhbChmaS0+Y3NyMTIxMl9kaXJzW2RyXSk7CisJCWZpLT5jc3IxMjEyX2RpcnNbZHJdID0gTlVMTDsKKwkJQ1NSMTIxMl9GUkVFKGNhY2hlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNhY2hlLT5maWxsZWRfdGFpbCA9IGNhY2hlLT5maWxsZWRfaGVhZDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihjYWNoZS0+ZGF0YSwgaW50MnB0cihyZXEtPnJlcS5zZW5kYiksCisJCQkgICByZXEtPnJlcS5sZW5ndGgpKSB7CisJCWNzcjEyMTJfcmVsZWFzZV9rZXl2YWwoZmktPmNzcjEyMTJfZGlyc1tkcl0pOworCQlmaS0+Y3NyMTIxMl9kaXJzW2RyXSA9IE5VTEw7CisJCUNTUjEyMTJfRlJFRShjYWNoZSk7CisJCXJldCA9IC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJY2FjaGUtPmxlbiA9IHJlcS0+cmVxLmxlbmd0aDsKKwkJY2FjaGUtPmZpbGxlZF9oZWFkLT5vZmZzZXRfc3RhcnQgPSAwOworCQljYWNoZS0+ZmlsbGVkX2hlYWQtPm9mZnNldF9lbmQgPSBjYWNoZS0+c2l6ZSAtIDE7CisKKwkJY2FjaGUtPmxheW91dF9oZWFkID0gY2FjaGUtPmxheW91dF90YWlsID0gZmktPmNzcjEyMTJfZGlyc1tkcl07CisKKwkJcmV0ID0gQ1NSMTIxMl9TVUNDRVNTOworCQkvKiBwYXJzZSBhbGwgdGhlIGl0ZW1zICovCisJCWZvciAoa3YgPSBjYWNoZS0+bGF5b3V0X2hlYWQ7IHJldCA9PSBDU1IxMjEyX1NVQ0NFU1MgJiYga3Y7CisJCSAgICAga3YgPSBrdi0+bmV4dCkgeworCQkJcmV0ID0gY3NyMTIxMl9wYXJzZV9rZXl2YWwoa3YsIGNhY2hlKTsKKwkJfQorCisJCS8qIGF0dGFjaCB0b3AgbGV2ZWwgaXRlbXMgdG8gdGhlIHJvb3QgZGlyZWN0b3J5ICovCisJCWZvciAoZGVudHJ5ID0KKwkJICAgICBmaS0+Y3NyMTIxMl9kaXJzW2RyXS0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX2hlYWQ7CisJCSAgICAgcmV0ID09IENTUjEyMTJfU1VDQ0VTUyAmJiBkZW50cnk7IGRlbnRyeSA9IGRlbnRyeS0+bmV4dCkgeworCQkJcmV0ID0KKwkJCSAgICBjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KGZpLT5ob3N0LT5jc3IuCisJCQkJCQkJICAgICAgIHJvbS0+cm9vdF9rdiwKKwkJCQkJCQkgICAgICAgZGVudHJ5LT5rdik7CisJCX0KKworCQlpZiAocmV0ID09IENTUjEyMTJfU1VDQ0VTUykgeworCQkJcmV0ID0gaHBzYl91cGRhdGVfY29uZmlnX3JvbV9pbWFnZShmaS0+aG9zdCk7CisKKwkJCWlmIChyZXQgPj0gMCAmJiBjb3B5X3RvX3VzZXIoaW50MnB0cihyZXEtPnJlcS5yZWN2YiksCisJCQkJCQkgICAgICZkciwgc2l6ZW9mKGRyKSkpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJfQorCQl9CisJfQorCWtmcmVlKGNhY2hlLT5maWxsZWRfaGVhZCk7CisJa2ZyZWUoY2FjaGUpOworCisJaWYgKHJldCA+PSAwKSB7CisJCS8qIHdlIGhhdmUgdG8gZnJlZSB0aGUgcmVxdWVzdCwgYmVjYXVzZSB3ZSBxdWV1ZSBubyByZXNwb25zZSwKKwkJICogYW5kIHRoZXJlZm9yZSBub2JvZHkgd2lsbCBmcmVlIGl0ICovCisJCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CisJCXJldHVybiBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7CisJfSBlbHNlIHsKKwkJZm9yIChkZW50cnkgPQorCQkgICAgIGZpLT5jc3IxMjEyX2RpcnNbZHJdLT52YWx1ZS5kaXJlY3RvcnkuZGVudHJpZXNfaGVhZDsKKwkJICAgICBkZW50cnk7IGRlbnRyeSA9IGRlbnRyeS0+bmV4dCkgeworCQkJY3NyMTIxMl9kZXRhY2hfa2V5dmFsX2Zyb21fZGlyZWN0b3J5KGZpLT5ob3N0LT5jc3Iucm9tLT4KKwkJCQkJCQkgICAgIHJvb3Rfa3YsCisJCQkJCQkJICAgICBkZW50cnktPmt2KTsKKwkJfQorCQljc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKGZpLT5jc3IxMjEyX2RpcnNbZHJdKTsKKwkJZmktPmNzcjEyMTJfZGlyc1tkcl0gPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KK30KKworc3RhdGljIGludCBzdGF0ZV9jb25uZWN0ZWQoc3RydWN0IGZpbGVfaW5mbyAqZmksIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgbm9kZSA9IHJlcS0+cmVxLmFkZHJlc3MgPj4gNDg7CisKKwlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfTk9ORTsKKworCXN3aXRjaCAocmVxLT5yZXEudHlwZSkgeworCisJY2FzZSBSQVcxMzk0X1JFUV9FQ0hPOgorCQlxdWV1ZV9jb21wbGV0ZV9yZXEocmVxKTsKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKKworCWNhc2UgUkFXMTM5NF9SRVFfSVNPX1NFTkQ6CisJCXJldHVybiBoYW5kbGVfaXNvX3NlbmQoZmksIHJlcSwgbm9kZSk7CisKKwljYXNlIFJBVzEzOTRfUkVRX0FSTV9SRUdJU1RFUjoKKwkJcmV0dXJuIGFybV9yZWdpc3RlcihmaSwgcmVxKTsKKworCWNhc2UgUkFXMTM5NF9SRVFfQVJNX1VOUkVHSVNURVI6CisJCXJldHVybiBhcm1fdW5yZWdpc3RlcihmaSwgcmVxKTsKKworCWNhc2UgUkFXMTM5NF9SRVFfQVJNX1NFVF9CVUY6CisJCXJldHVybiBhcm1fc2V0X2J1ZihmaSwgcmVxKTsKKworCWNhc2UgUkFXMTM5NF9SRVFfQVJNX0dFVF9CVUY6CisJCXJldHVybiBhcm1fZ2V0X2J1ZihmaSwgcmVxKTsKKworCWNhc2UgUkFXMTM5NF9SRVFfUkVTRVRfTk9USUZZOgorCQlyZXR1cm4gcmVzZXRfbm90aWZpY2F0aW9uKGZpLCByZXEpOworCisJY2FzZSBSQVcxMzk0X1JFUV9JU09fTElTVEVOOgorCQloYW5kbGVfaXNvX2xpc3RlbihmaSwgcmVxKTsKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKKworCWNhc2UgUkFXMTM5NF9SRVFfRkNQX0xJU1RFTjoKKwkJaGFuZGxlX2ZjcF9saXN0ZW4oZmksIHJlcSk7CisJCXJldHVybiBzaXplb2Yoc3RydWN0IHJhdzEzOTRfcmVxdWVzdCk7CisKKwljYXNlIFJBVzEzOTRfUkVRX1JFU0VUX0JVUzoKKwkJaWYgKHJlcS0+cmVxLm1pc2MgPT0gUkFXMTM5NF9MT05HX1JFU0VUKSB7CisJCQlEQkdNU0coImJ1c3Jlc2V0IGNhbGxlZCAodHlwZTogTE9ORykiKTsKKwkJCWhwc2JfcmVzZXRfYnVzKGZpLT5ob3N0LCBMT05HX1JFU0VUKTsKKwkJCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CS8qIHdlIGhhdmUgdG8gZnJlZSB0aGUgcmVxdWVzdCwgYmVjYXVzZSB3ZSBxdWV1ZSBubyByZXNwb25zZSwgYW5kIHRoZXJlZm9yZSBub2JvZHkgd2lsbCBmcmVlIGl0ICovCisJCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworCQl9CisJCWlmIChyZXEtPnJlcS5taXNjID09IFJBVzEzOTRfU0hPUlRfUkVTRVQpIHsKKwkJCURCR01TRygiYnVzcmVzZXQgY2FsbGVkICh0eXBlOiBTSE9SVCkiKTsKKwkJCWhwc2JfcmVzZXRfYnVzKGZpLT5ob3N0LCBTSE9SVF9SRVNFVCk7CisJCQlmcmVlX3BlbmRpbmdfcmVxdWVzdChyZXEpOwkvKiB3ZSBoYXZlIHRvIGZyZWUgdGhlIHJlcXVlc3QsIGJlY2F1c2Ugd2UgcXVldWUgbm8gcmVzcG9uc2UsIGFuZCB0aGVyZWZvcmUgbm9ib2R5IHdpbGwgZnJlZSBpdCAqLworCQkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KTsKKwkJfQorCQkvKiBlcnJvciBFSU5WQUwgKDIyKSBpbnZhbGlkIGFyZ3VtZW50ICovCisJCXJldHVybiAoLUVJTlZBTCk7CisJY2FzZSBSQVcxMzk0X1JFUV9HRVRfUk9NOgorCQlyZXR1cm4gZ2V0X2NvbmZpZ19yb20oZmksIHJlcSk7CisKKwljYXNlIFJBVzEzOTRfUkVRX1VQREFURV9ST006CisJCXJldHVybiB1cGRhdGVfY29uZmlnX3JvbShmaSwgcmVxKTsKKworCWNhc2UgUkFXMTM5NF9SRVFfTU9ESUZZX1JPTToKKwkJcmV0dXJuIG1vZGlmeV9jb25maWdfcm9tKGZpLCByZXEpOworCX0KKworCWlmIChyZXEtPnJlcS5nZW5lcmF0aW9uICE9IGdldF9ocHNiX2dlbmVyYXRpb24oZmktPmhvc3QpKSB7CisJCXJlcS0+cmVxLmVycm9yID0gUkFXMTM5NF9FUlJPUl9HRU5FUkFUSU9OOworCQlyZXEtPnJlcS5nZW5lcmF0aW9uID0gZ2V0X2hwc2JfZ2VuZXJhdGlvbihmaS0+aG9zdCk7CisJCXJlcS0+cmVxLmxlbmd0aCA9IDA7CisJCXF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworCX0KKworCXN3aXRjaCAocmVxLT5yZXEudHlwZSkgeworCWNhc2UgUkFXMTM5NF9SRVFfUEhZUEFDS0VUOgorCQlyZXR1cm4gd3JpdGVfcGh5cGFja2V0KGZpLCByZXEpOworCWNhc2UgUkFXMTM5NF9SRVFfQVNZTkNfU0VORDoKKwkJcmV0dXJuIGhhbmRsZV9hc3luY19zZW5kKGZpLCByZXEpOworCX0KKworCWlmIChyZXEtPnJlcS5sZW5ndGggPT0gMCkgeworCQlyZXEtPnJlcS5lcnJvciA9IFJBVzEzOTRfRVJST1JfSU5WQUxJRF9BUkc7CisJCXF1ZXVlX2NvbXBsZXRlX3JlcShyZXEpOworCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByYXcxMzk0X3JlcXVlc3QpOworCX0KKworCXJldHVybiBoYW5kbGVfYXN5bmNfcmVxdWVzdChmaSwgcmVxLCBub2RlKTsKK30KKworc3RhdGljIHNzaXplX3QgcmF3MTM5NF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogb2Zmc2V0X2lzX2lnbm9yZWQpCit7CisJc3RydWN0IGZpbGVfaW5mbyAqZmkgPSAoc3RydWN0IGZpbGVfaW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXE7CisJc3NpemVfdCByZXR2YWwgPSAwOworCisJaWYgKGNvdW50ICE9IHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXEgPSBhbGxvY19wZW5kaW5nX3JlcXVlc3QoKTsKKwlpZiAocmVxID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJlcS0+ZmlsZV9pbmZvID0gZmk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcS0+cmVxLCBidWZmZXIsIHNpemVvZihzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0KSkpIHsKKwkJZnJlZV9wZW5kaW5nX3JlcXVlc3QocmVxKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3dpdGNoIChmaS0+c3RhdGUpIHsKKwljYXNlIG9wZW5lZDoKKwkJcmV0dmFsID0gc3RhdGVfb3BlbmVkKGZpLCByZXEpOworCQlicmVhazsKKworCWNhc2UgaW5pdGlhbGl6ZWQ6CisJCXJldHZhbCA9IHN0YXRlX2luaXRpYWxpemVkKGZpLCByZXEpOworCQlicmVhazsKKworCWNhc2UgY29ubmVjdGVkOgorCQlyZXR2YWwgPSBzdGF0ZV9jb25uZWN0ZWQoZmksIHJlcSk7CisJCWJyZWFrOworCX0KKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWZyZWVfcGVuZGluZ19yZXF1ZXN0KHJlcSk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogcmF3aXNvIG9wZXJhdGlvbnMgKi8KKworLyogY2hlY2sgaWYgYW55IFJBVzEzOTRfUkVRX1JBV0lTT19BQ1RJVklUWSBldmVudCBpcyBhbHJlYWR5IGluIHRoZQorICogY29tcGxldGlvbiBxdWV1ZSAocmVxbGlzdHNfbG9jayBtdXN0IGJlIHRha2VuKSAqLworc3RhdGljIGlubGluZSBpbnQgX19yYXdpc29fZXZlbnRfaW5fcXVldWUoc3RydWN0IGZpbGVfaW5mbyAqZmkpCit7CisJc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZmaS0+cmVxX2NvbXBsZXRlLCBsaXN0KQorCSAgICBpZiAocmVxLT5yZXEudHlwZSA9PSBSQVcxMzk0X1JFUV9SQVdJU09fQUNUSVZJVFkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHB1dCBhIFJBV0lTT19BQ1RJVklUWSBldmVudCBpbiB0aGUgcXVldWUsIGlmIG9uZSBpc24ndCB0aGVyZSBhbHJlYWR5ICovCitzdGF0aWMgdm9pZCBxdWV1ZV9yYXdpc29fZXZlbnQoc3RydWN0IGZpbGVfaW5mbyAqZmkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmaS0+cmVxbGlzdHNfbG9jaywgZmxhZ3MpOworCisJLyogb25seSBvbmUgSVNPIGFjdGl2aXR5IGV2ZW50IG1heSBiZSBpbiB0aGUgcXVldWUgKi8KKwlpZiAoIV9fcmF3aXNvX2V2ZW50X2luX3F1ZXVlKGZpKSkgeworCQlzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpyZXEgPQorCQkgICAgX19hbGxvY19wZW5kaW5nX3JlcXVlc3QoU0xBQl9BVE9NSUMpOworCisJCWlmIChyZXEpIHsKKwkJCXJlcS0+ZmlsZV9pbmZvID0gZmk7CisJCQlyZXEtPnJlcS50eXBlID0gUkFXMTM5NF9SRVFfUkFXSVNPX0FDVElWSVRZOworCQkJcmVxLT5yZXEuZ2VuZXJhdGlvbiA9IGdldF9ocHNiX2dlbmVyYXRpb24oZmktPmhvc3QpOworCQkJX19xdWV1ZV9jb21wbGV0ZV9yZXEocmVxKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG9uIGFsbG9jYXRpb24gZmFpbHVyZSwgc2lnbmFsIGFuIG92ZXJmbG93ICovCisJCQlpZiAoZmktPmlzb19oYW5kbGUpIHsKKwkJCQlhdG9taWNfaW5jKCZmaS0+aXNvX2hhbmRsZS0+b3ZlcmZsb3dzKTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaS0+cmVxbGlzdHNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByYXdpc29fYWN0aXZpdHlfY2Ioc3RydWN0IGhwc2JfaXNvICppc28pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaG9zdF9pbmZvICpoaTsKKwlzdHJ1Y3QgZmlsZV9pbmZvICpmaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0X2luZm9fbG9jaywgZmxhZ3MpOworCWhpID0gZmluZF9ob3N0X2luZm8oaXNvLT5ob3N0KTsKKworCWlmIChoaSAhPSBOVUxMKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmksICZoaS0+ZmlsZV9pbmZvX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChmaS0+aXNvX2hhbmRsZSA9PSBpc28pCisJCQkJcXVldWVfcmF3aXNvX2V2ZW50KGZpKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3RfaW5mb19sb2NrLCBmbGFncyk7Cit9CisKKy8qIGhlbHBlciBmdW5jdGlvbiAtIGdhdGhlciBhbGwgdGhlIGtlcm5lbCBpc28gc3RhdHVzIGJpdHMgZm9yIHJldHVybmluZyB0byB1c2VyLXNwYWNlICovCitzdGF0aWMgdm9pZCByYXcxMzk0X2lzb19maWxsX3N0YXR1cyhzdHJ1Y3QgaHBzYl9pc28gKmlzbywKKwkJCQkgICAgc3RydWN0IHJhdzEzOTRfaXNvX3N0YXR1cyAqc3RhdCkKK3sKKwlzdGF0LT5jb25maWcuZGF0YV9idWZfc2l6ZSA9IGlzby0+YnVmX3NpemU7CisJc3RhdC0+Y29uZmlnLmJ1Zl9wYWNrZXRzID0gaXNvLT5idWZfcGFja2V0czsKKwlzdGF0LT5jb25maWcuY2hhbm5lbCA9IGlzby0+Y2hhbm5lbDsKKwlzdGF0LT5jb25maWcuc3BlZWQgPSBpc28tPnNwZWVkOworCXN0YXQtPmNvbmZpZy5pcnFfaW50ZXJ2YWwgPSBpc28tPmlycV9pbnRlcnZhbDsKKwlzdGF0LT5uX3BhY2tldHMgPSBocHNiX2lzb19uX3JlYWR5KGlzbyk7CisJc3RhdC0+b3ZlcmZsb3dzID0gYXRvbWljX3JlYWQoJmlzby0+b3ZlcmZsb3dzKTsKKwlzdGF0LT54bWl0X2N5Y2xlID0gaXNvLT54bWl0X2N5Y2xlOworfQorCitzdGF0aWMgaW50IHJhdzEzOTRfaXNvX3htaXRfaW5pdChzdHJ1Y3QgZmlsZV9pbmZvICpmaSwgdm9pZCBfX3VzZXIgKiB1YWRkcikKK3sKKwlzdHJ1Y3QgcmF3MTM5NF9pc29fc3RhdHVzIHN0YXQ7CisKKwlpZiAoIWZpLT5ob3N0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3RhdCwgdWFkZHIsIHNpemVvZihzdGF0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZmktPmlzb19oYW5kbGUgPSBocHNiX2lzb194bWl0X2luaXQoZmktPmhvc3QsCisJCQkJCSAgICBzdGF0LmNvbmZpZy5kYXRhX2J1Zl9zaXplLAorCQkJCQkgICAgc3RhdC5jb25maWcuYnVmX3BhY2tldHMsCisJCQkJCSAgICBzdGF0LmNvbmZpZy5jaGFubmVsLAorCQkJCQkgICAgc3RhdC5jb25maWcuc3BlZWQsCisJCQkJCSAgICBzdGF0LmNvbmZpZy5pcnFfaW50ZXJ2YWwsCisJCQkJCSAgICByYXdpc29fYWN0aXZpdHlfY2IpOworCWlmICghZmktPmlzb19oYW5kbGUpCisJCXJldHVybiAtRU5PTUVNOworCisJZmktPmlzb19zdGF0ZSA9IFJBVzEzOTRfSVNPX1hNSVQ7CisKKwlyYXcxMzk0X2lzb19maWxsX3N0YXR1cyhmaS0+aXNvX2hhbmRsZSwgJnN0YXQpOworCWlmIChjb3B5X3RvX3VzZXIodWFkZHIsICZzdGF0LCBzaXplb2Yoc3RhdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIHF1ZXVlIGFuIGV2ZW50IHRvIGdldCB0aGluZ3Mgc3RhcnRlZCAqLworCXJhd2lzb19hY3Rpdml0eV9jYihmaS0+aXNvX2hhbmRsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYXcxMzk0X2lzb19yZWN2X2luaXQoc3RydWN0IGZpbGVfaW5mbyAqZmksIHZvaWQgX191c2VyICogdWFkZHIpCit7CisJc3RydWN0IHJhdzEzOTRfaXNvX3N0YXR1cyBzdGF0OworCisJaWYgKCFmaS0+aG9zdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN0YXQsIHVhZGRyLCBzaXplb2Yoc3RhdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZpLT5pc29faGFuZGxlID0gaHBzYl9pc29fcmVjdl9pbml0KGZpLT5ob3N0LAorCQkJCQkgICAgc3RhdC5jb25maWcuZGF0YV9idWZfc2l6ZSwKKwkJCQkJICAgIHN0YXQuY29uZmlnLmJ1Zl9wYWNrZXRzLAorCQkJCQkgICAgc3RhdC5jb25maWcuY2hhbm5lbCwKKwkJCQkJICAgIHN0YXQuY29uZmlnLmRtYV9tb2RlLAorCQkJCQkgICAgc3RhdC5jb25maWcuaXJxX2ludGVydmFsLAorCQkJCQkgICAgcmF3aXNvX2FjdGl2aXR5X2NiKTsKKwlpZiAoIWZpLT5pc29faGFuZGxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpLT5pc29fc3RhdGUgPSBSQVcxMzk0X0lTT19SRUNWOworCisJcmF3MTM5NF9pc29fZmlsbF9zdGF0dXMoZmktPmlzb19oYW5kbGUsICZzdGF0KTsKKwlpZiAoY29weV90b191c2VyKHVhZGRyLCAmc3RhdCwgc2l6ZW9mKHN0YXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmF3MTM5NF9pc29fZ2V0X3N0YXR1cyhzdHJ1Y3QgZmlsZV9pbmZvICpmaSwgdm9pZCBfX3VzZXIgKiB1YWRkcikKK3sKKwlzdHJ1Y3QgcmF3MTM5NF9pc29fc3RhdHVzIHN0YXQ7CisJc3RydWN0IGhwc2JfaXNvICppc28gPSBmaS0+aXNvX2hhbmRsZTsKKworCXJhdzEzOTRfaXNvX2ZpbGxfc3RhdHVzKGZpLT5pc29faGFuZGxlLCAmc3RhdCk7CisJaWYgKGNvcHlfdG9fdXNlcih1YWRkciwgJnN0YXQsIHNpemVvZihzdGF0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogcmVzZXQgb3ZlcmZsb3cgY291bnRlciAqLworCWF0b21pY19zZXQoJmlzby0+b3ZlcmZsb3dzLCAwKTsKKworCXJldHVybiAwOworfQorCisvKiBjb3B5IE4gcGFja2V0X2luZm9zIG91dCBvZiB0aGUgcmluZ2J1ZmZlciBpbnRvIHVzZXItc3VwcGxpZWQgYXJyYXkgKi8KK3N0YXRpYyBpbnQgcmF3MTM5NF9pc29fcmVjdl9wYWNrZXRzKHN0cnVjdCBmaWxlX2luZm8gKmZpLCB2b2lkIF9fdXNlciAqIHVhZGRyKQoreworCXN0cnVjdCByYXcxMzk0X2lzb19wYWNrZXRzIHVwYWNrZXRzOworCXVuc2lnbmVkIGludCBwYWNrZXQgPSBmaS0+aXNvX2hhbmRsZS0+Zmlyc3RfcGFja2V0OworCWludCBpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1cGFja2V0cywgdWFkZHIsIHNpemVvZih1cGFja2V0cykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh1cGFja2V0cy5uX3BhY2tldHMgPiBocHNiX2lzb19uX3JlYWR5KGZpLT5pc29faGFuZGxlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBlbnN1cmUgdXNlci1zdXBwbGllZCBidWZmZXIgaXMgYWNjZXNzaWJsZSBhbmQgYmlnIGVub3VnaCAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdXBhY2tldHMuaW5mb3MsCisJCQl1cGFja2V0cy5uX3BhY2tldHMgKgorCQkJc2l6ZW9mKHN0cnVjdCByYXcxMzk0X2lzb19wYWNrZXRfaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIGNvcHkgdGhlIHBhY2tldF9pbmZvcyBvdXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdXBhY2tldHMubl9wYWNrZXRzOyBpKyspIHsKKwkJaWYgKF9fY29weV90b191c2VyKCZ1cGFja2V0cy5pbmZvc1tpXSwKKwkJCQkgICAmZmktPmlzb19oYW5kbGUtPmluZm9zW3BhY2tldF0sCisJCQkJICAgc2l6ZW9mKHN0cnVjdCByYXcxMzk0X2lzb19wYWNrZXRfaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcGFja2V0ID0gKHBhY2tldCArIDEpICUgZmktPmlzb19oYW5kbGUtPmJ1Zl9wYWNrZXRzOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjb3B5IE4gcGFja2V0X2luZm9zIGZyb20gdXNlciB0byByaW5nYnVmZmVyLCBhbmQgcXVldWUgdGhlbSBmb3IgdHJhbnNtaXNzaW9uICovCitzdGF0aWMgaW50IHJhdzEzOTRfaXNvX3NlbmRfcGFja2V0cyhzdHJ1Y3QgZmlsZV9pbmZvICpmaSwgdm9pZCBfX3VzZXIgKiB1YWRkcikKK3sKKwlzdHJ1Y3QgcmF3MTM5NF9pc29fcGFja2V0cyB1cGFja2V0czsKKwlpbnQgaSwgcnY7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVwYWNrZXRzLCB1YWRkciwgc2l6ZW9mKHVwYWNrZXRzKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHVwYWNrZXRzLm5fcGFja2V0cyA+IGhwc2JfaXNvX25fcmVhZHkoZmktPmlzb19oYW5kbGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGVuc3VyZSB1c2VyLXN1cHBsaWVkIGJ1ZmZlciBpcyBhY2Nlc3NpYmxlIGFuZCBiaWcgZW5vdWdoICovCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVwYWNrZXRzLmluZm9zLAorCQkJdXBhY2tldHMubl9wYWNrZXRzICoKKwkJCXNpemVvZihzdHJ1Y3QgcmF3MTM5NF9pc29fcGFja2V0X2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBjb3B5IHRoZSBpbmZvcyBzdHJ1Y3RzIGluIGFuZCBxdWV1ZSB0aGUgcGFja2V0cyAqLworCWZvciAoaSA9IDA7IGkgPCB1cGFja2V0cy5uX3BhY2tldHM7IGkrKykgeworCQlzdHJ1Y3QgcmF3MTM5NF9pc29fcGFja2V0X2luZm8gaW5mbzsKKworCQlpZiAoX19jb3B5X2Zyb21fdXNlcigmaW5mbywgJnVwYWNrZXRzLmluZm9zW2ldLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCByYXcxMzk0X2lzb19wYWNrZXRfaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcnYgPSBocHNiX2lzb194bWl0X3F1ZXVlX3BhY2tldChmaS0+aXNvX2hhbmRsZSwgaW5mby5vZmZzZXQsCisJCQkJCQlpbmZvLmxlbiwgaW5mby50YWcsIGluZm8uc3kpOworCQlpZiAocnYpCisJCQlyZXR1cm4gcnY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJhdzEzOTRfaXNvX3NodXRkb3duKHN0cnVjdCBmaWxlX2luZm8gKmZpKQoreworCWlmIChmaS0+aXNvX2hhbmRsZSkKKwkJaHBzYl9pc29fc2h1dGRvd24oZmktPmlzb19oYW5kbGUpOworCisJZmktPmlzb19oYW5kbGUgPSBOVUxMOworCWZpLT5pc29fc3RhdGUgPSBSQVcxMzk0X0lTT19JTkFDVElWRTsKK30KKworLyogbW1hcCB0aGUgcmF3aXNvIHhtaXQvcmVjdiBidWZmZXIgKi8KK3N0YXRpYyBpbnQgcmF3MTM5NF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZmlsZV9pbmZvICpmaSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChmaS0+aXNvX3N0YXRlID09IFJBVzEzOTRfSVNPX0lOQUNUSVZFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBkbWFfcmVnaW9uX21tYXAoJmZpLT5pc29faGFuZGxlLT5kYXRhX2J1ZiwgZmlsZSwgdm1hKTsKK30KKworLyogaW9jdGwgaXMgb25seSB1c2VkIGZvciByYXdpc28gb3BlcmF0aW9ucyAqLworc3RhdGljIGludCByYXcxMzk0X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBmaWxlX2luZm8gKmZpID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJc3dpdGNoIChmaS0+aXNvX3N0YXRlKSB7CisJY2FzZSBSQVcxMzk0X0lTT19JTkFDVElWRToKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9JTklUOgorCQkJcmV0dXJuIHJhdzEzOTRfaXNvX3htaXRfaW5pdChmaSwgYXJncCk7CisJCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfSU5JVDoKKwkJCXJldHVybiByYXcxMzk0X2lzb19yZWN2X2luaXQoZmksIGFyZ3ApOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSQVcxMzk0X0lTT19SRUNWOgorCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFJBVzEzOTRfSU9DX0lTT19SRUNWX1NUQVJUOnsKKwkJCQkvKiBjb3B5IGFyZ3MgZnJvbSB1c2VyLXNwYWNlICovCisJCQkJaW50IGFyZ3NbM107CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkJICAgICgmYXJnc1swXSwgYXJncCwgc2l6ZW9mKGFyZ3MpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmV0dXJuIGhwc2JfaXNvX3JlY3Zfc3RhcnQoZmktPmlzb19oYW5kbGUsCisJCQkJCQkJICAgYXJnc1swXSwgYXJnc1sxXSwKKwkJCQkJCQkgICBhcmdzWzJdKTsKKwkJCX0KKwkJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9SRUNWX1NUT1A6CisJCQlocHNiX2lzb19zdG9wKGZpLT5pc29faGFuZGxlKTsKKwkJCXJldHVybiAwOworCQljYXNlIFJBVzEzOTRfSU9DX0lTT19SRUNWX0xJU1RFTl9DSEFOTkVMOgorCQkJcmV0dXJuIGhwc2JfaXNvX3JlY3ZfbGlzdGVuX2NoYW5uZWwoZmktPmlzb19oYW5kbGUsCisJCQkJCQkJICAgIGFyZyk7CisJCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfVU5MSVNURU5fQ0hBTk5FTDoKKwkJCXJldHVybiBocHNiX2lzb19yZWN2X3VubGlzdGVuX2NoYW5uZWwoZmktPmlzb19oYW5kbGUsCisJCQkJCQkJICAgICAgYXJnKTsKKwkJY2FzZSBSQVcxMzk0X0lPQ19JU09fUkVDVl9TRVRfQ0hBTk5FTF9NQVNLOnsKKwkJCQkvKiBjb3B5IHRoZSB1NjQgZnJvbSB1c2VyLXNwYWNlICovCisJCQkJdTY0IG1hc2s7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtYXNrLCBhcmdwLCBzaXplb2YobWFzaykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlyZXR1cm4gaHBzYl9pc29fcmVjdl9zZXRfY2hhbm5lbF9tYXNrKGZpLT4KKwkJCQkJCQkJICAgICAgaXNvX2hhbmRsZSwKKwkJCQkJCQkJICAgICAgbWFzayk7CisJCQl9CisJCWNhc2UgUkFXMTM5NF9JT0NfSVNPX0dFVF9TVEFUVVM6CisJCQlyZXR1cm4gcmF3MTM5NF9pc29fZ2V0X3N0YXR1cyhmaSwgYXJncCk7CisJCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfUEFDS0VUUzoKKwkJCXJldHVybiByYXcxMzk0X2lzb19yZWN2X3BhY2tldHMoZmksIGFyZ3ApOworCQljYXNlIFJBVzEzOTRfSU9DX0lTT19SRUNWX1JFTEVBU0VfUEFDS0VUUzoKKwkJCXJldHVybiBocHNiX2lzb19yZWN2X3JlbGVhc2VfcGFja2V0cyhmaS0+aXNvX2hhbmRsZSwKKwkJCQkJCQkgICAgIGFyZyk7CisJCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1JFQ1ZfRkxVU0g6CisJCQlyZXR1cm4gaHBzYl9pc29fcmVjdl9mbHVzaChmaS0+aXNvX2hhbmRsZSk7CisJCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1NIVVRET1dOOgorCQkJcmF3MTM5NF9pc29fc2h1dGRvd24oZmkpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1FVRVVFX0FDVElWSVRZOgorCQkJcXVldWVfcmF3aXNvX2V2ZW50KGZpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgUkFXMTM5NF9JU09fWE1JVDoKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9TVEFSVDp7CisJCQkJLyogY29weSB0d28gaW50cyBmcm9tIHVzZXItc3BhY2UgKi8KKwkJCQlpbnQgYXJnc1syXTsKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCQkgICAgKCZhcmdzWzBdLCBhcmdwLCBzaXplb2YoYXJncykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlyZXR1cm4gaHBzYl9pc29feG1pdF9zdGFydChmaS0+aXNvX2hhbmRsZSwKKwkJCQkJCQkgICBhcmdzWzBdLCBhcmdzWzFdKTsKKwkJCX0KKwkJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9TWU5DOgorCQkJcmV0dXJuIGhwc2JfaXNvX3htaXRfc3luYyhmaS0+aXNvX2hhbmRsZSk7CisJCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1hNSVRfUkVDVl9TVE9QOgorCQkJaHBzYl9pc29fc3RvcChmaS0+aXNvX2hhbmRsZSk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBSQVcxMzk0X0lPQ19JU09fR0VUX1NUQVRVUzoKKwkJCXJldHVybiByYXcxMzk0X2lzb19nZXRfc3RhdHVzKGZpLCBhcmdwKTsKKwkJY2FzZSBSQVcxMzk0X0lPQ19JU09fWE1JVF9QQUNLRVRTOgorCQkJcmV0dXJuIHJhdzEzOTRfaXNvX3NlbmRfcGFja2V0cyhmaSwgYXJncCk7CisJCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1NIVVRET1dOOgorCQkJcmF3MTM5NF9pc29fc2h1dGRvd24oZmkpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgUkFXMTM5NF9JT0NfSVNPX1FVRVVFX0FDVElWSVRZOgorCQkJcXVldWVfcmF3aXNvX2V2ZW50KGZpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJhdzEzOTRfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHB0KQoreworCXN0cnVjdCBmaWxlX2luZm8gKmZpID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBtYXNrID0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisKKwlwb2xsX3dhaXQoZmlsZSwgJmZpLT5wb2xsX3dhaXRfY29tcGxldGUsIHB0KTsKKworCXNwaW5fbG9ja19pcnEoJmZpLT5yZXFsaXN0c19sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmZpLT5yZXFfY29tcGxldGUpKSB7CisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZmaS0+cmVxbGlzdHNfbG9jayk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCByYXcxMzk0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGZpbGVfaW5mbyAqZmk7CisKKwlmaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaWxlX2luZm8pLCBTTEFCX0tFUk5FTCk7CisJaWYgKGZpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGZpLCAwLCBzaXplb2Yoc3RydWN0IGZpbGVfaW5mbykpOworCWZpLT5ub3RpZmljYXRpb24gPSAodTgpIFJBVzEzOTRfTk9USUZZX09OOwkvKiBidXNyZXNldCBub3RpZmljYXRpb24gKi8KKworCUlOSVRfTElTVF9IRUFEKCZmaS0+bGlzdCk7CisJZmktPnN0YXRlID0gb3BlbmVkOworCUlOSVRfTElTVF9IRUFEKCZmaS0+cmVxX3BlbmRpbmcpOworCUlOSVRfTElTVF9IRUFEKCZmaS0+cmVxX2NvbXBsZXRlKTsKKwlzZW1hX2luaXQoJmZpLT5jb21wbGV0ZV9zZW0sIDApOworCXNwaW5fbG9ja19pbml0KCZmaS0+cmVxbGlzdHNfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZmktPnBvbGxfd2FpdF9jb21wbGV0ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmZpLT5hZGRyX2xpc3QpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYXcxMzk0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGZpbGVfaW5mbyAqZmkgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqbGg7CisJc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxOworCWludCBkb25lID0gMCwgaSwgZmFpbCA9IDA7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJc3RydWN0IGFybV9hZGRyICphZGRyID0gTlVMTDsKKwlzdHJ1Y3QgaG9zdF9pbmZvICpoaTsKKwlzdHJ1Y3QgZmlsZV9pbmZvICpmaV9obHAgPSBOVUxMOworCXN0cnVjdCBhcm1fYWRkciAqYXJtX2FkZHIgPSBOVUxMOworCWludCBhbm90aGVyX2hvc3Q7CisJaW50IGNzcl9tb2QgPSAwOworCisJaWYgKGZpLT5pc29fc3RhdGUgIT0gUkFXMTM5NF9JU09fSU5BQ1RJVkUpCisJCXJhdzEzOTRfaXNvX3NodXRkb3duKGZpKTsKKworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCWlmIChmaS0+bGlzdGVuX2NoYW5uZWxzICYgKDFVTEwgPDwgaSkpIHsKKwkJCWhwc2JfdW5saXN0ZW5fY2hhbm5lbCgmcmF3MTM5NF9oaWdobGV2ZWwsIGZpLT5ob3N0LCBpKTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnEoJmhvc3RfaW5mb19sb2NrKTsKKwlmaS0+bGlzdGVuX2NoYW5uZWxzID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmhvc3RfaW5mb19sb2NrKTsKKworCWZhaWwgPSAwOworCS8qIHNldCBhZGRyZXNzLWVudHJpZXMgaW52YWxpZCAqLworCXNwaW5fbG9ja19pcnEoJmhvc3RfaW5mb19sb2NrKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmZmktPmFkZHJfbGlzdCkpIHsKKwkJYW5vdGhlcl9ob3N0ID0gMDsKKwkJbGggPSBmaS0+YWRkcl9saXN0Lm5leHQ7CisJCWFkZHIgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgYXJtX2FkZHIsIGFkZHJfbGlzdCk7CisJCS8qIGFub3RoZXIgaG9zdCB3aXRoIHZhbGlkIGFkZHJlc3MtZW50cnkgY29udGFpbmluZworCQkgICBzYW1lIGFkZHJlc3NyYW5nZT8gKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShoaSwgJmhvc3RfaW5mb19saXN0LCBsaXN0KSB7CisJCQlpZiAoaGktPmhvc3QgIT0gZmktPmhvc3QpIHsKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpX2hscCwgJmhpLT5maWxlX2luZm9fbGlzdCwKKwkJCQkJCSAgICBsaXN0KSB7CisJCQkJCWVudHJ5ID0gZmlfaGxwLT5hZGRyX2xpc3QubmV4dDsKKwkJCQkJd2hpbGUgKGVudHJ5ICE9ICYoZmlfaGxwLT5hZGRyX2xpc3QpKSB7CisJCQkJCQlhcm1fYWRkciA9IGxpc3RfZW50cnkoZW50cnksCisJCQkJCQkJCSAgICAgIHN0cnVjdAorCQkJCQkJCQkgICAgICBhcm1fYWRkciwKKwkJCQkJCQkJICAgICAgYWRkcl9saXN0KTsKKwkJCQkJCWlmIChhcm1fYWRkci0+c3RhcnQgPT0KKwkJCQkJCSAgICBhZGRyLT5zdGFydCkgeworCQkJCQkJCURCR01TRworCQkJCQkJCSAgICAoInJhdzEzOTRfcmVsZWFzZTogIgorCQkJCQkJCSAgICAgImFub3RoZXIgaG9zdCBvd25lcyAiCisJCQkJCQkJICAgICAic2FtZSBhZGRyZXNzcmFuZ2UiKTsKKwkJCQkJCQlhbm90aGVyX2hvc3QgPSAxOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwkJCQkJfQorCQkJCQlpZiAoYW5vdGhlcl9ob3N0KSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoIWFub3RoZXJfaG9zdCkgeworCQkJREJHTVNHKCJyYXcxMzk0X3JlbGVhc2U6IGNhbGwgaHBzYl9hcm1fdW5yZWdpc3RlciIpOworCQkJcmV0dmFsID0KKwkJCSAgICBocHNiX3VucmVnaXN0ZXJfYWRkcnNwYWNlKCZyYXcxMzk0X2hpZ2hsZXZlbCwKKwkJCQkJCSAgICAgIGZpLT5ob3N0LCBhZGRyLT5zdGFydCk7CisJCQlpZiAoIXJldHZhbCkgeworCQkJCSsrZmFpbDsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgInJhdzEzOTRfcmVsZWFzZSBhcm1fVW5yZWdpc3RlciBmYWlsZWRcbiIpOworCQkJfQorCQl9CisJCURCR01TRygicmF3MTM5NF9yZWxlYXNlOiBkZWxldGUgYWRkcl9lbnRyeSBmcm9tIGxpc3QiKTsKKwkJbGlzdF9kZWwoJmFkZHItPmFkZHJfbGlzdCk7CisJCXZmcmVlKGFkZHItPmFkZHJfc3BhY2VfYnVmZmVyKTsKKwkJa2ZyZWUoYWRkcik7CisJfQkJCS8qIHdoaWxlICovCisJc3Bpbl91bmxvY2tfaXJxKCZob3N0X2luZm9fbG9jayk7CisJaWYgKGZhaWwgPiAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmF3MTM5NDogZHVyaW5nIGFkZHJfbGlzdC1yZWxlYXNlICIKKwkJICAgICAgICJlcnJvcihzKSBvY2N1cnJlZCBcbiIpOworCX0KKworCXdoaWxlICghZG9uZSkgeworCQlzcGluX2xvY2tfaXJxKCZmaS0+cmVxbGlzdHNfbG9jayk7CisKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZmaS0+cmVxX2NvbXBsZXRlKSkgeworCQkJbGggPSBmaS0+cmVxX2NvbXBsZXRlLm5leHQ7CisJCQlsaXN0X2RlbChsaCk7CisKKwkJCXJlcSA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QsIGxpc3QpOworCisJCQlmcmVlX3BlbmRpbmdfcmVxdWVzdChyZXEpOworCQl9CisKKwkJaWYgKGxpc3RfZW1wdHkoJmZpLT5yZXFfcGVuZGluZykpCisJCQlkb25lID0gMTsKKworCQlzcGluX3VubG9ja19pcnEoJmZpLT5yZXFsaXN0c19sb2NrKTsKKworCQlpZiAoIWRvbmUpCisJCQlkb3duX2ludGVycnVwdGlibGUoJmZpLT5jb21wbGV0ZV9zZW0pOworCX0KKworCS8qIFJlbW92ZSBhbnkgc3ViLXRyZWVzIGxlZnQgYnkgdXNlciBzcGFjZSBwcm9ncmFtcyAqLworCWZvciAoaSA9IDA7IGkgPCBSQVcxMzk0X01BWF9VU0VSX0NTUl9ESVJTOyBpKyspIHsKKwkJc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpkZW50cnk7CisJCWlmICghZmktPmNzcjEyMTJfZGlyc1tpXSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGRlbnRyeSA9CisJCSAgICAgZmktPmNzcjEyMTJfZGlyc1tpXS0+dmFsdWUuZGlyZWN0b3J5LmRlbnRyaWVzX2hlYWQ7IGRlbnRyeTsKKwkJICAgICBkZW50cnkgPSBkZW50cnktPm5leHQpIHsKKwkJCWNzcjEyMTJfZGV0YWNoX2tleXZhbF9mcm9tX2RpcmVjdG9yeShmaS0+aG9zdC0+Y3NyLnJvbS0+CisJCQkJCQkJICAgICByb290X2t2LAorCQkJCQkJCSAgICAgZGVudHJ5LT5rdik7CisJCX0KKwkJY3NyMTIxMl9yZWxlYXNlX2tleXZhbChmaS0+Y3NyMTIxMl9kaXJzW2ldKTsKKwkJZmktPmNzcjEyMTJfZGlyc1tpXSA9IE5VTEw7CisJCWNzcl9tb2QgPSAxOworCX0KKworCWlmICgoY3NyX21vZCB8fCBmaS0+Y2Zncm9tX3VwZCkKKwkgICAgJiYgaHBzYl91cGRhdGVfY29uZmlnX3JvbV9pbWFnZShmaS0+aG9zdCkgPCAwKQorCQlIUFNCX0VSUgorCQkgICAgKCJGYWlsZWQgdG8gZ2VuZXJhdGUgQ29uZmlndXJhdGlvbiBST00gaW1hZ2UgZm9yIGhvc3QgJWQiLAorCQkgICAgIGZpLT5ob3N0LT5pZCk7CisKKwlpZiAoZmktPnN0YXRlID09IGNvbm5lY3RlZCkgeworCQlzcGluX2xvY2tfaXJxKCZob3N0X2luZm9fbG9jayk7CisJCWxpc3RfZGVsKCZmaS0+bGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycSgmaG9zdF9pbmZvX2xvY2spOworCisJCXB1dF9kZXZpY2UoJmZpLT5ob3N0LT5kZXZpY2UpOworCX0KKworCWtmcmVlKGZpKTsKKworCXJldHVybiAwOworfQorCisvKioqIEhPVFBMVUcgU1RVRkYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBFeHBvcnQgaW5mb3JtYXRpb24gYWJvdXQgcHJvdG9jb2xzL2RldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLgorICovCitzdGF0aWMgc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCByYXcxMzk0X2lkX3RhYmxlW10gPSB7CisJeworCSAubWF0Y2hfZmxhZ3MgPSBJRUVFMTM5NF9NQVRDSF9TUEVDSUZJRVJfSUQgfCBJRUVFMTM5NF9NQVRDSF9WRVJTSU9OLAorCSAuc3BlY2lmaWVyX2lkID0gQVZDX1VOSVRfU1BFQ19JRF9FTlRSWSAmIDB4ZmZmZmZmLAorCSAudmVyc2lvbiA9IEFWQ19TV19WRVJTSU9OX0VOVFJZICYgMHhmZmZmZmZ9LAorCXsKKwkgLm1hdGNoX2ZsYWdzID0gSUVFRTEzOTRfTUFUQ0hfU1BFQ0lGSUVSX0lEIHwgSUVFRTEzOTRfTUFUQ0hfVkVSU0lPTiwKKwkgLnNwZWNpZmllcl9pZCA9IENBTUVSQV9VTklUX1NQRUNfSURfRU5UUlkgJiAweGZmZmZmZiwKKwkgLnZlcnNpb24gPSBDQU1FUkFfU1dfVkVSU0lPTl9FTlRSWSAmIDB4ZmZmZmZmfSwKKwl7CisJIC5tYXRjaF9mbGFncyA9IElFRUUxMzk0X01BVENIX1NQRUNJRklFUl9JRCB8IElFRUUxMzk0X01BVENIX1ZFUlNJT04sCisJIC5zcGVjaWZpZXJfaWQgPSBDQU1FUkFfVU5JVF9TUEVDX0lEX0VOVFJZICYgMHhmZmZmZmYsCisJIC52ZXJzaW9uID0gKENBTUVSQV9TV19WRVJTSU9OX0VOVFJZICsgMSkgJiAweGZmZmZmZn0sCisJeworCSAubWF0Y2hfZmxhZ3MgPSBJRUVFMTM5NF9NQVRDSF9TUEVDSUZJRVJfSUQgfCBJRUVFMTM5NF9NQVRDSF9WRVJTSU9OLAorCSAuc3BlY2lmaWVyX2lkID0gQ0FNRVJBX1VOSVRfU1BFQ19JRF9FTlRSWSAmIDB4ZmZmZmZmLAorCSAudmVyc2lvbiA9IChDQU1FUkFfU1dfVkVSU0lPTl9FTlRSWSArIDIpICYgMHhmZmZmZmZ9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGllZWUxMzk0LCByYXcxMzk0X2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciByYXcxMzk0X2RyaXZlciA9IHsKKwkubmFtZSA9ICJyYXcxMzk0IERyaXZlciIsCisJLmlkX3RhYmxlID0gcmF3MTM5NF9pZF90YWJsZSwKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJyYXcxMzk0IiwKKwkJICAgLmJ1cyA9ICZpZWVlMTM5NF9idXNfdHlwZSwKKwkJICAgfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgcmF3MTM5NF9oaWdobGV2ZWwgPSB7CisJLm5hbWUgPSBSQVcxMzk0X0RFVklDRV9OQU1FLAorCS5hZGRfaG9zdCA9IGFkZF9ob3N0LAorCS5yZW1vdmVfaG9zdCA9IHJlbW92ZV9ob3N0LAorCS5ob3N0X3Jlc2V0ID0gaG9zdF9yZXNldCwKKwkuaXNvX3JlY2VpdmUgPSBpc29fcmVjZWl2ZSwKKwkuZmNwX3JlcXVlc3QgPSBmY3BfcmVxdWVzdCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2RldiByYXcxMzk0X2NkZXY7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYXcxMzk0X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnJlYWQgPSByYXcxMzk0X3JlYWQsCisJLndyaXRlID0gcmF3MTM5NF93cml0ZSwKKwkubW1hcCA9IHJhdzEzOTRfbW1hcCwKKwkuaW9jdGwgPSByYXcxMzk0X2lvY3RsLAorCS5wb2xsID0gcmF3MTM5NF9wb2xsLAorCS5vcGVuID0gcmF3MTM5NF9vcGVuLAorCS5yZWxlYXNlID0gcmF3MTM5NF9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9yYXcxMzk0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlocHNiX3JlZ2lzdGVyX2hpZ2hsZXZlbCgmcmF3MTM5NF9oaWdobGV2ZWwpOworCisJaWYgKElTX0VSUihjbGFzc19zaW1wbGVfZGV2aWNlX2FkZChocHNiX3Byb3RvY29sX2NsYXNzLCBNS0RFVigKKwkJSUVFRTEzOTRfTUFKT1IsCUlFRUUxMzk0X01JTk9SX0JMT0NLX1JBVzEzOTQgKiAxNiksIAorCQlOVUxMLCBSQVcxMzk0X0RFVklDRV9OQU1FKSkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5yZWc7CisJfQorCQorCWRldmZzX21rX2NkZXYoTUtERVYoCisJCUlFRUUxMzk0X01BSk9SLCBJRUVFMTM5NF9NSU5PUl9CTE9DS19SQVcxMzk0ICogMTYpLAorCQlTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsIFJBVzEzOTRfREVWSUNFX05BTUUpOworCisJY2Rldl9pbml0KCZyYXcxMzk0X2NkZXYsICZyYXcxMzk0X2ZvcHMpOworCXJhdzEzOTRfY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCWtvYmplY3Rfc2V0X25hbWUoJnJhdzEzOTRfY2Rldi5rb2JqLCBSQVcxMzk0X0RFVklDRV9OQU1FKTsKKwlyZXQgPSBjZGV2X2FkZCgmcmF3MTM5NF9jZGV2LCBJRUVFMTM5NF9SQVcxMzk0X0RFViwgMSk7CisJaWYgKHJldCkgeworCQlIUFNCX0VSUigicmF3MTM5NCBmYWlsZWQgdG8gcmVnaXN0ZXIgbWlub3IgZGV2aWNlIGJsb2NrIik7CisJCWdvdG8gb3V0X2RldjsKKwl9CisKKwlIUFNCX0lORk8oInJhdzEzOTQ6IC9kZXYvJXMgZGV2aWNlIGluaXRpYWxpemVkIiwgUkFXMTM5NF9ERVZJQ0VfTkFNRSk7CisKKwlyZXQgPSBocHNiX3JlZ2lzdGVyX3Byb3RvY29sKCZyYXcxMzk0X2RyaXZlcik7CisJaWYgKHJldCkgeworCQlIUFNCX0VSUigicmF3MTM5NDogZmFpbGVkIHRvIHJlZ2lzdGVyIHByb3RvY29sIik7CisJCWNkZXZfZGVsKCZyYXcxMzk0X2NkZXYpOworCQlnb3RvIG91dF9kZXY7CisJfQorCisJZ290byBvdXQ7CisKK291dF9kZXY6CisJZGV2ZnNfcmVtb3ZlKFJBVzEzOTRfREVWSUNFX05BTUUpOworCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKAorCQlJRUVFMTM5NF9NQUpPUiwgSUVFRTEzOTRfTUlOT1JfQkxPQ0tfUkFXMTM5NCAqIDE2KSk7CitvdXRfdW5yZWc6CisJaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbCgmcmF3MTM5NF9oaWdobGV2ZWwpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3JhdzEzOTQodm9pZCkKK3sKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVigKKwkJSUVFRTEzOTRfTUFKT1IsIElFRUUxMzk0X01JTk9SX0JMT0NLX1JBVzEzOTQgKiAxNikpOworCWNkZXZfZGVsKCZyYXcxMzk0X2NkZXYpOworCWRldmZzX3JlbW92ZShSQVcxMzk0X0RFVklDRV9OQU1FKTsKKwlocHNiX3VucmVnaXN0ZXJfaGlnaGxldmVsKCZyYXcxMzk0X2hpZ2hsZXZlbCk7CisJaHBzYl91bnJlZ2lzdGVyX3Byb3RvY29sKCZyYXcxMzk0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcmF3MTM5NCk7Cittb2R1bGVfZXhpdChjbGVhbnVwX3JhdzEzOTQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0NIQVJERVYoSUVFRTEzOTRfTUFKT1IsIElFRUUxMzk0X01JTk9SX0JMT0NLX1JBVzEzOTQgKiAxNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuaCBiL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YmZjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuaApAQCAtMCwwICsxLDE4MSBAQAorI2lmbmRlZiBJRUVFMTM5NF9SQVcxMzk0X0gKKyNkZWZpbmUgSUVFRTEzOTRfUkFXMTM5NF9ICisKKy8qIGhlYWRlciBmb3IgdGhlIHJhdzEzOTQgQVBJIHRoYXQgaXMgZXhwb3J0ZWQgdG8gdXNlci1zcGFjZSAqLworCisjZGVmaW5lIFJBVzEzOTRfS0VSTkVMQVBJX1ZFUlNJT04gNAorCisvKiBzdGF0ZTogb3BlbmVkICovCisjZGVmaW5lIFJBVzEzOTRfUkVRX0lOSVRJQUxJWkUgICAgMQorCisvKiBzdGF0ZTogaW5pdGlhbGl6ZWQgKi8KKyNkZWZpbmUgUkFXMTM5NF9SRVFfTElTVF9DQVJEUyAgICAyCisjZGVmaW5lIFJBVzEzOTRfUkVRX1NFVF9DQVJEICAgICAgMworCisvKiBzdGF0ZTogY29ubmVjdGVkICovCisjZGVmaW5lIFJBVzEzOTRfUkVRX0FTWU5DX1JFQUQgICAgICAxMDAKKyNkZWZpbmUgUkFXMTM5NF9SRVFfQVNZTkNfV1JJVEUgICAgIDEwMQorI2RlZmluZSBSQVcxMzk0X1JFUV9MT0NLICAgICAgICAgICAgMTAyCisjZGVmaW5lIFJBVzEzOTRfUkVRX0xPQ0s2NCAgICAgICAgICAxMDMKKyNkZWZpbmUgUkFXMTM5NF9SRVFfSVNPX1NFTkQgICAgICAgIDEwNAorI2RlZmluZSBSQVcxMzk0X1JFUV9BU1lOQ19TRU5EICAgICAgMTA1CisjZGVmaW5lIFJBVzEzOTRfUkVRX0FTWU5DX1NUUkVBTSAgICAxMDYKKworI2RlZmluZSBSQVcxMzk0X1JFUV9JU09fTElTVEVOICAgICAgMjAwCisjZGVmaW5lIFJBVzEzOTRfUkVRX0ZDUF9MSVNURU4gICAgICAyMDEKKyNkZWZpbmUgUkFXMTM5NF9SRVFfUkVTRVRfQlVTICAgICAgIDIwMgorI2RlZmluZSBSQVcxMzk0X1JFUV9HRVRfUk9NICAgICAgICAgMjAzCisjZGVmaW5lIFJBVzEzOTRfUkVRX1VQREFURV9ST00gICAgICAyMDQKKyNkZWZpbmUgUkFXMTM5NF9SRVFfRUNITyAgICAgICAgICAgIDIwNQorI2RlZmluZSBSQVcxMzk0X1JFUV9NT0RJRllfUk9NICAgICAgMjA2CisKKyNkZWZpbmUgUkFXMTM5NF9SRVFfQVJNX1JFR0lTVEVSICAgIDMwMAorI2RlZmluZSBSQVcxMzk0X1JFUV9BUk1fVU5SRUdJU1RFUiAgMzAxCisjZGVmaW5lIFJBVzEzOTRfUkVRX0FSTV9TRVRfQlVGICAgICAzMDIKKyNkZWZpbmUgUkFXMTM5NF9SRVFfQVJNX0dFVF9CVUYgICAgIDMwMworCisjZGVmaW5lIFJBVzEzOTRfUkVRX1JFU0VUX05PVElGWSAgICA0MDAKKworI2RlZmluZSBSQVcxMzk0X1JFUV9QSFlQQUNLRVQgICAgICAgNTAwCisKKy8qIGtlcm5lbCB0byB1c2VyICovCisjZGVmaW5lIFJBVzEzOTRfUkVRX0JVU19SRVNFVCAgICAgICAgMTAwMDAKKyNkZWZpbmUgUkFXMTM5NF9SRVFfSVNPX1JFQ0VJVkUgICAgICAxMDAwMQorI2RlZmluZSBSQVcxMzk0X1JFUV9GQ1BfUkVRVUVTVCAgICAgIDEwMDAyCisjZGVmaW5lIFJBVzEzOTRfUkVRX0FSTSAgICAgICAgICAgICAgMTAwMDMKKyNkZWZpbmUgUkFXMTM5NF9SRVFfUkFXSVNPX0FDVElWSVRZICAxMDAwNAorCisvKiBlcnJvciBjb2RlcyAqLworI2RlZmluZSBSQVcxMzk0X0VSUk9SX05PTkUgICAgICAgIDAKKyNkZWZpbmUgUkFXMTM5NF9FUlJPUl9DT01QQVQgICAgICAoLTEwMDEpCisjZGVmaW5lIFJBVzEzOTRfRVJST1JfU1RBVEVfT1JERVIgKC0xMDAyKQorI2RlZmluZSBSQVcxMzk0X0VSUk9SX0dFTkVSQVRJT04gICgtMTAwMykKKyNkZWZpbmUgUkFXMTM5NF9FUlJPUl9JTlZBTElEX0FSRyAoLTEwMDQpCisjZGVmaW5lIFJBVzEzOTRfRVJST1JfTUVNRkFVTFQgICAgKC0xMDA1KQorI2RlZmluZSBSQVcxMzk0X0VSUk9SX0FMUkVBRFkgICAgICgtMTAwNikKKworI2RlZmluZSBSQVcxMzk0X0VSUk9SX0VYQ0VTU0lWRSAgICgtMTAyMCkKKyNkZWZpbmUgUkFXMTM5NF9FUlJPUl9VTlRJRFlfTEVOICAoLTEwMjEpCisKKyNkZWZpbmUgUkFXMTM5NF9FUlJPUl9TRU5EX0VSUk9SICAoLTExMDApCisjZGVmaW5lIFJBVzEzOTRfRVJST1JfQUJPUlRFRCAgICAgKC0xMTAxKQorI2RlZmluZSBSQVcxMzk0X0VSUk9SX1RJTUVPVVQgICAgICgtMTEwMikKKworLyogYXJtX2NvZGVzICovCisjZGVmaW5lIEFSTV9SRUFEICAgMQorI2RlZmluZSBBUk1fV1JJVEUgIDIKKyNkZWZpbmUgQVJNX0xPQ0sgICA0CisKKyNkZWZpbmUgUkFXMTM5NF9MT05HX1JFU0VUICAwCisjZGVmaW5lIFJBVzEzOTRfU0hPUlRfUkVTRVQgMQorCisvKiBidXNyZXNldG5vdGlmeSAuLi4gKi8KKyNkZWZpbmUgUkFXMTM5NF9OT1RJRllfT0ZGIDAKKyNkZWZpbmUgUkFXMTM5NF9OT1RJRllfT04gIDEKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCitzdHJ1Y3QgcmF3MTM5NF9yZXF1ZXN0IHsKKyAgICAgICAgX191MzIgdHlwZTsKKyAgICAgICAgX19zMzIgZXJyb3I7CisgICAgICAgIF9fdTMyIG1pc2M7CisKKyAgICAgICAgX191MzIgZ2VuZXJhdGlvbjsKKyAgICAgICAgX191MzIgbGVuZ3RoOworCisgICAgICAgIF9fdTY0IGFkZHJlc3M7CisKKyAgICAgICAgX191NjQgdGFnOworCisgICAgICAgIF9fdTY0IHNlbmRiOworICAgICAgICBfX3U2NCByZWN2YjsKK307CisKK3N0cnVjdCByYXcxMzk0X2tob3N0X2xpc3QgeworICAgICAgICBfX3UzMiBub2RlczsKKyAgICAgICAgX191OCBuYW1lWzMyXTsKK307CisKK3R5cGVkZWYgc3RydWN0IGFybV9yZXF1ZXN0IHsKKyAgICAgICAgX191MTYgICAgICAgICAgIGRlc3RpbmF0aW9uX25vZGVpZDsKKyAgICAgICAgX191MTYgICAgICAgICAgIHNvdXJjZV9ub2RlaWQ7CisgICAgICAgIF9fdTY0ICAgICAgICAgICBkZXN0aW5hdGlvbl9vZmZzZXQ7CisgICAgICAgIF9fdTggICAgICAgICAgICB0bGFiZWw7CisgICAgICAgIF9fdTggICAgICAgICAgICB0Y29kZTsKKyAgICAgICAgX191OCAgICAgICAgICAgIGV4dGVuZGVkX3RyYW5zYWN0aW9uX2NvZGU7CisgICAgICAgIF9fdTMyICAgICAgICAgICBnZW5lcmF0aW9uOworICAgICAgICBfX3UxNiAgICAgICAgICAgYnVmZmVyX2xlbmd0aDsKKyAgICAgICAgX191OCAgICAgICAgICAgIF9fdXNlciAqYnVmZmVyOworfSAqYXJtX3JlcXVlc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYXJtX3Jlc3BvbnNlIHsKKyAgICAgICAgX19zMzIgICAgICAgICAgIHJlc3BvbnNlX2NvZGU7CisgICAgICAgIF9fdTE2ICAgICAgICAgICBidWZmZXJfbGVuZ3RoOworICAgICAgICBfX3U4ICAgICAgICAgICAgX191c2VyICpidWZmZXI7Cit9ICphcm1fcmVzcG9uc2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYXJtX3JlcXVlc3RfcmVzcG9uc2UgeworICAgICAgICBzdHJ1Y3QgYXJtX3JlcXVlc3QgIF9fdXNlciAqcmVxdWVzdDsKKyAgICAgICAgc3RydWN0IGFybV9yZXNwb25zZSBfX3VzZXIgKnJlc3BvbnNlOworfSAqYXJtX3JlcXVlc3RfcmVzcG9uc2VfdDsKKworLyogcmF3aXNvIEFQSSAqLworI2luY2x1ZGUgImllZWUxMzk0LWlvY3RsLmgiCisKKy8qIHBlci1wYWNrZXQgbWV0YWRhdGEgZW1iZWRkZWQgaW4gdGhlIHJpbmdidWZmZXIgKi8KKy8qIG11c3QgYmUgaWRlbnRpY2FsIHRvIGhwc2JfaXNvX3BhY2tldF9pbmZvIGluIGlzby5oISAqLworc3RydWN0IHJhdzEzOTRfaXNvX3BhY2tldF9pbmZvIHsKKwlfX3UzMiBvZmZzZXQ7CisJX191MTYgbGVuOworCV9fdTE2IGN5Y2xlOyAgIC8qIHJlY3Ygb25seSAqLworCV9fdTggIGNoYW5uZWw7IC8qIHJlY3Ygb25seSAqLworCV9fdTggIHRhZzsKKwlfX3U4ICBzeTsKK307CisKKy8qIGFyZ3VtZW50IGZvciBSQVcxMzk0X0lTT19SRUNWL1hNSVRfUEFDS0VUUyBpb2N0bHMgKi8KK3N0cnVjdCByYXcxMzk0X2lzb19wYWNrZXRzIHsKKwlfX3UzMiBuX3BhY2tldHM7CisJc3RydWN0IHJhdzEzOTRfaXNvX3BhY2tldF9pbmZvIF9fdXNlciAqaW5mb3M7Cit9OworCitzdHJ1Y3QgcmF3MTM5NF9pc29fY29uZmlnIHsKKwkvKiBzaXplIG9mIHBhY2tldCBkYXRhIGJ1ZmZlciwgaW4gYnl0ZXMgKHdpbGwgYmUgcm91bmRlZCB1cCB0byBQQUdFX1NJWkUpICovCisJX191MzIgZGF0YV9idWZfc2l6ZTsKKworCS8qICMgb2YgcGFja2V0cyB0byBidWZmZXIgKi8KKwlfX3UzMiBidWZfcGFja2V0czsKKworCS8qIGlzbyBjaGFubmVsIChzZXQgdG8gLTEgZm9yIG11bHRpLWNoYW5uZWwgcmVjdikgKi8KKwlfX3MzMiBjaGFubmVsOworCisJLyogeG1pdCBvbmx5IC0gaXNvIHRyYW5zbWlzc2lvbiBzcGVlZCAqLworCV9fdTggc3BlZWQ7CisKKwkvKiBUaGUgbW9kZSBvZiB0aGUgZG1hIHdoZW4gcmVjZWl2aW5nIGlzbyBkYXRhLiBNdXN0IGJlIHN1cHBvcnRlZCBieSBjaGlwICovCisJX191OCBkbWFfbW9kZTsKKworCS8qIG1heC4gbGF0ZW5jeSBvZiBidWZmZXIsIGluIHBhY2tldHMgKC0xIGlmIHlvdSBkb24ndCBjYXJlKSAqLworCV9fczMyIGlycV9pbnRlcnZhbDsKK307CisKKy8qIGFyZ3VtZW50IHRvIFJBVzEzOTRfSVNPX1hNSVQvUkVDVl9JTklUIGFuZCBSQVcxMzk0X0lTT19HRVRfU1RBVFVTICovCitzdHJ1Y3QgcmF3MTM5NF9pc29fc3RhdHVzIHsKKwkvKiBjdXJyZW50IHNldHRpbmdzICovCisJc3RydWN0IHJhdzEzOTRfaXNvX2NvbmZpZyBjb25maWc7CisKKwkvKiBudW1iZXIgb2YgcGFja2V0cyB3YWl0aW5nIHRvIGJlIGZpbGxlZCB3aXRoIGRhdGEgKElTTyB0cmFuc21pc3Npb24pCisJICAgb3IgY29udGFpbmluZyBkYXRhIHJlY2VpdmVkIChJU08gcmVjZXB0aW9uKSAqLworCV9fdTMyIG5fcGFja2V0czsKKworCS8qIGFwcHJveGltYXRlIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIG92ZXJmbG93IG9yCisJICAgdW5kZXJmbG93IG9mIHRoZSBwYWNrZXQgYnVmZmVyIChhIHZhbHVlIG9mIHplcm8gZ3VhcmFudGVlcworCSAgIHRoYXQgbm8gcGFja2V0cyBoYXZlIGJlZW4gZHJvcHBlZCkgKi8KKwlfX3UzMiBvdmVyZmxvd3M7CisKKwkvKiBjeWNsZSBudW1iZXIgYXQgd2hpY2ggbmV4dCBwYWNrZXQgd2lsbCBiZSB0cmFuc21pdHRlZDsKKwkgICAtMSBpZiBub3Qga25vd24gKi8KKwlfX3MxNiB4bWl0X2N5Y2xlOworfTsKKworI2VuZGlmIC8qIElFRUUxMzk0X1JBVzEzOTRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMgYi9kcml2ZXJzL2llZWUxMzk0L3NicDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGM3Yjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMKQEAgLTAsMCArMSwyODY0IEBACisvKgorICogc2JwMi5jIC0gU0JQLTIgcHJvdG9jb2wgZHJpdmVyIGZvciBJRUVFLTEzOTQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgSmFtZXMgR29vZHdpbiwgRmlsYW5ldCBDb3Jwb3JhdGlvbiAod3d3LmZpbGFuZXQuY29tKQorICogamFtZXNnQGZpbGFuZXQuY29tIChKU0cpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEJlbiBDb2xsaW5zIDxiY29sbGluc0BkZWJpYW4ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyoKKyAqIEJyaWVmIERlc2NyaXB0aW9uOgorICoKKyAqIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgdGhlIFNlcmlhbCBCdXMgUHJvdG9jb2wgMiAoU0JQLTIpIG92ZXIgSUVFRS0xMzk0CisgKiB1bmRlciBMaW51eC4gVGhlIFNCUC0yIGRyaXZlciBpcyBpbXBsZW1lbnRlZCBhcyBhbiBJRUVFLTEzOTQgaGlnaC1sZXZlbAorICogZHJpdmVyLiBJdCBhbHNvIHJlZ2lzdGVycyBhcyBhIFNDU0kgbG93ZXItbGV2ZWwgZHJpdmVyIGluIG9yZGVyIHRvIGFjY2VwdAorICogU0NTSSBjb21tYW5kcyBmb3IgdHJhbnNwb3J0IHVzaW5nIFNCUC0yLgorICoKKyAqIFlvdSBtYXkgYWNjZXNzIGFueSBhdHRhY2hlZCBTQlAtMiBzdG9yYWdlIGRldmljZXMgYXMgaWYgdGhleSB3ZXJlIFNDU0kKKyAqIGRldmljZXMgKGUuZy4gbW91bnQgL2Rldi9zZGExLCAgZmRpc2ssIG1rZnMsIGV0Yy4pLgorICoKKyAqIEN1cnJlbnQgSXNzdWVzOgorICoKKyAqCS0gRXJyb3IgSGFuZGxpbmc6IFNDU0kgYWJvcnRzIGFuZCBidXMgcmVzZXQgcmVxdWVzdHMgYXJlIGhhbmRsZWQgc29tZXdoYXQKKyAqCSAgYnV0IHRoZSBjb2RlIG5lZWRzIGFkZGl0aW9uYWwgZGVidWdnaW5nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kYmcuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImNzcjEyMTIuaCIKKyNpbmNsdWRlICJpZWVlMTM5NC5oIgorI2luY2x1ZGUgImllZWUxMzk0X3R5cGVzLmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfY29yZS5oIgorI2luY2x1ZGUgIm5vZGVtZ3IuaCIKKyNpbmNsdWRlICJob3N0cy5oIgorI2luY2x1ZGUgImhpZ2hsZXZlbC5oIgorI2luY2x1ZGUgImllZWUxMzk0X3RyYW5zYWN0aW9ucy5oIgorI2luY2x1ZGUgInNicDIuaCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCSIkUmV2OiAxMjE5ICQgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGRlYmlhbi5vcmc+IjsKKworLyoKKyAqIE1vZHVsZSBsb2FkIHBhcmFtZXRlciBkZWZpbml0aW9ucworICovCisKKy8qCisgKiBDaGFuZ2UgbWF4X3NwZWVkIG9uIG1vZHVsZSBsb2FkIGlmIHlvdSBoYXZlIGEgYmFkIElFRUUtMTM5NAorICogY29udHJvbGxlciB0aGF0IGhhcyB0cm91YmxlIHJ1bm5pbmcgMktCIHBhY2tldHMgYXQgNDAwbWIuCisgKgorICogTk9URTogT24gY2VydGFpbiBPSENJIHBhcnRzIEkgaGF2ZSBzZWVuIHNob3J0IHBhY2tldHMgb24gYXN5bmMgdHJhbnNtaXQKKyAqIChwcm9iYWJseSBkdWUgdG8gUENJIGxhdGVuY3kvdGhyb3VnaHB1dCBpc3N1ZXMgd2l0aCB0aGUgcGFydCkuIFlvdSBjYW4KKyAqIGJ1bXAgZG93biB0aGUgc3BlZWQgaWYgeW91IGFyZSBydW5uaW5nIGludG8gcHJvYmxlbXMuCisgKi8KK3N0YXRpYyBpbnQgbWF4X3NwZWVkID0gSUVFRTEzOTRfU1BFRURfTUFYOworbW9kdWxlX3BhcmFtKG1heF9zcGVlZCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3NwZWVkLCAiRm9yY2UgbWF4IHNwZWVkICgzID0gODAwbWIsIDIgPSA0MDBtYiBkZWZhdWx0LCAxID0gMjAwbWIsIDAgPSAxMDBtYikiKTsKKworLyoKKyAqIFNldCBzZXJpYWxpemVfaW8gdG8gMSBpZiB5b3UnZCBsaWtlIG9ubHkgb25lIHNjc2kgY29tbWFuZCBzZW50CisgKiBkb3duIHRvIHVzIGF0IGEgdGltZSAoZGVidWdnaW5nKS4gVGhpcyBtaWdodCBiZSBuZWNlc3NhcnkgZm9yIHZlcnkKKyAqIGJhZGx5IGJlaGF2ZWQgc2JwMiBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IHNlcmlhbGl6ZV9pbyA9IDA7Cittb2R1bGVfcGFyYW0oc2VyaWFsaXplX2lvLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhzZXJpYWxpemVfaW8sICJTZXJpYWxpemUgYWxsIEkvTyBjb21pbmcgZG93biBmcm9tIHRoZSBzY3NpIGRyaXZlcnMgKGRlZmF1bHQgPSAwKSIpOworCisvKgorICogQnVtcCB1cCBtYXhfc2VjdG9ycyBpZiB5b3UnZCBsaWtlIHRvIHN1cHBvcnQgdmVyeSBsYXJnZSBzaXplZAorICogdHJhbnNmZXJzLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgb2xkZXIgc2JwMiBicmlkZ2UgY2hpcHMgYXJlIGJyb2tlbiBmb3IKKyAqIHRyYW5zZmVycyBncmVhdGVyIG9yIGVxdWFsIHRvIDEyOEtCLiAgRGVmYXVsdCBpcyBhIHZhbHVlIG9mIDI1NQorICogc2VjdG9ycywgb3IganVzdCB1bmRlciAxMjhLQiAoYXQgNTEyIGJ5dGUgc2VjdG9yIHNpemUpLiBJIGNhbiBub3RlIHRoYXQKKyAqIHRoZSBPeHNlbWkgc2JwMiBjaGlwc2V0cyBoYXZlIG5vIHByb2JsZW1zIHN1cHBvcnRpbmcgdmVyeSBsYXJnZQorICogdHJhbnNmZXIgc2l6ZXMuCisgKi8KK3N0YXRpYyBpbnQgbWF4X3NlY3RvcnMgPSBTQlAyX01BWF9TRUNUT1JTOworbW9kdWxlX3BhcmFtKG1heF9zZWN0b3JzLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc2VjdG9ycywgIkNoYW5nZSBtYXggc2VjdG9ycyBwZXIgSS9PIHN1cHBvcnRlZCAoZGVmYXVsdCA9IDI1NSkiKTsKKworLyoKKyAqIEV4Y2x1c2l2ZSBsb2dpbiB0byBzYnAyIGRldmljZT8gSW4gbW9zdCBjYXNlcywgdGhlIHNicDIgZHJpdmVyIHNob3VsZAorICogZG8gYW4gZXhjbHVzaXZlIGxvZ2luLCBhcyBpdCdzIGdlbmVyYWxseSB1bnNhZmUgdG8gaGF2ZSB0d28gaG9zdHMKKyAqIHRhbGtpbmcgdG8gYSBzaW5nbGUgc2JwMiBkZXZpY2UgYXQgdGhlIHNhbWUgdGltZSAoZmlsZXN5c3RlbSBjb2hlcmVuY3ksCisgKiBldGMuKS4gSWYgeW91J3JlIHJ1bm5pbmcgYW4gc2JwMiBkZXZpY2UgdGhhdCBzdXBwb3J0cyBtdWx0aXBsZSBsb2dpbnMsCisgKiBhbmQgeW91J3JlIGVpdGhlciBydW5uaW5nIHJlYWQtb25seSBmaWxlc3lzdGVtcyBvciBzb21lIHNvcnQgb2Ygc3BlY2lhbAorICogZmlsZXN5c3RlbSBzdXBwb3J0aW5nIG11bHRpcGxlIGhvc3RzIChvbmUgc3VjaCBmaWxlc3lzdGVtIGlzIE9wZW5HRlMsCisgKiBzZWUgb3Blbmdmcy5zb3VyY2Vmb3JnZS5uZXQgZm9yIG1vcmUgaW5mbyksIHRoZW4gc2V0IGV4Y2x1c2l2ZV9sb2dpbgorICogdG8gemVyby4gTm90ZTogVGhlIE94c2VtaSBPWEZXOTExIHNicDIgY2hpcHNldCBzdXBwb3J0cyB1cCB0byBmb3VyCisgKiBjb25jdXJyZW50IGxvZ2lucy4KKyAqLworc3RhdGljIGludCBleGNsdXNpdmVfbG9naW4gPSAxOworbW9kdWxlX3BhcmFtKGV4Y2x1c2l2ZV9sb2dpbiwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZXhjbHVzaXZlX2xvZ2luLCAiRXhjbHVzaXZlIGxvZ2luIHRvIHNicDIgZGV2aWNlIChkZWZhdWx0ID0gMSkiKTsKKworLyoKKyAqIFNDU0kgaW5xdWlyeSBoYWNrIGZvciByZWFsbHkgYmFkbHkgYmVoYXZlZCBzYnAyIGRldmljZXMuIFR1cm4gdGhpcyBvbgorICogaWYgeW91ciBzYnAyIGRldmljZSBpcyBub3QgcHJvcGVybHkgaGFuZGxpbmcgdGhlIFNDU0kgaW5xdWlyeSBjb21tYW5kLgorICogVGhpcyBoYWNrIG1ha2VzIHRoZSBpbnF1aXJ5IGxvb2sgbW9yZSBsaWtlIGEgdHlwaWNhbCBNUyBXaW5kb3dzCisgKiBpbnF1aXJ5LgorICoKKyAqIElmIGZvcmNlX2lucXVpcnlfaGFjaz0xIGlzIHJlcXVpcmVkIGZvciB5b3VyIGRldmljZSB0byB3b3JrLAorICogcGxlYXNlIHN1Ym1pdCB0aGUgbG9nZ2VkIHNicDJfZmlybXdhcmVfcmV2aXNpb24gdmFsdWUgb2YgdGhpcyBkZXZpY2UgdG8KKyAqIHRoZSBsaW51eDEzOTQtZGV2ZWwgbWFpbGluZyBsaXN0LgorICovCitzdGF0aWMgaW50IGZvcmNlX2lucXVpcnlfaGFjayA9IDA7Cittb2R1bGVfcGFyYW0oZm9yY2VfaW5xdWlyeV9oYWNrLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pbnF1aXJ5X2hhY2ssICJGb3JjZSBTQ1NJIGlucXVpcnkgaGFjayAoZGVmYXVsdCA9IDApIik7CisKKworLyoKKyAqIEV4cG9ydCBpbmZvcm1hdGlvbiBhYm91dCBwcm90b2NvbHMvZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkIHNicDJfaWRfdGFibGVbXSA9IHsKKwl7CisJCS5tYXRjaF9mbGFncyA9SUVFRTEzOTRfTUFUQ0hfU1BFQ0lGSUVSX0lEIHwKKwkJICAgICAgICAgICAgICBJRUVFMTM5NF9NQVRDSF9WRVJTSU9OLAorCQkuc3BlY2lmaWVyX2lkID0gU0JQMl9VTklUX1NQRUNfSURfRU5UUlkgJiAweGZmZmZmZiwKKwkJLnZlcnNpb24gPSAgICBTQlAyX1NXX1ZFUlNJT05fRU5UUlkgJiAweGZmZmZmZgorCX0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGllZWUxMzk0LCBzYnAyX2lkX3RhYmxlKTsKKworLyoKKyAqIERlYnVnIGxldmVscywgY29uZmlndXJlZCB2aWEga2VybmVsIGNvbmZpZywgb3IgZW5hYmxlIGhlcmUuCisgKi8KKworLyogI2RlZmluZSBDT05GSUdfSUVFRTEzOTRfU0JQMl9ERUJVR19PUkJTICovCisvKiAjZGVmaW5lIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHX0RNQSAqLworLyogI2RlZmluZSBDT05GSUdfSUVFRTEzOTRfU0JQMl9ERUJVRyAxICovCisvKiAjZGVmaW5lIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHIDIgKi8KKy8qICNkZWZpbmUgQ09ORklHX0lFRUUxMzk0X1NCUDJfUEFDS0VUX0RVTVAgKi8KKworI2lmZGVmIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHX09SQlMKKyNkZWZpbmUgU0JQMl9PUkJfREVCVUcoZm10LCBhcmdzLi4uKQlIUFNCX0VSUigic2JwMiglcyk6ICJmbXQsIF9fRlVOQ1RJT05fXywgIyMgYXJncykKK3N0YXRpYyB1MzIgZ2xvYmFsX291dHN0YW5kaW5nX2NvbW1hbmRfb3JicyA9IDA7CisjZGVmaW5lIG91dHN0YW5kaW5nX29yYl9pbmNyIGdsb2JhbF9vdXRzdGFuZGluZ19jb21tYW5kX29yYnMrKworI2RlZmluZSBvdXRzdGFuZGluZ19vcmJfZGVjciBnbG9iYWxfb3V0c3RhbmRpbmdfY29tbWFuZF9vcmJzLS0KKyNlbHNlCisjZGVmaW5lIFNCUDJfT1JCX0RFQlVHKGZtdCwgYXJncy4uLikKKyNkZWZpbmUgb3V0c3RhbmRpbmdfb3JiX2luY3IKKyNkZWZpbmUgb3V0c3RhbmRpbmdfb3JiX2RlY3IKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1NCUDJfREVCVUdfRE1BCisjZGVmaW5lIFNCUDJfRE1BX0FMTE9DKGZtdCwgYXJncy4uLikgXAorCUhQU0JfRVJSKCJzYnAyKCVzKWFsbG9jKCVkKTogImZtdCwgX19GVU5DVElPTl9fLCBcCisJCSArK2dsb2JhbF9vdXRzdGFuZGluZ19kbWFzLCAjIyBhcmdzKQorI2RlZmluZSBTQlAyX0RNQV9GUkVFKGZtdCwgYXJncy4uLikgXAorCUhQU0JfRVJSKCJzYnAyKCVzKWZyZWUoJWQpOiAiZm10LCBfX0ZVTkNUSU9OX18sIFwKKwkJIC0tZ2xvYmFsX291dHN0YW5kaW5nX2RtYXMsICMjIGFyZ3MpCitzdGF0aWMgdTMyIGdsb2JhbF9vdXRzdGFuZGluZ19kbWFzID0gMDsKKyNlbHNlCisjZGVmaW5lIFNCUDJfRE1BX0FMTE9DKGZtdCwgYXJncy4uLikKKyNkZWZpbmUgU0JQMl9ETUFfRlJFRShmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2lmIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHID49IDIKKyNkZWZpbmUgU0JQMl9ERUJVRyhmbXQsIGFyZ3MuLi4pCUhQU0JfRVJSKCJzYnAyOiAiZm10LCAjIyBhcmdzKQorI2RlZmluZSBTQlAyX0lORk8oZm10LCBhcmdzLi4uKQkJSFBTQl9FUlIoInNicDI6ICJmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFNCUDJfTk9USUNFKGZtdCwgYXJncy4uLikJSFBTQl9FUlIoInNicDI6ICJmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFNCUDJfV0FSTihmbXQsIGFyZ3MuLi4pCQlIUFNCX0VSUigic2JwMjogImZtdCwgIyMgYXJncykKKyNlbGlmIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHID09IDEKKyNkZWZpbmUgU0JQMl9ERUJVRyhmbXQsIGFyZ3MuLi4pCUhQU0JfREVCVUcoInNicDI6ICJmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFNCUDJfSU5GTyhmbXQsIGFyZ3MuLi4pCQlIUFNCX0lORk8oInNicDI6ICJmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFNCUDJfTk9USUNFKGZtdCwgYXJncy4uLikJSFBTQl9OT1RJQ0UoInNicDI6ICJmbXQsICMjIGFyZ3MpCisjZGVmaW5lIFNCUDJfV0FSTihmbXQsIGFyZ3MuLi4pCQlIUFNCX1dBUk4oInNicDI6ICJmbXQsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBTQlAyX0RFQlVHKGZtdCwgYXJncy4uLikKKyNkZWZpbmUgU0JQMl9JTkZPKGZtdCwgYXJncy4uLikJCUhQU0JfSU5GTygic2JwMjogImZtdCwgIyMgYXJncykKKyNkZWZpbmUgU0JQMl9OT1RJQ0UoZm10LCBhcmdzLi4uKSAgICAgICBIUFNCX05PVElDRSgic2JwMjogImZtdCwgIyMgYXJncykKKyNkZWZpbmUgU0JQMl9XQVJOKGZtdCwgYXJncy4uLikgICAgICAgICBIUFNCX1dBUk4oInNicDI6ICJmbXQsICMjIGFyZ3MpCisjZW5kaWYKKworI2RlZmluZSBTQlAyX0VSUihmbXQsIGFyZ3MuLi4pCQlIUFNCX0VSUigic2JwMjogImZtdCwgIyMgYXJncykKKworCisvKgorICogR2xvYmFscworICovCisKK3N0YXRpYyB2b2lkIHNicDJzY3NpX2NvbXBsZXRlX2FsbF9jb21tYW5kcyhzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLAorCQkJCQkgICB1MzIgc3RhdHVzKTsKKworc3RhdGljIHZvaWQgc2JwMnNjc2lfY29tcGxldGVfY29tbWFuZChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLAorCQkJCSAgICAgIHUzMiBzY3NpX3N0YXR1cywgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisJCQkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBzY3NpX2RyaXZlcl90ZW1wbGF0ZTsKKworc3RhdGljIGNvbnN0IHU4IHNicDJfc3BlZWR0b19tYXhfcGF5bG9hZFtdID0geyAweDcsIDB4OCwgMHg5LCAweEEsIDB4QiwgMHhDIH07CisKK3N0YXRpYyB2b2lkIHNicDJfaG9zdF9yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKKworc3RhdGljIGludCBzYnAyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNicDJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNicDJfdXBkYXRlKHN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQpOworCitzdGF0aWMgc3RydWN0IGhwc2JfaGlnaGxldmVsIHNicDJfaGlnaGxldmVsID0geworCS5uYW1lID0JCVNCUDJfREVWSUNFX05BTUUsCisJLmhvc3RfcmVzZXQgPQlzYnAyX2hvc3RfcmVzZXQsCit9OworCitzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgc2JwMl9vcHMgPSB7CisJLndyaXRlID0gc2JwMl9oYW5kbGVfc3RhdHVzX3dyaXRlCit9OworCisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1NCUDJfUEhZU19ETUEKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBzYnAyX3BoeXNkbWFfb3BzID0geworICAgICAgICAucmVhZCA9IHNicDJfaGFuZGxlX3BoeXNkbWFfcmVhZCwKKyAgICAgICAgLndyaXRlID0gc2JwMl9oYW5kbGVfcGh5c2RtYV93cml0ZSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBocHNiX3Byb3RvY29sX2RyaXZlciBzYnAyX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiU0JQMiBEcml2ZXIiLAorCS5pZF90YWJsZQk9IHNicDJfaWRfdGFibGUsCisJLnVwZGF0ZQkJPSBzYnAyX3VwZGF0ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gU0JQMl9ERVZJQ0VfTkFNRSwKKwkJLmJ1cwkJPSAmaWVlZTEzOTRfYnVzX3R5cGUsCisJCS5wcm9iZQkJPSBzYnAyX3Byb2JlLAorCQkucmVtb3ZlCQk9IHNicDJfcmVtb3ZlLAorCX0sCit9OworCisKKy8qIExpc3Qgb2YgZGV2aWNlIGZpcm13YXJlJ3MgdGhhdCByZXF1aXJlIGEgZm9yY2VkIDM2IGJ5dGUgaW5xdWlyeS4gICovCitzdGF0aWMgdTMyIHNicDJfYnJva2VuX2lucXVpcnlfbGlzdFtdID0geworCTB4MDAwMDI4MDAsCS8qIFN0ZWZhbiBSaWNodGVyIDxyaWNodGVzdEBiYXV3ZXNlbi50dS1jb3R0YnVzLmRlPiAqLworCQkJLyogRFZpQ08gTW9tb2JheSBDWC0xICovCisJMHgwMDAwMDIwMAkvKiBBbmRyZWFzIFBsZXNjaCA8cGxlc2NoQGZhcy5oYXJ2YXJkLmVkdT4gKi8KKwkJCS8qIFFQUyBGaXJlIERWREJ1cm5lciAqLworfTsKKworI2RlZmluZSBOVU1fQlJPS0VOX0lOUVVJUllfREVWUyBcCisJKHNpemVvZihzYnAyX2Jyb2tlbl9pbnF1aXJ5X2xpc3QpL3NpemVvZigqc2JwMl9icm9rZW5faW5xdWlyeV9saXN0KSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZW5lcmFsIHV0aWxpdHkgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0JJR19FTkRJQU4KKy8qCisgKiBDb252ZXJ0cyBhIGJ1ZmZlciBmcm9tIGJlMzIgdG8gY3B1IGJ5dGUgb3JkZXJpbmcuIExlbmd0aCBpcyBpbiBieXRlcy4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBzYnAydXRpbF9iZTMyX3RvX2NwdV9idWZmZXIodm9pZCAqYnVmZmVyLCBpbnQgbGVuZ3RoKQoreworCXUzMiAqdGVtcCA9IGJ1ZmZlcjsKKworCWZvciAobGVuZ3RoID0gKGxlbmd0aCA+PiAyKTsgbGVuZ3RoLS07ICkKKwkJdGVtcFtsZW5ndGhdID0gYmUzMl90b19jcHUodGVtcFtsZW5ndGhdKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIENvbnZlcnRzIGEgYnVmZmVyIGZyb20gY3B1IHRvIGJlMzIgYnl0ZSBvcmRlcmluZy4gTGVuZ3RoIGlzIGluIGJ5dGVzLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNicDJ1dGlsX2NwdV90b19iZTMyX2J1ZmZlcih2b2lkICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJdTMyICp0ZW1wID0gYnVmZmVyOworCisJZm9yIChsZW5ndGggPSAobGVuZ3RoID4+IDIpOyBsZW5ndGgtLTsgKQorCQl0ZW1wW2xlbmd0aF0gPSBjcHVfdG9fYmUzMih0ZW1wW2xlbmd0aF0pOworCisJcmV0dXJuOworfQorI2Vsc2UgLyogQklHX0VORElBTiAqLworLyogV2h5IHdhc3RlIHRoZSBjcHUgY3ljbGVzPyAqLworI2RlZmluZSBzYnAydXRpbF9iZTMyX3RvX2NwdV9idWZmZXIoeCx5KQorI2RlZmluZSBzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoeCx5KQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfU0JQMl9QQUNLRVRfRFVNUAorLyoKKyAqIERlYnVnIHBhY2tldCBkdW1wIHJvdXRpbmUuIExlbmd0aCBpcyBpbiBieXRlcy4KKyAqLworc3RhdGljIHZvaWQgc2JwMnV0aWxfcGFja2V0X2R1bXAodm9pZCAqYnVmZmVyLCBpbnQgbGVuZ3RoLCBjaGFyICpkdW1wX25hbWUsIHUzMiBkdW1wX3BoeXNfYWRkcikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpkdW1wID0gYnVmZmVyOworCisJaWYgKCFkdW1wIHx8ICFsZW5ndGggfHwgIWR1bXBfbmFtZSkKKwkJcmV0dXJuOworCisJaWYgKGR1bXBfcGh5c19hZGRyKQorCQlwcmludGsoIlslcywgMHgleF0iLCBkdW1wX25hbWUsIGR1bXBfcGh5c19hZGRyKTsKKwllbHNlCisJCXByaW50aygiWyVzXSIsIGR1bXBfbmFtZSk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWlmIChpID4gMHgzZikgeworCQkJcHJpbnRrKCJcbiAgIC4uLiIpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChpICYgMHgzKSA9PSAwKQorCQkJcHJpbnRrKCIgICIpOworCQlpZiAoKGkgJiAweGYpID09IDApCisJCQlwcmludGsoIlxuICAgIik7CisJCXByaW50aygiJTAyeCAiLCAoaW50KSBkdW1wW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCisJcmV0dXJuOworfQorI2Vsc2UKKyNkZWZpbmUgc2JwMnV0aWxfcGFja2V0X2R1bXAodyx4LHkseikKKyNlbmRpZgorCisvKgorICogR29vZnkgcm91dGluZSB0aGF0IGJhc2ljYWxseSBkb2VzIGEgZG93bl90aW1lb3V0IGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IHNicDJ1dGlsX2Rvd25fdGltZW91dChhdG9taWNfdCAqZG9uZSwgaW50IHRpbWVvdXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSB0aW1lb3V0OyAoaSA+IDAgJiYgYXRvbWljX3JlYWQoZG9uZSkgPT0gMCk7IGktPSBIWi8xMCkgeworCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTAwKSkJLyogMTAwbXMgKi8KKwkJCXJldHVybigxKTsKKwl9CisJcmV0dXJuICgoaSA+IDApID8gMDoxKTsKK30KKworLyogRnJlZSdzIGFuIGFsbG9jYXRlZCBwYWNrZXQgKi8KK3N0YXRpYyB2b2lkIHNicDJfZnJlZV9wYWNrZXQoc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQpCit7CisJaHBzYl9mcmVlX3RsYWJlbChwYWNrZXQpOworCWhwc2JfZnJlZV9wYWNrZXQocGFja2V0KTsKK30KKworLyogVGhpcyBpcyBtdWNoIGxpa2UgaHBzYl9ub2RlX3dyaXRlKCksIGV4Y2VwdCBpdCBpZ25vcmVzIHRoZSByZXNwb25zZQorICogc3ViYWN0aW9uIGFuZCByZXR1cm5zIGltbWVkaWF0ZWx5LiBDYW4gYmUgdXNlZCBmcm9tIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyBpbnQgc2JwMnV0aWxfbm9kZV93cml0ZV9ub193YWl0KHN0cnVjdCBub2RlX2VudHJ5ICpuZSwgdTY0IGFkZHIsCisJCQkJcXVhZGxldF90ICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCit7CisJc3RydWN0IGhwc2JfcGFja2V0ICpwYWNrZXQ7CisKKwlwYWNrZXQgPSBocHNiX21ha2Vfd3JpdGVwYWNrZXQobmUtPmhvc3QsIG5lLT5ub2RlaWQsCisJCQkJICAgICAgIGFkZHIsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgICAgaWYgKCFwYWNrZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisKKwlocHNiX3NldF9wYWNrZXRfY29tcGxldGVfdGFzayhwYWNrZXQsICh2b2lkICgqKSh2b2lkKikpc2JwMl9mcmVlX3BhY2tldCwKKwkJCQkgICAgICBwYWNrZXQpOworCisJaHBzYl9ub2RlX2ZpbGxfcGFja2V0KG5lLCBwYWNrZXQpOworCisgICAgICAgIGlmIChocHNiX3NlbmRfcGFja2V0KHBhY2tldCkgPCAwKSB7CisJCXNicDJfZnJlZV9wYWNrZXQocGFja2V0KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjcmVhdGUgYSBwb29sIG9mIGNvbW1hbmQgb3JicyB1c2VkIGZvcgorICogY29tbWFuZCBwcm9jZXNzaW5nLiBJdCBpcyBjYWxsZWQgd2hlbiBhIG5ldyBzYnAyIGRldmljZSBpcyBkZXRlY3RlZC4KKyAqLworc3RhdGljIGludCBzYnAydXRpbF9jcmVhdGVfY29tbWFuZF9vcmJfcG9vbChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQoreworCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpID0gc2NzaV9pZC0+aGk7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFncywgb3JiczsKKwlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQ7CisKKwlvcmJzID0gc2VyaWFsaXplX2lvID8gMiA6IFNCUDJfTUFYX0NNRFM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG9yYnM7IGkrKykgeworCQljb21tYW5kID0gKHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqKQorCQkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9pbmZvKSwgR0ZQX0FUT01JQyk7CisJCWlmICghY29tbWFuZCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4oLUVOT01FTSk7CisJCX0KKwkJbWVtc2V0KGNvbW1hbmQsICdcMCcsIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8pKTsKKwkJY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hID0KKwkJCXBjaV9tYXBfc2luZ2xlIChoaS0+aG9zdC0+cGRldiwgJmNvbW1hbmQtPmNvbW1hbmRfb3JiLAorCQkJCQlzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpLAorCQkJCQlQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQlTQlAyX0RNQV9BTExPQygic2luZ2xlIGNvbW1hbmQgb3JiIERNQSIpOworCQljb21tYW5kLT5zZ2VfZG1hID0KKwkJCXBjaV9tYXBfc2luZ2xlIChoaS0+aG9zdC0+cGRldiwgJmNvbW1hbmQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQsCisJCQkJCXNpemVvZihjb21tYW5kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50KSwKKwkJCQkJUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJU0JQMl9ETUFfQUxMT0MoInNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQiKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNvbW1hbmQtPmxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZjb21tYW5kLT5saXN0LCAmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9jb21wbGV0ZWQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRlbGV0ZSBhIHBvb2wgb2YgY29tbWFuZCBvcmJzLgorICovCitzdGF0aWMgdm9pZCBzYnAydXRpbF9yZW1vdmVfY29tbWFuZF9vcmJfcG9vbChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQoreworCXN0cnVjdCBocHNiX2hvc3QgKmhvc3QgPSBzY3NpX2lkLT5oaS0+aG9zdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgKm5leHQ7CisJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7CisJaWYgKCFsaXN0X2VtcHR5KCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2NvbXBsZXRlZCkpIHsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBuZXh0LCAmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9jb21wbGV0ZWQpIHsKKwkJCWNvbW1hbmQgPSBsaXN0X2VudHJ5KGxoLCBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8sIGxpc3QpOworCisJCQkvKiBSZWxlYXNlIG91ciBnZW5lcmljIERNQSdzICovCisJCQlwY2lfdW5tYXBfc2luZ2xlKGhvc3QtPnBkZXYsIGNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYSwKKwkJCQkJIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksCisJCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQkJU0JQMl9ETUFfRlJFRSgic2luZ2xlIGNvbW1hbmQgb3JiIERNQSIpOworCQkJcGNpX3VubWFwX3NpbmdsZShob3N0LT5wZGV2LCBjb21tYW5kLT5zZ2VfZG1hLAorCQkJCQkgc2l6ZW9mKGNvbW1hbmQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAorCQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJCVNCUDJfRE1BX0ZSRUUoInNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQiKTsKKworCQkJa2ZyZWUoY29tbWFuZCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgc2JwMl9jb21tYW5kIGZvciBhIGdpdmVuIG91dHN0YW5kaW5nIGNvbW1hbmQKKyAqIG9yYi5Pbmx5IGxvb2tzIGF0IHRoZSBpbnVzZSBsaXN0LgorICovCitzdGF0aWMgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpzYnAydXRpbF9maW5kX2NvbW1hbmRfZm9yX29yYigKKwkJc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwgZG1hX2FkZHJfdCBvcmIpCit7CisJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7CisJaWYgKCFsaXN0X2VtcHR5KCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2ludXNlKSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbW1hbmQsICZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2ludXNlLCBsaXN0KSB7CisJCQlpZiAoY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hID09IG9yYikgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOworCQkJCXJldHVybiAoY29tbWFuZCk7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7CisKKwlTQlAyX09SQl9ERUJVRygiY291bGQgbm90IG1hdGNoIGNvbW1hbmQgb3JiICV4IiwgKHVuc2lnbmVkIGludClvcmIpOworCisJcmV0dXJuKE5VTEwpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgc2JwMl9jb21tYW5kIGZvciBhIGdpdmVuIG91dHN0YW5kaW5nIFNDcG50LgorICogT25seSBsb29rcyBhdCB0aGUgaW51c2UgbGlzdC4KKyAqLworc3RhdGljIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqc2JwMnV0aWxfZmluZF9jb21tYW5kX2Zvcl9TQ3BudChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLCB2b2lkICpTQ3BudCkKK3sKKwlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfaW51c2UpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tbWFuZCwgJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfaW51c2UsIGxpc3QpIHsKKwkJCWlmIChjb21tYW5kLT5DdXJyZW50X1NDcG50ID09IFNDcG50KSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIChjb21tYW5kKTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4oTlVMTCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIGNvbW1hbmQgb3JiIHVzZWQgdG8gc2VuZCBhIHNjc2kgY29tbWFuZC4KKyAqLworc3RhdGljIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqc2JwMnV0aWxfYWxsb2NhdGVfY29tbWFuZF9vcmIoCisJCXN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCisJCXN0cnVjdCBzY3NpX2NtbmQgKkN1cnJlbnRfU0NwbnQsCisJCXZvaWQgKCpDdXJyZW50X2RvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGg7CisJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9jb21wbGV0ZWQpKSB7CisJCWxoID0gc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9jb21wbGV0ZWQubmV4dDsKKwkJbGlzdF9kZWwobGgpOworCQljb21tYW5kID0gbGlzdF9lbnRyeShsaCwgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvLCBsaXN0KTsKKwkJY29tbWFuZC0+Q3VycmVudF9kb25lID0gQ3VycmVudF9kb25lOworCQljb21tYW5kLT5DdXJyZW50X1NDcG50ID0gQ3VycmVudF9TQ3BudDsKKwkJbGlzdF9hZGRfdGFpbCgmY29tbWFuZC0+bGlzdCwgJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfaW51c2UpOworCX0gZWxzZSB7CisJCVNCUDJfRVJSKCJzYnAydXRpbF9hbGxvY2F0ZV9jb21tYW5kX29yYiAtIE5vIG9yYnMgYXZhaWxhYmxlISIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKGNvbW1hbmQpOworfQorCisvKiBGcmVlIG91ciBETUEncyAqLworc3RhdGljIHZvaWQgc2JwMnV0aWxfZnJlZV9jb21tYW5kX2RtYShzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQpCit7CisJc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCA9CisJCShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICopY29tbWFuZC0+Q3VycmVudF9TQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0OworCisJaWYgKCFzY3NpX2lkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHNjc2lfaWQgPT0gTlVMTFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWhvc3QgPSBzY3NpX2lkLT51ZC0+bmUtPmhvc3Q7CisKKwlpZiAoY29tbWFuZC0+Y21kX2RtYSkgeworCQlpZiAoY29tbWFuZC0+ZG1hX3R5cGUgPT0gQ01EX0RNQV9TSU5HTEUpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoaG9zdC0+cGRldiwgY29tbWFuZC0+Y21kX2RtYSwKKwkJCQkJIGNvbW1hbmQtPmRtYV9zaXplLCBjb21tYW5kLT5kbWFfZGlyKTsKKwkJCVNCUDJfRE1BX0ZSRUUoInNpbmdsZSBidWxrIik7CisJCX0gZWxzZSBpZiAoY29tbWFuZC0+ZG1hX3R5cGUgPT0gQ01EX0RNQV9QQUdFKSB7CisJCQlwY2lfdW5tYXBfcGFnZShob3N0LT5wZGV2LCBjb21tYW5kLT5jbWRfZG1hLAorCQkJCSAgICAgICBjb21tYW5kLT5kbWFfc2l6ZSwgY29tbWFuZC0+ZG1hX2Rpcik7CisJCQlTQlAyX0RNQV9GUkVFKCJzaW5nbGUgcGFnZSIpOworCQl9IC8qIFhYWDogQ2hlY2sgZm9yIENNRF9ETUFfTk9ORSBidWcgKi8KKwkJY29tbWFuZC0+ZG1hX3R5cGUgPSBDTURfRE1BX05PTkU7CisJCWNvbW1hbmQtPmNtZF9kbWEgPSAwOworCX0KKworCWlmIChjb21tYW5kLT5zZ2VfYnVmZmVyKSB7CisJCXBjaV91bm1hcF9zZyhob3N0LT5wZGV2LCBjb21tYW5kLT5zZ2VfYnVmZmVyLAorCQkJICAgICBjb21tYW5kLT5kbWFfc2l6ZSwgY29tbWFuZC0+ZG1hX2Rpcik7CisJCVNCUDJfRE1BX0ZSRUUoInNjYXR0ZXIgbGlzdCIpOworCQljb21tYW5kLT5zZ2VfYnVmZmVyID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIG1vdmVzIGEgY29tbWFuZCB0byB0aGUgY29tcGxldGVkIG9yYiBsaXN0LgorICovCitzdGF0aWMgdm9pZCBzYnAydXRpbF9tYXJrX2NvbW1hbmRfY29tcGxldGVkKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY29tbWFuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZjb21tYW5kLT5saXN0KTsKKwlzYnAydXRpbF9mcmVlX2NvbW1hbmRfZG1hKGNvbW1hbmQpOworCWxpc3RfYWRkX3RhaWwoJmNvbW1hbmQtPmxpc3QsICZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2NvbXBsZXRlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9sb2NrLCBmbGFncyk7Cit9CisKKwwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSUVFRS0xMzk0IGNvcmUgZHJpdmVyIHN0YWNrIHJlbGF0ZWQgc2VjdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzYnAyX2FsbG9jX2RldmljZShzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkKTsKKworc3RhdGljIGludCBzYnAyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkOworCXN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQ7CisKKwlTQlAyX0RFQlVHKCJzYnAyX3Byb2JlIik7CisKKwl1ZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgZGV2aWNlKTsKKworCS8qIERvbid0IHByb2JlIFVEJ3MgdGhhdCBoYXZlIHRoZSBMVU4gZmxhZy4gV2UnbGwgcHJvYmUgdGhlIExVTihzKQorCSAqIGluc3RlYWQuICovCisJaWYgKHVkLT5mbGFncyAmIFVOSVRfRElSRUNUT1JZX0hBU19MVU5fRElSRUNUT1JZKQorCQlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgICBzY3NpX2lkID0gc2JwMl9hbGxvY19kZXZpY2UodWQpOworCisgICAgICAgIGlmICghc2NzaV9pZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgICAgICBzYnAyX3BhcnNlX3VuaXRfZGlyZWN0b3J5KHNjc2lfaWQsIHVkKTsKKworICAgICAgICByZXR1cm4gc2JwMl9zdGFydF9kZXZpY2Uoc2NzaV9pZCk7Cit9CisKK3N0YXRpYyBpbnQgc2JwMl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQ7CisJc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZDsKKworCVNCUDJfREVCVUcoInNicDJfcmVtb3ZlIik7CisKKwl1ZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB1bml0X2RpcmVjdG9yeSwgZGV2aWNlKTsKKwlzY3NpX2lkID0gdWQtPmRldmljZS5kcml2ZXJfZGF0YTsKKworCXNicDJfbG9nb3V0X2RldmljZShzY3NpX2lkKTsKKwlzYnAyX3JlbW92ZV9kZXZpY2Uoc2NzaV9pZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYnAyX3VwZGF0ZShzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkKQoreworCXN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQgPSB1ZC0+ZGV2aWNlLmRyaXZlcl9kYXRhOworCisJU0JQMl9ERUJVRygic2JwMl91cGRhdGUiKTsKKworCWlmIChzYnAyX3JlY29ubmVjdF9kZXZpY2Uoc2NzaV9pZCkpIHsKKworCQkvKgorCQkgKiBPaywgcmVjb25uZWN0IGhhcyBmYWlsZWQuIFBlcmhhcHMgd2UgZGlkbid0CisJCSAqIHJlY29ubmVjdCBmYXN0IGVub3VnaC4gVHJ5IGRvaW5nIGEgcmVndWxhciBsb2dpbiwgYnV0CisJCSAqIGZpcnN0IGRvIGEgbG9nb3V0IGp1c3QgaW4gY2FzZSBvZiBhbnkgd2VpcmRuZXNzLgorCQkgKi8KKwkJc2JwMl9sb2dvdXRfZGV2aWNlKHNjc2lfaWQpOworCisJCWlmIChzYnAyX2xvZ2luX2RldmljZShzY3NpX2lkKSkgeworCQkJLyogTG9naW4gZmFpbGVkIHRvbywganVzdCBmYWlsLCBhbmQgdGhlIGJhY2tlbmQKKwkJCSAqIHdpbGwgY2FsbCBvdXIgc2JwMl9yZW1vdmUgZm9yIHVzICovCisJCQlTQlAyX0VSUigiRmFpbGVkIHRvIHJlY29ubmVjdCB0byBzYnAyIGRldmljZSEiKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwkvKiBTZXQgbWF4IHJldHJpZXMgdG8gc29tZXRoaW5nIGxhcmdlIG9uIHRoZSBkZXZpY2UuICovCisJc2JwMl9zZXRfYnVzeV90aW1lb3V0KHNjc2lfaWQpOworCisJLyogRG8gYSBTQlAtMiBmZXRjaCBhZ2VudCByZXNldC4gKi8KKwlzYnAyX2FnZW50X3Jlc2V0KHNjc2lfaWQsIDEpOworCisJLyogR2V0IHRoZSBtYXggc3BlZWQgYW5kIHBhY2tldCBzaXplIHRoYXQgd2UgY2FuIHVzZS4gKi8KKwlzYnAyX21heF9zcGVlZF9hbmRfc2l6ZShzY3NpX2lkKTsKKworCS8qIENvbXBsZXRlIGFueSBwZW5kaW5nIGNvbW1hbmRzIHdpdGggYnVzeSAoc28gdGhleSBnZXQKKwkgKiByZXRyaWVkKSBhbmQgcmVtb3ZlIHRoZW0gZnJvbSBvdXIgcXVldWUKKwkgKi8KKwlzYnAyc2NzaV9jb21wbGV0ZV9hbGxfY29tbWFuZHMoc2NzaV9pZCwgRElEX0JVU19CVVNZKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSB1bmJsb2NrIHJlcXVlc3RzIChzaW5jZSB0aGlzIGlzIGxpa2VseSBhZnRlciBhIGJ1cworCSAqIHJlc2V0KS4gKi8KKwlzY3NpX3VuYmxvY2tfcmVxdWVzdHMoc2NzaV9pZC0+c2NzaV9ob3N0KTsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9ucyBpcyBjYWxsZWQgYnkgdGhlIHNicDJfcHJvYmUsIGZvciBlYWNoIG5ldyBkZXZpY2UuIFdlIG5vdworICogYWxsb2NhdGUgb25lIHNjc2kgaG9zdCBmb3IgZWFjaCBzY3NpX2lkICh1bml0IGRpcmVjdG9yeSkuICovCitzdGF0aWMgc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2JwMl9hbGxvY19kZXZpY2Uoc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZCkKK3sKKwlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3QgPSBOVUxMOworCXN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQgPSBOVUxMOworCisJU0JQMl9ERUJVRygic2JwMl9hbGxvY19kZXZpY2UiKTsKKworCXNjc2lfaWQgPSBrbWFsbG9jKHNpemVvZigqc2NzaV9pZCksIEdGUF9LRVJORUwpOworCWlmICghc2NzaV9pZCkgeworCQlTQlAyX0VSUigiZmFpbGVkIHRvIGNyZWF0ZSBzY3NpX2lkIik7CisJCWdvdG8gZmFpbGVkX2FsbG9jOworCX0KKwltZW1zZXQoc2NzaV9pZCwgMCwgc2l6ZW9mKCpzY3NpX2lkKSk7CisKKwlzY3NpX2lkLT5uZSA9IHVkLT5uZTsKKwlzY3NpX2lkLT51ZCA9IHVkOworCXNjc2lfaWQtPnNwZWVkX2NvZGUgPSBJRUVFMTM5NF9TUEVFRF8xMDA7CisJc2NzaV9pZC0+bWF4X3BheWxvYWRfc2l6ZSA9IHNicDJfc3BlZWR0b19tYXhfcGF5bG9hZFtJRUVFMTM5NF9TUEVFRF8xMDBdOworCWF0b21pY19zZXQoJnNjc2lfaWQtPnNicDJfbG9naW5fY29tcGxldGUsIDApOworCUlOSVRfTElTVF9IRUFEKCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2ludXNlKTsKKwlJTklUX0xJU1RfSEVBRCgmc2NzaV9pZC0+c2JwMl9jb21tYW5kX29yYl9jb21wbGV0ZWQpOworCUlOSVRfTElTVF9IRUFEKCZzY3NpX2lkLT5zY3NpX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZzY3NpX2lkLT5zYnAyX2NvbW1hbmRfb3JiX2xvY2spOworCXNjc2lfaWQtPnNicDJfZGV2aWNlX3R5cGVfYW5kX2x1biA9IFNCUDJfREVWSUNFX1RZUEVfTFVOX1VOSU5JVElBTElaRUQ7CisKKwl1ZC0+ZGV2aWNlLmRyaXZlcl9kYXRhID0gc2NzaV9pZDsKKworCWhpID0gaHBzYl9nZXRfaG9zdGluZm8oJnNicDJfaGlnaGxldmVsLCB1ZC0+bmUtPmhvc3QpOworCWlmICghaGkpIHsKKwkJaGkgPSBocHNiX2NyZWF0ZV9ob3N0aW5mbygmc2JwMl9oaWdobGV2ZWwsIHVkLT5uZS0+aG9zdCwgc2l6ZW9mKCpoaSkpOworCQlpZiAoIWhpKSB7CisJCQlTQlAyX0VSUigiZmFpbGVkIHRvIGFsbG9jYXRlIGhvc3RpbmZvIik7CisJCQlnb3RvIGZhaWxlZF9hbGxvYzsKKwkJfQorCQlTQlAyX0RFQlVHKCJzYnAyX2FsbG9jX2RldmljZTogYWxsb2NhdGVkIGhvc3RpbmZvIik7CisJCWhpLT5ob3N0ID0gdWQtPm5lLT5ob3N0OworCQlJTklUX0xJU1RfSEVBRCgmaGktPnNjc2lfaWRzKTsKKworCQkvKiBSZWdpc3RlciBvdXIgc2JwMiBzdGF0dXMgYWRkcmVzcyBzcGFjZS4uLiAqLworCQlocHNiX3JlZ2lzdGVyX2FkZHJzcGFjZSgmc2JwMl9oaWdobGV2ZWwsIHVkLT5uZS0+aG9zdCwgJnNicDJfb3BzLAorCQkJCQlTQlAyX1NUQVRVU19GSUZPX0FERFJFU1MsCisJCQkJCVNCUDJfU1RBVFVTX0ZJRk9fQUREUkVTUyArCisJCQkJCVNCUDJfU1RBVFVTX0ZJRk9fRU5UUllfVE9fT0ZGU0VUKFNCUDJfTUFYX1VEU19QRVJfTk9ERSsxKSk7CisjaWZkZWYgQ09ORklHX0lFRUUxMzk0X1NCUDJfUEhZU19ETUEKKwkJLyogSGFuZGxlIGRhdGEgbW92ZW1lbnQgaWYgcGh5c2ljYWwgZG1hIGlzIG5vdAorCQkgKiBlbmFibGVkL3N1cHBvcnRlZG9uIGhvc3QgY29udHJvbGxlciAqLworCQlocHNiX3JlZ2lzdGVyX2FkZHJzcGFjZSgmc2JwMl9oaWdobGV2ZWwsIHVkLT5uZS0+aG9zdCwgJnNicDJfcGh5c2RtYV9vcHMsCisJCQkJCTB4MFVMTCwgMHhmZmZmZmZmY1VMTCk7CisjZW5kaWYKKwl9CisKKwlzY3NpX2lkLT5oaSA9IGhpOworCisJbGlzdF9hZGRfdGFpbCgmc2NzaV9pZC0+c2NzaV9saXN0LCAmaGktPnNjc2lfaWRzKTsKKworCS8qIFJlZ2lzdGVyIG91ciBob3N0IHdpdGggdGhlIFNDU0kgc3RhY2suICovCisJc2NzaV9ob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZzY3NpX2RyaXZlcl90ZW1wbGF0ZSwgMCk7CisJaWYgKCFzY3NpX2hvc3QpIHsKKwkJU0JQMl9FUlIoImZhaWxlZCB0byByZWdpc3RlciBzY3NpIGhvc3QiKTsKKwkJZ290byBmYWlsZWRfYWxsb2M7CisJfQorCisJc2NzaV9ob3N0LT5ob3N0ZGF0YVswXSA9ICh1bnNpZ25lZCBsb25nKXNjc2lfaWQ7CisKKwlpZiAoIXNjc2lfYWRkX2hvc3Qoc2NzaV9ob3N0LCAmdWQtPmRldmljZSkpIHsKKwkJc2NzaV9pZC0+c2NzaV9ob3N0ID0gc2NzaV9ob3N0OworCQlyZXR1cm4gc2NzaV9pZDsKKwl9CisKKwlTQlAyX0VSUigiZmFpbGVkIHRvIGFkZCBzY3NpIGhvc3QiKTsKKwlzY3NpX2hvc3RfcHV0KHNjc2lfaG9zdCk7CisKK2ZhaWxlZF9hbGxvYzoKKwlzYnAyX3JlbW92ZV9kZXZpY2Uoc2NzaV9pZCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgc2JwMl9ob3N0X3Jlc2V0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IHNicDJzY3NpX2hvc3RfaW5mbyAqaGk7CisJc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZDsKKworCWhpID0gaHBzYl9nZXRfaG9zdGluZm8oJnNicDJfaGlnaGxldmVsLCBob3N0KTsKKworCWlmIChoaSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNjc2lfaWQsICZoaS0+c2NzaV9pZHMsIHNjc2lfbGlzdCkKKwkJCXNjc2lfYmxvY2tfcmVxdWVzdHMoc2NzaV9pZC0+c2NzaV9ob3N0KTsKKwl9Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgd2hlcmUgd2UgZmlyc3QgcHVsbCB0aGUgbm9kZSB1bmlxdWUgaWRzLCBhbmQgdGhlbgorICogYWxsb2NhdGUgbWVtb3J5IGFuZCByZWdpc3RlciBhIFNCUC0yIGRldmljZS4KKyAqLworc3RhdGljIGludCBzYnAyX3N0YXJ0X2RldmljZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQoreworCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpID0gc2NzaV9pZC0+aGk7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJU0JQMl9ERUJVRygic2JwMl9zdGFydF9kZXZpY2UiKTsKKworCS8qIExvZ2luIEZJRk8gRE1BICovCisJc2NzaV9pZC0+bG9naW5fcmVzcG9uc2UgPQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwgc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ2luX3Jlc3BvbnNlKSwKKwkJCQkgICAgICZzY3NpX2lkLT5sb2dpbl9yZXNwb25zZV9kbWEpOworCWlmICghc2NzaV9pZC0+bG9naW5fcmVzcG9uc2UpCisJCWdvdG8gYWxsb2NfZmFpbDsKKwlTQlAyX0RNQV9BTExPQygiY29uc2lzdGVudCBETUEgcmVnaW9uIGZvciBsb2dpbiBGSUZPIik7CisKKwkvKiBRdWVyeSBsb2dpbnMgT1JCIERNQSAqLworCXNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmIgPQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwgc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19vcmIpLAorCQkJCSAgICAgJnNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmJfZG1hKTsKKwlpZiAoIXNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmIpCisJCWdvdG8gYWxsb2NfZmFpbDsKKwlTQlAyX0RNQV9BTExPQygiY29uc2lzdGVudCBETUEgcmVnaW9uIGZvciBxdWVyeSBsb2dpbnMgT1JCIik7CisKKwkvKiBRdWVyeSBsb2dpbnMgcmVzcG9uc2UgRE1BICovCisJc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlID0KKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGktPmhvc3QtPnBkZXYsIHNpemVvZihzdHJ1Y3Qgc2JwMl9xdWVyeV9sb2dpbnNfcmVzcG9uc2UpLAorCQkJCSAgICAgJnNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZV9kbWEpOworCWlmICghc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlKQorCQlnb3RvIGFsbG9jX2ZhaWw7CisJU0JQMl9ETUFfQUxMT0MoImNvbnNpc3RlbnQgRE1BIHJlZ2lvbiBmb3IgcXVlcnkgbG9naW5zIHJlc3BvbnNlIik7CisKKwkvKiBSZWNvbm5lY3QgT1JCIERNQSAqLworCXNjc2lfaWQtPnJlY29ubmVjdF9vcmIgPQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwgc2l6ZW9mKHN0cnVjdCBzYnAyX3JlY29ubmVjdF9vcmIpLAorCQkJCSAgICAgJnNjc2lfaWQtPnJlY29ubmVjdF9vcmJfZG1hKTsKKwlpZiAoIXNjc2lfaWQtPnJlY29ubmVjdF9vcmIpCisJCWdvdG8gYWxsb2NfZmFpbDsKKwlTQlAyX0RNQV9BTExPQygiY29uc2lzdGVudCBETUEgcmVnaW9uIGZvciByZWNvbm5lY3QgT1JCIik7CisKKwkvKiBMb2dvdXQgT1JCIERNQSAqLworCXNjc2lfaWQtPmxvZ291dF9vcmIgPQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwgc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ291dF9vcmIpLAorCQkJCSAgICAgJnNjc2lfaWQtPmxvZ291dF9vcmJfZG1hKTsKKwlpZiAoIXNjc2lfaWQtPmxvZ291dF9vcmIpCisJCWdvdG8gYWxsb2NfZmFpbDsKKwlTQlAyX0RNQV9BTExPQygiY29uc2lzdGVudCBETUEgcmVnaW9uIGZvciBsb2dvdXQgT1JCIik7CisKKwkvKiBMb2dpbiBPUkIgRE1BICovCisJc2NzaV9pZC0+bG9naW5fb3JiID0KKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGktPmhvc3QtPnBkZXYsIHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dpbl9vcmIpLAorCQkJCSAgICAgJnNjc2lfaWQtPmxvZ2luX29yYl9kbWEpOworCWlmICghc2NzaV9pZC0+bG9naW5fb3JiKSB7CithbGxvY19mYWlsOgorCQlpZiAoc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhpLT5ob3N0LT5wZGV2LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19yZXNwb25zZSksCisJCQkJCSAgICBzY3NpX2lkLT5xdWVyeV9sb2dpbnNfcmVzcG9uc2UsCisJCQkJCSAgICBzY3NpX2lkLT5xdWVyeV9sb2dpbnNfcmVzcG9uc2VfZG1hKTsKKwkJCVNCUDJfRE1BX0ZSRUUoInF1ZXJ5IGxvZ2lucyByZXNwb25zZSBETUEiKTsKKwkJfQorCisJCWlmIChzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhpLT5ob3N0LT5wZGV2LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19vcmIpLAorCQkJCQkgICAgc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYiwKKwkJCQkJICAgIHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmJfZG1hKTsKKwkJCVNCUDJfRE1BX0ZSRUUoInF1ZXJ5IGxvZ2lucyBPUkIgRE1BIik7CisJCX0KKworCQlpZiAoc2NzaV9pZC0+bG9nb3V0X29yYikgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ291dF9vcmIpLAorCQkJCQlzY3NpX2lkLT5sb2dvdXRfb3JiLAorCQkJCQlzY3NpX2lkLT5sb2dvdXRfb3JiX2RtYSk7CisJCQlTQlAyX0RNQV9GUkVFKCJsb2dvdXQgT1JCIERNQSIpOworCQl9CisKKwkJaWYgKHNjc2lfaWQtPnJlY29ubmVjdF9vcmIpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGktPmhvc3QtPnBkZXYsCisJCQkJCXNpemVvZihzdHJ1Y3Qgc2JwMl9yZWNvbm5lY3Rfb3JiKSwKKwkJCQkJc2NzaV9pZC0+cmVjb25uZWN0X29yYiwKKwkJCQkJc2NzaV9pZC0+cmVjb25uZWN0X29yYl9kbWEpOworCQkJU0JQMl9ETUFfRlJFRSgicmVjb25uZWN0IE9SQiBETUEiKTsKKwkJfQorCisJCWlmIChzY3NpX2lkLT5sb2dpbl9yZXNwb25zZSkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ2luX3Jlc3BvbnNlKSwKKwkJCQkJc2NzaV9pZC0+bG9naW5fcmVzcG9uc2UsCisJCQkJCXNjc2lfaWQtPmxvZ2luX3Jlc3BvbnNlX2RtYSk7CisJCQlTQlAyX0RNQV9GUkVFKCJsb2dpbiBGSUZPIERNQSIpOworCQl9CisKKwkJbGlzdF9kZWwoJnNjc2lfaWQtPnNjc2lfbGlzdCk7CisKKwkJa2ZyZWUoc2NzaV9pZCk7CisKKwkJU0JQMl9FUlIgKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzY3NpX2lkIik7CisKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCVNCUDJfRE1BX0FMTE9DKCJjb25zaXN0ZW50IERNQSByZWdpb24gZm9yIGxvZ2luIE9SQiIpOworCisJU0JQMl9ERUJVRygiTmV3IFNCUC0yIGRldmljZSBpbnNlcnRlZCwgU0NTSSBJRCA9ICV4Iiwgc2NzaV9pZC0+dWQtPmlkKTsKKworCS8qCisJICogQ3JlYXRlIG91ciBjb21tYW5kIG9yYiBwb29sCisJICovCisJaWYgKHNicDJ1dGlsX2NyZWF0ZV9jb21tYW5kX29yYl9wb29sKHNjc2lfaWQpKSB7CisJCVNCUDJfRVJSKCJzYnAydXRpbF9jcmVhdGVfY29tbWFuZF9vcmJfcG9vbCBmYWlsZWQhIik7CisJCXNicDJfcmVtb3ZlX2RldmljZShzY3NpX2lkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogU2NoZWR1bGUgYSB0aW1lb3V0IGhlcmUuIFRoZSByZWFzb24gaXMgdGhhdCB3ZSBtYXkgYmUgc28gY2xvc2UKKwkgKiB0byBhIGJ1cyByZXNldCwgdGhhdCB0aGUgZGV2aWNlIGlzIG5vdCBhdmFpbGFibGUgZm9yIGxvZ2lucy4KKwkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgYnVzIHJlc2V0IGlzIGNhdXNlZCBieSB0aGUgaG9zdAorCSAqIGNvbm5lY3RlZCB0byB0aGUgc2JwMiBkZXZpY2UgYmVpbmcgcmVtb3ZlZC4gVGhhdCBob3N0IHdvdWxkCisJICogaGF2ZSBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUgdG8gcmVsb2dpbiBiZWZvcmUgdGhlIHNicDIgZGV2aWNlCisJICogYWxsb3dzIHNvbWVvbmUgZWxzZSB0byBsb2dpbiBpbnN0ZWFkLiBPbmUgc2Vjb25kIG1ha2VzIHNlbnNlLiAqLworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlTQlAyX1dBUk4oImFib3J0aW5nIHNicDJfc3RhcnRfZGV2aWNlIGR1ZSB0byBldmVudCIpOworCQlzYnAyX3JlbW92ZV9kZXZpY2Uoc2NzaV9pZCk7CisJCXJldHVybiAtRUlOVFI7CisJfQorCQorCS8qCisJICogTG9naW4gdG8gdGhlIHNicC0yIGRldmljZQorCSAqLworCWlmIChzYnAyX2xvZ2luX2RldmljZShzY3NpX2lkKSkgeworCQkvKiBMb2dpbiBmYWlsZWQsIGp1c3QgcmVtb3ZlIHRoZSBkZXZpY2UuICovCisJCXNicDJfcmVtb3ZlX2RldmljZShzY3NpX2lkKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKgorCSAqIFNldCBtYXggcmV0cmllcyB0byBzb21ldGhpbmcgbGFyZ2Ugb24gdGhlIGRldmljZQorCSAqLworCXNicDJfc2V0X2J1c3lfdGltZW91dChzY3NpX2lkKTsKKworCS8qCisJICogRG8gYSBTQlAtMiBmZXRjaCBhZ2VudCByZXNldAorCSAqLworCXNicDJfYWdlbnRfcmVzZXQoc2NzaV9pZCwgMSk7CisKKwkvKgorCSAqIEdldCB0aGUgbWF4IHNwZWVkIGFuZCBwYWNrZXQgc2l6ZSB0aGF0IHdlIGNhbiB1c2UKKwkgKi8KKwlzYnAyX21heF9zcGVlZF9hbmRfc2l6ZShzY3NpX2lkKTsKKworCS8qIEFkZCB0aGlzIGRldmljZSB0byB0aGUgc2NzaSBsYXllciBub3cgKi8KKwlzZGV2ID0gc2NzaV9hZGRfZGV2aWNlKHNjc2lfaWQtPnNjc2lfaG9zdCwgMCwgc2NzaV9pZC0+dWQtPmlkLCAwKTsKKwlpZiAoSVNfRVJSKHNkZXYpKSB7CisJCVNCUDJfRVJSKCJzY3NpX2FkZF9kZXZpY2UgZmFpbGVkIik7CisJCXJldHVybiBQVFJfRVJSKHNkZXYpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFuIHNicDIgZGV2aWNlIGZyb20gdGhlIHNicDJzY3NpX2hvc3RfaW5mbyBzdHJ1Y3QuCisgKi8KK3N0YXRpYyB2b2lkIHNicDJfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQoreworCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpOworCisJU0JQMl9ERUJVRygic2JwMl9yZW1vdmVfZGV2aWNlIik7CisKKwlpZiAoIXNjc2lfaWQpCisJCXJldHVybjsKKworCWhpID0gc2NzaV9pZC0+aGk7CisKKwkvKiBUaGlzIHdpbGwgcmVtb3ZlIG91ciBzY3NpIGRldmljZSBhc3dlbGwgKi8KKwlpZiAoc2NzaV9pZC0+c2NzaV9ob3N0KSB7CisJCXNjc2lfcmVtb3ZlX2hvc3Qoc2NzaV9pZC0+c2NzaV9ob3N0KTsKKwkJc2NzaV9ob3N0X3B1dChzY3NpX2lkLT5zY3NpX2hvc3QpOworCX0KKworCXNicDJ1dGlsX3JlbW92ZV9jb21tYW5kX29yYl9wb29sKHNjc2lfaWQpOworCisJbGlzdF9kZWwoJnNjc2lfaWQtPnNjc2lfbGlzdCk7CisKKwlpZiAoc2NzaV9pZC0+bG9naW5fcmVzcG9uc2UpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ2luX3Jlc3BvbnNlKSwKKwkJCQkgICAgc2NzaV9pZC0+bG9naW5fcmVzcG9uc2UsCisJCQkJICAgIHNjc2lfaWQtPmxvZ2luX3Jlc3BvbnNlX2RtYSk7CisJCVNCUDJfRE1BX0ZSRUUoInNpbmdsZSBsb2dpbiBGSUZPIik7CisJfQorCisJaWYgKHNjc2lfaWQtPmxvZ2luX29yYikgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhpLT5ob3N0LT5wZGV2LAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNicDJfbG9naW5fb3JiKSwKKwkJCQkgICAgc2NzaV9pZC0+bG9naW5fb3JiLAorCQkJCSAgICBzY3NpX2lkLT5sb2dpbl9vcmJfZG1hKTsKKwkJU0JQMl9ETUFfRlJFRSgic2luZ2xlIGxvZ2luIE9SQiIpOworCX0KKworCWlmIChzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGktPmhvc3QtPnBkZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9yZWNvbm5lY3Rfb3JiKSwKKwkJCQkgICAgc2NzaV9pZC0+cmVjb25uZWN0X29yYiwKKwkJCQkgICAgc2NzaV9pZC0+cmVjb25uZWN0X29yYl9kbWEpOworCQlTQlAyX0RNQV9GUkVFKCJzaW5nbGUgcmVjb25uZWN0IG9yYiIpOworCX0KKworCWlmIChzY3NpX2lkLT5sb2dvdXRfb3JiKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGktPmhvc3QtPnBkZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dvdXRfb3JiKSwKKwkJCQkgICAgc2NzaV9pZC0+bG9nb3V0X29yYiwKKwkJCQkgICAgc2NzaV9pZC0+bG9nb3V0X29yYl9kbWEpOworCQlTQlAyX0RNQV9GUkVFKCJzaW5nbGUgbG9nb3V0IG9yYiIpOworCX0KKworCWlmIChzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGktPmhvc3QtPnBkZXYsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9xdWVyeV9sb2dpbnNfb3JiKSwKKwkJCQkgICAgc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYiwKKwkJCQkgICAgc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYl9kbWEpOworCQlTQlAyX0RNQV9GUkVFKCJzaW5nbGUgcXVlcnkgbG9naW5zIG9yYiIpOworCX0KKworCWlmIChzY3NpX2lkLT5xdWVyeV9sb2dpbnNfcmVzcG9uc2UpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChoaS0+aG9zdC0+cGRldiwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19yZXNwb25zZSksCisJCQkJICAgIHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZSwKKwkJCQkgICAgc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlX2RtYSk7CisJCVNCUDJfRE1BX0ZSRUUoInNpbmdsZSBxdWVyeSBsb2dpbnMgZGF0YSIpOworCX0KKworCXNjc2lfaWQtPnVkLT5kZXZpY2UuZHJpdmVyX2RhdGEgPSBOVUxMOworCisJU0JQMl9ERUJVRygiU0JQLTIgZGV2aWNlIHJlbW92ZWQsIFNDU0kgSUQgPSAlZCIsIHNjc2lfaWQtPnVkLT5pZCk7CisKKwlrZnJlZShzY3NpX2lkKTsKK30KKworI2lmZGVmIENPTkZJR19JRUVFMTM5NF9TQlAyX1BIWVNfRE1BCisvKgorICogVGhpcyBmdW5jdGlvbiBkZWFscyB3aXRoIHBoeXNpY2FsIGRtYSB3cml0ZSByZXF1ZXN0cyAoZm9yIGFkYXB0ZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQKKyAqIHBoeXNpY2FsIGRtYSBpbiBoYXJkd2FyZSkuIE1vc3RseSBqdXN0IGhlcmUgZm9yIGRlYnVnZ2luZy4uLgorICovCitzdGF0aWMgaW50IHNicDJfaGFuZGxlX3BoeXNkbWFfd3JpdGUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgaW50IGRlc3RpZCwgcXVhZGxldF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU2NCBhZGRyLCBzaXplX3QgbGVuZ3RoLCB1MTYgZmxhZ3MpCit7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFudWFsbHkgcHV0IHRoZSBkYXRhIGluIHRoZSByaWdodCBwbGFjZS4KKyAgICAgICAgICovCisgICAgICAgIG1lbWNweShidXNfdG9fdmlydCgodTMyKWFkZHIpLCBkYXRhLCBsZW5ndGgpOworCXNicDJ1dGlsX3BhY2tldF9kdW1wKGRhdGEsIGxlbmd0aCwgInNicDIgcGh5cyBkbWEgd3JpdGUgYnkgZGV2aWNlIiwgKHUzMilhZGRyKTsKKyAgICAgICAgcmV0dXJuKFJDT0RFX0NPTVBMRVRFKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZGVhbHMgd2l0aCBwaHlzaWNhbCBkbWEgcmVhZCByZXF1ZXN0cyAoZm9yIGFkYXB0ZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQKKyAqIHBoeXNpY2FsIGRtYSBpbiBoYXJkd2FyZSkuIE1vc3RseSBqdXN0IGhlcmUgZm9yIGRlYnVnZ2luZy4uLgorICovCitzdGF0aWMgaW50IHNicDJfaGFuZGxlX3BoeXNkbWFfcmVhZChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBpbnQgbm9kZWlkLCBxdWFkbGV0X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsYWdzKQoreworCisgICAgICAgIC8qCisgICAgICAgICAqIEdyYWIgZGF0YSBmcm9tIG1lbW9yeSBhbmQgc2VuZCBhIHJlYWQgcmVzcG9uc2UuCisgICAgICAgICAqLworICAgICAgICBtZW1jcHkoZGF0YSwgYnVzX3RvX3ZpcnQoKHUzMilhZGRyKSwgbGVuZ3RoKTsKKwlzYnAydXRpbF9wYWNrZXRfZHVtcChkYXRhLCBsZW5ndGgsICJzYnAyIHBoeXMgZG1hIHJlYWQgYnkgZGV2aWNlIiwgKHUzMilhZGRyKTsKKyAgICAgICAgcmV0dXJuKFJDT0RFX0NPTVBMRVRFKTsKK30KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0JQLTIgcHJvdG9jb2wgcmVsYXRlZCBzZWN0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgd2Ugc2hvdWxkIGNvbnZlcnQgc2NzaSBjb21tYW5kcyBmb3IgYSBwYXJ0aWN1bGFyIHNicDIgZGV2aWNlIHR5cGUKKyAqLworc3RhdGljIF9faW5saW5lX18gaW50IHNicDJfY29tbWFuZF9jb252ZXJzaW9uX2RldmljZV90eXBlKHU4IGRldmljZV90eXBlKQoreworCXJldHVybiAoKChkZXZpY2VfdHlwZSA9PSBUWVBFX0RJU0spIHx8CisJCSAoZGV2aWNlX3R5cGUgPT0gVFlQRV9TREFEKSB8fAorCQkgKGRldmljZV90eXBlID09IFRZUEVfUk9NKSkgPyAxOjApOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBxdWVyaWVzIHRoZSBkZXZpY2UgZm9yIHRoZSBtYXhpbXVtIGNvbmN1cnJlbnQgbG9naW5zIGl0CisgKiBzdXBwb3J0cy4KKyAqLworc3RhdGljIGludCBzYnAyX3F1ZXJ5X2xvZ2lucyhzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQoreworCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpID0gc2NzaV9pZC0+aGk7CisJcXVhZGxldF90IGRhdGFbMl07CisJaW50IG1heF9sb2dpbnM7CisJaW50IGFjdGl2ZV9sb2dpbnM7CisKKwlTQlAyX0RFQlVHKCJzYnAyX3F1ZXJ5X2xvZ2lucyIpOworCisJc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYi0+cmVzZXJ2ZWQxID0gMHgwOworCXNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmItPnJlc2VydmVkMiA9IDB4MDsKKworCXNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmItPnF1ZXJ5X3Jlc3BvbnNlX2xvID0gc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlX2RtYTsKKwlzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiLT5xdWVyeV9yZXNwb25zZV9oaSA9IE9SQl9TRVRfTk9ERV9JRChoaS0+aG9zdC0+bm9kZV9pZCk7CisJU0JQMl9ERUJVRygic2JwMl9xdWVyeV9sb2dpbnM6IHF1ZXJ5X3Jlc3BvbnNlX2hpL2xvIGluaXRpYWxpemVkIik7CisKKwlzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiLT5sdW5fbWlzYyA9IE9SQl9TRVRfRlVOQ1RJT04oU0JQMl9RVUVSWV9MT0dJTlNfUkVRVUVTVCk7CisJc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYi0+bHVuX21pc2MgfD0gT1JCX1NFVF9OT1RJRlkoMSk7CisJaWYgKHNjc2lfaWQtPnNicDJfZGV2aWNlX3R5cGVfYW5kX2x1biAhPSBTQlAyX0RFVklDRV9UWVBFX0xVTl9VTklOSVRJQUxJWkVEKSB7CisJCXNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmItPmx1bl9taXNjIHw9IE9SQl9TRVRfTFVOKHNjc2lfaWQtPnNicDJfZGV2aWNlX3R5cGVfYW5kX2x1bik7CisJCVNCUDJfREVCVUcoInNicDJfcXVlcnlfbG9naW5zOiBzZXQgbHVuIHRvICVkIiwKKwkJCSAgIE9SQl9TRVRfTFVOKHNjc2lfaWQtPnNicDJfZGV2aWNlX3R5cGVfYW5kX2x1bikpOworCX0KKwlTQlAyX0RFQlVHKCJzYnAyX3F1ZXJ5X2xvZ2luczogbHVuX21pc2MgaW5pdGlhbGl6ZWQiKTsKKworCXNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmItPnJlc2VydmVkX3Jlc3BfbGVuZ3RoID0KKwkJT1JCX1NFVF9RVUVSWV9MT0dJTlNfUkVTUF9MRU5HVEgoc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19yZXNwb25zZSkpOworCVNCUDJfREVCVUcoInNicDJfcXVlcnlfbG9naW5zOiByZXNlcnZlZF9yZXNwX2xlbmd0aCBpbml0aWFsaXplZCIpOworCisJc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYi0+c3RhdHVzX0ZJRk9fbG8gPSBTQlAyX1NUQVRVU19GSUZPX0FERFJFU1NfTE8gKworCQkJCQkJICAgIFNCUDJfU1RBVFVTX0ZJRk9fRU5UUllfVE9fT0ZGU0VUKHNjc2lfaWQtPnVkLT5pZCk7CisJc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYi0+c3RhdHVzX0ZJRk9faGkgPSAoT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKSB8CisJCQkJCQkgICAgIFNCUDJfU1RBVFVTX0ZJRk9fQUREUkVTU19ISSk7CisJU0JQMl9ERUJVRygic2JwMl9xdWVyeV9sb2dpbnM6IHN0YXR1cyBGSUZPIGluaXRpYWxpemVkIik7CisKKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYiwgc2l6ZW9mKHN0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19vcmIpKTsKKworCVNCUDJfREVCVUcoInNicDJfcXVlcnlfbG9naW5zOiBvcmIgYnl0ZS1zd2FwcGVkIik7CisKKwlzYnAydXRpbF9wYWNrZXRfZHVtcChzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiLCBzaXplb2Yoc3RydWN0IHNicDJfcXVlcnlfbG9naW5zX29yYiksCisJCQkgICAgICJzYnAyIHF1ZXJ5IGxvZ2lucyBvcmIiLCBzY3NpX2lkLT5xdWVyeV9sb2dpbnNfb3JiX2RtYSk7CisKKwltZW1zZXQoc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IHNicDJfcXVlcnlfbG9naW5zX3Jlc3BvbnNlKSk7CisJbWVtc2V0KCZzY3NpX2lkLT5zdGF0dXNfYmxvY2ssIDAsIHNpemVvZihzdHJ1Y3Qgc2JwMl9zdGF0dXNfYmxvY2spKTsKKworCVNCUDJfREVCVUcoInNicDJfcXVlcnlfbG9naW5zOiBxdWVyeV9sb2dpbnNfcmVzcG9uc2Uvc3RhdHVzIEZJRk8gbWVtc2V0Iik7CisKKwlkYXRhWzBdID0gT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKTsKKwlkYXRhWzFdID0gc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYl9kbWE7CisJc2JwMnV0aWxfY3B1X3RvX2JlMzJfYnVmZmVyKGRhdGEsIDgpOworCisJYXRvbWljX3NldCgmc2NzaV9pZC0+c2JwMl9sb2dpbl9jb21wbGV0ZSwgMCk7CisKKwlTQlAyX0RFQlVHKCJzYnAyX3F1ZXJ5X2xvZ2luczogcHJlcGFyZWQgdG8gd3JpdGUiKTsKKwlocHNiX25vZGVfd3JpdGUoc2NzaV9pZC0+bmUsIHNjc2lfaWQtPnNicDJfbWFuYWdlbWVudF9hZ2VudF9hZGRyLCBkYXRhLCA4KTsKKwlTQlAyX0RFQlVHKCJzYnAyX3F1ZXJ5X2xvZ2luczogd3JpdHRlbiIpOworCisJaWYgKHNicDJ1dGlsX2Rvd25fdGltZW91dCgmc2NzaV9pZC0+c2JwMl9sb2dpbl9jb21wbGV0ZSwgMipIWikpIHsKKwkJU0JQMl9JTkZPKCJFcnJvciBxdWVyeWluZyBsb2dpbnMgdG8gU0JQLTIgZGV2aWNlIC0gdGltZWQgb3V0Iik7CisJCXJldHVybigtRUlPKTsKKwl9CisKKwlpZiAoc2NzaV9pZC0+c3RhdHVzX2Jsb2NrLk9SQl9vZmZzZXRfbG8gIT0gc2NzaV9pZC0+cXVlcnlfbG9naW5zX29yYl9kbWEpIHsKKwkJU0JQMl9JTkZPKCJFcnJvciBxdWVyeWluZyBsb2dpbnMgdG8gU0JQLTIgZGV2aWNlIC0gdGltZWQgb3V0Iik7CisJCXJldHVybigtRUlPKTsKKwl9CisKKwlpZiAoU1RBVFVTX0dFVF9SRVNQKHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2hpX21pc2MpIHx8CisJICAgIFNUQVRVU19HRVRfREVBRF9CSVQoc2NzaV9pZC0+c3RhdHVzX2Jsb2NrLk9SQl9vZmZzZXRfaGlfbWlzYykgfHwKKwkgICAgU1RBVFVTX0dFVF9TQlBfU1RBVFVTKHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2hpX21pc2MpKSB7CisKKwkJU0JQMl9JTkZPKCJFcnJvciBxdWVyeWluZyBsb2dpbnMgdG8gU0JQLTIgZGV2aWNlIC0gdGltZWQgb3V0Iik7CisJCXJldHVybigtRUlPKTsKKwl9CisKKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2NzaV9pZC0+cXVlcnlfbG9naW5zX3Jlc3BvbnNlLCBzaXplb2Yoc3RydWN0IHNicDJfcXVlcnlfbG9naW5zX3Jlc3BvbnNlKSk7CisKKwlTQlAyX0RFQlVHKCJsZW5ndGhfbWF4X2xvZ2lucyA9ICV4IiwKKwkJICAgKHVuc2lnbmVkIGludClzY3NpX2lkLT5xdWVyeV9sb2dpbnNfcmVzcG9uc2UtPmxlbmd0aF9tYXhfbG9naW5zKTsKKworCVNCUDJfREVCVUcoIlF1ZXJ5IGxvZ2lucyB0byBTQlAtMiBkZXZpY2Ugc3VjY2Vzc2Z1bCIpOworCisJbWF4X2xvZ2lucyA9IFJFU1BPTlNFX0dFVF9NQVhfTE9HSU5TKHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZS0+bGVuZ3RoX21heF9sb2dpbnMpOworCVNCUDJfREVCVUcoIk1heGltdW0gY29uY3VycmVudCBsb2dpbnMgc3VwcG9ydGVkOiAlZCIsIG1heF9sb2dpbnMpOworCisJYWN0aXZlX2xvZ2lucyA9IFJFU1BPTlNFX0dFVF9BQ1RJVkVfTE9HSU5TKHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19yZXNwb25zZS0+bGVuZ3RoX21heF9sb2dpbnMpOworCVNCUDJfREVCVUcoIk51bWJlciBvZiBhY3RpdmUgbG9naW5zOiAlZCIsIGFjdGl2ZV9sb2dpbnMpOworCisJaWYgKGFjdGl2ZV9sb2dpbnMgPj0gbWF4X2xvZ2lucykgeworCQlyZXR1cm4oLUVJTyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBsb2dpbiB0byBhIHBhcnRpY3VsYXIgU0JQLTIgZGV2aWNlLAorICogYWZ0ZXIgYSBidXMgcmVzZXQuCisgKi8KK3N0YXRpYyBpbnQgc2JwMl9sb2dpbl9kZXZpY2Uoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCkKK3sKKwlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaSA9IHNjc2lfaWQtPmhpOworCXF1YWRsZXRfdCBkYXRhWzJdOworCisJU0JQMl9ERUJVRygic2JwMl9sb2dpbl9kZXZpY2UiKTsKKworCWlmICghc2NzaV9pZC0+bG9naW5fb3JiKSB7CisJCVNCUDJfREVCVUcoInNicDJfbG9naW5fZGV2aWNlOiBsb2dpbl9vcmIgbm90IGFsbG9jJ2QhIik7CisJCXJldHVybigtRUlPKTsKKwl9CisKKwlpZiAoIWV4Y2x1c2l2ZV9sb2dpbikgeworCQlpZiAoc2JwMl9xdWVyeV9sb2dpbnMoc2NzaV9pZCkpIHsKKwkJCVNCUDJfSU5GTygiRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgYW55IG1vcmUgY29uY3VycmVudCBsb2dpbnMiKTsKKwkJCXJldHVybigtRUlPKTsKKwkJfQorCX0KKworCS8qIFNldC11cCBsb2dpbiBPUkIsIGFzc3VtZSBubyBwYXNzd29yZCAqLworCXNjc2lfaWQtPmxvZ2luX29yYi0+cGFzc3dvcmRfaGkgPSAwOworCXNjc2lfaWQtPmxvZ2luX29yYi0+cGFzc3dvcmRfbG8gPSAwOworCVNCUDJfREVCVUcoInNicDJfbG9naW5fZGV2aWNlOiBwYXNzd29yZF9oaS9sbyBpbml0aWFsaXplZCIpOworCisJc2NzaV9pZC0+bG9naW5fb3JiLT5sb2dpbl9yZXNwb25zZV9sbyA9IHNjc2lfaWQtPmxvZ2luX3Jlc3BvbnNlX2RtYTsKKwlzY3NpX2lkLT5sb2dpbl9vcmItPmxvZ2luX3Jlc3BvbnNlX2hpID0gT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKTsKKwlTQlAyX0RFQlVHKCJzYnAyX2xvZ2luX2RldmljZTogbG9naW5fcmVzcG9uc2VfaGkvbG8gaW5pdGlhbGl6ZWQiKTsKKworCXNjc2lfaWQtPmxvZ2luX29yYi0+bHVuX21pc2MgPSBPUkJfU0VUX0ZVTkNUSU9OKFNCUDJfTE9HSU5fUkVRVUVTVCk7CisJc2NzaV9pZC0+bG9naW5fb3JiLT5sdW5fbWlzYyB8PSBPUkJfU0VUX1JFQ09OTkVDVCgwKTsJLyogT25lIHNlY29uZCByZWNvbm5lY3QgdGltZSAqLworCXNjc2lfaWQtPmxvZ2luX29yYi0+bHVuX21pc2MgfD0gT1JCX1NFVF9FWENMVVNJVkUoZXhjbHVzaXZlX2xvZ2luKTsJLyogRXhjbHVzaXZlIGFjY2VzcyB0byBkZXZpY2UgKi8KKwlzY3NpX2lkLT5sb2dpbl9vcmItPmx1bl9taXNjIHw9IE9SQl9TRVRfTk9USUZZKDEpOwkvKiBOb3RpZnkgdXMgb2YgbG9naW4gY29tcGxldGUgKi8KKwkvKiBTZXQgdGhlIGx1biBpZiB3ZSB3ZXJlIGFibGUgdG8gcHVsbCBpdCBmcm9tIHRoZSBkZXZpY2UncyB1bml0IGRpcmVjdG9yeSAqLworCWlmIChzY3NpX2lkLT5zYnAyX2RldmljZV90eXBlX2FuZF9sdW4gIT0gU0JQMl9ERVZJQ0VfVFlQRV9MVU5fVU5JTklUSUFMSVpFRCkgeworCQlzY3NpX2lkLT5sb2dpbl9vcmItPmx1bl9taXNjIHw9IE9SQl9TRVRfTFVOKHNjc2lfaWQtPnNicDJfZGV2aWNlX3R5cGVfYW5kX2x1bik7CisJCVNCUDJfREVCVUcoInNicDJfcXVlcnlfbG9naW5zOiBzZXQgbHVuIHRvICVkIiwKKwkJCSAgIE9SQl9TRVRfTFVOKHNjc2lfaWQtPnNicDJfZGV2aWNlX3R5cGVfYW5kX2x1bikpOworCX0KKwlTQlAyX0RFQlVHKCJzYnAyX2xvZ2luX2RldmljZTogbHVuX21pc2MgaW5pdGlhbGl6ZWQiKTsKKworCXNjc2lfaWQtPmxvZ2luX29yYi0+cGFzc3dkX3Jlc3BfbGVuZ3RocyA9CisJCU9SQl9TRVRfTE9HSU5fUkVTUF9MRU5HVEgoc2l6ZW9mKHN0cnVjdCBzYnAyX2xvZ2luX3Jlc3BvbnNlKSk7CisJU0JQMl9ERUJVRygic2JwMl9sb2dpbl9kZXZpY2U6IHBhc3N3ZF9yZXNwX2xlbmd0aHMgaW5pdGlhbGl6ZWQiKTsKKworCXNjc2lfaWQtPmxvZ2luX29yYi0+c3RhdHVzX0ZJRk9fbG8gPSBTQlAyX1NUQVRVU19GSUZPX0FERFJFU1NfTE8gKworCQkJCQkgICAgIFNCUDJfU1RBVFVTX0ZJRk9fRU5UUllfVE9fT0ZGU0VUKHNjc2lfaWQtPnVkLT5pZCk7CisJc2NzaV9pZC0+bG9naW5fb3JiLT5zdGF0dXNfRklGT19oaSA9IChPUkJfU0VUX05PREVfSUQoaGktPmhvc3QtPm5vZGVfaWQpIHwKKwkJCQkJICAgICAgU0JQMl9TVEFUVVNfRklGT19BRERSRVNTX0hJKTsKKwlTQlAyX0RFQlVHKCJzYnAyX2xvZ2luX2RldmljZTogc3RhdHVzIEZJRk8gaW5pdGlhbGl6ZWQiKTsKKworCS8qCisJICogQnl0ZSBzd2FwIE9SQiBpZiBuZWNlc3NhcnkKKwkgKi8KKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2NzaV9pZC0+bG9naW5fb3JiLCBzaXplb2Yoc3RydWN0IHNicDJfbG9naW5fb3JiKSk7CisKKwlTQlAyX0RFQlVHKCJzYnAyX2xvZ2luX2RldmljZTogb3JiIGJ5dGUtc3dhcHBlZCIpOworCisJc2JwMnV0aWxfcGFja2V0X2R1bXAoc2NzaV9pZC0+bG9naW5fb3JiLCBzaXplb2Yoc3RydWN0IHNicDJfbG9naW5fb3JiKSwKKwkJCSAgICAgInNicDIgbG9naW4gb3JiIiwgc2NzaV9pZC0+bG9naW5fb3JiX2RtYSk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgbG9naW4gcmVzcG9uc2UgYW5kIHN0YXR1cyBmaWZvCisJICovCisJbWVtc2V0KHNjc2lfaWQtPmxvZ2luX3Jlc3BvbnNlLCAwLCBzaXplb2Yoc3RydWN0IHNicDJfbG9naW5fcmVzcG9uc2UpKTsKKwltZW1zZXQoJnNjc2lfaWQtPnN0YXR1c19ibG9jaywgMCwgc2l6ZW9mKHN0cnVjdCBzYnAyX3N0YXR1c19ibG9jaykpOworCisJU0JQMl9ERUJVRygic2JwMl9sb2dpbl9kZXZpY2U6IGxvZ2luX3Jlc3BvbnNlL3N0YXR1cyBGSUZPIG1lbXNldCIpOworCisJLyoKKwkgKiBPaywgbGV0J3Mgd3JpdGUgdG8gdGhlIHRhcmdldCdzIG1hbmFnZW1lbnQgYWdlbnQgcmVnaXN0ZXIKKwkgKi8KKwlkYXRhWzBdID0gT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKTsKKwlkYXRhWzFdID0gc2NzaV9pZC0+bG9naW5fb3JiX2RtYTsKKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoZGF0YSwgOCk7CisKKwlhdG9taWNfc2V0KCZzY3NpX2lkLT5zYnAyX2xvZ2luX2NvbXBsZXRlLCAwKTsKKworCVNCUDJfREVCVUcoInNicDJfbG9naW5fZGV2aWNlOiBwcmVwYXJlZCB0byB3cml0ZSB0byAlMDh4IiwKKwkJICAgKHVuc2lnbmVkIGludClzY3NpX2lkLT5zYnAyX21hbmFnZW1lbnRfYWdlbnRfYWRkcik7CisJaHBzYl9ub2RlX3dyaXRlKHNjc2lfaWQtPm5lLCBzY3NpX2lkLT5zYnAyX21hbmFnZW1lbnRfYWdlbnRfYWRkciwgZGF0YSwgOCk7CisJU0JQMl9ERUJVRygic2JwMl9sb2dpbl9kZXZpY2U6IHdyaXR0ZW4iKTsKKworCS8qCisJICogV2FpdCBmb3IgbG9naW4gc3RhdHVzICh1cCB0byAyMCBzZWNvbmRzKS4uLgorCSAqLworCWlmIChzYnAydXRpbF9kb3duX3RpbWVvdXQoJnNjc2lfaWQtPnNicDJfbG9naW5fY29tcGxldGUsIDIwKkhaKSkgeworCQlTQlAyX0VSUigiRXJyb3IgbG9nZ2luZyBpbnRvIFNCUC0yIGRldmljZSAtIGxvZ2luIHRpbWVkLW91dCIpOworCQlyZXR1cm4oLUVJTyk7CisJfQorCisJLyoKKwkgKiBTYW5pdHkuIE1ha2Ugc3VyZSBzdGF0dXMgcmV0dXJuZWQgbWF0Y2hlcyBsb2dpbiBvcmIuCisJICovCisJaWYgKHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2xvICE9IHNjc2lfaWQtPmxvZ2luX29yYl9kbWEpIHsKKwkJU0JQMl9FUlIoIkVycm9yIGxvZ2dpbmcgaW50byBTQlAtMiBkZXZpY2UgLSBsb2dpbiB0aW1lZC1vdXQiKTsKKwkJcmV0dXJuKC1FSU8pOworCX0KKworCS8qCisJICogQ2hlY2sgc3RhdHVzCisJICovCisJaWYgKFNUQVRVU19HRVRfUkVTUChzY3NpX2lkLT5zdGF0dXNfYmxvY2suT1JCX29mZnNldF9oaV9taXNjKSB8fAorCSAgICBTVEFUVVNfR0VUX0RFQURfQklUKHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2hpX21pc2MpIHx8CisJICAgIFNUQVRVU19HRVRfU0JQX1NUQVRVUyhzY3NpX2lkLT5zdGF0dXNfYmxvY2suT1JCX29mZnNldF9oaV9taXNjKSkgeworCisJCVNCUDJfRVJSKCJFcnJvciBsb2dnaW5nIGludG8gU0JQLTIgZGV2aWNlIC0gbG9naW4gZmFpbGVkIik7CisJCXJldHVybigtRUlPKTsKKwl9CisKKwkvKgorCSAqIEJ5dGUgc3dhcCB0aGUgbG9naW4gcmVzcG9uc2UsIGZvciB1c2Ugd2hlbiByZWNvbm5lY3Rpbmcgb3IKKwkgKiBsb2dnaW5nIG91dC4KKwkgKi8KKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2NzaV9pZC0+bG9naW5fcmVzcG9uc2UsIHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dpbl9yZXNwb25zZSkpOworCisJLyoKKwkgKiBHcmFiIG91ciBjb21tYW5kIGJsb2NrIGFnZW50IGFkZHJlc3MgZnJvbSB0aGUgbG9naW4gcmVzcG9uc2UuCisJICovCisJU0JQMl9ERUJVRygiY29tbWFuZF9ibG9ja19hZ2VudF9oaSA9ICV4IiwKKwkJICAgKHVuc2lnbmVkIGludClzY3NpX2lkLT5sb2dpbl9yZXNwb25zZS0+Y29tbWFuZF9ibG9ja19hZ2VudF9oaSk7CisJU0JQMl9ERUJVRygiY29tbWFuZF9ibG9ja19hZ2VudF9sbyA9ICV4IiwKKwkJICAgKHVuc2lnbmVkIGludClzY3NpX2lkLT5sb2dpbl9yZXNwb25zZS0+Y29tbWFuZF9ibG9ja19hZ2VudF9sbyk7CisKKwlzY3NpX2lkLT5zYnAyX2NvbW1hbmRfYmxvY2tfYWdlbnRfYWRkciA9CisJCSgodTY0KXNjc2lfaWQtPmxvZ2luX3Jlc3BvbnNlLT5jb21tYW5kX2Jsb2NrX2FnZW50X2hpKSA8PCAzMjsKKwlzY3NpX2lkLT5zYnAyX2NvbW1hbmRfYmxvY2tfYWdlbnRfYWRkciB8PSAoKHU2NClzY3NpX2lkLT5sb2dpbl9yZXNwb25zZS0+Y29tbWFuZF9ibG9ja19hZ2VudF9sbyk7CisJc2NzaV9pZC0+c2JwMl9jb21tYW5kX2Jsb2NrX2FnZW50X2FkZHIgJj0gMHgwMDAwZmZmZmZmZmZmZmZmVUxMOworCisJU0JQMl9JTkZPKCJMb2dnZWQgaW50byBTQlAtMiBkZXZpY2UiKTsKKworCXJldHVybigwKTsKKworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gb3JkZXIgdG8gbG9nb3V0IGZyb20gYSBwYXJ0aWN1bGFyIFNCUC0yCisgKiBkZXZpY2UsIHVzdWFsbHkgY2FsbGVkIGR1cmluZyBkcml2ZXIgdW5sb2FkLgorICovCitzdGF0aWMgaW50IHNicDJfbG9nb3V0X2RldmljZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKQoreworCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpID0gc2NzaV9pZC0+aGk7CisJcXVhZGxldF90IGRhdGFbMl07CisJaW50IGVycm9yOworCisJU0JQMl9ERUJVRygic2JwMl9sb2dvdXRfZGV2aWNlIik7CisKKwkvKgorCSAqIFNldC11cCBsb2dvdXQgT1JCCisJICovCisJc2NzaV9pZC0+bG9nb3V0X29yYi0+cmVzZXJ2ZWQxID0gMHgwOworCXNjc2lfaWQtPmxvZ291dF9vcmItPnJlc2VydmVkMiA9IDB4MDsKKwlzY3NpX2lkLT5sb2dvdXRfb3JiLT5yZXNlcnZlZDMgPSAweDA7CisJc2NzaV9pZC0+bG9nb3V0X29yYi0+cmVzZXJ2ZWQ0ID0gMHgwOworCisJc2NzaV9pZC0+bG9nb3V0X29yYi0+bG9naW5fSURfbWlzYyA9IE9SQl9TRVRfRlVOQ1RJT04oU0JQMl9MT0dPVVRfUkVRVUVTVCk7CisJc2NzaV9pZC0+bG9nb3V0X29yYi0+bG9naW5fSURfbWlzYyB8PSBPUkJfU0VUX0xPR0lOX0lEKHNjc2lfaWQtPmxvZ2luX3Jlc3BvbnNlLT5sZW5ndGhfbG9naW5fSUQpOworCisJLyogTm90aWZ5IHVzIHdoZW4gY29tcGxldGUgKi8KKwlzY3NpX2lkLT5sb2dvdXRfb3JiLT5sb2dpbl9JRF9taXNjIHw9IE9SQl9TRVRfTk9USUZZKDEpOworCisJc2NzaV9pZC0+bG9nb3V0X29yYi0+cmVzZXJ2ZWQ1ID0gMHgwOworCXNjc2lfaWQtPmxvZ291dF9vcmItPnN0YXR1c19GSUZPX2xvID0gU0JQMl9TVEFUVVNfRklGT19BRERSRVNTX0xPICsKKwkJCQkJICAgICAgU0JQMl9TVEFUVVNfRklGT19FTlRSWV9UT19PRkZTRVQoc2NzaV9pZC0+dWQtPmlkKTsKKwlzY3NpX2lkLT5sb2dvdXRfb3JiLT5zdGF0dXNfRklGT19oaSA9IChPUkJfU0VUX05PREVfSUQoaGktPmhvc3QtPm5vZGVfaWQpIHwKKwkJCQkJICAgICAgIFNCUDJfU1RBVFVTX0ZJRk9fQUREUkVTU19ISSk7CisKKwkvKgorCSAqIEJ5dGUgc3dhcCBPUkIgaWYgbmVjZXNzYXJ5CisJICovCisJc2JwMnV0aWxfY3B1X3RvX2JlMzJfYnVmZmVyKHNjc2lfaWQtPmxvZ291dF9vcmIsIHNpemVvZihzdHJ1Y3Qgc2JwMl9sb2dvdXRfb3JiKSk7CisKKwlzYnAydXRpbF9wYWNrZXRfZHVtcChzY3NpX2lkLT5sb2dvdXRfb3JiLCBzaXplb2Yoc3RydWN0IHNicDJfbG9nb3V0X29yYiksCisJCQkgICAgICJzYnAyIGxvZ291dCBvcmIiLCBzY3NpX2lkLT5sb2dvdXRfb3JiX2RtYSk7CisKKwkvKgorCSAqIE9rLCBsZXQncyB3cml0ZSB0byB0aGUgdGFyZ2V0J3MgbWFuYWdlbWVudCBhZ2VudCByZWdpc3RlcgorCSAqLworCWRhdGFbMF0gPSBPUkJfU0VUX05PREVfSUQoaGktPmhvc3QtPm5vZGVfaWQpOworCWRhdGFbMV0gPSBzY3NpX2lkLT5sb2dvdXRfb3JiX2RtYTsKKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoZGF0YSwgOCk7CisKKwlhdG9taWNfc2V0KCZzY3NpX2lkLT5zYnAyX2xvZ2luX2NvbXBsZXRlLCAwKTsKKworCWVycm9yID0gaHBzYl9ub2RlX3dyaXRlKHNjc2lfaWQtPm5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3NpX2lkLT5zYnAyX21hbmFnZW1lbnRfYWdlbnRfYWRkciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgOCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiBXYWl0IGZvciBkZXZpY2UgdG8gbG9nb3V0Li4uMSBzZWNvbmQuICovCisJaWYgKHNicDJ1dGlsX2Rvd25fdGltZW91dCgmc2NzaV9pZC0+c2JwMl9sb2dpbl9jb21wbGV0ZSwgSFopKQorCQlyZXR1cm4gLUVJTzsKKworCVNCUDJfSU5GTygiTG9nZ2VkIG91dCBvZiBTQlAtMiBkZXZpY2UiKTsKKworCXJldHVybigwKTsKKworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gb3JkZXIgdG8gcmVjb25uZWN0IHRvIGEgcGFydGljdWxhciBTQlAtMgorICogZGV2aWNlLCBhZnRlciBhIGJ1cyByZXNldC4KKyAqLworc3RhdGljIGludCBzYnAyX3JlY29ubmVjdF9kZXZpY2Uoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCkKK3sKKwlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaSA9IHNjc2lfaWQtPmhpOworCXF1YWRsZXRfdCBkYXRhWzJdOworCWludCBlcnJvcjsKKworCVNCUDJfREVCVUcoInNicDJfcmVjb25uZWN0X2RldmljZSIpOworCisJLyoKKwkgKiBTZXQtdXAgcmVjb25uZWN0IE9SQgorCSAqLworCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPnJlc2VydmVkMSA9IDB4MDsKKwlzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiLT5yZXNlcnZlZDIgPSAweDA7CisJc2NzaV9pZC0+cmVjb25uZWN0X29yYi0+cmVzZXJ2ZWQzID0gMHgwOworCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPnJlc2VydmVkNCA9IDB4MDsKKworCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPmxvZ2luX0lEX21pc2MgPSBPUkJfU0VUX0ZVTkNUSU9OKFNCUDJfUkVDT05ORUNUX1JFUVVFU1QpOworCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPmxvZ2luX0lEX21pc2MgfD0KKwkJT1JCX1NFVF9MT0dJTl9JRChzY3NpX2lkLT5sb2dpbl9yZXNwb25zZS0+bGVuZ3RoX2xvZ2luX0lEKTsKKworCS8qIE5vdGlmeSB1cyB3aGVuIGNvbXBsZXRlICovCisJc2NzaV9pZC0+cmVjb25uZWN0X29yYi0+bG9naW5fSURfbWlzYyB8PSBPUkJfU0VUX05PVElGWSgxKTsKKworCXNjc2lfaWQtPnJlY29ubmVjdF9vcmItPnJlc2VydmVkNSA9IDB4MDsKKwlzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiLT5zdGF0dXNfRklGT19sbyA9IFNCUDJfU1RBVFVTX0ZJRk9fQUREUkVTU19MTyArCisJCQkJCQkgU0JQMl9TVEFUVVNfRklGT19FTlRSWV9UT19PRkZTRVQoc2NzaV9pZC0+dWQtPmlkKTsKKwlzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiLT5zdGF0dXNfRklGT19oaSA9CisJCShPUkJfU0VUX05PREVfSUQoaGktPmhvc3QtPm5vZGVfaWQpIHwgU0JQMl9TVEFUVVNfRklGT19BRERSRVNTX0hJKTsKKworCS8qCisJICogQnl0ZSBzd2FwIE9SQiBpZiBuZWNlc3NhcnkKKwkgKi8KKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2NzaV9pZC0+cmVjb25uZWN0X29yYiwgc2l6ZW9mKHN0cnVjdCBzYnAyX3JlY29ubmVjdF9vcmIpKTsKKworCXNicDJ1dGlsX3BhY2tldF9kdW1wKHNjc2lfaWQtPnJlY29ubmVjdF9vcmIsIHNpemVvZihzdHJ1Y3Qgc2JwMl9yZWNvbm5lY3Rfb3JiKSwKKwkJCSAgICAgInNicDIgcmVjb25uZWN0IG9yYiIsIHNjc2lfaWQtPnJlY29ubmVjdF9vcmJfZG1hKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBzdGF0dXMgZmlmbworCSAqLworCW1lbXNldCgmc2NzaV9pZC0+c3RhdHVzX2Jsb2NrLCAwLCBzaXplb2Yoc3RydWN0IHNicDJfc3RhdHVzX2Jsb2NrKSk7CisKKwkvKgorCSAqIE9rLCBsZXQncyB3cml0ZSB0byB0aGUgdGFyZ2V0J3MgbWFuYWdlbWVudCBhZ2VudCByZWdpc3RlcgorCSAqLworCWRhdGFbMF0gPSBPUkJfU0VUX05PREVfSUQoaGktPmhvc3QtPm5vZGVfaWQpOworCWRhdGFbMV0gPSBzY3NpX2lkLT5yZWNvbm5lY3Rfb3JiX2RtYTsKKwlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoZGF0YSwgOCk7CisKKwlhdG9taWNfc2V0KCZzY3NpX2lkLT5zYnAyX2xvZ2luX2NvbXBsZXRlLCAwKTsKKworCWVycm9yID0gaHBzYl9ub2RlX3dyaXRlKHNjc2lfaWQtPm5lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3NpX2lkLT5zYnAyX21hbmFnZW1lbnRfYWdlbnRfYWRkciwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgOCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKgorCSAqIFdhaXQgZm9yIHJlY29ubmVjdCBzdGF0dXMgKHVwIHRvIDEgc2Vjb25kKS4uLgorCSAqLworCWlmIChzYnAydXRpbF9kb3duX3RpbWVvdXQoJnNjc2lfaWQtPnNicDJfbG9naW5fY29tcGxldGUsIEhaKSkgeworCQlTQlAyX0VSUigiRXJyb3IgcmVjb25uZWN0aW5nIHRvIFNCUC0yIGRldmljZSAtIHJlY29ubmVjdCB0aW1lZC1vdXQiKTsKKwkJcmV0dXJuKC1FSU8pOworCX0KKworCS8qCisJICogU2FuaXR5LiBNYWtlIHN1cmUgc3RhdHVzIHJldHVybmVkIG1hdGNoZXMgcmVjb25uZWN0IG9yYi4KKwkgKi8KKwlpZiAoc2NzaV9pZC0+c3RhdHVzX2Jsb2NrLk9SQl9vZmZzZXRfbG8gIT0gc2NzaV9pZC0+cmVjb25uZWN0X29yYl9kbWEpIHsKKwkJU0JQMl9FUlIoIkVycm9yIHJlY29ubmVjdGluZyB0byBTQlAtMiBkZXZpY2UgLSByZWNvbm5lY3QgdGltZWQtb3V0Iik7CisJCXJldHVybigtRUlPKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHN0YXR1cworCSAqLworCWlmIChTVEFUVVNfR0VUX1JFU1Aoc2NzaV9pZC0+c3RhdHVzX2Jsb2NrLk9SQl9vZmZzZXRfaGlfbWlzYykgfHwKKwkgICAgU1RBVFVTX0dFVF9ERUFEX0JJVChzY3NpX2lkLT5zdGF0dXNfYmxvY2suT1JCX29mZnNldF9oaV9taXNjKSB8fAorCSAgICBTVEFUVVNfR0VUX1NCUF9TVEFUVVMoc2NzaV9pZC0+c3RhdHVzX2Jsb2NrLk9SQl9vZmZzZXRfaGlfbWlzYykpIHsKKworCQlTQlAyX0VSUigiRXJyb3IgcmVjb25uZWN0aW5nIHRvIFNCUC0yIGRldmljZSAtIHJlY29ubmVjdCBmYWlsZWQiKTsKKwkJcmV0dXJuKC1FSU8pOworCX0KKworCUhQU0JfREVCVUcoIlJlY29ubmVjdGVkIHRvIFNCUC0yIGRldmljZSIpOworCisJcmV0dXJuKDApOworCit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBzZXQgdGhlIGJ1c3kgdGltZW91dCAobnVtYmVyIG9mCisgKiByZXRyaWVzIHRvIGF0dGVtcHQpIG9uIHRoZSBzYnAyIGRldmljZS4KKyAqLworc3RhdGljIGludCBzYnAyX3NldF9idXN5X3RpbWVvdXQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCkKK3sKKwlxdWFkbGV0X3QgZGF0YTsKKworCVNCUDJfREVCVUcoInNicDJfc2V0X2J1c3lfdGltZW91dCIpOworCisJLyoKKwkgKiBPaywgbGV0J3Mgd3JpdGUgdG8gdGhlIHRhcmdldCdzIGJ1c3kgdGltZW91dCByZWdpc3RlcgorCSAqLworCWRhdGEgPSBjcHVfdG9fYmUzMihTQlAyX0JVU1lfVElNRU9VVF9WQUxVRSk7CisKKwlpZiAoaHBzYl9ub2RlX3dyaXRlKHNjc2lfaWQtPm5lLCBTQlAyX0JVU1lfVElNRU9VVF9BRERSRVNTLCAmZGF0YSwgNCkpIHsKKwkJU0JQMl9FUlIoInNicDJfc2V0X2J1c3lfdGltZW91dCBlcnJvciIpOworCX0KKworCXJldHVybigwKTsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcGFyc2Ugc2JwMiBkZXZpY2UncyBjb25maWcgcm9tIHVuaXQKKyAqIGRpcmVjdG9yeS4gVXNlZCB0byBkZXRlcm1pbmUgdGhpbmdzIGxpa2Ugc2JwMiBtYW5hZ2VtZW50IGFnZW50IG9mZnNldCwKKyAqIGFuZCBjb21tYW5kIHNldCB1c2VkIChTQ1NJIG9yIFJCQykuCisgKi8KK3N0YXRpYyB2b2lkIHNicDJfcGFyc2VfdW5pdF9kaXJlY3Rvcnkoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwKKwkJCQkgICAgICBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnkgKnVkKQoreworCXN0cnVjdCBjc3IxMjEyX2tleXZhbCAqa3Y7CisJc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpkZW50cnk7CisJdTY0IG1hbmFnZW1lbnRfYWdlbnRfYWRkcjsKKwl1MzIgY29tbWFuZF9zZXRfc3BlY19pZCwgY29tbWFuZF9zZXQsIHVuaXRfY2hhcmFjdGVyaXN0aWNzLAorCQlmaXJtd2FyZV9yZXZpc2lvbiwgd29ya2Fyb3VuZHM7CisJaW50IGk7CisKKwlTQlAyX0RFQlVHKCJzYnAyX3BhcnNlX3VuaXRfZGlyZWN0b3J5Iik7CisKKwltYW5hZ2VtZW50X2FnZW50X2FkZHIgPSAweDA7CisJY29tbWFuZF9zZXRfc3BlY19pZCA9IDB4MDsKKwljb21tYW5kX3NldCA9IDB4MDsKKwl1bml0X2NoYXJhY3RlcmlzdGljcyA9IDB4MDsKKwlmaXJtd2FyZV9yZXZpc2lvbiA9IDB4MDsKKworCS8qIEhhbmRsZSBkaWZmZXJlbnQgZmllbGRzIGluIHRoZSB1bml0IGRpcmVjdG9yeSwgYmFzZWQgb24ga2V5cyAqLworCWNzcjEyMTJfZm9yX2VhY2hfZGlyX2VudHJ5KHVkLT5uZS0+Y3NyLCBrdiwgdWQtPnVkX2t2LCBkZW50cnkpIHsKKwkJc3dpdGNoIChrdi0+a2V5LmlkKSB7CisJCWNhc2UgQ1NSMTIxMl9LVl9JRF9ERVBFTkRFTlRfSU5GTzoKKwkJCWlmIChrdi0+a2V5LnR5cGUgPT0gQ1NSMTIxMl9LVl9UWVBFX0NTUl9PRkZTRVQpIHsKKwkJCQkvKiBTYXZlIG9mZiB0aGUgbWFuYWdlbWVudCBhZ2VudCBhZGRyZXNzICovCisJCQkJbWFuYWdlbWVudF9hZ2VudF9hZGRyID0KKwkJCQkJQ1NSMTIxMl9SRUdJU1RFUl9TUEFDRV9CQVNFICsKKwkJCQkJKGt2LT52YWx1ZS5jc3Jfb2Zmc2V0IDw8IDIpOworCisJCQkJU0JQMl9ERUJVRygic2JwMl9tYW5hZ2VtZW50X2FnZW50X2FkZHIgPSAleCIsCisJCQkJCSAgICh1bnNpZ25lZCBpbnQpIG1hbmFnZW1lbnRfYWdlbnRfYWRkcik7CisJCQl9IGVsc2UgaWYgKGt2LT5rZXkudHlwZSA9PSBDU1IxMjEyX0tWX1RZUEVfSU1NRURJQVRFKSB7CisJCQkJc2NzaV9pZC0+c2JwMl9kZXZpY2VfdHlwZV9hbmRfbHVuID0ga3YtPnZhbHVlLmltbWVkaWF0ZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0JQMl9DT01NQU5EX1NFVF9TUEVDX0lEX0tFWToKKwkJCS8qIENvbW1hbmQgc3BlYyBvcmdhbml6YXRpb24gKi8KKwkJCWNvbW1hbmRfc2V0X3NwZWNfaWQgPSBrdi0+dmFsdWUuaW1tZWRpYXRlOworCQkJU0JQMl9ERUJVRygic2JwMl9jb21tYW5kX3NldF9zcGVjX2lkID0gJXgiLAorCQkJCSAgICh1bnNpZ25lZCBpbnQpIGNvbW1hbmRfc2V0X3NwZWNfaWQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQlAyX0NPTU1BTkRfU0VUX0tFWToKKwkJCS8qIENvbW1hbmQgc2V0IHVzZWQgYnkgc2JwMiBkZXZpY2UgKi8KKwkJCWNvbW1hbmRfc2V0ID0ga3YtPnZhbHVlLmltbWVkaWF0ZTsKKwkJCVNCUDJfREVCVUcoInNicDJfY29tbWFuZF9zZXQgPSAleCIsCisJCQkJICAgKHVuc2lnbmVkIGludCkgY29tbWFuZF9zZXQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTQlAyX1VOSVRfQ0hBUkFDVEVSSVNUSUNTX0tFWToKKwkJCS8qCisJCQkgKiBVbml0IGNoYXJhY3RlcmlzaXRjcyAob3JiIHJlbGF0ZWQgc3R1ZmYKKwkJCSAqIHRoYXQgSSdtIG5vdCB5ZXQgcGF5aW5nIGF0dGVudGlvbiB0bykKKwkJCSAqLworCQkJdW5pdF9jaGFyYWN0ZXJpc3RpY3MgPSBrdi0+dmFsdWUuaW1tZWRpYXRlOworCQkJU0JQMl9ERUJVRygic2JwMl91bml0X2NoYXJhY3RlcmlzdGljcyA9ICV4IiwKKwkJCQkgICAodW5zaWduZWQgaW50KSB1bml0X2NoYXJhY3RlcmlzdGljcyk7CisJCQlicmVhazsKKworCQljYXNlIFNCUDJfRklSTVdBUkVfUkVWSVNJT05fS0VZOgorCQkJLyogRmlybXdhcmUgcmV2aXNpb24gKi8KKwkJCWZpcm13YXJlX3JldmlzaW9uID0ga3YtPnZhbHVlLmltbWVkaWF0ZTsKKwkJCWlmIChmb3JjZV9pbnF1aXJ5X2hhY2spCisJCQkJU0JQMl9JTkZPKCJzYnAyX2Zpcm13YXJlX3JldmlzaW9uID0gJXgiLAorCQkJCSAgICh1bnNpZ25lZCBpbnQpIGZpcm13YXJlX3JldmlzaW9uKTsKKwkJCWVsc2UJU0JQMl9ERUJVRygic2JwMl9maXJtd2FyZV9yZXZpc2lvbiA9ICV4IiwKKwkJCQkgICAodW5zaWduZWQgaW50KSBmaXJtd2FyZV9yZXZpc2lvbik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBUaGlzIGlzIHRoZSBzdGFydCBvZiBvdXIgYnJva2VuIGRldmljZSBjaGVja2luZy4gV2UgdHJ5IHRvIGhhY2sKKwkgKiBhcm91bmQgb2RkaXRpZXMgYW5kIGtub3duIGRlZmVjdHMuICAqLworCXdvcmthcm91bmRzID0gMHgwOworCisJLyogSWYgdGhlIHZlbmRvciBpZCBpcyAweGEwYjggKFN5bWJpb3MgdmVuZG9yIGlkKSwgdGhlbiB3ZSBoYXZlIGEKKwkgKiBicmlkZ2Ugd2l0aCAxMjhLQiBtYXggdHJhbnNmZXIgc2l6ZSBsaW1pdGF0aW9uLiBGb3Igc2FuaXR5LCB3ZQorCSAqIG9ubHkgdm9pY2UgdGhpcyB3aGVuIHRoZSBjdXJyZW50IG1heF9zZWN0b3JzIHNldHRpbmcKKwkgKiBleGNlZWRzIHRoZSAxMjhrIGxpbWl0LiBCeSBkZWZhdWx0LCB0aGF0IGlzIG5vdCB0aGUgY2FzZS4KKwkgKgorCSAqIEl0IHdvdWxkIGJlIHJlYWxseSBuaWNlIGlmIHdlIGNvdWxkIGRldGVjdCB0aGlzIGJlZm9yZSB0aGUgc2NzaQorCSAqIGhvc3QgZ2V0cyBpbml0aWFsaXplZC4gVGhhdCB3YXkgd2UgY2FuIGRvd24tZm9yY2UgdGhlCisJICogbWF4X3NlY3RvcnMgdG8gYWNjb3VudCBmb3IgaXQuIFRoYXQgaXMgbm90IGN1cnJlbnRseQorCSAqIHBvc3NpYmxlLiAgKi8KKwlpZiAoKGZpcm13YXJlX3JldmlzaW9uICYgMHhmZmZmMDApID09CisJCQlTQlAyXzEyOEtCX0JST0tFTl9GSVJNV0FSRSAmJgorCQkJKG1heF9zZWN0b3JzICogNTEyKSA+ICgxMjgqMTAyNCkpIHsKKwkJU0JQMl9XQVJOKCJOb2RlICIgTk9ERV9CVVNfRk1UICI6IEJyaWRnZSBvbmx5IHN1cHBvcnRzIDEyOEtCIG1heCB0cmFuc2ZlciBzaXplLiIsCisJCQkJTk9ERV9CVVNfQVJHUyh1ZC0+bmUtPmhvc3QsIHVkLT5uZS0+bm9kZWlkKSk7CisJCVNCUDJfV0FSTigiV0FSTklORzogQ3VycmVudCBtYXhfc2VjdG9ycyBzZXR0aW5nIGlzIGxhcmdlciB0aGFuIDEyOEtCICglZCBzZWN0b3JzKSEiLAorCQkJCW1heF9zZWN0b3JzKTsKKwkJd29ya2Fyb3VuZHMgfD0gU0JQMl9CUkVBS0FHRV8xMjhLX01BWF9UUkFOU0ZFUjsKKwl9CisKKwkvKiBDaGVjayBmb3IgYSBibGFja2xpc3RlZCBzZXQgb2YgZGV2aWNlcyB0aGF0IHJlcXVpcmUgdXMgdG8gZm9yY2UKKwkgKiBhIDM2IGJ5dGUgaG9zdCBpbnF1aXJ5LiBUaGlzIGNhbiBiZSBvdmVycmlkZW4gYXMgYSBtb2R1bGUgcGFyYW0KKwkgKiAodG8gZm9yY2UgYWxsIGhvc3RzKS4gICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9CUk9LRU5fSU5RVUlSWV9ERVZTOyBpKyspIHsKKwkJaWYgKChmaXJtd2FyZV9yZXZpc2lvbiAmIDB4ZmZmZjAwKSA9PQorCQkJCXNicDJfYnJva2VuX2lucXVpcnlfbGlzdFtpXSkgeworCQkJU0JQMl9XQVJOKCJOb2RlICIgTk9ERV9CVVNfRk1UICI6IFVzaW5nIDM2Ynl0ZSBpbnF1aXJ5IHdvcmthcm91bmQiLAorCQkJCQlOT0RFX0JVU19BUkdTKHVkLT5uZS0+aG9zdCwgdWQtPm5lLT5ub2RlaWQpKTsKKwkJCXdvcmthcm91bmRzIHw9IFNCUDJfQlJFQUtBR0VfSU5RVUlSWV9IQUNLOworCQkJYnJlYWs7IC8qIE5vIG5lZWQgdG8gY29udGludWUuICovCisJCX0KKwl9CisKKwkvKiBJZiB0aGlzIGlzIGEgbG9naWNhbCB1bml0IGRpcmVjdG9yeSBlbnRyeSwgcHJvY2VzcyB0aGUgcGFyZW50CisJICogdG8gZ2V0IHRoZSB2YWx1ZXMuICovCisJaWYgKHVkLT5mbGFncyAmIFVOSVRfRElSRUNUT1JZX0xVTl9ESVJFQ1RPUlkpIHsKKwkJc3RydWN0IHVuaXRfZGlyZWN0b3J5ICpwYXJlbnRfdWQgPQorCQkJY29udGFpbmVyX29mKHVkLT5kZXZpY2UucGFyZW50LCBzdHJ1Y3QgdW5pdF9kaXJlY3RvcnksIGRldmljZSk7CisJCXNicDJfcGFyc2VfdW5pdF9kaXJlY3Rvcnkoc2NzaV9pZCwgcGFyZW50X3VkKTsKKwl9IGVsc2UgeworCQlzY3NpX2lkLT5zYnAyX21hbmFnZW1lbnRfYWdlbnRfYWRkciA9IG1hbmFnZW1lbnRfYWdlbnRfYWRkcjsKKwkJc2NzaV9pZC0+c2JwMl9jb21tYW5kX3NldF9zcGVjX2lkID0gY29tbWFuZF9zZXRfc3BlY19pZDsKKwkJc2NzaV9pZC0+c2JwMl9jb21tYW5kX3NldCA9IGNvbW1hbmRfc2V0OworCQlzY3NpX2lkLT5zYnAyX3VuaXRfY2hhcmFjdGVyaXN0aWNzID0gdW5pdF9jaGFyYWN0ZXJpc3RpY3M7CisJCXNjc2lfaWQtPnNicDJfZmlybXdhcmVfcmV2aXNpb24gPSBmaXJtd2FyZV9yZXZpc2lvbjsKKwkJc2NzaV9pZC0+d29ya2Fyb3VuZHMgPSB3b3JrYXJvdW5kczsKKwkJaWYgKHVkLT5mbGFncyAmIFVOSVRfRElSRUNUT1JZX0hBU19MVU4pCisJCQlzY3NpX2lkLT5zYnAyX2RldmljZV90eXBlX2FuZF9sdW4gPSB1ZC0+bHVuOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIG9yZGVyIHRvIGRldGVybWluZSB0aGUgbWF4IHNwZWVkIGFuZCBwYWNrZXQKKyAqIHNpemUgd2UgY2FuIHVzZSBpbiBvdXIgT1JCcy4gTm90ZSwgdGhhdCB3ZSAodGhlIGRyaXZlciBhbmQgaG9zdCkgb25seQorICogaW5pdGlhdGUgdGhlIHRyYW5zYWN0aW9uLiBUaGUgU0JQLTIgZGV2aWNlIGFjdHVhbGx5IHRyYW5zZmVycyB0aGUgZGF0YQorICogKGJ5IHJlYWRpbmcgZnJvbSB0aGUgRE1BIGFyZWEgd2UgdGVsbCBpdCkuIFRoaXMgbWVhbnMgdGhhdCB0aGUgU0JQLTIKKyAqIGRldmljZSBkZWNpZGVzIHRoZSBhY3R1YWwgbWF4aW11bSBkYXRhIGl0IGNhbiB0cmFuc2Zlci4gV2UganVzdCB0ZWxsIGl0CisgKiB0aGUgc3BlZWQgdGhhdCBpdCBuZWVkcyB0byB1c2UsIGFuZCB0aGUgbWF4X3JlYyB0aGUgaG9zdCBzdXBwb3J0cywgYW5kCisgKiBpdCB0YWtlcyBjYXJlIG9mIHRoZSByZXN0LgorICovCitzdGF0aWMgaW50IHNicDJfbWF4X3NwZWVkX2FuZF9zaXplKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpCit7CisJc3RydWN0IHNicDJzY3NpX2hvc3RfaW5mbyAqaGkgPSBzY3NpX2lkLT5oaTsKKworCVNCUDJfREVCVUcoInNicDJfbWF4X3NwZWVkX2FuZF9zaXplIik7CisKKwkvKiBJbml0aWFsIHNldHRpbmcgY29tZXMgZnJvbSB0aGUgaG9zdHMgc3BlZWQgbWFwICovCisJc2NzaV9pZC0+c3BlZWRfY29kZSA9IGhpLT5ob3N0LT5zcGVlZF9tYXBbTk9ERUlEX1RPX05PREUoaGktPmhvc3QtPm5vZGVfaWQpICogNjQKKwkJCQkJCSAgKyBOT0RFSURfVE9fTk9ERShzY3NpX2lkLT5uZS0+bm9kZWlkKV07CisKKwkvKiBCdW1wIGRvd24gb3VyIHNwZWVkIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpdCAqLworCWlmIChzY3NpX2lkLT5zcGVlZF9jb2RlID4gbWF4X3NwZWVkKSB7CisJCXNjc2lfaWQtPnNwZWVkX2NvZGUgPSBtYXhfc3BlZWQ7CisJCVNCUDJfRVJSKCJGb3JjaW5nIFNCUC0yIG1heCBzcGVlZCBkb3duIHRvICVzIiwKKwkJCSBocHNiX3NwZWVkdG9fc3RyW3Njc2lfaWQtPnNwZWVkX2NvZGVdKTsKKwl9CisKKwkvKiBQYXlsb2FkIHNpemUgaXMgdGhlIGxlc3NlciBvZiB3aGF0IG91ciBzcGVlZCBzdXBwb3J0cyBhbmQgd2hhdAorCSAqIG91ciBob3N0IHN1cHBvcnRzLiAgKi8KKwlzY3NpX2lkLT5tYXhfcGF5bG9hZF9zaXplID0gbWluKHNicDJfc3BlZWR0b19tYXhfcGF5bG9hZFtzY3NpX2lkLT5zcGVlZF9jb2RlXSwKKwkJCQkJKHU4KShoaS0+aG9zdC0+Y3NyLm1heF9yZWMgLSAxKSk7CisKKwlIUFNCX0RFQlVHKCJOb2RlICIgTk9ERV9CVVNfRk1UICI6IE1heCBzcGVlZCBbJXNdIC0gTWF4IHBheWxvYWQgWyV1XSIsCisJCSAgIE5PREVfQlVTX0FSR1MoaGktPmhvc3QsIHNjc2lfaWQtPm5lLT5ub2RlaWQpLAorCQkgICBocHNiX3NwZWVkdG9fc3RyW3Njc2lfaWQtPnNwZWVkX2NvZGVdLAorCQkgICAxIDw8ICgodTMyKXNjc2lfaWQtPm1heF9wYXlsb2FkX3NpemUgKyAyKSk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBwZXJmb3JtIGEgU0JQLTIgYWdlbnQgcmVzZXQuCisgKi8KK3N0YXRpYyBpbnQgc2JwMl9hZ2VudF9yZXNldChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLCBpbnQgd2FpdCkKK3sKKwlxdWFkbGV0X3QgZGF0YTsKKwl1NjQgYWRkcjsKKwlpbnQgcmV0dmFsOworCisJU0JQMl9ERUJVRygic2JwMl9hZ2VudF9yZXNldCIpOworCisJLyoKKwkgKiBPaywgbGV0J3Mgd3JpdGUgdG8gdGhlIHRhcmdldCdzIG1hbmFnZW1lbnQgYWdlbnQgcmVnaXN0ZXIKKwkgKi8KKwlkYXRhID0gbnRvaGwoU0JQMl9BR0VOVF9SRVNFVF9EQVRBKTsKKwlhZGRyID0gc2NzaV9pZC0+c2JwMl9jb21tYW5kX2Jsb2NrX2FnZW50X2FkZHIgKyBTQlAyX0FHRU5UX1JFU0VUX09GRlNFVDsKKworCWlmICh3YWl0KQorCQlyZXR2YWwgPSBocHNiX25vZGVfd3JpdGUoc2NzaV9pZC0+bmUsIGFkZHIsICZkYXRhLCA0KTsKKwllbHNlCisJCXJldHZhbCA9IHNicDJ1dGlsX25vZGVfd3JpdGVfbm9fd2FpdChzY3NpX2lkLT5uZSwgYWRkciwgJmRhdGEsIDQpOworCisJaWYgKHJldHZhbCA8IDApIHsKKwkJU0JQMl9FUlIoImhwc2Jfbm9kZV93cml0ZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiBOZWVkIHRvIG1ha2Ugc3VyZSBvcmIgcG9pbnRlciBpcyB3cml0dGVuIG9uIG5leHQgY29tbWFuZAorCSAqLworCXNjc2lfaWQtPmxhc3Rfb3JiID0gTlVMTDsKKworCXJldHVybigwKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNyZWF0ZSB0aGUgYWN0dWFsIGNvbW1hbmQgb3JiIGFuZCBzL2cgbGlzdAorICogb3V0IG9mIHRoZSBzY3NpIGNvbW1hbmQgaXRzZWxmLgorICovCitzdGF0aWMgaW50IHNicDJfY3JlYXRlX2NvbW1hbmRfb3JiKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCisJCQkJICAgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kLAorCQkJCSAgIHVuY2hhciAqc2NzaV9jbWQsCisJCQkJICAgdW5zaWduZWQgaW50IHNjc2lfdXNlX3NnLAorCQkJCSAgIHVuc2lnbmVkIGludCBzY3NpX3JlcXVlc3RfYnVmZmxlbiwKKwkJCQkgICB2b2lkICpzY3NpX3JlcXVlc3RfYnVmZmVyLAorCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRtYV9kaXIpCisKK3sKKwlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaSA9IHNjc2lfaWQtPmhpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dwbnQgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNjc2lfcmVxdWVzdF9idWZmZXI7CisJc3RydWN0IHNicDJfY29tbWFuZF9vcmIgKmNvbW1hbmRfb3JiID0gJmNvbW1hbmQtPmNvbW1hbmRfb3JiOworCXN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlICpzY2F0dGVyX2dhdGhlcl9lbGVtZW50ID0KKwkJJmNvbW1hbmQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnRbMF07CisJdTMyIHNnX2NvdW50LCBzZ19sZW4sIG9yYl9kaXJlY3Rpb247CisJZG1hX2FkZHJfdCBzZ19hZGRyOworCWludCBpOworCisJLyoKKwkgKiBTZXQtdXAgb3VyIGNvbW1hbmQgT1JCLi4KKwkgKgorCSAqIE5PVEU6IFdlJ3JlIGRvaW5nIHVucmVzdHJpY3RlZCBwYWdlIHRhYmxlcyAocy9nKSwgYXMgdGhpcyBpcworCSAqIGJlc3QgcGVyZm9ybWFuY2UgKGF0IGxlYXN0IHdpdGggdGhlIGRldmljZXMgSSBoYXZlKS4gVGhpcyBtZWFucworCSAqIHRoYXQgZGF0YV9zaXplIGJlY29tZXMgdGhlIG51bWJlciBvZiBzL2cgZWxlbWVudHMsIGFuZAorCSAqIHBhZ2Vfc2l6ZSBzaG91bGQgYmUgemVybyAoZm9yIHVucmVzdHJpY3RlZCkuCisJICovCisJY29tbWFuZF9vcmItPm5leHRfT1JCX2hpID0gT1JCX1NFVF9OVUxMX1BUUigxKTsKKwljb21tYW5kX29yYi0+bmV4dF9PUkJfbG8gPSAweDA7CisJY29tbWFuZF9vcmItPm1pc2MgPSBPUkJfU0VUX01BWF9QQVlMT0FEKHNjc2lfaWQtPm1heF9wYXlsb2FkX3NpemUpOworCWNvbW1hbmRfb3JiLT5taXNjIHw9IE9SQl9TRVRfU1BFRUQoc2NzaV9pZC0+c3BlZWRfY29kZSk7CisJY29tbWFuZF9vcmItPm1pc2MgfD0gT1JCX1NFVF9OT1RJRlkoMSk7CQkvKiBOb3RpZnkgdXMgd2hlbiBjb21wbGV0ZSAqLworCisJLyoKKwkgKiBHZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhbnNmZXIuIElmIHRoZSBkaXJlY3Rpb24gaXMgdW5rbm93biwgdGhlbiB1c2Ugb3VyCisJICogZ29vZnkgdGFibGUgYXMgYSBiYWNrLXVwLgorCSAqLworCXN3aXRjaCAoZG1hX2RpcikgeworCQljYXNlIERNQV9OT05FOgorCQkJb3JiX2RpcmVjdGlvbiA9IE9SQl9ESVJFQ1RJT05fTk9fREFUQV9UUkFOU0ZFUjsKKwkJCWJyZWFrOworCQljYXNlIERNQV9UT19ERVZJQ0U6CisJCQlvcmJfZGlyZWN0aW9uID0gT1JCX0RJUkVDVElPTl9XUklURV9UT19NRURJQTsKKwkJCWJyZWFrOworCQljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJCW9yYl9kaXJlY3Rpb24gPSBPUkJfRElSRUNUSU9OX1JFQURfRlJPTV9NRURJQTsKKwkJCWJyZWFrOworCQljYXNlIERNQV9CSURJUkVDVElPTkFMOgorCQlkZWZhdWx0OgorCQkJU0JQMl9FUlIoIlNDU0kgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gbm90IHNwZWNpZmllZC4gIgorCQkJCSAiVXBkYXRlIHRoZSBTQlAyIGRpcmVjdGlvbiB0YWJsZSBpbiBzYnAyLmggaWYgIgorCQkJCSAibmVjZXNzYXJ5IGZvciB5b3VyIGFwcGxpY2F0aW9uIik7CisJCQlfX3Njc2lfcHJpbnRfY29tbWFuZChzY3NpX2NtZCk7CisJCQlvcmJfZGlyZWN0aW9uID0gc2JwMnNjc2lfZGlyZWN0aW9uX3RhYmxlWypzY3NpX2NtZF07CisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFNldC11cCBvdXIgcGFnZXRhYmxlIHN0dWZmLi4uIHVuZm9ydHVuYXRlbHksIHRoaXMgaGFzIGJlY29tZQorCSAqIG1lc3NpZXIgdGhhbiBJJ2QgbGlrZS4gTmVlZCB0byBjbGVhbiB0aGlzIHVwIGEgYml0LiAgIDstKQorCSAqLworCWlmIChvcmJfZGlyZWN0aW9uID09IE9SQl9ESVJFQ1RJT05fTk9fREFUQV9UUkFOU0ZFUikgeworCisJCVNCUDJfREVCVUcoIk5vIGRhdGEgdHJhbnNmZXIiKTsKKworCQkvKgorCQkgKiBIYW5kbGUgbm8gZGF0YSB0cmFuc2ZlcgorCQkgKi8KKwkJY29tbWFuZF9vcmItPmRhdGFfZGVzY3JpcHRvcl9oaSA9IDB4MDsKKwkJY29tbWFuZF9vcmItPmRhdGFfZGVzY3JpcHRvcl9sbyA9IDB4MDsKKwkJY29tbWFuZF9vcmItPm1pc2MgfD0gT1JCX1NFVF9ESVJFQ1RJT04oMSk7CisKKwl9IGVsc2UgaWYgKHNjc2lfdXNlX3NnKSB7CisKKwkJU0JQMl9ERUJVRygiVXNlIHNjYXR0ZXIvZ2F0aGVyIik7CisKKwkJLyoKKwkJICogU3BlY2lhbCBjYXNlIGlmIG9ubHkgb25lIGVsZW1lbnQgKGFuZCBsZXNzIHRoYW4gNjRLQiBpbiBzaXplKQorCQkgKi8KKwkJaWYgKChzY3NpX3VzZV9zZyA9PSAxKSAmJiAoc2dwbnRbMF0ubGVuZ3RoIDw9IFNCUDJfTUFYX1NHX0VMRU1FTlRfTEVOR1RIKSkgeworCisJCQlTQlAyX0RFQlVHKCJPbmx5IG9uZSBzL2cgZWxlbWVudCIpOworCQkJY29tbWFuZC0+ZG1hX2RpciA9IGRtYV9kaXI7CisJCQljb21tYW5kLT5kbWFfc2l6ZSA9IHNncG50WzBdLmxlbmd0aDsKKwkJCWNvbW1hbmQtPmRtYV90eXBlID0gQ01EX0RNQV9QQUdFOworCQkJY29tbWFuZC0+Y21kX2RtYSA9IHBjaV9tYXBfcGFnZShoaS0+aG9zdC0+cGRldiwKKwkJCQkJCQlzZ3BudFswXS5wYWdlLAorCQkJCQkJCXNncG50WzBdLm9mZnNldCwKKwkJCQkJCQljb21tYW5kLT5kbWFfc2l6ZSwKKwkJCQkJCQljb21tYW5kLT5kbWFfZGlyKTsKKwkJCVNCUDJfRE1BX0FMTE9DKCJzaW5nbGUgcGFnZSBzY2F0dGVyIGVsZW1lbnQiKTsKKworCQkJY29tbWFuZF9vcmItPmRhdGFfZGVzY3JpcHRvcl9oaSA9IE9SQl9TRVRfTk9ERV9JRChoaS0+aG9zdC0+bm9kZV9pZCk7CisJCQljb21tYW5kX29yYi0+ZGF0YV9kZXNjcmlwdG9yX2xvID0gY29tbWFuZC0+Y21kX2RtYTsKKwkJCWNvbW1hbmRfb3JiLT5taXNjIHw9IE9SQl9TRVRfREFUQV9TSVpFKGNvbW1hbmQtPmRtYV9zaXplKTsKKwkJCWNvbW1hbmRfb3JiLT5taXNjIHw9IE9SQl9TRVRfRElSRUNUSU9OKG9yYl9kaXJlY3Rpb24pOworCisJCX0gZWxzZSB7CisJCQlpbnQgY291bnQgPSBwY2lfbWFwX3NnKGhpLT5ob3N0LT5wZGV2LCBzZ3BudCwgc2NzaV91c2Vfc2csIGRtYV9kaXIpOworCQkJU0JQMl9ETUFfQUxMT0MoInNjYXR0ZXIgbGlzdCIpOworCisJCQljb21tYW5kLT5kbWFfc2l6ZSA9IHNjc2lfdXNlX3NnOworCQkJY29tbWFuZC0+ZG1hX2RpciA9IGRtYV9kaXI7CisJCQljb21tYW5kLT5zZ2VfYnVmZmVyID0gc2dwbnQ7CisKKwkJCS8qIHVzZSBwYWdlIHRhYmxlcyAocy9nKSAqLworCQkJY29tbWFuZF9vcmItPm1pc2MgfD0gT1JCX1NFVF9QQUdFX1RBQkxFX1BSRVNFTlQoMHgxKTsKKwkJCWNvbW1hbmRfb3JiLT5taXNjIHw9IE9SQl9TRVRfRElSRUNUSU9OKG9yYl9kaXJlY3Rpb24pOworCQkJY29tbWFuZF9vcmItPmRhdGFfZGVzY3JpcHRvcl9oaSA9IE9SQl9TRVRfTk9ERV9JRChoaS0+aG9zdC0+bm9kZV9pZCk7CisJCQljb21tYW5kX29yYi0+ZGF0YV9kZXNjcmlwdG9yX2xvID0gY29tbWFuZC0+c2dlX2RtYTsKKworCQkJLyoKKwkJCSAqIExvb3AgdGhyb3VnaCBhbmQgZmlsbCBvdXQgb3VyIHNicC0yIHBhZ2UgdGFibGVzCisJCQkgKiAoYW5kIHNwbGl0IHVwIGFueXRoaW5nIHRvbyBsYXJnZSkKKwkJCSAqLworCQkJZm9yIChpID0gMCwgc2dfY291bnQgPSAwIDsgaSA8IGNvdW50OyBpKyssIHNncG50KyspIHsKKwkJCQlzZ19sZW4gPSBzZ19kbWFfbGVuKHNncG50KTsKKwkJCQlzZ19hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2dwbnQpOworCQkJCXdoaWxlIChzZ19sZW4pIHsKKwkJCQkJc2NhdHRlcl9nYXRoZXJfZWxlbWVudFtzZ19jb3VudF0uc2VnbWVudF9iYXNlX2xvID0gc2dfYWRkcjsKKwkJCQkJaWYgKHNnX2xlbiA+IFNCUDJfTUFYX1NHX0VMRU1FTlRfTEVOR1RIKSB7CisJCQkJCQlzY2F0dGVyX2dhdGhlcl9lbGVtZW50W3NnX2NvdW50XS5sZW5ndGhfc2VnbWVudF9iYXNlX2hpID0KKwkJCQkJCQlQQUdFX1RBQkxFX1NFVF9TRUdNRU5UX0xFTkdUSChTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSCk7CisJCQkJCQlzZ19hZGRyICs9IFNCUDJfTUFYX1NHX0VMRU1FTlRfTEVOR1RIOworCQkJCQkJc2dfbGVuIC09IFNCUDJfTUFYX1NHX0VMRU1FTlRfTEVOR1RIOworCQkJCQl9IGVsc2UgeworCQkJCQkJc2NhdHRlcl9nYXRoZXJfZWxlbWVudFtzZ19jb3VudF0ubGVuZ3RoX3NlZ21lbnRfYmFzZV9oaSA9CisJCQkJCQkJUEFHRV9UQUJMRV9TRVRfU0VHTUVOVF9MRU5HVEgoc2dfbGVuKTsKKwkJCQkJCXNnX2xlbiA9IDA7CisJCQkJCX0KKwkJCQkJc2dfY291bnQrKzsKKwkJCQl9CisJCQl9CisKKwkJCS8qIE51bWJlciBvZiBwYWdlIHRhYmxlIChzL2cpIGVsZW1lbnRzICovCisJCQljb21tYW5kX29yYi0+bWlzYyB8PSBPUkJfU0VUX0RBVEFfU0laRShzZ19jb3VudCk7CisKKwkJCXNicDJ1dGlsX3BhY2tldF9kdW1wKHNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQsCisJCQkJCSAgICAgKHNpemVvZihzdHJ1Y3Qgc2JwMl91bnJlc3RyaWN0ZWRfcGFnZV90YWJsZSkpICogc2dfY291bnQsCisJCQkJCSAgICAgInNicDIgcy9nIGxpc3QiLCBjb21tYW5kLT5zZ2VfZG1hKTsKKworCQkJLyoKKwkJCSAqIEJ5dGUgc3dhcCBwYWdlIHRhYmxlcyBpZiBuZWNlc3NhcnkKKwkJCSAqLworCQkJc2JwMnV0aWxfY3B1X3RvX2JlMzJfYnVmZmVyKHNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQsCisJCQkJCQkgICAgKHNpemVvZihzdHJ1Y3Qgc2JwMl91bnJlc3RyaWN0ZWRfcGFnZV90YWJsZSkpICoKKwkJCQkJCSAgICBzZ19jb3VudCk7CisKKwkJfQorCisJfSBlbHNlIHsKKworCQlTQlAyX0RFQlVHKCJObyBzY2F0dGVyL2dhdGhlciIpOworCisJCWNvbW1hbmQtPmRtYV9kaXIgPSBkbWFfZGlyOworCQljb21tYW5kLT5kbWFfc2l6ZSA9IHNjc2lfcmVxdWVzdF9idWZmbGVuOworCQljb21tYW5kLT5kbWFfdHlwZSA9IENNRF9ETUFfU0lOR0xFOworCQljb21tYW5kLT5jbWRfZG1hID0gcGNpX21hcF9zaW5nbGUgKGhpLT5ob3N0LT5wZGV2LCBzY3NpX3JlcXVlc3RfYnVmZmVyLAorCQkJCQkJICAgY29tbWFuZC0+ZG1hX3NpemUsCisJCQkJCQkgICBjb21tYW5kLT5kbWFfZGlyKTsKKwkJU0JQMl9ETUFfQUxMT0MoInNpbmdsZSBidWxrIik7CisKKwkJLyoKKwkJICogSGFuZGxlIGNhc2Ugd2hlcmUgd2UgZ2V0IGEgY29tbWFuZCB3L28gcy9nIGVuYWJsZWQgKGJ1dAorCQkgKiBjaGVjayBmb3IgdHJhbnNmZXJzIGxhcmdlciB0aGFuIDY0SykKKwkJICovCisJCWlmIChzY3NpX3JlcXVlc3RfYnVmZmxlbiA8PSBTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSCkgeworCisJCQljb21tYW5kX29yYi0+ZGF0YV9kZXNjcmlwdG9yX2hpID0gT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKTsKKwkJCWNvbW1hbmRfb3JiLT5kYXRhX2Rlc2NyaXB0b3JfbG8gPSBjb21tYW5kLT5jbWRfZG1hOworCQkJY29tbWFuZF9vcmItPm1pc2MgfD0gT1JCX1NFVF9EQVRBX1NJWkUoc2NzaV9yZXF1ZXN0X2J1ZmZsZW4pOworCQkJY29tbWFuZF9vcmItPm1pc2MgfD0gT1JCX1NFVF9ESVJFQ1RJT04ob3JiX2RpcmVjdGlvbik7CisKKwkJCS8qCisJCQkgKiBTYW5pdHksIGluIGNhc2Ugb3VyIGRpcmVjdGlvbiB0YWJsZSBpcyBub3QKKwkJCSAqIHVwLXRvLWRhdGUKKwkJCSAqLworCQkJaWYgKCFzY3NpX3JlcXVlc3RfYnVmZmxlbikgeworCQkJCWNvbW1hbmRfb3JiLT5kYXRhX2Rlc2NyaXB0b3JfaGkgPSAweDA7CisJCQkJY29tbWFuZF9vcmItPmRhdGFfZGVzY3JpcHRvcl9sbyA9IDB4MDsKKwkJCQljb21tYW5kX29yYi0+bWlzYyB8PSBPUkJfU0VUX0RJUkVDVElPTigxKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE5lZWQgdG8gdHVybiB0aGlzIGludG8gcGFnZSB0YWJsZXMsIHNpbmNlIHRoZQorCQkJICogYnVmZmVyIGlzIHRvbyBsYXJnZS4KKwkJCSAqLworCQkJY29tbWFuZF9vcmItPmRhdGFfZGVzY3JpcHRvcl9oaSA9IE9SQl9TRVRfTk9ERV9JRChoaS0+aG9zdC0+bm9kZV9pZCk7CisJCQljb21tYW5kX29yYi0+ZGF0YV9kZXNjcmlwdG9yX2xvID0gY29tbWFuZC0+c2dlX2RtYTsKKworCQkJLyogVXNlIHBhZ2UgdGFibGVzIChzL2cpICovCisJCQljb21tYW5kX29yYi0+bWlzYyB8PSBPUkJfU0VUX1BBR0VfVEFCTEVfUFJFU0VOVCgweDEpOworCQkJY29tbWFuZF9vcmItPm1pc2MgfD0gT1JCX1NFVF9ESVJFQ1RJT04ob3JiX2RpcmVjdGlvbik7CisKKwkJCS8qCisJCQkgKiBmaWxsIG91dCBvdXIgc2JwLTIgcGFnZSB0YWJsZXMgKGFuZCBzcGxpdCB1cAorCQkJICogdGhlIGxhcmdlIGJ1ZmZlcikKKwkJCSAqLworCQkJc2dfY291bnQgPSAwOworCQkJc2dfbGVuID0gc2NzaV9yZXF1ZXN0X2J1ZmZsZW47CisJCQlzZ19hZGRyID0gY29tbWFuZC0+Y21kX2RtYTsKKwkJCXdoaWxlIChzZ19sZW4pIHsKKwkJCQlzY2F0dGVyX2dhdGhlcl9lbGVtZW50W3NnX2NvdW50XS5zZWdtZW50X2Jhc2VfbG8gPSBzZ19hZGRyOworCQkJCWlmIChzZ19sZW4gPiBTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSCkgeworCQkJCQlzY2F0dGVyX2dhdGhlcl9lbGVtZW50W3NnX2NvdW50XS5sZW5ndGhfc2VnbWVudF9iYXNlX2hpID0KKwkJCQkJCVBBR0VfVEFCTEVfU0VUX1NFR01FTlRfTEVOR1RIKFNCUDJfTUFYX1NHX0VMRU1FTlRfTEVOR1RIKTsKKwkJCQkJc2dfYWRkciArPSBTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSDsKKwkJCQkJc2dfbGVuIC09IFNCUDJfTUFYX1NHX0VMRU1FTlRfTEVOR1RIOworCQkJCX0gZWxzZSB7CisJCQkJCXNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnRbc2dfY291bnRdLmxlbmd0aF9zZWdtZW50X2Jhc2VfaGkgPQorCQkJCQkJUEFHRV9UQUJMRV9TRVRfU0VHTUVOVF9MRU5HVEgoc2dfbGVuKTsKKwkJCQkJc2dfbGVuID0gMDsKKwkJCQl9CisJCQkJc2dfY291bnQrKzsKKwkJCX0KKworCQkJLyogTnVtYmVyIG9mIHBhZ2UgdGFibGUgKHMvZykgZWxlbWVudHMgKi8KKwkJCWNvbW1hbmRfb3JiLT5taXNjIHw9IE9SQl9TRVRfREFUQV9TSVpFKHNnX2NvdW50KTsKKworCQkJc2JwMnV0aWxfcGFja2V0X2R1bXAoc2NhdHRlcl9nYXRoZXJfZWxlbWVudCwKKwkJCQkJICAgICAoc2l6ZW9mKHN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlKSkgKiBzZ19jb3VudCwKKwkJCQkJICAgICAic2JwMiBzL2cgbGlzdCIsIGNvbW1hbmQtPnNnZV9kbWEpOworCisJCQkvKgorCQkJICogQnl0ZSBzd2FwIHBhZ2UgdGFibGVzIGlmIG5lY2Vzc2FyeQorCQkJICovCisJCQlzYnAydXRpbF9jcHVfdG9fYmUzMl9idWZmZXIoc2NhdHRlcl9nYXRoZXJfZWxlbWVudCwKKwkJCQkJCSAgICAoc2l6ZW9mKHN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlKSkgKgorCQkJCQkJICAgICBzZ19jb3VudCk7CisKKwkJfQorCisJfQorCisJLyoKKwkgKiBCeXRlIHN3YXAgY29tbWFuZCBPUkIgaWYgbmVjZXNzYXJ5CisJICovCisJc2JwMnV0aWxfY3B1X3RvX2JlMzJfYnVmZmVyKGNvbW1hbmRfb3JiLCBzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpKTsKKworCS8qCisJICogUHV0IG91ciBzY3NpIGNvbW1hbmQgaW4gdGhlIGNvbW1hbmQgT1JCCisJICovCisJbWVtc2V0KGNvbW1hbmRfb3JiLT5jZGIsIDAsIDEyKTsKKwltZW1jcHkoY29tbWFuZF9vcmItPmNkYiwgc2NzaV9jbWQsIENPTU1BTkRfU0laRSgqc2NzaV9jbWQpKTsKKworCXJldHVybigwKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIG9yZGVyIHRvIGJlZ2luIGEgcmVndWxhciBTQlAtMiBjb21tYW5kLgorICovCitzdGF0aWMgaW50IHNicDJfbGlua19vcmJfY29tbWFuZChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLAorCQkJCSBzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQpCit7CisJc3RydWN0IHNicDJzY3NpX2hvc3RfaW5mbyAqaGkgPSBzY3NpX2lkLT5oaTsKKwlzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiAqY29tbWFuZF9vcmIgPSAmY29tbWFuZC0+Y29tbWFuZF9vcmI7CisJc3RydWN0IG5vZGVfZW50cnkgKm5lID0gc2NzaV9pZC0+bmU7CisJdTY0IGFkZHI7CisKKwlvdXRzdGFuZGluZ19vcmJfaW5jcjsKKwlTQlAyX09SQl9ERUJVRygic2VuZGluZyBjb21tYW5kIG9yYiAlcCwgdG90YWwgb3JicyA9ICV4IiwKKwkJCWNvbW1hbmRfb3JiLCBnbG9iYWxfb3V0c3RhbmRpbmdfY29tbWFuZF9vcmJzKTsKKworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShoaS0+aG9zdC0+cGRldiwgY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpLAorCQkJCSAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShoaS0+aG9zdC0+cGRldiwgY29tbWFuZC0+c2dlX2RtYSwKKwkJCQkgICAgICAgc2l6ZW9mKGNvbW1hbmQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAorCQkJCSAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgcHJldmlvdXMgb3JicyB0byB1c2UKKwkgKi8KKwlpZiAoc2NzaV9pZC0+bGFzdF9vcmIgPT0gTlVMTCkgeworCQlxdWFkbGV0X3QgZGF0YVsyXTsKKworCQkvKgorCQkgKiBPaywgbGV0J3Mgd3JpdGUgdG8gdGhlIHRhcmdldCdzIG1hbmFnZW1lbnQgYWdlbnQgcmVnaXN0ZXIKKwkJICovCisJCWFkZHIgPSBzY3NpX2lkLT5zYnAyX2NvbW1hbmRfYmxvY2tfYWdlbnRfYWRkciArIFNCUDJfT1JCX1BPSU5URVJfT0ZGU0VUOworCQlkYXRhWzBdID0gT1JCX1NFVF9OT0RFX0lEKGhpLT5ob3N0LT5ub2RlX2lkKTsKKwkJZGF0YVsxXSA9IGNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYTsKKwkJc2JwMnV0aWxfY3B1X3RvX2JlMzJfYnVmZmVyKGRhdGEsIDgpOworCisJCVNCUDJfT1JCX0RFQlVHKCJ3cml0ZSBjb21tYW5kIGFnZW50LCBjb21tYW5kIG9yYiAlcCIsIGNvbW1hbmRfb3JiKTsKKworCQlpZiAoc2JwMnV0aWxfbm9kZV93cml0ZV9ub193YWl0KG5lLCBhZGRyLCBkYXRhLCA4KSA8IDApIHsKKwkJCVNCUDJfRVJSKCJzYnAydXRpbF9ub2RlX3dyaXRlX25vX3dhaXQgZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCVNCUDJfT1JCX0RFQlVHKCJ3cml0ZSBjb21tYW5kIGFnZW50IGNvbXBsZXRlIik7CisKKwkJc2NzaV9pZC0+bGFzdF9vcmIgPSBjb21tYW5kX29yYjsKKwkJc2NzaV9pZC0+bGFzdF9vcmJfZG1hID0gY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hOworCisJfSBlbHNlIHsKKwkJcXVhZGxldF90IGRhdGE7CisKKwkJLyoKKwkJICogV2UgaGF2ZSBhbiBvcmIgYWxyZWFkeSBzZW50IChtYXliZSBvciBtYXliZSBub3QKKwkJICogcHJvY2Vzc2VkKSB0aGF0IHdlIGNhbiBhcHBlbmQgdGhpcyBvcmIgdG8uIFNvIGRvIHNvLAorCQkgKiBhbmQgcmluZyB0aGUgZG9vcmJlbGwuIEhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsCisJCSAqIG1vZGlmeWluZyB0aGVzZSBuZXh0IG9yYiBwb2ludGVycywgYXMgdGhleSBhcmUgYWNjZXNzZWQKKwkJICogYm90aCBieSB0aGUgc2JwMiBkZXZpY2UgYW5kIHVzLgorCQkgKi8KKwkJc2NzaV9pZC0+bGFzdF9vcmItPm5leHRfT1JCX2xvID0KKwkJCWNwdV90b19iZTMyKGNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYSk7CisJCS8qIFRlbGxzIGhhcmR3YXJlIHRoYXQgdGhpcyBwb2ludGVyIGlzIHZhbGlkICovCisJCXNjc2lfaWQtPmxhc3Rfb3JiLT5uZXh0X09SQl9oaSA9IDB4MDsKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGhpLT5ob3N0LT5wZGV2LCBzY3NpX2lkLT5sYXN0X29yYl9kbWEsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpLAorCQkJCQkgICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKworCQkvKgorCQkgKiBSaW5nIHRoZSBkb29yYmVsbAorCQkgKi8KKwkJZGF0YSA9IGNwdV90b19iZTMyKGNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYSk7CisJCWFkZHIgPSBzY3NpX2lkLT5zYnAyX2NvbW1hbmRfYmxvY2tfYWdlbnRfYWRkciArIFNCUDJfRE9PUkJFTExfT0ZGU0VUOworCisJCVNCUDJfT1JCX0RFQlVHKCJyaW5nIGRvb3JiZWxsLCBjb21tYW5kIG9yYiAlcCIsIGNvbW1hbmRfb3JiKTsKKworCQlpZiAoc2JwMnV0aWxfbm9kZV93cml0ZV9ub193YWl0KG5lLCBhZGRyLCAmZGF0YSwgNCkgPCAwKSB7CisJCQlTQlAyX0VSUigic2JwMnV0aWxfbm9kZV93cml0ZV9ub193YWl0IGZhaWxlZCIpOworCQkJcmV0dXJuKC1FSU8pOworCQl9CisKKwkJc2NzaV9pZC0+bGFzdF9vcmIgPSBjb21tYW5kX29yYjsKKwkJc2NzaV9pZC0+bGFzdF9vcmJfZG1hID0gY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hOworCisJfQorICAgICAgIAlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBiZWdpbiBhIHJlZ3VsYXIgU0JQLTIgY29tbWFuZC4KKyAqLworc3RhdGljIGludCBzYnAyX3NlbmRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLAorCQkJICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKKwkJCSAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJdW5jaGFyICpjbWQgPSAodW5jaGFyICopIFNDcG50LT5jbW5kOworCXVuc2lnbmVkIGludCByZXF1ZXN0X2J1ZmZsZW4gPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY29tbWFuZDsKKworCVNCUDJfREVCVUcoInNicDJfc2VuZF9jb21tYW5kIik7CisjaWYgKENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHID49IDIpIHx8IGRlZmluZWQoQ09ORklHX0lFRUUxMzk0X1NCUDJfUEFDS0VUX0RVTVApCisJcHJpbnRrKCJbc2NzaSBjb21tYW5kXVxuICAgIik7CisJc2NzaV9wcmludF9jb21tYW5kKFNDcG50KTsKKyNlbmRpZgorCVNCUDJfREVCVUcoIlNDU0kgdHJhbnNmZXIgc2l6ZSA9ICV4IiwgcmVxdWVzdF9idWZmbGVuKTsKKwlTQlAyX0RFQlVHKCJTQ1NJIHMvZyBlbGVtZW50cyA9ICV4IiwgKHVuc2lnbmVkIGludClTQ3BudC0+dXNlX3NnKTsKKworCS8qCisJICogQWxsb2NhdGUgYSBjb21tYW5kIG9yYiBhbmQgcy9nIHN0cnVjdHVyZQorCSAqLworCWNvbW1hbmQgPSBzYnAydXRpbF9hbGxvY2F0ZV9jb21tYW5kX29yYihzY3NpX2lkLCBTQ3BudCwgZG9uZSk7CisJaWYgKCFjb21tYW5kKSB7CisJCXJldHVybigtRUlPKTsKKwl9CisKKwkvKgorCSAqIFRoZSBzY3NpIHN0YWNrIHNlbmRzIGRvd24gYSByZXF1ZXN0X2J1ZmZsZW4gd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlCisJICogbGVuZ3RoIGZpZWxkIGluIHRoZSBzY3NpIGNkYi4gVGhpcyBjYXVzZXMgc29tZSBzYnAyIGRldmljZXMgdG8KKwkgKiByZWplY3QgdGhpcyBpbnF1aXJ5IGNvbW1hbmQuIEZpeCB0aGUgcmVxdWVzdF9idWZmbGVuLgorCSAqLworCWlmICgqY21kID09IElOUVVJUlkpIHsKKwkJaWYgKGZvcmNlX2lucXVpcnlfaGFjayB8fCBzY3NpX2lkLT53b3JrYXJvdW5kcyAmIFNCUDJfQlJFQUtBR0VfSU5RVUlSWV9IQUNLKQorCQkJcmVxdWVzdF9idWZmbGVuID0gY21kWzRdID0gMHgyNDsKKwkJZWxzZQorCQkJcmVxdWVzdF9idWZmbGVuID0gY21kWzRdOworCX0KKworCS8qCisJICogTm93IGFjdHVhbGx5IGZpbGwgaW4gdGhlIGNvbWFtbmQgb3JiIGFuZCBzYnAyIHMvZyBsaXN0CisJICovCisJc2JwMl9jcmVhdGVfY29tbWFuZF9vcmIoc2NzaV9pZCwgY29tbWFuZCwgY21kLCBTQ3BudC0+dXNlX3NnLAorCQkJCXJlcXVlc3RfYnVmZmxlbiwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCVNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisJLyoKKwkgKiBVcGRhdGUgb3VyIGNkYiBpZiBuZWNlc3NhcnkgKHRvIGhhbmRsZSBzYnAyIFJCQyBjb21tYW5kIHNldAorCSAqIGRpZmZlcmVuY2VzKS4gVGhpcyBpcyB3aGVyZSB0aGUgY29tbWFuZCBzZXQgaGFja3MgZ28hICAgPSkKKwkgKi8KKwlzYnAyX2NoZWNrX3NicDJfY29tbWFuZChzY3NpX2lkLCBjb21tYW5kLT5jb21tYW5kX29yYi5jZGIpOworCisJc2JwMnV0aWxfcGFja2V0X2R1bXAoJmNvbW1hbmQtPmNvbW1hbmRfb3JiLCBzaXplb2Yoc3RydWN0IHNicDJfY29tbWFuZF9vcmIpLAorCQkJICAgICAic2JwMiBjb21tYW5kIG9yYiIsIGNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYSk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgc3RhdHVzIGZpZm8KKwkgKi8KKwltZW1zZXQoJnNjc2lfaWQtPnN0YXR1c19ibG9jaywgMCwgc2l6ZW9mKHN0cnVjdCBzYnAyX3N0YXR1c19ibG9jaykpOworCisJLyoKKwkgKiBMaW5rIHVwIHRoZSBvcmIsIGFuZCByaW5nIHRoZSBkb29yYmVsbCBpZiBuZWVkZWQKKwkgKi8KKwlzYnAyX2xpbmtfb3JiX2NvbW1hbmQoc2NzaV9pZCwgY29tbWFuZCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZGVhbHMgd2l0aCBjb21tYW5kIHNldCBkaWZmZXJlbmNlcyBiZXR3ZWVuIExpbnV4IHNjc2kKKyAqIGNvbW1hbmQgc2V0IGFuZCBzYnAyIFJCQyBjb21tYW5kIHNldC4KKyAqLworc3RhdGljIHZvaWQgc2JwMl9jaGVja19zYnAyX2NvbW1hbmQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwgdW5jaGFyICpjbWQpCit7CisJdW5jaGFyIG5ld19jbWRbMTZdOworCXU4IGRldmljZV90eXBlID0gU0JQMl9ERVZJQ0VfVFlQRSAoc2NzaV9pZC0+c2JwMl9kZXZpY2VfdHlwZV9hbmRfbHVuKTsKKworCVNCUDJfREVCVUcoInNicDJfY2hlY2tfc2JwMl9jb21tYW5kIik7CisKKwlzd2l0Y2ggKCpjbWQpIHsKKworCQljYXNlIFJFQURfNjoKKworCQkJaWYgKHNicDJfY29tbWFuZF9jb252ZXJzaW9uX2RldmljZV90eXBlKGRldmljZV90eXBlKSkgeworCisJCQkJU0JQMl9ERUJVRygiQ29udmVydCBSRUFEXzYgdG8gUkVBRF8xMCIpOworCisJCQkJLyoKKwkJCQkgKiBOZWVkIHRvIHR1cm4gcmVhZF82IGludG8gcmVhZF8xMAorCQkJCSAqLworCQkJCW5ld19jbWRbMF0gPSAweDI4OworCQkJCW5ld19jbWRbMV0gPSAoY21kWzFdICYgMHhlMCk7CisJCQkJbmV3X2NtZFsyXSA9IDB4MDsKKwkJCQluZXdfY21kWzNdID0gKGNtZFsxXSAmIDB4MWYpOworCQkJCW5ld19jbWRbNF0gPSBjbWRbMl07CisJCQkJbmV3X2NtZFs1XSA9IGNtZFszXTsKKwkJCQluZXdfY21kWzZdID0gMHgwOworCQkJCW5ld19jbWRbN10gPSAweDA7CisJCQkJbmV3X2NtZFs4XSA9IGNtZFs0XTsKKwkJCQluZXdfY21kWzldID0gY21kWzVdOworCisJCQkJbWVtY3B5KGNtZCwgbmV3X2NtZCwgMTApOworCisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgV1JJVEVfNjoKKworCQkJaWYgKHNicDJfY29tbWFuZF9jb252ZXJzaW9uX2RldmljZV90eXBlKGRldmljZV90eXBlKSkgeworCisJCQkJU0JQMl9ERUJVRygiQ29udmVydCBXUklURV82IHRvIFdSSVRFXzEwIik7CisKKwkJCQkvKgorCQkJCSAqIE5lZWQgdG8gdHVybiB3cml0ZV82IGludG8gd3JpdGVfMTAKKwkJCQkgKi8KKwkJCQluZXdfY21kWzBdID0gMHgyYTsKKwkJCQluZXdfY21kWzFdID0gKGNtZFsxXSAmIDB4ZTApOworCQkJCW5ld19jbWRbMl0gPSAweDA7CisJCQkJbmV3X2NtZFszXSA9IChjbWRbMV0gJiAweDFmKTsKKwkJCQluZXdfY21kWzRdID0gY21kWzJdOworCQkJCW5ld19jbWRbNV0gPSBjbWRbM107CisJCQkJbmV3X2NtZFs2XSA9IDB4MDsKKwkJCQluZXdfY21kWzddID0gMHgwOworCQkJCW5ld19jbWRbOF0gPSBjbWRbNF07CisJCQkJbmV3X2NtZFs5XSA9IGNtZFs1XTsKKworCQkJCW1lbWNweShjbWQsIG5ld19jbWQsIDEwKTsKKworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIE1PREVfU0VOU0U6CisKKwkJCWlmIChzYnAyX2NvbW1hbmRfY29udmVyc2lvbl9kZXZpY2VfdHlwZShkZXZpY2VfdHlwZSkpIHsKKworCQkJCVNCUDJfREVCVUcoIkNvbnZlcnQgTU9ERV9TRU5TRV82IHRvIE1PREVfU0VOU0VfMTAiKTsKKworCQkJCS8qCisJCQkJICogTmVlZCB0byB0dXJuIG1vZGVfc2Vuc2VfNiBpbnRvIG1vZGVfc2Vuc2VfMTAKKwkJCQkgKi8KKwkJCQluZXdfY21kWzBdID0gMHg1YTsKKwkJCQluZXdfY21kWzFdID0gY21kWzFdOworCQkJCW5ld19jbWRbMl0gPSBjbWRbMl07CisJCQkJbmV3X2NtZFszXSA9IDB4MDsKKwkJCQluZXdfY21kWzRdID0gMHgwOworCQkJCW5ld19jbWRbNV0gPSAweDA7CisJCQkJbmV3X2NtZFs2XSA9IDB4MDsKKwkJCQluZXdfY21kWzddID0gMHgwOworCQkJCW5ld19jbWRbOF0gPSBjbWRbNF07CisJCQkJbmV3X2NtZFs5XSA9IGNtZFs1XTsKKworCQkJCW1lbWNweShjbWQsIG5ld19jbWQsIDEwKTsKKworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIE1PREVfU0VMRUNUOgorCisJCQkvKgorCQkJICogVE9ETy4gUHJvYmFibHkgbmVlZCB0byBjaGFuZ2UgbW9kZSBzZWxlY3QgdG8gMTAgYnl0ZSB2ZXJzaW9uCisJCQkgKi8KKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogVHJhbnNsYXRlcyBTQlAtMiBzdGF0dXMgaW50byBTQ1NJIHNlbnNlIGRhdGEgZm9yIGNoZWNrIGNvbmRpdGlvbnMKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzYnAyX3N0YXR1c190b19zZW5zZV9kYXRhKHVuY2hhciAqc2JwMl9zdGF0dXMsIHVuY2hhciAqc2Vuc2VfZGF0YSkKK3sKKwlTQlAyX0RFQlVHKCJzYnAyX3N0YXR1c190b19zZW5zZV9kYXRhIik7CisKKwkvKgorCSAqIE9rLCBpdCdzIHByZXR0eSB1Z2x5Li4uICAgOy0pCisJICovCisJc2Vuc2VfZGF0YVswXSA9IDB4NzA7CisJc2Vuc2VfZGF0YVsxXSA9IDB4MDsKKwlzZW5zZV9kYXRhWzJdID0gc2JwMl9zdGF0dXNbOV07CisJc2Vuc2VfZGF0YVszXSA9IHNicDJfc3RhdHVzWzEyXTsKKwlzZW5zZV9kYXRhWzRdID0gc2JwMl9zdGF0dXNbMTNdOworCXNlbnNlX2RhdGFbNV0gPSBzYnAyX3N0YXR1c1sxNF07CisJc2Vuc2VfZGF0YVs2XSA9IHNicDJfc3RhdHVzWzE1XTsKKwlzZW5zZV9kYXRhWzddID0gMTA7CisJc2Vuc2VfZGF0YVs4XSA9IHNicDJfc3RhdHVzWzE2XTsKKwlzZW5zZV9kYXRhWzldID0gc2JwMl9zdGF0dXNbMTddOworCXNlbnNlX2RhdGFbMTBdID0gc2JwMl9zdGF0dXNbMThdOworCXNlbnNlX2RhdGFbMTFdID0gc2JwMl9zdGF0dXNbMTldOworCXNlbnNlX2RhdGFbMTJdID0gc2JwMl9zdGF0dXNbMTBdOworCXNlbnNlX2RhdGFbMTNdID0gc2JwMl9zdGF0dXNbMTFdOworCXNlbnNlX2RhdGFbMTRdID0gc2JwMl9zdGF0dXNbMjBdOworCXNlbnNlX2RhdGFbMTVdID0gc2JwMl9zdGF0dXNbMjFdOworCisJcmV0dXJuKHNicDJfc3RhdHVzWzhdICYgMHgzZik7CS8qIHJldHVybiBzY3NpIHN0YXR1cyAqLworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYSBjb21tYW5kIGlzIGNvbXBsZXRlZCwgaW4gb3JkZXIgdG8gZG8gYW55IG5lY2Vzc2FyeSBTQlAtMgorICogcmVzcG9uc2UgZGF0YSB0cmFuc2xhdGlvbnMgZm9yIHRoZSBTQ1NJIHN0YWNrCisgKi8KK3N0YXRpYyB2b2lkIHNicDJfY2hlY2tfc2JwMl9yZXNwb25zZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLCAKKwkJCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCXU4ICpzY3NpX2J1ZiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwl1OCBkZXZpY2VfdHlwZSA9IFNCUDJfREVWSUNFX1RZUEUgKHNjc2lfaWQtPnNicDJfZGV2aWNlX3R5cGVfYW5kX2x1bik7CisKKwlTQlAyX0RFQlVHKCJzYnAyX2NoZWNrX3NicDJfcmVzcG9uc2UiKTsKKworCXN3aXRjaCAoU0NwbnQtPmNtbmRbMF0pIHsKKworCQljYXNlIElOUVVJUlk6CisKKwkJCS8qCisJCQkgKiBJZiBzY3NpX2lkLT5zYnAyX2RldmljZV90eXBlX2FuZF9sdW4gaXMgdW5pbml0aWFsaXplZCwgdGhlbiBmaWxsIAorCQkJICogdGhpcyBpbmZvcm1hdGlvbiBpbiBmcm9tIHRoZSBpbnF1aXJ5IHJlc3BvbnNlIGRhdGEuIEx1biBpcyBzZXQgdG8gemVyby4KKwkJCSAqLworCQkJaWYgKHNjc2lfaWQtPnNicDJfZGV2aWNlX3R5cGVfYW5kX2x1biA9PSBTQlAyX0RFVklDRV9UWVBFX0xVTl9VTklOSVRJQUxJWkVEKSB7CisJCQkJU0JQMl9ERUJVRygiQ3JlYXRpbmcgc2JwMl9kZXZpY2VfdHlwZV9hbmRfbHVuIGZyb20gc2NzaSBpbnF1aXJ5IGRhdGEiKTsKKwkJCQlzY3NpX2lkLT5zYnAyX2RldmljZV90eXBlX2FuZF9sdW4gPSAoc2NzaV9idWZbMF0gJiAweDFmKSA8PCAxNjsKKwkJCX0KKworCQkJLyoKKwkJCSAqIE1ha2Ugc3VyZSBkYXRhIGxlbmd0aCBpcyBvay4gTWluaW11bSBsZW5ndGggaXMgMzYgYnl0ZXMKKwkJCSAqLworCQkJaWYgKHNjc2lfYnVmWzRdID09IDApIHsKKwkJCQlzY3NpX2J1Zls0XSA9IDM2IC0gNTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIENoZWNrIGZvciBTaW1wbGUgRGlyZWN0IEFjY2VzcyBEZXZpY2UgYW5kIGNoYW5nZSBpdCB0byBUWVBFX0RJU0sKKwkJCSAqLworCQkJaWYgKChzY3NpX2J1ZlswXSAmIDB4MWYpID09IFRZUEVfU0RBRCkgeworCQkJCVNCUDJfREVCVUcoIkNoYW5naW5nIFRZUEVfU0RBRCB0byBUWVBFX0RJU0siKTsKKwkJCQlzY3NpX2J1ZlswXSAmPSAweGUwOworCQkJfQorCisJCQkvKgorCQkJICogRml4IGFuc2kgcmV2aXNpb24gYW5kIHJlc3BvbnNlIGRhdGEgZm9ybWF0CisJCQkgKi8KKwkJCXNjc2lfYnVmWzJdIHw9IDI7CisJCQlzY3NpX2J1ZlszXSA9IChzY3NpX2J1ZlszXSAmIDB4ZjApIHwgMjsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBNT0RFX1NFTlNFOgorCisJCQlpZiAoc2JwMl9jb21tYW5kX2NvbnZlcnNpb25fZGV2aWNlX3R5cGUoZGV2aWNlX3R5cGUpKSB7CisKKwkJCQlTQlAyX0RFQlVHKCJNb2RpZnkgbW9kZSBzZW5zZSByZXNwb25zZSAoMTAgYnl0ZSB2ZXJzaW9uKSIpOworCisJCQkJc2NzaV9idWZbMF0gPSBzY3NpX2J1ZlsxXTsJLyogTW9kZSBkYXRhIGxlbmd0aCAqLworCQkJCXNjc2lfYnVmWzFdID0gc2NzaV9idWZbMl07CS8qIE1lZGl1bSB0eXBlICovCisJCQkJc2NzaV9idWZbMl0gPSBzY3NpX2J1ZlszXTsJLyogRGV2aWNlIHNwZWNpZmljIHBhcmFtZXRlciAqLworCQkJCXNjc2lfYnVmWzNdID0gc2NzaV9idWZbN107CS8qIEJsb2NrIGRlc2NyaXB0b3IgbGVuZ3RoICovCisJCQkJbWVtY3B5KHNjc2lfYnVmICsgNCwgc2NzaV9idWYgKyA4LCBzY3NpX2J1ZlswXSk7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgTU9ERV9TRUxFQ1Q6CisKKwkJCS8qCisJCQkgKiBUT0RPLiBQcm9iYWJseSBuZWVkIHRvIGNoYW5nZSBtb2RlIHNlbGVjdCB0byAxMCBieXRlIHZlcnNpb24KKwkJCSAqLworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBkZWFscyB3aXRoIHN0YXR1cyB3cml0ZXMgZnJvbSB0aGUgU0JQLTIgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc2JwMl9oYW5kbGVfc3RhdHVzX3dyaXRlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIGludCBkZXN0aWQsCisJCQkJICAgIHF1YWRsZXRfdCAqZGF0YSwgdTY0IGFkZHIsIHNpemVfdCBsZW5ndGgsIHUxNiBmbCkKK3sKKwlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaTsKKwlzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkID0gTlVMTCwgKnNjc2lfaWRfdG1wOworCXUzMiBpZDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCA9IE5VTEw7CisJdTMyIHNjc2lfc3RhdHVzID0gU0JQMl9TQ1NJX1NUQVRVU19HT09EOworCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY29tbWFuZDsKKworCVNCUDJfREVCVUcoInNicDJfaGFuZGxlX3N0YXR1c193cml0ZSIpOworCisJc2JwMnV0aWxfcGFja2V0X2R1bXAoZGF0YSwgbGVuZ3RoLCAic2JwMiBzdGF0dXMgd3JpdGUgYnkgZGV2aWNlIiwgKHUzMilhZGRyKTsKKworCWlmICghaG9zdCkgeworCQlTQlAyX0VSUigiaG9zdCBpcyBOVUxMIC0gdGhpcyBpcyBiYWQhIik7CisJCXJldHVybihSQ09ERV9BRERSRVNTX0VSUk9SKTsKKwl9CisKKwloaSA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZzYnAyX2hpZ2hsZXZlbCwgaG9zdCk7CisKKwlpZiAoIWhpKSB7CisJCVNCUDJfRVJSKCJob3N0IGluZm8gaXMgTlVMTCAtIHRoaXMgaXMgYmFkISIpOworCQlyZXR1cm4oUkNPREVfQUREUkVTU19FUlJPUik7CisJfQorCisJLyoKKwkgKiBGaW5kIG91ciBzY3NpX2lkIHN0cnVjdHVyZSBieSBsb29raW5nIGF0IHRoZSBzdGF0dXMgZmlmbyBhZGRyZXNzIHdyaXR0ZW4gdG8gYnkKKwkgKiB0aGUgc2JwMiBkZXZpY2UuCisJICovCisJaWQgPSBTQlAyX1NUQVRVU19GSUZPX09GRlNFVF9UT19FTlRSWSgodTMyKShhZGRyIC0gU0JQMl9TVEFUVVNfRklGT19BRERSRVNTKSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzY3NpX2lkX3RtcCwgJmhpLT5zY3NpX2lkcywgc2NzaV9saXN0KSB7CisJCWlmIChzY3NpX2lkX3RtcC0+bmUtPm5vZGVpZCA9PSBub2RlaWQgJiYgc2NzaV9pZF90bXAtPnVkLT5pZCA9PSBpZCkgeworCQkJc2NzaV9pZCA9IHNjc2lfaWRfdG1wOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXNjc2lfaWQpIHsKKwkJU0JQMl9FUlIoInNjc2lfaWQgaXMgTlVMTCAtIGRldmljZSBpcyBnb25lPyIpOworCQlyZXR1cm4oUkNPREVfQUREUkVTU19FUlJPUik7CisJfQorCisJLyoKKwkgKiBQdXQgcmVzcG9uc2UgaW50byBzY3NpX2lkIHN0YXR1cyBmaWZvLi4uCisJICovCisJbWVtY3B5KCZzY3NpX2lkLT5zdGF0dXNfYmxvY2ssIGRhdGEsIGxlbmd0aCk7CisKKwkvKgorCSAqIEJ5dGUgc3dhcCBmaXJzdCB0d28gcXVhZGxldHMgKDggYnl0ZXMpIG9mIHN0YXR1cyBmb3IgcHJvY2Vzc2luZworCSAqLworCXNicDJ1dGlsX2JlMzJfdG9fY3B1X2J1ZmZlcigmc2NzaV9pZC0+c3RhdHVzX2Jsb2NrLCA4KTsKKworCS8qCisJICogSGFuZGxlIGNvbW1hbmQgT1JCIHN0YXR1cyBoZXJlIGlmIG5lY2Vzc2FyeS4gRmlyc3QsIG5lZWQgdG8gbWF0Y2ggc3RhdHVzIHdpdGggY29tbWFuZC4KKwkgKi8KKwljb21tYW5kID0gc2JwMnV0aWxfZmluZF9jb21tYW5kX2Zvcl9vcmIoc2NzaV9pZCwgc2NzaV9pZC0+c3RhdHVzX2Jsb2NrLk9SQl9vZmZzZXRfbG8pOworCWlmIChjb21tYW5kKSB7CisKKwkJU0JQMl9ERUJVRygiRm91bmQgc3RhdHVzIGZvciBjb21tYW5kIE9SQiIpOworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaGktPmhvc3QtPnBkZXYsIGNvbW1hbmQtPmNvbW1hbmRfb3JiX2RtYSwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiksCisJCQkJCSAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaGktPmhvc3QtPnBkZXYsIGNvbW1hbmQtPnNnZV9kbWEsCisJCQkJCSAgICBzaXplb2YoY29tbWFuZC0+c2NhdHRlcl9nYXRoZXJfZWxlbWVudCksCisJCQkJCSAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCisJCVNCUDJfT1JCX0RFQlVHKCJtYXRjaGVkIGNvbW1hbmQgb3JiICVwIiwgJmNvbW1hbmQtPmNvbW1hbmRfb3JiKTsKKwkJb3V0c3RhbmRpbmdfb3JiX2RlY3I7CisKKwkJLyoKKwkJICogTWF0Y2hlZCBzdGF0dXMgd2l0aCBjb21tYW5kLCBub3cgZ3JhYiBzY3NpIGNvbW1hbmQgcG9pbnRlcnMgYW5kIGNoZWNrIHN0YXR1cworCQkgKi8KKwkJU0NwbnQgPSBjb21tYW5kLT5DdXJyZW50X1NDcG50OworCQlzYnAydXRpbF9tYXJrX2NvbW1hbmRfY29tcGxldGVkKHNjc2lfaWQsIGNvbW1hbmQpOworCisJCWlmIChTQ3BudCkgeworCisJCQkvKgorCQkJICogU2VlIGlmIHRoZSB0YXJnZXQgc3RvcmVkIGFueSBzY3NpIHN0YXR1cyBpbmZvcm1hdGlvbgorCQkJICovCisJCQlpZiAoU1RBVFVTX0dFVF9MRU5HVEgoc2NzaV9pZC0+c3RhdHVzX2Jsb2NrLk9SQl9vZmZzZXRfaGlfbWlzYykgPiAxKSB7CisJCQkJLyoKKwkJCQkgKiBUcmFuc2xhdGUgU0JQLTIgc3RhdHVzIHRvIFNDU0kgc2Vuc2UgZGF0YQorCQkJCSAqLworCQkJCVNCUDJfREVCVUcoIkNIRUNLIENPTkRJVElPTiIpOworCQkJCXNjc2lfc3RhdHVzID0gc2JwMl9zdGF0dXNfdG9fc2Vuc2VfZGF0YSgodW5jaGFyICopJnNjc2lfaWQtPnN0YXR1c19ibG9jaywgU0NwbnQtPnNlbnNlX2J1ZmZlcik7CisJCQl9CisKKwkJCS8qCisJCQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGRlYWQgYml0IGlzIHNldC4gSWYgc28sIHdlJ2xsIGhhdmUgdG8gaW5pdGlhdGUKKwkJCSAqIGEgZmV0Y2ggYWdlbnQgcmVzZXQuCisJCQkgKi8KKwkJCWlmIChTVEFUVVNfR0VUX0RFQURfQklUKHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2hpX21pc2MpKSB7CisKKwkJCQkvKgorCQkJCSAqIEluaXRpYXRlIGEgZmV0Y2ggYWdlbnQgcmVzZXQuCisJCQkJICovCisJCQkJU0JQMl9ERUJVRygiRGVhZCBiaXQgc2V0IC0gaW5pdGlhdGluZyBmZXRjaCBhZ2VudCByZXNldCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnAyX2FnZW50X3Jlc2V0KHNjc2lfaWQsIDApOworCQkJfQorCisJCQlTQlAyX09SQl9ERUJVRygiY29tcGxldGluZyBjb21tYW5kIG9yYiAlcCIsICZjb21tYW5kLT5jb21tYW5kX29yYik7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayBoZXJlIHRvIHNlZSBpZiB0aGVyZSBhcmUgbm8gY29tbWFuZHMgaW4tdXNlLiBJZiB0aGVyZSBhcmUgbm9uZSwgd2UgY2FuCisJCSAqIG51bGwgb3V0IGxhc3Qgb3JiIHNvIHRoYXQgbmV4dCB0aW1lIGFyb3VuZCB3ZSB3cml0ZSBkaXJlY3RseSB0byB0aGUgb3JiIHBvaW50ZXIuLi4KKwkJICogUXVpY2sgc3RhcnQgc2F2ZXMgb25lIDEzOTQgYnVzIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJaWYgKGxpc3RfZW1wdHkoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfaW51c2UpKSB7CisJCQlzY3NpX2lkLT5sYXN0X29yYiA9IE5VTEw7CisJCX0KKworCX0gZWxzZSB7CisKKwkJLyoKKwkJICogSXQncyBwcm9iYWJseSBhIGxvZ2luL2xvZ291dC9yZWNvbm5lY3Qgc3RhdHVzLgorCQkgKi8KKwkJaWYgKChzY3NpX2lkLT5sb2dpbl9vcmJfZG1hID09IHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2xvKSB8fAorCQkgICAgKHNjc2lfaWQtPnF1ZXJ5X2xvZ2luc19vcmJfZG1hID09IHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2xvKSB8fAorCQkgICAgKHNjc2lfaWQtPnJlY29ubmVjdF9vcmJfZG1hID09IHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2xvKSB8fAorCQkgICAgKHNjc2lfaWQtPmxvZ291dF9vcmJfZG1hID09IHNjc2lfaWQtPnN0YXR1c19ibG9jay5PUkJfb2Zmc2V0X2xvKSkgeworCQkJYXRvbWljX3NldCgmc2NzaV9pZC0+c2JwMl9sb2dpbl9jb21wbGV0ZSwgMSk7CisJCX0KKwl9CisKKwlpZiAoU0NwbnQpIHsKKworCQkvKiBDb21wbGV0ZSB0aGUgU0NTSSBjb21tYW5kLiAqLworCQlTQlAyX0RFQlVHKCJDb21wbGV0aW5nIFNDU0kgY29tbWFuZCIpOworCQlzYnAyc2NzaV9jb21wbGV0ZV9jb21tYW5kKHNjc2lfaWQsIHNjc2lfc3RhdHVzLCBTQ3BudCwKKwkJCQkJICBjb21tYW5kLT5DdXJyZW50X2RvbmUpOworCQlTQlAyX09SQl9ERUJVRygiY29tbWFuZCBvcmIgY29tcGxldGVkIik7CisJfQorCisJcmV0dXJuKFJDT0RFX0NPTVBMRVRFKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNDU0kgaW50ZXJmYWNlIHJlbGF0ZWQgc2VjdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyByb3V0aW5lIGlzIHRoZSBtYWluIHJlcXVlc3QgZW50cnkgcm91dGluZSBmb3IgZG9pbmcgSS9PLiBJdCBpcworICogY2FsbGVkIGZyb20gdGhlIHNjc2kgc3RhY2sgZGlyZWN0bHkuCisgKi8KK3N0YXRpYyBpbnQgc2JwMnNjc2lfcXVldWVjb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQkJCSB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkID0KKwkJKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaTsKKworCVNCUDJfREVCVUcoInNicDJzY3NpX3F1ZXVlY29tbWFuZCIpOworCisJLyoKKwkgKiBJZiBzY3NpX2lkIGlzIG51bGwsIGl0IG1lYW5zIHRoZXJlIGlzIG5vIGRldmljZSBpbiB0aGlzIHNsb3QsCisJICogc28gd2Ugc2hvdWxkIHJldHVybiBzZWxlY3Rpb24gdGltZW91dC4KKwkgKi8KKwlpZiAoIXNjc2lfaWQpIHsKKwkJU0NwbnQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlkb25lIChTQ3BudCk7CisJCXJldHVybiAwOworCX0KKworCWhpID0gc2NzaV9pZC0+aGk7CisKKwlpZiAoIWhpKSB7CisJCVNCUDJfRVJSKCJzYnAyc2NzaV9ob3N0X2luZm8gaXMgTlVMTCAtIHRoaXMgaXMgYmFkISIpOworCQlTQ3BudC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWRvbmUgKFNDcG50KTsKKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogVW50aWwgd2UgaGFuZGxlIG11bHRpcGxlIGx1bnMsIGp1c3QgcmV0dXJuIHNlbGVjdGlvbiB0aW1lLW91dAorCSAqIHRvIGFueSBJTyBkaXJlY3RlZCBhdCBub24temVybyBMVU5zCisJICovCisJaWYgKFNDcG50LT5kZXZpY2UtPmx1bikgeworCQlTQ3BudC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWRvbmUgKFNDcG50KTsKKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCwgYW5kIGhhbmRsZSBpdCBoZXJlCisJICogKGF1dG9yZXF1ZXN0IHNlbnNlKQorCSAqLworCWlmIChTQ3BudC0+Y21uZFswXSA9PSBSRVFVRVNUX1NFTlNFKSB7CisJCVNCUDJfREVCVUcoIlJFUVVFU1RfU0VOU0UiKTsKKwkJbWVtY3B5KFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwgU0NwbnQtPnNlbnNlX2J1ZmZlciwgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbik7CisJCW1lbXNldChTQ3BudC0+c2Vuc2VfYnVmZmVyLCAwLCBzaXplb2YoU0NwbnQtPnNlbnNlX2J1ZmZlcikpOworCQlzYnAyc2NzaV9jb21wbGV0ZV9jb21tYW5kKHNjc2lfaWQsIFNCUDJfU0NTSV9TVEFUVVNfR09PRCwgU0NwbnQsIGRvbmUpOworCQlyZXR1cm4oMCk7CisJfQorCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBidXMgcmVzZXQuCisJICovCisJaWYgKCFocHNiX25vZGVfZW50cnlfdmFsaWQoc2NzaV9pZC0+bmUpKSB7CisJCVNCUDJfRVJSKCJCdXMgcmVzZXQgaW4gcHJvZ3Jlc3MgLSByZWplY3RpbmcgY29tbWFuZCIpOworCQlTQ3BudC0+cmVzdWx0ID0gRElEX0JVU19CVVNZIDw8IDE2OworCQlkb25lIChTQ3BudCk7CisJCXJldHVybigwKTsKKwl9CisKKwkvKgorCSAqIFRyeSBhbmQgc2VuZCBvdXIgU0NTSSBjb21tYW5kCisJICovCisJaWYgKHNicDJfc2VuZF9jb21tYW5kKHNjc2lfaWQsIFNDcG50LCBkb25lKSkgeworCQlTQlAyX0VSUigiRXJyb3Igc2VuZGluZyBTQ1NJIGNvbW1hbmQiKTsKKwkJc2JwMnNjc2lfY29tcGxldGVfY29tbWFuZChzY3NpX2lkLCBTQlAyX1NDU0lfU1RBVFVTX1NFTEVDVElPTl9USU1FT1VULAorCQkJCQkgIFNDcG50LCBkb25lKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBjb21wbGV0ZSBhbGwgb3V0c3RhbmRpbmcgU0JQLTIKKyAqIGNvbW1hbmRzIChpbiBjYXNlIG9mIHJlc2V0cywgZXRjLikuCisgKi8KK3N0YXRpYyB2b2lkIHNicDJzY3NpX2NvbXBsZXRlX2FsbF9jb21tYW5kcyhzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLAorCQkJCQkgICB1MzIgc3RhdHVzKQoreworCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpID0gc2NzaV9pZC0+aGk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGg7CisJc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kOworCisJU0JQMl9ERUJVRygic2JwMnNjc2lfY29tcGxldGVfYWxsX2NvbW1hbmRzIik7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfaW51c2UpKSB7CisJCVNCUDJfREVCVUcoIkZvdW5kIHBlbmRpbmcgY29tbWFuZCB0byBjb21wbGV0ZSIpOworCQlsaCA9IHNjc2lfaWQtPnNicDJfY29tbWFuZF9vcmJfaW51c2UubmV4dDsKKwkJY29tbWFuZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbywgbGlzdCk7CisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShoaS0+aG9zdC0+cGRldiwgY29tbWFuZC0+Y29tbWFuZF9vcmJfZG1hLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKKwkJCQkJICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShoaS0+aG9zdC0+cGRldiwgY29tbWFuZC0+c2dlX2RtYSwKKwkJCQkJICAgIHNpemVvZihjb21tYW5kLT5zY2F0dGVyX2dhdGhlcl9lbGVtZW50KSwKKwkJCQkJICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCXNicDJ1dGlsX21hcmtfY29tbWFuZF9jb21wbGV0ZWQoc2NzaV9pZCwgY29tbWFuZCk7CisJCWlmIChjb21tYW5kLT5DdXJyZW50X1NDcG50KSB7CisJCQljb21tYW5kLT5DdXJyZW50X1NDcG50LT5yZXN1bHQgPSBzdGF0dXMgPDwgMTY7CisJCQljb21tYW5kLT5DdXJyZW50X2RvbmUoY29tbWFuZC0+Q3VycmVudF9TQ3BudCk7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBjb21wbGV0ZSBhIHJlZ3VsYXIgU0JQLTIgY29tbWFuZC4KKyAqCisgKiBUaGlzIGNhbiBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIHNicDJzY3NpX2NvbXBsZXRlX2NvbW1hbmQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwKKwkJCQkgICAgICB1MzIgc2NzaV9zdGF0dXMsIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAorCQkJCSAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlTQlAyX0RFQlVHKCJzYnAyc2NzaV9jb21wbGV0ZV9jb21tYW5kIik7CisKKwkvKgorCSAqIFNhbml0eQorCSAqLworCWlmICghU0NwbnQpIHsKKwkJU0JQMl9FUlIoIlNDcG50IGlzIE5VTEwiKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgYSBidXMgcmVzZXQgaXMgaW4gcHJvZ3Jlc3MgYW5kIHRoZXJlIHdhcyBhbiBlcnJvciwgZG9uJ3QKKwkgKiBjb21wbGV0ZSB0aGUgY29tbWFuZCwganVzdCBsZXQgaXQgZ2V0IHJldHJpZWQgYXQgdGhlIGVuZCBvZiB0aGUKKwkgKiBidXMgcmVzZXQuCisJICovCisJaWYgKCFocHNiX25vZGVfZW50cnlfdmFsaWQoc2NzaV9pZC0+bmUpICYmIChzY3NpX3N0YXR1cyAhPSBTQlAyX1NDU0lfU1RBVFVTX0dPT0QpKSB7CisJCVNCUDJfRVJSKCJCdXMgcmVzZXQgaW4gcHJvZ3Jlc3MgLSByZXRyeSBjb21tYW5kIGxhdGVyIik7CisJCXJldHVybjsKKwl9CisgCisJLyoKKwkgKiBTd2l0Y2ggb24gc2NzaSBzdGF0dXMKKwkgKi8KKwlzd2l0Y2ggKHNjc2lfc3RhdHVzKSB7CisJCWNhc2UgU0JQMl9TQ1NJX1NUQVRVU19HT09EOgorCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9PSzsKKwkJCWJyZWFrOworCisJCWNhc2UgU0JQMl9TQ1NJX1NUQVRVU19CVVNZOgorCQkJU0JQMl9FUlIoIlNCUDJfU0NTSV9TVEFUVVNfQlVTWSIpOworCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwkJCWJyZWFrOworCisJCWNhc2UgU0JQMl9TQ1NJX1NUQVRVU19DSEVDS19DT05ESVRJT046CisJCQlTQlAyX0RFQlVHKCJTQlAyX1NDU0lfU1RBVFVTX0NIRUNLX0NPTkRJVElPTiIpOworCQkJU0NwbnQtPnJlc3VsdCA9IENIRUNLX0NPTkRJVElPTiA8PCAxOworCisJCQkvKgorCQkJICogRGVidWcgc3R1ZmYKKwkJCSAqLworI2lmIENPTkZJR19JRUVFMTM5NF9TQlAyX0RFQlVHID49IDEKKwkJCXNjc2lfcHJpbnRfY29tbWFuZChTQ3BudCk7CisJCQlzY3NpX3ByaW50X3NlbnNlKCJiaCIsIFNDcG50KTsKKyNlbmRpZgorCisJCQlicmVhazsKKworCQljYXNlIFNCUDJfU0NTSV9TVEFUVVNfU0VMRUNUSU9OX1RJTUVPVVQ6CisJCQlTQlAyX0VSUigiU0JQMl9TQ1NJX1NUQVRVU19TRUxFQ1RJT05fVElNRU9VVCIpOworCQkJU0NwbnQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQkJc2NzaV9wcmludF9jb21tYW5kKFNDcG50KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0JQMl9TQ1NJX1NUQVRVU19DT05ESVRJT05fTUVUOgorCQljYXNlIFNCUDJfU0NTSV9TVEFUVVNfUkVTRVJWQVRJT05fQ09ORkxJQ1Q6CisJCWNhc2UgU0JQMl9TQ1NJX1NUQVRVU19DT01NQU5EX1RFUk1JTkFURUQ6CisJCQlTQlAyX0VSUigiQmFkIFNDU0kgc3RhdHVzID0gJXgiLCBzY3NpX3N0YXR1cyk7CisJCQlTQ3BudC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQkJc2NzaV9wcmludF9jb21tYW5kKFNDcG50KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlTQlAyX0VSUigiVW5zdXBwb3J0ZWQgU0NTSSBzdGF0dXMgPSAleCIsIHNjc2lfc3RhdHVzKTsKKwkJCVNDcG50LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJfQorCisJLyoKKwkgKiBUYWtlIGNhcmUgb2YgYW55IHNicDIgcmVzcG9uc2UgZGF0YSBtdWNraW5nIGhlcmUgKFJCQyBzdHVmZiwgZXRjLikKKwkgKi8KKwlpZiAoU0NwbnQtPnJlc3VsdCA9PSBESURfT0spIHsKKwkJc2JwMl9jaGVja19zYnAyX3Jlc3BvbnNlKHNjc2lfaWQsIFNDcG50KTsKKwl9CisKKwkvKgorCSAqIElmIGEgYnVzIHJlc2V0IGlzIGluIHByb2dyZXNzIGFuZCB0aGVyZSB3YXMgYW4gZXJyb3IsIGNvbXBsZXRlCisJICogdGhlIGNvbW1hbmQgYXMgYnVzeSBzbyB0aGF0IGl0IHdpbGwgZ2V0IHJldHJpZWQuCisJICovCisJaWYgKCFocHNiX25vZGVfZW50cnlfdmFsaWQoc2NzaV9pZC0+bmUpICYmIChzY3NpX3N0YXR1cyAhPSBTQlAyX1NDU0lfU1RBVFVTX0dPT0QpKSB7CisJCVNCUDJfRVJSKCJDb21wbGV0aW5nIGNvbW1hbmQgd2l0aCBidXN5IChidXMgcmVzZXQpIik7CisJCVNDcG50LT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CisJfQorCisJLyoKKwkgKiBJZiBhIHVuaXQgYXR0ZW50aW9uIG9jY3VycywgcmV0dXJuIGJ1c3kgc3RhdHVzIHNvIGl0IGdldHMKKwkgKiByZXRyaWVkLi4uIGl0IGNvdWxkIGhhdmUgaGFwcGVuZWQgYmVjYXVzZSBvZiBhIDEzOTQgYnVzIHJlc2V0CisJICogb3IgaG90LXBsdWcuLi4KKwkgKi8KKyNpZiAwCisJaWYgKChzY3NpX3N0YXR1cyA9PSBTQlAyX1NDU0lfU1RBVFVTX0NIRUNLX0NPTkRJVElPTikgJiYKKwkgICAgKFNDcG50LT5zZW5zZV9idWZmZXJbMl0gPT0gVU5JVF9BVFRFTlRJT04pKSB7CisJCVNCUDJfREVCVUcoIlVOSVQgQVRURU5USU9OIC0gcmV0dXJuIGJ1c3kiKTsKKwkJU0NwbnQtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKKwl9CisjZW5kaWYKKworCS8qCisJICogVGVsbCBzY3NpIHN0YWNrIHRoYXQgd2UncmUgZG9uZSB3aXRoIHRoaXMgY29tbWFuZAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKHNjc2lfaWQtPnNjc2lfaG9zdC0+aG9zdF9sb2NrLGZsYWdzKTsKKwlkb25lIChTQ3BudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzY3NpX2lkLT5zY3NpX2hvc3QtPmhvc3RfbG9jayxmbGFncyk7CisKKwlyZXR1cm47Cit9CisKKworc3RhdGljIGludCBzYnAyc2NzaV9zbGF2ZV9jb25maWd1cmUgKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlibGtfcXVldWVfZG1hX2FsaWdubWVudChzZGV2LT5yZXF1ZXN0X3F1ZXVlLCAoNTEyIC0gMSkpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENhbGxlZCBieSBzY3NpIHN0YWNrIHdoZW4gc29tZXRoaW5nIGhhcyByZWFsbHkgZ29uZSB3cm9uZy4gIFVzdWFsbHkKKyAqIGNhbGxlZCB3aGVuIGEgY29tbWFuZCBoYXMgdGltZWQtb3V0IGZvciBzb21lIHJlYXNvbi4KKyAqLworc3RhdGljIGludCBzYnAyc2NzaV9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkID0KKwkJKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKKwlzdHJ1Y3Qgc2JwMnNjc2lfaG9zdF9pbmZvICpoaSA9IHNjc2lfaWQtPmhpOworCXN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqY29tbWFuZDsKKworCVNCUDJfRVJSKCJhYm9ydGluZyBzYnAyIGNvbW1hbmQiKTsKKwlzY3NpX3ByaW50X2NvbW1hbmQoU0NwbnQpOworCisJaWYgKHNjc2lfaWQpIHsKKworCQkvKgorCQkgKiBSaWdodCBub3csIGp1c3QgcmV0dXJuIGFueSBtYXRjaGluZyBjb21tYW5kIHN0cnVjdHVyZXMKKwkJICogdG8gdGhlIGZyZWUgcG9vbC4KKwkJICovCisJCWNvbW1hbmQgPSBzYnAydXRpbF9maW5kX2NvbW1hbmRfZm9yX1NDcG50KHNjc2lfaWQsIFNDcG50KTsKKwkJaWYgKGNvbW1hbmQpIHsKKwkJCVNCUDJfREVCVUcoIkZvdW5kIGNvbW1hbmQgdG8gYWJvcnQiKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShoaS0+aG9zdC0+cGRldiwKKwkJCQkJCSAgICBjb21tYW5kLT5jb21tYW5kX29yYl9kbWEsCisJCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzYnAyX2NvbW1hbmRfb3JiKSwKKwkJCQkJCSAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGhpLT5ob3N0LT5wZGV2LAorCQkJCQkJICAgIGNvbW1hbmQtPnNnZV9kbWEsCisJCQkJCQkgICAgc2l6ZW9mKGNvbW1hbmQtPnNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnQpLAorCQkJCQkJICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCQlzYnAydXRpbF9tYXJrX2NvbW1hbmRfY29tcGxldGVkKHNjc2lfaWQsIGNvbW1hbmQpOworCQkJaWYgKGNvbW1hbmQtPkN1cnJlbnRfU0NwbnQpIHsKKwkJCQljb21tYW5kLT5DdXJyZW50X1NDcG50LT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQkJY29tbWFuZC0+Q3VycmVudF9kb25lKGNvbW1hbmQtPkN1cnJlbnRfU0NwbnQpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogSW5pdGlhdGUgYSBmZXRjaCBhZ2VudCByZXNldC4KKwkJICovCisJCXNicDJfYWdlbnRfcmVzZXQoc2NzaV9pZCwgMCk7CisJCXNicDJzY3NpX2NvbXBsZXRlX2FsbF9jb21tYW5kcyhzY3NpX2lkLCBESURfQlVTX0JVU1kpOworCX0KKworCXJldHVybihTVUNDRVNTKTsKK30KKworLyoKKyAqIENhbGxlZCBieSBzY3NpIHN0YWNrIHdoZW4gc29tZXRoaW5nIGhhcyByZWFsbHkgZ29uZSB3cm9uZy4KKyAqLworc3RhdGljIGludCBzYnAyc2NzaV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCkKK3sKKwlzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkID0KKwkJKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKilTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YVswXTsKKworCVNCUDJfRVJSKCJyZXNldCByZXF1ZXN0ZWQiKTsKKworCWlmIChzY3NpX2lkKSB7CisJCVNCUDJfRVJSKCJHZW5lcmF0aW5nIHNicDIgZmV0Y2ggYWdlbnQgcmVzZXQiKTsKKwkJc2JwMl9hZ2VudF9yZXNldChzY3NpX2lkLCAwKTsKKwl9CisKKwlyZXR1cm4oU1VDQ0VTUyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzYnAyc2NzaV9pbmZvIChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworICAgICAgICByZXR1cm4gIlNDU0kgZW11bGF0aW9uIGZvciBJRUVFLTEzOTQgU0JQLTIgRGV2aWNlcyI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNicDJfc3lzZnNfaWVlZTEzOTRfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisJc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZDsKKwlpbnQgbHVuOworCisJaWYgKCEoc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldikpKQorCQlyZXR1cm4gMDsKKworCWlmICghKHNjc2lfaWQgPSAoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqKXNkZXYtPmhvc3QtPmhvc3RkYXRhWzBdKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2NzaV9pZC0+c2JwMl9kZXZpY2VfdHlwZV9hbmRfbHVuID09IFNCUDJfREVWSUNFX1RZUEVfTFVOX1VOSU5JVElBTElaRUQpCisJCWx1biA9IDA7CisJZWxzZQorCQlsdW4gPSBPUkJfU0VUX0xVTihzY3NpX2lkLT5zYnAyX2RldmljZV90eXBlX2FuZF9sdW4pOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJTAxNkx4OiVkOiVkXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXNjc2lfaWQtPm5lLT5ndWlkLAorCQkgICAgICAgc2NzaV9pZC0+dWQtPmlkLCBsdW4pOworfQorc3RhdGljIERFVklDRV9BVFRSKGllZWUxMzk0X2lkLCBTX0lSVUdPLCBzYnAyX3N5c2ZzX2llZWUxMzk0X2lkX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnNicDJfc3lzZnNfc2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9pZWVlMTM5NF9pZCwKKwlOVUxMCit9OworCitNT0RVTEVfQVVUSE9SKCJCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSUVFRS0xMzk0IFNCUC0yIHByb3RvY29sIGRyaXZlciIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoU0JQMl9ERVZJQ0VfTkFNRSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFNDU0kgaG9zdCB0ZW1wbGF0ZSAqLworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgc2NzaV9kcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZSA9CQkJVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJCQkiU0JQLTIgSUVFRS0xMzk0IiwKKwkucHJvY19uYW1lID0JCQlTQlAyX0RFVklDRV9OQU1FLAorCS5pbmZvID0JCQkJc2JwMnNjc2lfaW5mbywKKwkucXVldWVjb21tYW5kID0JCQlzYnAyc2NzaV9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIgPQkJc2JwMnNjc2lfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0Jc2JwMnNjc2lfcmVzZXQsCisJLmVoX2J1c19yZXNldF9oYW5kbGVyID0JCXNicDJzY3NpX3Jlc2V0LAorCS5laF9ob3N0X3Jlc2V0X2hhbmRsZXIgPQlzYnAyc2NzaV9yZXNldCwKKwkuc2xhdmVfY29uZmlndXJlID0JCXNicDJzY3NpX3NsYXZlX2NvbmZpZ3VyZSwKKwkudGhpc19pZCA9CQkJLTEsCisJLnNnX3RhYmxlc2l6ZSA9CQkJU0dfQUxMLAorCS51c2VfY2x1c3RlcmluZyA9CQlFTkFCTEVfQ0xVU1RFUklORywKKwkuY21kX3Blcl9sdW4gPQkJCVNCUDJfTUFYX0NNRFMsCisJLmNhbl9xdWV1ZSA9IAkJCVNCUDJfTUFYX0NNRFMsCisJLmVtdWxhdGVkID0JCQkxLAorCS5zZGV2X2F0dHJzID0JCQlzYnAyX3N5c2ZzX3NkZXZfYXR0cnMsCit9OworCitzdGF0aWMgaW50IHNicDJfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJU0JQMl9ERUJVRygic2JwMl9tb2R1bGVfaW5pdCIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAic2JwMjogJXNcbiIsIHZlcnNpb24pOworCisJLyogTW9kdWxlIGxvYWQgZGVidWcgb3B0aW9uIHRvIGZvcmNlIG9uZSBjb21tYW5kIGF0IGEgdGltZSAoc2VyaWFsaXppbmcgSS9PKSAqLworCWlmIChzZXJpYWxpemVfaW8pIHsKKwkJU0JQMl9FUlIoIkRyaXZlciBmb3JjZWQgdG8gc2VyaWFsaXplIEkvTyAoc2VyaWFsaXplX2lvID0gMSkiKTsKKwkJc2NzaV9kcml2ZXJfdGVtcGxhdGUuY2FuX3F1ZXVlID0gMTsKKwkJc2NzaV9kcml2ZXJfdGVtcGxhdGUuY21kX3Blcl9sdW4gPSAxOworCX0KKworCS8qIFNldCBtYXggc2VjdG9ycyAobW9kdWxlIGxvYWQgb3B0aW9uKS4gRGVmYXVsdCBpcyAyNTUgc2VjdG9ycy4gKi8KKwlzY3NpX2RyaXZlcl90ZW1wbGF0ZS5tYXhfc2VjdG9ycyA9IG1heF9zZWN0b3JzOworCisKKwkvKiBSZWdpc3RlciBvdXIgaGlnaCBsZXZlbCBkcml2ZXIgd2l0aCAxMzk0IHN0YWNrICovCisJaHBzYl9yZWdpc3Rlcl9oaWdobGV2ZWwoJnNicDJfaGlnaGxldmVsKTsKKworCXJldCA9IGhwc2JfcmVnaXN0ZXJfcHJvdG9jb2woJnNicDJfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCVNCUDJfRVJSKCJGYWlsZWQgdG8gcmVnaXN0ZXIgcHJvdG9jb2wiKTsKKwkJaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbCgmc2JwMl9oaWdobGV2ZWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2JwMl9tb2R1bGVfZXhpdCh2b2lkKQoreworCVNCUDJfREVCVUcoInNicDJfbW9kdWxlX2V4aXQiKTsKKworCWhwc2JfdW5yZWdpc3Rlcl9wcm90b2NvbCgmc2JwMl9kcml2ZXIpOworCisJaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbCgmc2JwMl9oaWdobGV2ZWwpOworfQorCittb2R1bGVfaW5pdChzYnAyX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHNicDJfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmggYi9kcml2ZXJzL2llZWUxMzk0L3NicDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODRiMDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmgKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBzYnAyLmggLSBEZWZpbmVzIGFuZCBwcm90b3R5cGVzIGZvciBzYnAyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgSmFtZXMgR29vZHdpbiwgRmlsYW5ldCBDb3Jwb3JhdGlvbiAod3d3LmZpbGFuZXQuY29tKQorICogamFtZXNnQGZpbGFuZXQuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIFNCUDJfSAorI2RlZmluZSBTQlAyX0gKKworI2RlZmluZSBTQlAyX0RFVklDRV9OQU1FCQkic2JwMiIKKworLyoKKyAqIFNCUDIgc3BlY2lmaWMgc3RydWN0dXJlcyBhbmQgZGVmaW5lcworICovCisKKyNkZWZpbmUgT1JCX0RJUkVDVElPTl9XUklURV9UT19NRURJQSAgICAweDAKKyNkZWZpbmUgT1JCX0RJUkVDVElPTl9SRUFEX0ZST01fTUVESUEgICAweDEKKyNkZWZpbmUgT1JCX0RJUkVDVElPTl9OT19EQVRBX1RSQU5TRkVSICAweDIKKworI2RlZmluZSBPUkJfU0VUX05VTExfUFRSKHZhbHVlKQkJCSgodmFsdWUgJiAweDEpIDw8IDMxKQorI2RlZmluZSBPUkJfU0VUX05PVElGWSh2YWx1ZSkgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSAmIDB4MSkgPDwgMzEpCisjZGVmaW5lIE9SQl9TRVRfUlFfRk1UKHZhbHVlKSAgICAgICAgICAgICAgICAgICAoKHZhbHVlICYgMHgzKSA8PCAyOSkJLyogdW51c2VkID8gKi8KKyNkZWZpbmUgT1JCX1NFVF9OT0RFX0lEKHZhbHVlKQkJCSgodmFsdWUgJiAweGZmZmYpIDw8IDE2KQorI2RlZmluZSBPUkJfU0VUX0RBVEFfU0laRSh2YWx1ZSkgICAgICAgICAgICAgICAgKHZhbHVlICYgMHhmZmZmKQorI2RlZmluZSBPUkJfU0VUX1BBR0VfU0laRSh2YWx1ZSkgICAgICAgICAgICAgICAgKCh2YWx1ZSAmIDB4NykgPDwgMTYpCisjZGVmaW5lIE9SQl9TRVRfUEFHRV9UQUJMRV9QUkVTRU5UKHZhbHVlKSAgICAgICAoKHZhbHVlICYgMHgxKSA8PCAxOSkKKyNkZWZpbmUgT1JCX1NFVF9NQVhfUEFZTE9BRCh2YWx1ZSkgICAgICAgICAgICAgICgodmFsdWUgJiAweGYpIDw8IDIwKQorI2RlZmluZSBPUkJfU0VUX1NQRUVEKHZhbHVlKSAgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSAmIDB4NykgPDwgMjQpCisjZGVmaW5lIE9SQl9TRVRfRElSRUNUSU9OKHZhbHVlKSAgICAgICAgICAgICAgICAoKHZhbHVlICYgMHgxKSA8PCAyNykKKworc3RydWN0IHNicDJfY29tbWFuZF9vcmIgeworCXZvbGF0aWxlIHUzMiBuZXh0X09SQl9oaTsKKwl2b2xhdGlsZSB1MzIgbmV4dF9PUkJfbG87CisJdTMyIGRhdGFfZGVzY3JpcHRvcl9oaTsKKwl1MzIgZGF0YV9kZXNjcmlwdG9yX2xvOworCXUzMiBtaXNjOworCXU4IGNkYlsxMl07Cit9OworCisjZGVmaW5lIFNCUDJfTE9HSU5fUkVRVUVTVAkJMHgwCisjZGVmaW5lIFNCUDJfUVVFUllfTE9HSU5TX1JFUVVFU1QJMHgxCisjZGVmaW5lIFNCUDJfUkVDT05ORUNUX1JFUVVFU1QJCTB4MworI2RlZmluZSBTQlAyX1NFVF9QQVNTV09SRF9SRVFVRVNUCTB4NAorI2RlZmluZSBTQlAyX0xPR09VVF9SRVFVRVNUCQkweDcKKyNkZWZpbmUgU0JQMl9BQk9SVF9UQVNLX1JFUVVFU1QJCTB4YgorI2RlZmluZSBTQlAyX0FCT1JUX1RBU0tfU0VUCQkweGMKKyNkZWZpbmUgU0JQMl9MT0dJQ0FMX1VOSVRfUkVTRVQJCTB4ZQorI2RlZmluZSBTQlAyX1RBUkdFVF9SRVNFVF9SRVFVRVNUCTB4ZgorCisjZGVmaW5lIE9SQl9TRVRfTFVOKHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgJiAweGZmZmYpCisjZGVmaW5lIE9SQl9TRVRfRlVOQ1RJT04odmFsdWUpICAgICAgICAgICAgICAgICAoKHZhbHVlICYgMHhmKSA8PCAxNikKKyNkZWZpbmUgT1JCX1NFVF9SRUNPTk5FQ1QodmFsdWUpICAgICAgICAgICAgICAgICgodmFsdWUgJiAweGYpIDw8IDIwKQorI2RlZmluZSBPUkJfU0VUX0VYQ0xVU0lWRSh2YWx1ZSkgICAgICAgICAgICAgICAgKCh2YWx1ZSAmIDB4MSkgPDwgMjgpCisjZGVmaW5lIE9SQl9TRVRfTE9HSU5fUkVTUF9MRU5HVEgodmFsdWUpICAgICAgICAodmFsdWUgJiAweGZmZmYpCisjZGVmaW5lIE9SQl9TRVRfUEFTU1dEX0xFTkdUSCh2YWx1ZSkgICAgICAgICAgICAoKHZhbHVlICYgMHhmZmZmKSA8PCAxNikKKworc3RydWN0IHNicDJfbG9naW5fb3JiIHsKKwl1MzIgcGFzc3dvcmRfaGk7CisJdTMyIHBhc3N3b3JkX2xvOworCXUzMiBsb2dpbl9yZXNwb25zZV9oaTsKKwl1MzIgbG9naW5fcmVzcG9uc2VfbG87CisJdTMyIGx1bl9taXNjOworCXUzMiBwYXNzd2RfcmVzcF9sZW5ndGhzOworCXUzMiBzdGF0dXNfRklGT19oaTsKKwl1MzIgc3RhdHVzX0ZJRk9fbG87Cit9OworCisjZGVmaW5lIFJFU1BPTlNFX0dFVF9MT0dJTl9JRCh2YWx1ZSkgICAgICAgICAgICAodmFsdWUgJiAweGZmZmYpCisjZGVmaW5lIFJFU1BPTlNFX0dFVF9MRU5HVEgodmFsdWUpICAgICAgICAgICAgICAoKHZhbHVlID4+IDE2KSAmIDB4ZmZmZikKKyNkZWZpbmUgUkVTUE9OU0VfR0VUX1JFQ09OTkVDVF9IT0xEKHZhbHVlKSAgICAgICh2YWx1ZSAmIDB4ZmZmZikKKworc3RydWN0IHNicDJfbG9naW5fcmVzcG9uc2UgeworCXUzMiBsZW5ndGhfbG9naW5fSUQ7CisJdTMyIGNvbW1hbmRfYmxvY2tfYWdlbnRfaGk7CisJdTMyIGNvbW1hbmRfYmxvY2tfYWdlbnRfbG87CisJdTMyIHJlY29ubmVjdF9ob2xkOworfTsKKworI2RlZmluZSBPUkJfU0VUX0xPR0lOX0lEKHZhbHVlKSAgICAgICAgICAgICAgICAgKHZhbHVlICYgMHhmZmZmKQorCisjZGVmaW5lIE9SQl9TRVRfUVVFUllfTE9HSU5TX1JFU1BfTEVOR1RIKHZhbHVlKSAodmFsdWUgJiAweGZmZmYpCisKK3N0cnVjdCBzYnAyX3F1ZXJ5X2xvZ2luc19vcmIgeworCXUzMiByZXNlcnZlZDE7CisJdTMyIHJlc2VydmVkMjsKKwl1MzIgcXVlcnlfcmVzcG9uc2VfaGk7CisJdTMyIHF1ZXJ5X3Jlc3BvbnNlX2xvOworCXUzMiBsdW5fbWlzYzsKKwl1MzIgcmVzZXJ2ZWRfcmVzcF9sZW5ndGg7CisJdTMyIHN0YXR1c19GSUZPX2hpOworCXUzMiBzdGF0dXNfRklGT19sbzsKK307CisKKyNkZWZpbmUgUkVTUE9OU0VfR0VUX01BWF9MT0dJTlModmFsdWUpICAgICAgICAgICh2YWx1ZSAmIDB4ZmZmZikKKyNkZWZpbmUgUkVTUE9OU0VfR0VUX0FDVElWRV9MT0dJTlModmFsdWUpICAgICAgICgoUkVTUE9OU0VfR0VUX0xFTkdUSCh2YWx1ZSkgLSA0KSAvIDEyKQorCitzdHJ1Y3Qgc2JwMl9xdWVyeV9sb2dpbnNfcmVzcG9uc2UgeworCXUzMiBsZW5ndGhfbWF4X2xvZ2luczsKKwl1MzIgbWlzY19JRHM7CisJdTMyIGluaXRpYXRvcl9taXNjX2hpOworCXUzMiBpbml0aWF0b3JfbWlzY19sbzsKK307CisKK3N0cnVjdCBzYnAyX3JlY29ubmVjdF9vcmIgeworCXUzMiByZXNlcnZlZDE7CisJdTMyIHJlc2VydmVkMjsKKyAgICAgICAgdTMyIHJlc2VydmVkMzsKKyAgICAgICAgdTMyIHJlc2VydmVkNDsKKwl1MzIgbG9naW5fSURfbWlzYzsKKwl1MzIgcmVzZXJ2ZWQ1OworCXUzMiBzdGF0dXNfRklGT19oaTsKKwl1MzIgc3RhdHVzX0ZJRk9fbG87Cit9OworCitzdHJ1Y3Qgc2JwMl9sb2dvdXRfb3JiIHsKKwl1MzIgcmVzZXJ2ZWQxOworCXUzMiByZXNlcnZlZDI7CisgICAgICAgIHUzMiByZXNlcnZlZDM7CisgICAgICAgIHUzMiByZXNlcnZlZDQ7CisJdTMyIGxvZ2luX0lEX21pc2M7CisJdTMyIHJlc2VydmVkNTsKKwl1MzIgc3RhdHVzX0ZJRk9faGk7CisJdTMyIHN0YXR1c19GSUZPX2xvOworfTsKKworI2RlZmluZSBQQUdFX1RBQkxFX1NFVF9TRUdNRU5UX0JBU0VfSEkodmFsdWUpICAgKHZhbHVlICYgMHhmZmZmKQorI2RlZmluZSBQQUdFX1RBQkxFX1NFVF9TRUdNRU5UX0xFTkdUSCh2YWx1ZSkgICAgKCh2YWx1ZSAmIDB4ZmZmZikgPDwgMTYpCisKK3N0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlIHsKKwl1MzIgbGVuZ3RoX3NlZ21lbnRfYmFzZV9oaTsKKwl1MzIgc2VnbWVudF9iYXNlX2xvOworfTsKKworI2RlZmluZSBSRVNQX1NUQVRVU19SRVFVRVNUX0NPTVBMRVRFCQkweDAKKyNkZWZpbmUgUkVTUF9TVEFUVVNfVFJBTlNQT1JUX0ZBSUxVUkUJCTB4MQorI2RlZmluZSBSRVNQX1NUQVRVU19JTExFR0FMX1JFUVVFU1QJCTB4MgorI2RlZmluZSBSRVNQX1NUQVRVU19WRU5ET1JfREVQRU5ERU5UCQkweDMKKworI2RlZmluZSBTQlAyX1NUQVRVU19OT19BRERJVElPTkFMX0lORk8JCTB4MAorI2RlZmluZSBTQlAyX1NUQVRVU19SRVFfVFlQRV9OT1RfU1VQUE9SVEVECTB4MQorI2RlZmluZSBTQlAyX1NUQVRVU19TUEVFRF9OT1RfU1VQUE9SVEVECQkweDIKKyNkZWZpbmUgU0JQMl9TVEFUVVNfUEFHRV9TSVpFX05PVF9TVVBQT1JURUQJMHgzCisjZGVmaW5lIFNCUDJfU1RBVFVTX0FDQ0VTU19ERU5JRUQJCTB4NAorI2RlZmluZSBTQlAyX1NUQVRVU19MVV9OT1RfU1VQUE9SVEVECQkweDUKKyNkZWZpbmUgU0JQMl9TVEFUVVNfTUFYX1BBWUxPQURfVE9PX1NNQUxMCTB4NgorI2RlZmluZSBTQlAyX1NUQVRVU19SRVNPVVJDRVNfVU5BVkFJTEFCTEUJMHg4CisjZGVmaW5lIFNCUDJfU1RBVFVTX0ZVTkNUSU9OX1JFSkVDVEVECQkweDkKKyNkZWZpbmUgU0JQMl9TVEFUVVNfTE9HSU5fSURfTk9UX1JFQ09HTklaRUQJMHhhCisjZGVmaW5lIFNCUDJfU1RBVFVTX0RVTU1ZX09SQl9DT01QTEVURUQJCTB4YgorI2RlZmluZSBTQlAyX1NUQVRVU19SRVFVRVNUX0FCT1JURUQJCTB4YworI2RlZmluZSBTQlAyX1NUQVRVU19VTlNQRUNJRklFRF9FUlJPUgkJMHhmZgorCisjZGVmaW5lIFNGTVRfQ1VSUkVOVF9FUlJPUgkJCTB4MAorI2RlZmluZSBTRk1UX0RFRkVSUkVEX0VSUk9SCQkJMHgxCisjZGVmaW5lIFNGTVRfVkVORE9SX0RFUEVOREVOVF9TVEFUVVMJCTB4MworCisjZGVmaW5lIFNCUDJfU0NTSV9TVEFUVVNfR09PRAkJCTB4MAorI2RlZmluZSBTQlAyX1NDU0lfU1RBVFVTX0NIRUNLX0NPTkRJVElPTgkweDIKKyNkZWZpbmUgU0JQMl9TQ1NJX1NUQVRVU19DT05ESVRJT05fTUVUCQkweDQKKyNkZWZpbmUgU0JQMl9TQ1NJX1NUQVRVU19CVVNZCQkJMHg4CisjZGVmaW5lIFNCUDJfU0NTSV9TVEFUVVNfUkVTRVJWQVRJT05fQ09ORkxJQ1QJMHgxOAorI2RlZmluZSBTQlAyX1NDU0lfU1RBVFVTX0NPTU1BTkRfVEVSTUlOQVRFRAkweDIyCisKKyNkZWZpbmUgU0JQMl9TQ1NJX1NUQVRVU19TRUxFQ1RJT05fVElNRU9VVAkweGZmCisKKyNkZWZpbmUgU1RBVFVTX0dFVF9PUkJfT0ZGU0VUX0hJKHZhbHVlKSAgICAgICAgICh2YWx1ZSAmIDB4ZmZmZikKKyNkZWZpbmUgU1RBVFVTX0dFVF9TQlBfU1RBVFVTKHZhbHVlKSAgICAgICAgICAgICgodmFsdWUgPj4gMTYpICYgMHhmZikKKyNkZWZpbmUgU1RBVFVTX0dFVF9MRU5HVEgodmFsdWUpICAgICAgICAgICAgICAgICgodmFsdWUgPj4gMjQpICYgMHg3KQorI2RlZmluZSBTVEFUVVNfR0VUX0RFQURfQklUKHZhbHVlKSAgICAgICAgICAgICAgKCh2YWx1ZSA+PiAyNykgJiAweDEpCisjZGVmaW5lIFNUQVRVU19HRVRfUkVTUCh2YWx1ZSkgICAgICAgICAgICAgICAgICAoKHZhbHVlID4+IDI4KSAmIDB4MykKKyNkZWZpbmUgU1RBVFVTX0dFVF9TUkModmFsdWUpICAgICAgICAgICAgICAgICAgICgodmFsdWUgPj4gMzApICYgMHgzKQorCitzdHJ1Y3Qgc2JwMl9zdGF0dXNfYmxvY2sgeworCXUzMiBPUkJfb2Zmc2V0X2hpX21pc2M7CisJdTMyIE9SQl9vZmZzZXRfbG87CisgICAgICAgIHU4IGNvbW1hbmRfc2V0X2RlcGVuZGVudFsyNF07Cit9OworCisvKgorICogTWlzY2VsbGFuZW91cyBTQlAyIHJlbGF0ZWQgY29uZmlnIHJvbSBkZWZpbmVzCisgKi8KKworLyogVGhlIHN0YXR1cyBmaWZvIGFkZHJlc3MgZGVmaW5pdGlvbiBiZWxvdyBpcyB1c2VkIGFzIGEgYmFzZSBmb3IgZWFjaAorICogbm9kZSwgd2hpY2ggYSBjaHVuayBzZXBlcmF0ZWx5IGFzc2lnbmVkIHRvIGVhY2ggdW5pdCBkaXJlY3RvcnkgaW4gdGhlCisgKiBub2RlLiAgRm9yIGV4YW1wbGUsIDB4ZmZmZTAwMDAwMDAwVUxMIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCBzYnAyIGRldmljZQorICogZGV0ZWN0ZWQgb24gbm9kZSAwLCAweGZmZmUwMDAwMDAyMFVMTCBmb3IgdGhlIG5leHQgc2JwMiBkZXZpY2Ugb24gbm9kZQorICogMCwgYW5kIHNvIG9uLgorICoKKyAqIE5vdGU6IFdlIGNvdWxkIHVzZSBhIHNpbmdsZSBzdGF0dXMgZmlmbyBhZGRyZXNzIGZvciBhbGwgc2JwMiBkZXZpY2VzLAorICogYW5kIGZpZ3VyZSBvdXQgd2hpY2ggc2JwMiBkZXZpY2UgdGhlIHN0YXR1cyBiZWxvbmdzIHRvIGJ5IGxvb2tpbmcgYXQKKyAqIHRoZSBzb3VyY2Ugbm9kZSBpZCBvZiB0aGUgc3RhdHVzIHdyaXRlLi4uIGJ1dCwgdXNpbmcgc2VwYXJhdGUgYWRkcmVzc2VzCisgKiBmb3IgZWFjaCBzYnAyIHVuaXQgZGlyZWN0b3J5IGFsbG93cyBmb3IgYmV0dGVyIGNvZGUgYW5kIHRoZSBhYmlsaXR5IHRvCisgKiBzdXBwb3J0IG11bHRpcGxlIGx1bnMgd2l0aGluIGEgc2luZ2xlIDEzOTQgbm9kZS4KKyAqCisgKiBBbHNvIG5vdGUgdGhhdCB3ZSBjaG9vc2UgdGhlIGFkZHJlc3MgcmFuZ2UgYmVsb3cgYXMgaXQgaXMgYSByZWdpb24KKyAqIHNwZWNpZmllZCBmb3Igd3JpdGUgcG9zdGluZywgd2hlcmUgdGhlIG9oY2kgY29udHJvbGxlciB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IHNlbmQgYW4gYWNrX2NvbXBsZXRlIHdoZW4gdGhlIHN0YXR1cyBpcyB3cml0dGVuIGJ5IHRoZQorICogc2JwMiBkZXZpY2UuLi4gc2F2aW5nIGEgc3BsaXQgdHJhbnNhY3Rpb24uICAgPSkKKyAqLyAKKyNkZWZpbmUgU0JQMl9TVEFUVVNfRklGT19BRERSRVNTCQkJCTB4ZmZmZTAwMDAwMDAwVUxMCisjZGVmaW5lIFNCUDJfU1RBVFVTX0ZJRk9fQUREUkVTU19ISSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZlCisjZGVmaW5lIFNCUDJfU1RBVFVTX0ZJRk9fQUREUkVTU19MTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisKKyNkZWZpbmUgU0JQMl9TVEFUVVNfRklGT19FTlRSWV9UT19PRkZTRVQoZW50cnkpCQkJKChlbnRyeSkgPDwgNSkKKyNkZWZpbmUgU0JQMl9TVEFUVVNfRklGT19PRkZTRVRfVE9fRU5UUlkob2Zmc2V0KQkJKChvZmZzZXQpID4+IDUpCisKKyNkZWZpbmUgU0JQMl9VTklUX0RJUkVDVE9SWV9PRkZTRVRfS0VZCQkJCTB4ZDEKKyNkZWZpbmUgU0JQMl9DU1JfT0ZGU0VUX0tFWQkJCQkJMHg1NAorI2RlZmluZSBTQlAyX1VOSVRfU1BFQ19JRF9LRVkJCQkJCTB4MTIKKyNkZWZpbmUgU0JQMl9VTklUX1NXX1ZFUlNJT05fS0VZCQkJCTB4MTMKKyNkZWZpbmUgU0JQMl9DT01NQU5EX1NFVF9TUEVDX0lEX0tFWQkJCQkweDM4CisjZGVmaW5lIFNCUDJfQ09NTUFORF9TRVRfS0VZCQkJCQkweDM5CisjZGVmaW5lIFNCUDJfVU5JVF9DSEFSQUNURVJJU1RJQ1NfS0VZCQkJCTB4M2EKKyNkZWZpbmUgU0JQMl9ERVZJQ0VfVFlQRV9BTkRfTFVOX0tFWQkJCQkweDE0CisjZGVmaW5lIFNCUDJfRklSTVdBUkVfUkVWSVNJT05fS0VZCQkJCTB4M2MKKworI2RlZmluZSBTQlAyX0RFVklDRV9UWVBFKHEpCQkJCQkoKChxKSA+PiAxNikgJiAweDFmKQorI2RlZmluZSBTQlAyX0RFVklDRV9MVU4ocSkJCQkJCSgocSkgJiAweGZmZmYpCisKKyNkZWZpbmUgU0JQMl9BR0VOVF9TVEFURV9PRkZTRVQJCQkJCTB4MDBVTEwKKyNkZWZpbmUgU0JQMl9BR0VOVF9SRVNFVF9PRkZTRVQJCQkJCTB4MDRVTEwKKyNkZWZpbmUgU0JQMl9PUkJfUE9JTlRFUl9PRkZTRVQJCQkJCTB4MDhVTEwKKyNkZWZpbmUgU0JQMl9ET09SQkVMTF9PRkZTRVQJCQkJCTB4MTBVTEwKKyNkZWZpbmUgU0JQMl9VTlNPTElDSVRFRF9TVEFUVVNfRU5BQkxFX09GRlNFVAkJCTB4MTRVTEwKKyNkZWZpbmUgU0JQMl9VTlNPTElDSVRFRF9TVEFUVVNfVkFMVUUJCQkJMHhmCisKKyNkZWZpbmUgU0JQMl9CVVNZX1RJTUVPVVRfQUREUkVTUwkJCQkweGZmZmZmMDAwMDIxMFVMTAorI2RlZmluZSBTQlAyX0JVU1lfVElNRU9VVF9WQUxVRQkJCQkJMHhmCisKKyNkZWZpbmUgU0JQMl9BR0VOVF9SRVNFVF9EQVRBCQkJCQkweGYKKworLyoKKyAqIFVuaXQgc3BlYyBpZCBhbmQgc3cgdmVyc2lvbiBlbnRyeSBmb3IgU0JQLTIgZGV2aWNlcworICovCisKKyNkZWZpbmUgU0JQMl9VTklUX1NQRUNfSURfRU5UUlkJCQkJCTB4MDAwMDYwOWUKKyNkZWZpbmUgU0JQMl9TV19WRVJTSU9OX0VOVFJZCQkJCQkweDAwMDEwNDgzCisKKy8qCisgKiBPdGhlciBtaXNjIGRlZmluZXMKKyAqLworI2RlZmluZSBTQlAyXzEyOEtCX0JST0tFTl9GSVJNV0FSRQkJCQkweGEwYjgwMAorCisjZGVmaW5lIFNCUDJfREVWSUNFX1RZUEVfTFVOX1VOSU5JVElBTElaRUQJCQkweGZmZmZmZmZmCisKKy8qCisgKiBTQ1NJIHNwZWNpZmljIHN0dWZmCisgKi8KKworI2RlZmluZSBTQlAyX01BWF9TR19FTEVNRU5UX0xFTkdUSAkweGYwMDAKKyNkZWZpbmUgU0JQMl9NQVhfVURTX1BFUl9OT0RFCQkxNgkvKiBNYXhpbXVtIHNjc2kgZGV2aWNlcyBwZXIgbm9kZSAqLworI2RlZmluZSBTQlAyX01BWF9TRUNUT1JTCQkyNTUJLyogTWF4IHNlY3RvcnMgc3VwcG9ydGVkICovCisKKyNpZm5kZWYgVFlQRV9TREFECisjZGVmaW5lIFRZUEVfU0RBRAkJCTB4MGUJLyogc2ltcGxpZmllZCBkaXJlY3QgYWNjZXNzIGRldmljZSAqLworI2VuZGlmCisKKy8qCisgKiBTQ1NJIGRpcmVjdGlvbiB0YWJsZS4uLgorICogKG5vdyB1c2VkIGFzIGEgYmFjay11cCBpbiBjYXNlIHRoZSBkaXJlY3Rpb24gcGFzc2VkIGRvd24gZnJvbSBhYm92ZSBpcyAidW5rbm93biIpCisgKgorICogRElOID0gSU4gZGF0YSBkaXJlY3Rpb24KKyAqIERPVSA9IE9VVCBkYXRhIGRpcmVjdGlvbgorICogRE5PID0gTm8gZGF0YSB0cmFuc2ZlcgorICogRFVOID0gVW5rbm93biBkYXRhIGRpcmVjdGlvbgorICoKKyAqIE9wY29kZSAweGVjIChUZWFjIHNwZWNpZmljICJvcGMgZXhlY3V0ZSIpIHBvc3NpYmx5IHNob3VsZCBiZSBETk8sCisgKiBidXQgd2UnbGwgY2hhbmdlIGl0IHdoZW4gc29tZWJvZHkgcmVwb3J0cyBhIHByb2JsZW0gd2l0aCB0aGlzLgorICovCisjZGVmaW5lIERJTgkJCQlPUkJfRElSRUNUSU9OX1JFQURfRlJPTV9NRURJQQorI2RlZmluZSBET1UJCQkJT1JCX0RJUkVDVElPTl9XUklURV9UT19NRURJQQorI2RlZmluZSBETk8JCQkJT1JCX0RJUkVDVElPTl9OT19EQVRBX1RSQU5TRkVSCisjZGVmaW5lIERVTgkJCQlESU4KKworc3RhdGljIHVuY2hhciBzYnAyc2NzaV9kaXJlY3Rpb25fdGFibGVbMHgxMDBdID0geworCUROTyxETk8sRElOLERJTixET1UsRElOLERJTixET1UsRElOLERVTixET1UsRE9VLERVTixEVU4sRFVOLERJTiwKKwlETk8sRElOLERJTixET1UsRElOLERPVSxETk8sRE5PLERPVSxETk8sRElOLEROTyxESU4sRE9VLEROTyxEVU4sCisJRElOLERVTixESU4sRElOLERPVSxESU4sRFVOLERVTixESU4sRElOLERPVSxETk8sRFVOLERJTixET1UsRE9VLAorCURPVSxET1UsRE9VLEROTyxESU4sRE5PLEROTyxESU4sRE9VLERPVSxET1UsRE9VLERJTixET1UsRElOLERPVSwKKwlET1UsRE9VLERJTixESU4sRElOLEROTyxESU4sRE5PLEROTyxETk8sRFVOLEROTyxET1UsRElOLEROTyxEVU4sCisJRFVOLERJTixESU4sRE5PLEROTyxET1UsRFVOLERVTixETk8sRElOLERJTixETk8sRElOLERPVSxEVU4sRFVOLAorCURVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTiwKKwlEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sCisJRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLAorCURVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTiwKKwlEVU4sRE5PLERPVSxET1UsRElOLEROTyxETk8sRE5PLERJTixETk8sRE9VLERVTixETk8sRElOLERPVSxET1UsCisJRE9VLERPVSxET1UsRE5PLERVTixESU4sRE9VLERJTixESU4sRElOLEROTyxETk8sRE5PLERJTixESU4sRFVOLAorCURVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTiwKKwlEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sCisJRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERPVSxEVU4sRFVOLERVTixEVU4sRFVOLAorCURVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTixEVU4sRFVOLERVTgorfTsKKworLyogVGhpcyBzaG91bGQgYmUgc2FmZSAqLworI2RlZmluZSBTQlAyX01BWF9DTURTCQk4CisKKy8qIFRoaXMgaXMgdGhlIHR3byBkbWEgdHlwZXMgd2UgdXNlIGZvciBjbWRfZG1hIGJlbG93ICovCitlbnVtIGNtZF9kbWFfdHlwZXMgeworCUNNRF9ETUFfTk9ORSwKKwlDTURfRE1BX1BBR0UsCisJQ01EX0RNQV9TSU5HTEUKK307CisKKy8qCisgKiBFbmNhcHN1bGF0ZXMgYWxsIHRoZSBpbmZvIG5lY2Vzc2FyeSBmb3IgYW4gb3V0c3RhbmRpbmcgY29tbWFuZC4KKyAqLworc3RydWN0IHNicDJfY29tbWFuZF9pbmZvIHsKKworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiBjb21tYW5kX29yYiBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJZG1hX2FkZHJfdCBjb21tYW5kX29yYl9kbWEgX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXN0cnVjdCBzY3NpX2NtbmQgKkN1cnJlbnRfU0NwbnQ7CisJdm9pZCAoKkN1cnJlbnRfZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKTsKKworCS8qIEFsc28gbmVlZCBzL2cgc3RydWN0dXJlIGZvciBlYWNoIHNicDIgY29tbWFuZCAqLworCXN0cnVjdCBzYnAyX3VucmVzdHJpY3RlZF9wYWdlX3RhYmxlIHNjYXR0ZXJfZ2F0aGVyX2VsZW1lbnRbU0dfQUxMXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJZG1hX2FkZHJfdCBzZ2VfZG1hIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwl2b2lkICpzZ2VfYnVmZmVyOworCWRtYV9hZGRyX3QgY21kX2RtYTsKKwllbnVtIGNtZF9kbWFfdHlwZXMgZG1hX3R5cGU7CisJdW5zaWduZWQgbG9uZyBkbWFfc2l6ZTsKKwlpbnQgZG1hX2RpcjsKKworfTsKKworLyogQSBsaXN0IG9mIGZsYWdzIGZvciBkZXRlY3RlZCBvZGRpdGllcyBhbmQgYnJva2VuZXNzLiAqLworI2RlZmluZSBTQlAyX0JSRUFLQUdFXzEyOEtfTUFYX1RSQU5TRkVSCQkweDEKKyNkZWZpbmUgU0JQMl9CUkVBS0FHRV9JTlFVSVJZX0hBQ0sJCTB4MgorCisKK3N0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm87CisKKworLyoKKyAqIEluZm9ybWF0aW9uIG5lZWRlZCBvbiBhIHBlciBzY3NpIGlkIGJhc2lzIChvbmUgZm9yIGVhY2ggc2JwMiBkZXZpY2UpCisgKi8KK3N0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgeworCS8qCisJICogVmFyaW91cyBzYnAyIHNwZWNpZmljIHN0cnVjdHVyZXMKKwkgKi8KKwlzdHJ1Y3Qgc2JwMl9jb21tYW5kX29yYiAqbGFzdF9vcmI7CisJZG1hX2FkZHJfdCBsYXN0X29yYl9kbWE7CisJc3RydWN0IHNicDJfbG9naW5fb3JiICpsb2dpbl9vcmI7CisJZG1hX2FkZHJfdCBsb2dpbl9vcmJfZG1hOworCXN0cnVjdCBzYnAyX2xvZ2luX3Jlc3BvbnNlICpsb2dpbl9yZXNwb25zZTsKKwlkbWFfYWRkcl90IGxvZ2luX3Jlc3BvbnNlX2RtYTsKKwlzdHJ1Y3Qgc2JwMl9xdWVyeV9sb2dpbnNfb3JiICpxdWVyeV9sb2dpbnNfb3JiOworCWRtYV9hZGRyX3QgcXVlcnlfbG9naW5zX29yYl9kbWE7CisJc3RydWN0IHNicDJfcXVlcnlfbG9naW5zX3Jlc3BvbnNlICpxdWVyeV9sb2dpbnNfcmVzcG9uc2U7CisJZG1hX2FkZHJfdCBxdWVyeV9sb2dpbnNfcmVzcG9uc2VfZG1hOworCXN0cnVjdCBzYnAyX3JlY29ubmVjdF9vcmIgKnJlY29ubmVjdF9vcmI7CisJZG1hX2FkZHJfdCByZWNvbm5lY3Rfb3JiX2RtYTsKKwlzdHJ1Y3Qgc2JwMl9sb2dvdXRfb3JiICpsb2dvdXRfb3JiOworCWRtYV9hZGRyX3QgbG9nb3V0X29yYl9kbWE7CisJc3RydWN0IHNicDJfc3RhdHVzX2Jsb2NrIHN0YXR1c19ibG9jazsKKworCS8qCisJICogU3R1ZmYgd2UgbmVlZCB0byBrbm93IGFib3V0IHRoZSBzYnAyIGRldmljZSBpdHNlbGYKKwkgKi8KKwl1NjQgc2JwMl9tYW5hZ2VtZW50X2FnZW50X2FkZHI7CisJdTY0IHNicDJfY29tbWFuZF9ibG9ja19hZ2VudF9hZGRyOworCXUzMiBzcGVlZF9jb2RlOworCXUzMiBtYXhfcGF5bG9hZF9zaXplOworCisJLyoKKwkgKiBWYWx1ZXMgcHVsbGVkIGZyb20gdGhlIGRldmljZSdzIHVuaXQgZGlyZWN0b3J5CisJICovCisJdTMyIHNicDJfY29tbWFuZF9zZXRfc3BlY19pZDsKKwl1MzIgc2JwMl9jb21tYW5kX3NldDsKKwl1MzIgc2JwMl91bml0X2NoYXJhY3RlcmlzdGljczsKKwl1MzIgc2JwMl9kZXZpY2VfdHlwZV9hbmRfbHVuOworCXUzMiBzYnAyX2Zpcm13YXJlX3JldmlzaW9uOworCisJLyoKKwkgKiBWYXJpYWJsZSB1c2VkIGZvciBsb2dpbnMsIHJlY29ubmVjdHMsIGxvZ291dHMsIHF1ZXJ5IGxvZ2lucworCSAqLworCWF0b21pY190IHNicDJfbG9naW5fY29tcGxldGU7CisKKwkvKgorCSAqIFBvb2wgb2YgY29tbWFuZCBvcmJzLCBzbyB3ZSBjYW4gaGF2ZSBtb3JlIHRoYW4gb3ZlcmxhcHBlZCBjb21tYW5kIHBlciBpZAorCSAqLworCXNwaW5sb2NrX3Qgc2JwMl9jb21tYW5kX29yYl9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgc2JwMl9jb21tYW5kX29yYl9pbnVzZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNicDJfY29tbWFuZF9vcmJfY29tcGxldGVkOworCisJc3RydWN0IGxpc3RfaGVhZCBzY3NpX2xpc3Q7CisKKwkvKiBOb2RlIGVudHJ5LCBhcyByZXRyaWV2ZWQgZnJvbSBOb2RlTWdyIGVudHJpZXMgKi8KKwlzdHJ1Y3Qgbm9kZV9lbnRyeSAqbmU7CisJc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZDsKKworCS8qIEEgYmFja2xpbmsgdG8gb3VyIGhvc3RfaW5mbyAqLworCXN0cnVjdCBzYnAyc2NzaV9ob3N0X2luZm8gKmhpOworCisJLyogU0NTSSByZWxhdGVkIHBvaW50ZXJzICovCisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdDsKKworCS8qIERldmljZSBzcGVjaWZpYyB3b3JrYXJvdW5kcy9icm9rZW5lc3MgKi8KKwl1MzIgd29ya2Fyb3VuZHM7Cit9OworCisKKy8qIFNicDIgaG9zdCBkYXRhIHN0cnVjdHVyZSAob25lIHBlciBJRUVFMTM5NCBob3N0KSAqLworc3RydWN0IHNicDJzY3NpX2hvc3RfaW5mbyB7CisJc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsJCS8qIElFRUUxMzk0IGhvc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNjc2lfaWRzOwkvKiBMaXN0IG9mIHNjc2kgaWRzIG9uIHRoaXMgaG9zdCAqLworfTsKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworCisvKgorICogVmFyaW91cyB1dGlsaXR5IHByb3RvdHlwZXMKKyAqLworc3RhdGljIGludCBzYnAydXRpbF9jcmVhdGVfY29tbWFuZF9vcmJfcG9vbChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKTsKK3N0YXRpYyB2b2lkIHNicDJ1dGlsX3JlbW92ZV9jb21tYW5kX29yYl9wb29sKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpOworc3RhdGljIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqc2JwMnV0aWxfZmluZF9jb21tYW5kX2Zvcl9vcmIoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwgZG1hX2FkZHJfdCBvcmIpOworc3RhdGljIHN0cnVjdCBzYnAyX2NvbW1hbmRfaW5mbyAqc2JwMnV0aWxfZmluZF9jb21tYW5kX2Zvcl9TQ3BudChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLCB2b2lkICpTQ3BudCk7CitzdGF0aWMgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpzYnAydXRpbF9hbGxvY2F0ZV9jb21tYW5kX29yYihzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLAorCQkJCQkJCSAgc3RydWN0IHNjc2lfY21uZCAqQ3VycmVudF9TQ3BudCwKKwkJCQkJCQkgIHZvaWQgKCpDdXJyZW50X2RvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOworc3RhdGljIHZvaWQgc2JwMnV0aWxfbWFya19jb21tYW5kX2NvbXBsZXRlZChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLAorCQlzdHJ1Y3Qgc2JwMl9jb21tYW5kX2luZm8gKmNvbW1hbmQpOworCisKK3N0YXRpYyBpbnQgc2JwMl9zdGFydF9kZXZpY2Uoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCk7CitzdGF0aWMgdm9pZCBzYnAyX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCk7CisKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfU0JQMl9QSFlTX0RNQQorc3RhdGljIGludCBzYnAyX2hhbmRsZV9waHlzZG1hX3dyaXRlKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIGludCBkZXN0aWQsIHF1YWRsZXRfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsYWdzKTsKK3N0YXRpYyBpbnQgc2JwMl9oYW5kbGVfcGh5c2RtYV9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHF1YWRsZXRfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU2NCBhZGRyLCBzaXplX3QgbGVuZ3RoLCB1MTYgZmxhZ3MpOworI2VuZGlmCisKKy8qCisgKiBTQlAtMiBwcm90b2NvbCByZWxhdGVkIHByb3RvdHlwZXMKKyAqLworc3RhdGljIGludCBzYnAyX3F1ZXJ5X2xvZ2lucyhzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKTsKK3N0YXRpYyBpbnQgc2JwMl9sb2dpbl9kZXZpY2Uoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCk7CitzdGF0aWMgaW50IHNicDJfcmVjb25uZWN0X2RldmljZShzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKTsKK3N0YXRpYyBpbnQgc2JwMl9sb2dvdXRfZGV2aWNlKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQpOworc3RhdGljIGludCBzYnAyX2hhbmRsZV9zdGF0dXNfd3JpdGUoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgaW50IGRlc3RpZCwKKwkJCQkgICAgcXVhZGxldF90ICpkYXRhLCB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsYWdzKTsKK3N0YXRpYyBpbnQgc2JwMl9hZ2VudF9yZXNldChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkLCBpbnQgd2FpdCk7CitzdGF0aWMgaW50IHNicDJfY3JlYXRlX2NvbW1hbmRfb3JiKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCisJCQkJICAgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kLAorCQkJCSAgIHVuY2hhciAqc2NzaV9jbWQsCisJCQkJICAgdW5zaWduZWQgaW50IHNjc2lfdXNlX3NnLAorCQkJCSAgIHVuc2lnbmVkIGludCBzY3NpX3JlcXVlc3RfYnVmZmxlbiwKKwkJCQkgICB2b2lkICpzY3NpX3JlcXVlc3RfYnVmZmVyLAorCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRtYV9kaXIpOworc3RhdGljIGludCBzYnAyX2xpbmtfb3JiX2NvbW1hbmQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwKKwkJCQkgc3RydWN0IHNicDJfY29tbWFuZF9pbmZvICpjb21tYW5kKTsKK3N0YXRpYyBpbnQgc2JwMl9zZW5kX2NvbW1hbmQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwKKwkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisJCQkgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2JwMl9zdGF0dXNfdG9fc2Vuc2VfZGF0YSh1bmNoYXIgKnNicDJfc3RhdHVzLCB1bmNoYXIgKnNlbnNlX2RhdGEpOworc3RhdGljIHZvaWQgc2JwMl9jaGVja19zYnAyX2NvbW1hbmQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwgdW5jaGFyICpjbWQpOworc3RhdGljIHZvaWQgc2JwMl9jaGVja19zYnAyX3Jlc3BvbnNlKHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCisJCQkJICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCk7CitzdGF0aWMgdm9pZCBzYnAyX3BhcnNlX3VuaXRfZGlyZWN0b3J5KHN0cnVjdCBzY3NpX2lkX2luc3RhbmNlX2RhdGEgKnNjc2lfaWQsCisJCQkJICAgICAgc3RydWN0IHVuaXRfZGlyZWN0b3J5ICp1ZCk7CitzdGF0aWMgaW50IHNicDJfc2V0X2J1c3lfdGltZW91dChzdHJ1Y3Qgc2NzaV9pZF9pbnN0YW5jZV9kYXRhICpzY3NpX2lkKTsKK3N0YXRpYyBpbnQgc2JwMl9tYXhfc3BlZWRfYW5kX3NpemUoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCk7CisKKyNlbmRpZiAvKiBTQlAyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZWRmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2llZWUxMzk0L3ZpZGVvMTM5NC5jCkBAIC0wLDAgKzEsMTUyNyBAQAorLyoKKyAqIHZpZGVvMTM5NC5jIC0gdmlkZW8gZHJpdmVyIGZvciBPSENJIDEzOTQgYm9hcmRzCisgKiBDb3B5cmlnaHQgKEMpMTk5OSwyMDAwIFNlYmFzdGllbiBSb3VnZWF1eCA8c2ViYXN0aWVuLnJvdWdlYXV4QGFudS5lZHUuYXU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgIFBldGVyIFNjaGxhaWxlIDx1ZGJ6QHJ6LnVuaS1rYXJsc3J1aGUuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBOT1RFUzoKKyAqCisgKiBqZHMgLS0gYWRkIHByaXZhdGUgZGF0YSB0byBmaWxlIHRvIGtlZXAgdHJhY2sgb2YgaXNvIGNvbnRleHRzIGFzc29jaWF0ZWQKKyAqIHdpdGggZWFjaCBvcGVuIC0tIHNvIHJlbGVhc2Ugd29uJ3Qga2lsbCBhbGwgaXNvIHRyYW5zZmVycy4KKyAqIAorICogRGFtaWVuIERvdXhjaGFtcHM6IEZpeCBmYWlsdXJlIHdoZW4gdGhlIG51bWJlciBvZiBETUEgcGFnZXMgcGVyIGZyYW1lIGlzCisgKiBvbmUuCisgKiAKKyAqIGlvY3RsIHJldHVybiBjb2RlczoKKyAqIEVGQVVMVCBpcyBvbmx5IGZvciBpbnZhbGlkIGFkZHJlc3MgZm9yIHRoZSBhcmdwCisgKiBFSU5WQUwgZm9yIG91dCBvZiByYW5nZSB2YWx1ZXMKKyAqIEVCVVNZIHdoZW4gdHJ5aW5nIHRvIHVzZSBhbiBhbHJlYWR5IHVzZWQgcmVzb3VyY2UKKyAqIEVTUkNIIHdoZW4gdHJ5aW5nIHRvIGZyZWUvc3RvcCBhIG5vdCB1c2VkIHJlc291cmNlCisgKiBFQUdBSU4gZm9yIHJlc291cmNlIGFsbG9jYXRpb24gZmFpbHVyZSB0aGF0IGNvdWxkIHBlcmhhcHMgc3VjY2VlZCBsYXRlcgorICogRU5PVFRZIGZvciB1bnN1cHBvcnRlZCBpb2N0bCByZXF1ZXN0CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisKKyNpbmNsdWRlICJpZWVlMTM5NC5oIgorI2luY2x1ZGUgImllZWUxMzk0X3R5cGVzLmgiCisjaW5jbHVkZSAiaG9zdHMuaCIKKyNpbmNsdWRlICJpZWVlMTM5NF9jb3JlLmgiCisjaW5jbHVkZSAiaGlnaGxldmVsLmgiCisjaW5jbHVkZSAidmlkZW8xMzk0LmgiCisjaW5jbHVkZSAibm9kZW1nci5oIgorI2luY2x1ZGUgImRtYS5oIgorCisjaW5jbHVkZSAib2hjaTEzOTQuaCIKKworI2RlZmluZSBJU09fQ0hBTk5FTFMgNjQKKworI2lmbmRlZiB2aXJ0X3RvX3BhZ2UKKyNkZWZpbmUgdmlydF90b19wYWdlKHgpIE1BUF9OUih4KQorI2VuZGlmCisKKyNpZm5kZWYgdm1hbGxvY18zMgorI2RlZmluZSB2bWFsbG9jXzMyKHgpIHZtYWxsb2MoeCkKKyNlbmRpZgorCitzdHJ1Y3QgaXRfZG1hX3ByZyB7CisJc3RydWN0IGRtYV9jbWQgYmVnaW47CisJcXVhZGxldF90IGRhdGFbNF07CisJc3RydWN0IGRtYV9jbWQgZW5kOworCXF1YWRsZXRfdCBwYWRbNF07IC8qIEZJWE1FOiBxdWljayBoYWNrIGZvciBtZW1vcnkgYWxpZ25tZW50ICovCit9OworCitzdHJ1Y3QgZG1hX2lzb19jdHggeworCXN0cnVjdCB0aV9vaGNpICpvaGNpOworCWludCB0eXBlOyAvKiBPSENJX0lTT19UUkFOU01JVCBvciBPSENJX0lTT19SRUNFSVZFICovCisJc3RydWN0IG9oY2kxMzk0X2lzb190YXNrbGV0IGlzb190YXNrbGV0OworCWludCBjaGFubmVsOworCWludCBjdHg7CisJaW50IGxhc3RfYnVmZmVyOworCWludCAqIG5leHRfYnVmZmVyOyAgLyogRm9yIElTTyBUcmFuc21pdCBvZiB2aWRlbyBwYWNrZXRzCisJCQkgICAgICAgdG8gd3JpdGUgdGhlIGNvcnJlY3QgU1lUIGZpZWxkCisJCQkgICAgICAgaW50byB0aGUgbmV4dCBibG9jayAqLworCXVuc2lnbmVkIGludCBudW1fZGVzYzsKKwl1bnNpZ25lZCBpbnQgYnVmX3NpemU7CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemU7CisJdW5zaWduZWQgaW50IHBhY2tldF9zaXplOworCXVuc2lnbmVkIGludCBsZWZ0X3NpemU7CisJdW5zaWduZWQgaW50IG5iX2NtZDsKKworCXN0cnVjdCBkbWFfcmVnaW9uIGRtYTsKKworCXN0cnVjdCBkbWFfcHJvZ19yZWdpb24gKnByZ19yZWc7CisKKyAgICAgICAgc3RydWN0IGRtYV9jbWQgKippcl9wcmc7CisJc3RydWN0IGl0X2RtYV9wcmcgKippdF9wcmc7CisKKwl1bnNpZ25lZCBpbnQgKmJ1ZmZlcl9zdGF0dXM7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsICpidWZmZXJfdGltZTsgLyogdGltZSB3aGVuIHRoZSBidWZmZXIgd2FzIHJlY2VpdmVkICovCisJdW5zaWduZWQgaW50ICpsYXN0X3VzZWRfY21kOyAvKiBGb3IgSVNPIFRyYW5zbWl0IHdpdGgKKwkJCQkJdmFyaWFibGUgc2l6ZWQgcGFja2V0cyBvbmx5ICEgKi8KKwlpbnQgY3RybENsZWFyOworCWludCBjdHJsU2V0OworCWludCBjbWRQdHI7CisJaW50IGN0eE1hdGNoOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBpbnQgc3l0X29mZnNldDsKKwlpbnQgZmxhZ3M7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7Cit9OworCisKK3N0cnVjdCBmaWxlX2N0eCB7CisJc3RydWN0IHRpX29oY2kgKm9oY2k7CisJc3RydWN0IGxpc3RfaGVhZCBjb250ZXh0X2xpc3Q7CisJc3RydWN0IGRtYV9pc29fY3R4ICpjdXJyZW50X2N0eDsKK307CisKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfVkVSQk9TRURFQlVHCisjZGVmaW5lIFZJREVPMTM5NF9ERUJVRworI2VuZGlmCisKKyNpZmRlZiBEQkdNU0cKKyN1bmRlZiBEQkdNU0cKKyNlbmRpZgorCisjaWZkZWYgVklERU8xMzk0X0RFQlVHCisjZGVmaW5lIERCR01TRyhjYXJkLCBmbXQsIGFyZ3MuLi4pIFwKK3ByaW50ayhLRVJOX0lORk8gInZpZGVvMTM5NF8lZDogIiBmbXQgIlxuIiAsIGNhcmQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREJHTVNHKGNhcmQsIGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisvKiBwcmludCBnZW5lcmFsIChjYXJkIGluZGVwZW5kZW50KSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBQUklOVF9HKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKK3ByaW50ayhsZXZlbCAidmlkZW8xMzk0OiAiIGZtdCAiXG4iICwgIyMgYXJncykKKworLyogcHJpbnQgY2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBQUklOVChsZXZlbCwgY2FyZCwgZm10LCBhcmdzLi4uKSBcCitwcmludGsobGV2ZWwgInZpZGVvMTM5NF8lZDogIiBmbXQgIlxuIiAsIGNhcmQgLCAjIyBhcmdzKQorCitzdGF0aWMgdm9pZCB3YWtldXBfZG1hX2lyX2N0eCh1bnNpZ25lZCBsb25nIGwpOworc3RhdGljIHZvaWQgd2FrZXVwX2RtYV9pdF9jdHgodW5zaWduZWQgbG9uZyBsKTsKKworc3RhdGljIHN0cnVjdCBocHNiX2hpZ2hsZXZlbCB2aWRlbzEzOTRfaGlnaGxldmVsOworCitzdGF0aWMgaW50IGZyZWVfZG1hX2lzb19jdHgoc3RydWN0IGRtYV9pc29fY3R4ICpkKQoreworCWludCBpOworCisJREJHTVNHKGQtPm9oY2ktPmhvc3QtPmlkLCAiRnJlZWluZyBkbWFfaXNvX2N0eCAlZCIsIGQtPmN0eCk7CisKKwlvaGNpMTM5NF9zdG9wX2NvbnRleHQoZC0+b2hjaSwgZC0+Y3RybENsZWFyLCBOVUxMKTsKKwlpZiAoZC0+aXNvX3Rhc2tsZXQubGluay5uZXh0ICE9IE5VTEwpCisJCW9oY2kxMzk0X3VucmVnaXN0ZXJfaXNvX3Rhc2tsZXQoZC0+b2hjaSwgJmQtPmlzb190YXNrbGV0KTsKKworCWRtYV9yZWdpb25fZnJlZSgmZC0+ZG1hKTsKKworCWlmIChkLT5wcmdfcmVnKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkLT5udW1fZGVzYzsgaSsrKQorCQkJZG1hX3Byb2dfcmVnaW9uX2ZyZWUoJmQtPnByZ19yZWdbaV0pOworCQlrZnJlZShkLT5wcmdfcmVnKTsKKwl9CisKKwlpZiAoZC0+aXJfcHJnKQorCQlrZnJlZShkLT5pcl9wcmcpOworCisJaWYgKGQtPml0X3ByZykKKwkJa2ZyZWUoZC0+aXRfcHJnKTsKKworCWlmIChkLT5idWZmZXJfc3RhdHVzKQorCQlrZnJlZShkLT5idWZmZXJfc3RhdHVzKTsKKwlpZiAoZC0+YnVmZmVyX3RpbWUpCisJCWtmcmVlKGQtPmJ1ZmZlcl90aW1lKTsKKwlpZiAoZC0+bGFzdF91c2VkX2NtZCkKKwkJa2ZyZWUoZC0+bGFzdF91c2VkX2NtZCk7CisJaWYgKGQtPm5leHRfYnVmZmVyKQorCQlrZnJlZShkLT5uZXh0X2J1ZmZlcik7CisKKwlsaXN0X2RlbCgmZC0+bGluayk7CisKKwlrZnJlZShkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9pc29fY3R4ICoKK2FsbG9jX2RtYV9pc29fY3R4KHN0cnVjdCB0aV9vaGNpICpvaGNpLCBpbnQgdHlwZSwgaW50IG51bV9kZXNjLAorCQkgIGludCBidWZfc2l6ZSwgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBwYWNrZXRfc2l6ZSkKK3sKKwlzdHJ1Y3QgZG1hX2lzb19jdHggKmQ7CisJaW50IGk7CisKKwlkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRtYV9pc29fY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGQgPT0gTlVMTCkgeworCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsICJGYWlsZWQgdG8gYWxsb2NhdGUgZG1hX2lzb19jdHgiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KGQsIDAsIHNpemVvZiAqZCk7CisKKwlkLT5vaGNpID0gb2hjaTsKKwlkLT50eXBlID0gdHlwZTsKKwlkLT5jaGFubmVsID0gY2hhbm5lbDsKKwlkLT5udW1fZGVzYyA9IG51bV9kZXNjOworCWQtPmZyYW1lX3NpemUgPSBidWZfc2l6ZTsKKwlkLT5idWZfc2l6ZSA9IFBBR0VfQUxJR04oYnVmX3NpemUpOworCWQtPmxhc3RfYnVmZmVyID0gLTE7CisJSU5JVF9MSVNUX0hFQUQoJmQtPmxpbmspOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmQtPndhaXRxKTsKKworCS8qIEluaXQgdGhlIHJlZ2lvbnMgZm9yIGVhc3kgY2xlYW51cCAqLworCWRtYV9yZWdpb25faW5pdCgmZC0+ZG1hKTsKKworCWlmIChkbWFfcmVnaW9uX2FsbG9jKCZkLT5kbWEsIGQtPm51bV9kZXNjICogZC0+YnVmX3NpemUsIG9oY2ktPmRldiwKKwkJCSAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKSkgeworCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsICJGYWlsZWQgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlciIpOworCQlmcmVlX2RtYV9pc29fY3R4KGQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodHlwZSA9PSBPSENJX0lTT19SRUNFSVZFKQorCQlvaGNpMTM5NF9pbml0X2lzb190YXNrbGV0KCZkLT5pc29fdGFza2xldCwgdHlwZSwKKwkJCQkJICB3YWtldXBfZG1hX2lyX2N0eCwKKwkJCQkJICAodW5zaWduZWQgbG9uZykgZCk7CisJZWxzZQorCQlvaGNpMTM5NF9pbml0X2lzb190YXNrbGV0KCZkLT5pc29fdGFza2xldCwgdHlwZSwKKwkJCQkJICB3YWtldXBfZG1hX2l0X2N0eCwKKwkJCQkJICAodW5zaWduZWQgbG9uZykgZCk7CisKKwlpZiAob2hjaTEzOTRfcmVnaXN0ZXJfaXNvX3Rhc2tsZXQob2hjaSwgJmQtPmlzb190YXNrbGV0KSA8IDApIHsKKwkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLCAibm8gZnJlZSBpc28gJXMgY29udGV4dHMiLAorCQkgICAgICB0eXBlID09IE9IQ0lfSVNPX1JFQ0VJVkUgPyAicmVjZWl2ZSIgOiAidHJhbnNtaXQiKTsKKwkJZnJlZV9kbWFfaXNvX2N0eChkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWQtPmN0eCA9IGQtPmlzb190YXNrbGV0LmNvbnRleHQ7CisKKwlkLT5wcmdfcmVnID0ga21hbGxvYyhkLT5udW1fZGVzYyAqIHNpemVvZihzdHJ1Y3QgZG1hX3Byb2dfcmVnaW9uKSwKKwkJCUdGUF9LRVJORUwpOworCWlmIChkLT5wcmdfcmVnID09IE5VTEwpIHsKKwkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGlyIHByZyByZWdzIik7CisJCWZyZWVfZG1hX2lzb19jdHgoZCk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBNYWtlcyBmb3IgZWFzaWVyIGNsZWFudXAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZC0+bnVtX2Rlc2M7IGkrKykKKwkJZG1hX3Byb2dfcmVnaW9uX2luaXQoJmQtPnByZ19yZWdbaV0pOworCisJaWYgKHR5cGUgPT0gT0hDSV9JU09fUkVDRUlWRSkgeworCQlkLT5jdHJsU2V0ID0gT0hDSTEzOTRfSXNvUmN2Q29udGV4dENvbnRyb2xTZXQrMzIqZC0+Y3R4OworCQlkLT5jdHJsQ2xlYXIgPSBPSENJMTM5NF9Jc29SY3ZDb250ZXh0Q29udHJvbENsZWFyKzMyKmQtPmN0eDsKKwkJZC0+Y21kUHRyID0gT0hDSTEzOTRfSXNvUmN2Q29tbWFuZFB0ciszMipkLT5jdHg7CisJCWQtPmN0eE1hdGNoID0gT0hDSTEzOTRfSXNvUmN2Q29udGV4dE1hdGNoKzMyKmQtPmN0eDsKKworCQlkLT5pcl9wcmcgPSBrbWFsbG9jKGQtPm51bV9kZXNjICogc2l6ZW9mKHN0cnVjdCBkbWFfY21kICopLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKworCQlpZiAoZC0+aXJfcHJnID09IE5VTEwpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkbWEgaXIgcHJnIik7CisJCQlmcmVlX2RtYV9pc29fY3R4KGQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbWVtc2V0KGQtPmlyX3ByZywgMCwgZC0+bnVtX2Rlc2MgKiBzaXplb2Yoc3RydWN0IGRtYV9jbWQgKikpOworCisJCWQtPm5iX2NtZCA9IGQtPmJ1Zl9zaXplIC8gUEFHRV9TSVpFICsgMTsKKwkJZC0+bGVmdF9zaXplID0gKGQtPmZyYW1lX3NpemUgJSBQQUdFX1NJWkUpID8KKwkJCWQtPmZyYW1lX3NpemUgJSBQQUdFX1NJWkUgOiBQQUdFX1NJWkU7CisKKwkJZm9yIChpID0gMDtpIDwgZC0+bnVtX2Rlc2M7IGkrKykgeworCQkJaWYgKGRtYV9wcm9nX3JlZ2lvbl9hbGxvYygmZC0+cHJnX3JlZ1tpXSwgZC0+bmJfY21kICoKKwkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBkbWFfY21kKSwgb2hjaS0+ZGV2KSkgeworCQkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkbWEgaXIgcHJnIik7CisJCQkJZnJlZV9kbWFfaXNvX2N0eChkKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWQtPmlyX3ByZ1tpXSA9IChzdHJ1Y3QgZG1hX2NtZCAqKWQtPnByZ19yZWdbaV0ua3ZpcnQ7CisJCX0KKworCX0gZWxzZSB7ICAvKiBPSENJX0lTT19UUkFOU01JVCAqLworCQlkLT5jdHJsU2V0ID0gT0hDSTEzOTRfSXNvWG1pdENvbnRleHRDb250cm9sU2V0KzE2KmQtPmN0eDsKKwkJZC0+Y3RybENsZWFyID0gT0hDSTEzOTRfSXNvWG1pdENvbnRleHRDb250cm9sQ2xlYXIrMTYqZC0+Y3R4OworCQlkLT5jbWRQdHIgPSBPSENJMTM5NF9Jc29YbWl0Q29tbWFuZFB0cisxNipkLT5jdHg7CisKKwkJZC0+aXRfcHJnID0ga21hbGxvYyhkLT5udW1fZGVzYyAqIHNpemVvZihzdHJ1Y3QgaXRfZG1hX3ByZyAqKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKGQtPml0X3ByZyA9PSBOVUxMKSB7CisJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCisJCQkgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGRtYSBpdCBwcmciKTsKKwkJCWZyZWVfZG1hX2lzb19jdHgoZCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQltZW1zZXQoZC0+aXRfcHJnLCAwLCBkLT5udW1fZGVzYypzaXplb2Yoc3RydWN0IGl0X2RtYV9wcmcgKikpOworCisJCWQtPnBhY2tldF9zaXplID0gcGFja2V0X3NpemU7CisKKwkJaWYgKFBBR0VfU0laRSAlIHBhY2tldF9zaXplIHx8IHBhY2tldF9zaXplPjQwOTYpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKKwkJCSAgICAgICJQYWNrZXQgc2l6ZSAlZCAocGFnZV9zaXplOiAlbGQpICIKKwkJCSAgICAgICJub3QgeWV0IHN1cHBvcnRlZFxuIiwKKwkJCSAgICAgIHBhY2tldF9zaXplLCBQQUdFX1NJWkUpOworCQkJZnJlZV9kbWFfaXNvX2N0eChkKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJZC0+bmJfY21kID0gZC0+ZnJhbWVfc2l6ZSAvIGQtPnBhY2tldF9zaXplOworCQlpZiAoZC0+ZnJhbWVfc2l6ZSAlIGQtPnBhY2tldF9zaXplKSB7CisJCQlkLT5uYl9jbWQrKzsKKwkJCWQtPmxlZnRfc2l6ZSA9IGQtPmZyYW1lX3NpemUgJSBkLT5wYWNrZXRfc2l6ZTsKKwkJfSBlbHNlCisJCQlkLT5sZWZ0X3NpemUgPSBkLT5wYWNrZXRfc2l6ZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgZC0+bnVtX2Rlc2M7IGkrKykgeworCQkJaWYgKGRtYV9wcm9nX3JlZ2lvbl9hbGxvYygmZC0+cHJnX3JlZ1tpXSwgZC0+bmJfY21kICoKKwkJCQkJCXNpemVvZihzdHJ1Y3QgaXRfZG1hX3ByZyksIG9oY2ktPmRldikpIHsKKwkJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsICJGYWlsZWQgdG8gYWxsb2NhdGUgZG1hIGl0IHByZyIpOworCQkJCWZyZWVfZG1hX2lzb19jdHgoZCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlkLT5pdF9wcmdbaV0gPSAoc3RydWN0IGl0X2RtYV9wcmcgKilkLT5wcmdfcmVnW2ldLmt2aXJ0OworCQl9CisJfQorCisJZC0+YnVmZmVyX3N0YXR1cyA9IGttYWxsb2MoZC0+bnVtX2Rlc2MgKiBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlkLT5idWZmZXJfdGltZSA9IGttYWxsb2MoZC0+bnVtX2Rlc2MgKiBzaXplb2Yoc3RydWN0IHRpbWV2YWwpLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWQtPmxhc3RfdXNlZF9jbWQgPSBrbWFsbG9jKGQtPm51bV9kZXNjICogc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJZC0+bmV4dF9idWZmZXIgPSBrbWFsbG9jKGQtPm51bV9kZXNjICogc2l6ZW9mKGludCksCisJCQkJIEdGUF9LRVJORUwpOworCisJaWYgKGQtPmJ1ZmZlcl9zdGF0dXMgPT0gTlVMTCkgeworCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyX3N0YXR1cyIpOworCQlmcmVlX2RtYV9pc29fY3R4KGQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGQtPmJ1ZmZlcl90aW1lID09IE5VTEwpIHsKKwkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlcl90aW1lIik7CisJCWZyZWVfZG1hX2lzb19jdHgoZCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoZC0+bGFzdF91c2VkX2NtZCA9PSBOVUxMKSB7CisJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBsYXN0X3VzZWRfY21kIik7CisJCWZyZWVfZG1hX2lzb19jdHgoZCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoZC0+bmV4dF9idWZmZXIgPT0gTlVMTCkgeworCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsICJGYWlsZWQgdG8gYWxsb2NhdGUgbmV4dF9idWZmZXIiKTsKKwkJZnJlZV9kbWFfaXNvX2N0eChkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChkLT5idWZmZXJfc3RhdHVzLCAwLCBkLT5udW1fZGVzYyAqIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwltZW1zZXQoZC0+YnVmZmVyX3RpbWUsIDAsIGQtPm51bV9kZXNjICogc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CisJbWVtc2V0KGQtPmxhc3RfdXNlZF9jbWQsIDAsIGQtPm51bV9kZXNjICogc2l6ZW9mKHVuc2lnbmVkIGludCkpOworCW1lbXNldChkLT5uZXh0X2J1ZmZlciwgLTEsIGQtPm51bV9kZXNjICogc2l6ZW9mKGludCkpOworCisgICAgICAgIHNwaW5fbG9ja19pbml0KCZkLT5sb2NrKTsKKworCVBSSU5UKEtFUk5fSU5GTywgb2hjaS0+aG9zdC0+aWQsICJJc28gJXMgRE1BOiAlZCBidWZmZXJzICIKKwkgICAgICAib2Ygc2l6ZSAlZCBhbGxvY2F0ZWQgZm9yIGEgZnJhbWUgc2l6ZSAlZCwgZWFjaCB3aXRoICVkIHByZ3MiLAorCSAgICAgICh0eXBlID09IE9IQ0lfSVNPX1JFQ0VJVkUpID8gInJlY2VpdmUiIDogInRyYW5zbWl0IiwKKwkgICAgICBkLT5udW1fZGVzYywgZC0+YnVmX3NpemUsIGQtPmZyYW1lX3NpemUsIGQtPm5iX2NtZCk7CisKKwlyZXR1cm4gZDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfaXJfc3RhdHVzKHN0cnVjdCBkbWFfaXNvX2N0eCAqZCwgaW50IG4pCit7CisJaW50IGk7CisJZC0+aXJfcHJnW25dWzBdLnN0YXR1cyA9IGNwdV90b19sZTMyKDQpOworCWQtPmlyX3ByZ1tuXVsxXS5zdGF0dXMgPSBjcHVfdG9fbGUzMihQQUdFX1NJWkUtNCk7CisJZm9yIChpID0gMjsgaSA8IGQtPm5iX2NtZCAtIDE7IGkrKykKKwkJZC0+aXJfcHJnW25dW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKFBBR0VfU0laRSk7CisJZC0+aXJfcHJnW25dW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKGQtPmxlZnRfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfZG1hX2lyX3ByZyhzdHJ1Y3QgZG1hX2lzb19jdHggKmQsIGludCBuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGRtYV9jbWQgKmlyX3ByZyA9IGQtPmlyX3ByZ1tuXTsKKwlzdHJ1Y3QgZG1hX3Byb2dfcmVnaW9uICppcl9yZWcgPSAmZC0+cHJnX3JlZ1tuXTsKKwl1bnNpZ25lZCBsb25nIGJ1ZiA9ICh1bnNpZ25lZCBsb25nKWQtPmRtYS5rdmlydCArIG4gKiBkLT5idWZfc2l6ZTsKKwlpbnQgaTsKKworCS8qIHRoZSBmaXJzdCBkZXNjcmlwdG9yIHdpbGwgcmVhZCBvbmx5IDQgYnl0ZXMgKi8KKwlpcl9wcmdbMF0uY29udHJvbCA9IGNwdV90b19sZTMyKERNQV9DVExfSU5QVVRfTU9SRSB8IERNQV9DVExfVVBEQVRFIHwKKwkJRE1BX0NUTF9CUkFOQ0ggfCA0KTsKKworCS8qIHNldCB0aGUgc3luYyBmbGFnICovCisJaWYgKGZsYWdzICYgVklERU8xMzk0X1NZTkNfRlJBTUVTKQorCQlpcl9wcmdbMF0uY29udHJvbCB8PSBjcHVfdG9fbGUzMihETUFfQ1RMX1dBSVQpOworCisJaXJfcHJnWzBdLmFkZHJlc3MgPSBjcHVfdG9fbGUzMihkbWFfcmVnaW9uX29mZnNldF90b19idXMoJmQtPmRtYSwgYnVmIC0KKwkJCQkodW5zaWduZWQgbG9uZylkLT5kbWEua3ZpcnQpKTsKKwlpcl9wcmdbMF0uYnJhbmNoQWRkcmVzcyA9IGNwdV90b19sZTMyKChkbWFfcHJvZ19yZWdpb25fb2Zmc2V0X3RvX2J1cyhpcl9yZWcsCisJCQkJCTEgKiBzaXplb2Yoc3RydWN0IGRtYV9jbWQpKSAmIDB4ZmZmZmZmZjApIHwgMHgxKTsKKworCS8qIElmIHRoZXJlIGlzICpub3QqIG9ubHkgb25lIERNQSBwYWdlIHBlciBmcmFtZSAoaGVuY2UsIGQtPm5iX2NtZD09MikgKi8KKwlpZiAoZC0+bmJfY21kID4gMikgeworCQkvKiBUaGUgc2Vjb25kIGRlc2NyaXB0b3Igd2lsbCByZWFkIFBBR0VfU0laRS00IGJ5dGVzICovCisJCWlyX3ByZ1sxXS5jb250cm9sID0gY3B1X3RvX2xlMzIoRE1BX0NUTF9JTlBVVF9NT1JFIHwgRE1BX0NUTF9VUERBVEUgfAorCQkJCQkJRE1BX0NUTF9CUkFOQ0ggfCAoUEFHRV9TSVpFLTQpKTsKKwkJaXJfcHJnWzFdLmFkZHJlc3MgPSBjcHVfdG9fbGUzMihkbWFfcmVnaW9uX29mZnNldF90b19idXMoJmQtPmRtYSwgKGJ1ZiArIDQpIC0KKwkJCQkJCSh1bnNpZ25lZCBsb25nKWQtPmRtYS5rdmlydCkpOworCQlpcl9wcmdbMV0uYnJhbmNoQWRkcmVzcyA9IGNwdV90b19sZTMyKChkbWFfcHJvZ19yZWdpb25fb2Zmc2V0X3RvX2J1cyhpcl9yZWcsCisJCQkJCQkgICAgICAyICogc2l6ZW9mKHN0cnVjdCBkbWFfY21kKSkgJiAweGZmZmZmZmYwKSB8IDB4MSk7CisKKwkJZm9yIChpID0gMjsgaSA8IGQtPm5iX2NtZCAtIDE7IGkrKykgeworCQkJaXJfcHJnW2ldLmNvbnRyb2wgPSBjcHVfdG9fbGUzMihETUFfQ1RMX0lOUFVUX01PUkUgfCBETUFfQ1RMX1VQREFURSB8CisJCQkJCQkJRE1BX0NUTF9CUkFOQ0ggfCBQQUdFX1NJWkUpOworCQkJaXJfcHJnW2ldLmFkZHJlc3MgPSBjcHVfdG9fbGUzMihkbWFfcmVnaW9uX29mZnNldF90b19idXMoJmQtPmRtYSwKKwkJCQkJCQkoYnVmKyhpLTEpKlBBR0VfU0laRSkgLQorCQkJCQkJCSh1bnNpZ25lZCBsb25nKWQtPmRtYS5rdmlydCkpOworCisJCQlpcl9wcmdbaV0uYnJhbmNoQWRkcmVzcyA9CisJCQkJY3B1X3RvX2xlMzIoKGRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKGlyX3JlZywKKwkJCQkJICAgIChpICsgMSkgKiBzaXplb2Yoc3RydWN0IGRtYV9jbWQpKSAmIDB4ZmZmZmZmZjApIHwgMHgxKTsKKwkJfQorCisJCS8qIFRoZSBsYXN0IGRlc2NyaXB0b3Igd2lsbCBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgKi8KKwkJaXJfcHJnW2ldLmNvbnRyb2wgPSBjcHVfdG9fbGUzMihETUFfQ1RMX0lOUFVUX01PUkUgfCBETUFfQ1RMX1VQREFURSB8CisJCQkJCQlETUFfQ1RMX0lSUSB8IERNQV9DVExfQlJBTkNIIHwgZC0+bGVmdF9zaXplKTsKKwkJaXJfcHJnW2ldLmFkZHJlc3MgPSBjcHVfdG9fbGUzMihkbWFfcmVnaW9uX29mZnNldF90b19idXMoJmQtPmRtYSwKKwkJCQkJCShidWYrKGktMSkqUEFHRV9TSVpFKSAtCisJCQkJCQkodW5zaWduZWQgbG9uZylkLT5kbWEua3ZpcnQpKTsKKwl9IGVsc2UgeworCQkvKiBPbmx5IG9uZSBETUEgcGFnZSBpcyB1c2VkLiBSZWFkIGQtPmxlZnRfc2l6ZSBpbW1lZGlhdGVseSBhbmQgKi8KKwkJLyogZ2VuZXJhdGUgYW4gaW50ZXJydXB0IGFzIHRoaXMgaXMgYWxzbyB0aGUgbGFzdCBwYWdlLiAqLworCQlpcl9wcmdbMV0uY29udHJvbCA9IGNwdV90b19sZTMyKERNQV9DVExfSU5QVVRfTU9SRSB8IERNQV9DVExfVVBEQVRFIHwKKwkJCQkJCURNQV9DVExfSVJRIHwgRE1BX0NUTF9CUkFOQ0ggfCAoZC0+bGVmdF9zaXplLTQpKTsKKwkJaXJfcHJnWzFdLmFkZHJlc3MgPSBjcHVfdG9fbGUzMihkbWFfcmVnaW9uX29mZnNldF90b19idXMoJmQtPmRtYSwKKwkJCQkJCShidWYgKyA0KSAtICh1bnNpZ25lZCBsb25nKWQtPmRtYS5rdmlydCkpOworCX0KK30KKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9kbWFfaXJfY3R4KHN0cnVjdCBkbWFfaXNvX2N0eCAqZCwgaW50IHRhZywgaW50IGZsYWdzKQoreworCXN0cnVjdCB0aV9vaGNpICpvaGNpID0gKHN0cnVjdCB0aV9vaGNpICopZC0+b2hjaTsKKwlpbnQgaTsKKworCWQtPmZsYWdzID0gZmxhZ3M7CisKKwlvaGNpMTM5NF9zdG9wX2NvbnRleHQob2hjaSwgZC0+Y3RybENsZWFyLCBOVUxMKTsKKworCWZvciAoaT0wO2k8ZC0+bnVtX2Rlc2M7aSsrKSB7CisJCWluaXRpYWxpemVfZG1hX2lyX3ByZyhkLCBpLCBmbGFncyk7CisJCXJlc2V0X2lyX3N0YXR1cyhkLCBpKTsKKwl9CisKKwkvKiByZXNldCB0aGUgY3RybCByZWdpc3RlciAqLworCXJlZ193cml0ZShvaGNpLCBkLT5jdHJsQ2xlYXIsIDB4ZjAwMDAwMDApOworCisJLyogU2V0IGJ1ZmZlckZpbGwgKi8KKwlyZWdfd3JpdGUob2hjaSwgZC0+Y3RybFNldCwgMHg4MDAwMDAwMCk7CisKKwkvKiBTZXQgaXNvY2ggaGVhZGVyICovCisJaWYgKGZsYWdzICYgVklERU8xMzk0X0lOQ0xVREVfSVNPX0hFQURFUlMpCisJCXJlZ193cml0ZShvaGNpLCBkLT5jdHJsU2V0LCAweDQwMDAwMDAwKTsKKworCS8qIFNldCB0aGUgY29udGV4dCBtYXRjaCByZWdpc3RlciB0byBtYXRjaCBvbiBhbGwgdGFncywKKwkgICBzeW5jIGZvciBzeW5jIHRhZywgYW5kIGxpc3RlbiB0byBkLT5jaGFubmVsICovCisJcmVnX3dyaXRlKG9oY2ksIGQtPmN0eE1hdGNoLCAweGYwMDAwMDAwfCgodGFnJjB4Zik8PDgpfGQtPmNoYW5uZWwpOworCisJLyogU2V0IHVwIGlzb1JlY3ZJbnRNYXNrIHRvIGdlbmVyYXRlIGludGVycnVwdHMgKi8KKwlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSXNvUmVjdkludE1hc2tTZXQsIDE8PGQtPmN0eCk7Cit9CisKKy8qIGZpbmQgd2hpY2ggY29udGV4dCBpcyBsaXN0ZW5pbmcgdG8gdGhpcyBjaGFubmVsICovCitzdGF0aWMgc3RydWN0IGRtYV9pc29fY3R4ICoKK2ZpbmRfY3R4KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIGludCB0eXBlLCBpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgZG1hX2lzb19jdHggKmN0eDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCBsaXN0LCBsaW5rKSB7CisJCWlmIChjdHgtPnR5cGUgPT0gdHlwZSAmJiBjdHgtPmNoYW5uZWwgPT0gY2hhbm5lbCkKKwkJCXJldHVybiBjdHg7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHdha2V1cF9kbWFfaXJfY3R4KHVuc2lnbmVkIGxvbmcgbCkKK3sKKwlzdHJ1Y3QgZG1hX2lzb19jdHggKmQgPSAoc3RydWN0IGRtYV9pc29fY3R4ICopIGw7CisJaW50IGk7CisKKwlzcGluX2xvY2soJmQtPmxvY2spOworCisJZm9yIChpID0gMDsgaSA8IGQtPm51bV9kZXNjOyBpKyspIHsKKwkJaWYgKGQtPmlyX3ByZ1tpXVtkLT5uYl9jbWQtMV0uc3RhdHVzICYgY3B1X3RvX2xlMzIoMHhGRkZGMDAwMCkpIHsKKwkJCXJlc2V0X2lyX3N0YXR1cyhkLCBpKTsKKwkJCWQtPmJ1ZmZlcl9zdGF0dXNbaV0gPSBWSURFTzEzOTRfQlVGRkVSX1JFQURZOworCQkJZG9fZ2V0dGltZW9mZGF5KCZkLT5idWZmZXJfdGltZVtpXSk7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmZC0+bG9jayk7CisKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZC0+d2FpdHEpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmQtPndhaXRxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF90aW1lc3RhbXAoc3RydWN0IHRpX29oY2kgKm9oY2ksIHN0cnVjdCBkbWFfaXNvX2N0eCAqIGQsCisJCQkJIGludCBuKQoreworCXVuc2lnbmVkIGNoYXIqIGJ1ZiA9IGQtPmRtYS5rdmlydCArIG4gKiBkLT5idWZfc2l6ZTsKKwl1MzIgY3ljbGVUaW1lcjsKKwl1MzIgdGltZVN0YW1wOworCisJaWYgKG4gPT0gLTEpIHsKKwkgIHJldHVybjsKKwl9CisKKwljeWNsZVRpbWVyID0gcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfSXNvY2hyb25vdXNDeWNsZVRpbWVyKTsKKworCXRpbWVTdGFtcCA9ICgoY3ljbGVUaW1lciAmIDB4MGZmZikgKyBkLT5zeXRfb2Zmc2V0KTsgLyogMTEwNTkgPSA0NTAgdXMgKi8KKwl0aW1lU3RhbXAgPSAodGltZVN0YW1wICUgMzA3MiArICgodGltZVN0YW1wIC8gMzA3MikgPDwgMTIpCisJCSsgKGN5Y2xlVGltZXIgJiAweGYwMDApKSAmIDB4ZmZmZjsKKworCWJ1Zls2XSA9IHRpbWVTdGFtcCA+PiA4OworCWJ1Zls3XSA9IHRpbWVTdGFtcCAmIDB4ZmY7CisKKyAgICAvKiBpZiBmaXJzdCBwYWNrZXQgaXMgZW1wdHkgcGFja2V0LCB0aGVuIHB1dCB0aW1lc3RhbXAgaW50byB0aGUgbmV4dCBmdWxsIG9uZSB0b28gKi8KKyAgICBpZiAoIChsZTMyX3RvX2NwdShkLT5pdF9wcmdbbl1bMF0uZGF0YVsxXSkgPj4xNikgPT0gMHgwMDgpIHsKKyAgIAkgICAgYnVmICs9IGQtPnBhY2tldF9zaXplOworICAgIAlidWZbNl0gPSB0aW1lU3RhbXAgPj4gODsKKwkgICAgYnVmWzddID0gdGltZVN0YW1wICYgMHhmZjsKKwl9CisKKyAgICAvKiBkbyB0aGUgbmV4dCBidWZmZXIgZnJhbWUgdG9vIGluIGNhc2Ugb2YgaXJxIGxhdGVuY3kgKi8KKwluID0gZC0+bmV4dF9idWZmZXJbbl07CisJaWYgKG4gPT0gLTEpIHsKKwkgIHJldHVybjsKKwl9CisJYnVmID0gZC0+ZG1hLmt2aXJ0ICsgbiAqIGQtPmJ1Zl9zaXplOworCisJdGltZVN0YW1wICs9IChkLT5sYXN0X3VzZWRfY21kW25dIDw8IDEyKSAmIDB4ZmZmZjsKKworCWJ1Zls2XSA9IHRpbWVTdGFtcCA+PiA4OworCWJ1Zls3XSA9IHRpbWVTdGFtcCAmIDB4ZmY7CisKKyAgICAvKiBpZiBmaXJzdCBwYWNrZXQgaXMgZW1wdHkgcGFja2V0LCB0aGVuIHB1dCB0aW1lc3RhbXAgaW50byB0aGUgbmV4dCBmdWxsIG9uZSB0b28gKi8KKyAgICBpZiAoIChsZTMyX3RvX2NwdShkLT5pdF9wcmdbbl1bMF0uZGF0YVsxXSkgPj4xNikgPT0gMHgwMDgpIHsKKyAgIAkgICAgYnVmICs9IGQtPnBhY2tldF9zaXplOworICAgIAlidWZbNl0gPSB0aW1lU3RhbXAgPj4gODsKKwkgICAgYnVmWzddID0gdGltZVN0YW1wICYgMHhmZjsKKwl9CisKKyNpZiAwCisJcHJpbnRrKCJjdXJyOiAlZCwgbmV4dDogJWQsIGN5Y2xlVGltZXI6ICUwOHggdGltZVN0YW1wOiAlMDh4XG4iLAorCSAgICAgICBjdXJyLCBuLCBjeWNsZVRpbWVyLCB0aW1lU3RhbXApOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHdha2V1cF9kbWFfaXRfY3R4KHVuc2lnbmVkIGxvbmcgbCkKK3sKKwlzdHJ1Y3QgZG1hX2lzb19jdHggKmQgPSAoc3RydWN0IGRtYV9pc29fY3R4ICopIGw7CisJc3RydWN0IHRpX29oY2kgKm9oY2kgPSBkLT5vaGNpOworCWludCBpOworCisJc3Bpbl9sb2NrKCZkLT5sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBkLT5udW1fZGVzYzsgaSsrKSB7CisJCWlmIChkLT5pdF9wcmdbaV1bZC0+bGFzdF91c2VkX2NtZFtpXV0uZW5kLnN0YXR1cyAmCisJCSAgICBjcHVfdG9fbGUzMigweEZGRkYwMDAwKSkgeworCQkJaW50IG5leHQgPSBkLT5uZXh0X2J1ZmZlcltpXTsKKwkJCXB1dF90aW1lc3RhbXAob2hjaSwgZCwgbmV4dCk7CisJCQlkLT5pdF9wcmdbaV1bZC0+bGFzdF91c2VkX2NtZFtpXV0uZW5kLnN0YXR1cyA9IDA7CisJCQlkLT5idWZmZXJfc3RhdHVzW2ldID0gVklERU8xMzk0X0JVRkZFUl9SRUFEWTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZkLT5sb2NrKTsKKworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZkLT53YWl0cSkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZC0+d2FpdHEpOworfQorCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX2RtYV9pdF9wcmcoc3RydWN0IGRtYV9pc29fY3R4ICpkLCBpbnQgbiwgaW50IHN5bmNfdGFnKQoreworCXN0cnVjdCBpdF9kbWFfcHJnICppdF9wcmcgPSBkLT5pdF9wcmdbbl07CisJc3RydWN0IGRtYV9wcm9nX3JlZ2lvbiAqaXRfcmVnID0gJmQtPnByZ19yZWdbbl07CisJdW5zaWduZWQgbG9uZyBidWYgPSAodW5zaWduZWQgbG9uZylkLT5kbWEua3ZpcnQgKyBuICogZC0+YnVmX3NpemU7CisJaW50IGk7CisJZC0+bGFzdF91c2VkX2NtZFtuXSA9IGQtPm5iX2NtZCAtIDE7CisJZm9yIChpPTA7aTxkLT5uYl9jbWQ7aSsrKSB7CisKKwkJaXRfcHJnW2ldLmJlZ2luLmNvbnRyb2wgPSBjcHVfdG9fbGUzMihETUFfQ1RMX09VVFBVVF9NT1JFIHwKKwkJCURNQV9DVExfSU1NRURJQVRFIHwgOCkgOworCQlpdF9wcmdbaV0uYmVnaW4uYWRkcmVzcyA9IDA7CisKKwkJaXRfcHJnW2ldLmJlZ2luLnN0YXR1cyA9IDA7CisKKwkJaXRfcHJnW2ldLmRhdGFbMF0gPSBjcHVfdG9fbGUzMigKKwkJCShJRUVFMTM5NF9TUEVFRF8xMDAgPDwgMTYpCisJCQl8ICgvKiB0YWcgKi8gMSA8PCAxNCkKKwkJCXwgKGQtPmNoYW5uZWwgPDwgOCkKKwkJCXwgKFRDT0RFX0lTT19EQVRBIDw8IDQpKTsKKwkJaWYgKGk9PTApIGl0X3ByZ1tpXS5kYXRhWzBdIHw9IGNwdV90b19sZTMyKHN5bmNfdGFnKTsKKwkJaXRfcHJnW2ldLmRhdGFbMV0gPSBjcHVfdG9fbGUzMihkLT5wYWNrZXRfc2l6ZSA8PCAxNik7CisJCWl0X3ByZ1tpXS5kYXRhWzJdID0gMDsKKwkJaXRfcHJnW2ldLmRhdGFbM10gPSAwOworCisJCWl0X3ByZ1tpXS5lbmQuY29udHJvbCA9IGNwdV90b19sZTMyKERNQV9DVExfT1VUUFVUX0xBU1QgfAorCQkJICAgIAkgICAgCSAgICAgRE1BX0NUTF9CUkFOQ0gpOworCQlpdF9wcmdbaV0uZW5kLmFkZHJlc3MgPQorCQkJY3B1X3RvX2xlMzIoZG1hX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZkLT5kbWEsIChidWYraSpkLT5wYWNrZXRfc2l6ZSkgLQorCQkJCQkJKHVuc2lnbmVkIGxvbmcpZC0+ZG1hLmt2aXJ0KSk7CisKKwkJaWYgKGk8ZC0+bmJfY21kLTEpIHsKKwkJCWl0X3ByZ1tpXS5lbmQuY29udHJvbCB8PSBjcHVfdG9fbGUzMihkLT5wYWNrZXRfc2l6ZSk7CisJCQlpdF9wcmdbaV0uYmVnaW4uYnJhbmNoQWRkcmVzcyA9CisJCQkJY3B1X3RvX2xlMzIoKGRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKGl0X3JlZywgKGkgKyAxKSAqCisJCQkJCXNpemVvZihzdHJ1Y3QgaXRfZG1hX3ByZykpICYgMHhmZmZmZmZmMCkgfCAweDMpOworCQkJaXRfcHJnW2ldLmVuZC5icmFuY2hBZGRyZXNzID0KKwkJCQljcHVfdG9fbGUzMigoZG1hX3Byb2dfcmVnaW9uX29mZnNldF90b19idXMoaXRfcmVnLCAoaSArIDEpICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpdF9kbWFfcHJnKSkgJiAweGZmZmZmZmYwKSB8IDB4Myk7CisJCX0gZWxzZSB7CisJCQkvKiB0aGUgbGFzdCBwcmcgZ2VuZXJhdGVzIGFuIGludGVycnVwdCAqLworCQkJaXRfcHJnW2ldLmVuZC5jb250cm9sIHw9IGNwdV90b19sZTMyKERNQV9DVExfVVBEQVRFIHwKKwkJCQlETUFfQ1RMX0lSUSB8IGQtPmxlZnRfc2l6ZSk7CisJCQkvKiB0aGUgbGFzdCBwcmcgZG9lc24ndCBicmFuY2ggKi8KKwkJCWl0X3ByZ1tpXS5iZWdpbi5icmFuY2hBZGRyZXNzID0gMDsKKwkJCWl0X3ByZ1tpXS5lbmQuYnJhbmNoQWRkcmVzcyA9IDA7CisJCX0KKwkJaXRfcHJnW2ldLmVuZC5zdGF0dXMgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9kbWFfaXRfcHJnX3Zhcl9wYWNrZXRfcXVldWUoCisJc3RydWN0IGRtYV9pc29fY3R4ICpkLCBpbnQgbiwgdW5zaWduZWQgaW50ICogcGFja2V0X3NpemVzLAorCXN0cnVjdCB0aV9vaGNpICpvaGNpKQoreworCXN0cnVjdCBpdF9kbWFfcHJnICppdF9wcmcgPSBkLT5pdF9wcmdbbl07CisJc3RydWN0IGRtYV9wcm9nX3JlZ2lvbiAqaXRfcmVnID0gJmQtPnByZ19yZWdbbl07CisJaW50IGk7CisKKyNpZiAwCisJaWYgKG4gIT0gLTEpIHsKKwkJcHV0X3RpbWVzdGFtcChvaGNpLCBkLCBuKTsKKwl9CisjZW5kaWYKKwlkLT5sYXN0X3VzZWRfY21kW25dID0gZC0+bmJfY21kIC0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBkLT5uYl9jbWQ7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwkJaWYgKHBhY2tldF9zaXplc1tpXSA+IGQtPnBhY2tldF9zaXplKSB7CisJCQlzaXplID0gZC0+cGFja2V0X3NpemU7CisJCX0gZWxzZSB7CisJCQlzaXplID0gcGFja2V0X3NpemVzW2ldOworCQl9CisJCWl0X3ByZ1tpXS5kYXRhWzFdID0gY3B1X3RvX2xlMzIoc2l6ZSA8PCAxNik7CisJCWl0X3ByZ1tpXS5lbmQuY29udHJvbCA9IGNwdV90b19sZTMyKERNQV9DVExfT1VUUFVUX0xBU1QgfCBETUFfQ1RMX0JSQU5DSCk7CisKKwkJaWYgKGkgPCBkLT5uYl9jbWQtMSAmJiBwYWNrZXRfc2l6ZXNbaSsxXSAhPSAwKSB7CisJCQlpdF9wcmdbaV0uZW5kLmNvbnRyb2wgfD0gY3B1X3RvX2xlMzIoc2l6ZSk7CisJCQlpdF9wcmdbaV0uYmVnaW4uYnJhbmNoQWRkcmVzcyA9CisJCQkJY3B1X3RvX2xlMzIoKGRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKGl0X3JlZywgKGkgKyAxKSAqCisJCQkJCXNpemVvZihzdHJ1Y3QgaXRfZG1hX3ByZykpICYgMHhmZmZmZmZmMCkgfCAweDMpOworCQkJaXRfcHJnW2ldLmVuZC5icmFuY2hBZGRyZXNzID0KKwkJCQljcHVfdG9fbGUzMigoZG1hX3Byb2dfcmVnaW9uX29mZnNldF90b19idXMoaXRfcmVnLCAoaSArIDEpICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpdF9kbWFfcHJnKSkgJiAweGZmZmZmZmYwKSB8IDB4Myk7CisJCX0gZWxzZSB7CisJCQkvKiB0aGUgbGFzdCBwcmcgZ2VuZXJhdGVzIGFuIGludGVycnVwdCAqLworCQkJaXRfcHJnW2ldLmVuZC5jb250cm9sIHw9IGNwdV90b19sZTMyKERNQV9DVExfVVBEQVRFIHwKKwkJCQlETUFfQ1RMX0lSUSB8IHNpemUpOworCQkJLyogdGhlIGxhc3QgcHJnIGRvZXNuJ3QgYnJhbmNoICovCisJCQlpdF9wcmdbaV0uYmVnaW4uYnJhbmNoQWRkcmVzcyA9IDA7CisJCQlpdF9wcmdbaV0uZW5kLmJyYW5jaEFkZHJlc3MgPSAwOworCQkJZC0+bGFzdF91c2VkX2NtZFtuXSA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9kbWFfaXRfY3R4KHN0cnVjdCBkbWFfaXNvX2N0eCAqZCwgaW50IHN5bmNfdGFnLAorCQkJCSAgdW5zaWduZWQgaW50IHN5dF9vZmZzZXQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IChzdHJ1Y3QgdGlfb2hjaSAqKWQtPm9oY2k7CisJaW50IGk7CisKKwlkLT5mbGFncyA9IGZsYWdzOworCWQtPnN5dF9vZmZzZXQgPSAoc3l0X29mZnNldCA9PSAwID8gMTEwMDAgOiBzeXRfb2Zmc2V0KTsKKworCW9oY2kxMzk0X3N0b3BfY29udGV4dChvaGNpLCBkLT5jdHJsQ2xlYXIsIE5VTEwpOworCisJZm9yIChpPTA7aTxkLT5udW1fZGVzYztpKyspCisJCWluaXRpYWxpemVfZG1hX2l0X3ByZyhkLCBpLCBzeW5jX3RhZyk7CisKKwkvKiBTZXQgdXAgaXNvUmVjdkludE1hc2sgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cyAqLworCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9Jc29YbWl0SW50TWFza1NldCwgMTw8ZC0+Y3R4KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCB2aWRlbzEzOTRfYnVmZmVyX3N0YXRlKHN0cnVjdCBkbWFfaXNvX2N0eCAqZCwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IGJ1ZmZlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCByZXQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKKwlyZXQgPSBkLT5idWZmZXJfc3RhdHVzW2J1ZmZlcl07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX192aWRlbzEzOTRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBmaWxlX2N0eCAqY3R4ID0gKHN0cnVjdCBmaWxlX2N0eCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IGN0eC0+b2hjaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJc3dpdGNoKGNtZCkKKwl7CisJY2FzZSBWSURFTzEzOTRfSU9DX0xJU1RFTl9DSEFOTkVMOgorCWNhc2UgVklERU8xMzk0X0lPQ19UQUxLX0NIQU5ORUw6CisJeworCQlzdHJ1Y3QgdmlkZW8xMzk0X21tYXAgdjsKKwkJdTY0IG1hc2s7CisJCXN0cnVjdCBkbWFfaXNvX2N0eCAqZDsKKwkJaW50IGk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2LCBhcmdwLCBzaXplb2YodikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogaWYgY2hhbm5lbCA8IDAsIGZpbmQgbG93ZXN0IGF2YWlsYWJsZSBvbmUgKi8KKwkJaWYgKHYuY2hhbm5lbCA8IDApIHsKKwkJICAgIG1hc2sgPSAodTY0KTB4MTsKKwkJICAgIGZvciAoaT0wOyA7IGkrKykgeworCQkJaWYgKGkgPT0gSVNPX0NIQU5ORUxTKSB7CisJCQkgICAgUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLCAKKwkJCQkgICJObyBmcmVlIGNoYW5uZWwgZm91bmQiKTsKKwkJCSAgICByZXR1cm4gRUFHQUlOOworCQkJfQorCQkJaWYgKCEob2hjaS0+SVNPX2NoYW5uZWxfdXNhZ2UgJiBtYXNrKSkgeworCQkJICAgIHYuY2hhbm5lbCA9IGk7CisJCQkgICAgUFJJTlQoS0VSTl9JTkZPLCBvaGNpLT5ob3N0LT5pZCwgIkZvdW5kIGZyZWUgY2hhbm5lbCAlZCIsIGkpOworCQkJICAgIGJyZWFrOworCQkJfQorCQkJbWFzayA9IG1hc2sgPDwgMTsKKwkJICAgIH0KKwkJfSBlbHNlIGlmICh2LmNoYW5uZWwgPj0gSVNPX0NIQU5ORUxTKSB7CisJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCisJCQkgICAgICAiSXNvIGNoYW5uZWwgJWQgb3V0IG9mIGJvdW5kcyIsIHYuY2hhbm5lbCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCW1hc2sgPSAodTY0KTB4MTw8di5jaGFubmVsOworCQl9CisJCVBSSU5UKEtFUk5fSU5GTywgb2hjaS0+aG9zdC0+aWQsICJtYXNrOiAlMDhYJTA4WCB1c2FnZTogJTA4WCUwOFhcbiIsCisJCQkodTMyKShtYXNrPj4zMiksKHUzMikobWFzayYweGZmZmZmZmZmKSwKKwkJCSh1MzIpKG9oY2ktPklTT19jaGFubmVsX3VzYWdlPj4zMiksCisJCQkodTMyKShvaGNpLT5JU09fY2hhbm5lbF91c2FnZSYweGZmZmZmZmZmKSk7CisJCWlmIChvaGNpLT5JU09fY2hhbm5lbF91c2FnZSAmIG1hc2spIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKKwkJCSAgICAgICJDaGFubmVsICVkIGlzIGFscmVhZHkgdGFrZW4iLCB2LmNoYW5uZWwpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCWlmICh2LmJ1Zl9zaXplID09IDAgfHwgdi5idWZfc2l6ZSA+IFZJREVPMTM5NF9NQVhfU0laRSkgeworCQkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLAorCQkJICAgICAgIkludmFsaWQgJWQgbGVuZ3RoIGJ1ZmZlciByZXF1ZXN0ZWQiLHYuYnVmX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAodi5uYl9idWZmZXJzID09IDAgfHwgdi5uYl9idWZmZXJzID4gVklERU8xMzk0X01BWF9TSVpFKSB7CisJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCisJCQkgICAgICAiSW52YWxpZCAlZCBidWZmZXJzIHJlcXVlc3RlZCIsdi5uYl9idWZmZXJzKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHYubmJfYnVmZmVycyAqIHYuYnVmX3NpemUgPiBWSURFTzEzOTRfTUFYX1NJWkUpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKKwkJCSAgICAgICIlZCBidWZmZXJzIG9mIHNpemUgJWQgYnl0ZXMgaXMgdG9vIGJpZyIsCisJCQkgICAgICB2Lm5iX2J1ZmZlcnMsIHYuYnVmX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoY21kID09IFZJREVPMTM5NF9JT0NfTElTVEVOX0NIQU5ORUwpIHsKKwkJCWQgPSBhbGxvY19kbWFfaXNvX2N0eChvaGNpLCBPSENJX0lTT19SRUNFSVZFLAorCQkJCQkgICAgICB2Lm5iX2J1ZmZlcnMsIHYuYnVmX3NpemUsCisJCQkJCSAgICAgIHYuY2hhbm5lbCwgMCk7CisKKwkJCWlmIChkID09IE5VTEwpIHsKKwkJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCisJCQkJICAgICAgIkNvdWxkbid0IGFsbG9jYXRlIGlyIGNvbnRleHQiKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKwkJCWluaXRpYWxpemVfZG1hX2lyX2N0eChkLCB2LnN5bmNfdGFnLCB2LmZsYWdzKTsKKworCQkJY3R4LT5jdXJyZW50X2N0eCA9IGQ7CisKKwkJCXYuYnVmX3NpemUgPSBkLT5idWZfc2l6ZTsKKwkJCWxpc3RfYWRkX3RhaWwoJmQtPmxpbmssICZjdHgtPmNvbnRleHRfbGlzdCk7CisKKwkJCVBSSU5UKEtFUk5fSU5GTywgb2hjaS0+aG9zdC0+aWQsCisJCQkgICAgICAiaXNvIGNvbnRleHQgJWQgbGlzdGVuIG9uIGNoYW5uZWwgJWQiLAorCQkJICAgICAgZC0+Y3R4LCB2LmNoYW5uZWwpOworCQl9CisJCWVsc2UgeworCQkJZCA9IGFsbG9jX2RtYV9pc29fY3R4KG9oY2ksIE9IQ0lfSVNPX1RSQU5TTUlULAorCQkJCQkgICAgICB2Lm5iX2J1ZmZlcnMsIHYuYnVmX3NpemUsCisJCQkJCSAgICAgIHYuY2hhbm5lbCwgdi5wYWNrZXRfc2l6ZSk7CisKKwkJCWlmIChkID09IE5VTEwpIHsKKwkJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCisJCQkJICAgICAgIkNvdWxkbid0IGFsbG9jYXRlIGl0IGNvbnRleHQiKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKwkJCWluaXRpYWxpemVfZG1hX2l0X2N0eChkLCB2LnN5bmNfdGFnLAorCQkJCQkgICAgICB2LnN5dF9vZmZzZXQsIHYuZmxhZ3MpOworCisJCQljdHgtPmN1cnJlbnRfY3R4ID0gZDsKKworCQkJdi5idWZfc2l6ZSA9IGQtPmJ1Zl9zaXplOworCisJCQlsaXN0X2FkZF90YWlsKCZkLT5saW5rLCAmY3R4LT5jb250ZXh0X2xpc3QpOworCisJCQlQUklOVChLRVJOX0lORk8sIG9oY2ktPmhvc3QtPmlkLAorCQkJICAgICAgIklzbyBjb250ZXh0ICVkIHRhbGsgb24gY2hhbm5lbCAlZCIsIGQtPmN0eCwKKwkJCSAgICAgIHYuY2hhbm5lbCk7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopYXJnLCAmdiwgc2l6ZW9mKHYpKSkgeworCQkJLyogRklYTUUgOiBmcmVlIGFsbG9jYXRlZCBkbWEgcmVzb3VyY2VzICovCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQkKKwkJb2hjaS0+SVNPX2NoYW5uZWxfdXNhZ2UgfD0gbWFzazsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURFTzEzOTRfSU9DX1VOTElTVEVOX0NIQU5ORUw6CisJY2FzZSBWSURFTzEzOTRfSU9DX1VOVEFMS19DSEFOTkVMOgorCXsKKwkJaW50IGNoYW5uZWw7CisJCXU2NCBtYXNrOworCQlzdHJ1Y3QgZG1hX2lzb19jdHggKmQ7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaGFubmVsLCBhcmdwLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+PSBJU09fQ0hBTk5FTFMpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKKwkJCSAgICAgICJJc28gY2hhbm5lbCAlZCBvdXQgb2YgYm91bmQiLCBjaGFubmVsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1hc2sgPSAodTY0KTB4MTw8Y2hhbm5lbDsKKwkJaWYgKCEob2hjaS0+SVNPX2NoYW5uZWxfdXNhZ2UgJiBtYXNrKSkgeworCQkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLAorCQkJICAgICAgIkNoYW5uZWwgJWQgaXMgbm90IGJlaW5nIHVzZWQiLCBjaGFubmVsKTsKKwkJCXJldHVybiAtRVNSQ0g7CisJCX0KKworCQkvKiBNYXJrIHRoaXMgY2hhbm5lbCBhcyB1bnVzZWQgKi8KKwkJb2hjaS0+SVNPX2NoYW5uZWxfdXNhZ2UgJj0gfm1hc2s7CisKKwkJaWYgKGNtZCA9PSBWSURFTzEzOTRfSU9DX1VOTElTVEVOX0NIQU5ORUwpCisJCQlkID0gZmluZF9jdHgoJmN0eC0+Y29udGV4dF9saXN0LCBPSENJX0lTT19SRUNFSVZFLCBjaGFubmVsKTsKKwkJZWxzZQorCQkJZCA9IGZpbmRfY3R4KCZjdHgtPmNvbnRleHRfbGlzdCwgT0hDSV9JU09fVFJBTlNNSVQsIGNoYW5uZWwpOworCisJCWlmIChkID09IE5VTEwpIHJldHVybiAtRVNSQ0g7CisJCVBSSU5UKEtFUk5fSU5GTywgb2hjaS0+aG9zdC0+aWQsICJJc28gY29udGV4dCAlZCAiCisJCSAgICAgICJzdG9wIHRhbGtpbmcgb24gY2hhbm5lbCAlZCIsIGQtPmN0eCwgY2hhbm5lbCk7CisJCWZyZWVfZG1hX2lzb19jdHgoZCk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklERU8xMzk0X0lPQ19MSVNURU5fUVVFVUVfQlVGRkVSOgorCXsKKwkJc3RydWN0IHZpZGVvMTM5NF93YWl0IHY7CisJCXN0cnVjdCBkbWFfaXNvX2N0eCAqZDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIGFyZ3AsIHNpemVvZih2KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlkID0gZmluZF9jdHgoJmN0eC0+Y29udGV4dF9saXN0LCBPSENJX0lTT19SRUNFSVZFLCB2LmNoYW5uZWwpOworCQlpZiAoZCA9PSBOVUxMKSByZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoKHYuYnVmZmVyPDApIHx8ICh2LmJ1ZmZlcj5kLT5udW1fZGVzYykpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKKwkJCSAgICAgICJCdWZmZXIgJWQgb3V0IG9mIHJhbmdlIix2LmJ1ZmZlcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkLT5sb2NrLGZsYWdzKTsKKworCQlpZiAoZC0+YnVmZmVyX3N0YXR1c1t2LmJ1ZmZlcl09PVZJREVPMTM5NF9CVUZGRVJfUVVFVUVEKSB7CisJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCisJCQkgICAgICAiQnVmZmVyICVkIGlzIGFscmVhZHkgdXNlZCIsdi5idWZmZXIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jayxmbGFncyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJZC0+YnVmZmVyX3N0YXR1c1t2LmJ1ZmZlcl09VklERU8xMzk0X0JVRkZFUl9RVUVVRUQ7CisKKwkJaWYgKGQtPmxhc3RfYnVmZmVyPj0wKQorCQkJZC0+aXJfcHJnW2QtPmxhc3RfYnVmZmVyXVtkLT5uYl9jbWQtMV0uYnJhbmNoQWRkcmVzcyA9CisJCQkJY3B1X3RvX2xlMzIoKGRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZkLT5wcmdfcmVnW3YuYnVmZmVyXSwgMCkKKwkJCQkJJiAweGZmZmZmZmYwKSB8IDB4MSk7CisKKwkJZC0+bGFzdF9idWZmZXIgPSB2LmJ1ZmZlcjsKKworCQlkLT5pcl9wcmdbZC0+bGFzdF9idWZmZXJdW2QtPm5iX2NtZC0xXS5icmFuY2hBZGRyZXNzID0gMDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLGZsYWdzKTsKKworCQlpZiAoIShyZWdfcmVhZChvaGNpLCBkLT5jdHJsU2V0KSAmIDB4ODAwMCkpCisJCXsKKwkJCURCR01TRyhvaGNpLT5ob3N0LT5pZCwgIlN0YXJ0aW5nIGlzbyBETUEgY3R4PSVkIixkLT5jdHgpOworCisJCQkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHdoZXJlIHRoZSBmaXJzdCBwcm9ncmFtIGlzICovCisJCQlyZWdfd3JpdGUob2hjaSwgZC0+Y21kUHRyLAorCQkJCWRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZkLT5wcmdfcmVnW3YuYnVmZmVyXSwgMCkgfCAweDEpOworCisJCQkvKiBSdW4gSVIgY29udGV4dCAqLworCQkJcmVnX3dyaXRlKG9oY2ksIGQtPmN0cmxTZXQsIDB4ODAwMCk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBXYWtlIHVwIGRtYSBjb250ZXh0IGlmIG5lY2Vzc2FyeSAqLworCQkJaWYgKCEocmVnX3JlYWQob2hjaSwgZC0+Y3RybFNldCkgJiAweDQwMCkpIHsKKwkJCQlQUklOVChLRVJOX0lORk8sIG9oY2ktPmhvc3QtPmlkLAorCQkJCSAgICAgICJXYWtpbmcgdXAgaXNvIGRtYSBjdHg9JWQiLCBkLT5jdHgpOworCQkJCXJlZ193cml0ZShvaGNpLCBkLT5jdHJsU2V0LCAweDEwMDApOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJfQorCWNhc2UgVklERU8xMzk0X0lPQ19MSVNURU5fV0FJVF9CVUZGRVI6CisJY2FzZSBWSURFTzEzOTRfSU9DX0xJU1RFTl9QT0xMX0JVRkZFUjoKKwl7CisJCXN0cnVjdCB2aWRlbzEzOTRfd2FpdCB2OworCQlzdHJ1Y3QgZG1hX2lzb19jdHggKmQ7CisJCWludCBpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJncCwgc2l6ZW9mKHYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWQgPSBmaW5kX2N0eCgmY3R4LT5jb250ZXh0X2xpc3QsIE9IQ0lfSVNPX1JFQ0VJVkUsIHYuY2hhbm5lbCk7CisJCWlmIChkID09IE5VTEwpIHJldHVybiAtRUZBVUxUOworCisJCWlmICgodi5idWZmZXI8MCkgfHwgKHYuYnVmZmVyPmQtPm51bV9kZXNjKSkgeworCQkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLAorCQkJICAgICAgIkJ1ZmZlciAlZCBvdXQgb2YgcmFuZ2UiLHYuYnVmZmVyKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyoKKwkJICogSSBjaGFuZ2UgdGhlIHdheSBpdCB3b3JrcyBzbyB0aGF0IGl0IHJldHVybnMKKwkJICogdGhlIGxhc3QgcmVjZWl2ZWQgZnJhbWUuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jaywgZmxhZ3MpOworCQlzd2l0Y2goZC0+YnVmZmVyX3N0YXR1c1t2LmJ1ZmZlcl0pIHsKKwkJY2FzZSBWSURFTzEzOTRfQlVGRkVSX1JFQURZOgorCQkJZC0+YnVmZmVyX3N0YXR1c1t2LmJ1ZmZlcl09VklERU8xMzk0X0JVRkZFUl9GUkVFOworCQkJYnJlYWs7CisJCWNhc2UgVklERU8xMzk0X0JVRkZFUl9RVUVVRUQ6CisJCQlpZiAoY21kID09IFZJREVPMTM5NF9JT0NfTElTVEVOX1BPTExfQlVGRkVSKSB7CisJCQkgICAgLyogZm9yIHBvbGxpbmcsIHJldHVybiBlcnJvciBjb2RlIEVJTlRSICovCisJCQkgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOworCQkJICAgIHJldHVybiAtRUlOVFI7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkLT53YWl0cSwKKwkJCQkJdmlkZW8xMzk0X2J1ZmZlcl9zdGF0ZShkLCB2LmJ1ZmZlcikgPT0KKwkJCQkJIFZJREVPMTM5NF9CVUZGRVJfUkVBRFkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlRSOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKKwkJCWQtPmJ1ZmZlcl9zdGF0dXNbdi5idWZmZXJdPVZJREVPMTM5NF9CVUZGRVJfRlJFRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLAorCQkJICAgICAgIkJ1ZmZlciAlZCBpcyBub3QgcXVldWVkIix2LmJ1ZmZlcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVTUkNIOworCQl9CisKKwkJLyogc2V0IHRpbWUgb2YgYnVmZmVyICovCisJCXYuZmlsbHRpbWUgPSBkLT5idWZmZXJfdGltZVt2LmJ1ZmZlcl07CisvLwkJcHJpbnRrKCJCdWZmZXIgJWQgdGltZSAlZFxuIiwgdi5idWZmZXIsIChkLT5idWZmZXJfdGltZVt2LmJ1ZmZlcl0pLnR2X3VzZWMpOworCisJCS8qCisJCSAqIExvb2sgYWhlYWQgdG8gc2VlIGhvdyBtYW55IG1vcmUgYnVmZmVycyBoYXZlIGJlZW4gcmVjZWl2ZWQKKwkJICovCisJCWk9MDsKKwkJd2hpbGUgKGQtPmJ1ZmZlcl9zdGF0dXNbKHYuYnVmZmVyKzEpJWQtPm51bV9kZXNjXT09CisJCSAgICAgICBWSURFTzEzOTRfQlVGRkVSX1JFQURZKSB7CisJCQl2LmJ1ZmZlcj0odi5idWZmZXIrMSklZC0+bnVtX2Rlc2M7CisJCQlpKys7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOworCisJCXYuYnVmZmVyPWk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnYsIHNpemVvZih2KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBWSURFTzEzOTRfSU9DX1RBTEtfUVVFVUVfQlVGRkVSOgorCXsKKwkJc3RydWN0IHZpZGVvMTM5NF93YWl0IHY7CisJCXVuc2lnbmVkIGludCAqcHNpemVzID0gTlVMTDsKKwkJc3RydWN0IGRtYV9pc29fY3R4ICpkOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJncCwgc2l6ZW9mKHYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWQgPSBmaW5kX2N0eCgmY3R4LT5jb250ZXh0X2xpc3QsIE9IQ0lfSVNPX1RSQU5TTUlULCB2LmNoYW5uZWwpOworCQlpZiAoZCA9PSBOVUxMKSByZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoKHYuYnVmZmVyPDApIHx8ICh2LmJ1ZmZlcj5kLT5udW1fZGVzYykpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKKwkJCSAgICAgICJCdWZmZXIgJWQgb3V0IG9mIHJhbmdlIix2LmJ1ZmZlcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChkLT5mbGFncyAmIFZJREVPMTM5NF9WQVJJQUJMRV9QQUNLRVRfU0laRSkgeworCQkJaW50IGJ1Zl9zaXplID0gZC0+bmJfY21kICogc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJCQlzdHJ1Y3QgdmlkZW8xMzk0X3F1ZXVlX3ZhcmlhYmxlIF9fdXNlciAqcCA9IGFyZ3A7CisJCQl1bnNpZ25lZCBpbnQgX191c2VyICpxdjsKKworCQkJaWYgKGdldF91c2VyKHF2LCAmcC0+cGFja2V0X3NpemVzKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcHNpemVzID0ga21hbGxvYyhidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXBzaXplcykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKHBzaXplcywgcXYsIGJ1Zl9zaXplKSkgeworCQkJCWtmcmVlKHBzaXplcyk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jayxmbGFncyk7CisKKwkJaWYgKGQtPmJ1ZmZlcl9zdGF0dXNbdi5idWZmZXJdIT1WSURFTzEzOTRfQlVGRkVSX0ZSRUUpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKKwkJCSAgICAgICJCdWZmZXIgJWQgaXMgYWxyZWFkeSB1c2VkIix2LmJ1ZmZlcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLGZsYWdzKTsKKwkJCWlmIChwc2l6ZXMpCisJCQkJa2ZyZWUocHNpemVzKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlpZiAoZC0+ZmxhZ3MgJiBWSURFTzEzOTRfVkFSSUFCTEVfUEFDS0VUX1NJWkUpIHsKKwkJCWluaXRpYWxpemVfZG1hX2l0X3ByZ192YXJfcGFja2V0X3F1ZXVlKAorCQkJCWQsIHYuYnVmZmVyLCBwc2l6ZXMsCisJCQkJb2hjaSk7CisJCX0KKworCQlkLT5idWZmZXJfc3RhdHVzW3YuYnVmZmVyXT1WSURFTzEzOTRfQlVGRkVSX1FVRVVFRDsKKworCQlpZiAoZC0+bGFzdF9idWZmZXIgPj0gMCkgeworCQkJZC0+aXRfcHJnW2QtPmxhc3RfYnVmZmVyXQorCQkJCVsgZC0+bGFzdF91c2VkX2NtZFtkLT5sYXN0X2J1ZmZlcl0gXS5lbmQuYnJhbmNoQWRkcmVzcyA9CisJCQkJCWNwdV90b19sZTMyKChkbWFfcHJvZ19yZWdpb25fb2Zmc2V0X3RvX2J1cygmZC0+cHJnX3JlZ1t2LmJ1ZmZlcl0sCisJCQkJCQkwKSAmIDB4ZmZmZmZmZjApIHwgMHgzKTsKKworCQkJZC0+aXRfcHJnW2QtPmxhc3RfYnVmZmVyXQorCQkJCVsgZC0+bGFzdF91c2VkX2NtZFtkLT5sYXN0X2J1ZmZlcl0gXS5iZWdpbi5icmFuY2hBZGRyZXNzID0KKwkJCQkJY3B1X3RvX2xlMzIoKGRtYV9wcm9nX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKCZkLT5wcmdfcmVnW3YuYnVmZmVyXSwKKwkJCQkJCTApICYgMHhmZmZmZmZmMCkgfCAweDMpOworCQkJZC0+bmV4dF9idWZmZXJbZC0+bGFzdF9idWZmZXJdID0gdi5idWZmZXI7CisJCX0KKwkJZC0+bGFzdF9idWZmZXIgPSB2LmJ1ZmZlcjsKKwkJZC0+bmV4dF9idWZmZXJbZC0+bGFzdF9idWZmZXJdID0gLTE7CisKKwkJZC0+aXRfcHJnW2QtPmxhc3RfYnVmZmVyXVtkLT5sYXN0X3VzZWRfY21kW2QtPmxhc3RfYnVmZmVyXV0uZW5kLmJyYW5jaEFkZHJlc3MgPSAwOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssZmxhZ3MpOworCisJCWlmICghKHJlZ19yZWFkKG9oY2ksIGQtPmN0cmxTZXQpICYgMHg4MDAwKSkKKwkJeworCQkJREJHTVNHKG9oY2ktPmhvc3QtPmlkLCAiU3RhcnRpbmcgaXNvIHRyYW5zbWl0IERNQSBjdHg9JWQiLAorCQkJICAgICAgIGQtPmN0eCk7CisJCQlwdXRfdGltZXN0YW1wKG9oY2ksIGQsIGQtPmxhc3RfYnVmZmVyKTsKKworCQkJLyogVGVsbCB0aGUgY29udHJvbGxlciB3aGVyZSB0aGUgZmlyc3QgcHJvZ3JhbSBpcyAqLworCQkJcmVnX3dyaXRlKG9oY2ksIGQtPmNtZFB0ciwKKwkJCQlkbWFfcHJvZ19yZWdpb25fb2Zmc2V0X3RvX2J1cygmZC0+cHJnX3JlZ1t2LmJ1ZmZlcl0sIDApIHwgMHgzKTsKKworCQkJLyogUnVuIElUIGNvbnRleHQgKi8KKwkJCXJlZ193cml0ZShvaGNpLCBkLT5jdHJsU2V0LCAweDgwMDApOworCQl9CisJCWVsc2UgeworCQkJLyogV2FrZSB1cCBkbWEgY29udGV4dCBpZiBuZWNlc3NhcnkgKi8KKwkJCWlmICghKHJlZ19yZWFkKG9oY2ksIGQtPmN0cmxTZXQpICYgMHg0MDApKSB7CisJCQkJUFJJTlQoS0VSTl9JTkZPLCBvaGNpLT5ob3N0LT5pZCwKKwkJCQkgICAgICAiV2FraW5nIHVwIGlzbyB0cmFuc21pdCBkbWEgY3R4PSVkIiwKKwkJCQkgICAgICBkLT5jdHgpOworCQkJCXB1dF90aW1lc3RhbXAob2hjaSwgZCwgZC0+bGFzdF9idWZmZXIpOworCQkJCXJlZ193cml0ZShvaGNpLCBkLT5jdHJsU2V0LCAweDEwMDApOworCQkJfQorCQl9CisKKwkJaWYgKHBzaXplcykKKwkJCWtmcmVlKHBzaXplcyk7CisKKwkJcmV0dXJuIDA7CisKKwl9CisJY2FzZSBWSURFTzEzOTRfSU9DX1RBTEtfV0FJVF9CVUZGRVI6CisJeworCQlzdHJ1Y3QgdmlkZW8xMzk0X3dhaXQgdjsKKwkJc3RydWN0IGRtYV9pc29fY3R4ICpkOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgYXJncCwgc2l6ZW9mKHYpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWQgPSBmaW5kX2N0eCgmY3R4LT5jb250ZXh0X2xpc3QsIE9IQ0lfSVNPX1RSQU5TTUlULCB2LmNoYW5uZWwpOworCQlpZiAoZCA9PSBOVUxMKSByZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoKHYuYnVmZmVyPDApIHx8ICh2LmJ1ZmZlcj5kLT5udW1fZGVzYykpIHsKKwkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwKKwkJCSAgICAgICJCdWZmZXIgJWQgb3V0IG9mIHJhbmdlIix2LmJ1ZmZlcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXN3aXRjaChkLT5idWZmZXJfc3RhdHVzW3YuYnVmZmVyXSkgeworCQljYXNlIFZJREVPMTM5NF9CVUZGRVJfUkVBRFk6CisJCQlkLT5idWZmZXJfc3RhdHVzW3YuYnVmZmVyXT1WSURFTzEzOTRfQlVGRkVSX0ZSRUU7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBWSURFTzEzOTRfQlVGRkVSX1FVRVVFRDoKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkLT53YWl0cSwKKwkJCQkJKGQtPmJ1ZmZlcl9zdGF0dXNbdi5idWZmZXJdID09IFZJREVPMTM5NF9CVUZGRVJfUkVBRFkpKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gLUVJTlRSOworCQkJZC0+YnVmZmVyX3N0YXR1c1t2LmJ1ZmZlcl09VklERU8xMzk0X0JVRkZFUl9GUkVFOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlQUklOVChLRVJOX0VSUiwgb2hjaS0+aG9zdC0+aWQsCisJCQkgICAgICAiQnVmZmVyICVkIGlzIG5vdCBxdWV1ZWQiLHYuYnVmZmVyKTsKKwkJCXJldHVybiAtRVNSQ0g7CisJCX0KKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCitzdGF0aWMgbG9uZyB2aWRlbzEzOTRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnI7CisJbG9ja19rZXJuZWwoKTsKKwllcnIgPSBfX3ZpZGVvMTM5NF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglUaGlzIG1hcHMgdGhlIHZtYWxsb2NlZCBhbmQgcmVzZXJ2ZWQgYnVmZmVyIHRvIHVzZXIgc3BhY2UuCisgKgorICogIEZJWE1FOgorICogIC0gUEFHRV9SRUFET05MWSBzaG91bGQgc3VmZmljZSE/CisgKiAgLSByZW1hcF9wZm5fcmFuZ2UgaXMga2luZCBvZiBpbmVmZmljaWVudCBmb3IgcGFnZSBieSBwYWdlIHJlbWFwcGluZy4KKyAqICAgIEJ1dCBlLmcuIHB0ZV9hbGxvYygpIGRvZXMgbm90IHdvcmsgaW4gbW9kdWxlcyAuLi4gOi0oCisgKi8KKworc3RhdGljIGludCB2aWRlbzEzOTRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGZpbGVfY3R4ICpjdHggPSAoc3RydWN0IGZpbGVfY3R4ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXMgPSAtRUlOVkFMOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoY3R4LT5jdXJyZW50X2N0eCA9PSBOVUxMKSB7CisJCVBSSU5UKEtFUk5fRVJSLCBjdHgtPm9oY2ktPmhvc3QtPmlkLCAiQ3VycmVudCBpc28gY29udGV4dCBub3Qgc2V0Iik7CisJfSBlbHNlCisJCXJlcyA9IGRtYV9yZWdpb25fbW1hcCgmY3R4LT5jdXJyZW50X2N0eC0+ZG1hLCBmaWxlLCB2bWEpOworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW8xMzk0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGkgPSBpZWVlMTM5NF9maWxlX3RvX2luc3RhbmNlKGZpbGUpOworCXN0cnVjdCB0aV9vaGNpICpvaGNpOworCXN0cnVjdCBmaWxlX2N0eCAqY3R4OworCisJb2hjaSA9IGhwc2JfZ2V0X2hvc3RpbmZvX2J5a2V5KCZ2aWRlbzEzOTRfaGlnaGxldmVsLCBpKTsKKyAgICAgICAgaWYgKG9oY2kgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKworCWN0eCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaWxlX2N0eCksIEdGUF9LRVJORUwpOworCWlmIChjdHggPT0gTlVMTCkgIHsKKwkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLCAiQ2Fubm90IG1hbGxvYyBmaWxlX2N0eCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoY3R4LCAwLCBzaXplb2Yoc3RydWN0IGZpbGVfY3R4KSk7CisJY3R4LT5vaGNpID0gb2hjaTsKKwlJTklUX0xJU1RfSEVBRCgmY3R4LT5jb250ZXh0X2xpc3QpOworCWN0eC0+Y3VycmVudF9jdHggPSBOVUxMOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGN0eDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGVvMTM5NF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmaWxlX2N0eCAqY3R4ID0gKHN0cnVjdCBmaWxlX2N0eCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IGN0eC0+b2hjaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgKm5leHQ7CisJdTY0IG1hc2s7CisKKwlsb2NrX2tlcm5lbCgpOworCWxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbmV4dCwgJmN0eC0+Y29udGV4dF9saXN0KSB7CisJCXN0cnVjdCBkbWFfaXNvX2N0eCAqZDsKKwkJZCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCBkbWFfaXNvX2N0eCwgbGluayk7CisJCW1hc2sgPSAodTY0KSAxIDw8IGQtPmNoYW5uZWw7CisKKwkJaWYgKCEob2hjaS0+SVNPX2NoYW5uZWxfdXNhZ2UgJiBtYXNrKSkKKwkJCVBSSU5UKEtFUk5fRVJSLCBvaGNpLT5ob3N0LT5pZCwgIk9uIHJlbGVhc2U6IENoYW5uZWwgJWQgIgorCQkJICAgICAgImlzIG5vdCBiZWluZyB1c2VkIiwgZC0+Y2hhbm5lbCk7CisJCWVsc2UKKwkJCW9oY2ktPklTT19jaGFubmVsX3VzYWdlICY9IH5tYXNrOworCQlQUklOVChLRVJOX0lORk8sIG9oY2ktPmhvc3QtPmlkLCAiT24gcmVsZWFzZTogSXNvICVzIGNvbnRleHQgIgorCQkgICAgICAiJWQgc3RvcCBsaXN0ZW5pbmcgb24gY2hhbm5lbCAlZCIsCisJCSAgICAgIGQtPnR5cGUgPT0gT0hDSV9JU09fUkVDRUlWRSA/ICJyZWNlaXZlIiA6ICJ0cmFuc21pdCIsCisJCSAgICAgIGQtPmN0eCwgZC0+Y2hhbm5lbCk7CisJCWZyZWVfZG1hX2lzb19jdHgoZCk7CisJfQorCisJa2ZyZWUoY3R4KTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgdmlkZW8xMzk0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBjZGV2IHZpZGVvMTM5NF9jZGV2Oworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmlkZW8xMzk0X2ZvcHM9Cit7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLnVubG9ja2VkX2lvY3RsID0gdmlkZW8xMzk0X2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsID0gdmlkZW8xMzk0X2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorCS5tbWFwID0JCXZpZGVvMTM5NF9tbWFwLAorCS5vcGVuID0JCXZpZGVvMTM5NF9vcGVuLAorCS5yZWxlYXNlID0JdmlkZW8xMzk0X3JlbGVhc2UKK307CisKKy8qKiogSE9UUExVRyBTVFVGRiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEV4cG9ydCBpbmZvcm1hdGlvbiBhYm91dCBwcm90b2NvbHMvZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkIHZpZGVvMTM5NF9pZF90YWJsZVtdID0geworCXsKKwkJLm1hdGNoX2ZsYWdzCT0gSUVFRTEzOTRfTUFUQ0hfU1BFQ0lGSUVSX0lEIHwgSUVFRTEzOTRfTUFUQ0hfVkVSU0lPTiwKKwkJLnNwZWNpZmllcl9pZAk9IENBTUVSQV9VTklUX1NQRUNfSURfRU5UUlkgJiAweGZmZmZmZiwKKwkJLnZlcnNpb24JPSBDQU1FUkFfU1dfVkVSU0lPTl9FTlRSWSAmIDB4ZmZmZmZmCisJfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC5tYXRjaF9mbGFncyAgICA9IElFRUUxMzk0X01BVENIX1NQRUNJRklFUl9JRCB8IElFRUUxMzk0X01BVENIX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgLnNwZWNpZmllcl9pZCAgID0gQ0FNRVJBX1VOSVRfU1BFQ19JRF9FTlRSWSAmIDB4ZmZmZmZmLAorICAgICAgICAgICAgICAgIC52ZXJzaW9uICAgICAgICA9IChDQU1FUkFfU1dfVkVSU0lPTl9FTlRSWSArIDEpICYgMHhmZmZmZmYKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC5tYXRjaF9mbGFncyAgICA9IElFRUUxMzk0X01BVENIX1NQRUNJRklFUl9JRCB8IElFRUUxMzk0X01BVENIX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgLnNwZWNpZmllcl9pZCAgID0gQ0FNRVJBX1VOSVRfU1BFQ19JRF9FTlRSWSAmIDB4ZmZmZmZmLAorICAgICAgICAgICAgICAgIC52ZXJzaW9uICAgICAgICA9IChDQU1FUkFfU1dfVkVSU0lPTl9FTlRSWSArIDIpICYgMHhmZmZmZmYKKyAgICAgICAgfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaWVlZTEzOTQsIHZpZGVvMTM5NF9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9wcm90b2NvbF9kcml2ZXIgdmlkZW8xMzk0X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiMTM5NCBEaWdpdGFsIENhbWVyYSBEcml2ZXIiLAorCS5pZF90YWJsZQk9IHZpZGVvMTM5NF9pZF90YWJsZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBWSURFTzEzOTRfRFJJVkVSX05BTUUsCisJCS5idXMJPSAmaWVlZTEzOTRfYnVzX3R5cGUsCisJfSwKK307CisKKworc3RhdGljIHZvaWQgdmlkZW8xMzk0X2FkZF9ob3N0IChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQoreworCXN0cnVjdCB0aV9vaGNpICpvaGNpOworCWludCBtaW5vcjsKKworCS8qIFdlIG9ubHkgd29yayB3aXRoIHRoZSBPSENJLTEzOTQgZHJpdmVyICovCisJaWYgKHN0cmNtcChob3N0LT5kcml2ZXItPm5hbWUsIE9IQ0kxMzk0X0RSSVZFUl9OQU1FKSkKKwkJcmV0dXJuOworCisJb2hjaSA9IChzdHJ1Y3QgdGlfb2hjaSAqKWhvc3QtPmhvc3RkYXRhOworCisJaWYgKCFocHNiX2NyZWF0ZV9ob3N0aW5mbygmdmlkZW8xMzk0X2hpZ2hsZXZlbCwgaG9zdCwgMCkpIHsKKwkJUFJJTlQoS0VSTl9FUlIsIG9oY2ktPmhvc3QtPmlkLCAiQ2Fubm90IGFsbG9jYXRlIGhvc3RpbmZvIik7CisJCXJldHVybjsKKwl9CisKKwlocHNiX3NldF9ob3N0aW5mbygmdmlkZW8xMzk0X2hpZ2hsZXZlbCwgaG9zdCwgb2hjaSk7CisJaHBzYl9zZXRfaG9zdGluZm9fa2V5KCZ2aWRlbzEzOTRfaGlnaGxldmVsLCBob3N0LCBvaGNpLT5ob3N0LT5pZCk7CisKKwltaW5vciA9IElFRUUxMzk0X01JTk9SX0JMT0NLX1ZJREVPMTM5NCAqIDE2ICsgb2hjaS0+aG9zdC0+aWQ7CisJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoaHBzYl9wcm90b2NvbF9jbGFzcywgTUtERVYoCisJCUlFRUUxMzk0X01BSk9SLAltaW5vciksIAorCQlOVUxMLCAiJXMtJWQiLCBWSURFTzEzOTRfRFJJVkVSX05BTUUsIG9oY2ktPmhvc3QtPmlkKTsKKwlkZXZmc19ta19jZGV2KE1LREVWKElFRUUxMzk0X01BSk9SLCBtaW5vciksCisJCSAgICAgICBTX0lGQ0hSIHwgU19JUlVTUiB8IFNfSVdVU1IsCisJCSAgICAgICAiJXMvJWQiLCBWSURFTzEzOTRfRFJJVkVSX05BTUUsIG9oY2ktPmhvc3QtPmlkKTsKK30KKworCitzdGF0aWMgdm9pZCB2aWRlbzEzOTRfcmVtb3ZlX2hvc3QgKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IHRpX29oY2kgKm9oY2kgPSBocHNiX2dldF9ob3N0aW5mbygmdmlkZW8xMzk0X2hpZ2hsZXZlbCwgaG9zdCk7CisKKwlpZiAob2hjaSkgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihJRUVFMTM5NF9NQUpPUiwgCisJCQlJRUVFMTM5NF9NSU5PUl9CTE9DS19WSURFTzEzOTQgKiAxNiArIG9oY2ktPmhvc3QtPmlkKSk7CisJCWRldmZzX3JlbW92ZSgiJXMvJWQiLCBWSURFTzEzOTRfRFJJVkVSX05BTUUsIG9oY2ktPmhvc3QtPmlkKTsKKwl9CisJCisJcmV0dXJuOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgdmlkZW8xMzk0X2hpZ2hsZXZlbCA9IHsKKwkubmFtZSA9CQlWSURFTzEzOTRfRFJJVkVSX05BTUUsCisJLmFkZF9ob3N0ID0JdmlkZW8xMzk0X2FkZF9ob3N0LAorCS5yZW1vdmVfaG9zdCA9CXZpZGVvMTM5NF9yZW1vdmVfaG9zdCwKK307CisKK01PRFVMRV9BVVRIT1IoIlNlYmFzdGllbiBSb3VnZWF1eCA8c2ViYXN0aWVuLnJvdWdlYXV4QGFudS5lZHUuYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImRyaXZlciBmb3IgZGlnaXRhbCB2aWRlbyBvbiBPSENJIGJvYXJkIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRShWSURFTzEzOTRfRFJJVkVSX05BTUUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCisjZGVmaW5lIFZJREVPMTM5NF9JT0MzMl9MSVNURU5fUVVFVUVfQlVGRkVSICAgICBcCisJX0lPVyAoJyMnLCAweDEyLCBzdHJ1Y3QgdmlkZW8xMzk0X3dhaXQzMikKKyNkZWZpbmUgVklERU8xMzk0X0lPQzMyX0xJU1RFTl9XQUlUX0JVRkZFUiAgICAgIFwKKwlfSU9XUignIycsIDB4MTMsIHN0cnVjdCB2aWRlbzEzOTRfd2FpdDMyKQorI2RlZmluZSBWSURFTzEzOTRfSU9DMzJfVEFMS19XQUlUX0JVRkZFUiAgICAgICAgXAorCV9JT1cgKCcjJywgMHgxNywgc3RydWN0IHZpZGVvMTM5NF93YWl0MzIpCisjZGVmaW5lIFZJREVPMTM5NF9JT0MzMl9MSVNURU5fUE9MTF9CVUZGRVIgICAgICBcCisJX0lPV1IoJyMnLCAweDE4LCBzdHJ1Y3QgdmlkZW8xMzk0X3dhaXQzMikKKworc3RydWN0IHZpZGVvMTM5NF93YWl0MzIgeworCXUzMiBjaGFubmVsOworCXUzMiBidWZmZXI7CisJc3RydWN0IGNvbXBhdF90aW1ldmFsIGZpbGx0aW1lOworfTsKKworc3RhdGljIGludCB2aWRlbzEzOTRfd3Jfd2FpdDMyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgc3RydWN0IHZpZGVvMTM5NF93YWl0MzIgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworICAgICAgICBzdHJ1Y3QgdmlkZW8xMzk0X3dhaXQzMiB3YWl0MzI7CisgICAgICAgIHN0cnVjdCB2aWRlbzEzOTRfd2FpdCB3YWl0OworICAgICAgICBtbV9zZWdtZW50X3Qgb2xkX2ZzOworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmd2FpdDMyLCBhcmdwLCBzaXplb2Yod2FpdDMyKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgd2FpdC5jaGFubmVsID0gd2FpdDMyLmNoYW5uZWw7CisgICAgICAgIHdhaXQuYnVmZmVyID0gd2FpdDMyLmJ1ZmZlcjsKKyAgICAgICAgd2FpdC5maWxsdGltZS50dl9zZWMgPSAodGltZV90KXdhaXQzMi5maWxsdGltZS50dl9zZWM7CisgICAgICAgIHdhaXQuZmlsbHRpbWUudHZfdXNlYyA9IChzdXNlY29uZHNfdCl3YWl0MzIuZmlsbHRpbWUudHZfdXNlYzsKKworICAgICAgICBvbGRfZnMgPSBnZXRfZnMoKTsKKyAgICAgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisgICAgICAgIGlmIChjbWQgPT0gVklERU8xMzk0X0lPQzMyX0xJU1RFTl9XQUlUX0JVRkZFUikKKwkJcmV0ID0gdmlkZW8xMzk0X2lvY3RsKGZpbGUsCisJCQkJICAgICAgVklERU8xMzk0X0lPQ19MSVNURU5fV0FJVF9CVUZGRVIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpICZ3YWl0KTsKKyAgICAgICAgZWxzZQorCQlyZXQgPSB2aWRlbzEzOTRfaW9jdGwoZmlsZSwKKwkJCQkgICAgICBWSURFTzEzOTRfSU9DX0xJU1RFTl9QT0xMX0JVRkZFUiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZykgJndhaXQpOworICAgICAgICBzZXRfZnMob2xkX2ZzKTsKKworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgICAgIHdhaXQzMi5jaGFubmVsID0gd2FpdC5jaGFubmVsOworICAgICAgICAgICAgICAgIHdhaXQzMi5idWZmZXIgPSB3YWl0LmJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB3YWl0MzIuZmlsbHRpbWUudHZfc2VjID0gKGludCl3YWl0LmZpbGx0aW1lLnR2X3NlYzsKKyAgICAgICAgICAgICAgICB3YWl0MzIuZmlsbHRpbWUudHZfdXNlYyA9IChpbnQpd2FpdC5maWxsdGltZS50dl91c2VjOworCisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmd2FpdDMyLCBzaXplb2Yod2FpdDMyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUZBVUxUOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aWRlbzEzOTRfd193YWl0MzIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgICAgICBzdHJ1Y3QgdmlkZW8xMzk0X3dhaXQzMiB3YWl0MzI7CisgICAgICAgIHN0cnVjdCB2aWRlbzEzOTRfd2FpdCB3YWl0OworICAgICAgICBtbV9zZWdtZW50X3Qgb2xkX2ZzOworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmd2FpdDMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih3YWl0MzIpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICB3YWl0LmNoYW5uZWwgPSB3YWl0MzIuY2hhbm5lbDsKKyAgICAgICAgd2FpdC5idWZmZXIgPSB3YWl0MzIuYnVmZmVyOworICAgICAgICB3YWl0LmZpbGx0aW1lLnR2X3NlYyA9ICh0aW1lX3Qpd2FpdDMyLmZpbGx0aW1lLnR2X3NlYzsKKyAgICAgICAgd2FpdC5maWxsdGltZS50dl91c2VjID0gKHN1c2Vjb25kc190KXdhaXQzMi5maWxsdGltZS50dl91c2VjOworCisgICAgICAgIG9sZF9mcyA9IGdldF9mcygpOworICAgICAgICBzZXRfZnMoS0VSTkVMX0RTKTsKKyAgICAgICAgaWYgKGNtZCA9PSBWSURFTzEzOTRfSU9DMzJfTElTVEVOX1FVRVVFX0JVRkZFUikKKwkJcmV0ID0gdmlkZW8xMzk0X2lvY3RsKGZpbGUsCisJCQkJICAgICAgVklERU8xMzk0X0lPQ19MSVNURU5fUVVFVUVfQlVGRkVSLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKSAmd2FpdCk7CisgICAgICAgIGVsc2UKKwkJcmV0ID0gdmlkZW8xMzk0X2lvY3RsKGZpbGUsCisJCQkJICAgICAgVklERU8xMzk0X0lPQ19UQUxLX1dBSVRfQlVGRkVSLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKSAmd2FpdCk7CisgICAgICAgIHNldF9mcyhvbGRfZnMpOworCisgICAgICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW8xMzk0X3F1ZXVlX2J1ZjMyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7ICAgLyogPz8/IHdhcyB0aGVyZSBiZWZvcmUuICovCisKKwlyZXR1cm4gdmlkZW8xMzk0X2lvY3RsKGZpbGUsCisJCQkJVklERU8xMzk0X0lPQ19UQUxLX1FVRVVFX0JVRkZFUiwgYXJnKTsKK30KKworc3RhdGljIGxvbmcgdmlkZW8xMzk0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVklERU8xMzk0X0lPQ19MSVNURU5fQ0hBTk5FTDoKKwljYXNlIFZJREVPMTM5NF9JT0NfVU5MSVNURU5fQ0hBTk5FTDoKKwljYXNlIFZJREVPMTM5NF9JT0NfVEFMS19DSEFOTkVMOgorCWNhc2UgVklERU8xMzk0X0lPQ19VTlRBTEtfQ0hBTk5FTDoKKwkJcmV0dXJuIHZpZGVvMTM5NF9pb2N0bChmLCBjbWQsIGFyZyk7CisKKwljYXNlIFZJREVPMTM5NF9JT0MzMl9MSVNURU5fUVVFVUVfQlVGRkVSOgorCQlyZXR1cm4gdmlkZW8xMzk0X3dfd2FpdDMyKGYsIGNtZCwgYXJnKTsKKwljYXNlIFZJREVPMTM5NF9JT0MzMl9MSVNURU5fV0FJVF9CVUZGRVI6CisJCXJldHVybiB2aWRlbzEzOTRfd3Jfd2FpdDMyKGYsIGNtZCwgYXJnKTsKKwljYXNlIFZJREVPMTM5NF9JT0NfVEFMS19RVUVVRV9CVUZGRVI6CisJCXJldHVybiB2aWRlbzEzOTRfcXVldWVfYnVmMzIoZiwgY21kLCBhcmcpOworCWNhc2UgVklERU8xMzk0X0lPQzMyX1RBTEtfV0FJVF9CVUZGRVI6CisJCXJldHVybiB2aWRlbzEzOTRfd193YWl0MzIoZiwgY21kLCBhcmcpOworCWNhc2UgVklERU8xMzk0X0lPQzMyX0xJU1RFTl9QT0xMX0JVRkZFUjoKKwkJcmV0dXJuIHZpZGVvMTM5NF93cl93YWl0MzIoZiwgY21kLCBhcmcpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorfQorCisjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgdmlkZW8xMzk0X2V4aXRfbW9kdWxlICh2b2lkKQoreworCWhwc2JfdW5yZWdpc3Rlcl9wcm90b2NvbCgmdmlkZW8xMzk0X2RyaXZlcik7CisKKwlocHNiX3VucmVnaXN0ZXJfaGlnaGxldmVsKCZ2aWRlbzEzOTRfaGlnaGxldmVsKTsKKworCWRldmZzX3JlbW92ZShWSURFTzEzOTRfRFJJVkVSX05BTUUpOworCWNkZXZfZGVsKCZ2aWRlbzEzOTRfY2Rldik7CisKKwlQUklOVF9HKEtFUk5fSU5GTywgIlJlbW92ZWQgIiBWSURFTzEzOTRfRFJJVkVSX05BTUUgIiBtb2R1bGUiKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdmlkZW8xMzk0X2luaXRfbW9kdWxlICh2b2lkKQoreworCWludCByZXQ7CisKKwljZGV2X2luaXQoJnZpZGVvMTM5NF9jZGV2LCAmdmlkZW8xMzk0X2ZvcHMpOworCXZpZGVvMTM5NF9jZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7CisJa29iamVjdF9zZXRfbmFtZSgmdmlkZW8xMzk0X2NkZXYua29iaiwgVklERU8xMzk0X0RSSVZFUl9OQU1FKTsKKwlyZXQgPSBjZGV2X2FkZCgmdmlkZW8xMzk0X2NkZXYsIElFRUUxMzk0X1ZJREVPMTM5NF9ERVYsIDE2KTsKKwlpZiAocmV0KSB7CisJCVBSSU5UX0coS0VSTl9FUlIsICJ2aWRlbzEzOTQ6IHVuYWJsZSB0byBnZXQgbWlub3IgZGV2aWNlIGJsb2NrIik7CisJCXJldHVybiByZXQ7CisgICAgICAgIH0KKworCWRldmZzX21rX2RpcihWSURFTzEzOTRfRFJJVkVSX05BTUUpOworCisJaHBzYl9yZWdpc3Rlcl9oaWdobGV2ZWwoJnZpZGVvMTM5NF9oaWdobGV2ZWwpOworCisJcmV0ID0gaHBzYl9yZWdpc3Rlcl9wcm90b2NvbCgmdmlkZW8xMzk0X2RyaXZlcik7CisJaWYgKHJldCkgeworCQlQUklOVF9HKEtFUk5fRVJSLCAidmlkZW8xMzk0OiBmYWlsZWQgdG8gcmVnaXN0ZXIgcHJvdG9jb2wiKTsKKwkJaHBzYl91bnJlZ2lzdGVyX2hpZ2hsZXZlbCgmdmlkZW8xMzk0X2hpZ2hsZXZlbCk7CisJCWRldmZzX3JlbW92ZShWSURFTzEzOTRfRFJJVkVSX05BTUUpOworCQljZGV2X2RlbCgmdmlkZW8xMzk0X2NkZXYpOworCQlyZXR1cm4gcmV0OworCX0KKworCVBSSU5UX0coS0VSTl9JTkZPLCAiSW5zdGFsbGVkICIgVklERU8xMzk0X0RSSVZFUl9OQU1FICIgbW9kdWxlIik7CisJcmV0dXJuIDA7Cit9CisKKworbW9kdWxlX2luaXQodmlkZW8xMzk0X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHZpZGVvMTM5NF9leGl0X21vZHVsZSk7CitNT0RVTEVfQUxJQVNfQ0hBUkRFVihJRUVFMTM5NF9NQUpPUiwgSUVFRTEzOTRfTUlOT1JfQkxPQ0tfVklERU8xMzk0ICogMTYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC92aWRlbzEzOTQuaCBiL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4OWQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvdmlkZW8xMzk0LmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIHZpZGVvMTM5NC5oIC0gZHJpdmVyIGZvciBPSENJIDEzOTQgYm9hcmRzCisgKiBDb3B5cmlnaHQgKEMpMTk5OSwyMDAwIFNlYmFzdGllbiBSb3VnZWF1eCA8c2ViYXN0aWVuLnJvdWdlYXV4QGFudS5lZHUuYXU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgIFBldGVyIFNjaGxhaWxlIDx1ZGJ6QHJ6LnVuaS1rYXJsc3J1aGUuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9WSURFT18xMzk0X0gKKyNkZWZpbmUgX1ZJREVPXzEzOTRfSAorCisjaW5jbHVkZSAiaWVlZTEzOTQtaW9jdGwuaCIKKworI2RlZmluZSBWSURFTzEzOTRfRFJJVkVSX05BTUUgInZpZGVvMTM5NCIKKworI2RlZmluZSBWSURFTzEzOTRfTUFYX1NJWkUgMHg0MDAwMDAwCisKK2VudW0geworCVZJREVPMTM5NF9CVUZGRVJfRlJFRSA9IDAsCisJVklERU8xMzk0X0JVRkZFUl9RVUVVRUQsCisJVklERU8xMzk0X0JVRkZFUl9SRUFEWQorfTsKKworI2RlZmluZSBWSURFTzEzOTRfU1lOQ19GUkFNRVMgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBWSURFTzEzOTRfSU5DTFVERV9JU09fSEVBREVSUyAgMHgwMDAwMDAwMgorI2RlZmluZSBWSURFTzEzOTRfVkFSSUFCTEVfUEFDS0VUX1NJWkUgMHgwMDAwMDAwNAorCitzdHJ1Y3QgdmlkZW8xMzk0X21tYXAgeworCWludCBjaGFubmVsOwkJCS8qIC0xIHRvIGZpbmQgYW4gb3BlbiBjaGFubmVsIGluIExJU1RFTi9UQUxLICovCisJdW5zaWduZWQgaW50IHN5bmNfdGFnOworCXVuc2lnbmVkIGludCBuYl9idWZmZXJzOworCXVuc2lnbmVkIGludCBidWZfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcGFja2V0X3NpemU7IC8qIEZvciBWQVJJQUJMRV9QQUNLRVRfU0laRToKKwkJCQkgICAgIE1heGltdW0gcGFja2V0IHNpemUgKi8KKwl1bnNpZ25lZCBpbnQgZnBzOworCXVuc2lnbmVkIGludCBzeXRfb2Zmc2V0OworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKKy8qIEZvciBUQUxLX1FVRVVFX0JVRkZFUiB3aXRoIFZJREVPMTM5NF9WQVJJQUJMRV9QQUNLRVRfU0laRSB1c2UgKi8KK3N0cnVjdCB2aWRlbzEzOTRfcXVldWVfdmFyaWFibGUgeworCXVuc2lnbmVkIGludCBjaGFubmVsOworCXVuc2lnbmVkIGludCBidWZmZXI7CisJdW5zaWduZWQgaW50IF9fdXNlciAqIHBhY2tldF9zaXplczsgLyogQnVmZmVyIG9mIHNpemU6CisJCQkJICAgICAgIGJ1Zl9zaXplIC8gcGFja2V0X3NpemUgICovCit9OworCitzdHJ1Y3QgdmlkZW8xMzk0X3dhaXQgeworCXVuc2lnbmVkIGludCBjaGFubmVsOworCXVuc2lnbmVkIGludCBidWZmZXI7CisJc3RydWN0IHRpbWV2YWwgZmlsbHRpbWU7CS8qIHRpbWUgb2YgYnVmZmVyIGZ1bGwgKi8KK307CisKKworI2VuZGlmCg==