ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDY0ODQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnCkBAIC0wLDAgKzEsNDA0IEBACisKK21lbnUgIkluZnJhcmVkLXBvcnQgZGV2aWNlIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBJUkRBIT1uCisKK2NvbW1lbnQgIlNJUiBkZXZpY2UgZHJpdmVycyIKKworY29uZmlnIElSVFRZX1NJUgorCXRyaXN0YXRlICJJclRUWSAodXNlcyBMaW51eCBzZXJpYWwgZHJpdmVyKSIKKwlkZXBlbmRzIG9uIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBJclRUWSBsaW5lCisJICBkaXNjaXBsaW5lLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaXJ0dHktc2lyLiBJclRUWSBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgTGludXgncworCSAgb3duIHNlcmlhbCBkcml2ZXIgZm9yIGFsbCBJckRBIHBvcnRzIHRoYXQgYXJlIDE2NTUwIGNvbXBhdGlibGUuCisJICBNb3N0IElyREEgY2hpcHMgYXJlIDE2NTUwIGNvbXBhdGlibGUgc28geW91IHNob3VsZCBwcm9iYWJseSBzYXkgWQorCSAgdG8gdGhpcyBvcHRpb24uICBVc2luZyBJclRUWSB3aWxsIGhvd2V2ZXIgbGltaXQgdGhlIHNwZWVkIG9mIHRoZQorCSAgY29ubmVjdGlvbiB0byAxMTUyMDAgYnBzIChJckRBIFNJUiBtb2RlKS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29tbWVudCAiRG9uZ2xlIHN1cHBvcnQiCisKK2NvbmZpZyBET05HTEUKKwlib29sICJTZXJpYWwgZG9uZ2xlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUlRUWV9TSVIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIGluZnJhcmVkIGRldmljZSB0aGF0IGNvbm5lY3RzIHRvIHlvdXIKKwkgIGNvbXB1dGVyJ3Mgc2VyaWFsIHBvcnQuIFRoZXNlIGRldmljZXMgYXJlIGNhbGxlZCBkb25nbGVzLiBUaGVuIHNheSBZCisJICBvciBNIHRvIHRoZSBkcml2ZXIgZm9yIHlvdXIgcGFydGljdWxhciBkb25nbGUgYmVsb3cuCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBzZXJpYWwgZG9uZ2xlcy4KKworY29uZmlnIEVTSV9ET05HTEUKKwl0cmlzdGF0ZSAiRVNJIEpldEV5ZSBQQyBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEUgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEV4dGVuZGVkIFN5c3RlbXMKKwkgIEpldEV5ZSBQQyBkb25nbGUuICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgRVNJCisJICBkb25nbGUgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsIGFuZCBjYW4KKwkgIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvciBFU0kKKwkgIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6CisJICAiaXJhdHRhY2ggLWQgZXNpIi4KKworY29uZmlnIEFDVElTWVNfRE9OR0xFCisJdHJpc3RhdGUgIkFDVGlTWVMgSVItMjIwTCBhbmQgSVIyMjBMKyBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEUgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEFDVGlTWVMgSVItMjIwTCBhbmQKKwkgIElSMjIwTCsgZG9uZ2xlcy4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZQorCSAgQUNUaVNZUyBkb25nbGVzIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLAorCSAgYW5kIGNhbiBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IKKwkgIEFDVGlTWVMgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCBhY3Rpc3lzIiBvciAiaXJhdHRhY2ggLWQgYWN0aXN5cysiLgorCitjb25maWcgVEVLUkFNX0RPTkdMRQorCXRyaXN0YXRlICJUZWtyYW0gSXJNYXRlIDIxMEIgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBUZWtyYW0gSXJNYXRlIDIxMEIKKwkgIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBUZWtyYW0gZG9uZ2xlCisJICBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbCBwb3J0IGNvbm5lY3RvciwgYW5kIGNhbgorCSAgY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4gIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIFRla3JhbQorCSAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCB0ZWtyYW0iLgorCitjb25maWcgTElURUxJTktfRE9OR0xFCisJdHJpc3RhdGUgIlBhcmFsbGF4IExpdGVMaW5rIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRSAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgUGFyYWxsYXggTGl0ZWxpbmsKKwkgIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgUGFyYWxsYXgKKwkgIGRvbmdsZSBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbCBwb3J0IGNvbm5lY3RvciwgYW5kIGNhbgorCSAgY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4gIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIFBhcmFsbGF4CisJICBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOgorCSAgImlyYXR0YWNoIC1kIGxpdGVsaW5rIi4KKworY29uZmlnIE1BNjAwX0RPTkdMRQorCXRyaXN0YXRlICJNb2JpbGUgQWN0aW9uIE1BNjAwIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRSAmJiBJUkRBICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIE1vYmlsZSBBY3Rpb24gTUE2MDAKKwkgIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBNQTYwMCBkb25nbGUKKwkgIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVGhlIGRyaXZlciBzaG91bGQgYWxzbyBzdXBwb3J0CisJICB0aGUgTUE2MjAgVVNCIHZlcnNpb24gb2YgdGhlIGRvbmdsZSwgaWYgdGhlIGludGVncmF0ZWQgVVNCLXRvLVJTMjMyCisJICBjb252ZXJ0ZXIgaXMgc3VwcG9ydGVkIGJ5IHVzYnNlcmlhbC4gVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IKKwkgIE1BNjAwIGRvbmdsZSB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCBtYTYwMCIuCisKK2NvbmZpZyBHSVJCSUxfRE9OR0xFCisJdHJpc3RhdGUgIkdyZWVud2ljaCBHSXJCSUwgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFICYmIElSREEgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgR3JlZW53aWNoIEdJckJJTAorCSAgZG9uZ2xlLiAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KKwkgIFRoZSBHcmVlbndpY2ggZG9uZ2xlIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQKKwkgIGNvbm5lY3RvciwgYW5kIGNhbiBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUKKwkgIHN1cHBvcnQgZm9yIEdyZWVud2ljaCBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2gKKwkgIGxpa2UgdGhpczogImlyYXR0YWNoIC1kIGdpcmJpbCIuCisKK2NvbmZpZyBNQ1AyMTIwX0RPTkdMRQorCXRyaXN0YXRlICJNaWNyb2NoaXAgTUNQMjEyMCIKKwlkZXBlbmRzIG9uIERPTkdMRSAmJiBJUkRBICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIE1pY3JvY2hpcCBNQ1AyMTIwCisJICBkb25nbGUuICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLgorCSAgVGhlIE1DUDIxMjAgZG9uZ2xlIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQKKwkgIGNvbm5lY3RvciwgYW5kIGNhbiBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUKKwkgIHN1cHBvcnQgZm9yIE1DUDIxMjAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoCisJICBsaWtlIHRoaXM6ICJpcmF0dGFjaCAtZCBtY3AyMTIwIi4KKworCSAgWW91IG11c3QgYnVpbGQgdGhpcyBkb25nbGUgeW91cnNlbGYuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWU6CisJICA8aHR0cDovL3d3dy5leWV0YXAub3JnL350YW5nZi9pcmRhX3Npcl9saW51eC5odG1sPgorCitjb25maWcgT0xEX0JFTEtJTl9ET05HTEUKKwl0cmlzdGF0ZSAiT2xkIEJlbGtpbiBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEUgJiYgSVJEQSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBBZGFwdGVjIEFpcnBvcnQgMTAwMAorCSAgYW5kIDIwMDAgZG9uZ2xlcy4gIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZQorCSAgTSBoZXJlLiBTb21lIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgY29tbWVudHMKKwkgIGF0IHRoZSB0b3Agb2YgPGZpbGU6ZHJpdmVycy9uZXQvaXJkYS9vbGRfYmVsa2luLmM+LgorCitjb25maWcgQUNUMjAwTF9ET05HTEUKKwl0cmlzdGF0ZSAiQUNUaVNZUyBJUi0yMDBMIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRSAmJiBJUkRBICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEFDVGlTWVMgSVItMjAwTAorCSAgZG9uZ2xlLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLgorCSAgVGhlIEFDVGlTWVMgSVItMjAwTCBkb25nbGUgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwKKwkgIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuCisJICBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvciBBQ1RpU1lTIElSLTIwMEwgZG9uZ2xlIHlvdSB3aWxsIGhhdmUgdG8KKwkgIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczogImlyYXR0YWNoIC1kIGFjdDIwMGwiLgorCitjb21tZW50ICJPbGQgU0lSIGRldmljZSBkcml2ZXJzIgorCitjb25maWcgSVJQT1JUX1NJUgorCXRyaXN0YXRlICJJclBPUlQgKElyREEgc2VyaWFsIGRyaXZlcikiCisJZGVwZW5kcyBvbiBJUkRBICYmIEJST0tFTl9PTl9TTVAKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBJclBPUlQgSXJEQSBkZXZpY2UKKwkgIGRyaXZlci4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGlycG9ydC4gSXJQT1JUIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgSXJUVFkgYW5kIHNvbWV0aW1lcworCSAgdGhpcyBjYW4gYmUgYmV0dGVyLiAgT25lIGV4YW1wbGUgaXMgaWYgeW91ciBJckRBIHBvcnQgZG9lcyBub3QKKwkgIGhhdmUgZWNoby1jYW5jZWxpbmcsIHdoaWNoIHdpbGwgd29yayBPSyB3aXRoIElyUE9SVCBzaW5jZSB0aGlzCisJICBkcml2ZXIgaXMgd29ya2luZyBpbiBoYWxmLWR1cGxleCBtb2RlIG9ubHkuICBZb3UgZG9uJ3QgbmVlZCB0byB1c2UKKwkgIGlyYXR0YWNoIHdpdGggSXJQT1JULCBidXQgeW91IGp1c3QgaW5zZXJ0IGl0IHRoZSBzYW1lIHdheSBhcyBGSVIKKwkgIGRyaXZlcnMgKGluc21vZCBpcnBvcnQgaW89MHgzZTggaXJxPTExKS4gIE5vdGljZSB0aGF0IElyUE9SVCBpcyBhCisJICBTSVIgZGV2aWNlIGRyaXZlciB3aGljaCBtZWFucyB0aGF0IHNwZWVkIGlzIGxpbWl0ZWQgdG8gMTE1MjAwIGJwcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29tbWVudCAiT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydCIKKworY29uZmlnIERPTkdMRV9PTEQKKwlib29sICJPbGQgU2VyaWFsIGRvbmdsZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKElSVFRZX09MRCB8fCBJUlBPUlRfU0lSKSAmJiBCUk9LRU5fT05fU01QCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBpbmZyYXJlZCBkZXZpY2UgdGhhdCBjb25uZWN0cyB0byB5b3VyCisJICBjb21wdXRlcidzIHNlcmlhbCBwb3J0LiBUaGVzZSBkZXZpY2VzIGFyZSBjYWxsZWQgZG9uZ2xlcy4gVGhlbiBzYXkgWQorCSAgb3IgTSB0byB0aGUgZHJpdmVyIGZvciB5b3VyIHBhcnRpY3VsYXIgZG9uZ2xlIGJlbG93LgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIHdvbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUKKwkgIGtlcm5lbDogc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKKwkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgc2VyaWFsIGRvbmdsZXMuCisKK2NvbmZpZyBFU0lfRE9OR0xFX09MRAorCXRyaXN0YXRlICJFU0kgSmV0RXllIFBDIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEV4dGVuZGVkIFN5c3RlbXMKKwkgIEpldEV5ZSBQQyBkb25nbGUuICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgVGhlIEVTSQorCSAgZG9uZ2xlIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgRVNJCisJICBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOgorCSAgImlyYXR0YWNoIC1kIGVzaSIuCisKK2NvbmZpZyBBQ1RJU1lTX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiQUNUaVNZUyBJUi0yMjBMIGFuZCBJUjIyMEwrIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEFDVGlTWVMgSVItMjIwTCBhbmQKKwkgIElSMjIwTCsgZG9uZ2xlcy4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUKKwkgIEFDVGlTWVMgZG9uZ2xlcyBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbCBwb3J0IGNvbm5lY3RvciwKKwkgIGFuZCBjYW4gY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4gIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yCisJICBBQ1RpU1lTIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6CisJICAiaXJhdHRhY2ggLWQgYWN0aXN5cyIgb3IgImlyYXR0YWNoIC1kIGFjdGlzeXMrIi4KKworY29uZmlnIFRFS1JBTV9ET05HTEVfT0xECisJdHJpc3RhdGUgIlRla3JhbSBJck1hdGUgMjEwQiBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEVfT0xEICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBUZWtyYW0gSXJNYXRlIDIxMEIKKwkgIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgVGVrcmFtIGRvbmdsZQorCSAgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsIGFuZCBjYW4KKwkgIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvciBUZWtyYW0KKwkgIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6CisJICAiaXJhdHRhY2ggLWQgdGVrcmFtIi4KKworY29uZmlnIEdJUkJJTF9ET05HTEVfT0xECisJdHJpc3RhdGUgIkdyZWVud2ljaCBHSXJCSUwgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFX09MRCAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgR3JlZW53aWNoIEdJckJJTAorCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZSBHcmVlbndpY2gKKwkgIGRvbmdsZSBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbCBwb3J0IGNvbm5lY3RvciwgYW5kIGNhbgorCSAgY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4gIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIEdyZWVud2ljaAorCSAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIGluc2VydCAiaXJhdHRhY2ggLWQgZ2lyYmlsIiBpbiB0aGUKKwkgIC9ldGMvaXJkYS9kcml2ZXJzIHNjcmlwdC4KKworY29uZmlnIExJVEVMSU5LX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiUGFyYWxsYXggTGl0ZUxpbmsgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFX09MRCAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgUGFyYWxsYXggTGl0ZWxpbmsKKwkgIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgUGFyYWxsYXgKKwkgIGRvbmdsZSBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbCBwb3J0IGNvbm5lY3RvciwgYW5kIGNhbgorCSAgY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4gIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIFBhcmFsbGF4CisJICBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOgorCSAgImlyYXR0YWNoIC1kIGxpdGVsaW5rIi4KKworY29uZmlnIE1DUDIxMjBfRE9OR0xFX09MRAorCXRyaXN0YXRlICJNaWNyb2NoaXAgTUNQMjEyMCIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIE1pY3JvY2hpcCBNQ1AyMTIwCisJICBkb25nbGUuICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgVGhlIE1DUDIxMjAgZG9uZ2xlCisJICBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbCBwb3J0IGNvbm5lY3RvciwgYW5kIGNhbgorCSAgY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4gIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIE1DUDIxMjAKKwkgIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBpbnNlcnQgImlyYXR0YWNoIC1kIG1jcDIxMjAiIGluIHRoZQorCSAgL2V0Yy9pcmRhL2RyaXZlcnMgc2NyaXB0LgorCisJICBZb3UgbXVzdCBidWlsZCB0aGlzIGRvbmdsZSB5b3Vyc2VsZi4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZToKKwkgIDxodHRwOi8vd3d3LmV5ZXRhcC5vcmcvfnRhbmdmL2lyZGFfc2lyX2xpbnV4Lmh0bWw+CisKK2NvbmZpZyBPTERfQkVMS0lOX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiT2xkIEJlbGtpbiBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEVfT0xEICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBBZGFwdGVjIEFpcnBvcnQgMTAwMAorCSAgYW5kIDIwMDAgZG9uZ2xlcy4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG9sZF9iZWxraW4uICBTb21lIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUKKwkgIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgPGZpbGU6ZHJpdmVycy9uZXQvaXJkYS9vbGRfYmVsa2luLmM+LgorCitjb25maWcgQUNUMjAwTF9ET05HTEVfT0xECisJdHJpc3RhdGUgIkFDVGlTWVMgSVItMjAwTCBkb25nbGUgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBET05HTEVfT0xEICYmIEVYUEVSSU1FTlRBTCAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgQUNUaVNZUyBJUi0yMDBMCisJICBkb25nbGUuICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgVGhlIEFDVGlTWVMKKwkgIElSLTIwMEwgZG9uZ2xlIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLAorCSAgYW5kIGNhbiBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvcgorCSAgQUNUaVNZUyBJUi0yMDBMIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6CisJICAiaXJhdHRhY2ggLWQgYWN0MjAwbCIuCisKK2NvbmZpZyBNQTYwMF9ET05HTEVfT0xECisJdHJpc3RhdGUgIk1vYmlsZSBBY3Rpb24gTUE2MDAgZG9uZ2xlIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRE9OR0xFX09MRCAmJiBFWFBFUklNRU5UQUwgJiYgSVJEQQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIE1vYmlsZSBBY3Rpb24gTUE2MDAKKwkgIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBNQTYwMCBkb25nbGUKKwkgIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB0ZXN0ZWQgb24gSXJDT01NLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgTUE2MDAKKwkgIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBpbnNlcnQgImlyYXR0YWNoIC1kIG1hNjAwIiBpbiB0aGUKKwkgIC9ldGMvaXJkYS9kcml2ZXJzIHNjcmlwdC4gIE5vdGU6IGlydXRpbHMgMC45LjE1IHJlcXVpcmVzIG5vCisJICBtb2RpZmljYXRpb24uIGlydXRpbHMgMC45LjkgbmVlZHMgbW9kaWZpY2F0aW9uLiBGb3IgbW9yZQorCSAgaW5mb3JtYXRpb24sIGRvd25sb2FkIHRoZSBmb2xsb3dpbmcgdGFyIGd6aXAgZmlsZS4KKworCSAgVGhlcmUgaXMgYSBwcmUtY29tcGlsZWQgbW9kdWxlIG9uCisJICA8aHR0cDovL2VuZ3N2ci51c3QuaGsvfmVldHdsOTUvbWE2MDAuaHRtbD4KKworY29uZmlnIEVQNzIxMV9JUgorCXRyaXN0YXRlICJFUDcyMTEgSS9SIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBET05HTEVfT0xEICYmIEFSQ0hfRVA3MjExICYmIElSREEKKworY29tbWVudCAiRklSIGRldmljZSBkcml2ZXJzIgorCitjb25maWcgVVNCX0lSREEKKwl0cmlzdGF0ZSAiSXJEQSBVU0IgZG9uZ2xlcyIKKwlkZXBlbmRzIG9uIElSREEgJiYgVVNCCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgVVNCIElyREEgRklSIERvbmdsZQorCSAgZGV2aWNlIGRyaXZlci4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGlyZGEtdXNiLiAgSXJEQS1VU0Igc3VwcG9ydCB0aGUgdmFyaW91cyBJckRBIFVTQgorCSAgZG9uZ2xlcyBhdmFpbGFibGUgYW5kIG1vc3Qgb2YgdGhlaXIgcGVjdWxhcml0aWVzLiAgVGhvc2UgZG9uZ2xlcworCSAgcGx1ZyBpbiB0aGUgVVNCIHBvcnQgb2YgeW91ciBjb21wdXRlciwgYXJlIHBsdWcgYW5kIHBsYXksIGFuZAorCSAgc3VwcG9ydCBTSVIgYW5kIEZJUiAoNE1icHMpIHNwZWVkcy4gIE9uIHRoZSBvdGhlciBoYW5kLCB0aG9zZQorCSAgZG9uZ2xlcyB0ZW5kIHRvIGJlIGxlc3MgZWZmaWNpZW50IHRoYW4gYSBGSVIgY2hpcHNldC4KKworCSAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgZHJpdmVyIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC4gIEFuZCBvZiBjb3Vyc2UsCisJICB5b3Ugd2lsbCBuZWVkIGJvdGggVVNCIGFuZCBJckRBIHN1cHBvcnQgaW4geW91ciBrZXJuZWwuLi4KKworY29uZmlnIFNJR01BVEVMX0ZJUgorCXRyaXN0YXRlICJTaWdtYVRlbCBTVElyNDIwMCBicmlkZ2UgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBJUkRBICYmIFVTQiAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBTaWdtYVRlbCBTVElyNDIwMAorCSAgVVNCIElyREEgRklSIGJyaWRnZSBkZXZpY2UgZHJpdmVyLiAgCisKKwkgIFVTQiBicmlkZ2UgYmFzZWQgb24gdGhlIFNpZ21hVGVsIFNUSXI0MjAwIGRvbid0IGNvbmZvcm0gdG8gdGhlCisJICBJckRBLVVTQiBkZXZpY2UgY2xhc3Mgc3BlY2lmaWNhdGlvbiwgYW5kIHRoZXJlZm9yZSBuZWVkIHRoZWlyCisJICBvd24gc3BlY2lmaWMgZHJpdmVyLiBUaG9zZSBkb25nbGVzIHN1cHBvcnQgU0lSIGFuZCBGSVIgKDRNYnBzKQorCSAgc3BlZWRzLiAKKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgc3RpcjQyMDAuCisKK2NvbmZpZyBOU0NfRklSCisJdHJpc3RhdGUgIk5TQyBQQzg3MTA4L1BDODczMzgiCisJZGVwZW5kcyBvbiBJUkRBICYmIElTQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIE5TQyBQQzg3MTA4IGFuZAorCSAgUEM4NzMzOCBJckRBIGNoaXBzZXRzLiAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgU0lSLAorCSAgTUlSIGFuZCBGSVIgKDRNYnBzKSBzcGVlZHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIG5zYy1pcmNjLgorCitjb25maWcgV0lOQk9ORF9GSVIKKwl0cmlzdGF0ZSAiV2luYm9uZCBXODM5NzdBRiAoSVIpIgorCWRlcGVuZHMgb24gSVJEQSAmJiBJU0EKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIElyREEgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQKKwkgIFc4Mzk3N0FGIHN1cGVyLWlvIGNoaXBzZXQuICBUaGlzIGRyaXZlciBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIElyREEKKwkgIGNoaXBzZXQgaW4gdGhlIENvcmVsIE5ldFdpbmRlci4gIFRoZSBkcml2ZXIgc3VwcG9ydHMgU0lSLCBNSVIgYW5kCisJICBGSVIgKDRNYnBzKSBzcGVlZHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIHc4Mzk3N2FmX2lyLgorCitjb25maWcgVE9TSElCQV9GSVIKKwl0cmlzdGF0ZSAiVG9zaGliYSBUeXBlLU8gSVIgUG9ydCIKKwlkZXBlbmRzIG9uIElSREEgJiYgUENJICYmICE2NEJJVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFRvc2hpYmEgVHlwZS1PIElSCisJICBhbmQgRG9uYXUgb2JvZSBjaGlwc2V0cy4gVGhlc2UgY2hpcHNldHMgYXJlIHVzZWQgYnkgdGhlIFRvc2hpYmEKKwkgIExpYnJldHRvIDEwMC8xMTBDVCwgVGVjcmEgODEwMCwgUG9ydGVnZSA3MDIwIGFuZCBtYW55IG1vcmUgbGFwdG9wcy4KKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIGRvbmF1Ym9lLgorCitjb25maWcgQVUxMDAwX0ZJUgorCXRyaXN0YXRlICJBbGNoZW15IEF1MTAwMCBTSVIvRklSIgorCWRlcGVuZHMgb24gTUlQU19BVTEwMDAgJiYgSVJEQQorCitjb25maWcgU01DX0lSQ0NfRklSCisJdHJpc3RhdGUgIlNNU0MgSXJDQyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJUkRBICYmIElTQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFNNQyBJbmZyYXJlZAorCSAgQ29tbXVuaWNhdGlvbnMgQ29udHJvbGxlci4gIEl0IGlzIHVzZWQgaW4gYSB3aWRlIHZhcmlldHkgb2YKKwkgIGxhcHRvcHMgKEZ1aml0c3UsIFNvbnksIENvbXBhcSBhbmQgc29tZSBUb3NoaWJhKS4KKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIHNtc2MtaXJjYzIuby4KKworY29uZmlnIEFMSV9GSVIKKwl0cmlzdGF0ZSAiQUxpIE01MTIzIEZJUiAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJUkRBICYmIElTQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEFMaSBNNTEyMyBGSVIKKwkgIENvbnRyb2xsZXIuICBUaGUgQUxpIE01MTIzIEZJUiBDb250cm9sbGVyIGlzIGVtYmVkZGVkIGluIEFMaSBNMTU0M0MsCisJICBNMTUzNSwgTTE1MzVELCBNMTUzNSssIE0xNTM1RCBTb3VydGggQnJpZGdlLiAgVGhpcyBkcml2ZXIgc3VwcG9ydHMKKwkgIFNJUiwgTUlSIGFuZCBGSVIgKDRNYnBzKSBzcGVlZHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIGFsaS1pcmNjLgorCitjb25maWcgVkxTSV9GSVIKKwl0cmlzdGF0ZSAiVkxTSSA4MkMxNDcgU0lSL01JUi9GSVIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgSVJEQSAmJiBQQ0kKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBWTFNJIDgyQzE0NworCSAgUENJLUlyREEgQ29udHJvbGxlci4gVGhpcyBjb250cm9sbGVyIGlzIHVzZWQgYnkgdGhlIEhQIE9tbmlCb29rIDgwMAorCSAgYW5kIDU1MDAgbm90ZWJvb2tzLiBUaGUgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIFNJUiwgTUlSIGFuZAorCSAgRklSICg0TWJwcykgc3BlZWRzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICB2bHNpX2lyLgorCitjb25maWcgU0ExMTAwX0ZJUgorCXRyaXN0YXRlICJTQTExMDAgSW50ZXJuYWwgSVIiCisJZGVwZW5kcyBvbiBBUkNIX1NBMTEwMCAmJiBJUkRBCisKK2NvbmZpZyBWSUFfRklSCisJdHJpc3RhdGUgIlZJQSBWVDgyMzEvVlQxMjExIFNJUi9NSVIvRklSIgorCWRlcGVuZHMgb24gSVJEQSAmJiBJU0EgJiYgUENJCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgVklBIFZUODIzMQorCSAgYW5kIFZJQSBWVDEyMTEgSXJEQSBjb250cm9sbGVycywgZm91bmQgb24gdGhlIG1vdGhlcmJvYXJkcyB1c2luZworCSAgdGhvc2UgdGhvc2UgVklBIGNoaXBzZXRzLiBUbyB1c2UgdGhpcyBjb250cm9sbGVyLCB5b3Ugd2lsbCBuZWVkCisJICB0byBwbHVnIGEgc3BlY2lmaWMgNSBwaW5zIEZJUiBJckRBIGRvbmdsZSBpbiB0aGUgc3BlY2lmaWMKKwkgIG1vdGhlcmJvYXJkIGNvbm5lY3Rvci4gVGhlIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciBTSVIsIE1JUgorCSAgYW5kIEZJUiAoNE1icHMpIHNwZWVkcy4KKworCSAgWW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IHRoZSAnZG9uZ2xlX2lkJyBtb2R1bGUgcGFyYW1ldGVyIHRvCisJICBpbmRpY2F0ZSB0aGUgRklSIGRvbmdsZSBhdHRhY2hlZCB0byB0aGUgY29udHJvbGxlci4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgdmlhLWlyY2MuCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2lyZGEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhOGJkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IElyREEgaW5mcmFyZWQgcG9ydCBkZXZpY2UgZHJpdmVycy4KKyMKKyMgOSBBdWcgMjAwMCwgQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgorIyBSZXdyaXR0ZW4gdG8gdXNlIGxpc3RzIGluc3RlYWQgb2YgaWYtc3RhdGVtZW50cy4KKyMKKworIyBPbGQgU0lSIGRyaXZlcnMgCitvYmotJChDT05GSUdfSVJQT1JUX1NJUikJKz0gCQlpcnBvcnQubworIyBGSVIgZHJpdmVycworb2JqLSQoQ09ORklHX1VTQl9JUkRBKQkJKz0gaXJkYS11c2Iubworb2JqLSQoQ09ORklHX1NJR01BVEVMX0ZJUikJKz0gc3RpcjQyMDAubworb2JqLSQoQ09ORklHX05TQ19GSVIpCQkrPSBuc2MtaXJjYy5vCitvYmotJChDT05GSUdfV0lOQk9ORF9GSVIpCSs9IHc4Mzk3N2FmX2lyLm8KK29iai0kKENPTkZJR19TQTExMDBfRklSKQkrPSBzYTExMDBfaXIubworb2JqLSQoQ09ORklHX1RPU0hJQkFfRklSKQkrPSBkb25hdWJvZS5vCitvYmotJChDT05GSUdfU01DX0lSQ0NfRklSKQkrPSBzbXNjLWlyY2MyLm8KK29iai0kKENPTkZJR19BTElfRklSKQkJKz0gYWxpLWlyY2Mubworb2JqLSQoQ09ORklHX1ZMU0lfRklSKQkJKz0gdmxzaV9pci5vCitvYmotJChDT05GSUdfVklBX0ZJUikJCSs9IHZpYS1pcmNjLm8KKyMgT2xkIGRvbmdsZSBkcml2ZXJzIGZvciBvbGQgU0lSIGRyaXZlcnMKK29iai0kKENPTkZJR19FU0lfRE9OR0xFX09MRCkJCSs9IGVzaS5vCitvYmotJChDT05GSUdfVEVLUkFNX0RPTkdMRV9PTEQpCSs9IHRla3JhbS5vCitvYmotJChDT05GSUdfQUNUSVNZU19ET05HTEVfT0xEKQkrPSBhY3Rpc3lzLm8KK29iai0kKENPTkZJR19HSVJCSUxfRE9OR0xFX09MRCkJKz0gZ2lyYmlsLm8KK29iai0kKENPTkZJR19MSVRFTElOS19ET05HTEVfT0xEKQkrPSBsaXRlbGluay5vCitvYmotJChDT05GSUdfT0xEX0JFTEtJTl9ET05HTEVfT0xEKQkrPSBvbGRfYmVsa2luLm8KK29iai0kKENPTkZJR19NQ1AyMTIwX0RPTkdMRV9PTEQpCSs9IG1jcDIxMjAubworb2JqLSQoQ09ORklHX0FDVDIwMExfRE9OR0xFX09MRCkJKz0gYWN0MjAwbC5vCitvYmotJChDT05GSUdfTUE2MDBfRE9OR0xFX09MRCkJKz0gbWE2MDAubworb2JqLSQoQ09ORklHX0VQNzIxMV9JUikJCSs9IGVwNzIxMV9pci5vCitvYmotJChDT05GSUdfQVUxMDAwX0ZJUikJKz0gYXUxa19pci5vCisjIE5ldyBTSVIgZHJpdmVycworb2JqLSQoQ09ORklHX0lSVFRZX1NJUikJCSs9IGlydHR5LXNpci5vCXNpci1kZXYubworIyBOZXcgZG9uZ2xlcyBkcml2ZXJzIGZvciBuZXcgU0lSIGRyaXZlcnMKK29iai0kKENPTkZJR19FU0lfRE9OR0xFKQkrPSBlc2ktc2lyLm8KK29iai0kKENPTkZJR19URUtSQU1fRE9OR0xFKQkrPSB0ZWtyYW0tc2lyLm8KK29iai0kKENPTkZJR19BQ1RJU1lTX0RPTkdMRSkJKz0gYWN0aXN5cy1zaXIubworb2JqLSQoQ09ORklHX0xJVEVMSU5LX0RPTkdMRSkJKz0gbGl0ZWxpbmstc2lyLm8KK29iai0kKENPTkZJR19HSVJCSUxfRE9OR0xFKQkrPSBnaXJiaWwtc2lyLm8KK29iai0kKENPTkZJR19PTERfQkVMS0lOX0RPTkdMRSkJKz0gb2xkX2JlbGtpbi1zaXIubworb2JqLSQoQ09ORklHX01DUDIxMjBfRE9OR0xFKQkrPSBtY3AyMTIwLXNpci5vCitvYmotJChDT05GSUdfQUNUMjAwTF9ET05HTEUpCSs9IGFjdDIwMGwtc2lyLm8KK29iai0kKENPTkZJR19NQTYwMF9ET05HTEUpCSs9IG1hNjAwLXNpci5vCisKKyMgVGhlIFNJUiBoZWxwZXIgbW9kdWxlCitzaXItZGV2LW9ianMgOj0gc2lyX2NvcmUubyBzaXJfZGV2Lm8gc2lyX2RvbmdsZS5vIHNpcl9rdGhyZWFkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWN0MjAwbC1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYWN0MjAwbC1zaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGI4OWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hY3QyMDBsLXNpci5jCkBAIC0wLDAgKzEsMjU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgYWN0MjAwbC5jCisgKiBWZXJzaW9uOiAgICAgICAwLjgKKyAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgQUNUaVNZUyBBQ1QtSVIyMDBMIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgU0hJTUlaVSBUYWt1eWEgPHRzaGltaXp1QGdhMi5zby1uZXQubmUuanA+CisgKiBDcmVhdGVkIGF0OiAgICBGcmkgQXVnICAzIDE3OjM1OjQyIDIwMDEKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBBdWcgMTcgMTA6MjI6NDAgMjAwMQorICogTW9kaWZpZWQgYnk6ICAgU0hJTUlaVSBUYWt1eWEgPHRzaGltaXp1QGdhMi5zby1uZXQubmUuanA+CisgKgorICogICAgIENvcHlyaWdodCAoYykgMjAwMSBTSElNSVpVIFRha3V5YSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworc3RhdGljIGludCBhY3QyMDBsX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBhY3QyMDBsX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IGFjdDIwMGxfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IGFjdDIwMGxfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKTsKKworLyogUmVnc2l0ZXIgMDogQ29udHJvbCByZWdpc3RlciAjMSAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzAgICAgMHgwMAorI2RlZmluZSBBQ1QyMDBMX1RYRU4gICAgMHgwMSAvKiBFbmFibGUgdHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SWEVOICAgIDB4MDIgLyogRW5hYmxlIHJlY2VpdmVyICovCisKKy8qIFJlZ2lzdGVyIDE6IENvbnRyb2wgcmVnaXN0ZXIgIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcxICAgIDB4MTAKKyNkZWZpbmUgQUNUMjAwTF9MT0RCICAgIDB4MDEgLyogTG9hZCBuZXcgYmF1ZCByYXRlIGNvdW50IHZhbHVlICovCisjZGVmaW5lIEFDVDIwMExfV0lERSAgICAweDA0IC8qIEV4cGFuZCB0aGUgbWF4aW11bSBhbGxvd2FibGUgcHVsc2UgKi8KKworLyogUmVnaXN0ZXIgNDogT3V0cHV0IFBvd2VyIHJlZ2lzdGVyICovCisjZGVmaW5lIEFDVDIwMExfUkVHNCAgICAweDQwCisjZGVmaW5lIEFDVDIwMExfT1AwICAgICAweDAxIC8qIEVuYWJsZSBMRUQxQyBvdXRwdXQgKi8KKyNkZWZpbmUgQUNUMjAwTF9PUDEgICAgIDB4MDIgLyogRW5hYmxlIExFRDJDIG91dHB1dCAqLworI2RlZmluZSBBQ1QyMDBMX0JMS1IgICAgMHgwNAorCisvKiBSZWdpc3RlciA1OiBSZWNlaXZlIE1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc1ICAgIDB4NTAKKyNkZWZpbmUgQUNUMjAwTF9SV0lETCAgIDB4MDEgLyogZml4ZWQgMS42dXMgcHVsc2UgbW9kZSAqLworCisvKiBSZWdpc3RlciA2OiBSZWNlaXZlIFNlbnNpdGl2aXR5IHJlZ2lzdGVyICMxICovCisjZGVmaW5lIEFDVDIwMExfUkVHNiAgICAweDYwCisjZGVmaW5lIEFDVDIwMExfUlMwICAgICAweDAxIC8qIHJlY2VpdmUgdGhyZXNob2xkIGJpdCAwICovCisjZGVmaW5lIEFDVDIwMExfUlMxICAgICAweDAyIC8qIHJlY2VpdmUgdGhyZXNob2xkIGJpdCAxICovCisKKy8qIFJlZ2lzdGVyIDc6IFJlY2VpdmUgU2Vuc2l0aXZpdHkgcmVnaXN0ZXIgIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc3ICAgIDB4NzAKKyNkZWZpbmUgQUNUMjAwTF9FTlBPUyAgIDB4MDQgLyogSWdub3JlIHRoZSBmYWxsaW5nIGVkZ2UgKi8KKworLyogUmVnaXN0ZXIgOCw5OiBCYXVkIFJhdGUgRHZpZGVyIHJlZ2lzdGVyICMxLCMyICovCisjZGVmaW5lIEFDVDIwMExfUkVHOCAgICAweDgwCisjZGVmaW5lIEFDVDIwMExfUkVHOSAgICAweDkwCisKKyNkZWZpbmUgQUNUMjAwTF8yNDAwICAgIDB4NWYKKyNkZWZpbmUgQUNUMjAwTF85NjAwICAgIDB4MTcKKyNkZWZpbmUgQUNUMjAwTF8xOTIwMCAgIDB4MGIKKyNkZWZpbmUgQUNUMjAwTF8zODQwMCAgIDB4MDUKKyNkZWZpbmUgQUNUMjAwTF81NzYwMCAgIDB4MDMKKyNkZWZpbmUgQUNUMjAwTF8xMTUyMDAgIDB4MDEKKworLyogUmVnaXN0ZXIgMTM6IENvbnRyb2wgcmVnaXN0ZXIgIzMgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcxMyAgIDB4ZDAKKyNkZWZpbmUgQUNUMjAwTF9TSERXICAgIDB4MDEgLyogRW5hYmxlIGFjY2VzcyB0byBzaGFkb3cgcmVnaXN0ZXJzICovCisKKy8qIFJlZ2lzdGVyIDE1OiBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcxNSAgIDB4ZjAKKworLyogUmVnaXN0ZXIgMjE6IENvbnRyb2wgcmVnaXN0ZXIgIzQgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcyMSAgIDB4NTAKKyNkZWZpbmUgQUNUMjAwTF9FWENLICAgIDB4MDIgLyogRGlzYWJsZSBjbG9jayBvdXRwdXQgZHJpdmVyICovCisjZGVmaW5lIEFDVDIwMExfT1NDTCAgICAweDA0IC8qIG9zY2lsbGF0b3IgaW4gbG93IHBvd2VyLCBtZWRpdW0gYWNjdXJhY3kgbW9kZSAqLworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgYWN0MjAwbCA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIkFDVGlTWVMgQUNULUlSMjAwTCIsCisJLnR5cGUJCT0gSVJEQV9BQ1QyMDBMX0RPTkdMRSwKKwkub3BlbgkJPSBhY3QyMDBsX29wZW4sCisJLmNsb3NlCQk9IGFjdDIwMGxfY2xvc2UsCisJLnJlc2V0CQk9IGFjdDIwMGxfcmVzZXQsCisJLnNldF9zcGVlZAk9IGFjdDIwMGxfY2hhbmdlX3NwZWVkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWN0MjAwbF9zaXJfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmYWN0MjAwbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3QyMDBsX3Npcl9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV91bnJlZ2lzdGVyX2RvbmdsZSgmYWN0MjAwbCk7Cit9CisKK3N0YXRpYyBpbnQgYWN0MjAwbF9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHFvc19pbmZvICpxb3MgPSAmZGV2LT5xb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIFBvd2VyIG9uIHRoZSBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCS8qIFNldCB0aGUgc3BlZWRzIHdlIGNhbiBhY2NlcHQgKi8KKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMzsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvKiBpcmRhIHRocmVhZCB3YWl0cyA1MCBtc2VjIGZvciBwb3dlciBzZXR0bGluZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWN0MjAwbF9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogUG93ZXIgb2ZmIHRoZSBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhY3QyMDBsX2NoYW5nZV9zcGVlZCAoZGV2LCBzcGVlZCkKKyAqCisgKiAgICBTZXQgdGhlIHNwZWVkIGZvciB0aGUgQUNUaVNZUyBBQ1QtSVIyMDBMIHR5cGUgZG9uZ2xlLgorICoKKyAqLworc3RhdGljIGludCBhY3QyMDBsX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCkKK3sKKwl1OCBjb250cm9sWzNdOworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBDbGVhciBEVFIgYW5kIHNldCBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIFRSVUUpOworCisJc3dpdGNoIChzcGVlZCkgeworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgOTYwMDoKKwkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF85NjAwICAgICAgICYgMHgwZik7CisJCWNvbnRyb2xbMV0gPSBBQ1QyMDBMX1JFRzkgfCAoKEFDVDIwMExfOTYwMCA+PiA0KSAmIDB4MGYpOworCQlicmVhazsKKwljYXNlIDE5MjAwOgorCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzE5MjAwICAgICAgICYgMHgwZik7CisJCWNvbnRyb2xbMV0gPSBBQ1QyMDBMX1JFRzkgfCAoKEFDVDIwMExfMTkyMDAgPj4gNCkgJiAweDBmKTsKKwkJYnJlYWs7CisJY2FzZSAzODQwMDoKKwkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF8zODQwMCAgICAgICAmIDB4MGYpOworCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzM4NDAwID4+IDQpICYgMHgwZik7CisJCWJyZWFrOworCWNhc2UgNTc2MDA6CisJCWNvbnRyb2xbMF0gPSBBQ1QyMDBMX1JFRzggfCAgKEFDVDIwMExfNTc2MDAgICAgICAgJiAweDBmKTsKKwkJY29udHJvbFsxXSA9IEFDVDIwMExfUkVHOSB8ICgoQUNUMjAwTF81NzYwMCA+PiA0KSAmIDB4MGYpOworCQlicmVhazsKKwljYXNlIDExNTIwMDoKKwkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF8xMTUyMDAgICAgICAgJiAweDBmKTsKKwkJY29udHJvbFsxXSA9IEFDVDIwMExfUkVHOSB8ICgoQUNUMjAwTF8xMTUyMDAgPj4gNCkgJiAweDBmKTsKKwkJYnJlYWs7CisJfQorCWNvbnRyb2xbMl0gPSBBQ1QyMDBMX1JFRzEgfCBBQ1QyMDBMX0xPREIgfCBBQ1QyMDBMX1dJREU7CisKKwkvKiBXcml0ZSBjb250cm9sIGJ5dGVzICovCisJc2lyZGV2X3Jhd193cml0ZShkZXYsIGNvbnRyb2wsIDMpOworCW1zbGVlcCg1KTsKKworCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCWRldi0+c3BlZWQgPSBzcGVlZDsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gYWN0MjAwbF9yZXNldCAoZHJpdmVyKQorICoKKyAqICAgIFJlc2V0IHRoZSBBQ1RpU1lTIEFDVC1JUjIwMEwgdHlwZSBkb25nbGUuCisgKi8KKworI2RlZmluZSBBQ1QyMDBMX1NUQVRFX1dBSVQxX1JFU0VUCShTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUKzEpCisjZGVmaW5lIEFDVDIwMExfU1RBVEVfV0FJVDJfUkVTRVQJKFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQrMikKKworc3RhdGljIGludCBhY3QyMDBsX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgc3RhdGUgPSBkZXYtPmZzbS5zdWJzdGF0ZTsKKwl1bnNpZ25lZCBkZWxheSA9IDA7CisJdTggY29udHJvbFs5XSA9IHsKKwkJQUNUMjAwTF9SRUcxNSwKKwkJQUNUMjAwTF9SRUcxMyB8IEFDVDIwMExfU0hEVywKKwkJQUNUMjAwTF9SRUcyMSB8IEFDVDIwMExfRVhDSyB8IEFDVDIwMExfT1NDTCwKKwkJQUNUMjAwTF9SRUcxMywKKwkJQUNUMjAwTF9SRUc3ICB8IEFDVDIwMExfRU5QT1MsCisJCUFDVDIwMExfUkVHNiAgfCBBQ1QyMDBMX1JTMCAgfCBBQ1QyMDBMX1JTMSwKKwkJQUNUMjAwTF9SRUc1ICB8IEFDVDIwMExfUldJREwsCisJCUFDVDIwMExfUkVHNCAgfCBBQ1QyMDBMX09QMCAgfCBBQ1QyMDBMX09QMSB8IEFDVDIwMExfQkxLUiwKKwkJQUNUMjAwTF9SRUcwICB8IEFDVDIwMExfVFhFTiB8IEFDVDIwMExfUlhFTgorCX07CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQ6CisJCS8qIFJlc2V0IHRoZSBkb25nbGUgOiBzZXQgUlRTIGxvdyBmb3IgMjUgbXMgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgRkFMU0UpOworCQlzdGF0ZSA9IEFDVDIwMExfU1RBVEVfV0FJVDFfUkVTRVQ7CisJCWRlbGF5ID0gNTA7CisJCWJyZWFrOworCisJY2FzZSBBQ1QyMDBMX1NUQVRFX1dBSVQxX1JFU0VUOgorCQkvKiBDbGVhciBEVFIgYW5kIHNldCBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKworCQl1ZGVsYXkoMjUpOwkJCS8qIGJldHRlciB3YWl0IGZvciBzb21lIHNob3J0IHdoaWxlICovCisKKwkJLyogV3JpdGUgY29udHJvbCBieXRlcyAqLworCQlzaXJkZXZfcmF3X3dyaXRlKGRldiwgY29udHJvbCwgc2l6ZW9mKGNvbnRyb2wpKTsKKwkJc3RhdGUgPSBBQ1QyMDBMX1NUQVRFX1dBSVQyX1JFU0VUOworCQlkZWxheSA9IDE1OworCQlicmVhazsKKworCWNhc2UgQUNUMjAwTF9TVEFURV9XQUlUMl9SRVNFVDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKwkJZGV2LT5zcGVlZCA9IDk2MDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCWRldi0+ZnNtLnN1YnN0YXRlID0gc3RhdGU7CisJcmV0dXJuIChkZWxheSA+IDApID8gZGVsYXkgOiByZXQ7Cit9CisKK01PRFVMRV9BVVRIT1IoIlNISU1JWlUgVGFrdXlhIDx0c2hpbWl6dUBnYTIuc28tbmV0Lm5lLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1RpU1lTIEFDVC1JUjIwMEwgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0xMCIpOyAvKiBJUkRBX0FDVDIwMExfRE9OR0xFICovCisKK21vZHVsZV9pbml0KGFjdDIwMGxfc2lyX2luaXQpOworbW9kdWxlX2V4aXQoYWN0MjAwbF9zaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2FjdDIwMGwuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYWN0MjAwbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NmNkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2FjdDIwMGwuYwpAQCAtMCwwICsxLDI5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIGFjdDIwMGwuYworICogVmVyc2lvbjogICAgICAgMC44CisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEFDVGlTWVMgQUNULUlSMjAwTCBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIFNISU1JWlUgVGFrdXlhIDx0c2hpbWl6dUBnYTIuc28tbmV0Lm5lLmpwPgorICogQ3JlYXRlZCBhdDogICAgRnJpIEF1ZyAgMyAxNzozNTo0MiAyMDAxCisgKiBNb2RpZmllZCBhdDogICBGcmkgQXVnIDE3IDEwOjIyOjQwIDIwMDEKKyAqIE1vZGlmaWVkIGJ5OiAgIFNISU1JWlUgVGFrdXlhIDx0c2hpbWl6dUBnYTIuc28tbmV0Lm5lLmpwPgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgU0hJTUlaVSBUYWt1eWEsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworc3RhdGljIGludCAgYWN0MjAwbF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkIGFjdDIwMGxfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgYWN0MjAwbF9jbG9zZShkb25nbGVfdCAqc2VsZik7CitzdGF0aWMgaW50ICBhY3QyMDBsX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworLyogUmVnc2l0ZXIgMDogQ29udHJvbCByZWdpc3RlciAjMSAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzAgICAgMHgwMAorI2RlZmluZSBBQ1QyMDBMX1RYRU4gICAgMHgwMSAvKiBFbmFibGUgdHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SWEVOICAgIDB4MDIgLyogRW5hYmxlIHJlY2VpdmVyICovCisKKy8qIFJlZ2lzdGVyIDE6IENvbnRyb2wgcmVnaXN0ZXIgIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcxICAgIDB4MTAKKyNkZWZpbmUgQUNUMjAwTF9MT0RCICAgIDB4MDEgLyogTG9hZCBuZXcgYmF1ZCByYXRlIGNvdW50IHZhbHVlICovCisjZGVmaW5lIEFDVDIwMExfV0lERSAgICAweDA0IC8qIEV4cGFuZCB0aGUgbWF4aW11bSBhbGxvd2FibGUgcHVsc2UgKi8KKworLyogUmVnaXN0ZXIgNDogT3V0cHV0IFBvd2VyIHJlZ2lzdGVyICovCisjZGVmaW5lIEFDVDIwMExfUkVHNCAgICAweDQwCisjZGVmaW5lIEFDVDIwMExfT1AwICAgICAweDAxIC8qIEVuYWJsZSBMRUQxQyBvdXRwdXQgKi8KKyNkZWZpbmUgQUNUMjAwTF9PUDEgICAgIDB4MDIgLyogRW5hYmxlIExFRDJDIG91dHB1dCAqLworI2RlZmluZSBBQ1QyMDBMX0JMS1IgICAgMHgwNAorCisvKiBSZWdpc3RlciA1OiBSZWNlaXZlIE1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc1ICAgIDB4NTAKKyNkZWZpbmUgQUNUMjAwTF9SV0lETCAgIDB4MDEgLyogZml4ZWQgMS42dXMgcHVsc2UgbW9kZSAqLworCisvKiBSZWdpc3RlciA2OiBSZWNlaXZlIFNlbnNpdGl2aXR5IHJlZ2lzdGVyICMxICovCisjZGVmaW5lIEFDVDIwMExfUkVHNiAgICAweDYwCisjZGVmaW5lIEFDVDIwMExfUlMwICAgICAweDAxIC8qIHJlY2VpdmUgdGhyZXNob2xkIGJpdCAwICovCisjZGVmaW5lIEFDVDIwMExfUlMxICAgICAweDAyIC8qIHJlY2VpdmUgdGhyZXNob2xkIGJpdCAxICovCisKKy8qIFJlZ2lzdGVyIDc6IFJlY2VpdmUgU2Vuc2l0aXZpdHkgcmVnaXN0ZXIgIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc3ICAgIDB4NzAKKyNkZWZpbmUgQUNUMjAwTF9FTlBPUyAgIDB4MDQgLyogSWdub3JlIHRoZSBmYWxsaW5nIGVkZ2UgKi8KKworLyogUmVnaXN0ZXIgOCw5OiBCYXVkIFJhdGUgRHZpZGVyIHJlZ2lzdGVyICMxLCMyICovCisjZGVmaW5lIEFDVDIwMExfUkVHOCAgICAweDgwCisjZGVmaW5lIEFDVDIwMExfUkVHOSAgICAweDkwCisKKyNkZWZpbmUgQUNUMjAwTF8yNDAwICAgIDB4NWYKKyNkZWZpbmUgQUNUMjAwTF85NjAwICAgIDB4MTcKKyNkZWZpbmUgQUNUMjAwTF8xOTIwMCAgIDB4MGIKKyNkZWZpbmUgQUNUMjAwTF8zODQwMCAgIDB4MDUKKyNkZWZpbmUgQUNUMjAwTF81NzYwMCAgIDB4MDMKKyNkZWZpbmUgQUNUMjAwTF8xMTUyMDAgIDB4MDEKKworLyogUmVnaXN0ZXIgMTM6IENvbnRyb2wgcmVnaXN0ZXIgIzMgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcxMyAgIDB4ZDAKKyNkZWZpbmUgQUNUMjAwTF9TSERXICAgIDB4MDEgLyogRW5hYmxlIGFjY2VzcyB0byBzaGFkb3cgcmVnaXN0ZXJzICovCisKKy8qIFJlZ2lzdGVyIDE1OiBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcxNSAgIDB4ZjAKKworLyogUmVnaXN0ZXIgMjE6IENvbnRyb2wgcmVnaXN0ZXIgIzQgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcyMSAgIDB4NTAKKyNkZWZpbmUgQUNUMjAwTF9FWENLICAgIDB4MDIgLyogRGlzYWJsZSBjbG9jayBvdXRwdXQgZHJpdmVyICovCisjZGVmaW5lIEFDVDIwMExfT1NDTCAgICAweDA0IC8qIG9zY2lsbGF0b3IgaW4gbG93IHBvd2VyLCBtZWRpdW0gYWNjdXJhY3kgbW9kZSAqLworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9yZWcgZG9uZ2xlID0geworCS50eXBlID0gSVJEQV9BQ1QyMDBMX0RPTkdMRSwKKwkub3BlbiA9IGFjdDIwMGxfb3BlbiwKKwkuY2xvc2UgPSBhY3QyMDBsX2Nsb3NlLAorCS5yZXNldCA9IGFjdDIwMGxfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGFjdDIwMGxfY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWN0MjAwbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjdDIwMGxfY2xlYW51cCh2b2lkKQoreworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBhY3QyMDBsX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogUG93ZXIgb24gdGhlIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBTZXQgdGhlIHNwZWVkcyB3ZSBjYW4gYWNjZXB0ICovCisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDM7Cit9CisKK3N0YXRpYyB2b2lkIGFjdDIwMGxfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBQb3dlciBvZmYgdGhlIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFjdDIwMGxfY2hhbmdlX3NwZWVkIChkZXYsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBBQ1RpU1lTIEFDVC1JUjIwMEwgdHlwZSBkb25nbGUuCisgKgorICovCitzdGF0aWMgaW50IGFjdDIwMGxfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworCV9fdTggY29udHJvbFszXTsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJc2VsZi0+c3BlZWRfdGFzayA9IHRhc2s7CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwkJaWYgKGlyZGFfdGFza19leGVjdXRlKHNlbGYsIGFjdDIwMGxfcmVzZXQsIE5VTEwsIHRhc2ssCisJCQkJKHZvaWQgKikgc3BlZWQpKQorCQl7CisJCQkvKiBEb25nbGUgbmVlZCBtb3JlIHRpbWUgdG8gcmVzZXQgKi8KKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9XQUlUKTsKKworCQkJLyogR2l2ZSByZXNldCAxIHNlYyB0byBmaW5pc2ggKi8KKwkJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCByZXNldHRpbmcgZG9uZ2xlIHRpbWVkIG91dCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC0xOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9ET05FOgorCQkvKiBDbGVhciBEVFIgYW5kIHNldCBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOworCisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJY2FzZSA5NjAwOgorCQlkZWZhdWx0OgorCQkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF85NjAwICAgICAgICYgMHgwZik7CisJCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzk2MDAgPj4gNCkgJiAweDBmKTsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF8xOTIwMCAgICAgICAmIDB4MGYpOworCQkJY29udHJvbFsxXSA9IEFDVDIwMExfUkVHOSB8ICgoQUNUMjAwTF8xOTIwMCA+PiA0KSAmIDB4MGYpOworCQkJYnJlYWs7CisJCWNhc2UgMzg0MDA6CisJCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzM4NDAwICAgICAgICYgMHgwZik7CisJCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzM4NDAwID4+IDQpICYgMHgwZik7CisJCQlicmVhazsKKwkJY2FzZSA1NzYwMDoKKwkJCWNvbnRyb2xbMF0gPSBBQ1QyMDBMX1JFRzggfCAgKEFDVDIwMExfNTc2MDAgICAgICAgJiAweDBmKTsKKwkJCWNvbnRyb2xbMV0gPSBBQ1QyMDBMX1JFRzkgfCAoKEFDVDIwMExfNTc2MDAgPj4gNCkgJiAweDBmKTsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKwkJCWNvbnRyb2xbMF0gPSBBQ1QyMDBMX1JFRzggfCAgKEFDVDIwMExfMTE1MjAwICAgICAgICYgMHgwZik7CisJCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzExNTIwMCA+PiA0KSAmIDB4MGYpOworCQkJYnJlYWs7CisJCX0KKwkJY29udHJvbFsyXSA9IEFDVDIwMExfUkVHMSB8IEFDVDIwMExfTE9EQiB8IEFDVDIwMExfV0lERTsKKworCQkvKiBXcml0ZSBjb250cm9sIGJ5dGVzICovCisJCXNlbGYtPndyaXRlKHNlbGYtPmRldiwgY29udHJvbCwgMyk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcyg1KTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gYWN0MjAwbF9yZXNldCAoZHJpdmVyKQorICoKKyAqICAgIFJlc2V0IHRoZSBBQ1RpU1lTIEFDVC1JUjIwMEwgdHlwZSBkb25nbGUuCisgKi8KK3N0YXRpYyBpbnQgYWN0MjAwbF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCV9fdTggY29udHJvbFs5XSA9IHsKKwkJQUNUMjAwTF9SRUcxNSwKKwkJQUNUMjAwTF9SRUcxMyB8IEFDVDIwMExfU0hEVywKKwkJQUNUMjAwTF9SRUcyMSB8IEFDVDIwMExfRVhDSyB8IEFDVDIwMExfT1NDTCwKKwkJQUNUMjAwTF9SRUcxMywKKwkJQUNUMjAwTF9SRUc3ICB8IEFDVDIwMExfRU5QT1MsCisJCUFDVDIwMExfUkVHNiAgfCBBQ1QyMDBMX1JTMCAgfCBBQ1QyMDBMX1JTMSwKKwkJQUNUMjAwTF9SRUc1ICB8IEFDVDIwMExfUldJREwsCisJCUFDVDIwMExfUkVHNCAgfCBBQ1QyMDBMX09QMCAgfCBBQ1QyMDBMX09QMSB8IEFDVDIwMExfQkxLUiwKKwkJQUNUMjAwTF9SRUcwICB8IEFDVDIwMExfVFhFTiB8IEFDVDIwMExfUlhFTgorCX07CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXNlbGYtPnJlc2V0X3Rhc2sgPSB0YXNrOworCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisJCS8qIFBvd2VyIG9uIHRoZSBkb25nbGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDUwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDE6CisJCS8qIFJlc2V0IHRoZSBkb25nbGUgOiBzZXQgUlRTIGxvdyBmb3IgMjUgbXMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CisKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQyKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcyg1MCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQyOgorCQkvKiBDbGVhciBEVFIgYW5kIHNldCBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOworCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZXMgKi8KKwkJc2VsZi0+d3JpdGUoc2VsZi0+ZGV2LCBjb250cm9sLCA5KTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQzKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxNSk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQzOgorCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK01PRFVMRV9BVVRIT1IoIlNISU1JWlUgVGFrdXlhIDx0c2hpbWl6dUBnYTIuc28tbmV0Lm5lLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1RpU1lTIEFDVC1JUjIwMEwgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0xMCIpOyAvKiBJUkRBX0FDVDIwMExfRE9OR0xFICovCisKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIEFDVGlTWVMgQUNULUlSMjAwTCBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KGFjdDIwMGxfaW5pdCk7CisKKy8qCisgKiBGdW5jdGlvbiBjbGVhbnVwX21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBDbGVhbnVwIEFDVGlTWVMgQUNULUlSMjAwTCBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KGFjdDIwMGxfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2FjdGlzeXMtc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2FjdGlzeXMtc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxNWFiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYWN0aXN5cy1zaXIuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBhY3Rpc3lzLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMQorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBBQ1RpU1lTIElSLTIyMEwgYW5kIElSLTIyMEwrIAorICogICAgICAgICAgICAgICAgZG9uZ2xlcworICogU3RhdHVzOiAgICAgICAgQmV0YS4KKyAqIEF1dGhvcnM6ICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4gKGluaXRpYWxseSkKKyAqCQkgIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4gKG5ldyB2ZXJzaW9uKQorICoJCSAgTWFydGluIERpZWhsIDxtYWRAbWRpZWhsLmRlPiAobmV3IHZlcnNpb24gZm9yIHNpcl9kZXYpCisgKiBDcmVhdGVkIGF0OiAgICBXZWQgT2N0IDIxIDIwOjAyOjM1IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBPY3QgMjcgMjI6MDI6MTMgMjAwMgorICogTW9kaWZpZWQgYnk6ICAgTWFydGluIERpZWhsIDxtYWRAbWRpZWhsLmRlPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IEplYW4gVG91cnJpbGhlcworICogICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwKKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ2hhbmdlbG9nCisgKgorICogMC44IC0+IDAuOTk5OSAtIEplYW4KKyAqCW8gTmV3IGluaXRpYWxpc2F0aW9uIHByb2NlZHVyZSA6IG11Y2ggc2FmZXIgYW5kIGNvcnJlY3QKKyAqCW8gTmV3IHByb2NlZHVyZSB0aGUgY2hhbmdlIHNwZWVkIDogbXVjaCBmYXN0ZXIgYW5kIHNpbXBsZXIKKyAqCW8gT3RoZXIgY2xlYW51cHMgJiBjb21tZW50cworICoJVGhhbmtzIHRvIExpY2hlbiBXYW5nIEAgQWN0aXN5cyBmb3IgaGlzIGV4Y2VsbGVudCBoZWxwLi4uCisgKgorICogMS4wIC0+IDEuMSAtIE1hcnRpbiBEaWVobAorICoJbW9kaWZpZWQgZm9yIG5ldyBzaXIgaW5mcmFzdHJ1Y3R1cmUKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKKy8qIAorICogRGVmaW5lIHRoZSB0aW1pbmcgb2YgdGhlIHB1bHNlcyB3ZSBzZW5kIHRvIHRoZSBkb25nbGUgKHRvIHJlc2V0IGl0LCBhbmQKKyAqIHRvIHRvZ2dsZSBzcGVlZHMpLiBCYXNpY2FsbHksIHRoZSBsaW1pdCBoZXJlIGlzIHRoZSBwcm9wYWdhdGlvbiBzcGVlZCBvZgorICogdGhlIHNpZ25hbHMgdGhyb3VnaCB0aGUgc2VyaWFsIHBvcnQsIHRoZSBkb25nbGUgYmVpbmcgbXVjaCBmYXN0ZXIuICBBbnkKKyAqIHNlcmlhbCBwb3J0IHN1cHBvcnQgMTE1IGtiL3MsIHNvIHdlIGFyZSBzdXJlIHRoYXQgcHVsc2VzIDguNSB1cyB3aWRlIGNhbgorICogZ28gdGhyb3VnaCBjbGVhbmx5IC4gSWYgeW91IGFyZSBvbiB0aGUgd2lsZCBzaWRlLCB5b3UgY2FuIHRyeSB0byBsb3dlcgorICogdGhpcyB2YWx1ZSAoQWN0aXN5cyByZWNvbW1lbmRlZCBtZSAyIHVzLCBhbmQgMCB1cyB3b3JrIGZvciBtZSBvbiBhIFAyMzMhKQorICovCisjZGVmaW5lIE1JTl9ERUxBWSAxMAkvKiAxMCB1cyB0byBiZSBvbiB0aGUgY29uc2VydmF0aXZlIHNpZGUgKi8KKworc3RhdGljIGludCBhY3Rpc3lzX29wZW4oc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IGFjdGlzeXNfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IGFjdGlzeXNfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICosIHVuc2lnbmVkKTsKK3N0YXRpYyBpbnQgYWN0aXN5c19yZXNldChzdHJ1Y3Qgc2lyX2RldiAqKTsKKworLyogVGhlc2UgYXJlIHRoZSBiYXVkcmF0ZXMgc3VwcG9ydGVkLCBpbiB0aGUgb3JkZXIgYXZhaWxhYmxlICovCisvKiBOb3RlIDogdGhlIDIyMEwgZG9lc24ndCBzdXBwb3J0IDM4NDAwLCBidXQgd2Ugd2lsbCBmaXggdGhhdCBiZWxvdyAqLworc3RhdGljIHVuc2lnbmVkIGJhdWRfcmF0ZXNbXSA9IHsgOTYwMCwgMTkyMDAsIDU3NjAwLCAxMTUyMDAsIDM4NDAwIH07CisKKyNkZWZpbmUgTUFYX1NQRUVEUyAoc2l6ZW9mKGJhdWRfcmF0ZXMpL3NpemVvZihiYXVkX3JhdGVzWzBdKSkKKworc3RhdGljIHN0cnVjdCBkb25nbGVfZHJpdmVyIGFjdDIyMGwgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9ICJBY3Rpc3lzIEFDVC0yMjBMIiwKKwkudHlwZQkJPSBJUkRBX0FDVElTWVNfRE9OR0xFLAorCS5vcGVuCQk9IGFjdGlzeXNfb3BlbiwKKwkuY2xvc2UJCT0gYWN0aXN5c19jbG9zZSwKKwkucmVzZXQJCT0gYWN0aXN5c19yZXNldCwKKwkuc2V0X3NwZWVkCT0gYWN0aXN5c19jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgYWN0MjIwbF9wbHVzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiQWN0aXN5cyBBQ1QtMjIwTCsiLAorCS50eXBlCQk9IElSREFfQUNUSVNZU19QTFVTX0RPTkdMRSwKKwkub3BlbgkJPSBhY3Rpc3lzX29wZW4sCisJLmNsb3NlCQk9IGFjdGlzeXNfY2xvc2UsCisJLnJlc2V0CQk9IGFjdGlzeXNfcmVzZXQsCisJLnNldF9zcGVlZAk9IGFjdGlzeXNfY2hhbmdlX3NwZWVkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWN0aXN5c19zaXJfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiBGaXJzdCwgcmVnaXN0ZXIgYW4gQWN0aXN5cyAyMjBMIGRvbmdsZSAqLworCXJldCA9IGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMjBsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE5vdywgcmVnaXN0ZXIgYW4gQWN0aXN5cyAyMjBMKyBkb25nbGUgKi8KKwlyZXQgPSBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmYWN0MjIwbF9wbHVzKTsKKwlpZiAocmV0IDwgMCkgeworCQlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMjBsKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3Rpc3lzX3Npcl9jbGVhbnVwKHZvaWQpCit7CisJLyogV2UgaGF2ZSB0byByZW1vdmUgYm90aCBkb25nbGVzICovCisJaXJkYV91bnJlZ2lzdGVyX2RvbmdsZSgmYWN0MjIwbF9wbHVzKTsKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMjBsKTsKK30KKworc3RhdGljIGludCBhY3Rpc3lzX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2V0IHRoZSBzcGVlZHMgd2UgY2FuIGFjY2VwdCAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisKKwkvKiBSZW1vdmUgc3VwcG9ydCBmb3IgMzg0MDAgaWYgdGhpcyBpcyBub3QgYSAyMjBMKyBkb25nbGUgKi8KKwlpZiAoZGV2LT5kb25nbGVfZHJ2LT50eXBlID09IElSREFfQUNUSVNZU19ET05HTEUpCisJCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gfklSXzM4NDAwOworCisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDdmOyAvKiBOZWVkcyAwLjAxIG1zICovCisJaXJkYV9xb3NfYml0c190b192YWx1ZShxb3MpOworCisJLyogaXJkYSB0aHJlYWQgd2FpdHMgNTAgbXNlYyBmb3IgcG93ZXIgc2V0dGxpbmcgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjdGlzeXNfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwkvKiBQb3dlciBvZmYgdGhlIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFjdGlzeXNfY2hhbmdlX3NwZWVkICh0YXNrKQorICoKKyAqICAgIENoYW5nZSBzcGVlZCBvZiB0aGUgQUNUaVNZUyBJUi0yMjBMIGFuZCBJUi0yMjBMKyB0eXBlIElyREEgZG9uZ2xlcy4KKyAqICAgIFRvIGN5Y2xlIHRocm91Z2ggdGhlIGF2YWlsYWJsZSBiYXVkIHJhdGVzLCBwdWxzZSBSVFMgbG93IGZvciBhIGZldyB1cy4KKyAqCisgKglGaXJzdCwgd2UgcmVzZXQgdGhlIGRvbmdsZSB0byBhbHdheXMgc3RhcnQgZnJvbSBhIGtub3duIHN0YXRlLgorICoJVGhlbiwgd2UgY3ljbGUgdGhyb3VnaCB0aGUgc3BlZWRzIGJ5IHB1bHNpbmcgUlRTIGxvdyBhbmQgdGhlbiB1cC4KKyAqCVRoZSBkb25nbGUgYWxsb3cgdXMgdG8gcHVsc2UgcXVpdGUgZmFzdCwgc2Ugd2UgY2FuIHNldCBzcGVlZCBpbiBvbmUgZ28sCisgKiB3aGljaCBpcyBtdXN0IGZhc3RlciAoIDwgMTAwIHVzKSBhbmQgbGVzcyBjb21wbGV4IHRoYW4gd2hhdCBpcyBmb3VuZAorICogaW4gc29tZSBvdGhlciBkb25nbGUgZHJpdmVycy4uLgorICoJTm90ZSB0aGF0IGV2ZW4gaWYgdGhlIG5ldyBzcGVlZCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBzcGVlZCwKKyAqIHdlIHJlYXNzZXJ0IHRoZSBzcGVlZC4gVGhpcyBtYWtlIHN1cmUgdGhhdCB0aGluZ3MgYXJlIGFsbCByaWdodCwKKyAqIGFuZCBpdCdzIGZhc3QgYW55d2F5Li4uCisgKglCeSB0aGUgd2F5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgd29yayBmb3IgYm90aCB0eXBlIG9mIGRvbmdsZXMsCisgKiBiZWNhdXNlIHRoZSBhZGRpdGlvbmFsIHNwZWVkIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLi4uCisgKi8KK3N0YXRpYyBpbnQgYWN0aXN5c19jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJaW50IHJldCA9IDA7CisJaW50IGkgPSAwOworCisgICAgICAgIElSREFfREVCVUcoNCwgIiVzKCksIHNwZWVkPSVkICh3YXMgJWQpXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgIAlzcGVlZCwgZGV2LT5zcGVlZCk7CisKKwkvKiBkb25nbGUgd2FzIGFscmVhZHkgcmVzZXR0ZWQgZnJvbSBpcmRhX3JlcXVlc3Qgc3RhdGUgbWFjaGluZSwKKwkgKiB3ZSBhcmUgaW4ga25vd24gc3RhdGUgKGRvbmdsZSBkZWZhdWx0KQorCSAqLworCisJLyogCisJICogTm93LCB3ZSBjYW4gc2V0IHRoZSBzcGVlZCByZXF1ZXN0ZWQuIFNlbmQgUlRTIHB1bHNlcyB1bnRpbCB3ZQorICAgICAgICAgKiByZWFjaCB0aGUgdGFyZ2V0IHNwZWVkIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1BFRURTOyBpKyspIHsKKwkJaWYgKHNwZWVkID09IGJhdWRfcmF0ZXNbaV0pIHsKKwkJCWRldi0+c3BlZWQgPSBzcGVlZDsKKwkJCWJyZWFrOworCQl9CisJCS8qIFNldCBSVFMgbG93IGZvciAxMCB1cyAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBGQUxTRSk7CisJCXVkZWxheShNSU5fREVMQVkpOworCisJCS8qIFNldCBSVFMgaGlnaCBmb3IgMTAgdXMgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJCXVkZWxheShNSU5fREVMQVkpOworCX0KKworCS8qIENoZWNrIGlmIGxpZmUgaXMgc3dlZXQuLi4gKi8KKwlpZiAoaSA+PSBNQVhfU1BFRURTKSB7CisJCWFjdGlzeXNfcmVzZXQoZGV2KTsKKwkJcmV0ID0gLUVJTlZBTDsgIC8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwl9CisKKwkvKiBCYXN0YSBsYXZvcm8sIG9uIHNlIGNhc3NlIGQnaWNpLi4uICovCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFjdGlzeXNfcmVzZXQgKHRhc2spCisgKgorICogICAgICBSZXNldCB0aGUgQWN0aXN5cyB0eXBlIGRvbmdsZS4gV2FybmluZywgdGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUKKyAqICAgICAgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhCisgKgorICogV2UgbmVlZCB0byBkbyB0d28gdGhpbmdzIGluIHRoaXMgZnVuY3Rpb24gOgorICoJbyBmaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZG9uZ2xlIGlzIGluIGEgc3RhdGUgd2hlcmUgaXQgY2FuIG9wZXJhdGUKKyAqCW8gc2Vjb25kIHB1dCB0aGUgZG9uZ2xlIGluIGEga25vdyBzdGF0ZQorICoKKyAqCVRoZSBkb25nbGUgaXMgcG93ZXJlZCBvZiB0aGUgUlRTIGFuZCBEVFIgbGluZXMuIEluIHRoZSBkb25nbGUsIHRoZXJlCisgKiBpcyBhIGJpZyBjYXBhY2l0b3IgdG8gYWNjb21tb2RhdGUgdGhlIGN1cnJlbnQgc3Bpa2VzLiBUaGlzIGNhcGFjaXRvcgorICogdGFrZXMgYSBsZWFzdCA1MCBtcyB0byBiZSBjaGFyZ2VkLiBJbiB0aGVvcnksIHRoZSBCaW9zIHNldCB0aG9zZSBsaW5lcworICogdXAsIHNvIGJ5IHRoZSB0aW1lIHdlIGFycml2ZSBoZXJlIHdlIHNob3VsZCBiZSBzZXQuIEl0IGRvZXNuJ3QgaHVydAorICogdG8gYmUgb24gdGhlIGNvbnNlcnZhdGl2ZSBzaWRlLCBzbyB3ZSB3aWxsIHdhaXQuLi4KKyAqIDxNYXJ0aW4gOiBtb3ZlIGFib3ZlIGNvbW1lbnQgdG8gaXJkYV9jb25maWdfZnNtPgorICoJVGhlbiwgd2Ugc2V0IHRoZSBzcGVlZCB0byA5NjAwIGIvcyB0byBnZXQgaW4gYSBrbm93biBzdGF0ZSAoc2VlIGluCisgKiBjaGFuZ2Vfc3BlZWQgZm9yIGRldGFpbHMpLiBJdCBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgSXJEQSBzdGFjaworICogaGFzIHRyaWVkIHRvIHNldCB0aGUgc3BlZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgb3VyIGZpcnN0IHJldHVybiwKKyAqIHNvIGJlZm9yZSB3ZSBjYW4gYmUgc3VyZSB0aGUgZG9uZ2xlIGlzIHVwIGFuZCBydW5uaW5nLgorICovCisKK3N0YXRpYyBpbnQgYWN0aXN5c19yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCS8qIFJlc2V0IHRoZSBkb25nbGUgOiBzZXQgRFRSIGxvdyBmb3IgMTAgdXMgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgVFJVRSk7CisJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJCisJZGV2LT5zcGVlZCA9IDk2MDA7CS8qIFRoYXQncyB0aGUgZGVmYXVsdCAqLworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4gLSBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgZG9uZ2xlIGRyaXZlciIpOwkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtMiIpOyAvKiBJUkRBX0FDVElTWVNfRE9OR0xFICovCitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTMiKTsgLyogSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFICovCisKK21vZHVsZV9pbml0KGFjdGlzeXNfc2lyX2luaXQpOworbW9kdWxlX2V4aXQoYWN0aXN5c19zaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2FjdGlzeXMuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYWN0aXN5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTMxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2FjdGlzeXMuYwpAQCAtMCwwICsxLDI4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBhY3Rpc3lzLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBBQ1RpU1lTIElSLTIyMEwgYW5kIElSLTIyMEwrIAorICogICAgICAgICAgICAgICAgZG9uZ2xlcworICogU3RhdHVzOiAgICAgICAgQmV0YS4KKyAqIEF1dGhvcnM6ICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4gKGluaXRpYWxseSkKKyAqCQkgIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4gKG5ldyB2ZXJzaW9uKQorICogQ3JlYXRlZCBhdDogICAgV2VkIE9jdCAyMSAyMDowMjozNSAxOTk4CisgKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjEwOjQzIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBKZWFuIFRvdXJyaWxoZXMKKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ2hhbmdlbG9nCisgKgorICogMC44IC0+IDAuOTk5OSAtIEplYW4KKyAqCW8gTmV3IGluaXRpYWxpc2F0aW9uIHByb2NlZHVyZSA6IG11Y2ggc2FmZXIgYW5kIGNvcnJlY3QKKyAqCW8gTmV3IHByb2NlZHVyZSB0aGUgY2hhbmdlIHNwZWVkIDogbXVjaCBmYXN0ZXIgYW5kIHNpbXBsZXIKKyAqCW8gT3RoZXIgY2xlYW51cHMgJiBjb21tZW50cworICoJVGhhbmtzIHRvIExpY2hlbiBXYW5nIEAgQWN0aXN5cyBmb3IgaGlzIGV4Y2VsbGVudCBoZWxwLi4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKy8qIAorICogRGVmaW5lIHRoZSB0aW1pbmcgb2YgdGhlIHB1bHNlcyB3ZSBzZW5kIHRvIHRoZSBkb25nbGUgKHRvIHJlc2V0IGl0LCBhbmQKKyAqIHRvIHRvZ2dsZSBzcGVlZHMpLiBCYXNpY2FsbHksIHRoZSBsaW1pdCBoZXJlIGlzIHRoZSBwcm9wYWdhdGlvbiBzcGVlZCBvZgorICogdGhlIHNpZ25hbHMgdGhyb3VnaCB0aGUgc2VyaWFsIHBvcnQsIHRoZSBkb25nbGUgYmVpbmcgbXVjaCBmYXN0ZXIuICBBbnkKKyAqIHNlcmlhbCBwb3J0IHN1cHBvcnQgMTE1IGtiL3MsIHNvIHdlIGFyZSBzdXJlIHRoYXQgcHVsc2VzIDguNSB1cyB3aWRlIGNhbgorICogZ28gdGhyb3VnaCBjbGVhbmx5IC4gSWYgeW91IGFyZSBvbiB0aGUgd2lsZCBzaWRlLCB5b3UgY2FuIHRyeSB0byBsb3dlcgorICogdGhpcyB2YWx1ZSAoQWN0aXN5cyByZWNvbW1lbmRlZCBtZSAyIHVzLCBhbmQgMCB1cyB3b3JrIGZvciBtZSBvbiBhIFAyMzMhKQorICovCisjZGVmaW5lIE1JTl9ERUxBWSAxMAkvKiAxMCB1cyB0byBiZSBvbiB0aGUgY29uc2VydmF0aXZlIHNpZGUgKi8KKworc3RhdGljIGludCAgYWN0aXN5c19jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgaW50ICBhY3Rpc3lzX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworc3RhdGljIHZvaWQgYWN0aXN5c19vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBhY3Rpc3lzX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKKworLyogVGhlc2UgYXJlIHRoZSBiYXVkcmF0ZXMgc3VwcG9ydGVkLCBpbiB0aGUgb3JkZXIgYXZhaWxhYmxlICovCisvKiBOb3RlIDogdGhlIDIyMEwgZG9lc24ndCBzdXBwb3J0IDM4NDAwLCBidXQgd2Ugd2lsbCBmaXggdGhhdCBiZWxvdyAqLworc3RhdGljIF9fdTMyIGJhdWRfcmF0ZXNbXSA9IHsgOTYwMCwgMTkyMDAsIDU3NjAwLCAxMTUyMDAsIDM4NDAwIH07CisjZGVmaW5lIE1BWF9TUEVFRFMgNQorCitzdGF0aWMgc3RydWN0IGRvbmdsZV9yZWcgZG9uZ2xlID0geworCS50eXBlID0gSVJEQV9BQ1RJU1lTX0RPTkdMRSwKKwkub3BlbiA9IGFjdGlzeXNfb3BlbiwKKwkuY2xvc2UgPSBhY3Rpc3lzX2Nsb3NlLAorCS5yZXNldCA9IGFjdGlzeXNfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGFjdGlzeXNfY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZV9wbHVzID0geworCS50eXBlID0gSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFLAorCS5vcGVuID0gYWN0aXN5c19vcGVuLAorCS5jbG9zZSA9IGFjdGlzeXNfY2xvc2UsCisJLnJlc2V0ID0gYWN0aXN5c19yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gYWN0aXN5c19jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCisvKgorICogRnVuY3Rpb24gYWN0aXN5c19jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICoJVGhlcmUgaXMgdHdvIG1vZGVsIG9mIEFjdGlzeXMgZG9uZ2xlIHdlIGFyZSBkZWFsaW5nIHdpdGgsCisgKiB0aGUgMjIwTCBhbmQgMjIwTCsuIEF0IHRoaXMgcG9pbnQsIG9ubHkgaXJhdHRhY2gga25vd3Mgd2l0aAorICoga2luZCB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIChpdCB3YXMgYW4gYXJndW1lbnQgb24gaXJhdHRhY2gKKyAqIGNvbW1hbmQgbGluZSkuCisgKglTbywgd2UgcmVnaXN0ZXIgYSBkb25nbGUgb2YgZWFjaCBzb3J0IGFuZCBsZXQgaXJhdHRhY2gKKyAqIHBpY2sgdGhlIHJpZ2h0IG9uZS4uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhY3Rpc3lzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogRmlyc3QsIHJlZ2lzdGVyIGFuIEFjdGlzeXMgMjIwTCBkb25nbGUgKi8KKwlyZXQgPSBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJLyogTm93LCByZWdpc3RlciBhbiBBY3Rpc3lzIDIyMEwrIGRvbmdsZSAqLworCXJldCA9IGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlX3BsdXMpOworCWlmIChyZXQgPCAwKSB7CisJCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworCQlyZXR1cm4gcmV0OworCX0JCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3Rpc3lzX2NsZWFudXAodm9pZCkKK3sKKwkvKiBXZSBoYXZlIHRvIHJlbW92ZSBib3RoIGRvbmdsZXMgKi8KKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlX3BsdXMpOworfQorCitzdGF0aWMgdm9pZCBhY3Rpc3lzX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCS8qIFBvd2VyIG9uIHRoZSBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2V0IHRoZSBzcGVlZHMgd2UgY2FuIGFjY2VwdCAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisKKwkvKiBSZW1vdmUgc3VwcG9ydCBmb3IgMzg0MDAgaWYgdGhpcyBpcyBub3QgYSAyMjBMKyBkb25nbGUgKi8KKwlpZiAoc2VsZi0+aXNzdWUtPnR5cGUgPT0gSVJEQV9BQ1RJU1lTX0RPTkdMRSkKKwkJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSB+SVJfMzg0MDA7CisJCisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDdmOyAvKiBOZWVkcyAwLjAxIG1zICovCit9CisKK3N0YXRpYyB2b2lkIGFjdGlzeXNfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpCit7CisJLyogUG93ZXIgb2ZmIHRoZSBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhY3Rpc3lzX2NoYW5nZV9zcGVlZCAodGFzaykKKyAqCisgKiAgICBDaGFuZ2Ugc3BlZWQgb2YgdGhlIEFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgdHlwZSBJckRBIGRvbmdsZXMuCisgKiAgICBUbyBjeWNsZSB0aHJvdWdoIHRoZSBhdmFpbGFibGUgYmF1ZCByYXRlcywgcHVsc2UgUlRTIGxvdyBmb3IgYSBmZXcgdXMuCisgKgorICoJRmlyc3QsIHdlIHJlc2V0IHRoZSBkb25nbGUgdG8gYWx3YXlzIHN0YXJ0IGZyb20gYSBrbm93biBzdGF0ZS4KKyAqCVRoZW4sIHdlIGN5Y2xlIHRocm91Z2ggdGhlIHNwZWVkcyBieSBwdWxzaW5nIFJUUyBsb3cgYW5kIHRoZW4gdXAuCisgKglUaGUgZG9uZ2xlIGFsbG93IHVzIHRvIHB1bHNlIHF1aXRlIGZhc3QsIHNlIHdlIGNhbiBzZXQgc3BlZWQgaW4gb25lIGdvLAorICogd2hpY2ggaXMgbXVzdCBmYXN0ZXIgKCA8IDEwMCB1cykgYW5kIGxlc3MgY29tcGxleCB0aGFuIHdoYXQgaXMgZm91bmQKKyAqIGluIHNvbWUgb3RoZXIgZG9uZ2xlIGRyaXZlcnMuLi4KKyAqCU5vdGUgdGhhdCBldmVuIGlmIHRoZSBuZXcgc3BlZWQgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3BlZWQsCisgKiB3ZSByZWFzc2VydCB0aGUgc3BlZWQuIFRoaXMgbWFrZSBzdXJlIHRoYXQgdGhpbmdzIGFyZSBhbGwgcmlnaHQsCisgKiBhbmQgaXQncyBmYXN0IGFueXdheS4uLgorICoJQnkgdGhlIHdheSwgdGhpcyBmdW5jdGlvbiB3aWxsIHdvcmsgZm9yIGJvdGggdHlwZSBvZiBkb25nbGVzLAorICogYmVjYXVzZSB0aGUgYWRkaXRpb25hbCBzcGVlZCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4uLgorICovCitzdGF0aWMgaW50IGFjdGlzeXNfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOwkvKiBUYXJnZXQgc3BlZWQgKi8KKwlpbnQgcmV0ID0gMDsKKwlpbnQgaSA9IDA7CisKKyAgICAgICAgSVJEQV9ERUJVRyg0LCAiJXMoKSwgc3BlZWQ9JWQgKHdhcyAlZClcbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQsIAorCQkgICBzZWxmLT5zcGVlZCk7CisKKwkvKiBHbyB0byBhIGtub3duIHN0YXRlIGJ5IHJlc2V0aW5nIHRoZSBkb25nbGUgKi8KKworCS8qIFJlc2V0IHRoZSBkb25nbGUgOiBzZXQgRFRSIGxvdyBmb3IgMTAgdXMgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsKKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKHdlIGFyZSBub3cgYXQgOTYwMCBiL3MpICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKyAKKwkvKiAKKwkgKiBOb3csIHdlIGNhbiBzZXQgdGhlIHNwZWVkIHJlcXVlc3RlZC4gU2VuZCBSVFMgcHVsc2VzIHVudGlsIHdlCisgICAgICAgICAqIHJlYWNoIHRoZSB0YXJnZXQgc3BlZWQgCisJICovCisJZm9yIChpPTA7IGk8TUFYX1NQRUVEUzsgaSsrKSB7CisJCWlmIChzcGVlZCA9PSBiYXVkX3JhdGVzW2ldKSB7CisJCQlzZWxmLT5zcGVlZCA9IGJhdWRfcmF0ZXNbaV07CisJCQlicmVhazsKKwkJfQorCQkvKiBNYWtlIHN1cmUgcHJldmlvdXMgcHVsc2UgaXMgZmluaXNoZWQgKi8KKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkJLyogU2V0IFJUUyBsb3cgZm9yIDEwIHVzICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOworCQl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCQkvKiBTZXQgUlRTIGhpZ2ggZm9yIDEwIHVzICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisJfQorCisJLyogQ2hlY2sgaWYgbGlmZSBpcyBzd2VldC4uLiAqLworCWlmIChpID49IE1BWF9TUEVFRFMpCisJCXJldCA9IC0xOyAgLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworCisJLyogQmFzdGEgbGF2b3JvLCBvbiBzZSBjYXNzZSBkJ2ljaS4uLiAqLworCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhY3Rpc3lzX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgICAgUmVzZXQgdGhlIEFjdGlzeXMgdHlwZSBkb25nbGUuIFdhcm5pbmcsIHRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlCisgKiAgICAgIGNhbGxlZCB3aXRoIGEgcHJvY2VzcyBjb250ZXh0IQorICoKKyAqIFdlIG5lZWQgdG8gZG8gdHdvIHRoaW5ncyBpbiB0aGlzIGZ1bmN0aW9uIDoKKyAqCW8gZmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhlIGRvbmdsZSBpcyBpbiBhIHN0YXRlIHdoZXJlIGl0IGNhbiBvcGVyYXRlCisgKglvIHNlY29uZCBwdXQgdGhlIGRvbmdsZSBpbiBhIGtub3cgc3RhdGUKKyAqCisgKglUaGUgZG9uZ2xlIGlzIHBvd2VyZWQgb2YgdGhlIFJUUyBhbmQgRFRSIGxpbmVzLiBJbiB0aGUgZG9uZ2xlLCB0aGVyZQorICogaXMgYSBiaWcgY2FwYWNpdG9yIHRvIGFjY29tbW9kYXRlIHRoZSBjdXJyZW50IHNwaWtlcy4gVGhpcyBjYXBhY2l0b3IKKyAqIHRha2VzIGEgbGVhc3QgNTAgbXMgdG8gYmUgY2hhcmdlZC4gSW4gdGhlb3J5LCB0aGUgQmlvcyBzZXQgdGhvc2UgbGluZXMKKyAqIHVwLCBzbyBieSB0aGUgdGltZSB3ZSBhcnJpdmUgaGVyZSB3ZSBzaG91bGQgYmUgc2V0LiBJdCBkb2Vzbid0IGh1cnQKKyAqIHRvIGJlIG9uIHRoZSBjb25zZXJ2YXRpdmUgc2lkZSwgc28gd2Ugd2lsbCB3YWl0Li4uCisgKglUaGVuLCB3ZSBzZXQgdGhlIHNwZWVkIHRvIDk2MDAgYi9zIHRvIGdldCBpbiBhIGtub3duIHN0YXRlIChzZWUgaW4KKyAqIGNoYW5nZV9zcGVlZCBmb3IgZGV0YWlscykuIEl0IGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBJckRBIHN0YWNrCisgKiBoYXMgdHJpZWQgdG8gc2V0IHRoZSBzcGVlZCBpbW1lZGlhdGVseSBhZnRlciBvdXIgZmlyc3QgcmV0dXJuLAorICogc28gYmVmb3JlIHdlIGNhbiBiZSBzdXJlIHRoZSBkb25nbGUgaXMgdXAgYW5kIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBpbnQgYWN0aXN5c19yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQodGFzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYtPnJlc2V0X3Rhc2sgPSB0YXNrOworCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisJCS8qIFNldCBib3RoIERUUiAmIFJUUyB0byBwb3dlciB1cCB0aGUgZG9uZ2xlICovCisJCS8qIEluIHRoZW9yeSByZWR1bmRhbnQgd2l0aCBwb3dlciB1cCBpbiBhY3Rpc3lzX29wZW4oKSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQkKKwkJLyogU2xlZXAgNTAgbXMgdG8gbWFrZSBzdXJlIGNhcGFjaXRvciBpcyBjaGFyZ2VkICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoNTApOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CQkJCisJCS8qIFJlc2V0IHRoZSBkb25nbGUgOiBzZXQgRFRSIGxvdyBmb3IgMTAgdXMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgVFJVRSk7CisJCXVkZWxheShNSU5fREVMQVkpOworCisJCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJc2VsZi0+c3BlZWQgPSA5NjAwOwkvKiBUaGF0J3MgdGhlIGRlZmF1bHQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4gLSBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgZG9uZ2xlIGRyaXZlciIpOwkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtMiIpOyAvKiBJUkRBX0FDVElTWVNfRE9OR0xFICovCitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTMiKTsgLyogSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFICovCisKKwkJCisvKgorICogRnVuY3Rpb24gaW5pdF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBBY3Rpc3lzIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2luaXQoYWN0aXN5c19pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgQWN0aXN5cyBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KGFjdGlzeXNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMgYi9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmMzQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYwpAQCAtMCwwICsxLDIyNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgYWxpLWlyY2MuaAorICogVmVyc2lvbjogICAgICAgMC41CisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBBTEkgTTE1MzVEIGFuZCBNMTU0M0MgRklSIENvbnRyb2xsZXIKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIEJlbmphbWluIEtvbmcgPGJlbmphbWluX2tvbmdAYWxpLmNvbS50dz4KKyAqIENyZWF0ZWQgYXQ6ICAgIDIwMDAvMTAvMTYgMDM6NDZQTQorICogTW9kaWZpZWQgYXQ6ICAgMjAwMS8xLzMgMDI6NTVQTQorICogTW9kaWZpZWQgYnk6ICAgQmVuamFtaW4gS29uZyA8YmVuamFtaW5fa29uZ0BhbGkuY29tLnR3PgorICogTW9kaWZpZWQgYXQ6ICAgMjAwMy8xMS82IGFuZCBzdXBwb3J0IGZvciBBTGkgc291dGgtYnJpZGdlIGNoaXBzZXRzIE0xNTYzCisgKiBNb2RpZmllZCBieTogICBDbGVhciBaaGFuZyA8Y2xlYXJfemhhbmdAYWxpLmNvbS50dz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMjAwMCBCZW5qYW1pbiBLb25nIDxiZW5qYW1pbl9rb25nQGFsaS5jb20udHc+CisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAiYWxpLWlyY2MuaCIKKworI2RlZmluZSBDSElQX0lPX0VYVEVOVCA4CisjZGVmaW5lIEJST0tFTl9ET05HTEVfSUQKKworc3RhdGljIGNoYXIgKmRyaXZlcl9uYW1lID0gImFsaS1pcmNjIjsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMHgwNzsgIC8qIDEgbXMgb3IgbW9yZSAqLworCisvKiBVc2UgQklPUyBzZXR0aW9ucyBieSBkZWZhdWx0LCBidXQgdXNlciBtYXkgc3VwcGx5IG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlvW10gID0geyB+MCwgfjAsIH4wLCB+MCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBpcnFbXSA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBkbWFbXSA9IHsgMCwgMCwgMCwgMCB9OworCitzdGF0aWMgaW50ICBhbGlfaXJjY19wcm9iZV81MyhhbGlfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgaW50ICBhbGlfaXJjY19pbml0XzQzKGFsaV9jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX2luaXRfNTMoYWxpX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworCisvKiBUaGVzZSBhcmUgdGhlIGN1cnJlbnRseSBrbm93biBBTGkgc291cnRoLWJyaWRnZSBjaGlwc2V0cywgdGhlIG9ubHkgb25lIGRpZmZlcmVuY2UKKyAqIGlzIHRoYXQgTTE1NDNDIGRvZXNuJ3Qgc3VwcG9ydCBIUCBIRFNMLTM2MDAKKyAqLworc3RhdGljIGFsaV9jaGlwX3QgY2hpcHNbXSA9Cit7CisJeyAiTTE1NDMiLCB7IDB4M2YwLCAweDM3MCB9LCAweDUxLCAweDIzLCAweDIwLCAweDQzLCBhbGlfaXJjY19wcm9iZV81MywgYWxpX2lyY2NfaW5pdF80MyB9LAorCXsgIk0xNTM1IiwgeyAweDNmMCwgMHgzNzAgfSwgMHg1MSwgMHgyMywgMHgyMCwgMHg1MywgYWxpX2lyY2NfcHJvYmVfNTMsIGFsaV9pcmNjX2luaXRfNTMgfSwKKwl7ICJNMTU2MyIsIHsgMHgzZjAsIDB4MzcwIH0sIDB4NTEsIDB4MjMsIDB4MjAsIDB4NjMsIGFsaV9pcmNjX3Byb2JlXzUzLCBhbGlfaXJjY19pbml0XzUzIH0sCisJeyBOVUxMIH0KK307CisKKy8qIE1heCA0IGluc3RhbmNlcyBmb3Igbm93ICovCitzdGF0aWMgc3RydWN0IGFsaV9pcmNjX2NiICpkZXZfc2VsZltdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisKKy8qIERvbmdsZSBUeXBlcyAqLworc3RhdGljIGNoYXIgKmRvbmdsZV90eXBlc1tdID0geworCSJURkRTNjAwMCIsCisJIkhQIEhTREwtMzYwMCIsCisJIkhQIEhTREwtMTEwMCIsCQorCSJObyBkb25nbGUgY29ubmVjdGVkIiwKK307CisKKy8qIFNvbWUgcHJvdG90eXBlcyAqLworc3RhdGljIGludCAgYWxpX2lyY2Nfb3BlbihpbnQgaSwgY2hpcGlvX3QgKmluZm8pOworCitzdGF0aWMgaW50ICBhbGlfaXJjY19jbG9zZShzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOworCitzdGF0aWMgaW50ICBhbGlfaXJjY19zZXR1cChjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgaW50ICBhbGlfaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgYWxpX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgYWxpX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCAgYWxpX2lyY2NfcG1wcm9jKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgYWxpX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiwgX191MzIgYmF1ZCk7CitzdGF0aWMgdm9pZCBhbGlfaXJjY19zdXNwZW5kKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBhbGlfaXJjY193YWtldXAoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYWxpX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogU0lSIGZ1bmN0aW9uICovCitzdGF0aWMgaW50ICBhbGlfaXJjY19zaXJfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGFsaV9pcmNjX3Npcl9pbnRlcnJ1cHQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3Npcl9yZWNlaXZlKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBhbGlfaXJjY19zaXJfd3JpdGVfd2FrZXVwKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50ICBhbGlfaXJjY19zaXJfd3JpdGUoaW50IGlvYmFzZSwgaW50IGZpZm9fc2l6ZSwgX191OCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3Npcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGFsaV9pcmNjX2NiICpwcml2LCBfX3UzMiBzcGVlZCk7CisKKy8qIEZJUiBmdW5jdGlvbiAqLworc3RhdGljIGludCAgYWxpX2lyY2NfZmlyX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2Zpcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGFsaV9pcmNjX2NiICpwcml2LCBfX3UzMiBzcGVlZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgYWxpX2lyY2NfZmlyX2ludGVycnVwdChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgYWxpX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsgCitzdGF0aWMgaW50ICBhbGlfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgYWxpX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2RtYV94bWl0KHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CisKKy8qIE15IEZ1bmN0aW9uICovCitzdGF0aWMgaW50ICBhbGlfaXJjY19yZWFkX2RvbmdsZV9pZCAoaW50IGksIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoc3RydWN0IGFsaV9pcmNjX2NiICpwcml2LCBpbnQgc3BlZWQpOworCisvKiBBTGkgY2hpcCBmdW5jdGlvbiAqLworc3RhdGljIHZvaWQgU0lSMkZJUihpbnQgaW9iYXNlKTsKK3N0YXRpYyB2b2lkIEZJUjJTSVIoaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZCBTZXRDT01JbnRlcnJ1cHRzKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiAsIHVuc2lnbmVkIGNoYXIgZW5hYmxlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2luaXQgKCkKKyAqCisgKiAgICBJbml0aWFsaXplIGNoaXAuIEZpbmQgb3V0IHdoYXkga2luZHMgb2YgY2hpcHMgd2UgYXJlIGRlYWxpbmcgd2l0aAorICogICAgYW5kIHRoZWlyIGNvbmZpZ3VhdGlvbiByZWdpc3RlcnMgYWRkcmVzcworICovCitzdGF0aWMgaW50IF9faW5pdCBhbGlfaXJjY19pbml0KHZvaWQpCit7CisJYWxpX2NoaXBfdCAqY2hpcDsKKwljaGlwaW9fdCBpbmZvOworCWludCByZXQgPSAtRU5PREVWOworCWludCBjZmcsIGNmZ19iYXNlOworCWludCByZWcsIHJldmlzaW9uOworCWludCBpID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJLyogUHJvYmUgZm9yIGFsbCB0aGUgQUxpIGNoaXBzZXRzIHdlIGtub3cgYWJvdXQgKi8KKwlmb3IgKGNoaXA9IGNoaXBzOyBjaGlwLT5uYW1lOyBjaGlwKyssIGkrKykgCisJeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBQcm9iaW5nIGZvciAlcyAuLi5cbiIsIF9fRlVOQ1RJT05fXywgY2hpcC0+bmFtZSk7CisJCQkJCisJCS8qIFRyeSBhbGwgY29uZmlnIHJlZ2lzdGVycyBmb3IgdGhpcyBjaGlwICovCisJCWZvciAoY2ZnPTA7IGNmZzwyOyBjZmcrKykKKwkJeworCQkJY2ZnX2Jhc2UgPSBjaGlwLT5jZmdbY2ZnXTsKKwkJCWlmICghY2ZnX2Jhc2UpCisJCQkJY29udGludWU7CisJCQkJCisJCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihjaGlwaW9fdCkpOworCQkJaW5mby5jZmdfYmFzZSA9IGNmZ19iYXNlOworCQkJaW5mby5maXJfYmFzZSA9IGlvW2ldOworCQkJaW5mby5kbWEgPSBkbWFbaV07CisJCQlpbmZvLmlycSA9IGlycVtpXTsKKwkJCQorCQkJCisJCQkvKiBFbnRlciBDb25maWd1cmF0aW9uICovCisJCQlvdXRiKGNoaXAtPmVudHIxLCBjZmdfYmFzZSk7CisJCQlvdXRiKGNoaXAtPmVudHIyLCBjZmdfYmFzZSk7CisJCQkKKwkJCS8qIFNlbGVjdCBMb2dpY2FsIERldmljZSA1IFJlZ2lzdGVycyAoVUFSVDIpICovCisJCQlvdXRiKDB4MDcsIGNmZ19iYXNlKTsKKwkJCW91dGIoMHgwNSwgY2ZnX2Jhc2UrMSk7CisJCQkKKwkJCS8qIFJlYWQgQ2hpcCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLworCQkJb3V0YihjaGlwLT5jaWRfaW5kZXgsIGNmZ19iYXNlKTsJCisJCQlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CQorCQkJCQorCQkJaWYgKHJlZyA9PSBjaGlwLT5jaWRfdmFsdWUpCisJCQl7CisJCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgQ2hpcCBmb3VuZCBhdCAweCUwM3hcbiIsIF9fRlVOQ1RJT05fXywgY2ZnX2Jhc2UpOworCQkJCQkgICAKKwkJCQlvdXRiKDB4MUYsIGNmZ19iYXNlKTsKKwkJCQlyZXZpc2lvbiA9IGluYihjZmdfYmFzZSsxKTsKKwkJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBGb3VuZCAlcyBjaGlwLCByZXZpc2lvbj0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJCQkgICBjaGlwLT5uYW1lLCByZXZpc2lvbik7CQkJCQkKKwkJCQkKKwkJCQkvKiAKKwkJCQkgKiBJZiB0aGUgdXNlciBzdXBwbGllcyB0aGUgYmFzZSBhZGRyZXNzLCB0aGVuCisJCQkJICogd2UgaW5pdCB0aGUgY2hpcCwgaWYgbm90IHdlIHByb2JlIHRoZSB2YWx1ZXMKKwkJCQkgKiBzZXQgYnkgdGhlIEJJT1MKKwkJCQkgKi8JCQkJCisJCQkJaWYgKGlvW2ldIDwgMjAwMCkKKwkJCQl7CisJCQkJCWNoaXAtPmluaXQoY2hpcCwgJmluZm8pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQljaGlwLT5wcm9iZShjaGlwLCAmaW5mbyk7CQorCQkJCX0KKwkJCQkKKwkJCQlpZiAoYWxpX2lyY2Nfb3BlbihpLCAmaW5mbykgPT0gMCkKKwkJCQkJcmV0ID0gMDsKKwkJCQlpKys7CQkJCQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUlSREFfREVCVUcoMiwgIiVzKCksIE5vICVzIGNoaXAgYXQgMHglMDN4XG4iLCBfX0ZVTkNUSU9OX18sIGNoaXAtPm5hbWUsIGNmZ19iYXNlKTsKKwkJCX0KKwkJCS8qIEV4aXQgY29uZmlndXJhdGlvbiAqLworCQkJb3V0YigweGJiLCBjZmdfYmFzZSk7CisJCX0KKwl9CQkKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOwkJCQkJICAgCQkKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfY2xlYW51cCAoKQorICoKKyAqICAgIENsb3NlIGFsbCBjb25maWd1cmVkIGNoaXBzCisgKgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxpX2lyY2NfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOwkKKwkKKwlwbV91bnJlZ2lzdGVyX2FsbChhbGlfaXJjY19wbXByb2MpOworCisJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKGRldl9zZWxmW2ldKQorCQkJYWxpX2lyY2NfY2xvc2UoZGV2X3NlbGZbaV0pOworCX0KKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19vcGVuIChpbnQgaSwgY2hpcGlvX3QgKmluZikKKyAqCisgKiAgICBPcGVuIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19vcGVuKGludCBpLCBjaGlwaW9fdCAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZjsKKwlzdHJ1Y3QgcG1fZGV2ICpwbWRldjsKKwlpbnQgZG9uZ2xlX2lkOworCWludCBlcnI7CisJCQkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CQorCQorCS8qIFNldCBGSVIgRklGTyBhbmQgRE1BIFRocmVzaG9sZCAqLworCWlmICgoYWxpX2lyY2Nfc2V0dXAoaW5mbykpID09IC0xKQorCQlyZXR1cm4gLTE7CisJCQorCWRldiA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKCpzZWxmKSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzKCksIGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udHJvbCBibG9jayFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzZWxmID0gZGV2LT5wcml2OworCXNlbGYtPm5ldGRldiA9IGRldjsKKwlzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CisgICAKKwkvKiBOZWVkIHRvIHN0b3JlIHNlbGYgc29tZXdoZXJlICovCisJZGV2X3NlbGZbaV0gPSBzZWxmOworCXNlbGYtPmluZGV4ID0gaTsKKworCS8qIEluaXRpYWxpemUgSU8gKi8KKwlzZWxmLT5pby5jZmdfYmFzZSAgPSBpbmZvLT5jZmdfYmFzZTsJLyogSW4gYWxpX2lyY2NfcHJvYmVfNTMgYXNzaWduIAkJKi8KKwlzZWxmLT5pby5maXJfYmFzZSAgPSBpbmZvLT5maXJfYmFzZTsJLyogaW5mby0+c2lyX2Jhc2UgPSBpbmZvLT5maXJfYmFzZSAJKi8KKwlzZWxmLT5pby5zaXJfYmFzZSAgPSBpbmZvLT5zaXJfYmFzZTsgCS8qIEFMaSBTSVIgYW5kIEZJUiB1c2UgdGhlIHNhbWUgYWRkcmVzcyAqLworICAgICAgICBzZWxmLT5pby5pcnEgICAgICAgPSBpbmZvLT5pcnE7CisgICAgICAgIHNlbGYtPmlvLmZpcl9leHQgICA9IENISVBfSU9fRVhURU5UOworICAgICAgICBzZWxmLT5pby5kbWEgICAgICAgPSBpbmZvLT5kbWE7CisgICAgICAgIHNlbGYtPmlvLmZpZm9fc2l6ZSA9IDE2OwkJLyogU0lSOiAxNiwgRklSOiAzMiBCZW5qYW1pbiAyMDAwLzExLzEgKi8KKwkKKwkvKiBSZXNlcnZlIHRoZSBpb3BvcnRzIHRoYXQgd2UgbmVlZCAqLworCWlmICghcmVxdWVzdF9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQsIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGNhbid0IGdldCBpb2Jhc2Ugb2YgMHglMDN4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQlzZWxmLT5pby5maXJfYmFzZSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDE7CisJfQorCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zKTsKKwkKKwkvKiBUaGUgb25seSB2YWx1ZSB3ZSBtdXN0IG92ZXJyaWRlIGl0IHRoZSBiYXVkcmF0ZSAqLworCXNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8CisJCUlSXzExNTIwMHxJUl81NzYwMDB8SVJfMTE1MjAwMHwoSVJfNDAwMDAwMCA8PCA4KTsgLy8gYmVuamFtaW4gMjAwMC8xMS84IDA1OjI3UE0KKwkJCQorCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSBxb3NfbXR0X2JpdHM7CisJCQkKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3MpOworCQorCS8qIE1heCBETUEgYnVmZmVyIHNpemUgbmVlZGVkID0gKGRhdGFfc2l6ZSArIDYpICogKHdpbmRvd19zaXplKSArIDY7ICovCisJc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IDE0Mzg0OyAKKwlzZWxmLT50eF9idWZmLnRydWVzaXplID0gMTQzODQ7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgaWYgbmVlZGVkICovCisJc2VsZi0+cnhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnJ4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisJbWVtc2V0KHNlbGYtPnJ4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSk7CisJCisJc2VsZi0+dHhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnR4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisJbWVtc2V0KHNlbGYtPnR4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisKKwlzZWxmLT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJc2VsZi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKwkKKwkvKiBSZXNldCBUeCBxdWV1ZSBpbmZvICovCisJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCisJCisJLyogS2VlcCB0cmFjayBvZiBtb2R1bGUgdXNhZ2UgKi8KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBPdmVycmlkZSB0aGUgbmV0d29yayBmdW5jdGlvbnMgd2UgbmVlZCB0byB1c2UgKi8KKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGFsaV9pcmNjX3Npcl9oYXJkX3htaXQ7CisJZGV2LT5vcGVuICAgICAgICAgICAgPSBhbGlfaXJjY19uZXRfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICA9IGFsaV9pcmNjX25ldF9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsICAgICAgICA9IGFsaV9pcmNjX25ldF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cwkgICAgID0gYWxpX2lyY2NfbmV0X2dldF9zdGF0czsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnJfb3V0NDsKKwl9CisJSVJEQV9NRVNTQUdFKCJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKworCS8qIENoZWNrIGRvbmdsZSBpZCAqLworCWRvbmdsZV9pZCA9IGFsaV9pcmNjX3JlYWRfZG9uZ2xlX2lkKGksIGluZm8pOworCUlSREFfTUVTU0FHRSgiJXMoKSwgJXMsIEZvdW5kIGRvbmdsZTogJXNcbiIsIF9fRlVOQ1RJT05fXywgZHJpdmVyX25hbWUsIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsKKwkJCisJc2VsZi0+aW8uZG9uZ2xlX2lkID0gZG9uZ2xlX2lkOworCQorICAgICAgICBwbWRldiA9IHBtX3JlZ2lzdGVyKFBNX1NZU19ERVYsIFBNX1NZU19JUkRBLCBhbGlfaXJjY19wbXByb2MpOworICAgICAgICBpZiAocG1kZXYpCisgICAgICAgICAgICAgICAgcG1kZXYtPmRhdGEgPSBzZWxmOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCXJldHVybiAwOworCisgZXJyX291dDQ6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCSAgc2VsZi0+dHhfYnVmZi5oZWFkLCBzZWxmLT50eF9idWZmX2RtYSk7CisgZXJyX291dDM6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CisgZXJyX291dDI6CisJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQpOworIGVycl9vdXQxOgorCWRldl9zZWxmW2ldID0gTlVMTDsKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIENsb3NlIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIGludCBfX2V4aXQgYWxpX2lyY2NfY2xvc2Uoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisgICAgICAgIGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogUmVtb3ZlIG5ldGRldmljZSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwkvKiBSZWxlYXNlIHRoZSBQT1JUIHRoYXQgdGhpcyBkcml2ZXIgaXMgdXNpbmcgKi8KKwlJUkRBX0RFQlVHKDQsICIlcygpLCBSZWxlYXNpbmcgUmVnaW9uICUwM3hcbiIsIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uZmlyX2Jhc2UpOworCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKworCWlmIChzZWxmLT50eF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKwkKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkKQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CisKKwlkZXZfc2VsZltzZWxmLT5pbmRleF0gPSBOVUxMOworCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfaW5pdF80MyAoY2hpcCwgaW5mbykKKyAqCisgKiAgICBJbml0aWFsaXplIHRoZSBBTGkgTTE1NDMgY2hpcC4gCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfaW5pdF80MyhhbGlfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykgCit7CisJLyogQWxsIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gbGlrZSBJL08gYWRkcmVzcywgRE1BIGNoYW5uZWwsIElSUQorCSAqIGFyZSBzZXQgYnkgQklPUworCSAqLworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfaW5pdF81MyAoY2hpcCwgaW5mbykKKyAqCisgKiAgICBJbml0aWFsaXplIHRoZSBBTGkgTTE1MzUgY2hpcC4gCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfaW5pdF81MyhhbGlfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykgCit7CisJLyogQWxsIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gbGlrZSBJL08gYWRkcmVzcywgRE1BIGNoYW5uZWwsIElSUQorCSAqIGFyZSBzZXQgYnkgQklPUworCSAqLworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfcHJvYmVfNTMgKGNoaXAsIGluZm8pCisgKiAgICAJCisgKglQcm9iZXMgZm9yIHRoZSBBTGkgTTE1MzVEIG9yIE0xNTM1CisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfcHJvYmVfNTMoYWxpX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pCit7CisJaW50IGNmZ19iYXNlID0gaW5mby0+Y2ZnX2Jhc2U7CisJaW50IGhpLCBsb3csIHJlZzsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJLyogRW50ZXIgQ29uZmlndXJhdGlvbiAqLworCW91dGIoY2hpcC0+ZW50cjEsIGNmZ19iYXNlKTsKKwlvdXRiKGNoaXAtPmVudHIyLCBjZmdfYmFzZSk7CisJCisJLyogU2VsZWN0IExvZ2ljYWwgRGV2aWNlIDUgUmVnaXN0ZXJzIChVQVJUMikgKi8KKwlvdXRiKDB4MDcsIGNmZ19iYXNlKTsKKwlvdXRiKDB4MDUsIGNmZ19iYXNlKzEpOworCQorCS8qIFJlYWQgYWRkcmVzcyBjb250cm9sIHJlZ2lzdGVyICovCisJb3V0YigweDYwLCBjZmdfYmFzZSk7CisJaGkgPSBpbmIoY2ZnX2Jhc2UrMSk7CQorCW91dGIoMHg2MSwgY2ZnX2Jhc2UpOworCWxvdyA9IGluYihjZmdfYmFzZSsxKTsKKwlpbmZvLT5maXJfYmFzZSA9IChoaTw8OCkgKyBsb3c7CisJCisJaW5mby0+c2lyX2Jhc2UgPSBpbmZvLT5maXJfYmFzZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBwcm9iaW5nIGZpcl9iYXNlPTB4JTAzeFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5maXJfYmFzZSk7CisJCQorCS8qIFJlYWQgSVJRIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlvdXRiKDB4NzAsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJaW5mby0+aXJxID0gcmVnICYgMHgwZjsKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBwcm9iaW5nIGlycT0lZFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5pcnEpOworCQorCS8qIFJlYWQgRE1BIGNoYW5uZWwgKi8KKwlvdXRiKDB4NzQsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJaW5mby0+ZG1hID0gcmVnICYgMHgwNzsKKwkKKwlpZihpbmZvLT5kbWEgPT0gMHgwNCkKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBObyBETUEgY2hhbm5lbCBhc3NpZ25lZCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCWVsc2UKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgcHJvYmluZyBkbWE9JWRcbiIsIF9fRlVOQ1RJT05fXywgaW5mby0+ZG1hKTsKKwkKKwkvKiBSZWFkIEVuYWJsZWQgU3RhdHVzICovCisJb3V0YigweDMwLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCWluZm8tPmVuYWJsZWQgPSAocmVnICYgMHg4MCkgJiYgKHJlZyAmIDB4MDEpOworCUlSREFfREVCVUcoMiwgIiVzKCksIHByb2JpbmcgZW5hYmxlZD0lZFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5lbmFibGVkKTsKKwkKKwkvKiBSZWFkIFBvd2VyIFN0YXR1cyAqLworCW91dGIoMHgyMiwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKwlpbmZvLT5zdXNwZW5kZWQgPSAocmVnICYgMHgyMCk7CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcHJvYmluZyBzdXNwZW5kZWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgaW5mby0+c3VzcGVuZGVkKTsKKwkKKwkvKiBFeGl0IGNvbmZpZ3VyYXRpb24gKi8KKwlvdXRiKDB4YmIsIGNmZ19iYXNlKTsKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOwkKKwkKKwlyZXR1cm4gMDsJCit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19zZXR1cCAoaW5mbykKKyAqCisgKiAgICAJU2V0IEZJUiBGSUZPIGFuZCBETUEgVGhyZXNob2xkCisgKglSZXR1cm5zIG5vbi1uZWdhdGl2ZSBvbiBzdWNjZXNzLgorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19zZXR1cChjaGlwaW9fdCAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlpbnQgdmVyc2lvbjsKKwlpbnQgaW9iYXNlID0gaW5mby0+ZmlyX2Jhc2U7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCS8qIExvY2tpbmcgY29tbWVudHMgOgorCSAqIE1vc3Qgb3BlcmF0aW9ucyBoZXJlIG5lZWQgdG8gYmUgcHJvdGVjdGVkLiBXZSBhcmUgY2FsbGVkIGJlZm9yZQorCSAqIHRoZSBkZXZpY2UgaW5zdGFuY2UgaXMgY3JlYXRlZCBpbiBhbGlfaXJjY19vcGVuKCksIHRoZXJlZm9yZSAKKwkgKiBub2JvZHkgY2FuIGJvdGhlciB1cyAtIEplYW4gSUkgKi8KKworCS8qIFN3aXRjaCB0byBGSVIgc3BhY2UgKi8KKwlTSVIyRklSKGlvYmFzZSk7CisJCisJLyogTWFzdGVyIFJlc2V0ICovCisJb3V0YigweDQwLCBpb2Jhc2UrRklSX01DUik7IC8vIGJlbmphbWluIDIwMDAvMTEvMzAgMTE6NDVBTQorCQorCS8qIFJlYWQgRklSIElEIFZlcnNpb24gUmVnaXN0ZXIgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkszKTsKKwl2ZXJzaW9uID0gaW5iKGlvYmFzZStGSVJfSURfVlIpOworCQorCS8qIFNob3VsZCBiZSAweDAwIGluIHRoZSBNMTUzNS9NMTUzNUQgKi8KKwlpZih2ZXJzaW9uICE9IDB4MDApCisJeworCQlJUkRBX0VSUk9SKCIlcywgV3JvbmcgY2hpcCB2ZXJzaW9uICUwMnhcbiIsIGRyaXZlcl9uYW1lLCB2ZXJzaW9uKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwkvLyBJUkRBX01FU1NBR0UoIiVzLCBGb3VuZCBjaGlwIGF0IGJhc2U9MHglMDN4XG4iLCBkcml2ZXJfbmFtZSwgaW5mby0+Y2ZnX2Jhc2UpOworCQorCS8qIFNldCBGSVIgRklGTyBUaHJlc2hvbGQgUmVnaXN0ZXIgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwlvdXRiKFJYX0ZJRk9fVGhyZXNob2xkLCBpb2Jhc2UrRklSX0ZJRk9fVFIpOworCQorCS8qIFNldCBGSVIgRE1BIFRocmVzaG9sZCBSZWdpc3RlciAqLworCW91dGIoUlhfRE1BX1RocmVzaG9sZCwgaW9iYXNlK0ZJUl9ETUFfVFIpOworCQorCS8qIENSQyBlbmFibGUgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwlvdXRiKGluYihpb2Jhc2UrRklSX0lSREFfQ1IpIHwgSVJEQV9DUl9DUkMsIGlvYmFzZStGSVJfSVJEQV9DUik7CisJCisJLyogTkRJUyBkcml2ZXIgc2V0IFRYIExlbmd0aCBoZXJlIEJBTksyIEFsaWFzIDMsIEFsaWFzNCovCisJCisJLyogU3dpdGNoIHRvIEJhbmsgMCAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQorCXRtcCA9IGluYihpb2Jhc2UrRklSX0xDUl9CKTsKKwl0bXAgJj1+MHgyMDsgLy8gZGlzYWJsZSBTSVAKKwl0bXAgfD0gMHg4MDsgLy8gdGhlc2UgdHdvIHN0ZXBzIG1ha2UgUlggbW9kZQorCXRtcCAmPSAweGJmOwkKKwlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9MQ1JfQik7CisJCQorCS8qIERpc2FibGUgSW50ZXJydXB0ICovCisJb3V0YigweDAwLCBpb2Jhc2UrRklSX0lFUik7CisJCisJCisJLyogU3dpdGNoIHRvIFNJUiBzcGFjZSAqLworCUZJUjJTSVIoaW9iYXNlKTsKKwkKKwlJUkRBX01FU1NBR0UoIiVzLCBkcml2ZXIgbG9hZGVkIChCZW5qYW1pbiBLb25nKVxuIiwgZHJpdmVyX25hbWUpOworCQorCS8qIEVuYWJsZSByZWNlaXZlIGludGVycnVwdHMgKi8gCisJLy8gb3V0YihVQVJUX0lFUl9SREksIGlvYmFzZStVQVJUX0lFUik7IC8vYmVuamFtaW4gMjAwMC8xMS8yMyAwMToyNVBNCisJLy8gVHVybiBvbiB0aGUgaW50ZXJydXB0cyBpbiBhbGlfaXJjY19uZXRfb3BlbgorCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CQorCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfcmVhZF9kb25nbGVfaWQgKGludCBpbmRleCwgaW5mbykKKyAqCisgKiBUcnkgdG8gcmVhZCBkb25nbGUgaW5kZW50aWZpY2F0aW9uLiBUaGlzIHByb2NlZHVyZSBuZWVkcyB0byBiZSBleGVjdXRlZAorICogb25jZSBhZnRlciBwb3dlci1vbi9yZXNldC4gSXQgYWxzbyBuZWVkcyB0byBiZSB1c2VkIHdoZW5ldmVyIHlvdSBzdXNwZWN0CisgKiB0aGF0IHRoZSB1c2VyIG1heSBoYXZlIHBsdWdnZWQvdW5wbHVnZ2VkIHRoZSBJckRBIERvbmdsZS4KKyAqLworc3RhdGljIGludCBhbGlfaXJjY19yZWFkX2RvbmdsZV9pZCAoaW50IGksIGNoaXBpb190ICppbmZvKQoreworCWludCBkb25nbGVfaWQsIHJlZzsKKwlpbnQgY2ZnX2Jhc2UgPSBpbmZvLT5jZmdfYmFzZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQorCS8qIEVudGVyIENvbmZpZ3VyYXRpb24gKi8KKwlvdXRiKGNoaXBzW2ldLmVudHIxLCBjZmdfYmFzZSk7CisJb3V0YihjaGlwc1tpXS5lbnRyMiwgY2ZnX2Jhc2UpOworCQorCS8qIFNlbGVjdCBMb2dpY2FsIERldmljZSA1IFJlZ2lzdGVycyAoVUFSVDIpICovCisJb3V0YigweDA3LCBjZmdfYmFzZSk7CisJb3V0YigweDA1LCBjZmdfYmFzZSsxKTsKKwkKKwkvKiBSZWFkIERvbmdsZSBJRCAqLworCW91dGIoMHhmMCwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsJCisJZG9uZ2xlX2lkID0gKChyZWc+PjYpJjB4MDIpIHwgKChyZWc+PjUpJjB4MDEpOworCUlSREFfREVCVUcoMiwgIiVzKCksIHByb2JpbmcgZG9uZ2xlX2lkPSVkLCBkb25nbGVfdHlwZXM9JXNcbiIsIF9fRlVOQ1RJT05fXywgCisJCWRvbmdsZV9pZCwgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOworCQorCS8qIEV4aXQgY29uZmlndXJhdGlvbiAqLworCW91dGIoMHhiYiwgY2ZnX2Jhc2UpOworCQkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsJCisJCisJcmV0dXJuIGRvbmdsZV9pZDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgQW4gaW50ZXJydXB0IGZyb20gdGhlIGNoaXAgaGFzIGFycml2ZWQuIFRpbWUgdG8gZG8gc29tZSB3b3JrCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWxpX2lyY2NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmOworCWludCByZXQ7CisJCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCisgCWlmICghZGV2KSB7CisJCUlSREFfV0FSTklORygiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBkcml2ZXJfbmFtZSwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0JCisJCisJc2VsZiA9IChzdHJ1Y3QgYWxpX2lyY2NfY2IgKikgZGV2LT5wcml2OworCQorCXNwaW5fbG9jaygmc2VsZi0+bG9jayk7CisJCisJLyogRGlzcGF0Y2ggaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IHNwZWVkICovCisJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKQorCQlyZXQgPSBhbGlfaXJjY19maXJfaW50ZXJydXB0KHNlbGYpOworCWVsc2UKKwkJcmV0ID0gYWxpX2lyY2Nfc2lyX2ludGVycnVwdChzZWxmKTsKKwkJCisJc3Bpbl91bmxvY2soJnNlbGYtPmxvY2spOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIHJldDsKK30KKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19maXJfaW50ZXJydXB0KGlycSwgc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQorICoKKyAqICAgIEhhbmRsZSBNSVIvRklSIGludGVycnVwdAorICoKKyAqLworc3RhdGljIGlycXJldHVybl90IGFsaV9pcmNjX2Zpcl9pbnRlcnJ1cHQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCV9fdTggZWlyLCBPbGRNZXNzYWdlQ291bnQ7CisJaW50IGlvYmFzZSwgdG1wOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsJCisJc2VsZi0+SW50ZXJydXB0SUQgPSBpbmIoaW9iYXNlK0ZJUl9JSVIpOwkJCisJc2VsZi0+QnVzU3RhdHVzID0gaW5iKGlvYmFzZStGSVJfQlNSKTsJCisJCisJT2xkTWVzc2FnZUNvdW50ID0gKHNlbGYtPkxpbmVTdGF0dXMgKyAxKSAmIDB4MDc7CisJc2VsZi0+TGluZVN0YXR1cyA9IGluYihpb2Jhc2UrRklSX0xTUik7CQorCS8vc2VsZi0+aWVyID0gaW5iKGlvYmFzZStGSVJfSUVSKTsgCQkyMDAwLzEyLzEgMDQ6MzJQTQorCWVpciA9IHNlbGYtPkludGVycnVwdElEICYgc2VsZi0+aWVyOyAvKiBNYXNrIG91dCB0aGUgaW50ZXJlc3Rpbmcgb25lcyAqLyAKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBzZWxmLT5JbnRlcnJ1cHRJRCA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sc2VsZi0+SW50ZXJydXB0SUQpOworCUlSREFfREVCVUcoMSwgIiVzKCksIHNlbGYtPkxpbmVTdGF0dXMgPSAleFxuIiwgX19GVU5DVElPTl9fLHNlbGYtPkxpbmVTdGF0dXMpOworCUlSREFfREVCVUcoMSwgIiVzKCksIHNlbGYtPmllciA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sc2VsZi0+aWVyKTsKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBlaXIgPSAleFxuIiwgX19GVU5DVElPTl9fLGVpcik7CisJCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJIFNldENPTUludGVycnVwdHMoc2VsZiwgRkFMU0UpOworCQorCS8qIFR4IG9yIFJ4IEludGVycnVwdCAqLworCQorCWlmIChlaXIgJiBJSVJfRU9NKSAKKwl7CQkKKwkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19YTUlUKSAvKiBUWCAqLworCQl7CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCAqKioqKioqIElJUl9FT00gKFR4KSAqKioqKioqXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCisJCQlpZihhbGlfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzZWxmKSkKKwkJCXsKKwkJCQlpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShzZWxmLT5uZXRkZXYpKSAKKwkJCQl7CisJCQkJCS8qIFByZXBhcmUgZm9yIHJlY2VpdmUgKi8KKwkJCQkJYWxpX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CQkJCQkKKwkJCQkJc2VsZi0+aWVyID0gSUVSX0VPTTsJCQkJCQkJCQkKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2VsZi0+aWVyID0gSUVSX0VPTTsgCQkJCQkKKwkJCX0KKwkJCQkJCQkJCQorCQl9CQorCQllbHNlIC8qIFJYICovCisJCXsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksICoqKioqKiogSUlSX0VPTSAoUngpICoqKioqKipcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkKKwkJCWlmKE9sZE1lc3NhZ2VDb3VudCA+ICgoc2VsZi0+TGluZVN0YXR1cysxKSAmIDB4MDcpKQorCQkJeworCQkJCXNlbGYtPnJjdkZyYW1lc092ZXJmbG93ID0gVFJVRTsJCisJCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgKioqKioqKiBzZWxmLT5yY3ZGcmFtZXNPdmVyZmxvdyA9IFRSVUUgKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJfQorCQkJCQkJCisJCQlpZiAoYWxpX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZikpCisJCQl7CisJCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgKioqKioqKiByZWNlaXZlIGNvbXBsZXRlICoqKioqKioqIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkKKwkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NOwkJCQkKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlJUkRBX0RFQlVHKDEsICIlcygpLCAqKioqKioqIE5vdCByZWNlaXZlIGNvbXBsZXRlICoqKioqKioqIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkKKwkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NIHwgSUVSX1RJTUVSOwkJCQkJCQkJCisJCQl9CQorCQkKKwkJfQkJCisJfQorCS8qIFRpbWVyIEludGVycnVwdCAqLworCWVsc2UgaWYgKGVpciAmIElJUl9USU1FUikKKwl7CQorCQlpZihPbGRNZXNzYWdlQ291bnQgPiAoKHNlbGYtPkxpbmVTdGF0dXMrMSkgJiAweDA3KSkKKwkJeworCQkJc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cgPSBUUlVFOwkKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksICoqKioqKiogc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cgPSBUUlVFICoqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisJCS8qIERpc2FibGUgVGltZXIgKi8KKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJCXRtcCA9IGluYihpb2Jhc2UrRklSX0NSKTsKKwkJb3V0YiggdG1wJiB+Q1JfVElNRVJfRU4sIGlvYmFzZStGSVJfQ1IpOworCQkKKwkJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIFR4IHRpbWVyIGludGVycnVwdCAqLworCQlpZiAoc2VsZi0+aW8uZGlyZWN0aW9uID09IElPX1hNSVQpCisJCXsKKwkJCWFsaV9pcmNjX2RtYV94bWl0KHNlbGYpOworCQkJCisJCQkvKiBJbnRlcnJ1cHQgb24gRU9NICovCisJCQlzZWxmLT5pZXIgPSBJRVJfRU9NOworCQkJCQkJCQkJCisJCX0KKwkJZWxzZSAvKiBSeCAqLworCQl7CisJCQlpZihhbGlfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmKSkgCisJCQl7CisJCQkJc2VsZi0+aWVyID0gSUVSX0VPTTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NIHwgSUVSX1RJTUVSOworCQkJfQkKKwkJfQkJCisJfQorCQorCS8qIFJlc3RvcmUgSW50ZXJydXB0ICovCQorCVNldENPTUludGVycnVwdHMoc2VsZiwgVFJVRSk7CQorCQkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBJUlFfUkVUVkFMKGVpcik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19zaXJfaW50ZXJydXB0IChpcnEsIHNlbGYsIGVpcikKKyAqCisgKiAgICBIYW5kbGUgU0lSIGludGVycnVwdAorICoKKyAqLworc3RhdGljIGlycXJldHVybl90IGFsaV9pcmNjX3Npcl9pbnRlcnJ1cHQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisJaW50IGlpciwgbHNyOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCWlpciA9IGluYihpb2Jhc2UrVUFSVF9JSVIpICYgVUFSVF9JSVJfSUQ7CisJaWYgKGlpcikgewkKKwkJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJCWxzciA9IGluYihpb2Jhc2UrVUFSVF9MU1IpOworCisJCUlSREFfREVCVUcoNCwgIiVzKCksIGlpcj0lMDJ4LCBsc3I9JTAyeCwgaW9iYXNlPSUjeFxuIiwgX19GVU5DVElPTl9fLCAKKwkJCSAgIGlpciwgbHNyLCBpb2Jhc2UpOworCisJCXN3aXRjaCAoaWlyKSAKKwkJeworCQkJY2FzZSBVQVJUX0lJUl9STFNJOgorCQkJCUlSREFfREVCVUcoMiwgIiVzKCksIFJMU0lcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFVBUlRfSUlSX1JESToKKwkJCQkvKiBSZWNlaXZlIGludGVycnVwdCAqLworCQkJCWFsaV9pcmNjX3Npcl9yZWNlaXZlKHNlbGYpOworCQkJCWJyZWFrOworCQkJY2FzZSBVQVJUX0lJUl9USFJJOgorCQkJCWlmIChsc3IgJiBVQVJUX0xTUl9USFJFKQorCQkJCXsKKwkJCQkJLyogVHJhbnNtaXR0ZXIgcmVhZHkgZm9yIGRhdGEgKi8KKwkJCQkJYWxpX2lyY2Nfc2lyX3dyaXRlX3dha2V1cChzZWxmKTsJCQkJCisJCQkJfQkJCQkKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5oYW5kbGVkIElJUj0lI3hcbiIsIF9fRlVOQ1RJT05fXywgaWlyKTsKKwkJCQlicmVhazsKKwkJfSAKKwkJCisJfQorCQorCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CQorCisJcmV0dXJuIElSUV9SRVRWQUwoaWlyKTsKK30KKworCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2Nfc2lyX3JlY2VpdmUgKHNlbGYpCisgKgorICogICAgUmVjZWl2ZSBvbmUgZnJhbWUgZnJvbSB0aGUgaW5mcmFyZWQgcG9ydAorICoKKyAqLworc3RhdGljIHZvaWQgYWxpX2lyY2Nfc2lyX3JlY2VpdmUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKSAKK3sKKwlpbnQgYm9ndXNjb3VudCA9IDA7CisJaW50IGlvYmFzZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogIAorCSAqIFJlY2VpdmUgYWxsIGNoYXJhY3RlcnMgaW4gUnggRklGTywgdW53cmFwIGFuZCB1bnN0dWZmIHRoZW0uIAorICAgICAgICAgKiBhc3luY191bndyYXBfY2hhciB3aWxsIGRlbGl2ZXIgYWxsIGZvdW5kIGZyYW1lcyAgCisJICovCisJZG8geworCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsIAorCQkJCSAgaW5iKGlvYmFzZStVQVJUX1JYKSk7CisKKwkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0b28gbG9uZyAqLworCQlpZiAoYm9ndXNjb3VudCsrID4gMzIpIHsKKwkJCUlSREFfREVCVUcoMiwiJXMoKSwgYnJlYWtpbmchXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX0RSKTsJCisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2Nfc2lyX3dyaXRlX3dha2V1cCAodHR5KQorICoKKyAqICAgIENhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gdGhlcmUncyByb29tIGZvciBtb3JlIGRhdGEuICBJZiB3ZSBoYXZlCisgKiAgICBtb3JlIHBhY2tldHMgdG8gc2VuZCwgd2Ugc2VuZCB0aGVtIGhlcmUuCisgKgorICovCitzdGF0aWMgdm9pZCBhbGlfaXJjY19zaXJfd3JpdGVfd2FrZXVwKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgYWN0dWFsID0gMDsKKwlpbnQgaW9iYXNlOwkKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogRmluaXNoZWQgd2l0aCBmcmFtZT8gICovCisJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkgIAorCXsKKwkJLyogV3JpdGUgZGF0YSBsZWZ0IGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlhY3R1YWwgPSBhbGlfaXJjY19zaXJfd3JpdGUoaW9iYXNlLCBzZWxmLT5pby5maWZvX3NpemUsIAorCQkJCSAgICAgIHNlbGYtPnR4X2J1ZmYuZGF0YSwgc2VsZi0+dHhfYnVmZi5sZW4pOworCQlzZWxmLT50eF9idWZmLmRhdGEgKz0gYWN0dWFsOworCQlzZWxmLT50eF9idWZmLmxlbiAgLT0gYWN0dWFsOworCX0gCisJZWxzZSAKKwl7CisJCWlmIChzZWxmLT5uZXdfc3BlZWQpIAorCQl7CisJCQkvKiBXZSBtdXN0IHdhaXQgdW50aWwgYWxsIGRhdGEgYXJlIGdvbmUgKi8KKwkJCXdoaWxlKCEoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkKKwkJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVQVJUX0xTUl9USFJFXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCQorCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgQ2hhbmdpbmcgc3BlZWQhIHNlbGYtPm5ld19zcGVlZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBzZWxmLT5uZXdfc3BlZWQpOworCQkJYWxpX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPm5ld19zcGVlZCk7CisJCQlzZWxmLT5uZXdfc3BlZWQgPSAwOwkJCQorCQkJCisJCQkvLyBiZW5qYW1pbiAyMDAwLzExLzEwIDA2OjMyUE0KKwkJCWlmIChzZWxmLT5pby5zcGVlZCA+IDExNTIwMCkKKwkJCXsKKwkJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBhbGlfaXJjY19jaGFuZ2Vfc3BlZWQgZnJvbSBVQVJUX0xTUl9URU1UIFxuIiwgX19GVU5DVElPTl9fICk7CQkJCQorCQkJCQkKKwkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NOworCQkJCS8vIFNldENPTUludGVycnVwdHMoc2VsZiwgVFJVRSk7CQkJCQkJCQorCQkJCXJldHVybjsJCQkJCQkJCisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CQorCQl9CisJCQkKKwkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQkKKwkJLyogVHVybiBvbiByZWNlaXZlIGludGVycnVwdHMgKi8KKwkJb3V0YihVQVJUX0lFUl9SREksIGlvYmFzZStVQVJUX0lFUik7CisJfQorCQkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCit9CisKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2NoYW5nZV9zcGVlZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYsIF9fdTMyIGJhdWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNlbGYtPm5ldGRldjsKKwlpbnQgaW9iYXNlOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2V0dGluZyBzcGVlZCA9ICVkIFxuIiwgX19GVU5DVElPTl9fICwgYmF1ZCk7CisJCisJLyogVGhpcyBmdW5jdGlvbiAqbXVzdCogYmUgY2FsbGVkIHdpdGggaXJxIG9mZiBhbmQgc3Bpbi1sb2NrLgorCSAqIC0gSmVhbiBJSSAqLworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJU2V0Q09NSW50ZXJydXB0cyhzZWxmLCBGQUxTRSk7IC8vIDIwMDAvMTEvMjQgMTE6NDNBTQorCQorCS8qIEdvIHRvIE1JUiwgRklSIFNwZWVkICovCisJaWYgKGJhdWQgPiAxMTUyMDApCisJeworCQkKKwkJCQkJCisJCWFsaV9pcmNjX2Zpcl9jaGFuZ2Vfc3BlZWQoc2VsZiwgYmF1ZCk7CQkJCisJCQorCQkvKiBJbnN0YWxsIEZJUiB4bWl0IGhhbmRsZXIqLworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGFsaV9pcmNjX2Zpcl9oYXJkX3htaXQ7CQkKKwkJCQkKKwkJLyogRW5hYmxlIEludGVydXVwdCAqLworCQlzZWxmLT5pZXIgPSBJRVJfRU9NOyAvLyBiZW5qYW1pbiAyMDAwLzExLzIwIDA3OjI0UE0JCQkJCQorCQkJCQorCQkvKiBCZSByZWFkeSBmb3IgaW5jb21taW5nIGZyYW1lcyAqLworCQlhbGlfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsJLy8gYmVuYWptaW4gMjAwMC8xMS84IDA3OjQ2UE0gbm90IGNvbXBsZXRlCisJfQkKKwkvKiBHbyB0byBTSVIgU3BlZWQgKi8KKwllbHNlCisJeworCQlhbGlfaXJjY19zaXJfY2hhbmdlX3NwZWVkKHNlbGYsIGJhdWQpOworCQkJCQorCQkvKiBJbnN0YWxsIFNJUiB4bWl0IGhhbmRsZXIqLworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGFsaV9pcmNjX3Npcl9oYXJkX3htaXQ7CisJfQorCQorCQkKKwlTZXRDT01JbnRlcnJ1cHRzKHNlbGYsIFRSVUUpOwkvLyAyMDAwLzExLzI0IDExOjQzQU0KKwkJCisJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOwkKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCit9CisKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2Zpcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGFsaV9pcmNjX2NiICpwcml2LCBfX3UzMiBiYXVkKQoreworCQkKKwlpbnQgaW9iYXNlOyAKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiICopIHByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlkZXYgPSBzZWxmLT5uZXRkZXY7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgc2VsZi0+aW8uc3BlZWQgPSAlZCwgY2hhbmdlIHRvIHNwZWVkID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsc2VsZi0+aW8uc3BlZWQsYmF1ZCk7CisJCisJLyogQ29tZSBmcm9tIFNJUiBzcGVlZCAqLworCWlmKHNlbGYtPmlvLnNwZWVkIDw9MTE1MjAwKQorCXsKKwkJU0lSMkZJUihpb2Jhc2UpOworCX0KKwkJCisJLyogVXBkYXRlIGFjY291bnRpbmcgZm9yIG5ldyBzcGVlZCAqLworCXNlbGYtPmlvLnNwZWVkID0gYmF1ZDsKKwkJCisJLy8gU2V0IERvbmdsZSBTcGVlZCBtb2RlCisJYWxpX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChzZWxmLCBiYXVkKTsKKwkJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorfQorCisvKgorICogRnVuY3Rpb24gYWxpX3Npcl9jaGFuZ2Vfc3BlZWQgKHNlbGYsIHNwZWVkKQorICoKKyAqICAgIFNldCBzcGVlZCBvZiBJckRBIHBvcnQgdG8gc3BlY2lmaWVkIGJhdWRyYXRlCisgKgorICovCitzdGF0aWMgdm9pZCBhbGlfaXJjY19zaXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBhbGlfaXJjY19jYiAqcHJpdiwgX191MzIgc3BlZWQpCit7CisJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBhbGlfaXJjY19jYiAqKSBwcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYmFzZTsgCisJaW50IGZjcjsgICAgLyogRklGTyBjb250cm9sIHJlZyAqLworCWludCBsY3I7ICAgIC8qIExpbmUgY29udHJvbCByZWcgKi8KKwlpbnQgZGl2aXNvcjsKKworCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgU2V0dGluZyBzcGVlZCB0bzogJWRcbiIsIF9fRlVOQ1RJT05fXyAsIHNwZWVkKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKwkKKwkvKiBDb21lIGZyb20gTUlSIG9yIEZJUiBzcGVlZCAqLworCWlmKHNlbGYtPmlvLnNwZWVkID4xMTUyMDApCisJewkKKwkJLy8gU2V0IERvbmdsZSBTcGVlZCBtb2RlIGZpcnN0CisJCWFsaV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoc2VsZiwgc3BlZWQpOworCQkJCisJCUZJUjJTSVIoaW9iYXNlKTsKKwl9CisJCQorCS8vIENsZWFyIExpbmUgYW5kIEF1eGlsdWFyeSBzdGF0dXMgcmVnaXN0ZXJzIDIwMDAvMTEvMjQgMTE6NDdBTQorCQkKKwlpbmIoaW9iYXNlK1VBUlRfTFNSKTsKKwlpbmIoaW9iYXNlK1VBUlRfU0NSKTsKKwkJCisJLyogVXBkYXRlIGFjY291bnRpbmcgZm9yIG5ldyBzcGVlZCAqLworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJZGl2aXNvciA9IDExNTIwMC9zcGVlZDsKKwkKKwlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKKworCS8qIAorCSAqIFVzZSB0cmlnZ2VyIGxldmVsIDEgdG8gYXZvaWQgMyBtcy4gdGltZW91dCBkZWxheSBhdCA5NjAwIGJwcywgYW5kCisJICogYWxtb3N0IDEsNyBtcyBhdCAxOTIwMCBicHMuIEF0IHNwZWVkcyBhYm92ZSB0aGF0IHdlIGNhbiBqdXN0IGZvcmdldAorCSAqIGFib3V0IHRoaXMgdGltZW91dCBzaW5jZSBpdCB3aWxsIGFsd2F5cyBiZSBmYXN0IGVub3VnaC4gCisJICovCisJaWYgKHNlbGYtPmlvLnNwZWVkIDwgMzg0MDApCisJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE7CisJZWxzZSAKKwkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7CisgICAgICAgIAorCS8qIElyREEgcG9ydHMgdXNlIDhOMSAqLworCWxjciA9IFVBUlRfTENSX1dMRU44OworCQorCW91dGIoVUFSVF9MQ1JfRExBQiB8IGxjciwgaW9iYXNlK1VBUlRfTENSKTsgLyogU2V0IERMQUIgKi8KKwlvdXRiKGRpdmlzb3IgJiAweGZmLCAgICAgIGlvYmFzZStVQVJUX0RMTCk7IC8qIFNldCBzcGVlZCAqLworCW91dGIoZGl2aXNvciA+PiA4LAkgIGlvYmFzZStVQVJUX0RMTSk7CisJb3V0YihsY3IsCQkgIGlvYmFzZStVQVJUX0xDUik7IC8qIFNldCA4TjEJKi8KKwlvdXRiKGZjciwJCSAgaW9iYXNlK1VBUlRfRkNSKTsgLyogRW5hYmxlIEZJRk8ncyAqLworCisJLyogd2l0aG91dCB0aGlzLCB0aGUgY29uZWN0aW9uIHdpbGwgYmUgYnJva2VuIGFmdGVyIGNvbWUgYmFjayBmcm9tIEZJUiBzcGVlZCwKKwkgICBidXQgd2l0aCB0aGlzLCB0aGUgU0lSIGNvbm5lY3Rpb24gaXMgaGFyZGVyIHRvIGVzdGFibGlzaGVkICovCisJb3V0YigoVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfT1VUMiksIGlvYmFzZStVQVJUX01DUik7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKK30KKworc3RhdGljIHZvaWQgYWxpX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnByaXYsIGludCBzcGVlZCkKK3sKKwkKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiICopIHByaXY7CisJaW50IGlvYmFzZSxkb25nbGVfaWQ7CisJaW50IHRtcCA9IDA7CisJCQkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsgCS8qIG9yIGlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOyAqLworCWRvbmdsZV9pZCA9IHNlbGYtPmlvLmRvbmdsZV9pZDsKKwkKKwkvKiBXZSBhcmUgYWxyZWFkeSBsb2NrZWQsIG5vIG5lZWQgdG8gZG8gaXQgYWdhaW4gKi8KKwkJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgU2V0IFNwZWVkIGZvciAlcyAsIFNwZWVkID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdLCBzcGVlZCk7CQkKKwkKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwl0bXAgPSBpbmIoaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKwkJCisJLyogSUJNIHR5cGUgZG9uZ2xlICovCisJaWYoZG9uZ2xlX2lkID09IDApCisJewkJCQkKKwkJaWYoc3BlZWQgPT0gNDAwMDAwMCkKKwkJeworCQkJLy8JICAgICAgX18gX18JCisJCQkvLyBTRC9NT0RFIF9ffCAgICAgfF9fIF9fCisJCQkvLyAgICAgICAgICAgICAgIF9fIF9fIAorCQkJLy8gSVJUWCAgICBfXyBfX3wgICAgIHxfXworCQkJLy8gICAgICAgICBUMSBUMiBUMyBUNCBUNQorCQkJCisJCQl0bXAgJj0gIH5JUkRBX0NSX0hETEM7CQkvLyBIRExDPTAKKwkJCXRtcCB8PSBJUkRBX0NSX0NSQzsJICAgCS8vIENSQz0xCisJCQkKKwkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisJCQkKKyAgICAgIAkJCS8vIFQxIC0+IFNEL01PREU6MCBJUlRYOjAKKyAgICAgIAkJCXRtcCAmPSB+MHgwOTsKKyAgICAgIAkJCXRtcCB8PSAweDAyOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIFQyIC0+IFNEL01PREU6MSBJUlRYOjAKKyAgICAgIAkJCXRtcCAmPSB+MHgwMTsKKyAgICAgIAkJCXRtcCB8PSAweDBhOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIFQzIC0+IFNEL01PREU6MSBJUlRYOjEKKyAgICAgIAkJCXRtcCB8PSAweDBiOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIFQ0IC0+IFNEL01PREU6MCBJUlRYOjEKKyAgICAgIAkJCXRtcCAmPSB+MHgwODsKKyAgICAgIAkJCXRtcCB8PSAweDAzOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIFQ1IC0+IFNEL01PREU6MCBJUlRYOjAKKyAgICAgIAkJCXRtcCAmPSB+MHgwOTsKKyAgICAgIAkJCXRtcCB8PSAweDAyOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIHJlc2V0IC0+IE5vcm1hbCBUWCBvdXRwdXQgU2lnbmFsCisgICAgICAJCQlvdXRiKHRtcCAmIH4weDAyLCBpb2Jhc2UrRklSX0lSREFfQ1IpOyAgICAgIAkJCQorCQl9CisJCWVsc2UgLyogc3BlZWQgPD0xMTUyMDAwICovCisJCXsJCisJCQkvLwkgICAgICBfXwkKKwkJCS8vIFNEL01PREUgX198ICB8X18KKwkJCS8vCisJCQkvLyBJUlRYICAgIF9fX19fX19fCisJCQkvLyAgICAgICAgIFQxIFQyIFQzICAKKwkJCQorCQkJLyogTUlSIDExNTIwMCwgNTc2MDAgKi8KKwkJCWlmIChzcGVlZD09MTE1MjAwMCkKKwkJCXsKKwkJCQl0bXAgfD0gMHhBMDsJICAgLy9IRExDPTEsIDEuMTUyTWJwcz0xCisgICAgICAJCQl9CisgICAgICAJCQllbHNlCisgICAgICAJCQl7CisJCQkJdG1wICY9fjB4ODA7CSAgIC8vSERMQyAwLjU3Nk1icHMKKwkJCQl0bXAgfD0gMHgyMDsJICAgLy9IRExDPTEsCisgICAgICAJCQl9CQkJCisgICAgICAJCQkKKyAgICAgIAkJCXRtcCB8PSBJUkRBX0NSX0NSQzsJICAgCS8vIENSQz0xCisgICAgICAJCQkKKyAgICAgIAkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisJCQkJCQkKKwkJCS8qIE1JUiAxMTUyMDAsIDU3NjAwICovCQorCQkJCQkJCisJCQkvL3N3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOwkJCQorCQkJLy8gVDEgLT4gU0QvTU9ERTowIElSVFg6MAorICAgICAgCQkJdG1wICY9IH4weDA5OworICAgICAgCQkJdG1wIHw9IDB4MDI7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKyAgICAgIAkJCXVkZWxheSgyKTsKKyAgICAgIAkJCQorICAgICAgCQkJLy8gVDIgLT4gU0QvTU9ERToxIElSVFg6MAorICAgICAgCQkJdG1wICY9IH4weDAxOyAgICAgCisgICAgICAJCQl0bXAgfD0gMHgwYTsgICAgICAKKyAgICAgIAkJCW91dGIodG1wLCBpb2Jhc2UrRklSX0lSREFfQ1IpOworICAgICAgCQkJCisgICAgICAJCQkvLyBUMyAtPiBTRC9NT0RFOjAgSVJUWDowCisgICAgICAJCQl0bXAgJj0gfjB4MDk7CisgICAgICAJCQl0bXAgfD0gMHgwMjsKKyAgICAgIAkJCW91dGIodG1wLCBpb2Jhc2UrRklSX0lSREFfQ1IpOworICAgICAgCQkJdWRlbGF5KDIpOworICAgICAgCQkJCisgICAgICAJCQkvLyByZXNldCAtPiBOb3JtYWwgVFggb3V0cHV0IFNpZ25hbAorICAgICAgCQkJb3V0Yih0bXAgJiB+MHgwMiwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsgICAgICAJCQkJCQkKKwkJfQkJCisJfQorCWVsc2UgaWYgKGRvbmdsZV9pZCA9PSAxKSAvKiBIUCBIRFNMLTM2MDAgKi8KKwl7CisJCXN3aXRjaChzcGVlZCkKKwkJeworCQljYXNlIDQwMDAwMDA6CisJCQl0bXAgJj0gIH5JUkRBX0NSX0hETEM7CS8vIEhETEM9MAorCQkJYnJlYWs7CQorCQkJCisJCWNhc2UgMTE1MjAwMDoKKwkJCXRtcCB8PSAweEEwOwkgICAJLy8gSERMQz0xLCAxLjE1Mk1icHM9MQorICAgICAgCQkJYnJlYWs7CisgICAgICAJCQkKKyAgICAgIAkJY2FzZSA1NzYwMDA6CisgICAgICAJCQl0bXAgJj1+MHg4MDsJICAgCS8vIEhETEMgMC41NzZNYnBzCisJCQl0bXAgfD0gMHgyMDsJICAgCS8vIEhETEM9MSwKKwkJCWJyZWFrOworICAgICAgCQl9CQkJCisJCQkKKwkJdG1wIHw9IElSREFfQ1JfQ1JDOwkgICAJLy8gQ1JDPTEKKwkJCQorCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKyAgICAgIAkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CQkKKwl9CisJZWxzZSAvKiBIUCBIRFNMLTExMDAgKi8KKwl7CisJCWlmKHNwZWVkIDw9IDExNTIwMCkgLyogU0lSICovCisJCXsKKwkJCQorCQkJdG1wICY9IH5JUkRBX0NSX0ZJUl9TSU47CS8vIEhQIHNpbiBzZWxlY3QgPSAwCisJCQkKKwkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CQkJCisJCX0KKwkJZWxzZSAvKiBNSVIgRklSICovCisJCXsJCisJCQkKKwkJCXN3aXRjaChzcGVlZCkKKwkJCXsKKwkJCWNhc2UgNDAwMDAwMDoKKwkJCQl0bXAgJj0gIH5JUkRBX0NSX0hETEM7CS8vIEhETEM9MAorCQkJCWJyZWFrOwkKKwkJCQorCQkJY2FzZSAxMTUyMDAwOgorCQkJCXRtcCB8PSAweEEwOwkgICAJLy8gSERMQz0xLCAxLjE1Mk1icHM9MQorICAgICAgCQkJCWJyZWFrOworICAgICAgCQkJCisgICAgICAJCQljYXNlIDU3NjAwMDoKKyAgICAgIAkJCQl0bXAgJj1+MHg4MDsJICAgCS8vIEhETEMgMC41NzZNYnBzCisJCQkJdG1wIHw9IDB4MjA7CSAgIAkvLyBIRExDPTEsCisJCQkJYnJlYWs7CisgICAgICAJCQl9CQkJCisJCQkKKwkJCXRtcCB8PSBJUkRBX0NSX0NSQzsJICAgCS8vIENSQz0xCisJCQl0bXAgfD0gSVJEQV9DUl9GSVJfU0lOOwkJLy8gSFAgc2luIHNlbGVjdCA9IDEKKwkJCQorCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsJCQkKKwkJfQorCX0KKwkJCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkJCit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19zaXJfd3JpdGUgKGRyaXZlcikKKyAqCisgKiAgICBGaWxsIFR4IEZJRk8gd2l0aCB0cmFuc21pdCBkYXRhCisgKgorICovCitzdGF0aWMgaW50IGFsaV9pcmNjX3Npcl93cml0ZShpbnQgaW9iYXNlLCBpbnQgZmlmb19zaXplLCBfX3U4ICpidWYsIGludCBsZW4pCit7CisJaW50IGFjdHVhbCA9IDA7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCisJLyogVHggRklGTyBzaG91bGQgYmUgZW1wdHkhICovCisJaWYgKCEoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBmYWlsZWQsIGZpZm8gbm90IGVtcHR5IVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAwOworCX0KKyAgICAgICAgCisJLyogRmlsbCBGSUZPIHdpdGggY3VycmVudCBmcmFtZSAqLworCXdoaWxlICgoZmlmb19zaXplLS0gPiAwKSAmJiAoYWN0dWFsIDwgbGVuKSkgeworCQkvKiBUcmFuc21pdCBuZXh0IGJ5dGUgKi8KKwkJb3V0YihidWZbYWN0dWFsXSwgaW9iYXNlK1VBUlRfVFgpOworCisJCWFjdHVhbCsrOworCX0KKwkKKyAgICAgICAgSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCXJldHVybiBhY3R1YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIFN0YXJ0IHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwljaGFyIGh3bmFtZVszMl07CisJCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCQorCXNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJLyogUmVxdWVzdCBJUlEgYW5kIGluc3RhbGwgSW50ZXJydXB0IEhhbmRsZXIgKi8KKwlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCBhbGlfaXJjY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkgCisJeworCQlJUkRBX1dBUk5JTkcoIiVzLCB1bmFibGUgdG8gYWxsb2NhdGUgaXJxPSVkXG4iLCBkcml2ZXJfbmFtZSwKKwkJCSAgICAgc2VsZi0+aW8uaXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCQorCS8qCisJICogQWx3YXlzIGFsbG9jYXRlIHRoZSBETUEgY2hhbm5lbCBhZnRlciB0aGUgSVJRLCBhbmQgY2xlYW4gdXAgb24gCisJICogZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVzdF9kbWEoc2VsZi0+aW8uZG1hLCBkZXYtPm5hbWUpKSB7CisJCUlSREFfV0FSTklORygiJXMsIHVuYWJsZSB0byBhbGxvY2F0ZSBkbWE9JWRcbiIsIGRyaXZlcl9uYW1lLAorCQkJICAgICBzZWxmLT5pby5kbWEpOworCQlmcmVlX2lycShzZWxmLT5pby5pcnEsIHNlbGYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJCisJLyogVHVybiBvbiBpbnRlcnJ1cHMgKi8KKwlvdXRiKFVBUlRfSUVSX1JESSAsIGlvYmFzZStVQVJUX0lFUik7CisKKwkvKiBSZWFkeSB0byBwbGF5ISAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7IC8vYmVuamFtaW4gYnkgaXJwb3J0CisJCisJLyogR2l2ZSBzZWxmIGEgaGFyZHdhcmUgbmFtZSAqLworCXNwcmludGYoaHduYW1lLCAiQUxJLUZJUiBAIDB4JTAzeCIsIHNlbGYtPmlvLmZpcl9iYXNlKTsKKworCS8qIAorCSAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQorCSAqIGluaXRpYWxpemVkIHByb3Blcmx5IAorCSAqLworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisJCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX25ldF9jbG9zZSAoZGV2KQorICoKKyAqICAgIFN0b3AgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sJCisKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGY7CisJLy9pbnQgaW9iYXNlOworCQkJCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc2VsZiA9IChzdHJ1Y3QgYWxpX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCS8qIFN0b3AgZGV2aWNlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCS8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworCWlmIChzZWxmLT5pcmxhcCkKKwkJaXJsYXBfY2xvc2Uoc2VsZi0+aXJsYXApOworCXNlbGYtPmlybGFwID0gTlVMTDsKKwkJCisJZGlzYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCVNldENPTUludGVycnVwdHMoc2VsZiwgRkFMU0UpOworCSAgICAgICAKKwlmcmVlX2lycShzZWxmLT5pby5pcnEsIGRldik7CisJZnJlZV9kbWEoc2VsZi0+aW8uZG1hKTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2Zpcl9oYXJkX3htaXQgKHNrYiwgZGV2KQorICoKKyAqICAgIFRyYW5zbWl0IHRoZSBmcmFtZQorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19maXJfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYmFzZTsKKwlfX3UzMiBzcGVlZDsKKwlpbnQgbXR0LCBkaWZmOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlzZWxmID0gKHN0cnVjdCBhbGlfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogTWFrZSBzdXJlIHRlc3RzIComIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBOb3RlIDogeW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCBzcGVlZCBjaGFuZ2VzIGFyZSBub3QgZ29pbmcKKwkgKiB0byBjb3JydXB0IGFueSBvdXRnb2luZyBmcmFtZS4gTG9vayBhdCBuc2MtaXJjYyBmb3IgdGhlIGdvcnkKKwkgKiBkZXRhaWxzIC0gSmVhbiBJSSAqLworCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUgKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJYWxpX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsgCisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCX0KKworCS8qIFJlZ2lzdGVyIGFuZCBjb3B5IHRoaXMgZnJhbWUgdG8gRE1BIG1lbW9yeSAqLworCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCA9IHNlbGYtPnR4X2ZpZm8udGFpbDsKKwlzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0ubGVuID0gc2tiLT5sZW47CisJc2VsZi0+dHhfZmlmby50YWlsICs9IHNrYi0+bGVuOworCisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwltZW1jcHkoc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmRhdGEsIAorCSAgICAgICBza2ItPmxlbik7CisJCisJc2VsZi0+dHhfZmlmby5sZW4rKzsKKwlzZWxmLT50eF9maWZvLmZyZWUrKzsKKworCS8qIFN0YXJ0IHRyYW5zbWl0IG9ubHkgaWYgdGhlcmUgaXMgY3VycmVudGx5IG5vIHRyYW5zbWl0IGdvaW5nIG9uICovCisJaWYgKHNlbGYtPnR4X2ZpZm8ubGVuID09IDEpIAorCXsKKwkJLyogQ2hlY2sgaWYgd2UgbXVzdCB3YWl0IHRoZSBtaW4gdHVybiB0aW1lIG9yIG5vdCAqLworCQltdHQgPSBpcmRhX2dldF9tdHQoc2tiKTsKKwkJCQkKKwkJaWYgKG10dCkgCisJCXsKKwkJCS8qIENoZWNrIGhvdyBtdWNoIHRpbWUgd2UgaGF2ZSB1c2VkIGFscmVhZHkgKi8KKwkJCWRvX2dldHRpbWVvZmRheSgmc2VsZi0+bm93KTsKKwkJCQorCQkJZGlmZiA9IHNlbGYtPm5vdy50dl91c2VjIC0gc2VsZi0+c3RhbXAudHZfdXNlYzsKKwkJCS8qIHNlbGYtPnN0YW1wIGlzIHNldCBmcm9tIGFsaV9pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKCkgKi8KKwkJCQkJCQkKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksICoqKioqKiogZGlmZiA9ICVkICoqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gLCBkaWZmKTsJCisJCQkKKwkJCWlmIChkaWZmIDwgMCkgCisJCQkJZGlmZiArPSAxMDAwMDAwOworCQkJCisJCQkvKiBDaGVjayBpZiB0aGUgbXR0IGlzIGxhcmdlciB0aGFuIHRoZSB0aW1lIHdlIGhhdmUKKwkJCSAqIGFscmVhZHkgdXNlZCBieSBhbGwgdGhlIHByb3RvY29sIHByb2Nlc3NpbmcKKwkJCSAqLworCQkJaWYgKG10dCA+IGRpZmYpCisJCQl7CQkJCQorCQkJCW10dCAtPSBkaWZmOworCQkJCQkJCQkKKwkJCQkvKiAKKwkJCQkgKiBVc2UgdGltZXIgaWYgZGVsYXkgbGFyZ2VyIHRoYW4gMTAwMCB1cywgYW5kCisJCQkJICogdXNlIHVkZWxheSBmb3Igc21hbGxlciB2YWx1ZXMgd2hpY2ggc2hvdWxkCisJCQkJICogYmUgYWNjZXB0YWJsZQorCQkJCSAqLworCQkJCWlmIChtdHQgPiA1MDApIAorCQkJCXsKKwkJCQkJLyogQWRqdXN0IGZvciB0aW1lciByZXNvbHV0aW9uICovCisJCQkJCW10dCA9IChtdHQrMjUwKSAvIDUwMDsgCS8qIDQgZGlzY2FyZCwgNSBnZXQgYWR2YW5jZWQsIExldCdzIHJvdW5kIG9mZiAqLworCQkJCQkKKwkJCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgKioqKioqKioqKioqKiogbXR0ID0gJWQgKioqKioqKioqKipcbiIsIF9fRlVOQ1RJT05fXyAsIG10dCk7CQorCQkJCQkKKwkJCQkJLyogU2V0dXAgdGltZXIgKi8KKwkJCQkJaWYgKG10dCA9PSAxKSAvKiA1MDAgdXMgKi8KKwkJCQkJeworCQkJCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJCQkJCQlvdXRiKFRJTUVSX0lJUl81MDAsIGlvYmFzZStGSVJfVElNRVJfSUlSKTsKKwkJCQkJfQkKKwkJCQkJZWxzZSBpZiAobXR0ID09IDIpIC8qIDEgbXMgKi8KKwkJCQkJeworCQkJCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJCQkJCQlvdXRiKFRJTUVSX0lJUl8xbXMsIGlvYmFzZStGSVJfVElNRVJfSUlSKTsKKwkJCQkJfQkJCQkJCisJCQkJCWVsc2UgLyogPiAybXMgLT4gNG1zICovCisJCQkJCXsKKwkJCQkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCQkJCQkJb3V0YihUSU1FUl9JSVJfMm1zLCBpb2Jhc2UrRklSX1RJTUVSX0lJUik7CisJCQkJCX0KKwkJCQkJCisJCQkJCQorCQkJCQkvKiBTdGFydCB0aW1lciAqLworCQkJCQlvdXRiKGluYihpb2Jhc2UrRklSX0NSKSB8IENSX1RJTUVSX0VOLCBpb2Jhc2UrRklSX0NSKTsKKwkJCQkJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fWE1JVDsKKwkJCQkJCisJCQkJCS8qIEVuYWJsZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJCQkJc2VsZi0+aWVyID0gSUVSX1RJTUVSOworCQkJCQlTZXRDT01JbnRlcnJ1cHRzKHNlbGYsIFRSVUUpOwkJCQkJCisJCQkJCQorCQkJCQkvKiBUaW1lciB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdCAqLworCQkJCQlnb3RvIG91dDsgCisJCQkJfSAKKwkJCQllbHNlCisJCQkJCXVkZWxheShtdHQpOworCQkJfSAvLyBpZiAoaWYgKG10dCA+IGRpZmYpCisJCX0vLyBpZiAobXR0KSAKKwkJCQkKKwkJLyogRW5hYmxlIEVPTSBpbnRlcnJ1cHQgKi8KKwkJc2VsZi0+aWVyID0gSUVSX0VPTTsKKwkJU2V0Q09NSW50ZXJydXB0cyhzZWxmLCBUUlVFKTsKKwkJCisJCS8qIFRyYW5zbWl0IGZyYW1lICovCisJCWFsaV9pcmNjX2RtYV94bWl0KHNlbGYpOworCX0gLy8gaWYgKHNlbGYtPnR4X2ZpZm8ubGVuID09IDEpIAorCQorIG91dDoKKyAJCisJLyogTm90IGJ1c3kgdHJhbnNtaXR0aW5nIGFueW1vcmUgaWYgd2luZG93IGlzIG5vdCBmdWxsICovCisJaWYgKHNlbGYtPnR4X2ZpZm8uZnJlZSA8IE1BWF9UWF9XSU5ET1cpCisJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJcmV0dXJuIDA7CQorfQorCisKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2RtYV94bWl0KHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlLCB0bXA7CisJdW5zaWduZWQgY2hhciBGSUZPX09QVEksIEhpLCBMbzsKKwkKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJLyogRklGTyB0aHJlc2hvbGQgLCB0aGlzIG1ldGhvZCBjb21lcyBmcm9tIE5ESVM1IGNvZGUgKi8KKwkKKwlpZihzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4gPCBUWF9GSUZPX1RocmVzaG9sZCkKKwkJRklGT19PUFRJID0gc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0ubGVuLTE7CisJZWxzZQorCQlGSUZPX09QVEkgPSBUWF9GSUZPX1RocmVzaG9sZDsKKwkKKwkvKiBEaXNhYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoaW5iKGlvYmFzZStGSVJfQ1IpICYgfkNSX0RNQV9FTiwgaW9iYXNlK0ZJUl9DUik7CisJCisJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fWE1JVDsKKwkKKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIAorCQkgICAgICAgKCh1OCAqKXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLnN0YXJ0IC0KKwkJCXNlbGYtPnR4X2J1ZmYuaGVhZCkgKyBzZWxmLT50eF9idWZmX2RtYSwKKwkJICAgICAgIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLmxlbiwgCisJCSAgICAgICBETUFfVFhfTU9ERSk7CisJCQorCS8qIFJlc2V0IFR4IEZJRk8gKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKExDUl9BX0ZJRk9fUkVTRVQsIGlvYmFzZStGSVJfTENSX0EpOworCQorCS8qIFNldCBUeCBGSUZPIHRocmVzaG9sZCAqLworCWlmIChzZWxmLT5maWZvX29wdGlfYnVmIT1GSUZPX09QVEkpIAorCXsKKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJICAgIAlvdXRiKEZJRk9fT1BUSSwgaW9iYXNlK0ZJUl9GSUZPX1RSKSA7CisJICAgIAlzZWxmLT5maWZvX29wdGlfYnVmPUZJRk9fT1BUSTsKKwl9CisJCisJLyogU2V0IFR4IERNQSB0aHJlc2hvbGQgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwlvdXRiKFRYX0RNQV9UaHJlc2hvbGQsIGlvYmFzZStGSVJfRE1BX1RSKTsKKwkKKwkvKiBTZXQgbWF4IFR4IGZyYW1lIHNpemUgKi8KKwlIaSA9IChzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4gPj4gOCkgJiAweDBmOworCUxvID0gc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0ubGVuICYgMHhmZjsKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwlvdXRiKEhpLCBpb2Jhc2UrRklSX1RYX0RTUl9ISSk7CisJb3V0YihMbywgaW9iYXNlK0ZJUl9UWF9EU1JfTE8pOworCQorCS8qIERpc2FibGUgU0lQICwgRGlzYWJsZSBCcmljayBXYWxsICh3ZSBkb24ndCBzdXBwb3J0IGluIFRYIG1vZGUpLCBDaGFuZ2UgdG8gVFggbW9kZSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOwkKKwl0bXAgPSBpbmIoaW9iYXNlK0ZJUl9MQ1JfQik7CisJdG1wICY9IH4weDIwOyAvLyBEaXNhYmxlIFNJUAorCW91dGIoKCh1bnNpZ25lZCBjaGFyKSh0bXAgJiAweDNmKSB8IExDUl9CX1RYX01PREUpICYgfkxDUl9CX0JXLCBpb2Jhc2UrRklSX0xDUl9CKTsKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAqKioqKioqIENoYW5nZSB0byBUWCBtb2RlOiBGSVJfTENSX0IgPSAweCV4ICoqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gLCBpbmIoaW9iYXNlK0ZJUl9MQ1JfQikpOworCQorCW91dGIoMCwgaW9iYXNlK0ZJUl9MU1IpOworCQkJCisJLyogRW5hYmxlIERNQSBhbmQgQnVyc3QgTW9kZSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoaW5iKGlvYmFzZStGSVJfQ1IpIHwgQ1JfRE1BX0VOIHwgQ1JfRE1BX0JVUlNULCBpb2Jhc2UrRklSX0NSKTsKKwkKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsgCisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7Cit9CisKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCWludCByZXQgPSBUUlVFOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwkvKiBEaXNhYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoaW5iKGlvYmFzZStGSVJfQ1IpICYgfkNSX0RNQV9FTiwgaW9iYXNlK0ZJUl9DUik7CisJCisJLyogQ2hlY2sgZm9yIHVuZGVycnVuISAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCWlmKChpbmIoaW9iYXNlK0ZJUl9MU1IpICYgTFNSX0ZSQU1FX0FCT1JUKSA9PSBMU1JfRlJBTUVfQUJPUlQpCisJCisJeworCQlJUkRBX0VSUk9SKCIlcygpLCAqKioqKioqKiogTFNSX0ZSQU1FX0FCT1JUICoqKioqKioqKlxuIiwgX19GVU5DVElPTl9fKTsJCisJCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlzZWxmLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwkJCisJfQorCWVsc2UgCisJeworCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJaWYgKHNlbGYtPm5ld19zcGVlZCkgCisJeworCQlhbGlfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsKKwkJc2VsZi0+bmV3X3NwZWVkID0gMDsKKwl9CisKKwkvKiBGaW5pc2hlZCB3aXRoIHRoaXMgZnJhbWUsIHNvIHByZXBhcmUgZm9yIG5leHQgKi8KKwlzZWxmLT50eF9maWZvLnB0cisrOworCXNlbGYtPnR4X2ZpZm8ubGVuLS07CisKKwkvKiBBbnkgZnJhbWVzIHRvIGJlIHNlbnQgYmFjay10by1iYWNrPyAqLworCWlmIChzZWxmLT50eF9maWZvLmxlbikgCisJeworCQlhbGlfaXJjY19kbWFfeG1pdChzZWxmKTsKKwkJCisJCS8qIE5vdCBmaW5pc2hlZCB5ZXQhICovCisJCXJldCA9IEZBTFNFOworCX0gCisJZWxzZSAKKwl7CS8qIFJlc2V0IFR4IEZJRk8gaW5mbyAqLworCQlzZWxmLT50eF9maWZvLmxlbiA9IHNlbGYtPnR4X2ZpZm8ucHRyID0gc2VsZi0+dHhfZmlmby5mcmVlID0gMDsKKwkJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHJvb20gZm9yIG1vcmUgZnJhbWVzICovCisJaWYgKHNlbGYtPnR4X2ZpZm8uZnJlZSA8IE1BWF9UWF9XSU5ET1cpIHsKKwkJLyogTm90IGJ1c3kgdHJhbnNtaXR0aW5nIGFueW1vcmUgKi8KKwkJLyogVGVsbCB0aGUgbmV0d29yayBsYXllciwgdGhhdCB3ZSBjYW4gYWNjZXB0IG1vcmUgZnJhbWVzICovCisJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwl9CisJCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOyAKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2RtYV9yZWNlaXZlIChzZWxmKQorICoKKyAqICAgIEdldCByZWFkeSBmb3IgcmVjZWl2aW5nIGEgZnJhbWUuIFRoZSBkZXZpY2Ugd2lsbCBpbml0aWF0ZSBhIERNQQorICogICAgaWYgaXQgc3RhcnRzIHRvIHJlY2VpdmUgYSBmcmFtZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKSAKK3sKKwlpbnQgaW9iYXNlLCB0bXA7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCQorCS8qIFJlc2V0IFR4IEZJRk8gaW5mbyAqLworCXNlbGYtPnR4X2ZpZm8ubGVuID0gc2VsZi0+dHhfZmlmby5wdHIgPSBzZWxmLT50eF9maWZvLmZyZWUgPSAwOworCXNlbGYtPnR4X2ZpZm8udGFpbCA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwkJCisJLyogRGlzYWJsZSBETUEgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwlvdXRiKGluYihpb2Jhc2UrRklSX0NSKSAmIH5DUl9ETUFfRU4sIGlvYmFzZStGSVJfQ1IpOworCQorCS8qIFJlc2V0IE1lc3NhZ2UgQ291bnQgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKDB4MDcsIGlvYmFzZStGSVJfTFNSKTsKKwkJCisJc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cgPSBGQUxTRTsJCisJCisJc2VsZi0+TGluZVN0YXR1cyA9IGluYihpb2Jhc2UrRklSX0xTUikgOworCQorCS8qIFJlc2V0IFJ4IEZJRk8gaW5mbyAqLworCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1JFQ1Y7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCQkKKwkvKiBSZXNldCBSeCBGSUZPICovCisJLy8gc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihMQ1JfQV9GSUZPX1JFU0VULCBpb2Jhc2UrRklSX0xDUl9BKTsgCisJCisJc2VsZi0+c3RfZmlmby5sZW4gPSBzZWxmLT5zdF9maWZvLnBlbmRpbmdfYnl0ZXMgPSAwOworCXNlbGYtPnN0X2ZpZm8udGFpbCA9IHNlbGYtPnN0X2ZpZm8uaGVhZCA9IDA7CisJCQorCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgc2VsZi0+cnhfYnVmZl9kbWEsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCSAgICAgICBETUFfUlhfTU9ERSk7CisJIAorCS8qIFNldCBSZWNlaXZlIE1vZGUsQnJpY2sgV2FsbCAqLworCS8vc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJdG1wID0gaW5iKGlvYmFzZStGSVJfTENSX0IpOworCW91dGIoKHVuc2lnbmVkIGNoYXIpKHRtcCAmMHgzZikgfCBMQ1JfQl9SWF9NT0RFIHwgTENSX0JfQlcgLCBpb2Jhc2UgKyBGSVJfTENSX0IpOyAvLyAyMDAwLzEyLzEgMDU6MTZQTQorCUlSREFfREVCVUcoMSwgIiVzKCksICoqKiBDaGFuZ2UgVG8gUlggbW9kZTogRklSX0xDUl9CID0gMHgleCAqKiogXG4iLCBfX0ZVTkNUSU9OX18gLCBpbmIoaW9iYXNlK0ZJUl9MQ1JfQikpOworCQkJCisJLyogU2V0IFJ4IFRocmVzaG9sZCAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoUlhfRklGT19UaHJlc2hvbGQsIGlvYmFzZStGSVJfRklGT19UUik7CisJb3V0YihSWF9ETUFfVGhyZXNob2xkLCBpb2Jhc2UrRklSX0RNQV9UUik7CisJCQorCS8qIEVuYWJsZSBETUEgYW5kIEJ1cnN0IE1vZGUgKi8KKwkvLyBzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwlvdXRiKENSX0RNQV9FTiB8IENSX0RNQV9CVVJTVCwgaW9iYXNlK0ZJUl9DUik7CisJCQkJCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7IAorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCAgYWxpX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCXN0cnVjdCBzdF9maWZvICpzdF9maWZvOworCXN0cnVjdCBza19idWZmICpza2I7CisJX191OCBzdGF0dXMsIE1lc3NhZ2VDb3VudDsKKwlpbnQgbGVuLCBpLCBpb2Jhc2UsIHZhbDsJCisKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisKKwlzdF9maWZvID0gJnNlbGYtPnN0X2ZpZm87CQkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsJCisJCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCU1lc3NhZ2VDb3VudCA9IGluYihpb2Jhc2UrIEZJUl9MU1IpJjB4MDc7CisJCisJaWYgKE1lc3NhZ2VDb3VudCA+IDApCQorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBNZXNzc2FnZSBjb3VudCA9ICVkLFxuIiwgX19GVU5DVElPTl9fICwgTWVzc2FnZUNvdW50KTsJCisJCQorCWZvciAoaT0wOyBpPD1NZXNzYWdlQ291bnQ7IGkrKykKKwl7CisJCS8qIEJhbmsgMCAqLworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwkJc3RhdHVzID0gaW5iKGlvYmFzZStGSVJfTFNSKTsKKwkJCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCQlsZW4gPSBpbmIoaW9iYXNlK0ZJUl9SWF9EU1JfSEkpICYgMHgwZjsKKwkJbGVuID0gbGVuIDw8IDg7IAorCQlsZW4gfD0gaW5iKGlvYmFzZStGSVJfUlhfRFNSX0xPKTsKKwkJCisJCUlSREFfREVCVUcoMSwgIiVzKCksIFJYIExlbmd0aCA9IDB4JS4yeCxcbiIsIF9fRlVOQ1RJT05fXyAsIGxlbik7CQorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBSWCBTdGF0dXMgPSAweCUuMngsXG4iLCBfX0ZVTkNUSU9OX18gLCBzdGF0dXMpOworCQkKKwkJaWYgKHN0X2ZpZm8tPnRhaWwgPj0gTUFYX1JYX1dJTkRPVykgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgd2luZG93IGlzIGZ1bGwhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQkKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5zdGF0dXMgPSBzdGF0dXM7CisJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+dGFpbF0ubGVuID0gbGVuOworCQlzdF9maWZvLT5wZW5kaW5nX2J5dGVzICs9IGxlbjsKKwkJc3RfZmlmby0+dGFpbCsrOworCQlzdF9maWZvLT5sZW4rKzsKKwl9CisJCQkKKwlmb3IgKGk9MDsgaTw9TWVzc2FnZUNvdW50OyBpKyspCisJewkKKwkJLyogR2V0IGZpcnN0IGVudHJ5ICovCisJCXN0YXR1cyA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzOworCQlsZW4gICAgPSBzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLmxlbjsKKwkJc3RfZmlmby0+cGVuZGluZ19ieXRlcyAtPSBsZW47CisJCXN0X2ZpZm8tPmhlYWQrKzsKKwkJc3RfZmlmby0+bGVuLS07CQkJCisJCQorCQkvKiBDaGVjayBmb3IgZXJyb3JzICovCisJCWlmICgoc3RhdHVzICYgMHhkOCkgfHwgc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cgfHwgKGxlbj09MCkpIAkJCisJCXsKKwkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBSWCBFcnJvcnMgKioqKioqKioqKioqIFxuIiwgX19GVU5DVElPTl9fICk7CQorCQkJCisJCQkvKiBTa2lwIGZyYW1lICovCisJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQorCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJCQorCQkJaWYgKHN0YXR1cyAmIExTUl9GSUZPX1VSKSAKKwkJCXsKKwkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogRklGTyBFcnJvcnMgKioqKioqKioqKioqIFxuIiwgX19GVU5DVElPTl9fICk7CisJCQl9CQorCQkJaWYgKHN0YXR1cyAmIExTUl9GUkFNRV9FUlJPUikKKwkJCXsKKwkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogRlJBTUUgRXJyb3JzICoqKioqKioqKioqKiBcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJfQorCQkJCQkJCQorCQkJaWYgKHN0YXR1cyAmIExTUl9DUkNfRVJST1IpIAorCQkJeworCQkJCXNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogQ1JDIEVycm9ycyAqKioqKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCX0KKwkJCQorCQkJaWYoc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cpCisJCQl7CisJCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJSVJEQV9ERUJVRygwLCIlcygpLCAqKioqKioqKioqKioqIE92ZXJyYW4gRE1BIGJ1ZmZlciAqKioqKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gKTsJCQkJCQkJCQorCQkJfQorCQkJaWYobGVuID09IDApCisJCQl7CisJCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJSVJEQV9ERUJVRygwLCIlcygpLCAqKioqKioqKioqIFJlY2VpdmUgRnJhbWUgU2l6ZSA9IDAgKioqKioqKioqIFxuIiwgX19GVU5DVElPTl9fICk7CisJCQl9CisJCX0JIAorCQllbHNlIAorCQl7CisJCQkKKwkJCWlmIChzdF9maWZvLT5wZW5kaW5nX2J5dGVzIDwgMzIpIAorCQkJeworCQkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQkJCXZhbCA9IGluYihpb2Jhc2UrRklSX0JTUik7CQorCQkJCWlmICgodmFsJiBCU1JfRklGT19OT1RfRU1QVFkpPT0gMHg4MCkgCisJCQkJeworCQkJCQlJUkRBX0RFQlVHKDAsICIlcygpLCAqKioqKioqKioqKioqIEJTUl9GSUZPX05PVF9FTVBUWSAqKioqKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCQkJCisJCQkJCS8qIFB1dCB0aGlzIGVudHJ5IGJhY2sgaW4gZmlmbyAqLworCQkJCQlzdF9maWZvLT5oZWFkLS07CisJCQkJCXN0X2ZpZm8tPmxlbisrOworCQkJCQlzdF9maWZvLT5wZW5kaW5nX2J5dGVzICs9IGxlbjsKKwkJCQkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5zdGF0dXMgPSBzdGF0dXM7CisJCQkJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuID0gbGVuOworCQkJCQkJCisJCQkJCS8qICAKKwkJIAkJCSogRE1BIG5vdCBmaW5pc2hlZCB5ZXQsIHNvIHRyeSBhZ2FpbiAKKwkJIAkJCSogbGF0ZXIsIHNldCB0aW1lciB2YWx1ZSwgcmVzb2x1dGlvbiAKKwkJIAkJCSogNTAwIHVzIAorCQkgCQkJKi8KKwkJCQkJIAorCQkJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwkJCQkJb3V0YihUSU1FUl9JSVJfNTAwLCBpb2Jhc2UrRklSX1RJTUVSX0lJUik7IC8vIDIwMDEvMS8yIDA1OjA3UE0KKwkJCQkJCisJCQkJCS8qIEVuYWJsZSBUaW1lciAqLworCQkJCQlvdXRiKGluYihpb2Jhc2UrRklSX0NSKSB8IENSX1RJTUVSX0VOLCBpb2Jhc2UrRklSX0NSKTsKKwkJCQkJCQorCQkJCQlyZXR1cm4gRkFMU0U7IC8qIEknbGwgYmUgYmFjayEgKi8KKwkJCQl9CisJCQl9CQkKKwkJCQorCQkJLyogCisJCQkgKiBSZW1lbWJlciB0aGUgdGltZSB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lLCBzbyB3ZSBjYW4KKwkJCSAqIHJlZHVjZSB0aGUgbWluIHR1cm4gdGltZSBhIGJpdCBzaW5jZSB3ZSB3aWxsIGtub3cKKwkJCSAqIGhvdyBtdWNoIHRpbWUgd2UgaGF2ZSB1c2VkIGZvciBwcm90b2NvbCBwcm9jZXNzaW5nCisJCQkgKi8KKwkJCWRvX2dldHRpbWVvZmRheSgmc2VsZi0+c3RhbXApOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisxKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgIAorCQkJeworCQkJCUlSREFfV0FSTklORygiJXMoKSwgbWVtb3J5IHNxdWVlemUsICIKKwkJCQkJICAgICAiZHJvcHBpbmcgZnJhbWUuXG4iLAorCQkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJCisJCQkvKiBNYWtlIHN1cmUgSVAgaGVhZGVyIGdldHMgYWxpZ25lZCAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAxKTsgCisJCQkKKwkJCS8qIENvcHkgZnJhbWUgd2l0aG91dCBDUkMsIENSQyBpcyByZW1vdmVkIGJ5IGhhcmR3YXJlKi8KKwkJCXNrYl9wdXQoc2tiLCBsZW4pOworCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4pOworCisJCQkvKiBNb3ZlIHRvIG5leHQgZnJhbWUgKi8KKwkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisKKwkJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworCQkJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlzZWxmLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQl9CisJfQorCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOwkKKwkJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCXJldHVybiBUUlVFOworfQorCisKKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX3Npcl9oYXJkX3htaXQgKHNrYiwgZGV2KQorICoKKyAqICAgIFRyYW5zbWl0IHRoZSBmcmFtZSEKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2Nfc2lyX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpb2Jhc2U7CisJX191MzIgc3BlZWQ7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwkKKwlzZWxmID0gKHN0cnVjdCBhbGlfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogTWFrZSBzdXJlIHRlc3RzIComIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIE5vdGUgOiB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHNwZWVkIGNoYW5nZXMgYXJlIG5vdCBnb2luZworCSAqIHRvIGNvcnJ1cHQgYW55IG91dGdvaW5nIGZyYW1lLiBMb29rIGF0IG5zYy1pcmNjIGZvciB0aGUgZ29yeQorCSAqIGRldGFpbHMgLSBKZWFuIElJICovCisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZSAqLworCQlpZiAoIXNrYi0+bGVuKSB7CisJCQlhbGlfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOyAKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJfQorCisJLyogSW5pdCB0eCBidWZmZXIgKi8KKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisKKyAgICAgICAgLyogQ29weSBza2IgdG8gdHhfYnVmZiB3aGlsZSB3cmFwcGluZywgc3R1ZmZpbmcgYW5kIG1ha2luZyBDUkMgKi8KKwlzZWxmLT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLCAKKwkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisJCisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CisKKwkvKiBUdXJuIG9uIHRyYW5zbWl0IGZpbmlzaGVkIGludGVycnVwdC4gV2lsbCBmaXJlIGltbWVkaWF0ZWx5ISAgKi8KKwlvdXRiKFVBUlRfSUVSX1RIUkksIGlvYmFzZStVQVJUX0lFUik7IAorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlyZXR1cm4gMDsJCit9CisKKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX25ldF9pb2N0bCAoZGV2LCBycSwgY21kKQorICoKKyAqICAgIFByb2Nlc3MgSU9DVEwgY29tbWFuZHMgZm9yIHRoaXMgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IGFsaV9pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQorCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYgPSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXyAsIGRldi0+bmFtZSwgY21kKTsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NCQU5EV0lEVEg6IC8qIFNldCBiYW5kd2lkdGggKi8KKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgU0lPQ1NCQU5EV0lEVEhcbiIsIF9fRlVOQ1RJT05fXyApOworCQkvKgorCQkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBiZSB1c2VkIGJ5IElyTEFQIHRvIGNoYW5nZSB0aGUKKwkJICogc3BlZWQsIHNvIHdlIHN0aWxsIG11c3QgYWxsb3cgZm9yIHNwZWVkIGNoYW5nZSB3aXRoaW4KKwkJICogaW50ZXJydXB0IGNvbnRleHQuCisJCSAqLworCQlpZiAoIWluX2ludGVycnVwdCgpICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCWFsaV9pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBpcnEtPmlmcl9iYXVkcmF0ZSk7CQkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIFNJT0NTTUVESUFCVVNZOiAvKiBTZXQgbWVkaWEgYnVzeSAqLworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBTSU9DU01FRElBQlVTWVxuIiwgX19GVU5DVElPTl9fICk7CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHNlbGYtPm5ldGRldiwgVFJVRSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6IC8qIENoZWNrIGlmIHdlIGFyZSByZWNlaXZpbmcgcmlnaHQgbm93ICovCisJCUlSREFfREVCVUcoMiwgIiVzKCksIFNJT0NHUkVDRUlWSU5HXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJLyogVGhpcyBpcyBwcm90ZWN0ZWQgKi8KKwkJaXJxLT5pZnJfcmVjZWl2aW5nID0gYWxpX2lyY2NfaXNfcmVjZWl2aW5nKHNlbGYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19pc19yZWNlaXZpbmcgKHNlbGYpCisgKgorICogICAgUmV0dXJuIFRSVUUgaXMgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgYSBmcmFtZQorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1cyA9IEZBTFNFOworCWludCBpb2Jhc2U7CQkKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiBGQUxTRTspOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChzZWxmLT5pby5zcGVlZCA+IDExNTIwMCkgCisJeworCQlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkJCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCQlpZigoaW5iKGlvYmFzZStGSVJfRklGT19GUikgJiAweDNmKSAhPSAwKSAJCQorCQl7CisJCQkvKiBXZSBhcmUgcmVjZWl2aW5nIHNvbWV0aGluZyAqLworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgV2UgYXJlIHJlY2VpdmluZyBzb21ldGhpbmdcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJc3RhdHVzID0gVFJVRTsKKwkJfQorCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsJCQorCX0gCisJZWxzZQorCXsgCisJCXN0YXR1cyA9IChzZWxmLT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUUpOworCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphbGlfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBhbGlfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCXJldHVybiAmc2VsZi0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3N1c3BlbmQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9NRVNTQUdFKCIlcywgU3VzcGVuZGluZ1xuIiwgZHJpdmVyX25hbWUpOworCisJaWYgKHNlbGYtPmlvLnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJYWxpX2lyY2NfbmV0X2Nsb3NlKHNlbGYtPm5ldGRldik7CisKKwlzZWxmLT5pby5zdXNwZW5kZWQgPSAxOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKK30KKworc3RhdGljIHZvaWQgYWxpX2lyY2Nfd2FrZXVwKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQorCWlmICghc2VsZi0+aW8uc3VzcGVuZGVkKQorCQlyZXR1cm47CisJCisJYWxpX2lyY2NfbmV0X29wZW4oc2VsZi0+bmV0ZGV2KTsKKwkKKwlJUkRBX01FU1NBR0UoIiVzLCBXYWtpbmcgdXBcbiIsIGRyaXZlcl9uYW1lKTsKKworCXNlbGYtPmlvLnN1c3BlbmRlZCA9IDA7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorfQorCitzdGF0aWMgaW50IGFsaV9pcmNjX3BtcHJvYyhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKQoreworICAgICAgICBzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiKikgZGV2LT5kYXRhOworICAgICAgICAKKyAgICAgICAgSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKyAgICAgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJxc3QpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBNX1NVU1BFTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlfaXJjY19zdXNwZW5kKHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQTV9SRVNVTUU6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlfaXJjY193YWtldXAoc2VsZik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIElSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKyAgICAgICAgCisJcmV0dXJuIDA7Cit9CisKKworLyogQUxpIENoaXAgRnVuY3Rpb24gKi8KKworc3RhdGljIHZvaWQgU2V0Q09NSW50ZXJydXB0cyhzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgLCB1bnNpZ25lZCBjaGFyIGVuYWJsZSkKK3sKKwkKKwl1bnNpZ25lZCBjaGFyIG5ld01hc2s7CisJCisJaW50IGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOyAvKiBvciBzaXJfYmFzZSAqLworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0gKCBFbmFibGUgPSAlZCApXG4iLCBfX0ZVTkNUSU9OX18gLCBlbmFibGUpOwkKKwkKKwkvKiBFbmFibGUgdGhlIGludGVycnVwdCB3aGljaCB3ZSB3aXNoIHRvICovCisJaWYgKGVuYWJsZSl7CisJCWlmIChzZWxmLT5pby5kaXJlY3Rpb24gPT0gSU9fWE1JVCkKKwkJeworCQkJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKSAvKiBGSVIsIE1JUiAqLworCQkJeworCQkJCW5ld01hc2sgPSBzZWxmLT5pZXI7CisJCQl9CisJCQllbHNlIC8qIFNJUiAqLworCQkJeworCQkJCW5ld01hc2sgPSBVQVJUX0lFUl9USFJJIHwgVUFSVF9JRVJfUkRJOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKSAvKiBGSVIsIE1JUiAqLworCQkJeworCQkJCW5ld01hc2sgPSBzZWxmLT5pZXI7CisJCQl9CisJCQllbHNlIC8qIFNJUiAqLworCQkJeworCQkJCW5ld01hc2sgPSBVQVJUX0lFUl9SREk7CisJCQl9CisJCX0KKwl9CisJZWxzZSAvKiBEaXNhYmxlIGFsbCB0aGUgaW50ZXJydXB0cyAqLworCXsKKwkJbmV3TWFzayA9IDB4MDA7CisKKwl9CisKKwkvL1NJUiBhbmQgRklSIGhhcyBkaWZmZXJlbnQgcmVnaXN0ZXJzCisJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKQorCXsJCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQlvdXRiKG5ld01hc2ssIGlvYmFzZStGSVJfSUVSKTsKKwl9CisJZWxzZQorCQlvdXRiKG5ld01hc2ssIGlvYmFzZStVQVJUX0lFUik7CisJCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKK30KKworc3RhdGljIHZvaWQgU0lSMkZJUihpbnQgaW9iYXNlKQoreworCS8vdW5zaWduZWQgY2hhciB0bXA7CisJCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJLyogQWxyZWFkeSBwcm90ZWN0ZWQgKGNoYW5nZV9zcGVlZCgpIG9yIHNldHVwKCkpLCBubyBuZWVkIHRvIGxvY2suCisJICogSmVhbiBJSSAqLworCQorCW91dGIoMHgyOCwgaW9iYXNlK1VBUlRfTUNSKTsKKwlvdXRiKDB4NjgsIGlvYmFzZStVQVJUX01DUik7CisJb3V0YigweDg4LCBpb2Jhc2UrVUFSVF9NQ1IpOwkJCisJCisJb3V0YigweDYwLCBpb2Jhc2UrRklSX01DUik7IAkvKiAgTWFzdGVyIFJlc2V0ICovCisJb3V0YigweDIwLCBpb2Jhc2UrRklSX01DUik7IAkvKiAgTWFzdGVyIEludGVycnVwdCBFbmFibGUgKi8KKwkKKwkvL3RtcCA9IGluYihpb2Jhc2UrRklSX0xDUl9CKTsJLyogU0lQIGVuYWJsZSAqLworCS8vdG1wIHw9IDB4MjA7CisJLy9vdXRiKHRtcCwgaW9iYXNlK0ZJUl9MQ1JfQik7CQorCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKK30KKworc3RhdGljIHZvaWQgRklSMlNJUihpbnQgaW9iYXNlKQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJLyogQWxyZWFkeSBwcm90ZWN0ZWQgKGNoYW5nZV9zcGVlZCgpIG9yIHNldHVwKCkpLCBubyBuZWVkIHRvIGxvY2suCisJICogSmVhbiBJSSAqLworCQorCW91dGIoMHgyMCwgaW9iYXNlK0ZJUl9NQ1IpOyAJLyogSVJRIHRvIGxvdyAqLworCW91dGIoMHgwMCwgaW9iYXNlK1VBUlRfSUVSKTsgCQorCQkKKwlvdXRiKDB4QTAsIGlvYmFzZStGSVJfTUNSKTsgCS8qIERvbid0IHNldCBtYXN0ZXIgcmVzZXQgKi8KKwlvdXRiKDB4MDAsIGlvYmFzZStVQVJUX0ZDUik7CisJb3V0YigweDA3LCBpb2Jhc2UrVUFSVF9GQ1IpOwkJCisJCisJdmFsID0gaW5iKGlvYmFzZStVQVJUX1JYKTsKKwl2YWwgPSBpbmIoaW9iYXNlK1VBUlRfTFNSKTsKKwl2YWwgPSBpbmIoaW9iYXNlK1VBUlRfTVNSKTsKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKK30KKworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gS29uZyA8YmVuamFtaW5fa29uZ0BhbGkuY29tLnR3PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTGkgRklSIENvbnRyb2xsZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkJhc2UgSS9PIGFkZHJlc3NlcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIGxpbmVzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG1hLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJETUEgY2hhbm5lbHMiKTsKKworbW9kdWxlX2luaXQoYWxpX2lyY2NfaW5pdCk7Cittb2R1bGVfZXhpdChhbGlfaXJjY19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuaCBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDg5YzY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5oCkBAIC0wLDAgKzEsMjMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGFsaS1pcmNjLmgKKyAqIFZlcnNpb246ICAgICAgIDAuNQorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgQUxJIE0xNTM1RCBhbmQgTTE1NDNDIEZJUiBDb250cm9sbGVyCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBCZW5qYW1pbiBLb25nIDxiZW5qYW1pbl9rb25nQGFsaS5jb20udHc+CisgKiBDcmVhdGVkIGF0OiAgICAyMDAwLzEwLzE2IDAzOjQ2UE0KKyAqIE1vZGlmaWVkIGF0OiAgIDIwMDEvMS8zIDAyOjU2UE0KKyAqIE1vZGlmaWVkIGJ5OiAgIEJlbmphbWluIEtvbmcgPGJlbmphbWluX2tvbmdAYWxpLmNvbS50dz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMjAwMCBCZW5qYW1pbiBLb25nIDxiZW5qYW1pbl9rb25nQGFsaS5jb20udHc+CisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFMSV9JUkNDX0gKKyNkZWZpbmUgQUxJX0lSQ0NfSAorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIFNJUiBSZWdpc3RlciAqLworLyogVXNyIGRlZmluaXRpb24gb2YgbGludXgvc2VyaWFsX3JlZy5oICovCisKKy8qIEZJUiBSZWdpc3RlciAqLworI2RlZmluZSBCQU5LMAkJMHgyMAorI2RlZmluZSBCQU5LMQkJMHgyMQorI2RlZmluZSBCQU5LMgkJMHgyMgorI2RlZmluZSBCQU5LMwkJMHgyMworCisjZGVmaW5lIEZJUl9NQ1IJCTB4MDcJLyogTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworLyogQmFuayAwICovCisjZGVmaW5lIEZJUl9EUgkJMHgwMAkvKiBBbGlhcyAwLCBGSVIgRGF0YSBSZWdpc3RlciAoUi9XKSAqLyAKKyNkZWZpbmUgRklSX0lFUgkJMHgwMQkvKiBBbGlhcyAxLCBGSVIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfSUlSCQkweDAyCS8qIEFsaWFzIDIsIEZJUiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKFJlYWQgb25seSkgKi8KKyNkZWZpbmUgRklSX0xDUl9BCTB4MDMJLyogQWxpYXMgMywgRklSIExpbmUgQ29udHJvbCBSZWdpc3RlciBBIChSL1cpICovCisjZGVmaW5lIEZJUl9MQ1JfQgkweDA0CS8qIEFsaWFzIDQsIEZJUiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgQiAoUi9XKSAqLworI2RlZmluZSBGSVJfTFNSCQkweDA1CS8qIEFsaWFzIDUsIEZJUiBMaW5lIFN0YXR1cyBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfQlNSCQkweDA2CS8qIEFsaWFzIDYsIEZJUiBCdXMgU3RhdHVzIFJlZ2lzdGVyIChSZWFkIG9ubHkpICovCisKKworCS8qIEFsaWFzIDEgKi8KKwkjZGVmaW5lCUlFUl9GSUZPCTB4MTAJLyogRklSIEZJRk8gSW50ZXJydXB0IEVuYWJsZSAqLwkKKwkjZGVmaW5lCUlFUl9USU1FUgkweDIwIAkvKiBUaW1lciBJbnRlcnJ1cHQgRW5hYmxlICovIAorCSNkZWZpbmUJSUVSX0VPTQkJMHg0MAkvKiBFbmQgb2YgTWVzc2FnZSBJbnRlcnJ1cHQgRW5hYmxlICovCisJI2RlZmluZSBJRVJfQUNUCQkweDgwCS8qIEFjdGl2ZSBGcmFtZSBJbnRlcnJ1cHQgRW5hYmxlICovCisJCisJLyogQWxpYXMgMiAqLworCSNkZWZpbmUgSUlSX0ZJRk8JMHgxMAkvKiBGSVIgRklGTyBJbnRlcnJ1cHQgKi8KKwkjZGVmaW5lIElJUl9USU1FUgkweDIwCS8qIFRpbWVyIEludGVycnVwdCAqLworCSNkZWZpbmUgSUlSX0VPTQkJMHg0MAkvKiBFbmQgb2YgTWVzc2FnZSBJbnRlcnJ1cHQgKi8KKwkjZGVmaW5lIElJUl9BQ1QJCTB4ODAJLyogQWN0aXZlIEZyYW1lIEludGVycnVwdCAqLwkKKwkKKwkvKiBBbGlhcyAzICovCisJI2RlZmluZSBMQ1JfQV9GSUZPX1JFU0VUIDB4ODAJLyogRklGTyBSZXNldCAqLworCisJLyogQWxpYXMgNCAqLworCSNkZWZpbmUJTENSX0JfQlcJMHgxMAkvKiBCcmljayBXYWxsICovCisJI2RlZmluZSBMQ1JfQl9TSVAJMHgyMAkvKiBTSVAgRW5hYmxlICovCisJI2RlZmluZQlMQ1JfQl9UWF9NT0RFIAkweDQwCS8qIFRyYW5zbWl0IE1vZGUgKi8KKwkjZGVmaW5lIExDUl9CX1JYX01PREUJMHg4MAkvKiBSZWNlaXZlIE1vZGUgKi8KKwkKKwkvKiBBbGlhcyA1ICovCQorCSNkZWZpbmUgTFNSX0ZJUl9MU0EJMHgwMAkvKiBGSVIgTGluZSBTdGF0dXMgQWRkcmVzcyAqLworCSNkZWZpbmUgTFNSX0ZSQU1FX0FCT1JUCTB4MDgJLyogRnJhbWUgQWJvcnQgKi8KKwkjZGVmaW5lIExTUl9DUkNfRVJST1IJMHgxMAkvKiBDUkMgRXJyb3IgKi8KKwkjZGVmaW5lIExTUl9TSVpFX0VSUk9SCTB4MjAJLyogU2l6ZSBFcnJvciAqLworCSNkZWZpbmUgTFNSX0ZSQU1FX0VSUk9SCTB4NDAJLyogRnJhbWUgRXJyb3IgKi8KKwkjZGVmaW5lIExTUl9GSUZPX1VSCTB4ODAJLyogRklGTyBVbmRlcnJ1biAqLworCSNkZWZpbmUgTFNSX0ZJRk9fT1IJMHg4MAkvKiBGSUZPIE92ZXJydW4gKi8KKwkJCisJLyogQWxpYXMgNiAqLworCSNkZWZpbmUgQlNSX0ZJRk9fTk9UX0VNUFRZCTB4ODAJLyogRklGTyBOb3QgRW1wdHkgKi8KKwkKKy8qIEJhbmsgMSAqLworI2RlZmluZQlGSVJfQ1IJCTB4MDAgCS8qIEFsaWFzIDAsIEZJUiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9GSUZPX1RSCTB4MDEgICAJLyogQWxpYXMgMSwgRklSIEZJRk8gVGhyZXNob2xkIFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9ETUFfVFIJMHgwMgkvKiBBbGlhcyAyLCBGSVIgRE1BIFRocmVzaG9sZCBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfVElNRVJfSUlSCTB4MDMJLyogQWxpYXMgMywgRklSIFRpbWVyIGludGVycnVwdCBpbnRlcnZhbCByZWdpc3RlciAoVy9PKSAqLworI2RlZmluZSBGSVJfRklGT19GUgkweDAzCS8qIEFsaWFzIDMsIEZJUiBGSUZPIEZsYWcgcmVnaXN0ZXIgKFIvTykgKi8KKyNkZWZpbmUgRklSX0ZJRk9fUkFSCTB4MDQgCS8qIEFsaWFzIDQsIEZJUiBGSUZPIFJlYWQgQWRkcmVzcyByZWdpc3RlciAoUi9PKSAqLworI2RlZmluZSBGSVJfRklGT19XQVIJMHgwNQkvKiBBbGlhcyA1LCBGSVIgRklGTyBXcml0ZSBBZGRyZXNzIHJlZ2lzdGVyIChSL08pICovCisjZGVmaW5lIEZJUl9UUgkJMHgwNgkvKiBBbGlhcyA2LCBUZXN0IFJFZ2lzdGVyIChXL08pICovCisKKwkvKiBBbGlhcyAwICovCisJI2RlZmluZSBDUl9ETUFfRU4JMHgwMQkvKiBETUEgRW5hYmxlICovCisJI2RlZmluZSBDUl9ETUFfQlVSU1QJMHgwMgkvKiBETUEgQnVyc3QgTW9kZSAqLworCSNkZWZpbmUgQ1JfVElNRVJfRU4gCTB4MDgJLyogVGltZXIgRW5hYmxlICovCisJCisJLyogQWxpYXMgMyAqLworCSNkZWZpbmUgVElNRVJfSUlSXzUwMAkweDAwCS8qIDUwMCB1cyAqLworCSNkZWZpbmUgVElNRVJfSUlSXzFtcwkweDAxCS8qIDEgICBtcyAqLworCSNkZWZpbmUgVElNRVJfSUlSXzJtcwkweDAyCS8qIDIgICBtcyAqLworCSNkZWZpbmUgVElNRVJfSUlSXzRtcwkweDAzCS8qIDQgICBtcyAqLworCQorLyogQmFuayAyICovCisjZGVmaW5lIEZJUl9JUkRBX0NSCTB4MDAJLyogQWxpYXMgMCwgSXJEQSBDb250cm9sIFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9CT0ZfQ1IJMHgwMQkvKiBBbGlhcyAxLCBCT0YgQ291bnQgUmVnaXN0ZXIgKFIvVykgKi8KKyNkZWZpbmUgRklSX0JXX0NSCTB4MDIJLyogQWxpYXMgMiwgQnJpY2sgV2FsbCBDb3VudCBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfVFhfRFNSX0hJCTB4MDMJLyogQWxpYXMgMywgVFggRGF0YSBTaXplIFJlZ2lzdGVyIChoaWdoKSAoUi9XKSAqLworI2RlZmluZSBGSVJfVFhfRFNSX0xPCTB4MDQJLyogQWxpYXMgNCwgVFggRGF0YSBTaXplIFJlZ2lzdGVyIChsb3cpIChSL1cpICovCisjZGVmaW5lIEZJUl9SWF9EU1JfSEkJMHgwNQkvKiBBbGlhcyA1LCBSWCBEYXRhIFNpemUgUmVnaXN0ZXIgKGhpZ2gpIChSL1cpICovCisjZGVmaW5lIEZJUl9SWF9EU1JfTE8JMHgwNgkvKiBBbGlhcyA2LCBSWCBEYXRhIFNpemUgUmVnaXN0ZXIgKGxvdykgKFIvVykgKi8KKwkKKwkvKiBBbGlhcyAwICovCisJI2RlZmluZSBJUkRBX0NSX0hETEMxMTUyIDB4ODAJLyogMS4xNTJNYnBzIEhETEMgU2VsZWN0ICovCisJI2RlZmluZSBJUkRBX0NSX0NSQwkwWDQwCS8qIENSQyBTZWxlY3QuICovCisJI2RlZmluZSBJUkRBX0NSX0hETEMJMHgyMAkvKiBIRExDIHNlbGVjdC4gKi8KKwkjZGVmaW5lIElSREFfQ1JfSFBfTU9ERSAweDEwCS8qIEhQIG1vZGUgKHJlYWQgb25seSkgKi8KKwkjZGVmaW5lIElSREFfQ1JfU0RfU1QJMHgwOAkvKiBTRC9NT0RFIFN0YXRlLiAgKi8KKwkjZGVmaW5lIElSREFfQ1JfRklSX1NJTiAweDA0CS8qIEZJUiBTSU4gU2VsZWN0LiAqLworCSNkZWZpbmUgSVJEQV9DUl9JVFRYXzAJMHgwMgkvKiBTT1VUIFN0YXRlLiBJUlRYIGZvcmNlIHRvIDAgKi8KKwkjZGVmaW5lIElSREFfQ1JfSVRUWF8xCTB4MDMJLyogU09VVCBTdGF0ZS4gSVJUWCBmb3JjZSB0byAxICovCisJCisvKiBCYW5rIDMgKi8KKyNkZWZpbmUgRklSX0lEX1ZSCTB4MDAJLyogQWxpYXMgMCwgRklSIElEIFZlcnNpb24gUmVnaXN0ZXIgKFIvTykgKi8KKyNkZWZpbmUgRklSX01PRFVMRV9DUgkweDAxCS8qIEFsaWFzIDEsIEZJUiBNb2R1bGUgQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfSU9fQkFTRV9ISQkweDAyCS8qIEFsaWFzIDIsIEZJUiBIaWdoZXIgSS9PIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAoUi9PKSAqLworI2RlZmluZSBGSVJfSU9fQkFTRV9MTwkweDAzCS8qIEFsaWFzIDMsIEZJUiBMb3dlciBJL08gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIChSL08pICovCisjZGVmaW5lIEZJUl9JUlFfQ1IJMHgwNAkvKiBBbGlhcyA0LCBGSVIgSVJRIENoYW5uZWwgUmVnaXN0ZXIgKFIvTykgKi8KKyNkZWZpbmUgRklSX0RNQV9DUgkweDA1CS8qIEFsaWFzIDUsIEZJUiBETUEgQ2hhbm5lbCBSZWdpc3RlciAoUi9PKSAqLworCitzdHJ1Y3QgYWxpX2NoaXAgeworCWNoYXIgKm5hbWU7CisJaW50IGNmZ1syXTsKKwl1bnNpZ25lZCBjaGFyIGVudHIxOworCXVuc2lnbmVkIGNoYXIgZW50cjI7CisJdW5zaWduZWQgY2hhciBjaWRfaW5kZXg7CisJdW5zaWduZWQgY2hhciBjaWRfdmFsdWU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBhbGlfY2hpcCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworCWludCAoKmluaXQpKHN0cnVjdCBhbGlfY2hpcCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOyAKK307Cit0eXBlZGVmIHN0cnVjdCBhbGlfY2hpcCBhbGlfY2hpcF90OworCisKKy8qIERNQSBtb2RlcyBuZWVkZWQgKi8KKyNkZWZpbmUgRE1BX1RYX01PREUgICAgIDB4MDggICAgLyogTWVtIHRvIEkvTywgKyssIGRlbWFuZC4gKi8KKyNkZWZpbmUgRE1BX1JYX01PREUgICAgIDB4MDQgICAgLyogSS9PIHRvIG1lbSwgKyssIGRlbWFuZC4gKi8KKworI2RlZmluZSBNQVhfVFhfV0lORE9XIAk3CisjZGVmaW5lIE1BWF9SWF9XSU5ET1cgCTcKKworI2RlZmluZSBUWF9GSUZPX1RocmVzaG9sZAk4CisjZGVmaW5lIFJYX0ZJRk9fVGhyZXNob2xkCTEKKyNkZWZpbmUgVFhfRE1BX1RocmVzaG9sZAkxCisjZGVmaW5lIFJYX0RNQV9UaHJlc2hvbGQJMQorCisvKiBGb3Igc3RvcmluZyBlbnRyaWVzIGluIHRoZSBzdGF0dXMgRklGTyAqLworCitzdHJ1Y3Qgc3RfZmlmb19lbnRyeSB7CisJaW50IHN0YXR1czsKKwlpbnQgbGVuOworfTsKKworc3RydWN0IHN0X2ZpZm8geworCXN0cnVjdCBzdF9maWZvX2VudHJ5IGVudHJpZXNbTUFYX1JYX1dJTkRPV107CisJaW50IHBlbmRpbmdfYnl0ZXM7CisJaW50IGhlYWQ7CisJaW50IHRhaWw7CisJaW50IGxlbjsKK307CisKK3N0cnVjdCBmcmFtZV9jYiB7CisJdm9pZCAqc3RhcnQ7IC8qIFN0YXJ0IG9mIGZyYW1lIGluIERNQSBtZW0gKi8KKwlpbnQgbGVuOyAgICAgLyogTGVuZ2h0IG9mIGZyYW1lIGluIERNQSBtZW0gKi8KK307CisKK3N0cnVjdCB0eF9maWZvIHsKKwlzdHJ1Y3QgZnJhbWVfY2IgcXVldWVbTUFYX1RYX1dJTkRPV107IC8qIEluZm8gYWJvdXQgZnJhbWVzIGluIHF1ZXVlICovCisJaW50ICAgICAgICAgICAgIHB0cjsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50bHkgYmVpbmcgc2VudCAqLworCWludCAgICAgICAgICAgICBsZW47ICAgICAgICAgICAgICAgICAgLyogTGVuZ2h0IG9mIHF1ZXVlICovCisJaW50ICAgICAgICAgICAgIGZyZWU7ICAgICAgICAgICAgICAgICAvKiBOZXh0IGZyZWUgc2xvdCAqLworCXZvaWQgICAgICAgICAgICp0YWlsOyAgICAgICAgICAgICAgICAgLyogTmV4dCBmcmVlIHN0YXJ0IGluIERNQSBtZW0gKi8KK307CisKKy8qIFByaXZhdGUgZGF0YSBmb3IgZWFjaCBpbnN0YW5jZSAqLworc3RydWN0IGFsaV9pcmNjX2NiIHsKKworCXN0cnVjdCBzdF9maWZvIHN0X2ZpZm87ICAgIC8qIEluZm8gYWJvdXQgcmVjZWl2ZWQgZnJhbWVzICovCisJc3RydWN0IHR4X2ZpZm8gdHhfZmlmbzsgICAgLyogSW5mbyBhYm91dCBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJCisJc3RydWN0IGlybGFwX2NiICppcmxhcDsgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCisJCisJY2hpcGlvX3QgaW87ICAgICAgICAgICAgICAgLyogSXJEQSBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCisJaW9idWZmX3QgdHhfYnVmZjsgICAgICAgICAgLyogVHJhbnNtaXQgYnVmZmVyICovCisJaW9idWZmX3QgcnhfYnVmZjsgICAgICAgICAgLyogUmVjZWl2ZSBidWZmZXIgKi8KKwlkbWFfYWRkcl90IHR4X2J1ZmZfZG1hOworCWRtYV9hZGRyX3QgcnhfYnVmZl9kbWE7CisKKwlfX3U4IGllcjsgICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisJCisJX191OCBJbnRlcnJ1cHRJRDsJICAgLyogSW50ZXJydXB0IElEICovCQorCV9fdTggQnVzU3RhdHVzOwkJICAgLyogQnVzIFN0YXR1cyAqLwkKKwlfX3U4IExpbmVTdGF0dXM7CSAgIC8qIExpbmUgU3RhdHVzICovCQorCQorCXVuc2lnbmVkIGNoYXIgcmN2RnJhbWVzT3ZlcmZsb3c7CisJCQorCXN0cnVjdCB0aW1ldmFsIHN0YW1wOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCXNwaW5sb2NrX3QgbG9jazsgICAgICAgICAgIC8qIEZvciBzZXJpYWxpemluZyBvcGVyYXRpb25zICovCisJCisJX191MzIgbmV3X3NwZWVkOworCWludCBpbmRleDsgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGluZGV4ICovCisJCisJdW5zaWduZWQgY2hhciBmaWZvX29wdGlfYnVmOworCisgICAgICAgIHN0cnVjdCBwbV9kZXYgKmRldjsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfYmFuayhpbnQgaW9iYXNlLCBpbnQgYmFuaykKK3sKKwkJb3V0YihiYW5rLCBpb2Jhc2UrRklSX01DUik7Cit9CisKKyNlbmRpZiAvKiBBTElfSVJDQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzMWQ0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKgorICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCisgKglBdTEwMDAgSXJEQSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgCXBwb3BvdkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgQVUxMDAwX0lSQ0NfSAorI2RlZmluZSBBVTEwMDBfSVJDQ19ICisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgTlVNX0lSX0lGRiAgICAgICAgICAxCisjZGVmaW5lIE5VTV9JUl9ERVNDICAgICAgICA2NAorI2RlZmluZSBSSU5HX1NJWkVfNCAgICAgICAweDAKKyNkZWZpbmUgUklOR19TSVpFXzE2ICAgICAgMHgzCisjZGVmaW5lIFJJTkdfU0laRV82NCAgICAgIDB4RgorI2RlZmluZSBNQVhfTlVNX0lSX0RFU0MgICAgNjQKKyNkZWZpbmUgTUFYX0JVRl9TSVpFICAgICAyMDQ4CisKKyNkZWZpbmUgQlBTXzExNTIwMCAgICAgICAgICAwCisjZGVmaW5lIEJQU181NzYwMCAgICAgICAgICAgMQorI2RlZmluZSBCUFNfMzg0MDAgICAgICAgICAgIDIKKyNkZWZpbmUgQlBTXzE5MjAwICAgICAgICAgICA1CisjZGVmaW5lIEJQU185NjAwICAgICAgICAgICAxMQorI2RlZmluZSBCUFNfMjQwMCAgICAgICAgICAgNDcKKworLyogUmluZyBkZXNjcmlwdG9yIGZsYWdzICovCisjZGVmaW5lIEFVX09XTiAgICAgICAgICAgKDE8PDcpIC8qIHR4LHJ4ICovCisKKyNkZWZpbmUgSVJfRElTX0NSQyAgICAgICAoMTw8NikgLyogdHggKi8KKyNkZWZpbmUgSVJfQkFEX0NSQyAgICAgICAoMTw8NSkgLyogdHggKi8KKyNkZWZpbmUgSVJfTkVFRF9QVUxTRSAgICAoMTw8NCkgLyogdHggKi8KKyNkZWZpbmUgSVJfRk9SQ0VfVU5ERVIgICAoMTw8MykgLyogdHggKi8KKyNkZWZpbmUgSVJfRElTQUJMRV9UWCAgICAoMTw8MikgLyogdHggKi8KKyNkZWZpbmUgSVJfSFdfVU5ERVIgICAgICAoMTw8MCkgLyogdHggKi8KKyNkZWZpbmUgSVJfVFhfRVJST1IgICAgICAoSVJfRElTX0NSQ3xJUl9CQURfQ1JDfElSX0hXX1VOREVSKQorCisjZGVmaW5lIElSX1BIWV9FUlJPUiAgICAgKDE8PDYpIC8qIHJ4ICovCisjZGVmaW5lIElSX0NSQ19FUlJPUiAgICAgKDE8PDUpIC8qIHJ4ICovCisjZGVmaW5lIElSX01BWF9MRU4gICAgICAgKDE8PDQpIC8qIHJ4ICovCisjZGVmaW5lIElSX0ZJRk9fT1ZFUiAgICAgKDE8PDMpIC8qIHJ4ICovCisjZGVmaW5lIElSX1NJUl9FUlJPUiAgICAgKDE8PDIpIC8qIHJ4ICovCisjZGVmaW5lIElSX1JYX0VSUk9SICAgICAgKElSX1BIWV9FUlJPUnxJUl9DUkNfRVJST1J8IFwKKwkJSVJfTUFYX0xFTnxJUl9GSUZPX09WRVJ8SVJfU0lSX0VSUk9SKQorCit0eXBlZGVmIHN0cnVjdCBkYl9kZXN0IHsKKwlzdHJ1Y3QgZGJfZGVzdCAqcG5leHQ7CisJdm9sYXRpbGUgdTMyICp2YWRkcjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworfSBkYl9kZXN0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgcmluZ19kZXNjIHsKKwl1OCBjb3VudF8wOyAgICAgICAgICAgICAgIC8qIDc6MCAgKi8KKwl1OCBjb3VudF8xOyAgICAgICAgICAgICAgIC8qIDEyOjggKi8KKwl1OCByZXNlcnZlZDsKKwl1OCBmbGFnczsKKwl1OCBhZGRyXzA7ICAgICAgICAgICAgICAgIC8qIDc6MCAgICovCisJdTggYWRkcl8xOyAgICAgICAgICAgICAgICAvKiAxNTo4ICAqLworCXU4IGFkZHJfMjsgICAgICAgICAgICAgICAgLyogMjM6MTYgKi8KKwl1OCBhZGRyXzM7ICAgICAgICAgICAgICAgIC8qIDMxOjI0ICovCit9IHJpbmdfZGVzdF90OworCisKKy8qIFByaXZhdGUgZGF0YSBmb3IgZWFjaCBpbnN0YW5jZSAqLworc3RydWN0IGF1MWtfcHJpdmF0ZSB7CisKKwlkYl9kZXN0X3QgKnBEQmZyZWU7CisJZGJfZGVzdF90IGRiWzIqTlVNX0lSX0RFU0NdOworCXZvbGF0aWxlIHJpbmdfZGVzdF90ICpyeF9yaW5nW05VTV9JUl9ERVNDXTsKKwl2b2xhdGlsZSByaW5nX2Rlc3RfdCAqdHhfcmluZ1tOVU1fSVJfREVTQ107CisJZGJfZGVzdF90ICpyeF9kYl9pbnVzZVtOVU1fSVJfREVTQ107CisJZGJfZGVzdF90ICp0eF9kYl9pbnVzZVtOVU1fSVJfREVTQ107CisJdTMyIHJ4X2hlYWQ7CisJdTMyIHR4X2hlYWQ7CisJdTMyIHR4X3RhaWw7CisJdTMyIHR4X2Z1bGw7CisKKwlpb2J1ZmZfdCByeF9idWZmOworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwkKKwlzdHJ1Y3QgdGltZXZhbCBzdGFtcDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJc3RydWN0IHFvc19pbmZvCQlxb3M7CisJc3RydWN0IGlybGFwX2NiCQkqaXJsYXA7CisJCisJdTggb3BlbjsKKwl1MzIgc3BlZWQ7CisJdTMyIG5ld3NwZWVkOworCQorCXUzMiBpbnRyX3dvcmtfZG9uZTsgLyogbnVtYmVyIG9mIFJ4IGFuZCBUeCBwa3RzIHByb2Nlc3NlZCBpbiB0aGUgaXNyICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwlzcGlubG9ja190IGxvY2s7ICAgICAgICAgICAvKiBGb3Igc2VyaWFsaXppbmcgb3BlcmF0aW9ucyAqLworICAgICAgICBzdHJ1Y3QgcG1fZGV2ICpkZXY7Cit9OworI2VuZGlmIC8qIEFVMTAwMF9JUkNDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYXUxa19pci5jIGIvZHJpdmVycy9uZXQvaXJkYS9hdTFrX2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiMTk4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYXUxa19pci5jCkBAIC0wLDAgKzEsODUxIEBACisvKgorICogQWxjaGVteSBTZW1pIEF1MTAwMCBJckRBIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIAlwcG9wb3ZAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXUxMDAwLmg+CisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19QQjEwMDApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfUEIxMTAwKQorI2luY2x1ZGUgPGFzbS9wYjEwMDAuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX01JUFNfREIxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTEwMCkKKyNpbmNsdWRlIDxhc20vZGIxeDAwLmg+CisjZWxzZSAKKyNlcnJvciBhdTFrX2lyOiB1bnN1cHBvcnRlZCBib2FyZAorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKyNpbmNsdWRlICJhdTEwMDBfaXJjYy5oIgorCitzdGF0aWMgaW50IGF1MWtfaXJkYV9uZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgYXUxa19pcmRhX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBhdTFrX2lyZGFfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXUxa19pcmRhX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgYXUxa19pcmRhX3J4KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgYXUxa19pcmRhX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZCBhdTFrX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF1MWtfaXJkYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgYXUxa19pcmRhX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOworc3RhdGljIGludCBhdTFrX2lyZGFfc2V0X3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzcGVlZCk7CisKK3N0YXRpYyB2b2lkICpkbWFfYWxsb2Moc2l6ZV90LCBkbWFfYWRkcl90ICopOworc3RhdGljIHZvaWQgZG1hX2ZyZWUodm9pZCAqLCBzaXplX3QpOworCitzdGF0aWMgaW50IHFvc19tdHRfYml0cyA9IDB4MDc7ICAvKiAxIG1zIG9yIG1vcmUgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaXJfZGV2c1tOVU1fSVJfSUZGXTsKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKyAgICAiYXUxa19pcmNjOjEuMiBwcG9wb3ZAbXZpc3RhLmNvbVxuIjsKKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19EQjExMDApCitzdGF0aWMgQkNTUiAqIGNvbnN0IGJjc3IgPSAoQkNTUiAqKTB4QUUwMDAwMDA7CisjZW5kaWYKKworc3RhdGljIERFRklORV9TUElOTE9DSyhpcl9sb2NrKTsKKworLyoKKyAqIElyREEgcGVyaXBoZXJhbCBidWcuIFlvdSBoYXZlIHRvIHJlYWQgdGhlIHJlZ2lzdGVyCisgKiB0d2ljZSB0byBnZXQgdGhlIHJpZ2h0IHZhbHVlLgorICovCit1MzIgcmVhZF9pcl9yZWcodTMyIGFkZHIpIAoreyAKKwlyZWFkbChhZGRyKTsKKwlyZXR1cm4gcmVhZGwoYWRkcik7Cit9CisKKworLyoKKyAqIEJ1ZmZlciBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiByb3V0aW5lcy4gVGhlIGJ1ZmZlciBkZXNjcmlwdG9yIHJldHVybmVkCisgKiBoYXMgdGhlIHZpcnR1YWwgYW5kIGRtYSBhZGRyZXNzIG9mIGEgYnVmZmVyIHN1aXRhYmxlIGZvciAKKyAqIGJvdGgsIHJlY2VpdmUgYW5kIHRyYW5zbWl0IG9wZXJhdGlvbnMuCisgKi8KK3N0YXRpYyBkYl9kZXN0X3QgKkdldEZyZWVEQihzdHJ1Y3QgYXUxa19wcml2YXRlICphdXApCit7CisJZGJfZGVzdF90ICpwREI7CisJcERCID0gYXVwLT5wREJmcmVlOworCisJaWYgKHBEQikgeworCQlhdXAtPnBEQmZyZWUgPSBwREItPnBuZXh0OworCX0KKwlyZXR1cm4gcERCOworfQorCitzdGF0aWMgdm9pZCBSZWxlYXNlREIoc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwLCBkYl9kZXN0X3QgKnBEQikKK3sKKwlkYl9kZXN0X3QgKnBEQmZyZWUgPSBhdXAtPnBEQmZyZWU7CisJaWYgKHBEQmZyZWUpCisJCXBEQmZyZWUtPnBuZXh0ID0gcERCOworCWF1cC0+cERCZnJlZSA9IHBEQjsKK30KKworCisvKgorICBETUEgbWVtb3J5IGFsbG9jYXRpb24sIGRlcml2ZWQgZnJvbSBwY2lfYWxsb2NfY29uc2lzdGVudC4KKyAgSG93ZXZlciwgdGhlIEF1MTAwMCBkYXRhIGNhY2hlIGlzIGNvaGVyZW50ICh3aGVuIHByb2dyYW1tZWQKKyAgc28pLCB0aGVyZWZvcmUgd2UgcmV0dXJuIEtTRUcwIGFkZHJlc3MsIG5vdCBLU0VHMS4KKyovCitzdGF0aWMgdm9pZCAqZG1hX2FsbG9jKHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICogZG1hX2hhbmRsZSkKK3sKKwl2b2lkICpyZXQ7CisJaW50IGdmcCA9IEdGUF9BVE9NSUMgfCBHRlBfRE1BOworCisJcmV0ID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhnZnAsIGdldF9vcmRlcihzaXplKSk7CisKKwlpZiAocmV0ICE9IE5VTEwpIHsKKwkJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CisJCSpkbWFfaGFuZGxlID0gdmlydF90b19idXMocmV0KTsKKwkJcmV0ID0gKHZvaWQgKilLU0VHMEFERFIocmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCBkbWFfZnJlZSh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUpCit7CisJdmFkZHIgPSAodm9pZCAqKUtTRUcwQUREUih2YWRkcik7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdmFkZHIsIGdldF9vcmRlcihzaXplKSk7Cit9CisKKworc3RhdGljIHZvaWQgCitzZXR1cF9od19yaW5ncyhzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAsIHUzMiByeF9iYXNlLCB1MzIgdHhfYmFzZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaTxOVU1fSVJfREVTQzsgaSsrKSB7CisJCWF1cC0+cnhfcmluZ1tpXSA9ICh2b2xhdGlsZSByaW5nX2Rlc3RfdCAqKSAKKwkJCShyeF9iYXNlICsgc2l6ZW9mKHJpbmdfZGVzdF90KSppKTsKKwl9CisJZm9yIChpPTA7IGk8TlVNX0lSX0RFU0M7IGkrKykgeworCQlhdXAtPnR4X3JpbmdbaV0gPSAodm9sYXRpbGUgcmluZ19kZXN0X3QgKikgCisJCQkodHhfYmFzZSArIHNpemVvZihyaW5nX2Rlc3RfdCkqaSk7CisJfQorfQorCitzdGF0aWMgaW50IGF1MWtfaXJkYV9pbml0KHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZCA9IDA7CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKworCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKSBwcmludGsodmVyc2lvbik7CisKKwlkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZihzdHJ1Y3QgYXUxa19wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5pcnEgPSBBVTEwMDBfSVJEQV9SWF9JTlQ7IC8qIFRYIGhhcyBpdHMgb3duIGludGVycnVwdCAqLworCWVyciA9IGF1MWtfaXJkYV9uZXRfaW5pdChkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlpcl9kZXZzWzBdID0gZGV2OworCXByaW50ayhLRVJOX0lORk8gIklyREE6IFJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCXJldHVybiAwOworCitvdXQxOgorCWF1cCA9IG5ldGRldl9wcml2KGRldik7CisJZG1hX2ZyZWUoKHZvaWQgKilhdXAtPmRiWzBdLnZhZGRyLAorCQlNQVhfQlVGX1NJWkUgKiAyKk5VTV9JUl9ERVNDKTsKKwlkbWFfZnJlZSgodm9pZCAqKWF1cC0+cnhfcmluZ1swXSwKKwkJMiAqIE1BWF9OVU1fSVJfREVTQyooc2l6ZW9mKHJpbmdfZGVzdF90KSkpOworCWtmcmVlKGF1cC0+cnhfYnVmZi5oZWFkKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYXUxa19pcmRhX2luaXRfaW9idWYoaW9idWZmX3QgKmlvLCBpbnQgc2l6ZSkKK3sKKwlpby0+aGVhZCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGlvLT5oZWFkICE9IE5VTEwpIHsKKwkJaW8tPnRydWVzaXplID0gc2l6ZTsKKwkJaW8tPmluX2ZyYW1lID0gRkFMU0U7CisJCWlvLT5zdGF0ZSAgICA9IE9VVFNJREVfRlJBTUU7CisJCWlvLT5kYXRhICAgICA9IGlvLT5oZWFkOworCX0KKwlyZXR1cm4gaW8tPmhlYWQgPyAwIDogLUVOT01FTTsKK30KKworc3RhdGljIGludCBhdTFrX2lyZGFfbmV0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpLCByZXR2YWwgPSAwLCBlcnI7CisJZGJfZGVzdF90ICpwREIsICpwREJmcmVlOworCWRtYV9hZGRyX3QgdGVtcDsKKworCWVyciA9IGF1MWtfaXJkYV9pbml0X2lvYnVmKCZhdXAtPnJ4X2J1ZmYsIDE0Mzg0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisKKwlkZXYtPm9wZW4gPSBhdTFrX2lyZGFfc3RhcnQ7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBhdTFrX2lyZGFfaGFyZF94bWl0OworCWRldi0+c3RvcCA9IGF1MWtfaXJkYV9zdG9wOworCWRldi0+Z2V0X3N0YXRzID0gYXUxa19pcmRhX3N0YXRzOworCWRldi0+ZG9faW9jdGwgPSBhdTFrX2lyZGFfaW9jdGw7CisJZGV2LT50eF90aW1lb3V0ID0gYXUxa190eF90aW1lb3V0OworCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmYXVwLT5xb3MpOworCisJLyogVGhlIG9ubHkgdmFsdWUgd2UgbXVzdCBvdmVycmlkZSBpdCB0aGUgYmF1ZHJhdGUgKi8KKwlhdXAtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8CisJCUlSXzExNTIwMHxJUl81NzYwMDAgfChJUl80MDAwMDAwIDw8IDgpOworCQorCWF1cC0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZhdXAtPnFvcyk7CisKKwlyZXR2YWwgPSAtRU5PTUVNOworCisJLyogVHggcmluZyBmb2xsb3dzIHJ4IHJpbmcgKyA1MTIgYnl0ZXMgKi8KKwkvKiB3ZSBuZWVkIGEgMWsgYWxpZ25lZCBidWZmZXIgKi8KKwlhdXAtPnJ4X3JpbmdbMF0gPSAocmluZ19kZXN0X3QgKikKKwkJZG1hX2FsbG9jKDIqTUFYX05VTV9JUl9ERVNDKihzaXplb2YocmluZ19kZXN0X3QpKSwgJnRlbXApOworCWlmICghYXVwLT5yeF9yaW5nWzBdKQorCQlnb3RvIG91dDI7CisKKwkvKiBhbGxvY2F0ZSB0aGUgZGF0YSBidWZmZXJzICovCisJYXVwLT5kYlswXS52YWRkciA9IAorCQkodm9pZCAqKWRtYV9hbGxvYyhNQVhfQlVGX1NJWkUgKiAyKk5VTV9JUl9ERVNDLCAmdGVtcCk7CisJaWYgKCFhdXAtPmRiWzBdLnZhZGRyKQorCQlnb3RvIG91dDM7CisKKwlzZXR1cF9od19yaW5ncyhhdXAsICh1MzIpYXVwLT5yeF9yaW5nWzBdLCAodTMyKWF1cC0+cnhfcmluZ1swXSArIDUxMik7CisKKwlwREJmcmVlID0gTlVMTDsKKwlwREIgPSBhdXAtPmRiOworCWZvciAoaT0wOyBpPCgyKk5VTV9JUl9ERVNDKTsgaSsrKSB7CisJCXBEQi0+cG5leHQgPSBwREJmcmVlOworCQlwREJmcmVlID0gcERCOworCQlwREItPnZhZGRyID0gCisJCQkodTMyICopKCh1bnNpZ25lZClhdXAtPmRiWzBdLnZhZGRyICsgTUFYX0JVRl9TSVpFKmkpOworCQlwREItPmRtYV9hZGRyID0gKGRtYV9hZGRyX3QpdmlydF90b19idXMocERCLT52YWRkcik7CisJCXBEQisrOworCX0KKwlhdXAtPnBEQmZyZWUgPSBwREJmcmVlOworCisJLyogYXR0YWNoIGEgZGF0YSBidWZmZXIgdG8gZWFjaCBkZXNjcmlwdG9yICovCisJZm9yIChpPTA7IGk8TlVNX0lSX0RFU0M7IGkrKykgeworCQlwREIgPSBHZXRGcmVlREIoYXVwKTsKKwkJaWYgKCFwREIpIGdvdG8gb3V0OworCQlhdXAtPnJ4X3JpbmdbaV0tPmFkZHJfMCA9ICh1OCkocERCLT5kbWFfYWRkciAmIDB4ZmYpOworCQlhdXAtPnJ4X3JpbmdbaV0tPmFkZHJfMSA9ICh1OCkoKHBEQi0+ZG1hX2FkZHI+PjgpICYgMHhmZik7CisJCWF1cC0+cnhfcmluZ1tpXS0+YWRkcl8yID0gKHU4KSgocERCLT5kbWFfYWRkcj4+MTYpICYgMHhmZik7CisJCWF1cC0+cnhfcmluZ1tpXS0+YWRkcl8zID0gKHU4KSgocERCLT5kbWFfYWRkcj4+MjQpICYgMHhmZik7CisJCWF1cC0+cnhfZGJfaW51c2VbaV0gPSBwREI7CisJfQorCWZvciAoaT0wOyBpPE5VTV9JUl9ERVNDOyBpKyspIHsKKwkJcERCID0gR2V0RnJlZURCKGF1cCk7CisJCWlmICghcERCKSBnb3RvIG91dDsKKwkJYXVwLT50eF9yaW5nW2ldLT5hZGRyXzAgPSAodTgpKHBEQi0+ZG1hX2FkZHIgJiAweGZmKTsKKwkJYXVwLT50eF9yaW5nW2ldLT5hZGRyXzEgPSAodTgpKChwREItPmRtYV9hZGRyPj44KSAmIDB4ZmYpOworCQlhdXAtPnR4X3JpbmdbaV0tPmFkZHJfMiA9ICh1OCkoKHBEQi0+ZG1hX2FkZHI+PjE2KSAmIDB4ZmYpOworCQlhdXAtPnR4X3JpbmdbaV0tPmFkZHJfMyA9ICh1OCkoKHBEQi0+ZG1hX2FkZHI+PjI0KSAmIDB4ZmYpOworCQlhdXAtPnR4X3JpbmdbaV0tPmNvdW50XzAgPSAwOworCQlhdXAtPnR4X3JpbmdbaV0tPmNvdW50XzEgPSAwOworCQlhdXAtPnR4X3JpbmdbaV0tPmZsYWdzID0gMDsKKwkJYXVwLT50eF9kYl9pbnVzZVtpXSA9IHBEQjsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19EQjExMDApCisJLyogcG93ZXIgb24gKi8KKwliY3NyLT5yZXNldHMgJj0gfkJDU1JfUkVTRVRTX0lSREFfTU9ERV9NQVNLOworCWJjc3ItPnJlc2V0cyB8PSBCQ1NSX1JFU0VUU19JUkRBX01PREVfRlVMTDsKKwlhdV9zeW5jKCk7CisjZW5kaWYKKworCXJldHVybiAwOworCitvdXQzOgorCWRtYV9mcmVlKCh2b2lkICopYXVwLT5yeF9yaW5nWzBdLAorCQkyICogTUFYX05VTV9JUl9ERVNDKihzaXplb2YocmluZ19kZXN0X3QpKSk7CitvdXQyOgorCWtmcmVlKGF1cC0+cnhfYnVmZi5oZWFkKTsKK291dDE6CisJcHJpbnRrKEtFUk5fRVJSICJhdTFrX2luaXRfbW9kdWxlIGZhaWxlZC4gIFJldHVybnMgJWRcbiIsIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgaW50IGF1MWtfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJdTMyIGNvbnRyb2w7CisJdTMyIHJpbmdfYWRkcmVzczsKKworCS8qIGJyaW5nIHRoZSBkZXZpY2Ugb3V0IG9mIHJlc2V0ICovCisJY29udHJvbCA9IDB4ZTsgLyogY29oZXJlbnQsIGNsb2NrIGVuYWJsZSwgb25lIGhhbGYgc3lzdGVtIGNsb2NrICovCisJCQkgIAorI2lmbmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KKwljb250cm9sIHw9IDE7CisjZW5kaWYKKwlhdXAtPnR4X2hlYWQgPSAwOworCWF1cC0+dHhfdGFpbCA9IDA7CisJYXVwLT5yeF9oZWFkID0gMDsKKworCWZvciAoaT0wOyBpPE5VTV9JUl9ERVNDOyBpKyspIHsKKwkJYXVwLT5yeF9yaW5nW2ldLT5mbGFncyA9IEFVX09XTjsKKwl9CisKKwl3cml0ZWwoY29udHJvbCwgSVJfSU5URVJGQUNFX0NPTkZJRyk7CisJYXVfc3luY19kZWxheSgxMCk7CisKKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfRU5BQkxFKSAmIH4weDgwMDAsIElSX0VOQUJMRSk7IC8qIGRpc2FibGUgUEhZICovCisJYXVfc3luY19kZWxheSgxKTsKKworCXdyaXRlbChNQVhfQlVGX1NJWkUsIElSX01BWF9QS1RfTEVOKTsKKworCXJpbmdfYWRkcmVzcyA9ICh1MzIpdmlydF90b19waHlzKCh2b2lkICopYXVwLT5yeF9yaW5nWzBdKTsKKwl3cml0ZWwocmluZ19hZGRyZXNzID4+IDI2LCBJUl9SSU5HX0JBU0VfQUREUl9IKTsKKwl3cml0ZWwoKHJpbmdfYWRkcmVzcyA+PiAxMCkgJiAweGZmZmYsIElSX1JJTkdfQkFTRV9BRERSX0wpOworCisJd3JpdGVsKFJJTkdfU0laRV82NDw8OCB8IFJJTkdfU0laRV82NDw8MTIsIElSX1JJTkdfU0laRSk7CisKKwl3cml0ZWwoMTw8MiB8IElSX09ORV9QSU4sIElSX0NPTkZJR18yKTsgLyogNDhNSHogKi8KKwl3cml0ZWwoMCwgSVJfUklOR19BRERSX0NNUFIpOworCisJYXUxa19pcmRhX3NldF9zcGVlZChkZXYsIDk2MDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MWtfaXJkYV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXR2YWw7CisJY2hhciBod25hbWVbMzJdOworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoKHJldHZhbCA9IGF1MWtfaW5pdChkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBpbiBhdTFrX2luaXRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShBVTEwMDBfSVJEQV9UWF9JTlQsICZhdTFrX2lyZGFfaW50ZXJydXB0LCAKKwkJCQkJMCwgZGV2LT5uYW1lLCBkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZFxuIiwgCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoQVUxMDAwX0lSREFfUlhfSU5ULCAmYXUxa19pcmRhX2ludGVycnVwdCwgCisJCQkJCTAsIGRldi0+bmFtZSwgZGV2KSkpIHsKKwkJZnJlZV9pcnEoQVUxMDAwX0lSREFfVFhfSU5ULCBkZXYpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZFxuIiwgCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLyogR2l2ZSBzZWxmIGEgaGFyZHdhcmUgbmFtZSAqLworCXNwcmludGYoaHduYW1lLCAiQXUxMDAwIFNJUi9GSVIiKTsKKwlhdXAtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZhdXAtPnFvcywgaHduYW1lKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJd3JpdGVsKHJlYWRfaXJfcmVnKElSX0NPTkZJR18yKSB8IDE8PDgsIElSX0NPTkZJR18yKTsgLyogaW50IGVuYWJsZSAqLworCisJYXVwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKCgzKkhaKSk7IAorCWF1cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdTFrX2lyZGFfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzIpICYgfigxPDw4KSwgSVJfQ09ORklHXzIpOworCXdyaXRlbCgwLCBJUl9DT05GSUdfMSk7IAorCXdyaXRlbCgwLCBJUl9JTlRFUkZBQ0VfQ09ORklHKTsgLyogZGlzYWJsZSBjbG9jayAqLworCWF1X3N5bmMoKTsKKworCWlmIChhdXAtPmlybGFwKSB7CisJCWlybGFwX2Nsb3NlKGF1cC0+aXJsYXApOworCQlhdXAtPmlybGFwID0gTlVMTDsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZGVsX3RpbWVyKCZhdXAtPnRpbWVyKTsKKworCS8qIGRpc2FibGUgdGhlIGludGVycnVwdCAqLworCWZyZWVfaXJxKEFVMTAwMF9JUkRBX1RYX0lOVCwgZGV2KTsKKwlmcmVlX2lycShBVTEwMDBfSVJEQV9SWF9JTlQsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdTFrX2lyZGFfZXhpdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpcl9kZXZzWzBdOworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJZG1hX2ZyZWUoKHZvaWQgKilhdXAtPmRiWzBdLnZhZGRyLAorCQlNQVhfQlVGX1NJWkUgKiAyKk5VTV9JUl9ERVNDKTsKKwlkbWFfZnJlZSgodm9pZCAqKWF1cC0+cnhfcmluZ1swXSwKKwkJMiAqIE1BWF9OVU1fSVJfREVTQyooc2l6ZW9mKHJpbmdfZGVzdF90KSkpOworCWtmcmVlKGF1cC0+cnhfYnVmZi5oZWFkKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK3VwZGF0ZV90eF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhdHVzLCB1MzIgcGt0X2xlbikKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwcyA9ICZhdXAtPnN0YXRzOworCisJcHMtPnR4X3BhY2tldHMrKzsKKwlwcy0+dHhfYnl0ZXMgKz0gcGt0X2xlbjsKKworCWlmIChzdGF0dXMgJiBJUl9UWF9FUlJPUikgeworCQlwcy0+dHhfZXJyb3JzKys7CisJCXBzLT50eF9hYm9ydGVkX2Vycm9ycysrOworCX0KK30KKworCitzdGF0aWMgdm9pZCBhdTFrX3R4X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgcmluZ19kZXN0X3QgKnB0eGQ7CisKKwlwdHhkID0gYXVwLT50eF9yaW5nW2F1cC0+dHhfdGFpbF07CisJd2hpbGUgKCEocHR4ZC0+ZmxhZ3MgJiBBVV9PV04pICYmIChhdXAtPnR4X3RhaWwgIT0gYXVwLT50eF9oZWFkKSkgeworCQl1cGRhdGVfdHhfc3RhdHMoZGV2LCBwdHhkLT5mbGFncywgCisJCQkJcHR4ZC0+Y291bnRfMTw8OCB8IHB0eGQtPmNvdW50XzApOworCQlwdHhkLT5jb3VudF8wID0gMDsKKwkJcHR4ZC0+Y291bnRfMSA9IDA7CisJCWF1X3N5bmMoKTsKKworCQlhdXAtPnR4X3RhaWwgPSAoYXVwLT50eF90YWlsICsgMSkgJiAoTlVNX0lSX0RFU0MgLSAxKTsKKwkJcHR4ZCA9IGF1cC0+dHhfcmluZ1thdXAtPnR4X3RhaWxdOworCisJCWlmIChhdXAtPnR4X2Z1bGwpIHsKKwkJCWF1cC0+dHhfZnVsbCA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwl9CisKKwlpZiAoYXVwLT50eF90YWlsID09IGF1cC0+dHhfaGVhZCkgeworCQlpZiAoYXVwLT5uZXdzcGVlZCkgeworCQkJYXUxa19pcmRhX3NldF9zcGVlZChkZXYsIGF1cC0+bmV3c3BlZWQpOworCQkJYXVwLT5uZXdzcGVlZCA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzEpICYgfklSX1RYX0VOQUJMRSwgCisJCQkJCUlSX0NPTkZJR18xKTsgCisJCQlhdV9zeW5jKCk7CisJCQl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzEpIHwgSVJfUlhfRU5BQkxFLCAKKwkJCQkJSVJfQ09ORklHXzEpOyAKKwkJCXdyaXRlbCgwLCBJUl9SSU5HX1BST01QVCk7CisJCQlhdV9zeW5jKCk7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIEF1MTAwMCB0cmFuc21pdCByb3V0aW5lLgorICovCitzdGF0aWMgaW50IGF1MWtfaXJkYV9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwl2b2xhdGlsZSByaW5nX2Rlc3RfdCAqcHR4ZDsKKwl1MzIgbGVuOworCisJdTMyIGZsYWdzOworCWRiX2Rlc3RfdCAqcERCOworCisJaWYgKHNwZWVkICE9IGF1cC0+c3BlZWQgJiYgc3BlZWQgIT0gLTEpIHsKKwkJYXVwLT5uZXdzcGVlZCA9IHNwZWVkOworCX0KKworCWlmICgoc2tiLT5sZW4gPT0gMCkgJiYgKGF1cC0+bmV3c3BlZWQpKSB7CisJCWlmIChhdXAtPnR4X3RhaWwgPT0gYXVwLT50eF9oZWFkKSB7CisJCQlhdTFrX2lyZGFfc2V0X3NwZWVkKGRldiwgc3BlZWQpOworCQkJYXVwLT5uZXdzcGVlZCA9IDA7CisJCX0KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwdHhkID0gYXVwLT50eF9yaW5nW2F1cC0+dHhfaGVhZF07CisJZmxhZ3MgPSBwdHhkLT5mbGFnczsKKworCWlmIChmbGFncyAmIEFVX09XTikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4X2Z1bGxcbiIsIGRldi0+bmFtZSk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJYXVwLT50eF9mdWxsID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2UgaWYgKCgoYXVwLT50eF9oZWFkICsgMSkgJiAoTlVNX0lSX0RFU0MgLSAxKSkgPT0gYXVwLT50eF90YWlsKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHhfZnVsbFxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlhdXAtPnR4X2Z1bGwgPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwlwREIgPSBhdXAtPnR4X2RiX2ludXNlW2F1cC0+dHhfaGVhZF07CisKKyNpZiAwCisJaWYgKHJlYWRfaXJfcmVnKElSX1JYX0JZVEVfQ05UKSAhPSAwKSB7CisJCXByaW50aygidHggd2FybmluZzogcnggYnl0ZSBjbnQgJXhcbiIsIAorCQkJCXJlYWRfaXJfcmVnKElSX1JYX0JZVEVfQ05UKSk7CisJfQorI2VuZGlmCisJCisJaWYgKGF1cC0+c3BlZWQgPT0gNDAwMDAwMCkgeworCQkvKiBGSVIgKi8KKwkJbWVtY3B5KCh2b2lkICopcERCLT52YWRkciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXB0eGQtPmNvdW50XzAgPSBza2ItPmxlbiAmIDB4ZmY7CisJCXB0eGQtPmNvdW50XzEgPSAoc2tiLT5sZW4gPj4gOCkgJiAweGZmOworCisJfQorCWVsc2UgeworCQkvKiBTSVIgKi8KKwkJbGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCAodTggKilwREItPnZhZGRyLCBNQVhfQlVGX1NJWkUpOworCQlwdHhkLT5jb3VudF8wID0gbGVuICYgMHhmZjsKKwkJcHR4ZC0+Y291bnRfMSA9IChsZW4gPj4gOCkgJiAweGZmOworCQlwdHhkLT5mbGFncyB8PSBJUl9ESVNfQ1JDOworCQlhdV93cml0ZWwoYXVfcmVhZGwoMHhhZTAwMDAwYykgJiB+KDE8PDEzKSwgMHhhZTAwMDAwYyk7CisJfQorCXB0eGQtPmZsYWdzIHw9IEFVX09XTjsKKwlhdV9zeW5jKCk7CisKKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzEpIHwgSVJfVFhfRU5BQkxFLCBJUl9DT05GSUdfMSk7IAorCXdyaXRlbCgwLCBJUl9SSU5HX1BST01QVCk7CisJYXVfc3luYygpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCWF1cC0+dHhfaGVhZCA9IChhdXAtPnR4X2hlYWQgKyAxKSAmIChOVU1fSVJfREVTQyAtIDEpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK3VwZGF0ZV9yeF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhdHVzLCB1MzIgY291bnQpCit7CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcHMgPSAmYXVwLT5zdGF0czsKKworCXBzLT5yeF9wYWNrZXRzKys7CisKKwlpZiAoc3RhdHVzICYgSVJfUlhfRVJST1IpIHsKKwkJcHMtPnJ4X2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgKElSX1BIWV9FUlJPUnxJUl9GSUZPX09WRVIpKQorCQkJcHMtPnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIElSX01BWF9MRU4pCisJCQlwcy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgSVJfQ1JDX0VSUk9SKQorCQkJcHMtPnJ4X2NyY19lcnJvcnMrKzsKKwl9CisJZWxzZSAKKwkJcHMtPnJ4X2J5dGVzICs9IGNvdW50OworfQorCisvKgorICogQXUxMDAwIHJlY2VpdmUgcm91dGluZS4KKyAqLworc3RhdGljIGludCBhdTFrX2lyZGFfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJdm9sYXRpbGUgcmluZ19kZXN0X3QgKnByeGQ7CisJdTMyIGZsYWdzLCBjb3VudDsKKwlkYl9kZXN0X3QgKnBEQjsKKworCXByeGQgPSBhdXAtPnJ4X3JpbmdbYXVwLT5yeF9oZWFkXTsKKwlmbGFncyA9IHByeGQtPmZsYWdzOworCisJd2hpbGUgKCEoZmxhZ3MgJiBBVV9PV04pKSAgeworCQlwREIgPSBhdXAtPnJ4X2RiX2ludXNlW2F1cC0+cnhfaGVhZF07CisJCWNvdW50ID0gcHJ4ZC0+Y291bnRfMTw8OCB8IHByeGQtPmNvdW50XzA7CisJCWlmICghKGZsYWdzICYgSVJfUlhfRVJST1IpKSAgeworCQkJLyogZ29vZCBmcmFtZSAqLworCQkJdXBkYXRlX3J4X3N0YXRzKGRldiwgZmxhZ3MsIGNvdW50KTsKKwkJCXNrYj1hbGxvY19za2IoY291bnQrMSxHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCWF1cC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKKwkJCWlmIChhdXAtPnNwZWVkID09IDQwMDAwMDApCisJCQkJc2tiX3B1dChza2IsIGNvdW50KTsKKwkJCWVsc2UKKwkJCQlza2JfcHV0KHNrYiwgY291bnQtMik7CisJCQltZW1jcHkoc2tiLT5kYXRhLCAodm9pZCAqKXBEQi0+dmFkZHIsIGNvdW50LTIpOworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJCQluZXRpZl9yeChza2IpOworCQkJcHJ4ZC0+Y291bnRfMCA9IDA7CisJCQlwcnhkLT5jb3VudF8xID0gMDsKKwkJfQorCQlwcnhkLT5mbGFncyB8PSBBVV9PV047CisJCWF1cC0+cnhfaGVhZCA9IChhdXAtPnJ4X2hlYWQgKyAxKSAmIChOVU1fSVJfREVTQyAtIDEpOworCQl3cml0ZWwoMCwgSVJfUklOR19QUk9NUFQpOworCQlhdV9zeW5jKCk7CisKKwkJLyogbmV4dCBkZXNjcmlwdG9yICovCisJCXByeGQgPSBhdXAtPnJ4X3JpbmdbYXVwLT5yeF9oZWFkXTsKKwkJZmxhZ3MgPSBwcnhkLT5mbGFnczsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCX0KKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGF1MWtfaXJkYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpc3I6IG51bGwgZGV2IHB0clxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXdyaXRlbCgwLCBJUl9JTlRfQ0xFQVIpOyAvKiBhY2sgaXJkYSBpbnRlcnJ1cHRzICovCisKKwlhdTFrX2lyZGFfcngoZGV2KTsKKwlhdTFrX3R4X2FjayhkZXYpOworfQorCisKKy8qCisgKiBUaGUgVHggcmluZyBoYXMgYmVlbiBmdWxsIGxvbmdlciB0aGFuIHRoZSB3YXRjaGRvZyB0aW1lb3V0CisgKiB2YWx1ZS4gVGhlIHRyYW5zbWl0dGVyIG11c3QgYmUgaHVuZz8KKyAqLworc3RhdGljIHZvaWQgYXUxa190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIHNwZWVkOworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0eCB0aW1lb3V0XG4iLCBkZXYtPm5hbWUpOworCXNwZWVkID0gYXVwLT5zcGVlZDsKKwlhdXAtPnNwZWVkID0gMDsKKwlhdTFrX2lyZGFfc2V0X3NwZWVkKGRldiwgc3BlZWQpOworCWF1cC0+dHhfZnVsbCA9IDA7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisKKy8qCisgKiBTZXQgdGhlIElyREEgY29tbXVuaWNhdGlvbnMgc3BlZWQuCisgKi8KK3N0YXRpYyBpbnQgCithdTFrX2lyZGFfc2V0X3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzcGVlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGNvbnRyb2w7CisJaW50IHJldCA9IDAsIHRpbWVvdXQgPSAxMCwgaTsKKwl2b2xhdGlsZSByaW5nX2Rlc3RfdCAqcHR4ZDsKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19EQjExMDApCisJdW5zaWduZWQgbG9uZyBpcmRhX3Jlc2V0czsKKyNlbmRpZgorCisJaWYgKHNwZWVkID09IGF1cC0+c3BlZWQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJfbG9jaywgZmxhZ3MpOworCisJLyogZGlzYWJsZSBQSFkgZmlyc3QgKi8KKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfRU5BQkxFKSAmIH4weDgwMDAsIElSX0VOQUJMRSk7CisKKwkvKiBkaXNhYmxlIFJYL1RYICovCisJd3JpdGVsKHJlYWRfaXJfcmVnKElSX0NPTkZJR18xKSAmIH4oSVJfUlhfRU5BQkxFfElSX1RYX0VOQUJMRSksIAorCQkJSVJfQ09ORklHXzEpOworCWF1X3N5bmNfZGVsYXkoMSk7CisJd2hpbGUgKHJlYWRfaXJfcmVnKElSX0VOQUJMRSkgJiAoSVJfUlhfU1RBVFVTIHwgSVJfVFhfU1RBVFVTKSkgeworCQltZGVsYXkoMSk7CisJCWlmICghdGltZW91dC0tKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByeC90eCBkaXNhYmxlIHRpbWVvdXRcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGRpc2FibGUgRE1BICovCisJd3JpdGVsKHJlYWRfaXJfcmVnKElSX0NPTkZJR18xKSAmIH5JUl9ETUFfRU5BQkxFLCBJUl9DT05GSUdfMSk7CisJYXVfc3luY19kZWxheSgxKTsKKworCS8qIAorCSAqICBBZnRlciB3ZSBkaXNhYmxlIHR4L3J4LiB0aGUgaW5kZXggcG9pbnRlcnMKKyAJICogZ28gYmFjayB0byB6ZXJvLgorCSAqLworCWF1cC0+dHhfaGVhZCA9IGF1cC0+dHhfdGFpbCA9IGF1cC0+cnhfaGVhZCA9IDA7CisJZm9yIChpPTA7IGk8TlVNX0lSX0RFU0M7IGkrKykgeworCQlwdHhkID0gYXVwLT50eF9yaW5nW2ldOworCQlwdHhkLT5mbGFncyA9IDA7CisJCXB0eGQtPmNvdW50XzAgPSAwOworCQlwdHhkLT5jb3VudF8xID0gMDsKKwl9CisKKwlmb3IgKGk9MDsgaTxOVU1fSVJfREVTQzsgaSsrKSB7CisJCXB0eGQgPSBhdXAtPnJ4X3JpbmdbaV07CisJCXB0eGQtPmNvdW50XzAgPSAwOworCQlwdHhkLT5jb3VudF8xID0gMDsKKwkJcHR4ZC0+ZmxhZ3MgPSBBVV9PV047CisJfQorCisJaWYgKHNwZWVkID09IDQwMDAwMDApIHsKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19EQjExMDApCisJCWJjc3ItPnJlc2V0cyB8PSBCQ1NSX1JFU0VUU19GSVJfU0VMOworI2Vsc2UgLyogUGIxMDAwIGFuZCBQYjExMDAgKi8KKwkJd3JpdGVsKDE8PDEzLCBDUExEX0FVWDEpOworI2VuZGlmCisJfQorCWVsc2UgeworI2lmIGRlZmluZWQoQ09ORklHX01JUFNfREIxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTEwMCkKKwkJYmNzci0+cmVzZXRzICY9IH5CQ1NSX1JFU0VUU19GSVJfU0VMOworI2Vsc2UgLyogUGIxMDAwIGFuZCBQYjExMDAgKi8KKwkJd3JpdGVsKHJlYWRsKENQTERfQVVYMSkgJiB+KDE8PDEzKSwgQ1BMRF9BVVgxKTsKKyNlbmRpZgorCX0KKworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIDk2MDA6CQorCQl3cml0ZWwoMTE8PDEwIHwgMTI8PDUsIElSX1dSSVRFX1BIWV9DT05GSUcpOyAKKwkJd3JpdGVsKElSX1NJUl9NT0RFLCBJUl9DT05GSUdfMSk7IAorCQlicmVhazsKKwljYXNlIDE5MjAwOgkKKwkJd3JpdGVsKDU8PDEwIHwgMTI8PDUsIElSX1dSSVRFX1BIWV9DT05GSUcpOyAKKwkJd3JpdGVsKElSX1NJUl9NT0RFLCBJUl9DT05GSUdfMSk7IAorCQlicmVhazsKKwljYXNlIDM4NDAwOgorCQl3cml0ZWwoMjw8MTAgfCAxMjw8NSwgSVJfV1JJVEVfUEhZX0NPTkZJRyk7IAorCQl3cml0ZWwoSVJfU0lSX01PREUsIElSX0NPTkZJR18xKTsgCisJCWJyZWFrOworCWNhc2UgNTc2MDA6CQorCQl3cml0ZWwoMTw8MTAgfCAxMjw8NSwgSVJfV1JJVEVfUEhZX0NPTkZJRyk7IAorCQl3cml0ZWwoSVJfU0lSX01PREUsIElSX0NPTkZJR18xKTsgCisJCWJyZWFrOworCWNhc2UgMTE1MjAwOiAKKwkJd3JpdGVsKDEyPDw1LCBJUl9XUklURV9QSFlfQ09ORklHKTsgCisJCXdyaXRlbChJUl9TSVJfTU9ERSwgSVJfQ09ORklHXzEpOyAKKwkJYnJlYWs7CisJY2FzZSA0MDAwMDAwOgorCQl3cml0ZWwoMHhGLCBJUl9XUklURV9QSFlfQ09ORklHKTsKKwkJd3JpdGVsKElSX0ZJUnxJUl9ETUFfRU5BQkxFfElSX1JYX0VOQUJMRSwgSVJfQ09ORklHXzEpOyAKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyB1bnN1cHBvcnRlZCBzcGVlZCAleFxuIiwgZGV2LT5uYW1lLCBzcGVlZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWF1cC0+c3BlZWQgPSBzcGVlZDsKKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfRU5BQkxFKSB8IDB4ODAwMCwgSVJfRU5BQkxFKTsKKwlhdV9zeW5jKCk7CisKKwljb250cm9sID0gcmVhZF9pcl9yZWcoSVJfRU5BQkxFKTsKKwl3cml0ZWwoMCwgSVJfUklOR19QUk9NUFQpOworCWF1X3N5bmMoKTsKKworCWlmIChjb250cm9sICYgKDE8PDE0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb25maWd1cmF0aW9uIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCX0KKwllbHNlIHsKKwkJaWYgKGNvbnRyb2wgJiAoMTw8MTEpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFZhbGlkIFNJUiBjb25maWdcbiIsIGRldi0+bmFtZSk7CisJCWlmIChjb250cm9sICYgKDE8PDEyKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlcyBWYWxpZCBNSVIgY29uZmlnXG4iLCBkZXYtPm5hbWUpOworCQlpZiAoY29udHJvbCAmICgxPDwxMykpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgVmFsaWQgRklSIGNvbmZpZ1xuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKGNvbnRyb2wgJiAoMTw8MTApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFRYIGVuYWJsZWRcbiIsIGRldi0+bmFtZSk7CisJCWlmIChjb250cm9sICYgKDE8PDkpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFJYIGVuYWJsZWRcbiIsIGRldi0+bmFtZSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgCithdTFrX2lyZGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnJlcSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaWZfaXJkYV9yZXEgKnJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKWlmcmVxOworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOgorCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJLyoKKwkJCSAqIFdlIGFyZSB1bmFibGUgdG8gc2V0IHRoZSBzcGVlZCBpZiB0aGUKKwkJCSAqIGRldmljZSBpcyBub3QgcnVubmluZy4KKwkJCSAqLworCQkJaWYgKGF1cC0+b3BlbikKKwkJCQlyZXQgPSBhdTFrX2lyZGFfc2V0X3NwZWVkKGRldiwKKwkJCQkJCXJxLT5pZnJfYmF1ZHJhdGUpOworCQkJZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBpb2N0bDogIW5ldGlmX3J1bm5pbmdcbiIsCisJCQkJCQlkZXYtPm5hbWUpOworCQkJCXJldCA9IDA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTTUVESUFCVVNZOgorCQlyZXQgPSAtRVBFUk07CisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYsIFRSVUUpOworCQkJcmV0ID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6CisJCXJxLT5pZnJfcmVjZWl2aW5nID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdTFrX2lyZGFfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmYXVwLT5zdGF0czsKK30KKworTU9EVUxFX0FVVEhPUigiUGV0ZSBQb3BvdiA8cHBvcG92QG12aXN0YS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF1MTAwMCBJckRBIERldmljZSBEcml2ZXIiKTsKKworbW9kdWxlX2luaXQoYXUxa19pcmRhX2luaXQpOworbW9kdWxlX2V4aXQoYXUxa19pcmRhX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDhjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMKQEAgLTAsMCArMSwxNzg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZToJCWRvbmF1Ym9lLmMKKyAqIFZlcnNpb246IAkJMi4xNworICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgVG9zaGliYSBPQk9FIChvciB0eXBlLU8gb3IgNzAxKQorICogICAgICAgICAgICAgICAgRklSIENoaXBzZXQsIGFsc28gc3VwcG9ydHMgdGhlIERPTkFVT0JPRSAodHlwZS1ETworICogICAgICAgICAgICAgICAgb3IgZDAxKSBGSVIgY2hpcHNldCB3aGljaCBhcyBmYXIgYXMgSSBrbm93IGlzCisgKiAgICAgICAgICAgICAgICByZWdpc3RlciBjb21wYXRpYmxlLgorICogRG9jdW1lbnRhdGlvbjogaHR0cDovL2xpYnhnLmZyZWUuZnIvaXJkYS9saWItaXJkYS5odG1sCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBKYW1lcyBNY0tlbnppZSA8amFtZXNAZmlzaHNvdXAuZGhzLm9yZz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBNYXkgOCAgMTI6MzU6MjcgMTk5OQorICogTW9kaWZpZWQ6ICAgICAgUGF1bCBCcmlzdG93IDxwYXVsLmJyaXN0b3dAdGVjaG5vbG9naXN0LmNvbT4KKyAqIE1vZGlmaWVkOiAgICAgIE1vbiBOb3YgMTEgMTk6MTA6MDUgMTk5OQorICogTW9kaWZpZWQ6ICAgICAgSmFtZXMgTWNLZW56aWUgPGphbWVzQGZpc2hzb3VwLmRocy5vcmc+CisgKiBNb2RpZmllZDogICAgICBUaHUgTWFyIDE2IDEyOjQ5OjAwIDIwMDAgKFN1YnN0YW50aWFsIHJld3JpdGUpCisgKiBNb2RpZmllZDogICAgICBTYXQgQXByIDI5IDAwOjIzOjAzIDIwMDAgKEFkZGVkIERPTkFVT0JPRSBzdXBwb3J0KQorICogTW9kaWZpZWQ6ICAgICAgV2VkIE1heSAyNCAyMzo0NTowMiAyMDAwIChGaXhlZCBjaGlwaW9fdCBzdHJ1Y3R1cmUpCisgKiBNb2RpZmllZDogMi4xMyBDaHJpc3RpYW4gR2VubmVyYXQgPGNocmlzdGlhbi5nZW5uZXJhdEBwb2x5dGVjaG5pcXVlLm9yZz4KKyAqIE1vZGlmaWVkOiAyLjEzIGRpbSBqYW4gMDcgMjE6NTc6MzkgMjAwMSAodGVzdGVkIHdpdGgga2VybmVsIDIuNCAmIGlybmV0L3BwcCkKKyAqIE1vZGlmaWVkOiAyLjE0IENocmlzdGlhbiBHZW5uZXJhdCA8Y2hyaXN0aWFuLmdlbm5lcmF0QHBvbHl0ZWNobmlxdWUub3JnPgorICogTW9kaWZpZWQ6IDIuMTQgbHVuIGZldiAwNSAxNzo1NTo1OSAyMDAxIChhZGFwdGVkIHRvIHBhdGNoLTIuNC4xLXByZTgtaXJkYTEpCisgKiBNb2RpZmllZDogMi4xNSBNYXJ0aW4gTHVjaW5hIDxtYXRvQGtvdGVsbmEuc2s+CisgKiBNb2RpZmllZDogMi4xNSBGcmkgSnVuIDIxIDIwOjQwOjU5IDIwMDIgKHN5bmMgd2l0aCAyLjQuMTgsIHN1YnN0YW50aWFsIGZpeGVzKQorICogTW9kaWZpZWQ6IDIuMTYgTWFydGluIEx1Y2luYSA8bWF0b0Brb3RlbG5hLnNrPgorICogTW9kaWZpZWQ6IDIuMTYgU2F0IEp1biAyMiAxODo1NDoyOSAyMDAyIChmaXggZnJlZXJlZ2lvbiwgZGVmYXVsdCB0byB2ZXJib3NlKQorICogTW9kaWZpZWQ6IDIuMTcgQ2hyaXN0aWFuIEdlbm5lcmF0IDxjaHJpc3RpYW4uZ2VubmVyYXRAcG9seXRlY2huaXF1ZS5vcmc+CisgKiBNb2RpZmllZDogMi4xNyBqZXUgc2VwIDEyIDA4OjUwOjIwIDIwMDIgKHNhdmVfZmxhZ3MoKTtjbGkoKTsgcmVwbGFjZWQgYnkgc3BpbmxvY2tzKQorICogTW9kaWZpZWQ6IDIuMTggQ2hyaXN0aWFuIEdlbm5lcmF0IDxjaHJpc3RpYW4uZ2VubmVyYXRAcG9seXRlY2huaXF1ZS5vcmc+CisgKiBNb2RpZmllZDogMi4xOCB2ZW4gamFuIDEwIDAzOjE0OjE2IDIwMDMgQ2hhbmdlIHByb2JlIGRlZmF1bHQgb3B0aW9ucworICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgSmFtZXMgTWNLZW56aWUsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgSmFtZXMgTWNLZW56aWUgbm9yIENhbWJyaWRnZSBVbml2ZXJzaXR5IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKiAgICAgQXBwbGljYWJsZSBNb2RlbHMgOiBMaWJyZXR0byAxMDAvMTEwQ1QgYW5kIG1hbnkgbW9yZS4KKyAqICAgICBUb3NoaWJhIHJlZmVycyB0byB0aGlzIGNoaXAgYXMgdGhlIHR5cGUtTyBJUiBwb3J0LAorICogICAgIG9yIHRoZSB0eXBlLURPIElSIHBvcnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBMb29rIGF0IHRvc2hvYm9lLmggKGN1cnJlbnRseSBpbiBpbmNsdWRlL25ldC9pcmRhKSBmb3IgZGV0YWlscyBvZiAqLworLyogV2hlcmUgdG8gZ2V0IGRvY3VtZW50YXRpb24gb24gdGhlIGNoaXAgICAgICAgICAqLworCisKK3N0YXRpYyBjaGFyICpyY3NpZCA9CisgICIkSWQ6IGRvbmF1Ym9lLmMgVjIuMTggdmVuIGphbiAxMCAwMzoxNDoxNiAyMDAzJCI7CisKKy8qIFNlZSBiZWxvdyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbG9naWMgaW4gdGhpcyBkcml2ZXIgKi8KKworLyogVXNlciBzZXJ2aWNhYmxlIHBhcnRzICovCisvKiBVU0VfUFJPQkUgQ3JlYXRlIHRoZSBjb2RlIHdoaWNoIHByb2JlcyB0aGUgY2hpcCBhbmQgZG9lcyBhIGZldyB0ZXN0cyAqLworLyogZG9fcHJvYmUgbW9kdWxlIHBhcmFtZXRlciBFbmFibGUgdGhpcyBjb2RlICovCisvKiBQcm9iZSBjb2RlIGlzIHZlcnkgdXNlZnVsIGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgaGFyZHdhcmUgd29ya3MgKi8KKy8qIFVzZSBpdCB3aXRoIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIFRUX0xFTiwgUlhfTEVOICovCisvKiBTdHJvbmdseSByZWNvbWVuZGVkLCBkaXNhYmxlIGlmIHRoZSBwcm9iZSBmYWlscyBvbiB5b3VyIG1hY2hpbmUgKi8KKy8qIGFuZCBzZW5kIG1lIDxqYW1lc0BmaXNoc291cC5kaHMub3JnPiB0aGUgb3V0cHV0IG9mIGRtZXNnICovCisjZGVmaW5lIFVTRV9QUk9CRSAxCisjdW5kZWYgIFVTRV9QUk9CRQorCisvKiBUcmFjZSBUcmFuc21pdCByaW5nLCBpbnRlcnJ1cHRzLCBSZWNlaXZlIHJpbmcgb3Igbm90ID8gKi8KKyNkZWZpbmUgUFJPQkVfVkVSQk9TRSAxCisKKy8qIERlYnVnIG9wdGlvbiwgZXhhbWluZSBzZW50IGFuZCByZWNlaXZlZCByYXcgZGF0YSAqLworLyogSXJkYWR1bXAgaXMgYmV0dGVyLCBidXQgZG9lcyBub3Qgc2VlIGFsbCBwYWNrZXRzLiBlbmFibGUgaXQgaWYgeW91IHdhbnQuICovCisjdW5kZWYgRFVNUF9QQUNLRVRTCisKKy8qIE1JUiBtb2RlIGhhcyBub3QgYmVlbiB0ZXN0ZWQuIFNvbWUgYmVoYXZpb3VyIGlzIGRpZmZlcmVudCAqLworLyogU2VlbXMgdG8gd29yayBhZ2FpbnN0IGFuIEVyaWNzc29uIFI1MjAgZm9yIG1lLiAtTWFydGluICovCisjZGVmaW5lIFVTRV9NSVIKKworLyogU2NoZWR1bGUgYmFjayB0byBiYWNrIGhhcmR3YXJlIHRyYW5zbWl0cyB3aGVyZXZlciBwb3NzaWJsZSwgb3RoZXJ3aXNlICovCisvKiB3ZSBuZWVkIGFuIGludGVycnVwdCBmb3IgZXZlcnkgZnJhbWUsIHVuc2V0IGlmIG9ib2Ugd29ya3MgZm9yIGEgYml0IGFuZCAqLworLyogdGhlbiBoYW5ncyAqLworI2RlZmluZSBPUFRJTUlaRV9UWAorCisvKiBTZXQgdGhlIG51bWJlciBvZiBzbG90cyBpbiB0aGUgcmluZ3MgKi8KKy8qIElmIHlvdSBnZXQgcngvdHggZmlmbyBvdmVyZmxvd3MgYXQgaGlnaCBiaXRyYXRlcywgeW91IGNhbiB0cnkgaW5jcmVhc2luZyAqLworLyogdGhlc2UgKi8KKworI2RlZmluZSBSSU5HX1NJWkUgKE9CT0VfUklOR19TSVpFX1JYOCB8IE9CT0VfUklOR19TSVpFX1RYOCkKKyNkZWZpbmUgVFhfU0xPVFMgICAgOAorI2RlZmluZSBSWF9TTE9UUyAgICA4CisKKworLyogTGVzcyB1c2VyIHNlcnZpY2FibGUgcGFydHMgYmVsb3cgaGVyZSAqLworCisvKiBUZXN0LCBUcmFuc21pdCBhbmQgcmVjZWl2ZSBidWZmZXIgc2l6ZXMsIGFkanVzdCBhdCB5b3VyIHBlcmlsICovCisvKiByZW1hcmtzOiBuZnMgdXN1YWxseSBuZWVkcyAxayBibG9ja3MgKi8KKy8qIHJlbWFya3M6IGluIFNJUiBtb2RlLCBDUkMgaXMgcmVjZWl2ZWQsIC0+IFJYX0xFTj1UWF9MRU4rMiAqLworLyogcmVtYXJrczogdGVzdCBhY2NlcHRzIGxhcmdlIGJsb2Nrcy4gU3RhbmRhcmQgaXMgMHg4MCAqLworLyogV2hlbiBUVF9MRU4gPiBSWF9MRU4gKFNJUiBtb2RlKSBkYXRhIGlzIHN0b3JlZCBpbiBzdWNjZXNzaXZlIHNsb3RzLiAqLworLyogV2hlbiAzIG9yIG1vcmUgc2xvdHMgYXJlIG5lZWRlZCBmb3IgZWFjaCB0ZXN0IHBhY2tldCwgKi8KKy8qIGRhdGEgcmVjZWl2ZWQgaW4gdGhlIGZpcnN0IHNsb3RzIGlzIG92ZXJ3cml0dGVuLCBldmVuICovCisvKiBpZiBPQk9FX0NUTF9SWF9IV19PV05TIGlzIG5vdCBzZXQsIHdpdGhvdXQgYW55IGVycm9yISAqLworI2RlZmluZSBUVF9MRU4gICAgICAweDgwCisjZGVmaW5lIFRYX0xFTiAgICAgIDB4YzAwCisjZGVmaW5lIFJYX0xFTiAgICAgIDB4YzA0CisvKiBSZWFsIHRyYW5zbWl0dGVkIGxlbmd0aCAoU0lSIG1vZGUpIGlzIGFib3V0IDE0KygyJSpUWF9MRU4pIG1vcmUgKi8KKy8qIGxvbmcgdGhhbiB1c2VyLWRlZmluZWQgbGVuZ3RoIChzZWUgYXN5bmNfd3JhcF9za2IpIGFuZCBpcyBsZXNzIHRoZW4gNEsgKi8KKy8qIFJlYWwgcmVjZWl2ZWQgbGVuZ3RoIGlzIChtYXggUlhfTEVOKSBkaWZmZXJzIGZyb20gdXNlci1kZWZpbmVkICovCisvKiBsZW5ndGggb25seSBiIHRoZSBDUkMgKDIgb3IgNCBieXRlcykgKi8KKyNkZWZpbmUgQlVGX1NBRkVUWSAgMHg3YQorI2RlZmluZSBSWF9CVUZfU1ogICAoUlhfTEVOKQorI2RlZmluZSBUWF9CVUZfU1ogICAoVFhfTEVOK0JVRl9TQUZFVFkpCisKKworLyogTG9naWMgb2YgdGhlIG5ldGRldiBwYXJ0IG9mIHRoaXMgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBUaGUgUlggcmluZyBpcyBmaWxsZWQgd2l0aCBidWZmZXJzLCB3aGVuIGEgcGFja2V0IGFycml2ZXMgICAgICAgICAgICovCisvKiBpdCBpcyBETUEnZCBpbnRvIHRoZSBidWZmZXIgd2hpY2ggaXMgbWFya2VkIHVzZWQgYW5kIFJ4RG9uZSBjYWxsZWQgICovCisvKiBSeERvbmUgZm9ybXMgYW4gc2tiIChhbmQgY2hlY2tzIHRoZSBDUkMgaWYgaW4gU0lSIG1vZGUpIGFuZCBzaGlwcyAgICovCisvKiB0aGUgcGFja2V0IG9mZiB1cHN0YWlycyAqLworCisvKiBUaGUgdHJhbnNtaXR0ZXIgb24gdGhlIG9ib2UgY2hpcCBjYW4gd29yayBpbiBvbmUgb2YgdHdvIG1vZGVzICAgICAgICovCisvKiBmb3IgZWFjaCByaW5nLT50eFtdIHRoZSB0cmFuc21pdHRlciBjYW4gZWl0aGVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiBhKSB0cmFuc21pdCB0aGUgcGFja2V0LCBsZWF2ZSB0aGUgdHJhc21pdHRlciBlbmFibGVkIGFuZCBwcm9jZWVkIHRvICovCisvKiAgICB0aGUgbmV4dCByaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBiKSB0cmFuc21pdCB0aGUgcGFja2V0LCBzd2l0Y2ggb2ZmIHRoZSB0cmFuc21pdHRlciBhbmQgaXNzdWUgVHhEb25lICovCisKKy8qIEFsbCBwYWNrZXRzIGFyZSBlbnRlcmVkIGludG8gdGhlIHJpbmcgaW4gbW9kZSBiKSwgaWYgdGhlIHJpbmcgd2FzICAgKi8KKy8qIGVtcHR5IHRoZSB0cmFuc21pdHRlciBpcyBzdGFydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogSWYgT1BUSU1JWkVfVFggaXMgZGVmaW5lZCB0aGVuIGluIFR4RG9uZSBpZiB0aGUgcmluZyBjb250YWlucyAgICAgICAqLworLyogbW9yZSB0aGFuIG9uZSBwYWNrZXQsIGFsbCBidXQgdGhlIGxhc3QgYXJlIHNldCB0byBtb2RlIGEpIFtIT1dFVkVSICAqLworLyogdGhlIGhhcmR3YXJlIG1heSBub3Qgbm90aWNlIHRoaXMsIHRoaXMgaXMgd2h5IHdlIHN0YXJ0IGluIG1vZGUgYikgXSAqLworLyogdGhlbiByZXN0YXJ0IHRoZSB0cmFuc21pdHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBJZiBPUFRJTUlaRV9UWCBpcyBub3QgZGVmaW5lZCB0aGVuIHdlIGp1c3QgcmVzdGFydCB0aGUgdHJhbnNtaXR0ZXIgICovCisvKiBpZiB0aGUgcmluZyBpc24ndCBlbXB0eSAqLworCisvKiBTcGVlZCBjaGFuZ2VzIGFyZSBkZWxheWVkIHVudGlsIHRoZSBUeFJpbmcgaXMgZW1wdHkgICAgICAgICAgICAgICAgICovCisvKiBtdHQgaXMgaGFuZGxlZCBieSBnZW5lcmF0aW5nIHBhY2tldHMgd2l0aCBiYWQgQ1JDcywgYmVmb3JlIHRoZSBkYXRhICovCisKKy8qIFRPRE86ICovCisvKiBjaGVjayB0aGUgbXR0IHdvcmtzIG9rICAgICAgKi8KKy8qIGZpbmlzaCB0aGUgd2F0Y2hkb2cgICAgICAgICAqLworCisvKiBObyB1c2VyIHNlcnZpY2FibGUgcGFydHMgYmVsb3cgaGVyZSAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisvLyNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgorLy8jaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXBfZnJhbWUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2NyYy5oPgorCisjaW5jbHVkZSAiZG9uYXVib2UuaCIKKworI2RlZmluZSBJTkIocG9ydCkgICAgICAgaW5iX3AocG9ydCkKKyNkZWZpbmUgT1VUQih2YWwscG9ydCkgIG91dGJfcCh2YWwscG9ydCkKKyNkZWZpbmUgT1VUQlAodmFsLHBvcnQpIG91dGJfcCh2YWwscG9ydCkKKworI2RlZmluZSBQUk9NUFQgIE9VVEIoT0JPRV9QUk9NUFRfQklULE9CT0VfUFJPTVBUKTsKKworI2lmIFBST0JFX1ZFUkJPU0UKKyNkZWZpbmUgUFJPQkVfREVCVUcoYXJncy4uLikgKHByaW50ayAoYXJncykpCisjZWxzZQorI2RlZmluZSBQUk9CRV9ERUJVRyhhcmdzLi4uKSA7CisjZW5kaWYKKworLyogU2V0IHRoZSBETUEgdG8gYmUgYnl0ZSBhdCBhIHRpbWUgKi8KKyNkZWZpbmUgQ09ORklHMEhfRE1BX09GRiBPQk9FX0NPTkZJRzBIX1JDVkFOWQorI2RlZmluZSBDT05GSUcwSF9ETUFfT05fTk9SWCBDT05GSUcwSF9ETUFfT0ZGfCBPQk9FX0NPTkZJRzBIX0VORE1BQworI2RlZmluZSBDT05GSUcwSF9ETUFfT04gQ09ORklHMEhfRE1BX09OX05PUlggfCBPQk9FX0NPTkZJRzBIX0VOUlgKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRvc2hvYm9lX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfVE9TSElCQSwgUENJX0RFVklDRV9JRF9GSVI3MDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsIFBDSV9ERVZJQ0VfSURfRklSRDAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRvc2hvYm9lX3BjaV90YmwpOworCisjZGVmaW5lIERSSVZFUl9OQU1FICJ0b3Nob2JvZSIKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9IERSSVZFUl9OQU1FOworCitzdGF0aWMgaW50IG1heF9iYXVkID0gNDAwMDAwMDsKKyNpZmRlZiBVU0VfUFJPQkUKK3N0YXRpYyBpbnQgZG9fcHJvYmUgPSAwOworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50Cit0b3Nob2JvZV9jaGVja2ZjcyAodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICBpbnQgaTsKKyAgdW5pb24KKyAgeworICAgIF9fdTE2IHZhbHVlOworICAgIF9fdTggYnl0ZXNbMl07CisgIH0KKyAgZmNzOworCisgIGZjcy52YWx1ZSA9IElOSVRfRkNTOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICBmY3MudmFsdWUgPSBpcmRhX2ZjcyAoZmNzLnZhbHVlLCAqKGJ1ZisrKSk7CisKKyAgcmV0dXJuIChmY3MudmFsdWUgPT0gR09PRF9GQ1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZW5lcmljIGNoaXAgaGFuZGxpbmcgY29kZSAqLworI2lmZGVmIERVTVBfUEFDS0VUUworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHVtcFs1MF07CitzdGF0aWMgdm9pZAorX2R1bXBidWZzICh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuLCBjaGFyIHRldGUpCit7CitpbnQgaSxqOworY2hhciBoZWFkPXRldGU7Citmb3IgKGk9MDtpPGxlbjtpKz0xNikgeworICAgIGZvciAoaj0wO2o8MTYgJiYgaStqPGxlbjtqKyspIHsgc3ByaW50ZigmZHVtcFszKmpdLCIlMDJ4LiIsZGF0YVtpK2pdKTsgfQorICAgIGR1bXAgWzMqal09MDsKKyAgICBJUkRBX0RFQlVHICgyLCAiJWMlc1xuIixoZWFkICwgZHVtcCk7CisgICAgaGVhZD0nKyc7CisgICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBVU0VfUFJPQkUKKy8qIER1bXAgdGhlIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX2R1bXByZWdzIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIF9fdTMyIHJpbmdiYXNlOworCisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIHJpbmdiYXNlID0gSU5CIChPQk9FX1JJTkdfQkFTRTApIDw8IDEwOworICByaW5nYmFzZSB8PSBJTkIgKE9CT0VfUklOR19CQVNFMSkgPDwgMTg7CisgIHJpbmdiYXNlIHw9IElOQiAoT0JPRV9SSU5HX0JBU0UyKSA8PCAyNjsKKworICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IFJlZ2lzdGVyIGR1bXA6XG4iKTsKKyAgcHJpbnRrIChLRVJOX0VSUiAiSW50ZXJydXB0czogVHg6JWQgUng6JWQgVHhVbmRlcjolZCBSeE92ZXI6JWQgU2lwOiVkXG4iLAorICAgICAgICAgIHNlbGYtPmludF90eCwgc2VsZi0+aW50X3J4LCBzZWxmLT5pbnRfdHh1bmRlciwgc2VsZi0+aW50X3J4b3ZlciwKKyAgICAgICAgICBzZWxmLT5pbnRfc2lwKTsKKyAgcHJpbnRrIChLRVJOX0VSUiAiUlggJTAyeCBUWCAlMDJ4IFJpbmdCYXNlICUwOHhcbiIsCisgICAgICAgICAgSU5CIChPQk9FX1JYU0xPVCksIElOQiAoT0JPRV9UWFNMT1QpLCByaW5nYmFzZSk7CisgIHByaW50ayAoS0VSTl9FUlIgIlJJTkdfU0laRSAlMDJ4IElFUiAlMDJ4IElTUiAlMDJ4XG4iLAorICAgICAgICAgIElOQiAoT0JPRV9SSU5HX1NJWkUpLCBJTkIgKE9CT0VfSUVSKSwgSU5CIChPQk9FX0lTUikpOworICBwcmludGsgKEtFUk5fRVJSICJDT05GSUcxICUwMnggU1RBVFVTICUwMnhcbiIsCisgICAgICAgICAgSU5CIChPQk9FX0NPTkZJRzEpLCBJTkIgKE9CT0VfU1RBVFVTKSk7CisgIHByaW50ayAoS0VSTl9FUlIgIkNPTkZJRzAgJTAyeCUwMnggRU5BQkxFICUwMnglMDJ4XG4iLAorICAgICAgICAgIElOQiAoT0JPRV9DT05GSUcwSCksIElOQiAoT0JPRV9DT05GSUcwTCksCisgICAgICAgICAgSU5CIChPQk9FX0VOQUJMRUgpLCBJTkIgKE9CT0VfRU5BQkxFTCkpOworICBwcmludGsgKEtFUk5fRVJSICJORVdfUENPTkZJRyAlMDJ4JTAyeCBDVVJSX1BDT05GSUcgJTAyeCUwMnhcbiIsCisgICAgICAgICAgSU5CIChPQk9FX05FV19QQ09ORklHSCksIElOQiAoT0JPRV9ORVdfUENPTkZJR0wpLAorICAgICAgICAgIElOQiAoT0JPRV9DVVJSX1BDT05GSUdIKSwgSU5CIChPQk9FX0NVUlJfUENPTkZJR0wpKTsKKyAgcHJpbnRrIChLRVJOX0VSUiAiTUFYTEVOICUwMnglMDJ4IFJYQ09VTlQgJTAyeCUwMnhcbiIsCisgICAgICAgICAgSU5CIChPQk9FX01BWExFTkgpLCBJTkIgKE9CT0VfTUFYTEVOTCksCisgICAgICAgICAgSU5CIChPQk9FX1JYQ09VTlRMKSwgSU5CIChPQk9FX1JYQ09VTlRIKSk7CisKKyAgaWYgKHNlbGYtPnJpbmcpCisgICAgeworICAgICAgaW50IGk7CisgICAgICByaW5nYmFzZSA9IHZpcnRfdG9fYnVzIChzZWxmLT5yaW5nKTsKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgIlJpbmcgYXQgJTA4eDpcbiIsIHJpbmdiYXNlKTsKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgIlJYOiIpOworICAgICAgZm9yIChpID0gMDsgaSA8IFJYX1NMT1RTOyArK2kpCisgICAgICAgIHByaW50ayAoIiAoJWQsJTAyeCkiLHNlbGYtPnJpbmctPnJ4W2ldLmxlbixzZWxmLT5yaW5nLT5yeFtpXS5jb250cm9sKTsKKyAgICAgIHByaW50ayAoIlxuIik7CisgICAgICBwcmludGsgKEtFUk5fRVJSICJUWDoiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBSWF9TTE9UUzsgKytpKQorICAgICAgICBwcmludGsgKCIgKCVkLCUwMngpIixzZWxmLT5yaW5nLT50eFtpXS5sZW4sc2VsZi0+cmluZy0+dHhbaV0uY29udHJvbCk7CisgICAgICBwcmludGsgKCJcbiIpOworICAgIH0KK30KKyNlbmRpZgorCisvKkRvbid0IGxldCB0aGUgY2hpcCBsb29rIGF0IG1lbW9yeSAqLworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX2Rpc2FibGVibSAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworICBfX3U4IGNvbW1hbmQ7CisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIHBjaV9yZWFkX2NvbmZpZ19ieXRlIChzZWxmLT5wZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOworICBjb21tYW5kICY9IH5QQ0lfQ09NTUFORF9NQVNURVI7CisgIHBjaV93cml0ZV9jb25maWdfYnl0ZSAoc2VsZi0+cGRldiwgUENJX0NPTU1BTkQsIGNvbW1hbmQpOworCit9CisKKy8qIFNodXRkb3duIHRoZSBjaGlwIGFuZCBwb2ludCB0aGUgdGFza2ZpbGUgcmVnIHNvbWV3aGVyZSBlbHNlICovCitzdGF0aWMgdm9pZAordG9zaG9ib2Vfc3RvcGNoaXAgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgLypEaXNhYmxlIGludGVycnVwdHMgKi8KKyAgT1VUQiAoMHgwLCBPQk9FX0lFUik7CisgIC8qRGlzYWJsZSBETUEsIERpc2FibGUgUngsIERpc2FibGUgVHggKi8KKyAgT1VUQiAoQ09ORklHMEhfRE1BX09GRiwgT0JPRV9DT05GSUcwSCk7CisgIC8qRGlzYWJsZSBTSVIgTUlSIEZJUiwgVHggYW5kIFJ4ICovCisgIE9VVEIgKDB4MDAsIE9CT0VfRU5BQkxFSCk7CisgIC8qUG9pbnQgdGhlIHJpbmcgc29tZXdoZXJlIHNhZmUgKi8KKyAgT1VUQiAoMHgzZiwgT0JPRV9SSU5HX0JBU0UyKTsKKyAgT1VUQiAoMHhmZiwgT0JPRV9SSU5HX0JBU0UxKTsKKyAgT1VUQiAoMHhmZiwgT0JPRV9SSU5HX0JBU0UwKTsKKworICBPVVRCIChSWF9MRU4gPj4gOCwgT0JPRV9NQVhMRU5IKTsKKyAgT1VUQiAoUlhfTEVOICYgMHhmZiwgT0JPRV9NQVhMRU5MKTsKKworICAvKkFja25vbGVkZ2UgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworICBPVVRCICgweGZmLCBPQk9FX0lTUik7CisKKyAgLypXaHkgKi8KKyAgT1VUQiAoT0JPRV9FTkFCTEVIX1BIWUFORENMT0NLLCBPQk9FX0VOQUJMRUgpOworCisgIC8qc3dpdGNoIGl0IG9mZiAqLworICBPVVRCIChPQk9FX0NPTkZJRzFfT0ZGLCBPQk9FX0NPTkZJRzEpOworCisgIHRvc2hvYm9lX2Rpc2FibGVibSAoc2VsZik7Cit9CisKKy8qIFRyYW5zbWl0dGVyIGluaXRpYWxpemF0aW9uICovCitzdGF0aWMgdm9pZAordG9zaG9ib2Vfc3RhcnRfRE1BIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYsIGludCBvcHRzKQoreworICBPVVRCICgweDAsIE9CT0VfRU5BQkxFSCk7CisgIE9VVEIgKENPTkZJRzBIX0RNQV9PTiB8IG9wdHMsICBPQk9FX0NPTkZJRzBIKTsKKyAgT1VUQiAoT0JPRV9FTkFCTEVIX1BIWUFORENMT0NLLCBPQk9FX0VOQUJMRUgpOworICBQUk9NUFQ7Cit9CisKKy8qU2V0IHRoZSBiYXVkIHJhdGUgKi8KK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9zZXRiYXVkIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIF9fdTE2IHBjb25maWcgPSAwOworICBfX3U4IGNvbmZpZzBsID0gMDsKKworICBJUkRBX0RFQlVHICgyLCAiJXMoJWQvJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYtPnNwZWVkLCBzZWxmLT5pby5zcGVlZCk7CisKKyAgc3dpdGNoIChzZWxmLT5zcGVlZCkKKyAgICB7CisgICAgY2FzZSAyNDAwOgorICAgIGNhc2UgNDgwMDoKKyAgICBjYXNlIDk2MDA6CisgICAgY2FzZSAxOTIwMDoKKyAgICBjYXNlIDM4NDAwOgorICAgIGNhc2UgNTc2MDA6CisgICAgY2FzZSAxMTUyMDA6CisjaWZkZWYgVVNFX01JUgorICAgIGNhc2UgMTE1MjAwMDoKKyNlbmRpZgorICAgIGNhc2UgNDAwMDAwMDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogc3dpdGNoIHRvIHVuc3VwcG9ydGVkIGJhdWRyYXRlICVkXG4iLAorICAgICAgICAgICAgICBzZWxmLT5zcGVlZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN3aXRjaCAoc2VsZi0+c3BlZWQpCisgICAgeworICAgICAgLyogRm9yIFNJUiB0aGUgcHJlYW1ibGUgaXMgZG9uZSBieSBhZGRpbmcgWEJPRnMgKi8KKyAgICAgIC8qIHRvIHRoZSBwYWNrZXQgKi8KKyAgICAgIC8qIHNldCB0byBmaWx0ZXJlZCBTSVIgbW9kZSwgZmlsdGVyIGxvb2tzIGZvciBCT0YgYW5kIEVPRiAqLworICAgIGNhc2UgMjQwMDoKKyAgICAgIHBjb25maWcgfD0gNDcgPDwgT0JPRV9QQ09ORklHX0JBVURTSElGVDsKKyAgICAgIHBjb25maWcgfD0gMjUgPDwgT0JPRV9QQ09ORklHX1dJRFRIU0hJRlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDA6CisgICAgICBwY29uZmlnIHw9IDIzIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICBwY29uZmlnIHw9IDI1IDw8IE9CT0VfUENPTkZJR19XSURUSFNISUZUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5NjAwOgorICAgICAgcGNvbmZpZyB8PSAxMSA8PCBPQk9FX1BDT05GSUdfQkFVRFNISUZUOworICAgICAgcGNvbmZpZyB8PSAyNSA8PCBPQk9FX1BDT05GSUdfV0lEVEhTSElGVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTkyMDA6CisgICAgICBwY29uZmlnIHw9IDUgPDwgT0JPRV9QQ09ORklHX0JBVURTSElGVDsKKyAgICAgIHBjb25maWcgfD0gMjUgPDwgT0JPRV9QQ09ORklHX1dJRFRIU0hJRlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM4NDAwOgorICAgICAgcGNvbmZpZyB8PSAyIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICBwY29uZmlnIHw9IDI1IDw8IE9CT0VfUENPTkZJR19XSURUSFNISUZUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1NzYwMDoKKyAgICAgIHBjb25maWcgfD0gMSA8PCBPQk9FX1BDT05GSUdfQkFVRFNISUZUOworICAgICAgcGNvbmZpZyB8PSAyNSA8PCBPQk9FX1BDT05GSUdfV0lEVEhTSElGVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE1MjAwOgorICAgICAgcGNvbmZpZyB8PSAwIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICBwY29uZmlnIHw9IDI1IDw8IE9CT0VfUENPTkZJR19XSURUSFNISUZUOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qU2V0IHRvIHBhY2tldCBiYXNlZCByZWNlcHRpb24gKi8KKyAgICAgIE9VVEIgKFJYX0xFTiA+PiA4LCBPQk9FX01BWExFTkgpOworICAgICAgT1VUQiAoUlhfTEVOICYgMHhmZiwgT0JPRV9NQVhMRU5MKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBzd2l0Y2ggKHNlbGYtPnNwZWVkKQorICAgIHsKKyAgICBjYXNlIDI0MDA6CisgICAgY2FzZSA0ODAwOgorICAgIGNhc2UgOTYwMDoKKyAgICBjYXNlIDE5MjAwOgorICAgIGNhc2UgMzg0MDA6CisgICAgY2FzZSA1NzYwMDoKKyAgICBjYXNlIDExNTIwMDoKKyAgICAgIGNvbmZpZzBsID0gT0JPRV9DT05GSUcwTF9FTlNJUjsKKyAgICAgIGlmIChzZWxmLT5hc3luYykKKyAgICAgICAgeworICAgICAgICAgIC8qU2V0IHRvIGNoYXJhY3RlciBiYXNlZCByZWNlcHRpb24gKi8KKyAgICAgICAgICAvKlN5c3RlbSB3aWxsIGxvY2sgaWYgTUFYTEVOPTAgKi8KKyAgICAgICAgICAvKnNvIGhhdmUgdG8gYmUgY2FyZWZ1bCAqLworICAgICAgICAgIE9VVEIgKDB4MDEsIE9CT0VfTUFYTEVOSCk7CisgICAgICAgICAgT1VUQiAoMHgwMSwgT0JPRV9NQVhMRU5MKTsKKyAgICAgICAgICBPVVRCICgweDAwLCBPQk9FX01BWExFTkgpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKlNldCB0byBwYWNrZXQgYmFzZWQgcmVjZXB0aW9uICovCisgICAgICAgICAgY29uZmlnMGwgfD0gT0JPRV9DT05GSUcwTF9FTlNJUkY7CisgICAgICAgICAgT1VUQiAoUlhfTEVOID4+IDgsIE9CT0VfTUFYTEVOSCk7CisgICAgICAgICAgT1VUQiAoUlhfTEVOICYgMHhmZiwgT0JPRV9NQVhMRU5MKTsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyNpZmRlZiBVU0VfTUlSCisgICAgICAvKiBNSVIgbW9kZSAqLworICAgICAgLyogU2V0IGZvciAxNiBiaXQgQ1JDIGFuZCBlbmFibGUgTUlSICovCisgICAgICAvKiBQcmVhbWJsZSBub3cgaGFuZGxlZCBieSB0aGUgY2hpcCAqLworICAgIGNhc2UgMTE1MjAwMDoKKyAgICAgIHBjb25maWcgfD0gMCA8PCBPQk9FX1BDT05GSUdfQkFVRFNISUZUOworICAgICAgcGNvbmZpZyB8PSA4IDw8IE9CT0VfUENPTkZJR19XSURUSFNISUZUOworICAgICAgcGNvbmZpZyB8PSAxIDw8IE9CT0VfUENPTkZJR19QUkVBTUJMRVNISUZUOworICAgICAgY29uZmlnMGwgPSBPQk9FX0NPTkZJRzBMX0NSQzE2IHwgT0JPRV9DT05GSUcwTF9FTk1JUjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAvKiBGSVIgbW9kZSAqLworICAgICAgLyogU2V0IGZvciAzMiBiaXQgQ1JDIGFuZCBlbmFibGUgRklSICovCisgICAgICAvKiBQcmVhbWJsZSBoYW5kbGVkIGJ5IHRoZSBjaGlwICovCisgICAgY2FzZSA0MDAwMDAwOgorICAgICAgcGNvbmZpZyB8PSAwIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICAvKiBEb2N1bWVudGF0aW9uIHNheXMgMTQsIGJ1dCB0b3NoaWJhIHVzZSAxNSBpbiB0aGVpciBkcml2ZXJzICovCisgICAgICBwY29uZmlnIHw9IDE1IDw8IE9CT0VfUENPTkZJR19QUkVBTUJMRVNISUZUOworICAgICAgY29uZmlnMGwgPSBPQk9FX0NPTkZJRzBMX0VORklSOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIENvcHkgaW50byBuZXcgUEhZIGNvbmZpZyBidWZmZXIgKi8KKyAgT1VUQlAgKHBjb25maWcgPj4gOCwgT0JPRV9ORVdfUENPTkZJR0gpOworICBPVVRCIChwY29uZmlnICYgMHhmZiwgT0JPRV9ORVdfUENPTkZJR0wpOworICBPVVRCIChjb25maWcwbCwgT0JPRV9DT05GSUcwTCk7CisKKyAgLyogTm93IG1ha2UgT0JPRSBjb3B5IGZyb20gbmV3IFBIWSB0byBjdXJyZW50IFBIWSAqLworICBPVVRCICgweDAsIE9CT0VfRU5BQkxFSCk7CisgIE9VVEIgKE9CT0VfRU5BQkxFSF9QSFlBTkRDTE9DSywgT0JPRV9FTkFCTEVIKTsKKyAgUFJPTVBUOworCisgIC8qIHNwZWVkIGNoYW5nZSBleGVjdXRlZCAqLworICBzZWxmLT5uZXdfc3BlZWQgPSAwOworICBzZWxmLT5pby5zcGVlZCA9IHNlbGYtPnNwZWVkOworfQorCisvKkxldCB0aGUgY2hpcCBsb29rIGF0IG1lbW9yeSAqLworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX2VuYWJsZWJtIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworICBwY2lfc2V0X21hc3RlciAoc2VsZi0+cGRldik7Cit9CisKKy8qc2V0dXAgdGhlIHJpbmcgKi8KK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9pbml0cmluZyAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworICBpbnQgaTsKKworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICBmb3IgKGkgPSAwOyBpIDwgVFhfU0xPVFM7ICsraSkKKyAgICB7CisgICAgICBzZWxmLT5yaW5nLT50eFtpXS5sZW4gPSAwOworICAgICAgc2VsZi0+cmluZy0+dHhbaV0uY29udHJvbCA9IDB4MDA7CisgICAgICBzZWxmLT5yaW5nLT50eFtpXS5hZGRyZXNzID0gdmlydF90b19idXMgKHNlbGYtPnR4X2J1ZnNbaV0pOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICB7CisgICAgICBzZWxmLT5yaW5nLT5yeFtpXS5sZW4gPSBSWF9MRU47CisgICAgICBzZWxmLT5yaW5nLT5yeFtpXS5sZW4gPSAwOworICAgICAgc2VsZi0+cmluZy0+cnhbaV0uYWRkcmVzcyA9IHZpcnRfdG9fYnVzIChzZWxmLT5yeF9idWZzW2ldKTsKKyAgICAgIHNlbGYtPnJpbmctPnJ4W2ldLmNvbnRyb2wgPSBPQk9FX0NUTF9SWF9IV19PV05TOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX3Jlc2V0cHRycyAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworICAvKiBDYW4gcmVzZXQgcG9pbnRlcnMgYnkgdHdpZGxpbmcgRE1BICovCisgIE9VVEIgKDB4MCwgT0JPRV9FTkFCTEVIKTsKKyAgT1VUQlAgKENPTkZJRzBIX0RNQV9PRkYsIE9CT0VfQ09ORklHMEgpOworICBPVVRCIChPQk9FX0VOQUJMRUhfUEhZQU5EQ0xPQ0ssIE9CT0VfRU5BQkxFSCk7CisKKyAgc2VsZi0+cnhzID0gaW5iX3AgKE9CT0VfUlhTTE9UKSAmIE9CT0VfU0xPVF9NQVNLOworICBzZWxmLT50eHMgPSBpbmJfcCAoT0JPRV9UWFNMT1QpICYgT0JPRV9TTE9UX01BU0s7Cit9CisKKy8qIENhbGxlZCBpbiBsb2NrZWQgc3RhdGUgKi8KK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9pbml0cHRycyAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworCisgIC8qIHNwaW5fbG9ja19pcnFzYXZlKHNlbGYtPnNwaW5sb2NrLCBmbGFncyk7ICovCisgIC8qIHNhdmVfZmxhZ3MgKGZsYWdzKTsgKi8KKworICAvKiBDYW4gcmVzZXQgcG9pbnRlcnMgYnkgdHdpZGxpbmcgRE1BICovCisgIHRvc2hvYm9lX3Jlc2V0cHRycyAoc2VsZik7CisKKyAgT1VUQiAoMHgwLCBPQk9FX0VOQUJMRUgpOworICBPVVRCIChDT05GSUcwSF9ETUFfT04sIE9CT0VfQ09ORklHMEgpOworICBPVVRCIChPQk9FX0VOQUJMRUhfUEhZQU5EQ0xPQ0ssIE9CT0VfRU5BQkxFSCk7CisKKyAgc2VsZi0+dHhwZW5kaW5nID0gMDsKKworICAvKiBzcGluX3VubG9ja19pcnFyZXN0b3JlKHNlbGYtPnNwaW5sb2NrLCBmbGFncyk7ICovCisgIC8qIHJlc3RvcmVfZmxhZ3MgKGZsYWdzKTsgKi8KK30KKworLyogV2FrZSB0aGUgY2hpcCB1cCBhbmQgZ2V0IGl0IGxvb2tpbmcgYXQgdGhlIHJpbmdzICovCisvKiBDYWxsZWQgaW4gbG9ja2VkIHN0YXRlICovCitzdGF0aWMgdm9pZAordG9zaG9ib2Vfc3RhcnRjaGlwIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIF9fdTMyIHBoeXNhZGRyOworCisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIHRvc2hvYm9lX2luaXRyaW5nIChzZWxmKTsKKyAgdG9zaG9ib2VfZW5hYmxlYm0gKHNlbGYpOworICBPVVRCUCAoT0JPRV9DT05GSUcxX1JFU0VULCBPQk9FX0NPTkZJRzEpOworICBPVVRCUCAoT0JPRV9DT05GSUcxX09OLCBPQk9FX0NPTkZJRzEpOworCisgIC8qIFN0b3AgdGhlIGNsb2NrcyAqLworICBPVVRCICgwLCBPQk9FX0VOQUJMRUgpOworCisgIC8qU2V0IHNpemUgb2YgcmluZ3MgKi8KKyAgT1VUQiAoUklOR19TSVpFLCBPQk9FX1JJTkdfU0laRSk7CisKKyAgLypBY2tub2xlZGdlIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKyAgT1VUQiAoMHhmZiwgT0JPRV9JU1IpOworCisgIC8qRW5hYmxlIGludHMgKi8KKyAgT1VUQiAoT0JPRV9JTlRfVFhET05FICB8IE9CT0VfSU5UX1JYRE9ORSB8CisgICAgICAgIE9CT0VfSU5UX1RYVU5ERVIgfCBPQk9FX0lOVF9SWE9WRVIgfCBPQk9FX0lOVF9TSVAgLCBPQk9FX0lFUik7CisKKyAgLypBY2tub2xlZGdlIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKyAgT1VUQiAoMHhmZiwgT0JPRV9JU1IpOworCisgIC8qU2V0IHRoZSBtYXhpbXVtIHBhY2tldCBsZW5ndGggdG8gMHhmZmYgKDQwOTUpICovCisgIE9VVEIgKFJYX0xFTiA+PiA4LCBPQk9FX01BWExFTkgpOworICBPVVRCIChSWF9MRU4gJiAweGZmLCBPQk9FX01BWExFTkwpOworCisgIC8qU2h1dGRvd24gRE1BICovCisgIE9VVEIgKENPTkZJRzBIX0RNQV9PRkYsIE9CT0VfQ09ORklHMEgpOworCisgIC8qRmluZCBvdXQgd2hlcmUgdGhlIHJpbmdzIGxpdmUgKi8KKyAgcGh5c2FkZHIgPSB2aXJ0X3RvX2J1cyAoc2VsZi0+cmluZyk7CisKKyAgSVJEQV9BU1NFUlQgKChwaHlzYWRkciAmIDB4M2ZmKSA9PSAwLAorCSAgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICJyaW5nIG5vdCBjb3JyZWN0bHkgYWxpZ25lZFxuIik7CisJICAgICAgIHJldHVybjspOworCisgIE9VVEIgKChwaHlzYWRkciA+PiAxMCkgJiAweGZmLCBPQk9FX1JJTkdfQkFTRTApOworICBPVVRCICgocGh5c2FkZHIgPj4gMTgpICYgMHhmZiwgT0JPRV9SSU5HX0JBU0UxKTsKKyAgT1VUQiAoKHBoeXNhZGRyID4+IDI2KSAmIDB4M2YsIE9CT0VfUklOR19CQVNFMik7CisKKyAgLypFbmFibGUgRE1BIGNvbnRyb2xlciBpbiBieXRlIG1vZGUgYW5kIFJYICovCisgIE9VVEIgKENPTkZJRzBIX0RNQV9PTiwgT0JPRV9DT05GSUcwSCk7CisKKyAgLyogU3RhcnQgdXAgdGhlIGNsb2NrcyAqLworICBPVVRCIChPQk9FX0VOQUJMRUhfUEhZQU5EQ0xPQ0ssIE9CT0VfRU5BQkxFSCk7CisKKyAgLypzZXQgdG8gc2Vuc2libGUgc3BlZWQgKi8KKyAgc2VsZi0+c3BlZWQgPSA5NjAwOworICB0b3Nob2JvZV9zZXRiYXVkIChzZWxmKTsKKyAgdG9zaG9ib2VfaW5pdHB0cnMgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAordG9zaG9ib2VfaXNudHN0dWNrIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7Cit9CisKK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9jaGVja3N0dWNrIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgaWYgKDApCisgICAgeworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgICAgIC8qIFRoaXMgd2lsbCByZXNldCB0aGUgY2hpcCBjb21wbGV0ZWx5ICovCisgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IFJlc2V0dGluZyBjaGlwXG4iKTsKKworICAgICAgdG9zaG9ib2Vfc3RvcGNoaXAgKHNlbGYpOworICAgICAgdG9zaG9ib2Vfc3RhcnRjaGlwIChzZWxmKTsKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgfQorfQorCisvKkdlbmVyYXRlIHBhY2tldCBvZiBhYm91dCBtdHQgdXMgbG9uZyAqLworc3RhdGljIGludAordG9zaG9ib2VfbWFrZW10dHBhY2tldCAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmLCB2b2lkICpidWYsIGludCBtdHQpCit7CisgIGludCB4Ym9mczsKKworICB4Ym9mcyA9ICgoaW50KSAobXR0LzEwMCkpICogKGludCkgKHNlbGYtPnNwZWVkKTsKKyAgeGJvZnM9eGJvZnMvODAwMDA7IC8qRWlnaHQgYml0cyBwZXIgYnl0ZSwgYW5kIG10dCBpcyBpbiB1cyovCisgIHhib2ZzKys7CisKKyAgSVJEQV9ERUJVRyAoMiwgRFJJVkVSX05BTUUKKyAgICAgICI6IGdlbmVyYXRlZCBtdHQgb2YgJWQgYnl0ZXMgZm9yICVkIHVzIGF0ICVkIGJhdWRcbiIKKwkgICwgeGJvZnMsbXR0LHNlbGYtPnNwZWVkKTsKKworICBpZiAoeGJvZnMgPiBUWF9MRU4pCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiB3YW50ZWQgJWQgYnl0ZXMgTVRUIGJ1dCBUWF9MRU4gaXMgJWRcbiIsCisgICAgICAgICAgICAgIHhib2ZzLCBUWF9MRU4pOworICAgICAgeGJvZnMgPSBUWF9MRU47CisgICAgfQorCisgIC8qeGJvZnMgd2lsbCBkbyBmb3IgU0lSLCBNSVIgYW5kIEZJUixTSVIgbW9kZSBkb2Vzbid0IGdlbmVyYXRlIGEgY2hlY2tzdW0gYW55d2F5ICovCisgIG1lbXNldCAoYnVmLCBYQk9GLCB4Ym9mcyk7CisKKyAgcmV0dXJuIHhib2ZzOworfQorCitzdGF0aWMgaW50IHRvc2hvYm9lX2ludmFsaWRfZGV2KGludCBpcnEpCit7CisgIHByaW50ayAoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FICI6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworICByZXR1cm4gMTsKK30KKworI2lmZGVmIFVTRV9QUk9CRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUHJvYmUgY29kZSAqLworCitzdGF0aWMgdm9pZAordG9zaG9ib2VfZHVtcHR4IChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIGludCBpOworICBQUk9CRV9ERUJVRyhLRVJOX1dBUk5JTkcgIlRYOiIpOworICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICBQUk9CRV9ERUJVRygiICglZCwlMDJ4KSIsc2VsZi0+cmluZy0+dHhbaV0ubGVuLHNlbGYtPnJpbmctPnR4W2ldLmNvbnRyb2wpOworICBQUk9CRV9ERUJVRygiIFslZF1cbiIsc2VsZi0+c3BlZWQpOworfQorCitzdGF0aWMgdm9pZAordG9zaG9ib2VfZHVtcHJ4IChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYsIGludCBzY29yZSkKK3sKKyAgaW50IGk7CisgIFBST0JFX0RFQlVHKCIgJWRcblJYOiIsc2NvcmUpOworICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICBQUk9CRV9ERUJVRygiICglZCwlMDJ4KSIsc2VsZi0+cmluZy0+cnhbaV0ubGVuLHNlbGYtPnJpbmctPnJ4W2ldLmNvbnRyb2wpOworICBQUk9CRV9ERUJVRygiXG4iKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3N0dWZmX2J5dGUgKF9fdTggYnl0ZSwgX191OCAqIGJ1ZikKK3sKKyAgc3dpdGNoIChieXRlKQorICAgIHsKKyAgICBjYXNlIEJPRjogICAgICAgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgRU9GOiAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSBDRToKKyAgICAgIC8qIEluc2VydCB0cmFuc3BhcmVudGx5IGNvZGVkICovCisgICAgICBidWZbMF0gPSBDRTsgICAgICAgICAgICAgIC8qIFNlbmQgbGluayBlc2NhcGUgKi8KKyAgICAgIGJ1ZlsxXSA9IGJ5dGUgXiBJUkRBX1RSQU5TOyAvKiBDb21wbGVtZW50IGJpdCA1ICovCisgICAgICByZXR1cm4gMjsKKyAgICAgIC8qIGJyZWFrOyAqLworICAgIGRlZmF1bHQ6CisgICAgICAvKiBOb24tc3BlY2lhbCB2YWx1ZSwgbm8gdHJhbnNwYXJlbmN5IHJlcXVpcmVkICovCisgICAgICBidWZbMF0gPSBieXRlOworICAgICAgcmV0dXJuIDE7CisgICAgICAvKiBicmVhazsgKi8KKyAgICB9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAordG9zaG9ib2VfcHJvYmVpbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiA9IChzdHJ1Y3QgdG9zaG9ib2VfY2IgKikgZGV2X2lkOworICBfX3U4IGlycXN0YXQ7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCAmJiB0b3Nob2JvZV9pbnZhbGlkX2RldihpcnEpKQorICAgIHJldHVybiBJUlFfTk9ORTsKKworICBpcnFzdGF0ID0gSU5CIChPQk9FX0lTUik7CisKKy8qIHdhcyBpdCB1cyAqLworICBpZiAoIShpcnFzdGF0ICYgT0JPRV9JTlRfTUFTSykpCisgICAgcmV0dXJuIElSUV9OT05FOworCisvKiBBY2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisgIE9VVEIgKGlycXN0YXQsIE9CT0VfSVNSKTsKKworICBpZiAoaXJxc3RhdCAmIE9CT0VfSU5UX1RYRE9ORSkKKyAgICB7CisgICAgICBpbnQgdHhwOworCisgICAgICBzZWxmLT5pbnRfdHgrKzsKKyAgICAgIFBST0JFX0RFQlVHKCJUIik7CisKKyAgICAgIHR4cCA9IElOQiAoT0JPRV9UWFNMT1QpICYgT0JPRV9TTE9UX01BU0s7CisgICAgICBpZiAoc2VsZi0+cmluZy0+dHhbdHhwXS5jb250cm9sICYgT0JPRV9DVExfVFhfSFdfT1dOUykKKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPmludF90eCs9MTAwOworICAgICAgICAgIFBST0JFX0RFQlVHKCJTIik7CisgICAgICAgICAgdG9zaG9ib2Vfc3RhcnRfRE1BKHNlbGYsIE9CT0VfQ09ORklHMEhfRU5UWCB8IE9CT0VfQ09ORklHMEhfTE9PUCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGlycXN0YXQgJiBPQk9FX0lOVF9SWERPTkUpIHsKKyAgICBzZWxmLT5pbnRfcngrKzsKKyAgICBQUk9CRV9ERUJVRygiUiIpOyB9CisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfVFhVTkRFUikgeworICAgIHNlbGYtPmludF90eHVuZGVyKys7CisgICAgUFJPQkVfREVCVUcoIlUiKTsgfQorICBpZiAoaXJxc3RhdCAmIE9CT0VfSU5UX1JYT1ZFUikgeworICAgIHNlbGYtPmludF9yeG92ZXIrKzsKKyAgICBQUk9CRV9ERUJVRygiTyIpOyB9CisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfU0lQKSB7CisgICAgc2VsZi0+aW50X3NpcCsrOworICAgIFBST0JFX0RFQlVHKCJJIik7IH0KKyAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50Cit0b3Nob2JvZV9tYWtldGVzdHBhY2tldCAodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYmFkY3JjLCBpbnQgZmlyKQoreworICBpbnQgaTsKKyAgaW50IGxlbiA9IDA7CisgIHVuaW9uCisgIHsKKyAgICBfX3UxNiB2YWx1ZTsKKyAgICBfX3U4IGJ5dGVzWzJdOworICB9CisgIGZjczsKKworICBpZiAoZmlyKQorICAgIHsKKyAgICAgIG1lbXNldCAoYnVmLCAwLCBUVF9MRU4pOworICAgICAgcmV0dXJuIChUVF9MRU4pOworICAgIH0KKworICBmY3MudmFsdWUgPSBJTklUX0ZDUzsKKworICBtZW1zZXQgKGJ1ZiwgWEJPRiwgMTApOworICBsZW4gKz0gMTA7CisgIGJ1ZltsZW4rK10gPSBCT0Y7CisKKyAgZm9yIChpID0gMDsgaSA8IFRUX0xFTjsgKytpKQorICAgIHsKKyAgICAgIGxlbiArPSBzdHVmZl9ieXRlIChpLCBidWYgKyBsZW4pOworICAgICAgZmNzLnZhbHVlID0gaXJkYV9mY3MgKGZjcy52YWx1ZSwgaSk7CisgICAgfQorCisgIGxlbiArPSBzdHVmZl9ieXRlIChmY3MuYnl0ZXNbMF0gXiBiYWRjcmMsIGJ1ZiArIGxlbik7CisgIGxlbiArPSBzdHVmZl9ieXRlIChmY3MuYnl0ZXNbMV0gXiBiYWRjcmMsIGJ1ZiArIGxlbik7CisgIGJ1ZltsZW4rK10gPSBFT0Y7CisgIGxlbisrOworICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50Cit0b3Nob2JvZV9wcm9iZWZhaWwgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiwgY2hhciAqbXNnKQoreworICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICJwcm9iZSglZCkgZmFpbGVkICVzXG4iLHNlbGYtPiBzcGVlZCwgbXNnKTsKKyAgdG9zaG9ib2VfZHVtcHJlZ3MgKHNlbGYpOworICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisgIGZyZWVfaXJxIChzZWxmLT5pby5pcnEsICh2b2lkICopIHNlbGYpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAordG9zaG9ib2VfbnVtdmFsaWRyY3ZzIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIGludCBpLCByZXQgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICBpZiAoKHNlbGYtPnJpbmctPnJ4W2ldLmNvbnRyb2wgJiAweGUwKSA9PSAwKQorICAgICAgcmV0Kys7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordG9zaG9ib2VfbnVtcmN2cyAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworICBpbnQgaSwgcmV0ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IFJYX1NMT1RTOyArK2kpCisgICAgaWYgKCEoc2VsZi0+cmluZy0+cnhbaV0uY29udHJvbCAmIE9CT0VfQ1RMX1JYX0hXX09XTlMpKQorICAgICAgcmV0Kys7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordG9zaG9ib2VfcHJvYmUgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgaW50IGksIGosIG47CisjaWZkZWYgVVNFX01JUgorICBpbnQgYmF1ZHNbXSA9IHsgOTYwMCwgMTE1MjAwLCA0MDAwMDAwLCAxMTUyMDAwIH07CisjZWxzZQorICBpbnQgYmF1ZHNbXSA9IHsgOTYwMCwgMTE1MjAwLCA0MDAwMDAwIH07CisjZW5kaWYKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICBpZiAocmVxdWVzdF9pcnEgKHNlbGYtPmlvLmlycSwgdG9zaG9ib2VfcHJvYmVpbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgICAgc2VsZi0+aW8uaXJxZmxhZ3MsICJ0b3Nob2JvZSIsICh2b2lkICopIHNlbGYpKQorICAgIHsKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogcHJvYmUgZmFpbGVkIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwKKyAgICAgICAgICAgICAgc2VsZi0+aW8uaXJxKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiB0ZXN0IDE6IFNJUiBmaWx0ZXIgYW5kIGJhY2sgdG8gYmFjayAqLworCisgIGZvciAoaiA9IDA7IGogPCAoc2l6ZW9mIChiYXVkcykgLyBzaXplb2YgKGludCkpOyArK2opCisgICAgeworICAgICAgaW50IGZpciA9IChqID4gMSk7CisgICAgICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisKKworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgICAvKkFkZHJlc3MgaXMgYWxyZWFkeSBzZXR1cCAqLworICAgICAgdG9zaG9ib2Vfc3RhcnRjaGlwIChzZWxmKTsKKyAgICAgIHNlbGYtPmludF9yeCA9IHNlbGYtPmludF90eCA9IDA7CisgICAgICBzZWxmLT5zcGVlZCA9IGJhdWRzW2pdOworICAgICAgdG9zaG9ib2Vfc2V0YmF1ZCAoc2VsZik7CisgICAgICB0b3Nob2JvZV9pbml0cHRycyAoc2VsZik7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisgICAgICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmNvbnRyb2wgPQorLyogICAoRklSIG9ubHkpIE9CT0VfQ1RMX1RYX1NJUCBuZWVkZWQgZm9yIHN3aXRjaGluZyB0byBuZXh0IHNsb3QgKi8KKy8qICAgIE1JUjogYWxsIHJlY2VpdmVkIGRhdGEgaXMgc3RvcmVkIGluIG9uZSBzbG90ICovCisgICAgICAgIChmaXIpID8gT0JPRV9DVExfVFhfSFdfT1dOUyB8IE9CT0VfQ1RMX1RYX1JUQ0VOVFgKKyAgICAgICAgICAgICAgOiBPQk9FX0NUTF9UWF9IV19PV05TIDsKKyAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10ubGVuID0KKyAgICAgICAgdG9zaG9ib2VfbWFrZXRlc3RwYWNrZXQgKHNlbGYtPnR4X2J1ZnNbc2VsZi0+dHhzXSwgMCwgZmlyKTsKKyAgICAgIHNlbGYtPnR4cysrOworICAgICAgc2VsZi0+dHhzICU9IFRYX1NMT1RTOworCisgICAgICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmNvbnRyb2wgPQorICAgICAgICAoZmlyKSA/IE9CT0VfQ1RMX1RYX0hXX09XTlMgfCBPQk9FX0NUTF9UWF9TSVAKKyAgICAgICAgICAgICAgOiBPQk9FX0NUTF9UWF9IV19PV05TIHwgT0JPRV9DVExfVFhfUlRDRU5UWCA7CisgICAgICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmxlbiA9CisgICAgICAgIHRvc2hvYm9lX21ha2V0ZXN0cGFja2V0IChzZWxmLT50eF9idWZzW3NlbGYtPnR4c10sIDAsIGZpcik7CisgICAgICBzZWxmLT50eHMrKzsKKyAgICAgIHNlbGYtPnR4cyAlPSBUWF9TTE9UUzsKKworICAgICAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5jb250cm9sID0KKyAgICAgICAgKGZpcikgPyBPQk9FX0NUTF9UWF9IV19PV05TIHwgT0JPRV9DVExfVFhfUlRDRU5UWAorICAgICAgICAgICAgICA6IE9CT0VfQ1RMX1RYX0hXX09XTlMgOworICAgICAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5sZW4gPQorICAgICAgICB0b3Nob2JvZV9tYWtldGVzdHBhY2tldCAoc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCAwLCBmaXIpOworICAgICAgc2VsZi0+dHhzKys7CisgICAgICBzZWxmLT50eHMgJT0gVFhfU0xPVFM7CisKKyAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCA9CisgICAgICAgIChmaXIpID8gT0JPRV9DVExfVFhfSFdfT1dOUyB8IE9CT0VfQ1RMX1RYX1JUQ0VOVFgKKyAgICAgICAgICAgICAgfCBPQk9FX0NUTF9UWF9TSVAgICAgIHwgT0JPRV9DVExfVFhfQkFEX0NSQworICAgICAgICAgICAgICA6IE9CT0VfQ1RMX1RYX0hXX09XTlMgfCBPQk9FX0NUTF9UWF9SVENFTlRYIDsKKyAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10ubGVuID0KKyAgICAgICAgdG9zaG9ib2VfbWFrZXRlc3RwYWNrZXQgKHNlbGYtPnR4X2J1ZnNbc2VsZi0+dHhzXSwgMCwgZmlyKTsKKyAgICAgIHNlbGYtPnR4cysrOworICAgICAgc2VsZi0+dHhzICU9IFRYX1NMT1RTOworCisgICAgICB0b3Nob2JvZV9kdW1wdHggKHNlbGYpOworICAgICAgLyogVHVybiBvbiBUWCBhbmQgUlggYW5kIGxvb3BiYWNrICovCisgICAgICB0b3Nob2JvZV9zdGFydF9ETUEoc2VsZiwgT0JPRV9DT05GSUcwSF9FTlRYIHwgT0JPRV9DT05GSUcwSF9MT09QKTsKKworICAgICAgaSA9IDA7CisgICAgICBuID0gZmlyID8gMSA6IDQ7CisgICAgICB3aGlsZSAodG9zaG9ib2VfbnVtdmFsaWRyY3ZzIChzZWxmKSAhPSBuKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgPiA0ODAwKQorICAgICAgICAgICAgICByZXR1cm4gdG9zaG9ib2VfcHJvYmVmYWlsIChzZWxmLCAiZmlsdGVyIHRlc3QiKTsKKyAgICAgICAgICB1ZGVsYXkgKCg5NjAwKihUVF9MRU4rMTYpKS9zZWxmLT5zcGVlZCk7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgIG4gPSBmaXIgPyAyMDMgOiAxMDI7CisgICAgICB3aGlsZSAoKHRvc2hvYm9lX251bXJjdnMoc2VsZikgIT0gc2VsZi0+aW50X3J4KSB8fCAoc2VsZi0+aW50X3R4ICE9IG4pKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgPiA0ODAwKQorICAgICAgICAgICAgICByZXR1cm4gdG9zaG9ib2VfcHJvYmVmYWlsIChzZWxmLCAiaW50ZXJydXB0IHRlc3QiKTsKKyAgICAgICAgICB1ZGVsYXkgKCg5NjAwKihUVF9MRU4rMTYpKS9zZWxmLT5zcGVlZCk7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgIHRvc2hvYm9lX2R1bXByeCAoc2VsZixpKTsKKworICAgICB9CisKKyAgLyogdGVzdCAyOiBTSVIgaW4gY2hhciBhdCBhIHRpbWUgKi8KKworICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisgIHNlbGYtPmludF9yeCA9IHNlbGYtPmludF90eCA9IDA7CisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgIHRvc2hvYm9lX3N0YXJ0Y2hpcCAoc2VsZik7CisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgc2VsZi0+YXN5bmMgPSAxOworICBzZWxmLT5zcGVlZCA9IDExNTIwMDsKKyAgdG9zaG9ib2Vfc2V0YmF1ZCAoc2VsZik7CisgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCA9CisgICAgT0JPRV9DVExfVFhfUlRDRU5UWCB8IE9CT0VfQ1RMX1RYX0hXX09XTlM7CisgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10ubGVuID0gNDsKKworICAoKHVuc2lnbmVkIGNoYXIgKikgc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdKVswXSA9ICdmJzsKKyAgKCh1bnNpZ25lZCBjaGFyICopIHNlbGYtPnR4X2J1ZnNbc2VsZi0+dHhzXSlbMV0gPSAnaSc7CisgICgodW5zaWduZWQgY2hhciAqKSBzZWxmLT50eF9idWZzW3NlbGYtPnR4c10pWzJdID0gJ3MnOworICAoKHVuc2lnbmVkIGNoYXIgKikgc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdKVszXSA9ICdoJzsKKyAgdG9zaG9ib2VfZHVtcHR4IChzZWxmKTsKKyAgdG9zaG9ib2Vfc3RhcnRfRE1BKHNlbGYsIE9CT0VfQ09ORklHMEhfRU5UWCB8IE9CT0VfQ09ORklHMEhfTE9PUCk7CisKKyAgaSA9IDA7CisgIHdoaWxlICh0b3Nob2JvZV9udW12YWxpZHJjdnMgKHNlbGYpICE9IDQpCisgICAgeworICAgICAgaWYgKGkgPiAxMDApCisgICAgICAgICAgcmV0dXJuIHRvc2hvYm9lX3Byb2JlZmFpbCAoc2VsZiwgIkFzeW5jIHRlc3QiKTsKKyAgICAgIHVkZWxheSAoMTAwKTsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgd2hpbGUgKCh0b3Nob2JvZV9udW1yY3ZzIChzZWxmKSAhPSBzZWxmLT5pbnRfcngpIHx8IChzZWxmLT5pbnRfdHggIT0gMSkpCisgICAgeworICAgICAgaWYgKGkgPiAxMDApCisgICAgICAgICAgcmV0dXJuIHRvc2hvYm9lX3Byb2JlZmFpbCAoc2VsZiwgIkFzeW5jIGludGVycnVwdCB0ZXN0Iik7CisgICAgICB1ZGVsYXkgKDEwMCk7CisgICAgICBpKys7CisgICAgfQorICB0b3Nob2JvZV9kdW1wcnggKHNlbGYsaSk7CisKKyAgc2VsZi0+YXN5bmMgPSAwOworICBzZWxmLT5zcGVlZCA9IDk2MDA7CisgIHRvc2hvYm9lX3NldGJhdWQgKHNlbGYpOworICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisKKyAgZnJlZV9pcnEgKHNlbGYtPmlvLmlycSwgKHZvaWQgKikgc2VsZik7CisKKyAgcHJpbnRrIChLRVJOX1dBUk5JTkcgRFJJVkVSX05BTUUgIjogU2VsZiB0ZXN0IHBhc3NlZCBva1xuIik7CisKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5ldGRldiBzdHlsZSBjb2RlICovCisKKy8qIFRyYW5zbWl0IHNvbWV0aGluZyAqLworc3RhdGljIGludAordG9zaG9ib2VfaGFyZF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGY7CisgIF9fczMyIHNwZWVkOworICBpbnQgbXR0LCBsZW4sIGN0bDsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgc3RydWN0IGlyZGFfc2tiX2NiICpjYiA9IChzdHJ1Y3QgaXJkYV9za2JfY2IgKikgc2tiLT5jYjsKKworICBzZWxmID0gKHN0cnVjdCB0b3Nob2JvZV9jYiAqKSBkZXYtPnByaXY7CisKKyAgSVJEQV9BU1NFUlQgKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7ICk7CisKKyAgSVJEQV9ERUJVRyAoMSwgIiVzLnR4OiV4KCV4KSV4XG4iLCBfX0ZVTkNUSU9OX18KKyAgICAgICxza2ItPmxlbixzZWxmLT50eHBlbmRpbmcsSU5CIChPQk9FX0VOQUJMRUgpKTsKKyAgaWYgKCFjYi0+bWFnaWMpIHsKKyAgICAgIElSREFfREVCVUcgKDIsICIlcy5Ob3QgSXJMQVA6JXhcbiIsIF9fRlVOQ1RJT05fXywgY2ItPm1hZ2ljKTsKKyNpZmRlZiBEVU1QX1BBQ0tFVFMKKyAgICAgIF9kdW1wYnVmcyhza2ItPmRhdGEsc2tiLT5sZW4sJz4nKTsKKyNlbmRpZgorICAgIH0KKworICAvKiBjaGFuZ2Ugc3BlZWQgcGVuZGluZywgd2FpdCBmb3IgaXRzIGV4ZWN1dGlvbiAqLworICBpZiAoc2VsZi0+bmV3X3NwZWVkKQorICAgICAgcmV0dXJuIC1FQlVTWTsKKworICAvKiBkZXZpY2Ugc3RvcHBlZCAoYXBtKSB3YWl0IGZvciByZXN0YXJ0ICovCisgIGlmIChzZWxmLT5zdG9wcGVkKQorICAgICAgcmV0dXJuIC1FQlVTWTsKKworICB0b3Nob2JvZV9jaGVja3N0dWNrIChzZWxmKTsKKworICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworIC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLworICAvKiBCdXQgbm90IG5vdy4gV2FpdCBhZnRlciB0cmFuc21pc3Npb24gaWYgbXR0IG5vdCByZXF1aXJlZCAqLworICBzcGVlZD1pcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisgIGlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpCisgICAgeworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgICAgIGlmIChzZWxmLT50eHBlbmRpbmcgfHwgc2tiLT5sZW4pCisgICAgICAgIHsKKyAgICAgICAgICBzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKyAgICAgICAgICBJUkRBX0RFQlVHICgxLCAiJXM6IFF1ZXVlZCBUeERvbmUgc2NoZWR1bGVkIHNwZWVkIGNoYW5nZSAlZFxuIiAsCisJCSAgICAgIF9fRlVOQ1RJT05fXywgc3BlZWQpOworICAgICAgICAgIC8qIGlmIG5vIGRhdGEsIHRoYXQncyBhbGwhICovCisgICAgICAgICAgaWYgKCFza2ItPmxlbikKKyAgICAgICAgICAgIHsKKwkgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiIChza2IpOworICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvKiBUcnVlIHBhY2tldCwgZ28gb24sIGJ1dCAqLworICAgICAgICAgIC8qIGRvIG5vdCBhY2NlcHQgYW55dGhpbmcgYmVmb3JlIGNoYW5nZSBzcGVlZCBleGVjdXRpb24gKi8KKyAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgLyogcmVhZHkgdG8gcHJvY2VzcyBUeERvbmUgaW50ZXJydXB0ICovCisJICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBpZGxlIGFuZCBubyBkYXRhLCBjaGFuZ2Ugc3BlZWQgbm93ICovCisgICAgICAgICAgc2VsZi0+c3BlZWQgPSBzcGVlZDsKKyAgICAgICAgICB0b3Nob2JvZV9zZXRiYXVkIChzZWxmKTsKKwkgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgICAgICAgZGV2X2tmcmVlX3NrYiAoc2tiKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgfQorCisgIGlmICgobXR0ID0gaXJkYV9nZXRfbXR0KHNrYikpKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgZmFpciBzaW5jZSB0aGUgcXVldWUgc2hvdWxkIGJlIGVtcHR5IGFueXdheSAqLworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgICAgIGlmIChzZWxmLT50eHBlbmRpbmcpCisgICAgICAgIHsKKwkgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCisgICAgICAvKiBJZiBpbiBTSVIgbW9kZSB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgc3RyaW5nIG9mIFhCT0ZzICovCisgICAgICAvKiBJbiBNSVIgYW5kIEZJUiB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgc3RyaW5nIG9mIGRhdGEgKi8KKyAgICAgIC8qIHdoaWNoIHdlIHdpbGwgYWRkIGEgd3JvbmcgY2hlY2tzdW0gdG8gKi8KKworICAgICAgbXR0ID0gdG9zaG9ib2VfbWFrZW10dHBhY2tldCAoc2VsZiwgc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCBtdHQpOworICAgICAgSVJEQV9ERUJVRyAoMSwgIiVzLm10dDoleCgleCklZFxuIiwgX19GVU5DVElPTl9fCisgICAgICAgICAgLHNrYi0+bGVuLG10dCxzZWxmLT50eHBlbmRpbmcpOworICAgICAgaWYgKG10dCkKKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10ubGVuID0gbXR0ICYgMHhmZmY7CisKKyAgICAgICAgICBjdGwgPSBPQk9FX0NUTF9UWF9IV19PV05TIHwgT0JPRV9DVExfVFhfUlRDRU5UWDsKKyAgICAgICAgICBpZiAoSU5CIChPQk9FX0VOQUJMRUgpICYgT0JPRV9FTkFCTEVIX0ZJUk9OKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjdGwgfD0gT0JPRV9DVExfVFhfQkFEX0NSQyB8IE9CT0VfQ1RMX1RYX1NJUCA7CisgICAgICAgICAgICB9CisjaWZkZWYgVVNFX01JUgorICAgICAgICAgIGVsc2UgaWYgKElOQiAoT0JPRV9FTkFCTEVIKSAmIE9CT0VfRU5BQkxFSF9NSVJPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY3RsIHw9IE9CT0VfQ1RMX1RYX0JBRF9DUkM7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmNvbnRyb2wgPSBjdGw7CisKKyAgICAgICAgICBPVVRCICgweDAsIE9CT0VfRU5BQkxFSCk7CisgICAgICAgICAgLyogSXQgaXMgb25seSBhIHRpbWVyLiBEbyBub3Qgc2VuZCBtdHQgcGFja2V0IG91dHNpZGUhICovCisgICAgICAgICAgdG9zaG9ib2Vfc3RhcnRfRE1BKHNlbGYsIE9CT0VfQ09ORklHMEhfRU5UWCB8IE9CT0VfQ09ORklHMEhfTE9PUCk7CisKKyAgICAgICAgICBzZWxmLT50eHBlbmRpbmcrKzsKKworICAgICAgICAgIHNlbGYtPnR4cysrOworICAgICAgICAgIHNlbGYtPnR4cyAlPSBUWF9TTE9UUzsKKworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogcHJvYmxlbSB3aXRoIG10dCBwYWNrZXQgLSBpZ25vcmVkXG4iKTsKKyAgICAgICAgfQorICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICB9CisKKyNpZmRlZiBEVU1QX1BBQ0tFVFMKK2R1bXBidWZzKHNrYi0+ZGF0YSxza2ItPmxlbiwnPicpOworI2VuZGlmCisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgaWYgKHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCAmIE9CT0VfQ1RMX1RYX0hXX09XTlMpCisgICAgeworICAgICAgSVJEQV9ERUJVRyAoMCwgIiVzLmZ1bDoleCgleCkleFxuIiwgX19GVU5DVElPTl9fCisgICAgICAgICAgLHNrYi0+bGVuLCBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmNvbnRyb2wsIHNlbGYtPnR4cGVuZGluZyk7CisgICAgICB0b3Nob2JvZV9zdGFydF9ETUEoc2VsZiwgT0JPRV9DT05GSUcwSF9FTlRYKTsKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKworICBpZiAoSU5CIChPQk9FX0VOQUJMRUgpICYgT0JPRV9FTkFCTEVIX1NJUk9OKQorICAgIHsKKyAgICAgIGxlbiA9IGFzeW5jX3dyYXBfc2tiIChza2IsIHNlbGYtPnR4X2J1ZnNbc2VsZi0+dHhzXSwgVFhfQlVGX1NaKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsZW4gPSBza2ItPmxlbjsKKyAgICAgIG1lbWNweSAoc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCBza2ItPmRhdGEsIGxlbik7CisgICAgfQorICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmxlbiA9IGxlbiAmIDB4MGZmZjsKKworICAvKlNvbWV0aW1lcyB0aGUgSFcgZG9lc24ndCBzZWUgdXMgYXNzZXJ0IFJUQ0VOVFggaW4gdGhlIGludGVycnVwdCBjb2RlICovCisgIC8qbGF0ZXIgdGhpcyBwbGF5cyBzYWZlLCB3ZSBnYXJ1bnRlZSB0aGUgbGFzdCBwYWNrZXQgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKyAgLypoYXMgUlRDRU5UWCBzZXQgKi8KKworICBjdGwgPSBPQk9FX0NUTF9UWF9IV19PV05TIHwgT0JPRV9DVExfVFhfUlRDRU5UWDsKKyAgaWYgKElOQiAoT0JPRV9FTkFCTEVIKSAmIE9CT0VfRU5BQkxFSF9GSVJPTikKKyAgICB7CisgICAgICBjdGwgfD0gT0JPRV9DVExfVFhfU0lQIDsKKyAgICB9CisgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCA9IGN0bDsKKworICAvKiBJZiB0cmFuc21pdHRlciBpcyBpZGxlIHN0YXJ0IGluIG9uZS1zaG90IG1vZGUgKi8KKworICBpZiAoIXNlbGYtPnR4cGVuZGluZykKKyAgICAgIHRvc2hvYm9lX3N0YXJ0X0RNQShzZWxmLCBPQk9FX0NPTkZJRzBIX0VOVFgpOworCisgIHNlbGYtPnR4cGVuZGluZysrOworCisgIHNlbGYtPnR4cysrOworICBzZWxmLT50eHMgJT0gVFhfU0xPVFM7CisKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworICByZXR1cm4gMDsKK30KKworLyppbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlycXJldHVybl90Cit0b3Nob2JvZV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiA9IChzdHJ1Y3QgdG9zaG9ib2VfY2IgKikgZGV2X2lkOworICBfX3U4IGlycXN0YXQ7CisgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisgIGlmIChzZWxmID09IE5VTEwgJiYgdG9zaG9ib2VfaW52YWxpZF9kZXYoaXJxKSkKKyAgICByZXR1cm4gSVJRX05PTkU7CisKKyAgaXJxc3RhdCA9IElOQiAoT0JPRV9JU1IpOworCisvKiB3YXMgaXQgdXMgKi8KKyAgaWYgKCEoaXJxc3RhdCAmIE9CT0VfSU5UX01BU0spKQorICAgICAgcmV0dXJuIElSUV9OT05FOworCisvKiBBY2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisgIE9VVEIgKGlycXN0YXQsIE9CT0VfSVNSKTsKKworICB0b3Nob2JvZV9pc250c3R1Y2sgKHNlbGYpOworCisvKiBUeGRvbmUgKi8KKyAgaWYgKGlycXN0YXQgJiBPQk9FX0lOVF9UWERPTkUpCisgICAgeworICAgICAgaW50IHR4cCwgdHhwYzsKKyAgICAgIGludCBpOworCisgICAgICB0eHAgPSBzZWxmLT50eHBlbmRpbmc7CisgICAgICBzZWxmLT50eHBlbmRpbmcgPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgVFhfU0xPVFM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzZWxmLT5yaW5nLT50eFtpXS5jb250cm9sICYgT0JPRV9DVExfVFhfSFdfT1dOUykKKyAgICAgICAgICAgICAgc2VsZi0+dHhwZW5kaW5nKys7CisgICAgICAgIH0KKyAgICAgIElSREFfREVCVUcgKDEsICIlcy50eGQoJXgpJXgvJXhcbiIsIF9fRlVOQ1RJT05fXworICAgICAgICAgICxpcnFzdGF0LHR4cCxzZWxmLT50eHBlbmRpbmcpOworCisgICAgICB0eHAgPSBJTkIgKE9CT0VfVFhTTE9UKSAmIE9CT0VfU0xPVF9NQVNLOworCisgICAgICAvKiBHb3QgYW55dGhpbmcgcXVldWVkID8gc3RhcnQgaXQgdG9nZXRoZXIgKi8KKyAgICAgIGlmIChzZWxmLT5yaW5nLT50eFt0eHBdLmNvbnRyb2wgJiBPQk9FX0NUTF9UWF9IV19PV05TKQorICAgICAgICB7CisgICAgICAgICAgdHhwYyA9IHR4cDsKKyNpZmRlZiBPUFRJTUlaRV9UWAorICAgICAgICAgIHdoaWxlIChzZWxmLT5yaW5nLT50eFt0eHBjXS5jb250cm9sICYgT0JPRV9DVExfVFhfSFdfT1dOUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdHhwID0gdHhwYzsKKyAgICAgICAgICAgICAgdHhwYysrOworICAgICAgICAgICAgICB0eHBjICU9IFRYX1NMT1RTOworICAgICAgICAgICAgICBzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisgICAgICAgICAgICAgIGlmIChzZWxmLT5yaW5nLT50eFt0eHBjXS5jb250cm9sICYgT0JPRV9DVExfVFhfSFdfT1dOUykKKyAgICAgICAgICAgICAgICAgIHNlbGYtPnJpbmctPnR4W3R4cF0uY29udHJvbCAmPSB+T0JPRV9DVExfVFhfUlRDRU5UWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBzZWxmLT5zdGF0cy50eF9wYWNrZXRzLS07CisjZWxzZQorICAgICAgICAgIHNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyNlbmRpZgorICAgICAgICAgIHRvc2hvYm9lX3N0YXJ0X0RNQShzZWxmLCBPQk9FX0NPTkZJRzBIX0VOVFgpOworICAgICAgICB9CisKKyAgICAgIGlmICgoIXNlbGYtPnR4cGVuZGluZykgJiYgKHNlbGYtPm5ld19zcGVlZCkpCisgICAgICAgIHsKKyAgICAgICAgICBzZWxmLT5zcGVlZCA9IHNlbGYtPm5ld19zcGVlZDsKKyAgICAgICAgICBJUkRBX0RFQlVHICgxLCAiJXM6IEV4ZWN1dGVkIFR4RG9uZSBzY2hlZHVsZWQgc3BlZWQgY2hhbmdlICVkXG4iLAorCQkgICAgICBfX0ZVTkNUSU9OX18sIHNlbGYtPnNwZWVkKTsKKyAgICAgICAgICB0b3Nob2JvZV9zZXRiYXVkIChzZWxmKTsKKyAgICAgICAgfQorCisgICAgICAvKiBUZWxsIG5ldHdvcmsgbGF5ZXIgdGhhdCB3ZSB3YW50IG1vcmUgZnJhbWVzICovCisgICAgICBpZiAoIXNlbGYtPm5ld19zcGVlZCkKKyAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisgICAgfQorCisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfUlhET05FKQorICAgIHsKKyAgICAgIHdoaWxlICghKHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10uY29udHJvbCAmIE9CT0VfQ1RMX1JYX0hXX09XTlMpKQorICAgICAgICB7CisgICAgICAgICAgaW50IGxlbiA9IHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10ubGVuOworICAgICAgICAgIHNrYiA9IE5VTEw7CisgICAgICAgICAgSVJEQV9ERUJVRyAoMywgIiVzLnJjdjoleCgleClcbiIsIF9fRlVOQ1RJT05fXworCQkgICAgICAsbGVuLHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10uY29udHJvbCk7CisKKyNpZmRlZiBEVU1QX1BBQ0tFVFMKK2R1bXBidWZzKHNlbGYtPnJ4X2J1ZnNbc2VsZi0+cnhzXSxsZW4sJzwnKTsKKyNlbmRpZgorCisgICAgICAgICAgaWYgKHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10uY29udHJvbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX3U4IGVuYWJsZSA9IElOQiAoT0JPRV9FTkFCTEVIKTsKKworICAgICAgICAgICAgICAvKiBJbiBTSVIgbW9kZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBDUkMgYXMgdGhpcyAqLworICAgICAgICAgICAgICAvKiBoYXNuJ3QgYmVlbiBkb25lIGJ5IHRoZSBoYXJkd2FyZSAqLworICAgICAgICAgICAgICBpZiAoZW5hYmxlICYgT0JPRV9FTkFCTEVIX1NJUk9OKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghdG9zaG9ib2VfY2hlY2tmY3MgKHNlbGYtPnJ4X2J1ZnNbc2VsZi0+cnhzXSwgbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgLypUcmltIG9mZiB0aGUgQ1JDICovCisgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgSVJEQV9ERUJVRyAoMSwgIiVzLlNJUjoleCgleClcbiIsIF9fRlVOQ1RJT05fXywgbGVuLGVuYWJsZSk7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgVVNFX01JUgorICAgICAgICAgICAgICBlbHNlIGlmIChlbmFibGUgJiBPQk9FX0VOQUJMRUhfTUlST04pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDI7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgIElSREFfREVCVUcgKDIsICIlcy5NSVI6JXgoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIGxlbixlbmFibGUpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICBlbHNlIGlmIChlbmFibGUgJiBPQk9FX0VOQUJMRUhfRklST04pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDMpCisgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDQ7ICAgLypGSVhNRTogY2hlY2sgdGhpcyAqLworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICBJUkRBX0RFQlVHICgxLCAiJXMuRklSOiV4KCV4KVxuIiwgX19GVU5DVElPTl9fLCBsZW4sZW5hYmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIElSREFfREVCVUcgKDAsICIlcy4/SVI6JXgoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIGxlbixlbmFibGUpOworCisgICAgICAgICAgICAgIGlmIChsZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2tiID0gZGV2X2FsbG9jX3NrYiAobGVuICsgMSk7CisgICAgICAgICAgICAgICAgICBpZiAoc2tiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUgKHNrYiwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICBza2JfcHV0IChza2IsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5IChza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZnNbc2VsZi0+cnhzXSwgbGVuKTsKKworICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKyAgICAgICAgICAgICAgICAgICAgICBza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGh0b25zIChFVEhfUF9JUkRBKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrIChLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgZnJhbWUuXG4iLAorCQkJICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvKiBUT0RPOiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisgICAgICAgICAgICAvKiAgaWYgT0JPRV9DVExfUlhfTEVOR1RILCBvdXIgYnVmZmVycyBhcmUgdG9vIHNtYWxsICovCisgICAgICAgICAgICAvKiAoTUlSIG9yIEZJUikgZGF0YSBpcyBsb3N0LiAqLworICAgICAgICAgICAgLyogKFNJUikgZGF0YSBpcyBzcGxpdHRlZCBpbiBzZXZlcmFsIHNsb3RzLiAqLworICAgICAgICAgICAgLyogd2UgaGF2ZSB0byBqb2luIGFsbCB0aGUgcmVjZWl2ZWQgYnVmZmVycyByZWNlaXZlZCAqLworICAgICAgICAgICAgLyppbiBhIGxhcmdlIGJ1ZmZlciBiZWZvcmUgY2hlY2tpbmcgQ1JDLiAqLworICAgICAgICAgICAgSVJEQV9ERUJVRyAoMCwgIiVzLmVycjoleCgleClcbiIsIF9fRlVOQ1RJT05fXworICAgICAgICAgICAgICAgICxsZW4sc2VsZi0+cmluZy0+cnhbc2VsZi0+cnhzXS5jb250cm9sKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10ubGVuID0gMHgwOworICAgICAgICAgIHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10uY29udHJvbCA9IE9CT0VfQ1RMX1JYX0hXX09XTlM7CisKKyAgICAgICAgICBzZWxmLT5yeHMrKzsKKyAgICAgICAgICBzZWxmLT5yeHMgJT0gUlhfU0xPVFM7CisKKyAgICAgICAgICBpZiAoc2tiKQorICAgICAgICAgICAgICBuZXRpZl9yeCAoc2tiKTsKKworICAgICAgICB9CisgICAgfQorCisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfVFhVTkRFUikKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fV0FSTklORyBEUklWRVJfTkFNRSAiOiB0eCBmaWZvIHVuZGVyZmxvd1xuIik7CisgICAgfQorICBpZiAoaXJxc3RhdCAmIE9CT0VfSU5UX1JYT1ZFUikKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fV0FSTklORyBEUklWRVJfTkFNRSAiOiByeCBmaWZvIG92ZXJmbG93XG4iKTsKKyAgICB9CisvKiBUaGlzIG11c3QgYmUgdXNlZnVsIGZvciBzb21ldGhpbmcuLi4gKi8KKyAgaWYgKGlycXN0YXQgJiBPQk9FX0lOVF9TSVApCisgICAgeworICAgICAgc2VsZi0+aW50X3NpcCsrOworICAgICAgSVJEQV9ERUJVRyAoMSwgIiVzLnNpcDoleCgleCkleFxuIiwgX19GVU5DVElPTl9fCisJICAgICAgLHNlbGYtPmludF9zaXAsaXJxc3RhdCxzZWxmLT50eHBlbmRpbmcpOworICAgIH0KKyAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX25ldF9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGY7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgSVJEQV9BU1NFUlQgKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7ICk7CisgIHNlbGYgPSAoc3RydWN0IHRvc2hvYm9lX2NiICopIGRldi0+cHJpdjsKKworICBJUkRBX0FTU0VSVCAoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDsgKTsKKworICBpZiAoc2VsZi0+YXN5bmMpCisgICAgcmV0dXJuIC1FQlVTWTsKKworICBpZiAoc2VsZi0+c3RvcHBlZCkKKyAgICByZXR1cm4gMDsKKworICBpZiAocmVxdWVzdF9pcnEgKHNlbGYtPmlvLmlycSwgdG9zaG9ib2VfaW50ZXJydXB0LAorICAgICAgICAgICAgICAgICAgIFNBX1NISVJRIHwgU0FfSU5URVJSVVBULCBkZXYtPm5hbWUsICh2b2lkICopIHNlbGYpKQorICAgIHsKKyAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKworICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgdG9zaG9ib2Vfc3RhcnRjaGlwIChzZWxmKTsKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBSZWFkeSB0byBwbGF5ISAqLworICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgIC8qCisgICAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQorICAgKiBpbml0aWFsaXplZCBwcm9wZXJseQorICAgKi8KKyAgc2VsZi0+aXJsYXAgPSBpcmxhcF9vcGVuIChkZXYsICZzZWxmLT5xb3MsIGRyaXZlcl9uYW1lKTsKKworICBzZWxmLT5pcmRhZCA9IDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX25ldF9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmOworCisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIElSREFfQVNTRVJUIChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyApOworICBzZWxmID0gKHN0cnVjdCB0b3Nob2JvZV9jYiAqKSBkZXYtPnByaXY7CisKKyAgLyogU3RvcCBkZXZpY2UgKi8KKyAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgIC8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworICBpZiAoc2VsZi0+aXJsYXApCisgICAgaXJsYXBfY2xvc2UgKHNlbGYtPmlybGFwKTsKKyAgc2VsZi0+aXJsYXAgPSBOVUxMOworCisgIHNlbGYtPmlyZGFkID0gMDsKKworICBmcmVlX2lycSAoc2VsZi0+aW8uaXJxLCAodm9pZCAqKSBzZWxmKTsKKworICBpZiAoIXNlbGYtPnN0b3BwZWQpCisgICAgeworICAgICAgdG9zaG9ib2Vfc3RvcGNoaXAgKHNlbGYpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRvc2hvYm9lX25ldF9pb2N0bCAoZGV2LCBycSwgY21kKQorICoKKyAqICAgIFByb2Nlc3MgSU9DVEwgY29tbWFuZHMgZm9yIHRoaXMgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50Cit0b3Nob2JvZV9uZXRfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisgIHN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKyAgc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBpbnQgcmV0ID0gMDsKKworICBJUkRBX0FTU0VSVCAoZGV2ICE9IE5VTEwsIHJldHVybiAtMTsgKTsKKworICBzZWxmID0gZGV2LT5wcml2OworCisgIElSREFfQVNTRVJUIChzZWxmICE9IE5VTEwsIHJldHVybiAtMTsgKTsKKworICBJUkRBX0RFQlVHICg1LCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBjbWQpOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKyAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgc3dpdGNoIChjbWQpCisgICAgeworICAgIGNhc2UgU0lPQ1NCQU5EV0lEVEg6ICAgICAgIC8qIFNldCBiYW5kd2lkdGggKi8KKyAgICAgIC8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIHVzZWQgYnkgSXJMQVAgdG8gY2hhbmdlIHRoZQorICAgICAgICogc3BlZWQsIHNvIHdlIHN0aWxsIG11c3QgYWxsb3cgZm9yIHNwZWVkIGNoYW5nZSB3aXRoaW4KKyAgICAgICAqIGludGVycnVwdCBjb250ZXh0LgorICAgICAgICovCisgICAgICBJUkRBX0RFQlVHICgxLCAiJXMoQkFORFdJRFRIKSwgJXMsICglWC8lbGRcbiIsIF9fRlVOQ1RJT05fXworICAgICAgICAgICxkZXYtPm5hbWUsIElOQiAoT0JPRV9TVEFUVVMpLCBpcnEtPmlmcl9iYXVkcmF0ZSApOworICAgICAgaWYgKCFpbl9pbnRlcnJ1cHQgKCkgJiYgIWNhcGFibGUgKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgICAvKiBzZWxmLT5zcGVlZD1pcnEtPmlmcl9iYXVkcmF0ZTsgKi8KKyAgICAgIC8qIHRvc2hvYm9lX3NldGJhdWQoc2VsZik7ICovCisgICAgICAvKiBKdXN0IGNoYW5nZSBzcGVlZCBvbmNlIC0gaW5zZXJ0ZWQgYnkgUGF1bCBCcmlzdG93ICovCisgICAgICBzZWxmLT5uZXdfc3BlZWQgPSBpcnEtPmlmcl9iYXVkcmF0ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0lPQ1NNRURJQUJVU1k6ICAgICAgIC8qIFNldCBtZWRpYSBidXN5ICovCisgICAgICBJUkRBX0RFQlVHICgxLCAiJXMoTUVESUFCVVNZKSwgJXMsICglWC8leClcbiIsIF9fRlVOQ1RJT05fXworICAgICAgICAgICxkZXYtPm5hbWUsIElOQiAoT0JPRV9TVEFUVVMpLCBjYXBhYmxlIChDQVBfTkVUX0FETUlOKSApOworICAgICAgaWYgKCFjYXBhYmxlIChDQVBfTkVUX0FETUlOKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgIGlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5IChzZWxmLT5uZXRkZXYsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSU9DR1JFQ0VJVklORzogICAgICAgLyogQ2hlY2sgaWYgd2UgYXJlIHJlY2VpdmluZyByaWdodCBub3cgKi8KKyAgICAgIGlycS0+aWZyX3JlY2VpdmluZyA9IChJTkIgKE9CT0VfU1RBVFVTKSAmIE9CT0VfU1RBVFVTX1JYQlVTWSkgPyAxIDogMDsKKyAgICAgIElSREFfREVCVUcgKDMsICIlcyhSRUNFSVZJTkcpLCAlcywgKCVYLyV4KVxuIiwgX19GVU5DVElPTl9fCisgICAgICAgICAgLGRldi0+bmFtZSwgSU5CIChPQk9FX1NUQVRVUyksIGlycS0+aWZyX3JlY2VpdmluZyApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIElSREFfREVCVUcgKDEsICIlcyg/KSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBjbWQpOworICAgICAgcmV0ID0gLUVPUE5PVFNVUFA7CisgICAgfQorCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgIHJldHVybiByZXQ7CisKK30KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUb3NoaWJhIE9CT0UgSXJEQSBEZXZpY2UgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKYW1lcyBNY0tlbnppZSA8amFtZXNAZmlzaHNvdXAuZGhzLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtIChtYXhfYmF1ZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2JhdWQsICJNYXhpbXVtIGJhdWQgcmF0ZSIpOworCisjaWZkZWYgVVNFX1BST0JFCittb2R1bGVfcGFyYW0gKGRvX3Byb2JlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG9fcHJvYmUsICJFbmFibGUvZGlzYWJsZSBjaGlwIHByb2JpbmcgYW5kIHNlbGYtdGVzdCIpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9jbG9zZSAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisgIGludCBpOworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYgPSAoc3RydWN0IHRvc2hvYm9lX2NiKilwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgSVJEQV9BU1NFUlQgKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyApOworCisgIGlmICghc2VsZi0+c3RvcHBlZCkKKyAgICB7CisgICAgICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisgICAgfQorCisgIHJlbGVhc2VfcmVnaW9uIChzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRYX1NMT1RTOyArK2kpCisgICAgeworICAgICAga2ZyZWUgKHNlbGYtPnR4X2J1ZnNbaV0pOworICAgICAgc2VsZi0+dHhfYnVmc1tpXSA9IE5VTEw7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBSWF9TTE9UUzsgKytpKQorICAgIHsKKyAgICAgIGtmcmVlIChzZWxmLT5yeF9idWZzW2ldKTsKKyAgICAgIHNlbGYtPnJ4X2J1ZnNbaV0gPSBOVUxMOworICAgIH0KKworICB1bnJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCisgIGtmcmVlIChzZWxmLT5yaW5nYnVmKTsKKyAgc2VsZi0+cmluZ2J1ZiA9IE5VTEw7CisgIHNlbGYtPnJpbmcgPSBOVUxMOworCisgIGZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7Cit9CisKK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX29wZW4gKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGRpZCkKK3sKKyAgc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmOworICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICBpbnQgaSA9IDA7CisgIGludCBvayA9IDA7CisgIGludCBlcnI7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgaWYgKChlcnI9cGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpKQorICAgIHJldHVybiBlcnI7CisKKyAgZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2YgKHN0cnVjdCB0b3Nob2JvZV9jYikpOworICBpZiAoZGV2ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKyAgICAgICAgICAgICAgIklyREEgY29udHJvbCBibG9ja1xuIik7CisgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgc2VsZiA9IGRldi0+cHJpdjsKKyAgc2VsZi0+bmV0ZGV2ID0gZGV2OworICBzZWxmLT5wZGV2ID0gcGNpX2RldjsKKyAgc2VsZi0+YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LDApOworCisgIHNlbGYtPmlvLmZpcl9iYXNlID0gc2VsZi0+YmFzZTsKKyAgc2VsZi0+aW8uZmlyX2V4dCA9IE9CT0VfSU9fRVhURU5UOworICBzZWxmLT5pby5pcnEgPSBwY2lfZGV2LT5pcnE7CisgIHNlbGYtPmlvLmlycWZsYWdzID0gU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQ7CisKKyAgc2VsZi0+c3BlZWQgPSBzZWxmLT5pby5zcGVlZCA9IDk2MDA7CisgIHNlbGYtPmFzeW5jID0gMDsKKworICAvKiBMb2NrIHRoZSBwb3J0IHRoYXQgd2UgbmVlZCAqLworICBpZiAoTlVMTD09cmVxdWVzdF9yZWdpb24gKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0LCBkcml2ZXJfbmFtZSkpCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBjYW4ndCBnZXQgaW9iYXNlIG9mIDB4JTAzeFxuIgorCSAgICAgICxzZWxmLT5pby5maXJfYmFzZSk7CisgICAgICBlcnIgPSAtRUJVU1k7CisgICAgICBnb3RvIGZyZWVzZWxmOworICAgIH0KKworICBzcGluX2xvY2tfaW5pdCgmc2VsZi0+c3BpbmxvY2spOworCisgIGlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMgKCZzZWxmLT5xb3MpOworICBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPSAwOworCisgIGlmIChtYXhfYmF1ZCA+PSAyNDAwKQorICAgIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyB8PSBJUl8yNDAwOworICAvKmlmIChtYXhfYmF1ZD49NDgwMCkgaWRldi0+cW9zLmJhdWRfcmF0ZS5iaXRzfD1JUl80ODAwOyAqLworICBpZiAobWF4X2JhdWQgPj0gOTYwMCkKKyAgICBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgfD0gSVJfOTYwMDsKKyAgaWYgKG1heF9iYXVkID49IDE5MjAwKQorICAgIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyB8PSBJUl8xOTIwMDsKKyAgaWYgKG1heF9iYXVkID49IDExNTIwMCkKKyAgICBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgfD0gSVJfMTE1MjAwOworI2lmZGVmIFVTRV9NSVIKKyAgaWYgKG1heF9iYXVkID49IDExNTIwMDApCisgICAgeworICAgICAgc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzIHw9IElSXzExNTIwMDA7CisgICAgfQorI2VuZGlmCisgIGlmIChtYXhfYmF1ZCA+PSA0MDAwMDAwKQorICAgIHsKKyAgICAgIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyB8PSAoSVJfNDAwMDAwMCA8PCA4KTsKKyAgICB9CisKKyAgLypGSVhNRTogd29yayB0aGlzIG91dC4uLiAqLworICBzZWxmLT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gMHhmZjsKKworICBpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlICgmc2VsZi0+cW9zKTsKKworICAvKiBBbGxvY2F0ZSB0d2ljZSB0aGUgc2l6ZSB0byBndWFyYW50ZWUgYWxpZ25tZW50ICovCisgIHNlbGYtPnJpbmdidWYgPSAodm9pZCAqKSBrbWFsbG9jIChPQk9FX1JJTkdfTEVOIDw8IDEsIEdGUF9LRVJORUwpOworICBpZiAoIXNlbGYtPnJpbmdidWYpCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBjYW4ndCBhbGxvY2F0ZSBETUEgYnVmZmVyc1xuIik7CisgICAgICBlcnIgPSAtRU5PTUVNOworICAgICAgZ290byBmcmVlcmVnaW9uOworICAgIH0KKworI2lmIChCSVRTX1BFUl9MT05HID09IDY0KQorI2Vycm9yIGJyb2tlbiBvbiA2NC1iaXQ6ICBjYXN0cyBwb2ludGVyIHRvIDMyLWJpdCwgYW5kIHRoZW4gYmFjayB0byBwb2ludGVyLgorI2VuZGlmCisKKyAgLypXZSBuZWVkIHRvIGFsaWduIHRoZSB0YXNrZmlsZSBvbiBhIHRhc2tmaWxlIHNpemUgYm91bmRhcnkgKi8KKyAgeworICAgIHVuc2lnbmVkIGxvbmcgYWRkcjsKKworICAgIGFkZHIgPSAoX191MzIpIHNlbGYtPnJpbmdidWY7CisgICAgYWRkciAmPSB+KE9CT0VfUklOR19MRU4gLSAxKTsKKyAgICBhZGRyICs9IE9CT0VfUklOR19MRU47CisgICAgc2VsZi0+cmluZyA9IChzdHJ1Y3QgT2JvZVJpbmcgKikgYWRkcjsKKyAgfQorCisgIG1lbXNldCAoc2VsZi0+cmluZywgMCwgT0JPRV9SSU5HX0xFTik7CisgIHNlbGYtPmlvLm1lbV9iYXNlID0gKF9fdTMyKSBzZWxmLT5yaW5nOworCisgIG9rID0gMTsKKyAgZm9yIChpID0gMDsgaSA8IFRYX1NMT1RTOyArK2kpCisgICAgeworICAgICAgc2VsZi0+dHhfYnVmc1tpXSA9IGttYWxsb2MgKFRYX0JVRl9TWiwgR0ZQX0tFUk5FTCk7CisgICAgICBpZiAoIXNlbGYtPnR4X2J1ZnNbaV0pCisgICAgICAgIG9rID0gMDsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IFJYX1NMT1RTOyArK2kpCisgICAgeworICAgICAgc2VsZi0+cnhfYnVmc1tpXSA9IGttYWxsb2MgKFJYX0JVRl9TWiwgR0ZQX0tFUk5FTCk7CisgICAgICBpZiAoIXNlbGYtPnJ4X2J1ZnNbaV0pCisgICAgICAgIG9rID0gMDsKKyAgICB9CisKKyAgaWYgKCFvaykKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IGNhbid0IGFsbG9jYXRlIHJ4L3R4IGJ1ZmZlcnNcbiIpOworICAgICAgZXJyID0gLUVOT01FTTsKKyAgICAgIGdvdG8gZnJlZWJ1ZnM7CisgICAgfQorCisKKyNpZmRlZiBVU0VfUFJPQkUKKyAgaWYgKGRvX3Byb2JlKQorICAgIGlmICghdG9zaG9ib2VfcHJvYmUgKHNlbGYpKQorICAgICAgeworICAgICAgICBlcnIgPSAtRU5PREVWOworICAgICAgICBnb3RvIGZyZWVidWZzOworICAgICAgfQorI2VuZGlmCisKKyAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICBTRVRfTkVUREVWX0RFVihkZXYsICZwY2lfZGV2LT5kZXYpOworICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHRvc2hvYm9lX2hhcmRfeG1pdDsKKyAgZGV2LT5vcGVuID0gdG9zaG9ib2VfbmV0X29wZW47CisgIGRldi0+c3RvcCA9IHRvc2hvYm9lX25ldF9jbG9zZTsKKyAgZGV2LT5kb19pb2N0bCA9IHRvc2hvYm9lX25ldF9pb2N0bDsKKworICBlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisgICAgICBlcnIgPSAtRU5PTUVNOworICAgICAgZ290byBmcmVlYnVmczsKKyAgICB9CisgIHByaW50ayAoS0VSTl9JTkZPICJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKworICBwY2lfc2V0X2RydmRhdGEocGNpX2RldixzZWxmKTsKKworICBwcmludGsgKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBVc2luZyBtdWx0aXBsZSB0YXNrcywgdmVyc2lvbiAlc1xuIiwgcmNzaWQpOworCisgIHJldHVybiAwOworCitmcmVlYnVmczoKKyAgZm9yIChpID0gMDsgaSA8IFRYX1NMT1RTOyArK2kpCisgICAgaWYgKHNlbGYtPnR4X2J1ZnNbaV0pCisgICAgICBrZnJlZSAoc2VsZi0+dHhfYnVmc1tpXSk7CisgIGZvciAoaSA9IDA7IGkgPCBSWF9TTE9UUzsgKytpKQorICAgIGlmIChzZWxmLT5yeF9idWZzW2ldKQorICAgICAga2ZyZWUgKHNlbGYtPnJ4X2J1ZnNbaV0pOworICBrZnJlZShzZWxmLT5yaW5nYnVmKTsKKworZnJlZXJlZ2lvbjoKKyAgcmVsZWFzZV9yZWdpb24gKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKworZnJlZXNlbGY6CisgIGZyZWVfbmV0ZGV2KGRldik7CisKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAordG9zaG9ib2VfZ290b3NsZWVwIChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IGNyYXApCit7CisgIHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiA9IChzdHJ1Y3QgdG9zaG9ib2VfY2IqKXBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgaW50IGkgPSAxMDsKKworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICBpZiAoIXNlbGYgfHwgc2VsZi0+c3RvcHBlZCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKCFzZWxmLT5pcmRhZCkgJiYgKCFzZWxmLT5hc3luYykpCisgICAgcmV0dXJuIDA7CisKKy8qIEZsdXNoIGFsbCBwYWNrZXRzICovCisgIHdoaWxlICgoaS0tKSAmJiAoc2VsZi0+dHhwZW5kaW5nKSkKKyAgICB1ZGVsYXkgKDEwMDAwKTsKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisgIHNlbGYtPnN0b3BwZWQgPSAxOworICBzZWxmLT50eHBlbmRpbmcgPSAwOworCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0b3Nob2JvZV93YWtldXAgKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYgPSAoc3RydWN0IHRvc2hvYm9lX2NiKilwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgaWYgKCFzZWxmIHx8ICFzZWxmLT5zdG9wcGVkKQorICAgIHJldHVybiAwOworCisgIGlmICgoIXNlbGYtPmlyZGFkKSAmJiAoIXNlbGYtPmFzeW5jKSkKKyAgICByZXR1cm4gMDsKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICB0b3Nob2JvZV9zdGFydGNoaXAgKHNlbGYpOworICBzZWxmLT5zdG9wcGVkID0gMDsKKworICBuZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZG9uYXVib2VfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZG9uYXVib2UiLAorCS5pZF90YWJsZQk9IHRvc2hvYm9lX3BjaV90YmwsCisJLnByb2JlCQk9IHRvc2hvYm9lX29wZW4sCisJLnJlbW92ZQkJPSB0b3Nob2JvZV9jbG9zZSwKKwkuc3VzcGVuZAk9IHRvc2hvYm9lX2dvdG9zbGVlcCwKKwkucmVzdW1lCQk9IHRvc2hvYm9lX3dha2V1cCAKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citkb25hdWJvZV9pbml0ICh2b2lkKQoreworICByZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkb25hdWJvZV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0Citkb25hdWJvZV9jbGVhbnVwICh2b2lkKQoreworICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRvbmF1Ym9lX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkb25hdWJvZV9pbml0KTsKK21vZHVsZV9leGl0KGRvbmF1Ym9lX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjE3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmgKQEAgLTAsMCArMSwzNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgdG9zaG9ib2UuaAorICogVmVyc2lvbjogICAgICAgMi4xNgorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgVG9zaGliYSBPQk9FIChvciB0eXBlLU8gb3IgNzAxKQorICogICAgICAgICAgICAgICAgRklSIENoaXBzZXQsIGFsc28gc3VwcG9ydHMgdGhlIERPTkFVT0JPRSAodHlwZS1ETworICogICAgICAgICAgICAgICAgb3IgZDAxKSBGSVIgY2hpcHNldCB3aGljaCBhcyBmYXIgYXMgSSBrbm93IGlzCisgKiAgICAgICAgICAgICAgICByZWdpc3RlciBjb21wYXRpYmxlLgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgSmFtZXMgTWNLZW56aWUgPGphbWVzQGZpc2hzb3VwLmRocy5vcmc+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgTWF5IDggIDEyOjM1OjI3IDE5OTkKKyAqIE1vZGlmaWVkOiAyLjE2IE1hcnRpbiBMdWNpbmEgPG1hdG9Aa290ZWxuYS5zaz4KKyAqIE1vZGlmaWVkOiAyLjE2IFNhdCBKdW4gMjIgMTg6NTQ6MjkgMjAwMiAoc3luYyBoZWFkZXJzKQorICogTW9kaWZpZWQ6IDIuMTcgQ2hyaXN0aWFuIEdlbm5lcmF0IDxjaHJpc3RpYW4uZ2VubmVyYXRAcG9seXRlY2huaXF1ZS5vcmc+CisgKiBNb2RpZmllZDogMi4xNyBqZXUgc2VwIDEyIDA4OjUwOjIwIDIwMDIgKGFkZCBsb2NrIHRvIGJlIHVzZWQgYnkgc3BpbmxvY2tzKQorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IEphbWVzIE1jS2VuemllLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgSmFtZXMgTWNLZW56aWUgbm9yIENhbWJyaWRnZSBVbml2ZXJzaXR5IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAKKyAqICAgICBBcHBsaWNhYmxlIE1vZGVscyA6IExpYnJldHRvIDEwMC8xMTBDVCBhbmQgbWFueSBtb3JlLgorICogICAgIFRvc2hpYmEgcmVmZXJzIHRvIHRoaXMgY2hpcCBhcyB0aGUgdHlwZS1PIElSIHBvcnQsCisgKiAgICAgb3IgdGhlIHR5cGUtRE8gSVIgcG9ydC4KKyAqCisgKiBJckRBIGNoaXAgc2V0IGxpc3QgZnJvbSBUb3NoaWJhIENvbXB1dGVyIEVuZ2luZWVyaW5nIENvcnAuCisgKiBtb2RlbAkJCW1ldGhvZAltYWtlcgljb250cm9sZXIJCVZlcnNpb24gCisgKiBQb3J0ZWdlIDMyMENUCUZJUixTSVIgVG9zaGliYSBPYm9lKFRyaWFuZ2xlKSAKKyAqIFBvcnRlZ2UgMzAxMENUCUZJUixTSVIgVG9zaGliYSBPYm9lKFN5ZG5leSkgCisgKiBQb3J0ZWdlIDMwMTVDVAlGSVIsU0lSIFRvc2hpYmEgT2JvZShTeWRuZXkpIAorICogUG9ydGVnZSAzMDIwQ1QJRklSLFNJUiBUb3NoaWJhIE9ib2UoU3lkbmV5KSAKKyAqIFBvcnRlZ2UgNzAyMENUCUZJUixTSVIgPwkJPworICogCisgKiBTYXRlbGwuIDQwOTBYQ0RUCUZJUixTSVIgPwkJPworICogCisgKiBMaWJyZXR0byAxMDBDVAlGSVIsU0lSIFRvc2hpYmEgT2JvZSAKKyAqIExpYnJldHRvIDEwMDBDVAlGSVIsU0lSIFRvc2hpYmEgT2JvZSAKKyAqIAorICogVEVDUkE3NTBEVkQJCUZJUixTSVIgVG9zaGliYSBPYm9lKFRyaWFuZ2xlKQlSRVYgSUQ9MTRoIAorICogVEVDUkE3ODAJCQlGSVIsU0lSIFRvc2hpYmEgT2JvZShTYW5kbG90KQlSRVYgSUQ9MzJoLDMzaCAKKyAqIFRFQ1JBNzUwQ0RUCQlGSVIsU0lSIFRvc2hpYmEgT2JvZShUcmlhbmdsZSkJUkVWIElEPTEzaCwxNGggCisgKiBURUNSQTgwMDAJCUZJUixTSVIgVG9zaGliYSBPYm9lKElTS1VSKQkJUkVWIElEPTIzaCAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjaGlwIGlzIGFsbGVnZWRseSByZWxlYXNlZCAgICAgICAgICovCisvKiBIb3dldmVyIEkgaGF2ZSBub3Qgc2VlbiBpdCwgbm90IGhhdmUgSSBtYW5hZ2VkIHRvIGNvbnRhY3QgICAgICovCisvKiBhbnlvbmUgd2hvIGhhcy4gSE9XRVZFUiB0aGUgY2hpcCBiZWFycyBhIHN0cmlraW5nIHJlc2VtYmxlbmNlICovCisvKiB0byB0aGUgSXJEQSBjb250cm9sbGVyIGluIHRoZSBUb3NoaWJhIFJJU0MgVE1QUjM5MjIgY2hpcCAgICAgICovCisvKiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBpcyBmcmVlbHkgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICovCisvKiBodHRwOi8vd3d3LnRvc2hpYmEuY29tL3RhZWMvY29tcG9uZW50cy9HZW5lcmljL1RNUFIzOTIyLnNodG1sICovCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHRoZSByZWdpc3RlcnMgaW4gdGhhdCBkb2N1bWVudCBhbmQgdGhlICAgICovCisvKiBSZWdpc3RlcnMgaW4gdGhlIDcwMSBvYm9lIGNoaXAgYXJlIGFzIGZvbGxvd3MgICAgKi8KKworCisvKiAzOTIyIHJlZyAgICAgNzAxIHJlZ3MsIGJ5IGJpdCBudW1iZXJzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgNy0gMCAgMTUtIDggIDI0LTE2ICAzMS0yNSAgICAgICAgICAgICAgICAgICAgICAqLworLyogJDI4ICAgICAgICAgICAgMHgwICAgIDB4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkMmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VFIE5PVEUgMSAgICAgICAgICAgKi8KKy8qICQzMCAgICAgICAgICAgIDB4NiAgICAweDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogJDM0ICAgICAgICAgICAgMHg4ICAgIDB4OSAgICAgICAgICAgICAgIFNFRSBOT1RFIDIgICAgICAgICAgICovCisvKiAkMzggICAgICAgICAgIDB4MTAgICAweDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICQzQyAgICAgICAgICAgICAgICAgICAweGUgICAgICAgICAgICAgICBTRUUgTk9URSAzICAgICAgICAgICAqLworLyogJDQwICAgICAgICAgICAweDEyICAgMHgxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkNDQgICAgICAgICAgIDB4MTQgICAweDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICQ0OCAgICAgICAgICAgMHgxNiAgIDB4MTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogJDRjICAgICAgICAgICAweDE4ICAgMHgxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkNTAgICAgICAgICAgIDB4MWEgICAweDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRklYTUU6IGNvdWxkIGJlIDB4MWIgMHgxYSBoZXJlICovCisKKy8qICQ1NCAgICAgICAgICAgMHgxZCAgIDB4MWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogJDVDICAgICAgICAgICAweGYgICAgICAgICAgICAgICAgICAgICAgIFNFRSBOT1RFIDQgICAgICAgICAgICovCisvKiAkMTMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VFIE5PVEUgNSAgICAgICAgICAgKi8KKy8qICQxMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUUgTk9URSA2ICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDEuIFRoZSBwb2ludGVyIHRvIHJpbmcgaXMgcGFja2VkIGluIG1vc3QgdW5jZXJlbW9uaXVzbHkgICAgICAqLworLyogICAgNzAxIFJlZ2lzdGVyICAgICAgQWRkcmVzcyBiaXRzICAgIChBOS1BMCBtdXN0IGJlIHplcm8pICAgICovCisvKiAgICAgICAgICAgIDB4NDogICAgICBBMTcgQTE2IEExNSBBMTQgQTEzIEExMiBBMTEgQTEwICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMHg1OiAgICAgIEEyNSBBMjQgQTIzIEEyMiBBMjEgQTIwIEExOSBBMTggICAgICAgICAqLworLyogICAgICAgICAgICAweDI6ICAgICAgICAwICAgMCBBMzEgQTMwIEEyOSBBMjggQTI3IEEyNiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDIuIFRoZSBNJCBkcml2ZXJzIGRvIGEgd3JpdGUgMHgxIHRvIDB4OSwgaG93ZXZlciB0aGUgMzkyMiAgICAqLworLyogICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBzdWdnZXN0IHRoYXQgYSB3cml0ZSBvZiAweDEgdG8gMHg4ICAgICovCisvKiAgICB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogMy4gVGhpcyBhc3NpZ25tZW50IGlzIHRlbnVvdXMgYXQgYmVzdCwgcmVnaXN0ZXIgMHhlIHNlZW1zIHRvICovCisvKiAgICBoYXZlIGJpdHMgYXJyYW5nZWQgMCAwIDAgUi9XIFIvVyBSL1cgUi9XIFIvVyAgICAgICAgICAgICAgKi8KKy8qICAgIGlmIGVpdGhlciBvZiB0aGUgbG93ZXIgdHdvIGJpdHMgYXJlIHNldCB0aGUgY2hpcCBzZWVtcyB0byAqLworLyogICAgc3dpdGNoIG9mZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuIEJpdHMgNy00IHNlZW0gdG8gYmUgZGlmZmVyZW50IDQgc2VlbXMganVzdCB0byBiZSBnZW5lcmljICAqLworLyogICAgcmVjZWl2ZXIgYnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDUuIGFuZCA2LiBUaGUgSUVSIGFuZCBJU1IgaGF2ZSBhIGRpZmZlcmVudCBiaXQgYXNzaWdubWVudCAgICAqLworLyogICAgVGhlIGxvd2VyIHRocmVlIGJpdHMgb2YgYm90aCByZWFkIGJhY2sgYXMgb25lcyAgICAgICAgICAgICovCisvKiBJU1IgaXMgcmVnaXN0ZXIgMHhjLCBJRVIgaXMgcmVnaXN0ZXIgMHhkICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICA3ICAgICAgNiAgICAgIDUgICAgICA0ICAgICAgMyAgICAgIDIgICAgICAxICAgICAgMCAqLworLyogMHhjOiBUeERvbmUgUnhEb25lIFR4VW5kciBSeE92ZXIgU2lwUmN2ICAgICAgMSAgICAgIDEgICAgICAxICovCisvKiAweGQ6IFR4RG9uZSBSeERvbmUgVHhVbmRyIFJ4T3ZlciBTaXBSY3YgICAgICAxICAgICAgMSAgICAgIDEgKi8KKy8qIFR4RG9uZSB4bWl0dCBkb25lIChnZW5lcmF0ZWQgb25seSBpZiBnZW5lcmF0ZSBpbnRlcnJ1cHQgYml0ICAqLworLyogICBpcyBzZXQgaW4gdGhlIHJpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSeERvbmUgcmVjdiBjb21wbGV0ZWQgKG9yIG90aGVyIHJlY3YgY29uZGl0aW9uIGlmIHlvdSBzZXQgaXQgKi8KKy8qICAgdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVHhVbmRlciB1bmRlcmZsb3cgaW4gVHJhbnNtaXQgRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSeE92ZXIgIG92ZXJmbG93IGluIFJlY3YgRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNpcFJjdiAgcmVjZWl2ZWQgc2VyaWFsIGdhcCAgKG9yIG90aGVyIGNvbmRpdGlvbiB5b3Ugc2V0KSAgICAqLworLyogSW50ZXJydXB0cyBhcmUgZW5hYmxlZCBieSB3cml0aW5nIGEgb25lIHRvIHRoZSBJRVIgcmVnaXN0ZXIgICovCisvKiBJbnRlcnJ1cHRzIGFyZSBjbGVhcmVkIGJ5IHdyaXR0aW5nIGEgb25lIHRvIHRoZSBJU1IgcmVnaXN0ZXIgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogNi4gVGhlIHJlbWFpbmluZyByZWdpc3RlcnM6IDB4NiBhbmQgMHgzIGFwcGVhciB0byBiZSAgICAgICAgICovCisvKiAgICByZXNlcnZlZCBwYXJ0cyBvZiAxNiBvciAzMiBiaXQgcmVnaXN0ZXJzdGhlIHJlbWFpbmRlciAgICAgKi8KKy8qICAgIDB4YSAweGIgMHgxZSAweDFmIGNvdWxkIHBvc3NpYmx5IGJlIChieSB0aGVpciBiZWhhdmlvdXIpICAqLworLyogICAgdGhlIFVuaWNhc3QgRmlsdGVyIHJlZ2lzdGVyIGF0ICQ1OC4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDcuIFdoaWxlIHRoZSBjb3JlIG9idmlvdXNseSBleHBlY3RzIDMyIGJpdCBhY2Nlc3NlcyBhbGwgdGhlICAqLworLyogICAgTSQgZHJpdmVycyBkbyA4IGJpdCBhY2Nlc3NlcywgaW5mYWN0IHRoZSBNaW5pcG9ydCBvbmVzICAgICovCisvKiAgICB3cml0ZSBhbmQgcmVhZCBiYWNrIHRoZSBieXRlIHNlcnZlcmFsIHRpbWVzICh3aHk/KSAgICAgICAgKi8KKworCisjaWZuZGVmIFRPU0hPQk9FX0gKKyNkZWZpbmUgVE9TSE9CT0VfSAorCisvKiBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBPQk9FX0lPX0VYVEVOVAkweDFmCisKKy8qUmVjZWl2ZSBhbmQgdHJhbnNtaXQgc2xvdCBwb2ludGVycyAqLworI2RlZmluZSBPQk9FX1JFRyhpKQkoaSsoc2VsZi0+YmFzZSkpCisjZGVmaW5lIE9CT0VfUlhTTE9UCU9CT0VfUkVHKDB4MCkKKyNkZWZpbmUgT0JPRV9UWFNMT1QJT0JPRV9SRUcoMHgxKQorI2RlZmluZSBPQk9FX1NMT1RfTUFTSwkweDNmCisKKyNkZWZpbmUgT0JPRV9UWFJJTkdfT0ZGU0VUCQkweDIwMAorI2RlZmluZSBPQk9FX1RYUklOR19PRkZTRVRfSU5fU0xPVFMJMHg0MAorCisvKnBvaW50ZXIgdG8gdGhlIHJpbmcgKi8KKyNkZWZpbmUgT0JPRV9SSU5HX0JBU0UwCU9CT0VfUkVHKDB4NCkKKyNkZWZpbmUgT0JPRV9SSU5HX0JBU0UxCU9CT0VfUkVHKDB4NSkKKyNkZWZpbmUgT0JPRV9SSU5HX0JBU0UyCU9CT0VfUkVHKDB4MikKKyNkZWZpbmUgT0JPRV9SSU5HX0JBU0UzCU9CT0VfUkVHKDB4MykKKworLypOdW1iZXIgb2Ygc2xvdHMgaW4gdGhlIHJpbmcgKi8KKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkUgIE9CT0VfUkVHKDB4NykKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfUlg0CTB4MDAKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfUlg4CTB4MDEKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfUlgxNgkweDAzCisjZGVmaW5lIE9CT0VfUklOR19TSVpFX1JYMzIJMHgwNworI2RlZmluZSBPQk9FX1JJTkdfU0laRV9SWDY0CTB4MGYKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfVFg0CTB4MDAKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfVFg4CTB4MTAKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfVFgxNgkweDMwCisjZGVmaW5lIE9CT0VfUklOR19TSVpFX1RYMzIJMHg3MAorI2RlZmluZSBPQk9FX1JJTkdfU0laRV9UWDY0CTB4ZjAKKworI2RlZmluZSBPQk9FX1JJTkdfTUFYX1NJWkUJNjQKKworLypDYXVzZXMgdGhlIGd1YmJpbnMgdG8gcmUtZXhhbWluZSB0aGUgcmluZyAqLworI2RlZmluZSBPQk9FX1BST01QVAlPQk9FX1JFRygweDkpCisjZGVmaW5lIE9CT0VfUFJPTVBUX0JJVAkJMHgxCisKKy8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgT0JPRV9JU1IJT0JPRV9SRUcoMHhjKQorLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBPQk9FX0lFUglPQk9FX1JFRygweGQpCisvKiBJbnRlcnJ1cHQgYml0cyBmb3IgSUVSIGFuZCBJU1IgKi8KKyNkZWZpbmUgT0JPRV9JTlRfVFhET05FCQkweDgwCisjZGVmaW5lIE9CT0VfSU5UX1JYRE9ORQkJMHg0MAorI2RlZmluZSBPQk9FX0lOVF9UWFVOREVSCTB4MjAKKyNkZWZpbmUgT0JPRV9JTlRfUlhPVkVSCQkweDEwCisjZGVmaW5lIE9CT0VfSU5UX1NJUAkJMHgwOAorI2RlZmluZSBPQk9FX0lOVF9NQVNLCQkweGY4CisKKy8qUmVzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcxCU9CT0VfUkVHKDB4ZSkKKyNkZWZpbmUgT0JPRV9DT05GSUcxX1JTVAkweDAxCisjZGVmaW5lIE9CT0VfQ09ORklHMV9ESVNBQkxFCTB4MDIKKyNkZWZpbmUgT0JPRV9DT05GSUcxXzQJCTB4MDgKKyNkZWZpbmUgT0JPRV9DT05GSUcxXzgJCTB4MDgKKworI2RlZmluZSBPQk9FX0NPTkZJRzFfT04JCTB4OAorI2RlZmluZSBPQk9FX0NPTkZJRzFfUkVTRVQJMHhmCisjZGVmaW5lIE9CT0VfQ09ORklHMV9PRkYJMHhlCisKKyNkZWZpbmUgT0JPRV9TVEFUVVMJT0JPRV9SRUcoMHhmKQorI2RlZmluZSBPQk9FX1NUQVRVU19SWEJVU1kJMHgxMAorI2RlZmluZSBPQk9FX1NUQVRVU19GSVJSWAkweDA0CisjZGVmaW5lIE9CT0VfU1RBVFVTX01JUlJYCTB4MDIKKyNkZWZpbmUgT0JPRV9TVEFUVVNfU0lSUlgJMHgwMQorCisKKy8qU3BlZWQgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcwTAlPQk9FX1JFRygweDEwKQorI2RlZmluZSBPQk9FX0NPTkZJRzBICU9CT0VfUkVHKDB4MTEpCisKKyNkZWZpbmUgT0JPRV9DT05GSUcwSF9UWE9OTE9PUCAgMHg4MCAvKlRyYW5zbWl0IHdoZW4gbG9vcGluZyAoZGFuZ2Vyb3VzKSAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBIX0xPT1AJMHg0MCAvKkxvb3BiYWNrIFR4LT5SeCAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBIX0VOVFgJMHgxMCAvKkVuYWJsZSBUeCAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBIX0VOUlgJMHgwOCAvKkVuYWJsZSBSeCAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBIX0VORE1BQwkweDA0IC8qRW5hYmxlL3Jlc2V0KiB0aGUgRE1BIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcwSF9SQ1ZBTlkJMHgwMiAvKkRNQSBtb2RlIDE9Ynl0ZXMsIDA9ZHdvcmRzICovCisKKyNkZWZpbmUgT0JPRV9DT05GSUcwTF9DUkMxNgkweDgwIC8qQ1JDIDE9MTYgYml0IDA9MzIgYml0ICovCisjZGVmaW5lIE9CT0VfQ09ORklHMExfRU5GSVIJMHg0MCAvKkVuYWJsZSBGSVIgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcwTF9FTk1JUgkweDIwIC8qRW5hYmxlIE1JUiAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBMX0VOU0lSCTB4MTAgLypFbmFibGUgU0lSICovCisjZGVmaW5lIE9CT0VfQ09ORklHMExfRU5TSVJGCTB4MDggLypFbmFibGUgU0lSIGZyYW1lciAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBMX1NJUlRFU1QJMHgwNCAvKkVuYWJsZSBTSVIgZnJhbWVyIGluIE1JUiBhbmQgRklSICovCisjZGVmaW5lIE9CT0VfQ09ORklHMExfSU5WRVJUVFggIDB4MDIgLypJbnZlcnQgVHggTGluZSAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBMX0lOVkVSVFJYICAweDAxIC8qSW52ZXJ0IFJ4IExpbmUgKi8KKworI2RlZmluZSBPQk9FX0JPRglPQk9FX1JFRygweDEyKQorI2RlZmluZSBPQk9FX0VPRglPQk9FX1JFRygweDEzKQorCisjZGVmaW5lIE9CT0VfRU5BQkxFTAlPQk9FX1JFRygweDE0KQorI2RlZmluZSBPQk9FX0VOQUJMRUgJT0JPRV9SRUcoMHgxNSkKKworI2RlZmluZSBPQk9FX0VOQUJMRUhfUEhZQU5EQ0xPQ0sJMHg4MCAvKlRvZ2dsZSBsb3cgdG8gY29weSBjb25maWcgaW4gKi8KKyNkZWZpbmUgT0JPRV9FTkFCTEVIX0NPTkZJR0VSUgkJMHg0MAorI2RlZmluZSBPQk9FX0VOQUJMRUhfRklST04JCTB4MjAKKyNkZWZpbmUgT0JPRV9FTkFCTEVIX01JUk9OCQkweDEwCisjZGVmaW5lIE9CT0VfRU5BQkxFSF9TSVJPTgkJMHgwOAorI2RlZmluZSBPQk9FX0VOQUJMRUhfRU5UWAkJMHgwNAorI2RlZmluZSBPQk9FX0VOQUJMRUhfRU5SWAkJMHgwMgorI2RlZmluZSBPQk9FX0VOQUJMRUhfQ1JDMTYJCTB4MDEKKworI2RlZmluZSBPQk9FX0VOQUJMRUxfQlJPQURDQVNUCQkweDAxCisKKyNkZWZpbmUgT0JPRV9DVVJSX1BDT05GSUdMCQlPQk9FX1JFRygweDE2KSAvKkN1cnJlbnQgY29uZmlnICovCisjZGVmaW5lIE9CT0VfQ1VSUl9QQ09ORklHSAkJT0JPRV9SRUcoMHgxNykKKworI2RlZmluZSBPQk9FX05FV19QQ09ORklHTAkJT0JPRV9SRUcoMHgxOCkKKyNkZWZpbmUgT0JPRV9ORVdfUENPTkZJR0gJCU9CT0VfUkVHKDB4MTkpCisKKyNkZWZpbmUgT0JPRV9QQ09ORklHSF9CQVVETUFTSwkJMHhmYworI2RlZmluZSBPQk9FX1BDT05GSUdIX1dJRFRITUFTSwkJMHgwNAorI2RlZmluZSBPQk9FX1BDT05GSUdMX1dJRFRITUFTSwkJMHhlMAorI2RlZmluZSBPQk9FX1BDT05GSUdMX1BSRUFNQkxFTUFTSwkweDFmCisKKyNkZWZpbmUgT0JPRV9QQ09ORklHX0JBVURNQVNLCQkweGZjMDAKKyNkZWZpbmUgT0JPRV9QQ09ORklHX0JBVURTSElGVAkJMTAKKyNkZWZpbmUgT0JPRV9QQ09ORklHX1dJRFRITUFTSwkJMHgwNGUwCisjZGVmaW5lIE9CT0VfUENPTkZJR19XSURUSFNISUZUCQk1CisjZGVmaW5lIE9CT0VfUENPTkZJR19QUkVBTUJMRU1BU0sJMHgwMDFmCisjZGVmaW5lIE9CT0VfUENPTkZJR19QUkVBTUJMRVNISUZUCTAKKworI2RlZmluZSBPQk9FX01BWExFTkwJCQlPQk9FX1JFRygweDFhKQorI2RlZmluZSBPQk9FX01BWExFTkgJCQlPQk9FX1JFRygweDFiKQorCisjZGVmaW5lIE9CT0VfUlhDT1VOVEgJCQlPQk9FX1JFRygweDFjKSAvKlJlc2V0IG9uIHJlY2lwdCAqLworI2RlZmluZSBPQk9FX1JYQ09VTlRMCQkJT0JPRV9SRUcoMHgxZCkgLypvZiB3aG9sZSBwYWNrZXQgKi8KKworLyogVGhlIFBDSSBJRCBvZiB0aGUgT0JPRSBjaGlwICovCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRklSNzAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRklSNzAxIAkweDA3MDEKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRklSRDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRklSRDAxIAkweDBkMDEKKyNlbmRpZgorCitzdHJ1Y3QgT2JvZVNsb3QKK3sKKyAgX191MTYgbGVuOyAgICAgICAgICAgICAgICAgICAgLypUd2VsZXZlIGJpdHMgb2YgcGFja2V0IGxlbmd0aCAqLworICBfX3U4IHVudXNlZDsKKyAgX191OCBjb250cm9sOyAgICAgICAgICAgICAgICAgLypTbG90IGNvbnRyb2wvc3RhdHVzIHNlZSBiZWxvdyAqLworICBfX3UzMiBhZGRyZXNzOyAgICAgICAgICAgICAgICAvKlNsb3QgYnVmZmVyIGFkZHJlc3MgKi8KK30KK19fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBPQk9FX05UQVNLUyBPQk9FX1RYUklOR19PRkZTRVRfSU5fU0xPVFMKKworc3RydWN0IE9ib2VSaW5nCit7CisgIHN0cnVjdCBPYm9lU2xvdCByeFtPQk9FX05UQVNLU107CisgIHN0cnVjdCBPYm9lU2xvdCB0eFtPQk9FX05UQVNLU107Cit9OworCisjZGVmaW5lIE9CT0VfUklOR19MRU4gKHNpemVvZihzdHJ1Y3QgT2JvZVJpbmcpKQorCisKKyNkZWZpbmUgT0JPRV9DVExfVFhfSFdfT1dOUwkweDgwIC8qVy9SIFRoaXMgc2xvdCBvd25lZCBieSB0aGUgaGFyZHdhcmUgKi8KKyNkZWZpbmUgT0JPRV9DVExfVFhfRElTVFhfQ1JDCTB4NDAgLypXIERpc2FibGUgQ1JDIGdlbmVyYXRpb24gZm9yIFtGTV1JUiAqLworI2RlZmluZSBPQk9FX0NUTF9UWF9CQURfQ1JDICAgICAweDIwIC8qVyBHZW5lcmF0ZSBiYWQgQ1JDICovCisjZGVmaW5lIE9CT0VfQ1RMX1RYX1NJUAkJMHgxMCAgIC8qVyBHZW5lcmF0ZSBhbiBTSVAgYWZ0ZXIgeG1pdHRpb24gKi8KKyNkZWZpbmUgT0JPRV9DVExfVFhfTUtVTkRFUgkweDA4IC8qVyBHZW5lcmF0ZSBhbiB1bmRlcnJ1biBlcnJvciAqLworI2RlZmluZSBPQk9FX0NUTF9UWF9SVENFTlRYCTB4MDQgLypXIEVuYWJsZSByZWNlaXZlciBhbmQgZ2VuZXJhdGUgVFhkb25lICovCisgICAgIC8qICBBZnRlciB0aGlzIHNsb3QgaXMgcHJvY2Vzc2VkICAgICAgICAqLworI2RlZmluZSBPQk9FX0NUTF9UWF9VTkRFUgkweDAxICAvKlIgU2V0IGJ5IGhhcmR3YXJlIHRvIGluZGljYXRlIHVuZGVycnVuICovCisKKworI2RlZmluZSBPQk9FX0NUTF9SWF9IV19PV05TCTB4ODAgLypXL1IgVGhpcyBzbG90IG93bmVkIGJ5IGhhcmR3YXJlICovCisjZGVmaW5lIE9CT0VfQ1RMX1JYX1BIWUVSUgkweDQwIC8qUiBEZWNvZGVyIGVycm9yIG9uIHJlY2VpcHRpb24gKi8KKyNkZWZpbmUgT0JPRV9DVExfUlhfQ1JDRVJSCTB4MjAgLypSIENSQyBlcnJvciBvbmx5IHNldCBmb3IgW0ZNXUlSICovCisjZGVmaW5lIE9CT0VfQ1RMX1JYX0xFTkdUSAkweDEwIC8qUiBQYWNrZXQgPiBtYXggUnggbGVuZ3RoICAqLworI2RlZmluZSBPQk9FX0NUTF9SWF9PVkVSCTB4MDggICAvKlIgc2V0IHRvIGluZGljYXRlIGFuIG92ZXJmbG93ICovCisjZGVmaW5lIE9CT0VfQ1RMX1JYX1NJUkJBRAkweDA0IC8qUiBTSVIgaGFkIEJPRiBpbiBwYWNrZXQgb3IgQUJPUlQgc2VxdWVuY2UgKi8KKyNkZWZpbmUgT0JPRV9DVExfUlhfUlhFT0YJMHgwMiAgLypSIEZpbmlzaGVkIHJlY2VpdmluZyBvbiB0aGlzIHNsb3QgKi8KKworCitzdHJ1Y3QgdG9zaG9ib2VfY2IKK3sKKyAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLworICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgc3RydWN0IHR0eV9kcml2ZXIgdHR5ZGV2OworCisgIHN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7ICAgICAgIC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KKworICBjaGlwaW9fdCBpbzsgICAgICAgICAgICAgICAgICAvKiBJckRBIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKyAgc3RydWN0IHFvc19pbmZvIHFvczsgICAgICAgICAgLyogUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhpcyBkZXZpY2UgKi8KKworICBfX3UzMiBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBJbnRlcmZhY2UgZmxhZ3MgKi8KKworICBzdHJ1Y3QgcGNpX2RldiAqcGRldjsgICAgICAgICAvKlBDSSBkZXZpY2UgKi8KKyAgaW50IGJhc2U7ICAgICAgICAgICAgICAgICAgICAgLypJTyBiYXNlICovCisKKworICBpbnQgdHhwZW5kaW5nOyAgICAgICAgICAgICAgICAvKmhvdyBtYW55IHR4J3MgYXJlIHBlbmRpbmcgKi8KKyAgaW50IHR4cywgcnhzOyAgICAgICAgICAgICAgICAgLypXaGljaCBzbG90cyBhcmUgd2UgYXQgICovCisKKyAgaW50IGlyZGFkOyAgICAgICAgICAgICAgICAgICAgLypEcml2ZXIgdW5kZXIgY29udHJvbCBvZiBuZXRkZXYgZW5kICAqLworICBpbnQgYXN5bmM7ICAgICAgICAgICAgICAgICAgICAvKkRyaXZlciB1bmRlciBjb250cm9sIG9mIGFzeW5jIGVuZCAgICovCisKKworICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAvKlN0b3BwZWQgYnkgc29tZSBvciBvdGhlciBBUE0gc3R1ZmYgKi8KKworICBpbnQgZmlsdGVyOyAgICAgICAgICAgICAgICAgICAvKkluIFNJUiBtb2RlIGRvIHdlIHdhbnQgdG8gcmVjZWl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMgb3IgYnl0ZSByYW5nZXMgKi8KKworICB2b2lkICpyaW5nYnVmOyAgICAgICAgICAgICAgICAvKlRoZSByaW5nIGJ1ZmZlciAqLworICBzdHJ1Y3QgT2JvZVJpbmcgKnJpbmc7ICAgICAgICAvKlRoZSByaW5nICovCisKKyAgdm9pZCAqdHhfYnVmc1tPQk9FX1JJTkdfTUFYX1NJWkVdOyAvKlRoZSBidWZmZXJzICAgKi8KKyAgdm9pZCAqcnhfYnVmc1tPQk9FX1JJTkdfTUFYX1NJWkVdOworCisKKyAgaW50IHNwZWVkOyAgICAgICAgICAgICAgICAgICAgLypDdXJyZW50IHNldHRpbmcgb2YgdGhlIHNwZWVkICovCisgIGludCBuZXdfc3BlZWQ7ICAgICAgICAgICAgICAgIC8qU2V0IHRvIHJlcXVlc3QgYSBzcGVlZCBjaGFuZ2UgKi8KKworLyogVGhlIHNwaW5sb2NrIHByb3RlY3QgY3JpdGljYWwgcGFydHMgb2YgdGhlIGRyaXZlci4KKyAqCUxvY2tpbmcgaXMgZG9uZSBsaWtlIHRoaXMgOgorICoJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICoJUmVsZWFzaW5nIHRoZSBsb2NrIDoKKyAqCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICovCisgIHNwaW5sb2NrX3Qgc3BpbmxvY2s7CQkKKyAgLyogVXNlZCBmb3IgdGhlIHByb2JlIGFuZCBkaWFnbm9zdGljcyBjb2RlICovCisgIGludCBpbnRfcng7CisgIGludCBpbnRfdHg7CisgIGludCBpbnRfdHh1bmRlcjsKKyAgaW50IGludF9yeG92ZXI7CisgIGludCBpbnRfc2lwOworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvZXA3MjExX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2VwNzIxMV9pci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODk2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2VwNzIxMV9pci5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogSVIgcG9ydCBkcml2ZXIgZm9yIHRoZSBDaXJydXMgTG9naWMgRVA3MjExIHByb2Nlc3Nvci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSwgQmx1ZSBNdWcgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorCisjZGVmaW5lIE1JTl9ERUxBWSAyNSAgICAgIC8qIDE1IHVzLCBidXQgd2FpdCBhIGxpdHRsZSBtb3JlIHRvIGJlIHN1cmUgKi8KKyNkZWZpbmUgTUFYX0RFTEFZIDEwMDAwICAgLyogMSBtcyAqLworCitzdGF0aWMgdm9pZCBlcDcyMTFfaXJfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgZXA3MjExX2lyX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIGVwNzIxMV9pcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgaW50ICBlcDcyMTFfaXJfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX0VQNzIxMV9JUiwKKwkub3BlbiA9IGVwNzIxMV9pcl9vcGVuLAorCS5jbG9zZSA9IGVwNzIxMV9pcl9jbG9zZSwKKwkucmVzZXQgPSBlcDcyMTFfaXJfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGVwNzIxMV9pcl9jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgdm9pZCBlcDcyMTFfaXJfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJdW5zaWduZWQgaW50IHN5c2NvbjEsIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCisJLyogVHVybiBvbiB0aGUgU0lSIGVuY29kZXIuICovCisJc3lzY29uMSA9IGNscHNfcmVhZGwoU1lTQ09OMSk7CisJc3lzY29uMSB8PSBTWVNDT04xX1NJUkVOOworCWNscHNfd3JpdGVsKHN5c2NvbjEsIFNZU0NPTjEpOworCisJLyogWFhYOiBXZSBzaG91bGQgZGlzYWJsZSBtb2RlbSBzdGF0dXMgaW50ZXJydXB0cyBvbiB0aGUgZmlyc3QKKwkJVUFSVCAoaW50ZXJydXB0ICMxNCkuICovCisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZXA3MjExX2lyX2Nsb3NlKGRvbmdsZV90ICpzZWxmKQoreworCXVuc2lnbmVkIGludCBzeXNjb24xLCBmbGFnczsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKworCS8qIFR1cm4gb2ZmIHRoZSBTSVIgZW5jb2Rlci4gKi8KKwlzeXNjb24xID0gY2xwc19yZWFkbChTWVNDT04xKTsKKwlzeXNjb24xICY9IH5TWVNDT04xX1NJUkVOOworCWNscHNfd3JpdGVsKHN5c2NvbjEsIFNZU0NPTjEpOworCisJLyogWFhYOiBJZiB3ZSd2ZSBkaXNhYmxlZCB0aGUgbW9kZW0gc3RhdHVzIGludGVycnVwdHMsIHdlIHNob3VsZAorCQlyZXNldCB0aGVtIGJhY2sgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuICovCisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGVwNzIxMV9pcl9jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICogICAgQ2hhbmdlIHNwZWVkIG9mIHRoZSBFUDcyMTEgSS9SIHBvcnQuIFdlIGRvbid0IHJlYWxseSBoYXZlIHRvIGRvIGFueXRoaW5nCisgKiAgICBmb3IgdGhlIEVQNzIxMSBhcyBsb25nIGFzIHRoZSByYXRlIGlzIGJlaW5nIGNoYW5nZWQgYXQgdGhlIHNlcmlhbCBwb3J0CisgKiAgICBsZXZlbC4KKyAqLworc3RhdGljIGludCBlcDcyMTFfaXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gZXA3MjExX2lyX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgICAgUmVzZXQgdGhlIEVQNzIxMSBJL1IuIFdlIGRvbid0IHJlYWxseSBoYXZlIHRvIGRvIGFueXRoaW5nLgorICoKKyAqLworc3RhdGljIGludCBlcDcyMTFfaXJfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBlcDcyMTFfaXJfaW5pdCh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgRVA3MjExIEkvUiBtb2R1bGUKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGVwNzIxMV9pcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGVwNzIxMV9pcl9jbGVhbnVwKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBFUDcyMTEgSS9SIG1vZHVsZQorICoKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGVwNzIxMV9pcl9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK01PRFVMRV9BVVRIT1IoIkpvbiBNY0NsaW50b2NrIDxqb25tQGJsdWVtdWcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFUDcyMTEgSS9SIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS04Iik7IC8qIElSREFfRVA3MjExX0lSICovCisJCQorbW9kdWxlX2luaXQoZXA3MjExX2lyX2luaXQpOworbW9kdWxlX2V4aXQoZXA3MjExX2lyX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9lc2ktc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2VzaS1zaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA4ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9lc2ktc2lyLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgZXNpLmMKKyAqIFZlcnNpb246ICAgICAgIDEuNgorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgRXh0ZW5kZWQgU3lzdGVtcyBKZXRFeWUgUEMgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgRmViIDIxIDE4OjU0OjM4IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBPY3QgMjcgMjI6MDE6MDQgMjAwMgorICogTW9kaWZpZWQgYnk6ICAgTWFydGluIERpZWhsIDxtYWRAbWRpZWhsLmRlPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCA8ZGFnYkBjcy51aXQubm8+LAorICogICAgIENvcHlyaWdodCAoYykgMTk5OCBUaG9tYXMgRGF2aXMsIDxyYXRiZXJ0QHJhZGlrcy5uZXQ+LAorICogICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwsIDxtYWRAbWRpZWhsLmRlPiwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKK3N0YXRpYyBpbnQgZXNpX29wZW4oc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IGVzaV9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqKTsKK3N0YXRpYyBpbnQgZXNpX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqLCB1bnNpZ25lZCk7CitzdGF0aWMgaW50IGVzaV9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqKTsKKworc3RhdGljIHN0cnVjdCBkb25nbGVfZHJpdmVyIGVzaSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIkpldEV5ZSBQQyBFU0ktOTY4MCBQQyIsCisJLnR5cGUJCT0gSVJEQV9FU0lfRE9OR0xFLAorCS5vcGVuCQk9IGVzaV9vcGVuLAorCS5jbG9zZQkJPSBlc2lfY2xvc2UsCisJLnJlc2V0CQk9IGVzaV9yZXNldCwKKwkuc2V0X3NwZWVkCT0gZXNpX2NoYW5nZV9zcGVlZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVzaV9zaXJfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmZXNpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVzaV9zaXJfY2xlYW51cCh2b2lkKQoreworCWlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoJmVzaSk7Cit9CisKK3N0YXRpYyBpbnQgZXNpX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCS8qIFBvd2VyIHVwIGFuZCBzZXQgZG9uZ2xlIHRvIDk2MDAgYmF1ZCAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOyAvKiBOZWVkcyBhdCBsZWFzdCAxMCBtcyAqLworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKKworCS8qIGlyZGEgdGhyZWFkIHdhaXRzIDUwIG1zZWMgZm9yIHBvd2VyIHNldHRsaW5nICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlc2lfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gZXNpX2NoYW5nZV9zcGVlZCAodGFzaykKKyAqCisgKiBTZXQgdGhlIHNwZWVkIGZvciB0aGUgRXh0ZW5kZWQgU3lzdGVtcyBKZXRFeWUgUEMgRVNJLTk2ODAgdHlwZSBkb25nbGUKKyAqIEFwcGFyZW50bHkgKHNlZSBvbGQgZXNpLWRyaXZlcikgbm8gZGVsYXlzIGFyZSBuZWVkZWQgaGVyZS4uLgorICoKKyAqLworc3RhdGljIGludCBlc2lfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworCWludCByZXQgPSAwOworCWludCBkdHIsIHJ0czsKKwkKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSAxOTIwMDoKKwkJZHRyID0gVFJVRTsKKwkJcnRzID0gRkFMU0U7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwOgorCQlkdHIgPSBydHMgPSBUUlVFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlzcGVlZCA9IDk2MDA7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgOTYwMDoKKwkJZHRyID0gRkFMU0U7CisJCXJ0cyA9IFRSVUU7CisJCWJyZWFrOworCX0KKworCS8qIENoYW5nZSBzcGVlZCBvZiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBkdHIsIHJ0cyk7CisJZGV2LT5zcGVlZCA9IHNwZWVkOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGVzaV9yZXNldCAodGFzaykKKyAqCisgKiAgICBSZXNldCBkb25nbGU7CisgKgorICovCitzdGF0aWMgaW50IGVzaV9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwkvKiBIbSwgdGhlIG9sZCBlc2ktZHJpdmVyIGxlZnQgdGhlIGRvbmdsZSB1bnBvd2VyZWQgcmVseWluZyBvbgorCSAqIHRoZSBmb2xsb3dpbmcgc3BlZWQgY2hhbmdlIHRvIHJlcG93ZXIuIFRoaXMgbWlnaHQgd29yayBmb3IKKwkgKiB0aGUgZXNpIGJlY2F1c2Ugd2Ugb25seSBuZWVkIHRoZSBtb2RlbSBsaW5lcy4gSG93ZXZlciwgbm93IHRoZQorCSAqIGdlbmVyYWwgcnVsZSBpcyByZXNldCBtdXN0IGJyaW5nIHRoZSBkb25nbGUgdG8gc29tZSB3b3JraW5nCisJICogd2VsbC1rbm93biBzdGF0ZSBiZWNhdXNlIHNwZWVkIGNoYW5nZSBtaWdodCB3cml0ZSB0byByZWdpc3RlcnMuCisJICogVGhlIG9sZCBlc2ktZHJpdmVyIGRpZG4ndCBhbnkgZGVsYXkgaGVyZSAtIGxldCdzIGhvcGUgaXQnIGZpbmUuCisJICovCisKKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgVFJVRSk7CisJZGV2LT5zcGVlZCA9IDk2MDA7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFeHRlbmRlZCBTeXN0ZW1zIEpldEV5ZSBQQyBkb25nbGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTEiKTsgLyogSVJEQV9FU0lfRE9OR0xFICovCisKK21vZHVsZV9pbml0KGVzaV9zaXJfaW5pdCk7Cittb2R1bGVfZXhpdChlc2lfc2lyX2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2VzaS5jIGIvZHJpdmVycy9uZXQvaXJkYS9lc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2E2MWFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9lc2kuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBlc2kuYworICogVmVyc2lvbjogICAgICAgMS41CisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBFeHRlbmRlZCBTeXN0ZW1zIEpldEV5ZSBQQyBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBGZWIgMjEgMTg6NTQ6MzggMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgRnJpIERlYyAxNyAwOToxNDowNCAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIDxkYWdiQGNzLnVpdC5ubz4sCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4IFRob21hcyBEYXZpcywgPHJhdGJlcnRAcmFkaWtzLm5ldD4sCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKK3N0YXRpYyB2b2lkIGVzaV9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBlc2lfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOworc3RhdGljIGludCAgZXNpX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyBpbnQgIGVzaV9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfRVNJX0RPTkdMRSwKKwkub3BlbiA9IGVzaV9vcGVuLAorCS5jbG9zZSA9IGVzaV9jbG9zZSwKKwkucmVzZXQgPSBlc2lfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGVzaV9jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlc2lfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlc2lfY2xlYW51cCh2b2lkKQoreworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBlc2lfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzExNTIwMDsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDE7IC8qIE5lZWRzIGF0IGxlYXN0IDEwIG1zICovCit9CisKK3N0YXRpYyB2b2lkIGVzaV9jbG9zZShkb25nbGVfdCAqZG9uZ2xlKQorewkJCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCWRvbmdsZS0+c2V0X2R0cl9ydHMoZG9uZ2xlLT5kZXYsIEZBTFNFLCBGQUxTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBlc2lfY2hhbmdlX3NwZWVkICh0YXNrKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBFeHRlbmRlZCBTeXN0ZW1zIEpldEV5ZSBQQyBFU0ktOTY4MCB0eXBlIGRvbmdsZQorICoKKyAqLworc3RhdGljIGludCBlc2lfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworCWludCBkdHIsIHJ0czsKKwkKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSAxOTIwMDoKKwkJZHRyID0gVFJVRTsKKwkJcnRzID0gRkFMU0U7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwOgorCQlkdHIgPSBydHMgPSBUUlVFOworCQlicmVhazsKKwljYXNlIDk2MDA6CisJZGVmYXVsdDoKKwkJZHRyID0gRkFMU0U7CisJCXJ0cyA9IFRSVUU7CisJCWJyZWFrOworCX0KKworCS8qIENoYW5nZSBzcGVlZCBvZiBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIGR0ciwgcnRzKTsKKwlzZWxmLT5zcGVlZCA9IHNwZWVkOworCisJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBlc2lfcmVzZXQgKHRhc2spCisgKgorICogICAgUmVzZXQgZG9uZ2xlOworICoKKyAqLworc3RhdGljIGludCBlc2lfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwkKKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CisJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRXh0ZW5kZWQgU3lzdGVtcyBKZXRFeWUgUEMgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0xIik7IC8qIElSREFfRVNJX0RPTkdMRSAqLworCisvKgorICogRnVuY3Rpb24gaW5pdF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBFU0kgbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdChlc2lfaW5pdCk7CisKKy8qCisgKiBGdW5jdGlvbiBjbGVhbnVwX21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBDbGVhbnVwIEVTSSBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KGVzaV9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9naXJiaWwtc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2dpcmJpbC1zaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDJmZTg3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvZ2lyYmlsLXNpci5jCkBAIC0wLDAgKzEsMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgZ2lyYmlsLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMgorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBHcmVlbndpY2ggR0lyQklMIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU2F0IEZlYiAgNiAyMTowMjozMyAxOTk5CisgKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjEzOjIwIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKK3N0YXRpYyBpbnQgZ2lyYmlsX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBnaXJiaWxfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgZ2lyYmlsX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBnaXJiaWxfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKTsKKworLyogQ29udHJvbCByZWdpc3RlciAxICovCisjZGVmaW5lIEdJUkJJTF9UWEVOICAgIDB4MDEgLyogRW5hYmxlIHRyYW5zbWl0dGVyICovCisjZGVmaW5lIEdJUkJJTF9SWEVOICAgIDB4MDIgLyogRW5hYmxlIHJlY2VpdmVyICovCisjZGVmaW5lIEdJUkJJTF9FQ0FOICAgIDB4MDQgLyogQ2FuY2VsIHNlbGYgZW1taXRlZCBkYXRhICovCisjZGVmaW5lIEdJUkJJTF9FQ0hPICAgIDB4MDggLyogRWNobyBjb250cm9sIGNoYXJhY3RlcnMgKi8KKworLyogTEVEIEN1cnJlbnQgUmVnaXN0ZXIgKDB4MikgKi8KKyNkZWZpbmUgR0lSQklMX0hJR0ggICAgMHgyMAorI2RlZmluZSBHSVJCSUxfTUVESVVNICAweDIxCisjZGVmaW5lIEdJUkJJTF9MT1cgICAgIDB4MjIKKworLyogQmF1ZCByZWdpc3RlciAoMHgzKSAqLworI2RlZmluZSBHSVJCSUxfMjQwMCAgICAweDMwCisjZGVmaW5lIEdJUkJJTF80ODAwICAgIDB4MzEKKyNkZWZpbmUgR0lSQklMXzk2MDAgICAgMHgzMgorI2RlZmluZSBHSVJCSUxfMTkyMDAgICAweDMzCisjZGVmaW5lIEdJUkJJTF8zODQwMCAgIDB4MzQKKyNkZWZpbmUgR0lSQklMXzU3NjAwICAgMHgzNQorI2RlZmluZSBHSVJCSUxfMTE1MjAwICAweDM2CisKKy8qIE1vZGUgcmVnaXN0ZXIgKDB4NCkgKi8KKyNkZWZpbmUgR0lSQklMX0lSREEgICAgMHg0MAorI2RlZmluZSBHSVJCSUxfQVNLICAgICAweDQxCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgMiAoMHg1KSAqLworI2RlZmluZSBHSVJCSUxfTE9BRCAgICAweDUxIC8qIExvYWQgdGhlIG5ldyBiYXVkIHJhdGUgdmFsdWUgKi8KKworc3RhdGljIHN0cnVjdCBkb25nbGVfZHJpdmVyIGdpcmJpbCA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIkdyZWVud2ljaCBHSXJCSUwiLAorCS50eXBlCQk9IElSREFfR0lSQklMX0RPTkdMRSwKKwkub3BlbgkJPSBnaXJiaWxfb3BlbiwKKwkuY2xvc2UJCT0gZ2lyYmlsX2Nsb3NlLAorCS5yZXNldAkJPSBnaXJiaWxfcmVzZXQsCisJLnNldF9zcGVlZAk9IGdpcmJpbF9jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnaXJiaWxfc2lyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9yZWdpc3Rlcl9kb25nbGUoJmdpcmJpbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnaXJiaWxfc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZnaXJiaWwpOworfQorCitzdGF0aWMgaW50IGdpcmJpbF9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHFvc19pbmZvICpxb3MgPSAmZGV2LT5xb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb24gZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMzsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvKiBpcmRhIHRocmVhZCB3YWl0cyA1MCBtc2VjIGZvciBwb3dlciBzZXR0bGluZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2lyYmlsX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBnaXJiaWxfY2hhbmdlX3NwZWVkIChkZXYsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBHaXJiaWwgdHlwZSBkb25nbGUuCisgKgorICovCisKKyNkZWZpbmUgR0lSQklMX1NUQVRFX1dBSVRfU1BFRUQJKFNJUkRFVl9TVEFURV9ET05HTEVfU1BFRUQgKyAxKQorCitzdGF0aWMgaW50IGdpcmJpbF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJdW5zaWduZWQgc3RhdGUgPSBkZXYtPmZzbS5zdWJzdGF0ZTsKKwl1bnNpZ25lZCBkZWxheSA9IDA7CisJdTggY29udHJvbFsyXTsKKwlzdGF0aWMgaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogZG9uZ2xlIGFscmVhZCByZXNldCAtIHBvcnQgYW5kIGRvbmdsZSBhdCBkZWZhdWx0IHNwZWVkICovCisKKwlzd2l0Y2goc3RhdGUpIHsKKworCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRDoKKworCQkvKiBTZXQgRFRSIGFuZCBDbGVhciBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKworCQl1ZGVsYXkoMjUpOwkJLyogYmV0dGVyIHdhaXQgYSBsaXR0bGUgd2hpbGUgKi8KKworCQlyZXQgPSAwOworCQlzd2l0Y2ggKHNwZWVkKSB7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgOTYwMDoKKwkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfOTYwMDsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF8xOTIwMDsKKwkJCWJyZWFrOworCQljYXNlIDM0ODAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF8zODQwMDsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF81NzYwMDsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKwkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfMTE1MjAwOworCQkJYnJlYWs7CisJCX0KKwkJY29udHJvbFsxXSA9IEdJUkJJTF9MT0FEOworCQorCQkvKiBXcml0ZSBjb250cm9sIGJ5dGVzICovCisJCXNpcmRldl9yYXdfd3JpdGUoZGV2LCBjb250cm9sLCAyKTsKKworCQlkZXYtPnNwZWVkID0gc3BlZWQ7CisKKwkJc3RhdGUgPSBHSVJCSUxfU1RBVEVfV0FJVF9TUEVFRDsKKwkJZGVsYXkgPSAxMDA7CisJCWJyZWFrOworCisJY2FzZSBHSVJCSUxfU1RBVEVfV0FJVF9TUEVFRDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCQl1ZGVsYXkoMjUpOwkJLyogYmV0dGVyIHdhaXQgYSBsaXR0bGUgd2hpbGUgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcyAtIHVuZGVmaW5lZCBzdGF0ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlkZXYtPmZzbS5zdWJzdGF0ZSA9IHN0YXRlOworCXJldHVybiAoZGVsYXkgPiAwKSA/IGRlbGF5IDogcmV0OworfQorCisvKgorICogRnVuY3Rpb24gZ2lyYmlsX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgZ2lyYmlsIGRvbmdsZS4KKyAqCisgKiAgICAgIEFsZ29yaXRobToKKyAqICAgIAkgIDAuIHNldCBSVFMsIGFuZCB3YWl0IGF0IGxlYXN0IDUgbXMKKyAqICAgICAgICAxLiBjbGVhciBSVFMKKyAqLworCisKKyNkZWZpbmUgR0lSQklMX1NUQVRFX1dBSVQxX1JFU0VUCShTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUICsgMSkKKyNkZWZpbmUgR0lSQklMX1NUQVRFX1dBSVQyX1JFU0VUCShTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUICsgMikKKyNkZWZpbmUgR0lSQklMX1NUQVRFX1dBSVQzX1JFU0VUCShTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUICsgMykKKworc3RhdGljIGludCBnaXJiaWxfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBzdGF0ZSA9IGRldi0+ZnNtLnN1YnN0YXRlOworCXVuc2lnbmVkIGRlbGF5ID0gMDsKKwl1OCBjb250cm9sID0gR0lSQklMX1RYRU4gfCBHSVJCSUxfUlhFTjsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUOgorCQkvKiBSZXNldCBkb25nbGUgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgRkFMU0UpOworCQkvKiBTbGVlcCBhdCBsZWFzdCA1IG1zICovCisJCWRlbGF5ID0gMjA7CisJCXN0YXRlID0gR0lSQklMX1NUQVRFX1dBSVQxX1JFU0VUOworCQlicmVhazsKKworCWNhc2UgR0lSQklMX1NUQVRFX1dBSVQxX1JFU0VUOgorCQkvKiBTZXQgRFRSIGFuZCBjbGVhciBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKwkJZGVsYXkgPSAyMDsKKwkJc3RhdGUgPSBHSVJCSUxfU1RBVEVfV0FJVDJfUkVTRVQ7CisJCWJyZWFrOworCisJY2FzZSBHSVJCSUxfU1RBVEVfV0FJVDJfUkVTRVQ6CisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZSAqLworCQlzaXJkZXZfcmF3X3dyaXRlKGRldiwgJmNvbnRyb2wsIDEpOworCQlkZWxheSA9IDIwOworCQlzdGF0ZSA9IEdJUkJJTF9TVEFURV9XQUlUM19SRVNFVDsKKwkJYnJlYWs7CisKKwljYXNlIEdJUkJJTF9TVEFURV9XQUlUM19SRVNFVDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKwkJZGV2LT5zcGVlZCA9IDk2MDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5kZWZpbmVkIHN0YXRlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlkZXYtPmZzbS5zdWJzdGF0ZSA9IHN0YXRlOworCXJldHVybiAoZGVsYXkgPiAwKSA/IGRlbGF5IDogcmV0OworfQorCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdyZWVud2ljaCBHSXJCSUwgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS00Iik7IC8qIElSREFfR0lSQklMX0RPTkdMRSAqLworCittb2R1bGVfaW5pdChnaXJiaWxfc2lyX2luaXQpOworbW9kdWxlX2V4aXQoZ2lyYmlsX3Npcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvZ2lyYmlsLmMgYi9kcml2ZXJzL25ldC9pcmRhL2dpcmJpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OGFlYjBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9naXJiaWwuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBnaXJiaWwuYworICogVmVyc2lvbjogICAgICAgMS4yCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEdyZWVud2ljaCBHSXJCSUwgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgRmViICA2IDIxOjAyOjMzIDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTcgMDk6MTM6MjAgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCitzdGF0aWMgaW50ICBnaXJiaWxfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgdm9pZCBnaXJiaWxfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgZ2lyYmlsX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIGdpcmJpbF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBHSVJCSUxfVFhFTiAgICAweDAxIC8qIEVuYWJsZSB0cmFuc21pdHRlciAqLworI2RlZmluZSBHSVJCSUxfUlhFTiAgICAweDAyIC8qIEVuYWJsZSByZWNlaXZlciAqLworI2RlZmluZSBHSVJCSUxfRUNBTiAgICAweDA0IC8qIENhbmNlbCBzZWxmIGVtbWl0ZWQgZGF0YSAqLworI2RlZmluZSBHSVJCSUxfRUNITyAgICAweDA4IC8qIEVjaG8gY29udHJvbCBjaGFyYWN0ZXJzICovCisKKy8qIExFRCBDdXJyZW50IFJlZ2lzdGVyICgweDIpICovCisjZGVmaW5lIEdJUkJJTF9ISUdIICAgIDB4MjAKKyNkZWZpbmUgR0lSQklMX01FRElVTSAgMHgyMQorI2RlZmluZSBHSVJCSUxfTE9XICAgICAweDIyCisKKy8qIEJhdWQgcmVnaXN0ZXIgKDB4MykgKi8KKyNkZWZpbmUgR0lSQklMXzI0MDAgICAgMHgzMAorI2RlZmluZSBHSVJCSUxfNDgwMCAgICAweDMxCQorI2RlZmluZSBHSVJCSUxfOTYwMCAgICAweDMyCisjZGVmaW5lIEdJUkJJTF8xOTIwMCAgIDB4MzMKKyNkZWZpbmUgR0lSQklMXzM4NDAwICAgMHgzNAkKKyNkZWZpbmUgR0lSQklMXzU3NjAwICAgMHgzNQkKKyNkZWZpbmUgR0lSQklMXzExNTIwMCAgMHgzNgorCisvKiBNb2RlIHJlZ2lzdGVyICgweDQpICovCisjZGVmaW5lIEdJUkJJTF9JUkRBICAgIDB4NDAKKyNkZWZpbmUgR0lSQklMX0FTSyAgICAgMHg0MQorCisvKiBDb250cm9sIHJlZ2lzdGVyIDIgKDB4NSkgKi8KKyNkZWZpbmUgR0lSQklMX0xPQUQgICAgMHg1MSAvKiBMb2FkIHRoZSBuZXcgYmF1ZCByYXRlIHZhbHVlICovCisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX0dJUkJJTF9ET05HTEUsCisJLm9wZW4gPSBnaXJiaWxfb3BlbiwKKwkuY2xvc2UgPSBnaXJiaWxfY2xvc2UsCisJLnJlc2V0ID0gZ2lyYmlsX3Jlc2V0LAorCS5jaGFuZ2Vfc3BlZWQgPSBnaXJiaWxfY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2lyYmlsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2lyYmlsX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgZ2lyYmlsX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAzOworfQorCitzdGF0aWMgdm9pZCBnaXJiaWxfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpCit7CisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGdpcmJpbF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIEdpcmJpbCB0eXBlIGRvbmdsZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgZ2lyYmlsX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCV9fdTMyIHNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKKwlfX3U4IGNvbnRyb2xbMl07CisJaW50IHJldCA9IDA7CisKKwlzZWxmLT5zcGVlZF90YXNrID0gdGFzazsKKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorCQkvKiBOZWVkIHRvIHJlc2V0IHRoZSBkb25nbGUgYW5kIGdvIHRvIDk2MDAgYnBzIGJlZm9yZQorICAgICAgICAgICAgICAgICAgIHByb2dyYW1taW5nICovCisJCWlmIChpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCBnaXJiaWxfcmVzZXQsIE5VTEwsIHRhc2ssIAorCQkJCSAgICAgICh2b2lkICopIHNwZWVkKSkKKwkJeworCQkJLyogRG9uZ2xlIG5lZWQgbW9yZSB0aW1lIHRvIHJlc2V0ICovCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfV0FJVCk7CisKKwkJCS8qIEdpdmUgcmVzZXQgMSBzZWMgdG8gZmluaXNoICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQl9CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX0NISUxEX1dBSVQ6CisJCUlSREFfV0FSTklORygiJXMoKSwgcmVzZXR0aW5nIGRvbmdsZSB0aW1lZCBvdXQhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfRE9ORToKKwkJLyogU2V0IERUUiBhbmQgQ2xlYXIgUlRTIHRvIGVudGVyIGNvbW1hbmQgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsKKworCQlzd2l0Y2ggKHNwZWVkKSB7CisJCWNhc2UgOTYwMDoKKwkJZGVmYXVsdDoKKwkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfOTYwMDsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF8xOTIwMDsKKwkJCWJyZWFrOworCQljYXNlIDM0ODAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF8zODQwMDsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF81NzYwMDsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKwkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfMTE1MjAwOworCQkJYnJlYWs7CisJCX0KKwkJY29udHJvbFsxXSA9IEdJUkJJTF9MT0FEOworCQkKKwkJLyogV3JpdGUgY29udHJvbCBieXRlcyAqLworCQlzZWxmLT53cml0ZShzZWxmLT5kZXYsIGNvbnRyb2wsIDIpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVCk7CisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGdpcmJpbF9yZXNldCAoZHJpdmVyKQorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGdpcmJpbCBkb25nbGUuCisgKgorICogICAgICBBbGdvcml0aG06CisgKiAgICAJICAwLiBzZXQgUlRTLCBhbmQgd2FpdCBhdCBsZWFzdCA1IG1zIAorICogICAgICAgIDEuIGNsZWFyIFJUUyAKKyAqLworc3RhdGljIGludCBnaXJiaWxfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlfX3U4IGNvbnRyb2wgPSBHSVJCSUxfVFhFTiB8IEdJUkJJTF9SWEVOOworCWludCByZXQgPSAwOworCisJc2VsZi0+cmVzZXRfdGFzayA9IHRhc2s7CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwkJLyogUmVzZXQgZG9uZ2xlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOworCQkvKiBTbGVlcCBhdCBsZWFzdCA1IG1zICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMToKKwkJLyogU2V0IERUUiBhbmQgY2xlYXIgUlRTIHRvIGVudGVyIGNvbW1hbmQgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQyKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygyMCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQyOgorCQkvKiBXcml0ZSBjb250cm9sIGJ5dGUgKi8KKwkJc2VsZi0+d3JpdGUoc2VsZi0+ZGV2LCAmY29udHJvbCwgMSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMyk7CisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMzoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHcmVlbndpY2ggR0lyQklMIGRvbmdsZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtNCIpOyAvKiBJUkRBX0dJUkJJTF9ET05HTEUgKi8KKwkKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIEdpcmJpbCBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KGdpcmJpbF9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgR2lyYmlsIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2V4aXQoZ2lyYmlsX2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlMDAyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYwpAQCAtMCwwICsxLDE2MDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIGlyZGEtdXNiLmMKKyAqIFZlcnNpb246ICAgICAgIDAuOWIKKyAqIERlc2NyaXB0aW9uOiAgIElyREEtVVNCIERyaXZlcgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsIAorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ0BicmF0dGxpLm5ldD4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDAsIFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAxLCBEYWcgQnJhdHRsaSA8ZGFnQGJyYXR0bGkubmV0PgorICogICAgICBDb3B5cmlnaHQgKEMpIDIwMDEsIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqICAgICAgICAgIAorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJCQkgICAgSU1QT1JUQU5UIE5PVEUKKyAqCQkJICAgIC0tLS0tLS0tLS0tLS0tCisgKgorICogQXMgb2Yga2VybmVsIDIuNS4yMCwgdGhpcyBpcyB0aGUgc3RhdGUgb2YgY29tcGxpYW5jZSBhbmQgdGVzdGluZyBvZgorICogdGhpcyBkcml2ZXIgKGlyZGEtdXNiKSB3aXRoIHJlZ2FyZHMgdG8gdGhlIFVTQiBsb3cgbGV2ZWwgZHJpdmVycy4uLgorICoKKyAqIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBTVUNDRVNTRlVMTFkgd2l0aCB0aGUgZm9sbG93aW5nIGRyaXZlcnMgOgorICoJbyB1c2ItdWhjaS1oY2QJKEZvciBJbnRlbC9WaWEgVVNCIGNvbnRyb2xsZXJzKQorICoJbyB1aGNpLWhjZAkoQWx0ZXJuYXRlL0pFIGRyaXZlciBmb3IgSW50ZWwvVmlhIFVTQiBjb250cm9sbGVycykKKyAqCW8gb2hjaS1oY2QJKEZvciBvdGhlciBVU0IgY29udHJvbGxlcnMpCisgKgorICogVGhpcyBkcml2ZXIgaGFzIE5PVCBiZWVuIHRlc3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZHJpdmVycyA6CisgKglvIGVoY2ktaGNkCShVU0IgMi4wIGNvbnRyb2xsZXJzKQorICoKKyAqIE5vdGUgdGhhdCBhbGwgSENEIGRyaXZlcnMgZG8gVVJCX1pFUk9fUEFDS0VUIGFuZCB0aW1lb3V0IHByb3Blcmx5LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0IGFueW1vcmUuCisgKiBPbmUgY29tbW9uIHByb2JsZW0gaXMgdGhlIGZhaWx1cmUgdG8gc2V0IHRoZSBhZGRyZXNzIG9uIHRoZSBkb25nbGUsCisgKiBidXQgdGhpcyBoYXBwZW5zIGJlZm9yZSB0aGUgZHJpdmVyIGdldHMgbG9hZGVkLi4uCisgKgorICogSmVhbiBJSQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiaXJkYS11c2IuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHFvc19tdHRfYml0cyA9IDA7CisKKy8qIFRoZXNlIGFyZSB0aGUgY3VycmVudGx5IGtub3duIElyREEgVVNCIGRvbmdsZXMuIEFkZCBuZXcgZG9uZ2xlcyBoZXJlICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZG9uZ2xlc1tdID0geworCS8qIEFDVGlTWVMgQ29ycC4sICBBQ1QtSVIyMDAwVSBGSVItVVNCIEFkYXB0ZXIgKi8KKwl7IFVTQl9ERVZJQ0UoMHg5YzQsIDB4MDExKSwgLmRyaXZlcl9pbmZvID0gSVVDX1NQRUVEX0JVRyB8IElVQ19OT19XSU5ET1cgfSwKKwkvKiBMb29rIGxpa2UgQUNUaVNZUywgUmVwb3J0IDogSUJNIENvcnAuLCBJQk0gVWx0cmFQb3J0IElyREEgKi8KKwl7IFVTQl9ERVZJQ0UoMHg0NDI4LCAweDAxMiksIC5kcml2ZXJfaW5mbyA9IElVQ19TUEVFRF9CVUcgfCBJVUNfTk9fV0lORE9XIH0sCisJLyogS0MgVGVjaG5vbG9neSBJbmMuLCAgS0MtMTgwIFVTQiBJckRBIERldmljZSAqLworCXsgVVNCX0RFVklDRSgweDUwZiwgMHgxODApLCAuZHJpdmVyX2luZm8gPSBJVUNfU1BFRURfQlVHIHwgSVVDX05PX1dJTkRPVyB9LAorCS8qIEV4dGVuZGVkIFN5c3RlbXMsIEluYy4sICBYVE5EQWNjZXNzIElyREEgVVNCIChFU0ktOTY4NSkgKi8KKwl7IFVTQl9ERVZJQ0UoMHg4ZTksIDB4MTAwKSwgLmRyaXZlcl9pbmZvID0gSVVDX1NQRUVEX0JVRyB8IElVQ19OT19XSU5ET1cgfSwKKwl7IC5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTIHwKKwkgICAgICAgICAgICAgICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9TVUJDTEFTUywKKwkgIC5iSW50ZXJmYWNlQ2xhc3MgPSBVU0JfQ0xBU1NfQVBQX1NQRUMsCisJICAuYkludGVyZmFjZVN1YkNsYXNzID0gVVNCX0NMQVNTX0lSREEsCisJICAuZHJpdmVyX2luZm8gPSBJVUNfREVGQVVMVCwgfSwKKwl7IH0sIC8qIFRoZSBlbmQgKi8KK307CisKKy8qCisgKiBJbXBvcnRhbnQgbm90ZSA6CisgKiBEZXZpY2VzIGJhc2VkIG9uIHRoZSBTaWdtYVRlbCBjaGlwc2V0ICgweDY2ZiwgMHg0MjAwKSBhcmUgbm90IGRlc2lnbmVkCisgKiB1c2luZyB0aGUgIlVTQi1JckRBIHNwZWNpZmljYXRpb24iICh5ZXMsIHRoZXJlIGV4aXN0IHN1Y2ggYSB0aGluZyksIGFuZAorICogdGhlcmVmb3JlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKGRvbid0IGFkZCB0aGVtIGFib3ZlKS4KKyAqIFRoZXJlIGlzIGEgTGludXggZHJpdmVyLCBzdGlyNDIwMCwgdGhhdCBzdXBwb3J0IHRob3NlIFVTQiBkZXZpY2VzLgorICogSmVhbiBJSQorICovCisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkb25nbGVzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGlyZGFfY2xhc3NfZGVzYyAqaXJkYV91c2JfZmluZF9jbGFzc19kZXNjKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK3N0YXRpYyB2b2lkIGlyZGFfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworc3RhdGljIHZvaWQgaXJkYV91c2JfY2hhbmdlX3NwZWVkX3hib2ZzKHN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZik7CitzdGF0aWMgaW50IGlyZGFfdXNiX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXJkYV91c2Jfb3BlbihzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgaXJkYV91c2JfY2xvc2Uoc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIHNwZWVkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCB3cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgaXJkYV91c2JfcmVjZWl2ZShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgaXJkYV91c2JfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlyZGFfdXNiX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXJkYV91c2JfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHZvaWQgaXJkYV91c2JfbmV0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlyZGFfdXNiX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogVFJBTlNNSVQgUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBJckRBIHN0YWNrIGFuZCBzZW5kIHRoZW0gb24gdGhlIFVTQiBwaXBlLgorICogSGFuZGxlIHNwZWVkIGNoYW5nZSwgdGltZW91dCBhbmQgbG90J3Mgb2YgdWdsaW5lc3MuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV91c2JfYnVpbGRfaGVhZGVyKHNlbGYsIHNrYiwgaGVhZGVyKQorICoKKyAqICAgQnVpbGRzIFVTQi1JckRBIG91dGJvdW5kIGhlYWRlcgorICoKKyAqIFdoZW4gd2Ugc2VuZCBhbiBJckRBIGZyYW1lIG92ZXIgYW4gVVNCIHBpcGUsIHdlIGFkZCB0byBpdCBhIDEgYnl0ZQorICogaGVhZGVyLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZSB0aGlzIGhlYWRlciB3aXRoIHRoZSBwcm9wZXIgdmFsdWVzLgorICoKKyAqIEltcG9ydGFudCBub3RlIDogdGhlIFVTQi1JckRBIHNwZWMgMS4wIHNheSB2ZXJ5IGNsZWFybHkgaW4gY2hhcHRlciA1LjQuMi4yCisgKiB0aGF0IHRoZSBzZXR0aW5nIG9mIHRoZSBsaW5rIHNwZWVkIGFuZCB4Ym9mIG51bWJlciBpbiB0aGlzIG91dGJvdW5kIGhlYWRlcgorICogc2hvdWxkIGJlIGFwcGxpZWQgKkFGVEVSKiB0aGUgZnJhbWUgaGFzIGJlZW4gc2VudC4KKyAqIFVuZm9ydHVuYXRlbHksIHNvbWUgZGV2aWNlcyBhcmUgbm90IGNvbXBsaWFudCB3aXRoIHRoYXQuLi4gSXQgc2VlbXMgdGhhdAorICogcmVhZGluZyB0aGUgc3BlYyBpcyBmYXIgdG9vIGRpZmZpY3VsdC4uLgorICogSmVhbiBJSQorICovCitzdGF0aWMgdm9pZCBpcmRhX3VzYl9idWlsZF9oZWFkZXIoc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmLAorCQkJCSAgX191OCAqaGVhZGVyLAorCQkJCSAgaW50CWZvcmNlKQoreworCS8qIFNldCB0aGUgbmVnb3RpYXRlZCBsaW5rIHNwZWVkICovCisJaWYgKHNlbGYtPm5ld19zcGVlZCAhPSAtMSkgeworCQkvKiBIdW0uLi4gVWdseSBoYWNrIDotKAorCQkgKiBTb21lIGRldmljZSBhcmUgbm90IGNvbXBsaWFudCB3aXRoIHRoZSBzcGVjIGFuZCBjaGFuZ2UKKwkJICogcGFyYW1ldGVycyAqYmVmb3JlKiBzZW5kaW5nIHRoZSBmcmFtZS4gLSBKZWFuIElJCisJCSAqLworCQlpZiAoKHNlbGYtPmNhcGFiaWxpdHkgJiBJVUNfU1BFRURfQlVHKSAmJgorCQkgICAgKCFmb3JjZSkgJiYgKHNlbGYtPnNwZWVkICE9IC0xKSkgeworCQkJLyogTm8gc3BlZWQgYW5kIHhib2ZzIGNoYW5nZSBoZXJlCisJCQkgKiAod2UnbGwgZG8gaXQgbGF0ZXIgaW4gdGhlIHdyaXRlIGNhbGxiYWNrKSAqLworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgbm90IGNoYW5naW5nIHNwZWVkIHlldFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCSpoZWFkZXIgPSAwOworCQkJcmV0dXJuOworCQl9CisKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgY2hhbmdpbmcgc3BlZWQgdG8gJWRcbiIsIF9fRlVOQ1RJT05fXywgc2VsZi0+bmV3X3NwZWVkKTsKKwkJc2VsZi0+c3BlZWQgPSBzZWxmLT5uZXdfc3BlZWQ7CisJCS8qIFdlIHdpbGwgZG8gYCBzZWxmLT5uZXdfc3BlZWQgPSAtMTsgJyBpbiB0aGUgY29tcGxldGlvbgorCQkgKiBoYW5kbGVyIGp1c3QgaW4gY2FzZSB0aGUgY3VycmVudCBVUkIgZmFpbCAtIEplYW4gSUkgKi8KKworCQlzd2l0Y2ggKHNlbGYtPnNwZWVkKSB7CisJCWNhc2UgMjQwMDoKKwkJICAgICAgICAqaGVhZGVyID0gU1BFRURfMjQwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIDk2MDA6CisJCQkqaGVhZGVyID0gU1BFRURfOTYwMDsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJKmhlYWRlciA9IFNQRUVEXzE5MjAwOworCQkJYnJlYWs7CisJCWNhc2UgMzg0MDA6CisJCQkqaGVhZGVyID0gU1BFRURfMzg0MDA7CisJCQlicmVhazsKKwkJY2FzZSA1NzYwMDoKKwkJICAgICAgICAqaGVhZGVyID0gU1BFRURfNTc2MDA7CisJCQlicmVhazsKKwkJY2FzZSAxMTUyMDA6CisJCSAgICAgICAgKmhlYWRlciA9IFNQRUVEXzExNTIwMDsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwMDoKKwkJICAgICAgICAqaGVhZGVyID0gU1BFRURfNTc2MDAwOworCQkJYnJlYWs7CisJCWNhc2UgMTE1MjAwMDoKKwkJICAgICAgICAqaGVhZGVyID0gU1BFRURfMTE1MjAwMDsKKwkJCWJyZWFrOworCQljYXNlIDQwMDAwMDA6CisJCSAgICAgICAgKmhlYWRlciA9IFNQRUVEXzQwMDAwMDA7CisJCQlzZWxmLT5uZXdfeGJvZnMgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UKKwkJLyogTm8gY2hhbmdlICovCisJCSpoZWFkZXIgPSAwOworCQorCS8qIFNldCB0aGUgbmVnb3RpYXRlZCBhZGRpdGlvbmFsIFhCT0ZTICovCisJaWYgKHNlbGYtPm5ld194Ym9mcyAhPSAtMSkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBjaGFuZ2luZyB4Ym9mcyB0byAlZFxuIiwgX19GVU5DVElPTl9fLCBzZWxmLT5uZXdfeGJvZnMpOworCQlzZWxmLT54Ym9mcyA9IHNlbGYtPm5ld194Ym9mczsKKwkJLyogV2Ugd2lsbCBkbyBgIHNlbGYtPm5ld194Ym9mcyA9IC0xOyAnIGluIHRoZSBjb21wbGV0aW9uCisJCSAqIGhhbmRsZXIganVzdCBpbiBjYXNlIHRoZSBjdXJyZW50IFVSQiBmYWlsIC0gSmVhbiBJSSAqLworCisJCXN3aXRjaCAoc2VsZi0+eGJvZnMpIHsKKwkJY2FzZSA0ODoKKwkJCSpoZWFkZXIgfD0gMHgxMDsKKwkJCWJyZWFrOworCQljYXNlIDI4OgorCQljYXNlIDI0OgkvKiBVU0Igc3BlYyAxLjAgc2F5cyAyNCAqLworCQkJKmhlYWRlciB8PSAweDIwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgMTI6CisJCQkqaGVhZGVyIHw9IDB4MzA7CisJCQlicmVhazsKKwkJY2FzZSA1OiAvKiBCdWcgaW4gSXJMQVAgc3BlYz8gKHNob3VsZCBiZSA2KSAqLworCQljYXNlIDY6CisJCQkqaGVhZGVyIHw9IDB4NDA7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJKmhlYWRlciB8PSAweDUwOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCSpoZWFkZXIgfD0gMHg2MDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkqaGVhZGVyIHw9IDB4NzA7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJKmhlYWRlciB8PSAweDgwOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZW5kIGEgY29tbWFuZCB0byBjaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBkb25nbGUKKyAqIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggc3BpbmxvY2sgb24uCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfdXNiX2NoYW5nZV9zcGVlZF94Ym9mcyhzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYpCit7CisJX191OCAqZnJhbWU7CisJc3RydWN0IHVyYiAqdXJiOworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzcGVlZD0lZCwgeGJvZnM9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgc2VsZi0+bmV3X3NwZWVkLCBzZWxmLT5uZXdfeGJvZnMpOworCisJLyogR3JhYiB0aGUgc3BlZWQgVVJCICovCisJdXJiID0gc2VsZi0+c3BlZWRfdXJiOworCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgVVJCIHN0aWxsIGluIHVzZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgZmFrZSBmcmFtZSAqLworCWZyYW1lID0gc2VsZi0+c3BlZWRfYnVmZjsKKworCS8qIFNldCB0aGUgbmV3IHNwZWVkIGFuZCB4Ym9mcyBpbiB0aGlzIGZha2UgZnJhbWUgKi8KKwlpcmRhX3VzYl9idWlsZF9oZWFkZXIoc2VsZiwgZnJhbWUsIDEpOworCisJLyogU3VibWl0IHRoZSAwIGxlbmd0aCBJckRBIGZyYW1lIHRvIHRyaWdnZXIgbmV3IHNwZWVkIHNldHRpbmdzICovCisgICAgICAgIHVzYl9maWxsX2J1bGtfdXJiKHVyYiwgc2VsZi0+dXNiZGV2LAorCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoc2VsZi0+dXNiZGV2LCBzZWxmLT5idWxrX291dF9lcCksCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIElSREFfVVNCX1NQRUVEX01UVSwKKyAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9idWxrX2NhbGxiYWNrLCBzZWxmKTsKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBVU0JfSVJEQV9IRUFERVI7CisJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9BU1lOQ19VTkxJTks7CisKKwkvKiBJcnEgZGlzYWJsZWQgLT4gR0ZQX0FUT01JQyAqLworCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBmYWlsZWQgU3BlZWQgVVJCXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNwZWVkIFVSQiBjYWxsYmFjaworICogTm93LCB3ZSBjYW4gb25seSBnZXQgY2FsbGVkIGZvciB0aGUgc3BlZWQgVVJCLgorICovCitzdGF0aWMgdm9pZCBzcGVlZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmID0gdXJiLT5jb250ZXh0OworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBXZSBzaG91bGQgYWx3YXlzIGhhdmUgYSBjb250ZXh0ICovCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwkvKiBXZSBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCBmb3IgdGhlIHNwZWVkIFVSQiAqLworCUlSREFfQVNTRVJUKHVyYiA9PSBzZWxmLT5zcGVlZF91cmIsIHJldHVybjspOworCisJLyogQ2hlY2sgZm9yIHRpbWVvdXQgYW5kIG90aGVyIFVTQiBuYXN0aWVzICovCisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwkJLyogSSBnZXQgYSBsb3Qgb2YgLUVDT05OQUJPUlRFRCA9IC0xMDMgaGVyZSAtIEplYW4gSUkgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVVJCIGNvbXBsZXRlIHN0YXR1cyAlZCwgdHJhbnNmZXJfZmxhZ3MgMHglMDRYXG4iLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKKworCQkvKiBEb24ndCBkbyBhbnl0aGluZyBoZXJlLCB0aGF0IG1pZ2h0IGNvbmZ1c2UgdGhlIFVTQiBsYXllci4KKwkJICogSW5zdGVhZCwgd2Ugd2lsbCB3YWl0IGZvciBpcmRhX3VzYl9uZXRfdGltZW91dCgpLCB0aGUKKwkJICogbmV0d29yayBsYXllciB3YXRjaGRvZywgdG8gZml4IHRoZSBzaXR1YXRpb24uCisJCSAqIEplYW4gSUkgKi8KKwkJLyogQSByZXNldCBvZiB0aGUgZG9uZ2xlIG1pZ2h0IGJlIHdlbGNvbWVkIGhlcmUgLSBKZWFuIElJICovCisJCXJldHVybjsKKwl9CisKKwkvKiB1cmIgaXMgbm93IGF2YWlsYWJsZSAqLworCS8vdXJiLT5zdGF0dXMgPSAwOyAtPiB0ZXN0ZWQgYWJvdmUKKworCS8qIE5ldyBzcGVlZCBhbmQgeGJvZiBpcyBub3cgY29tbWl0ZWQgaW4gaGFyZHdhcmUgKi8KKwlzZWxmLT5uZXdfc3BlZWQgPSAtMTsKKwlzZWxmLT5uZXdfeGJvZnMgPSAtMTsKKworCS8qIEFsbG93IHRoZSBzdGFjayB0byBzZW5kIG1vcmUgcGFja2V0cyAqLworCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNlbmQgYW4gSXJEQSBmcmFtZSB0byB0aGUgVVNCIGRvbmdsZSAoZm9yIHRyYW5zbWlzc2lvbikKKyAqLworc3RhdGljIGludCBpcmRhX3VzYl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IHVyYiAqdXJiID0gc2VsZi0+dHhfdXJiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJczMyIHNwZWVkOworCXMxNiB4Ym9mczsKKwlpbnQgcmVzLCBtdHQ7CisJaW50CWVyciA9IDE7CS8qIEZhaWxlZCAqLworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSBvbiAlc1xuIiwgX19GVU5DVElPTl9fLCBuZXRkZXYtPm5hbWUpOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJLyogUHJvdGVjdCB1cyBmcm9tIFVTQiBjYWxsYmFja3MsIG5ldCB3YXRjaGRvZyBhbmQgZWxzZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgdGhlIGRldmljZSBpcyBzdGlsbCB0aGVyZS4KKwkgKiBXZSBuZWVkIHRvIGNoZWNrIHNlbGYtPnByZXNlbnQgdW5kZXIgdGhlIHNwaW5sb2NrIGJlY2F1c2UKKwkgKiBvZiBpcmRhX3VzYl9kaXNjb25uZWN0KCkgaXMgc3luY2hyb25vdXMgLSBKZWFuIElJICovCisJaWYgKCFzZWxmLT5wcmVzZW50KSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIERldmljZSBpcyBnb25lLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGRyb3A7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiB4Ym9mcyAqLworICAgICAgICB4Ym9mcyA9IGlyZGFfZ2V0X25leHRfeGJvZnMoc2tiKTsKKyAgICAgICAgaWYgKCh4Ym9mcyAhPSBzZWxmLT54Ym9mcykgJiYgKHhib2ZzICE9IC0xKSkgeworCQlzZWxmLT5uZXdfeGJvZnMgPSB4Ym9mczsKKwl9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBTZXQgdGhlIGRlc2lyZWQgc3BlZWQgKi8KKwkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lICovCisJCWlmICghc2tiLT5sZW4pIHsKKwkJCS8qIElyTEFQIHNlbmQgdXMgYW4gZW1wdHkgZnJhbWUgdG8gbWFrZSB1cyBjaGFuZ2UgdGhlCisJCQkgKiBzcGVlZC4gQ2hhbmdpbmcgc3BlZWQgd2l0aCB0aGUgVVNCIGFkYXB0ZXIgaXMgaW4KKwkJCSAqIGZhY3Qgc2VuZGluZyBhbiBlbXB0eSBmcmFtZSB0byB0aGUgYWRhcHRlciwgc28gd2UKKwkJCSAqIGNvdWxkIGp1c3QgbGV0IHRoZSBwcmVzZW50IGZ1bmN0aW9uIGRvIGl0cyBqb2IuCisJCQkgKiBIb3dldmVyLCB3ZSB3b3VsZCB3YWl0IGZvciBtaW4gdHVybiB0aW1lLAorCQkJICogZG8gYW4gZXh0cmEgbWVtY3B5IGFuZCBpbmNyZW1lbnQgcGFja2V0IGNvdW50ZXJzLi4uCisJCQkgKiBKZWFuIElJICovCisJCQlpcmRhX3VzYl9jaGFuZ2Vfc3BlZWRfeGJvZnMoc2VsZik7CisJCQluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCS8qIFdpbGwgbmV0aWZfd2FrZV9xdWV1ZSgpIGluIGNhbGxiYWNrICovCisJCQllcnIgPSAwOwkvKiBObyBlcnJvciAqLworCQkJZ290byBkcm9wOworCQl9CisJfQorCisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBVUkIgc3RpbGwgaW4gdXNlIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBkcm9wOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyByb29tIGZvciBJckRBLVVTQiBoZWFkZXIuIFRoZSBhY3R1YWwKKwkgKiBhbGxvY2F0aW9uIHdpbGwgYmUgZG9uZSBsb3dlciBpbiBza2JfcHVzaCgpLgorCSAqIEFsc28sIHdlIGRvbid0IHVzZSBkaXJlY3RseSBza2JfY293KCksIGJlY2F1c2UgaXQgcmVxdWlyZQorCSAqIGhlYWRyb29tID49IDE2LCB3aGljaCBmb3JjZSB1bm5lY2Vzc2FyeSBjb3BpZXMgLSBKZWFuIElJICovCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgVVNCX0lSREFfSEVBREVSKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIEluc3VmaWNpZW50IHNrYiBoZWFkcm9vbS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmIChza2JfY293KHNrYiwgVVNCX0lSREFfSEVBREVSKSkgeworCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBmYWlsZWQgc2tiX2NvdygpICEhIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCX0KKworCS8qIENoYW5nZSBzZXR0aW5nIGZvciBuZXh0IGZyYW1lICovCisJaXJkYV91c2JfYnVpbGRfaGVhZGVyKHNlbGYsIHNrYl9wdXNoKHNrYiwgVVNCX0lSREFfSEVBREVSKSwgMCk7CisKKwkvKiBGSVhNRTogTWFrZSBtYWNybyBvdXQgb2YgdGhpcyBvbmUgKi8KKwkoKHN0cnVjdCBpcmRhX3NrYl9jYiAqKXNrYi0+Y2IpLT5jb250ZXh0ID0gc2VsZjsKKworICAgICAgICB1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNlbGYtPnVzYmRldiwgCisJCSAgICAgIHVzYl9zbmRidWxrcGlwZShzZWxmLT51c2JkZXYsIHNlbGYtPmJ1bGtfb3V0X2VwKSwKKyAgICAgICAgICAgICAgICAgICAgICBza2ItPmRhdGEsIElSREFfU0tCX01BWF9NVFUsCisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVsa19jYWxsYmFjaywgc2tiKTsKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBza2ItPmxlbjsKKwkvKiBOb3RlIDogdW5saW5rICptdXN0KiBiZSBBc3luY2hyb25vdXMgYmVjYXVzZSBvZiB0aGUgY29kZSBpbiAKKwkgKiBpcmRhX3VzYl9uZXRfdGltZW91dCgpIC0+IGNhbGwgaW4gaXJxIC0gSmVhbiBJSSAqLworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfQVNZTkNfVU5MSU5LOworCS8qIFRoaXMgZmxhZyAoVVJCX1pFUk9fUEFDS0VUKSBpbmRpY2F0ZXMgdGhhdCB3aGF0IHdlIHNlbmQgaXMgbm90CisJICogYSBjb250aW51b3VzIHN0cmVhbSBvZiBkYXRhIGJ1dCBzZXBhcmF0ZSBwYWNrZXRzLgorCSAqIEluIHRoaXMgY2FzZSwgdGhlIFVTQiBsYXllciB3aWxsIGluc2VydCBhbiBlbXB0eSBVU0IgZnJhbWUgKFREKQorCSAqIGFmdGVyIGVhY2ggb2Ygb3VyIHBhY2tldHMgdGhhdCBpcyBleGFjdCBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4KKwkgKiBUaGlzIGlzIGhvdyB0aGUgZG9uZ2xlIHdpbGwgZGV0ZWN0IHRoZSBlbmQgb2YgcGFja2V0IC0gSmVhbiBJSSAqLworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX1pFUk9fUEFDS0VUOworCisJLyogR2VuZXJhdGUgbWluIHR1cm4gdGltZS4gRklYTUU6IGNhbiB3ZSBkbyBiZXR0ZXIgdGhhbiB0aGlzPyAqLworCS8qIFRyeWluZyB0byBhIHR1cm5hcm91bmQgdGltZSBhdCB0aGlzIGxldmVsIGlzIHRyeWluZyB0byBtZWFzdXJlCisJICogcHJvY2Vzc29yIGNsb2NrIGN5Y2xlIHdpdGggYSB3cmlzdC13YXRjaCwgYXBwcm94aW1hdGUgYXQgYmVzdC4uLgorCSAqCisJICogV2hhdCB3ZSBrbm93IGlzIHRoZSBsYXN0IHRpbWUgd2UgcmVjZWl2ZWQgYSBmcmFtZSBvdmVyIFVTQi4KKwkgKiBEdWUgdG8gbGF0ZW5jeSBvdmVyIFVTQiB0aGF0IGRlcGVuZCBvbiB0aGUgVVNCIGxvYWQsIHdlIGRvbid0CisJICoga25vdyB3aGVuIHRoaXMgZnJhbWUgd2FzIHJlY2VpdmVkIG92ZXIgSXJEQSAoYSBmZXcgbXMgYmVmb3JlID8pCisJICogVGhlbiwgc2FtZSBzdG9yeSBmb3Igb3VyIG91dGdvaW5nIGZyYW1lLi4uCisJICoKKwkgKiBJbiB0aGVvcnksIHRoZSBVU0IgZG9uZ2xlIGlzIHN1cHBvc2VkIHRvIGhhbmRsZSB0aGUgdHVybmFyb3VuZAorCSAqIGJ5IGl0c2VsZiAoc3BlYyAxLjAsIGNoYXRlciA0LCBwYWdlIDYpLiBXaG8ga25vd3MgPz8/IFRoYXQncworCSAqIHdoeSB0aGlzIGNvZGUgaXMgZW5hYmxlZCBvbmx5IGZvciBkb25nbGVzIHRoYXQgZG9lc24ndCBtZWV0CisJICogdGhlIHNwZWMuCisJICogSmVhbiBJSSAqLworCWlmIChzZWxmLT5jYXBhYmlsaXR5ICYgSVVDX05PX1RVUk4pIHsKKwkJbXR0ID0gaXJkYV9nZXRfbXR0KHNrYik7CisJCWlmIChtdHQpIHsKKwkJCWludCBkaWZmOworCQkJZG9fZ2V0dGltZW9mZGF5KCZzZWxmLT5ub3cpOworCQkJZGlmZiA9IHNlbGYtPm5vdy50dl91c2VjIC0gc2VsZi0+c3RhbXAudHZfdXNlYzsKKyNpZmRlZiBJVV9VU0JfTUlOX1JUVAorCQkJLyogRmFjdG9yIGluIFVTQiBkZWxheXMgLT4gR2V0IHJpZCBvZiB1ZGVsYXkoKSB0aGF0CisJCQkgKiB3b3VsZCBiZSBsb3N0IGluIHRoZSBub2lzZSAtIEplYW4gSUkgKi8KKwkJCWRpZmYgKz0gSVVfVVNCX01JTl9SVFQ7CisjZW5kaWYgLyogSVVfVVNCX01JTl9SVFQgKi8KKwkJCS8qIElmIHRoZSB1c2VjIGNvdW50ZXIgZGlkIHdyYXBhcm91bmQsIHRoZSBkaWZmIHdpbGwKKwkJCSAqIGdvIG5lZ2F0aXZlICh0dl91c2VjIGlzIGEgbG9uZyksIHNvIHdlIG5lZWQgdG8KKwkJCSAqIGNvcnJlY3QgaXQgYnkgb25lIHNlY29uZC4gSmVhbiBJSSAqLworCQkJaWYgKGRpZmYgPCAwKQorCQkJCWRpZmYgKz0gMTAwMDAwMDsKKworCQkgICAgICAgIC8qIENoZWNrIGlmIHRoZSBtdHQgaXMgbGFyZ2VyIHRoYW4gdGhlIHRpbWUgd2UgaGF2ZQorCQkJICogYWxyZWFkeSB1c2VkIGJ5IGFsbCB0aGUgcHJvdG9jb2wgcHJvY2Vzc2luZworCQkJICovCisJCQlpZiAobXR0ID4gZGlmZikgeworCQkJCW10dCAtPSBkaWZmOworCQkJCWlmIChtdHQgPiAxMDAwKQorCQkJCQltZGVsYXkobXR0LzEwMDApOworCQkJCWVsc2UKKwkJCQkJdWRlbGF5KG10dCk7CisJCQl9CisJCX0KKwl9CisJCisJLyogQXNrIFVTQiB0byBzZW5kIHRoZSBwYWNrZXQgLSBJcnEgZGlzYWJsZWQgLT4gR0ZQX0FUT01JQyAqLworCWlmICgocmVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBmYWlsZWQgVHggVVJCXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJLyogTGV0IFVTQiByZWNvdmVyIDogV2Ugd2lsbCBjYXRjaCB0aGF0IGluIHRoZSB3YXRjaGRvZyAqLworCQkvKm5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7Ki8KKwl9IGVsc2UgeworCQkvKiBJbmNyZW1lbnQgcGFja2V0IHN0YXRzICovCisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICBzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCisJCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIDA7CisKK2Ryb3A6CisJLyogRHJvcCBzaWxlbnRseSB0aGUgc2tiIGFuZCBleGl0ICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZXJyOwkJLyogVXN1YWxseSAxICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBOb3RlIDogdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbmx5IGZvciB0eF91cmIuLi4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSAoKHN0cnVjdCBpcmRhX3NrYl9jYiAqKSBza2ItPmNiKS0+Y29udGV4dDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogV2Ugc2hvdWxkIGFsd2F5cyBoYXZlIGEgY29udGV4dCAqLworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJLyogV2Ugc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgZm9yIHRoZSBzcGVlZCBVUkIgKi8KKwlJUkRBX0FTU0VSVCh1cmIgPT0gc2VsZi0+dHhfdXJiLCByZXR1cm47KTsKKworCS8qIEZyZWUgdXAgdGhlIHNrYiAqLworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJdXJiLT5jb250ZXh0ID0gTlVMTDsKKworCS8qIENoZWNrIGZvciB0aW1lb3V0IGFuZCBvdGhlciBVU0IgbmFzdGllcyAqLworCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7CisJCS8qIEkgZ2V0IGEgbG90IG9mIC1FQ09OTkFCT1JURUQgPSAtMTAzIGhlcmUgLSBKZWFuIElJICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVSQiBjb21wbGV0ZSBzdGF0dXMgJWQsIHRyYW5zZmVyX2ZsYWdzIDB4JTA0WFxuIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cywgdXJiLT50cmFuc2Zlcl9mbGFncyk7CisKKwkJLyogRG9uJ3QgZG8gYW55dGhpbmcgaGVyZSwgdGhhdCBtaWdodCBjb25mdXNlIHRoZSBVU0IgbGF5ZXIsCisJCSAqIGFuZCB3ZSBjb3VsZCBnbyBpbiByZWN1cnNpb24gYW5kIGJsb3cgdGhlIGtlcm5lbCBzdGFjay4uLgorCQkgKiBJbnN0ZWFkLCB3ZSB3aWxsIHdhaXQgZm9yIGlyZGFfdXNiX25ldF90aW1lb3V0KCksIHRoZQorCQkgKiBuZXR3b3JrIGxheWVyIHdhdGNoZG9nLCB0byBmaXggdGhlIHNpdHVhdGlvbi4KKwkJICogSmVhbiBJSSAqLworCQkvKiBBIHJlc2V0IG9mIHRoZSBkb25nbGUgbWlnaHQgYmUgd2VsY29tZWQgaGVyZSAtIEplYW4gSUkgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIHVyYiBpcyBub3cgYXZhaWxhYmxlICovCisJLy91cmItPnN0YXR1cyA9IDA7IC0+IHRlc3RlZCBhYm92ZQorCisJLyogTWFrZSBzdXJlIHdlIHJlYWQgc2VsZi0+cHJlc2VudCBwcm9wZXJseSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB0aGUgbmV0d29yayBpcyBjbG9zZWQsIHN0b3AgZXZlcnl0aGluZyAqLworCWlmICgoIXNlbGYtPm5ldG9wZW4pIHx8ICghc2VsZi0+cHJlc2VudCkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgTmV0d29yayBpcyBnb25lLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBjaGFuZ2VzIHRvIHNwZWVkIG9yIHhib2ZzIGlzIHBlbmRpbmcuLi4gKi8KKwlpZiAoKHNlbGYtPm5ld19zcGVlZCAhPSAtMSkgfHwgKHNlbGYtPm5ld194Ym9mcyAhPSAtMSkpIHsKKwkJaWYgKChzZWxmLT5uZXdfc3BlZWQgIT0gc2VsZi0+c3BlZWQpIHx8CisJCSAgICAoc2VsZi0+bmV3X3hib2ZzICE9IHNlbGYtPnhib2ZzKSkgeworCQkJLyogV2UgaGF2ZW4ndCBjaGFuZ2VkIHNwZWVkIHlldCAoYmVjYXVzZSBvZgorCQkJICogSVVDX1NQRUVEX0JVRyksIHNvIGRvIGl0IG5vdyAtIEplYW4gSUkgKi8KKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIENoYW5naW5nIHNwZWVkIG5vdy4uLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWlyZGFfdXNiX2NoYW5nZV9zcGVlZF94Ym9mcyhzZWxmKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5ldyBzcGVlZCBhbmQgeGJvZiBpcyBub3cgY29tbWl0ZWQgaW4gaGFyZHdhcmUgKi8KKwkJCXNlbGYtPm5ld19zcGVlZCA9IC0xOworCQkJc2VsZi0+bmV3X3hib2ZzID0gLTE7CisJCQkvKiBEb25lLCB3YWl0aW5nIGZvciBuZXh0IHBhY2tldCAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQl9CisJfSBlbHNlIHsKKwkJLyogT3RoZXJ3aXNlLCBhbGxvdyB0aGUgc3RhY2sgdG8gc2VuZCBtb3JlIHBhY2tldHMgKi8KKwkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXYXRjaGRvZyB0aW1lciBmcm9tIHRoZSBuZXR3b3JrIGxheWVyLgorICogQWZ0ZXIgYSBwcmVkZXRlcm1pbmVkIHRpbWVvdXQsIGlmIHdlIGRvbid0IGdpdmUgY29uZmlybWF0aW9uIHRoYXQKKyAqIHRoZSBwYWNrZXQgaGFzIGJlZW4gc2VudCAoaS5lLiBubyBjYWxsIHRvIG5ldGlmX3dha2VfcXVldWUoKSksCisgKiB0aGUgbmV0d29yayBsYXllciB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAqIE5vdGUgdGhhdCBVUkIgdGhhdCB3ZSBzdWJtaXQgaGF2ZSBhbHNvIGEgdGltZW91dC4gV2hlbiB0aGUgVVJCIHRpbWVvdXQKKyAqIGV4cGlyZSwgdGhlIG5vcm1hbCBVUkIgY2FsbGJhY2sgaXMgY2FsbGVkICh3cml0ZV9idWxrX2NhbGxiYWNrKCkpLgorICovCitzdGF0aWMgdm9pZCBpcmRhX3VzYl9uZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCB1cmIgKnVyYjsKKwlpbnQJZG9uZSA9IDA7CS8qIElmIHdlIGhhdmUgbWFkZSBhbnkgcHJvZ3Jlc3MgKi8KKworCUlSREFfREVCVUcoMCwgIiVzKCksIE5ldHdvcmsgbGF5ZXIgdGhpbmtzIHdlIHRpbWVkIG91dCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIFByb3RlY3QgdXMgZnJvbSBVU0IgY2FsbGJhY2tzLCBuZXQgVHggYW5kIGVsc2UuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIHNlbGYtPnByZXNlbnQgKk1VU1QqIGJlIHJlYWQgdW5kZXIgc3BpbmxvY2sgKi8KKwlpZiAoIXNlbGYtPnByZXNlbnQpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBkZXZpY2Ugbm90IHByZXNlbnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIHNwZWVkIFVSQiAqLworCXVyYiA9IHNlbGYtPnNwZWVkX3VyYjsKKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCQlJUkRBX0RFQlVHKDAsICIlczogU3BlZWQgY2hhbmdlIHRpbWVkIG91dCwgdXJiLT5zdGF0dXM9JWQsIHVyYi0+dHJhbnNmZXJfZmxhZ3M9MHglMDRYXG4iLCBuZXRkZXYtPm5hbWUsIHVyYi0+c3RhdHVzLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKKworCQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJCWNhc2UgLUVJTlBST0dSRVNTOgorCQkJdXNiX3VubGlua191cmIodXJiKTsKKwkJCS8qIE5vdGUgOiBhYm92ZSB3aWxsICAqTk9UKiBjYWxsIG5ldGlmX3dha2VfcXVldWUoKQorCQkJICogaW4gY29tcGxldGlvbiBoYW5kbGVyLCB3ZSB3aWxsIGNvbWUgYmFjayBoZXJlLgorCQkJICogSmVhbiBJSSAqLworCQkJZG9uZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAtRUNPTk5BQk9SVEVEOgkJLyogLTEwMyAqLworCQljYXNlIC1FQ09OTlJFU0VUOgkJLyogLTEwNCAqLworCQljYXNlIC1FVElNRURPVVQ6CQkvKiAtMTEwICovCisJCWNhc2UgLUVOT0VOVDoJCQkvKiAtMiAodXJiIHVubGlua2VkIGJ5IHVzKSAgKi8KKwkJZGVmYXVsdDoJCQkvKiA/Pz8gLSBQbGF5IHNhZmUgKi8KKwkJCXVyYi0+c3RhdHVzID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkJCWRvbmUgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBDaGVjayBUeCBVUkIgKi8KKwl1cmIgPSBzZWxmLT50eF91cmI7CisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHVyYi0+Y29udGV4dDsKKworCQlJUkRBX0RFQlVHKDAsICIlczogVHggdGltZWQgb3V0LCB1cmItPnN0YXR1cz0lZCwgdXJiLT50cmFuc2Zlcl9mbGFncz0weCUwNFhcbiIsIG5ldGRldi0+bmFtZSwgdXJiLT5zdGF0dXMsIHVyYi0+dHJhbnNmZXJfZmxhZ3MpOworCisJCS8qIEluY3JlYXNlIGVycm9yIGNvdW50ICovCisJCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCisjaWZkZWYgSVVfQlVHX0tJQ0tfVElNRU9VVAorCQkvKiBDYW4ndCBiZSBhIGJhZCBpZGVhIHRvIHJlc2V0IHRoZSBzcGVlZCA7LSkgLSBKZWFuIElJICovCisJCWlmKHNlbGYtPm5ld19zcGVlZCA9PSAtMSkKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNlbGYtPnNwZWVkOworCQlpZihzZWxmLT5uZXdfeGJvZnMgPT0gLTEpCisJCQlzZWxmLT5uZXdfeGJvZnMgPSBzZWxmLT54Ym9mczsKKwkJaXJkYV91c2JfY2hhbmdlX3NwZWVkX3hib2ZzKHNlbGYpOworI2VuZGlmIC8qIElVX0JVR19LSUNLX1RJTUVPVVQgKi8KKworCQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJCWNhc2UgLUVJTlBST0dSRVNTOgorCQkJdXNiX3VubGlua191cmIodXJiKTsKKwkJCS8qIE5vdGUgOiBhYm92ZSB3aWxsICAqTk9UKiBjYWxsIG5ldGlmX3dha2VfcXVldWUoKQorCQkJICogaW4gY29tcGxldGlvbiBoYW5kbGVyLCBiZWNhdXNlIHVyYi0+c3RhdHVzIHdpbGwKKwkJCSAqIGJlIC1FTk9FTlQuIFdlIHdpbGwgZml4IHRoYXQgYXQgdGhlIG5leHQgd2F0Y2hkb2csCisJCQkgKiBsZWF2aW5nIG1vcmUgdGltZSB0byBVU0IgdG8gcmVjb3Zlci4uLgorCQkJICogQWxzbywgd2UgYXJlIGluIGludGVycnVwdCwgc28gd2UgbmVlZCB0byBoYXZlCisJCQkgKiBVUkJfQVNZTkNfVU5MSU5LIHRvIHdvcmsgcHJvcGVybHkuLi4KKwkJCSAqIEplYW4gSUkgKi8KKwkJCWRvbmUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgLUVDT05OQUJPUlRFRDoJCS8qIC0xMDMgKi8KKwkJY2FzZSAtRUNPTk5SRVNFVDoJCS8qIC0xMDQgKi8KKwkJY2FzZSAtRVRJTUVET1VUOgkJLyogLTExMCAqLworCQljYXNlIC1FTk9FTlQ6CQkJLyogLTIgKHVyYiB1bmxpbmtlZCBieSB1cykgICovCisJCWRlZmF1bHQ6CQkJLyogPz8/IC0gUGxheSBzYWZlICovCisJCQlpZihza2IgIT0gTlVMTCkgeworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJdXJiLT5jb250ZXh0ID0gTlVMTDsKKwkJCX0KKwkJCXVyYi0+c3RhdHVzID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkJCWRvbmUgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogTWF5YmUgd2UgbmVlZCBhIHJlc2V0ICovCisJLyogTm90ZSA6IFNvbWUgZHJpdmVycyBzZWVtIHRvIHVzZSBhIHVzYl9zZXRfaW50ZXJmYWNlKCkgd2hlbiB0aGV5CisJICogbmVlZCB0byByZXNldCB0aGUgaGFyZHdhcmUuIEh1bS4uLgorCSAqLworCisJLyogaWYoZG9uZSA9PSAwKSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBSRUNFSVZFIFJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUmVjZWl2ZSBwYWNrZXRzIGZyb20gdGhlIFVTQiBsYXllciBzdGFjayBhbmQgcGFzcyB0aGVtIHRvIHRoZSBJckRBIHN0YWNrLgorICogVHJ5IHRvIHdvcmsgYXJvdW5kIFVTQiBmYWlsdXJlcy4uLgorICovCisKKy8qCisgKiBOb3RlIDoKKyAqIFNvbWUgb2YgeW91IG1heSBoYXZlIG5vdGljZWQgdGhhdCBtb3N0IGRvbmdsZSBoYXZlIGFuIGludGVycnVwdCBpbiBwaXBlCisgKiB0aGF0IHdlIGRvbid0IHVzZS4gSGVyZSBpcyB0aGUgbGl0dGxlIHNlY3JldC4uLgorICogV2hlbiB3ZSBoYW5nIGEgUnggVVJCIG9uIHRoZSBidWxrIGluIHBpcGUsIGl0IGdlbmVyYXRlcyBzb21lIFVTQiB0cmFmZmljCisgKiBpbiBldmVyeSBVU0IgZnJhbWUuIFRoaXMgaXMgdW5uZWNlc3Nhcnkgb3ZlcmhlYWQuCisgKiBUaGUgaW50ZXJydXB0IGluIHBpcGUgd2lsbCBnZW5lcmF0ZSBhbiBldmVudCBldmVyeSB0aW1lIGEgcGFja2V0IGlzCisgKiByZWNlaXZlZC4gUmVhZGluZyBhbiBpbnRlcnJ1cHQgcGlwZSBhZGRzIG1pbmltYWwgb3ZlcmhlYWQsIGJ1dCBoYXMgc29tZQorICogbGF0ZW5jeSAofjFtcykuCisgKiBJZiB3ZSBhcmUgY29ubmVjdGVkIChzcGVlZCAhPSA5NjAwKSwgd2Ugd2FudCB0byBtaW5pbWlzZSBsYXRlbmN5LCBzbworICogd2UganVzdCBhbHdheXMgaGFuZyB0aGUgUnggVVJCIGFuZCBpZ25vcmUgdGhlIGludGVycnVwdC4KKyAqIElmIHdlIGFyZSBub3QgY29ubmVjdGVkIChzcGVlZCA9PSA5NjAwKSwgdGhlcmUgaXMgdXN1YWxseSBubyBSeCB0cmFmZmljLAorICogYW5kIHdlIHdhbnQgdG8gbWluaW1pc2UgdGhlIFVTQiBvdmVyaGVhZC4gSW4gdGhpcyBjYXNlIHdlIHNob3VsZCB3YWl0CisgKiBvbiB0aGUgaW50ZXJydXB0IHBpcGUgYW5kIGhhbmcgdGhlIFJ4IFVSQiBvbmx5IHdoZW4gYW4gaW50ZXJydXB0IGlzCisgKiByZWNlaXZlZC4KKyAqIEplYW4gSUkKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3VibWl0IGEgUnggVVJCIHRvIHRoZSBVU0IgbGF5ZXIgdG8gaGFuZGxlIHJlY2VwdGlvbiBvZiBhIGZyYW1lCisgKiBNb3N0bHkgY2FsbGVkIGJ5IHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIG9mIHRoZSBwcmV2aW91cyBVUkIuCisgKgorICogSmVhbiBJSQorICovCitzdGF0aWMgdm9pZCBpcmRhX3VzYl9zdWJtaXQoc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGlyZGFfc2tiX2NiICpjYjsKKwlpbnQgcmV0OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVCh1cmIgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkvKiBTYXZlIG91cnNlbHZlcyBpbiB0aGUgc2tiICovCisJY2IgPSAoc3RydWN0IGlyZGFfc2tiX2NiICopIHNrYi0+Y2I7CisJY2ItPmNvbnRleHQgPSBzZWxmOworCisJLyogUmVpbml0aWFsaXplIFVSQiAqLworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgc2VsZi0+dXNiZGV2LCAKKwkJICAgICAgdXNiX3JjdmJ1bGtwaXBlKHNlbGYtPnVzYmRldiwgc2VsZi0+YnVsa19pbl9lcCksIAorCQkgICAgICBza2ItPmRhdGEsIHNrYi0+dHJ1ZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaXJkYV91c2JfcmVjZWl2ZSwgc2tiKTsKKwkvKiBOb3RlIDogdW5saW5rICptdXN0KiBiZSBzeW5jaHJvbm91cyBiZWNhdXNlIG9mIHRoZSBjb2RlIGluIAorCSAqIGlyZGFfdXNiX25ldF9jbG9zZSgpIC0+IGZyZWUgdGhlIHNrYiAtIEplYW4gSUkgKi8KKwl1cmItPnN0YXR1cyA9IDA7CisKKwkvKiBDYW4gYmUgY2FsbGVkIGZyb20gaXJkYV91c2JfcmVjZWl2ZSAoaXJxIGhhbmRsZXIpIC0+IEdGUF9BVE9NSUMgKi8KKwlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXQpIHsKKwkJLyogSWYgdGhpcyBldmVyIGhhcHBlbiwgd2UgYXJlIGluIGRlZXAgcyoqKi4KKwkJICogQmFzaWNhbGx5LCB0aGUgUnggcGF0aCB3aWxsIHN0b3AuLi4gKi8KKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBGYWlsZWQgdG8gc3VibWl0IFJ4IFVSQiAlZFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCByZXQpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfdXNiX3JlY2VpdmUodXJiKQorICoKKyAqICAgICBDYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gd2hlbiBhIGZyYW1lIGhhcyBiZWVuIHJlY2VpdmVkCisgKgorICovCitzdGF0aWMgdm9pZCBpcmRhX3VzYl9yZWNlaXZlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmOyAKKwlzdHJ1Y3QgaXJkYV9za2JfY2IgKmNiOworCXN0cnVjdCBza19idWZmICpuZXdza2I7CisJc3RydWN0IHNrX2J1ZmYgKmRhdGFza2I7CisJaW50CQlkb2NvcHk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBsZW49JWRcbiIsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkKKwkvKiBGaW5kIG91cnNlbHZlcyAqLworCWNiID0gKHN0cnVjdCBpcmRhX3NrYl9jYiAqKSBza2ItPmNiOworCUlSREFfQVNTRVJUKGNiICE9IE5VTEwsIHJldHVybjspOworCXNlbGYgPSAoc3RydWN0IGlyZGFfdXNiX2NiICopIGNiLT5jb250ZXh0OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkvKiBJZiB0aGUgbmV0d29yayBpcyBjbG9zZWQgb3IgdGhlIGRldmljZSBnb25lLCBzdG9wIGV2ZXJ5dGhpbmcgKi8KKwlpZiAoKCFzZWxmLT5uZXRvcGVuKSB8fCAoIXNlbGYtPnByZXNlbnQpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIE5ldHdvcmsgaXMgZ29uZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCS8qIERvbid0IHJlLXN1Ym1pdCB0aGUgVVJCIDogd2lsbCBzdGFsbCB0aGUgUnggcGF0aCAqLworCQlyZXR1cm47CisJfQorCQorCS8qIENoZWNrIHRoZSBzdGF0dXMgKi8KKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJCWNhc2UgLUVJTFNFUToKKwkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwkKKwkJCWJyZWFrOworCQljYXNlIC1FQ09OTlJFU0VUOgkJLyogLTEwNCAqLworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgQ29ubmVjdGlvbiBSZXNldCAoLTEwNCksIHRyYW5zZmVyX2ZsYWdzIDB4JTA0WCBcbiIsIF9fRlVOQ1RJT05fXywgdXJiLT50cmFuc2Zlcl9mbGFncyk7CisJCQkvKiB1aGNpX2NsZWFudXBfdW5saW5rKCkgaXMgZ29pbmcgdG8ga2lsbCB0aGUgUngKKwkJCSAqIFVSQiBqdXN0IGFmdGVyIHdlIHJldHVybi4gTm8gcHJvYmxlbSwgYXQgdGhpcworCQkJICogcG9pbnQgdGhlIFVSQiB3aWxsIGJlIGlkbGUgOy0pIC0gSmVhbiBJSSAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBSWCBzdGF0dXMgJWQsdHJhbnNmZXJfZmxhZ3MgMHglMDRYIFxuIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cywgdXJiLT50cmFuc2Zlcl9mbGFncyk7CisJCQlicmVhazsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCQorCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZXMgKi8KKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoIDw9IFVTQl9JUkRBX0hFQURFUikgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGVtcHR5IGZyYW1lIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBkb25lOworCX0KKworCS8qICAKKwkgKiBSZW1lbWJlciB0aGUgdGltZSB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lLCBzbyB3ZSBjYW4KKwkgKiByZWR1Y2UgdGhlIG1pbiB0dXJuIHRpbWUgYSBiaXQgc2luY2Ugd2Ugd2lsbCBrbm93CisJICogaG93IG11Y2ggdGltZSB3ZSBoYXZlIHVzZWQgZm9yIHByb3RvY29sIHByb2Nlc3NpbmcKKwkgKi8KKyAgICAgICAgZG9fZ2V0dGltZW9mZGF5KCZzZWxmLT5zdGFtcCk7CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvcHkgdGhlIGRhdGEgdG8gYSBuZXcgc2tiIG9yIG5vdC4KKwkgKiBGb3IgbW9zdCBmcmFtZXMsIHdlIHVzZSBaZXJvQ29weSBhbmQgcGFzcyB0aGUgYWxyZWFkeQorCSAqIGFsbG9jYXRlZCBza2IgdXAgdGhlIHN0YWNrLgorCSAqIElmIHRoZSBmcmFtZSBpcyBzbWFsbCwgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY29weSBpdAorCSAqIHRvIHNhdmUgbWVtb3J5IChjb3B5IHdpbGwgYmUgZmFzdCBhbnl3YXkgLSB0aGF0J3MKKwkgKiBjYWxsZWQgUngtY29weS1icmVhaykuIEplYW4gSUkgKi8KKwlkb2NvcHkgPSAodXJiLT5hY3R1YWxfbGVuZ3RoIDwgSVJEQV9SWF9DT1BZX1RIUkVTSE9MRCk7CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBza2IgKi8KKwluZXdza2IgPSBkZXZfYWxsb2Nfc2tiKGRvY29weSA/IHVyYi0+YWN0dWFsX2xlbmd0aCA6IElSREFfU0tCX01BWF9NVFUpOworCWlmICghbmV3c2tiKSAgeworCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCS8qIFdlIGNvdWxkIGRlbGl2ZXIgdGhlIGN1cnJlbnQgc2tiLCBidXQgdGhpcyB3b3VsZCBzdGFsbAorCQkgKiB0aGUgUnggcGF0aC4gQmV0dGVyIGRyb3AgdGhlIHBhY2tldC4uLiBKZWFuIElJICovCisJCWdvdG8gZG9uZTsgIAorCX0KKworCS8qIE1ha2Ugc3VyZSBJUCBoZWFkZXIgZ2V0IGFsaWduZWQgKElyREEgaGVhZGVyIGlzIDUgYnl0ZXMpICovCisJLyogQnV0IElyREEtVVNCIGhlYWRlciBpcyAxIGJ5dGUuIEplYW4gSUkgKi8KKwkvL3NrYl9yZXNlcnZlKG5ld3NrYiwgVVNCX0lSREFfSEVBREVSIC0gMSk7CisKKwlpZihkb2NvcHkpIHsKKwkJLyogQ29weSBwYWNrZXQsIHNvIHdlIGNhbiByZWN5Y2xlIHRoZSBvcmlnaW5hbCAqLworCQltZW1jcHkobmV3c2tiLT5kYXRhLCBza2ItPmRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCS8qIERlbGl2ZXIgdGhpcyBuZXcgc2tiICovCisJCWRhdGFza2IgPSBuZXdza2I7CisJCS8qIEFuZCBob29rIHRoZSBvbGQgc2tiIHRvIHRoZSBVUkIKKwkJICogTm90ZSA6IHdlIGRvbid0IG5lZWQgdG8gImNsZWFuIHVwIiB0aGUgb2xkIHNrYiwKKwkJICogYXMgd2UgbmV2ZXIgdG91Y2hlZCBpdC4gSmVhbiBJSSAqLworCX0gZWxzZSB7CisJCS8qIFdlIGFyZSB1c2luZyBaZXJvQ29weS4gRGVsaXZlciBvbGQgc2tiICovCisJCWRhdGFza2IgPSBza2I7CisJCS8qIEFuZCBob29rIHRoZSBuZXcgc2tiIHRvIHRoZSBVUkIgKi8KKwkJc2tiID0gbmV3c2tiOworCX0KKworCS8qIFNldCBwcm9wZXIgbGVuZ3RoIG9uIHNrYiAmIHJlbW92ZSBVU0ItSXJEQSBoZWFkZXIgKi8KKwlza2JfcHV0KGRhdGFza2IsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJc2tiX3B1bGwoZGF0YXNrYiwgVVNCX0lSREFfSEVBREVSKTsKKworCS8qIEFzayB0aGUgbmV0d29ya2luZyBsYXllciB0byBxdWV1ZSB0aGUgcGFja2V0IGZvciB0aGUgSXJEQSBzdGFjayAqLworCWRhdGFza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwlkYXRhc2tiLT5tYWMucmF3ICA9IGRhdGFza2ItPmRhdGE7CisJZGF0YXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwluZXRpZl9yeChkYXRhc2tiKTsKKworCS8qIEtlZXAgc3RhdHMgdXAgdG8gZGF0ZSAqLworCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGRhdGFza2ItPmxlbjsKKwlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc2VsZi0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworZG9uZToKKwkvKiBOb3RlIDogYXQgdGhpcyBwb2ludCwgdGhlIFVSQiB3ZSd2ZSBqdXN0IHJlY2VpdmVkICh1cmIpCisJICogaXMgc3RpbGwgcmVmZXJlbmNlZCBieSB0aGUgVVNCIGxheWVyLiBGb3IgZXhhbXBsZSwgaWYgd2UKKwkgKiBoYXZlIHJlY2VpdmVkIGEgLUVDT05OUkVTRVQsIHVoY2lfY2xlYW51cF91bmxpbmsoKSB3aWxsCisJICogY29udGludWUgdG8gcHJvY2VzcyBpdCAoaW4gZmFjdCwgY2xlYW5pbmcgaXQgdXApLgorCSAqIElmIHdlIHdlcmUgdG8gc3VibWl0IHRoaXMgVVJCLCBkaXNhc3RlciB3b3VsZCBlbnN1ZS4KKwkgKiBUaGVyZWZvcmUsIHdlIHN1Ym1pdCBvdXIgaWRsZSBVUkIsIGFuZCBwdXQgdGhpcyBVUkIgaW4gb3VyCisJICogaWRsZSBzbG90Li4uLgorCSAqIEplYW4gSUkgKi8KKwkvKiBOb3RlIDogd2l0aCB0aGlzIHNjaGVtZSwgd2UgY291bGQgc3VibWl0IHRoZSBpZGxlIFVSQiBiZWZvcmUKKwkgKiBwcm9jZXNzaW5nIHRoZSBSeCBVUkIuIEFub3RoZXIgdGltZS4uLiBKZWFuIElJICovCisKKwkvKiBTdWJtaXQgdGhlIGlkbGUgVVJCIHRvIHJlcGxhY2UgdGhlIFVSQiB3ZSd2ZSBqdXN0IHJlY2VpdmVkICovCisJaXJkYV91c2Jfc3VibWl0KHNlbGYsIHNrYiwgc2VsZi0+aWRsZV9yeF91cmIpOworCS8qIFJlY3ljbGUgUnggVVJCIDogTm93LCB0aGUgaWRsZSBVUkIgaXMgdGhlIHByZXNlbnQgb25lICovCisJdXJiLT5jb250ZXh0ID0gTlVMTDsKKwlzZWxmLT5pZGxlX3J4X3VyYiA9IHVyYjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENhbGxiYWsgZnJvbSBJckRBIGxheWVyLiBJckRBIHdhbnRzIHRvIGtub3cgaWYgd2UgaGF2ZQorICogc3RhcnRlZCByZWNlaXZpbmcgYW55dGhpbmcuCisgKi8KK3N0YXRpYyBpbnQgaXJkYV91c2JfaXNfcmVjZWl2aW5nKHN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZikKK3sKKwkvKiBOb3RlIDogYmVjYXVzZSBvZiB0aGUgd2F5IFVIQ0kgd29ya3MsIGl0J3MgYWxtb3N0IGltcG9zc2libGUKKwkgKiB0byBnZXQgdGhpcyBpbmZvLiBUaGUgQ29udHJvbGxlciBETUEgZGlyZWN0bHkgdG8gbWVtb3J5IGFuZAorCSAqIHNpZ25hbCBvbmx5IHdoZW4gdGhlIHdob2xlIGZyYW1lIGlzIGZpbmlzaGVkLiBUbyBrbm93IGlmIHRoZQorCSAqIGZpcnN0IFREIG9mIHRoZSBVUkIgaGFzIGJlZW4gZmlsbGVkIG9yIG5vdCBzZWVtcyBoYXJkIHdvcmsuLi4KKwkgKgorCSAqIFRoZSBvdGhlciBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgdGhlICJyZWNlaXZpbmciIGNvbW1hbmQKKwkgKiBvbiB0aGUgZGVmYXVsdCBkZWNyaXB0b3Igd2l0aCBhIHVzYl9jb250cm9sX21zZygpLCBidXQgdGhhdAorCSAqIHdvdWxkIGFkZCBVU0IgdHJhZmZpYyBhbmQgd291bGQgcmV0dXJuIHJlc3VsdCBvbmx5IGluIHRoZQorCSAqIG5leHQgVVNCIGZyYW1lICh+MW1zKS4KKwkgKgorCSAqIEkndmUgYmVlbiB0b2xkIHRoYXQgY3VycmVudCBkb25nbGVzIHNlbmQgc3RhdHVzIGluZm8gb24gdGhlaXIKKwkgKiBpbnRlcnJ1cHQgZW5kcG9pbnQsIGFuZCB0aGF0J3Mgd2hhdCB0aGUgV2luZG93cyBkcml2ZXIgdXNlcworCSAqIHRvIGtub3cgdGhpcyBpbmZvLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIG5vdCB5ZXQgaW4gdGhlIHNwZWMuLi4KKwkgKgorCSAqIEplYW4gSUkKKwkgKi8KKworCXJldHVybiAwOyAvKiBGb3Igbm93ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqIElSREEgREVWSUNFIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIE1haW4gY2FsbHMgZnJvbSB0aGUgSXJEQS9OZXR3b3JrIHN1YnN5c3RlbS4KKyAqIE1vc3RseSByZWdpc3RlcmluZyBhIG5ldyBpcmRhLXVzYiBkZXZpY2UgYW5kIHJlbW92aW5nIGl0Li4uLgorICogV2Ugb25seSBkZWFsIHdpdGggdGhlIElyREEgc2lkZSBvZiB0aGUgYnVzaW5lc3MsIHRoZSBVU0Igc2lkZSB3aWxsCisgKiBiZSBkZWFsdCB3aXRoIGJlbG93Li4uCisgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV91c2JfbmV0X29wZW4gKGRldikKKyAqCisgKiAgICBOZXR3b3JrIGRldmljZSBpcyB0YWtlbiB1cC4gVXN1YWxseSB0aGlzIGlzIGRvbmUgYnkgImlmY29uZmlnIGlyZGEwIHVwIiAKKyAqICAgCisgKiBOb3RlIDogZG9uJ3QgbWVzcyB3aXRoIHNlbGYtPm5ldG9wZW4gLSBKZWFuIElJCisgKi8KK3N0YXRpYyBpbnQgaXJkYV91c2JfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGY7CisJY2hhcglod25hbWVbMTZdOworCWludCBpOworCQorCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChuZXRkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3QgaXJkYV91c2JfY2IgKikgbmV0ZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBDYW4gb25seSBvcGVuIHRoZSBkZXZpY2UgaWYgaXQncyB0aGVyZSAqLworCWlmKCFzZWxmLT5wcmVzZW50KSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgZGV2aWNlIG5vdCBwcmVzZW50IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEluaXRpYWxpc2UgZGVmYXVsdCBzcGVlZCBhbmQgeGJvZnMgdmFsdWUKKwkgKiAoSXJMQVAgd2lsbCBjaGFuZ2UgdGhhdCBzb29uKSAqLworCXNlbGYtPnNwZWVkID0gLTE7CisJc2VsZi0+eGJvZnMgPSAtMTsKKwlzZWxmLT5uZXdfc3BlZWQgPSAtMTsKKwlzZWxmLT5uZXdfeGJvZnMgPSAtMTsKKworCS8qIFRvIGRvICpiZWZvcmUqIHN1Ym1pdHRpbmcgUnggdXJicyBhbmQgc3RhcnRpbmcgbmV0IFR4IHF1ZXVlCisJICogSmVhbiBJSSAqLworCXNlbGYtPm5ldG9wZW4gPSAxOworCisJLyogCisJICogTm93IHRoYXQgZXZlcnl0aGluZyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgcHJvcGVybHksCisJICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UgdG8gdGFrZSBjYXJlIG9mIHVzLi4uCisJICogTm90ZSA6IHdpbGwgc2VuZCBpbW1lZGlhdGVseSBhIHNwZWVkIGNoYW5nZS4uLgorCSAqLworCXNwcmludGYoaHduYW1lLCAidXNiIyVkIiwgc2VsZi0+dXNiZGV2LT5kZXZudW0pOworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihuZXRkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisJSVJEQV9BU1NFUlQoc2VsZi0+aXJsYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBBbGxvdyBJckxBUCB0byBzZW5kIGRhdGEgdG8gdXMgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCisJLyogV2Ugc3VibWl0IGFsbCB0aGUgUnggVVJCIGV4Y2VwdCBmb3Igb25lIHRoYXQgd2Uga2VlcCBpZGxlLgorCSAqIE5lZWQgdG8gYmUgaW5pdGlhbGlzZWQgYmVmb3JlIHN1Ym1pdHRpbmcgb3RoZXIgVVNCcywgYmVjYXVzZQorCSAqIGluIHNvbWUgY2FzZXMgYXMgc29vbiBhcyB3ZSBzdWJtaXQgdGhlIFVSQnMgdGhlIFVTQiBsYXllcgorCSAqIHdpbGwgdHJpZ2dlciBhIGR1bW15IHJlY2VpdmUgLSBKZWFuIElJICovCisJc2VsZi0+aWRsZV9yeF91cmIgPSBzZWxmLT5yeF91cmJbSVVfTUFYX0FDVElWRV9SWF9VUkJTXTsKKwlzZWxmLT5pZGxlX3J4X3VyYi0+Y29udGV4dCA9IE5VTEw7CisKKwkvKiBOb3cgdGhhdCB3ZSBjYW4gcGFzcyBkYXRhIHRvIElyTEFQLCBhbGxvdyB0aGUgVVNCIGxheWVyCisJICogdG8gc2VuZCB1cyBzb21lIGRhdGEuLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgSVVfTUFYX0FDVElWRV9SWF9VUkJTOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoSVJEQV9TS0JfTUFYX01UVSk7CisJCWlmICghc2tiKSB7CisJCQkvKiBJZiB0aGlzIGV2ZXIgaGFwcGVuLCB3ZSBhcmUgaW4gZGVlcCBzKioqLgorCQkJICogQmFzaWNhbGx5LCB3ZSBjYW4ndCBzdGFydCB0aGUgUnggcGF0aC4uLiAqLworCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBGYWlsZWQgdG8gYWxsb2NhdGUgUnggc2tiXG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvL3NrYl9yZXNlcnZlKG5ld3NrYiwgVVNCX0lSREFfSEVBREVSIC0gMSk7CisJCWlyZGFfdXNiX3N1Ym1pdChzZWxmLCBza2IsIHNlbGYtPnJ4X3VyYltpXSk7CisJfQorCisJLyogUmVhZHkgdG8gcGxheSAhISEgKi8KKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfdXNiX25ldF9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBOZXR3b3JrIGRldmljZSBpcyB0YWtlbiBkb3duLiBVc3VhbGx5IHRoaXMgaXMgZG9uZSBieSAKKyAqICAgICJpZmNvbmZpZyBpcmRhMCBkb3duIiAKKyAqLworc3RhdGljIGludCBpcmRhX3VzYl9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGY7CisJaW50CWk7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQobmV0ZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IGlyZGFfdXNiX2NiICopIG5ldGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogQ2xlYXIgdGhpcyBmbGFnICpiZWZvcmUqIHVubGlua2luZyB0aGUgdXJicyBhbmQgKmJlZm9yZSoKKwkgKiBzdG9wcGluZyB0aGUgbmV0d29yayBUeCBxdWV1ZSAtIEplYW4gSUkgKi8KKwlzZWxmLT5uZXRvcGVuID0gMDsKKworCS8qIFN0b3AgbmV0d29yayBUeCBxdWV1ZSAqLworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCS8qIERlYWxsb2NhdGUgYWxsIHRoZSBSeCBwYXRoIGJ1ZmZlcnMgKFVSQnMgYW5kIHNrYikgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSVVfTUFYX1JYX1VSQlM7IGkrKykgeworCQlzdHJ1Y3QgdXJiICp1cmIgPSBzZWxmLT5yeF91cmJbaV07CisJCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgdXJiLT5jb250ZXh0OworCQkvKiBDYW5jZWwgdGhlIHJlY2VpdmUgY29tbWFuZCAqLworCQl1c2Jfa2lsbF91cmIodXJiKTsKKwkJLyogVGhlIHNrYiBpcyBvdXJzLCBmcmVlIGl0ICovCisJCWlmKHNrYikgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJdXJiLT5jb250ZXh0ID0gTlVMTDsKKwkJfQorCX0KKwkvKiBDYW5jZWwgVHggYW5kIHNwZWVkIFVSQiAtIG5lZWQgdG8gYmUgc3luY2hyb25vdXMgdG8gYXZvaWQgcmFjZXMgKi8KKwlzZWxmLT50eF91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQVNZTkNfVU5MSU5LOworCXVzYl9raWxsX3VyYihzZWxmLT50eF91cmIpOworCXNlbGYtPnNwZWVkX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CisJdXNiX2tpbGxfdXJiKHNlbGYtPnNwZWVkX3VyYik7CisKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoc2VsZi0+aXJsYXApCisJCWlybGFwX2Nsb3NlKHNlbGYtPmlybGFwKTsKKwlzZWxmLT5pcmxhcCA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIElPQ1RMcyA6IEV4dHJhIG91dC1vZi1iYW5kIG5ldHdvcmsgY29tbWFuZHMuLi4KKyAqLworc3RhdGljIGludCBpcmRhX3VzYl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGY7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOiAvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCS8qIFByb3RlY3QgdXMgZnJvbSBVU0IgY2FsbGJhY2tzLCBuZXQgd2F0Y2hkb2cgYW5kIGVsc2UuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgc3RpbGwgdGhlcmUgKi8KKwkJaWYoc2VsZi0+cHJlc2VudCkgeworCQkJLyogU2V0IHRoZSBkZXNpcmVkIHNwZWVkICovCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBpcnEtPmlmcl9iYXVkcmF0ZTsKKwkJCWlyZGFfdXNiX2NoYW5nZV9zcGVlZF94Ym9mcyhzZWxmKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNRURJQUJVU1k6IC8qIFNldCBtZWRpYSBidXN5ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCS8qIENoZWNrIGlmIHRoZSBJckRBIHN0YWNrIGlzIHN0aWxsIHRoZXJlICovCisJCWlmKHNlbGYtPm5ldG9wZW4pCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNlIFNJT0NHUkVDRUlWSU5HOiAvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSBpcmRhX3VzYl9pc19yZWNlaXZpbmcoc2VsZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IGRldmljZSBzdGF0cyAoZm9yIC9wcm9jL25ldC9kZXYgYW5kIGlmY29uZmlnKQorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlyZGFfdXNiX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSBkZXYtPnByaXY7CisJcmV0dXJuICZzZWxmLT5zdGF0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBJUkRBIENPTkZJRyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVmFyaW91cyBzdWJyb3V0aW5lcyBkZWFsaW5nIHdpdGggSXJEQSBhbmQgbmV0d29yayBzdHVmZiB3ZSB1c2UgdG8KKyAqIGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGlzZSBlYWNoIGlyZGEtdXNiIGluc3RhbmNlLgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGJlbG93IGluIHRoZSBtYWluIGNhbGxzIG9mIHRoZSBkcml2ZXIuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2V0IHByb3BlciB2YWx1ZXMgaW4gdGhlIElyREEgUU9TIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJkYV91c2JfaW5pdF9xb3Moc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmKQoreworCXN0cnVjdCBpcmRhX2NsYXNzX2Rlc2MgKmRlc2M7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCWRlc2MgPSBzZWxmLT5pcmRhX2Rlc2M7CisJCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zKTsKKworCS8qIFNlZSBzcGVjIHNlY3Rpb24gNy4yIGZvciBtZWFuaW5nLgorCSAqIFZhbHVlcyBhcmUgbGl0dGxlIGVuZGlhbiAoYXMgbW9zdCBVU0Igc3R1ZmYpLCB0aGUgSXJEQSBzdGFjaworCSAqIHVzZSBpdCBpbiBuYXRpdmUgb3JkZXIgKHNlZSBwYXJhbWV0ZXJzLmMpLiAtIEplYW4gSUkgKi8KKwlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgICAgICAgPSBsZTE2X3RvX2NwdShkZXNjLT53QmF1ZFJhdGUpOworCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgICA9IGRlc2MtPmJtTWluVHVybmFyb3VuZFRpbWU7CisJc2VsZi0+cW9zLmFkZGl0aW9uYWxfYm9mcy5iaXRzID0gZGVzYy0+Ym1BZGRpdGlvbmFsQk9GczsKKwlzZWxmLT5xb3Mud2luZG93X3NpemUuYml0cyAgICAgPSBkZXNjLT5ibVdpbmRvd1NpemU7CisJc2VsZi0+cW9zLmRhdGFfc2l6ZS5iaXRzICAgICAgID0gZGVzYy0+Ym1EYXRhU2l6ZTsKKworCUlSREFfREVCVUcoMCwgIiVzKCksIGRvbmdsZSBzYXlzIHNwZWVkPTB4JVgsIHNpemU9MHglWCwgd2luZG93PTB4JVgsIGJvZnM9MHglWCwgdHVybj0weCVYXG4iLCAKKwkJX19GVU5DVElPTl9fLCBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMsIHNlbGYtPnFvcy5kYXRhX3NpemUuYml0cywgc2VsZi0+cW9zLndpbmRvd19zaXplLmJpdHMsIHNlbGYtPnFvcy5hZGRpdGlvbmFsX2JvZnMuYml0cywgc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyk7CisKKwkvKiBEb24ndCBhbHdheXMgdHJ1c3Qgd2hhdCB0aGUgZG9uZ2xlIHRlbGwgdXMgKi8KKwlpZihzZWxmLT5jYXBhYmlsaXR5ICYgSVVDX1NJUl9PTkxZKQorCQlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMJJj0gMHgwMGZmOworCWlmKHNlbGYtPmNhcGFiaWxpdHkgJiBJVUNfU01BTExfUEtUKQorCQlzZWxmLT5xb3MuZGF0YV9zaXplLmJpdHMJID0gMHgwNzsKKwlpZihzZWxmLT5jYXBhYmlsaXR5ICYgSVVDX05PX1dJTkRPVykKKwkJc2VsZi0+cW9zLndpbmRvd19zaXplLmJpdHMJID0gMHgwMTsKKwlpZihzZWxmLT5jYXBhYmlsaXR5ICYgSVVDX01BWF9XSU5ET1cpCisJCXNlbGYtPnFvcy53aW5kb3dfc2l6ZS5iaXRzCSA9IDB4N2Y7CisJaWYoc2VsZi0+Y2FwYWJpbGl0eSAmIElVQ19NQVhfWEJPRlMpCisJCXNlbGYtPnFvcy5hZGRpdGlvbmFsX2JvZnMuYml0cwkgPSAweDAxOworCisjaWYgMQorCS8qIE1vZHVsZSBwYXJhbWV0ZXIgY2FuIG92ZXJyaWRlIHRoZSByeCB3aW5kb3cgc2l6ZSAqLworCWlmIChxb3NfbXR0X2JpdHMpCisJCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSBxb3NfbXR0X2JpdHM7CisjZW5kaWYJICAgIAorCS8qIAorCSAqIE5vdGUgOiBtb3N0IG9mIHRob3NlIHZhbHVlcyBhcHBseSBvbmx5IGZvciB0aGUgcmVjZWl2ZSBwYXRoLAorCSAqIHRoZSB0cmFuc21pdCBwYXRoIHdpbGwgYmUgc2V0IGRpZmZlcmVudGx5IC0gSmVhbiBJSSAKKwkgKi8KKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3MpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogSW5pdGlhbGlzZSB0aGUgbmV0d29yayBzaWRlIG9mIHRoZSBpcmRhLXVzYiBpbnN0YW5jZQorICogQ2FsbGVkIHdoZW4gYSBuZXcgVVNCIGluc3RhbmNlIGlzIHJlZ2lzdGVyZWQgaW4gaXJkYV91c2JfcHJvYmUoKQorICovCitzdGF0aWMgaW5saW5lIGludCBpcmRhX3VzYl9vcGVuKHN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gc2VsZi0+bmV0ZGV2OworCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlyZGFfdXNiX2luaXRfcW9zKHNlbGYpOworCisJLyogT3ZlcnJpZGUgdGhlIG5ldHdvcmsgZnVuY3Rpb25zIHdlIG5lZWQgdG8gdXNlICovCisJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpcmRhX3VzYl9oYXJkX3htaXQ7CisJbmV0ZGV2LT50eF90aW1lb3V0CT0gaXJkYV91c2JfbmV0X3RpbWVvdXQ7CisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyAgPSAyNTAqSFovMTAwMDsJLyogMjUwIG1zID4gVVNCIHRpbWVvdXQgKi8KKwluZXRkZXYtPm9wZW4gICAgICAgICAgICA9IGlyZGFfdXNiX25ldF9vcGVuOworCW5ldGRldi0+c3RvcCAgICAgICAgICAgID0gaXJkYV91c2JfbmV0X2Nsb3NlOworCW5ldGRldi0+Z2V0X3N0YXRzCT0gaXJkYV91c2JfbmV0X2dldF9zdGF0czsKKwluZXRkZXYtPmRvX2lvY3RsICAgICAgICA9IGlyZGFfdXNiX25ldF9pb2N0bDsKKworCXJldHVybiByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENsZWFudXAgdGhlIG5ldHdvcmsgc2lkZSBvZiB0aGUgaXJkYS11c2IgaW5zdGFuY2UKKyAqIENhbGxlZCB3aGVuIGEgVVNCIGluc3RhbmNlIGlzIHJlbW92ZWQgaW4gaXJkYV91c2JfZGlzY29ubmVjdCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcmRhX3VzYl9jbG9zZShzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFJlbW92ZSBuZXRkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCisJLyogUmVtb3ZlIHRoZSBzcGVlZCBidWZmZXIgKi8KKwlpZiAoc2VsZi0+c3BlZWRfYnVmZiAhPSBOVUxMKSB7CisJCWtmcmVlKHNlbGYtPnNwZWVkX2J1ZmYpOworCQlzZWxmLT5zcGVlZF9idWZmID0gTlVMTDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqIFVTQiBDT05GSUcgU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBWYXJpb3VzIHN1YnJvdXRpbmVzIGRlYWxpbmcgd2l0aCBVU0Igc3R1ZmYgd2UgdXNlIHRvIGNvbmZpZ3VyZSBhbmQKKyAqIGluaXRpYWxpc2UgZWFjaCBpcmRhLXVzYiBpbnN0YW5jZS4KKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBiZWxvdyBpbiB0aGUgbWFpbiBjYWxscyBvZiB0aGUgZHJpdmVyLi4uCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfdXNiX3BhcnNlX2VuZHBvaW50cyhkZXYsIGlmbnVtKQorICoKKyAqICAgIFBhcnNlIHRoZSB2YXJpb3VzIGVuZHBvaW50cyBhbmQgZmluZCB0aGUgb25lIHdlIG5lZWQuCisgKgorICogVGhlIGVuZHBvaW50IGFyZSB0aGUgcGlwZXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBVU0IgZGV2aWNlLgorICogVGhlIHNwZWMgZGVmaW5lcyAyIGVuZHBvaW50cyBvZiB0eXBlIGJ1bGsgdHJhbnNmZXIsIG9uZSBpbiwgYW5kIG9uZSBvdXQuCisgKiBUaGVzZSBhcmUgdXNlZCB0byBwYXNzIGZyYW1lcyBiYWNrIGFuZCBmb3J0aCB3aXRoIHRoZSBkb25nbGUuCisgKiBNb3N0IGRvbmdsZSBoYXZlIGFsc28gYW4gaW50ZXJydXB0IGVuZHBvaW50LCB0aGF0IHdpbGwgYmUgcHJvYmFibHkKKyAqIGRvY3VtZW50ZWQgaW4gdGhlIG5leHQgc3BlYy4uLgorICovCitzdGF0aWMgaW5saW5lIGludCBpcmRhX3VzYl9wYXJzZV9lbmRwb2ludHMoc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmLCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVuZHBvaW50LCBpbnQgZW5udW0pCit7CisJaW50IGk7CQkvKiBFbmRwb2ludCBpbmRleCBpbiB0YWJsZSAqLworCQkKKwkvKiBJbml0IDogbm8gZW5kcG9pbnRzICovCisJc2VsZi0+YnVsa19pbl9lcCA9IDA7CisJc2VsZi0+YnVsa19vdXRfZXAgPSAwOworCXNlbGYtPmJ1bGtfaW50X2VwID0gMDsKKworCS8qIExldCdzIGxvb2sgYXQgYWxsIHRob3NlIGVuZHBvaW50cyAqLworCWZvcihpID0gMDsgaSA8IGVubnVtOyBpKyspIHsKKwkJLyogQWxsIHRob3NlIHZhcmlhYmxlcyB3aWxsIGdldCBvcHRpbWlzZWQgYnkgdGhlIGNvbXBpbGVyLAorCQkgKiBzbyBsZXQncyBhaW0gZm9yIGNsYXJpdHkuLi4gLSBKZWFuIElJICovCisJCV9fdTggZXA7CS8qIEVuZHBvaW50IGFkZHJlc3MgKi8KKwkJX191OCBkaXI7CS8qIEVuZHBvaW50IGRpcmVjdGlvbiAqLworCQlfX3U4IGF0dHI7CS8qIEVuZHBvaW50IGF0dHJpYnV0ZSAqLworCQlfX3UxNiBwc2l6ZTsJLyogRW5kcG9pbnQgbWF4IHBhY2tldCBzaXplIGluIGJ5dGVzICovCisKKwkJLyogR2V0IGVuZHBvaW50IGFkZHJlc3MsIGRpcmVjdGlvbiBhbmQgYXR0cmlidXRlICovCisJCWVwID0gZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCQlkaXIgPSBlbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0s7CisJCWF0dHIgPSBlbmRwb2ludFtpXS5kZXNjLmJtQXR0cmlidXRlczsKKwkJcHNpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludFtpXS5kZXNjLndNYXhQYWNrZXRTaXplKTsKKworCQkvKiBJcyBpdCBhIGJ1bGsgZW5kcG9pbnQgPz8/ICovCisJCWlmKGF0dHIgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworCQkJLyogV2UgbmVlZCB0byBmaW5kIGFuIElOIGFuZCBhbiBPVVQgKi8KKwkJCWlmKGRpciA9PSBVU0JfRElSX0lOKSB7CisJCQkJLyogVGhpcyBpcyBvdXIgUnggZW5kcG9pbnQgKi8KKwkJCQlzZWxmLT5idWxrX2luX2VwID0gZXA7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoaXMgaXMgb3VyIFR4IGVuZHBvaW50ICovCisJCQkJc2VsZi0+YnVsa19vdXRfZXAgPSBlcDsKKwkJCQlzZWxmLT5idWxrX291dF9tdHUgPSBwc2l6ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmKChhdHRyID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkgJiYKKwkJCSAgIChkaXIgPT0gVVNCX0RJUl9JTikpIHsKKwkJCQkvKiBUaGlzIGlzIG91ciBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KKwkJCQlzZWxmLT5idWxrX2ludF9lcCA9IGVwOworCQkJfSBlbHNlIHsKKwkJCQlJUkRBX0VSUk9SKCIlcygpLCBVbnJlY29nbmlzZWQgZW5kcG9pbnQgJTAyWC5cbiIsIF9fRlVOQ1RJT05fXywgZXApOworCQkJfQorCQl9CisJfQorCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgQW5kIG91ciBlbmRwb2ludHMgYXJlIDogaW49JTAyWCwgb3V0PSUwMlggKCVkKSwgaW50PSUwMlhcbiIsCisJCV9fRlVOQ1RJT05fXywgc2VsZi0+YnVsa19pbl9lcCwgc2VsZi0+YnVsa19vdXRfZXAsIHNlbGYtPmJ1bGtfb3V0X210dSwgc2VsZi0+YnVsa19pbnRfZXApOworCS8qIFNob3VsZCBiZSA4LCAxNiwgMzIgb3IgNjQgYnl0ZXMgKi8KKwlJUkRBX0FTU0VSVChzZWxmLT5idWxrX291dF9tdHUgPT0gNjQsIDspOworCisJcmV0dXJuKChzZWxmLT5idWxrX2luX2VwICE9IDApICYmIChzZWxmLT5idWxrX291dF9lcCAhPSAwKSk7Cit9CisKKyNpZmRlZiBJVV9EVU1QX0NMQVNTX0RFU0MKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiB1c2JfaXJkYV9kdW1wX2NsYXNzX2Rlc2MoZGVzYykKKyAqCisgKiAgICBQcmludHMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgSXJEQSBjbGFzcyBkZXNjcmlwdG9yCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJkYV91c2JfZHVtcF9jbGFzc19kZXNjKHN0cnVjdCBpcmRhX2NsYXNzX2Rlc2MgKmRlc2MpCit7CisJLyogVmFsdWVzIGFyZSBsaXR0bGUgZW5kaWFuICovCisJcHJpbnRrKCJiTGVuZ3RoPSV4XG4iLCBkZXNjLT5iTGVuZ3RoKTsKKwlwcmludGsoImJEZXNjcmlwdG9yVHlwZT0leFxuIiwgZGVzYy0+YkRlc2NyaXB0b3JUeXBlKTsKKwlwcmludGsoImJjZFNwZWNSZXZpc2lvbj0leFxuIiwgbGUxNl90b19jcHUoZGVzYy0+YmNkU3BlY1JldmlzaW9uKSk7IAorCXByaW50aygiYm1EYXRhU2l6ZT0leFxuIiwgZGVzYy0+Ym1EYXRhU2l6ZSk7CisJcHJpbnRrKCJibVdpbmRvd1NpemU9JXhcbiIsIGRlc2MtPmJtV2luZG93U2l6ZSk7CisJcHJpbnRrKCJibU1pblR1cm5hcm91bmRUaW1lPSVkXG4iLCBkZXNjLT5ibU1pblR1cm5hcm91bmRUaW1lKTsKKwlwcmludGsoIndCYXVkUmF0ZT0leFxuIiwgbGUxNl90b19jcHUoZGVzYy0+d0JhdWRSYXRlKSk7CisJcHJpbnRrKCJibUFkZGl0aW9uYWxCT0ZzPSV4XG4iLCBkZXNjLT5ibUFkZGl0aW9uYWxCT0ZzKTsKKwlwcmludGsoImJJcmRhUmF0ZVNuaWZmPSV4XG4iLCBkZXNjLT5iSXJkYVJhdGVTbmlmZik7CisJcHJpbnRrKCJiTWF4VW5pY2FzdExpc3Q9JXhcbiIsIGRlc2MtPmJNYXhVbmljYXN0TGlzdCk7Cit9CisjZW5kaWYgLyogSVVfRFVNUF9DTEFTU19ERVNDICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcmRhX3VzYl9maW5kX2NsYXNzX2Rlc2MoaW50ZikKKyAqCisgKiAgICBSZXR1cm5zIGluc3RhbmNlIG9mIElyREEgY2xhc3MgZGVzY3JpcHRvciwgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqCisgKiBUaGUgY2xhc3MgZGVzY3JpcHRvciBpcyBzb21lIGV4dHJhIGluZm8gdGhhdCBJckRBIFVTQiBkZXZpY2VzIHdpbGwKKyAqIG9mZmVyIHRvIHVzLCBkZXNjcmliaW5nIHRoZWlyIElyREEgY2hhcmFjdGVyaXN0aWNzLiBXZSB3aWxsIHVzZSB0aGF0IGluCisgKiBpcmRhX3VzYl9pbml0X3FvcygpCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlyZGFfY2xhc3NfZGVzYyAqaXJkYV91c2JfZmluZF9jbGFzc19kZXNjKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2IChpbnRmKTsKKwlzdHJ1Y3QgaXJkYV9jbGFzc19kZXNjICpkZXNjOworCWludCByZXQ7CisKKwlkZXNjID0ga21hbGxvYyhzaXplb2YgKCpkZXNjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRlc2MgPT0gTlVMTCkgCisJCXJldHVybiBOVUxMOworCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKKworCS8qIFVTQi1JckRBIGNsYXNzIHNwZWMgMS4wOgorCSAqCTYuMS4zOiBTdGFuZGFyZCAiR2V0IERlc2NyaXB0b3IiIERldmljZSBSZXF1ZXN0IGlzIG5vdAorCSAqCSAgICAgICBhcHByb3ByaWF0ZSB0byByZXRyaWV2ZSBjbGFzcy1zcGVjaWZpYyBkZXNjcmlwdG9yCisJICoJNi4yLjU6IENsYXNzIFNwZWNpZmljICJHZXQgQ2xhc3MgRGVzY3JpcHRvciIgSW50ZXJmYWNlIFJlcXVlc3QKKwkgKgkgICAgICAgaXMgbWFuZGF0b3J5IGFuZCByZXR1cm5zIHRoZSBVU0ItSXJEQSBjbGFzcyBkZXNjcmlwdG9yCisJICovCisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LDApLAorCQlJVV9SRVFfR0VUX0NMQVNTX0RFU0MsCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCTAsIGludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlciwgZGVzYywKKwkJc2l6ZW9mKCpkZXNjKSwgNTAwKTsKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCByZXQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwlpZiAocmV0IDwgc2l6ZW9mKCpkZXNjKSkgeworCQlJUkRBX1dBUk5JTkcoInVzYi1pcmRhOiBjbGFzc19kZXNjcmlwdG9yIHJlYWQgJXMgKCVkKVxuIiwKKwkJCSAgICAgKHJldDwwKSA/ICJmYWlsZWQiIDogInRvbyBzaG9ydCIsIHJldCk7CisJfQorCWVsc2UgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfSVJEQSkgeworCQlJUkRBX1dBUk5JTkcoInVzYi1pcmRhOiBiYWQgY2xhc3NfZGVzY3JpcHRvciB0eXBlXG4iKTsKKwl9CisJZWxzZSB7CisjaWZkZWYgSVVfRFVNUF9DTEFTU19ERVNDCisJCWlyZGFfdXNiX2R1bXBfY2xhc3NfZGVzYyhkZXNjKTsKKyNlbmRpZgkvKiBJVV9EVU1QX0NMQVNTX0RFU0MgKi8KKworCQlyZXR1cm4gZGVzYzsKKwl9CisJa2ZyZWUoZGVzYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBVU0IgREVWSUNFIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBNYWluIGNhbGxzIGZyb20gdGhlIFVTQiBzdWJzeXN0ZW0uCisgKiBNb3N0bHkgcmVnaXN0ZXJpbmcgYSBuZXcgaXJkYS11c2IgZGV2aWNlIGFuZCByZW1vdmluZyBpdC4uLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgVVNCIHN1YnN5c3RlbSBmb3IgZWFjaCBuZXcgZGV2aWNlCisgKiBpbiB0aGUgc3lzdGVtLiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgb3VycywgYW5kIGluCisgKiB0aGlzIGNhc2Ugc3RhcnQgaGFuZGxpbmcgaXQuCisgKiBUaGUgVVNCIGxheWVyIHByb3RlY3QgdXMgZnJvbSByZWVudHJhbmN5ICh2aWEgQktMKSwgc28gd2UgZG9uJ3QgbmVlZAorICogdG8gc3BpbmxvY2sgaW4gdGhlcmUuLi4gSmVhbiBJSQorICovCitzdGF0aWMgaW50IGlyZGFfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSBOVUxMOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgaXJkYV9jbGFzc19kZXNjICppcmRhX2Rlc2M7CisJaW50IHJldCA9IC1FTk9NRU07CisJaW50IGk7CQkvKiBEcml2ZXIgaW5zdGFuY2UgaW5kZXggLyBSeCBVUkIgaW5kZXggKi8KKworCS8qIE5vdGUgOiB0aGUgcHJvYmUgbWFrZSBzdXJlIHRvIGNhbGwgdXMgb25seSBmb3IgZGV2aWNlcyB0aGF0CisJICogbWF0Y2hlcyB0aGUgbGlzdCBvZiBkb25nbGUgKHRvcCBvZiB0aGUgZmlsZSkuIFNvLCB3ZQorCSAqIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhlIGRvbmdsZSBpcyByZWFsbHkgb3Vycy4KKwkgKiBKZWFuIElJICovCisKKwlJUkRBX01FU1NBR0UoIklSREEtVVNCIGZvdW5kIGF0IGFkZHJlc3MgJWQsIFZlbmRvcjogJXgsIFByb2R1Y3Q6ICV4XG4iLAorCQkgICAgIGRldi0+ZGV2bnVtLCBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAorCQkgICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKKworCW5ldCA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKCpzZWxmKSk7CisJaWYgKCFuZXQpIAorCQlnb3RvIGVycl9vdXQ7CisKKwlTRVRfTU9EVUxFX09XTkVSKG5ldCk7CisJU0VUX05FVERFVl9ERVYobmV0LCAmaW50Zi0+ZGV2KTsKKwlzZWxmID0gbmV0LT5wcml2OworCXNlbGYtPm5ldGRldiA9IG5ldDsKKwlzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CisKKwkvKiBDcmVhdGUgYWxsIG9mIHRoZSBuZWVkZWQgdXJicyAqLworCWZvciAoaSA9IDA7IGkgPCBJVV9NQVhfUlhfVVJCUzsgaSsrKSB7CisJCXNlbGYtPnJ4X3VyYltpXSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2VsZi0+cnhfdXJiW2ldKSB7CisJCQlnb3RvIGVycl9vdXRfMTsKKwkJfQorCX0KKwlzZWxmLT50eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghc2VsZi0+dHhfdXJiKSB7CisJCWdvdG8gZXJyX291dF8xOworCX0KKwlzZWxmLT5zcGVlZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghc2VsZi0+c3BlZWRfdXJiKSB7CisJCWdvdG8gZXJyX291dF8yOworCX0KKworCS8qIElzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKG5vLCBleGNlcHQgbWF5YmUgZm9yIGJyb2tlbiBkZXZpY2VzKSAqLworCWlmICh1c2JfcmVzZXRfY29uZmlndXJhdGlvbiAoZGV2KSA8IDApIHsKKwkJZXJyKCJyZXNldF9jb25maWd1cmF0aW9uIGZhaWxlZCIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfMzsKKwl9CisKKwkvKiBJcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/ICovCisJLyogTm90ZSA6IHNvbWUgZHJpdmVyIGRvIGhhcmRjb2RlIHRoZSBpbnRlcmZhY2UgbnVtYmVyLCBzb21lIG90aGVycworCSAqIHNwZWNpZnkgYW4gYWx0ZXJuYXRlLCBidXQgdmVyeSBmZXcgZHJpdmVyIGRvIGxpa2UgdGhpcy4KKwkgKiBKZWFuIElJICovCisJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UoZGV2LCBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDApOworCUlSREFfREVCVUcoMSwgInVzYi1pcmRhOiBzZXQgaW50ZXJmYWNlICVkIHJlc3VsdCAlZFxuIiwgaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCByZXQpOworCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQljYXNlIC1FUElQRToJCS8qIC1FUElQRSA9IC0zMiAqLworCQkJLyogTWFydGluIERpZWhsIHNheXMgaWYgd2UgZ2V0IGEgLUVQSVBFIHdlIHNob3VsZAorCQkJICogYmUgZmluZSBhbmQgd2UgZG9uJ3QgbmVlZCB0byBkbyBhIHVzYl9jbGVhcl9oYWx0KCkuCisJCQkgKiAtIEplYW4gSUkgKi8KKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIFJlY2VpdmVkIC1FUElQRSwgaWdub3JpbmcuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycl9vdXRfMzsKKwl9CisKKwkvKiBGaW5kIG91ciBlbmRwb2ludHMgKi8KKwlpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKwlpZighaXJkYV91c2JfcGFyc2VfZW5kcG9pbnRzKHNlbGYsIGludGVyZmFjZS0+ZW5kcG9pbnQsCisJCQkJICAgICBpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cykpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgQm9ndXMgZW5kcG9pbnRzLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfMzsKKwl9CisKKwkvKiBGaW5kIElyREEgY2xhc3MgZGVzY3JpcHRvciAqLworCWlyZGFfZGVzYyA9IGlyZGFfdXNiX2ZpbmRfY2xhc3NfZGVzYyhpbnRmKTsKKwlyZXQgPSAtRU5PREVWOworCWlmIChpcmRhX2Rlc2MgPT0gTlVMTCkKKwkJZ290byBlcnJfb3V0XzM7CisKKwlzZWxmLT5pcmRhX2Rlc2MgPSAgaXJkYV9kZXNjOworCXNlbGYtPnByZXNlbnQgPSAxOworCXNlbGYtPm5ldG9wZW4gPSAwOworCXNlbGYtPmNhcGFiaWxpdHkgPSBpZC0+ZHJpdmVyX2luZm87CisJc2VsZi0+dXNiZGV2ID0gZGV2OworCXNlbGYtPnVzYmludGYgPSBpbnRmOworCisJLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciBmb3Igc3BlZWQgY2hhbmdlcyAqLworCS8qIERvbid0IGNoYW5nZSB0aGlzIGJ1ZmZlciBzaXplIGFuZCBhbGxvY2F0aW9uIHdpdGhvdXQgZG9pbmcKKwkgKiBzb21lIGhlYXZ5IGFuZCBjb21wbGV0ZSB0ZXN0aW5nLiBEb24ndCBhc2sgd2h5IDotKAorCSAqIEplYW4gSUkgKi8KKwlzZWxmLT5zcGVlZF9idWZmID0gKGNoYXIgKikga21hbGxvYyhJUkRBX1VTQl9TUEVFRF9NVFUsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT5zcGVlZF9idWZmID09IE5VTEwpIAorCQlnb3RvIGVycl9vdXRfMzsKKworCW1lbXNldChzZWxmLT5zcGVlZF9idWZmLCAwLCBJUkRBX1VTQl9TUEVFRF9NVFUpOworCisJcmV0ID0gaXJkYV91c2Jfb3BlbihzZWxmKTsKKwlpZiAocmV0KSAKKwkJZ290byBlcnJfb3V0XzQ7CisKKwlJUkRBX01FU1NBR0UoIklyREE6IFJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBuZXQtPm5hbWUpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgc2VsZik7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfNDoKKwlrZnJlZShzZWxmLT5zcGVlZF9idWZmKTsKK2Vycl9vdXRfMzoKKwkvKiBGcmVlIGFsbCB1cmJzIHRoYXQgd2UgbWF5IGhhdmUgY3JlYXRlZCAqLworCXVzYl9mcmVlX3VyYihzZWxmLT5zcGVlZF91cmIpOworZXJyX291dF8yOgorCXVzYl9mcmVlX3VyYihzZWxmLT50eF91cmIpOworZXJyX291dF8xOgorCWZvciAoaSA9IDA7IGkgPCBJVV9NQVhfUlhfVVJCUzsgaSsrKSB7CisJCWlmIChzZWxmLT5yeF91cmJbaV0pCisJCQl1c2JfZnJlZV91cmIoc2VsZi0+cnhfdXJiW2ldKTsKKwl9CisJZnJlZV9uZXRkZXYobmV0KTsKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoZSBjdXJyZW50IGlyZGEtdXNiIGRldmljZSBpcyByZW1vdmVkLCB0aGUgVVNCIGxheWVyIHRlbGwgdXMKKyAqIHRvIHNodXQgaXQgZG93bi4uLgorICogT25lIG9mIHRoZSBjb25zdHJhaW50cyBpcyB0aGF0IHdoZW4gd2UgZXhpdCB0aGlzIGZ1bmN0aW9uLAorICogd2UgY2Fubm90IHVzZSB0aGUgdXNiX2RldmljZSBubyBtb3JlLiBHb25lLiBEZXN0cm95ZWQuIGtmcmVlKCkuCisgKiBNb3N0IG90aGVyIHN1YnN5c3RlbSBhbGxvdyB5b3UgdG8gZGVzdHJveSB0aGUgaW5zdGFuY2UgYXQgYSB0aW1lCisgKiB3aGVuIGl0J3MgY29udmVuaWVudCB0byB5b3UsIHRvIHBvc3Rwb25lIGl0IHRvIGEgbGF0ZXIgZGF0ZSwgYnV0CisgKiBub3QgdGhlIFVTQiBzdWJzeXN0ZW0uCisgKiBTbywgd2UgbXVzdCBtYWtlIGJsb29keSBzdXJlIHRoYXQgZXZlcnl0aGluZyBnZXRzIGRlYWN0aXZhdGVkLgorICogSmVhbiBJSQorICovCitzdGF0aWMgdm9pZCBpcmRhX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlpbnQgaTsKKworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCWlmICghc2VsZikKKwkJcmV0dXJuOworCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIFR4IHBhdGggaXMgbm90IGV4ZWN1dGluZy4gLSBKZWFuIElJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIE91cHMgISBXZSBhcmUgbm90IHRoZXJlIGFueSBtb3JlLgorCSAqIFRoaXMgd2lsbCBzdG9wL2Rlc2FjdGl2YXRlIHRoZSBUeCBwYXRoLiAtIEplYW4gSUkgKi8KKwlzZWxmLT5wcmVzZW50ID0gMDsKKworCS8qIFdlIG5lZWQgdG8gaGF2ZSBpcnEgZW5hYmxlZCB0byB1bmxpbmsgdGhlIFVSQnMuIFRoYXQncyBPSywKKwkgKiBhdCB0aGlzIHBvaW50IHRoZSBUeCBwYXRoIGlzIGdvbmUgLSBKZWFuIElJICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogSHVtLi4uIENoZWNrIGlmIG5ldHdvcmtpbmcgaXMgc3RpbGwgYWN0aXZlIChhdm9pZCByYWNlcykgKi8KKwlpZigoc2VsZi0+bmV0b3BlbikgfHwgKHNlbGYtPmlybGFwKSkgeworCQkvKiBBY2NlcHQgbm8gbW9yZSB0cmFuc21pc3Npb25zICovCisJCS8qbmV0aWZfZGV2aWNlX2RldGFjaChzZWxmLT5uZXRkZXYpOyovCisJCW5ldGlmX3N0b3BfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkJLyogU3RvcCBhbGwgdGhlIHJlY2VpdmUgVVJCcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgSVVfTUFYX1JYX1VSQlM7IGkrKykKKwkJCXVzYl9raWxsX3VyYihzZWxmLT5yeF91cmJbaV0pOworCQkvKiBDYW5jZWwgVHggYW5kIHNwZWVkIFVSQi4KKwkJICogVG9nZ2xlIGZsYWdzIHRvIG1ha2Ugc3VyZSBpdCdzIHN5bmNocm9ub3VzLiAqLworCQlzZWxmLT50eF91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQVNZTkNfVU5MSU5LOworCQl1c2Jfa2lsbF91cmIoc2VsZi0+dHhfdXJiKTsKKwkJc2VsZi0+c3BlZWRfdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FTWU5DX1VOTElOSzsKKwkJdXNiX2tpbGxfdXJiKHNlbGYtPnNwZWVkX3VyYik7CisJfQorCisJLyogQ2xlYW51cCB0aGUgZGV2aWNlIHN0dWZmICovCisJaXJkYV91c2JfY2xvc2Uoc2VsZik7CisJLyogTm8gbG9uZ2VyIGF0dGFjaGVkIHRvIFVTQiBidXMgKi8KKwlzZWxmLT51c2JkZXYgPSBOVUxMOworCXNlbGYtPnVzYmludGYgPSBOVUxMOworCisJLyogQ2xlYW4gdXAgb3VyIHVyYnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSVVfTUFYX1JYX1VSQlM7IGkrKykKKwkJdXNiX2ZyZWVfdXJiKHNlbGYtPnJ4X3VyYltpXSk7CisJLyogQ2xlYW4gdXAgVHggYW5kIHNwZWVkIFVSQiAqLworCXVzYl9mcmVlX3VyYihzZWxmLT50eF91cmIpOworCXVzYl9mcmVlX3VyYihzZWxmLT5zcGVlZF91cmIpOworCisJLyogRnJlZSBzZWxmIGFuZCBuZXR3b3JrIGRldmljZSAqLworCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisJSVJEQV9ERUJVRygwLCAiJXMoKSwgVVNCIElyREEgRGlzY29ubmVjdGVkXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVVNCIGRldmljZSBjYWxsYmFja3MKKyAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGlyZGFfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiaXJkYS11c2IiLAorCS5wcm9iZQkJPSBpcmRhX3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGlyZGFfdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZG9uZ2xlcywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1PRFVMRSBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEZWFsIHdpdGggbW9kdWxlIGluc2VydGlvbi9yZW1vdmFsCisgKiBNb3N0bHkgdGVsbCBVU0IgYWJvdXQgb3VyIGV4aXN0ZW5jZQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBNb2R1bGUgaW5zZXJ0aW9uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHVzYl9pcmRhX2luaXQodm9pZCkKK3sKKwlpbnQJcmV0OworCisJcmV0ID0gdXNiX3JlZ2lzdGVyKCZpcmRhX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlJUkRBX01FU1NBR0UoIlVTQiBJckRBIHN1cHBvcnQgcmVnaXN0ZXJlZFxuIik7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdCh1c2JfaXJkYV9pbml0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE1vZHVsZSByZW1vdmFsCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2JfaXJkYV9jbGVhbnVwKHZvaWQpCit7CisJLyogRGVyZWdpc3RlciB0aGUgZHJpdmVyIGFuZCByZW1vdmUgYWxsIHBlbmRpbmcgaW5zdGFuY2VzICovCisJdXNiX2RlcmVnaXN0ZXIoJmlyZGFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHVzYl9pcmRhX2NsZWFudXApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogTW9kdWxlIHBhcmFtZXRlcnMKKyAqLworbW9kdWxlX3BhcmFtKHFvc19tdHRfYml0cywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocW9zX210dF9iaXRzLCAiTWluaW11bSBUdXJuIFRpbWUiKTsKK01PRFVMRV9BVVRIT1IoIlJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4sIERhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+IGFuZCBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklyREEtVVNCIERvbmdsZSBEcml2ZXIiKTsgCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmggYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4ZjY2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuaApAQCAtMCwwICsxLDE2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgaXJkYS11c2IuaAorICogVmVyc2lvbjogICAgICAgMC45YgorICogRGVzY3JpcHRpb246ICAgSXJEQS1VU0IgRHJpdmVyCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwgCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnQGJyYXR0bGkubmV0PgorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwMSwgUm9tYW4gV2Vpc3NnYWVyYmVyIDx3ZWlzc2dAdmllbm5hLmF0PgorICogICAgICBDb3B5cmlnaHQgKEMpIDIwMDAsIERhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+CisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMSwgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgICAgICAgCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4gICAgICAvKiBzdHJ1Y3QgaXJsYXBfY2IgKi8KKworI2RlZmluZSBSWF9DT1BZX1RIUkVTSE9MRCAyMDAKKyNkZWZpbmUgSVJEQV9VU0JfTUFYX01UVSAyMDUxCisjZGVmaW5lIElSREFfVVNCX1NQRUVEX01UVSA2NAkJLyogV2VpcmQsIGJ1dCB3b3JrIGxpa2UgdGhpcyAqLworCisvKiBNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgVVJCIG9uIHRoZSBSeCBwYXRoCisgKiBUaGlzIGlzIHRoZSBhbW91bnQgb2YgYnVmZmVycyB0aGUgd2Uga2VlcCBiZXR3ZWVuIHRoZSBVU0IgaGFyd2FyZSBhbmQgdGhlCisgKiBJckRBIHN0YWNrLgorICoKKyAqIE5vdGUgOiB0aGUgbmV0d29yayBsYXllciBkb2VzIGFsc28gcXVldWUgdGhlIHBhY2tldHMgYmV0d2VlbiB1cyBhbmQgdGhlCisgKiBJckRBIHN0YWNrLCBhbmQgaXMgYWN0dWFsbHkgcHJldHR5IGZhc3QgYW5kIGVmZmljaWVudCBpbiBkb2luZyB0aGF0LgorICogVGhlcmVmb3JlLCB3ZSBkb24ndCBuZWVkIHRvIGhhdmUgYSBsYXJnZSBudW1iZXIgb2YgVVJCcywgYW5kIHdlIGNhbgorICogcGVyZmVjdGx5IGxpdmUgaGFwcHkgd2l0aCBvbmx5IG9uZS4gV2UgY2VydGFpbmx5IGRvbid0IG5lZWQgdG8ga2VlcCB0aGUKKyAqIGZ1bGwgSXJUVFAgd2luZG93IGFyb3VuZCBoZXJlLi4uCisgKiBJIHJlcGVhdCBmb3IgdGhvc2Ugd2hvIGhhdmUgdHJvdWJsZSB0byB1bmRlcnN0YW5kIDogMSBVUkIgaXMgcGxlbnR5CisgKiBnb29kIGVub3VnaCB0byBoYW5kbGUgYmFjay10by1iYWNrIChicmlja3dhbGxlZCkgZnJhbWVzLiBJIHRyaWVkIGl0LAorICogaXQgd29ya3MgKGl0J3MgdGhlIGhhcmR3YXJlIHRoYXQgaGFzIHRyb3VibGUgZG9pbmcgaXQpLgorICoKKyAqIEhhdmluZyAyIFVSQnMgd291bGQgYWxsb3cgdGhlIFVTQiBzdGFjayB0byBwcm9jZXNzIG9uZSBVUkIgd2hpbGUgd2UgdGFrZQorICogY2FyZSBvZiB0aGUgb3RoZXIgYW5kIHRoZW4gc3dhcCB0aGUgVVJCcy4uLgorICogT24gdGhlIG90aGVyIGhhbmQsIGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBVUkIgd2lsbCBoYXZlIHBlbmFsaXRpZXMKKyAqIGluIHRlcm0gb2YgbGF0ZW5jeSBhbmQgd2lsbCBpbnRlcmFjdCB3aXRoIHRoZSBsaW5rIG1hbmFnZW1lbnQgaW4gSXJMQVAuLi4KKyAqIEplYW4gSUkgKi8KKyNkZWZpbmUgSVVfTUFYX0FDVElWRV9SWF9VUkJTCTEJLyogRG9uJ3QgdG91Y2ggISEhICovCisKKy8qIFdoZW4gYSBSeCBVUkIgaXMgcGFzc2VkIGJhY2sgdG8gdXMsIHdlIGNhbid0IHJldXNlIGl0IGltbWVkaWF0ZWx5LAorICogYmVjYXVzZSBpdCBtYXkgc3RpbGwgYmUgcmVmZXJlbmNlZCBieSB0aGUgVVNCIGxheWVyLiBUaGVyZWZvcmUgd2UKKyAqIG5lZWQgdG8ga2VlcCBvbmUgZXh0cmEgVVJCIGluIHRoZSBSeCBwYXRoLgorICogSmVhbiBJSSAqLworI2RlZmluZSBJVV9NQVhfUlhfVVJCUwkoSVVfTUFYX0FDVElWRV9SWF9VUkJTICsgMSkKKworLyogVmFyaW91cyB1Z2x5IHN0dWZmIHRvIHRyeSB0byB3b3JrYXJvdW5kIGdlbmVyaWMgcHJvYmxlbXMgKi8KKy8qIFNlbmQgc3BlZWQgY29tbWFuZCBpbiBjYXNlIG9mIHRpbWVvdXQsIGp1c3QgZm9yIHRyeWluZyB0byBnZXQgdGhpbmdzIHNhbmUgKi8KKyNkZWZpbmUgSVVfQlVHX0tJQ0tfVElNRU9VVAorLyogU2hvdyB0aGUgVVNCIGNsYXNzIGRlc2NyaXB0b3IgKi8KKyN1bmRlZiBJVV9EVU1QX0NMQVNTX0RFU0MgCisvKiBBc3N1bWUgYSBtaW5pbXVtIHJvdW5kIHRyaXAgbGF0ZW5jeSBmb3IgVVNCIHRyYW5zZmVyIChpbiB1cykuLi4KKyAqIFVTQiB0cmFuc2ZlciBhcmUgZG9uZSBpbiB0aGUgbmV4dCBVU0Igc2xvdCBpZiB0aGVyZSBpcyBubyB0cmFmZmljCisgKiAoMS8xOSBtc2VjKSBhbmQgaXMgZG9uZSBhdCAxMiBNYi9zIDoKKyAqIFdhaXRpbmcgZm9yIHNsb3QgKyB0eCA9ICg1M3VzICsgMTZ1cykgKiAyID0gMTM3dXMgbWluaW11bS4KKyAqIFJ4IG5vdGlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgZG9uZSBhdCB0aGUgZW5kIG9mIHRoZSBVU0IgZnJhbWUgcGVyaW9kIDoKKyAqIE9IQ0kgOiBmcmFtZSBwZXJpb2QgPSAxbXMKKyAqIFVIQ0kgOiBmcmFtZSBwZXJpb2QgPSAxbXMsIGJ1dCBub3RpZmljYXRpb24gY2FuIHRha2UgMiBvciAzIG1zIDotKAorICogRUhDSSA6IGZyYW1lIHBlcmlvZCA9IDEyNXVzICovCisjZGVmaW5lIElVX1VTQl9NSU5fUlRUCQk1MDAJLyogVGhpcyBzaG91bGQgYmUgc2FmZSBpbiBtb3N0IGNhc2VzICovCisKKy8qIEluYm91bmQgaGVhZGVyICovCisjZGVmaW5lIE1FRElBX0JVU1kgICAgMHg4MAorCisjZGVmaW5lIFNQRUVEXzI0MDAgICAgMHgwMQorI2RlZmluZSBTUEVFRF85NjAwICAgIDB4MDIKKyNkZWZpbmUgU1BFRURfMTkyMDAgICAweDAzCisjZGVmaW5lIFNQRUVEXzM4NDAwICAgMHgwNAorI2RlZmluZSBTUEVFRF81NzYwMCAgIDB4MDUKKyNkZWZpbmUgU1BFRURfMTE1MjAwICAweDA2CisjZGVmaW5lIFNQRUVEXzU3NjAwMCAgMHgwNworI2RlZmluZSBTUEVFRF8xMTUyMDAwIDB4MDgKKyNkZWZpbmUgU1BFRURfNDAwMDAwMCAweDA5CisKKy8qIEJhc2ljIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBJVUNfREVGQVVMVAkweDAwCS8qIEJhc2ljIGRldmljZSBjb21wbGlhbnQgd2l0aCAxLjAgc3BlYyAqLworLyogTWFpbiBidWdzICovCisjZGVmaW5lIElVQ19TUEVFRF9CVUcJMHgwMQkvKiBEZXZpY2UgZG9lc24ndCBzZXQgc3BlZWQgYWZ0ZXIgdGhlIGZyYW1lICovCisjZGVmaW5lIElVQ19OT19XSU5ET1cJMHgwMgkvKiBEZXZpY2UgZG9lc24ndCBiZWhhdmUgd2l0aCBiaWcgUnggd2luZG93ICovCisjZGVmaW5lIElVQ19OT19UVVJOCTB4MDQJLyogRGV2aWNlIGRvZXNuJ3QgZG8gdHVybmFyb3VuZCBieSBpdHNlbGYgKi8KKy8qIE5vdCBjdXJyZW50bHkgdXNlZCAqLworI2RlZmluZSBJVUNfU0lSX09OTFkJMHgwOAkvKiBEZXZpY2UgZG9lc24ndCBiZWhhdmUgYXQgRklSIHNwZWVkcyAqLworI2RlZmluZSBJVUNfU01BTExfUEtUCTB4MTAJLyogRGV2aWNlIGRvZXNuJ3QgYmVoYXZlIHdpdGggYmlnIFJ4IHBhY2tldHMgKi8KKyNkZWZpbmUgSVVDX01BWF9XSU5ET1cJMHgyMAkvKiBEZXZpY2UgdW5kZXJlc3RpbWF0ZSB0aGUgUnggd2luZG93ICovCisjZGVmaW5lIElVQ19NQVhfWEJPRlMJMHg0MAkvKiBEZXZpY2UgbmVlZCBtb3JlIHhib2ZzIHRoYW4gYWR2ZXJ0aXNlZCAqLworCisvKiBVU0IgY2xhc3MgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVVNCX0lSREFfSEVBREVSICAgMHgwMQorI2RlZmluZSBVU0JfQ0xBU1NfSVJEQSAgICAweDAyIC8qIFVTQl9DTEFTU19BUFBfU1BFQyBzdWJjbGFzcyAqLyAKKyNkZWZpbmUgVVNCX0RUX0lSREEgICAgICAgMHgyMQorCitzdHJ1Y3QgaXJkYV9jbGFzc19kZXNjIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3UxNiBiY2RTcGVjUmV2aXNpb247CisJX191OCAgYm1EYXRhU2l6ZTsKKwlfX3U4ICBibVdpbmRvd1NpemU7CisJX191OCAgYm1NaW5UdXJuYXJvdW5kVGltZTsKKwlfX3UxNiB3QmF1ZFJhdGU7CisJX191OCAgYm1BZGRpdGlvbmFsQk9GczsKKwlfX3U4ICBiSXJkYVJhdGVTbmlmZjsKKwlfX3U4ICBiTWF4VW5pY2FzdExpc3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogY2xhc3Mgc3BlY2lmaWMgaW50ZXJmYWNlIHJlcXVlc3QgdG8gZ2V0IHRoZSBJckRBLVVTQiBjbGFzcyBkZXNjcmlwdG9yCisgKiAoNi4yLjUsIFVTQi1JckRBIGNsYXNzIHNwZWMgMS4wKSAqLworCisjZGVmaW5lIElVX1JFUV9HRVRfQ0xBU1NfREVTQwkweDA2CisKK3N0cnVjdCBpcmRhX3VzYl9jYiB7CisJc3RydWN0IGlyZGFfY2xhc3NfZGVzYyAqaXJkYV9kZXNjOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CS8qIGluaXQ6IHByb2JlX2lyZGEgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiaW50ZjsJLyogaW5pdDogcHJvYmVfaXJkYSAqLworCWludCBuZXRvcGVuOwkJCS8qIERldmljZSBpcyBhY3RpdmUgZm9yIG5ldHdvcmsgKi8KKwlpbnQgcHJlc2VudDsJCQkvKiBEZXZpY2UgaXMgcHJlc2VudCBvbiB0aGUgYnVzICovCisJX191MzIgY2FwYWJpbGl0eTsJCS8qIENhcGFiaWxpdHkgb2YgdGhlIGhhcmR3YXJlICovCisJX191OCAgYnVsa19pbl9lcDsJCS8qIFJ4IEVuZHBvaW50IGFzc2lnbm1lbnRzICovCisJX191OCAgYnVsa19vdXRfZXA7CQkvKiBUeCBFbmRwb2ludCBhc3NpZ25tZW50cyAqLworCV9fdTE2IGJ1bGtfb3V0X210dTsJCS8qIE1heCBUeCBwYWNrZXQgc2l6ZSBpbiBieXRlcyAqLworCV9fdTggIGJ1bGtfaW50X2VwOwkJLyogSW50ZXJydXB0IEVuZHBvaW50IGFzc2lnbm1lbnRzICovCisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3E7CS8qIGZvciB0aW1lb3V0cyAqLworCisJc3RydWN0IHVyYiAqcnhfdXJiW0lVX01BWF9SWF9VUkJTXTsJLyogVVJCcyB1c2VkIHRvIHJlY2VpdmUgZGF0YSBmcmFtZXMgKi8KKwlzdHJ1Y3QgdXJiICppZGxlX3J4X3VyYjsJLyogUG9pbnRlciB0byBpZGxlIFVSQiBpbiBSeCBwYXRoICovCisJc3RydWN0IHVyYiAqdHhfdXJiOwkJLyogVVJCIHVzZWQgdG8gc2VuZCBkYXRhIGZyYW1lcyAqLworCXN0cnVjdCB1cmIgKnNwZWVkX3VyYjsJCS8qIFVSQiB1c2VkIHRvIHNlbmQgc3BlZWQgY29tbWFuZHMgKi8KKwkKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2LiAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCXN0cnVjdCBxb3NfaW5mbyBxb3M7CisJaGFzaGJpbl90ICp0eF9saXN0OwkJLyogUXVldWVkIHRyYW5zbWl0IHNrYidzICovCisJY2hhciAqc3BlZWRfYnVmZjsJCS8qIEJ1ZmZlciBmb3Igc3BlZWQgY2hhbmdlcyAqLworCisJc3RydWN0IHRpbWV2YWwgc3RhbXA7CisJc3RydWN0IHRpbWV2YWwgbm93OworCisJc3BpbmxvY2tfdCBsb2NrOwkJLyogRm9yIHNlcmlhbGl6aW5nIG9wZXJhdGlvbnMgKi8KKworCV9fdTE2IHhib2ZzOwkJCS8qIEN1cnJlbnQgeGJvZnMgc2V0dGluZyAqLworCV9fczE2IG5ld194Ym9mczsJCS8qIHhib2ZzIHdlIG5lZWQgdG8gc2V0ICovCisJX191MzIgc3BlZWQ7CQkJLyogQ3VycmVudCBzcGVlZCAqLworCV9fczMyIG5ld19zcGVlZDsJCS8qIHNwZWVkIHdlIG5lZWQgdG8gc2V0ICovCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5jIGIvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTcxMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuYwpAQCAtMCwwICsxLDExNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogRmlsZW5hbWU6CSAgaXJwb3J0LmMKKyAqIFZlcnNpb246CSAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBIYWxmIGR1cGxleCBzZXJpYWwgcG9ydCBTSVIgZHJpdmVyIGZvciBJckRBLiAKKyAqIFN0YXR1czoJICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6CSAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDoJICBTdW4gQXVnICAzIDEzOjQ5OjU5IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBKYW4gMjggMjA6MjI6MzggMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogU291cmNlczoJICBzZXJpYWwuYyBieSBMaW51cyBUb3J2YWxkcyAKKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCwgMTk5OS0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEplYW4gVG91cnJpbGhlcywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICAgVGhpcyBkcml2ZXIgaXMgbWVudCB0byBiZSBhIHNtYWxsIGhhbGYgZHVwbGV4IHNlcmlhbCBkcml2ZXIgdG8gYmUKKyAqICAgICB1c2VkIGZvciBJUi1jaGlwc2V0cyB0aGF0IGhhcyBhIFVBUlQgKDE2NTUwKSBjb21wYXRpYmlsaXR5IG1vZGUuIAorICogICAgIEV2ZW50dWFsbHkgaXQgd2lsbCByZXBsYWNlIGlydHR5LCBiZWNhdXNlIG9mIGlydHR5IGhhcyBzb21lIAorICogICAgIHByb2JsZW1zIHRoYXQgaXMgaGFyZCB0byBnZXQgYXJvdW5kIHdoZW4gd2UgZG9uJ3QgaGF2ZSBjb250cm9sCisgKiAgICAgb3ZlciB0aGUgc2VyaWFsIGRyaXZlci4gVGhpcyBkcml2ZXIgbWF5IGFsc28gYmUgdXNlZCBieSBGSVIgCisgKiAgICAgZHJpdmVycyB0byBoYW5kbGUgU0lSIG1vZGUgZm9yIHRoZW0uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlICJpcnBvcnQuaCIKKworI2RlZmluZSBJT19FWFRFTlQgOAorCisvKiAKKyAqIEN1cnJlbnRseSB5b3UnbGwgbmVlZCB0byBzZXQgdGhlc2UgdmFsdWVzIHVzaW5nIGluc21vZCBsaWtlIHRoaXM6CisgKiBpbnNtb2QgaXJwb3J0IGlvPTB4M2U4IGlycT0xMQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlvW10gID0geyB+MCwgfjAsIH4wLCB+MCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBpcnFbXSA9IHsgMCwgMCwgMCwgMCB9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHFvc19tdHRfYml0cyA9IDB4MDM7CisKK3N0YXRpYyBzdHJ1Y3QgaXJwb3J0X2NiICpkZXZfc2VsZltdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJpcnBvcnQiOworCitzdGF0aWMgaW5saW5lIHZvaWQgaXJwb3J0X3dyaXRlX3dha2V1cChzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKTsKK3N0YXRpYyBpbmxpbmUgaW50ICBpcnBvcnRfd3JpdGUoaW50IGlvYmFzZSwgaW50IGZpZm9fc2l6ZSwgX191OCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnBvcnRfcmVjZWl2ZShzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKTsKKworc3RhdGljIGludCAgaXJwb3J0X25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCAKKwkJCSAgICAgaW50IGNtZCk7CitzdGF0aWMgaW5saW5lIGludCAgaXJwb3J0X2lzX3JlY2VpdmluZyhzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIGlycG9ydF9zZXRfZHRyX3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZHRyLCBpbnQgcnRzKTsKK3N0YXRpYyBpbnQgIGlycG9ydF9yYXdfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191OCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJwb3J0X25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlycG9ydF9jaGFuZ2Vfc3BlZWRfY29tcGxldGUoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgdm9pZCBpcnBvcnRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGlycXJldHVybl90IGlycG9ydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGlycG9ydF9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpcnBvcnRfY2hhbmdlX3NwZWVkKHZvaWQgKnByaXYsIF9fdTMyIHNwZWVkKTsKK3N0YXRpYyBpbnQgaXJwb3J0X25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpcnBvcnRfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgc3RydWN0IGlycG9ydF9jYiAqCitpcnBvcnRfb3BlbihpbnQgaSwgdW5zaWduZWQgaW50IGlvYmFzZSwgdW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpcnBvcnRfY2IgKnNlbGY7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogTG9jayB0aGUgcG9ydCB0aGF0IHdlIG5lZWQgKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgSU9fRVhURU5ULCBkcml2ZXJfbmFtZSkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgY2FuJ3QgZ2V0IGlvYmFzZSBvZiAweCUwM3hcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGlvYmFzZSk7CisJCWdvdG8gZXJyX291dDE7CisJfQorCisJLyoKKwkgKiAgQWxsb2NhdGUgbmV3IGluc3RhbmNlIG9mIHRoZSBkcml2ZXIKKwkgKi8KKwlkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZihzdHJ1Y3QgaXJwb3J0X2NiKSk7CisJaWYgKCFkZXYpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCQkgICAiaXJkYSBkZXZpY2UhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycl9vdXQyOworCX0KKworCXNlbGYgPSBkZXYtPnByaXY7CisJc3Bpbl9sb2NrX2luaXQoJnNlbGYtPmxvY2spOworCisJLyogTmVlZCB0byBzdG9yZSBzZWxmIHNvbWV3aGVyZSAqLworCWRldl9zZWxmW2ldID0gc2VsZjsKKwlzZWxmLT5wcml2ID0gc2VsZjsKKwlzZWxmLT5pbmRleCA9IGk7CisKKwkvKiBJbml0aWFsaXplIElPICovCisJc2VsZi0+aW8uc2lyX2Jhc2UgID0gaW9iYXNlOworICAgICAgICBzZWxmLT5pby5zaXJfZXh0ICAgPSBJT19FWFRFTlQ7CisgICAgICAgIHNlbGYtPmlvLmlycSAgICAgICA9IGlycTsKKyAgICAgICAgc2VsZi0+aW8uZmlmb19zaXplID0gMTY7CQkvKiAxNjU1MEEgYW5kIGNvbXBhdGlibGUgKi8KKworCS8qIEluaXRpYWxpemUgUW9TIGZvciB0aGlzIGRldmljZSAqLworCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnNlbGYtPnFvcyk7CisJCisJc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHwKKwkJSVJfMTE1MjAwOworCisJc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3MpOworCQorCS8qIEJvb3RzdHJhcCBaZXJvQ29weSBSeCAqLworCXNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgPSBJUkRBX1NLQl9NQVhfTVRVOworCXNlbGYtPnJ4X2J1ZmYuc2tiID0gX19kZXZfYWxsb2Nfc2tiKHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+cnhfYnVmZi5za2IgPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCSAgICJyZWNlaXZlIGJ1ZmZlciFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXJyX291dDM7CisJfQorCXNrYl9yZXNlcnZlKHNlbGYtPnJ4X2J1ZmYuc2tiLCAxKTsKKwlzZWxmLT5yeF9idWZmLmhlYWQgPSBzZWxmLT5yeF9idWZmLnNrYi0+ZGF0YTsKKwkvKiBObyBuZWVkIHRvIG1lbXNldCB0aGUgYnVmZmVyLCB1bmxlc3MgeW91IGFyZSByZWFsbHkgcGVkYW50aWMgKi8KKworCS8qIEZpbmlzaCBzZXR1cCB0aGUgUnggYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwlzZWxmLT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJc2VsZi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCisJLyogU3BlY2lmeSBob3cgbXVjaCBtZW1vcnkgd2Ugd2FudCAqLworCXNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUgPSA0MDAwOworCQorCS8qIEFsbG9jYXRlIG1lbW9yeSBpZiBuZWVkZWQgKi8KKwlpZiAoc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSA+IDApIHsKKwkJc2VsZi0+dHhfYnVmZi5oZWFkID0gKF9fdTggKikga21hbGxvYyhzZWxmLT50eF9idWZmLnRydWVzaXplLCAKKwkJCQkJCSAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJCUlSREFfRVJST1IoIiVzKCksIGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJCSAgICJ0cmFuc21pdCBidWZmZXIhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZ290byBlcnJfb3V0NDsKKwkJfQorCQltZW1zZXQoc2VsZi0+dHhfYnVmZi5oZWFkLCAwLCBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKwl9CQorCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKworCXNlbGYtPm5ldGRldiA9IGRldjsKKwkvKiBLZWVwIHRyYWNrIG9mIG1vZHVsZSB1c2FnZSAqLworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIE1heSBiZSBvdmVycmlkZGVuIGJ5IHBpZ2d5YmFjayBkcml2ZXJzICovCisJc2VsZi0+aW50ZXJydXB0ICAgID0gaXJwb3J0X2ludGVycnVwdDsKKwlzZWxmLT5jaGFuZ2Vfc3BlZWQgPSBpcnBvcnRfY2hhbmdlX3NwZWVkOworCisJLyogT3ZlcnJpZGUgdGhlIG5ldHdvcmsgZnVuY3Rpb25zIHdlIG5lZWQgdG8gdXNlICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpcnBvcnRfaGFyZF94bWl0OworCWRldi0+dHhfdGltZW91dAkgICAgID0gaXJwb3J0X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyAgPSBIWjsgIC8qIEFsbG93IHRpbWUgZW5vdWdoIGZvciBzcGVlZCBjaGFuZ2UgKi8KKwlkZXYtPm9wZW4gICAgICAgICAgICA9IGlycG9ydF9uZXRfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICA9IGlycG9ydF9uZXRfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJICAgICA9IGlycG9ydF9uZXRfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwgICAgICAgID0gaXJwb3J0X25ldF9pb2N0bDsKKworCS8qIE1ha2UgaWZjb25maWcgZGlzcGxheSBzb21lIGRldGFpbHMgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYmFzZTsKKwlkZXYtPmlycSA9IGlycTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlJUkRBX0VSUk9SKCIlcygpLCByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycl9vdXQ1OworCX0KKwlJUkRBX01FU1NBR0UoIklyREE6IFJlZ2lzdGVyZWQgZGV2aWNlICVzIChpcnBvcnQgaW89MHglWCBpcnE9JWQpXG4iLAorCQlkZXYtPm5hbWUsIGlvYmFzZSwgaXJxKTsKKworCXJldHVybiBzZWxmOworIGVycl9vdXQ1OgorCWtmcmVlKHNlbGYtPnR4X2J1ZmYuaGVhZCk7CisgZXJyX291dDQ6CisJa2ZyZWVfc2tiKHNlbGYtPnJ4X2J1ZmYuc2tiKTsKKyBlcnJfb3V0MzoKKwlmcmVlX25ldGRldihkZXYpOworCWRldl9zZWxmW2ldID0gTlVMTDsKKyBlcnJfb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIElPX0VYVEVOVCk7CisgZXJyX291dDE6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaXJwb3J0X2Nsb3NlKHN0cnVjdCBpcnBvcnRfY2IgKnNlbGYpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIFdlIGFyZSBub3QgdXNpbmcgYW55IGRvbmdsZSBhbnltb3JlISAqLworCWlmIChzZWxmLT5kb25nbGUpCisJCWlyZGFfZGV2aWNlX2RvbmdsZV9jbGVhbnVwKHNlbGYtPmRvbmdsZSk7CisJc2VsZi0+ZG9uZ2xlID0gTlVMTDsKKwkKKwkvKiBSZW1vdmUgbmV0ZGV2aWNlICovCisJdW5yZWdpc3Rlcl9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKworCS8qIFJlbGVhc2UgdGhlIElPLXBvcnQgdGhhdCB0aGlzIGRyaXZlciBpcyB1c2luZyAqLworCUlSREFfREVCVUcoMCAsICIlcygpLCBSZWxlYXNpbmcgUmVnaW9uICUwM3hcbiIsIAorCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLnNpcl9iYXNlKTsKKwlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5zaXJfYmFzZSwgc2VsZi0+aW8uc2lyX2V4dCk7CisKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkKQorCQlrZnJlZShzZWxmLT50eF9idWZmLmhlYWQpOworCQorCWlmIChzZWxmLT5yeF9idWZmLnNrYikKKwkJa2ZyZWVfc2tiKHNlbGYtPnJ4X2J1ZmYuc2tiKTsKKwlzZWxmLT5yeF9idWZmLnNrYiA9IE5VTEw7CisJCisJLyogUmVtb3ZlIG91cnNlbHZlcyAqLworCWRldl9zZWxmW3NlbGYtPmluZGV4XSA9IE5VTEw7CisJZnJlZV9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXJwb3J0X3N0b3Aoc3RydWN0IGlycG9ydF9jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBXZSBjYW4ndCBsb2NrLCB3ZSBtYXkgYmUgY2FsbGVkIGZyb20gYSBGSVIgZHJpdmVyIC0gSmVhbiBJSSAqLworCisJLyogV2UgYXJlIG5vdCB0cmFuc21pdHRpbmcgYW55IG1vcmUgKi8KKwlzZWxmLT50cmFuc21pdHRpbmcgPSAwOworCisJLyogUmVzZXQgVUFSVCAqLworCW91dGIoMCwgaW9iYXNlK1VBUlRfTUNSKTsKKwkKKwkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzICovCisJb3V0YigwLCBpb2Jhc2UrVUFSVF9JRVIpOworfQorCitzdGF0aWMgdm9pZCBpcnBvcnRfc3RhcnQoc3RydWN0IGlycG9ydF9jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwlpcnBvcnRfc3RvcChzZWxmKTsKKwkKKwkvKiBXZSBjYW4ndCBsb2NrLCB3ZSBtYXkgYmUgY2FsbGVkIGZyb20gYSBGSVIgZHJpdmVyIC0gSmVhbiBJSSAqLworCisJLyogSW5pdGlhbGl6ZSBVQVJUICovCisJb3V0YihVQVJUX0xDUl9XTEVOOCwgaW9iYXNlK1VBUlRfTENSKTsgIC8qIFJlc2V0IERMQUIgKi8KKwlvdXRiKChVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyKSwgaW9iYXNlK1VBUlRfTUNSKTsKKwkKKwkvKiBUdXJuIG9uIGludGVycnVwcyAqLworCW91dGIoVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESSB8VUFSVF9JRVJfVEhSSSwgaW9iYXNlK1VBUlRfSUVSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9wcm9iZSAodm9pZCkKKyAqCisgKiAgICBTdGFydCBJTyBwb3J0IAorICoKKyAqLworaW50IGlycG9ydF9wcm9iZShpbnQgaW9iYXNlKQoreworCUlSREFfREVCVUcoNCwgIiVzKCksIGlvYmFzZT0lI3hcbiIsIF9fRlVOQ1RJT05fXywgaW9iYXNlKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X2dldF9mY3IgKHNwZWVkKQorICoKKyAqICAgIENvbXB1dGUgdmFsdWUgb2YgZmNyCisgKgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpcnBvcnRfZ2V0X2ZjcihfX3UzMiBzcGVlZCkKK3sKKwl1bnNpZ25lZCBpbnQgZmNyOyAgICAvKiBGSUZPIGNvbnRyb2wgcmVnICovCisKKwkvKiBFbmFibGUgZmlmb3MgKi8KKwlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKKworCS8qIAorCSAqIFVzZSB0cmlnZ2VyIGxldmVsIDEgdG8gYXZvaWQgMyBtcy4gdGltZW91dCBkZWxheSBhdCA5NjAwIGJwcywgYW5kCisJICogYWxtb3N0IDEsNyBtcyBhdCAxOTIwMCBicHMuIEF0IHNwZWVkcyBhYm92ZSB0aGF0IHdlIGNhbiBqdXN0IGZvcmdldAorCSAqIGFib3V0IHRoaXMgdGltZW91dCBzaW5jZSBpdCB3aWxsIGFsd2F5cyBiZSBmYXN0IGVub3VnaC4gCisJICovCisJaWYgKHNwZWVkIDwgMzg0MDApCisJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE7CisJZWxzZSAKKwkJLy9mY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xNDsKKwkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfODsKKworCXJldHVybihmY3IpOworfQorIAorLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9jaGFuZ2Vfc3BlZWQgKHNlbGYsIHNwZWVkKQorICoKKyAqICAgIFNldCBzcGVlZCBvZiBJckRBIHBvcnQgdG8gc3BlY2lmaWVkIGJhdWRyYXRlCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggaXJxIG9mZiBhbmQgc3Bpbi1sb2NrLgorICovCitzdGF0aWMgdm9pZCBpcnBvcnRfY2hhbmdlX3NwZWVkKHZvaWQgKnByaXYsIF9fdTMyIHNwZWVkKQoreworCXN0cnVjdCBpcnBvcnRfY2IgKnNlbGYgPSAoc3RydWN0IGlycG9ydF9jYiAqKSBwcml2OworCWludCBpb2Jhc2U7IAorCXVuc2lnbmVkIGludCBmY3I7ICAgIC8qIEZJRk8gY29udHJvbCByZWcgKi8KKwl1bnNpZ25lZCBpbnQgbGNyOyAgICAvKiBMaW5lIGNvbnRyb2wgcmVnICovCisJaW50IGRpdmlzb3I7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNwZWVkICE9IDAsIHJldHVybjspOworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgU2V0dGluZyBzcGVlZCB0bzogJWQgLSBpb2Jhc2U9JSN4XG4iLAorCQkgICAgX19GVU5DVElPTl9fLCBzcGVlZCwgc2VsZi0+aW8uc2lyX2Jhc2UpOworCisJLyogV2UgY2FuJ3QgbG9jaywgd2UgbWF5IGJlIGNhbGxlZCBmcm9tIGEgRklSIGRyaXZlciAtIEplYW4gSUkgKi8KKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCQorCS8qIFVwZGF0ZSBhY2NvdW50aW5nIGZvciBuZXcgc3BlZWQgKi8KKwlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOworCisJLyogVHVybiBvZmYgaW50ZXJydXB0cyAqLworCW91dGIoMCwgaW9iYXNlK1VBUlRfSUVSKTsgCisKKwlkaXZpc29yID0gU1BFRURfTUFYL3NwZWVkOworCQorCS8qIEdldCBwcm9wZXIgZmlmbyBjb25maWd1cmF0aW9uICovCisJZmNyID0gaXJwb3J0X2dldF9mY3Ioc3BlZWQpOworCisJLyogSXJEQSBwb3J0cyB1c2UgOE4xICovCisJbGNyID0gVUFSVF9MQ1JfV0xFTjg7CisJCisJb3V0YihVQVJUX0xDUl9ETEFCIHwgbGNyLCBpb2Jhc2UrVUFSVF9MQ1IpOyAvKiBTZXQgRExBQiAqLworCW91dGIoZGl2aXNvciAmIDB4ZmYsICAgICAgaW9iYXNlK1VBUlRfRExMKTsgLyogU2V0IHNwZWVkICovCisJb3V0YihkaXZpc29yID4+IDgsCSAgaW9iYXNlK1VBUlRfRExNKTsKKwlvdXRiKGxjciwJCSAgaW9iYXNlK1VBUlRfTENSKTsgLyogU2V0IDhOMQkqLworCW91dGIoZmNyLAkJICBpb2Jhc2UrVUFSVF9GQ1IpOyAvKiBFbmFibGUgRklGTydzICovCisKKwkvKiBUdXJuIG9uIGludGVycnVwcyAqLworCS8qIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIGZhdGFsIGludGVycnVwdCBzdG9ybS4KKwkgKiBQZW9wbGUgY2FsbGluZyB1cyB3aWxsIGRvIHRoYXQgcHJvcGVybHkgLSBKZWFuIElJICovCisJLy9vdXRiKC8qVUFSVF9JRVJfUkxTSXwqL1VBUlRfSUVSX1JESS8qfFVBUlRfSUVSX1RIUkkqLywgaW9iYXNlK1VBUlRfSUVSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIF9faXJwb3J0X2NoYW5nZV9zcGVlZCAoaW5zdGFuY2UsIHN0YXRlLCBwYXJhbSkKKyAqCisgKiAgICBTdGF0ZSBtYWNoaW5lIGZvciBjaGFuZ2luZyBzcGVlZCBvZiB0aGUgZGV2aWNlLiBXZSBkbyBpdCB0aGlzIHdheSBzaW5jZQorICogICAgd2UgY2Fubm90IHVzZSBzY2hlZHVsZV90aW1lb3V0KCkgd2hlbiB3ZSBhcmUgaW4gaW50ZXJydXB0IGNvbnRleHQKKyAqCisgKi8KK2ludCBfX2lycG9ydF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCV9fdTMyIHNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgd2FzdW5sb2NrZWQgPSAwOworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgPCVsZD5cbiIsIF9fRlVOQ1RJT05fXywgamlmZmllcyk7IAorCisJc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIHRhc2stPmluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIExvY2tpbmcgbm90ZXMgOiB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBpcnEgY29udGV4dCB3aXRoCisJICogc3BpbmxvY2ssIHZpYSBpcnBvcnRfd3JpdGVfd2FrZXVwKCksIG9yIGZyb20gbm9uLWludGVycnVwdCB3aXRob3V0CisJICogc3BpbmxvY2sgKGZyb20gdGhlIHRhc2sgdGltZXIpLiBZdWNrICEKKwkgKiBUaGlzIGlzIHVnbHksIGFuZCB1bnNhZmUgaXMgdGhlIHNwaW5sb2NrIGlzIG5vdCBhbHJlYWR5IGFxdWlyZWQuCisJICogVGhpcyB3aWxsIGJlIGZpeGVkIHdoZW4gaXJkYS10YXNrIGdldCByZXdyaXR0ZW4uCisJICogSmVhbiBJSSAqLworCWlmICghc3Bpbl9pc19sb2NrZWQoJnNlbGYtPmxvY2spKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCXdhc3VubG9ja2VkID0gMTsKKwl9CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwljYXNlIElSREFfVEFTS19XQUlUOgorCQkvKiBBcmUgd2UgcmVhZHkgdG8gY2hhbmdlIHNwZWVkIHlldD8gKi8KKwkJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkgeworCQkJdGFzay0+c3RhdGUgPSBJUkRBX1RBU0tfV0FJVDsKKworCQkJLyogVHJ5IGFnYWluIGxhdGVyICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNlbGYtPmRvbmdsZSkKKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9JTklUKTsKKwkJZWxzZQorCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX0RPTkUpOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9JTklUOgorCQkvKiBHbyB0byBkZWZhdWx0IHNwZWVkICovCisJCXNlbGYtPmNoYW5nZV9zcGVlZChzZWxmLT5wcml2LCA5NjAwKTsKKworCQkvKiBDaGFuZ2Ugc3BlZWQgb2YgZG9uZ2xlICovCisJCWlmIChpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLT5kb25nbGUsCisJCQkJICAgICAgc2VsZi0+ZG9uZ2xlLT5pc3N1ZS0+Y2hhbmdlX3NwZWVkLCAKKwkJCQkgICAgICBOVUxMLCB0YXNrLCAodm9pZCAqKSBzcGVlZCkpCisJCXsKKwkJCS8qIERvbmdsZSBuZWVkIG1vcmUgdGltZSB0byBjaGFuZ2UgaXRzIHNwZWVkICovCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfV0FJVCk7CisKKwkJCS8qIEdpdmUgZG9uZ2xlIDEgc2VjIHRvIGZpbmlzaCAqLworCQkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxMDAwKTsKKwkJfSBlbHNlCisJCQkvKiBDaGlsZCBmaW5pc2hlZCBpbW1lZGlhdGVseSAqLworCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX0RPTkUpOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9XQUlUOgorCQlJUkRBX1dBUk5JTkcoIiVzKCksIGNoYW5naW5nIHNwZWVkIG9mIGRvbmdsZSB0aW1lZCBvdXQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtMTsJCQorCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9ET05FOgorCQkvKiBGaW5hbGx5IHdlIGFyZSByZWFkeSB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJCXNlbGYtPmNoYW5nZV9zcGVlZChzZWxmLT5wcml2LCBzcGVlZCk7CisJCQorCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCS8qIFB1dCBzdHVmZiBpbiB0aGUgc3RhdGUgd2UgZm91bmQgdGhlbSAtIEplYW4gSUkgKi8KKwlpZih3YXN1bmxvY2tlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9jaGFuZ2Vfc3BlZWRfY29tcGxldGUgKHRhc2spCisgKgorICogICAgQ2FsbGVkIHdoZW4gdGhlIGNoYW5nZSBzcGVlZCBvcGVyYXRpb24gY29tcGxldGVzCisgKgorICovCitzdGF0aWMgaW50IGlycG9ydF9jaGFuZ2Vfc3BlZWRfY29tcGxldGUoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNlbGYgPSAoc3RydWN0IGlycG9ydF9jYiAqKSB0YXNrLT5pbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bmV0ZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogRmluaXNoZWQgY2hhbmdpbmcgc3BlZWQsIHNvIHdlIGFyZSBub3QgYnVzeSBhbnkgbG9uZ2VyICovCisJLyogU2lnbmFsIG5ldHdvcmsgbGF5ZXIgc28gaXQgY2FuIHRyeSB0byBzZW5kIHRoZSBmcmFtZSAqLworCisJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisgKgorICogICAgVGhlIG5ldHdvcmtpbmcgbGF5ZXIgdGhpbmtzIHdlIHRpbWVkIG91dC4KKyAqCisgKi8KKworc3RhdGljIHZvaWQgaXJwb3J0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCWludCBpb2Jhc2U7CisJaW50IGlpciwgbHNyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzZWxmID0gKHN0cnVjdCBpcnBvcnRfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisJCisJSVJEQV9XQVJOSU5HKCIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBqaWZmaWVzID0gJWxkLCB0cmFuc19zdGFydCA9ICVsZFxuIiwKKwkJZGV2LT5uYW1lLCBqaWZmaWVzLCBkZXYtPnRyYW5zX3N0YXJ0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogRGVidWcgd2hhdCdzIGhhcHBlbmluZy4uLiAqLworCisJLyogR2V0IGludGVycnVwdCBzdGF0dXMgKi8KKwlsc3IgPSBpbmIoaW9iYXNlK1VBUlRfTFNSKTsKKwkvKiBSZWFkIGludGVycnVwdCByZWdpc3RlciAqLworCWlpciA9IGluYihpb2Jhc2UrVUFSVF9JSVIpOworCUlSREFfREVCVUcoMCwgIiVzKCksIGlpcj0lMDJ4LCBsc3I9JTAyeCwgaW9iYXNlPSUjeFxuIiwgCisJCSAgIF9fRlVOQ1RJT05fXywgaWlyLCBsc3IsIGlvYmFzZSk7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpLCB0cmFuc21pdHRpbmc9JWQsIHJlbWFpbj0lZCwgZG9uZT0lZFxuIiwgCisJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+dHJhbnNtaXR0aW5nLCBzZWxmLT50eF9idWZmLmxlbiwKKwkJICAgc2VsZi0+dHhfYnVmZi5kYXRhIC0gc2VsZi0+dHhfYnVmZi5oZWFkKTsKKworCS8qIE5vdywgcmVzdGFydCB0aGUgcG9ydCAqLworCWlycG9ydF9zdGFydChzZWxmKTsKKwlzZWxmLT5jaGFuZ2Vfc3BlZWQoc2VsZi0+cHJpdiwgc2VsZi0+aW8uc3BlZWQpOworCS8qIFRoaXMgd2lsbCByZS1lbmFibGUgaXJxcyAqLworCW91dGIoLypVQVJUX0lFUl9STFNJfCovVUFSVF9JRVJfUkRJLyp8VUFSVF9JRVJfVEhSSSovLCBpb2Jhc2UrVUFSVF9JRVIpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKyAKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2ggKCkKKyAqCisgKiAgICBXYWl0IGZvciB0aGUgcmVhbCBlbmQgb2YgSFcgdHJhbnNtaXNzaW9uCisgKgorICogVGhlIFVBUlQgaXMgYSBzdHJpY3QgRklGTywgYW5kIHdlIGdldCBjYWxsZWQgb25seSB3aGVuIHdlIGhhdmUgZmluaXNoZWQKKyAqIHB1c2hpbmcgZGF0YSB0byB0aGUgRklGTywgc28gdGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgd2UgbXVzdCB3YWl0CisgKiBpcyBvbmx5IGZvciB0aGUgRklGTyB0byBkcmFpbiBvdXQuCisgKgorICogV2UgdXNlIGEgc2ltcGxlIGNhbGlicmF0ZWQgbG9vcC4gV2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBsb29wCisgKiBkZWxheSAodWRlbGF5KSB0byBiYWxhbmNlIEkvTyB0cmFmZmljIGFuZCBsYXRlbmN5LiBBbmQgd2UgYWxzbyBuZWVkIHRvCisgKiBhZGp1c3QgdGhlIG1heGltdW0gdGltZW91dC4KKyAqIEl0IHdvdWxkIHByb2JhYmx5IGJlIGJldHRlciB0byB3YWl0IGZvciB0aGUgcHJvcGVyIGludGVycnVwdCwKKyAqIGJ1dCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIFdlIGNhbid0IHVzZSBqaWZmaWVzIG9yIGtlcm5lbCB0aW1lcnMgYmVjYXVzZSA6CisgKiAxKSBXZSBhcmUgY2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBkaXNhYmxlIHNvZnRpcnFzLAorICogc28gamlmZmllcyB3b24ndCBiZSBpbmNyZWFzZWQKKyAqIDIpIEppZmZpZXMgZ3JhbnVsYXJpdHkgaXMgdXN1YWxseSB2ZXJ5IGNvYXJzZSAoMTBtcyksIGFuZCB3ZSBkb24ndAorICogd2FudCB0byB3YWl0IHRoYXQgbG9uZyB0byBkZXRlY3Qgc3R1Y2sgaGFyZHdhcmUuCisgKiBKZWFuIElJCisgKi8KKworc3RhdGljIHZvaWQgaXJwb3J0X3dhaXRfaHdfdHJhbnNtaXR0ZXJfZmluaXNoKHN0cnVjdCBpcnBvcnRfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKwlpbnQgY291bnQgPSAxMDAwOwkvKiAxIG1zICovCisJCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBDYWxpYnJhdGVkIGJ1c3kgbG9vcCAqLworCXdoaWxlKChjb3VudC0tID4gMCkgJiYgIShpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKQorCQl1ZGVsYXkoMSk7CisKKwlpZihjb3VudCA9PSAwKQorCQlJUkRBX0RFQlVHKDAsICIlcygpOiBzdHVjayB0cmFuc21pdHRlclxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9oYXJkX3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisgKgorICogICAgVHJhbnNtaXRzIHRoZSBjdXJyZW50IGZyYW1lIHVudGlsIEZJRk8gaXMgZnVsbCwgdGhlbgorICogICAgd2FpdHMgdW50aWwgdGhlIG5leHQgdHJhbnNtaXR0IGludGVycnVwdCwgYW5kIGNvbnRpbnVlcyB1bnRpbCB0aGUKKyAqICAgIGZyYW1lIGlzIHRyYW5zbWl0dGVkLgorICovCitzdGF0aWMgaW50IGlycG9ydF9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYmFzZTsKKwlzMzIgc3BlZWQ7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIE1ha2Ugc3VyZSB0ZXN0cyAmIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lICovCisJCWlmICghc2tiLT5sZW4pIHsKKwkJCS8qCisJCQkgKiBXZSBzZW5kIGZyYW1lcyBvbmUgYnkgb25lIGluIFNJUiBtb2RlIChubworCQkJICogcGlwZWxpbmluZyksIHNvIGF0IHRoaXMgcG9pbnQsIGlmIHdlIHdlcmUgc2VuZGluZworCQkJICogYSBwcmV2aW91cyBmcmFtZSwgd2UganVzdCByZWNlaXZlZCB0aGUgaW50ZXJydXB0CisJCQkgKiB0ZWxsaW5nIHVzIGl0IGlzIGZpbmlzaGVkIChVQVJUX0lJUl9USFJJKS4KKwkJCSAqIFRoZXJlZm9yZSwgd2FpdGluZyBmb3IgdGhlIHRyYW5zbWl0dGVyIHRvIHJlYWxseQorCQkJICogZmluaXNoIGRyYWluaW5nIHRoZSBmaWZvIHdvbid0IHRha2UgdG9vIGxvbmcuCisJCQkgKiBBbmQgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIG5vdCBleHBlY3RlZCB0byBydW4uCisJCQkgKiAtIEplYW4gSUkgKi8KKwkJCWlycG9ydF93YWl0X2h3X3RyYW5zbWl0dGVyX2ZpbmlzaChzZWxmKTsKKwkJCS8qIEJldHRlciBnbyB0aGVyZSBhbHJlYWR5IGxvY2tlZCAtIEplYW4gSUkgKi8KKwkJCWlyZGFfdGFza19leGVjdXRlKHNlbGYsIF9faXJwb3J0X2NoYW5nZV9zcGVlZCwgCisJCQkJCSAgaXJwb3J0X2NoYW5nZV9zcGVlZF9jb21wbGV0ZSwgCisJCQkJCSAgTlVMTCwgKHZvaWQgKikgc3BlZWQpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwl9CisKKwkvKiBJbml0IHR4IGJ1ZmZlciAqLworCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKworICAgICAgICAvKiBDb3B5IHNrYiB0byB0eF9idWZmIHdoaWxlIHdyYXBwaW5nLCBzdHVmZmluZyBhbmQgbWFraW5nIENSQyAqLworCXNlbGYtPnR4X2J1ZmYubGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsIAorCQkJCQkgICBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKwkKKwlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKworCS8qIFdlIGFyZSB0cmFuc21pdHRpbmcgKi8KKwlzZWxmLT50cmFuc21pdHRpbmcgPSAxOworCisJLyogVHVybiBvbiB0cmFuc21pdCBmaW5pc2hlZCBpbnRlcnJ1cHQuIFdpbGwgZmlyZSBpbW1lZGlhdGVseSEgICovCisJb3V0YihVQVJUX0lFUl9USFJJLCBpb2Jhc2UrVUFSVF9JRVIpOyAKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKyAgICAgICAgCisvKgorICogRnVuY3Rpb24gaXJwb3J0X3dyaXRlIChkcml2ZXIpCisgKgorICogICAgRmlsbCBUeCBGSUZPIHdpdGggdHJhbnNtaXQgZGF0YQorICoKKyAqIENhbGxlZCBvbmx5IGZyb20gaXJwb3J0X3dyaXRlX3dha2V1cCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlycG9ydF93cml0ZShpbnQgaW9iYXNlLCBpbnQgZmlmb19zaXplLCBfX3U4ICpidWYsIGludCBsZW4pCit7CisJaW50IGFjdHVhbCA9IDA7CisKKwkvKiBGaWxsIEZJRk8gd2l0aCBjdXJyZW50IGZyYW1lICovCisJd2hpbGUgKChhY3R1YWwgPCBmaWZvX3NpemUpICYmIChhY3R1YWwgPCBsZW4pKSB7CisJCS8qIFRyYW5zbWl0IG5leHQgYnl0ZSAqLworCQlvdXRiKGJ1ZlthY3R1YWxdLCBpb2Jhc2UrVUFSVF9UWCk7CisKKwkJYWN0dWFsKys7CisJfQorICAgICAgICAKKwlyZXR1cm4gYWN0dWFsOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X3dyaXRlX3dha2V1cCAodHR5KQorICoKKyAqICAgIENhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gdGhlcmUncyByb29tIGZvciBtb3JlIGRhdGEuICBJZiB3ZSBoYXZlCisgKiAgICBtb3JlIHBhY2tldHMgdG8gc2VuZCwgd2Ugc2VuZCB0aGVtIGhlcmUuCisgKgorICogQ2FsbGVkIG9ubHkgZnJvbSBpcnBvcnRfaW50ZXJydXB0KCkKKyAqIE1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGlzICpub3QqIGNhbGxlZCB3aGlsZSB3ZSBhcmUgcmVjZWl2aW5nLAorICogb3RoZXJ3aXNlIHdlIHdpbGwgcmVzZXQgZmlmbyBhbmQgbG9vc2UgZGF0YSA6LSgKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlycG9ydF93cml0ZV93YWtldXAoc3RydWN0IGlycG9ydF9jYiAqc2VsZikKK3sKKwlpbnQgYWN0dWFsID0gMDsKKwlpbnQgaW9iYXNlOworCXVuc2lnbmVkIGludCBmY3I7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogRmluaXNoZWQgd2l0aCBmcmFtZT8gICovCisJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkgIHsKKwkJLyogV3JpdGUgZGF0YSBsZWZ0IGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlhY3R1YWwgPSBpcnBvcnRfd3JpdGUoaW9iYXNlLCBzZWxmLT5pby5maWZvX3NpemUsIAorCQkJCSAgICAgIHNlbGYtPnR4X2J1ZmYuZGF0YSwgc2VsZi0+dHhfYnVmZi5sZW4pOworCQlzZWxmLT50eF9idWZmLmRhdGEgKz0gYWN0dWFsOworCQlzZWxmLT50eF9idWZmLmxlbiAgLT0gYWN0dWFsOworCX0gZWxzZSB7CisJCS8qIAorCQkgKiAgTm93IHNlcmlhbCBidWZmZXIgaXMgYWxtb3N0IGZyZWUgJiB3ZSBjYW4gc3RhcnQgCisJCSAqICB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQuIEJ1dCBmaXJzdCB3ZSBtdXN0IGNoZWNrCisJCSAqICBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGhhcmR3YXJlCisJCSAqLworCQlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CisJCQlpcnBvcnRfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2goc2VsZik7CisJCQlpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCBfX2lycG9ydF9jaGFuZ2Vfc3BlZWQsIAorCQkJCQkgIGlycG9ydF9jaGFuZ2Vfc3BlZWRfY29tcGxldGUsIAorCQkJCQkgIE5VTEwsICh2b2lkICopIHNlbGYtPm5ld19zcGVlZCk7CisJCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCQl9IGVsc2UgeworCQkJLyogVGVsbCBuZXR3b3JrIGxheWVyIHRoYXQgd2Ugd2FudCBtb3JlIGZyYW1lcyAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQl9CisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCQkvKiAKKwkJICogUmVzZXQgUnggRklGTyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgcmVmbGVjdGVkIHRyYW5zbWl0IGRhdGEKKwkJICogaXMgZGlzY2FyZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgaGFsZiBkdXBsZXggb3BlcmF0aW9uCisJCSAqLworCQlmY3IgPSBpcnBvcnRfZ2V0X2ZjcihzZWxmLT5pby5zcGVlZCk7CisJCWZjciB8PSBVQVJUX0ZDUl9DTEVBUl9SQ1ZSOworCQlvdXRiKGZjciwgaW9iYXNlK1VBUlRfRkNSKTsKKworCQkvKiBGaW5pc2hlZCB0cmFuc21pdHRpbmcgKi8KKwkJc2VsZi0+dHJhbnNtaXR0aW5nID0gMDsKKworCQkvKiBUdXJuIG9uIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCQlvdXRiKFVBUlRfSUVSX1JESSwgaW9iYXNlK1VBUlRfSUVSKTsKKworCQlJUkRBX0RFQlVHKDEsICIlcygpIDogZmluaXNoZWQgVHhcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X3JlY2VpdmUgKHNlbGYpCisgKgorICogICAgUmVjZWl2ZSBvbmUgZnJhbWUgZnJvbSB0aGUgaW5mcmFyZWQgcG9ydAorICoKKyAqIENhbGxlZCBvbmx5IGZyb20gaXJwb3J0X2ludGVycnVwdCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnBvcnRfcmVjZWl2ZShzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKSAKK3sKKwlpbnQgYm9ndXNjb3VudCA9IDA7CisJaW50IGlvYmFzZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qICAKKwkgKiBSZWNlaXZlIGFsbCBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8sIHVud3JhcCBhbmQgdW5zdHVmZiB0aGVtLiAKKyAgICAgICAgICogYXN5bmNfdW53cmFwX2NoYXIgd2lsbCBkZWxpdmVyIGFsbCBmb3VuZCBmcmFtZXMgIAorCSAqLworCWRvIHsKKwkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLCAKKwkJCQkgIGluYihpb2Jhc2UrVUFSVF9SWCkpOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBzdGF5IGhlcmUgdG9vIGxvbmcgKi8KKwkJaWYgKGJvZ3VzY291bnQrKyA+IDMyKSB7CisJCQlJUkRBX0RFQlVHKDIsIiVzKCksIGJyZWFraW5nIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9EUik7CQorfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgSW50ZXJydXB0IGhhbmRsZXIKKyAqLworc3RhdGljIGlycXJldHVybl90IGlycG9ydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykgCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZjsKKwlpbnQgYm9ndXNjb3VudCA9IDA7CisJaW50IGlvYmFzZTsKKwlpbnQgaWlyLCBsc3I7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKCFkZXYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpIGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIGRldi0+cHJpdjsKKworCXNwaW5fbG9jaygmc2VsZi0+bG9jayk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qIEN1dCduJ3Bhc3RlIGludGVycnVwdCByb3V0aW5lIGZyb20gc2VyaWFsLmMKKwkgKiBUaGlzIHZlcnNpb24gdHJ5IHRvIG1pbmltaXNlIGxhdGVuY3kgYW5kIEkvTyBvcGVyYXRpb25zLgorCSAqIFNpbXBsaWZpZWQgYW5kIG1vZGlmaWVkIHRvIGVuZm9yY2UgaGFsZiBkdXBsZXggb3BlcmF0aW9uLgorCSAqIC0gSmVhbiBJSSAqLworCisJLyogQ2hlY2sgc3RhdHVzIGV2ZW4gaXMgaWlyIHJlZyBpcyBjbGVhcmVkLCBtb3JlIHJvYnVzdCBhbmQKKwkgKiBlbGltaW5hdGUgYSByZWFkIG9uIHRoZSBJL08gYnVzIC0gSmVhbiBJSSAqLworCWRvIHsKKwkJLyogR2V0IGludGVycnVwdCBzdGF0dXMgOyBDbGVhciBpbnRlcnJ1cHQgKi8KKwkJbHNyID0gaW5iKGlvYmFzZStVQVJUX0xTUik7CisJCQorCQkvKiBBcmUgd2UgcmVjZWl2aW5nIG9yIHRyYW5zbWl0dGluZyA/ICovCisJCWlmKCFzZWxmLT50cmFuc21pdHRpbmcpIHsKKwkJCS8qIFJlY2VpdmVkIHNvbWV0aGluZyA/ICovCisJCQlpZiAobHNyICYgVUFSVF9MU1JfRFIpCisJCQkJaXJwb3J0X3JlY2VpdmUoc2VsZik7CisJCX0gZWxzZSB7CisJCQkvKiBSb29tIGluIFR4IGZpZm8gPyAqLworCQkJaWYgKGxzciAmIChVQVJUX0xTUl9USFJFIHwgVUFSVF9MU1JfVEVNVCkpCisJCQkJaXJwb3J0X3dyaXRlX3dha2V1cChzZWxmKTsKKwkJfQorCisJCS8qIEEgYml0IGhhY2tpc2gsIGJ1dCB3b3JraW5nIGFzIGV4cGVjdGVkLi4uIEplYW4gSUkgKi8KKwkJaWYobHNyICYgKFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9URU1UIHwgVUFSVF9MU1JfRFIpKQorCQkJaGFuZGxlZCA9IDE7CisKKwkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0byBsb25nICovCisJCWlmIChib2d1c2NvdW50KysgPiAxMCkgeworCQkJSVJEQV9XQVJOSU5HKCIlcygpIGlycSBoYW5kbGVyIGxvb3BpbmcgOiBsc3I9JTAyeFxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXywgbHNyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmVhZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyAJICAgICAgICBpaXIgPSBpbmIoaW9iYXNlK1VBUlRfSUlSKTsKKworCQkvKiBFbmFibGUgdGhpcyBkZWJ1ZyBvbmx5IHdoZW4gbm8gb3RoZXIgb3B0aW9ucyBhbmQgYXQgbG93CisJCSAqIGJpdCByYXRlcywgb3RoZXJ3aXNlIGl0IG1heSBjYXVzZSBSeCBvdmVycnVucyAobHNyPTYzKS4KKwkJICogLSBKZWFuIElJICovCisJCUlSREFfREVCVUcoNiwgIiVzKCksIGlpcj0lMDJ4LCBsc3I9JTAyeCwgaW9iYXNlPSUjeFxuIiwgCisJCQkgICAgX19GVU5DVElPTl9fLCBpaXIsIGxzciwgaW9iYXNlKTsKKworCQkvKiBBcyBsb25nIGFzIGludGVycnVwdCBwZW5kaW5nLi4uICovCisJfSB3aGlsZSAoKGlpciAmIFVBUlRfSUlSX05PX0lOVCkgPT0gMCk7CisKKwlzcGluX3VubG9jaygmc2VsZi0+bG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfbmV0X29wZW4gKGRldikKKyAqCisgKiAgICBOZXR3b3JrIGRldmljZSBpcyB0YWtlbiB1cC4gVXN1YWxseSB0aGlzIGlzIGRvbmUgYnkgImlmY29uZmlnIGlyZGEwIHVwIiAKKyAqICAgCisgKi8KK3N0YXRpYyBpbnQgaXJwb3J0X25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCWNoYXIgaHduYW1lWzE2XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlzZWxmID0gKHN0cnVjdCBpcnBvcnRfY2IgKikgZGV2LT5wcml2OworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCBzZWxmLT5pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgCisJCQkodm9pZCAqKSBkZXYpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuYWJsZSB0byBhbGxvY2F0ZSBpcnE9JWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJLyogSW5pdCB1YXJ0ICovCisJaXJwb3J0X3N0YXJ0KHNlbGYpOworCS8qIFNldCA5NjAwIGJhdWRzIHBlciBkZWZhdWx0LCBpbmNsdWRpbmcgYXQgdGhlIGRvbmdsZSAqLworCWlyZGFfdGFza19leGVjdXRlKHNlbGYsIF9faXJwb3J0X2NoYW5nZV9zcGVlZCwgCisJCQkgIGlycG9ydF9jaGFuZ2Vfc3BlZWRfY29tcGxldGUsIAorCQkJICBOVUxMLCAodm9pZCAqKSA5NjAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKworCS8qIEdpdmUgc2VsZiBhIGhhcmR3YXJlIG5hbWUgKi8KKwlzcHJpbnRmKGh3bmFtZSwgIlNJUiBAIDB4JTAzeCIsIHNlbGYtPmlvLnNpcl9iYXNlKTsKKworCS8qIAorCSAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQorCSAqIGluaXRpYWxpemVkIHByb3Blcmx5IAorCSAqLworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisKKwkvKiBSZWFkeSB0byBwbGF5ISAqLworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X25ldF9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBOZXR3b3JrIGRldmljZSBpcyB0YWtlbiBkb3duLiBVc3VhbGx5IHRoaXMgaXMgZG9uZSBieSAKKyAqICAgICJpZmNvbmZpZyBpcmRhMCBkb3duIiAKKyAqLworc3RhdGljIGludCBpcnBvcnRfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IGlycG9ydF9jYiAqKSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBTdG9wIGRldmljZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoc2VsZi0+aXJsYXApCisJCWlybGFwX2Nsb3NlKHNlbGYtPmlybGFwKTsKKwlzZWxmLT5pcmxhcCA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCWlycG9ydF9zdG9wKHNlbGYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X2lzX3JlY2VpdmluZyAoc2VsZikKKyAqCisgKiAgICBSZXR1cm5zIHRydWUgaXMgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgZGF0YQorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXJwb3J0X2lzX3JlY2VpdmluZyhzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKQoreworCXJldHVybiAoc2VsZi0+cnhfYnVmZi5zdGF0ZSAhPSBPVVRTSURFX0ZSQU1FKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9zZXRfZHRyX3J0cyAodHR5LCBkdHIsIHJ0cykKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IGRvbmdsZXMgZXRjLiB0byBzZXQgb3IgcmVzZXQgdGhlIHN0YXR1cworICogICAgb2YgdGhlIGR0ciBhbmQgcnRzIGxpbmVzCisgKi8KK3N0YXRpYyBpbnQgaXJwb3J0X3NldF9kdHJfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkdHIsIGludCBydHMpCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZiA9IGRldi0+cHJpdjsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJaWYgKGR0cikKKwkJZHRyID0gVUFSVF9NQ1JfRFRSOworCWlmIChydHMpCisJCXJ0cyA9IFVBUlRfTUNSX1JUUzsKKworCW91dGIoZHRyfHJ0c3xVQVJUX01DUl9PVVQyLCBpb2Jhc2UrVUFSVF9NQ1IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXJwb3J0X3Jhd193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3U4ICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIGRldi0+cHJpdjsKKwlpbnQgYWN0dWFsID0gMDsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogVHggRklGTyBzaG91bGQgYmUgZW1wdHkhICovCisJaWYgKCEoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSkgeworCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgZmFpbGVkLCBmaWZvIG5vdCBlbXB0eSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisgICAgICAgIAorCS8qIEZpbGwgRklGTyB3aXRoIGN1cnJlbnQgZnJhbWUgKi8KKwl3aGlsZSAoYWN0dWFsIDwgbGVuKSB7CisJCS8qIFRyYW5zbWl0IG5leHQgYnl0ZSAqLworCQlvdXRiKGJ1ZlthY3R1YWxdLCBpb2Jhc2UrVUFSVF9UWCk7CisJCWFjdHVhbCsrOworCX0KKworCXJldHVybiBhY3R1YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfbmV0X2lvY3RsIChkZXYsIHJxLCBjbWQpCisgKgorICogICAgUHJvY2VzcyBJT0NUTCBjb21tYW5kcyBmb3IgdGhpcyBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJwb3J0X25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCWRvbmdsZV90ICpkb25nbGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYgPSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBjbWQpOworCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0JBTkRXSURUSDogLyogU2V0IGJhbmR3aWR0aCAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXQgPSAtRVBFUk07CisgICAgICAgICAgICAgICAgZWxzZQorCQkJaXJkYV90YXNrX2V4ZWN1dGUoc2VsZiwgX19pcnBvcnRfY2hhbmdlX3NwZWVkLCBOVUxMLCAKKwkJCQkJICBOVUxMLCAodm9pZCAqKSBpcnEtPmlmcl9iYXVkcmF0ZSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NET05HTEU6IC8qIFNldCBkb25nbGUgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCS8qIExvY2tpbmcgOgorCQkgKiBpcmRhX2RldmljZV9kb25nbGVfaW5pdCgpIGNhbid0IGJlIGxvY2tlZC4KKwkJICogaXJkYV90YXNrX2V4ZWN1dGUoKSBkb2Vzbid0IG5lZWQgdG8gYmUgbG9ja2VkLgorCQkgKiBKZWFuIElJCisJCSAqLworCisJCS8qIEluaXRpYWxpemUgZG9uZ2xlICovCisJCWRvbmdsZSA9IGlyZGFfZGV2aWNlX2RvbmdsZV9pbml0KGRldiwgaXJxLT5pZnJfZG9uZ2xlKTsKKwkJaWYgKCFkb25nbGUpCisJCQlicmVhazsKKwkJCisJCWRvbmdsZS0+c2V0X21vZGUgICAgPSBOVUxMOworCQlkb25nbGUtPnJlYWQgICAgICAgID0gTlVMTDsKKwkJZG9uZ2xlLT53cml0ZSAgICAgICA9IGlycG9ydF9yYXdfd3JpdGU7CisJCWRvbmdsZS0+c2V0X2R0cl9ydHMgPSBpcnBvcnRfc2V0X2R0cl9ydHM7CisJCQorCQkvKiBOb3cgaW5pdGlhbGl6ZSB0aGUgZG9uZ2xlISAgKi8KKwkJZG9uZ2xlLT5pc3N1ZS0+b3Blbihkb25nbGUsICZzZWxmLT5xb3MpOworCQkKKwkJLyogUmVzZXQgZG9uZ2xlICovCisJCWlyZGFfdGFza19leGVjdXRlKGRvbmdsZSwgZG9uZ2xlLT5pc3N1ZS0+cmVzZXQsIE5VTEwsIE5VTEwsIAorCQkJCSAgTlVMTCk7CQorCisJCS8qIE1ha2UgZG9uZ2xlIGF2YWlsYWJsZSB0byBkcml2ZXIgb25seSBub3cgdG8gYXZvaWQKKwkJICogcmFjZSBjb25kaXRpb25zIC0gSmVhbiBJSSAqLworCQlzZWxmLT5kb25nbGUgPSBkb25nbGU7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNRURJQUJVU1k6IC8qIFNldCBtZWRpYSBidXN5ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNlIFNJT0NHUkVDRUlWSU5HOiAvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSBpcnBvcnRfaXNfcmVjZWl2aW5nKHNlbGYpOworCQlicmVhazsKKwljYXNlIFNJT0NTRFRSUlRTOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTm8gcmVhbCBuZWVkIHRvIGxvY2suLi4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJaXJwb3J0X3NldF9kdHJfcnRzKGRldiwgaXJxLT5pZnJfZHRyLCBpcnEtPmlmcl9ydHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlycG9ydF9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIGRldi0+cHJpdjsKKwkKKwlyZXR1cm4gJnNlbGYtPnN0YXRzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpcnBvcnRfaW5pdCh2b2lkKQoreworIAlpbnQgaTsKKworIAlmb3IgKGk9MDsgKGlvW2ldIDwgMjAwMCkgJiYgKGkgPCA0KTsgaSsrKSB7CisgCQlpZiAoaXJwb3J0X29wZW4oaSwgaW9baV0sIGlycVtpXSkgIT0gTlVMTCkKKyAJCQlyZXR1cm4gMDsKKyAJfQorCS8qIAorCSAqIE1heWJlIHNvbWV0aGluZyBmYWlsZWQsIGJ1dCB3ZSBjYW4gc3RpbGwgYmUgdXNhYmxlIGZvciBGSVIgZHJpdmVycyAKKwkgKi8KKyAJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfY2xlYW51cCAoKQorICoKKyAqICAgIENsb3NlIGFsbCBjb25maWd1cmVkIHBvcnRzCisgKgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgaXJwb3J0X2NsZWFudXAodm9pZCkKK3sKKyAJaW50IGk7CisKKyAgICAgICAgSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlmb3IgKGk9MDsgaSA8IDQ7IGkrKykgeworIAkJaWYgKGRldl9zZWxmW2ldKQorIAkJCWlycG9ydF9jbG9zZShkZXZfc2VsZltpXSk7CisgCX0KK30KKworTU9EVUxFX1BBUk0oaW8sICIxLTRpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiQmFzZSBJL08gYWRkcmVzc2VzIik7CitNT0RVTEVfUEFSTShpcnEsICIxLTRpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBsaW5lcyIpOworCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhbGYgZHVwbGV4IHNlcmlhbCBkcml2ZXIgZm9yIElyREEgU0lSIG1vZGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaXJwb3J0X2luaXQpOworbW9kdWxlX2V4aXQoaXJwb3J0X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5oIGIvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzg5YzhjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuaApAQCAtMCwwICsxLDgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlycG9ydC5oCisgKiBWZXJzaW9uOiAgICAgICAwLjEKKyAqIERlc2NyaXB0aW9uOiAgIFNlcmlhbCBkcml2ZXIgZm9yIElyREEKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgIDMgMTM6NDk6NTkgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgRnJpIEphbiAxNCAxMDoyMToxMCAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgtMjAwMCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJUlBPUlRfSAorI2RlZmluZSBJUlBPUlRfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2RlZmluZSBTUEVFRF9ERUZBVUxUIDk2MDAKKyNkZWZpbmUgU1BFRURfTUFYICAgICAxMTUyMDAKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgc3VwcG9ydGVkIHNlcmlhbCB0eXBlcy4KKyAqLworI2RlZmluZSBQT1JUX1VOS05PV04gICAgMAorI2RlZmluZSBQT1JUXzgyNTAgICAgICAgMQorI2RlZmluZSBQT1JUXzE2NDUwICAgICAgMgorI2RlZmluZSBQT1JUXzE2NTUwICAgICAgMworI2RlZmluZSBQT1JUXzE2NTUwQSAgICAgNAorI2RlZmluZSBQT1JUX0NJUlJVUyAgICAgNQorI2RlZmluZSBQT1JUXzE2NjUwICAgICAgNgorI2RlZmluZSBQT1JUX01BWCAgICAgICAgNiAgCisKKyNkZWZpbmUgRlJBTUVfTUFYX1NJWkUgMjA0OAorCitzdHJ1Y3QgaXJwb3J0X2NiIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwlzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwOyAgICAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYXR0YWNoZWQgdG8gKi8KKworCWNoaXBpb190IGlvOyAgICAgICAgICAgICAgIC8qIElyREEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworCWlvYnVmZl90IHR4X2J1ZmY7ICAgICAgICAgIC8qIFRyYW5zbWl0IGJ1ZmZlciAqLworCWlvYnVmZl90IHJ4X2J1ZmY7ICAgICAgICAgIC8qIFJlY2VpdmUgYnVmZmVyICovCisKKwlzdHJ1Y3QgcW9zX2luZm8gcW9zOyAgICAgICAvKiBRb1MgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGRldmljZSAqLworCWRvbmdsZV90ICpkb25nbGU7ICAgICAgICAgIC8qIERvbmdsZSBkcml2ZXIgKi8KKworIAlfX3UzMiBmbGFnczsgICAgICAgICAgICAgICAvKiBJbnRlcmZhY2UgZmxhZ3MgKi8KKwlfX3UzMiBuZXdfc3BlZWQ7CisJaW50IG1vZGU7CisJaW50IGluZGV4OyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaW5kZXggKi8KKwlpbnQgdHJhbnNtaXR0aW5nOwkgICAvKiBBcmUgd2UgdHJhbnNtaXR0aW5nID8gKi8KKworCXNwaW5sb2NrX3QgbG9jazsgICAgICAgICAgIC8qIEZvciBzZXJpYWxpemluZyBvcGVyYXRpb25zICovCisKKwkvKiBGb3IgcGlnZ3liYWNrIGRyaXZlcnMgKi8KKwl2b2lkICpwcml2OyAgICAgICAgICAgICAgICAKKwl2b2lkICgqY2hhbmdlX3NwZWVkKSh2b2lkICpwcml2LCBfX3UzMiBzcGVlZCk7CisJaW50ICgqaW50ZXJydXB0KShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK307CisKKyNlbmRpZiAvKiBJUlBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyM2FhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMKQEAgLTAsMCArMSw2NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJ0dHktc2lyLmMKKyAqIFZlcnNpb246ICAgICAgIDIuMAorICogRGVzY3JpcHRpb246ICAgSXJEQSBsaW5lIGRpc2NpcGxpbmUgaW1wbGVtZW50YXRpb24KKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBEZWMgIDkgMjE6MTg6MzggMTk5NworICogTW9kaWZpZWQgYXQ6ICAgU3VuIE9jdCAyNyAyMjoxMzozMCAyMDAyCisgKiBNb2RpZmllZCBieTogICBNYXJ0aW4gRGllaGwgPG1hZEBtZGllaGwuZGU+CisgKiBTb3VyY2VzOiAgICAgICBzbGlwLmMgYnkgTGF1cmVuY2UgQ3VsaGFuZSwgICA8bG96QGhvbG1lcy5kZW1vbi5jby51az4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpLAorICogICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwsCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorI2luY2x1ZGUgImlydHR5LXNpci5oIgorCitzdGF0aWMgaW50IHFvc19tdHRfYml0cyA9IDB4MDM7ICAgICAgLyogNSBtcyBvciBtb3JlICovCisKK21vZHVsZV9wYXJhbShxb3NfbXR0X2JpdHMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHFvc19tdHRfYml0cywgIk1pbmltdW0gVHVybiBUaW1lIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogZGV2aWNlIGNvbmZpZ3VyYXRpb24gY2FsbGJhY2tzIGFsd2F5cyBpbnZva2VkIHdpdGggaXJkYS10aHJlYWQgY29udGV4dCAqLworCisvKiBmaW5kIG91dCwgaG93IG1hbnkgY2hhcnMgd2UgaGF2ZSBpbiBidWZmZXJzIGJlbG93IHVzCisgKiB0aGlzIGlzIGFsbG93ZWQgdG8gbGllLCBpLmUuIHJldHVybiBsZXNzIGNoYXJzIHRoYW4gd2UKKyAqIGFjdHVhbGx5IGhhdmUuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB1c2VkIHRvIGRldGVybWluZQorICogaG93IGxvbmcgdGhlIGlyZGF0aHJlYWQgc2hvdWxkIHdhaXQgYmVmb3JlIGRvaW5nIHRoZQorICogcmVhbCBibG9ja2luZyB3YWl0X3VudGlsX3NlbnQoKQorICovCisKK3N0YXRpYyBpbnQgaXJ0dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IGRldi0+cHJpdjsKKworCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQocHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJcmV0dXJuIHByaXYtPnR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIocHJpdi0+dHR5KTsKK30KKworLyogV2FpdCAoc2xlZXApIHVudGlsIHVuZGVybGF5aW5nIGhhcmR3YXJlIGZpbmlzaGVkIHRyYW5zbWlzc2lvbgorICogaS5lLiBoYXJkd2FyZSBidWZmZXJzIGFyZSBkcmFpbmVkCisgKiB0aGlzIG11c3QgYmxvY2sgYW5kIG5vdCByZXR1cm4gYmVmb3JlIGFsbCBjaGFyYWN0ZXJzIGFyZSByZWFsbHkgc2VudAorICoKKyAqIElmIHRoZSB0dHkgc2l0cyBvbiB0b3Agb2YgYSAxNjU1MEEtbGlrZSB1YXJ0LCB0aGVyZSBhcmUgdHlwaWNhbGx5CisgKiB1cCB0byAxNiBieXRlcyBpbiB0aGUgZmlmbyAtIGYuZS4gOTYwMCBicHMgOE4xIG5lZWRzIDE2LjcgbXNlYworICoKKyAqIFdpdGggdXNic2VyaWFsIHRoZSB1YXJ0LWZpZm8gaXMgYmFzaWNhbGx5IHJlcGxhY2VkIGJ5IHRoZSBjb252ZXJ0ZXIncworICogb3V0Z29pbmcgZW5kcG9pbnQgYnVmZmVyLCB3aGljaCBjYW4gdXN1YWxseSBob2xkIDY0IGJ5dGVzIChhdCBsZWFzdCkuCisgKiBXaXRoIHBsMjMwMyBpdCBhcHBlYXJzIHdlIGFyZSBzYWZlIHdpdGggNjBtc2VjIGhlcmUuCisgKgorICogSSByZWFsbHkgd2lzaCBhbGwgc2VyaWFsIGRyaXZlcnMgd291bGQgcHJvdmlkZQorICogY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB3YWl0X3VudGlsX3NlbnQoKQorICovCisKKyNkZWZpbmUgVVNCU0VSSUFMX1RYX0RPTkVfREVMQVkJNjAKKworc3RhdGljIHZvaWQgaXJ0dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuOyk7CisKKwl0dHkgPSBwcml2LT50dHk7CisJaWYgKHR0eS0+ZHJpdmVyLT53YWl0X3VudGlsX3NlbnQpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJdHR5LT5kcml2ZXItPndhaXRfdW50aWxfc2VudCh0dHksIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisJZWxzZSB7CisJCW1zbGVlcChVU0JTRVJJQUxfVFhfRE9ORV9ERUxBWSk7CisJfQorfQorCisvKiAKKyAqICBGdW5jdGlvbiBpcnR0eV9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgQ2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQuCisgKgorICogVGhpcyBtYXkgc2xlZXAgaW4gc2V0X3Rlcm1pb3MgKHVzYnNlcmlhbCBkcml2ZXIgZi5lLikgYW5kIG11c3QKKyAqIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQvdGltZXIvdGFza2xldCB0aGVyZWZvcmUuCisgKiBBbGwgc3VjaCBpbnZvY2F0aW9ucyBhcmUgZGVmZXJyZWQgdG8ga0lyREFkIG5vdyBzbyB3ZSBjYW4gc2xlZXAgdGhlcmUuCisgKi8KKworc3RhdGljIGludCBpcnR0eV9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworICAgICAgICBzdHJ1Y3QgdGVybWlvcyBvbGRfdGVybWlvczsKKwlpbnQgY2ZsYWc7CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXR0eSA9IHByaXYtPnR0eTsKKworCWxvY2tfa2VybmVsKCk7CisJb2xkX3Rlcm1pb3MgPSAqKHR0eS0+dGVybWlvcyk7CisJY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwljZmxhZyAmPSB+Q0JBVUQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBTZXR0aW5nIHNwZWVkIHRvICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNwZWVkKTsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIDEyMDA6CisJCWNmbGFnIHw9IEIxMjAwOworCQlicmVhazsKKwljYXNlIDI0MDA6CisJCWNmbGFnIHw9IEIyNDAwOworCQlicmVhazsKKwljYXNlIDQ4MDA6CisJCWNmbGFnIHw9IEI0ODAwOworCQlicmVhazsKKwljYXNlIDE5MjAwOgorCQljZmxhZyB8PSBCMTkyMDA7CisJCWJyZWFrOworCWNhc2UgMzg0MDA6CisJCWNmbGFnIHw9IEIzODQwMDsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJY2ZsYWcgfD0gQjU3NjAwOworCQlicmVhazsKKwljYXNlIDExNTIwMDoKKwkJY2ZsYWcgfD0gQjExNTIwMDsKKwkJYnJlYWs7CisJY2FzZSA5NjAwOgorCWRlZmF1bHQ6CisJCWNmbGFnIHw9IEI5NjAwOworCQlicmVhazsKKwl9CQorCisJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gY2ZsYWc7CisJaWYgKHR0eS0+ZHJpdmVyLT5zZXRfdGVybWlvcykKKwkJdHR5LT5kcml2ZXItPnNldF90ZXJtaW9zKHR0eSwgJm9sZF90ZXJtaW9zKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlwcml2LT5pby5zcGVlZCA9IHNwZWVkOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0eV9zZXRfZHRyX3J0cyAoZGV2LCBkdHIsIHJ0cykKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IGRvbmdsZXMgZXRjLiB0byBzZXQgb3IgcmVzZXQgdGhlIHN0YXR1cworICogICAgb2YgdGhlIGR0ciBhbmQgcnRzIGxpbmVzCisgKi8KKworc3RhdGljIGludCBpcnR0eV9zZXRfZHRyX3J0cyhzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgZHRyLCBpbnQgcnRzKQoreworCXN0cnVjdCBzaXJ0dHlfY2IgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IHNldCA9IDA7CisJaW50IGNsZWFyID0gMDsKKworCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQocHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJaWYgKHJ0cykKKwkJc2V0IHw9IFRJT0NNX1JUUzsKKwllbHNlCisJCWNsZWFyIHw9IFRJT0NNX1JUUzsKKwlpZiAoZHRyKQorCQlzZXQgfD0gVElPQ01fRFRSOworCWVsc2UKKwkJY2xlYXIgfD0gVElPQ01fRFRSOworCisJLyoKKwkgKiBXZSBjYW4ndCB1c2UgaW9jdGwoKSBiZWNhdXNlIGl0IGV4cGVjdHMgYSBub24tbnVsbCBmaWxlIHN0cnVjdHVyZSwKKwkgKiBhbmQgd2UgZG9uJ3QgaGF2ZSB0aGF0IGhlcmUuCisJICogVGhpcyBmdW5jdGlvbiBpcyBub3QgeWV0IGRlZmluZWQgZm9yIGFsbCB0dHkgZHJpdmVyLCBzbworCSAqIGxldCdzIGJlIGNhcmVmdWwuLi4gSmVhbiBJSQorCSAqLworCUlSREFfQVNTRVJUKHByaXYtPnR0eS0+ZHJpdmVyLT50aW9jbXNldCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlwcml2LT50dHktPmRyaXZlci0+dGlvY21zZXQocHJpdi0+dHR5LCBOVUxMLCBzZXQsIGNsZWFyKTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGNhbGxlZCBmcm9tIHNpcl9kZXYgd2hlbiB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gc2VuZAorICogY29udGV4dCBpcyBlaXRoZXIgbmV0ZGV2LT5oYXJkX3htaXQgb3Igc29tZSB0cmFuc21pdC1jb21wbGV0aW9uIGJoCisgKiBpLmUuIHdlIGFyZSB1bmRlciBzcGlubG9jayBoZXJlIGFuZCBtdXN0IG5vdCBzbGVlcC4KKyAqLworCitzdGF0aWMgaW50IGlydHR5X2RvX3dyaXRlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IHdyaXRlbGVuOworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwl0dHkgPSBwcml2LT50dHk7CisJaWYgKCF0dHktPmRyaXZlci0+d3JpdGUpCisJCXJldHVybiAwOworCXR0eS0+ZmxhZ3MgfD0gKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJaWYgKHR0eS0+ZHJpdmVyLT53cml0ZV9yb29tKSB7CisJCXdyaXRlbGVuID0gdHR5LT5kcml2ZXItPndyaXRlX3Jvb20odHR5KTsKKwkJaWYgKHdyaXRlbGVuID4gbGVuKQorCQkJd3JpdGVsZW4gPSBsZW47CisJfQorCWVsc2UKKwkJd3JpdGVsZW4gPSBsZW47CisJcmV0dXJuIHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHB0ciwgd3JpdGVsZW4pOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGlyZGEgbGluZSBkaXNjaXBsaW5lIGNhbGxiYWNrcyAqLworCisvKiAKKyAqICBGdW5jdGlvbiBpcnR0eV9yZWNlaXZlX2J1ZiggdHR5LCBjcCwgY291bnQpCisgKgorICogICAgSGFuZGxlIHRoZSAncmVjZWl2ZXIgZGF0YSByZWFkeScgaW50ZXJydXB0LiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqICAgIGJ5IHRoZSAndHR5X2lvJyBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuIGEgYmxvY2sgb2YgSXJEQSBkYXRhIGhhcworICogICAgYmVlbiByZWNlaXZlZCwgd2hpY2ggY2FuIG5vdyBiZSBkZWNhcHN1bGF0ZWQgYW5kIGRlbGl2ZXJlZCBmb3IKKyAqICAgIGZ1cnRoZXIgcHJvY2Vzc2luZyAKKyAqCisgKiBjYWxsaW5nIGNvbnRleHQgZGVwZW5kcyBvbiB1bmRlcmx5aW5nIGRyaXZlciBhbmQgdHR5LT5sb3dfbGF0ZW5jeSEKKyAqIGZvciBleGFtcGxlIChsb3dfbGF0ZW5jeTogMSAvIDApOgorICogc2VyaWFsLmM6CXVhcnQtaW50ZXJydXB0IC8gc29mdGludAorICogdXNic2VyaWFsOgl1cmItY29tcGxldGUtaW50ZXJydXB0IC8gc29mdGludAorICovCisKK3N0YXRpYyB2b2lkIGlydHR5X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLAorCQkJICAgICAgY2hhciAqZnAsIGludCBjb3VudCkgCit7CisJc3RydWN0IHNpcl9kZXYgKmRldjsKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gdHR5LT5kaXNjX2RhdGE7CisJaW50CWk7CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm47KTsKKworCWlmICh1bmxpa2VseShjb3VudD09MCkpCQkvKiB5ZXMsIHRoaXMgaGFwcGVucyAqLworCQlyZXR1cm47CisKKwlkZXYgPSBwcml2LT5kZXY7CisJaWYgKCFkZXYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBub3QgcmVhZHkgeWV0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCS8qIAorCQkgKiAgQ2hhcmFjdGVycyByZWNlaXZlZCB3aXRoIGEgcGFyaXR5IGVycm9yLCBldGM/CisJCSAqLworIAkJaWYgKGZwICYmICpmcCsrKSB7IAorCQkJSVJEQV9ERUJVRygwLCAiRnJhbWluZyBvciBwYXJpdHkgZXJyb3IhXG4iKTsKKwkJCXNpcmRldl9yZWNlaXZlKGRldiwgTlVMTCwgMCk7CS8qIG5vdGlmeSBzaXJfZGV2ICh1cGRhdGluZyBzdGF0cykgKi8KKwkJCXJldHVybjsKKyAJCX0KKwl9CisKKwlzaXJkZXZfcmVjZWl2ZShkZXYsIGNwLCBjb3VudCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0eV9yZWNlaXZlX3Jvb20gKHR0eSkKKyAqCisgKiAgICBVc2VkIGJ5IHRoZSBUVFkgdG8gZmluZCBvdXQgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmVjZWl2ZSBhdCBhIHRpbWUKKyAqIAorKi8KK3N0YXRpYyBpbnQgaXJ0dHlfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCXN0cnVjdCBzaXJ0dHlfY2IgKnByaXYgPSB0dHktPmRpc2NfZGF0YTsKKworCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuIDA7KTsKKworCXJldHVybiA2NTUzNjsgIC8qIFdlIGNhbiBoYW5kbGUgYW4gaW5maW5pdGUgYW1vdW50IG9mIGRhdGEuIDotKSAqLworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHlfd3JpdGVfd2FrZXVwICh0dHkpCisgKgorICogICAgQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqICAgIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlydHR5X3dyaXRlX3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gdHR5LT5kaXNjX2RhdGE7CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm47KTsKKworCXR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCisJaWYgKHByaXYtPmRldikKKwkJc2lyZGV2X3dyaXRlX2NvbXBsZXRlKHByaXYtPmRldik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlydHR5X3N0b3BfcmVjZWl2ZXIgKHR0eSwgc3RvcCkKKyAqCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGlydHR5X3N0b3BfcmVjZWl2ZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHN0b3ApCit7CisJc3RydWN0IHRlcm1pb3Mgb2xkX3Rlcm1pb3M7CisJaW50IGNmbGFnOworCisJbG9ja19rZXJuZWwoKTsKKwlvbGRfdGVybWlvcyA9ICoodHR5LT50ZXJtaW9zKTsKKwljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwkKKwlpZiAoc3RvcCkKKwkJY2ZsYWcgJj0gfkNSRUFEOworCWVsc2UKKwkJY2ZsYWcgfD0gQ1JFQUQ7CisKKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBjZmxhZzsKKwlpZiAodHR5LT5kcml2ZXItPnNldF90ZXJtaW9zKQorCQl0dHktPmRyaXZlci0+c2V0X3Rlcm1pb3ModHR5LCAmb2xkX3Rlcm1pb3MpOworCXVubG9ja19rZXJuZWwoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzZXJpYWxpemUgbGRpc2Mgb3Blbi9jbG9zZSB3aXRoIHNpcl9kZXYgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGlydHR5X3NlbSk7CisKKy8qIG5vdGlmaWVyIGZyb20gc2lyX2RldiB3aGVuIGlyZGElIGRldmljZSBnZXRzIG9wZW5lZCAoaWZ1cCkgKi8KKworc3RhdGljIGludCBpcnR0eV9zdGFydF9kZXYoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwkvKiBzZXJpYWxpemUgd2l0aCBsZGlzYyBvcGVuL2Nsb3NlICovCisJZG93bigmaXJ0dHlfc2VtKTsKKworCXByaXYgPSBkZXYtPnByaXY7CisJaWYgKHVubGlrZWx5KCFwcml2IHx8IHByaXYtPm1hZ2ljIT1JUlRUWV9NQUdJQykpIHsKKwkJdXAoJmlydHR5X3NlbSk7CisJCXJldHVybiAtRVNUQUxFOworCX0KKworCXR0eSA9IHByaXYtPnR0eTsKKworCWlmICh0dHktPmRyaXZlci0+c3RhcnQpCisJCXR0eS0+ZHJpdmVyLT5zdGFydCh0dHkpOworCS8qIE1ha2Ugc3VyZSB3ZSBjYW4gcmVjZWl2ZSBtb3JlIGRhdGEgKi8KKwlpcnR0eV9zdG9wX3JlY2VpdmVyKHR0eSwgRkFMU0UpOworCisJdXAoJmlydHR5X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIG5vdGlmaWVyIGZyb20gc2lyX2RldiB3aGVuIGlyZGElIGRldmljZSBnZXRzIGNsb3NlZCAoaWZkb3duKSAqLworCitzdGF0aWMgaW50IGlydHR5X3N0b3BfZGV2KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJLyogc2VyaWFsaXplIHdpdGggbGRpc2Mgb3Blbi9jbG9zZSAqLworCWRvd24oJmlydHR5X3NlbSk7CisKKwlwcml2ID0gZGV2LT5wcml2OworCWlmICh1bmxpa2VseSghcHJpdiB8fCBwcml2LT5tYWdpYyE9SVJUVFlfTUFHSUMpKSB7CisJCXVwKCZpcnR0eV9zZW0pOworCQlyZXR1cm4gLUVTVEFMRTsKKwl9CisKKwl0dHkgPSBwcml2LT50dHk7CisKKwkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVjZWl2ZSBtb3JlIGRhdGEgKi8KKwlpcnR0eV9zdG9wX3JlY2VpdmVyKHR0eSwgVFJVRSk7CisJaWYgKHR0eS0+ZHJpdmVyLT5zdG9wKQorCQl0dHktPmRyaXZlci0+c3RvcCh0dHkpOworCisJdXAoJmlydHR5X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHNpcl9kcml2ZXIgc2lyX3R0eV9kcnYgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJCT0gInNpcl90dHkiLAorCS5zdGFydF9kZXYJCT0gaXJ0dHlfc3RhcnRfZGV2LAorCS5zdG9wX2RldgkJPSBpcnR0eV9zdG9wX2RldiwKKwkuZG9fd3JpdGUJCT0gaXJ0dHlfZG9fd3JpdGUsCisJLmNoYXJzX2luX2J1ZmZlcgk9IGlydHR5X2NoYXJzX2luX2J1ZmZlciwKKwkud2FpdF91bnRpbF9zZW50CT0gaXJ0dHlfd2FpdF91bnRpbF9zZW50LAorCS5zZXRfc3BlZWQJCT0gaXJ0dHlfY2hhbmdlX3NwZWVkLAorCS5zZXRfZHRyX3J0cwkJPSBpcnR0eV9zZXRfZHRyX3J0cywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlydHR5X2lvY3RsICh0dHksIGZpbGUsIGNtZCwgYXJnKQorICoKKyAqICAgICBUaGUgU3dpc3MgYXJteSBrbmlmZSBvZiBzeXN0ZW0gY2FsbHMgOi0pCisgKgorICovCitzdGF0aWMgaW50IGlydHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXJ0dHlfaW5mbyB7IGNoYXIgbmFtZVs2XTsgfSBpbmZvOworCXN0cnVjdCBzaXJfZGV2ICpkZXY7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IHR0eS0+ZGlzY19kYXRhOworCWludCBlcnIgPSAwOworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm4gLUVOT0RFVjspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm4gLUVCQURSOyk7CisKKwlJUkRBX0RFQlVHKDMsICIlcyhjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgY21kKTsKKworCWRldiA9IHByaXYtPmRldjsKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVENHRVRTOgorCWNhc2UgVENHRVRBOgorCQllcnIgPSBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIElSVFRZX0lPQ1RET05HTEU6CisJCS8qIHRoaXMgY2FsbCBibG9ja3MgZm9yIGNvbXBsZXRpb24gKi8KKwkJZXJyID0gc2lyZGV2X3NldF9kb25nbGUoZGV2LCAoSVJEQV9ET05HTEUpIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBJUlRUWV9JT0NHRVQ6CisJCUlSREFfQVNTRVJUKGRldi0+bmV0ZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsgCisJCXN0cm5jcHkoaW5mby5uYW1lLCBkZXYtPm5ldGRldi0+bmFtZSwgc2l6ZW9mKGluZm8ubmFtZSktMSk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKworCisvKiAKKyAqICBGdW5jdGlvbiBpcnR0eV9vcGVuKHR0eSkKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgVFRZIG1vZHVsZSB3aGVuIHRoZSBJckRBIGxpbmUKKyAqICAgIGRpc2NpcGxpbmUgaXMgY2FsbGVkIGZvci4gIEJlY2F1c2Ugd2UgYXJlIHN1cmUgdGhlIHR0eSBsaW5lIGV4aXN0cywKKyAqICAgIHdlIG9ubHkgaGF2ZSB0byBsaW5rIGl0IHRvIGEgZnJlZSBJckRBIGNoYW5uZWwuICAKKyAqLworc3RhdGljIGludCBpcnR0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCXN0cnVjdCBzaXJfZGV2ICpkZXY7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCS8qIE1vZHVsZSBzdHVmZiBoYW5kbGVkIHZpYSBpcmRhX2xkaXNjLm93bmVyIC0gSmVhbiBJSSAqLworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIG5vdCBhbHJlYWR5IGNvbm5lY3RlZC4gKi8KKwlpZiAodHR5LT5kaXNjX2RhdGEgIT0gTlVMTCkgeworCQlwcml2ID0gdHR5LT5kaXNjX2RhdGE7CisJCWlmIChwcml2ICYmIHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDKSB7CisJCQlyZXQgPSAtRUVYSVNUOworCQkJZ290byBvdXQ7CisJCX0KKwkJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOwkJLyogIyMjICovCisJfQorCisJLyogc3RvcCB0aGUgdW5kZXJseWluZyAgZHJpdmVyICovCisJaXJ0dHlfc3RvcF9yZWNlaXZlcih0dHksIFRSVUUpOworCWlmICh0dHktPmRyaXZlci0+c3RvcCkKKwkJdHR5LT5kcml2ZXItPnN0b3AodHR5KTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCisJLyogYXBwbHkgbXR0IG92ZXJyaWRlICovCisJc2lyX3R0eV9kcnYucW9zX210dF9iaXRzID0gcW9zX210dF9iaXRzOworCisJLyogZ2V0IGEgc2lyIGRldmljZSBpbnN0YW5jZSBmb3IgdGhpcyBkcml2ZXIgKi8KKwlkZXYgPSBzaXJkZXZfZ2V0X2luc3RhbmNlKCZzaXJfdHR5X2RydiwgdHR5LT5uYW1lKTsKKwlpZiAoIWRldikgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBwcml2YXRlIGRldmljZSBpbmZvIGJsb2NrICovCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlnb3RvIG91dF9wdXQ7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCisJcHJpdi0+bWFnaWMgPSBJUlRUWV9NQUdJQzsKKwlwcml2LT50dHkgPSB0dHk7CisJcHJpdi0+ZGV2ID0gZGV2OworCisJLyogc2VyaWFsaXplIHdpdGggc3RhcnRfZGV2IC0gaW4gY2FzZSB3ZSB3ZXJlIHJhY2luZyB3aXRoIGlmdXAgKi8KKwlkb3duKCZpcnR0eV9zZW0pOworCisJZGV2LT5wcml2ID0gcHJpdjsKKwl0dHktPmRpc2NfZGF0YSA9IHByaXY7CisKKwl1cCgmaXJ0dHlfc2VtKTsKKworCUlSREFfREVCVUcoMCwgIiVzIC0gJXM6IGlyZGEgbGluZSBkaXNjaXBsaW5lIG9wZW5lZFxuIiwgX19GVU5DVElPTl9fLCB0dHktPm5hbWUpOworCisJcmV0dXJuIDA7CisKK291dF9wdXQ6CisJc2lyZGV2X3B1dF9pbnN0YW5jZShkZXYpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIAorICogIEZ1bmN0aW9uIGlydHR5X2Nsb3NlICh0dHkpCisgKgorICogICAgQ2xvc2UgZG93biBhIElyREEgY2hhbm5lbC4gVGhpcyBtZWFucyBmbHVzaGluZyBvdXQgYW55IHBlbmRpbmcgcXVldWVzLAorICogICAgYW5kIHRoZW4gcmVzdG9yaW5nIHRoZSBUVFkgbGluZSBkaXNjaXBsaW5lIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSBpdCBnb3QKKyAqICAgIGhvb2tlZCB0byBJckRBICh3aGljaCB1c3VhbGx5IGlzIFRUWSBhZ2FpbikuICAKKyAqLworc3RhdGljIHZvaWQgaXJ0dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IHR0eS0+ZGlzY19kYXRhOworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBIbSwgd2l0aCBhIGRvbmdsZSBhdHRhY2hlZCB0aGUgZG9uZ2xlIGRyaXZlciB3YW50cworCSAqIHRvIGNsb3NlIHRoZSBkb25nbGUgLSB3aGljaCByZXF1aXJlcyB0aGUgdXNlIG9mCisJICogc29tZSB0dHkgd3JpdGUgYW5kL29yIHRlcm1pb3Mgb3IgaW9jdGwgb3BlcmF0aW9ucy4KKwkgKiBBcmUgd2UgYWxsb3dlZCB0byBjYWxsIHRob3NlIHdoZW4gYWxyZWFkeSByZXF1ZXN0ZWQKKwkgKiB0byBzaHV0ZG93biB0aGUgbGRpc2M/CisJICogSWYgbm90LCB3ZSBzaG91bGQgc29tZWhvdyBtYXJrIHRoZSBkZXYgYmVpbmcgc3RhbGVkLgorCSAqIFF1ZXN0aW9uIHJlbWFpbnMsIGhvdyB0byBjbG9zZSB0aGUgZG9uZ2xlIGluIHRoaXMgY2FzZS4uLgorCSAqIEZvciBub3cgbGV0J3MgYXNzdW1lIHdlIGFyZSBncmFudGVkIHRvIGlzc3VlIHR0eSBkcml2ZXIgY2FsbHMKKwkgKiB1bnRpbCB3ZSByZXR1cm4gaGVyZSBmcm9tIHRoZSBsZGlzYyBjbG9zZS4gSSdtIGp1c3Qgd29uZGVyaW5nCisJICogaG93IHRoaXMgYmVoYXZlcyB3aXRoIGhvdHBsdWdnYWJsZSBzZXJpYWwgaGFyZHdhcmUgbGlrZQorCSAqIHJzMjMyLXBjbWNpYSBjYXJkIG9yIHVzYi1zZXJpYWwuLi4KKwkgKgorCSAqIHByaXYtPnR0eSA9IE5VTEw/OworCSAqLworCisJLyogd2UgYXJlIGRlYWQgbm93ICovCisJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCisJc2lyZGV2X3B1dF9pbnN0YW5jZShwcml2LT5kZXYpOworCisJLyogU3RvcCB0dHkgKi8KKwlpcnR0eV9zdG9wX3JlY2VpdmVyKHR0eSwgVFJVRSk7CisJdHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJaWYgKHR0eS0+ZHJpdmVyLT5zdG9wKQorCQl0dHktPmRyaXZlci0+c3RvcCh0dHkpOworCisJa2ZyZWUocHJpdik7CisKKwlJUkRBX0RFQlVHKDAsICIlcyAtICVzOiBpcmRhIGxpbmUgZGlzY2lwbGluZSBjbG9zZWRcbiIsIF9fRlVOQ1RJT05fXywgdHR5LT5uYW1lKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyBpcmRhX2xkaXNjID0geworCS5tYWdpYwkJPSBUVFlfTERJU0NfTUFHSUMsCisgCS5uYW1lCQk9ICJpcmRhIiwKKwkuZmxhZ3MJCT0gMCwKKwkub3BlbgkJPSBpcnR0eV9vcGVuLAorCS5jbG9zZQkJPSBpcnR0eV9jbG9zZSwKKwkucmVhZAkJPSBOVUxMLAorCS53cml0ZQkJPSBOVUxMLAorCS5pb2N0bAkJPSBpcnR0eV9pb2N0bCwKKyAJLnBvbGwJCT0gTlVMTCwKKwkucmVjZWl2ZV9idWYJPSBpcnR0eV9yZWNlaXZlX2J1ZiwKKwkucmVjZWl2ZV9yb29tCT0gaXJ0dHlfcmVjZWl2ZV9yb29tLAorCS53cml0ZV93YWtldXAJPSBpcnR0eV93cml0ZV93YWtldXAsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCBpcnR0eV9zaXJfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX0lSREEsICZpcmRhX2xkaXNjKSkgIT0gMCkKKwkJSVJEQV9FUlJPUigiSXJEQTogY2FuJ3QgcmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiIsCisJCQkgICBlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcnR0eV9zaXJfY2xlYW51cCh2b2lkKSAKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9JUkRBLCBOVUxMKSkpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgY2FuJ3QgdW5yZWdpc3RlciBsaW5lIGRpc2NpcGxpbmUgKGVyciA9ICVkKVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZXJyKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGlydHR5X3Npcl9pbml0KTsKK21vZHVsZV9leGl0KGlydHR5X3Npcl9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJckRBIFRUWSBkZXZpY2UgZHJpdmVyIik7CitNT0RVTEVfQUxJQVNfTERJU0MoTl9JUkRBKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMmQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmgKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXNpcl90dHkuaDoJZGVmaW5pdGlvbnMgZm9yIHRoZSBpcnR0eV9zaXIgY2xpZW50IGRyaXZlciAoZm9ybWVyIGlydHR5KQorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJUlRUWVNJUl9ICisjZGVmaW5lIElSVFRZU0lSX0gKKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgkJLy8gY2hpcGlvX3QKKworI2RlZmluZSBJUlRUWV9JT0NfTUFHSUMgJ2UnCisjZGVmaW5lIElSVFRZX0lPQ1RET05HTEUgIF9JTyhJUlRUWV9JT0NfTUFHSUMsIDEpCisjZGVmaW5lIElSVFRZX0lPQ0dFVCAgICAgX0lPUihJUlRUWV9JT0NfTUFHSUMsIDIsIHN0cnVjdCBpcnR0eV9pbmZvKQorI2RlZmluZSBJUlRUWV9JT0NfTUFYTlIgICAyCisKK3N0cnVjdCBzaXJ0dHlfY2IgeworCW1hZ2ljX3QgbWFnaWM7CisKKwlzdHJ1Y3Qgc2lyX2RldiAqZGV2OworCXN0cnVjdCB0dHlfc3RydWN0ICAqdHR5OworCisJY2hpcGlvX3QgaW87ICAgICAgICAgICAgICAgLyogSXJEQSBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbGl0ZWxpbmstc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2xpdGVsaW5rLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjYxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2xpdGVsaW5rLXNpci5jCkBAIC0wLDAgKzEsMjA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGxpdGVsaW5rLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMQorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgUGFyYWxsYXggTGl0ZUxpbmsgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBTdGFibGUKKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIEZyaSBNYXkgIDcgMTI6NTA6MzMgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgRnJpIERlYyAxNyAwOToxNDoyMyAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBNb2RpZmllZCBhdDogICBUaHUgSmFuIDE1IDIwMDMKKyAqIE1vZGlmaWVkIGJ5OiAgIEV1Z2VuZSBDcm9zc2VyIDxjcm9zc2VyQGF2ZXJhZ2Uub3JnPgorICoKKyAqIENvbnZlcnQgdG8gIm5ldyIgSVJEQSBpbmZyYXN0cnVjdHVyZSBmb3Iga2VybmVsIDIuNgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworI2RlZmluZSBNSU5fREVMQVkgMjUgICAgICAvKiAxNSB1cywgYnV0IHdhaXQgYSBsaXR0bGUgbW9yZSB0byBiZSBzdXJlICovCisjZGVmaW5lIE1BWF9ERUxBWSAxMDAwMCAgIC8qIDEgbXMgKi8KKworc3RhdGljIGludCBsaXRlbGlua19vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBsaXRlbGlua19jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgbGl0ZWxpbmtfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKTsKK3N0YXRpYyBpbnQgbGl0ZWxpbmtfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldik7CisKKy8qIFRoZXNlIGFyZSB0aGUgYmF1ZHJhdGVzIHN1cHBvcnRlZCAtIDk2MDAgbXVzdCBiZSBsYXN0IG9uZSEgKi8KK3N0YXRpYyB1bnNpZ25lZCBiYXVkX3JhdGVzW10gPSB7IDExNTIwMCwgNTc2MDAsIDM4NDAwLCAxOTIwMCwgOTYwMCB9OworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgbGl0ZWxpbmsgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9ICJQYXJhbGxheCBMaXRlTGluayIsCisJLnR5cGUJCT0gSVJEQV9MSVRFTElOS19ET05HTEUsCisJLm9wZW4JCT0gbGl0ZWxpbmtfb3BlbiwKKwkuY2xvc2UJCT0gbGl0ZWxpbmtfY2xvc2UsCisJLnJlc2V0CQk9IGxpdGVsaW5rX3Jlc2V0LAorCS5zZXRfc3BlZWQJPSBsaXRlbGlua19jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsaXRlbGlua19zaXJfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmbGl0ZWxpbmspOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGl0ZWxpbmtfc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZsaXRlbGluayk7Cit9CisKK3N0YXRpYyBpbnQgbGl0ZWxpbmtfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXN0cnVjdCBxb3NfaW5mbyAqcW9zID0gJmRldi0+cW9zOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIHVwIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2V0IHRoZSBzcGVlZHMgd2UgY2FuIGFjY2VwdCAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfMTE1MjAwfElSXzU3NjAwfElSXzM4NDAwfElSXzE5MjAwfElSXzk2MDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDdmOyAvKiBOZWVkcyAwLjAxIG1zICovCisJaXJkYV9xb3NfYml0c190b192YWx1ZShxb3MpOworCisJLyogaXJkYSB0aHJlYWQgd2FpdHMgNTAgbXNlYyBmb3IgcG93ZXIgc2V0dGxpbmcgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpdGVsaW5rX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBsaXRlbGlua19jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICogICAgQ2hhbmdlIHNwZWVkIG9mIHRoZSBMaXRlbGluayBkb25nbGUuIFRvIGN5Y2xlIHRocm91Z2ggdGhlIGF2YWlsYWJsZSAKKyAqICAgIGJhdWQgcmF0ZXMsIHB1bHNlIFJUUyBsb3cgZm9yIGEgZmV3IG1zLiAgCisgKi8KK3N0YXRpYyBpbnQgbGl0ZWxpbmtfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworICAgICAgICBpbnQgaTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBkb25nbGUgYWxyZWFkeSByZXNldCBieSBpcmRhLXRocmVhZCAtIGN1cnJlbnQgc3BlZWQgKGRvbmdsZSBhbmQKKwkgKiBwb3J0KSBpcyB0aGUgZGVmYXVsdCBzcGVlZCAoMTE1MjAwIGZvciBsaXRlbGluayEpCisJICovCisKKwkvKiBDeWNsZSB0aHJvdWdoIGF2YWlhYmxlIGJhdWRyYXRlcyB1bnRpbCB3ZSByZWFjaCB0aGUgY29ycmVjdCBvbmUgKi8KKwlmb3IgKGkgPSAwOyBiYXVkX3JhdGVzW2ldICE9IHNwZWVkOyBpKyspIHsKKworCQkvKiBlbmQtb2YtbGlzdCByZWFjaGVkIGR1ZSB0byBpbnZhbGlkIHNwZWVkIHJlcXVlc3QgKi8KKwkJaWYgKGJhdWRfcmF0ZXNbaV0gPT0gOTYwMCkKKwkJCWJyZWFrOworCisJCS8qIFNldCBEVFIsIGNsZWFyIFJUUyAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgVFJVRSk7CisKKwkJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJCXVkZWxheShNSU5fREVMQVkpOworCisJCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwkJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJCXVkZWxheShNSU5fREVMQVkpOworICAgICAgICB9CisKKwlkZXYtPnNwZWVkID0gYmF1ZF9yYXRlc1tpXTsKKworCS8qIGludmFsaWQgYmF1ZHJhdGUgc2hvdWxkIG5vdCBoYXBwZW4gLSBidXQgaWYsIHdlIHJldHVybiAtRUlOVkFMIGFuZAorCSAqIHRoZSBkb25nbGUgY29uZmlndXJlZCBmb3IgOTYwMCBzbyB0aGUgc3RhY2sgaGFzIGEgY2hhbmNlIHRvIHJlY292ZXIKKwkgKi8KKworCXJldHVybiAoZGV2LT5zcGVlZCA9PSBzcGVlZCkgPyAwIDogLUVJTlZBTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGxpdGVsaW5rX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgICAgUmVzZXQgdGhlIExpdGVsaW5rIHR5cGUgZG9uZ2xlLgorICoKKyAqLworc3RhdGljIGludCBsaXRlbGlua19yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBwcm9iYWJseSB0aGUgcG93ZXItdXAgY2FuIGJlIGRyb3BwZWQgaGVyZSwgYnV0IHdpdGggb25seQorCSAqIDE1IHVzZWMgZGVsYXkgaXQncyBub3Qgd29ydGggdGhlIHJpc2sgdW5sZXNzIHNvbWVib2R5IHdpdGgKKwkgKiB0aGUgaGFyZHdhcmUgY29uZmlybXMgaXQgZG9lc24ndCBicmVhayBhbnl0aGluZy4uLgorCSAqLworCisJLyogUG93ZXIgb24gZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIENsZWFyIFJUUyB0byByZXNldCBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBGQUxTRSk7CisKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCXVkZWxheShNSU5fREVMQVkpOworCisJLyogVGhpcyBkb25nbGVzIHNwZWVkIGRlZmF1bHRzIHRvIDExNTIwMCBicHMgKi8KKwlkZXYtPnNwZWVkID0gMTE1MjAwOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUGFyYWxsYXggTGl0ZWxpbmsgZG9uZ2xlIGRyaXZlciIpOwkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtNSIpOyAvKiBJUkRBX0xJVEVMSU5LX0RPTkdMRSAqLworCisvKgorICogRnVuY3Rpb24gaW5pdF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBMaXRlbGluayBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KGxpdGVsaW5rX3Npcl9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgTGl0ZWxpbmsgbW9kdWxlCisgKgorICovCittb2R1bGVfZXhpdChsaXRlbGlua19zaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2xpdGVsaW5rLmMgYi9kcml2ZXJzL25ldC9pcmRhL2xpdGVsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiMTE0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbGl0ZWxpbmsuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBsaXRlbGluay5jCisgKiBWZXJzaW9uOiAgICAgICAxLjEKKyAqIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIFBhcmFsbGF4IExpdGVMaW5rIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgU3RhYmxlCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBGcmkgTWF5ICA3IDEyOjUwOjMzIDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTcgMDk6MTQ6MjMgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2RlZmluZSBNSU5fREVMQVkgMjUgICAgICAvKiAxNSB1cywgYnV0IHdhaXQgYSBsaXR0bGUgbW9yZSB0byBiZSBzdXJlICovCisjZGVmaW5lIE1BWF9ERUxBWSAxMDAwMCAgIC8qIDEgbXMgKi8KKworc3RhdGljIHZvaWQgbGl0ZWxpbmtfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgbGl0ZWxpbmtfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOworc3RhdGljIGludCAgbGl0ZWxpbmtfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworc3RhdGljIGludCAgbGl0ZWxpbmtfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CisKKy8qIFRoZXNlIGFyZSB0aGUgYmF1ZHJhdGVzIHN1cHBvcnRlZCAqLworc3RhdGljIF9fdTMyIGJhdWRfcmF0ZXNbXSA9IHsgMTE1MjAwLCA1NzYwMCwgMzg0MDAsIDE5MjAwLCA5NjAwIH07CisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX0xJVEVMSU5LX0RPTkdMRSwKKwkub3BlbiA9IGxpdGVsaW5rX29wZW4sCisJLmNsb3NlID0gbGl0ZWxpbmtfY2xvc2UsCisJLnJlc2V0ID0gbGl0ZWxpbmtfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGxpdGVsaW5rX2NoYW5nZV9zcGVlZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxpdGVsaW5rX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGl0ZWxpbmtfY2xlYW51cCh2b2lkKQoreworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBsaXRlbGlua19vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHg3ZjsgLyogTmVlZHMgMC4wMSBtcyAqLworfQorCitzdGF0aWMgdm9pZCBsaXRlbGlua19jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworfQorCisvKgorICogRnVuY3Rpb24gbGl0ZWxpbmtfY2hhbmdlX3NwZWVkICh0YXNrKQorICoKKyAqICAgIENoYW5nZSBzcGVlZCBvZiB0aGUgTGl0ZWxpbmsgZG9uZ2xlLiBUbyBjeWNsZSB0aHJvdWdoIHRoZSBhdmFpbGFibGUgCisgKiAgICBiYXVkIHJhdGVzLCBwdWxzZSBSVFMgbG93IGZvciBhIGZldyBtcy4gIAorICovCitzdGF0aWMgaW50IGxpdGVsaW5rX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCV9fdTMyIHNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKKyAgICAgICAgaW50IGk7CisJCisJLyogQ2xlYXIgUlRTIHRvIHJlc2V0IGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOworCisJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKwkKKwkvKiBDeWNsZSB0aHJvdWdoIGF2YWlhYmxlIGJhdWRyYXRlcyB1bnRpbCB3ZSByZWFjaCB0aGUgY29ycmVjdCBvbmUgKi8KKwlmb3IgKGk9MDsgaTw1ICYmIGJhdWRfcmF0ZXNbaV0gIT0gc3BlZWQ7IGkrKykgeworCQkvKiBTZXQgRFRSLCBjbGVhciBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgVFJVRSk7CisJCQorCQkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisJCQorCQkvKiBTZXQgRFRSLCBTZXQgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisJCQorCQkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisgICAgICAgIH0KKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGxpdGVsaW5rX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgICAgUmVzZXQgdGhlIExpdGVsaW5rIHR5cGUgZG9uZ2xlLgorICoKKyAqLworc3RhdGljIGludCBsaXRlbGlua19yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCisJLyogUG93ZXIgb24gZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKworCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCXVkZWxheShNSU5fREVMQVkpOworCisJLyogQ2xlYXIgUlRTIHRvIHJlc2V0IGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOworCisJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIFRoaXMgZG9uZ2xlcyBzcGVlZCBkZWZhdWx0cyB0byAxMTUyMDAgYnBzICovCisJc2VsZi0+c3BlZWQgPSAxMTUyMDA7CisKKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYXJhbGxheCBMaXRlbGluayBkb25nbGUgZHJpdmVyIik7CQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS01Iik7IC8qIElSREFfTElURUxJTktfRE9OR0xFICovCisJCQorLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgTGl0ZWxpbmsgbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdChsaXRlbGlua19pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgTGl0ZWxpbmsgbW9kdWxlCisgKgorICovCittb2R1bGVfZXhpdChsaXRlbGlua19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbWE2MDAtc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL21hNjAwLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWQxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL21hNjAwLXNpci5jCkBAIC0wLDAgKzEsMjY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIG1hNjAwLmMKKyAqIFZlcnNpb246ICAgICAgIDAuMQorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIE1BNjAwIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgTGV1bmcgPDk1RXR3bEBhbHVtbmkuZWUudXN0LmhrPiBodHRwOi8vd3d3LmVuZ3N2ci51c3QvfmVldHdsOTUKKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBKdW4gMTAgMjA6MDI6MzUgMjAwMAorICogTW9kaWZpZWQgYXQ6ICAgU2F0IEF1ZyAxNiAwOTozNDoxMyAyMDAzCisgKiBNb2RpZmllZCBieTogICBNYXJ0aW4gRGllaGwgPG1hZEBtZGllaGwuZGU+IChtb2RpZmllZCBmb3IgbmV3IHNpcl9kZXYpCisgKgorICogTm90ZTogdmVyeSB0aGFua3MgdG8gTXIuIE1hcnUgV2FuZyA8bWFydUBtb2JpbGVhY3Rpb24uY29tLnR3PiBmb3IgcHJvdmlkaW5nIAorICogICAgICAgaW5mb3JtYXRpb24gb24gdGhlIE1BNjAwIGRvbmdsZQorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwIExldW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCitzdGF0aWMgaW50IG1hNjAwX29wZW4oc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IG1hNjAwX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICopOworc3RhdGljIGludCBtYTYwMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKiwgdW5zaWduZWQpOworc3RhdGljIGludCBtYTYwMF9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqKTsKKworLyogY29udHJvbCBieXRlIGZvciBNQTYwMCAqLworI2RlZmluZSBNQTYwMF85NjAwCTB4MDAKKyNkZWZpbmUgTUE2MDBfMTkyMDAJMHgwMQorI2RlZmluZSBNQTYwMF8zODQwMAkweDAyCisjZGVmaW5lIE1BNjAwXzU3NjAwCTB4MDMKKyNkZWZpbmUgTUE2MDBfMTE1MjAwCTB4MDQKKyNkZWZpbmUgTUE2MDBfREVWX0lEMQkweDA1CisjZGVmaW5lIE1BNjAwX0RFVl9JRDIJMHgwNgorI2RlZmluZSBNQTYwMF8yNDAwCTB4MDgKKworc3RhdGljIHN0cnVjdCBkb25nbGVfZHJpdmVyIG1hNjAwID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZSAgICA9ICJNQTYwMCIsCisJLnR5cGUgICAgICAgICAgID0gSVJEQV9NQTYwMF9ET05HTEUsCisJLm9wZW4gICAgICAgICAgID0gbWE2MDBfb3BlbiwKKwkuY2xvc2UgICAgICAgICAgPSBtYTYwMF9jbG9zZSwKKwkucmVzZXQgICAgICAgICAgPSBtYTYwMF9yZXNldCwKKwkuc2V0X3NwZWVkICAgICAgPSBtYTYwMF9jaGFuZ2Vfc3BlZWQsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG1hNjAwX3Npcl9pbml0KHZvaWQpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gaXJkYV9yZWdpc3Rlcl9kb25nbGUoJm1hNjAwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1hNjAwX3Npcl9jbGVhbnVwKHZvaWQpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZtYTYwMCk7Cit9CisKKy8qCisJUG93ZXIgb246CisJCSgwKSBDbGVhciBSVFMgYW5kIERUUiBmb3IgMSBzZWNvbmQKKwkJKDEpIFNldCBSVFMgYW5kIERUUiBmb3IgMSBzZWNvbmQKKwkJKDIpIDk2MDAgYnBzIG5vdworCU5vdGU6IGFzc3VtZSBSVFMsIERUUiBhcmUgY2xlYXIgYmVmb3JlCisqLworc3RhdGljIGludCBtYTYwMF9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHFvc19pbmZvICpxb3MgPSAmZGV2LT5xb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBFeHBsaWNpdGx5IHNldCB0aGUgc3BlZWRzIHdlIGNhbiBhY2NlcHQgKi8KKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzI0MDB8SVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMAorCQkJCXxJUl81NzYwMHxJUl8xMTUyMDA7CisJLyogSG0sIDB4MDEgbWVhbnMgMTBtcyAtIGZvciA+PSAxbXMgd2Ugd291bGQgbmVlZCAweDA3ICovCisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOwkJLyogTmVlZHMgYXQgbGVhc3QgMSBtcyAqLwkKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvKiBpcmRhIHRocmVhZCB3YWl0cyA1MCBtc2VjIGZvciBwb3dlciBzZXR0bGluZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWE2MDBfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fdTggZ2V0X2NvbnRyb2xfYnl0ZShfX3UzMiBzcGVlZCkKK3sKKwlfX3U4IGJ5dGU7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwljYXNlIDExNTIwMDoKKwkJYnl0ZSA9IE1BNjAwXzExNTIwMDsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJYnl0ZSA9IE1BNjAwXzU3NjAwOworCQlicmVhazsKKwljYXNlIDM4NDAwOgorCQlieXRlID0gTUE2MDBfMzg0MDA7CisJCWJyZWFrOworCWNhc2UgMTkyMDA6CisJCWJ5dGUgPSBNQTYwMF8xOTIwMDsKKwkJYnJlYWs7CisJY2FzZSA5NjAwOgorCQlieXRlID0gTUE2MDBfOTYwMDsKKwkJYnJlYWs7CisJY2FzZSAyNDAwOgorCQlieXRlID0gTUE2MDBfMjQwMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGJ5dGU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBtYTYwMF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIE1BNjAwIHR5cGUgZG9uZ2xlLgorICoKKyAqICAgIFRoZSBkb25nbGUgaGFzIGFscmVhZHkgYmVlbiByZXNldCB0byBhIGtub3duIHN0YXRlIChkb25nbGUgZGVmYXVsdCkKKyAqICAgIFdlIGN5Y2xlIHRocm91Z2ggc3BlZWRzIGJ5IHB1bHNpbmcgUlRTIGxvdyBhbmQgdGhlbiBoaWdoLgorICovCisKKy8qCisgKiBGdW5jdGlvbiBtYTYwMF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIE1BNjAwIHR5cGUgZG9uZ2xlLgorICoKKyAqICAgIEFsZ29yaXRobQorICogICAgMS4gUmVzZXQgKGFscmVhZHkgZG9uZSBieSBpcmRhIHRocmVhZCBzdGF0ZSBtYWNoaW5lKQorICogICAgMi4gY2xlYXIgUlRTLCBzZXQgRFRSIGFuZCB3YWl0IGZvciAxbXMKKyAqICAgIDMuIHNlbmQgQ29udHJvbCBCeXRlIHRvIHRoZSBNQTYwMCB0aHJvdWdoIFRYRCB0byBzZXQgbmV3IGJhdWQgcmF0ZQorICogICAgICAgd2FpdCB1bnRpbCB0aGUgc3RvcCBiaXQgb2YgQ29udHJvbCBCeXRlIGlzIHNlbnQgKGZvciA5NjAwIGJhdWQgcmF0ZSwgCisgKiAgICAgICBpdCB0YWtlcyBhYm91dCAxMCBtc2VjKQorICogICAgNC4gc2V0IFJUUywgc2V0IERUUiAocmV0dXJuIHRvIE5PUk1BTCBPcGVyYXRpb24pCisgKiAgICA1LiB3YWl0IGF0IGxlYXN0IDEwIG1zLCBuZXcgc2V0dGluZyAoYmF1ZCByYXRlLCBldGMpIHRha2VzIGVmZmVjdCBoZXJlIAorICogICAgICAgYWZ0ZXIKKyAqLworCisvKiB0b3RhbCBkZWxheXMgYXJlIG9ubHkgYWJvdXQgMjBtcyAtIGxldCdzIGp1c3Qgc2xlZXAgZm9yIG5vdyB0bworICogYXZvaWQgdGhlIHN0YXRlIG1hY2hpbmUgY29tcGxleGl0eSBiZWZvcmUgd2UgZ2V0IHRoaW5ncyB3b3JraW5nCisgKi8KKworc3RhdGljIGludCBtYTYwMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJdTgJYnl0ZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzcGVlZD0lZCAod2FzICVkKVxuIiwgX19GVU5DVElPTl9fLAorCQlzcGVlZCwgZGV2LT5zcGVlZCk7CisKKwkvKiBkb25nbGUgYWxyZWFkeSByZXNldCwgZG9uZ2xlIGFuZCBwb3J0IGF0IGRlZmF1bHQgc3BlZWQgKDk2MDApICovCisKKwkvKiBTZXQgUlRTIGxvdyBmb3IgMSBtcyAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIEZBTFNFKTsKKwltZGVsYXkoMSk7CisKKwkvKiBXcml0ZSBjb250cm9sIGJ5dGUgKi8KKwlieXRlID0gZ2V0X2NvbnRyb2xfYnl0ZShzcGVlZCk7CisJc2lyZGV2X3Jhd193cml0ZShkZXYsICZieXRlLCBzaXplb2YoYnl0ZSkpOworCisJLyogV2FpdCBhdCBsZWFzdCAxMG1zOiBmYWtlIHdhaXRfdW50aWxfc2VudCAtIDEwIGJpdHMgYXQgOTYwMCBiYXVkKi8KKwltc2xlZXAoMTUpOwkJCQkJLyogb2xkIG1hNjAwIHVzZXMgMTVtcyAqLworCisjaWYgMQorCS8qIHJlYWQtYmFjayBvZiB0aGUgY29udHJvbCBieXRlLiBtYTYwMCBpcyB0aGUgZmlyc3QgZG9uZ2xlIGRyaXZlcgorCSAqIHdoaWNoIHVzZXMgdGhpcyBzbyB0aGVyZSBtaWdodCBiZSBzb21lIHVuaWRlbnRpZmllZCBpc3N1ZXMuCisJICogRGlzYWJsZSB0aGlzIGluIGNhc2Ugb2YgcHJvYmxlbXMgd2l0aCByZWFkYmFjay4KKwkgKi8KKworCXNpcmRldl9yYXdfcmVhZChkZXYsICZieXRlLCBzaXplb2YoYnl0ZSkpOworCWlmIChieXRlICE9IGdldF9jb250cm9sX2J5dGUoc3BlZWQpKSAgeworCQlJUkRBX1dBUk5JTkcoIiVzKCk6IGJhZCBjb250cm9sIGJ5dGUgcmVhZC1iYWNrICUwMnggIT0gJTAyeFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCAodW5zaWduZWQpIGJ5dGUsCisJCQkgICAgICh1bnNpZ25lZCkgZ2V0X2NvbnRyb2xfYnl0ZShzcGVlZCkpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSBjb250cm9sIGJ5dGUgd3JpdGUgcmVhZCBPS1xuIiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorCisJLyogU2V0IERUUiwgU2V0IFJUUyAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJLyogV2FpdCBhdCBsZWFzdCAxMG1zICovCisJbXNsZWVwKDEwKTsKKworCS8qIGRvbmdsZSBpcyBub3cgc3dpdGNoZWQgdG8gdGhlIG5ldyBzcGVlZCAqLworCWRldi0+c3BlZWQgPSBzcGVlZDsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbWE2MDBfcmVzZXQgKGRldikKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBtYTYwMCBkb25nbGUuCisgKgorICogICAgICBBbGdvcml0aG06CisgKiAgICAJICAwLiBEVFI9MCwgUlRTPTEgYW5kIHdhaXQgMTAgbXMKKyAqICAgIAkgIDEuIERUUj0xLCBSVFM9MSBhbmQgd2FpdCAxMCBtcworICogICAgICAgIDIuIDk2MDAgYnBzIG5vdworICovCisKKy8qIHRvdGFsIGRlbGF5cyBhcmUgb25seSBhYm91dCAyMG1zIC0gbGV0J3MganVzdCBzbGVlcCBmb3Igbm93IHRvCisgKiBhdm9pZCB0aGUgc3RhdGUgbWFjaGluZSBjb21wbGV4aXR5IGJlZm9yZSB3ZSBnZXQgdGhpbmdzIHdvcmtpbmcKKyAqLworCitpbnQgbWE2MDBfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUmVzZXQgdGhlIGRvbmdsZSA6IHNldCBEVFIgbG93IGZvciAxMCBtcyAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKwltc2xlZXAoMTApOworCisJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCW1zbGVlcCgxMCk7CisKKwlkZXYtPnNwZWVkID0gOTYwMDsgICAgICAvKiBUaGF0J3MgdGhlIGRvbmdsZS1kZWZhdWx0ICovCisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiTGV1bmcgPDk1RXR3bEBhbHVtbmkuZWUudXN0LmhrPiBodHRwOi8vd3d3LmVuZ3N2ci51c3QvfmVldHdsOTUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUE2MDAgZG9uZ2xlIGRyaXZlciB2ZXJzaW9uIDAuMSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0xMSIpOyAvKiBJUkRBX01BNjAwX0RPTkdMRSAqLworCQkKK21vZHVsZV9pbml0KG1hNjAwX3Npcl9pbml0KTsKK21vZHVsZV9leGl0KG1hNjAwX3Npcl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9tYTYwMC5jIGIvZHJpdmVycy9uZXQvaXJkYS9tYTYwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTY4MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL21hNjAwLmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgbWE2MDAuYworICogVmVyc2lvbjogICAgICAgMC4xCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUE2MDAgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBMZXVuZyA8OTVFdHdsQGFsdW1uaS5lZS51c3QuaGs+IGh0dHA6Ly93d3cuZW5nc3ZyLnVzdC9+ZWV0d2w5NQorICogQ3JlYXRlZCBhdDogICAgU2F0IEp1biAxMCAyMDowMjozNSAyMDAwCisgKiBNb2RpZmllZCBhdDogICAKKyAqIE1vZGlmaWVkIGJ5OiAgIAorICoKKyAqIE5vdGU6IHZlcnkgdGhhbmtzIHRvIE1yLiBNYXJ1IFdhbmcgPG1hcnVAbW9iaWxlYWN0aW9uLmNvbS50dz4gZm9yIHByb3ZpZGluZyAKKyAqICAgICAgIGluZm9ybWF0aW9uIG9uIHRoZSBNQTYwMCBkb25nbGUKKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMjAwMCBMZXVuZywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkZWZpbmUgdGhpcyBtYWNybyBmb3IgcmVsZWFzZSB2ZXJzaW9uICovCisvLyNkZWZpbmUgTkRFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaWZuZGVmIE5ERUJVRworCSN1bmRlZiBJUkRBX0RFQlVHCisJI2RlZmluZSBJUkRBX0RFQlVHKG4sIGFyZ3MuLi4pIChwcmludGsoS0VSTl9ERUJVRyBhcmdzKSkKKworCSN1bmRlZiBBU1NFUlQKKwkjZGVmaW5lIEFTU0VSVChleHByLCBmdW5jKSBcCisJaWYoIShleHByKSkgeyBcCisJICAgICAgICBwcmludGsoICJBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLFwKKyAgICAgICAgCSNleHByLF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7IFwKKwkgICAgICAgIGZ1bmN9CisjZW5kaWYKKworLyogY29udmVydCBoZXggdmFsdWUgdG8gYXNjaWkgaGV4ICovCitzdGF0aWMgY29uc3QgY2hhciBoZXhUYmxbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKworCitzdGF0aWMgdm9pZCBtYTYwMF9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBtYTYwMF9jbG9zZShkb25nbGVfdCAqc2VsZik7CitzdGF0aWMgaW50ICBtYTYwMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgaW50ICBtYTYwMF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworLyogY29udHJvbCBieXRlIGZvciBNQTYwMCAqLworI2RlZmluZSBNQTYwMF85NjAwCTB4MDAKKyNkZWZpbmUgTUE2MDBfMTkyMDAJMHgwMQorI2RlZmluZSBNQTYwMF8zODQwMAkweDAyCisjZGVmaW5lIE1BNjAwXzU3NjAwCTB4MDMKKyNkZWZpbmUgTUE2MDBfMTE1MjAwCTB4MDQKKyNkZWZpbmUgTUE2MDBfREVWX0lEMQkweDA1CisjZGVmaW5lIE1BNjAwX0RFVl9JRDIJMHgwNgorI2RlZmluZSBNQTYwMF8yNDAwCTB4MDgKKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfTUE2MDBfRE9OR0xFLAorCS5vcGVuID0gbWE2MDBfb3BlbiwKKwkuY2xvc2UgPSBtYTYwMF9jbG9zZSwKKwkucmVzZXQgPSBtYTYwMF9yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gbWE2MDBfY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWE2MDBfaW5pdCh2b2lkKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1hNjAwX2NsZWFudXAodm9pZCkKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCisvKgorCVBvd2VyIG9uOgorCQkoMCkgQ2xlYXIgUlRTIGFuZCBEVFIgZm9yIDEgc2Vjb25kCisJCSgxKSBTZXQgUlRTIGFuZCBEVFIgZm9yIDEgc2Vjb25kCisJCSgyKSA5NjAwIGJwcyBub3cKKwlOb3RlOiBhc3N1bWUgUlRTLCBEVFIgYXJlIGNsZWFyIGJlZm9yZQorKi8KK3N0YXRpYyB2b2lkIG1hNjAwX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzI0MDB8SVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMAorCQkJCXxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOwkJLyogTmVlZHMgYXQgbGVhc3QgMSBtcyAqLwkKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvL3NlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKKwkvLyBzaG91bGQgd2FpdCAxIHNlY29uZAorCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkvLyBzaG91bGQgd2FpdCAxIHNlY29uZAorfQorCitzdGF0aWMgdm9pZCBtYTYwMF9jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKK30KKworc3RhdGljIF9fdTggZ2V0X2NvbnRyb2xfYnl0ZShfX3UzMiBzcGVlZCkKK3sKKwlfX3U4IGJ5dGU7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwljYXNlIDExNTIwMDoKKwkJYnl0ZSA9IE1BNjAwXzExNTIwMDsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJYnl0ZSA9IE1BNjAwXzU3NjAwOworCQlicmVhazsKKwljYXNlIDM4NDAwOgorCQlieXRlID0gTUE2MDBfMzg0MDA7CisJCWJyZWFrOworCWNhc2UgMTkyMDA6CisJCWJ5dGUgPSBNQTYwMF8xOTIwMDsKKwkJYnJlYWs7CisJY2FzZSA5NjAwOgorCQlieXRlID0gTUE2MDBfOTYwMDsKKwkJYnJlYWs7CisJY2FzZSAyNDAwOgorCQlieXRlID0gTUE2MDBfMjQwMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGJ5dGU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBtYTYwMF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3RhdGUsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBNQTYwMCB0eXBlIGRvbmdsZS4gV2FybmluZywgdGhpcyAKKyAqICAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhCisgKgorICogICAgQWxnb3JpdGhtCisgKiAgICAxLiBSZXNldAorICogICAgMi4gY2xlYXIgUlRTLCBzZXQgRFRSIGFuZCB3YWl0IGZvciAxbXMKKyAqICAgIDMuIHNlbmQgQ29udHJvbCBCeXRlIHRvIHRoZSBNQTYwMCB0aHJvdWdoIFRYRCB0byBzZXQgbmV3IGJhdWQgcmF0ZQorICogICAgICAgd2FpdCB1bnRpbCB0aGUgc3RvcCBiaXQgb2YgQ29udHJvbCBCeXRlIGlzIHNlbnQgKGZvciA5NjAwIGJhdWQgcmF0ZSwgCisgKiAgICAgICBpdCB0YWtlcyBhYm91dCAxMCBtc2VjKQorICogICAgNC4gc2V0IFJUUywgc2V0IERUUiAocmV0dXJuIHRvIE5PUk1BTCBPcGVyYXRpb24pCisgKiAgICA1LiB3YWl0IGF0IGxlYXN0IDEwIG1zLCBuZXcgc2V0dGluZyAoYmF1ZCByYXRlLCBldGMpIHRha2VzIGVmZmVjdCBoZXJlIAorICogICAgICAgYWZ0ZXIKKyAqLworc3RhdGljIGludCBtYTYwMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CisJc3RhdGljIF9fdTggYnl0ZTsKKwlfX3U4IGJ5dGVfZWNobzsKKwlpbnQgcmV0ID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJQVNTRVJUKHRhc2sgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlpZiAoc2VsZi0+c3BlZWRfdGFzayAmJiBzZWxmLT5zcGVlZF90YXNrICE9IHRhc2spIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYnVzeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwl9IGVsc2UgeworCQlzZWxmLT5zcGVlZF90YXNrID0gdGFzazsKKwl9CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwljYXNlIElSREFfVEFTS19DSElMRF9JTklUOgorCQkvKiAKKwkJICogTmVlZCB0byByZXNldCB0aGUgZG9uZ2xlIGFuZCBnbyB0byA5NjAwIGJwcyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgKiBwcm9ncmFtbWluZyAKKwkJICovCisJCWlmIChpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCBtYTYwMF9yZXNldCwgTlVMTCwgdGFzaywgCisJCQkJICAgICAgKHZvaWQgKikgc3BlZWQpKSB7CisJCQkvKiBEb25nbGUgbmVlZCBtb3JlIHRpbWUgdG8gcmVzZXQgKi8KKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9XQUlUKTsKKwkKKwkJCS8qIGdpdmUgMSBzZWNvbmQgdG8gZmluaXNoICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQl9IGVsc2UgeworCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX0RPTkUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCByZXNldHRpbmcgZG9uZ2xlIHRpbWVkIG91dCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC0xOworCQlicmVhazsKKworCWNhc2UgSVJEQV9UQVNLX0NISUxEX0RPTkU6CisJCS8qIFNldCBEVFIsIENsZWFyIFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIEZBTFNFKTsKKwkKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxKTsJCS8qIFNsZWVwIDEgbXMgKi8KKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQpOworCQlicmVhazsKKworCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CisJCXNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKKwkJYnl0ZSA9IGdldF9jb250cm9sX2J5dGUoc3BlZWQpOworCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZSAqLworCQlzZWxmLT53cml0ZShzZWxmLT5kZXYsICZieXRlLCBzaXplb2YoYnl0ZSkpOworCQkKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQxKTsKKworCQkvKiBXYWl0IGF0IGxlYXN0IDEwIG1zICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTUpOworCQlicmVhazsKKworCWNhc2UgSVJEQV9UQVNLX1dBSVQxOgorCQkvKiBSZWFkIGNvbnRyb2wgYnl0ZSBlY2hvICovCisJCXNlbGYtPnJlYWQoc2VsZi0+ZGV2LCAmYnl0ZV9lY2hvLCBzaXplb2YoYnl0ZV9lY2hvKSk7CisKKwkJaWYoYnl0ZSAhPSBieXRlX2VjaG8pIHsKKwkJCS8qIGlmIGNvbnRyb2wgYnl0ZSAhPSBlY2hvLCBJIGRvbid0IGtub3cgd2hhdCB0byBkbyAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKSBjb250cm9sIGJ5dGUgd3JpdHRlbiAhPSByZWFkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbnRyb2wgYnl0ZSA9IDB4JWMlY1xuIiwgCisJCQkgICAgICAgaGV4VGJsWyhieXRlPj40KSYweDBmXSwgaGV4VGJsW2J5dGUmMHgwZl0pOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnl0ZSBlY2hvID0gMHglYyVjXG4iLCAKKwkJCSAgICAgICBoZXhUYmxbKGJ5dGVfZWNobz4+NCkgJiAweDBmXSwgCisJCQkgICAgICAgaGV4VGJsW2J5dGVfZWNobyAmIDB4MGZdKTsKKwkJI2lmbmRlZiBOREVCVUcKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCkgY29udHJvbCBieXRlIHdyaXRlIHJlYWQgT0tcbiIsIF9fRlVOQ1RJT05fXyk7CisJCSNlbmRpZgorCQl9CisKKwkJLyogU2V0IERUUiwgU2V0IFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMik7CisKKwkJLyogV2FpdCBhdCBsZWFzdCAxMCBtcyAqLworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwkJYnJlYWs7CisKKwljYXNlIElSREFfVEFTS19XQUlUMjoKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG1hNjAwX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgbWE2MDAgZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIGZ1bmN0aW9uIAorICogICAgICBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgcHJvY2VzcyBjb250ZXh0ISEgCisgKgorICogICAgICBBbGdvcml0aG06CisgKiAgICAJICAwLiBEVFI9MCwgUlRTPTEgYW5kIHdhaXQgMTAgbXMKKyAqICAgIAkgIDEuIERUUj0xLCBSVFM9MSBhbmQgd2FpdCAxMCBtcworICogICAgICAgIDIuIDk2MDAgYnBzIG5vdworICovCitpbnQgbWE2MDBfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlBU1NFUlQodGFzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlmIChzZWxmLT5yZXNldF90YXNrICYmIHNlbGYtPnJlc2V0X3Rhc2sgIT0gdGFzaykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBidXN5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIG1zZWNzX3RvX2ppZmZpZXMoMTApOworCX0gZWxzZQorCQlzZWxmLT5yZXNldF90YXNrID0gdGFzazsKKwkKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwkJLyogQ2xlYXIgRFRSIGFuZCBTZXQgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwKTsJCS8qIFNsZWVwIDEwIG1zICovCisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQxOgorCQkvKiBTZXQgRFRSIGFuZCBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQyKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxMCk7CQkvKiBTbGVlcCAxMCBtcyAqLworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMjoKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CQkKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitNT0RVTEVfQVVUSE9SKCJMZXVuZyA8OTVFdHdsQGFsdW1uaS5lZS51c3QuaGs+IGh0dHA6Ly93d3cuZW5nc3ZyLnVzdC9+ZWV0d2w5NSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQTYwMCBkb25nbGUgZHJpdmVyIHZlcnNpb24gMC4xIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTExIik7IC8qIElSREFfTUE2MDBfRE9OR0xFICovCisJCQorLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgTUE2MDAgbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdChtYTYwMF9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgTUE2MDAgbW9kdWxlCisgKgorICovCittb2R1bGVfZXhpdChtYTYwMF9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9tY3AyMTIwLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9tY3AyMTIwLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YmQwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL21jcDIxMjAtc2lyLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgCisgKiAgICAKKyAqIEZpbGVuYW1lOiAgICAgIG1jcDIxMjAuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE1DUDIxMjAgKE1pY3JvY2hpcCkKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIEZlbGl4IFRhbmcgKHRhbmdmQGV5ZXRhcC5vcmcpCisgKiBDcmVhdGVkIGF0OiAgICBTdW4gTWFyIDMxIDE5OjMyOjEyIEVTVCAyMDAyCisgKiBCYXNlZCBvbiBjb2RlIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMjAwMiBGZWxpeCBUYW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKK3N0YXRpYyBpbnQgbWNwMjEyMF9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgbWNwMjEyMF9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBtY3AyMTIwX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBtY3AyMTIwX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCk7CisKKyNkZWZpbmUgTUNQMjEyMF85NjAwICAgIDB4ODcKKyNkZWZpbmUgTUNQMjEyMF8xOTIwMCAgIDB4OEIKKyNkZWZpbmUgTUNQMjEyMF8zODQwMCAgIDB4ODUKKyNkZWZpbmUgTUNQMjEyMF81NzYwMCAgIDB4ODMKKyNkZWZpbmUgTUNQMjEyMF8xMTUyMDAgIDB4ODEKKworI2RlZmluZSBNQ1AyMTIwX0NPTU1JVCAgMHgxMQorCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgbWNwMjEyMCA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIk1pY3JvY2hpcCBNQ1AyMTIwIiwKKwkudHlwZQkJPSBJUkRBX01DUDIxMjBfRE9OR0xFLAorCS5vcGVuCQk9IG1jcDIxMjBfb3BlbiwKKwkuY2xvc2UJCT0gbWNwMjEyMF9jbG9zZSwKKwkucmVzZXQJCT0gbWNwMjEyMF9yZXNldCwKKwkuc2V0X3NwZWVkCT0gbWNwMjEyMF9jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtY3AyMTIwX3Npcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZtY3AyMTIwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1jcDIxMjBfc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZtY3AyMTIwKTsKK30KKworc3RhdGljIGludCBtY3AyMTIwX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBzZWVtcyBubyBleHBsaWNpdCBwb3dlci1vbiByZXF1aXJlZCBoZXJlIGFuZCByZXNldCBzd2l0Y2hpbmcgaXQgb24gYW55d2F5ICovCisKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtY3AyMTIwX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKyAgICAgICAgLyogcmVzZXQgYW5kIGluaGliaXQgbWNwMjEyMCAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCS8vIHNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG1jcDIxMjBfY2hhbmdlX3NwZWVkIChkZXYsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBNQ1AyMTIwLgorICoKKyAqLworCisjZGVmaW5lIE1DUDIxMjBfU1RBVEVfV0FJVF9TUEVFRAkoU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRCsxKQorCitzdGF0aWMgaW50IG1jcDIxMjBfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworCXVuc2lnbmVkIHN0YXRlID0gZGV2LT5mc20uc3Vic3RhdGU7CisJdW5zaWduZWQgZGVsYXkgPSAwOworCXU4IGNvbnRyb2xbMl07CisJc3RhdGljIGludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNJUkRFVl9TVEFURV9ET05HTEVfU1BFRUQ6CisJCS8qIFNldCBEVFIgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICB1ZGVsYXkoNTAwKTsKKworCQlyZXQgPSAwOworCQlzd2l0Y2ggKHNwZWVkKSB7CisJCWRlZmF1bHQ6CisJCQlzcGVlZCA9IDk2MDA7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgOTYwMDoKKwkJCWNvbnRyb2xbMF0gPSBNQ1AyMTIwXzk2MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCA5NjAwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJY29udHJvbFswXSA9IE1DUDIxMjBfMTkyMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCAxOTIwMFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAzNDgwMDoKKwkJCWNvbnRyb2xbMF0gPSBNQ1AyMTIwXzM4NDAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjAgMzg0MDBcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgNTc2MDA6CisJCQljb250cm9sWzBdID0gTUNQMjEyMF81NzYwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwIDU3NjAwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xbMF0gPSBNQ1AyMTIwXzExNTIwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwIDExNTIwMFxuIik7CisJCQlicmVhazsKKwkJfQorCQljb250cm9sWzFdID0gTUNQMjEyMF9DT01NSVQ7CisJCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZXMgKi8KKwkJc2lyZGV2X3Jhd193cml0ZShkZXYsIGNvbnRyb2wsIDIpOworCQlkZXYtPnNwZWVkID0gc3BlZWQ7CisKKwkJc3RhdGUgPSBNQ1AyMTIwX1NUQVRFX1dBSVRfU1BFRUQ7CisJCWRlbGF5ID0gMTAwOworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX2NoYW5nZV9zcGVlZDogZG9uZ2xlX3NwZWVkXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DUDIxMjBfU1RBVEVfV0FJVF9TUEVFRDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX2NoYW5nZV9zcGVlZDogbWNwX3dhaXRcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVuZGVmaW5lIHN0YXRlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWRldi0+ZnNtLnN1YnN0YXRlID0gc3RhdGU7CisJcmV0dXJuIChkZWxheSA+IDApID8gZGVsYXkgOiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBtY3AyMTIwX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgbWNwMjEyMCBkb25nbGUuCisgKiAgICAgIAorICogICAgICBJbmZvOiAtc2V0IFJUUyB0byByZXNldCBtY3AyMTIwCisgKiAgICAgICAgICAgIC1zZXQgRFRSIHRvIHNldCBtY3AyMTIwIHNvZnR3YXJlIGNvbW1hbmQgbW9kZQorICogICAgICAgICAgICAtbWNwMjEyMCBkZWZhdWx0cyB0byA5NjAwIGJhdWQgYWZ0ZXIgcmVzZXQKKyAqCisgKiAgICAgIEFsZ29yaXRobToKKyAqICAgICAgMC4gU2V0IFJUUyB0byByZXNldCBtY3AyMTIwLgorICogICAgICAxLiBDbGVhciBSVFMgYW5kIHdhaXQgZm9yIGRldmljZSByZXNldCB0aW1lciBvZiAzMCBtcyAobWF4KS4KKyAqICAgICAgCisgKi8KKworI2RlZmluZSBNQ1AyMTIwX1NUQVRFX1dBSVQxX1JFU0VUCShTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUKzEpCisjZGVmaW5lIE1DUDIxMjBfU1RBVEVfV0FJVDJfUkVTRVQJKFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQrMikKKworc3RhdGljIGludCBtY3AyMTIwX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgc3RhdGUgPSBkZXYtPmZzbS5zdWJzdGF0ZTsKKwl1bnNpZ25lZCBkZWxheSA9IDA7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVDoKKyAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMF9yZXNldDogZG9uZ2xlX3Jlc2V0XG4iKTsKKwkJLyogUmVzZXQgZG9uZ2xlIGJ5IHNldHRpbmcgUlRTKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJCXN0YXRlID0gTUNQMjEyMF9TVEFURV9XQUlUMV9SRVNFVDsKKwkJZGVsYXkgPSA1MDsKKwkJYnJlYWs7CisKKwljYXNlIE1DUDIxMjBfU1RBVEVfV0FJVDFfUkVTRVQ6CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfcmVzZXQ6IG1jcDIxMjBfd2FpdDFcbiIpOworICAgICAgICAgICAgICAgIC8qIGNsZWFyIFJUUyBhbmQgd2FpdCBmb3IgYXQgbGVhc3QgMzAgbXMuICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisJCXN0YXRlID0gTUNQMjEyMF9TVEFURV9XQUlUMl9SRVNFVDsKKwkJZGVsYXkgPSA1MDsKKwkJYnJlYWs7CisKKwljYXNlIE1DUDIxMjBfU1RBVEVfV0FJVDJfUkVTRVQ6CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfcmVzZXQgbWNwMjEyMF93YWl0MlxuIik7CisJCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmRlZmluZWQgc3RhdGUgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJZGV2LT5mc20uc3Vic3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gKGRlbGF5ID4gMCkgPyBkZWxheSA6IHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiRmVsaXggVGFuZyA8dGFuZ2ZAZXlldGFwLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWljcm9jaGlwIE1DUDIxMjAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtOSIpOyAvKiBJUkRBX01DUDIxMjBfRE9OR0xFICovCisKK21vZHVsZV9pbml0KG1jcDIxMjBfc2lyX2luaXQpOworbW9kdWxlX2V4aXQobWNwMjEyMF9zaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21jcDIxMjAuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNwMjEyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjE5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL21jcDIxMjAuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAKKyAqICAgIAorICogRmlsZW5hbWU6ICAgICAgbWNwMjEyMC5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgTUNQMjEyMCAoTWljcm9jaGlwKQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRmVsaXggVGFuZyAodGFuZ2ZAZXlldGFwLm9yZykKKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBNYXIgMzEgMTk6MzI6MTIgRVNUIDIwMDIKKyAqIEJhc2VkIG9uIGNvZGUgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyIEZlbGl4IFRhbmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCitzdGF0aWMgaW50ICBtY3AyMTIwX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworc3RhdGljIHZvaWQgbWNwMjEyMF9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBtY3AyMTIwX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIG1jcDIxMjBfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworCisjZGVmaW5lIE1DUDIxMjBfOTYwMCAgICAweDg3CisjZGVmaW5lIE1DUDIxMjBfMTkyMDAgICAweDhCCisjZGVmaW5lIE1DUDIxMjBfMzg0MDAgICAweDg1CisjZGVmaW5lIE1DUDIxMjBfNTc2MDAgICAweDgzCisjZGVmaW5lIE1DUDIxMjBfMTE1MjAwICAweDgxCisKKyNkZWZpbmUgTUNQMjEyMF9DT01NSVQgIDB4MTEKKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfTUNQMjEyMF9ET05HTEUsCisJLm9wZW4gPSBtY3AyMTIwX29wZW4sCisJLmNsb3NlID0gbWNwMjEyMF9jbG9zZSwKKwkucmVzZXQgPSBtY3AyMTIwX3Jlc2V0LAorCS5jaGFuZ2Vfc3BlZWQgPSBtY3AyMTIwX2NoYW5nZV9zcGVlZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1jcDIxMjBfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtY3AyMTIwX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgbWNwMjEyMF9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsKK30KKworc3RhdGljIHZvaWQgbWNwMjEyMF9jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisgICAgICAgIC8qIHJlc2V0IGFuZCBpbmhpYml0IG1jcDIxMjAgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCS8vc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworfQorCisvKgorICogRnVuY3Rpb24gbWNwMjEyMF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIE1DUDIxMjAuCisgKgorICovCitzdGF0aWMgaW50IG1jcDIxMjBfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworCV9fdTggY29udHJvbFsyXTsKKwlpbnQgcmV0ID0gMDsKKworCXNlbGYtPnNwZWVkX3Rhc2sgPSB0YXNrOworCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisJCS8qIE5lZWQgdG8gcmVzZXQgdGhlIGRvbmdsZSBhbmQgZ28gdG8gOTYwMCBicHMgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgcHJvZ3JhbW1pbmcgKi8KKyAgICAgICAgICAgICAgICAvL3ByaW50aygiRG1jcDIxMjBfY2hhbmdlX3NwZWVkIGlyZGFfdGFza19pbml0XG4iKTsKKwkJaWYgKGlyZGFfdGFza19leGVjdXRlKHNlbGYsIG1jcDIxMjBfcmVzZXQsIE5VTEwsIHRhc2ssIAorCQkJCSAgICAgICh2b2lkICopIHNwZWVkKSkKKwkJeworCQkJLyogRG9uZ2xlIG5lZWQgbW9yZSB0aW1lIHRvIHJlc2V0ICovCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfV0FJVCk7CisKKwkJCS8qIEdpdmUgcmVzZXQgMSBzZWMgdG8gZmluaXNoICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQl9CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX0NISUxEX1dBSVQ6CisJCUlSREFfV0FSTklORygiJXMoKSwgcmVzZXR0aW5nIGRvbmdsZSB0aW1lZCBvdXQhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfRE9ORToKKwkJLyogU2V0IERUUiB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgdWRlbGF5KDUwMCk7CisKKwkJc3dpdGNoIChzcGVlZCkgeworCQljYXNlIDk2MDA6CisJCWRlZmF1bHQ6CisJCQljb250cm9sWzBdID0gTUNQMjEyMF85NjAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjAgOTYwMFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxOTIwMDoKKwkJCWNvbnRyb2xbMF0gPSBNQ1AyMTIwXzE5MjAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjAgMTkyMDBcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMzQ4MDA6CisJCQljb250cm9sWzBdID0gTUNQMjEyMF8zODQwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwIDM4NDAwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwOgorCQkJY29udHJvbFswXSA9IE1DUDIxMjBfNTc2MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCA1NzYwMFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxMTUyMDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sWzBdID0gTUNQMjEyMF8xMTUyMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCAxMTUyMDBcbiIpOworCQkJYnJlYWs7CisJCX0KKwkgICAgICAgIGNvbnRyb2xbMV0gPSBNQ1AyMTIwX0NPTU1JVDsKKwkKKwkJLyogV3JpdGUgY29udHJvbCBieXRlcyAqLworICAgICAgICAgICAgICAgIHNlbGYtPndyaXRlKHNlbGYtPmRldiwgY29udHJvbCwgMik7CisgCisgICAgICAgICAgICAgICAgaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfY2hhbmdlX3NwZWVkIGlyZGFfY2hpbGRfZG9uZVxuIik7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CisJCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX2NoYW5nZV9zcGVlZCBpcmRhX3Rhc2tfd2FpdFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gbWNwMjEyMF9yZXNldCAoZHJpdmVyKQorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIG1jcDIxMjAgZG9uZ2xlLgorICogICAgICAKKyAqICAgICAgSW5mbzogLXNldCBSVFMgdG8gcmVzZXQgbWNwMjEyMAorICogICAgICAgICAgICAtc2V0IERUUiB0byBzZXQgbWNwMjEyMCBzb2Z0d2FyZSBjb21tYW5kIG1vZGUKKyAqICAgICAgICAgICAgLW1jcDIxMjAgZGVmYXVsdHMgdG8gOTYwMCBiYXVkIGFmdGVyIHJlc2V0CisgKgorICogICAgICBBbGdvcml0aG06CisgKiAgICAgIDAuIFNldCBSVFMgdG8gcmVzZXQgbWNwMjEyMC4KKyAqICAgICAgMS4gQ2xlYXIgUlRTIGFuZCB3YWl0IGZvciBkZXZpY2UgcmVzZXQgdGltZXIgb2YgMzAgbXMgKG1heCkuCisgKiAgICAgIAorICovCisKKworc3RhdGljIGludCBtY3AyMTIwX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJaW50IHJldCA9IDA7CisKKwlzZWxmLT5yZXNldF90YXNrID0gdGFzazsKKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX3Jlc2V0IGlyZGFfdGFza19pbml0XG4iKTsKKwkJLyogUmVzZXQgZG9uZ2xlIGJ5IHNldHRpbmcgUlRTKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQxKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcyg1MCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQxOgorICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX3Jlc2V0IGlyZGFfdGFza193YWl0MVxuIik7CisgICAgICAgICAgICAgICAgLyogY2xlYXIgUlRTIGFuZCB3YWl0IGZvciBhdCBsZWFzdCAzMCBtcy4gKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDIpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDUwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDI6CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfcmVzZXQgaXJkYV90YXNrX3dhaXQyXG4iKTsKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitNT0RVTEVfQVVUSE9SKCJGZWxpeCBUYW5nIDx0YW5nZkBleWV0YXAub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNaWNyb2NoaXAgTUNQMjEyMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS05Iik7IC8qIElSREFfTUNQMjEyMF9ET05HTEUgKi8KKwkKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIE1DUDIxMjAgbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdChtY3AyMTIwX2luaXQpOworCisvKgorICogRnVuY3Rpb24gY2xlYW51cF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBNQ1AyMTIwIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2V4aXQobWNwMjEyMF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDU3MTRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jCkBAIC0wLDAgKzEsMjIyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBuc2MtaXJjYy5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIE5TQyBQQycxMDggYW5kIFBDJzMzOCBJckRBIGNoaXBzZXRzCisgKiBTdGF0dXM6ICAgICAgICBTdGFibGUuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgTm92ICA3IDIxOjQzOjE1IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFdlZCBNYXIgIDEgMTE6Mjk6MzQgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogICAgIENvcHlyaWdodCAoYykgMTk5OCBMaWNoZW4gV2FuZywgPGx3YW5nQGFjdGlzeXMuY29tPgorICogICAgIENvcHlyaWdodCAoYykgMTk5OCBBY3Rpc3lzIENvcnAuLCB3d3cuYWN0aXN5cy5jb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKiAgICAgTm90aWNlIHRoYXQgYWxsIGZ1bmN0aW9ucyB0aGF0IG5lZWRzIHRvIGFjY2VzcyB0aGUgY2hpcCBpbiBfYW55XworICogICAgIHdheSwgbXVzdCBzYXZlIEJTUiByZWdpc3RlciBvbiBlbnRyeSwgYW5kIHJlc3RvcmUgaXQgb24gZXhpdC4gCisgKiAgICAgSXQgaXMgX3ZlcnlfIGltcG9ydGFudCB0byBmb2xsb3cgdGhpcyBwb2xpY3khCisgKgorICogICAgICAgICBfX3U4IGJhbms7CisgKiAgICAgCisgKiAgICAgICAgIGJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisgKiAgCisgKiAgICAgICAgIGRvX3lvdXJfc3R1ZmZfaGVyZSgpOworICoKKyAqICAgICAgICAgb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKyAqCisgKiAgICBJZiB5b3UgZmluZCBidWdzIGluIHRoaXMgZmlsZSwgaXRzIHZlcnkgbGlrZWx5IHRoYXQgdGhlIHNhbWUgYnVnCisgKiAgICB3aWxsIGFsc28gYmUgaW4gdzgzOTc3YWZfaXIuYyBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb25zIGFyZSBxdWl0ZQorICogICAgc2ltaWxhci4KKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAibnNjLWlyY2MuaCIKKworI2RlZmluZSBDSElQX0lPX0VYVEVOVCA4CisjZGVmaW5lIEJST0tFTl9ET05HTEVfSUQKKworc3RhdGljIGNoYXIgKmRyaXZlcl9uYW1lID0gIm5zYy1pcmNjIjsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMHgwNzsgIC8qIDEgbXMgb3IgbW9yZSAqLworc3RhdGljIGludCBkb25nbGVfaWQ7CisKKy8qIFVzZSBCSU9TIHNldHRpb25zIGJ5IGRlZmF1bHQsIGJ1dCB1c2VyIG1heSBzdXBwbHkgbW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW9bXSAgPSB7IH4wLCB+MCwgfjAsIH4wIH07CitzdGF0aWMgdW5zaWduZWQgaW50IGlycVtdID0geyAwLCAwLCAwLCAwLCAwIH07CitzdGF0aWMgdW5zaWduZWQgaW50IGRtYVtdID0geyAwLCAwLCAwLCAwLCAwIH07CisKK3N0YXRpYyBpbnQgbnNjX2lyY2NfcHJvYmVfMTA4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyBpbnQgbnNjX2lyY2NfcHJvYmVfMzM4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyBpbnQgbnNjX2lyY2NfcHJvYmVfMzl4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyBpbnQgbnNjX2lyY2NfaW5pdF8xMDgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworc3RhdGljIGludCBuc2NfaXJjY19pbml0XzMzOChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgaW50IG5zY19pcmNjX2luaXRfMzl4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKKworLyogVGhlc2UgYXJlIHRoZSBrbm93biBOU0MgY2hpcHMgKi8KK3N0YXRpYyBuc2NfY2hpcF90IGNoaXBzW10gPSB7CisvKiAgTmFtZSwge2NmZyByZWdpc3RlcnN9LCBjaGlwIGlkIGluZGV4IHJlZywgY2hpcCBpZCBleHBlY3RlZCB2YWx1ZSwgcmV2aXNpb24gbWFzayAqLworCXsgIlBDODcxMDgiLCB7IDB4MTUwLCAweDM5OCwgMHhlYSB9LCAweDA1LCAweDEwLCAweGYwLCAKKwkgIG5zY19pcmNjX3Byb2JlXzEwOCwgbnNjX2lyY2NfaW5pdF8xMDggfSwKKwl7ICJQQzg3MzM4IiwgeyAweDM5OCwgMHgxNWMsIDB4MmUgfSwgMHgwOCwgMHhiMCwgMHhmOCwgCisJICBuc2NfaXJjY19wcm9iZV8zMzgsIG5zY19pcmNjX2luaXRfMzM4IH0sCisJLyogQ29udHJpYnV0ZWQgYnkgU3RlZmZlbiBQaW5nZWwgLSBJQk0gWDQwICovCisJeyAiUEM4NzM4eCIsIHsgMHgxNjRlLCAweDRlLCAweDAgfSwgMHgyMCwgMHhmNCwgMHhmZiwKKwkgIG5zY19pcmNjX3Byb2JlXzM5eCwgbnNjX2lyY2NfaW5pdF8zOXggfSwKKwkvKiBDb250cmlidXRlZCBieSBKYW4gRnJleSAtIElCTSBBMzAvQTMxICovCisJeyAiUEM4NzM5eCIsIHsgMHgyZSwgMHg0ZSwgMHgwIH0sIDB4MjAsIDB4ZWEsIDB4ZmYsIAorCSAgbnNjX2lyY2NfcHJvYmVfMzl4LCBuc2NfaXJjY19pbml0XzM5eCB9LAorCXsgTlVMTCB9Cit9OworCisvKiBNYXggNCBpbnN0YW5jZXMgZm9yIG5vdyAqLworc3RhdGljIHN0cnVjdCBuc2NfaXJjY19jYiAqZGV2X3NlbGZbXSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworCitzdGF0aWMgY2hhciAqZG9uZ2xlX3R5cGVzW10gPSB7CisJIkRpZmZlcmVudGlhbCBzZXJpYWwgaW50ZXJmYWNlIiwKKwkiRGlmZmVyZW50aWFsIHNlcmlhbCBpbnRlcmZhY2UiLAorCSJSZXNlcnZlZCIsCisJIlJlc2VydmVkIiwKKwkiU2hhcnAgUlk1SEQwMSIsCisJIlJlc2VydmVkIiwKKwkiU2luZ2xlLWVuZGVkIHNlcmlhbCBpbnRlcmZhY2UiLAorCSJDb25zdW1lci1JUiBvbmx5IiwKKwkiSFAgSFNETC0yMzAwLCBIUCBIU0RMLTM2MDAvSFNETC0zNjEwIiwKKwkiSUJNMzFUMTEwMCBvciBUZW1pYyBURkRTNjAwMC9URkRTNjUwMCIsCisJIlJlc2VydmVkIiwKKwkiUmVzZXJ2ZWQiLAorCSJIUCBIU0RMLTExMDAvSFNETC0yMTAwIiwKKwkiSFAgSFNETC0xMTAwL0hTREwtMjEwMCIsCisJIlN1cHBvcnRzIFNJUiBNb2RlIG9ubHkiLAorCSJObyBkb25nbGUgY29ubmVjdGVkIiwKK307CisKKy8qIFNvbWUgcHJvdG90eXBlcyAqLworc3RhdGljIGludCAgbnNjX2lyY2Nfb3BlbihpbnQgaSwgY2hpcGlvX3QgKmluZm8pOworc3RhdGljIGludCAgbnNjX2lyY2NfY2xvc2Uoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIG5zY19pcmNjX3NldHVwKGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyB2b2lkIG5zY19pcmNjX3Bpb19yZWNlaXZlKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50ICBuc2NfaXJjY19kbWFfcmVjZWl2ZShzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpOyAKK3N0YXRpYyBpbnQgIG5zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7CitzdGF0aWMgaW50ICBuc2NfaXJjY19oYXJkX3htaXRfc2lyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgbnNjX2lyY2NfaGFyZF94bWl0X2ZpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIG5zY19pcmNjX3Bpb193cml0ZShpbnQgaW9iYXNlLCBfX3U4ICpidWYsIGludCBsZW4sIGludCBmaWZvX3NpemUpOworc3RhdGljIHZvaWQgbnNjX2lyY2NfZG1hX3htaXQoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKTsKK3N0YXRpYyBfX3U4IG5zY19pcmNjX2NoYW5nZV9zcGVlZChzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYsIF9fdTMyIGJhdWQpOworc3RhdGljIGludCAgbnNjX2lyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50ICBuc2NfaXJjY19yZWFkX2RvbmdsZV9pZCAoaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZCBuc2NfaXJjY19pbml0X2RvbmdsZV9pbnRlcmZhY2UgKGludCBpb2Jhc2UsIGludCBkb25nbGVfaWQpOworCitzdGF0aWMgaW50ICBuc2NfaXJjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIG5zY19pcmNjX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIG5zY19pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnNjX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbnNjX2lyY2NfcG1wcm9jKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpOworCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfaW5pdCAoKQorICoKKyAqICAgIEluaXRpYWxpemUgY2hpcC4gSnVzdCB0cnkgdG8gZmluZCBvdXQgaG93IG1hbnkgY2hpcHMgd2UgYXJlIGRlYWxpbmcgd2l0aAorICogICAgYW5kIHdoZXJlIHRoZXkgYXJlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG5zY19pcmNjX2luaXQodm9pZCkKK3sKKwljaGlwaW9fdCBpbmZvOworCW5zY19jaGlwX3QgKmNoaXA7CisJaW50IHJldCA9IC1FTk9ERVY7CisJaW50IGNmZ19iYXNlOworCWludCBjZmcsIGlkOworCWludCByZWc7CisJaW50IGkgPSAwOworCisJLyogUHJvYmUgZm9yIGFsbCB0aGUgTlNDIGNoaXBzZXRzIHdlIGtub3cgYWJvdXQgKi8KKwlmb3IgKGNoaXA9Y2hpcHM7IGNoaXAtPm5hbWUgOyBjaGlwKyspIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgUHJvYmluZyBmb3IgJXMgLi4uXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBjaGlwLT5uYW1lKTsKKwkJCisJCS8qIFRyeSBhbGwgY29uZmlnIHJlZ2lzdGVycyBmb3IgdGhpcyBjaGlwICovCisJCWZvciAoY2ZnPTA7IGNmZzwzOyBjZmcrKykgeworCQkJY2ZnX2Jhc2UgPSBjaGlwLT5jZmdbY2ZnXTsKKwkJCWlmICghY2ZnX2Jhc2UpCisJCQkJY29udGludWU7CisJCQkKKwkJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGNoaXBpb190KSk7CisJCQlpbmZvLmNmZ19iYXNlID0gY2ZnX2Jhc2U7CisJCQlpbmZvLmZpcl9iYXNlID0gaW9baV07CisJCQlpbmZvLmRtYSA9IGRtYVtpXTsKKwkJCWluZm8uaXJxID0gaXJxW2ldOworCisJCQkvKiBSZWFkIGluZGV4IHJlZ2lzdGVyICovCisJCQlyZWcgPSBpbmIoY2ZnX2Jhc2UpOworCQkJaWYgKHJlZyA9PSAweGZmKSB7CisJCQkJSVJEQV9ERUJVRygyLCAiJXMoKSBubyBjaGlwIGF0IDB4JTAzeFxuIiwgX19GVU5DVElPTl9fLCBjZmdfYmFzZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkKKwkJCS8qIFJlYWQgY2hpcCBpZGVudGlmaWNhdGlvbiByZWdpc3RlciAqLworCQkJb3V0YihjaGlwLT5jaWRfaW5kZXgsIGNmZ19iYXNlKTsKKwkJCWlkID0gaW5iKGNmZ19iYXNlKzEpOworCQkJaWYgKChpZCAmIGNoaXAtPmNpZF9tYXNrKSA9PSBjaGlwLT5jaWRfdmFsdWUpIHsKKwkJCQlJUkRBX0RFQlVHKDIsICIlcygpIEZvdW5kICVzIGNoaXAsIHJldmlzaW9uPSVkXG4iLAorCQkJCQkgICBfX0ZVTkNUSU9OX18sIGNoaXAtPm5hbWUsIGlkICYgfmNoaXAtPmNpZF9tYXNrKTsKKwkJCQkvKiAKKwkJCQkgKiBJZiB0aGUgdXNlciBzdXBwbGllcyB0aGUgYmFzZSBhZGRyZXNzLCB0aGVuCisJCQkJICogd2UgaW5pdCB0aGUgY2hpcCwgaWYgbm90IHdlIHByb2JlIHRoZSB2YWx1ZXMKKwkJCQkgKiBzZXQgYnkgdGhlIEJJT1MKKwkJCQkgKi8JCQkJCisJCQkJaWYgKGlvW2ldIDwgMHgyMDAwKSB7CisJCQkJCWNoaXAtPmluaXQoY2hpcCwgJmluZm8pOworCQkJCX0gZWxzZQorCQkJCQljaGlwLT5wcm9iZShjaGlwLCAmaW5mbyk7CisKKwkJCQlpZiAobnNjX2lyY2Nfb3BlbihpLCAmaW5mbykgPT0gMCkKKwkJCQkJcmV0ID0gMDsKKwkJCQlpKys7CisJCQl9IGVsc2UgeworCQkJCUlSREFfREVCVUcoMiwgIiVzKCksIFdyb25nIGNoaXAgaWQ9MHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGlkKTsKKwkJCX0KKwkJfSAKKwkJCisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2NsZWFudXAgKCkKKyAqCisgKiAgICBDbG9zZSBhbGwgY29uZmlndXJlZCBjaGlwcworICoKKyAqLworc3RhdGljIHZvaWQgX19leGl0IG5zY19pcmNjX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCXBtX3VucmVnaXN0ZXJfYWxsKG5zY19pcmNjX3BtcHJvYyk7CisKKwlmb3IgKGk9MDsgaSA8IDQ7IGkrKykgeworCQlpZiAoZGV2X3NlbGZbaV0pCisJCQluc2NfaXJjY19jbG9zZShkZXZfc2VsZltpXSk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2Nfb3BlbiAoaW9iYXNlLCBpcnEpCisgKgorICogICAgT3BlbiBkcml2ZXIgaW5zdGFuY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG5zY19pcmNjX29wZW4oaW50IGksIGNoaXBpb190ICppbmZvKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5zY19pcmNjX2NiICpzZWxmOworICAgICAgICBzdHJ1Y3QgcG1fZGV2ICpwbWRldjsKKwl2b2lkICpyZXQ7CisJaW50IGVycjsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX01FU1NBR0UoIiVzLCBGb3VuZCBjaGlwIGF0IGJhc2U9MHglMDN4XG4iLCBkcml2ZXJfbmFtZSwKKwkJICAgICBpbmZvLT5jZmdfYmFzZSk7CisKKwlpZiAoKG5zY19pcmNjX3NldHVwKGluZm8pKSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCisJSVJEQV9NRVNTQUdFKCIlcywgZHJpdmVyIGxvYWRlZCAoRGFnIEJyYXR0bGkpXG4iLCBkcml2ZXJfbmFtZSk7CisKKwlkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZihzdHJ1Y3QgbnNjX2lyY2NfY2IpKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCQkgICAiY29udHJvbCBibG9jayFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNlbGYgPSBkZXYtPnByaXY7CisJc2VsZi0+bmV0ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzZWxmLT5sb2NrKTsKKyAgIAorCS8qIE5lZWQgdG8gc3RvcmUgc2VsZiBzb21ld2hlcmUgKi8KKwlkZXZfc2VsZltpXSA9IHNlbGY7CisJc2VsZi0+aW5kZXggPSBpOworCisJLyogSW5pdGlhbGl6ZSBJTyAqLworCXNlbGYtPmlvLmNmZ19iYXNlICA9IGluZm8tPmNmZ19iYXNlOworCXNlbGYtPmlvLmZpcl9iYXNlICA9IGluZm8tPmZpcl9iYXNlOworICAgICAgICBzZWxmLT5pby5pcnEgICAgICAgPSBpbmZvLT5pcnE7CisgICAgICAgIHNlbGYtPmlvLmZpcl9leHQgICA9IENISVBfSU9fRVhURU5UOworICAgICAgICBzZWxmLT5pby5kbWEgICAgICAgPSBpbmZvLT5kbWE7CisgICAgICAgIHNlbGYtPmlvLmZpZm9fc2l6ZSA9IDMyOworCQorCS8qIFJlc2VydmUgdGhlIGlvcG9ydHMgdGhhdCB3ZSBuZWVkICovCisJcmV0ID0gcmVxdWVzdF9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQsIGRyaXZlcl9uYW1lKTsKKwlpZiAoIXJldCkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGNhbid0IGdldCBpb2Jhc2Ugb2YgMHglMDN4XG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLmZpcl9iYXNlKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXQxOworCX0KKworCS8qIEluaXRpYWxpemUgUW9TIGZvciB0aGlzIGRldmljZSAqLworCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnNlbGYtPnFvcyk7CisJCisJLyogVGhlIG9ubHkgdmFsdWUgd2UgbXVzdCBvdmVycmlkZSBpdCB0aGUgYmF1ZHJhdGUgKi8KKwlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfAorCQlJUl8xMTUyMDB8SVJfNTc2MDAwfElSXzExNTIwMDAgfChJUl80MDAwMDAwIDw8IDgpOworCQorCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSBxb3NfbXR0X2JpdHM7CisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmc2VsZi0+cW9zKTsKKwkKKwkvKiBNYXggRE1BIGJ1ZmZlciBzaXplIG5lZWRlZCA9IChkYXRhX3NpemUgKyA2KSAqICh3aW5kb3dfc2l6ZSkgKyA2OyAqLworCXNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgPSAxNDM4NDsgCisJc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSA9IDE0Mzg0OworCisJLyogQWxsb2NhdGUgbWVtb3J5IGlmIG5lZWRlZCAqLworCXNlbGYtPnJ4X2J1ZmYuaGVhZCA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgICZzZWxmLT5yeF9idWZmX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlbGYtPnJ4X2J1ZmYuaGVhZCA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0MjsKKworCX0KKwltZW1zZXQoc2VsZi0+cnhfYnVmZi5oZWFkLCAwLCBzZWxmLT5yeF9idWZmLnRydWVzaXplKTsKKwkKKwlzZWxmLT50eF9idWZmLmhlYWQgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgICAmc2VsZi0+dHhfYnVmZl9kbWEsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT50eF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDM7CisJfQorCW1lbXNldChzZWxmLT50eF9idWZmLmhlYWQsIDAsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOworCisJc2VsZi0+cnhfYnVmZi5pbl9mcmFtZSA9IEZBTFNFOworCXNlbGYtPnJ4X2J1ZmYuc3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CisJCisJLyogUmVzZXQgVHggcXVldWUgaW5mbyAqLworCXNlbGYtPnR4X2ZpZm8ubGVuID0gc2VsZi0+dHhfZmlmby5wdHIgPSBzZWxmLT50eF9maWZvLmZyZWUgPSAwOworCXNlbGYtPnR4X2ZpZm8udGFpbCA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKworCS8qIE92ZXJyaWRlIHRoZSBuZXR3b3JrIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIHVzZSAqLworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG5zY19pcmNjX2hhcmRfeG1pdF9zaXI7CisJZGV2LT5vcGVuICAgICAgICAgICAgPSBuc2NfaXJjY19uZXRfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICA9IG5zY19pcmNjX25ldF9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsICAgICAgICA9IG5zY19pcmNjX25ldF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cwkgICAgID0gbnNjX2lyY2NfbmV0X2dldF9zdGF0czsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXQ0OworCX0KKwlJUkRBX01FU1NBR0UoIklyREE6IFJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCisJLyogQ2hlY2sgaWYgdXNlciBoYXMgc3VwcGxpZWQgYSB2YWxpZCBkb25nbGUgaWQgb3Igbm90ICovCisJaWYgKChkb25nbGVfaWQgPD0gMCkgfHwKKwkgICAgKGRvbmdsZV9pZCA+PSAoc2l6ZW9mKGRvbmdsZV90eXBlcykgLyBzaXplb2YoZG9uZ2xlX3R5cGVzWzBdKSkpICkgeworCQlkb25nbGVfaWQgPSBuc2NfaXJjY19yZWFkX2RvbmdsZV9pZChzZWxmLT5pby5maXJfYmFzZSk7CisJCQorCQlJUkRBX01FU1NBR0UoIiVzLCBGb3VuZCBkb25nbGU6ICVzXG4iLCBkcml2ZXJfbmFtZSwKKwkJCSAgICAgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOworCX0gZWxzZSB7CisJCUlSREFfTUVTU0FHRSgiJXMsIFVzaW5nIGRvbmdsZTogJXNcbiIsIGRyaXZlcl9uYW1lLAorCQkJICAgICBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7CisJfQorCQorCXNlbGYtPmlvLmRvbmdsZV9pZCA9IGRvbmdsZV9pZDsKKwluc2NfaXJjY19pbml0X2RvbmdsZV9pbnRlcmZhY2Uoc2VsZi0+aW8uZmlyX2Jhc2UsIGRvbmdsZV9pZCk7CisKKyAgICAgICAgcG1kZXYgPSBwbV9yZWdpc3RlcihQTV9TWVNfREVWLCBQTV9TWVNfSVJEQSwgbnNjX2lyY2NfcG1wcm9jKTsKKyAgICAgICAgaWYgKHBtZGV2KQorICAgICAgICAgICAgICAgIHBtZGV2LT5kYXRhID0gc2VsZjsKKworCXJldHVybiAwOworIG91dDQ6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCSAgc2VsZi0+dHhfYnVmZi5oZWFkLCBzZWxmLT50eF9idWZmX2RtYSk7Cisgb3V0MzoKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKyBvdXQyOgorCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKyBvdXQxOgorCWZyZWVfbmV0ZGV2KGRldik7CisJZGV2X3NlbGZbaV0gPSBOVUxMOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19jbG9zZSAoc2VsZikKKyAqCisgKiAgICBDbG9zZSBkcml2ZXIgaW5zdGFuY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19leGl0IG5zY19pcmNjX2Nsb3NlKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKyAgICAgICAgaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBSZW1vdmUgbmV0ZGV2aWNlICovCisJdW5yZWdpc3Rlcl9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKworCS8qIFJlbGVhc2UgdGhlIFBPUlQgdGhhdCB0aGlzIGRyaXZlciBpcyB1c2luZyAqLworCUlSREFfREVCVUcoNCwgIiVzKCksIFJlbGVhc2luZyBSZWdpb24gJTAzeFxuIiwgCisJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uZmlyX2Jhc2UpOworCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKworCWlmIChzZWxmLT50eF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKwkKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkKQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CisKKwlkZXZfc2VsZltzZWxmLT5pbmRleF0gPSBOVUxMOworCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19pbml0XzEwOCAoaW9iYXNlLCBjZmdfYmFzZSwgaXJxLCBkbWEpCisgKgorICogICAgSW5pdGlhbGl6ZSB0aGUgTlNDICcxMDggY2hpcAorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19pbml0XzEwOChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykKK3sKKwlpbnQgY2ZnX2Jhc2UgPSBpbmZvLT5jZmdfYmFzZTsKKwlfX3U4IHRlbXA9MDsKKworCW91dGIoMiwgY2ZnX2Jhc2UpOyAgICAgIC8qIE1vZGUgQ29udHJvbCBSZWdpc3RlciAoTUNUTCkgKi8KKwlvdXRiKDB4MDAsIGNmZ19iYXNlKzEpOyAvKiBEaXNhYmxlIGRldmljZSAqLworCQorCS8qIEJhc2UgQWRkcmVzcyBhbmQgSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKEJBSUMpICovCisJb3V0YihDRkdfMTA4X0JBSUMsIGNmZ19iYXNlKTsKKwlzd2l0Y2ggKGluZm8tPmZpcl9iYXNlKSB7CisJY2FzZSAweDNlODogb3V0YigweDE0LCBjZmdfYmFzZSsxKTsgYnJlYWs7CisJY2FzZSAweDJlODogb3V0YigweDE1LCBjZmdfYmFzZSsxKTsgYnJlYWs7CisJY2FzZSAweDNmODogb3V0YigweDE2LCBjZmdfYmFzZSsxKTsgYnJlYWs7CisJY2FzZSAweDJmODogb3V0YigweDE3LCBjZmdfYmFzZSsxKTsgYnJlYWs7CisJZGVmYXVsdDogSVJEQV9FUlJPUigiJXMoKSwgaW52YWxpZCBiYXNlX2FkZHJlc3MiLCBfX0ZVTkNUSU9OX18pOworCX0KKwkKKwkvKiBDb250cm9sIFNpZ25hbCBSb3V0aW5nIFJlZ2lzdGVyIChDU1JUKSAqLworCXN3aXRjaCAoaW5mby0+aXJxKSB7CisJY2FzZSAzOiAgdGVtcCA9IDB4MDE7IGJyZWFrOworCWNhc2UgNDogIHRlbXAgPSAweDAyOyBicmVhazsKKwljYXNlIDU6ICB0ZW1wID0gMHgwMzsgYnJlYWs7CisJY2FzZSA3OiAgdGVtcCA9IDB4MDQ7IGJyZWFrOworCWNhc2UgOTogIHRlbXAgPSAweDA1OyBicmVhazsKKwljYXNlIDExOiB0ZW1wID0gMHgwNjsgYnJlYWs7CisJY2FzZSAxNTogdGVtcCA9IDB4MDc7IGJyZWFrOworCWRlZmF1bHQ6IElSREFfRVJST1IoIiVzKCksIGludmFsaWQgaXJxIiwgX19GVU5DVElPTl9fKTsKKwl9CisJb3V0YihDRkdfMTA4X0NTUlQsIGNmZ19iYXNlKTsKKwkKKwlzd2l0Y2ggKGluZm8tPmRtYSkgewkKKwljYXNlIDA6IG91dGIoMHgwOCt0ZW1wLCBjZmdfYmFzZSsxKTsgYnJlYWs7CisJY2FzZSAxOiBvdXRiKDB4MTArdGVtcCwgY2ZnX2Jhc2UrMSk7IGJyZWFrOworCWNhc2UgMzogb3V0YigweDE4K3RlbXAsIGNmZ19iYXNlKzEpOyBicmVhazsKKwlkZWZhdWx0OiBJUkRBX0VSUk9SKCIlcygpLCBpbnZhbGlkIGRtYSIsIF9fRlVOQ1RJT05fXyk7CisJfQorCQorCW91dGIoQ0ZHXzEwOF9NQ1RMLCBjZmdfYmFzZSk7ICAgICAgLyogTW9kZSBDb250cm9sIFJlZ2lzdGVyIChNQ1RMKSAqLworCW91dGIoMHgwMywgY2ZnX2Jhc2UrMSk7IC8qIEVuYWJsZSBkZXZpY2UgKi8KKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfcHJvYmVfMTA4IChjaGlwLCBpbmZvKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19wcm9iZV8xMDgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pIAoreworCWludCBjZmdfYmFzZSA9IGluZm8tPmNmZ19iYXNlOworCWludCByZWc7CisKKwkvKiBSZWFkIGFkZHJlc3MgYW5kIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyIChCQUlDKSAqLworCW91dGIoQ0ZHXzEwOF9CQUlDLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCQorCXN3aXRjaCAocmVnICYgMHgwMykgeworCWNhc2UgMDoKKwkJaW5mby0+ZmlyX2Jhc2UgPSAweDNlODsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpbmZvLT5maXJfYmFzZSA9IDB4MmU4OworCQlicmVhazsKKwljYXNlIDI6CisJCWluZm8tPmZpcl9iYXNlID0gMHgzZjg7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaW5mby0+ZmlyX2Jhc2UgPSAweDJmODsKKwkJYnJlYWs7CisJfQorCWluZm8tPnNpcl9iYXNlID0gaW5mby0+ZmlyX2Jhc2U7CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcHJvYmluZyBmaXJfYmFzZT0weCUwM3hcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgaW5mby0+ZmlyX2Jhc2UpOworCisJLyogUmVhZCBjb250cm9sIHNpZ25hbHMgcm91dGluZyByZWdpc3RlciAoQ1NSVCkgKi8KKwlvdXRiKENGR18xMDhfQ1NSVCwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKworCXN3aXRjaCAocmVnICYgMHgwNykgeworCWNhc2UgMDoKKwkJaW5mby0+aXJxID0gLTE7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaW5mby0+aXJxID0gMzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbmZvLT5pcnEgPSA0OworCQlicmVhazsKKwljYXNlIDM6CisJCWluZm8tPmlycSA9IDU7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaW5mby0+aXJxID0gNzsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlpbmZvLT5pcnEgPSA5OworCQlicmVhazsKKwljYXNlIDY6CisJCWluZm8tPmlycSA9IDExOworCQlicmVhazsKKwljYXNlIDc6CisJCWluZm8tPmlycSA9IDE1OworCQlicmVhazsKKwl9CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcHJvYmluZyBpcnE9JWRcbiIsIF9fRlVOQ1RJT05fXywgaW5mby0+aXJxKTsKKworCS8qIEN1cnJlbnRseSB3ZSBvbmx5IHJlYWQgUnggRE1BIGJ1dCBpdCB3aWxsIGFsc28gYmUgdXNlZCBmb3IgVHggKi8KKwlzd2l0Y2ggKChyZWcgPj4gMykgJiAweDAzKSB7CisJY2FzZSAwOgorCQlpbmZvLT5kbWEgPSAtMTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpbmZvLT5kbWEgPSAwOworCQlicmVhazsKKwljYXNlIDI6CisJCWluZm8tPmRtYSA9IDE7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaW5mby0+ZG1hID0gMzsKKwkJYnJlYWs7CisJfQorCUlSREFfREVCVUcoMiwgIiVzKCksIHByb2JpbmcgZG1hPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGluZm8tPmRtYSk7CisKKwkvKiBSZWFkIG1vZGUgY29udHJvbCByZWdpc3RlciAoTUNUTCkgKi8KKwlvdXRiKENGR18xMDhfTUNUTCwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKworCWluZm8tPmVuYWJsZWQgPSByZWcgJiAweDAxOworCWluZm8tPnN1c3BlbmRlZCA9ICEoKHJlZyA+PiAxKSAmIDB4MDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19pbml0XzMzOCAoY2hpcCwgaW5mbykKKyAqCisgKiAgICBJbml0aWFsaXplIHRoZSBOU0MgJzMzOCBjaGlwLiBSZW1lbWJlciB0aGF0IHRoZSA4NzMzOCBuZWVkcyB0d28gCisgKiAgICBjb25zZWN1dGl2ZSB3cml0ZXMgdG8gdGhlIGRhdGEgcmVnaXN0ZXJzIHdoaWxlIENQVSBpbnRlcnJ1cHRzIGFyZQorICogICAgZGlzYWJsZWQuIFRoZSA5NzMzOCBkb2VzIG5vdCByZXF1aXJlIHRoaXMsIGJ1dCBzaG91bGRuJ3QgYmUgYW55CisgKiAgICBoYXJtIGlmIHdlIGRvIGl0IGFueXdheS4KKyAqLworc3RhdGljIGludCBuc2NfaXJjY19pbml0XzMzOChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykgCit7CisJLyogTm8gaW5pdCB5ZXQgKi8KKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX3Byb2JlXzMzOCAoY2hpcCwgaW5mbykKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfcHJvYmVfMzM4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKSAKK3sKKwlpbnQgY2ZnX2Jhc2UgPSBpbmZvLT5jZmdfYmFzZTsKKwlpbnQgcmVnLCBjb20gPSAwOworCWludCBwbnA7CisKKwkvKiBSZWFkIGZ1bnRpb24gZW5hYmxlIHJlZ2lzdGVyIChGRVIpICovCisJb3V0YihDRkdfMzM4X0ZFUiwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKworCWluZm8tPmVuYWJsZWQgPSAocmVnID4+IDIpICYgMHgwMTsKKworCS8qIENoZWNrIGlmIHdlIGFyZSBpbiBMZWdhY3kgb3IgUG5QIG1vZGUgKi8KKwlvdXRiKENGR18zMzhfUE5QMCwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKwkKKwlwbnAgPSAocmVnID4+IDMpICYgMHgwMTsKKwlpZiAocG5wKSB7CisJCUlSREFfREVCVUcoMiwgIigpLCBDaGlwIGlzIGluIFBuUCBtb2RlXG4iKTsKKwkJb3V0YigweDQ2LCBjZmdfYmFzZSk7CisJCXJlZyA9IChpbmIoY2ZnX2Jhc2UrMSkgJiAweGZlKSA8PCAyOworCisJCW91dGIoMHg0NywgY2ZnX2Jhc2UpOworCQlyZWcgfD0gKChpbmIoY2ZnX2Jhc2UrMSkgJiAweGZjKSA8PCA4KTsKKworCQlpbmZvLT5maXJfYmFzZSA9IHJlZzsKKwl9IGVsc2UgeworCQkvKiBSZWFkIGZ1bmN0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgKEZBUikgKi8KKwkJb3V0YihDRkdfMzM4X0ZBUiwgY2ZnX2Jhc2UpOworCQlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJCQorCQlzd2l0Y2ggKChyZWcgPj4gNCkgJiAweDAzKSB7CisJCWNhc2UgMDoKKwkJCWluZm8tPmZpcl9iYXNlID0gMHgzZjg7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaW5mby0+ZmlyX2Jhc2UgPSAweDJmODsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQljb20gPSAzOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWNvbSA9IDQ7CisJCQlicmVhazsKKwkJfQorCQkKKwkJaWYgKGNvbSkgeworCQkJc3dpdGNoICgocmVnID4+IDYpICYgMHgwMykgeworCQkJY2FzZSAwOgorCQkJCWlmIChjb20gPT0gMykKKwkJCQkJaW5mby0+ZmlyX2Jhc2UgPSAweDNlODsKKwkJCQllbHNlCisJCQkJCWluZm8tPmZpcl9iYXNlID0gMHgyZTg7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJaWYgKGNvbSA9PSAzKQorCQkJCQlpbmZvLT5maXJfYmFzZSA9IDB4MzM4OworCQkJCWVsc2UKKwkJCQkJaW5mby0+ZmlyX2Jhc2UgPSAweDIzODsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlpZiAoY29tID09IDMpCisJCQkJCWluZm8tPmZpcl9iYXNlID0gMHgyZTg7CisJCQkJZWxzZQorCQkJCQlpbmZvLT5maXJfYmFzZSA9IDB4MmUwOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWlmIChjb20gPT0gMykKKwkJCQkJaW5mby0+ZmlyX2Jhc2UgPSAweDIyMDsKKwkJCQllbHNlCisJCQkJCWluZm8tPmZpcl9iYXNlID0gMHgyMjg7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaW5mby0+c2lyX2Jhc2UgPSBpbmZvLT5maXJfYmFzZTsKKworCS8qIFJlYWQgUG5QIHJlZ2lzdGVyIDEgKFBOUDEpICovCisJb3V0YihDRkdfMzM4X1BOUDEsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJCisJaW5mby0+aXJxID0gcmVnID4+IDQ7CisJCisJLyogUmVhZCBQblAgcmVnaXN0ZXIgMyAoUE5QMykgKi8KKwlvdXRiKENGR18zMzhfUE5QMywgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKworCWluZm8tPmRtYSA9IChyZWcgJiAweDA3KSAtIDE7CisKKwkvKiBSZWFkIHBvd2VyIGFuZCB0ZXN0IHJlZ2lzdGVyIChQVFIpICovCisJb3V0YihDRkdfMzM4X1BUUiwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKworCWluZm8tPnN1c3BlbmRlZCA9IHJlZyAmIDB4MDE7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfaW5pdF8zOXggKGNoaXAsIGluZm8pCisgKgorICogICAgTm93IHRoYXQgd2Uga25vdyBpdCdzIGEgJzM5eCAoc2VlIHByb2JlIGJlbG93KSwgd2UgbmVlZCB0bworICogICAgY29uZmlndXJlIGl0IHNvIHdlIGNhbiB1c2UgaXQuCisgKgorICogVGhlIE5TQyAnMzM4IGNoaXAgaXMgYSBTdXBlciBJL08gY2hpcCB3aXRoIGEgImJhbmsiIGFyY2hpdGVjdHVyZSwKKyAqIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBkaWZmZXJlbnQgZnVuY3Rpb25hbGl0eSAoc2VyaWFsLCBwYXJhbGxlbCwKKyAqIGZsb3BweS4uLikgYXJlIGVhY2ggaW4gYSBkaWZmZXJlbnQgYmFuayAoTG9naWNhbCBEZXZpY2UgTnVtYmVyKS4KKyAqIFRoZSBiYXNlIGFkZHJlc3MsIGlycSBhbmQgZG1hIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGFyZSBjb21tb24KKyAqIHRvIGFsbCBmdW5jdGlvbmFsaXRpZXMgKGluZGV4IDB4MzAgdG8gMHg3RikuCisgKiBUaGVyZSBpcyBvbmx5IG9uZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHNwZWNpZmljIHRvIHRoZQorICogc2VyaWFsIHBvcnQsIENGR18zOVhfU1BDLgorICogSmVhbklJCisgKgorICogTm90ZSA6IHRoaXMgY29kZSB3YXMgd3JpdHRlbiBieSBKYW4gRnJleSA8amFuZnJleUB3ZWIuZGU+CisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfaW5pdF8zOXgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pIAoreworCWludCBjZmdfYmFzZSA9IGluZm8tPmNmZ19iYXNlOworCWludCBlbmFibGVkOworCisJLyogVXNlciBpcyBzaHVyZSBhYm91dCBoaXMgY29uZmlnLi4uIGFjY2VwdCBpdC4gKi8KKwlJUkRBX0RFQlVHKDIsICIlcygpOiBuc2NfaXJjY19pbml0XzM5eCAodXNlciBzZXR0aW5ncyk6ICIKKwkJICAgImlvPTB4JTA0eCwgaXJxPSVkLCBkbWE9JWRcbiIsIAorCQkgICBfX0ZVTkNUSU9OX18sIGluZm8tPmZpcl9iYXNlLCBpbmZvLT5pcnEsIGluZm8tPmRtYSk7CisKKwkvKiBBY2Nlc3MgYmFuayBmb3IgU1AyICovCisJb3V0YihDRkdfMzlYX0xETiwgY2ZnX2Jhc2UpOworCW91dGIoMHgwMiwgY2ZnX2Jhc2UrMSk7CisKKwkvKiBDb25maWd1cmUgU1AyICovCisKKwkvKiBXZSB3YW50IHRvIGVuYWJsZSB0aGUgZGV2aWNlIGlmIG5vdCBlbmFibGVkICovCisJb3V0YihDRkdfMzlYX0FDVCwgY2ZnX2Jhc2UpOworCWVuYWJsZWQgPSBpbmIoY2ZnX2Jhc2UrMSkgJiAweDAxOworCQorCWlmICghZW5hYmxlZCkgeworCQkvKiBFbmFibGUgdGhlIGRldmljZSAqLworCQlvdXRiKENGR18zOVhfU0lPQ0YxLCBjZmdfYmFzZSk7CisJCW91dGIoMHgwMSwgY2ZnX2Jhc2UrMSk7CisJCS8qIE1heSB3YW50IHRvIHVwZGF0ZSBpbmZvLT5lbmFibGVkLiBKZWFuIElJICovCisJfQorCisJLyogRW5hYmxlIFVBUlQgYmFuayBzd2l0Y2hpbmcgKGJpdCA3KSA7IFNldHMgdGhlIGNoaXAgdG8gbm9ybWFsCisJICogcG93ZXIgbW9kZSAod2FrZSB1cCBmcm9tIHNsZWVwIG1vZGUpIChiaXQgMSkgKi8KKwlvdXRiKENGR18zOVhfU1BDLCBjZmdfYmFzZSk7CisJb3V0YigweDgyLCBjZmdfYmFzZSsxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfcHJvYmVfMzl4IChjaGlwLCBpbmZvKQorICoKKyAqICAgIFRlc3QgaWYgd2UgcmVhbGx5IGhhdmUgYSAnMzl4IGNoaXAgYXQgdGhlIGdpdmVuIGFkZHJlc3MKKyAqCisgKiBOb3RlIDogdGhpcyBjb2RlIHdhcyB3cml0dGVuIGJ5IEphbiBGcmV5IDxqYW5mcmV5QHdlYi5kZT4KKyAqLworc3RhdGljIGludCBuc2NfaXJjY19wcm9iZV8zOXgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pIAoreworCWludCBjZmdfYmFzZSA9IGluZm8tPmNmZ19iYXNlOworCWludCByZWcxLCByZWcyLCBpcnEsIGlycXQsIGRtYTEsIGRtYTI7CisJaW50IGVuYWJsZWQsIHN1c3A7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBuc2NfaXJjY19wcm9iZV8zOXgsIGJhc2U9JWRcbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgY2ZnX2Jhc2UpOworCisJLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgd2l0aCBpcnEgb2ZmIHRvIGF2b2lkCisJICogYW5vdGhlciBkcml2ZXIgbWVzc2luZyB3aXRoIHRoZSBTdXBlciBJL08gYmFuayAtIEplYW4gSUkgKi8KKworCS8qIEFjY2VzcyBiYW5rIGZvciBTUDIgKi8KKwlvdXRiKENGR18zOVhfTEROLCBjZmdfYmFzZSk7CisJb3V0YigweDAyLCBjZmdfYmFzZSsxKTsKKworCS8qIFJlYWQgaW5mb3MgYWJvdXQgU1AyIDsgc3RvcmUgaW4gaW5mbyBzdHJ1Y3QgKi8KKwlvdXRiKENGR18zOVhfQkFTRUgsIGNmZ19iYXNlKTsKKwlyZWcxID0gaW5iKGNmZ19iYXNlKzEpOworCW91dGIoQ0ZHXzM5WF9CQVNFTCwgY2ZnX2Jhc2UpOworCXJlZzIgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJaW5mby0+ZmlyX2Jhc2UgPSAocmVnMSA8PCA4KSB8IHJlZzI7CisKKwlvdXRiKENGR18zOVhfSVJRTlVNLCBjZmdfYmFzZSk7CisJaXJxID0gaW5iKGNmZ19iYXNlKzEpOworCW91dGIoQ0ZHXzM5WF9JUlFTRUwsIGNmZ19iYXNlKTsKKwlpcnF0ID0gaW5iKGNmZ19iYXNlKzEpOworCWluZm8tPmlycSA9IGlycTsKKworCW91dGIoQ0ZHXzM5WF9ETUEwLCBjZmdfYmFzZSk7CisJZG1hMSA9IGluYihjZmdfYmFzZSsxKTsKKwlvdXRiKENGR18zOVhfRE1BMSwgY2ZnX2Jhc2UpOworCWRtYTIgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJaW5mby0+ZG1hID0gZG1hMSAtMTsKKworCW91dGIoQ0ZHXzM5WF9BQ1QsIGNmZ19iYXNlKTsKKwlpbmZvLT5lbmFibGVkID0gZW5hYmxlZCA9IGluYihjZmdfYmFzZSsxKSAmIDB4MDE7CisJCisJb3V0YihDRkdfMzlYX1NQQywgY2ZnX2Jhc2UpOworCXN1c3AgPSAxIC0gKChpbmIoY2ZnX2Jhc2UrMSkgJiAweDAyKSA+PiAxKTsKKworCUlSREFfREVCVUcoMiwgIiVzKCk6IGlvPTB4JTAyeCUwMngsIGlycT0lZCAodHlwZSAlZCksIHJ4ZG1hPSVkLCB0eGRtYT0lZCwgZW5hYmxlZD0lZCAoc3VzcGVuZGVkPSVkKVxuIiwgX19GVU5DVElPTl9fLCByZWcxLHJlZzIsaXJxLGlycXQsZG1hMSxkbWEyLGVuYWJsZWQsc3VzcCk7CisKKwkvKiBDb25maWd1cmUgU1AyICovCisKKwkvKiBXZSB3YW50IHRvIGVuYWJsZSB0aGUgZGV2aWNlIGlmIG5vdCBlbmFibGVkICovCisJb3V0YihDRkdfMzlYX0FDVCwgY2ZnX2Jhc2UpOworCWVuYWJsZWQgPSBpbmIoY2ZnX2Jhc2UrMSkgJiAweDAxOworCQorCWlmICghZW5hYmxlZCkgeworCQkvKiBFbmFibGUgdGhlIGRldmljZSAqLworCQlvdXRiKENGR18zOVhfU0lPQ0YxLCBjZmdfYmFzZSk7CisJCW91dGIoMHgwMSwgY2ZnX2Jhc2UrMSk7CisJCS8qIE1heSB3YW50IHRvIHVwZGF0ZSBpbmZvLT5lbmFibGVkLiBKZWFuIElJICovCisJfQorCisJLyogRW5hYmxlIFVBUlQgYmFuayBzd2l0Y2hpbmcgKGJpdCA3KSA7IFNldHMgdGhlIGNoaXAgdG8gbm9ybWFsCisJICogcG93ZXIgbW9kZSAod2FrZSB1cCBmcm9tIHNsZWVwIG1vZGUpIChiaXQgMSkgKi8KKwlvdXRiKENGR18zOVhfU1BDLCBjZmdfYmFzZSk7CisJb3V0YigweDgyLCBjZmdfYmFzZSsxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2Nfc2V0dXAgKGluZm8pCisgKgorICogICAgUmV0dXJucyBub24tbmVnYXRpdmUgb24gc3VjY2Vzcy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2Nfc2V0dXAoY2hpcGlvX3QgKmluZm8pCit7CisJaW50IHZlcnNpb247CisJaW50IGlvYmFzZSA9IGluZm8tPmZpcl9iYXNlOworCisJLyogUmVhZCB0aGUgTW9kdWxlIElEICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMyk7CisJdmVyc2lvbiA9IGluYihpb2Jhc2UrTUlEKTsKKworCUlSREFfREVCVUcoMiwgIiVzKCkgRHJpdmVyICVzIEZvdW5kIGNoaXAgdmVyc2lvbiAlMDJ4XG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIGRyaXZlcl9uYW1lLCB2ZXJzaW9uKTsKKworCS8qIFNob3VsZCBiZSAweDI/ICovCisJaWYgKDB4MjAgIT0gKHZlcnNpb24gJiAweGYwKSkgeworCQlJUkRBX0VSUk9SKCIlcywgV3JvbmcgY2hpcCB2ZXJzaW9uICUwMnhcbiIsCisJCQkgICBkcml2ZXJfbmFtZSwgdmVyc2lvbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBTd2l0Y2ggdG8gYWR2YW5jZWQgbW9kZSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCW91dGIoRUNSMV9FWFRfU0wsIGlvYmFzZStFQ1IxKTsKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwkKKwkvKiBTZXQgRklGTyB0aHJlc2hvbGQgdG8gVFgxNywgUlgxNiwgcmVzZXQgYW5kIGVuYWJsZSBGSUZPJ3MgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKEZDUl9SWFRIfEZDUl9UWFRIfEZDUl9UWFNSfEZDUl9SWFNSfEZDUl9GSUZPX0VOLCBpb2Jhc2UrRkNSKTsKKworCW91dGIoMHgwMywgaW9iYXNlK0xDUik7IAkvKiA4IGJpdCB3b3JkIGxlbmd0aCAqLworCW91dGIoTUNSX1NJUiwgaW9iYXNlK01DUik7IAkvKiBTdGFydCBhdCBTSVItbW9kZSwgYWxzbyBjbGVhcnMgTFNSKi8KKworCS8qIFNldCBGSUZPIHNpemUgdG8gMzIgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwlvdXRiKEVYQ1IyX1JGU0lafEVYQ1IyX1RGU0laLCBpb2Jhc2UrRVhDUjIpOworCisJLyogSVJDUjI6IEZFTkRfTUQgaXMgbm90IHNldCAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzUpOworIAlvdXRiKDB4MDIsIGlvYmFzZSs0KTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHNvbWUgZGVmYXVsdHMgYXJlIE9LICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LNik7CisJb3V0YigweDIwLCBpb2Jhc2UrMCk7IC8qIFNldCAzMiBiaXRzIEZJUiBDUkMgKi8KKwlvdXRiKDB4MGEsIGlvYmFzZSsxKTsgLyogU2V0IE1JUiBwdWxzZSB3aWR0aCAqLworCW91dGIoMHgwZCwgaW9iYXNlKzIpOyAvKiBTZXQgU0lSIHB1bHNlIHdpZHRoIHRvIDEuNnVzICovCisJb3V0YigweDJhLCBpb2Jhc2UrNCk7IC8qIFNldCBiZWdpbm5pbmcgZnJhZywgYW5kIHByZWFtYmxlIGxlbmd0aCAqLworCisJLyogRW5hYmxlIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoSUVSX1JYSERMX0lFLCBpb2Jhc2UrSUVSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfcmVhZF9kb25nbGVfaWQgKHZvaWQpCisgKgorICogVHJ5IHRvIHJlYWQgZG9uZ2xlIGluZGVudGlmaWNhdGlvbi4gVGhpcyBwcm9jZWR1cmUgbmVlZHMgdG8gYmUgZXhlY3V0ZWQKKyAqIG9uY2UgYWZ0ZXIgcG93ZXItb24vcmVzZXQuIEl0IGFsc28gbmVlZHMgdG8gYmUgdXNlZCB3aGVuZXZlciB5b3Ugc3VzcGVjdAorICogdGhhdCB0aGUgdXNlciBtYXkgaGF2ZSBwbHVnZ2VkL3VucGx1Z2dlZCB0aGUgSXJEQSBEb25nbGUuCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfcmVhZF9kb25nbGVfaWQgKGludCBpb2Jhc2UpCit7CisJaW50IGRvbmdsZV9pZDsKKwlfX3U4IGJhbms7CisKKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCisJLyogU2VsZWN0IEJhbmsgNyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzcpOworCQorCS8qIElSQ0ZHNDogSVJTTDBfRFMgYW5kIElSU0wyMV9EUyBhcmUgY2xlYXJlZCAqLworCW91dGIoMHgwMCwgaW9iYXNlKzcpOworCQorCS8qIElEMCwgMSwgYW5kIDIgYXJlIHB1bGxlZCB1cC9kb3duIHZlcnkgc2xvd2x5ICovCisJdWRlbGF5KDUwKTsKKwkKKwkvKiBJUkNGRzE6IHJlYWQgdGhlIElEIGJpdHMgKi8KKwlkb25nbGVfaWQgPSBpbmIoaW9iYXNlKzQpICYgMHgwZjsKKworI2lmZGVmIEJST0tFTl9ET05HTEVfSUQKKwlpZiAoZG9uZ2xlX2lkID09IDB4MGEpCisJCWRvbmdsZV9pZCA9IDB4MDk7CisjZW5kaWYJCisJLyogR28gYmFjayB0byAgYmFuayAwIGJlZm9yZSByZXR1cm5pbmcgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisKKwlyZXR1cm4gZG9uZ2xlX2lkOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfaW5pdF9kb25nbGVfaW50ZXJmYWNlIChpb2Jhc2UsIGRvbmdsZV9pZCkKKyAqCisgKiAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZG9uZ2xlIGZvciB0aGUgdHJhbnNjZWl2ZXIgdGhhdCBpcworICogICAgIHVzZWQuIFRoaXMgcHJvY2VkdXJlIG5lZWRzIHRvIGJlIGV4ZWN1dGVkIG9uY2UgYWZ0ZXIKKyAqICAgICBwb3dlci1vbi9yZXNldC4gSXQgYWxzbyBuZWVkcyB0byBiZSB1c2VkIHdoZW5ldmVyIHlvdSBzdXNwZWN0IHRoYXQKKyAqICAgICB0aGUgZG9uZ2xlIGlzIGNoYW5nZWQuIAorICovCitzdGF0aWMgdm9pZCBuc2NfaXJjY19pbml0X2RvbmdsZV9pbnRlcmZhY2UgKGludCBpb2Jhc2UsIGludCBkb25nbGVfaWQpCit7CisJaW50IGJhbms7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisKKwkvKiBTZWxlY3QgQmFuayA3ICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LNyk7CisJCisJLyogSVJDRkc0OiBzZXQgYWNjb3JkaW5nIHRvIGRvbmdsZV9pZCAqLworCXN3aXRjaCAoZG9uZ2xlX2lkKSB7CisJY2FzZSAweDAwOiAvKiBzYW1lIGFzICovCisJY2FzZSAweDAxOiAvKiBEaWZmZXJlbnRpYWwgc2VyaWFsIGludGVyZmFjZSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBub3QgZGVmaW5lZCBieSBpcmRhIHlldFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDAyOiAvKiBzYW1lIGFzICovCisJY2FzZSAweDAzOiAvKiBSZXNlcnZlZCAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBub3QgZGVmaW5lZCBieSBpcmRhIHlldFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDA0OiAvKiBTaGFycCBSWTVIRDAxICovCisJCWJyZWFrOworCWNhc2UgMHgwNTogLyogUmVzZXJ2ZWQsIGJ1dCB0aGlzIGlzIHdoYXQgdGhlIFRoaW5rcGFkIHJlcG9ydHMgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgbm90IGRlZmluZWQgYnkgaXJkYSB5ZXRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwNjogLyogU2luZ2xlLWVuZGVkIHNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgbm90IGRlZmluZWQgYnkgaXJkYSB5ZXRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwNzogLyogQ29uc3VtZXItSVIgb25seSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBpcyBub3QgZm9yIElyREEgbW9kZVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDA4OiAvKiBIUCBIU0RMLTIzMDAsIEhQIEhTREwtMzYwMC9IU0RMLTM2MTAgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXNcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsKKwkJYnJlYWs7CisJY2FzZSAweDA5OiAvKiBJQk0zMVQxMTAwIG9yIFRlbWljIFRGRFM2MDAwL1RGRFM2NTAwICovCisJCW91dGIoMHgyOCwgaW9iYXNlKzcpOyAvKiBTZXQgaXJzbFswLTJdIGFzIG91dHB1dCAqLworCQlicmVhazsKKwljYXNlIDB4MEE6IC8qIHNhbWUgYXMgKi8KKwljYXNlIDB4MEI6IC8qIFJlc2VydmVkICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIG5vdCBkZWZpbmVkIGJ5IGlyZGEgeWV0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MEM6IC8qIHNhbWUgYXMgKi8KKwljYXNlIDB4MEQ6IC8qIEhQIEhTREwtMTEwMC9IU0RMLTIxMDAgKi8KKwkJLyogCisJCSAqIFNldCBpcnNsMCBhcyBpbnB1dCwgaXJzbFsxLTJdIGFzIG91dHB1dCwgYW5kIHNlcGFyYXRlIAorCQkgKiBpbnB1dHMgYXJlIHVzZWQgZm9yIFNJUiBhbmQgTUlSL0ZJUiAKKwkJICovCisJCW91dGIoMHg0OCwgaW9iYXNlKzcpOyAKKwkJYnJlYWs7CisJY2FzZSAweDBFOiAvKiBTdXBwb3J0cyBTSVIgTW9kZSBvbmx5ICovCisJCW91dGIoMHgyOCwgaW9iYXNlKzcpOyAvKiBTZXQgaXJzbFswLTJdIGFzIG91dHB1dCAqLworCQlicmVhazsKKwljYXNlIDB4MEY6IC8qIE5vIGRvbmdsZSBjb25uZWN0ZWQgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXNcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisKKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJCW91dGIoMHg2MiwgaW9iYXNlK01DUik7CisJCWJyZWFrOworCWRlZmF1bHQ6IAorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBpbnZhbGlkIGRvbmdsZV9pZCAlI3giLCAKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX2lkKTsKKwl9CisJCisJLyogSVJDRkcxOiBJUlNMMSBhbmQgMiBhcmUgc2V0IHRvIElyREEgbW9kZSAqLworCW91dGIoMHgwMCwgaW9iYXNlKzQpOworCisJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKwkKK30gLyogc2V0X3VwX2RvbmdsZV9pbnRlcmZhY2UgKi8KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQgKGlvYmFzZSwgc3BlZWQsIGRvbmdsZV9pZCkKKyAqCisgKiAgICBDaGFuZ2Ugc3BlZWQgb2YgdGhlIGF0dGFjaCBkb25nbGUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIG5zY19pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoaW50IGlvYmFzZSwgaW50IHNwZWVkLCBpbnQgZG9uZ2xlX2lkKQoreworCV9fdTggYmFuazsKKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKworCS8qIFNlbGVjdCBCYW5rIDcgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTks3KTsKKwkKKwkvKiBJUkNGRzE6IHNldCBhY2NvcmRpbmcgdG8gZG9uZ2xlX2lkICovCisJc3dpdGNoIChkb25nbGVfaWQpIHsKKwljYXNlIDB4MDA6IC8qIHNhbWUgYXMgKi8KKwljYXNlIDB4MDE6IC8qIERpZmZlcmVudGlhbCBzZXJpYWwgaW50ZXJmYWNlICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIG5vdCBkZWZpbmVkIGJ5IGlyZGEgeWV0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MDI6IC8qIHNhbWUgYXMgKi8KKwljYXNlIDB4MDM6IC8qIFJlc2VydmVkICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIG5vdCBkZWZpbmVkIGJ5IGlyZGEgeWV0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MDQ6IC8qIFNoYXJwIFJZNUhEMDEgKi8KKwkJYnJlYWs7CisJY2FzZSAweDA1OiAvKiBSZXNlcnZlZCAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBub3QgZGVmaW5lZCBieSBpcmRhIHlldFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDA2OiAvKiBTaW5nbGUtZW5kZWQgc2VyaWFsIGludGVyZmFjZSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBub3QgZGVmaW5lZCBieSBpcmRhIHlldFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDA3OiAvKiBDb25zdW1lci1JUiBvbmx5ICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIGlzIG5vdCBmb3IgSXJEQSBtb2RlXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MDg6IC8qIEhQIEhTREwtMjMwMCwgSFAgSFNETC0zNjAwL0hTREwtMzYxMCAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlc1xuIiwgCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCW91dGIoMHgwMCwgaW9iYXNlKzQpOworCQlpZiAoc3BlZWQgPiAxMTUyMDApCisJCQlvdXRiKDB4MDEsIGlvYmFzZSs0KTsKKwkJYnJlYWs7CisJY2FzZSAweDA5OiAvKiBJQk0zMVQxMTAwIG9yIFRlbWljIFRGRFM2MDAwL1RGRFM2NTAwICovCisJCW91dGIoMHgwMSwgaW9iYXNlKzQpOworCisJCWlmIChzcGVlZCA9PSA0MDAwMDAwKSB7CisJCQkvKiBUaGVyZSB3YXMgYSBjbGkoKSB0aGVyZSwgYnV0IHdlIG5vdyBhcmUgYWxyZWFkeQorCQkJICogdW5kZXIgc3Bpbl9sb2NrX2lycXNhdmUoKSAtIEplYW5JSSAqLworCQkJb3V0YigweDgxLCBpb2Jhc2UrNCk7CisJCQlvdXRiKDB4ODAsIGlvYmFzZSs0KTsKKwkJfSBlbHNlCisJCQlvdXRiKDB4MDAsIGlvYmFzZSs0KTsKKwkJYnJlYWs7CisJY2FzZSAweDBBOiAvKiBzYW1lIGFzICovCisJY2FzZSAweDBCOiAvKiBSZXNlcnZlZCAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBub3QgZGVmaW5lZCBieSBpcmRhIHlldFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDBDOiAvKiBzYW1lIGFzICovCisJY2FzZSAweDBEOiAvKiBIUCBIU0RMLTExMDAvSFNETC0yMTAwICovCisJCWJyZWFrOworCWNhc2UgMHgwRTogLyogU3VwcG9ydHMgU0lSIE1vZGUgb25seSAqLworCQlicmVhazsKKwljYXNlIDB4MEY6IC8qIE5vIGRvbmdsZSBjb25uZWN0ZWQgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgaXMgbm90IGZvciBJckRBIG1vZGVcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsKKworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsgCisJCW91dGIoMHg2MiwgaW9iYXNlK01DUik7CisJCWJyZWFrOworCWRlZmF1bHQ6IAorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBpbnZhbGlkIGRhdGFfcmF0ZVxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2NoYW5nZV9zcGVlZCAoc2VsZiwgYmF1ZCkKKyAqCisgKiAgICBDaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBjYWxsZWQgd2l0aCBpcnEgb2ZmIGFuZCBzcGluLWxvY2suCisgKi8KK3N0YXRpYyBfX3U4IG5zY19pcmNjX2NoYW5nZV9zcGVlZChzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYsIF9fdTMyIHNwZWVkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzZWxmLT5uZXRkZXY7CisJX191OCBtY3IgPSBNQ1JfU0lSOworCWludCBpb2Jhc2U7IAorCV9fdTggYmFuazsKKwlfX3U4IGllcjsgICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzcGVlZD0lZFxuIiwgX19GVU5DVElPTl9fLCBzcGVlZCk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCS8qIFVwZGF0ZSBhY2NvdW50aW5nIGZvciBuZXcgc3BlZWQgKi8KKwlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YigwLCBpb2Jhc2UrSUVSKTsKKworCS8qIFNlbGVjdCBCYW5rIDIgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKworCW91dGIoMHgwMCwgaW9iYXNlK0JHREgpOworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIDk2MDA6ICAgb3V0YigweDBjLCBpb2Jhc2UrQkdETCk7IGJyZWFrOworCWNhc2UgMTkyMDA6ICBvdXRiKDB4MDYsIGlvYmFzZStCR0RMKTsgYnJlYWs7CisJY2FzZSAzODQwMDogIG91dGIoMHgwMywgaW9iYXNlK0JHREwpOyBicmVhazsKKwljYXNlIDU3NjAwOiAgb3V0YigweDAyLCBpb2Jhc2UrQkdETCk7IGJyZWFrOworCWNhc2UgMTE1MjAwOiBvdXRiKDB4MDEsIGlvYmFzZStCR0RMKTsgYnJlYWs7CisJY2FzZSA1NzYwMDA6CisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzUpOworCQkKKwkJLyogSVJDUjI6IE1EUlMgaXMgc2V0ICovCisJCW91dGIoaW5iKGlvYmFzZSs0KSB8IDB4MDQsIGlvYmFzZSs0KTsKKwkgICAgICAgCisJCW1jciA9IE1DUl9NSVI7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGhhbmRsaW5nIGJhdWQgb2YgNTc2MDAwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwljYXNlIDExNTIwMDA6CisJCW1jciA9IE1DUl9NSVI7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGhhbmRsaW5nIGJhdWQgb2YgMTE1MjAwMFxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJY2FzZSA0MDAwMDAwOgorCQltY3IgPSBNQ1JfRklSOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDQwMDAwMDBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1jciA9IE1DUl9GSVI7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHVua25vd24gYmF1ZCByYXRlIG9mICVkXG4iLCAKKwkJCSAgIF9fRlVOQ1RJT05fXywgc3BlZWQpOworCQlicmVhazsKKwl9CisKKwkvKiBTZXQgYXBwcm9wcmlhdGUgc3BlZWQgbW9kZSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIobWNyIHwgTUNSX1RYX0RGUiwgaW9iYXNlK01DUik7CisKKwkvKiBHaXZlIHNvbWUgaGl0cyB0byB0aGUgdHJhbnNjZWl2ZXIgKi8KKwluc2NfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkKGlvYmFzZSwgc3BlZWQsIHNlbGYtPmlvLmRvbmdsZV9pZCk7CisKKwkvKiBTZXQgRklGTyB0aHJlc2hvbGQgdG8gVFgxNywgUlgxNiAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoMHgwMCwgaW9iYXNlK0ZDUik7CisJb3V0YihGQ1JfRklGT19FTiwgaW9iYXNlK0ZDUik7CisJb3V0YihGQ1JfUlhUSHwgICAgIC8qIFNldCBSeCBGSUZPIHRocmVzaG9sZCAqLworCSAgICAgRkNSX1RYVEh8ICAgICAvKiBTZXQgVHggRklGTyB0aHJlc2hvbGQgKi8KKwkgICAgIEZDUl9UWFNSfCAgICAgLyogUmVzZXQgVHggRklGTyAqLworCSAgICAgRkNSX1JYU1J8ICAgICAvKiBSZXNldCBSeCBGSUZPICovCisJICAgICBGQ1JfRklGT19FTiwgIC8qIEVuYWJsZSBGSUZPcyAqLworCSAgICAgaW9iYXNlK0ZDUik7CisJCisJLyogU2V0IEZJRk8gc2l6ZSB0byAzMiAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCW91dGIoRVhDUjJfUkZTSVp8RVhDUjJfVEZTSVosIGlvYmFzZStFWENSMik7CisJCisJLyogRW5hYmxlIHNvbWUgaW50ZXJydXB0cyBzbyB3ZSBjYW4gcmVjZWl2ZSBmcmFtZXMgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsgCisJaWYgKHNwZWVkID4gMTE1MjAwKSB7CisJCS8qIEluc3RhbGwgRklSIHhtaXQgaGFuZGxlciAqLworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG5zY19pcmNjX2hhcmRfeG1pdF9maXI7CisJCWllciA9IElFUl9TRklGX0lFOworCQluc2NfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwl9IGVsc2UgeworCQkvKiBJbnN0YWxsIFNJUiB4bWl0IGhhbmRsZXIgKi8KKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBuc2NfaXJjY19oYXJkX3htaXRfc2lyOworCQlpZXIgPSBJRVJfUlhIRExfSUU7CisJfQorCS8qIFNldCBvdXIgY3VycmVudCBpbnRlcnJ1cHQgbWFzayAqLworCW91dGIoaWVyLCBpb2Jhc2UrSUVSKTsKKyAgICAJCisJLyogUmVzdG9yZSBCU1IgKi8KKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCisJLyogTWFrZSBzdXJlIGludGVycnVwdCBoYW5kbGVycyBrZWVwIHRoZSBwcm9wZXIgaW50ZXJydXB0IG1hc2sgKi8KKwlyZXR1cm4oaWVyKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2hhcmRfeG1pdCAoc2tiLCBkZXYpCisgKgorICogICAgVHJhbnNtaXQgdGhlIGZyYW1lIQorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19oYXJkX3htaXRfc2lyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5zY19pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYmFzZTsKKwlfX3MzMiBzcGVlZDsKKwlfX3U4IGJhbms7CisJCisJc2VsZiA9IChzdHJ1Y3QgbnNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQorCS8qIE1ha2Ugc3VyZSB0ZXN0cyAqJiBzcGVlZCBjaGFuZ2UgYXJlIGF0b21pYyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUuICovCisJCWlmICghc2tiLT5sZW4pIHsKKwkJCS8qIElmIHdlIGp1c3Qgc2VudCBhIGZyYW1lLCB3ZSBnZXQgY2FsbGVkIGJlZm9yZQorCQkJICogdGhlIGxhc3QgYnl0ZXMgZ2V0IG91dCAoYmVjYXVzZSBvZiB0aGUgU0lSIEZJRk8pLgorCQkJICogSWYgdGhpcyBpcyB0aGUgY2FzZSwgbGV0IGludGVycnVwdCBoYW5kbGVyIGNoYW5nZQorCQkJICogdGhlIHNwZWVkIGl0c2VsZi4uLiBKZWFuIElJICovCisJCQlpZiAoc2VsZi0+aW8uZGlyZWN0aW9uID09IElPX1JFQ1YpIHsKKwkJCQluc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOyAKKwkJCQkvKiBUT0RPIDogRm9yIFNJUi0+U0lSLCB0aGUgbmV4dCBwYWNrZXQKKwkJCQkgKiBtYXkgZ2V0IGNvcnJ1cHRlZCAtIEplYW4gSUkgKi8KKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQl9IGVsc2UgeworCQkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCQkJCS8qIFF1ZXVlIHdpbGwgYmUgcmVzdGFydGVkIGFmdGVyIHNwZWVkIGNoYW5nZQorCQkJCSAqIHRvIG1ha2Ugc3VyZSBwYWNrZXRzIGdldHMgdGhyb3VnaCB0aGUKKwkJCQkgKiBwcm9wZXIgeG1pdCBoYW5kbGVyIC0gSmVhbiBJSSAqLworCQkJfQorCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwl9CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisJCisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCQorCXNlbGYtPnR4X2J1ZmYubGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsIAorCQkJCQkgICBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKworCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOworCQorCS8qIEFkZCBpbnRlcnJ1cHQgb24gdHggbG93IGxldmVsICh3aWxsIGZpcmUgaW1tZWRpYXRlbHkpICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihJRVJfVFhMRExfSUUsIGlvYmFzZStJRVIpOworCQorCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuc2NfaXJjY19oYXJkX3htaXRfZmlyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5zY19pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYmFzZTsKKwlfX3MzMiBzcGVlZDsKKwlfX3U4IGJhbms7CisJaW50IG10dCwgZGlmZjsKKwkKKwlzZWxmID0gKHN0cnVjdCBuc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogTWFrZSBzdXJlIHRlc3RzIComIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lLiAqLworCQlpZiAoIXNrYi0+bGVuKSB7CisJCQkvKiBJZiB3ZSBhcmUgY3VycmVudGx5IHRyYW5zbWl0dGluZywgZGVmZXIgdG8KKwkJCSAqIGludGVycnVwdCBoYW5kbGVyLiAtIEplYW4gSUkgKi8KKwkJCWlmKHNlbGYtPnR4X2ZpZm8ubGVuID09IDApIHsKKwkJCQluc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOyAKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQl9IGVsc2UgeworCQkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCQkJCS8qIEtlZXAgcXVldWUgc3RvcHBlZCA6CisJCQkJICogdGhlIHNwZWVkIGNoYW5nZSBvcGVyYXRpb24gbWF5IGNoYW5nZSB0aGUKKwkJCQkgKiB4bWl0IGhhbmRsZXIsIGFuZCB3ZSB3YW50IHRvIG1ha2Ugc3VyZQorCQkJCSAqIHRoZSBuZXh0IHBhY2tldCBnZXQgdGhyb3VnaCB0aGUgcHJvcGVyCisJCQkJICogVHggcGF0aCwgc28gYmxvY2sgdGhlIFR4IHF1ZXVlIHVudGlsCisJCQkJICogdGhlIHNwZWVkIGNoYW5nZSBoYXMgYmVlbiBkb25lLgorCQkJCSAqIEplYW4gSUkgKi8KKwkJCX0KKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKiBDaGFuZ2Ugc3BlZWQgYWZ0ZXIgY3VycmVudCBmcmFtZSAqLworCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJCX0KKwl9CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisKKwkvKiBSZWdpc3RlciBhbmQgY29weSB0aGlzIGZyYW1lIHRvIERNQSBtZW1vcnkgKi8KKwlzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0uc3RhcnQgPSBzZWxmLT50eF9maWZvLnRhaWw7CisJc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLmxlbiA9IHNrYi0+bGVuOworCXNlbGYtPnR4X2ZpZm8udGFpbCArPSBza2ItPmxlbjsKKworCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJbWVtY3B5KHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCwgc2tiLT5kYXRhLCAKKwkgICAgICAgc2tiLT5sZW4pOworCQorCXNlbGYtPnR4X2ZpZm8ubGVuKys7CisJc2VsZi0+dHhfZmlmby5mcmVlKys7CisKKwkvKiBTdGFydCB0cmFuc21pdCBvbmx5IGlmIHRoZXJlIGlzIGN1cnJlbnRseSBubyB0cmFuc21pdCBnb2luZyBvbiAqLworCWlmIChzZWxmLT50eF9maWZvLmxlbiA9PSAxKSB7CisJCS8qIENoZWNrIGlmIHdlIG11c3Qgd2FpdCB0aGUgbWluIHR1cm4gdGltZSBvciBub3QgKi8KKwkJbXR0ID0gaXJkYV9nZXRfbXR0KHNrYik7CisJCWlmIChtdHQpIHsKKwkJCS8qIENoZWNrIGhvdyBtdWNoIHRpbWUgd2UgaGF2ZSB1c2VkIGFscmVhZHkgKi8KKwkJCWRvX2dldHRpbWVvZmRheSgmc2VsZi0+bm93KTsKKwkJCWRpZmYgPSBzZWxmLT5ub3cudHZfdXNlYyAtIHNlbGYtPnN0YW1wLnR2X3VzZWM7CisJCQlpZiAoZGlmZiA8IDApIAorCQkJCWRpZmYgKz0gMTAwMDAwMDsKKwkJCQorCQkJLyogQ2hlY2sgaWYgdGhlIG10dCBpcyBsYXJnZXIgdGhhbiB0aGUgdGltZSB3ZSBoYXZlCisJCQkgKiBhbHJlYWR5IHVzZWQgYnkgYWxsIHRoZSBwcm90b2NvbCBwcm9jZXNzaW5nCisJCQkgKi8KKwkJCWlmIChtdHQgPiBkaWZmKSB7CisJCQkJbXR0IC09IGRpZmY7CisKKwkJCQkvKiAKKwkJCQkgKiBVc2UgdGltZXIgaWYgZGVsYXkgbGFyZ2VyIHRoYW4gMTI1IHVzLCBhbmQKKwkJCQkgKiB1c2UgdWRlbGF5IGZvciBzbWFsbGVyIHZhbHVlcyB3aGljaCBzaG91bGQKKwkJCQkgKiBiZSBhY2NlcHRhYmxlCisJCQkJICovCisJCQkJaWYgKG10dCA+IDEyNSkgeworCQkJCQkvKiBBZGp1c3QgZm9yIHRpbWVyIHJlc29sdXRpb24gKi8KKwkJCQkJbXR0ID0gbXR0IC8gMTI1OworCQkJCQkKKwkJCQkJLyogU2V0dXAgdGltZXIgKi8KKwkJCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LNCk7CisJCQkJCW91dGIobXR0ICYgMHhmZiwgaW9iYXNlK1RNUkwpOworCQkJCQlvdXRiKChtdHQgPj4gOCkgJiAweDBmLCBpb2Jhc2UrVE1SSCk7CisJCQkJCQorCQkJCQkvKiBTdGFydCB0aW1lciAqLworCQkJCQlvdXRiKElSQ1IxX1RNUl9FTiwgaW9iYXNlK0lSQ1IxKTsKKwkJCQkJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fWE1JVDsKKwkJCQkJCisJCQkJCS8qIEVuYWJsZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJCQkJCW91dGIoSUVSX1RNUl9JRSwgaW9iYXNlK0lFUik7CisJCQkJCQorCQkJCQkvKiBUaW1lciB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdCAqLworCQkJCQlnb3RvIG91dDsgCisJCQkJfSBlbHNlCisJCQkJCXVkZWxheShtdHQpOworCQkJfQorCQl9CQkKKwkJLyogRW5hYmxlIERNQSBpbnRlcnJ1cHQgKi8KKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJCW91dGIoSUVSX0RNQV9JRSwgaW9iYXNlK0lFUik7CisKKwkJLyogVHJhbnNtaXQgZnJhbWUgKi8KKwkJbnNjX2lyY2NfZG1hX3htaXQoc2VsZiwgaW9iYXNlKTsKKwl9Cisgb3V0OgorCS8qIE5vdCBidXN5IHRyYW5zbWl0dGluZyBhbnltb3JlIGlmIHdpbmRvdyBpcyBub3QgZnVsbCwKKwkgKiBhbmQgaWYgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2Ugc3BlZWQgKi8KKwlpZiAoKHNlbGYtPnR4X2ZpZm8uZnJlZSA8IE1BWF9UWF9XSU5ET1cpICYmIChzZWxmLT5uZXdfc3BlZWQgPT0gMCkpCisJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKworCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19kbWFfeG1pdCAoc2VsZiwgaW9iYXNlKQorICoKKyAqICAgIFRyYW5zbWl0IGRhdGEgdXNpbmcgRE1BCisgKgorICovCitzdGF0aWMgdm9pZCBuc2NfaXJjY19kbWFfeG1pdChzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpCit7CisJaW50IGJzcjsKKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYnNyID0gaW5iKGlvYmFzZStCU1IpOworCisJLyogRGlzYWJsZSBETUEgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKGluYihpb2Jhc2UrTUNSKSAmIH5NQ1JfRE1BX0VOLCBpb2Jhc2UrTUNSKTsKKwkKKwlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19YTUlUOworCQorCS8qIENob29zZSB0cmFuc21pdCBETUEgY2hhbm5lbCAgKi8gCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisJb3V0YihFQ1IxX0RNQVNXUHxFQ1IxX0RNQU5GfEVDUjFfRVhUX1NMLCBpb2Jhc2UrRUNSMSk7CisJCisJaXJkYV9zZXR1cF9kbWEoc2VsZi0+aW8uZG1hLCAKKwkJICAgICAgICgodTggKilzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5zdGFydCAtCisJCQlzZWxmLT50eF9idWZmLmhlYWQpICsgc2VsZi0+dHhfYnVmZl9kbWEsCisJCSAgICAgICBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4sIAorCQkgICAgICAgRE1BX1RYX01PREUpOworCisJLyogRW5hYmxlIERNQSBhbmQgU0lSIGludGVyYWN0aW9uIHB1bHNlICovCisgCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOwkKKwlvdXRiKGluYihpb2Jhc2UrTUNSKXxNQ1JfVFhfREZSfE1DUl9ETUFfRU58TUNSX0lSX1BMUywgaW9iYXNlK01DUik7CisKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKGJzciwgaW9iYXNlK0JTUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19waW9feG1pdCAoc2VsZiwgaW9iYXNlKQorICoKKyAqICAgIFRyYW5zbWl0IGRhdGEgdXNpbmcgUElPLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhY3R1YWxseQorICogICAgZ290IHRyYW5zZmVycmVkCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX3Bpb193cml0ZShpbnQgaW9iYXNlLCBfX3U4ICpidWYsIGludCBsZW4sIGludCBmaWZvX3NpemUpCit7CisJaW50IGFjdHVhbCA9IDA7CisJX191OCBiYW5rOworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlpZiAoIShpbmJfcChpb2Jhc2UrTFNSKSAmIExTUl9UWEVNUCkpIHsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgd2FybmluZywgRklGTyBub3QgZW1wdHkgeWV0IVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisKKwkJLyogRklGTyBtYXkgc3RpbGwgYmUgZmlsbGVkIHRvIHRoZSBUeCBpbnRlcnJ1cHQgdGhyZXNob2xkICovCisJCWZpZm9fc2l6ZSAtPSAxNzsKKwl9CisKKwkvKiBGaWxsIEZJRk8gd2l0aCBjdXJyZW50IGZyYW1lICovCisJd2hpbGUgKChmaWZvX3NpemUtLSA+IDApICYmIChhY3R1YWwgPCBsZW4pKSB7CisJCS8qIFRyYW5zbWl0IG5leHQgYnl0ZSAqLworCQlvdXRiKGJ1ZlthY3R1YWwrK10sIGlvYmFzZStUWEQpOworCX0KKyAgICAgICAgCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZmlmb19zaXplICVkIDsgJWQgc2VudCBvZiAlZFxuIiwgCisJCSAgIF9fRlVOQ1RJT05fXywgZmlmb19zaXplLCBhY3R1YWwsIGxlbik7CisJCisJLyogUmVzdG9yZSBiYW5rICovCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKworCXJldHVybiBhY3R1YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZSAoc2VsZikKKyAqCisgKiAgICBUaGUgdHJhbnNmZXIgb2YgYSBmcmFtZSBpbiBmaW5pc2hlZC4gVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgY2FsbGVkIAorICogICAgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCV9fdTggYmFuazsKKwlpbnQgcmV0ID0gVFJVRTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKworCS8qIERpc2FibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisgICAgICAgIG91dGIoaW5iKGlvYmFzZStNQ1IpICYgfk1DUl9ETUFfRU4sIGlvYmFzZStNQ1IpOworCQorCS8qIENoZWNrIGZvciB1bmRlcnJydW4hICovCisJaWYgKGluYihpb2Jhc2UrQVNDUikgJiBBU0NSX1RYVVIpIHsKKwkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQorCQkvKiBDbGVhciBiaXQsIGJ5IHdyaXRpbmcgMSBpbnRvIGl0ICovCisJCW91dGIoQVNDUl9UWFVSLCBpb2Jhc2UrQVNDUik7CisJfSBlbHNlIHsKKwkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCX0KKworCS8qIEZpbmlzaGVkIHdpdGggdGhpcyBmcmFtZSwgc28gcHJlcGFyZSBmb3IgbmV4dCAqLworCXNlbGYtPnR4X2ZpZm8ucHRyKys7CisJc2VsZi0+dHhfZmlmby5sZW4tLTsKKworCS8qIEFueSBmcmFtZXMgdG8gYmUgc2VudCBiYWNrLXRvLWJhY2s/ICovCisJaWYgKHNlbGYtPnR4X2ZpZm8ubGVuKSB7CisJCW5zY19pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSk7CisJCQorCQkvKiBOb3QgZmluaXNoZWQgeWV0ISAqLworCQlyZXQgPSBGQUxTRTsKKwl9IGVsc2UgeworCQkvKiBSZXNldCBUeCBGSUZPIGluZm8gKi8KKwkJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJCXNlbGYtPnR4X2ZpZm8udGFpbCA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSByb29tIGZvciBtb3JlIGZyYW1lcyBhbmQKKwkgKiB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIHNwZWVkICovCisJaWYgKChzZWxmLT50eF9maWZvLmZyZWUgPCBNQVhfVFhfV0lORE9XKSAmJiAoc2VsZi0+bmV3X3NwZWVkID09IDApKSB7CisJCS8qIE5vdCBidXN5IHRyYW5zbWl0dGluZyBhbnltb3JlICovCisJCS8qIFRlbGwgdGhlIG5ldHdvcmsgbGF5ZXIsIHRoYXQgd2UgY2FuIGFjY2VwdCBtb3JlIGZyYW1lcyAqLworCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJfQorCisJLyogUmVzdG9yZSBiYW5rICovCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfZG1hX3JlY2VpdmUgKHNlbGYpCisgKgorICogICAgR2V0IHJlYWR5IGZvciByZWNlaXZpbmcgYSBmcmFtZS4gVGhlIGRldmljZSB3aWxsIGluaXRpYXRlIGEgRE1BCisgKiAgICBpZiBpdCBzdGFydHMgdG8gcmVjZWl2ZSBhIGZyYW1lLgorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19kbWFfcmVjZWl2ZShzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpIAoreworCWludCBpb2Jhc2U7CisJX191OCBic3I7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCS8qIFJlc2V0IFR4IEZJRk8gaW5mbyAqLworCXNlbGYtPnR4X2ZpZm8ubGVuID0gc2VsZi0+dHhfZmlmby5wdHIgPSBzZWxmLT50eF9maWZvLmZyZWUgPSAwOworCXNlbGYtPnR4X2ZpZm8udGFpbCA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYnNyID0gaW5iKGlvYmFzZStCU1IpOworCisJLyogRGlzYWJsZSBETUEgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKGluYihpb2Jhc2UrTUNSKSAmIH5NQ1JfRE1BX0VOLCBpb2Jhc2UrTUNSKTsKKworCS8qIENob29zZSBETUEgUngsIERNQSBGYWlybmVzcywgYW5kIEFkdmFuY2VkIG1vZGUgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwlvdXRiKEVDUjFfRE1BTkZ8RUNSMV9FWFRfU0wsIGlvYmFzZStFQ1IxKTsKKworCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1JFQ1Y7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCQorCS8qIFJlc2V0IFJ4IEZJRk8uIFRoaXMgd2lsbCBhbHNvIGZsdXNoIHRoZSBTVF9GSUZPICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihGQ1JfUlhTUnxGQ1JfRklGT19FTiwgaW9iYXNlK0ZDUik7CisKKwlzZWxmLT5zdF9maWZvLmxlbiA9IHNlbGYtPnN0X2ZpZm8ucGVuZGluZ19ieXRlcyA9IDA7CisJc2VsZi0+c3RfZmlmby50YWlsID0gc2VsZi0+c3RfZmlmby5oZWFkID0gMDsKKwkKKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIHNlbGYtPnJ4X2J1ZmZfZG1hLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkgICAgICAgRE1BX1JYX01PREUpOworCisJLyogRW5hYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoaW5iKGlvYmFzZStNQ1IpfE1DUl9ETUFfRU4sIGlvYmFzZStNQ1IpOworCisJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJb3V0Yihic3IsIGlvYmFzZStCU1IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUgKHNlbGYpCisgKgorICogICAgRmluaXNoZWQgd2l0aCByZWNlaXZpbmcgZnJhbWVzCisgKgorICogICAgCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKQoreworCXN0cnVjdCBzdF9maWZvICpzdF9maWZvOworCXN0cnVjdCBza19idWZmICpza2I7CisJX191OCBzdGF0dXM7CisJX191OCBiYW5rOworCWludCBsZW47CisKKwlzdF9maWZvID0gJnNlbGYtPnN0X2ZpZm87CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisJCisJLyogUmVhZCBhbGwgZW50cmllcyBpbiBzdGF0dXMgRklGTyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzUpOworCXdoaWxlICgoc3RhdHVzID0gaW5iKGlvYmFzZStGUk1fU1QpKSAmIEZSTV9TVF9WTEQpIHsKKwkJLyogV2UgbXVzdCBlbXB0eSB0aGUgc3RhdHVzIEZJRk8gbm8gbWF0dGVyIHdoYXQgKi8KKwkJbGVuID0gaW5iKGlvYmFzZStSRkxGTCkgfCAoKGluYihpb2Jhc2UrUkZMRkgpICYgMHgxZikgPDwgOCk7CisKKwkJaWYgKHN0X2ZpZm8tPnRhaWwgPj0gTUFYX1JYX1dJTkRPVykgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgd2luZG93IGlzIGZ1bGwhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJY29udGludWU7CisJCX0KKwkJCQorCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPnRhaWxdLnN0YXR1cyA9IHN0YXR1czsKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5sZW4gPSBsZW47CisJCXN0X2ZpZm8tPnBlbmRpbmdfYnl0ZXMgKz0gbGVuOworCQlzdF9maWZvLT50YWlsKys7CisJCXN0X2ZpZm8tPmxlbisrOworCX0KKwkvKiBUcnkgdG8gcHJvY2VzcyBhbGwgZW50cmllcyBpbiBzdGF0dXMgRklGTyAqLworCXdoaWxlIChzdF9maWZvLT5sZW4gPiAwKSB7CisJCS8qIEdldCBmaXJzdCBlbnRyeSAqLworCQlzdGF0dXMgPSBzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLnN0YXR1czsKKwkJbGVuICAgID0gc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5sZW47CisJCXN0X2ZpZm8tPnBlbmRpbmdfYnl0ZXMgLT0gbGVuOworCQlzdF9maWZvLT5oZWFkKys7CisJCXN0X2ZpZm8tPmxlbi0tOworCisJCS8qIENoZWNrIGZvciBlcnJvcnMgKi8KKwkJaWYgKHN0YXR1cyAmIEZSTV9TVF9FUlJfTVNLKSB7CisJCQlpZiAoc3RhdHVzICYgRlJNX1NUX0xPU1RfRlIpIHsKKwkJCQkvKiBBZGQgbnVtYmVyIG9mIGxvc3QgZnJhbWVzIHRvIHN0YXRzICovCisJCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzICs9IGxlbjsJCisJCQl9IGVsc2UgeworCQkJCS8qIFNraXAgZnJhbWUgKi8KKwkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkKKwkJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOworCQkJCisJCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9NQVhfTEVOKQorCQkJCQlzZWxmLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCisJCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9QSFlfRVJSKSAKKwkJCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJCisJCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9CQURfQ1JDKSAKKwkJCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJfQorCQkJLyogVGhlIGVycm9ycyBiZWxvdyBjYW4gYmUgcmVwb3J0ZWQgaW4gYm90aCBjYXNlcyAqLworCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9PVlIxKQorCQkJCXNlbGYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CQkgICAgICAgCisJCQkKKwkJCWlmIChzdGF0dXMgJiBGUk1fU1RfT1ZSMikKKwkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogIAorCQkJICogRmlyc3Qgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZnJhbWUgd2UKKwkJCSAqIHdhbnQgdG8gZGVsaXZlciBpcyBhbGwgaW4gbWFpbiBtZW1vcnkuIElmIHdlCisJCQkgKiBjYW5ub3QgdGVsbCwgdGhlbiB3ZSBjaGVjayBpZiB0aGUgUnggRklGTyBpcworCQkJICogZW1wdHkuIElmIG5vdCB0aGVuIHdlIHdpbGwgaGF2ZSB0byB0YWtlIGEgbmFwCisJCQkgKiBhbmQgdHJ5IGFnYWluIGxhdGVyLiAgCisJCQkgKi8KKwkJCWlmIChzdF9maWZvLT5wZW5kaW5nX2J5dGVzIDwgc2VsZi0+aW8uZmlmb19zaXplKSB7CisJCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJCQkJaWYgKGluYihpb2Jhc2UrTFNSKSAmIExTUl9SWERBKSB7CisJCQkJCS8qIFB1dCB0aGlzIGVudHJ5IGJhY2sgaW4gZmlmbyAqLworCQkJCQlzdF9maWZvLT5oZWFkLS07CisJCQkJCXN0X2ZpZm8tPmxlbisrOworCQkJCQlzdF9maWZvLT5wZW5kaW5nX2J5dGVzICs9IGxlbjsKKwkJCQkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5zdGF0dXMgPSBzdGF0dXM7CisJCQkJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuID0gbGVuOworCQkJCQkvKiAgCisJCQkJCSAqIERNQSBub3QgZmluaXNoZWQgeWV0LCBzbyB0cnkgYWdhaW4gCisJCQkJCSAqIGxhdGVyLCBzZXQgdGltZXIgdmFsdWUsIHJlc29sdXRpb24gCisJCQkJCSAqIDEyNSB1cyAKKwkJCQkJICovCisJCQkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzQpOworCQkJCQlvdXRiKDB4MDIsIGlvYmFzZStUTVJMKTsgLyogeCAxMjUgdXMgKi8KKwkJCQkJb3V0YigweDAwLCBpb2Jhc2UrVE1SSCk7CisKKwkJCQkJLyogU3RhcnQgdGltZXIgKi8KKwkJCQkJb3V0YihJUkNSMV9UTVJfRU4sIGlvYmFzZStJUkNSMSk7CisKKwkJCQkJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJCQkJCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisJCQkJCQorCQkJCQlyZXR1cm4gRkFMU0U7IC8qIEknbGwgYmUgYmFjayEgKi8KKwkJCQl9CisJCQl9CisKKwkJCS8qIAorCQkJICogUmVtZW1iZXIgdGhlIHRpbWUgd2UgcmVjZWl2ZWQgdGhpcyBmcmFtZSwgc28gd2UgY2FuCisJCQkgKiByZWR1Y2UgdGhlIG1pbiB0dXJuIHRpbWUgYSBiaXQgc2luY2Ugd2Ugd2lsbCBrbm93CisJCQkgKiBob3cgbXVjaCB0aW1lIHdlIGhhdmUgdXNlZCBmb3IgcHJvdG9jb2wgcHJvY2Vzc2luZworCQkJICovCisJCQlkb19nZXR0aW1lb2ZkYXkoJnNlbGYtPnN0YW1wKTsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4rMSk7CisJCQlpZiAoc2tiID09IE5VTEwpICB7CisJCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgIgorCQkJCQkgICAgICJkcm9wcGluZyBmcmFtZS5cbiIsCisJCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisKKwkJCQkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwkJCQlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJCisJCQkvKiBNYWtlIHN1cmUgSVAgaGVhZGVyIGdldHMgYWxpZ25lZCAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAxKTsgCisKKwkJCS8qIENvcHkgZnJhbWUgd2l0aG91dCBDUkMgKi8KKwkJCWlmIChzZWxmLT5pby5zcGVlZCA8IDQwMDAwMDApIHsKKwkJCQlza2JfcHV0KHNrYiwgbGVuLTIpOworCQkJCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuLTIpOworCQkJfSBlbHNlIHsKKwkJCQlza2JfcHV0KHNrYiwgbGVuLTQpOworCQkJCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuLTQpOworCQkJfQorCisJCQkvKiBNb3ZlIHRvIG5leHQgZnJhbWUgKi8KKwkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisKKwkJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworCQkJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlzZWxmLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQl9CisJfQorCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX3Bpb19yZWNlaXZlIChzZWxmKQorICoKKyAqICAgIFJlY2VpdmUgYWxsIGRhdGEgaW4gcmVjZWl2ZXIgRklGTworICoKKyAqLworc3RhdGljIHZvaWQgbnNjX2lyY2NfcGlvX3JlY2VpdmUoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKSAKK3sKKwlfX3U4IGJ5dGU7CisJaW50IGlvYmFzZTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCQorCS8qICBSZWNlaXZlIGFsbCBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8gKi8KKwlkbyB7CisJCWJ5dGUgPSBpbmIoaW9iYXNlK1JYRCk7CisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwgCisJCQkJICBieXRlKTsKKwl9IHdoaWxlIChpbmIoaW9iYXNlK0xTUikgJiBMU1JfUlhEQSk7IC8qIERhdGEgYXZhaWxhYmxlICovCQorfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2Nfc2lyX2ludGVycnVwdCAoc2VsZiwgZWlyKQorICoKKyAqICAgIEhhbmRsZSBTSVIgaW50ZXJydXB0CisgKgorICovCitzdGF0aWMgdm9pZCBuc2NfaXJjY19zaXJfaW50ZXJydXB0KHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiwgaW50IGVpcikKK3sKKwlpbnQgYWN0dWFsOworCisJLyogQ2hlY2sgaWYgdHJhbnNtaXQgRklGTyBpcyBsb3cgb24gZGF0YSAqLworCWlmIChlaXIgJiBFSVJfVFhMRExfRVYpIHsKKwkJLyogV3JpdGUgZGF0YSBsZWZ0IGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlhY3R1YWwgPSBuc2NfaXJjY19waW9fd3JpdGUoc2VsZi0+aW8uZmlyX2Jhc2UsIAorCQkJCQkgICBzZWxmLT50eF9idWZmLmRhdGEsIAorCQkJCQkgICBzZWxmLT50eF9idWZmLmxlbiwgCisJCQkJCSAgIHNlbGYtPmlvLmZpZm9fc2l6ZSk7CisJCXNlbGYtPnR4X2J1ZmYuZGF0YSArPSBhY3R1YWw7CisJCXNlbGYtPnR4X2J1ZmYubGVuICAtPSBhY3R1YWw7CisJCQorCQlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19YTUlUOworCisJCS8qIENoZWNrIGlmIGZpbmlzaGVkICovCisJCWlmIChzZWxmLT50eF9idWZmLmxlbiA+IDApCisJCQlzZWxmLT5pZXIgPSBJRVJfVFhMRExfSUU7CisJCWVsc2UgeyAKKworCQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQkJc2VsZi0+aWVyID0gSUVSX1RYRU1QX0lFOworCQl9CisJCQkKKwl9CisJLyogQ2hlY2sgaWYgdHJhbnNtaXNzaW9uIGhhcyBjb21wbGV0ZWQgKi8KKwlpZiAoZWlyICYgRUlSX1RYRU1QX0VWKSB7CisJCS8qIFR1cm4gYXJvdW5kIGFuZCBnZXQgcmVhZHkgdG8gcmVjZWl2ZSBzb21lIGRhdGEgKi8KKwkJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fUkVDVjsKKwkJc2VsZi0+aWVyID0gSUVSX1JYSERMX0lFOworCQkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQ/CisJCSAqIE5lZWQgdG8gYmUgYWZ0ZXIgc2VsZi0+aW8uZGlyZWN0aW9uIHRvIGF2b2lkIHJhY2Ugd2l0aAorCQkgKiBuc2NfaXJjY19oYXJkX3htaXRfc2lyKCkgLSBKZWFuIElJICovCisJCWlmIChzZWxmLT5uZXdfc3BlZWQpIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCksIENoYW5naW5nIHNwZWVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXNlbGYtPmllciA9IG5zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLAorCQkJCQkJCSAgc2VsZi0+bmV3X3NwZWVkKTsKKwkJCXNlbGYtPm5ld19zcGVlZCA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisKKwkJCS8qIENoZWNrIGlmIHdlIGFyZSBnb2luZyB0byBGSVIgKi8KKwkJCWlmIChzZWxmLT5pby5zcGVlZCA+IDExNTIwMCkgeworCQkJCS8qIE5vIG5lZWQgdG8gZG8gYW55bW9yZSBTSVIgc3R1ZmYgKi8KKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwkvKiBSeCBGSUZPIHRocmVzaG9sZCBvciB0aW1lb3V0ICovCisJaWYgKGVpciAmIEVJUl9SWEhETF9FVikgeworCQluc2NfaXJjY19waW9fcmVjZWl2ZShzZWxmKTsKKworCQkvKiBLZWVwIHJlY2VpdmluZyAqLworCQlzZWxmLT5pZXIgPSBJRVJfUlhIRExfSUU7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfZmlyX2ludGVycnVwdCAoc2VsZiwgZWlyKQorICoKKyAqICAgIEhhbmRsZSBNSVIvRklSIGludGVycnVwdAorICoKKyAqLworc3RhdGljIHZvaWQgbnNjX2lyY2NfZmlyX2ludGVycnVwdChzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UsIAorCQkJCSAgIGludCBlaXIpCit7CisJX191OCBiYW5rOworCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKwkKKwkvKiBTdGF0dXMgRklGTyBldmVudCovCisJaWYgKGVpciAmIEVJUl9TRklGX0VWKSB7CisJCS8qIENoZWNrIGlmIERNQSBoYXMgZmluaXNoZWQgKi8KKwkJaWYgKG5zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHNlbGYsIGlvYmFzZSkpIHsKKwkJCS8qIFdhaXQgZm9yIG5leHQgc3RhdHVzIEZJRk8gaW50ZXJydXB0ICovCisJCQlzZWxmLT5pZXIgPSBJRVJfU0ZJRl9JRTsKKwkJfSBlbHNlIHsKKwkJCXNlbGYtPmllciA9IElFUl9TRklGX0lFIHwgSUVSX1RNUl9JRTsKKwkJfQorCX0gZWxzZSBpZiAoZWlyICYgRUlSX1RNUl9FVikgeyAvKiBUaW1lciBmaW5pc2hlZCAqLworCQkvKiBEaXNhYmxlIHRpbWVyICovCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzQpOworCQlvdXRiKDAsIGlvYmFzZStJUkNSMSk7CisKKwkJLyogQ2xlYXIgdGltZXIgZXZlbnQgKi8KKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJCW91dGIoQVNDUl9DVEUsIGlvYmFzZStBU0NSKTsKKworCQkvKiBDaGVjayBpZiB0aGlzIGlzIGEgVHggdGltZXIgaW50ZXJydXB0ICovCisJCWlmIChzZWxmLT5pby5kaXJlY3Rpb24gPT0gSU9fWE1JVCkgeworCQkJbnNjX2lyY2NfZG1hX3htaXQoc2VsZiwgaW9iYXNlKTsKKworCQkJLyogSW50ZXJydXB0IG9uIERNQSAqLworCQkJc2VsZi0+aWVyID0gSUVSX0RNQV9JRTsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIChhZ2FpbikgaWYgRE1BIGhhcyBmaW5pc2hlZCAqLworCQkJaWYgKG5zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHNlbGYsIGlvYmFzZSkpIHsKKwkJCQlzZWxmLT5pZXIgPSBJRVJfU0ZJRl9JRTsKKwkJCX0gZWxzZSB7CisJCQkJc2VsZi0+aWVyID0gSUVSX1NGSUZfSUUgfCBJRVJfVE1SX0lFOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChlaXIgJiBFSVJfRE1BX0VWKSB7CisJCS8qIEZpbmlzaGVkIHdpdGggYWxsIHRyYW5zbWlzc2lvbnM/ICovCisJCWlmIChuc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzZWxmKSkgeworCQkJaWYoc2VsZi0+bmV3X3NwZWVkICE9IDApIHsKKwkJCQkvKiBBcyB3ZSBzdG9wIHRoZSBUeCBxdWV1ZSwgdGhlIHNwZWVkIGNoYW5nZQorCQkJCSAqIG5lZWQgdG8gYmUgZG9uZSB3aGVuIHRoZSBUeCBmaWZvIGlzCisJCQkJICogZW1wdHkuIEFzayBmb3IgYSBUeCBkb25lIGludGVycnVwdCAqLworCQkJCXNlbGYtPmllciA9IElFUl9UWEVNUF9JRTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQ2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgZnJhbWVzIHRvIGJlCisJCQkJICogdHJhbnNtaXR0ZWQgKi8KKwkJCQlpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShzZWxmLT5uZXRkZXYpKSB7CisJCQkJCS8qIFByZXBhcmUgZm9yIHJlY2VpdmUgKi8KKwkJCQkJbnNjX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisJCQkJCXNlbGYtPmllciA9IElFUl9TRklGX0lFOworCQkJCX0gZWxzZQorCQkJCQlJUkRBX1dBUk5JTkcoIiVzKCksIHBvdGVudGlhbCAiCisJCQkJCQkgICAgICJUeCBxdWV1ZSBsb2NrdXAgIVxuIiwKKwkJCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qICBOb3QgZmluaXNoZWQgeWV0LCBzbyBpbnRlcnJ1cHQgb24gRE1BIGFnYWluICovCisJCQlzZWxmLT5pZXIgPSBJRVJfRE1BX0lFOworCQl9CisJfSBlbHNlIGlmIChlaXIgJiBFSVJfVFhFTVBfRVYpIHsKKwkJLyogVGhlIFR4IEZJRk8gaGFzIHRvdGFsbHkgZHJhaW5lZCBvdXQsIHNvIG5vdyB3ZSBjYW4gY2hhbmdlCisJCSAqIHRoZSBzcGVlZC4uLiAtIEplYW4gSUkgKi8KKwkJc2VsZi0+aWVyID0gbnNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPm5ld19zcGVlZCk7CisJCXNlbGYtPm5ld19zcGVlZCA9IDA7CisJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkJLyogTm90ZSA6IG5zY19pcmNjX2NoYW5nZV9zcGVlZCgpIHJlc3RhcnRlZCBSeCBmaWZvICovCisJfQorCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgQW4gaW50ZXJydXB0IGZyb20gdGhlIGNoaXAgaGFzIGFycml2ZWQuIFRpbWUgdG8gZG8gc29tZSB3b3JrCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbnNjX2lyY2NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGY7CisJX191OCBic3IsIGVpcjsKKwlpbnQgaW9iYXNlOworCisJaWYgKCFkZXYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsCisJCQkgICAgIGRyaXZlcl9uYW1lLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCXNlbGYgPSAoc3RydWN0IG5zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKworCXNwaW5fbG9jaygmc2VsZi0+bG9jayk7CQorCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlic3IgPSBpbmIoaW9iYXNlK0JTUik7IAkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CQorCXNlbGYtPmllciA9IGluYihpb2Jhc2UrSUVSKTsgCisJZWlyID0gaW5iKGlvYmFzZStFSVIpICYgc2VsZi0+aWVyOyAvKiBNYXNrIG91dCB0aGUgaW50ZXJlc3Rpbmcgb25lcyAqLyAKKworCW91dGIoMCwgaW9iYXNlK0lFUik7IC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCQorCWlmIChlaXIpIHsKKwkJLyogRGlzcGF0Y2ggaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IHNwZWVkICovCisJCWlmIChzZWxmLT5pby5zcGVlZCA+IDExNTIwMCkKKwkJCW5zY19pcmNjX2Zpcl9pbnRlcnJ1cHQoc2VsZiwgaW9iYXNlLCBlaXIpOworCQllbHNlCisJCQluc2NfaXJjY19zaXJfaW50ZXJydXB0KHNlbGYsIGVpcik7CisJfQorCQorCW91dGIoc2VsZi0+aWVyLCBpb2Jhc2UrSUVSKTsgLyogUmVzdG9yZSBpbnRlcnJ1cHRzICovCisJb3V0Yihic3IsIGlvYmFzZStCU1IpOyAgICAgICAvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKworCXNwaW5fdW5sb2NrKCZzZWxmLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChlaXIpOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfaXNfcmVjZWl2aW5nIChzZWxmKQorICoKKyAqICAgIFJldHVybiBUUlVFIGlzIHdlIGFyZSBjdXJyZW50bHkgcmVjZWl2aW5nIGEgZnJhbWUKKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGF0dXMgPSBGQUxTRTsKKwlpbnQgaW9iYXNlOworCV9fdTggYmFuazsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIEZBTFNFOyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKSB7CisJCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJCS8qIENoZWNrIGlmIHJ4IEZJRk8gaXMgbm90IGVtcHR5ICovCisJCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCQlpZiAoKGluYihpb2Jhc2UrUlhGTFYpICYgMHgzZikgIT0gMCkgeworCQkJLyogV2UgYXJlIHJlY2VpdmluZyBzb21ldGhpbmcgKi8KKwkJCXN0YXR1cyA9ICBUUlVFOworCQl9CisJCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisJfSBlbHNlIAorCQlzdGF0dXMgPSAoc2VsZi0+cnhfYnVmZi5zdGF0ZSAhPSBPVVRTSURFX0ZSQU1FKTsKKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfbmV0X29wZW4gKGRldikKKyAqCisgKiAgICBTdGFydCB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5zY19pcmNjX2NiICpzZWxmOworCWludCBpb2Jhc2U7CisJY2hhciBod25hbWVbMzJdOworCV9fdTggYmFuazsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlzZWxmID0gKHN0cnVjdCBuc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCQorCWlmIChyZXF1ZXN0X2lycShzZWxmLT5pby5pcnEsIG5zY19pcmNjX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpKSB7CisJCUlSREFfV0FSTklORygiJXMsIHVuYWJsZSB0byBhbGxvY2F0ZSBpcnE9JWRcbiIsCisJCQkgICAgIGRyaXZlcl9uYW1lLCBzZWxmLT5pby5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJLyoKKwkgKiBBbHdheXMgYWxsb2NhdGUgdGhlIERNQSBjaGFubmVsIGFmdGVyIHRoZSBJUlEsIGFuZCBjbGVhbiB1cCBvbiAKKwkgKiBmYWlsdXJlLgorCSAqLworCWlmIChyZXF1ZXN0X2RtYShzZWxmLT5pby5kbWEsIGRldi0+bmFtZSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcywgdW5hYmxlIHRvIGFsbG9jYXRlIGRtYT0lZFxuIiwKKwkJCSAgICAgZHJpdmVyX25hbWUsIHNlbGYtPmlvLmRtYSk7CisJCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCQorCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKwkKKwkvKiB0dXJuIG9uIGludGVycnVwdHMgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKElFUl9MU19JRSB8IElFUl9SWEhETF9JRSwgaW9iYXNlK0lFUik7CisKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCisJLyogUmVhZHkgdG8gcGxheSEgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCS8qIEdpdmUgc2VsZiBhIGhhcmR3YXJlIG5hbWUgKi8KKwlzcHJpbnRmKGh3bmFtZSwgIk5TQy1GSVIgQCAweCUwM3giLCBzZWxmLT5pby5maXJfYmFzZSk7CisKKwkvKiAKKwkgKiBPcGVuIG5ldyBJckxBUCBsYXllciBpbnN0YW5jZSwgbm93IHRoYXQgZXZlcnl0aGluZyBzaG91bGQgYmUKKwkgKiBpbml0aWFsaXplZCBwcm9wZXJseSAKKwkgKi8KKwlzZWxmLT5pcmxhcCA9IGlybGFwX29wZW4oZGV2LCAmc2VsZi0+cW9zLCBod25hbWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19uZXRfY2xvc2UgKGRldikKKyAqCisgKiAgICBTdG9wIHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5zY19pcmNjX2NiICpzZWxmOworCWludCBpb2Jhc2U7CisJX191OCBiYW5rOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlzZWxmID0gKHN0cnVjdCBuc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCisJLyogU3RvcCBkZXZpY2UgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogU3RvcCBhbmQgcmVtb3ZlIGluc3RhbmNlIG9mIElyTEFQICovCisJaWYgKHNlbGYtPmlybGFwKQorCQlpcmxhcF9jbG9zZShzZWxmLT5pcmxhcCk7CisJc2VsZi0+aXJsYXAgPSBOVUxMOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJZGlzYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoMCwgaW9iYXNlK0lFUik7IAorICAgICAgIAorCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgZGV2KTsKKwlmcmVlX2RtYShzZWxmLT5pby5kbWEpOworCisJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfbmV0X2lvY3RsIChkZXYsIHJxLCBjbWQpCisgKgorICogICAgUHJvY2VzcyBJT0NUTCBjb21tYW5kcyBmb3IgdGhpcyBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGlmX2lyZGFfcmVxICppcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopIHJxOworCXN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc2VsZiA9IGRldi0+cHJpdjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsIGNtZCk7CisJCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOiAvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJbnNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIFNJT0NTTUVESUFCVVNZOiAvKiBTZXQgbWVkaWEgYnVzeSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHNlbGYtPm5ldGRldiwgVFJVRSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6IC8qIENoZWNrIGlmIHdlIGFyZSByZWNlaXZpbmcgcmlnaHQgbm93ICovCisJCS8qIFRoaXMgaXMgYWxyZWFkeSBwcm90ZWN0ZWQgKi8KKwkJaXJxLT5pZnJfcmVjZWl2aW5nID0gbnNjX2lyY2NfaXNfcmVjZWl2aW5nKHNlbGYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuc2NfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5zY19pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBuc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJCisJcmV0dXJuICZzZWxmLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgbnNjX2lyY2Nfc3VzcGVuZChzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpCit7CisJSVJEQV9NRVNTQUdFKCIlcywgU3VzcGVuZGluZ1xuIiwgZHJpdmVyX25hbWUpOworCisJaWYgKHNlbGYtPmlvLnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJbnNjX2lyY2NfbmV0X2Nsb3NlKHNlbGYtPm5ldGRldik7CisKKwlzZWxmLT5pby5zdXNwZW5kZWQgPSAxOworfQorCitzdGF0aWMgdm9pZCBuc2NfaXJjY193YWtldXAoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKQoreworCWlmICghc2VsZi0+aW8uc3VzcGVuZGVkKQorCQlyZXR1cm47CisKKwluc2NfaXJjY19zZXR1cCgmc2VsZi0+aW8pOworCW5zY19pcmNjX25ldF9vcGVuKHNlbGYtPm5ldGRldik7CisJCisJSVJEQV9NRVNTQUdFKCIlcywgV2FraW5nIHVwXG4iLCBkcml2ZXJfbmFtZSk7CisKKwlzZWxmLT5pby5zdXNwZW5kZWQgPSAwOworfQorCitzdGF0aWMgaW50IG5zY19pcmNjX3BtcHJvYyhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKQoreworICAgICAgICBzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IG5zY19pcmNjX2NiKikgZGV2LT5kYXRhOworICAgICAgICBpZiAoc2VsZikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocnFzdCkgeworICAgICAgICAgICAgICAgIGNhc2UgUE1fU1VTUEVORDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zY19pcmNjX3N1c3BlbmQoc2VsZik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBNX1JFU1VNRToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zY19pcmNjX3dha2V1cChzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCXJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5TQyBJckRBIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCittb2R1bGVfcGFyYW0ocW9zX210dF9iaXRzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhxb3NfbXR0X2JpdHMsICJNaW5pbXVtIFR1cm4gVGltZSIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkJhc2UgSS9PIGFkZHJlc3NlcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIGxpbmVzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG1hLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJETUEgY2hhbm5lbHMiKTsKK21vZHVsZV9wYXJhbShkb25nbGVfaWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRvbmdsZV9pZCwgIlR5cGUtaWQgb2YgdXNlZCBkb25nbGUiKTsKKworbW9kdWxlX2luaXQobnNjX2lyY2NfaW5pdCk7Cittb2R1bGVfZXhpdChuc2NfaXJjY19jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5oIGIvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGY3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmgKQEAgLTAsMCArMSwyODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgbnNjLWlyY2MuaAorICogVmVyc2lvbjogICAgICAgCisgKiBEZXNjcmlwdGlvbjogICAKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIEZyaSBOb3YgMTMgMTQ6Mzc6NDAgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgU3VuIEphbiAyMyAxNzo0NzowMCAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4IExpY2hlbiBXYW5nLCA8bHdhbmdAYWN0aXN5cy5jb20+CisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4IEFjdGlzeXMgQ29ycC4sIHd3dy5hY3Rpc3lzLmNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIE5TQ19JUkNDX0gKKyNkZWZpbmUgTlNDX0lSQ0NfSAorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIERNQSBtb2RlcyBuZWVkZWQgKi8KKyNkZWZpbmUgRE1BX1RYX01PREUgICAgIDB4MDggICAgLyogTWVtIHRvIEkvTywgKyssIGRlbWFuZC4gKi8KKyNkZWZpbmUgRE1BX1JYX01PREUgICAgIDB4MDQgICAgLyogSS9PIHRvIG1lbSwgKyssIGRlbWFuZC4gKi8KKworLyogQ29uZmlnIHJlZ2lzdGVycyBmb3IgdGhlICcxMDggKi8KKyNkZWZpbmUgQ0ZHXzEwOF9CQUlDIDB4MDAKKyNkZWZpbmUgQ0ZHXzEwOF9DU1JUIDB4MDEKKyNkZWZpbmUgQ0ZHXzEwOF9NQ1RMIDB4MDIKKworLyogQ29uZmlnIHJlZ2lzdGVycyBmb3IgdGhlICczMzggKi8KKyNkZWZpbmUgQ0ZHXzMzOF9GRVIgIDB4MDAKKyNkZWZpbmUgQ0ZHXzMzOF9GQVIgIDB4MDEKKyNkZWZpbmUgQ0ZHXzMzOF9QVFIgIDB4MDIKKyNkZWZpbmUgQ0ZHXzMzOF9QTlAwIDB4MWIKKyNkZWZpbmUgQ0ZHXzMzOF9QTlAxIDB4MWMKKyNkZWZpbmUgQ0ZHXzMzOF9QTlAzIDB4NGYKKworLyogQ29uZmlnIHJlZ2lzdGVycyBmb3IgdGhlICczOXggKGluIHRoZSBsb2dpY2FsIGRldmljZSBiYW5rKSAqLworI2RlZmluZSBDRkdfMzlYX0xETgkweDA3CS8qIExvZ2ljYWwgZGV2aWNlIG51bWJlciAoU3VwZXIgSS9PIGJhbmspICovCisjZGVmaW5lIENGR18zOVhfU0lPQ0YxCTB4MjEJLyogU3VwZXJJL08gQ29uZmlnICovCisjZGVmaW5lIENGR18zOVhfQUNUCTB4MzAJLyogRGV2aWNlIGFjdGl2YXRpb24gKi8KKyNkZWZpbmUgQ0ZHXzM5WF9CQVNFSAkweDYwCS8qIERldmljZSBiYXNlIGFkZHJlc3MgKGhpZ2ggYml0cykgKi8KKyNkZWZpbmUgQ0ZHXzM5WF9CQVNFTAkweDYxCS8qIERldmljZSBiYXNlIGFkZHJlc3MgKGxvdyBiaXRzKSAqLworI2RlZmluZSBDRkdfMzlYX0lSUU5VTQkweDcwCS8qIEludGVycnVwdCBudW1iZXIgJiB3YWtlIHVwIGVuYWJsZSAqLworI2RlZmluZSBDRkdfMzlYX0lSUVNFTAkweDcxCS8qIEludGVycnVwdCBzZWxlY3QgKGVkZ2UvbGV2ZWwgKyBwb2xhcml0eSkgKi8KKyNkZWZpbmUgQ0ZHXzM5WF9ETUEwCTB4NzQJLyogRE1BIDAgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDRkdfMzlYX0RNQTEJMHg3NQkvKiBETUEgMSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIENGR18zOVhfU1BDCTB4RjAJLyogU2VyaWFsIHBvcnQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCisvKiBGbGFncyBmb3IgY29uZmlndXJhdGlvbiByZWdpc3RlciBDUkYwICovCisjZGVmaW5lIEFQRURDUkMJCTB4MDIKKyNkZWZpbmUgRU5CTktTRUwJMHgwMQorCisvKiBTZXQgMCAqLworI2RlZmluZSBUWEQgICAgICAgICAgICAgMHgwMCAvKiBUcmFuc21pdCBkYXRhIHBvcnQgKi8KKyNkZWZpbmUgUlhEICAgICAgICAgICAgIDB4MDAgLyogUmVjZWl2ZSBkYXRhIHBvcnQgKi8KKworLyogUmVnaXN0ZXIgMSAqLworI2RlZmluZSBJRVIJCTB4MDEgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciovCisjZGVmaW5lIElFUl9SWEhETF9JRSAgICAweDAxIC8qIFJlY2VpdmVyIGhpZ2ggZGF0YSBsZXZlbCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUVSX1RYTERMX0lFICAgIDB4MDIgLyogVHJhbnNlaXZlciBsb3cgZGF0YSBsZXZlbCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUVSX0xTX0lFCTB4MDQvLyogTGluayBTdGF0dXMgSW50ZXJydXB0ICovCisjZGVmaW5lIElFUl9FVFhVUkkgICAgICAweDA0IC8qIFR4IHVuZGVycnVuICovCisjZGVmaW5lIElFUl9ETUFfSUUJMHgxMCAvKiBETUEgZmluaXNoZWQgaW50ZXJydXB0ICovCisjZGVmaW5lIElFUl9UWEVNUF9JRSAgICAweDIwCisjZGVmaW5lIElFUl9TRklGX0lFICAgICAweDQwIC8qIEZyYW1lIHN0YXR1cyBGSUZPIGludHIgKi8KKyNkZWZpbmUgSUVSX1RNUl9JRSAgICAgIDB4ODAgLyogVGltZXIgZXZlbnQgKi8KKworI2RlZmluZSBGQ1IJCTB4MDIgLyogKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIEZDUl9GSUZPX0VOICAgICAweDAxIC8qIEVuYWJsZSBGSUZPJ3MgKi8KKyNkZWZpbmUgRkNSX1JYU1IgICAgICAgIDB4MDIgLyogUnggRklGTyBzb2Z0IHJlc2V0ICovCisjZGVmaW5lIEZDUl9UWFNSICAgICAgICAweDA0IC8qIFR4IEZJRk8gc29mdCByZXNldCAqLworI2RlZmluZSBGQ1JfUlhUSAkweDQwIC8qIFJ4IEZJRk8gdGhyZXNob2xkIChzZXQgdG8gMTYpICovCisjZGVmaW5lIEZDUl9UWFRICTB4MjAgLyogVHggRklGTyB0aHJlc2hvbGQgKHNldCB0byAxNykgKi8KKworI2RlZmluZSBFSVIJCTB4MDIgLyogKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgRUlSX1JYSERMX0VWCTB4MDEKKyNkZWZpbmUgRUlSX1RYTERMX0VWICAgIDB4MDIKKyNkZWZpbmUgRUlSX0xTX0VWCTB4MDQKKyNkZWZpbmUgRUlSX0RNQV9FVgkweDEwCisjZGVmaW5lIEVJUl9UWEVNUF9FVgkweDIwCisjZGVmaW5lIEVJUl9TRklGX0VWICAgICAweDQwCisjZGVmaW5lIEVJUl9UTVJfRVYgICAgICAweDgwCisKKyNkZWZpbmUgTENSICAgICAgICAgICAgIDB4MDMgLyogTGluayBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIExDUl9XTFNfOCAgICAgICAweDAzIC8qIDggYml0cyAqLworCisjZGVmaW5lIEJTUiAJICAgICAgICAweDAzIC8qIEJhbmsgc2VsZWN0IHJlZ2lzdGVyICovCisjZGVmaW5lIEJTUl9CS1NFICAgICAgICAweDgwCisjZGVmaW5lIEJBTkswIAkgICAgICAgIExDUl9XTFNfOCAvKiBNdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIHNldCA4TjEgKi8KKyNkZWZpbmUgQkFOSzEJICAgICAgICAweDgwCisjZGVmaW5lIEJBTksyCSAgICAgICAgMHhlMAorI2RlZmluZSBCQU5LMwkgICAgICAgIDB4ZTQKKyNkZWZpbmUgQkFOSzQJICAgICAgICAweGU4CisjZGVmaW5lIEJBTks1CSAgICAgICAgMHhlYworI2RlZmluZSBCQU5LNgkgICAgICAgIDB4ZjAKKyNkZWZpbmUgQkFOSzcgICAgIAkweGY0CisKKyNkZWZpbmUgTUNSCQkweDA0IC8qIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNQ1JfTU9ERV9NQVNLCX4oMHhkMCkKKyNkZWZpbmUgTUNSX1VBUlQgICAgICAgIDB4MDAKKyNkZWZpbmUgTUNSX1JFU0VSVkVEICAJMHgyMAkKKyNkZWZpbmUgTUNSX1NIQVJQX0lSICAgIDB4NDAKKyNkZWZpbmUgTUNSX1NJUiAgICAgICAgIDB4NjAKKyNkZWZpbmUgTUNSX01JUiAgCTB4ODAKKyNkZWZpbmUgTUNSX0ZJUgkJMHhhMAorI2RlZmluZSBNQ1JfQ0VJUiAgICAgICAgMHhiMAorI2RlZmluZSBNQ1JfSVJfUExTICAgICAgMHgxMAorI2RlZmluZSBNQ1JfRE1BX0VOCTB4MDQKKyNkZWZpbmUgTUNSX0VOX0lSUQkweDA4CisjZGVmaW5lIE1DUl9UWF9ERlIJMHgwOAorCisjZGVmaW5lIExTUiAgICAgICAgICAgICAweDA1IC8qIExpbmsgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIExTUl9SWERBICAgICAgICAweDAxIC8qIFJlY2VpdmVyIGRhdGEgYXZhaWxhYmxlICovCisjZGVmaW5lIExTUl9UWFJEWSAgICAgICAweDIwIC8qIFRyYW5zbWl0dGVyIHJlYWR5ICovCisjZGVmaW5lIExTUl9UWEVNUCAgICAgICAweDQwIC8qIFRyYW5zbWl0dGVyIGVtcHR5ICovCisKKyNkZWZpbmUgQVNDUiAgICAgICAgICAgIDB4MDcgLyogQXV4aWxsYXJ5IFN0YXR1cyBhbmQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBBU0NSX1JYRl9UT1VUICAgMHgwMSAvKiBSeCBGSUZPIHRpbWVvdXQgKi8KKyNkZWZpbmUgQVNDUl9GRU5EX0lORiAgIDB4MDIgLyogRnJhbWUgZW5kIGJ5dGVzIGluIHJ4IEZJRk8gKi8KKyNkZWZpbmUgQVNDUl9TX0VPVCAgICAgIDB4MDQgLyogU2V0IGVuZCBvZiB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgQVNDVF9SWEJTWSAgICAgIDB4MjAgLyogUnggYnVzeSAqLworI2RlZmluZSBBU0NSX1RYVVIgICAgICAgMHg0MCAvKiBUcmFuc2VpdmVyIHVuZGVycnVuICovCisjZGVmaW5lIEFTQ1JfQ1RFICAgICAgICAweDgwIC8qIENsZWFyIHRpbWVyIGV2ZW50ICovCisKKy8qIEJhbmsgMiAqLworI2RlZmluZSBCR0RMICAgICAgICAgICAgMHgwMCAvKiBCYXVkIEdlbmVyYXRvciBEaXZpc29yIFBvcnQgKExvdyBCeXRlKSAqLworI2RlZmluZSBCR0RIICAgICAgICAgICAgMHgwMSAvKiBCYXVkIEdlbmVyYXRvciBEaXZpc29yIFBvcnQgKEhpZ2ggQnl0ZSkgKi8KKworI2RlZmluZSBFQ1IxCQkweDAyIC8qIEV4dGVuZGVkIENvbnRyb2wgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBFQ1IxX0VYVF9TTAkweDAxIC8qIEV4dGVuZGVkIE1vZGUgU2VsZWN0ICovCisjZGVmaW5lIEVDUjFfRE1BTkYJMHgwMiAvKiBETUEgRmFpcm5lc3MgKi8KKyNkZWZpbmUgRUNSMV9ETUFUSCAgICAgIDB4MDQgLyogRE1BIFRocmVzaG9sZCAqLworI2RlZmluZSBFQ1IxX0RNQVNXUAkweDA4IC8qIERNQSBTd2FwICovCisKKyNkZWZpbmUgRVhDUjIJCTB4MDQKKyNkZWZpbmUgRVhDUjJfVEZTSVoJMHgwMSAvKiBSeCBGSUZPIHNpemUgPSAzMiAqLworI2RlZmluZSBFWENSMl9SRlNJWgkweDA0IC8qIFR4IEZJRk8gc2l6ZSA9IDMyICovCisKKyNkZWZpbmUgVFhGTFYgICAgICAgICAgIDB4MDYgLyogVHggRklGTyBsZXZlbCAqLworI2RlZmluZSBSWEZMViAgICAgICAgICAgMHgwNyAvKiBSeCBGSUZPIGxldmVsICovCisKKy8qIEJhbmsgMyAqLworI2RlZmluZSBNSUQJCTB4MDAKKworLyogQmFuayA0ICovCisjZGVmaW5lIFRNUkwgICAgICAgICAgICAweDAwIC8qIFRpbWVyIGxvdyBieXRlICovCisjZGVmaW5lIFRNUkggICAgICAgICAgICAweDAxIC8qIFRpbWVyIGhpZ2ggYnl0ZSAqLworI2RlZmluZSBJUkNSMSAgICAgICAgICAgMHgwMiAvKiBJbmZyYXJlZCBjb250cm9sIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgSVJDUjFfVE1SX0VOICAgIDB4MDEgLyogVGltZXIgZW5hYmxlICovCisKKyNkZWZpbmUgVEZSTEwJCTB4MDQKKyNkZWZpbmUgVEZSTEgJCTB4MDUKKyNkZWZpbmUgUkZSTEwJCTB4MDYKKyNkZWZpbmUgUkZSTEgJCTB4MDcKKworLyogQmFuayA1ICovCisjZGVmaW5lIElSQ1IyICAgICAgICAgICAweDA0IC8qIEluZnJhcmVkIGNvbnRyb2wgcmVnaXN0ZXIgMiAqLworI2RlZmluZSBJUkNSMl9NRFJTICAgICAgMHgwNCAvKiBNSVIgZGF0YSByYXRlIHNlbGVjdCAqLworI2RlZmluZSBJUkNSMl9GRU5EX01EICAgMHgyMCAvKiAqLworCisjZGVmaW5lIEZSTV9TVCAgICAgICAgICAweDA1IC8qIEZyYW1lIHN0YXR1cyBGSUZPICovCisjZGVmaW5lIEZSTV9TVF9WTEQgICAgICAweDgwIC8qIEZyYW1lIHN0YXR1cyBGSUZPIGRhdGEgdmFsaWQgKi8KKyNkZWZpbmUgRlJNX1NUX0VSUl9NU0sgIDB4NWYKKyNkZWZpbmUgRlJNX1NUX0xPU1RfRlIgIDB4NDAgLyogRnJhbWUgbG9zdCAqLworI2RlZmluZSBGUk1fU1RfTUFYX0xFTiAgMHgxMCAvKiBNYXggZnJhbWUgbGVuIGV4Y2VlZGVkICovCisjZGVmaW5lIEZSTV9TVF9QSFlfRVJSICAweDA4IC8qIFBoeXNpY2FsIGxheWVyIGVycm9yICovCisjZGVmaW5lIEZSTV9TVF9CQURfQ1JDICAweDA0IAorI2RlZmluZSBGUk1fU1RfT1ZSMSAgICAgMHgwMiAvKiBSeCBGSUZPIG92ZXJydW4gKi8KKyNkZWZpbmUgRlJNX1NUX09WUjIgICAgIDB4MDEgLyogRnJhbWUgc3RhdHVzIEZJRk8gb3ZlcnJ1biAqLworCisjZGVmaW5lIFJGTEZMICAgICAgICAgICAweDA2CisjZGVmaW5lIFJGTEZIICAgICAgICAgICAweDA3CisKKy8qIEJhbmsgNiAqLworI2RlZmluZSBJUl9DRkcyCQkweDAwCisjZGVmaW5lIElSX0NGRzJfRElTX0NSQwkweDAyCisKKy8qIEJhbmsgNyAqLworI2RlZmluZSBJUk1fQ1IJCTB4MDcgLyogSW5mcmFyZWQgbW9kdWxlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVJNX0NSX0lSWF9NU0wJMHg0MAorI2RlZmluZSBJUk1fQ1JfQUZfTU5UICAgMHg4MCAvKiBBdXRvbWF0aWMgZm9ybWF0ICovCisKKy8qIE5TQyBjaGlwIGluZm9ybWF0aW9uICovCitzdHJ1Y3QgbnNjX2NoaXAgeworCWNoYXIgKm5hbWU7ICAgICAgICAgIC8qIE5hbWUgb2YgY2hpcHNldCAqLworCWludCBjZmdbM107ICAgICAgICAgIC8qIENvbmZpZyByZWdpc3RlcnMgKi8KKwl1X2ludDhfdCBjaWRfaW5kZXg7ICAvKiBDaGlwIGlkZW50aWZpY2F0aW9uIGluZGV4IHJlZyAqLworCXVfaW50OF90IGNpZF92YWx1ZTsgIC8qIENoaXAgaWRlbnRpZmljYXRpb24gZXhwZWN0ZWQgdmFsdWUgKi8KKwl1X2ludDhfdCBjaWRfbWFzazsgICAvKiBDaGlwIGlkZW50aWZpY2F0aW9uIHJldmlzaW9uIG1hc2sgKi8KKworCS8qIEZ1bmN0aW9ucyBmb3IgcHJvYmluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzcGVjaWZpYyBjaGlwICovCisJaW50ICgqcHJvYmUpKHN0cnVjdCBuc2NfY2hpcCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworCWludCAoKmluaXQpKHN0cnVjdCBuc2NfY2hpcCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworfTsKK3R5cGVkZWYgc3RydWN0IG5zY19jaGlwIG5zY19jaGlwX3Q7CisKKy8qIEZvciBzdG9yaW5nIGVudHJpZXMgaW4gdGhlIHN0YXR1cyBGSUZPICovCitzdHJ1Y3Qgc3RfZmlmb19lbnRyeSB7CisJaW50IHN0YXR1czsKKwlpbnQgbGVuOworfTsKKworI2RlZmluZSBNQVhfVFhfV0lORE9XIDcKKyNkZWZpbmUgTUFYX1JYX1dJTkRPVyA3CisKK3N0cnVjdCBzdF9maWZvIHsKKwlzdHJ1Y3Qgc3RfZmlmb19lbnRyeSBlbnRyaWVzW01BWF9SWF9XSU5ET1ddOworCWludCBwZW5kaW5nX2J5dGVzOworCWludCBoZWFkOworCWludCB0YWlsOworCWludCBsZW47Cit9OworCitzdHJ1Y3QgZnJhbWVfY2IgeworCXZvaWQgKnN0YXJ0OyAvKiBTdGFydCBvZiBmcmFtZSBpbiBETUEgbWVtICovCisJaW50IGxlbjsgICAgIC8qIExlbmdodCBvZiBmcmFtZSBpbiBETUEgbWVtICovCit9OworCitzdHJ1Y3QgdHhfZmlmbyB7CisJc3RydWN0IGZyYW1lX2NiIHF1ZXVlW01BWF9UWF9XSU5ET1ddOyAvKiBJbmZvIGFib3V0IGZyYW1lcyBpbiBxdWV1ZSAqLworCWludCAgICAgICAgICAgICBwdHI7ICAgICAgICAgICAgICAgICAgLyogQ3VycmVudGx5IGJlaW5nIHNlbnQgKi8KKwlpbnQgICAgICAgICAgICAgbGVuOyAgICAgICAgICAgICAgICAgIC8qIExlbmdodCBvZiBxdWV1ZSAqLworCWludCAgICAgICAgICAgICBmcmVlOyAgICAgICAgICAgICAgICAgLyogTmV4dCBmcmVlIHNsb3QgKi8KKwl2b2lkICAgICAgICAgICAqdGFpbDsgICAgICAgICAgICAgICAgIC8qIE5leHQgZnJlZSBzdGFydCBpbiBETUEgbWVtICovCit9OworCisvKiBQcml2YXRlIGRhdGEgZm9yIGVhY2ggaW5zdGFuY2UgKi8KK3N0cnVjdCBuc2NfaXJjY19jYiB7CisJc3RydWN0IHN0X2ZpZm8gc3RfZmlmbzsgICAgLyogSW5mbyBhYm91dCByZWNlaXZlZCBmcmFtZXMgKi8KKwlzdHJ1Y3QgdHhfZmlmbyB0eF9maWZvOyAgICAvKiBJbmZvIGFib3V0IGZyYW1lcyB0byBiZSB0cmFuc21pdHRlZCAqLworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgIC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwkKKwlzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwOyAgICAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCisJc3RydWN0IHFvc19pbmZvIHFvczsgICAgICAgLyogUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhpcyBkZXZpY2UgKi8KKwkKKwljaGlwaW9fdCBpbzsgICAgICAgICAgICAgICAvKiBJckRBIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKwlpb2J1ZmZfdCB0eF9idWZmOyAgICAgICAgICAvKiBUcmFuc21pdCBidWZmZXIgKi8KKwlpb2J1ZmZfdCByeF9idWZmOyAgICAgICAgICAvKiBSZWNlaXZlIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgdHhfYnVmZl9kbWE7CisJZG1hX2FkZHJfdCByeF9idWZmX2RtYTsKKworCV9fdTggaWVyOyAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKworCXN0cnVjdCB0aW1ldmFsIHN0YW1wOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCXNwaW5sb2NrX3QgbG9jazsgICAgICAgICAgIC8qIEZvciBzZXJpYWxpemluZyBvcGVyYXRpb25zICovCisJCisJX191MzIgbmV3X3NwZWVkOworCWludCBpbmRleDsgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGluZGV4ICovCisKKyAgICAgICAgc3RydWN0IHBtX2RldiAqZGV2OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9iYW5rKGludCBpb2Jhc2UsIGludCBiYW5rKQoreworCQlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworfQorCisjZW5kaWYgLyogTlNDX0lSQ0NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9vbGRfYmVsa2luLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9vbGRfYmVsa2luLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjJjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL29sZF9iZWxraW4tc2lyLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgb2xkX2JlbGtpbi5jCisgKiBWZXJzaW9uOiAgICAgICAxLjEKKyAqIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIEJlbGtpbiAob2xkKSBTbWFydEJlYW0gZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuLi4KKyAqIEF1dGhvcjogICAgICAgIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqIENyZWF0ZWQgYXQ6ICAgIDIyLzExLzk5CisgKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjEzOjMyIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBKZWFuIFRvdXJyaWxoZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKy8vICNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCisvKgorICogQmVsa2luIGlzIHNlbGxpbmcgYSBkb25nbGUgY2FsbGVkIHRoZSBTbWFydEJlYW0uCisgKiBJbiBmYWN0LCB0aGVyZSBpcyB0d28gaGFyZHdhcmUgdmVyc2lvbiBvZiB0aGlzIGRvbmdsZSwgb2YgY291cnNlIHdpdGgKKyAqIHRoZSBzYW1lIG5hbWUgYW5kIGxvb2tpbmcgdGhlIGV4YWN0bHkgc2FtZSAoZ3Jyci4uLikuCisgKiBJIGd1ZXNzIHRoYXQgSSd2ZSBnb3QgdGhlIG9sZCBvbmUsIGJlY2F1c2UgaW5zaWRlIEkgZG9uJ3QgaGF2ZQorICogYSBqdW1wZXIgZm9yIElyREEvQVNLLi4uCisgKgorICogQXMgZmFyIGFzIEkgY2FuIG1ha2UgaXQgZnJvbSBpbmZvIG9uIHRoZWlyIHdlYiBzaXRlLCB0aGUgb2xkIGRvbmdsZSAKKyAqIHN1cHBvcnQgb25seSA5NjAwIGIvcywgd2hpY2ggbWFrZSBvdXIgbGlmZSBtdWNoIHNpbXBsZXIgYXMgZmFyIGFzCisgKiB0aGUgZHJpdmVyIGlzIGNvbmNlcm5lZCwgYnV0IHlvdSBtaWdodCBub3QgbGlrZSBpdCB2ZXJ5IG11Y2ggOy0pCisgKiBUaGUgbmV3IFNtYXJ0QmVhbSBkb2VzIDExNSBrYi9zLCBhbmQgSSd2ZSBub3QgdGVzdGVkIGl0Li4uCisgKgorICogQmVsa2luIGNsYWltIHRoYXQgdGhlIGNvcnJlY3QgZHJpdmVyIGZvciB0aGUgb2xkIGRvbmdsZSAoaW4gV2luZG93cykKKyAqIGlzIHRoZSBnZW5lcmljIFBhcmFsbGF4IDk1MDBhIGRyaXZlciwgYnV0IHRoZSBMaW51eCBMaXRlTGluayBkcml2ZXIKKyAqIGZhaWxzIGZvciBtZSAocHJvYmFibHkgYmVjYXVzZSBMaW51eC1JckRBIGRvZXNuJ3QgcmF0ZSBmYWxsYmFjayksCisgKiBzbyBJIGNyZWF0ZWQgdGhpcyByZWFsbHkgZHVtYiBkcml2ZXIuLi4KKyAqCisgKiBJbiBmYWN0LCB0aGlzIGRyaXZlciBkb2Vzbid0IGRvIG11Y2guIFRoZSBvbmx5IHRoaW5nIGl0IGRvZXMgaXMgdG8KKyAqIHByZXZlbnQgTGludXgtSXJEQSB0byB1c2UgYW55IG90aGVyIHNwZWVkIHRoYW4gOTYwMCBiL3MgOy0pIFRoaXMKKyAqIGRyaXZlciBpcyBjYWxsZWQgIm9sZF9iZWxraW4iIHNvIHRoYXQgd2hlbiB0aGUgbmV3IFNtYXJ0QmVhbSBpcyBzdXBwb3J0ZWQKKyAqIGl0cyBkcml2ZXIgY2FuIGJlIGNhbGxlZCAiYmVsa2luIiBpbnN0ZWFkIG9mICJuZXdfYmVsa2luIi4KKyAqCisgKiBOb3RlIDogdGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gd2l0aG91dCBhbnkgaW5mby9oZWxwIGZyb20gQmVsa2luLAorICogc28gYSBsb3Qgb2YgaW5mbyBoZXJlIG1pZ2h0IGJlIHRvdGFsbHkgd3JvbmcuIEJsYW1lIG1lIDstKQorICovCisKK3N0YXRpYyBpbnQgb2xkX2JlbGtpbl9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBvbGRfYmVsa2luX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBvbGRfYmVsa2luX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCk7CitzdGF0aWMgaW50IG9sZF9iZWxraW5fcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldik7CisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciBvbGRfYmVsa2luID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiT2xkIEJlbGtpbiBTbWFydEJlYW0iLAorCS50eXBlCQk9IElSREFfT0xEX0JFTEtJTl9ET05HTEUsCisJLm9wZW4JCT0gb2xkX2JlbGtpbl9vcGVuLAorCS5jbG9zZQkJPSBvbGRfYmVsa2luX2Nsb3NlLAorCS5yZXNldAkJPSBvbGRfYmVsa2luX3Jlc2V0LAorCS5zZXRfc3BlZWQJPSBvbGRfYmVsa2luX2NoYW5nZV9zcGVlZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9sZF9iZWxraW5fc2lyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9yZWdpc3Rlcl9kb25nbGUoJm9sZF9iZWxraW4pOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb2xkX2JlbGtpbl9zaXJfY2xlYW51cCh2b2lkKQoreworCWlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoJm9sZF9iZWxraW4pOworfQorCitzdGF0aWMgaW50IG9sZF9iZWxraW5fb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXN0cnVjdCBxb3NfaW5mbyAqcW9zID0gJmRldi0+cW9zOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIG9uIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJLyogTm90IHRvbyBmYXN0LCBwbGVhc2UuLi4gKi8KKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDA7CisJLyogTmVlZHMgYXQgbGVhc3QgMTAgbXMgKHRvdGFsbHkgd2lsZCBndWVzcywgY2FuIGRvIHByb2JhYmx5IGJldHRlcikgKi8KKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDE7CisJaXJkYV9xb3NfYml0c190b192YWx1ZShxb3MpOworCisJLyogaXJkYSB0aHJlYWQgd2FpdHMgNTAgbXNlYyBmb3IgcG93ZXIgc2V0dGxpbmcgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9sZF9iZWxraW5fY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG9sZF9iZWxraW5fY2hhbmdlX3NwZWVkICh0YXNrKQorICoKKyAqICAgIFdpdGggb25seSBvbmUgc3BlZWQgYXZhaWxhYmxlLCBub3QgbXVjaCB0byBkby4uLgorICovCitzdGF0aWMgaW50IG9sZF9iZWxraW5fY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlkZXYtPnNwZWVkID0gOTYwMDsKKwlyZXR1cm4gKHNwZWVkPT1kZXYtPnNwZWVkKSA/IDAgOiAtRUlOVkFMOworfQorCisvKgorICogRnVuY3Rpb24gb2xkX2JlbGtpbl9yZXNldCAodGFzaykKKyAqCisgKiAgICAgIFJlc2V0IHRoZSBPbGQtQmVsa2luIHR5cGUgZG9uZ2xlLgorICoKKyAqLworc3RhdGljIGludCBvbGRfYmVsa2luX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFRoaXMgZG9uZ2xlcyBzcGVlZCAiZGVmYXVsdHMiIHRvIDk2MDAgYnBzIDstKSAqLworCWRldi0+c3BlZWQgPSA5NjAwOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmVsa2luIChvbGQpIFNtYXJ0QmVhbSBkb25nbGUgZHJpdmVyIik7CQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS03Iik7IC8qIElSREFfT0xEX0JFTEtJTl9ET05HTEUgKi8KKworbW9kdWxlX2luaXQob2xkX2JlbGtpbl9zaXJfaW5pdCk7Cittb2R1bGVfZXhpdChvbGRfYmVsa2luX3Npcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvb2xkX2JlbGtpbi5jIGIvZHJpdmVycy9uZXQvaXJkYS9vbGRfYmVsa2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmODFmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvb2xkX2JlbGtpbi5jCkBAIC0wLDAgKzEsMTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIG9sZF9iZWxraW4uYworICogVmVyc2lvbjogICAgICAgMS4xCisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBCZWxraW4gKG9sZCkgU21hcnRCZWFtIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLi4uCisgKiBBdXRob3I6ICAgICAgICBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiBDcmVhdGVkIGF0OiAgICAyMi8xMS85OQorICogTW9kaWZpZWQgYXQ6ICAgRnJpIERlYyAxNyAwOToxMzozMiAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgSmVhbiBUb3VycmlsaGVzLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworLyoKKyAqIEJlbGtpbiBpcyBzZWxsaW5nIGEgZG9uZ2xlIGNhbGxlZCB0aGUgU21hcnRCZWFtLgorICogSW4gZmFjdCwgdGhlcmUgaXMgdHdvIGhhcmR3YXJlIHZlcnNpb24gb2YgdGhpcyBkb25nbGUsIG9mIGNvdXJzZSB3aXRoCisgKiB0aGUgc2FtZSBuYW1lIGFuZCBsb29raW5nIHRoZSBleGFjdGx5IHNhbWUgKGdycnIuLi4pLgorICogSSBndWVzcyB0aGF0IEkndmUgZ290IHRoZSBvbGQgb25lLCBiZWNhdXNlIGluc2lkZSBJIGRvbid0IGhhdmUKKyAqIGEganVtcGVyIGZvciBJckRBL0FTSy4uLgorICoKKyAqIEFzIGZhciBhcyBJIGNhbiBtYWtlIGl0IGZyb20gaW5mbyBvbiB0aGVpciB3ZWIgc2l0ZSwgdGhlIG9sZCBkb25nbGUgCisgKiBzdXBwb3J0IG9ubHkgOTYwMCBiL3MsIHdoaWNoIG1ha2Ugb3VyIGxpZmUgbXVjaCBzaW1wbGVyIGFzIGZhciBhcworICogdGhlIGRyaXZlciBpcyBjb25jZXJuZWQsIGJ1dCB5b3UgbWlnaHQgbm90IGxpa2UgaXQgdmVyeSBtdWNoIDstKQorICogVGhlIG5ldyBTbWFydEJlYW0gZG9lcyAxMTUga2IvcywgYW5kIEkndmUgbm90IHRlc3RlZCBpdC4uLgorICoKKyAqIEJlbGtpbiBjbGFpbSB0aGF0IHRoZSBjb3JyZWN0IGRyaXZlciBmb3IgdGhlIG9sZCBkb25nbGUgKGluIFdpbmRvd3MpCisgKiBpcyB0aGUgZ2VuZXJpYyBQYXJhbGxheCA5NTAwYSBkcml2ZXIsIGJ1dCB0aGUgTGludXggTGl0ZUxpbmsgZHJpdmVyCisgKiBmYWlscyBmb3IgbWUgKHByb2JhYmx5IGJlY2F1c2UgTGludXgtSXJEQSBkb2Vzbid0IHJhdGUgZmFsbGJhY2spLAorICogc28gSSBjcmVhdGVkIHRoaXMgcmVhbGx5IGR1bWIgZHJpdmVyLi4uCisgKgorICogSW4gZmFjdCwgdGhpcyBkcml2ZXIgZG9lc24ndCBkbyBtdWNoLiBUaGUgb25seSB0aGluZyBpdCBkb2VzIGlzIHRvCisgKiBwcmV2ZW50IExpbnV4LUlyREEgdG8gdXNlIGFueSBvdGhlciBzcGVlZCB0aGFuIDk2MDAgYi9zIDstKSBUaGlzCisgKiBkcml2ZXIgaXMgY2FsbGVkICJvbGRfYmVsa2luIiBzbyB0aGF0IHdoZW4gdGhlIG5ldyBTbWFydEJlYW0gaXMgc3VwcG9ydGVkCisgKiBpdHMgZHJpdmVyIGNhbiBiZSBjYWxsZWQgImJlbGtpbiIgaW5zdGVhZCBvZiAibmV3X2JlbGtpbiIuCisgKgorICogTm90ZSA6IHRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIHdpdGhvdXQgYW55IGluZm8vaGVscCBmcm9tIEJlbGtpbiwKKyAqIHNvIGEgbG90IG9mIGluZm8gaGVyZSBtaWdodCBiZSB0b3RhbGx5IHdyb25nLiBCbGFtZSBtZSA7LSkKKyAqLworCisvKiBMZXQncyBndWVzcyAqLworI2RlZmluZSBNSU5fREVMQVkgMjUgICAgICAvKiAxNSB1cywgYnV0IHdhaXQgYSBsaXR0bGUgbW9yZSB0byBiZSBzdXJlICovCisKK3N0YXRpYyB2b2lkIG9sZF9iZWxraW5fb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgb2xkX2JlbGtpbl9jbG9zZShkb25nbGVfdCAqc2VsZik7CitzdGF0aWMgaW50ICBvbGRfYmVsa2luX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyBpbnQgIG9sZF9iZWxraW5fcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CisKKy8qIFRoZXNlIGFyZSB0aGUgYmF1ZHJhdGVzIHN1cHBvcnRlZCAqLworLyogc3RhdGljIF9fdTMyIGJhdWRfcmF0ZXNbXSA9IHsgOTYwMCB9OyAqLworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9yZWcgZG9uZ2xlID0geworCS50eXBlID0gSVJEQV9PTERfQkVMS0lOX0RPTkdMRSwKKwkub3BlbiA9IG9sZF9iZWxraW5fb3BlbiwKKwkuY2xvc2UgPSBvbGRfYmVsa2luX2Nsb3NlLAorCS5yZXNldCA9IG9sZF9iZWxraW5fcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IG9sZF9iZWxraW5fY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb2xkX2JlbGtpbl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9sZF9iZWxraW5fY2xlYW51cCh2b2lkKQoreworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBvbGRfYmVsa2luX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCS8qIE5vdCB0b28gZmFzdCwgcGxlYXNlLi4uICovCisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwOworCS8qIE5lZWRzIGF0IGxlYXN0IDEwIG1zICh0b3RhbGx5IHdpbGQgZ3Vlc3MsIGNhbiBkbyBwcm9iYWJseSBiZXR0ZXIpICovCisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOworfQorCitzdGF0aWMgdm9pZCBvbGRfYmVsa2luX2Nsb3NlKGRvbmdsZV90ICpzZWxmKQoreworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBvbGRfYmVsa2luX2NoYW5nZV9zcGVlZCAodGFzaykKKyAqCisgKiAgICBXaXRoIG9ubHkgb25lIHNwZWVkIGF2YWlsYWJsZSwgbm90IG11Y2ggdG8gZG8uLi4KKyAqLworc3RhdGljIGludCBvbGRfYmVsa2luX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gb2xkX2JlbGtpbl9yZXNldCAodGFzaykKKyAqCisgKiAgICAgIFJlc2V0IHRoZSBPbGQtQmVsa2luIHR5cGUgZG9uZ2xlLgorICoKKyAqLworc3RhdGljIGludCBvbGRfYmVsa2luX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisKKwkvKiBQb3dlciBvbiBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkvKiBUaGlzIGRvbmdsZXMgc3BlZWQgImRlZmF1bHRzIiB0byA5NjAwIGJwcyA7LSkgKi8KKwlzZWxmLT5zcGVlZCA9IDk2MDA7CisKKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCZWxraW4gKG9sZCkgU21hcnRCZWFtIGRvbmdsZSBkcml2ZXIiKTsJCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTciKTsgLyogSVJEQV9PTERfQkVMS0lOX0RPTkdMRSAqLworCisvKgorICogRnVuY3Rpb24gaW5pdF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBPbGQtQmVsa2luIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2luaXQob2xkX2JlbGtpbl9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgT2xkLUJlbGtpbiBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KG9sZF9iZWxraW5fY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY1MDk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYwpAQCAtMCwwICsxLDEwNDUgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBJbmZyYS1yZWQgZHJpdmVyIGZvciB0aGUgU3Ryb25nQVJNIFNBMTEwMCBlbWJlZGRlZCBtaWNyb3Byb2Nlc3NvcgorICoKKyAqICBOb3RlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgU0ExMTExJ3MgRE1BIGJ1Z3MgaW4gaGVyZSwKKyAqICBzbyB3ZSB1c2UgdGhlIHN0cmFpZ2h0IGZvcndhcmQgZG1hX21hcF8qIGZ1bmN0aW9ucyB3aXRoIGEgbnVsbCBwb2ludGVyLgorICoKKyAqICBUaGlzIGRyaXZlciB0YWtlcyBvbmUga2VybmVsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIsIHNhMTEwMGlyPSwgd2l0aAorICogIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKyAqCW1heF9yYXRlOmJhdWRyYXRlCS0gc2V0IHRoZSBtYXhpbXVtIGJhdWQgcmF0ZQorICoJcG93ZXJfbGV2ZTpsZXZlbAktIHNldCB0aGUgdHJhbnNtaXR0ZXIgcG93ZXIgbGV2ZWwKKyAqCXR4X2xwbTowfDEJCS0gc2V0IHRyYW5zbWl0IGxvdyBwb3dlciBtb2RlCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJkYS5oPgorCitzdGF0aWMgaW50IHBvd2VyX2xldmVsID0gMzsKK3N0YXRpYyBpbnQgdHhfbHBtOworc3RhdGljIGludCBtYXhfcmF0ZSA9IDQwMDAwMDA7CisKK3N0cnVjdCBzYTExMDBfaXJkYSB7CisJdW5zaWduZWQgY2hhcgkJaHNjcjA7CisJdW5zaWduZWQgY2hhcgkJdXRjcjQ7CisJdW5zaWduZWQgY2hhcgkJcG93ZXI7CisJdW5zaWduZWQgY2hhcgkJb3BlbjsKKworCWludAkJCXNwZWVkOworCWludAkJCW5ld3NwZWVkOworCisJc3RydWN0IHNrX2J1ZmYJCSp0eHNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnJ4c2tiOworCWRtYV9hZGRyX3QJCXR4YnVmX2RtYTsKKwlkbWFfYWRkcl90CQlyeGJ1Zl9kbWE7CisJZG1hX3JlZ3NfdAkJKnR4ZG1hOworCWRtYV9yZWdzX3QJCSpyeGRtYTsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IGlyZGFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGlybGFwX2NiCQkqaXJsYXA7CisJc3RydWN0IHFvc19pbmZvCQlxb3M7CisKKwlpb2J1ZmZfdAkJdHhfYnVmZjsKKwlpb2J1ZmZfdAkJcnhfYnVmZjsKK307CisKKyNkZWZpbmUgSVNfRklSKHNpKQkJKChzaSktPnNwZWVkID49IDQwMDAwMDApCisKKyNkZWZpbmUgSFBTSVJfTUFYX1JYTEVOCQkyMDQ3CisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgbWFwIHRoZSByZWNlaXZlIGJ1ZmZlciwgdW5sZXNzIGl0IGlzIGFscmVhZHkgYWxsb2NhdGVkLgorICovCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3J4X2FsbG9jKHN0cnVjdCBzYTExMDBfaXJkYSAqc2kpCit7CisJaWYgKHNpLT5yeHNrYikKKwkJcmV0dXJuIDA7CisKKwlzaS0+cnhza2IgPSBhbGxvY19za2IoSFBTSVJfTUFYX1JYTEVOICsgMSwgR0ZQX0FUT01JQyk7CisKKwlpZiAoIXNpLT5yeHNrYikgeworCQlwcmludGsoS0VSTl9FUlIgInNhMTEwMF9pcjogb3V0IG9mIG1lbW9yeSBmb3IgUlggU0tCXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBBbGlnbiBhbnkgSVAgaGVhZGVycyB0aGF0IG1heSBiZSBjb250YWluZWQKKwkgKiB3aXRoaW4gdGhlIGZyYW1lLgorCSAqLworCXNrYl9yZXNlcnZlKHNpLT5yeHNrYiwgMSk7CisKKwlzaS0+cnhidWZfZG1hID0gZG1hX21hcF9zaW5nbGUoc2ktPmRldiwgc2ktPnJ4c2tiLT5kYXRhLAorCQkJCQlIUFNJUl9NQVhfUlhMRU4sCisJCQkJCURNQV9GUk9NX0RFVklDRSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSB3YW50IHRvIGdldCBoZXJlIGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCBnZXQgdGhlIHJlY2VpdmVyIHNldHVwLgorICogV2UgdXNlIHRoZSBleGlzdGluZyBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIHNhMTEwMF9pcmRhX3J4X2RtYV9zdGFydChzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpKQoreworCWlmICghc2ktPnJ4c2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2ExMTAwX2lyOiByeCBidWZmZXIgd2VudCBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogRmlyc3QgZW1wdHkgcmVjZWl2ZSBGSUZPCisJICovCisJU2VyMkhTQ1IwID0gc2ktPmhzY3IwIHwgSFNDUjBfSFNTUDsKKworCS8qCisJICogRW5hYmxlIHRoZSBETUEsIHJlY2VpdmVyIGFuZCByZWNlaXZlIGludGVycnVwdC4KKwkgKi8KKwlzYTExMDBfY2xlYXJfZG1hKHNpLT5yeGRtYSk7CisJc2ExMTAwX3N0YXJ0X2RtYShzaS0+cnhkbWEsIHNpLT5yeGJ1Zl9kbWEsIEhQU0lSX01BWF9SWExFTik7CisJU2VyMkhTQ1IwID0gc2ktPmhzY3IwIHwgSFNDUjBfSFNTUCB8IEhTQ1IwX1JYRTsKK30KKworLyoKKyAqIFNldCB0aGUgSXJEQSBjb21tdW5pY2F0aW9ucyBzcGVlZC4KKyAqLworc3RhdGljIGludCBzYTExMDBfaXJkYV9zZXRfc3BlZWQoc3RydWN0IHNhMTEwMF9pcmRhICpzaSwgaW50IHNwZWVkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGJyZCwgcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIDk2MDA6CWNhc2UgMTkyMDA6CWNhc2UgMzg0MDA6CisJY2FzZSA1NzYwMDoJY2FzZSAxMTUyMDA6CisJCWJyZCA9IDM2ODY0MDAgLyAoMTYgKiBzcGVlZCkgLSAxOworCisJCS8qCisJCSAqIFN0b3AgdGhlIHJlY2VpdmUgRE1BLgorCQkgKi8KKwkJaWYgKElTX0ZJUihzaSkpCisJCQlzYTExMDBfc3RvcF9kbWEoc2ktPnJ4ZG1hKTsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkJU2VyMlVUQ1IzID0gMDsKKwkJU2VyMkhTQ1IwID0gSFNDUjBfVUFSVDsKKworCQlTZXIyVVRDUjEgPSBicmQgPj4gODsKKwkJU2VyMlVUQ1IyID0gYnJkOworCisJCS8qCisJCSAqIENsZWFyIHN0YXR1cyByZWdpc3RlcgorCQkgKi8KKwkJU2VyMlVUU1IwID0gVVRTUjBfUkVCIHwgVVRTUjBfUkJCIHwgVVRTUjBfUklEOworCQlTZXIyVVRDUjMgPSBVVENSM19SSUUgfCBVVENSM19SWEUgfCBVVENSM19UWEU7CisKKwkJaWYgKHNpLT5wZGF0YS0+c2V0X3NwZWVkKQorCQkJc2ktPnBkYXRhLT5zZXRfc3BlZWQoc2ktPmRldiwgc3BlZWQpOworCisJCXNpLT5zcGVlZCA9IHNwZWVkOworCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIDQwMDAwMDA6CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCQlzaS0+aHNjcjAgPSAwOworCisJCVNlcjJIU1NSMCA9IDB4ZmY7CisJCVNlcjJIU0NSMCA9IHNpLT5oc2NyMCB8IEhTQ1IwX0hTU1A7CisJCVNlcjJVVENSMyA9IDA7CisKKwkJc2ktPnNwZWVkID0gc3BlZWQ7CisKKwkJaWYgKHNpLT5wZGF0YS0+c2V0X3NwZWVkKQorCQkJc2ktPnBkYXRhLT5zZXRfc3BlZWQoc2ktPmRldiwgc3BlZWQpOworCisJCXNhMTEwMF9pcmRhX3J4X2FsbG9jKHNpKTsKKwkJc2ExMTAwX2lyZGFfcnhfZG1hX3N0YXJ0KHNpKTsKKworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ29udHJvbCB0aGUgcG93ZXIgc3RhdGUgb2YgdGhlIElyREEgdHJhbnNtaXR0ZXIuCisgKiBTdGF0ZToKKyAqICAwIC0gb2ZmCisgKiAgMSAtIHNob3J0IHJhbmdlLCBsb3dlc3QgcG93ZXIKKyAqICAyIC0gbWVkaXVtIHJhbmdlLCBtZWRpdW0gcG93ZXIKKyAqICAzIC0gbWF4aW11bSByYW5nZSwgaGlnaCBwb3dlcgorICoKKyAqIEN1cnJlbnRseSwgb25seSBhc3NhYmV0IGlzIGtub3duIHRvIHN1cHBvcnQgdGhpcy4KKyAqLworc3RhdGljIGludAorX19zYTExMDBfaXJkYV9zZXRfcG93ZXIoc3RydWN0IHNhMTEwMF9pcmRhICpzaSwgdW5zaWduZWQgaW50IHN0YXRlKQoreworCWludCByZXQgPSAwOworCWlmIChzaS0+cGRhdGEtPnNldF9wb3dlcikKKwkJcmV0ID0gc2ktPnBkYXRhLT5zZXRfcG93ZXIoc2ktPmRldiwgc3RhdGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzYTExMDBfc2V0X3Bvd2VyKHN0cnVjdCBzYTExMDBfaXJkYSAqc2ksIHVuc2lnbmVkIGludCBzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX19zYTExMDBfaXJkYV9zZXRfcG93ZXIoc2ksIHN0YXRlKTsKKwlpZiAocmV0ID09IDApCisJCXNpLT5wb3dlciA9IHN0YXRlOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzYTExMDBfaXJkYV9zdGFydHVwKHN0cnVjdCBzYTExMDBfaXJkYSAqc2kpCit7CisJaW50IHJldDsKKworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIHBvcnRzIGZvciB0aGlzIGRldmljZSBhcmUgc2V0dXAgY29ycmVjdGx5LgorCSAqLworCWlmIChzaS0+cGRhdGEtPnN0YXJ0dXApCisJCXNpLT5wZGF0YS0+c3RhcnR1cChzaS0+ZGV2KTsKKworCS8qCisJICogQ29uZmlndXJlIFBQQyBmb3IgSVJEQSAtIHdlIHdhbnQgdG8gZHJpdmUgVFhEMiBsb3cuCisJICogV2UgYWxzbyB3YW50IHRvIGRyaXZlIHRoaXMgcGluIGxvdyBkdXJpbmcgc2xlZXAuCisJICovCisJUFBTUiAmPSB+UFBDX1RYRDI7CisJUFNEUiAmPSB+UFBDX1RYRDI7CisJUFBEUiB8PSBQUENfVFhEMjsKKworCS8qCisJICogRW5hYmxlIEhQLVNJUiBtb2R1bGF0aW9uLCBhbmQgZW5zdXJlIHRoYXQgdGhlIHBvcnQgaXMgZGlzYWJsZWQuCisJICovCisJU2VyMlVUQ1IzID0gMDsKKwlTZXIySFNDUjAgPSBIU0NSMF9VQVJUOworCVNlcjJVVENSNCA9IHNpLT51dGNyNDsKKwlTZXIyVVRDUjAgPSBVVENSMF84Qml0RGF0YTsKKwlTZXIySFNDUjIgPSBIU0NSMl9UckRhdGFIIHwgSFNDUjJfUmNEYXRhTDsKKworCS8qCisJICogQ2xlYXIgc3RhdHVzIHJlZ2lzdGVyCisJICovCisJU2VyMlVUU1IwID0gVVRTUjBfUkVCIHwgVVRTUjBfUkJCIHwgVVRTUjBfUklEOworCisJcmV0ID0gc2ExMTAwX2lyZGFfc2V0X3NwZWVkKHNpLCBzaS0+c3BlZWQgPSA5NjAwKTsKKwlpZiAocmV0KSB7CisJCVNlcjJVVENSMyA9IDA7CisJCVNlcjJIU0NSMCA9IDA7CisKKwkJaWYgKHNpLT5wZGF0YS0+c2h1dGRvd24pCisJCQlzaS0+cGRhdGEtPnNodXRkb3duKHNpLT5kZXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNhMTEwMF9pcmRhX3NodXRkb3duKHN0cnVjdCBzYTExMDBfaXJkYSAqc2kpCit7CisJLyoKKwkgKiBTdG9wIGFsbCBETUEgYWN0aXZpdHkuCisJICovCisJc2ExMTAwX3N0b3BfZG1hKHNpLT5yeGRtYSk7CisJc2ExMTAwX3N0b3BfZG1hKHNpLT50eGRtYSk7CisKKwkvKiBEaXNhYmxlIHRoZSBwb3J0LiAqLworCVNlcjJVVENSMyA9IDA7CisJU2VyMkhTQ1IwID0gMDsKKworCWlmIChzaS0+cGRhdGEtPnNodXRkb3duKQorCQlzaS0+cGRhdGEtPnNodXRkb3duKHNpLT5kZXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKgorICogU3VzcGVuZCB0aGUgSXJEQSBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpfZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2k7CisKKwlpZiAoIWRldiB8fCBsZXZlbCAhPSBTVVNQRU5EX0RJU0FCTEUpCisJCXJldHVybiAwOworCisJc2kgPSBkZXYtPnByaXY7CisJaWYgKHNpLT5vcGVuKSB7CisJCS8qCisJCSAqIFN0b3AgdGhlIHRyYW5zbWl0IHF1ZXVlCisJCSAqLworCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwkJc2ExMTAwX2lyZGFfc2h1dGRvd24oc2kpOworCQlfX3NhMTEwMF9pcmRhX3NldF9wb3dlcihzaSwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXN1bWUgdGhlIElyREEgaW50ZXJmYWNlLgorICovCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpOworCisJaWYgKCFkZXYgfHwgbGV2ZWwgIT0gUkVTVU1FX0VOQUJMRSkKKwkJcmV0dXJuIDA7CisKKwlzaSA9IGRldi0+cHJpdjsKKwlpZiAoc2ktPm9wZW4pIHsKKwkJLyoKKwkJICogSWYgd2UgbWlzc2VkIGEgc3BlZWQgY2hhbmdlLCBpbml0aWFsaXNlIGF0IHRoZSBuZXcgc3BlZWQKKwkJICogZGlyZWN0bHkuICBJdCBpcyBkZWJhdGFibGUgd2hldGhlciB0aGlzIGlzIGFjdHVhbGx5CisJCSAqIHJlcXVpcmVkLCBidXQgaW4gdGhlIGludGVyZXN0cyBvZiBjb250aW51aW5nIGZyb20gd2hlcmUKKwkJICogd2UgbGVmdCBvZmYgaXQgaXMgZGVzaXJlYWJsZS4gIFRoZSBjb252ZXJzZSBhcmd1bWVudCBpcworCQkgKiB0aGF0IHdlIHNob3VsZCByZS1uZWdvdGlhdGUgYXQgOTYwMCBiYXVkIGFnYWluLgorCQkgKi8KKwkJaWYgKHNpLT5uZXdzcGVlZCkgeworCQkJc2ktPnNwZWVkID0gc2ktPm5ld3NwZWVkOworCQkJc2ktPm5ld3NwZWVkID0gMDsKKwkJfQorCisJCXNhMTEwMF9pcmRhX3N0YXJ0dXAoc2kpOworCQlfX3NhMTEwMF9pcmRhX3NldF9wb3dlcihzaSwgc2ktPnBvd2VyKTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisKKwkJLyoKKwkJICogVGhpcyBhdXRvbWF0aWNhbGx5IHdha2VzIHVwIHRoZSBxdWV1ZQorCQkgKi8KKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCX0KKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgc2ExMTAwX2lyZGFfc3VzcGVuZAlOVUxMCisjZGVmaW5lIHNhMTEwMF9pcmRhX3Jlc3VtZQlOVUxMCisjZW5kaWYKKworLyoKKyAqIEhQLVNJUiBmb3JtYXQgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMuCisgKi8KK3N0YXRpYyB2b2lkIHNhMTEwMF9pcmRhX2hwc2lyX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBkZXYtPnByaXY7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IFNlcjJVVFNSMDsKKworCS8qCisJICogRGVhbCB3aXRoIGFueSByZWNlaXZlIGVycm9ycyBmaXJzdC4gIFRoZSBieXRlcyBpbiBlcnJvciBtYXkgYmUKKwkgKiB0aGUgb25seSBieXRlcyBpbiB0aGUgcmVjZWl2ZSBGSUZPLCBzbyB3ZSBkbyB0aGlzIGZpcnN0LgorCSAqLworCXdoaWxlIChzdGF0dXMgJiBVVFNSMF9FSUYpIHsKKwkJaW50IHN0YXQsIGRhdGE7CisKKwkJc3RhdCA9IFNlcjJVVFNSMTsKKwkJZGF0YSA9IFNlcjJVVERSOworCisJCWlmIChzdGF0ICYgKFVUU1IxX0ZSRSB8IFVUU1IxX1JPUikpIHsKKwkJCXNpLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0ICYgVVRTUjFfRlJFKQorCQkJCXNpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChzdGF0ICYgVVRTUjFfUk9SKQorCQkJCXNpLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQl9IGVsc2UKKwkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBkYXRhKTsKKworCQlzdGF0dXMgPSBTZXIyVVRTUjA7CisJfQorCisJLyoKKwkgKiBXZSBtdXN0IGNsZWFyIGNlcnRhaW4gYml0cy4KKwkgKi8KKwlTZXIyVVRTUjAgPSBzdGF0dXMgJiAoVVRTUjBfUklEIHwgVVRTUjBfUkJCIHwgVVRTUjBfUkVCKTsKKworCWlmIChzdGF0dXMgJiBVVFNSMF9SRlMpIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIGF0IGxlYXN0IDQgYnl0ZXMgaW4gdGhlIEZJRk8uICBSZWFkIDMgYnl0ZXMKKwkJICogYW5kIGxlYXZlIHRoZSByZXN0IHRvIHRoZSBibG9jayBiZWxvdy4KKwkJICovCisJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBTZXIyVVREUik7CisJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBTZXIyVVREUik7CisJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBTZXIyVVREUik7CisJfQorCisJaWYgKHN0YXR1cyAmIChVVFNSMF9SRlMgfCBVVFNSMF9SSUQpKSB7CisJCS8qCisJCSAqIEZpZm8gY29udGFpbnMgbW9yZSB0aGFuIDEgY2hhcmFjdGVyLgorCQkgKi8KKwkJZG8geworCQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsCisJCQkJCSAgU2VyMlVURFIpOworCQl9IHdoaWxlIChTZXIyVVRTUjEgJiBVVFNSMV9STkUpOworCisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfQorCisJaWYgKHN0YXR1cyAmIFVUU1IwX1RGUyAmJiBzaS0+dHhfYnVmZi5sZW4pIHsKKwkJLyoKKwkJICogVHJhbnNtaXR0ZXIgRklGTyBpcyBub3QgZnVsbAorCQkgKi8KKwkJZG8geworCQkJU2VyMlVURFIgPSAqc2ktPnR4X2J1ZmYuZGF0YSsrOworCQkJc2ktPnR4X2J1ZmYubGVuIC09IDE7CisJCX0gd2hpbGUgKFNlcjJVVFNSMSAmIFVUU1IxX1RORiAmJiBzaS0+dHhfYnVmZi5sZW4pOworCisJCWlmIChzaS0+dHhfYnVmZi5sZW4gPT0gMCkgeworCQkJc2ktPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXNpLT5zdGF0cy50eF9ieXRlcyArPSBzaS0+dHhfYnVmZi5kYXRhIC0KKwkJCQkJICAgICAgc2ktPnR4X2J1ZmYuaGVhZDsKKworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHRyYW5zbWl0dGVyIGhhcworCQkJICogZmluaXNoZWQuCisJCQkgKi8KKwkJCWRvCisJCQkJcm1iKCk7CisJCQl3aGlsZSAoU2VyMlVUU1IxICYgVVRTUjFfVEJZKTsKKworCQkJLyoKKwkJCSAqIE9rLCB3ZSd2ZSBmaW5pc2hlZCB0cmFuc21pdHRpbmcuICBOb3cgZW5hYmxlCisJCQkgKiB0aGUgcmVjZWl2ZXIuICBTb21ldGltZXMgd2UgZ2V0IGEgcmVjZWl2ZSBJUlEKKwkJCSAqIGltbWVkaWF0ZWx5IGFmdGVyIGEgdHJhbnNtaXQuLi4KKwkJCSAqLworCQkJU2VyMlVUU1IwID0gVVRTUjBfUkVCIHwgVVRTUjBfUkJCIHwgVVRTUjBfUklEOworCQkJU2VyMlVUQ1IzID0gVVRDUjNfUklFIHwgVVRDUjNfUlhFIHwgVVRDUjNfVFhFOworCisJCQlpZiAoc2ktPm5ld3NwZWVkKSB7CisJCQkJc2ExMTAwX2lyZGFfc2V0X3NwZWVkKHNpLCBzaS0+bmV3c3BlZWQpOworCQkJCXNpLT5uZXdzcGVlZCA9IDA7CisJCQl9CisKKwkJCS8qIEknbSBodW5ncnkhICovCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNhMTEwMF9pcmRhX2Zpcl9lcnJvcihzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBzaS0+cnhza2I7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbGVuLCBzdGF0LCBkYXRhOworCisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYTExMDBfaXI6IFNLQiBpcyBOVUxMIVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgY3VycmVudCBkYXRhIHBvc2l0aW9uLgorCSAqLworCWRtYV9hZGRyID0gc2ExMTAwX2dldF9kbWFfcG9zKHNpLT5yeGRtYSk7CisJbGVuID0gZG1hX2FkZHIgLSBzaS0+cnhidWZfZG1hOworCWlmIChsZW4gPiBIUFNJUl9NQVhfUlhMRU4pCisJCWxlbiA9IEhQU0lSX01BWF9SWExFTjsKKwlkbWFfdW5tYXBfc2luZ2xlKHNpLT5kZXYsIHNpLT5yeGJ1Zl9kbWEsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKKworCWRvIHsKKwkJLyoKKwkJICogUmVhZCBTdGF0dXMsIGFuZCB0aGVuIERhdGEuCisJCSAqLworCQlzdGF0ID0gU2VyMkhTU1IxOworCQlybWIoKTsKKwkJZGF0YSA9IFNlcjJIU0RSOworCisJCWlmIChzdGF0ICYgKEhTU1IxX0NSRSB8IEhTU1IxX1JPUikpIHsKKwkJCXNpLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0ICYgSFNTUjFfQ1JFKQorCQkJCXNpLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdCAmIEhTU1IxX1JPUikKKwkJCQlzaS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCX0gZWxzZQorCQkJc2tiLT5kYXRhW2xlbisrXSA9IGRhdGE7CisKKwkJLyoKKwkJICogSWYgd2UgaGl0IHRoZSBlbmQgb2YgZnJhbWUsIHRoZXJlJ3MKKwkJICogbm8gcG9pbnQgaW4gY29udGludWluZy4KKwkJICovCisJCWlmIChzdGF0ICYgSFNTUjFfRU9GKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoU2VyMkhTU1IwICYgSFNTUjBfRUlGKTsKKworCWlmIChzdGF0ICYgSFNTUjFfRU9GKSB7CisJCXNpLT5yeHNrYiA9IE5VTEw7CisKKwkJc2tiX3B1dChza2IsIGxlbik7CisJCXNrYi0+ZGV2ID0gZGV2OworCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJc2ktPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJc2ktPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCQkvKgorCQkgKiBCZWZvcmUgd2UgcGFzcyB0aGUgYnVmZmVyIHVwLCBhbGxvY2F0ZSBhIG5ldyBvbmUuCisJCSAqLworCQlzYTExMDBfaXJkYV9yeF9hbGxvYyhzaSk7CisKKwkJbmV0aWZfcngoc2tiKTsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBSZW1hcCB0aGUgYnVmZmVyLgorCQkgKi8KKwkJc2ktPnJ4YnVmX2RtYSA9IGRtYV9tYXBfc2luZ2xlKHNpLT5kZXYsIHNpLT5yeHNrYi0+ZGF0YSwKKwkJCQkJCUhQU0lSX01BWF9SWExFTiwKKwkJCQkJCURNQV9GUk9NX0RFVklDRSk7CisJfQorfQorCisvKgorICogRklSIGZvcm1hdCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAgV2Ugb25seSBoYXZlIHRvCisgKiBoYW5kbGUgUlggZXZlbnRzOyB0cmFuc21pdCBldmVudHMgZ28gdmlhIHRoZSBUWCBETUEgaGFuZGxlci4KKyAqCisgKiBObyBtYXR0ZXIgd2hhdCwgd2UgZGlzYWJsZSBSWCwgcHJvY2VzcywgYW5kIHRoZSByZXN0YXJ0IFJYLgorICovCitzdGF0aWMgdm9pZCBzYTExMDBfaXJkYV9maXJfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IGRldi0+cHJpdjsKKworCS8qCisJICogU3RvcCBSWCBETUEKKwkgKi8KKwlzYTExMDBfc3RvcF9kbWEoc2ktPnJ4ZG1hKTsKKworCS8qCisJICogRnJhbWluZyBlcnJvciAtIHdlIHRocm93IGF3YXkgdGhlIHBhY2tldCBjb21wbGV0ZWx5LgorCSAqIENsZWFyaW5nIFJYRSBmbHVzaGVzIHRoZSBlcnJvciBjb25kaXRpb25zIGFuZCBkYXRhCisJICogZnJvbSB0aGUgZmlmby4KKwkgKi8KKwlpZiAoU2VyMkhTU1IwICYgKEhTU1IwX0ZSRSB8IEhTU1IwX1JBQikpIHsKKwkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCisJCWlmIChTZXIySFNTUjAgJiBIU1NSMF9GUkUpCisJCQlzaS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisKKwkJLyoKKwkJICogQ2xlYXIgb3V0IHRoZSBETUEuLi4KKwkJICovCisJCVNlcjJIU0NSMCA9IHNpLT5oc2NyMCB8IEhTQ1IwX0hTU1A7CisKKwkJLyoKKwkJICogQ2xlYXIgc2VsZWN0ZWQgc3RhdHVzIGJpdHMgbm93LCBzbyB3ZQorCQkgKiBkb24ndCBtaXNzIHRoZW0gbmV4dCB0aW1lIGFyb3VuZC4KKwkJICovCisJCVNlcjJIU1NSMCA9IEhTU1IwX0ZSRSB8IEhTU1IwX1JBQjsKKwl9CisKKwkvKgorCSAqIERlYWwgd2l0aCBhbnkgcmVjZWl2ZSBlcnJvcnMuICBUaGUgYW55IG9mIHRoZSBsb3dlc3QKKwkgKiA4IGJ5dGVzIGluIHRoZSBGSUZPIG1heSBjb250YWluIGFuIGVycm9yLiAgV2UgbXVzdCByZWFkCisJICogdGhlbSBvbmUgYnkgb25lLiAgVGhlICJlcnJvciIgY291bGQgZXZlbiBiZSB0aGUgZW5kIG9mCisJICogcGFja2V0IQorCSAqLworCWlmIChTZXIySFNTUjAgJiBIU1NSMF9FSUYpCisJCXNhMTEwMF9pcmRhX2Zpcl9lcnJvcihzaSwgZGV2KTsKKworCS8qCisJICogTm8gbWF0dGVyIHdoYXQgaGFwcGVucywgd2UgbXVzdCByZXN0YXJ0IHJlY2VwdGlvbi4KKwkgKi8KKwlzYTExMDBfaXJkYV9yeF9kbWFfc3RhcnQoc2kpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2ExMTAwX2lyZGFfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlpZiAoSVNfRklSKCgoc3RydWN0IHNhMTEwMF9pcmRhICopZGV2LT5wcml2KSkpCisJCXNhMTEwMF9pcmRhX2Zpcl9pcnEoZGV2KTsKKwllbHNlCisJCXNhMTEwMF9pcmRhX2hwc2lyX2lycShkZXYpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIFRYIERNQSBjb21wbGV0aW9uIGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIHNhMTEwMF9pcmRhX3R4ZG1hX2lycSh2b2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWQ7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2ktPnR4c2tiOworCisJc2ktPnR4c2tiID0gTlVMTDsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIHRyYW5zbWlzc2lvbiB0byBjb21wbGV0ZS4gIFVuZm9ydHVuYXRlbHksCisJICogdGhlIGhhcmR3YXJlIGRvZXNuJ3QgZ2l2ZSB1cyBhbiBpbnRlcnJ1cHQgdG8gaW5kaWNhdGUKKwkgKiAiZW5kIG9mIGZyYW1lIi4KKwkgKi8KKwlkbworCQlybWIoKTsKKwl3aGlsZSAoIShTZXIySFNTUjAgJiBIU1NSMF9UVVIpIHx8IFNlcjJIU1NSMSAmIEhTU1IxX1RCWSk7CisKKwkvKgorCSAqIENsZWFyIHRoZSB0cmFuc21pdCB1bmRlcnJ1biBiaXQuCisJICovCisJU2VyMkhTU1IwID0gSFNTUjBfVFVSOworCisJLyoKKwkgKiBEbyB3ZSBuZWVkIHRvIGNoYW5nZSBzcGVlZD8gIE5vdGUgdGhhdCB3ZSdyZSBsYXp5CisJICogaGVyZSAtIHdlIGRvbid0IGZyZWUgdGhlIG9sZCByeHNrYi4gIFdlIGRvbid0IG5lZWQKKwkgKiB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBlaXRoZXIuCisJICovCisJaWYgKHNpLT5uZXdzcGVlZCkgeworCQlzYTExMDBfaXJkYV9zZXRfc3BlZWQoc2ksIHNpLT5uZXdzcGVlZCk7CisJCXNpLT5uZXdzcGVlZCA9IDA7CisJfQorCisJLyoKKwkgKiBTdGFydCByZWNlcHRpb24uICBUaGlzIGRpc2FibGVzIHRoZSB0cmFuc21pdHRlciBmb3IKKwkgKiB1cy4gIFRoaXMgd2lsbCBiZSB1c2luZyB0aGUgZXhpc3RpbmcgUlggYnVmZmVyLgorCSAqLworCXNhMTEwMF9pcmRhX3J4X2RtYV9zdGFydChzaSk7CisKKwkvKgorCSAqIEFjY291bnQgYW5kIGZyZWUgdGhlIHBhY2tldC4KKwkgKi8KKwlpZiAoc2tiKSB7CisJCWRtYV91bm1hcF9zaW5nbGUoc2ktPmRldiwgc2ktPnR4YnVmX2RtYSwgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCQlzaS0+c3RhdHMudHhfcGFja2V0cyArKzsKKwkJc2ktPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgdGhlIFRYIHF1ZXVlIGlzIGF2YWlsYWJsZSBmb3Igc2VuZGluZworCSAqIChmb3IgcmV0cmllcykuICBUWCBoYXMgcHJpb3JpdHkgb3ZlciBSWCBhdCBhbGwgdGltZXMuCisJICovCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBkZXYtPnByaXY7CisJaW50IHNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCisJLyoKKwkgKiBEb2VzIHRoaXMgcGFja2V0IGNvbnRhaW4gYSByZXF1ZXN0IHRvIGNoYW5nZSB0aGUgaW50ZXJmYWNlCisJICogc3BlZWQ/ICBJZiBzbywgcmVtZW1iZXIgaXQgdW50aWwgd2UgY29tcGxldGUgdGhlIHRyYW5zbWlzc2lvbgorCSAqIG9mIHRoaXMgZnJhbWUuCisJICovCisJaWYgKHNwZWVkICE9IHNpLT5zcGVlZCAmJiBzcGVlZCAhPSAtMSkKKwkJc2ktPm5ld3NwZWVkID0gc3BlZWQ7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYW4gZW1wdHkgZnJhbWUsIHdlIGNhbiBieXBhc3MgYSBsb3QuCisJICovCisJaWYgKHNrYi0+bGVuID09IDApIHsKKwkJaWYgKHNpLT5uZXdzcGVlZCkgeworCQkJc2ktPm5ld3NwZWVkID0gMDsKKwkJCXNhMTEwMF9pcmRhX3NldF9zcGVlZChzaSwgc3BlZWQpOworCQl9CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFJU19GSVIoc2kpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlzaS0+dHhfYnVmZi5kYXRhID0gc2ktPnR4X2J1ZmYuaGVhZDsKKwkJc2ktPnR4X2J1ZmYubGVuICA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2ktPnR4X2J1ZmYuZGF0YSwKKwkJCQkJCSAgc2ktPnR4X2J1ZmYudHJ1ZXNpemUpOworCisJCS8qCisJCSAqIFNldCB0aGUgdHJhbnNtaXQgaW50ZXJydXB0IGVuYWJsZS4gIFRoaXMgd2lsbCBmaXJlCisJCSAqIG9mZiBhbiBpbnRlcnJ1cHQgaW1tZWRpYXRlbHkuICBOb3RlIHRoYXQgd2UgZGlzYWJsZQorCQkgKiB0aGUgcmVjZWl2ZXIgc28gd2Ugd29uJ3QgZ2V0IHNwdXJpb3VzIGNoYXJhY3RlcmVzCisJCSAqIHJlY2VpdmVkLgorCQkgKi8KKwkJU2VyMlVUQ1IzID0gVVRDUjNfVElFIHwgVVRDUjNfVFhFOworCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlpbnQgbXR0ID0gaXJkYV9nZXRfbXR0KHNrYik7CisKKwkJLyoKKwkJICogV2UgbXVzdCBub3QgYmUgdHJhbnNtaXR0aW5nLi4uCisJCSAqLworCQlpZiAoc2ktPnR4c2tiKQorCQkJQlVHKCk7CisKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCXNpLT50eHNrYiA9IHNrYjsKKwkJc2ktPnR4YnVmX2RtYSA9IGRtYV9tYXBfc2luZ2xlKHNpLT5kZXYsIHNrYi0+ZGF0YSwKKwkJCQkJIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKworCQlzYTExMDBfc3RhcnRfZG1hKHNpLT50eGRtYSwgc2ktPnR4YnVmX2RtYSwgc2tiLT5sZW4pOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYSBtZWFuIHR1cm4tYXJvdW5kIHRpbWUsIGltcG9zZSB0aGUgc3BlY2lmaWVkCisJCSAqIHNwZWNpZmllZCBkZWxheS4gIFdlIGNvdWxkIHNob3J0ZW4gdGhpcyBieSB0aW1pbmcgZnJvbQorCQkgKiB0aGUgcG9pbnQgd2UgcmVjZWl2ZWQgdGhlIHBhY2tldC4KKwkJICovCisJCWlmIChtdHQpCisJCQl1ZGVsYXkobXR0KTsKKworCQlTZXIySFNDUjAgPSBzaS0+aHNjcjAgfCBIU0NSMF9IU1NQIHwgSFNDUjBfVFhFOworCX0KKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NhMTEwMF9pcmRhX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyZXEsIGludCBjbWQpCit7CisJc3RydWN0IGlmX2lyZGFfcmVxICpycSA9IChzdHJ1Y3QgaWZfaXJkYV9yZXEgKilpZnJlcTsKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpID0gZGV2LT5wcml2OworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0JBTkRXSURUSDoKKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCS8qCisJCQkgKiBXZSBhcmUgdW5hYmxlIHRvIHNldCB0aGUgc3BlZWQgaWYgdGhlCisJCQkgKiBkZXZpY2UgaXMgbm90IHJ1bm5pbmcuCisJCQkgKi8KKwkJCWlmIChzaS0+b3BlbikgeworCQkJCXJldCA9IHNhMTEwMF9pcmRhX3NldF9zcGVlZChzaSwKKwkJCQkJCXJxLT5pZnJfYmF1ZHJhdGUpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoInNhMTEwMF9pcmRhX2lvY3RsOiBTSU9DU0JBTkRXSURUSDogIW5ldGlmX3J1bm5pbmdcbiIpOworCQkJCXJldCA9IDA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTTUVESUFCVVNZOgorCQlyZXQgPSAtRVBFUk07CisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYsIFRSVUUpOworCQkJcmV0ID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6CisJCXJxLT5pZnJfcmVjZWl2aW5nID0gSVNfRklSKHNpKSA/IDAKKwkJCQkJOiBzaS0+cnhfYnVmZi5zdGF0ZSAhPSBPVVRTSURFX0ZSQU1FOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkJCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzYTExMDBfaXJkYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBkZXYtPnByaXY7CisJcmV0dXJuICZzaS0+c3RhdHM7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpID0gZGV2LT5wcml2OworCWludCBlcnI7CisKKwlzaS0+c3BlZWQgPSA5NjAwOworCisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNhMTEwMF9pcmRhX2lycSwgMCwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2lycTsKKworCWVyciA9IHNhMTEwMF9yZXF1ZXN0X2RtYShETUFfU2VyMkhTU1BSZCwgIklyREEgcmVjZWl2ZSIsCisJCQkJIE5VTEwsIE5VTEwsICZzaS0+cnhkbWEpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3J4X2RtYTsKKworCWVyciA9IHNhMTEwMF9yZXF1ZXN0X2RtYShETUFfU2VyMkhTU1BXciwgIklyREEgdHJhbnNtaXQiLAorCQkJCSBzYTExMDBfaXJkYV90eGRtYV9pcnEsIGRldiwgJnNpLT50eGRtYSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfdHhfZG1hOworCisJLyoKKwkgKiBUaGUgaW50ZXJydXB0IG11c3QgcmVtYWluIGRpc2FibGVkIGZvciBub3cuCisJICovCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCisJLyoKKwkgKiBTZXR1cCB0aGUgc2VyaWFsIHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgc3BlZWQuCisJICovCisJZXJyID0gc2ExMTAwX2lyZGFfc3RhcnR1cChzaSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfc3RhcnR1cDsKKworCS8qCisJICogT3BlbiBhIG5ldyBJckxBUCBsYXllciBpbnN0YW5jZS4KKwkgKi8KKwlzaS0+aXJsYXAgPSBpcmxhcF9vcGVuKGRldiwgJnNpLT5xb3MsICJzYTExMDAiKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghc2ktPmlybGFwKQorCQlnb3RvIGVycl9pcmxhcDsKKworCS8qCisJICogTm93IGVuYWJsZSB0aGUgaW50ZXJydXB0IGFuZCBzdGFydCB0aGUgcXVldWUKKwkgKi8KKwlzaS0+b3BlbiA9IDE7CisJc2ExMTAwX3NldF9wb3dlcihzaSwgcG93ZXJfbGV2ZWwpOyAvKiBsb3cgcG93ZXIgbW9kZSAqLworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CisKK2Vycl9pcmxhcDoKKwlzaS0+b3BlbiA9IDA7CisJc2ExMTAwX2lyZGFfc2h1dGRvd24oc2kpOworZXJyX3N0YXJ0dXA6CisJc2ExMTAwX2ZyZWVfZG1hKHNpLT50eGRtYSk7CitlcnJfdHhfZG1hOgorCXNhMTEwMF9mcmVlX2RtYShzaS0+cnhkbWEpOworZXJyX3J4X2RtYToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK2Vycl9pcnE6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzYTExMDBfaXJkYV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IGRldi0+cHJpdjsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzYTExMDBfaXJkYV9zaHV0ZG93bihzaSk7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYmVlbiBkb2luZyBETUEgcmVjZWl2ZSwgbWFrZSBzdXJlIHdlCisJICogdGlkeSB0aGF0IHVwIGNsZWFubHkuCisJICovCisJaWYgKHNpLT5yeHNrYikgeworCQlkbWFfdW5tYXBfc2luZ2xlKHNpLT5kZXYsIHNpLT5yeGJ1Zl9kbWEsIEhQU0lSX01BWF9SWExFTiwKKwkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYihzaS0+cnhza2IpOworCQlzaS0+cnhza2IgPSBOVUxMOworCX0KKworCS8qIFN0b3AgSXJMQVAgKi8KKwlpZiAoc2ktPmlybGFwKSB7CisJCWlybGFwX2Nsb3NlKHNpLT5pcmxhcCk7CisJCXNpLT5pcmxhcCA9IE5VTEw7CisJfQorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNpLT5vcGVuID0gMDsKKworCS8qCisJICogRnJlZSByZXNvdXJjZXMKKwkgKi8KKwlzYTExMDBfZnJlZV9kbWEoc2ktPnR4ZG1hKTsKKwlzYTExMDBfZnJlZV9kbWEoc2ktPnJ4ZG1hKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCXNhMTEwMF9zZXRfcG93ZXIoc2ksIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfaW5pdF9pb2J1Zihpb2J1ZmZfdCAqaW8sIGludCBzaXplKQoreworCWlvLT5oZWFkID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKGlvLT5oZWFkICE9IE5VTEwpIHsKKwkJaW8tPnRydWVzaXplID0gc2l6ZTsKKwkJaW8tPmluX2ZyYW1lID0gRkFMU0U7CisJCWlvLT5zdGF0ZSAgICA9IE9VVFNJREVfRlJBTUU7CisJCWlvLT5kYXRhICAgICA9IGlvLT5oZWFkOworCX0KKwlyZXR1cm4gaW8tPmhlYWQgPyAwIDogLUVOT01FTTsKK30KKworc3RhdGljIGludCBzYTExMDBfaXJkYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoX2Rldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpOworCXVuc2lnbmVkIGludCBiYXVkcmF0ZV9tYXNrOworCWludCBlcnI7CisKKwlpZiAoIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IHJlcXVlc3RfbWVtX3JlZ2lvbihfX1BSRUcoU2VyMlVUQ1IwKSwgMHgyNCwgIklyREEiKSA/IDAgOiAtRUJVU1k7CisJaWYgKGVycikKKwkJZ290byBlcnJfbWVtXzE7CisJZXJyID0gcmVxdWVzdF9tZW1fcmVnaW9uKF9fUFJFRyhTZXIySFNDUjApLCAweDFjLCAiSXJEQSIpID8gMCA6IC1FQlVTWTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9tZW1fMjsKKwllcnIgPSByZXF1ZXN0X21lbV9yZWdpb24oX19QUkVHKFNlcjJIU0NSMiksIDB4MDQsICJJckRBIikgPyAwIDogLUVCVVNZOworCWlmIChlcnIpCisJCWdvdG8gZXJyX21lbV8zOworCisJZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2Yoc3RydWN0IHNhMTEwMF9pcmRhKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gZXJyX21lbV80OworCisJc2kgPSBkZXYtPnByaXY7CisJc2ktPmRldiA9ICZwZGV2LT5kZXY7CisJc2ktPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIEhQLVNJUiBidWZmZXJzCisJICovCisJZXJyID0gc2ExMTAwX2lyZGFfaW5pdF9pb2J1Zigmc2ktPnJ4X2J1ZmYsIDE0Mzg0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9tZW1fNTsKKwllcnIgPSBzYTExMDBfaXJkYV9pbml0X2lvYnVmKCZzaS0+dHhfYnVmZiwgNDAwMCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfbWVtXzU7CisKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNhMTEwMF9pcmRhX2hhcmRfeG1pdDsKKwlkZXYtPm9wZW4JCT0gc2ExMTAwX2lyZGFfc3RhcnQ7CisJZGV2LT5zdG9wCQk9IHNhMTEwMF9pcmRhX3N0b3A7CisJZGV2LT5kb19pb2N0bAkJPSBzYTExMDBfaXJkYV9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cwkJPSBzYTExMDBfaXJkYV9zdGF0czsKKwlkZXYtPmlycQkJPSBJUlFfU2VyMklDUDsKKworCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnNpLT5xb3MpOworCisJLyoKKwkgKiBXZSBzdXBwb3J0IG9yaWdpbmFsIElSREEgdXAgdG8gMTE1azIuICh3ZSBkb24ndCBjdXJyZW50bHkKKwkgKiBzdXBwb3J0IDRNYnBzKS4gIE1pbiBUdXJuIFRpbWUgc2V0IHRvIDFtcyBvciBncmVhdGVyLgorCSAqLworCWJhdWRyYXRlX21hc2sgPSBJUl85NjAwOworCisJc3dpdGNoIChtYXhfcmF0ZSkgeworCWNhc2UgNDAwMDAwMDoJCWJhdWRyYXRlX21hc2sgfD0gSVJfNDAwMDAwMCA8PCA4OworCWNhc2UgMTE1MjAwOgkJYmF1ZHJhdGVfbWFzayB8PSBJUl8xMTUyMDA7CisJY2FzZSA1NzYwMDoJCWJhdWRyYXRlX21hc2sgfD0gSVJfNTc2MDA7CisJY2FzZSAzODQwMDoJCWJhdWRyYXRlX21hc2sgfD0gSVJfMzg0MDA7CisJY2FzZSAxOTIwMDoJCWJhdWRyYXRlX21hc2sgfD0gSVJfMTkyMDA7CisJfQorCQkKKwlzaS0+cW9zLmJhdWRfcmF0ZS5iaXRzICY9IGJhdWRyYXRlX21hc2s7CisJc2ktPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSA3OworCisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmc2ktPnFvcyk7CisKKwlzaS0+dXRjcjQgPSBVVENSNF9IUFNJUjsKKwlpZiAodHhfbHBtKQorCQlzaS0+dXRjcjQgfD0gVVRDUjRfWjFfNnVzOworCisJLyoKKwkgKiBJbml0aWFsbHkgZW5hYmxlIEhQLVNJUiBtb2R1bGF0aW9uLCBhbmQgZW5zdXJlIHRoYXQgdGhlIHBvcnQKKwkgKiBpcyBkaXNhYmxlZC4KKwkgKi8KKwlTZXIyVVRDUjMgPSAwOworCVNlcjJVVENSNCA9IHNpLT51dGNyNDsKKwlTZXIySFNDUjAgPSBIU0NSMF9VQVJUOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVyciA9PSAwKQorCQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZGV2KTsKKworCWlmIChlcnIpIHsKKyBlcnJfbWVtXzU6CisJCWtmcmVlKHNpLT50eF9idWZmLmhlYWQpOworCQlrZnJlZShzaS0+cnhfYnVmZi5oZWFkKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKyBlcnJfbWVtXzQ6CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihfX1BSRUcoU2VyMkhTQ1IyKSwgMHgwNCk7CisgZXJyX21lbV8zOgorCQlyZWxlYXNlX21lbV9yZWdpb24oX19QUkVHKFNlcjJIU0NSMCksIDB4MWMpOworIGVycl9tZW1fMjoKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKF9fUFJFRyhTZXIyVVRDUjApLCAweDI0KTsKKwl9CisgZXJyX21lbV8xOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKworCWlmIChkZXYpIHsKKwkJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IGRldi0+cHJpdjsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJa2ZyZWUoc2ktPnR4X2J1ZmYuaGVhZCk7CisJCWtmcmVlKHNpLT5yeF9idWZmLmhlYWQpOworCQlmcmVlX25ldGRldihkZXYpOworCX0KKworCXJlbGVhc2VfbWVtX3JlZ2lvbihfX1BSRUcoU2VyMkhTQ1IyKSwgMHgwNCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKF9fUFJFRyhTZXIySFNDUjApLCAweDFjKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oX19QUkVHKFNlcjJVVENSMCksIDB4MjQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBzYTExMDBpcl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNhMTF4MC1pciIsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCQk9IHNhMTEwMF9pcmRhX3Byb2JlLAorCS5yZW1vdmUJCT0gc2ExMTAwX2lyZGFfcmVtb3ZlLAorCS5zdXNwZW5kCT0gc2ExMTAwX2lyZGFfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNhMTEwMF9pcmRhX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNhMTEwMF9pcmRhX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIExpbWl0IHBvd2VyIGxldmVsIGEgc2Vuc2libGUgcmFuZ2UuCisJICovCisJaWYgKHBvd2VyX2xldmVsIDwgMSkKKwkJcG93ZXJfbGV2ZWwgPSAxOworCWlmIChwb3dlcl9sZXZlbCA+IDMpCisJCXBvd2VyX2xldmVsID0gMzsKKworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnNhMTEwMGlyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzYTExMDBfaXJkYV9leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnNhMTEwMGlyX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNhMTEwMF9pcmRhX2luaXQpOworbW9kdWxlX2V4aXQoc2ExMTAwX2lyZGFfZXhpdCk7Cittb2R1bGVfcGFyYW0ocG93ZXJfbGV2ZWwsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odHhfbHBtLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9yYXRlLCBpbnQsIDApOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdHJvbmdBUk0gU0ExMTAwIElyREEgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX2xldmVsLCAiSXJEQSBwb3dlciBsZXZlbCwgMSAobG93KSB0byAzIChoaWdoKSIpOworTU9EVUxFX1BBUk1fREVTQyh0eF9scG0sICJFbmFibGUgdHJhbnNtaXR0ZXIgbG93IHBvd2VyICgxLjZ1cykgbW9kZSIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfcmF0ZSwgIk1heGltdW0gYmF1ZCByYXRlICg0MDAwMDAwLCAxMTUyMDAsIDU3NjAwLCAzODQwMCwgMTkyMDAsIDk2MDApIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaCBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyLWRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjhiYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaApAQCAtMCwwICsxLDIwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXNpci5oOglpbmNsdWRlIGZpbGUgZm9yIGlyZGEtc2lyIGRldmljZSBhYnN0cmFjdGlvbiBsYXllcgorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJUkRBX1NJUl9ICisjZGVmaW5lIElSREFfU0lSX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CQkvLyBpb2J1ZmZfdAorCisvKiBGSVhNRTogdW5pZnkgaXJkYV9yZXF1ZXN0IHdpdGggc2lyX2ZzbSEgKi8KKworc3RydWN0IGlyZGFfcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaF9yZXF1ZXN0OworCXVuc2lnbmVkIGxvbmcgcGVuZGluZzsKKwl2b2lkICgqZnVuYykodm9pZCAqKTsKKwl2b2lkICpkYXRhOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworfTsKKworc3RydWN0IHNpcl9mc20geworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCXN0cnVjdCBpcmRhX3JlcXVlc3QJcnE7CisJdW5zaWduZWQJCXN0YXRlLCBzdWJzdGF0ZTsKKwlpbnQJCQlwYXJhbTsKKwlpbnQJCQlyZXN1bHQ7Cit9OworCisjZGVmaW5lIFNJUkRFVl9TVEFURV9XQUlUX1RYX0NPTVBMRVRFCTB4MDEwMAorCisvKiBzdWJzdGF0ZXMgZm9yIHdhaXRfdHhfY29tcGxldGUgKi8KKyNkZWZpbmUgU0lSREVWX1NUQVRFX1dBSVRfWE1JVAkJMHgwMTAxCisjZGVmaW5lIFNJUkRFVl9TVEFURV9XQUlUX1VOVElMX1NFTlQJMHgwMTAyCisjZGVmaW5lIFNJUkRFVl9TVEFURV9UWF9ET05FCQkweDAxMDMKKworI2RlZmluZSBTSVJERVZfU1RBVEVfRE9OR0xFX09QRU4JCTB4MDMwMAorCisvKiAweDAzMDEtMHgwM2ZmIHJlc2VydmVkIGZvciBpbmRpdmlkdWFsIGRvbmdsZSBzdWJzdGF0ZXMgKi8KKworI2RlZmluZSBTSVJERVZfU1RBVEVfRE9OR0xFX0NMT1NFCTB4MDQwMAorCisvKiAweDA0MDEtMHgwNGZmIHJlc2VydmVkIGZvciBpbmRpdmlkdWFsIGRvbmdsZSBzdWJzdGF0ZXMgKi8KKworI2RlZmluZSBTSVJERVZfU1RBVEVfU0VUX0RUUl9SVFMJCTB4MDUwMAorCisjZGVmaW5lIFNJUkRFVl9TVEFURV9TRVRfU1BFRUQJCTB4MDcwMAorI2RlZmluZSBTSVJERVZfU1RBVEVfRE9OR0xFX0NIRUNLCTB4MDgwMAorI2RlZmluZSBTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUCTB4MDkwMAorCisvKiAweDA5MDEtMHgwOWZmIHJlc2VydmVkIGZvciBpbmRpdmlkdWFsIGRvbmdsZSBzdWJzdGF0ZXMgKi8KKworI2RlZmluZSBTSVJERVZfU1RBVEVfRE9OR0xFX1NQRUVECTB4MGEwMAorLyogMHgwYTAxLTB4MGFmZiByZXNlcnZlZCBmb3IgaW5kaXZpZHVhbCBkb25nbGUgc3Vic3RhdGVzICovCisKKyNkZWZpbmUgU0lSREVWX1NUQVRFX1BPUlRfU1BFRUQJCTB4MGIwMAorI2RlZmluZSBTSVJERVZfU1RBVEVfRE9ORQkJMHgwYzAwCisjZGVmaW5lIFNJUkRFVl9TVEFURV9FUlJPUgkJMHgwZDAwCisjZGVmaW5lIFNJUkRFVl9TVEFURV9DT01QTEVURQkJMHgwZTAwCisKKyNkZWZpbmUgU0lSREVWX1NUQVRFX0RFQUQJCTB4ZmZmZgorCisKK3N0cnVjdCBzaXJfZGV2OworCitzdHJ1Y3QgZG9uZ2xlX2RyaXZlciB7CisKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKworCWNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lOworCisJSVJEQV9ET05HTEUgdHlwZTsKKworCWludAkoKm9wZW4pKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworCWludAkoKmNsb3NlKShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKKwlpbnQJKCpyZXNldCkoc3RydWN0IHNpcl9kZXYgKmRldik7CisJaW50CSgqc2V0X3NwZWVkKShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCk7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRvbmdsZV9saXN0OworfTsKKworc3RydWN0IHNpcl9kcml2ZXIgeworCisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKKworCWludCBxb3NfbXR0X2JpdHM7CisKKwlpbnQgKCpjaGFyc19pbl9idWZmZXIpKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworCXZvaWQgKCp3YWl0X3VudGlsX3NlbnQpKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworCWludCAoKnNldF9zcGVlZCkoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpOworCWludCAoKnNldF9kdHJfcnRzKShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgZHRyLCBpbnQgcnRzKTsKKworCWludCAoKmRvX3dyaXRlKShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIsIHNpemVfdCBsZW4pOworCisJaW50ICgqc3RhcnRfZGV2KShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKKwlpbnQgKCpzdG9wX2Rldikoc3RydWN0IHNpcl9kZXYgKmRldik7Cit9OworCisKKy8qIGV4cG9ydGVkICovCisKK2V4dGVybiBpbnQgaXJkYV9yZWdpc3Rlcl9kb25nbGUoc3RydWN0IGRvbmdsZV9kcml2ZXIgKm5ldyk7CitleHRlcm4gaW50IGlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoc3RydWN0IGRvbmdsZV9kcml2ZXIgKmRydik7CisKK2V4dGVybiBzdHJ1Y3Qgc2lyX2RldiAqIHNpcmRldl9nZXRfaW5zdGFuY2UoY29uc3Qgc3RydWN0IHNpcl9kcml2ZXIgKmRydiwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gaW50IHNpcmRldl9wdXRfaW5zdGFuY2Uoc3RydWN0IHNpcl9kZXYgKnNlbGYpOworCitleHRlcm4gaW50IHNpcmRldl9zZXRfZG9uZ2xlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIElSREFfRE9OR0xFIHR5cGUpOworZXh0ZXJuIHZvaWQgc2lyZGV2X3dyaXRlX2NvbXBsZXRlKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworZXh0ZXJuIGludCBzaXJkZXZfcmVjZWl2ZShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgc2l6ZV90IGNvdW50KTsKKworLyogbG93IGxldmVsIGhlbHBlcnMgZm9yIFNJUiBkZXZpY2UvZG9uZ2xlIHNldHVwICovCitleHRlcm4gaW50IHNpcmRldl9yYXdfd3JpdGUoc3RydWN0IHNpcl9kZXYgKmRldiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgc2lyZGV2X3Jhd19yZWFkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CitleHRlcm4gaW50IHNpcmRldl9zZXRfZHRyX3J0cyhzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgZHRyLCBpbnQgcnRzKTsKKworLyogbm90IGV4cG9ydGVkICovCisKK2V4dGVybiBpbnQgc2lyZGV2X2dldF9kb25nbGUoc3RydWN0IHNpcl9kZXYgKnNlbGYsIElSREFfRE9OR0xFIHR5cGUpOworZXh0ZXJuIGludCBzaXJkZXZfcHV0X2RvbmdsZShzdHJ1Y3Qgc2lyX2RldiAqc2VsZik7CisKK2V4dGVybiB2b2lkIHNpcmRldl9lbmFibGVfcngoc3RydWN0IHNpcl9kZXYgKmRldik7CitleHRlcm4gaW50IHNpcmRldl9zY2hlZHVsZV9yZXF1ZXN0KHN0cnVjdCBzaXJfZGV2ICpkZXYsIGludCBzdGF0ZSwgdW5zaWduZWQgcGFyYW0pOworZXh0ZXJuIGludCBfX2luaXQgaXJkYV90aHJlYWRfY3JlYXRlKHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IGlyZGFfdGhyZWFkX2pvaW4odm9pZCk7CisKKy8qIGlubGluZSBoZWxwZXJzICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHNpcmRldl9zY2hlZHVsZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCkKK3sKKwlyZXR1cm4gc2lyZGV2X3NjaGVkdWxlX3JlcXVlc3QoZGV2LCBTSVJERVZfU1RBVEVfU0VUX1NQRUVELCBzcGVlZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNpcmRldl9zY2hlZHVsZV9kb25nbGVfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgZG9uZ2xlX2lkKQoreworCXJldHVybiBzaXJkZXZfc2NoZWR1bGVfcmVxdWVzdChkZXYsIFNJUkRFVl9TVEFURV9ET05HTEVfT1BFTiwgZG9uZ2xlX2lkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2lyZGV2X3NjaGVkdWxlX2RvbmdsZV9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXJldHVybiBzaXJkZXZfc2NoZWR1bGVfcmVxdWVzdChkZXYsIFNJUkRFVl9TVEFURV9ET05HTEVfQ0xPU0UsIDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaXJkZXZfc2NoZWR1bGVfZHRyX3J0cyhzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgZHRyLCBpbnQgcnRzKQoreworCWludAlkdHJydHM7CisKKwlkdHJydHMgPSAoKGR0cikgPyAweDAyIDogMHgwMCkgfCAoKHJ0cykgPyAweDAxIDogMHgwMCk7CisJcmV0dXJuIHNpcmRldl9zY2hlZHVsZV9yZXF1ZXN0KGRldiwgU0lSREVWX1NUQVRFX1NFVF9EVFJfUlRTLCBkdHJydHMpOworfQorCisjaWYgMAorc3RhdGljIGlubGluZSBpbnQgc2lyZGV2X3NjaGVkdWxlX21vZGUoc3RydWN0IHNpcl9kZXYgKmRldiwgaW50IG1vZGUpCit7CisJcmV0dXJuIHNpcmRldl9zY2hlZHVsZV9yZXF1ZXN0KGRldiwgU0lSREVWX1NUQVRFX1NFVF9NT0RFLCBtb2RlKTsKK30KKyNlbmRpZgorCisKK3N0cnVjdCBzaXJfZGV2IHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJc3RydWN0IGlybGFwX2NiICAgICppcmxhcDsKKworCXN0cnVjdCBxb3NfaW5mbyBxb3M7CisKKwljaGFyIGh3bmFtZVszMl07CisKKwlzdHJ1Y3Qgc2lyX2ZzbSBmc207CisJYXRvbWljX3QgZW5hYmxlX3J4OworCWludCByYXdfdHg7CisJc3BpbmxvY2tfdCB0eF9sb2NrOworCisJdTMyIG5ld19zcGVlZDsKKyAJdTMyIGZsYWdzOworCisJdW5zaWduZWQJc3BlZWQ7CisKKwlpb2J1ZmZfdCB0eF9idWZmOyAgICAgICAgICAvKiBUcmFuc21pdCBidWZmZXIgKi8KKwlpb2J1ZmZfdCByeF9idWZmOyAgICAgICAgICAvKiBSZWNlaXZlIGJ1ZmZlciAqLworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisKKwljb25zdCBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciAqIGRvbmdsZV9kcnY7CisJY29uc3Qgc3RydWN0IHNpcl9kcml2ZXIgKiBkcnY7CisJdm9pZCAqcHJpdjsKKworfTsKKworI2VuZGlmCS8qIElSREFfU0lSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2NvcmUuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDlmOTEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfY29yZS5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglzaXJfY29yZS5jOgltb2R1bGUgY29yZSBmb3IgaXJkYS1zaXIgYWJzdHJhY3Rpb24gbGF5ZXIKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDIgTWFydGluIERpZWhsCisgKiAKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICoJdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTU9EVUxFX0FVVEhPUigiTWFydGluIERpZWhsIDxpbmZvQG1kaWVobC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSXJEQSBTSVIgY29yZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitFWFBPUlRfU1lNQk9MKGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKTsKK0VYUE9SVF9TWU1CT0woaXJkYV91bnJlZ2lzdGVyX2RvbmdsZSk7CisKK0VYUE9SVF9TWU1CT0woc2lyZGV2X2dldF9pbnN0YW5jZSk7CitFWFBPUlRfU1lNQk9MKHNpcmRldl9wdXRfaW5zdGFuY2UpOworCitFWFBPUlRfU1lNQk9MKHNpcmRldl9zZXRfZG9uZ2xlKTsKK0VYUE9SVF9TWU1CT0woc2lyZGV2X3dyaXRlX2NvbXBsZXRlKTsKK0VYUE9SVF9TWU1CT0woc2lyZGV2X3JlY2VpdmUpOworCitFWFBPUlRfU1lNQk9MKHNpcmRldl9yYXdfd3JpdGUpOworRVhQT1JUX1NZTUJPTChzaXJkZXZfcmF3X3JlYWQpOworRVhQT1JUX1NZTUJPTChzaXJkZXZfc2V0X2R0cl9ydHMpOworCitzdGF0aWMgaW50IF9faW5pdCBzaXJfY29yZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfdGhyZWFkX2NyZWF0ZSgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2lyX2NvcmVfZXhpdCh2b2lkKQoreworCWlyZGFfdGhyZWFkX2pvaW4oKTsKK30KKworbW9kdWxlX2luaXQoc2lyX2NvcmVfaW5pdCk7Cittb2R1bGVfZXhpdChzaXJfY29yZV9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM1YTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKQEAgLTAsMCArMSw2NzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglzaXJfZGV2LmM6CWlyZGEgc2lyIG5ldHdvcmsgZGV2aWNlCisgKiAKKyAqCUNvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwKKyAqIAorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKgl0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBzaXJkZXZfZW5hYmxlX3J4KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZkZXYtPmVuYWJsZV9yeCkpKQorCQlyZXR1cm47CisKKwkvKiBmbHVzaCByeC1idWZmZXIgLSBzaG91bGQgYWxzbyBoZWxwIGluIGNhc2Ugb2YgcHJvYmxlbXMgd2l0aCBlY2hvIGNhbmNlbGF0aW9uICovCisJZGV2LT5yeF9idWZmLmRhdGEgPSBkZXYtPnJ4X2J1ZmYuaGVhZDsKKwlkZXYtPnJ4X2J1ZmYubGVuID0gMDsKKwlkZXYtPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlkZXYtPnJ4X2J1ZmYuc3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCWF0b21pY19zZXQoJmRldi0+ZW5hYmxlX3J4LCAxKTsKK30KKworc3RhdGljIGludCBzaXJkZXZfaXNfcmVjZWl2aW5nKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJaWYgKCFhdG9taWNfcmVhZCgmZGV2LT5lbmFibGVfcngpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAoZGV2LT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUUpOworfQorCitpbnQgc2lyZGV2X3NldF9kb25nbGUoc3RydWN0IHNpcl9kZXYgKmRldiwgSVJEQV9ET05HTEUgdHlwZSkKK3sKKwlpbnQgZXJyOworCisJSVJEQV9ERUJVRygzLCAiJXMgOiByZXF1ZXN0aW5nIGRvbmdsZSAlZC5cbiIsIF9fRlVOQ1RJT05fXywgdHlwZSk7CisKKwllcnIgPSBzaXJkZXZfc2NoZWR1bGVfZG9uZ2xlX29wZW4oZGV2LCB0eXBlKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJcmV0dXJuIGVycjsKKwlkb3duKCZkZXYtPmZzbS5zZW0pOwkJLyogYmxvY2sgdW50aWwgY29uZmlnIGNoYW5nZSBjb21wbGV0ZWQgKi8KKwllcnIgPSBkZXYtPmZzbS5yZXN1bHQ7CisJdXAoJmRldi0+ZnNtLnNlbSk7CisJcmV0dXJuIGVycjsKK30KKworLyogdXNlZCBieSBkb25nbGUgZHJpdmVycyBmb3IgZG9uZ2xlIHByb2dyYW1taW5nICovCisKK2ludCBzaXJkZXZfcmF3X3dyaXRlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlpZiAodW5saWtlbHkobGVuID4gZGV2LT50eF9idWZmLnRydWVzaXplKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT50eF9sb2NrLCBmbGFncyk7CS8qIHNlcmlhbGl6ZSB3aXRoIG90aGVyIHR4IG9wZXJhdGlvbnMgKi8KKwl3aGlsZSAoZGV2LT50eF9idWZmLmxlbiA+IDApIHsJCQkvKiB3YWl0IHVudGlsIHR4IGlkbGUgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT50eF9sb2NrLCBmbGFncyk7CisJCW1zbGVlcCgxMCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKKwl9CisKKwlkZXYtPnR4X2J1ZmYuZGF0YSA9IGRldi0+dHhfYnVmZi5oZWFkOworCW1lbWNweShkZXYtPnR4X2J1ZmYuZGF0YSwgYnVmLCBsZW4pOwkKKwlkZXYtPnR4X2J1ZmYubGVuID0gbGVuOworCisJcmV0ID0gZGV2LT5kcnYtPmRvX3dyaXRlKGRldiwgZGV2LT50eF9idWZmLmRhdGEsIGRldi0+dHhfYnVmZi5sZW4pOworCWlmIChyZXQgPiAwKSB7CisJCUlSREFfREVCVUcoMywgIiVzKCksIHJhdy10eCBzdGFydGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWRldi0+dHhfYnVmZi5kYXRhICs9IHJldDsKKwkJZGV2LT50eF9idWZmLmxlbiAtPSByZXQ7CisJCWRldi0+cmF3X3R4ID0gMTsKKwkJcmV0ID0gbGVuOwkJLyogYWxsIGRhdGEgaXMgZ29pbmcgdG8gYmUgc2VudCAqLworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBzZWVtcyBzb21lIGRvbmdsZSBkcml2ZXJzIG1heSBuZWVkIHRoaXMgKi8KKworaW50IHNpcmRldl9yYXdfcmVhZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IGNvdW50OworCisJaWYgKGF0b21pY19yZWFkKCZkZXYtPmVuYWJsZV9yeCkpCisJCXJldHVybiAtRUlPOwkJLyogZmFpbCBpZiB3ZSBleHBlY3QgaXJkYS1mcmFtZXMgKi8KKworCWNvdW50ID0gKGxlbiA8IGRldi0+cnhfYnVmZi5sZW4pID8gbGVuIDogZGV2LT5yeF9idWZmLmxlbjsKKworCWlmIChjb3VudCA+IDApIHsKKwkJbWVtY3B5KGJ1ZiwgZGV2LT5yeF9idWZmLmRhdGEsIGNvdW50KTsKKwkJZGV2LT5yeF9idWZmLmRhdGEgKz0gY291bnQ7CisJCWRldi0+cnhfYnVmZi5sZW4gLT0gY291bnQ7CisJfQorCisJLyogcmVtYWluaW5nIHN0dWZmIGdldHMgZmx1c2hlZCB3aGVuIHJlLWVuYWJsaW5nIG5vcm1hbCByeCAqLworCisJcmV0dXJuIGNvdW50OworfQorCitpbnQgc2lyZGV2X3NldF9kdHJfcnRzKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGludCBkdHIsIGludCBydHMpCit7CisJaW50IHJldCA9IC1FTlhJTzsKKwlpZiAoZGV2LT5kcnYtPnNldF9kdHJfcnRzICE9IDApCisJCXJldCA9ICBkZXYtPmRydi0+c2V0X2R0cl9ydHMoZGV2LCBkdHIsIHJ0cyk7CisJcmV0dXJuIHJldDsKK30KKwkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjYWxsZWQgZnJvbSBjbGllbnQgZHJpdmVyIC0gbGlrZWx5IHdpdGggYmgtY29udGV4dCAtIHRvIGluZGljYXRlCisgKiBpdCBtYWRlIHNvbWUgcHJvZ3Jlc3Mgd2l0aCB0cmFuc21pc3Npb24uIEhlbmNlIHdlIHNlbmQgdGhlIG5leHQKKyAqIGNodW5rLCBpZiBhbnksIG9yIGNvbXBsZXRlIHRoZSBza2Igb3RoZXJ3aXNlCisgKi8KKwordm9pZCBzaXJkZXZfd3JpdGVfY29tcGxldGUoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGFjdHVhbCA9IDA7CisJaW50IGVycjsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT50eF9sb2NrLCBmbGFncyk7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpIC0gZGV2LT50eF9idWZmLmxlbiA9ICVkXG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIGRldi0+dHhfYnVmZi5sZW4pOworCisJaWYgKGxpa2VseShkZXYtPnR4X2J1ZmYubGVuID4gMCkpICB7CisJCS8qIFdyaXRlIGRhdGEgbGVmdCBpbiB0cmFuc21pdCBidWZmZXIgKi8KKwkJYWN0dWFsID0gZGV2LT5kcnYtPmRvX3dyaXRlKGRldiwgZGV2LT50eF9idWZmLmRhdGEsIGRldi0+dHhfYnVmZi5sZW4pOworCisJCWlmIChsaWtlbHkoYWN0dWFsPjApKSB7CisJCQlkZXYtPnR4X2J1ZmYuZGF0YSArPSBhY3R1YWw7CisJCQlkZXYtPnR4X2J1ZmYubGVuICAtPSBhY3R1YWw7CisJCX0KKwkJZWxzZSBpZiAodW5saWtlbHkoYWN0dWFsPDApKSB7CisJCQkvKiBjb3VsZCBiZSBkcm9wcGVkIGxhdGVyIHdoZW4gd2UgaGF2ZSB0eF90aW1lb3V0IHRvIHJlY292ZXIgKi8KKwkJCUlSREFfRVJST1IoIiVzOiBkcnYtPmRvX3dyaXRlIGZhaWxlZCAoJWQpXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXywgYWN0dWFsKTsKKwkJCWlmICgoc2tiPWRldi0+dHhfc2tiKSAhPSBOVUxMKSB7CisJCQkJZGV2LT50eF9za2IgPSBOVUxMOworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsJCSAgICAgIAorCQkJCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwkJICAgICAgCisJCQl9CisJCQlkZXYtPnR4X2J1ZmYubGVuID0gMDsKKwkJfQorCQlpZiAoZGV2LT50eF9idWZmLmxlbiA+IDApCisJCQlnb3RvIGRvbmU7CS8qIG1vcmUgZGF0YSB0byBzZW5kIGxhdGVyICovCisJfQorCisJaWYgKHVubGlrZWx5KGRldi0+cmF3X3R4ICE9IDApKSB7CisJCS8qIGluIHJhdyBtb2RlIHdlIGFyZSBqdXN0IGRvbmUgbm93IGFmdGVyIHRoZSBidWZmZXIgd2FzIHNlbnQKKwkJICogY29tcGxldGVseS4gU2luY2UgdGhpcyB3YXMgcmVxdWVzdGVkIGJ5IHNvbWUgZG9uZ2xlIGRyaXZlcgorCQkgKiBydW5uaW5nIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBpcmRhLXRocmVhZCB3ZSBtdXN0IHRha2UKKwkJICogY2FyZSBoZXJlIG5vdCB0byByZS1lbmFibGUgdGhlIHF1ZXVlLiBUaGUgcXVldWUgd2lsbCBiZQorCQkgKiByZXN0YXJ0ZWQgd2hlbiB0aGUgaXJkYS10aHJlYWQgaGFzIGNvbXBsZXRlZCB0aGUgcmVxdWVzdC4KKwkJICovCisKKwkJSVJEQV9ERUJVRygzLCAiJXMoKSwgcmF3LXR4IGRvbmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRldi0+cmF3X3R4ID0gMDsKKwkJZ290byBkb25lOwkvKiBubyBwb3N0LWZyYW1lIGhhbmRsaW5nIGluIHJhdyBtb2RlICovCisJfQorCisJLyogd2UgaGF2ZSBmaW5pc2hlZCBub3cgc2VuZGluZyB0aGlzIHNrYi4KKwkgKiB1cGRhdGUgc3RhdGlzdGljcyBhbmQgZnJlZSB0aGUgc2tiLgorCSAqIGZpbmFsbHkgd2UgY2hlY2sgYW5kIHRyaWdnZXIgYSBwZW5kaW5nIHNwZWVkIGNoYW5nZSwgaWYgYW55LgorCSAqIGlmIG5vdCB3ZSBzd2l0Y2ggdG8gcnggbW9kZSBhbmQgd2FrZSB0aGUgcXVldWUgZm9yIGZ1cnRoZXIKKwkgKiBwYWNrZXRzLgorCSAqIG5vdGUgdGhlIHNjaGVkdWxlZCBzcGVlZCByZXF1ZXN0IGJsb2NrcyB1bnRpbCB0aGUgbG93ZXIKKwkgKiBjbGllbnQgZHJpdmVyIGFuZCB0aGUgY29ycmVzcG9uZGluZyBoYXJkd2FyZSBoYXMgcmVhbGx5CisJICogZmluaXNoZWQgc2VuZGluZyBhbGwgZGF0YSAoeG1pdCBmaWZvIGRyYWluZWQgZi5lLikKKwkgKiBiZWZvcmUgdGhlIHNwZWVkIGNoYW5nZSBnZXRzIGZpbmFsbHkgZG9uZSBhbmQgdGhlIHF1ZXVlCisJICogcmUtYWN0aXZhdGVkLgorCSAqLworCisJSVJEQV9ERUJVRyg1LCAiJXMoKSwgZmluaXNoZWQgd2l0aCBmcmFtZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQorCWlmICgoc2tiPWRldi0+dHhfc2tiKSAhPSBOVUxMKSB7CisJCWRldi0+dHhfc2tiID0gTlVMTDsKKwkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CQkgICAgICAKKwkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9CisKKwlpZiAodW5saWtlbHkoZGV2LT5uZXdfc3BlZWQgPiAwKSkgeworCQlJUkRBX0RFQlVHKDUsICIlcygpLCBDaGFuZ2luZyBzcGVlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWVyciA9IHNpcmRldl9zY2hlZHVsZV9zcGVlZChkZXYsIGRldi0+bmV3X3NwZWVkKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJCSAqIGZvcmdldCB0aGUgc3BlZWQgY2hhbmdlIGFuZCBob3BlIHRoZSBzdGFjayByZWNvdmVycworCQkJICovCisJCQlJUkRBX0VSUk9SKCIlcyAtIHNjaGVkdWxlIHNwZWVkIGNoYW5nZSBmYWlsZWQ6ICVkXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2LT5uZXRkZXYpOworCQl9CisJCS8qIGVsc2U6IHN1Y2Nlc3MKKwkJICoJc3BlZWQgY2hhbmdlIGluIHByb2dyZXNzIG5vdworCQkgKglvbiBjb21wbGV0aW9uIGRldi0+bmV3X3NwZWVkIGdldHMgY2xlYXJlZCwKKwkJICoJcngtcmVlbmFibGVkIGFuZCB0aGUgcXVldWUgcmVzdGFydGVkCisJCSAqLworCX0KKwllbHNlIHsKKwkJc2lyZGV2X2VuYWJsZV9yeChkZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldi0+bmV0ZGV2KTsKKwl9CisKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT50eF9sb2NrLCBmbGFncyk7Cit9CisKKy8qIGNhbGxlZCBmcm9tIGNsaWVudCBkcml2ZXIgLSBsaWtlbHkgd2l0aCBiaC1jb250ZXh0IC0gdG8gZ2l2ZSB1cworICogc29tZSBtb3JlIHJlY2VpdmVkIGJ5dGVzLiBXZSBwdXQgdGhlbSBpbnRvIHRoZSByeC1idWZmZXIsCisgKiBub3JtYWxseSB1bndyYXBwaW5nIGFuZCBidWlsZGluZyBMQVAtc2tiJ3MgKHVubGVzcyByeCBkaXNhYmxlZCkKKyAqLworCitpbnQgc2lyZGV2X3JlY2VpdmUoc3RydWN0IHNpcl9kZXYgKmRldiwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIHNpemVfdCBjb3VudCkgCit7CisJaWYgKCFkZXYgfHwgIWRldi0+bmV0ZGV2KSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgbm90IHJlYWR5IHlldCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIWRldi0+aXJsYXApIHsKKwkJSVJEQV9XQVJOSU5HKCIlcyAtIHRvbyBlYXJseTogJXAgLyAlemQhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIGNwLCBjb3VudCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY3A9PU5VTEwpIHsKKwkJLyogZXJyb3IgYWxyZWFkeSBhdCBsb3dlciBsZXZlbCByZWNlaXZlCisJCSAqIGp1c3QgdXBkYXRlIHN0YXRzIGFuZCBzZXQgbWVkaWEgYnVzeQorCQkgKi8KKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koZGV2LT5uZXRkZXYsIFRSVUUpOworCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJSVJEQV9ERUJVRygwLCAiJXM7IHJ4LWRyb3A6ICV6ZFxuIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJCXJldHVybiAwOworCX0KKworCS8qIFJlYWQgdGhlIGNoYXJhY3RlcnMgaW50byB0aGUgYnVmZmVyICovCisJaWYgKGxpa2VseShhdG9taWNfcmVhZCgmZGV2LT5lbmFibGVfcngpKSkgeworCQl3aGlsZSAoY291bnQtLSkKKwkJCS8qIFVud3JhcCBhbmQgZGVzdHVmZiBvbmUgYnl0ZSAqLworCQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LT5uZXRkZXYsICZkZXYtPnN0YXRzLCAKKwkJCQkJICAmZGV2LT5yeF9idWZmLCAqY3ArKyk7CisJfSBlbHNlIHsKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCS8qIHJ4IG5vdCBlbmFibGVkOiBzYXZlIHRoZSByYXcgYnl0ZXMgYW5kIG5ldmVyCisJCQkgKiB0cmlnZ2VyIGFueSBuZXRpZl9yeC4gVGhlIHJlY2VpdmVkIGJ5dGVzIGFyZSBmbHVzaGVkCisJCQkgKiBsYXRlciB3aGVuIHdlIHJlLWVuYWJsZSByeCBidXQgbWlnaHQgYmUgcmVhZCBtZWFud2hpbGUKKwkJCSAqIGJ5IHRoZSBkb25nbGUgZHJpdmVyLgorCQkJICovCisJCQlkZXYtPnJ4X2J1ZmYuZGF0YVtkZXYtPnJ4X2J1ZmYubGVuKytdID0gKmNwKys7CisKKwkJCS8qIFdoYXQgc2hvdWxkIHdlIGRvIHdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsPyAqLworCQkJaWYgKHVubGlrZWx5KGRldi0+cnhfYnVmZi5sZW4gPT0gZGV2LT5yeF9idWZmLnRydWVzaXplKSkKKwkJCQlkZXYtPnJ4X2J1ZmYubGVuID0gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY2FsbGJhY2tzIGZyb20gbmV0d29yayBsYXllciAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNpcmRldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHNpcl9kZXYgKmRldiA9IG5kZXYtPnByaXY7CisKKwlyZXR1cm4gKGRldikgPyAmZGV2LT5zdGF0cyA6IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc2lyZGV2X2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3Qgc2lyX2RldiAqZGV2ID0gbmRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBhY3R1YWwgPSAwOworCWludCBlcnI7CisJczMyIHNwZWVkOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJSVJEQV9ERUJVRygzLCAiJXMoKSwgc2tiLT5sZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBza2ItPmxlbik7CisKKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IGRldi0+c3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJaWYgKCFza2ItPmxlbikgeworCQkJZXJyID0gc2lyZGV2X3NjaGVkdWxlX3NwZWVkKGRldiwgc3BlZWQpOworCQkJaWYgKHVubGlrZWx5KGVyciA9PSAtRVdPVUxEQkxPQ0spKSB7CisJCQkJLyogRmFpbGVkIHRvIGluaXRpYXRlIHRoZSBzcGVlZCBjaGFuZ2UsIGxpa2VseSB0aGUgZnNtCisJCQkJICogaXMgc3RpbGwgYnVzeSAocHJldHR5IHVubGlrZWx5LCBidXQuLi4pCisJCQkJICogV2UgcmVmdXNlIHRvIGFjY2VwdCB0aGUgc2tiIGFuZCByZXR1cm4gd2l0aCB0aGUgcXVldWUKKwkJCQkgKiBzdG9wcGVkIHNvIHRoZSBuZXR3b3JrIGxheWVyIHdpbGwgcmV0cnkgYWZ0ZXIgdGhlCisJCQkJICogZnNtIGNvbXBsZXRlcyBhbmQgd2FrZXMgdGhlIHF1ZXVlLgorCQkJCSAqLworCQkJCSByZXR1cm4gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCQkvKiBvdGhlciBmYXRhbCBlcnJvciAtIGZvcmdldCB0aGUgc3BlZWQgY2hhbmdlIGFuZAorCQkJCSAqIGhvcGUgdGhlIHN0YWNrIHdpbGwgcmVjb3ZlciBzb21laG93CisJCQkJICovCisJCQkJIG5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworCQkJfQorCQkJLyogZWxzZTogc3VjY2VzcworCQkJICoJc3BlZWQgY2hhbmdlIGluIHByb2dyZXNzIG5vdworCQkJICoJb24gY29tcGxldGlvbiB0aGUgcXVldWUgZ2V0cyByZXN0YXJ0ZWQKKwkJCSAqLworCisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJZGV2LT5uZXdfc3BlZWQgPSBzcGVlZDsKKwl9CisKKwkvKiBJbml0IHR4IGJ1ZmZlciovCisJZGV2LT50eF9idWZmLmRhdGEgPSBkZXYtPnR4X2J1ZmYuaGVhZDsKKworCS8qIENoZWNrIHByb2JsZW1zICovCisJaWYoc3Bpbl9pc19sb2NrZWQoJmRldi0+dHhfbG9jaykpIHsKKwkJSVJEQV9ERUJVRygzLCAiJXMoKSwgd3JpdGUgbm90IGNvbXBsZXRlZFxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisKKwkvKiBzZXJpYWxpemUgd2l0aCB3cml0ZSBjb21wbGV0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dHhfbG9jaywgZmxhZ3MpOworCisgICAgICAgIC8qIENvcHkgc2tiIHRvIHR4X2J1ZmYgd2hpbGUgd3JhcHBpbmcsIHN0dWZmaW5nIGFuZCBtYWtpbmcgQ1JDICovCisJZGV2LT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgZGV2LT50eF9idWZmLmRhdGEsIGRldi0+dHhfYnVmZi50cnVlc2l6ZSk7IAorCisJLyogdHJhbnNtaXNzaW9uIHdpbGwgc3RhcnQgbm93IC0gZGlzYWJsZSByZWNlaXZlLgorCSAqIGlmIHdlIGFyZSBqdXN0IGluIHRoZSBtaWRkbGUgb2YgYW4gaW5jb21pbmcgZnJhbWUsCisJICogdHJlYXQgaXQgYXMgY29sbGlzaW9uLiBwcm9iYWJseSBpdCdzIGEgZ29vZCBpZGVhIHRvCisJICogcmVzZXQgdGhlIHJ4X2J1ZiBPVVRTSURFX0ZSQU1FIGluIHRoaXMgY2FzZSB0b28/CisJICovCisJYXRvbWljX3NldCgmZGV2LT5lbmFibGVfcngsIDApOworCWlmICh1bmxpa2VseShzaXJkZXZfaXNfcmVjZWl2aW5nKGRldikpKQorCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKworCWFjdHVhbCA9IGRldi0+ZHJ2LT5kb193cml0ZShkZXYsIGRldi0+dHhfYnVmZi5kYXRhLCBkZXYtPnR4X2J1ZmYubGVuKTsKKworCWlmIChsaWtlbHkoYWN0dWFsID4gMCkpIHsKKwkJZGV2LT50eF9za2IgPSBza2I7CisJCW5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJZGV2LT50eF9idWZmLmRhdGEgKz0gYWN0dWFsOworCQlkZXYtPnR4X2J1ZmYubGVuIC09IGFjdHVhbDsKKwl9CisJZWxzZSBpZiAodW5saWtlbHkoYWN0dWFsIDwgMCkpIHsKKwkJLyogY291bGQgYmUgZHJvcHBlZCBsYXRlciB3aGVuIHdlIGhhdmUgdHhfdGltZW91dCB0byByZWNvdmVyICovCisJCUlSREFfRVJST1IoIiVzOiBkcnYtPmRvX3dyaXRlIGZhaWxlZCAoJWQpXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBhY3R1YWwpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwkJICAgICAgCisJCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwkJICAgICAgCisJCW5ldGlmX3dha2VfcXVldWUobmRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dHhfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxlZCBmcm9tIG5ldHdvcmsgbGF5ZXIgd2l0aCBydG5sIGhvbGQgKi8KKworc3RhdGljIGludCBzaXJkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGlmX2lyZGFfcmVxICppcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopIHJxOworCXN0cnVjdCBzaXJfZGV2ICpkZXYgPSBuZGV2LT5wcml2OworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygzLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgbmRldi0+bmFtZSwgY21kKTsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NCQU5EV0lEVEg6IC8qIFNldCBiYW5kd2lkdGggKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0ID0gLUVQRVJNOworCQllbHNlCisJCQlyZXQgPSBzaXJkZXZfc2NoZWR1bGVfc3BlZWQoZGV2LCBpcnEtPmlmcl9iYXVkcmF0ZSk7CisJCS8qIGNhbm5vdCBzbGVlcCBoZXJlIGZvciBjb21wbGV0aW9uCisJCSAqIHdlIGFyZSBjYWxsZWQgZnJvbSBuZXR3b3JrIGxheWVyIHdpdGggcnRubCBob2xkCisJCSAqLworCQlicmVhazsKKworCWNhc2UgU0lPQ1NET05HTEU6IC8qIFNldCBkb25nbGUgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0ID0gLUVQRVJNOworCQllbHNlCisJCQlyZXQgPSBzaXJkZXZfc2NoZWR1bGVfZG9uZ2xlX29wZW4oZGV2LCBpcnEtPmlmcl9kb25nbGUpOworCQkvKiBjYW5ub3Qgc2xlZXAgaGVyZSBmb3IgY29tcGxldGlvbgorCQkgKiB3ZSBhcmUgY2FsbGVkIGZyb20gbmV0d29yayBsYXllciB3aXRoIHJ0bmwgaG9sZAorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTTUVESUFCVVNZOiAvKiBTZXQgbWVkaWEgYnVzeSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXQgPSAtRVBFUk07CisJCWVsc2UKKwkJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KGRldi0+bmV0ZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHUkVDRUlWSU5HOiAvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSBzaXJkZXZfaXNfcmVjZWl2aW5nKGRldik7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0RUUlJUUzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0ID0gLUVQRVJNOworCQllbHNlCisJCQlyZXQgPSBzaXJkZXZfc2NoZWR1bGVfZHRyX3J0cyhkZXYsIGlycS0+aWZyX2R0ciwgaXJxLT5pZnJfcnRzKTsKKwkJLyogY2Fubm90IHNsZWVwIGhlcmUgZm9yIGNvbXBsZXRpb24KKwkJICogd2UgYXJlIGNhbGxlZCBmcm9tIG5ldHdvcmsgbGF5ZXIgd2l0aCBydG5sIGhvbGQKKwkJICovCisJCWJyZWFrOworCisJY2FzZSBTSU9DU01PREU6CisjaWYgMAorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXQgPSAtRVBFUk07CisJCWVsc2UKKwkJCXJldCA9IHNpcmRldl9zY2hlZHVsZV9tb2RlKGRldiwgaXJxLT5pZnJfbW9kZSk7CisJCS8qIGNhbm5vdCBzbGVlcCBoZXJlIGZvciBjb21wbGV0aW9uCisJCSAqIHdlIGFyZSBjYWxsZWQgZnJvbSBuZXR3b3JrIGxheWVyIHdpdGggcnRubCBob2xkCisJCSAqLworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFNJUkJVRl9BTExPQ1NJWkUgNDI2OQkvKiB3b3JzdCBjYXNlIHNpemUgb2YgYSB3cmFwcGVkIElyTEFQIGZyYW1lICovCisKK3N0YXRpYyBpbnQgc2lyZGV2X2FsbG9jX2J1ZmZlcnMoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlkZXYtPnR4X2J1ZmYudHJ1ZXNpemUgPSBTSVJCVUZfQUxMT0NTSVpFOworCWRldi0+cnhfYnVmZi50cnVlc2l6ZSA9IElSREFfU0tCX01BWF9NVFU7IAorCisJLyogQm9vdHN0cmFwIFplcm9Db3B5IFJ4ICovCisJZGV2LT5yeF9idWZmLnNrYiA9IF9fZGV2X2FsbG9jX3NrYihkZXYtPnJ4X2J1ZmYudHJ1ZXNpemUsIEdGUF9LRVJORUwpOworCWlmIChkZXYtPnJ4X2J1ZmYuc2tiID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXNrYl9yZXNlcnZlKGRldi0+cnhfYnVmZi5za2IsIDEpOworCWRldi0+cnhfYnVmZi5oZWFkID0gZGV2LT5yeF9idWZmLnNrYi0+ZGF0YTsKKworCWRldi0+dHhfYnVmZi5oZWFkID0ga21hbGxvYyhkZXYtPnR4X2J1ZmYudHJ1ZXNpemUsIEdGUF9LRVJORUwpOworCWlmIChkZXYtPnR4X2J1ZmYuaGVhZCA9PSBOVUxMKSB7CisJCWtmcmVlX3NrYihkZXYtPnJ4X2J1ZmYuc2tiKTsKKwkJZGV2LT5yeF9idWZmLnNrYiA9IE5VTEw7CisJCWRldi0+cnhfYnVmZi5oZWFkID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGV2LT50eF9idWZmLmRhdGEgPSBkZXYtPnR4X2J1ZmYuaGVhZDsKKwlkZXYtPnJ4X2J1ZmYuZGF0YSA9IGRldi0+cnhfYnVmZi5oZWFkOworCWRldi0+dHhfYnVmZi5sZW4gPSAwOworCWRldi0+cnhfYnVmZi5sZW4gPSAwOworCisJZGV2LT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJZGV2LT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyB2b2lkIHNpcmRldl9mcmVlX2J1ZmZlcnMoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlpZiAoZGV2LT5yeF9idWZmLnNrYikKKwkJa2ZyZWVfc2tiKGRldi0+cnhfYnVmZi5za2IpOworCWlmIChkZXYtPnR4X2J1ZmYuaGVhZCkKKwkJa2ZyZWUoZGV2LT50eF9idWZmLmhlYWQpOworCWRldi0+cnhfYnVmZi5oZWFkID0gZGV2LT50eF9idWZmLmhlYWQgPSBOVUxMOworCWRldi0+cnhfYnVmZi5za2IgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHNpcmRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBzaXJfZGV2ICpkZXYgPSBuZGV2LT5wcml2OworCWNvbnN0IHN0cnVjdCBzaXJfZHJpdmVyICpkcnYgPSBkZXYtPmRydjsKKworCWlmICghZHJ2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGRyaXZlciBtb2R1bGUgYmVmb3JlIGRvaW5nIHNlcmlvdXMgc3R1ZmYgKi8KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRydi0+b3duZXIpKQorCQlyZXR1cm4gLUVTVEFMRTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoc2lyZGV2X2FsbG9jX2J1ZmZlcnMoZGV2KSkKKwkJZ290byBlcnJvdXRfZGVjOworCisJaWYgKCFkZXYtPmRydi0+c3RhcnRfZGV2ICB8fCAgZGV2LT5kcnYtPnN0YXJ0X2RldihkZXYpKQorCQlnb3RvIGVycm91dF9mcmVlOworCisJc2lyZGV2X2VuYWJsZV9yeChkZXYpOworCWRldi0+cmF3X3R4ID0gMDsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworCWRldi0+aXJsYXAgPSBpcmxhcF9vcGVuKG5kZXYsICZkZXYtPnFvcywgZGV2LT5od25hbWUpOworCWlmICghZGV2LT5pcmxhcCkKKwkJZ290byBlcnJvdXRfc3RvcDsKKworCW5ldGlmX3dha2VfcXVldWUobmRldik7CisKKwlJUkRBX0RFQlVHKDIsICIlcyAtIGRvbmUsIHNwZWVkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5zcGVlZCk7CisKKwlyZXR1cm4gMDsKKworZXJyb3V0X3N0b3A6CisJYXRvbWljX3NldCgmZGV2LT5lbmFibGVfcngsIDApOworCWlmIChkZXYtPmRydi0+c3RvcF9kZXYpCisJCWRldi0+ZHJ2LT5zdG9wX2RldihkZXYpOworZXJyb3V0X2ZyZWU6CisJc2lyZGV2X2ZyZWVfYnVmZmVycyhkZXYpOworZXJyb3V0X2RlYzoKKwltb2R1bGVfcHV0KGRydi0+b3duZXIpOworCXJldHVybiAtRUFHQUlOOworfQorCitzdGF0aWMgaW50IHNpcmRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3Qgc2lyX2RldiAqZGV2ID0gbmRldi0+cHJpdjsKKwljb25zdCBzdHJ1Y3Qgc2lyX2RyaXZlciAqZHJ2OworCisvLwlJUkRBX0RFQlVHKDAsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisKKwlkb3duKCZkZXYtPmZzbS5zZW0pOwkJLyogYmxvY2sgb24gcGVuZGluZyBjb25maWcgY29tcGxldGlvbiAqLworCisJYXRvbWljX3NldCgmZGV2LT5lbmFibGVfcngsIDApOworCisJaWYgKHVubGlrZWx5KCFkZXYtPmlybGFwKSkKKwkJZ290byBvdXQ7CisJaXJsYXBfY2xvc2UoZGV2LT5pcmxhcCk7CisJZGV2LT5pcmxhcCA9IE5VTEw7CisKKwlkcnYgPSBkZXYtPmRydjsKKwlpZiAodW5saWtlbHkoIWRydiAgfHwgICFkZXYtPnByaXYpKQorCQlnb3RvIG91dDsKKworCWlmIChkcnYtPnN0b3BfZGV2KQorCQlkcnYtPnN0b3BfZGV2KGRldik7CisKKwlzaXJkZXZfZnJlZV9idWZmZXJzKGRldik7CisJbW9kdWxlX3B1dChkcnYtPm93bmVyKTsKKworb3V0OgorCWRldi0+c3BlZWQgPSAwOworCXVwKCZkZXYtPmZzbS5zZW0pOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3Qgc2lyX2RldiAqIHNpcmRldl9nZXRfaW5zdGFuY2UoY29uc3Qgc3RydWN0IHNpcl9kcml2ZXIgKmRydiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3Qgc2lyX2RldiAqZGV2OworCisJSVJEQV9ERUJVRygwLCAiJXMgLSAlc1xuIiwgX19GVU5DVElPTl9fLCBuYW1lKTsKKworCS8qIGluc3RlYWQgb2YgYWRkaW5nIHRlc3RzIHRvIHByb3RlY3QgYWdhaW5zdCBkcnYtPmRvX3dyaXRlPT1OVUxMCisJICogYXQgc2V2ZXJhbCBwbGFjZXMgd2UgcmVmdXNlIHRvIGNyZWF0ZSBhIHNpcl9kZXYgaW5zdGFuY2UgZm9yCisJICogZHJpdmVycyB3aGljaCBkb24ndCBpbXBsZW1lbnQgZG9fd3JpdGUuCisJICovCisJaWYgKCFkcnYgfHwgICFkcnYtPmRvX3dyaXRlKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogIEFsbG9jYXRlIG5ldyBpbnN0YW5jZSBvZiB0aGUgZGV2aWNlCisJICovCisJbmRldiA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKCpkZXYpKTsKKwlpZiAobmRldiA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzIC0gQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBJckRBIGNvbnRyb2wgYmxvY2shXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisJZGV2ID0gbmRldi0+cHJpdjsKKworCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJmRldi0+cW9zKTsKKwlkZXYtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCWRldi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IGRydi0+cW9zX210dF9iaXRzOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJmRldi0+cW9zKTsKKworCXN0cm5jcHkoZGV2LT5od25hbWUsIG5hbWUsIHNpemVvZihkZXYtPmh3bmFtZSktMSk7CisKKwlhdG9taWNfc2V0KCZkZXYtPmVuYWJsZV9yeCwgMCk7CisJZGV2LT50eF9za2IgPSBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJmRldi0+dHhfbG9jayk7CisJaW5pdF9NVVRFWCgmZGV2LT5mc20uc2VtKTsKKworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmZzbS5ycS5saF9yZXF1ZXN0KTsKKwlkZXYtPmZzbS5ycS5wZW5kaW5nID0gMDsKKwlpbml0X3RpbWVyKCZkZXYtPmZzbS5ycS50aW1lcik7CisKKwlkZXYtPmRydiA9IGRydjsKKwlkZXYtPm5ldGRldiA9IG5kZXY7CisKKwlTRVRfTU9EVUxFX09XTkVSKG5kZXYpOworCisJLyogT3ZlcnJpZGUgdGhlIG5ldHdvcmsgZnVuY3Rpb25zIHdlIG5lZWQgdG8gdXNlICovCisJbmRldi0+aGFyZF9zdGFydF94bWl0ID0gc2lyZGV2X2hhcmRfeG1pdDsKKwluZGV2LT5vcGVuID0gc2lyZGV2X29wZW47CisJbmRldi0+c3RvcCA9IHNpcmRldl9jbG9zZTsKKwluZGV2LT5nZXRfc3RhdHMgPSBzaXJkZXZfZ2V0X3N0YXRzOworCW5kZXYtPmRvX2lvY3RsID0gc2lyZGV2X2lvY3RsOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihuZGV2KSkgeworCQlJUkRBX0VSUk9SKCIlcygpLCByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9mcmVlbmV0ZGV2OworCX0KKworCXJldHVybiBkZXY7CisKK291dF9mcmVlbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KG5kZXYpOworb3V0OgorCXJldHVybiBOVUxMOworfQorCitpbnQgc2lyZGV2X3B1dF9pbnN0YW5jZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCWludCBlcnIgPSAwOworCisJSVJEQV9ERUJVRygwLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlhdG9taWNfc2V0KCZkZXYtPmVuYWJsZV9yeCwgMCk7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYtPm5ldGRldik7CisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYtPm5ldGRldik7CisKKwlpZiAoZGV2LT5kb25nbGVfZHJ2KQorCQllcnIgPSBzaXJkZXZfc2NoZWR1bGVfZG9uZ2xlX2Nsb3NlKGRldik7CisJaWYgKGVycikKKwkJSVJEQV9FUlJPUigiJXMgLSBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOworCisJc2lyZGV2X2Nsb3NlKGRldi0+bmV0ZGV2KTsKKworCWRvd24oJmRldi0+ZnNtLnNlbSk7CisJZGV2LT5mc20uc3RhdGUgPSBTSVJERVZfU1RBVEVfREVBRDsJLyogbWFyayBzdGFsZWQgKi8KKwlkZXYtPmRvbmdsZV9kcnYgPSBOVUxMOworCWRldi0+cHJpdiA9IE5VTEw7CisJdXAoJmRldi0+ZnNtLnNlbSk7CisKKwkvKiBSZW1vdmUgbmV0ZGV2aWNlICovCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2LT5uZXRkZXYpOworCisJZnJlZV9uZXRkZXYoZGV2LT5uZXRkZXYpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2RvbmdsZS5jIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZG9uZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViNzY3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2RvbmdsZS5jCkBAIC0wLDAgKzEsMTM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc2lyX2RvbmdsZS5jOgltYW5hZ2VyIGZvciBzZXJpYWwgZG9uZ2xlIHByb3RvY29sIGRyaXZlcnMKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDIgTWFydGluIERpZWhsCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKgl0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBkb25nbGUgcmVnaXN0cmF0aW9uIGFuZCBhdHRhY2htZW50CisgKgorICovCisKK3N0YXRpYyBMSVNUX0hFQUQoZG9uZ2xlX2xpc3QpOwkJCS8qIGxpc3Qgb2YgcmVnaXN0ZXJlZCBkb25nbGUgZHJpdmVycyAqLworc3RhdGljIERFQ0xBUkVfTVVURVgoZG9uZ2xlX2xpc3RfbG9jayk7CQkvKiBwcm90ZWN0cyB0aGUgbGlzdCAqLworCitpbnQgaXJkYV9yZWdpc3Rlcl9kb25nbGUoc3RydWN0IGRvbmdsZV9kcml2ZXIgKm5ldykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgZG9uZ2xlX2RyaXZlciAqZHJ2OworCisJSVJEQV9ERUJVRygwLCAiJXMgOiByZWdpc3RlcmluZyBkb25nbGUgXCIlc1wiICglZCkuXG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIG5ldy0+ZHJpdmVyX25hbWUsIG5ldy0+dHlwZSk7CisKKwlkb3duKCZkb25nbGVfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmZG9uZ2xlX2xpc3QpIHsKKwkJZHJ2ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGRvbmdsZV9kcml2ZXIsIGRvbmdsZV9saXN0KTsKKwkJaWYgKG5ldy0+dHlwZSA9PSBkcnYtPnR5cGUpIHsKKwkJCXVwKCZkb25nbGVfbGlzdF9sb2NrKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJfQorCWxpc3RfYWRkKCZuZXctPmRvbmdsZV9saXN0LCAmZG9uZ2xlX2xpc3QpOworCXVwKCZkb25nbGVfbGlzdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoc3RydWN0IGRvbmdsZV9kcml2ZXIgKmRydikKK3sKKwlkb3duKCZkb25nbGVfbGlzdF9sb2NrKTsKKwlsaXN0X2RlbCgmZHJ2LT5kb25nbGVfbGlzdCk7CisJdXAoJmRvbmdsZV9saXN0X2xvY2spOworCXJldHVybiAwOworfQorCitpbnQgc2lyZGV2X2dldF9kb25nbGUoc3RydWN0IHNpcl9kZXYgKmRldiwgSVJEQV9ET05HTEUgdHlwZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwljb25zdCBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciAqZHJ2ID0gTlVMTDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworI2lmZGVmIENPTkZJR19LTU9ECisJcmVxdWVzdF9tb2R1bGUoImlyZGEtZG9uZ2xlLSVkIiwgdHlwZSk7CisjZW5kaWYKKworCWlmIChkZXYtPmRvbmdsZV9kcnYgIT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKwkKKwkvKiBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgZG9uZ2xlcyAqLworCWRvd24oJmRvbmdsZV9saXN0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmRvbmdsZV9saXN0KSB7CisJCWRydiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBkb25nbGVfZHJpdmVyLCBkb25nbGVfbGlzdCk7CisJCWlmIChkcnYtPnR5cGUgPT0gdHlwZSkKKwkJCWJyZWFrOworCQllbHNlCisJCQlkcnYgPSBOVUxMOworCX0KKworCWlmICghZHJ2KSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3VubG9jazsJLyogbm8gc3VjaCBkb25nbGUgKi8KKwl9CisKKwkvKiBoYW5kbGluZyBvZiBTTVAgcmFjZXMgd2l0aCBkb25nbGUgbW9kdWxlIHJlbW92YWwgLSB0aHJlZSBjYXNlczoKKwkgKiAxKSBkb25nbGUgZHJpdmVyIHdhcyBhbHJlYWR5IHVucmVnaXN0ZXJlZCAtIHRoZW4gd2UgaGF2ZW4ndCBmb3VuZCB0aGUKKwkgKglyZXF1ZXN0ZWQgZG9uZ2xlIGFib3ZlIGFuZCBhcmUgYWxyZWFkeSBvdXQgaGVyZQorCSAqIDIpIHRoZSBtb2R1bGUgaXMgYWxyZWFkeSBtYXJrZWQgZGVsZXRlZCBidXQgdGhlIGRyaXZlciBpcyBzdGlsbAorCSAqCXJlZ2lzdGVyZWQgLSB0aGVuIHRoZSB0cnlfbW9kdWxlX2dldCgpIGJlbG93IHdpbGwgZmFpbAorCSAqIDMpIHRoZSB0cnlfbW9kdWxlX2dldCgpIGJlbG93IHN1Y2NlZWRzIGJlZm9yZSB0aGUgbW9kdWxlIGlzIG1hcmtlZAorCSAqCWRlbGV0ZWQgLSB0aGVuIHN5c19kZWxldGVfbW9kdWxlKCkgZmFpbHMgYW5kIHByZXZlbnRzIHRoZSByZW1vdmFsCisJICoJYmVjYXVzZSB0aGUgbW9kdWxlIGlzIGluIHVzZS4KKwkgKi8KKworCWlmICghdHJ5X21vZHVsZV9nZXQoZHJ2LT5vd25lcikpIHsKKwkJZXJyID0gLUVTVEFMRTsKKwkJZ290byBvdXRfdW5sb2NrOwkvKiBybW1vZCBhbHJlYWR5IHBlbmRpbmcgKi8KKwl9CisJZGV2LT5kb25nbGVfZHJ2ID0gZHJ2OworCisJaWYgKCFkcnYtPm9wZW4gIHx8ICAoZXJyPWRydi0+b3BlbihkZXYpKSE9MCkKKwkJZ290byBvdXRfcmVqZWN0OwkJLyogZmFpbGVkIHRvIG9wZW4gZHJpdmVyICovCisKKwl1cCgmZG9uZ2xlX2xpc3RfbG9jayk7CisJcmV0dXJuIDA7CisKK291dF9yZWplY3Q6CisJZGV2LT5kb25nbGVfZHJ2ID0gTlVMTDsKKwltb2R1bGVfcHV0KGRydi0+b3duZXIpOworb3V0X3VubG9jazoKKwl1cCgmZG9uZ2xlX2xpc3RfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworaW50IHNpcmRldl9wdXRfZG9uZ2xlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJY29uc3Qgc3RydWN0IGRvbmdsZV9kcml2ZXIgKmRydiA9IGRldi0+ZG9uZ2xlX2RydjsKKworCWlmIChkcnYpIHsKKwkJaWYgKGRydi0+Y2xvc2UpCisJCQlkcnYtPmNsb3NlKGRldik7CQkvKiBjbG9zZSB0aGlzIGRvbmdsZSBpbnN0YW5jZSAqLworCisJCWRldi0+ZG9uZ2xlX2RydiA9IE5VTEw7CQkJLyogdW5saW5rIHRoZSBkb25nbGUgZHJpdmVyICovCisJCW1vZHVsZV9wdXQoZHJ2LT5vd25lcik7LyogZGVjcmVtZW50IGRyaXZlcidzIG1vZHVsZSByZWZjb3VudCAqLworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfa3RocmVhZC5jIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfa3RocmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Y2VhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9rdGhyZWFkLmMKQEAgLTAsMCArMSw1MDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglzaXJfa3RocmVhZC5jOgkJZGVkaWNhdGVkIHRocmVhZCB0byBwcm9jZXNzIHNjaGVkdWxlZAorICoJCQkJc2lyIGRldmljZSBzZXR1cCByZXF1ZXN0cworICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGtJckRBZCBrZXJuZWwgdGhyZWFkIGFuZCBjb25maWcgc3RhdGUgbWFjaGluZQorICoKKyAqLworCitzdHJ1Y3QgaXJkYV9yZXF1ZXN0X3F1ZXVlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlcXVlc3RfbGlzdDsKKwlzcGlubG9ja190IGxvY2s7CisJdGFza190ICp0aHJlYWQ7CisJc3RydWN0IGNvbXBsZXRpb24gZXhpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBraWNrLCBkb25lOworCWF0b21pY190IG51bV9wZW5kaW5nOworfTsKKworc3RhdGljIHN0cnVjdCBpcmRhX3JlcXVlc3RfcXVldWUgaXJkYV9ycV9xdWV1ZTsKKworc3RhdGljIGludCBpcmRhX3F1ZXVlX3JlcXVlc3Qoc3RydWN0IGlyZGFfcmVxdWVzdCAqcnEpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmcnEtPnBlbmRpbmcpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpcmRhX3JxX3F1ZXVlLmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmcnEtPmxoX3JlcXVlc3QsICZpcmRhX3JxX3F1ZXVlLnJlcXVlc3RfbGlzdCk7CisJCXdha2VfdXAoJmlyZGFfcnFfcXVldWUua2ljayk7CisJCWF0b21pY19pbmMoJmlyZGFfcnFfcXVldWUubnVtX3BlbmRpbmcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmRhX3JxX3F1ZXVlLmxvY2ssIGZsYWdzKTsKKwkJcmV0ID0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaXJkYV9yZXF1ZXN0X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaXJkYV9yZXF1ZXN0ICpycSA9IChzdHJ1Y3QgaXJkYV9yZXF1ZXN0ICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZpcmRhX3JxX3F1ZXVlLmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZycS0+bGhfcmVxdWVzdCwgJmlyZGFfcnFfcXVldWUucmVxdWVzdF9saXN0KTsKKwl3YWtlX3VwKCZpcmRhX3JxX3F1ZXVlLmtpY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlyZGFfcnFfcXVldWUubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGlyZGFfcXVldWVfZGVsYXllZF9yZXF1ZXN0KHN0cnVjdCBpcmRhX3JlcXVlc3QgKnJxLCB1bnNpZ25lZCBsb25nIGRlbGF5KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciA9ICZycS0+dGltZXI7CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJnJxLT5wZW5kaW5nKSkgeworCQl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBkZWxheTsKKwkJdGltZXItPmZ1bmN0aW9uID0gaXJkYV9yZXF1ZXN0X3RpbWVyOworCQl0aW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKXJxOworCQlhdG9taWNfaW5jKCZpcmRhX3JxX3F1ZXVlLm51bV9wZW5kaW5nKTsKKwkJYWRkX3RpbWVyKHRpbWVyKTsKKwkJcmV0ID0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcnVuX2lyZGFfcXVldWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCXN0cnVjdCBpcmRhX3JlcXVlc3QgKnJxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlyZGFfcnFfcXVldWUubG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdG1wLCAmaXJkYV9ycV9xdWV1ZS5yZXF1ZXN0X2xpc3QpIHsKKwkJcnEgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgaXJkYV9yZXF1ZXN0LCBsaF9yZXF1ZXN0KTsKKwkJbGlzdF9kZWxfaW5pdChlbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlyZGFfcnFfcXVldWUubG9jaywgZmxhZ3MpOworCisJCWNsZWFyX2JpdCgwLCAmcnEtPnBlbmRpbmcpOworCQlycS0+ZnVuYyhycS0+ZGF0YSk7CisKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlyZGFfcnFfcXVldWUubnVtX3BlbmRpbmcpKQorCQkJd2FrZV91cCgmaXJkYV9ycV9xdWV1ZS5kb25lKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJkYV9ycV9xdWV1ZS5sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlyZGFfcnFfcXVldWUubG9jaywgZmxhZ3MpOworfQkJCisKK3N0YXRpYyBpbnQgaXJkYV90aHJlYWQodm9pZCAqc3RhcnR1cCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWRhZW1vbml6ZSgia0lyREFkIik7CisKKwlpcmRhX3JxX3F1ZXVlLnRocmVhZCA9IGN1cnJlbnQ7CisKKwljb21wbGV0ZSgoc3RydWN0IGNvbXBsZXRpb24gKilzdGFydHVwKTsKKworCXdoaWxlIChpcmRhX3JxX3F1ZXVlLnRocmVhZCAhPSBOVUxMKSB7CisKKwkJLyogV2UgdXNlIFRBU0tfSU5URVJSVVBUSUJMRSwgcmF0aGVyIHRoYW4KKwkJICogVEFTS19VTklOVEVSUlVQVElCTEUuICBBbmRyZXcgTW9ydG9uIG1hZGUgdGhpcworCQkgKiBjaGFuZ2UgOyBoZSB0b2xkIG1lIHRoYXQgaXQgaXMgc2FmZSwgYmVjYXVzZSAic2lnbmFsCisJCSAqIGJsb2NraW5nIGlzIG5vdyBoYW5kbGVkIGluIGRhZW1vbml6ZSgpIiwgaGUgYWRkZWQKKwkJICogdGhhdCB0aGUgcHJvYmxlbSBpcyB0aGF0ICJ1bmludGVycnVwdGlibGUgc2xlZXAKKwkJICogY29udHJpYnV0ZXMgdG8gbG9hZCBhdmVyYWdlIiwgbWFraW5nIHVzZXIgd29ycnkuCisJCSAqIEplYW4gSUkgKi8KKwkJc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJmlyZGFfcnFfcXVldWUua2ljaywgJndhaXQpOworCQlpZiAobGlzdF9lbXB0eSgmaXJkYV9ycV9xdWV1ZS5yZXF1ZXN0X2xpc3QpKQorCQkJc2NoZWR1bGUoKTsKKwkJZWxzZQorCQkJX19zZXRfdGFza19zdGF0ZShjdXJyZW50LCBUQVNLX1JVTk5JTkcpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmaXJkYV9ycV9xdWV1ZS5raWNrLCAmd2FpdCk7CisKKwkJLyogbWFrZSBzd3N1c3AgaGFwcHkgd2l0aCBvdXIgdGhyZWFkICovCisJCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkKKwkJCXJlZnJpZ2VyYXRvcihQRl9GUkVFWkUpOworCisJCXJ1bl9pcmRhX3F1ZXVlKCk7CisJfQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDM1KQorCXJlcGFyZW50X3RvX2luaXQoKTsKKyNlbmRpZgorCWNvbXBsZXRlX2FuZF9leGl0KCZpcmRhX3JxX3F1ZXVlLmV4aXQsIDApOworCS8qIG5ldmVyIHJlYWNoZWQgKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBmbHVzaF9pcmRhX3F1ZXVlKHZvaWQpCit7CisJaWYgKGF0b21pY19yZWFkKCZpcmRhX3JxX3F1ZXVlLm51bV9wZW5kaW5nKSkgeworCisJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJCWlmICghbGlzdF9lbXB0eSgmaXJkYV9ycV9xdWV1ZS5yZXF1ZXN0X2xpc3QpKQorCQkJcnVuX2lyZGFfcXVldWUoKTsKKworCQlzZXRfdGFza19zdGF0ZShjdXJyZW50LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWFkZF93YWl0X3F1ZXVlKCZpcmRhX3JxX3F1ZXVlLmRvbmUsICZ3YWl0KTsKKwkJaWYgKGF0b21pY19yZWFkKCZpcmRhX3JxX3F1ZXVlLm51bV9wZW5kaW5nKSkKKwkJCXNjaGVkdWxlKCk7CisJCWVsc2UKKwkJCV9fc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19SVU5OSU5HKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmlyZGFfcnFfcXVldWUuZG9uZSwgJndhaXQpOworCX0KK30KKworLyogc3Vic3RhdGUgaGFuZGxlciBvZiB0aGUgY29uZmlnLWZzbSB0byBoYW5kbGUgdGhlIGNhc2VzIHdoZXJlIHdlIHdhbnQKKyAqIHRvIHdhaXQgZm9yIHRyYW5zbWl0IGNvbXBsZXRpb24gYmVmb3JlIGNoYW5naW5nIHRoZSBwb3J0IGNvbmZpZ3VyYXRpb24KKyAqLworCitzdGF0aWMgaW50IGlyZGFfdHhfY29tcGxldGVfZnNtKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHNpcl9mc20gKmZzbSA9ICZkZXYtPmZzbTsKKwl1bnNpZ25lZCBuZXh0X3N0YXRlLCBkZWxheTsKKwl1bnNpZ25lZCBieXRlc19sZWZ0OworCisJZG8geworCQluZXh0X3N0YXRlID0gZnNtLT5zdWJzdGF0ZTsJLyogZGVmYXVsdDogc3RheSBpbiBjdXJyZW50IHN1YnN0YXRlICovCisJCWRlbGF5ID0gMDsKKworCQlzd2l0Y2goZnNtLT5zdWJzdGF0ZSkgeworCisJCWNhc2UgU0lSREVWX1NUQVRFX1dBSVRfWE1JVDoKKwkJCWlmIChkZXYtPmRydi0+Y2hhcnNfaW5fYnVmZmVyKQorCQkJCWJ5dGVzX2xlZnQgPSBkZXYtPmRydi0+Y2hhcnNfaW5fYnVmZmVyKGRldik7CisJCQllbHNlCisJCQkJYnl0ZXNfbGVmdCA9IDA7CisJCQlpZiAoIWJ5dGVzX2xlZnQpIHsKKwkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX1dBSVRfVU5USUxfU0VOVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGRldi0+c3BlZWQgPiAxMTUyMDApCisJCQkJZGVsYXkgPSAoYnl0ZXNfbGVmdCo4KjEwMDAwKSAvIChkZXYtPnNwZWVkLzEwMCk7CisJCQllbHNlIGlmIChkZXYtPnNwZWVkID4gMCkKKwkJCQlkZWxheSA9IChieXRlc19sZWZ0KjEwKjEwMDAwKSAvIChkZXYtPnNwZWVkLzEwMCk7CisJCQllbHNlCisJCQkJZGVsYXkgPSAwOworCQkJLyogZXhwZWN0ZWQgZGVsYXkgKHVzZWMpIHVudGlsIHJlbWFpbmluZyBieXRlcyBhcmUgc2VudCAqLworCQkJaWYgKGRlbGF5IDwgMTAwKSB7CisJCQkJdWRlbGF5KGRlbGF5KTsKKwkJCQlkZWxheSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBzbGVlcCBzb21lIGxvbmdlciBkZWxheSAobXNlYykgKi8KKwkJCWRlbGF5ID0gKGRlbGF5Kzk5OSkgLyAxMDAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfV0FJVF9VTlRJTF9TRU5UOgorCQkJLyogYmxvY2sgdW50aWwgdW5kZXJsYXlpbmcgaGFyZHdhcmUgYnVmZmVyIGFyZSBlbXB0eSAqLworCQkJaWYgKGRldi0+ZHJ2LT53YWl0X3VudGlsX3NlbnQpCisJCQkJZGV2LT5kcnYtPndhaXRfdW50aWxfc2VudChkZXYpOworCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9UWF9ET05FOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfVFhfRE9ORToKKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6CisJCQlJUkRBX0VSUk9SKCIlcyAtIHVuZGVmaW5lZCBzdGF0ZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWZzbS0+c3Vic3RhdGUgPSBuZXh0X3N0YXRlOworCX0gd2hpbGUgKGRlbGF5ID09IDApOworCXJldHVybiBkZWxheTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfY29uZmlnX2ZzbQorICoKKyAqIFN0YXRlIG1hY2hpbmUgdG8gaGFuZGxlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBkZXZpY2UgKGFuZCBhdHRhY2hlZCBkb25nbGUsIGlmIGFueSkuCisgKiBUaGlzIGhhbmRsZXIgaXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24gaW4ga0lyREFkIGNvbnRleHQsIHNvIHdlIGNhbiBzbGVlcC4KKyAqIGhvd2V2ZXIsIGtJckRBZCBpcyBzaGFyZWQgYnkgYWxsIHNpcl9kZXYgZGV2aWNlcyBzbyB3ZSBiZXR0ZXIgZG9uJ3Qgc2xlZXAgdGhlcmUgdG9vCisgKiBsb25nLiBJbnN0ZWFkLCBmb3IgbG9uZ2VyIGRlbGF5cyB3ZSBzdGFydCBhIHRpbWVyIHRvIHJlc2NoZWR1bGUgdXMgbGF0ZXIuCisgKiBPbiBlbnRyeSwgZnNtLT5zZW0gaXMgYWx3YXlzIGxvY2tlZCBhbmQgdGhlIG5ldGRldiB4bWl0IHF1ZXVlIHN0b3BwZWQuCisgKiBCb3RoIG11c3QgYmUgdW5sb2NrZWQvcmVzdGFydGVkIG9uIGNvbXBsZXRpb24gLSBidXQgb25seSBvbiBmaW5hbCBleGl0LgorICovCisKK3N0YXRpYyB2b2lkIGlyZGFfY29uZmlnX2ZzbSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBzaXJfZGV2ICpkZXYgPSBkYXRhOworCXN0cnVjdCBzaXJfZnNtICpmc20gPSAmZGV2LT5mc207CisJaW50IG5leHRfc3RhdGU7CisJaW50IHJldCA9IC0xOworCXVuc2lnbmVkIGRlbGF5OworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgPCVsZD5cbiIsIF9fRlVOQ1RJT05fXywgamlmZmllcyk7IAorCisJZG8geworCQlJUkRBX0RFQlVHKDMsICIlcyAtIHN0YXRlPTB4JTA0eCAvIHN1YnN0YXRlPTB4JTA0eFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgZnNtLT5zdGF0ZSwgZnNtLT5zdWJzdGF0ZSk7CisKKwkJbmV4dF9zdGF0ZSA9IGZzbS0+c3RhdGU7CisJCWRlbGF5ID0gMDsKKworCQlzd2l0Y2goZnNtLT5zdGF0ZSkgeworCisJCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9PUEVOOgorCQkJaWYgKGRldi0+ZG9uZ2xlX2RydiAhPSBOVUxMKSB7CisJCQkJcmV0ID0gc2lyZGV2X3B1dF9kb25nbGUoZGV2KTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCWZzbS0+cmVzdWx0ID0gLUVJTlZBTDsKKwkJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9FUlJPUjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKiBJbml0aWFsaXplIGRvbmdsZSAqLworCQkJcmV0ID0gc2lyZGV2X2dldF9kb25nbGUoZGV2LCBmc20tPnBhcmFtKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlmc20tPnJlc3VsdCA9IHJldDsKKwkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0VSUk9SOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBEb25nbGVzIGFyZSBwb3dlcmVkIHRocm91Z2ggdGhlIG1vZGVtIGNvbnRyb2wgbGluZXMgd2hpY2gKKwkJCSAqIHdlcmUganVzdCBzZXQgZHVyaW5nIG9wZW4uIEJlZm9yZSByZXNldHRpbmcsIGxldCdzIHdhaXQgZm9yCisJCQkgKiB0aGUgcG93ZXIgdG8gc3RhYmlsaXplLiBUaGlzIGlzIHdoYXQgc29tZSBkb25nbGUgZHJpdmVycyBkaWQKKwkJCSAqIGluIG9wZW4gYmVmb3JlLCB3aGlsZSBvdGhlcnMgZGlkbid0IC0gc2hvdWxkIGJlIHNhZmUgYW55d2F5LgorCQkJICovCisKKwkJCWRlbGF5ID0gNTA7CisJCQlmc20tPnN1YnN0YXRlID0gU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVDsKKwkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUOworCisJCQlmc20tPnBhcmFtID0gOTYwMDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX0NMT1NFOgorCQkJLyogc2hvdWxkbid0IHdlIGp1c3QgdHJlYXQgdGhpcyBhcyBzdWNjZXNzPT8gKi8KKwkJCWlmIChkZXYtPmRvbmdsZV9kcnYgPT0gTlVMTCkgeworCQkJCWZzbS0+cmVzdWx0ID0gLUVJTlZBTDsKKwkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0VSUk9SOworCQkJCWJyZWFrOworCQkJfQorCisJCQlyZXQgPSBzaXJkZXZfcHV0X2RvbmdsZShkZXYpOworCQkJaWYgKHJldCkgeworCQkJCWZzbS0+cmVzdWx0ID0gcmV0OworCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRVJST1I7CisJCQkJYnJlYWs7CisJCQl9CisJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0RPTkU7CisJCQlicmVhazsKKworCQljYXNlIFNJUkRFVl9TVEFURV9TRVRfRFRSX1JUUzoKKwkJCXJldCA9IHNpcmRldl9zZXRfZHRyX3J0cyhkZXYsCisJCQkJKGZzbS0+cGFyYW0mMHgwMikgPyBUUlVFIDogRkFMU0UsCisJCQkJKGZzbS0+cGFyYW0mMHgwMSkgPyBUUlVFIDogRkFMU0UpOworCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9ET05FOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfU0VUX1NQRUVEOgorCQkJZnNtLT5zdWJzdGF0ZSA9IFNJUkRFVl9TVEFURV9XQUlUX1hNSVQ7CisJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0RPTkdMRV9DSEVDSzsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9DSEVDSzoKKwkJCXJldCA9IGlyZGFfdHhfY29tcGxldGVfZnNtKGRldik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWZzbS0+cmVzdWx0ID0gcmV0OworCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRVJST1I7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKGRlbGF5PXJldCkgIT0gMCkKKwkJCQlicmVhazsKKworCQkJaWYgKGRldi0+ZG9uZ2xlX2RydikgeworCQkJCWZzbS0+c3Vic3RhdGUgPSBTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUOworCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUOworCQkJfQorCQkJZWxzZSB7CisJCQkJZGV2LT5zcGVlZCA9IGZzbS0+cGFyYW07CisJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9QT1JUX1NQRUVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUOgorCQkJaWYgKGRldi0+ZG9uZ2xlX2Rydi0+cmVzZXQpIHsKKwkJCQlyZXQgPSBkZXYtPmRvbmdsZV9kcnYtPnJlc2V0KGRldik7CQorCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCWZzbS0+cmVzdWx0ID0gcmV0OworCQkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0VSUk9SOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQkJcmV0ID0gMDsKKwkJCWlmICgoZGVsYXk9cmV0KSA9PSAwKSB7CisJCQkJLyogc2V0IHNlcmlhbCBwb3J0IGFjY29yZGluZyB0byBkb25nbGUgZGVmYXVsdCBzcGVlZCAqLworCQkJCWlmIChkZXYtPmRydi0+c2V0X3NwZWVkKQorCQkJCQlkZXYtPmRydi0+c2V0X3NwZWVkKGRldiwgZGV2LT5zcGVlZCk7CisJCQkJZnNtLT5zdWJzdGF0ZSA9IFNJUkRFVl9TVEFURV9ET05HTEVfU1BFRUQ7CisJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9ET05HTEVfU1BFRUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNJUkRFVl9TVEFURV9ET05HTEVfU1BFRUQ6CQkJCQorCQkJaWYgKGRldi0+ZG9uZ2xlX2Rydi0+cmVzZXQpIHsKKwkJCQlyZXQgPSBkZXYtPmRvbmdsZV9kcnYtPnNldF9zcGVlZChkZXYsIGZzbS0+cGFyYW0pOworCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCWZzbS0+cmVzdWx0ID0gcmV0OworCQkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0VSUk9SOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQkJcmV0ID0gMDsKKwkJCWlmICgoZGVsYXk9cmV0KSA9PSAwKQorCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfUE9SVF9TUEVFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSREVWX1NUQVRFX1BPUlRfU1BFRUQ6CisJCQkvKiBGaW5hbGx5IHdlIGFyZSByZWFkeSB0byBjaGFuZ2UgdGhlIHNlcmlhbCBwb3J0IHNwZWVkICovCisJCQlpZiAoZGV2LT5kcnYtPnNldF9zcGVlZCkKKwkJCQlkZXYtPmRydi0+c2V0X3NwZWVkKGRldiwgZGV2LT5zcGVlZCk7CisJCQlkZXYtPm5ld19zcGVlZCA9IDA7CisJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0RPTkU7CisJCQlicmVhazsKKworCQljYXNlIFNJUkRFVl9TVEFURV9ET05FOgorCQkJLyogU2lnbmFsIG5ldHdvcmsgbGF5ZXIgc28gaXQgY2FuIHNlbmQgbW9yZSBmcmFtZXMgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2LT5uZXRkZXYpOworCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9DT01QTEVURTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlJUkRBX0VSUk9SKCIlcyAtIHVuZGVmaW5lZCBzdGF0ZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWZzbS0+cmVzdWx0ID0gLUVJTlZBTDsKKwkJCS8qIGZhbGwgdGhydSAqLworCisJCWNhc2UgU0lSREVWX1NUQVRFX0VSUk9SOgorCQkJSVJEQV9FUlJPUigiJXMgLSBlcnJvcjogJWRcbiIsIF9fRlVOQ1RJT05fXywgZnNtLT5yZXN1bHQpOworCisjaWYgMAkvKiBkb24ndCBlbmFibGUgdGhpcyBiZWZvcmUgd2UgaGF2ZSBuZXRkZXYtPnR4X3RpbWVvdXQgdG8gcmVjb3ZlciAqLworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYtPm5ldGRldik7CisjZWxzZQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYtPm5ldGRldik7CisjZW5kaWYKKwkJCS8qIGZhbGwgdGhydSAqLworCisJCWNhc2UgU0lSREVWX1NUQVRFX0NPTVBMRVRFOgorCQkJLyogY29uZmlnIGNoYW5nZSBmaW5pc2hlZCwgc28gd2UgYXJlIG5vdCBidXN5IGFueSBsb25nZXIgKi8KKwkJCXNpcmRldl9lbmFibGVfcngoZGV2KTsKKwkJCXVwKCZmc20tPnNlbSk7CisJCQlyZXR1cm47CisJCX0KKwkJZnNtLT5zdGF0ZSA9IG5leHRfc3RhdGU7CisJfSB3aGlsZSghZGVsYXkpOworCisJaXJkYV9xdWV1ZV9kZWxheWVkX3JlcXVlc3QoJmZzbS0+cnEsIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKK30KKworLyogc2NoZWR1bGUgc29tZSBkZXZpY2UgY29uZmlndXJhdGlvbiB0YXNrIGZvciBleGVjdXRpb24gYnkga0lyREFkCisgKiBvbiBiZWhhbGYgb2YgdGhlIGFib3ZlIHN0YXRlIG1hY2hpbmUuCisgKiBjYW4gYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBvciBpbnRlcnJ1cHQvdGFza2xldCBjb250ZXh0LgorICovCisKK2ludCBzaXJkZXZfc2NoZWR1bGVfcmVxdWVzdChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgaW5pdGlhbF9zdGF0ZSwgdW5zaWduZWQgcGFyYW0pCit7CisJc3RydWN0IHNpcl9mc20gKmZzbSA9ICZkZXYtPmZzbTsKKwlpbnQgeG1pdF93YXNfZG93bjsKKworCUlSREFfREVCVUcoMiwgIiVzIC0gc3RhdGU9MHglMDR4IC8gcGFyYW09JXVcbiIsIF9fRlVOQ1RJT05fXywgaW5pdGlhbF9zdGF0ZSwgcGFyYW0pOworCisJaWYgKGRvd25fdHJ5bG9jaygmZnNtLT5zZW0pKSB7CisJCWlmIChpbl9pbnRlcnJ1cHQoKSAgfHwgIGluX2F0b21pYygpICB8fCAgaXJxc19kaXNhYmxlZCgpKSB7CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBzdGF0ZSBtYWNoaW5lIGJ1c3khXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwkJfSBlbHNlCisJCQlkb3duKCZmc20tPnNlbSk7CisJfQorCisJaWYgKGZzbS0+c3RhdGUgPT0gU0lSREVWX1NUQVRFX0RFQUQpIHsKKwkJLyogcmFjZSB3aXRoIHNpcmRldl9jbG9zZSBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCUlSREFfRVJST1IoIiVzKCksIGluc3RhbmNlIHN0YWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXVwKCZmc20tPnNlbSk7CisJCXJldHVybiAtRVNUQUxFOwkJLyogb3IgYmV0dGVyIEVQSVBFPyAqLworCX0KKworCXhtaXRfd2FzX2Rvd24gPSBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldi0+bmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldi0+bmV0ZGV2KTsKKwlhdG9taWNfc2V0KCZkZXYtPmVuYWJsZV9yeCwgMCk7CisKKwlmc20tPnN0YXRlID0gaW5pdGlhbF9zdGF0ZTsKKwlmc20tPnBhcmFtID0gcGFyYW07CisJZnNtLT5yZXN1bHQgPSAwOworCisJSU5JVF9MSVNUX0hFQUQoJmZzbS0+cnEubGhfcmVxdWVzdCk7CisJZnNtLT5ycS5wZW5kaW5nID0gMDsKKwlmc20tPnJxLmZ1bmMgPSBpcmRhX2NvbmZpZ19mc207CisJZnNtLT5ycS5kYXRhID0gZGV2OworCisJaWYgKCFpcmRhX3F1ZXVlX3JlcXVlc3QoJmZzbS0+cnEpKSB7CS8qIHJldHVybnMgMCBvbiBlcnJvciEgKi8KKwkJYXRvbWljX3NldCgmZGV2LT5lbmFibGVfcngsIDEpOworCQlpZiAoIXhtaXRfd2FzX2Rvd24pCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldi0+bmV0ZGV2KTsJCQorCQl1cCgmZnNtLT5zZW0pOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgaXJkYV90aHJlYWRfY3JlYXRlKHZvaWQpCit7CisJc3RydWN0IGNvbXBsZXRpb24gc3RhcnR1cDsKKwlpbnQgcGlkOworCisJc3Bpbl9sb2NrX2luaXQoJmlyZGFfcnFfcXVldWUubG9jayk7CisJaXJkYV9ycV9xdWV1ZS50aHJlYWQgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZpcmRhX3JxX3F1ZXVlLnJlcXVlc3RfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXJkYV9ycV9xdWV1ZS5raWNrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpcmRhX3JxX3F1ZXVlLmRvbmUpOworCWF0b21pY19zZXQoJmlyZGFfcnFfcXVldWUubnVtX3BlbmRpbmcsIDApOworCisJaW5pdF9jb21wbGV0aW9uKCZzdGFydHVwKTsKKwlwaWQgPSBrZXJuZWxfdGhyZWFkKGlyZGFfdGhyZWFkLCAmc3RhcnR1cCwgQ0xPTkVfRlN8Q0xPTkVfRklMRVMpOworCWlmIChwaWQgPD0gMCkKKwkJcmV0dXJuIC1FQUdBSU47CisJZWxzZQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzdGFydHVwKTsKKworCXJldHVybiAwOworfQorCit2b2lkIF9fZXhpdCBpcmRhX3RocmVhZF9qb2luKHZvaWQpIAoreworCWlmIChpcmRhX3JxX3F1ZXVlLnRocmVhZCkgeworCQlmbHVzaF9pcmRhX3F1ZXVlKCk7CisJCWluaXRfY29tcGxldGlvbigmaXJkYV9ycV9xdWV1ZS5leGl0KTsKKwkJaXJkYV9ycV9xdWV1ZS50aHJlYWQgPSBOVUxMOworCQl3YWtlX3VwKCZpcmRhX3JxX3F1ZXVlLmtpY2spOwkJCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlyZGFfcnFfcXVldWUuZXhpdCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTI1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYwpAQCAtMCwwICsxLDIzOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICRJZDogc21zYy1pcmNjMi5jLHYgMS4xOS4yLjUgMjAwMi8xMC8yNyAxMTozNDoyNiBkaXAgRXhwICQKKyAqCisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBTTUMgSW5mcmFyZWQgQ29tbXVuaWNhdGlvbnMgQ29udHJvbGxlcgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFuaWVsZSBQZXJpIChwZXJpQGNzYWkudW5pcGEuaXQpCisgKiBDcmVhdGVkIGF0OiAgICAKKyAqIE1vZGlmaWVkIGF0OiAgIAorICogTW9kaWZpZWQgYnk6ICAgCisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgICAgICBEYW5pZWxlIFBlcmkKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMiAgICAgIEplYW4gVG91cnJpbGhlcworICoKKyAqCisgKiBCYXNlZCBvbiBzbWMtaXJjYy5jOgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgICAgICBTdGVmYW5pIFNlaWJvbGQKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBEYWcgQnJhdHRsaQorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRob21hcyBEYXZpcywgCisgKgorICoJYW5kIGlycG9ydC5jOgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgsIDE5OTktMjAwMCBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJzbXNjLWlyY2MyLmgiCisjaW5jbHVkZSAic21zYy1zaW8uaCIKKworLyogVHlwZXMgKi8KKworc3RydWN0IHNtc2NfdHJhbnNjZWl2ZXIgeworCWNoYXIgKm5hbWU7CisJdm9pZCAoKnNldF9mb3Jfc3BlZWQpKGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKTsJCisJaW50ICAoKnByb2JlKShpbnQgZmlyX2Jhc2UpOworfTsKK3R5cGVkZWYgc3RydWN0IHNtc2NfdHJhbnNjZWl2ZXIgc21zY190cmFuc2NlaXZlcl90OworCisjaWYgMAorc3RydWN0IHNtY19jaGlwIHsKKwljaGFyICpuYW1lOworCXUxNiBmbGFnczsKKwl1OCBkZXZpZDsKKwl1OCByZXY7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc21jX2NoaXAgc21jX2NoaXBfdDsKKyNlbmRpZgorCitzdHJ1Y3Qgc21zY19jaGlwIHsKKwljaGFyICpuYW1lOworCSNpZiAwCisJdTgJdHlwZTsKKwkjZW5kaWYKKwl1MTYgZmxhZ3M7CisJdTggZGV2aWQ7CisJdTggcmV2OworfTsKK3R5cGVkZWYgc3RydWN0IHNtc2NfY2hpcCBzbXNjX2NoaXBfdDsKKworc3RydWN0IHNtc2NfY2hpcF9hZGRyZXNzIHsKKwl1bnNpZ25lZCBpbnQgY2ZnX2Jhc2U7CisJdW5zaWduZWQgaW50IHR5cGU7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc21zY19jaGlwX2FkZHJlc3Mgc21zY19jaGlwX2FkZHJlc3NfdDsKKworLyogUHJpdmF0ZSBkYXRhIGZvciBlYWNoIGluc3RhbmNlICovCitzdHJ1Y3Qgc21zY19pcmNjX2NiIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAgLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBpcmxhcF9jYiAgICAqaXJsYXA7IC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KKwkKKwljaGlwaW9fdCBpbzsgICAgICAgICAgICAgICAvKiBJckRBIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKwlpb2J1ZmZfdCB0eF9idWZmOyAgICAgICAgICAvKiBUcmFuc21pdCBidWZmZXIgKi8KKwlpb2J1ZmZfdCByeF9idWZmOyAgICAgICAgICAvKiBSZWNlaXZlIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgdHhfYnVmZl9kbWE7CisJZG1hX2FkZHJfdCByeF9idWZmX2RtYTsKKworCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCisKKwlzcGlubG9ja190IGxvY2s7ICAgICAgICAgICAvKiBGb3Igc2VyaWFsaXppbmcgb3BlcmF0aW9ucyAqLworCQorCV9fdTMyIG5ld19zcGVlZDsKKwlfX3UzMiBmbGFnczsgICAgICAgICAgICAgICAvKiBJbnRlcmZhY2UgZmxhZ3MgKi8KKworCWludCB0eF9idWZmX29mZnNldHNbMTBdOyAgIC8qIE9mZnNldHMgYmV0d2VlbiBmcmFtZXMgaW4gdHhfYnVmZiAqLworCWludCB0eF9sZW47ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgaW4gdHhfYnVmZiAqLworCisJaW50IHRyYW5zY2VpdmVyOworCXN0cnVjdCBwbV9kZXYgKnBtZGV2OworfTsKKworLyogQ29uc3RhbnRzICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJzbXNjLWlyY2MyIjsKKyNkZWZpbmUJRElNKHgpCShzaXplb2YoeCkvKHNpemVvZigqKHgpKSkpCisjZGVmaW5lIFNNU0NfSVJDQzJfQ19JUkRBX0ZBTExCQUNLX1NQRUVECTk2MDAKKyNkZWZpbmUgU01TQ19JUkNDMl9DX0RFRkFVTFRfVFJBTlNDRUlWRVIJMQorI2RlZmluZSBTTVNDX0lSQ0MyX0NfTkVUX1RJTUVPVVQJCQkwCisjZGVmaW5lIFNNU0NfSVJDQzJfQ19TSVJfU1RPUAkJCTAKKworLyogUHJvdG90eXBlcyAqLworCitzdGF0aWMgaW50IHNtc2NfaXJjY19vcGVuKHVuc2lnbmVkIGludCBmaXJiYXNlLCB1bnNpZ25lZCBpbnQgc2lyYmFzZSwgdTggZG1hLCB1OCBpcnEpOworc3RhdGljIGludCBzbXNjX2lyY2NfcHJlc2VudCh1bnNpZ25lZCBpbnQgZmlyX2Jhc2UsIHVuc2lnbmVkIGludCBzaXJfYmFzZSk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0dXBfaW8oc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgdW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UsIHU4IGRtYSwgdTggaXJxKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXR1cF9xb3Moc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfaW5pdF9jaGlwKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCBfX2V4aXQgc21zY19pcmNjX2Nsb3NlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgc21zY19pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpOyAKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfcmVjZWl2ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19oYXJkX3htaXRfc2lyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgc21zY19pcmNjX2hhcmRfeG1pdF9maXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3htaXQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSwgaW50IGJvZnMpOworc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpOworc3RhdGljIHZvaWQgc21zY19pcmNjX2NoYW5nZV9zcGVlZCh2b2lkICpwcml2LCB1MzIgc3BlZWQpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF9zaXJfc3BlZWQodm9pZCAqcHJpdiwgdTMyIHNwZWVkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbXNjX2lyY2NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGlycXJldHVybl90IHNtc2NfaXJjY19pbnRlcnJ1cHRfc2lyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3Npcl9zdGFydChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKKyNpZiBTTVNDX0lSQ0MyX0NfU0lSX1NUT1AKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfc3RvcChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgc21zY19pcmNjX3Npcl93cml0ZV93YWtldXAoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50ICBzbXNjX2lyY2Nfc2lyX3dyaXRlKGludCBpb2Jhc2UsIGludCBmaWZvX3NpemUsIF9fdTggKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgaW50ICBzbXNjX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBzbXNjX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgc21zY19pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKKyNpZiBTTVNDX0lSQ0MyX0NfTkVUX1RJTUVPVVQKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNtc2NfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgc21zY19pcmNjX3BtcHJvYyhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgc21zY19pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcihzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfZm9yX3NwZWVkKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIHUzMiBzcGVlZCk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3dhaXRfaHdfdHJhbnNtaXR0ZXJfZmluaXNoKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworCisvKiBQcm9iaW5nICovCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX2lyY2NfbG9va19mb3JfY2hpcHModm9pZCk7CitzdGF0aWMgY29uc3Qgc21zY19jaGlwX3QgKiBfX2luaXQgc21zY19pcmNjX3Byb2JlKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLHU4IHJlZyxjb25zdCBzbXNjX2NoaXBfdCAqY2hpcCxjaGFyICp0eXBlKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19mbGF0KGNvbnN0IHNtc2NfY2hpcF90ICpjaGlwcywgdW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIGNoYXIgKnR5cGUpOworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX3BhZ2VkKGNvbnN0IHNtc2NfY2hpcF90ICpjaGlwcywgdW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIGNoYXIgKnR5cGUpOworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2ZkYyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSk7CitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fbHBjKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlKTsKKworLyogVHJhbnNjZWl2ZXJzIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMChpbnQgZmlyX2Jhc2UsIHUzMiBzcGVlZCk7CitzdGF0aWMgaW50ICBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwKGludCBmaXJfYmFzZSk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3QoaW50IGZpcl9iYXNlLCB1MzIgc3BlZWQpOworc3RhdGljIGludCAgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3QoaW50IGZpcl9iYXNlKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0YyhpbnQgZmlyX2Jhc2UsIHUzMiBzcGVlZCk7CitzdGF0aWMgaW50ICBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0YyhpbnQgZmlyX2Jhc2UpOworCisvKiBQb3dlciBNYW5hZ2VtZW50ICovCisKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zdXNwZW5kKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3dha2V1cChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgc21zY19pcmNjX3BtcHJvYyhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKTsKKworCisvKiBUcmFuc2NlaXZlcnMgZm9yIFNNU0MtaXJjYyAqLworCitzdGF0aWMgc21zY190cmFuc2NlaXZlcl90IHNtc2NfdHJhbnNjZWl2ZXJzW109Cit7CisJeyAiVG9zaGliYSBTYXRlbGxpdGUgMTgwMCAoR1AgZGF0YSBwaW4gc2VsZWN0KSIsIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwLCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwfSwKKwl7ICJGYXN0IHBpbiBzZWxlY3QiLCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3QsIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0fSwKKwl7ICJBVEMgSVJNb2RlIiwgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjLCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0Y30sCisJeyBOVUxMLCBOVUxMfQorfTsKKyNkZWZpbmUgU01TQ19JUkNDMl9DX05VTUJFUl9PRl9UUkFOU0NFSVZFUlMgKERJTShzbXNjX3RyYW5zY2VpdmVycyktMSkKKworLyogIFNNQyBTdXBlcklPIGNoaXBzZXRzIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUJS0VZNTVfMQkwCS8qIFN1cGVySU8gQ29uZmlndXJhdGlvbiBtb2RlIHdpdGggS2V5IDwweDU1PiAqLworI2RlZmluZQlLRVk1NV8yCTEJLyogU3VwZXJJTyBDb25maWd1cmF0aW9uIG1vZGUgd2l0aCBLZXkgPDB4NTUsMHg1NT4gKi8KKyNkZWZpbmUJTm9JUkRBCTIJLyogU3VwZXJJTyBDaGlwIGhhcyBubyBJUkRBIFBvcnQgKi8KKyNkZWZpbmUJU0lSCTAJLyogU3VwZXJJTyBDaGlwIGhhcyBvbmx5IHNsb3cgSVJEQSAqLworI2RlZmluZQlGSVIJNAkvKiBTdXBlcklPIENoaXAgaGFzIGZhc3QgSVJEQSAqLworI2RlZmluZQlTRVJ4NAk4CS8qIFN1cGVySU8gQ2hpcCBzdXBwb3J0cyAxMTUsMiBLQmF1ZCAqIDQ9NDYwLDggS0JhdWQgKi8KKworc3RhdGljIHNtc2NfY2hpcF90IF9faW5pdGRhdGEgZmRjX2NoaXBzX2ZsYXRbXT0KK3sKKwkvKiBCYXNlIGFkZHJlc3MgMHgzZjAgb3IgMHgzNzAgKi8KKwl7ICIzN0M0NCIsCUtFWTU1XzF8Tm9JUkRBLAkJMHgwMCwgMHgwMCB9LCAvKiBUaGlzIGNoaXAgY2Fubm90IGJlIGRldGVjdGVkICovCisJeyAiMzdDNjY1R1QiLAlLRVk1NV8yfE5vSVJEQSwJCTB4NjUsIDB4MDEgfSwKKwl7ICIzN0M2NjVHVCIsCUtFWTU1XzJ8Tm9JUkRBLAkJMHg2NiwgMHgwMSB9LAorCXsgIjM3QzY2OSIsCUtFWTU1XzJ8U0lSfFNFUng0LAkweDAzLCAweDAyIH0sCisJeyAiMzdDNjY5IiwJS0VZNTVfMnxTSVJ8U0VSeDQsCTB4MDQsIDB4MDIgfSwgLyogSUQ/ICovCisJeyAiMzdDNzgiLAlLRVk1NV8yfE5vSVJEQSwJCTB4NzgsIDB4MDAgfSwKKwl7ICIzN043NjkiLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHgyOCwgMHgwMCB9LAorCXsgIjM3Tjg2OSIsCUtFWTU1XzF8RklSfFNFUng0LAkweDI5LCAweDAwIH0sCisJeyBOVUxMIH0KK307CisKK3N0YXRpYyBzbXNjX2NoaXBfdCBfX2luaXRkYXRhIGZkY19jaGlwc19wYWdlZFtdPQoreworCS8qIEJhc2UgYWRkcmVzcyAweDNmMCBvciAweDM3MCAqLworCXsgIjM3QjcyWCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDRjLCAweDAwIH0sCisJeyAiMzdCNzdYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NDMsIDB4MDAgfSwKKwl7ICIzN0I3OFgiLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg0NCwgMHgwMCB9LAorCXsgIjM3QjgwWCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDQyLCAweDAwIH0sCisJeyAiMzdDNjdYIiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4NDAsIDB4MDAgfSwKKwl7ICIzN0M5M1giLAlLRVk1NV8yfFNJUnxTRVJ4NCwJMHgwMiwgMHgwMSB9LAorCXsgIjM3QzkzWEFQTSIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDMwLCAweDAxIH0sCisJeyAiMzdDOTNYRlIiLAlLRVk1NV8yfEZJUnxTRVJ4NCwJMHgwMywgMHgwMSB9LAorCXsgIjM3TTcwNyIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDQyLCAweDAwIH0sCisJeyAiMzdNODFYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NGQsIDB4MDAgfSwKKwl7ICIzN045NThGUiIsCUtFWTU1XzF8RklSfFNFUng0LAkweDA5LCAweDA0IH0sCisJeyAiMzdOOTcxIiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4MGEsIDB4MDAgfSwKKwl7ICIzN045NzIiLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHgwYiwgMHgwMCB9LAorCXsgTlVMTCB9Cit9OworCitzdGF0aWMgc21zY19jaGlwX3QgX19pbml0ZGF0YSBscGNfY2hpcHNfZmxhdFtdPQoreworCS8qIEJhc2UgYWRkcmVzcyAweDJFIG9yIDB4NEUgKi8KKwl7ICI0N04yMjciLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHg1YSwgMHgwMCB9LAorCXsgIjQ3TjI2NyIsCUtFWTU1XzF8RklSfFNFUng0LAkweDVlLCAweDAwIH0sCisJeyBOVUxMIH0KK307CisKK3N0YXRpYyBzbXNjX2NoaXBfdCBfX2luaXRkYXRhIGxwY19jaGlwc19wYWdlZFtdPQoreworCS8qIEJhc2UgYWRkcmVzcyAweDJFIG9yIDB4NEUgKi8KKwl7ICI0N0IyN1giLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg1MSwgMHgwMCB9LAorCXsgIjQ3QjM3WCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDUyLCAweDAwIH0sCisJeyAiNDdNMTBYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NTksIDB4MDAgfSwKKwl7ICI0N00xMjAiLAlLRVk1NV8xfE5vSVJEQXxTRVJ4NCwJMHg1YywgMHgwMCB9LAorCXsgIjQ3TTEzWCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDU5LCAweDAwIH0sCisJeyAiNDdNMTRYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NWYsIDB4MDAgfSwKKwl7ICI0N04yNTIiLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHgwZSwgMHgwMCB9LAorCXsgIjQ3UzQyWCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDU3LCAweDAwIH0sCisJeyBOVUxMIH0KK307CisKKyNkZWZpbmUgU01TQ1NJT19UWVBFX0ZEQwkxCisjZGVmaW5lIFNNU0NTSU9fVFlQRV9MUEMJMgorI2RlZmluZSBTTVNDU0lPX1RZUEVfRkxBVAk0CisjZGVmaW5lIFNNU0NTSU9fVFlQRV9QQUdFRAk4CisKK3N0YXRpYyBzbXNjX2NoaXBfYWRkcmVzc190IF9faW5pdGRhdGEgcG9zc2libGVfYWRkcmVzc2VzW109Cit7CisJezB4M2YwLCBTTVNDU0lPX1RZUEVfRkRDfFNNU0NTSU9fVFlQRV9GTEFUfFNNU0NTSU9fVFlQRV9QQUdFRH0sCisJezB4MzcwLCBTTVNDU0lPX1RZUEVfRkRDfFNNU0NTSU9fVFlQRV9GTEFUfFNNU0NTSU9fVFlQRV9QQUdFRH0sCisJezB4ZTAsIFNNU0NTSU9fVFlQRV9GREN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEfSwKKwl7MHgyZSwgU01TQ1NJT19UWVBFX0xQQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUR9LAorCXsweDRlLCBTTVNDU0lPX1RZUEVfTFBDfFNNU0NTSU9fVFlQRV9GTEFUfFNNU0NTSU9fVFlQRV9QQUdFRH0sCisJezAsMH0KK307CisKKy8qIEdsb2JhbHMgKi8KKworc3RhdGljIHN0cnVjdCBzbXNjX2lyY2NfY2IgKmRldl9zZWxmW10gPSB7IE5VTEwsIE5VTEx9OworCitzdGF0aWMgaW50IGlyY2NfaXJxPTI1NTsKK3N0YXRpYyBpbnQgaXJjY19kbWE9MjU1Oworc3RhdGljIGludCBpcmNjX2Zpcj0wOworc3RhdGljIGludCBpcmNjX3Npcj0wOworc3RhdGljIGludCBpcmNjX2NmZz0wOworc3RhdGljIGludCBpcmNjX3RyYW5zY2VpdmVyPTA7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAlkZXZfY291bnQ9MDsKKworc3RhdGljIGlubGluZSB2b2lkIHJlZ2lzdGVyX2JhbmsoaW50IGlvYmFzZSwgaW50IGJhbmspCit7CisgICAgICAgIG91dGIoKChpbmIoaW9iYXNlK0lSQ0NfTUFTVEVSKSAmIDB4ZjApIHwgKGJhbmsgJiAweDA3KSksCisgICAgICAgICAgICAgICBpb2Jhc2UrSVJDQ19NQVNURVIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoKKyAqIFNNU0MtaXJjYyBzdHVmZgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19pbml0ICgpCisgKgorICogICAgSW5pdGlhbGl6ZSBjaGlwLiBKdXN0IHRyeSB0byBmaW5kIG91dCBob3cgbWFueSBjaGlwcyB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKiAgICBhbmQgd2hlcmUgdGhleSBhcmUKKyAqLworc3RhdGljIGludCBfX2luaXQgc21zY19pcmNjX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0PS1FTk9ERVY7CisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWRldl9jb3VudD0wOworIAorCWlmICgoaXJjY19maXI+MCkmJihpcmNjX3Npcj4wKSkgeworCQlJUkRBX01FU1NBR0UoIiBPdmVycmlkaW5nIEZJUiBhZGRyZXNzIDB4JTA0eFxuIiwgaXJjY19maXIpOworCQlJUkRBX01FU1NBR0UoIiBPdmVycmlkaW5nIFNJUiBhZGRyZXNzIDB4JTA0eFxuIiwgaXJjY19zaXIpOworCisJCWlmIChzbXNjX2lyY2Nfb3BlbihpcmNjX2ZpciwgaXJjY19zaXIsIGlyY2NfZG1hLCBpcmNjX2lycSkgPT0gMCkKKwkJCXJldHVybiAwOworCisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIHRyeSB1c2VyIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCisJaWYgKGlyY2NfY2ZnPjApIHsKKwkgICAgICAgIElSREFfTUVTU0FHRSgiIE92ZXJyaWRpbmcgY29uZmlndXJhdGlvbiBhZGRyZXNzIDB4JTA0eFxuIiwKKwkJCSAgICAgaXJjY19jZmcpOworCQlpZiAoIXNtc2Nfc3VwZXJpb19mZGMoaXJjY19jZmcpKQorCQkJcmV0ID0gMDsKKwkJaWYgKCFzbXNjX3N1cGVyaW9fbHBjKGlyY2NfY2ZnKSkKKwkJCXJldCA9IDA7CisJfQorCQorCWlmKHNtc2NfaXJjY19sb29rX2Zvcl9jaGlwcygpPjApIHJldCA9IDA7CisJCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19vcGVuIChmaXJiYXNlLCBzaXJiYXNlLCBkbWEsIGlycSkKKyAqCisgKiAgICBUcnkgdG8gb3BlbiBkcml2ZXIgaW5zdGFuY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNtc2NfaXJjY19vcGVuKHVuc2lnbmVkIGludCBmaXJfYmFzZSwgdW5zaWduZWQgaW50IHNpcl9iYXNlLCB1OCBkbWEsIHU4IGlycSkKK3sKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKwkKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWVyciA9IHNtc2NfaXJjY19wcmVzZW50KGZpcl9iYXNlLCBzaXJfYmFzZSk7CisJaWYoZXJyKSAKKwkJZ290byBlcnJfb3V0OworCQkKKwllcnIgPSAtRU5PTUVNOworCWlmIChkZXZfY291bnQgPiBESU0oZGV2X3NlbGYpKSB7CisJICAgICAgICBJUkRBX1dBUk5JTkcoIiVzKCksIHRvbyBtYW55IGRldmljZXMhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycl9vdXQxOworCX0KKworCS8qCisJICogIEFsbG9jYXRlIG5ldyBpbnN0YW5jZSBvZiB0aGUgZHJpdmVyCisJICovCisJZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2Yoc3RydWN0IHNtc2NfaXJjY19jYikpOworCWlmICghZGV2KSB7CisJCUlSREFfV0FSTklORygiJXMoKSBjYW4ndCBhbGxvY2F0ZSBuZXQgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycl9vdXQxOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc21zY19pcmNjX2hhcmRfeG1pdF9zaXI7CisjaWYgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCisJZGV2LT50eF90aW1lb3V0CSAgICAgPSBzbXNjX2lyY2NfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvICA9IEhaKjI7ICAvKiBBbGxvdyBlbm91Z2ggdGltZSBmb3Igc3BlZWQgY2hhbmdlICovCisjZW5kaWYKKwlkZXYtPm9wZW4gICAgICAgICAgICA9IHNtc2NfaXJjY19uZXRfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICA9IHNtc2NfaXJjY19uZXRfY2xvc2U7CisJZGV2LT5kb19pb2N0bCAgICAgICAgPSBzbXNjX2lyY2NfbmV0X2lvY3RsOworCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBzbXNjX2lyY2NfbmV0X2dldF9zdGF0czsKKwkKKwlzZWxmID0gZGV2LT5wcml2OworCXNlbGYtPm5ldGRldiA9IGRldjsKKworCS8qIE1ha2UgaWZjb25maWcgZGlzcGxheSBzb21lIGRldGFpbHMgKi8KKwlkZXYtPmJhc2VfYWRkciA9IHNlbGYtPmlvLmZpcl9iYXNlID0gZmlyX2Jhc2U7CisJZGV2LT5pcnEgPSBzZWxmLT5pby5pcnEgPSBpcnE7CisKKwkvKiBOZWVkIHRvIHN0b3JlIHNlbGYgc29tZXdoZXJlICovCisJZGV2X3NlbGZbZGV2X2NvdW50KytdID0gc2VsZjsKKwlzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CisKKwlzZWxmLT5yeF9idWZmLnRydWVzaXplID0gU01TQ19JUkNDMl9SWF9CVUZGX1RSVUVTSVpFOyAKKwlzZWxmLT50eF9idWZmLnRydWVzaXplID0gU01TQ19JUkNDMl9UWF9CVUZGX1RSVUVTSVpFOworCisJc2VsZi0+cnhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnJ4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJSVJEQV9FUlJPUigiJXMsIENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjZWl2ZSBidWZmZXIhXG4iLAorCQkJICAgZHJpdmVyX25hbWUpOworCQlnb3RvIGVycl9vdXQyOworCX0KKworCXNlbGYtPnR4X2J1ZmYuaGVhZCA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJCSAgICZzZWxmLT50eF9idWZmX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzLCBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRyYW5zbWl0IGJ1ZmZlciFcbiIsCisJCQkgICBkcml2ZXJfbmFtZSk7CisJCWdvdG8gZXJyX291dDM7CisJfQorCisJbWVtc2V0KHNlbGYtPnJ4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSk7CisJbWVtc2V0KHNlbGYtPnR4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisKKwlzZWxmLT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJc2VsZi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKwkgICAKKwlzbXNjX2lyY2Nfc2V0dXBfaW8oc2VsZiwgZmlyX2Jhc2UsIHNpcl9iYXNlLCBkbWEsIGlycSk7CisKKwlzbXNjX2lyY2Nfc2V0dXBfcW9zKHNlbGYpOworCisJc21zY19pcmNjX2luaXRfY2hpcChzZWxmKTsKKwkKKwlpZihpcmNjX3RyYW5zY2VpdmVyID4gMCAgJiYgCisJICAgaXJjY190cmFuc2NlaXZlciA8IFNNU0NfSVJDQzJfQ19OVU1CRVJfT0ZfVFJBTlNDRUlWRVJTKQorCQlzZWxmLT50cmFuc2NlaXZlciA9IGlyY2NfdHJhbnNjZWl2ZXI7CisJZWxzZQorCQlzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXIoc2VsZik7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKwlpZihlcnIpIHsKKwkJSVJEQV9FUlJPUigiJXMsIE5ldHdvcmsgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iLAorCQkJICAgZHJpdmVyX25hbWUpOworCQlnb3RvIGVycl9vdXQ0OworCX0KKworCXNlbGYtPnBtZGV2ID0gcG1fcmVnaXN0ZXIoUE1fU1lTX0RFViwgUE1fU1lTX0lSREEsIHNtc2NfaXJjY19wbXByb2MpOworCWlmIChzZWxmLT5wbWRldikKKwkJc2VsZi0+cG1kZXYtPmRhdGEgPSBzZWxmOworCisJSVJEQV9NRVNTQUdFKCJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworIGVycl9vdXQ0OgorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworIGVycl9vdXQzOgorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkgIHNlbGYtPnJ4X2J1ZmYuaGVhZCwgc2VsZi0+cnhfYnVmZl9kbWEpOworIGVycl9vdXQyOgorCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisJZGV2X3NlbGZbLS1kZXZfY291bnRdID0gTlVMTDsKKyBlcnJfb3V0MToKKwlyZWxlYXNlX3JlZ2lvbihmaXJfYmFzZSwgU01TQ19JUkNDMl9GSVJfQ0hJUF9JT19FWFRFTlQpOworCXJlbGVhc2VfcmVnaW9uKHNpcl9iYXNlLCBTTVNDX0lSQ0MyX1NJUl9DSElQX0lPX0VYVEVOVCk7CisgZXJyX291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3ByZXNlbnQoZmlyX2Jhc2UsIHNpcl9iYXNlKQorICoKKyAqICAgIENoZWNrIHRoZSBzbXNjLWlyY2MgY2hpcCBwcmVzZW5jZQorICoKKyAqLworc3RhdGljIGludCBzbXNjX2lyY2NfcHJlc2VudCh1bnNpZ25lZCBpbnQgZmlyX2Jhc2UsIHVuc2lnbmVkIGludCBzaXJfYmFzZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGxvdywgaGlnaCwgY2hpcCwgY29uZmlnLCBkbWEsIGlycSwgdmVyc2lvbjsKKworCWlmICghcmVxdWVzdF9yZWdpb24oZmlyX2Jhc2UsIFNNU0NfSVJDQzJfRklSX0NISVBfSU9fRVhURU5ULAorCQkJICAgIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBjYW4ndCBnZXQgZmlyX2Jhc2Ugb2YgMHglMDN4XG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIGZpcl9iYXNlKTsKKwkJZ290byBvdXQxOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oc2lyX2Jhc2UsIFNNU0NfSVJDQzJfU0lSX0NISVBfSU9fRVhURU5ULAorCQkJICAgIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBjYW4ndCBnZXQgc2lyX2Jhc2Ugb2YgMHglMDN4XG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIHNpcl9iYXNlKTsKKwkJZ290byBvdXQyOworCX0KKworCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDMpOworCisJaGlnaCAgICA9IGluYihmaXJfYmFzZStJUkNDX0lEX0hJR0gpOworCWxvdyAgICAgPSBpbmIoZmlyX2Jhc2UrSVJDQ19JRF9MT1cpOworCWNoaXAgICAgPSBpbmIoZmlyX2Jhc2UrSVJDQ19DSElQX0lEKTsKKwl2ZXJzaW9uID0gaW5iKGZpcl9iYXNlK0lSQ0NfVkVSU0lPTik7CisJY29uZmlnICA9IGluYihmaXJfYmFzZStJUkNDX0lOVEVSRkFDRSk7CisJZG1hICAgICA9IGNvbmZpZyAmIElSQ0NfSU5URVJGQUNFX0RNQV9NQVNLOworCWlycSAgICAgPSAoY29uZmlnICYgSVJDQ19JTlRFUkZBQ0VfSVJRX01BU0spID4+IDQ7CisKKwlpZiAoaGlnaCAhPSAweDEwIHx8IGxvdyAhPSAweGI4IHx8IChjaGlwICE9IDB4ZjEgJiYgY2hpcCAhPSAweGYyKSkgeyAKKwkgICAgICAgIElSREFfV0FSTklORygiJXMoKSwgYWRkciAweCUwNHggLSBubyBkZXZpY2UgZm91bmQhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIGZpcl9iYXNlKTsKKwkJZ290byBvdXQzOworCX0KKwlJUkRBX01FU1NBR0UoIlNNc0MgSXJEQSBDb250cm9sbGVyIGZvdW5kXG4gSXJDQyB2ZXJzaW9uICVkLiVkLCAiCisJCSAgICAgImZpcnBvcnQgMHglMDN4LCBzaXJwb3J0IDB4JTAzeCBkbWE9JWQsIGlycT0lZFxuIiwKKwkJICAgICBjaGlwICYgMHgwZiwgdmVyc2lvbiwgZmlyX2Jhc2UsIHNpcl9iYXNlLCBkbWEsIGlycSk7CisKKwlyZXR1cm4gMDsKKyBvdXQzOgorCXJlbGVhc2VfcmVnaW9uKHNpcl9iYXNlLCBTTVNDX0lSQ0MyX1NJUl9DSElQX0lPX0VYVEVOVCk7Cisgb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihmaXJfYmFzZSwgU01TQ19JUkNDMl9GSVJfQ0hJUF9JT19FWFRFTlQpOworIG91dDE6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2V0dXBfaW8oc2VsZiwgZmlyX2Jhc2UsIHNpcl9iYXNlLCBkbWEsIGlycSkKKyAqCisgKiAgICBTZXR1cCBJL08KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXR1cF9pbyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCAKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmlyX2Jhc2UsIHVuc2lnbmVkIGludCBzaXJfYmFzZSwgCisJCQkgICAgICAgdTggZG1hLCB1OCBpcnEpCit7CisJdW5zaWduZWQgY2hhciBjb25maWcsIGNoaXBfZG1hLCBjaGlwX2lycTsKKworCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDMpOworCWNvbmZpZyAgPSBpbmIoZmlyX2Jhc2UrSVJDQ19JTlRFUkZBQ0UpOworCWNoaXBfZG1hICAgICA9IGNvbmZpZyAmIElSQ0NfSU5URVJGQUNFX0RNQV9NQVNLOworCWNoaXBfaXJxICAgICA9IChjb25maWcgJiBJUkNDX0lOVEVSRkFDRV9JUlFfTUFTSykgPj4gNDsKKworCXNlbGYtPmlvLmZpcl9iYXNlICA9IGZpcl9iYXNlOworCXNlbGYtPmlvLnNpcl9iYXNlICA9IHNpcl9iYXNlOworCXNlbGYtPmlvLmZpcl9leHQgICA9IFNNU0NfSVJDQzJfRklSX0NISVBfSU9fRVhURU5UOworCXNlbGYtPmlvLnNpcl9leHQgICA9IFNNU0NfSVJDQzJfU0lSX0NISVBfSU9fRVhURU5UOworCXNlbGYtPmlvLmZpZm9fc2l6ZSA9IFNNU0NfSVJDQzJfRklGT19TSVpFOworCXNlbGYtPmlvLnNwZWVkID0gU01TQ19JUkNDMl9DX0lSREFfRkFMTEJBQ0tfU1BFRUQ7CisKKwlpZiAoaXJxIDwgMjU1KSB7CisJCWlmIChpcnEgIT0gY2hpcF9pcnEpCisJCQlJUkRBX01FU1NBR0UoIiVzLCBPdmVycmlkaW5nIElSUSAtIGNoaXAgc2F5cyAlZCwgdXNpbmcgJWRcbiIsCisJCQkJICAgICBkcml2ZXJfbmFtZSwgY2hpcF9pcnEsIGlycSk7CisJCXNlbGYtPmlvLmlycSA9IGlycTsKKwl9CisJZWxzZQorCQlzZWxmLT5pby5pcnEgPSBjaGlwX2lycTsKKwkKKwlpZiAoZG1hIDwgMjU1KSB7CisJCWlmIChkbWEgIT0gY2hpcF9kbWEpCisJCQlJUkRBX01FU1NBR0UoIiVzLCBPdmVycmlkaW5nIERNQSAtIGNoaXAgc2F5cyAlZCwgdXNpbmcgJWRcbiIsCisJCQkJICAgICBkcml2ZXJfbmFtZSwgY2hpcF9kbWEsIGRtYSk7CisJCXNlbGYtPmlvLmRtYSA9IGRtYTsKKwl9CisJZWxzZQorCQlzZWxmLT5pby5kbWEgPSBjaGlwX2RtYTsKKworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3NldHVwX3FvcyhzZWxmKQorICoKKyAqICAgIFNldHVwIHFvcworICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldHVwX3FvcyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCS8qIEluaXRpYWxpemUgUW9TIGZvciB0aGlzIGRldmljZSAqLworCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnNlbGYtPnFvcyk7CisJCisJc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHwKKwkJSVJfMTE1MjAwfElSXzU3NjAwMHxJUl8xMTUyMDAwfChJUl80MDAwMDAwIDw8IDgpOworCisJc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IFNNU0NfSVJDQzJfTUlOX1RVUk5fVElNRTsKKwlzZWxmLT5xb3Mud2luZG93X3NpemUuYml0cyA9IFNNU0NfSVJDQzJfV0lORE9XX1NJWkU7CisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmc2VsZi0+cW9zKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19pbml0X2NoaXAoc2VsZikKKyAqCisgKiAgICBJbml0IGNoaXAKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19pbml0X2NoaXAoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlLCBpcl9tb2RlLCBjdHJsLCBmYXN0OyAKKwkKKwlJUkRBX0FTU0VSVCggc2VsZiAhPSBOVUxMLCByZXR1cm47ICk7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlpcl9tb2RlID0gSVJDQ19DRkdBX0lSREFfU0lSX0E7CisJY3RybCA9IDA7CisJZmFzdCA9IDA7CisKKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YihJUkNDX01BU1RFUl9SRVNFVCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKwlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX01BU1RFUik7CisKKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMSk7CisJb3V0YigoKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQSkgJiAweDg3KSB8IGlyX21vZGUpLCAKKwkgICAgIGlvYmFzZStJUkNDX1NDRV9DRkdBKTsKKworI2lmZGVmIHNtc2NfNjY5IC8qIFVzZXMgcGluIDg4Lzg5IGZvciBSeC9UeCAqLworCW91dGIoKChpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgMHgzZikgfCBJUkNDX0NGR0JfTVVYX0NPTSksIAorCSAgICAgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworI2Vsc2UJCisJb3V0YigoKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiAweDNmKSB8IElSQ0NfQ0ZHQl9NVVhfSVIpLAorCSAgICAgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworI2VuZGlmCQorCSh2b2lkKSBpbmIoaW9iYXNlK0lSQ0NfRklGT19USFJFU0hPTEQpOworCW91dGIoU01TQ19JUkNDMl9GSUZPX1RIUkVTSE9MRCwgaW9iYXNlK0lSQ0NfRklGT19USFJFU0hPTEQpOworCQorCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCA0KTsKKwlvdXRiKChpbmIoaW9iYXNlK0lSQ0NfQ09OVFJPTCkgJiAweDMwKSB8IGN0cmwsIGlvYmFzZStJUkNDX0NPTlRST0wpOworCQorCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKGZhc3QsIGlvYmFzZStJUkNDX0xDUl9BKTsKKworCXNtc2NfaXJjY19zZXRfc2lyX3NwZWVkKHNlbGYsIFNNU0NfSVJDQzJfQ19JUkRBX0ZBTExCQUNLX1NQRUVEKTsKKwkKKwkvKiBQb3dlciBvbiBkZXZpY2UgKi8KKwlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX01BU1RFUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfbmV0X2lvY3RsIChkZXYsIHJxLCBjbWQpCisgKgorICogICAgUHJvY2VzcyBJT0NUTCBjb21tYW5kcyBmb3IgdGhpcyBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgc21zY19pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlzZWxmID0gZGV2LT5wcml2OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksICVzLCAoY21kPTB4JVgpXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSwgY21kKTsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NCQU5EV0lEVEg6IC8qIFNldCBiYW5kd2lkdGggKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0ID0gLUVQRVJNOworICAgICAgICAgICAgICAgIGVsc2UgeworCQkJLyogTWFrZSBzdXJlIHdlIGFyZSB0aGUgb25seSBvbmUgdG91Y2hpbmcKKwkJCSAqIHNlbGYtPmlvLnNwZWVkIGFuZCB0aGUgaGFyZHdhcmUgLSBKZWFuIElJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQkJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBpcnEtPmlmcl9iYXVkcmF0ZSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTSU9DU01FRElBQlVTWTogLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHNlbGYtPm5ldGRldiwgVFJVRSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6IC8qIENoZWNrIGlmIHdlIGFyZSByZWNlaXZpbmcgcmlnaHQgbm93ICovCisJCWlycS0+aWZyX3JlY2VpdmluZyA9IHNtc2NfaXJjY19pc19yZWNlaXZpbmcoc2VsZik7CisJCWJyZWFrOworCSNpZiAwCisJY2FzZSBTSU9DU0RUUlJUUzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCQlzbXNjX2lyY2Nfc2lyX3NldF9kdHJfcnRzKGRldiwgaXJxLT5pZnJfZHRyLCBpcnEtPmlmcl9ydHMpOworCQlicmVhazsKKwkjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisJCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbXNjX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJCisJcmV0dXJuICZzZWxmLT5zdGF0czsKK30KKworI2lmIFNNU0NfSVJDQzJfQ19ORVRfVElNRU9VVAorLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY190aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorICoKKyAqICAgIFRoZSBuZXR3b3JraW5nIHRpbWVvdXQgbWFuYWdlbWVudC4KKyAqCisgKi8KKworc3RhdGljIHZvaWQgc21zY19pcmNjX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCQorCUlSREFfV0FSTklORygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgY2hhbmdpbmcgc3BlZWQgdG86ICVkXG4iLAorCQkgICAgIGRldi0+bmFtZSwgc2VsZi0+aW8uc3BlZWQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJc21zY19pcmNjX3Npcl9zdGFydChzZWxmKTsKKwlzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPmlvLnNwZWVkKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfaGFyZF94bWl0X3NpciAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKyAqCisgKiAgICBUcmFuc21pdHMgdGhlIGN1cnJlbnQgZnJhbWUgdW50aWwgRklGTyBpcyBmdWxsLCB0aGVuCisgKiAgICB3YWl0cyB1bnRpbCB0aGUgbmV4dCB0cmFuc21pdCBpbnRlcnJ1cHQsIGFuZCBjb250aW51ZXMgdW50aWwgdGhlCisgKiAgICBmcmFtZSBpcyB0cmFuc21pdHRlZC4KKyAqLworaW50IHNtc2NfaXJjY19oYXJkX3htaXRfc2lyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpb2Jhc2U7CisJczMyIHNwZWVkOworCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwkKKwlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCS8qIE1ha2Ugc3VyZSB0ZXN0IG9mIHNlbGYtPmlvLnNwZWVkICYgc3BlZWQgY2hhbmdlIGFyZSBhdG9taWMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUgKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJLyoKKwkJCSAqIFdlIHNlbmQgZnJhbWVzIG9uZSBieSBvbmUgaW4gU0lSIG1vZGUgKG5vCisJCQkgKiBwaXBlbGluaW5nKSwgc28gYXQgdGhpcyBwb2ludCwgaWYgd2Ugd2VyZSBzZW5kaW5nCisJCQkgKiBhIHByZXZpb3VzIGZyYW1lLCB3ZSBqdXN0IHJlY2VpdmVkIHRoZSBpbnRlcnJ1cHQKKwkJCSAqIHRlbGxpbmcgdXMgaXQgaXMgZmluaXNoZWQgKFVBUlRfSUlSX1RIUkkpLgorCQkJICogVGhlcmVmb3JlLCB3YWl0aW5nIGZvciB0aGUgdHJhbnNtaXR0ZXIgdG8gcmVhbGx5CisJCQkgKiBmaW5pc2ggZHJhaW5pbmcgdGhlIGZpZm8gd29uJ3QgdGFrZSB0b28gbG9uZy4KKwkJCSAqIEFuZCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaXMgbm90IGV4cGVjdGVkIHRvIHJ1bi4KKwkJCSAqIC0gSmVhbiBJSSAqLworCQkJc21zY19pcmNjX3Npcl93YWl0X2h3X3RyYW5zbWl0dGVyX2ZpbmlzaChzZWxmKTsKKwkJCXNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwkJfQorCX0KKworCS8qIEluaXQgdHggYnVmZmVyICovCisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCisJLyogQ29weSBza2IgdG8gdHhfYnVmZiB3aGlsZSB3cmFwcGluZywgc3R1ZmZpbmcgYW5kIG1ha2luZyBDUkMgKi8KKwlzZWxmLT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLCAKKwkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisJCisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CisKKwkvKiBUdXJuIG9uIHRyYW5zbWl0IGZpbmlzaGVkIGludGVycnVwdC4gV2lsbCBmaXJlIGltbWVkaWF0ZWx5ISAgKi8KKwlvdXRiKFVBUlRfSUVSX1RIUkksIGlvYmFzZStVQVJUX0lFUik7IAorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3NldF9maXJfc3BlZWQgKHNlbGYsIGJhdWQpCisgKgorICogICAgQ2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X2Zpcl9zcGVlZChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCB1MzIgc3BlZWQpCit7CisJaW50IGZpcl9iYXNlLCBpcl9tb2RlLCBjdHJsLCBmYXN0OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlmaXJfYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJc2VsZi0+aW8uc3BlZWQgPSBzcGVlZDsKKworCXN3aXRjaChzcGVlZCkgeworCWRlZmF1bHQ6CisJY2FzZSA1NzYwMDA6CQkKKwkJaXJfbW9kZSA9IElSQ0NfQ0ZHQV9JUkRBX0hETEM7CisJCWN0cmwgPSBJUkNDX0NSQzsKKwkJZmFzdCA9IDA7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGhhbmRsaW5nIGJhdWQgb2YgNTc2MDAwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwljYXNlIDExNTIwMDA6CisJCWlyX21vZGUgPSBJUkNDX0NGR0FfSVJEQV9IRExDOworCQljdHJsID0gSVJDQ18xMTUyIHwgSVJDQ19DUkM7CisJCWZhc3QgPSBJUkNDX0xDUl9BX0ZBU1QgfCBJUkNDX0xDUl9BX0dQX0RBVEE7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGhhbmRsaW5nIGJhdWQgb2YgMTE1MjAwMFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCWNhc2UgNDAwMDAwMDoKKwkJaXJfbW9kZSA9IElSQ0NfQ0ZHQV9JUkRBXzRQUE07CisJCWN0cmwgPSBJUkNDX0NSQzsKKwkJZmFzdCA9IElSQ0NfTENSX0FfRkFTVDsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaGFuZGxpbmcgYmF1ZCBvZiA0MDAwMDAwXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJfQorCSNpZiAwCisJTm93IGluIHRyYW5jZWl2ZXIhCisJLyogVGhpcyBjYXVzZXMgYW4gaW50ZXJydXB0ICovCisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMCk7CisJb3V0YigoaW5iKGZpcl9iYXNlK0lSQ0NfTENSX0EpICYgIDB4YmYpIHwgZmFzdCwgZmlyX2Jhc2UrSVJDQ19MQ1JfQSk7CisJI2VuZGlmCisJCisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMSk7CisJb3V0YigoKGluYihmaXJfYmFzZStJUkNDX1NDRV9DRkdBKSAmIElSQ0NfU0NFX0NGR0FfQkxPQ0tfQ1RSTF9CSVRTX01BU0spIHwgaXJfbW9kZSksIGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0EpOworCQorCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDQpOworCW91dGIoKGluYihmaXJfYmFzZStJUkNDX0NPTlRST0wpICYgMHgzMCkgfCBjdHJsLCBmaXJfYmFzZStJUkNDX0NPTlRST0wpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2Zpcl9zdGFydChzZWxmKQorICoKKyAqICAgIENoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX2Zpcl9zdGFydChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGZpcl9iYXNlOworCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCWRldiA9IHNlbGYtPm5ldGRldjsKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlmaXJfYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogUmVzZXQgZXZlcnl0aGluZyAqLworCisJLyogSW5zdGFsbCBGSVIgdHJhbnNtaXQgaGFuZGxlciAqLworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc21zY19pcmNjX2hhcmRfeG1pdF9maXI7CQorCisJLyogQ2xlYXIgRklGTyAqLworCW91dGIoaW5iKGZpcl9iYXNlK0lSQ0NfTENSX0EpfElSQ0NfTENSX0FfRklGT19SRVNFVCwgZmlyX2Jhc2UrSVJDQ19MQ1JfQSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0ICovCisJLypvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRXxJUkNDX0lFUl9FT00sIGZpcl9iYXNlK0lSQ0NfSUVSKTsqLworCisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMSk7CisKKwkvKiBTZWxlY3QgdGhlIFRYL1JYIGludGVyZmFjZSAqLwkKKyNpZmRlZiBTTVNDXzY2OSAvKiBVc2VzIHBpbiA4OC84OSBmb3IgUngvVHggKi8KKwlvdXRiKCgoaW5iKGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgMHgzZikgfCBJUkNDX0NGR0JfTVVYX0NPTSksIAorCSAgICAgZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisjZWxzZQkKKwlvdXRiKCgoaW5iKGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgMHgzZikgfCBJUkNDX0NGR0JfTVVYX0lSKSwKKwkgICAgIGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0IpOworI2VuZGlmCQorCSh2b2lkKSBpbmIoZmlyX2Jhc2UrSVJDQ19GSUZPX1RIUkVTSE9MRCk7CisKKwkvKiBFbmFibGUgU0NFIGludGVycnVwdHMgKi8KKwlvdXRiKDAsIGZpcl9iYXNlK0lSQ0NfTUFTVEVSKTsKKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAwKTsKKwlvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRXxJUkNDX0lFUl9FT00sIGZpcl9iYXNlK0lSQ0NfSUVSKTsKKwlvdXRiKElSQ0NfTUFTVEVSX0lOVF9FTiwgZmlyX2Jhc2UrSVJDQ19NQVNURVIpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2Zpcl9zdG9wKHNlbGYsIGJhdWQpCisgKgorICogICAgQ2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfZmlyX3N0b3Aoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgZmlyX2Jhc2U7CisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJZmlyX2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAwKTsKKwkvKm91dGIoSVJDQ19NQVNURVJfUkVTRVQsIGZpcl9iYXNlK0lSQ0NfTUFTVEVSKTsqLwkKKwlvdXRiKGluYihmaXJfYmFzZStJUkNDX0xDUl9CKSAmIElSQ0NfTENSX0JfU0lQX0VOQUJMRSwgZmlyX2Jhc2UrSVJDQ19MQ1JfQik7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgYmF1ZCkKKyAqCisgKiAgICBDaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBjYWxsZWQgd2l0aCBzcGlubG9jayBoZWxkLCBiZWNhdXNlIGl0IG1heQorICogYmUgY2FsbGVkIGZyb20gdGhlIGlycSBoYW5kbGVyLiAtIEplYW4gSUkKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX2NoYW5nZV9zcGVlZCh2b2lkICpwcml2LCB1MzIgc3BlZWQpCit7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIHByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaW9iYXNlOworCWludCBsYXN0X3NwZWVkX3dhc19zaXI7CisJCisJSVJEQV9ERUJVRygwLCAiJXMoKSBjaGFuZ2luZyBzcGVlZCB0bzogJWRcbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlkZXYgPSBzZWxmLT5uZXRkZXY7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlsYXN0X3NwZWVkX3dhc19zaXIgPSBzZWxmLT5pby5zcGVlZCA8PSBTTVNDX0lSQ0MyX01BWF9TSVJfU1BFRUQ7CisKKwkjaWYgMAorCS8qIFRlbXAgSGFjayAqLworCXNwZWVkPSAxMTUyMDAwOworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisJbGFzdF9zcGVlZF93YXNfc2lyID0gMDsKKwlzbXNjX2lyY2NfZmlyX3N0YXJ0KHNlbGYpOwkKKwkjZW5kaWYKKwkKKwlpZihzZWxmLT5pby5zcGVlZCA9PSAwKQorCQlzbXNjX2lyY2Nfc2lyX3N0YXJ0KHNlbGYpOworCisJI2lmIDAKKwlpZighbGFzdF9zcGVlZF93YXNfc2lyKSBzcGVlZCA9IHNlbGYtPmlvLnNwZWVkOworCSNlbmRpZgorCisJaWYoc2VsZi0+aW8uc3BlZWQgIT0gc3BlZWQpIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfZm9yX3NwZWVkKHNlbGYsIHNwZWVkKTsKKworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisJCisJaWYoc3BlZWQgPD0gU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVEKSB7CisJCWlmKCFsYXN0X3NwZWVkX3dhc19zaXIpIHsKKwkJCXNtc2NfaXJjY19maXJfc3RvcChzZWxmKTsKKwkJCXNtc2NfaXJjY19zaXJfc3RhcnQoc2VsZik7CisJCX0KKwkJc21zY19pcmNjX3NldF9zaXJfc3BlZWQoc2VsZiwgc3BlZWQpOyAKKwl9CisJZWxzZSB7CisJCWlmKGxhc3Rfc3BlZWRfd2FzX3NpcikgeworCQkJI2lmIFNNU0NfSVJDQzJfQ19TSVJfU1RPUAkJCisJCQlzbXNjX2lyY2Nfc2lyX3N0b3Aoc2VsZik7CisJCQkjZW5kaWYKKwkJCXNtc2NfaXJjY19maXJfc3RhcnQoc2VsZik7CisJCX0KKwkJc21zY19pcmNjX3NldF9maXJfc3BlZWQoc2VsZiwgc3BlZWQpOworCisJCSNpZiAwCisJCXNlbGYtPnR4X2J1ZmYubGVuID0gMTA7CisJCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwkJCisJCXNtc2NfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UsIDQwMDApOworCQkjZW5kaWYKKwkJLyogQmUgcmVhZHkgZm9yIGluY29taW5nIGZyYW1lcyAqLworCQlzbXNjX2lyY2NfZG1hX3JlY2VpdmUoc2VsZiwgaW9iYXNlKTsKKwl9CisJCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3NldF9zaXJfc3BlZWQgKHNlbGYsIHNwZWVkKQorICoKKyAqICAgIFNldCBzcGVlZCBvZiBJckRBIHBvcnQgdG8gc3BlY2lmaWVkIGJhdWRyYXRlCisgKgorICovCit2b2lkIHNtc2NfaXJjY19zZXRfc2lyX3NwZWVkKHZvaWQgKnByaXYsIF9fdTMyIHNwZWVkKQoreworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBwcml2OworCWludCBpb2Jhc2U7IAorCWludCBmY3I7ICAgIC8qIEZJRk8gY29udHJvbCByZWcgKi8KKwlpbnQgbGNyOyAgICAvKiBMaW5lIGNvbnRyb2wgcmVnICovCisJaW50IGRpdmlzb3I7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpLCBTZXR0aW5nIHNwZWVkIHRvOiAlZFxuIiwgX19GVU5DVElPTl9fLCBzcGVlZCk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCQorCS8qIFVwZGF0ZSBhY2NvdW50aW5nIGZvciBuZXcgc3BlZWQgKi8KKwlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOworCisJLyogVHVybiBvZmYgaW50ZXJydXB0cyAqLworCW91dGIoMCwgaW9iYXNlK1VBUlRfSUVSKTsgCisKKwlkaXZpc29yID0gU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVEL3NwZWVkOworCQorCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPOworCisJLyogCisJICogVXNlIHRyaWdnZXIgbGV2ZWwgMSB0byBhdm9pZCAzIG1zLiB0aW1lb3V0IGRlbGF5IGF0IDk2MDAgYnBzLCBhbmQKKwkgKiBhbG1vc3QgMSw3IG1zIGF0IDE5MjAwIGJwcy4gQXQgc3BlZWRzIGFib3ZlIHRoYXQgd2UgY2FuIGp1c3QgZm9yZ2V0CisJICogYWJvdXQgdGhpcyB0aW1lb3V0IHNpbmNlIGl0IHdpbGwgYWx3YXlzIGJlIGZhc3QgZW5vdWdoLiAKKwkgKi8KKwlpZiAoc2VsZi0+aW8uc3BlZWQgPCAzODQwMCkKKwkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTsKKwllbHNlIAorCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xNDsKKyAgICAgICAgCisJLyogSXJEQSBwb3J0cyB1c2UgOE4xICovCisJbGNyID0gVUFSVF9MQ1JfV0xFTjg7CisJCisJb3V0YihVQVJUX0xDUl9ETEFCIHwgbGNyLCBpb2Jhc2UrVUFSVF9MQ1IpOyAvKiBTZXQgRExBQiAqLworCW91dGIoZGl2aXNvciAmIDB4ZmYsICAgICAgaW9iYXNlK1VBUlRfRExMKTsgLyogU2V0IHNwZWVkICovCisJb3V0YihkaXZpc29yID4+IDgsCSAgaW9iYXNlK1VBUlRfRExNKTsKKwlvdXRiKGxjciwJCSAgaW9iYXNlK1VBUlRfTENSKTsgLyogU2V0IDhOMQkqLworCW91dGIoZmNyLAkJICBpb2Jhc2UrVUFSVF9GQ1IpOyAvKiBFbmFibGUgRklGTydzICovCisKKwkvKiBUdXJuIG9uIGludGVycnVwcyAqLworCW91dGIoVUFSVF9JRVJfUkxTSXxVQVJUX0lFUl9SREl8VUFSVF9JRVJfVEhSSSwgaW9iYXNlK1VBUlRfSUVSKTsKKworCUlSREFfREVCVUcoMiwgIiVzKCkgc3BlZWQgY2hhbmdlZCB0bzogJWRcbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfaGFyZF94bWl0X2ZpciAoc2tiLCBkZXYpCisgKgorICogICAgVHJhbnNtaXQgdGhlIGZyYW1lIQorICoKKyAqLworc3RhdGljIGludCBzbXNjX2lyY2NfaGFyZF94bWl0X2ZpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzMzIgc3BlZWQ7CisJaW50IGlvYmFzZTsKKwlpbnQgbXR0OworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAwOyk7CisJc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIE1ha2Ugc3VyZSB0ZXN0IG9mIHNlbGYtPmlvLnNwZWVkICYgc3BlZWQgY2hhbmdlIGFyZSBhdG9taWMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkIGFmdGVyIHRoaXMgZnJhbWUgKi8KKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZSAqLworCQlpZiAoIXNrYi0+bGVuKSB7CisJCQkvKiBOb3RlIDogeW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCBzcGVlZCBjaGFuZ2VzCisJCQkgKiBhcmUgbm90IGdvaW5nIHRvIGNvcnJ1cHQgYW55IG91dGdvaW5nIGZyYW1lLgorCQkJICogTG9vayBhdCBuc2MtaXJjYyBmb3IgdGhlIGdvcnkgZGV0YWlscyAtIEplYW4gSUkgKi8KKwkJCXNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOyAKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCX0KKwkKKwltZW1jcHkoc2VsZi0+dHhfYnVmZi5oZWFkLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCXNlbGYtPnR4X2J1ZmYubGVuID0gc2tiLT5sZW47CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCQorCW10dCA9IGlyZGFfZ2V0X210dChza2IpOwkKKwlpZiAobXR0KSB7CisJCWludCBib2ZzOworCisJCS8qIAorCQkgKiBDb21wdXRlIGhvdyBtYW55IEJPRnMgKFNUQSBvciBQQSdzKSB3ZSBuZWVkIHRvIHdhc3RlIHRoZQorCQkgKiBtaW4gdHVybiB0aW1lIGdpdmVuIHRoZSBzcGVlZCBvZiB0aGUgbGluay4KKwkJICovCisJCWJvZnMgPSBtdHQgKiAoc2VsZi0+aW8uc3BlZWQgLyAxMDAwKSAvIDgwMDA7CisJCWlmIChib2ZzID4gNDA5NSkKKwkJCWJvZnMgPSA0MDk1OworCisJCXNtc2NfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UsIGJvZnMpOworCX0gZWxzZSB7CisJCS8qIFRyYW5zbWl0IGZyYW1lICovCisJCXNtc2NfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UsIDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfZG1hX3htaXQgKHNlbGYsIGlvYmFzZSkKKyAqCisgKiAgICBUcmFuc21pdCBkYXRhIHVzaW5nIERNQQorICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV94bWl0KHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UsIGludCBib2ZzKQoreworCXU4IGN0cmw7CisKKwlJUkRBX0RFQlVHKDMsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKyNpZiAxCisJLyogRGlzYWJsZSBSeCAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX0xDUl9CKTsKKyNlbmRpZgorCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKKwlvdXRiKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiB+SVJDQ19DRkdCX0RNQV9FTkFCTEUsIAorCSAgICAgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworCisJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fWE1JVDsKKworCS8qIFNldCBCT0YgYWRkaXRpb25hbCBjb3VudCBmb3IgZ2VuZXJhdGluZyB0aGUgbWluIHR1cm4gdGltZSAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCA0KTsKKwlvdXRiKGJvZnMgJiAweGZmLCBpb2Jhc2UrSVJDQ19CT0ZfQ09VTlRfTE8pOworCWN0cmwgPSBpbmIoaW9iYXNlK0lSQ0NfQ09OVFJPTCkgJiAweGYwOworCW91dGIoY3RybCB8ICgoYm9mcyA+PiA4KSAmIDB4MGYpLCBpb2Jhc2UrSVJDQ19CT0ZfQ09VTlRfSEkpOworCisJLyogU2V0IG1heCBUeCBmcmFtZSBzaXplICovCisJb3V0YihzZWxmLT50eF9idWZmLmxlbiA+PiA4LCBpb2Jhc2UrSVJDQ19UWF9TSVpFX0hJKTsKKwlvdXRiKHNlbGYtPnR4X2J1ZmYubGVuICYgMHhmZiwgaW9iYXNlK0lSQ0NfVFhfU0laRV9MTyk7CisKKwkvKm91dGIoVUFSVF9NQ1JfT1VUMiwgc2VsZi0+aW8uc2lyX2Jhc2UgKyBVQVJUX01DUik7Ki8KKwkKKwkvKiBFbmFibGUgYnVyc3QgbW9kZSBjaGlwIFR4IERNQSAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKKwlvdXRiKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgfCBJUkNDX0NGR0JfRE1BX0VOQUJMRSB8CisJICAgICBJUkNDX0NGR0JfRE1BX0JVUlNULCBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisKKwkvKiBTZXR1cCBETUEgY29udHJvbGxlciAobXVzdCBiZSBkb25lIGFmdGVyIGVuYWJsaW5nIGNoaXAgRE1BKSAqLworCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgc2VsZi0+dHhfYnVmZl9kbWEsIHNlbGYtPnR4X2J1ZmYubGVuLAorCQkgICAgICAgRE1BX1RYX01PREUpOworCisJLyogRW5hYmxlIGludGVycnVwdCAqLworCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FIHwgSVJDQ19JRVJfRU9NLCBpb2Jhc2UrSVJDQ19JRVIpOworCW91dGIoSVJDQ19NQVNURVJfSU5UX0VOLCBpb2Jhc2UrSVJDQ19NQVNURVIpOworCQorCS8qIEVuYWJsZSB0cmFuc21pdCAqLworCW91dGIoSVJDQ19MQ1JfQl9TQ0VfVFJBTlNNSVQgfCBJUkNDX0xDUl9CX1NJUF9FTkFCTEUsIGlvYmFzZStJUkNDX0xDUl9CKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZSAoc2VsZikKKyAqCisgKiAgICBUaGUgdHJhbnNmZXIgb2YgYSBmcmFtZSBpbiBmaW5pc2hlZC4gVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgY2FsbGVkIAorICogICAgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSkKK3sKKwlJUkRBX0RFQlVHKDMsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKyNpZiAwCisJLyogRGlzYWJsZSBUeCAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX0xDUl9CKTsKKyNlbmRpZgorCXJlZ2lzdGVyX2Jhbmsoc2VsZi0+aW8uZmlyX2Jhc2UsIDEpOworCW91dGIoaW5iKHNlbGYtPmlvLmZpcl9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgfklSQ0NfQ0ZHQl9ETUFfRU5BQkxFLAorCSAgICAgc2VsZi0+aW8uZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisKKwkvKiBDaGVjayBmb3IgdW5kZXJydW4hICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCWlmIChpbmIoaW9iYXNlK0lSQ0NfTFNSKSAmIElSQ0NfTFNSX1VOREVSUlVOKSB7CisJCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlzZWxmLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCisJCS8qIFJlc2V0IGVycm9yIGNvbmRpdGlvbiAqLworCQlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJCW91dGIoSVJDQ19NQVNURVJfRVJST1JfUkVTRVQsIGlvYmFzZStJUkNDX01BU1RFUik7CisJCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKwl9IGVsc2UgeworCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9ICBzZWxmLT50eF9idWZmLmxlbjsKKwl9CisKKwkvKiBDaGVjayBpZiBpdCdzIHRpbWUgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLworCWlmIChzZWxmLT5uZXdfc3BlZWQpIHsKKwkJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzZWxmLT5uZXdfc3BlZWQpOwkJCisJCXNlbGYtPm5ld19zcGVlZCA9IDA7CisJfQorCisJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2RtYV9yZWNlaXZlKHNlbGYpCisgKgorICogICAgR2V0IHJlYWR5IGZvciByZWNlaXZpbmcgYSBmcmFtZS4gVGhlIGRldmljZSB3aWxsIGluaXRpYXRlIGEgRE1BCisgKiAgICBpZiBpdCBzdGFydHMgdG8gcmVjZWl2ZSBhIGZyYW1lLgorICoKKyAqLworc3RhdGljIGludCBzbXNjX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSkgCit7CisjaWYgMAorCS8qIFR1cm4gb2ZmIGNoaXAgRE1BICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOworCW91dGIoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwgCisJICAgICBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisjZW5kaWYKKwkKKwkvKiBEaXNhYmxlIFR4ICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoMHgwMCwgaW9iYXNlK0lSQ0NfTENSX0IpOworCisJLyogVHVybiBvZmYgY2hpcCBETUEgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMSk7CisJb3V0YihpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgfklSQ0NfQ0ZHQl9ETUFfRU5BQkxFLCAKKwkgICAgIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKworCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1JFQ1Y7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCisJLyogU2V0IG1heCBSeCBmcmFtZSBzaXplICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDQpOworCW91dGIoKDIwNTAgPj4gOCkgJiAweDBmLCBpb2Jhc2UrSVJDQ19SWF9TSVpFX0hJKTsKKwlvdXRiKDIwNTAgJiAweGZmLCBpb2Jhc2UrSVJDQ19SWF9TSVpFX0xPKTsKKworCS8qIFNldHVwIERNQSBjb250cm9sbGVyICovCisJaXJkYV9zZXR1cF9kbWEoc2VsZi0+aW8uZG1hLCBzZWxmLT5yeF9idWZmX2RtYSwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJICAgICAgIERNQV9SWF9NT0RFKTsKKworCS8qIEVuYWJsZSBidXJzdCBtb2RlIGNoaXAgUnggRE1BICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOworCW91dGIoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSB8IElSQ0NfQ0ZHQl9ETUFfRU5BQkxFIHwgCisJICAgICBJUkNDX0NGR0JfRE1BX0JVUlNULCBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0ICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FIHwgSVJDQ19JRVJfRU9NLCBpb2Jhc2UrSVJDQ19JRVIpOworCW91dGIoSVJDQ19NQVNURVJfSU5UX0VOLCBpb2Jhc2UrSVJDQ19NQVNURVIpOworCisKKwkvKiBFbmFibGUgcmVjZWl2ZXIgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YihJUkNDX0xDUl9CX1NDRV9SRUNFSVZFIHwgSVJDQ19MQ1JfQl9TSVBfRU5BQkxFLCAKKwkgICAgIGlvYmFzZStJUkNDX0xDUl9CKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmLCBpb2Jhc2UpCisgKgorICogICAgRmluaXNoZWQgd2l0aCByZWNlaXZpbmcgZnJhbWVzCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBsZW4sIG1zZ2NudCwgbHNyOworCQorCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwkKKwlJUkRBX0RFQlVHKDMsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKyNpZiAwCisJLyogRGlzYWJsZSBSeCAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX0xDUl9CKTsKKyNlbmRpZgorCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKGluYihpb2Jhc2UrSVJDQ19MU0FSKSAmIH5JUkNDX0xTQVJfQUREUkVTU19NQVNLLCBpb2Jhc2UrSVJDQ19MU0FSKTsKKwlsc3I9IGluYihpb2Jhc2UrSVJDQ19MU1IpOworCW1zZ2NudCA9IGluYihpb2Jhc2UrSVJDQ19MQ1JfQikgJiAweDA4OworCisJSVJEQV9ERUJVRygyLCAiJXM6IGRtYSBjb3VudCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIGdldF9kbWFfcmVzaWR1ZShzZWxmLT5pby5kbWEpKTsKKworCWxlbiA9IHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgLSBnZXRfZG1hX3Jlc2lkdWUoc2VsZi0+aW8uZG1hKTsKKworCS8qIExvb2sgZm9yIGVycm9ycyAKKwkgKi8JCisKKwlpZihsc3IgJiAoSVJDQ19MU1JfRlJBTUVfRVJST1IgfCBJUkNDX0xTUl9DUkNfRVJST1IgfCBJUkNDX0xTUl9TSVpFX0VSUk9SKSkgeworCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJaWYobHNyICYgSVJDQ19MU1JfRlJBTUVfRVJST1IpIHNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlpZihsc3IgJiBJUkNDX0xTUl9DUkNfRVJST1IpIHNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJaWYobHNyICYgSVJDQ19MU1JfU0laRV9FUlJPUikgc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZihsc3IgJiAoSVJDQ19MU1JfVU5ERVJSVU4gfCBJUkNDX0xTUl9PVkVSUlVOKSkgc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlyZXR1cm47CisJfQorCS8qIFJlbW92ZSBDUkMgKi8KKwlpZiAoc2VsZi0+aW8uc3BlZWQgPCA0MDAwMDAwKQorCQlsZW4gLT0gMjsKKwllbHNlCisJCWxlbiAtPSA0OworCisJaWYgKChsZW4gPCAyKSB8fCAobGVuID4gMjA1MCkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBib2d1cyBsZW49JWRcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKKwkJcmV0dXJuOworCX0KKwlJUkRBX0RFQlVHKDIsICIlczogbXNnY250ID0gJWQsIGxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCBtc2djbnQsIGxlbik7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisxKTsKKwlpZiAoIXNrYikgIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgZnJhbWUuXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQkJCQorCS8qIE1ha2Ugc3VyZSBJUCBoZWFkZXIgZ2V0cyBhbGlnbmVkICovCisJc2tiX3Jlc2VydmUoc2tiLCAxKTsgCisKKwltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuKTsKKwlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CisJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJbmV0aWZfcngoc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zaXJfcmVjZWl2ZSAoc2VsZikKKyAqCisgKiAgICBSZWNlaXZlIG9uZSBmcmFtZSBmcm9tIHRoZSBpbmZyYXJlZCBwb3J0CisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3JlY2VpdmUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikgCit7CisJaW50IGJvZ3VzY291bnQgPSAwOworCWludCBpb2Jhc2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiAgCisJICogUmVjZWl2ZSBhbGwgY2hhcmFjdGVycyBpbiBSeCBGSUZPLCB1bndyYXAgYW5kIHVuc3R1ZmYgdGhlbS4gCisgICAgICAgICAqIGFzeW5jX3Vud3JhcF9jaGFyIHdpbGwgZGVsaXZlciBhbGwgZm91bmQgZnJhbWVzICAKKwkgKi8KKwlkbyB7CisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwgCisJCQkJICBpbmIoaW9iYXNlK1VBUlRfUlgpKTsKKworCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgc3RheSBoZXJlIHRvIGxvbmcgKi8KKwkJaWYgKGJvZ3VzY291bnQrKyA+IDMyKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBicmVha2luZyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKGluYihpb2Jhc2UrVUFSVF9MU1IpICYgVUFSVF9MU1JfRFIpOwkKK30KKworCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgQW4gaW50ZXJydXB0IGZyb20gdGhlIGNoaXAgaGFzIGFycml2ZWQuIFRpbWUgdG8gZG8gc29tZSB3b3JrCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc21zY19pcmNjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZSwgaWlyLCBsY3JhLCBsc3I7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCAKKwkJICAgICAgIGRyaXZlcl9uYW1lLCBpcnEpOworCQlnb3RvIGlycV9yZXQ7CisJfQorCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gSVJRX05PTkU7KTsKKworCS8qIFNlcmlhbGlzZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaW4gdmFyaW91cyBDUFVzLCBzdG9wIFR4IHBhdGggKi8KKwlzcGluX2xvY2soJnNlbGYtPmxvY2spOwkKKworCS8qIENoZWNrIGlmIHdlIHNob3VsZCB1c2UgdGhlIFNJUiBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWlmIChzZWxmLT5pby5zcGVlZCA8PSAgU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVEKSB7CisJCXJldCA9IHNtc2NfaXJjY19pbnRlcnJ1cHRfc2lyKGRldik7CisJCWdvdG8gaXJxX3JldF91bmxvY2s7CisJfQorCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJaWlyID0gaW5iKGlvYmFzZStJUkNDX0lJUik7CisJaWYgKGlpciA9PSAwKSAKKwkJZ290byBpcnFfcmV0X3VubG9jazsKKwlyZXQgPSBJUlFfSEFORExFRDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCW91dGIoMCwgaW9iYXNlK0lSQ0NfSUVSKTsKKwlsY3JhID0gaW5iKGlvYmFzZStJUkNDX0xDUl9BKTsKKwlsc3IgPSBpbmIoaW9iYXNlK0lSQ0NfTFNSKTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBpaXIgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgaWlyKTsKKworCWlmIChpaXIgJiBJUkNDX0lJUl9FT00pIHsKKwkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19SRUNWKQorCQkJc21zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHNlbGYsIGlvYmFzZSk7CisJCWVsc2UKKwkJCXNtc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzZWxmLCBpb2Jhc2UpOworCQkKKwkJc21zY19pcmNjX2RtYV9yZWNlaXZlKHNlbGYsIGlvYmFzZSk7CisJfQorCisJaWYgKGlpciAmIElSQ0NfSUlSX0FDVElWRV9GUkFNRSkgeworCQkvKnByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IEFjdGl2ZSBGcmFtZVxuIiwgX19GVU5DVElPTl9fKTsqLworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFnYWluICovCisKKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUV8SVJDQ19JRVJfRU9NLCBpb2Jhc2UrSVJDQ19JRVIpOworCisgaXJxX3JldF91bmxvY2s6CisJc3Bpbl91bmxvY2soJnNlbGYtPmxvY2spOworIGlycV9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9pbnRlcnJ1cHRfc2lyIChpcnEsIGRldl9pZCwgcmVncykKKyAqCisgKiAgICBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgU0lSIG1vZGVzCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzbXNjX2lyY2NfaW50ZXJydXB0X3NpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSBkZXYtPnByaXY7CisJaW50IGJvZ3VzY291bnQgPSAwOworCWludCBpb2Jhc2U7CisJaW50IGlpciwgbHNyOworCisJLyogQWxyZWFkeSBsb2NrZWQgY29tbWluZyBoZXJlIGluIHNtc2NfaXJjY19pbnRlcnJ1cHQoKSAqLworCS8qc3Bpbl9sb2NrKCZzZWxmLT5sb2NrKTsqLworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwlpaXIgPSBpbmIoaW9iYXNlK1VBUlRfSUlSKSAmIFVBUlRfSUlSX0lEOworCWlmIChpaXIgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOworCXdoaWxlIChpaXIpIHsKKwkJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJCWxzciA9IGluYihpb2Jhc2UrVUFSVF9MU1IpOworCisJCUlSREFfREVCVUcoNCwgIiVzKCksIGlpcj0lMDJ4LCBsc3I9JTAyeCwgaW9iYXNlPSUjeFxuIiwgCisJCQkgICAgX19GVU5DVElPTl9fLCBpaXIsIGxzciwgaW9iYXNlKTsKKworCQlzd2l0Y2ggKGlpcikgeworCQljYXNlIFVBUlRfSUlSX1JMU0k6CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBSTFNJXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJYnJlYWs7CisJCWNhc2UgVUFSVF9JSVJfUkRJOgorCQkJLyogUmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKwkJCXNtc2NfaXJjY19zaXJfcmVjZWl2ZShzZWxmKTsKKwkJCWJyZWFrOworCQljYXNlIFVBUlRfSUlSX1RIUkk6CisJCQlpZiAobHNyICYgVUFSVF9MU1JfVEhSRSkKKwkJCQkvKiBUcmFuc21pdHRlciByZWFkeSBmb3IgZGF0YSAqLworCQkJCXNtc2NfaXJjY19zaXJfd3JpdGVfd2FrZXVwKHNlbGYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmhhbmRsZWQgSUlSPSUjeFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIGlpcik7CisJCQlicmVhazsKKwkJfSAKKwkJCisJCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBzdGF5IGhlcmUgdG8gbG9uZyAqLworCQlpZiAoYm9ndXNjb3VudCsrID4gMTAwKQorCQkJYnJlYWs7CisKKyAJICAgICAgICBpaXIgPSBpbmIoaW9iYXNlICsgVUFSVF9JSVIpICYgVUFSVF9JSVJfSUQ7CisJfQorCS8qc3Bpbl91bmxvY2soJnNlbGYtPmxvY2spOyovCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKyNpZiAwIC8qIHVudXNlZCAqLworLyoKKyAqIEZ1bmN0aW9uIGlyY2NfaXNfcmVjZWl2aW5nIChzZWxmKQorICoKKyAqICAgIFJldHVybiBUUlVFIGlzIHdlIGFyZSBjdXJyZW50bHkgcmVjZWl2aW5nIGEgZnJhbWUKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgc3RhdHVzID0gRkFMU0U7CisJLyogaW50IGlvYmFzZTsgKi8KKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gRkFMU0U7KTsKKworCUlSREFfREVCVUcoMCwgIiVzOiBkbWEgY291bnQgPSAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBnZXRfZG1hX3Jlc2lkdWUoc2VsZi0+aW8uZG1hKSk7CisKKwlzdGF0dXMgPSAoc2VsZi0+cnhfYnVmZi5zdGF0ZSAhPSBPVVRTSURFX0ZSQU1FKTsKKwkKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmIC8qIHVudXNlZCAqLworCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfbmV0X29wZW4gKGRldikKKyAqCisgKiAgICBTdGFydCB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IHNtc2NfaXJjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwljaGFyIGh3bmFtZVsxNl07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCWlmIChyZXF1ZXN0X2lycShzZWxmLT5pby5pcnEsIHNtc2NfaXJjY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgCisJCQkodm9pZCAqKSBkZXYpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuYWJsZSB0byBhbGxvY2F0ZSBpcnE9JWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJLypzbXNjX2lyY2Nfc2lyX3N0YXJ0KHNlbGYpOyovCisJc2VsZi0+aW8uc3BlZWQgPSAwOworCXNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgU01TQ19JUkNDMl9DX0lSREFfRkFMTEJBQ0tfU1BFRUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBHaXZlIHNlbGYgYSBoYXJkd2FyZSBuYW1lICovCisJLyogSXQgd291bGQgYmUgY29vbCB0byBvZmZlciB0aGUgY2hpcCByZXZpc2lvbiBoZXJlIC0gSmVhbiBJSSAqLworCXNwcmludGYoaHduYW1lLCAiU01TQyBAIDB4JTAzeCIsIHNlbGYtPmlvLmZpcl9iYXNlKTsKKworCS8qIAorCSAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQorCSAqIGluaXRpYWxpemVkIHByb3Blcmx5IAorCSAqLworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisKKwkvKgorCSAqIEFsd2F5cyBhbGxvY2F0ZSB0aGUgRE1BIGNoYW5uZWwgYWZ0ZXIgdGhlIElSUSwKKwkgKiBhbmQgY2xlYW4gdXAgb24gZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVzdF9kbWEoc2VsZi0+aW8uZG1hLCBkZXYtPm5hbWUpKSB7CisJCXNtc2NfaXJjY19uZXRfY2xvc2UoZGV2KTsKKworCQlJUkRBX1dBUk5JTkcoIiVzKCksIHVuYWJsZSB0byBhbGxvY2F0ZSBETUE9JWRcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uZG1hKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCQorCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19uZXRfY2xvc2UgKGRldikKKyAqCisgKiAgICBTdG9wIHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgc21zY19pcmNjX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBTdG9wIGRldmljZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoc2VsZi0+aXJsYXApCisJCWlybGFwX2Nsb3NlKHNlbGYtPmlybGFwKTsKKwlzZWxmLT5pcmxhcCA9IE5VTEw7CisKKwlmcmVlX2lycShzZWxmLT5pby5pcnEsIGRldik7CisKKwlkaXNhYmxlX2RtYShzZWxmLT5pby5kbWEpOworCisJZnJlZV9kbWEoc2VsZi0+aW8uZG1hKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zdXNwZW5kKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJSVJEQV9NRVNTQUdFKCIlcywgU3VzcGVuZGluZ1xuIiwgZHJpdmVyX25hbWUpOworCisJaWYgKHNlbGYtPmlvLnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJc21zY19pcmNjX25ldF9jbG9zZShzZWxmLT5uZXRkZXYpOworCisJc2VsZi0+aW8uc3VzcGVuZGVkID0gMTsKK30KKworc3RhdGljIHZvaWQgc21zY19pcmNjX3dha2V1cChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCWlmICghc2VsZi0+aW8uc3VzcGVuZGVkKQorCQlyZXR1cm47CisKKwkvKiBUaGUgY29kZSB3YXMgZG9pbmcgYSAiY2xpKCkiIGhlcmUsIGJ1dCB0aGlzIGNhbid0IGJlIHJpZ2h0LgorCSAqIElmIHlvdSBuZWVkIHByb3RlY3Rpb24sIGRvIGl0IGluIG5ldF9vcGVuIHdpdGggYSBzcGlubG9jaworCSAqIG9yIGdpdmUgYSBnb29kIHJlYXNvbi4gLSBKZWFuIElJICovCisKKwlzbXNjX2lyY2NfbmV0X29wZW4oc2VsZi0+bmV0ZGV2KTsKKwkKKwlJUkRBX01FU1NBR0UoIiVzLCBXYWtpbmcgdXBcbiIsIGRyaXZlcl9uYW1lKTsKK30KKworc3RhdGljIGludCBzbXNjX2lyY2NfcG1wcm9jKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiopIGRldi0+ZGF0YTsKKyAgICAgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJxc3QpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBNX1NVU1BFTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzbXNjX2lyY2Nfc3VzcGVuZChzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUE1fUkVTVU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgc21zY19pcmNjX3dha2V1cChzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIENsb3NlIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIGludCBfX2V4aXQgc21zY19pcmNjX2Nsb3NlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlpZiAoc2VsZi0+cG1kZXYpCisJCXBtX3VucmVnaXN0ZXIoc2VsZi0+cG1kZXYpOworCisJLyogUmVtb3ZlIG5ldGRldmljZSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGlycSBoYW5kbGVyIGlzIG5vdCBleGVjdHV0aW5nICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIFN0b3AgaW50ZXJydXB0cyAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKDAsIGlvYmFzZStJUkNDX0lFUik7CisJb3V0YihJUkNDX01BU1RFUl9SRVNFVCwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKwlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX01BU1RFUik7CisjaWYgMAorCS8qIFJlc2V0IHRvIFNJUiBtb2RlICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOworICAgICAgICBvdXRiKElSQ0NfQ0ZHQV9JUkRBX1NJUl9BfElSQ0NfQ0ZHQV9UWF9QT0xBUklUWSwgaW9iYXNlK0lSQ0NfU0NFX0NGR0EpOworICAgICAgICBvdXRiKElSQ0NfQ0ZHQl9JUiwgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworI2VuZGlmCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogUmVsZWFzZSB0aGUgUE9SVFMgdGhhdCB0aGlzIGRyaXZlciBpcyB1c2luZyAqLworCUlSREFfREVCVUcoMCwgIiVzKCksIHJlbGVhc2luZyAweCUwM3hcbiIsICBfX0ZVTkNUSU9OX18sCisJCSAgIHNlbGYtPmlvLmZpcl9iYXNlKTsKKworCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKworCUlSREFfREVCVUcoMCwgIiVzKCksIHJlbGVhc2luZyAweCUwM3hcbiIsIF9fRlVOQ1RJT05fXywgCisJCSAgIHNlbGYtPmlvLnNpcl9iYXNlKTsKKworCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLnNpcl9iYXNlLCBzZWxmLT5pby5zaXJfZXh0KTsKKworCWlmIChzZWxmLT50eF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKwkKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkKQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CisKKwlmcmVlX25ldGRldihzZWxmLT5uZXRkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbXNjX2lyY2NfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlmb3IgKGk9MDsgaSA8IDI7IGkrKykgeworCQlpZiAoZGV2X3NlbGZbaV0pCisJCQlzbXNjX2lyY2NfY2xvc2UoZGV2X3NlbGZbaV0pOworCX0KK30KKworLyoKKyAqCVN0YXJ0IFNJUiBvcGVyYXRpb25zCisgKgorICogVGhpcyBmdW5jdGlvbiAqbXVzdCogYmUgY2FsbGVkIHdpdGggc3BpbmxvY2sgaGVsZCwgYmVjYXVzZSBpdCBtYXkKKyAqIGJlIGNhbGxlZCBmcm9tIHRoZSBpcnEgaGFuZGxlciAodmlhIHNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoKSkuIC0gSmVhbiBJSQorICovCit2b2lkIHNtc2NfaXJjY19zaXJfc3RhcnQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBmaXJfYmFzZSwgc2lyX2Jhc2U7CisKKwlJUkRBX0RFQlVHKDMsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CQorCWRldj0gc2VsZi0+bmV0ZGV2OworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm47KTsJCQorCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnNtc2NfaXJjY19oYXJkX3htaXRfc2lyOworCisJZmlyX2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlzaXJfYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogUmVzZXQgZXZlcnl0aGluZyAqLworCW91dGIoSVJDQ19NQVNURVJfUkVTRVQsIGZpcl9iYXNlK0lSQ0NfTUFTVEVSKTsKKworCSNpZiBTTVNDX0lSQ0MyX0NfU0lSX1NUT1AKKwkvKnNtc2NfaXJjY19zaXJfc3RvcChzZWxmKTsqLworCSNlbmRpZgorCisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMSk7CisJb3V0YigoKGluYihmaXJfYmFzZStJUkNDX1NDRV9DRkdBKSAmIElSQ0NfU0NFX0NGR0FfQkxPQ0tfQ1RSTF9CSVRTX01BU0spIHwgSVJDQ19DRkdBX0lSREFfU0lSX0EpLCBmaXJfYmFzZStJUkNDX1NDRV9DRkdBKTsKKworCS8qIEluaXRpYWxpemUgVUFSVCAqLworCW91dGIoVUFSVF9MQ1JfV0xFTjgsIHNpcl9iYXNlK1VBUlRfTENSKTsgIC8qIFJlc2V0IERMQUIgKi8KKwlvdXRiKChVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyKSwgc2lyX2Jhc2UrVUFSVF9NQ1IpOworCQorCS8qIFR1cm4gb24gaW50ZXJydXBzICovCisJb3V0YihVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJIHxVQVJUX0lFUl9USFJJLCBzaXJfYmFzZStVQVJUX0lFUik7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpIC0gZXhpdFxuIiwgX19GVU5DVElPTl9fKTsKKworCW91dGIoMHgwMCwgZmlyX2Jhc2UrSVJDQ19NQVNURVIpOworfQorCisjaWYgU01TQ19JUkNDMl9DX1NJUl9TVE9QCit2b2lkIHNtc2NfaXJjY19zaXJfc3RvcChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisKKwlJUkRBX0RFQlVHKDMsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qIFJlc2V0IFVBUlQgKi8KKwlvdXRiKDAsIGlvYmFzZStVQVJUX01DUik7CisJCisJLyogVHVybiBvZmYgaW50ZXJydXB0cyAqLworCW91dGIoMCwgaW9iYXNlK1VBUlRfSUVSKTsKK30KKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gc21zY19zaXJfd3JpdGVfd2FrZXVwIChzZWxmKQorICoKKyAqICAgIENhbGxlZCBieSB0aGUgU0lSIGludGVycnVwdCBoYW5kbGVyIHdoZW4gdGhlcmUncyByb29tIGZvciBtb3JlIGRhdGEuCisgKiAgICBJZiB3ZSBoYXZlIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfd3JpdGVfd2FrZXVwKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGFjdHVhbCA9IDA7CisJaW50IGlvYmFzZTsKKwlpbnQgZmNyOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCUlSREFfREVCVUcoNCwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBGaW5pc2hlZCB3aXRoIGZyYW1lPyAgKi8KKwlpZiAoc2VsZi0+dHhfYnVmZi5sZW4gPiAwKSAgeworCQkvKiBXcml0ZSBkYXRhIGxlZnQgaW4gdHJhbnNtaXQgYnVmZmVyICovCisJCWFjdHVhbCA9IHNtc2NfaXJjY19zaXJfd3JpdGUoaW9iYXNlLCBzZWxmLT5pby5maWZvX3NpemUsIAorCQkJCSAgICAgIHNlbGYtPnR4X2J1ZmYuZGF0YSwgc2VsZi0+dHhfYnVmZi5sZW4pOworCQlzZWxmLT50eF9idWZmLmRhdGEgKz0gYWN0dWFsOworCQlzZWxmLT50eF9idWZmLmxlbiAgLT0gYWN0dWFsOworCX0gZWxzZSB7CisJCisJLyppZiAoc2VsZi0+dHhfYnVmZi5sZW4gPT0wKSAgeyovCisJCQorCQkvKiAKKwkJICogIE5vdyBzZXJpYWwgYnVmZmVyIGlzIGFsbW9zdCBmcmVlICYgd2UgY2FuIHN0YXJ0IAorCQkgKiAgdHJhbnNtaXNzaW9uIG9mIGFub3RoZXIgcGFja2V0LiBCdXQgZmlyc3Qgd2UgbXVzdCBjaGVjaworCQkgKiAgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBoYXJkd2FyZQorCQkgKi8KKwkJaWYgKHNlbGYtPm5ld19zcGVlZCkgeworCQkJSVJEQV9ERUJVRyg1LCAiJXMoKSwgQ2hhbmdpbmcgc3BlZWQgdG8gJWQuXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+bmV3X3NwZWVkKTsKKwkJCXNtc2NfaXJjY19zaXJfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2goc2VsZik7CisJCQlzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPm5ld19zcGVlZCk7CisJCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCQl9IGVsc2UgeworCQkJLyogVGVsbCBuZXR3b3JrIGxheWVyIHRoYXQgd2Ugd2FudCBtb3JlIGZyYW1lcyAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQl9CisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCQlpZihzZWxmLT5pby5zcGVlZCA8PSAxMTUyMDApIHsKKwkJLyogCisJCSAqIFJlc2V0IFJ4IEZJRk8gdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHJlZmxlY3RlZCB0cmFuc21pdCBkYXRhCisJCSAqIGlzIGRpc2NhcmRlZC4gVGhpcyBpcyBuZWVkZWQgZm9yIGhhbGYgZHVwbGV4IG9wZXJhdGlvbgorCQkgKi8KKwkJZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfCBVQVJUX0ZDUl9DTEVBUl9SQ1ZSOworCQlpZiAoc2VsZi0+aW8uc3BlZWQgPCAzODQwMCkKKwkJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE7CisJCWVsc2UgCisJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xNDsKKworCQlvdXRiKGZjciwgaW9iYXNlK1VBUlRfRkNSKTsKKworCQkvKiBUdXJuIG9uIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCQlvdXRiKFVBUlRfSUVSX1JESSwgaW9iYXNlK1VBUlRfSUVSKTsKKwkJfQorCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zaXJfd3JpdGUgKGlvYmFzZSwgZmlmb19zaXplLCBidWYsIGxlbikKKyAqCisgKiAgICBGaWxsIFR4IEZJRk8gd2l0aCB0cmFuc21pdCBkYXRhCisgKgorICovCitzdGF0aWMgaW50IHNtc2NfaXJjY19zaXJfd3JpdGUoaW50IGlvYmFzZSwgaW50IGZpZm9fc2l6ZSwgX191OCAqYnVmLCBpbnQgbGVuKQoreworCWludCBhY3R1YWwgPSAwOworCQorCS8qIFR4IEZJRk8gc2hvdWxkIGJlIGVtcHR5ISAqLworCWlmICghKGluYihpb2Jhc2UrVUFSVF9MU1IpICYgVUFSVF9MU1JfVEhSRSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBmYWlsZWQsIGZpZm8gbm90IGVtcHR5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CisJfQorICAgICAgICAKKwkvKiBGaWxsIEZJRk8gd2l0aCBjdXJyZW50IGZyYW1lICovCisJd2hpbGUgKChmaWZvX3NpemUtLSA+IDApICYmIChhY3R1YWwgPCBsZW4pKSB7CisJCS8qIFRyYW5zbWl0IG5leHQgYnl0ZSAqLworCQlvdXRiKGJ1ZlthY3R1YWxdLCBpb2Jhc2UrVUFSVF9UWCk7CisJCWFjdHVhbCsrOworCX0KKwlyZXR1cm4gYWN0dWFsOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2lzX3JlY2VpdmluZyAoc2VsZikKKyAqCisgKiAgICBSZXR1cm5zIHRydWUgaXMgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgZGF0YQorICoKKyAqLworc3RhdGljIGludCBzbXNjX2lyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJcmV0dXJuIChzZWxmLT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUUpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXIoc2VsZikKKyAqCisgKiAgICBUcmllcyB0byBmaW5kIHRoZSB1c2VkIFRyYW5zY2VpdmVyCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXIoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwl1bnNpZ25lZCBpbnQJaTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCQorCWZvcihpPTA7IHNtc2NfdHJhbnNjZWl2ZXJzW2ldLm5hbWUhPU5VTEw7IGkrKykgCisJCWlmKCgqc21zY190cmFuc2NlaXZlcnNbaV0ucHJvYmUpKHNlbGYtPmlvLmZpcl9iYXNlKSkgeworCQkJSVJEQV9NRVNTQUdFKCIgJXMgdHJhbnNjZWl2ZXIgZm91bmRcbiIsCisJCQkJICAgICBzbXNjX3RyYW5zY2VpdmVyc1tpXS5uYW1lKTsKKwkJCXNlbGYtPnRyYW5zY2VpdmVyPSBpKzE7CisJCQlyZXR1cm47CisJCX0KKwlJUkRBX01FU1NBR0UoIk5vIHRyYW5zY2VpdmVyIGZvdW5kLiBEZWZhdWx0aW5nIHRvICVzXG4iLAorCQkgICAgIHNtc2NfdHJhbnNjZWl2ZXJzW1NNU0NfSVJDQzJfQ19ERUZBVUxUX1RSQU5TQ0VJVkVSXS5uYW1lKTsKKwkJCQorCXNlbGYtPnRyYW5zY2VpdmVyPSBTTVNDX0lSQ0MyX0NfREVGQVVMVF9UUkFOU0NFSVZFUjsKK30KKworCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9mb3Jfc3BlZWQoc2VsZiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSB0cmFuc2NlaXZlciBhY2NvcmRpbmcgdG8gdGhlIHNwZWVkCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX2Zvcl9zcGVlZChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCB1MzIgc3BlZWQpCit7CisJdW5zaWduZWQgaW50IHRyeDsKKwkKKwl0cnggPSBzZWxmLT50cmFuc2NlaXZlcjsKKwlpZih0cng+MCkgKCpzbXNjX3RyYW5zY2VpdmVyc1t0cngtMV0uc2V0X2Zvcl9zcGVlZCkoc2VsZi0+aW8uZmlyX2Jhc2UsIHNwZWVkKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY193YWl0X2h3X3RyYW5zbWl0dGVyX2ZpbmlzaCAoKQorICoKKyAqICAgIFdhaXQgZm9yIHRoZSByZWFsIGVuZCBvZiBIVyB0cmFuc21pc3Npb24KKyAqCisgKiBUaGUgVUFSVCBpcyBhIHN0cmljdCBGSUZPLCBhbmQgd2UgZ2V0IGNhbGxlZCBvbmx5IHdoZW4gd2UgaGF2ZSBmaW5pc2hlZAorICogcHVzaGluZyBkYXRhIHRvIHRoZSBGSUZPLCBzbyB0aGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB3ZSBtdXN0IHdhaXQKKyAqIGlzIG9ubHkgZm9yIHRoZSBGSUZPIHRvIGRyYWluIG91dC4KKyAqCisgKiBXZSB1c2UgYSBzaW1wbGUgY2FsaWJyYXRlZCBsb29wLiBXZSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlIGxvb3AKKyAqIGRlbGF5ICh1ZGVsYXkpIHRvIGJhbGFuY2UgSS9PIHRyYWZmaWMgYW5kIGxhdGVuY3kuIEFuZCB3ZSBhbHNvIG5lZWQgdG8KKyAqIGFkanVzdCB0aGUgbWF4aW11bSB0aW1lb3V0LgorICogSXQgd291bGQgcHJvYmFibHkgYmUgYmV0dGVyIHRvIHdhaXQgZm9yIHRoZSBwcm9wZXIgaW50ZXJydXB0LAorICogYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBhdmFpbGFibGUuCisgKgorICogV2UgY2FuJ3QgdXNlIGppZmZpZXMgb3Iga2VybmVsIHRpbWVycyBiZWNhdXNlIDoKKyAqIDEpIFdlIGFyZSBjYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIGRpc2FibGUgc29mdGlycXMsCisgKiBzbyBqaWZmaWVzIHdvbid0IGJlIGluY3JlYXNlZAorICogMikgSmlmZmllcyBncmFudWxhcml0eSBpcyB1c3VhbGx5IHZlcnkgY29hcnNlICgxMG1zKSwgYW5kIHdlIGRvbid0CisgKiB3YW50IHRvIHdhaXQgdGhhdCBsb25nIHRvIGRldGVjdCBzdHVjayBoYXJkd2FyZS4KKyAqIEplYW4gSUkKKyAqLworCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3dhaXRfaHdfdHJhbnNtaXR0ZXJfZmluaXNoKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKwlpbnQgY291bnQgPSBTTVNDX0lSQ0MyX0hXX1RSQU5TTUlUVEVSX1RJTUVPVVRfVVM7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisJCisJLyogQ2FsaWJyYXRlZCBidXN5IGxvb3AgKi8KKwl3aGlsZSgoY291bnQtLSA+IDApICYmICEoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkKKwkJdWRlbGF5KDEpOworCisJaWYoY291bnQgPT0gMCkKKwkJSVJEQV9ERUJVRygwLCAiJXMoKTogc3R1Y2sgdHJhbnNtaXR0ZXJcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKworLyogUFJPQklORworICoKKyAqCisgKi8KKworc3RhdGljIGludCBfX2luaXQgc21zY19pcmNjX2xvb2tfZm9yX2NoaXBzKHZvaWQpCit7CisJc21zY19jaGlwX2FkZHJlc3NfdCAqYWRkcmVzczsKKwljaGFyCSp0eXBlOworCXVuc2lnbmVkIGludCBjZmdfYmFzZSwgZm91bmQ7CisJCisJZm91bmQgPSAwOworCWFkZHJlc3MgPSBwb3NzaWJsZV9hZGRyZXNzZXM7CisJCisJd2hpbGUoYWRkcmVzcy0+Y2ZnX2Jhc2UpeworCQljZmdfYmFzZSA9IGFkZHJlc3MtPmNmZ19iYXNlOworCQkKKwkJLypwcmludGsoS0VSTl9XQVJOSU5HICIlcygpOiBwcm9iaW5nOiAweCUwMnggZm9yOiAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgY2ZnX2Jhc2UsIGFkZHJlc3MtPnR5cGUpOyovCisJCQorCQlpZiggYWRkcmVzcy0+dHlwZSAmIFNNU0NTSU9fVFlQRV9GREMpeworCQkJdHlwZSA9ICJGREMiOworCQkJaWYoKGFkZHJlc3MtPnR5cGUpICYgU01TQ1NJT19UWVBFX0ZMQVQpIHsKKwkJCQlpZighc21zY19zdXBlcmlvX2ZsYXQoZmRjX2NoaXBzX2ZsYXQsY2ZnX2Jhc2UsIHR5cGUpKSBmb3VuZCsrOworCQkJfQorCQkJaWYoKGFkZHJlc3MtPnR5cGUpICYgU01TQ1NJT19UWVBFX1BBR0VEKSB7CisJCQkJaWYoIXNtc2Nfc3VwZXJpb19wYWdlZChmZGNfY2hpcHNfcGFnZWQsY2ZnX2Jhc2UsIHR5cGUpKSBmb3VuZCsrOwkJCisJCQl9CQkJCisJCX0KKwkJaWYoIGFkZHJlc3MtPnR5cGUgJiBTTVNDU0lPX1RZUEVfTFBDKXsKKwkJCXR5cGUgPSAiTFBDIjsKKwkJCWlmKChhZGRyZXNzLT50eXBlKSAmIFNNU0NTSU9fVFlQRV9GTEFUKSB7CisJCQkJaWYoIXNtc2Nfc3VwZXJpb19mbGF0KGxwY19jaGlwc19mbGF0LGNmZ19iYXNlLHR5cGUpKSBmb3VuZCsrOworCQkJfQorCQkJaWYoKGFkZHJlc3MtPnR5cGUpICYgU01TQ1NJT19UWVBFX1BBR0VEKSB7CisJCQkJaWYoIXNtc2Nfc3VwZXJpb19wYWdlZChscGNfY2hpcHNfcGFnZWQsY2ZnX2Jhc2UsIkxQQyIpKSBmb3VuZCsrOwkJCisJCQl9CQkJCisJCX0KKwkJYWRkcmVzcysrOworCX0KKwlyZXR1cm4gZm91bmQ7Cit9IAorCisvKgorICogRnVuY3Rpb24gc21zY19zdXBlcmlvX2ZsYXQgKGNoaXAsIGJhc2UsIHR5cGUpCisgKgorICogICAgVHJ5IHRvIGdldCBjb25maWd1cmF0aW9uIG9mIGEgc21jIFN1cGVySU8gY2hpcCB3aXRoIGZsYXQgcmVnaXN0ZXIgbW9kZWwKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19mbGF0KGNvbnN0IHNtc2NfY2hpcF90ICpjaGlwcywgdW5zaWduZWQgc2hvcnQgY2ZnYmFzZSwgY2hhciAqdHlwZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBmaXJiYXNlLCBzaXJiYXNlOworCXU4IG1vZGUsIGRtYSwgaXJxOworCWludCByZXQgPSAtRU5PREVWOworCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoc21zY19pcmNjX3Byb2JlKGNmZ2Jhc2UsIFNNU0NTSU9GTEFUX0RFVklDRUlEX1JFRywgY2hpcHMsIHR5cGUpPT1OVUxMKQorCQlyZXR1cm4gcmV0OworCisJb3V0YihTTVNDU0lPRkxBVF9VQVJUTU9ERTBDX1JFRywgY2ZnYmFzZSk7CisJbW9kZSA9IGluYihjZmdiYXNlKzEpOworCQorCS8qcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKTogbW9kZTogMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIG1vZGUpOyovCisJCisJaWYoIShtb2RlICYgU01TQ1NJT0ZMQVRfVUFSVDJNT0RFX1ZBTF9JUkRBKSkKKwkJSVJEQV9XQVJOSU5HKCIlcygpOiBJckRBIG5vdCBlbmFibGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCisJb3V0YihTTVNDU0lPRkxBVF9VQVJUMkJBU0VBRERSX1JFRywgY2ZnYmFzZSk7CisJc2lyYmFzZSA9IGluYihjZmdiYXNlKzEpIDw8IDI7CisKKyAgIAkvKiBGSVIgaW9iYXNlICovCisJb3V0YihTTVNDU0lPRkxBVF9GSVJCQVNFQUREUl9SRUcsIGNmZ2Jhc2UpOworCWZpcmJhc2UgPSBpbmIoY2ZnYmFzZSsxKSA8PCAzOworCisJLyogRE1BICovCisJb3V0YihTTVNDU0lPRkxBVF9GSVJETUFTRUxFQ1RfUkVHLCBjZmdiYXNlKTsKKwlkbWEgPSBpbmIoY2ZnYmFzZSsxKSAmIFNNU0NTSU9GTEFUX0ZJUkRNQVNFTEVDVF9NQVNLOworCQorCS8qIElSUSAqLworCW91dGIoU01TQ1NJT0ZMQVRfVUFSVElSUVNFTEVDVF9SRUcsIGNmZ2Jhc2UpOworCWlycSA9IGluYihjZmdiYXNlKzEpICYgU01TQ1NJT0ZMQVRfVUFSVDJJUlFTRUxFQ1RfTUFTSzsKKworCUlSREFfTUVTU0FHRSgiJXMoKTogZmlyOiAweCUwMngsIHNpcjogMHglMDJ4LCBkbWE6ICUwMmQsIGlycTogJWQsIG1vZGU6IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fLCBmaXJiYXNlLCBzaXJiYXNlLCBkbWEsIGlycSwgbW9kZSk7CisKKwlpZiAoZmlyYmFzZSkgeworCQlpZiAoc21zY19pcmNjX29wZW4oZmlyYmFzZSwgc2lyYmFzZSwgZG1hLCBpcnEpID09IDApCisJCQlyZXQ9MDsgCisJfQorCQorCS8qIEV4aXQgY29uZmlndXJhdGlvbiAqLworCW91dGIoU01TQ1NJT19DRkdFWElUS0VZLCBjZmdiYXNlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX3N1cGVyaW9fcGFnZWQgKGNoaXAsIGJhc2UsIHR5cGUpCisgKgorICogICAgVHJ5ICB0byBnZXQgY29uZmlndXJhdGlvbiBvZiBhIHNtYyBTdXBlcklPIGNoaXAgd2l0aCBwYWdlZCByZWdpc3RlciBtb2RlbAorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX3BhZ2VkKGNvbnN0IHNtc2NfY2hpcF90ICpjaGlwcywgdW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsIGNoYXIgKnR5cGUpCit7CisJdW5zaWduZWQgc2hvcnQgZmlyX2lvLCBzaXJfaW87CisJaW50IHJldCA9IC1FTk9ERVY7CisJCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoc21zY19pcmNjX3Byb2JlKGNmZ19iYXNlLDB4MjAsY2hpcHMsdHlwZSk9PU5VTEwpCisJCXJldHVybiByZXQ7CisJCisJLyogU2VsZWN0IGxvZ2ljYWwgZGV2aWNlIChVQVJUMikgKi8KKwlvdXRiKDB4MDcsIGNmZ19iYXNlKTsKKwlvdXRiKDB4MDUsIGNmZ19iYXNlICsgMSk7CisJCQorCS8qIFNJUiBpb2Jhc2UgKi8KKwlvdXRiKDB4NjAsIGNmZ19iYXNlKTsKKwlzaXJfaW8gID0gaW5iKGNmZ19iYXNlICsgMSkgPDwgODsKKwlvdXRiKDB4NjEsIGNmZ19iYXNlKTsKKwlzaXJfaW8gfD0gaW5iKGNmZ19iYXNlICsgMSk7CisJCQorCS8qIFJlYWQgRklSIGJhc2UgKi8KKwlvdXRiKDB4NjIsIGNmZ19iYXNlKTsKKwlmaXJfaW8gPSBpbmIoY2ZnX2Jhc2UgKyAxKSA8PCA4OworCW91dGIoMHg2MywgY2ZnX2Jhc2UpOworCWZpcl9pbyB8PSBpbmIoY2ZnX2Jhc2UgKyAxKTsKKwlvdXRiKDB4MmIsIGNmZ19iYXNlKTsgLyogPz8/ICovCisKKwlpZiAoZmlyX2lvKSB7CisJCWlmIChzbXNjX2lyY2Nfb3BlbihmaXJfaW8sIHNpcl9pbywgaXJjY19kbWEsIGlyY2NfaXJxKSA9PSAwKQorCQkJcmV0PTA7IAorCX0KKwkKKwkvKiBFeGl0IGNvbmZpZ3VyYXRpb24gKi8KKwlvdXRiKFNNU0NTSU9fQ0ZHRVhJVEtFWSwgY2ZnX2Jhc2UpOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX2FjY2Vzcyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSx1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCW91dGIocmVnLCBjZmdfYmFzZSk7CisKKwlpZiAoaW5iKGNmZ19iYXNlKSE9cmVnKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHNtc2NfY2hpcF90ICogX19pbml0IHNtc2NfaXJjY19wcm9iZSh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSx1OCByZWcsY29uc3Qgc21zY19jaGlwX3QgKmNoaXAsY2hhciAqdHlwZSkKK3sKKwl1OCBkZXZpZCx4ZGV2aWQscmV2OyAKKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogTGVhdmUgY29uZmlndXJhdGlvbiAqLworCisJb3V0YihTTVNDU0lPX0NGR0VYSVRLRVksIGNmZ19iYXNlKTsKKworCWlmIChpbmIoY2ZnX2Jhc2UpID09IFNNU0NTSU9fQ0ZHRVhJVEtFWSkJLyogbm90IGEgc21jIHN1cGVyaW8gY2hpcCAqLworCQlyZXR1cm4gTlVMTDsKKworCW91dGIocmVnLCBjZmdfYmFzZSk7CisKKwl4ZGV2aWQ9aW5iKGNmZ19iYXNlKzEpOworCisJLyogRW50ZXIgY29uZmlndXJhdGlvbiAqLworCisJb3V0YihTTVNDU0lPX0NGR0FDQ0VTU0tFWSwgY2ZnX2Jhc2UpOworCisJI2lmIDAKKwlpZiAoc21zY19hY2Nlc3MoY2ZnX2Jhc2UsMHg1NSkpCS8qIHNlbmQgc2Vjb25kIGtleSBhbmQgY2hlY2sgKi8KKwkJcmV0dXJuIE5VTEw7CisJI2VuZGlmCisJCisJLyogcHJvYmUgZGV2aWNlIElEICovCisKKwlpZiAoc21zY19hY2Nlc3MoY2ZnX2Jhc2UscmVnKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXZpZD1pbmIoY2ZnX2Jhc2UrMSk7CisJCisJaWYgKGRldmlkPT0wKQkJCS8qIHR5cGljYWwgdmFsdWUgZm9yIHVudXNlZCBwb3J0ICovCisJCXJldHVybiBOVUxMOworCisJaWYgKGRldmlkPT0weGZmKQkJLyogdHlwaWNhbCB2YWx1ZSBmb3IgdW51c2VkIHBvcnQgKi8KKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBwcm9iZSByZXZpc2lvbiBJRCAqLworCisJaWYgKHNtc2NfYWNjZXNzKGNmZ19iYXNlLHJlZysxKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXY9aW5iKGNmZ19iYXNlKzEpOworCisJaWYgKHJldj49MTI4KQkJCS8qIGkgdGhpbmsgdGhpcyB3aWxsIG1ha2Ugbm8gc2Vuc2UgKi8KKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZGV2aWQ9PXhkZXZpZCkJCS8qIHByb3RlY3Rpb24gYWdhaW5zdCBmYWxzZSBwb3NpdGl2ZXMgKi8gICAgICAgIAorCQlyZXR1cm4gTlVMTDsKKworCS8qIENoZWNrIGZvciBleHBlY3RlZCBkZXZpY2UgSUQ7IGFyZSB0aGVyZSBvdGhlcnM/ICovCisKKwl3aGlsZShjaGlwLT5kZXZpZCE9ZGV2aWQpIHsKKworCQljaGlwKys7CisKKwkJaWYgKGNoaXAtPm5hbWU9PU5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlJUkRBX01FU1NBR0UoImZvdW5kIFNNQyBTdXBlcklPIENoaXAgKGRldmlkPTB4JTAyeCByZXY9JTAyWCBiYXNlPTB4JTA0eCk6ICVzJXNcbiIsZGV2aWQscmV2LGNmZ19iYXNlLHR5cGUsY2hpcC0+bmFtZSk7CisKKwlpZiAoY2hpcC0+cmV2PnJldil7CisJCUlSREFfTUVTU0FHRSgiUmV2aXNpb24gaGlnaGVyIHRoYW4gZXhwZWN0ZWRcbiIpOwkKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCWlmIChjaGlwLT5mbGFncyZOb0lSREEpCisJCUlSREFfTUVTU0FHRSgiY2hpcHNldCBkb2VzIG5vdCBzdXBwb3J0IElSREFcbiIpOworCisJcmV0dXJuIGNoaXA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19mZGModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UpCit7CisJaW50IHJldCA9IC0xOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihjZmdfYmFzZSwgMiwgZHJpdmVyX25hbWUpKSB7CisJCUlSREFfV0FSTklORygiJXM6IGNhbid0IGdldCBjZmdfYmFzZSBvZiAweCUwM3hcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgY2ZnX2Jhc2UpOworCX0gZWxzZSB7CisJCWlmICghc21zY19zdXBlcmlvX2ZsYXQoZmRjX2NoaXBzX2ZsYXQsY2ZnX2Jhc2UsIkZEQyIpCisJCSAgICB8fCFzbXNjX3N1cGVyaW9fcGFnZWQoZmRjX2NoaXBzX3BhZ2VkLGNmZ19iYXNlLCJGREMiKSkKKwkJCXJldCA9ICAwOworCisJCXJlbGVhc2VfcmVnaW9uKGNmZ19iYXNlLCAyKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fbHBjKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlKQoreworCWludCByZXQgPSAtMTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oY2ZnX2Jhc2UsIDIsIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBjYW4ndCBnZXQgY2ZnX2Jhc2Ugb2YgMHglMDN4XG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIGNmZ19iYXNlKTsKKwl9IGVsc2UgeworCQlpZiAoIXNtc2Nfc3VwZXJpb19mbGF0KGxwY19jaGlwc19mbGF0LGNmZ19iYXNlLCJMUEMiKQorCQkgICAgfHwhc21zY19zdXBlcmlvX3BhZ2VkKGxwY19jaGlwc19wYWdlZCxjZmdfYmFzZSwiTFBDIikpCisJCQlyZXQgPSAwOworCQlyZWxlYXNlX3JlZ2lvbihjZmdfYmFzZSwgMik7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUcmFuc2NlaXZlcnMgc3BlY2lmaWMgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjKGZpcl9iYXNlLCBzcGVlZCkKKyAqCisgKiAgICBQcm9ncmFtIHRyYW5zY2VpdmVyIHRocm91Z2ggc21zYy1pcmNjIEFUQyBjaXJjdWl0cnkKKyAqCisgKi8KKworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjKGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKQoreworCXVuc2lnbmVkIGxvbmcgamlmZmllc19ub3csIGppZmZpZXNfdGltZW91dDsKKwl1OAl2YWw7CisJCisJamlmZmllc19ub3c9IGppZmZpZXM7CisJamlmZmllc190aW1lb3V0PSBqaWZmaWVzK1NNU0NfSVJDQzJfQVRDX1BST0dSQU1NSU5HX1RJTUVPVVRfSklGRklFUzsKKwkKKwkvKiBBVEMgKi8KKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCA0KTsKKwlvdXRiKChpbmIoZmlyX2Jhc2UrSVJDQ19BVEMpICYgSVJDQ19BVENfTUFTSykgfElSQ0NfQVRDX25QUk9HUkVBRFl8SVJDQ19BVENfRU5BQkxFLCBmaXJfYmFzZStJUkNDX0FUQyk7CisJd2hpbGUoKHZhbD0oaW5iKGZpcl9iYXNlK0lSQ0NfQVRDKSAmIElSQ0NfQVRDX25QUk9HUkVBRFkpKSAmJiAhdGltZV9hZnRlcihqaWZmaWVzLCBqaWZmaWVzX3RpbWVvdXQpKTsKKwlpZih2YWwpCisJCUlSREFfV0FSTklORygiJXMoKTogQVRDOiAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgaW5iKGZpcl9iYXNlK0lSQ0NfQVRDKSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0YyhmaXJfYmFzZSkKKyAqCisgKiAgICBQcm9iZSB0cmFuc2NlaXZlciBzbXNjLWlyY2MgQVRDIGNpcmN1aXRyeQorICoKKyAqLworCitzdGF0aWMgaW50IHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfYXRjKGludCBmaXJfYmFzZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdChzZWxmLCBzcGVlZCkKKyAqCisgKiAgICBTZXQgdHJhbnNjZWl2ZXIgCisgKgorICovCisKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdChpbnQgZmlyX2Jhc2UsIHUzMiBzcGVlZCkKK3sKKwl1OAlmYXN0X21vZGU7CisJCisJc3dpdGNoKHNwZWVkKQorCXsKKwkJZGVmYXVsdDoKKwkJY2FzZSA1NzYwMDAgOgorCQlmYXN0X21vZGUgPSAwOyAKKwkJYnJlYWs7CisJCWNhc2UgMTE1MjAwMCA6CisJCWNhc2UgNDAwMDAwMCA6CisJCWZhc3RfbW9kZSA9IElSQ0NfTENSX0FfRkFTVDsKKwkJYnJlYWs7CisJCQorCX0KKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAwKTsKKwlvdXRiKChpbmIoZmlyX2Jhc2UrSVJDQ19MQ1JfQSkgJiAgMHhiZikgfCBmYXN0X21vZGUsIGZpcl9iYXNlK0lSQ0NfTENSX0EpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3QoZmlyX2Jhc2UpCisgKgorICogICAgUHJvYmUgdHJhbnNjZWl2ZXIgCisgKgorICovCisKK3N0YXRpYyBpbnQgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3QoaW50IGZpcl9iYXNlKQoreworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAoZmlyX2Jhc2UsIHNwZWVkKQorICoKKyAqICAgIFNldCB0cmFuc2NlaXZlciAKKyAqCisgKi8KKworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAoaW50IGZpcl9iYXNlLCB1MzIgc3BlZWQpCit7CisJdTgJZmFzdF9tb2RlOworCQorCXN3aXRjaChzcGVlZCkKKwl7CisJCWRlZmF1bHQ6CisJCWNhc2UgNTc2MDAwIDoKKwkJZmFzdF9tb2RlID0gMDsgCisJCWJyZWFrOworCQljYXNlIDExNTIwMDAgOgorCQljYXNlIDQwMDAwMDAgOgorCQlmYXN0X21vZGUgPSAvKklSQ0NfTENSX0FfRkFTVCB8Ki8gSVJDQ19MQ1JfQV9HUF9EQVRBOworCQlicmVhazsKKwkJCisJfQorCS8qIFRoaXMgY2F1c2VzIGFuIGludGVycnVwdCAqLworCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDApOworCW91dGIoKGluYihmaXJfYmFzZStJUkNDX0xDUl9BKSAmICAweGJmKSB8IGZhc3RfbW9kZSwgZmlyX2Jhc2UrSVJDQ19MQ1JfQSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwKGZpcl9iYXNlKQorICoKKyAqICAgIFByb2JlIHRyYW5zY2VpdmVyIAorICoKKyAqLworCitzdGF0aWMgaW50IHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAoaW50IGZpcl9iYXNlKQoreworCXJldHVybiAwOworfQorCisKK21vZHVsZV9pbml0KHNtc2NfaXJjY19pbml0KTsKK21vZHVsZV9leGl0KHNtc2NfaXJjY19jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiRGFuaWVsZSBQZXJpIDxwZXJpQGNzYWkudW5pcGEuaXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNNQyBJckNDIFNJUi9GSVIgY29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGlyY2NfZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX2RtYSwgIkRNQSBjaGFubmVsIik7Cittb2R1bGVfcGFyYW0oaXJjY19pcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyY2NfaXJxLCAiSVJRIGxpbmUiKTsKK21vZHVsZV9wYXJhbShpcmNjX2ZpciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJjY19maXIsICJGSVIgQmFzZSBBZGRyZXNzIik7Cittb2R1bGVfcGFyYW0oaXJjY19zaXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyY2Nfc2lyLCAiU0lSIEJhc2UgQWRkcmVzcyIpOworbW9kdWxlX3BhcmFtKGlyY2NfY2ZnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX2NmZywgIkNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIik7Cittb2R1bGVfcGFyYW0oaXJjY190cmFuc2NlaXZlciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJjY190cmFuc2NlaXZlciwgIlRyYW5zY2VpdmVyIHR5cGUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5oIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4NjExYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5oCkBAIC0wLDAgKzEsMTk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAkSWQ6IHNtc2MtaXJjYzIuaCx2IDEuMTIuMi4xIDIwMDIvMTAvMjcgMTA6NTI6MzcgZGlwIEV4cCAkICAgICAgICAgICAgICAgCisgKgorICogRGVzY3JpcHRpb246ICAgRGVmaW5pdGlvbnMgZm9yIHRoZSBTTUMgSXJDQyBjaGlwc2V0CisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYW5pZWxlIFBlcmkgKHBlcmlAY3NhaS51bmlwYS5pdCkKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyICAgICAgRGFuaWVsZSBQZXJpCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBCYXNlZCBvbiBzbWMtaXJjYy5oOgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAsIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSwgVGhvbWFzIERhdmlzICh0YWRhdmlzQGpwcy5uZXQ+CisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNNU0NfSVJDQzJfSAorI2RlZmluZSBTTVNDX0lSQ0MyX0gKKworLyogRE1BIG1vZGVzIG5lZWRlZCAqLworI2RlZmluZSBETUFfVFhfTU9ERSAgICAgICAgICAgICAgICAweDA4ICAgIC8qIE1lbSB0byBJL08sICsrLCBkZW1hbmQuICovCisjZGVmaW5lIERNQV9SWF9NT0RFICAgICAgICAgICAgICAgIDB4MDQgICAgLyogSS9PIHRvIG1lbSwgKyssIGRlbWFuZC4gKi8KKworLyogTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVJDQ19NQVNURVIgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSAgIElSQ0NfTUFTVEVSX1BPV0VSRE9XTgkgICAweDgwCisjZGVmaW5lICAgSVJDQ19NQVNURVJfUkVTRVQgICAgICAgIDB4NDAKKyNkZWZpbmUgICBJUkNDX01BU1RFUl9JTlRfRU4gICAgICAgMHgyMAorI2RlZmluZSAgIElSQ0NfTUFTVEVSX0VSUk9SX1JFU0VUICAweDEwCisKKy8qIFJlZ2lzdGVyIGJsb2NrIDAgKi8KKworLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIElSQ0NfSUlSCQkJCQkweDAxCisjZGVmaW5lICAgSVJDQ19JSVJfQUNUSVZFX0ZSQU1FCQkweDgwCisjZGVmaW5lICAgSVJDQ19JSVJfRU9NCQkJCTB4NDAKKyNkZWZpbmUgICBJUkNDX0lJUl9SQVdfTU9ERQkJCTB4MjAKKyNkZWZpbmUgICBJUkNDX0lJUl9GSUZPCQkJCTB4MTAKKworLyogSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBJUkNDX0lFUgkJCQkJMHgwMgorI2RlZmluZSAgIElSQ0NfSUVSX0FDVElWRV9GUkFNRQkJMHg4MAorI2RlZmluZSAgIElSQ0NfSUVSX0VPTQkJCQkweDQwCisjZGVmaW5lICAgSVJDQ19JRVJfUkFXX01PREUJCQkweDIwCisjZGVmaW5lICAgSVJDQ19JRVJfRklGTwkJCQkweDEwCisKKy8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIElSQ0NfTFNSCQkJCQkweDAzCisjZGVmaW5lICAgSVJDQ19MU1JfVU5ERVJSVU4JCQkweDgwCisjZGVmaW5lICAgSVJDQ19MU1JfT1ZFUlJVTgkJCTB4NDAKKyNkZWZpbmUgICBJUkNDX0xTUl9GUkFNRV9FUlJPUgkJMHgyMAorI2RlZmluZSAgIElSQ0NfTFNSX1NJWkVfRVJST1IJCTB4MTAKKyNkZWZpbmUgICBJUkNDX0xTUl9DUkNfRVJST1IJCTB4ODAKKyNkZWZpbmUgICBJUkNDX0xTUl9GUkFNRV9BQk9SVAkJMHg0MAorCisvKiBMaW5lIFN0YXR1cyBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIElSQ0NfTFNBUgkJCQkJMHgwMworI2RlZmluZSBJUkNDX0xTQVJfQUREUkVTU19NQVNLCQkweDA3CisKKy8qIExpbmUgQ29udHJvbCBSZWdpc3RlciBBICovCisjZGVmaW5lIElSQ0NfTENSX0EgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgICBJUkNDX0xDUl9BX0ZJRk9fUkVTRVQgICAgMHg4MAorI2RlZmluZSAgIElSQ0NfTENSX0FfRkFTVCAgICAgICAgICAweDQwCisjZGVmaW5lICAgSVJDQ19MQ1JfQV9HUF9EQVRBICAgICAgIDB4MjAKKyNkZWZpbmUgICBJUkNDX0xDUl9BX1JBV19UWCAgICAgICAgMHgxMAorI2RlZmluZSAgIElSQ0NfTENSX0FfUkFXX1JYICAgICAgICAweDA4CisjZGVmaW5lICAgSVJDQ19MQ1JfQV9BQk9SVCAgICAgICAgIDB4MDQKKyNkZWZpbmUgICBJUkNDX0xDUl9BX0RBVEFfRE9ORSAgICAgMHgwMgorCisvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgQiAqLworI2RlZmluZSBJUkNDX0xDUl9CICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lICAgSVJDQ19MQ1JfQl9TQ0VfRElTQUJMRUQgIDB4MDAKKyNkZWZpbmUgICBJUkNDX0xDUl9CX1NDRV9UUkFOU01JVCAgMHg0MAorI2RlZmluZSAgIElSQ0NfTENSX0JfU0NFX1JFQ0VJVkUgICAweDgwCisjZGVmaW5lICAgSVJDQ19MQ1JfQl9TQ0VfVU5ERUZJTkVEIDB4YzAKKyNkZWZpbmUgICBJUkNDX0xDUl9CX1NJUF9FTkFCTEUJICAgMHgyMAorI2RlZmluZSAgIElSQ0NfTENSX0JfQlJJQ0tfV0FMTCAgICAweDEwCisKKy8qIEJ1cyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVJDQ19CU1IgICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSAgIElSQ0NfQlNSX05PVF9FTVBUWQkgICAweDgwCisjZGVmaW5lICAgSVJDQ19CU1JfRklGT19GVUxMCSAgIDB4NDAKKyNkZWZpbmUgICBJUkNDX0JTUl9USU1FT1VUCSAgIDB4MjAKKworLyogUmVnaXN0ZXIgYmxvY2sgMSAqLworCisjZGVmaW5lIElSQ0NfRklGT19USFJFU0hPTEQJCQkweDAyCisKKyNkZWZpbmUgSVJDQ19TQ0VfQ0ZHQQkJCQkweDAwCisjZGVmaW5lICAgSVJDQ19DRkdBX0FVWF9JUgkJCTB4ODAKKyNkZWZpbmUgICBJUkNDX0NGR0FfSEFMRl9EVVBMRVgJCTB4MDQKKyNkZWZpbmUgICBJUkNDX0NGR0FfVFhfUE9MQVJJVFkJCTB4MDIKKyNkZWZpbmUgICBJUkNDX0NGR0FfUlhfUE9MQVJJVFkJCTB4MDEKKworI2RlZmluZSAgIElSQ0NfQ0ZHQV9DT00JCQkJMHgwMAorI2RlZmluZQkJSVJDQ19TQ0VfQ0ZHQV9CTE9DS19DVFJMX0JJVFNfTUFTSwkweDg3CisjZGVmaW5lICAgCUlSQ0NfQ0ZHQV9JUkRBX1NJUl9BCTB4MDgKKyNkZWZpbmUgICAJSVJDQ19DRkdBX0FTS19TSVIJCTB4MTAKKyNkZWZpbmUgICAJSVJDQ19DRkdBX0lSREFfU0lSX0IJMHgxOAorI2RlZmluZSAgIAlJUkNDX0NGR0FfSVJEQV9IRExDCQkweDIwCisjZGVmaW5lCQlJUkNDX0NGR0FfSVJEQV80UFBNCQkweDI4CisjZGVmaW5lCQlJUkNDX0NGR0FfQ09OU1VNRVIJCTB4MzAKKyNkZWZpbmUJCUlSQ0NfQ0ZHQV9SQVdfSVIJCTB4MzgKKyNkZWZpbmUgICAgIElSQ0NfQ0ZHQV9PVEhFUgkJCTB4NDAKKworI2RlZmluZSBJUkNDX0lSX0hETEMgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIElSQ0NfSVJfNFBQTSAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgSVJDQ19JUl9DT05TVU1FUiAgICAgICAgICAgMHgwMgorCisjZGVmaW5lIElSQ0NfU0NFX0NGR0IJICAgICAgICAgICAweDAxCisjZGVmaW5lIElSQ0NfQ0ZHQl9MT09QQkFDSyAgICAgICAgIDB4MjAKKyNkZWZpbmUgSVJDQ19DRkdCX0xQQkNLX1RYX0NSQwkgICAweDEwCisjZGVmaW5lIElSQ0NfQ0ZHQl9OT1dBSVQJICAgMHgwOAorI2RlZmluZSBJUkNDX0NGR0JfU1RSSU5HX01PVkUJICAgMHgwNAorI2RlZmluZSBJUkNDX0NGR0JfRE1BX0JVUlNUIAkgICAweDAyCisjZGVmaW5lIElSQ0NfQ0ZHQl9ETUFfRU5BQkxFCSAgIDB4MDEKKworI2RlZmluZSBJUkNDX0NGR0JfTVVYX0NPTSAgICAgICAgICAweDAwCisjZGVmaW5lIElSQ0NfQ0ZHQl9NVVhfSVIgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgSVJDQ19DRkdCX01VWF9BVVggICAgICAgICAgMHg4MAorI2RlZmluZSBJUkNDX0NGR0JfTVVYX0lOQUNUSVZFCSAgIDB4YzAKKworLyogUmVnaXN0ZXIgYmxvY2sgMyAtIElkZW50aWZpY2F0aW9uIFJlZ2lzdGVycyEgKi8KKyNkZWZpbmUgSVJDQ19JRF9ISUdICSAgICAgICAgICAgMHgwMCAgIC8qIDB4MTAgKi8KKyNkZWZpbmUgSVJDQ19JRF9MT1cJICAgICAgICAgICAweDAxICAgLyogMHhCOCAqLworI2RlZmluZSBJUkNDX0NISVBfSUQgCSAgICAgICAgICAgMHgwMiAgIC8qIDB4RjEgKi8KKyNkZWZpbmUgSVJDQ19WRVJTSU9OCSAgICAgICAgICAgMHgwMyAgIC8qIDB4MDEgKi8KKyNkZWZpbmUgSVJDQ19JTlRFUkZBQ0UJICAgICAgICAgICAweDA0ICAgLyogbG93IDQgPSBETUEsIGhpZ2ggNCA9IElSUSAqLworI2RlZmluZSAJSVJDQ19JTlRFUkZBQ0VfRE1BX01BU0sJMHgwRiAgIC8qIGxvdyA0ID0gRE1BLCBoaWdoIDQgPSBJUlEgKi8KKyNkZWZpbmUgCUlSQ0NfSU5URVJGQUNFX0lSUV9NQVNLCTB4RjAgICAvKiBsb3cgNCA9IERNQSwgaGlnaCA0ID0gSVJRICovCisKKy8qIFJlZ2lzdGVyIGJsb2NrIDQgLSBJckRBICovCisjZGVmaW5lIElSQ0NfQ09OVFJPTCAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgSVJDQ19CT0ZfQ09VTlRfTE8gICAgICAgICAgMHgwMSAvKiBMb3cgYnl0ZSAqLworI2RlZmluZSBJUkNDX0JPRl9DT1VOVF9ISSAgICAgICAgICAweDAwIC8qIEhpZ2ggbmliYmxlIChiaXQgMC0zKSAqLworI2RlZmluZSBJUkNDX0JSSUNLV0FMTF9DTlRfTE8gICAgICAweDAyIC8qIExvdyBieXRlICovCisjZGVmaW5lIElSQ0NfQlJJQ0tXQUxMX0NOVF9ISSAgICAgIDB4MDMgLyogSGlnaCBuaWJibGUgKGJpdCA0LTcpICovCisjZGVmaW5lIElSQ0NfVFhfU0laRV9MTyAgICAgICAgICAgIDB4MDQgLyogTG93IGJ5dGUgKi8KKyNkZWZpbmUgSVJDQ19UWF9TSVpFX0hJICAgICAgICAgICAgMHgwMyAvKiBIaWdoIG5pYmJsZSAoYml0IDAtMykgKi8KKyNkZWZpbmUgSVJDQ19SWF9TSVpFX0hJICAgICAgICAgICAgMHgwNSAvKiBIaWdoIG5pYmJsZSAoYml0IDAtMykgKi8KKyNkZWZpbmUgSVJDQ19SWF9TSVpFX0xPICAgICAgICAgICAgMHgwNiAvKiBMb3cgYnl0ZSAqLworCisjZGVmaW5lIElSQ0NfMTE1MiAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSVJDQ19DUkMgICAgICAgICAgICAgICAgICAgMHg0MAorCisvKiBSZWdpc3RlciBibG9jayA1IC0gSXJEQSAqLworI2RlZmluZSBJUkNDX0FUQwkJCQkJMHgwMAorI2RlZmluZSAJSVJDQ19BVENfblBST0dSRUFEWQkJMHg4MAorI2RlZmluZSAJSVJDQ19BVENfU1BFRUQJCQkweDQwCisjZGVmaW5lIAlJUkNDX0FUQ19FTkFCTEUJCQkweDIwCisjZGVmaW5lIAlJUkNDX0FUQ19NQVNLCQkJMHhFMAorCisKKyNkZWZpbmUgSVJDQ19JUkhBTEZEVVBMRVhfVElNRU9VVAkweDAxCisKKyNkZWZpbmUgSVJDQ19TQ0VfVFhfREVMQVlfVElNRVIJCTB4MDIKKworLyoKKyAqIE90aGVyIGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBTTVNDX0lSQ0MyX01BWF9TSVJfU1BFRUQJCTExNTIwMAorI2RlZmluZSBTTVNDX0lSQ0MyX0ZJUl9DSElQX0lPX0VYVEVOVCAJOAorI2RlZmluZSBTTVNDX0lSQ0MyX1NJUl9DSElQX0lPX0VYVEVOVCAJOAorI2RlZmluZSBTTVNDX0lSQ0MyX0ZJRk9fU0laRQkJCTE2CisjZGVmaW5lIFNNU0NfSVJDQzJfRklGT19USFJFU0hPTEQJCTY0CisvKiBNYXggRE1BIGJ1ZmZlciBzaXplIG5lZWRlZCA9IChkYXRhX3NpemUgKyA2KSAqICh3aW5kb3dfc2l6ZSkgKyA2OyAqLworI2RlZmluZSBTTVNDX0lSQ0MyX1JYX0JVRkZfVFJVRVNJWkUJCTE0Mzg0CisjZGVmaW5lIFNNU0NfSVJDQzJfVFhfQlVGRl9UUlVFU0laRQkJMTQzODQKKyNkZWZpbmUgU01TQ19JUkNDMl9NSU5fVFVSTl9USU1FCQkweDA3CisjZGVmaW5lIFNNU0NfSVJDQzJfV0lORE9XX1NJWkUJCQkweDA3CisvKiBNYXhpbXVtIHdhaXQgZm9yIGh3IHRyYW5zbWl0dGVyIHRvIGZpbmlzaCAqLworI2RlZmluZSBTTVNDX0lSQ0MyX0hXX1RSQU5TTUlUVEVSX1RJTUVPVVRfVVMJMTAwMAkvKiAxIG1zICovCisvKiBNYXhpbXVtIHdhaXQgZm9yIEFUQyB0cmFuc2NlaXZlciBwcm9ncmFtbWluZyB0byBmaW5pc2ggKi8KKyNkZWZpbmUgU01TQ19JUkNDMl9BVENfUFJPR1JBTU1JTkdfVElNRU9VVF9KSUZGSUVTIDEKKyNlbmRpZiAvKiBTTVNDX0lSQ0MyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1zaW8uaCBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1zaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWUyMGU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLXNpby5oCkBAIC0wLDAgKzEsMTAwIEBACisjaWZuZGVmIFNNU0NfU0lPX0gKKyNkZWZpbmUgU01TQ19TSU9fSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgS2V5cy4gVGhleSBzaG91bGQgd29yayB3aXRoIGV2ZXJ5IFNNc0MgU0lPCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNNU0NTSU9fQ0ZHQUNDRVNTS0VZCQkweDU1CisjZGVmaW5lIFNNU0NTSU9fQ0ZHRVhJVEtFWQkJCTB4YWEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZW5lcmljIFNJTyBGbGF0ICghPykgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qIFJlZ2lzdGVyIDB4MGQgKi8KKyNkZWZpbmUgU01TQ1NJT0ZMQVRfREVWSUNFSURfUkVHCQkJCTB4MGQKKworLyogUmVnaXN0ZXIgMHgwYyAqLworI2RlZmluZSBTTVNDU0lPRkxBVF9VQVJUTU9ERTBDX1JFRwkJCQkweDBjCisjZGVmaW5lIAlTTVNDU0lPRkxBVF9VQVJUMk1PREVfTUFTSwkJCTB4MzgKKyNkZWZpbmUgCVNNU0NTSU9GTEFUX1VBUlQyTU9ERV9WQUxfQ09NCQkweDAwCisjZGVmaW5lIAlTTVNDU0lPRkxBVF9VQVJUMk1PREVfVkFMX0lSREEJCTB4MDgKKyNkZWZpbmUgCVNNU0NTSU9GTEFUX1VBUlQyTU9ERV9WQUxfQVNLSVIJCTB4MTAKKworLyogUmVnaXN0ZXIgMHgyNSAqLworI2RlZmluZSBTTVNDU0lPRkxBVF9VQVJUMkJBU0VBRERSX1JFRwkJCTB4MjUKKworLyogUmVnaXN0ZXIgMHgyYiAqLworI2RlZmluZSBTTVNDU0lPRkxBVF9GSVJCQVNFQUREUl9SRUcJCQkJMHgyYgorCisvKiBSZWdpc3RlciAweDJjICovCisjZGVmaW5lIFNNU0NTSU9GTEFUX0ZJUkRNQVNFTEVDVF9SRUcJCQkweDJjCisjZGVmaW5lIAlTTVNDU0lPRkxBVF9GSVJETUFTRUxFQ1RfTUFTSwkJMHgwZgorCisvKiBSZWdpc3RlciAweDI4ICovCisjZGVmaW5lIFNNU0NTSU9GTEFUX1VBUlRJUlFTRUxFQ1RfUkVHCQkJMHgyOAorI2RlZmluZSAJU01TQ1NJT0ZMQVRfVUFSVDJJUlFTRUxFQ1RfTUFTSwkJMHgwZgorI2RlZmluZSAJU01TQ1NJT0ZMQVRfVUFSVDFJUlFTRUxFQ1RfTUFTSwkJMHhmMAorI2RlZmluZSAJU01TQ1NJT0ZMQVRfVUFSVElSUVNFTEVDVF9WQUxfTk9ORQkweDAwCisKKworLyoqKioqKioqKioqKioqKioqKioqKgorICogTFBDNDdOMjI3ICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMUEM0N04yMjdfQ0ZHQUNDRVNTS0VZCQkweDU1CisjZGVmaW5lIExQQzQ3TjIyN19DRkdFWElUS0VZCQkweGFhCisKKy8qIFJlZ2lzdGVyIDB4MDAgKi8KKyNkZWZpbmUgTFBDNDdOMjI3X0ZEQ1BPV0VSVkFMSURDT05GX1JFRwkJMHgwMAorI2RlZmluZSAJTFBDNDdOMjI3X0ZEQ1BPV0VSX01BU0sJCQkweDA4CisjZGVmaW5lIAlMUEM0N04yMjdfVkFMSURfTUFTSwkJCQkweDgwCisKKy8qIFJlZ2lzdGVyIDB4MDIgKi8KKyNkZWZpbmUgTFBDNDdOMjI3X1VBUlQxMlBPV0VSX1JFRwkJCQkweDAyCisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVDFQT1dFUkRPV05fTUFTSwkJMHgwOAorI2RlZmluZSAJTFBDNDdOMjI3X1VBUlQyUE9XRVJET1dOX01BU0sJCTB4ODAKKworLyogUmVnaXN0ZXIgMHgwNyAqLworI2RlZmluZSBMUEM0N04yMjdfQVBNQk9PVERSSVZFX1JFRwkJCQkweDA3CisjZGVmaW5lIAlMUEM0N04yMjdfUEFSUE9SVDJBVVRPUFdSRE9XTl9NQVNLCTB4MTAgLyogYXV0byBwb3dlciBkb3duIG9uIGlmIHNldCAqLworI2RlZmluZSAJTFBDNDdOMjI3X1VBUlQyQVVUT1BXUkRPV05fTUFTSwkweDIwIC8qIGF1dG8gcG93ZXIgZG93biBvbiBpZiBzZXQgKi8KKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUMUFVVE9QV1JET1dOX01BU0sJMHg0MCAvKiBhdXRvIHBvd2VyIGRvd24gb24gaWYgc2V0ICovCisKKy8qIFJlZ2lzdGVyIDB4MGMgKi8KKyNkZWZpbmUgTFBDNDdOMjI3X1VBUlRNT0RFMENfUkVHCQkJCTB4MGMKKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUMk1PREVfTUFTSwkJCTB4MzgKKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUMk1PREVfVkFMX0NPTQkJMHgwMAorI2RlZmluZSAJTFBDNDdOMjI3X1VBUlQyTU9ERV9WQUxfSVJEQQkJMHgwOAorI2RlZmluZSAJTFBDNDdOMjI3X1VBUlQyTU9ERV9WQUxfQVNLSVIJCTB4MTAKKworLyogUmVnaXN0ZXIgMHgwZCAqLworI2RlZmluZSBMUEM0N04yMjdfREVWSUNFSURfUkVHCQkJCQkweDBkCisjZGVmaW5lIAlMUEM0N04yMjdfREVWSUNFSURfREVGVkFMCQkJMHg1YQorCisvKiBSZWdpc3RlciAweDBlICovCisjZGVmaW5lIExQQzQ3TjIyN19SRVZJU0lPTklEX1JFRwkJCQkweDBlCisKKy8qIFJlZ2lzdGVyIDB4MjUgKi8KKyNkZWZpbmUgTFBDNDdOMjI3X1VBUlQyQkFTRUFERFJfUkVHCQkJMHgyNQorCisvKiBSZWdpc3RlciAweDI4ICovCisjZGVmaW5lIExQQzQ3TjIyN19VQVJUSVJRU0VMRUNUX1JFRwkJCTB4MjgKKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUMklSUVNFTEVDVF9NQVNLCQkweDBmCisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVDFJUlFTRUxFQ1RfTUFTSwkJMHhmMAorI2RlZmluZSAJTFBDNDdOMjI3X1VBUlRJUlFTRUxFQ1RfVkFMX05PTkUJMHgwMAorCisvKiBSZWdpc3RlciAweDJiICovCisjZGVmaW5lIExQQzQ3TjIyN19GSVJCQVNFQUREUl9SRUcJCQkJMHgyYgorCisvKiBSZWdpc3RlciAweDJjICovCisjZGVmaW5lIExQQzQ3TjIyN19GSVJETUFTRUxFQ1RfUkVHCQkJCTB4MmMKKyNkZWZpbmUgCUxQQzQ3TjIyN19GSVJETUFTRUxFQ1RfTUFTSwkJMHgwZgorI2RlZmluZSAJTFBDNDdOMjI3X0ZJUkRNQVNFTEVDVF9WQUxfRE1BMQkweDAxIC8qIDQ3bjIyNyBoYXMgdGhyZWUgZG1hIGNoYW5uZWxzICovCisjZGVmaW5lIAlMUEM0N04yMjdfRklSRE1BU0VMRUNUX1ZBTF9ETUEyCTB4MDIKKyNkZWZpbmUgCUxQQzQ3TjIyN19GSVJETUFTRUxFQ1RfVkFMX0RNQTMJMHgwMworI2RlZmluZSAJTFBDNDdOMjI3X0ZJUkRNQVNFTEVDVF9WQUxfTk9ORQkweDBmCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMgYi9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjNjA1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYwpAQCAtMCwwICsxLDExODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlbmFtZTogICAgICBzdGlyNDIwMC5jCisqIFZlcnNpb246ICAgICAgIDAuNAorKiBEZXNjcmlwdGlvbjogICBJcmRhIFNpZ21hVGVsIFVTQiBEb25nbGUKKyogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsCisqIEF1dGhvcjogICAgICAgIFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQG9zZGwub3JnPgorKgorKiAgCUJhc2VkIG9uIGVhcmxpZXIgZHJpdmVyIGJ5IFBhdWwgU3Rld2FydCA8c3Rld2FydEBwYXJjLmNvbT4KKyoKKyoJQ29weXJpZ2h0IChDKSAyMDAwLCBSb21hbiBXZWlzc2dhZXJiZXIgPHdlaXNzZ0B2aWVubmEuYXQ+CisqCUNvcHlyaWdodCAoQykgMjAwMSwgRGFnIEJyYXR0bGkgPGRhZ0BicmF0dGxpLm5ldD4KKyoJQ29weXJpZ2h0IChDKSAyMDAxLCBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisqCUNvcHlyaWdodCAoQykgMjAwNCwgU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+CisqCisqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGRvbmdsZSBkb2VzIG5vIGZyYW1pbmcsIGFuZCByZXF1aXJlcyBwb2xsaW5nIHRvIHJlY2VpdmUgdGhlCisgKiBkYXRhLiAgVGhlIFNUSXI0MjAwIGhhcyBidWxrIGluIGFuZCBvdXQgZW5kcG9pbnRzIGp1c3QgbGlrZQorICogdXNyLWlyZGEgZGV2aWNlcywgYnV0IHRoZSBkYXRhIGl0IHNlbmRzIGFuZCByZWNlaXZlcyBpcyByYXc7IGxpa2UKKyAqIGlydHR5LCBpdCBuZWVkcyB0byBjYWxsIHRoZSB3cmFwIGFuZCB1bndyYXAgZnVuY3Rpb25zIHRvIGFkZCBhbmQKKyAqIHJlbW92ZSBTT0YvQk9GIGFuZCBlc2NhcGUgY2hhcmFjdGVycyB0by9mcm9tIHRoZSBmcmFtZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2NyYy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKK01PRFVMRV9BVVRIT1IoIlN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQG9zZGwub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJckRBLVVTQiBEb25nbGUgRHJpdmVyIGZvciBTaWdtYVRlbCBTVElyNDIwMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IHFvc19tdHRfYml0cyA9IDB4MDc7CS8qIDEgbXMgb3IgbW9yZSAqLworbW9kdWxlX3BhcmFtKHFvc19tdHRfYml0cywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocW9zX210dF9iaXRzLCAiTWluaW11bSBUdXJuIFRpbWUiKTsKKworc3RhdGljIGludCByeF9zZW5zaXRpdml0eSA9IDE7CS8qIEZJUiAwLi40LCBTSVIgMC4uNiAqLworbW9kdWxlX3BhcmFtKHJ4X3NlbnNpdGl2aXR5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyeF9zZW5zaXRpdml0eSwgIlNldCBSZWNlaXZlciBzZW5zaXRpdml0eSAoMC02LCAwIGlzIG1vc3Qgc2Vuc2l0aXZlKSIpOworCitzdGF0aWMgaW50IHR4X3Bvd2VyID0gMDsJLyogMCA9IGhpZ2hlc3QgLi4uIDMgPSBsb3dlc3QgKi8KK21vZHVsZV9wYXJhbSh0eF9wb3dlciwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHhfcG93ZXIsICJTZXQgVHJhbnNtaXR0ZXIgcG93ZXIgKDAtMywgMCBpcyBoaWdoZXN0IHBvd2VyKSIpOworCisjZGVmaW5lIFNUSVJfSVJEQV9IRUFERVIgIAk0CisjZGVmaW5lIENUUkxfVElNRU9VVAkJMTAwCSAgIC8qIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBUUkFOU01JVF9USU1FT1VUCTIwMAkgICAvKiBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgU1RJUl9GSUZPX1NJWkUJCTQwOTYKKyNkZWZpbmUgRklGT19SRUdTX1NJWkUJCTMKKworZW51bSBGaXJDaGFycyB7CisJRklSX0NFICAgPSAweDdkLAorCUZJUl9YQk9GID0gMHg3ZiwKKwlGSVJfRU9GICA9IDB4N2UsCit9OworCitlbnVtIFN0aXJSZXF1ZXN0cyB7CisJUkVRX1dSSVRFX1JFRyA9CQkweDAwLAorCVJFUV9SRUFEX1JFRyA9CQkweDAxLAorCVJFUV9SRUFEX1JPTSA9CQkweDAyLAorCVJFUV9XUklURV9TSU5HTEUgPQkweDAzLAorfTsKKworLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLworZW51bSBTdGlyUmVncyB7CisJUkVHX1JTVkQ9MCwKKwlSRUdfTU9ERSwKKwlSRUdfUERDTEssCisJUkVHX0NUUkwxLAorCVJFR19DVFJMMiwKKwlSRUdfRklGT0NUTCwKKwlSRUdfRklGT0xTQiwKKwlSRUdfRklGT01TQiwKKwlSRUdfRFBMTCwKKwlSRUdfSVJESUcsCisJUkVHX1RFU1Q9MTUsCit9OworCitlbnVtIFN0aXJNb2RlTWFzayB7CisJTU9ERV9GSVIgPSAweDgwLAorCU1PREVfU0lSID0gMHgyMCwKKwlNT0RFX0FTSyA9IDB4MTAsCisJTU9ERV9GQVNUUlggPSAweDA4LAorCU1PREVfRkZSU1RFTiA9IDB4MDQsCisJTU9ERV9OUkVTRVQgPSAweDAyLAorCU1PREVfMjQwMCA9IDB4MDEsCit9OworCitlbnVtIFN0aXJQZGNsa01hc2sgeworCVBEQ0xLXzQwMDAwMDAgPSAweDAyLAorCVBEQ0xLXzExNTIwMCA9IDB4MDksCisJUERDTEtfNTc2MDAgPSAweDEzLAorCVBEQ0xLXzM4NDAwID0gMHgxRCwKKwlQRENMS18xOTIwMCA9IDB4M0IsCisJUERDTEtfOTYwMCA9IDB4NzcsCisJUERDTEtfMjQwMCA9IDB4REYsCit9OworCitlbnVtIFN0aXJDdHJsMU1hc2sgeworCUNUUkwxX1NETU9ERSA9IDB4ODAsCisJQ1RSTDFfUlhTTE9XID0gMHg0MCwKKwlDVFJMMV9UWFBXRCA9IDB4MTAsCisJQ1RSTDFfUlhQV0QgPSAweDA4LAorCUNUUkwxX1NSRVNFVCA9IDB4MDEsCit9OworCitlbnVtIFN0aXJDdHJsMk1hc2sgeworCUNUUkwyX1NQV0lEVEggPSAweDA4LAorCUNUUkwyX1JFVklEID0gMHgwMywKK307CisKK2VudW0gU3RpckZpZm9DdGxNYXNrIHsKKwlGSUZPQ1RMX0VPRiA9IDB4ODAsCisJRklGT0NUTF9VTkRFUiA9IDB4NDAsCisJRklGT0NUTF9PVkVSID0gMHgyMCwKKwlGSUZPQ1RMX0RJUiA9IDB4MTAsCisJRklGT0NUTF9DTFIgPSAweDA4LAorCUZJRk9DVExfRU1QVFkgPSAweDA0LAorCUZJRk9DVExfUlhFUlIgPSAweDAyLAorCUZJRk9DVExfVFhFUlIgPSAweDAxLAorfTsKKworZW51bSBTdGlyRGlhZ01hc2sgeworCUlSRElHX1JYSElHSCA9IDB4ODAsCisJSVJESUdfUlhMT1cgPSAweDQwLAorfTsKKworZW51bSBTdGlyVGVzdE1hc2sgeworCVRFU1RfUExMRE9XTiA9IDB4ODAsCisJVEVTVF9MT09QSVIgPSAweDQwLAorCVRFU1RfTE9PUFVTQiA9IDB4MjAsCisJVEVTVF9UU1RFTkEgPSAweDEwLAorCVRFU1RfVFNUT1NDID0gMHgwRiwKK307CisKK3N0cnVjdCBzdGlyX2NiIHsKKyAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsgICAgICAvKiBpbml0OiBwcm9iZV9pcmRhICovCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAgLyogbmV0d29yayBsYXllciAqLworICAgICAgICBzdHJ1Y3QgaXJsYXBfY2IgICAqaXJsYXA7ICAgICAgIC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIG5ldHdvcmsgc3RhdGlzdGljcyAqLworICAgICAgICBzdHJ1Y3QgcW9zX2luZm8gICBxb3M7CisJdW5zaWduZWQgCSAgc3BlZWQ7CS8qIEN1cnJlbnQgc3BlZWQgKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHRocl93YWl0OwkvKiB0cmFuc21pdCB0aHJlYWQgd2FrZXVwICovCisJc3RydWN0IGNvbXBsZXRpb24gdGhyX2V4aXRlZDsKKwlwaWRfdAkJICB0aHJfcGlkOworCisJc3RydWN0IHNrX2J1ZmYJICAqdHhfcGVuZGluZzsKKwl2b2lkCQkgICppb19idWY7CS8qIHRyYW5zbWl0L3JlY2VpdmUgYnVmZmVyICovCisJX191OAkJICAqZmlmb19zdGF0dXM7CisKKwlpb2J1ZmZfdCAgCSAgcnhfYnVmZjsJLyogcmVjZWl2ZSB1bndyYXAgc3RhdGUgbWFjaGluZSAqLworCXN0cnVjdCB0aW1ldmFsCSAgcnhfdGltZTsKKwlpbnQJCSAgcmVjZWl2aW5nOworCXN0cnVjdCB1cmIJICpyeF91cmI7Cit9OworCisKKy8qIFRoZXNlIGFyZSB0aGUgY3VycmVudGx5IGtub3duIFVTQiBpZHMgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkb25nbGVzW10gPSB7CisgICAgLyogU2lnbWFUZWwsIEluYywgIFNUSXI0MjAwIElyREEvVVNCIEJyaWRnZSAqLworICAgIHsgVVNCX0RFVklDRSgweDA2NmYsIDB4NDIwMCkgfSwKKyAgICB7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkb25nbGVzKTsKKworLyogU2VuZCBjb250cm9sIG1lc3NhZ2UgdG8gc2V0IGRvbmdsZSByZWdpc3RlciAqLworc3RhdGljIGludCB3cml0ZV9yZWcoc3RydWN0IHN0aXJfY2IgKnN0aXIsIF9fdTE2IHJlZywgX191OCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gc3Rpci0+dXNiZGV2OworCisJcHJfZGVidWcoIiVzOiB3cml0ZSByZWcgJWQgPSAweCV4XG4iLAorCQkgc3Rpci0+bmV0ZGV2LT5uYW1lLCByZWcsIHZhbHVlKTsKKwlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCQkgICAgICAgUkVRX1dSSVRFX1NJTkdMRSwKKwkJCSAgICAgICBVU0JfRElSX09VVHxVU0JfVFlQRV9WRU5ET1J8VVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgICB2YWx1ZSwgcmVnLCBOVUxMLCAwLAorCQkJICAgICAgIENUUkxfVElNRU9VVCk7Cit9CisKKy8qIFNlbmQgY29udHJvbCBtZXNzYWdlIHRvIHJlYWQgbXVsdGlwbGUgcmVnaXN0ZXJzICovCitzdGF0aWMgaW5saW5lIGludCByZWFkX3JlZyhzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciwgX191MTYgcmVnLAorCQkgICAgX191OCAqZGF0YSwgX191MTYgY291bnQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHN0aXItPnVzYmRldjsKKworCXJldHVybiB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwKKwkJCSAgICAgICBSRVFfUkVBRF9SRUcsCisJCQkgICAgICAgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgICAgMCwgcmVnLCBkYXRhLCBjb3VudCwKKwkJCSAgICAgICBDVFJMX1RJTUVPVVQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc2Zpcih1MzIgc3BlZWQpCit7CisJcmV0dXJuIChzcGVlZCA9PSA0MDAwMDAwKTsKK30KKworLyoKKyAqIFByZXBhcmUgYSBGSVIgSXJEQSBmcmFtZSBmb3IgdHJhbnNtaXNzaW9uIHRvIHRoZSBVU0IgZG9uZ2xlLiAgVGhlCisgKiBGSVIgdHJhbnNtaXQgZnJhbWUgaXMgZG9jdW1lbnRlZCBpbiB0aGUgZGF0YXNoZWV0LiAgSXQgY29uc2lzdHMgb2YKKyAqIGEgdHdvIGJ5dGUgMHg1NSAweEFBIHNlcXVlbmNlLCB0d28gbGl0dGxlLWVuZGlhbiBsZW5ndGggYnl0ZXMsIGEKKyAqIHNlcXVlbmNlIG9mIGV4YWN0bHkgMTYgWEJPRiBieXRlcyBvZiAweDdFLCB0d28gQk9GIGJ5dGVzIG9mIDB4N0UsCisgKiB0aGVuIHRoZSBkYXRhIGVzY2FwZWQgYXMgZm9sbG93czoKKyAqCisgKiAgICAweDdEIC0+IDB4N0QgMHg1RAorICogICAgMHg3RSAtPiAweDdEIDB4NUUKKyAqICAgIDB4N0YgLT4gMHg3RCAweDVGCisgKgorICogVGhlbiwgNCBieXRlcyBvZiBsaXR0bGUgZW5kaWFuIChzdHVmZmVkKSBGQ1MgZm9sbG93LCB0aGVuIHR3bworICogdHJhaWxpbmcgRU9GIGJ5dGVzIG9mIDB4N0UuCisgKi8KK3N0YXRpYyBpbmxpbmUgX191OCAqc3R1ZmZfZmlyKF9fdTggKnAsIF9fdTggYykKK3sKKwlzd2l0Y2goYykgeworCWNhc2UgMHg3ZDoKKwljYXNlIDB4N2U6CisJY2FzZSAweDdmOgorCQkqcCsrID0gMHg3ZDsKKwkJYyBePSBJUkRBX1RSQU5TOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQkqcCsrID0gYzsKKwl9CisJcmV0dXJuIHA7Cit9CisKKy8qIFRha2UgcmF3IGRhdGEgaW4gc2tiIGFuZCBwdXQgaXQgd3JhcHBlZCBpbnRvIGJ1ZiAqLworc3RhdGljIHVuc2lnbmVkIHdyYXBfZmlyX3NrYihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3U4ICpidWYpCit7CisJX191OCAqcHRyID0gYnVmOworCV9fdTMyIGZjcyA9IH4oY3JjMzJfbGUofjAsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pKTsKKwlfX3UxNiB3cmFwbGVuOworCWludCBpOworCisJLyogSGVhZGVyICovCisJYnVmWzBdID0gMHg1NTsKKwlidWZbMV0gPSAweEFBOworCisJcHRyID0gYnVmICsgU1RJUl9JUkRBX0hFQURFUjsKKwltZW1zZXQocHRyLCAweDdmLCAxNik7CisJcHRyICs9IDE2OworCisJLyogQk9GICovCisJKnB0cisrICA9IDB4N2U7CisJKnB0cisrICA9IDB4N2U7CisKKwkvKiBBZGRyZXNzIC8gQ29udHJvbCAvIEluZm9ybWF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IHNrYi0+bGVuOyBpKyspCisJCXB0ciA9IHN0dWZmX2ZpcihwdHIsIHNrYi0+ZGF0YVtpXSk7CisKKwkvKiBGQ1MgKi8KKwlwdHIgPSBzdHVmZl9maXIocHRyLCBmY3MgJiAweGZmKTsKKwlwdHIgPSBzdHVmZl9maXIocHRyLCAoZmNzID4+IDgpICYgMHhmZik7CisJcHRyID0gc3R1ZmZfZmlyKHB0ciwgKGZjcyA+PiAxNikgJiAweGZmKTsKKwlwdHIgPSBzdHVmZl9maXIocHRyLCAoZmNzID4+IDI0KSAmIDB4ZmYpOworCisJLyogRU9GcyAqLworCSpwdHIrKyA9IDB4N2U7CisJKnB0cisrID0gMHg3ZTsKKworCS8qIFRvdGFsIGxlbmd0aCwgbWludXMgdGhlIGhlYWRlciAqLworCXdyYXBsZW4gPSAocHRyIC0gYnVmKSAtIFNUSVJfSVJEQV9IRUFERVI7CisJYnVmWzJdID0gd3JhcGxlbiAmIDB4ZmY7CisJYnVmWzNdID0gKHdyYXBsZW4gPj4gOCkgJiAweGZmOworCisJcmV0dXJuIHdyYXBsZW4gKyBTVElSX0lSREFfSEVBREVSOworfQorCitzdGF0aWMgdW5zaWduZWQgd3JhcF9zaXJfc2tiKHN0cnVjdCBza19idWZmICpza2IsIF9fdTggKmJ1ZikKK3sKKwlfX3UxNiB3cmFwbGVuOworCisJd3JhcGxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgYnVmICsgU1RJUl9JUkRBX0hFQURFUiwKKwkJCQkgU1RJUl9GSUZPX1NJWkUgLSBTVElSX0lSREFfSEVBREVSKTsKKwlidWZbMF0gPSAweDU1OworCWJ1ZlsxXSA9IDB4QUE7CisJYnVmWzJdID0gd3JhcGxlbiAmIDB4ZmY7CisJYnVmWzNdID0gKHdyYXBsZW4gPj4gOCkgJiAweGZmOworCisJcmV0dXJuIHdyYXBsZW4gKyBTVElSX0lSREFfSEVBREVSOworfQorCisvKgorICogRnJhbWUgaXMgZnVsbHkgZm9ybWVkIGluIHRoZSByeF9idWZmIHNvIGNoZWNrIGNyYworICogYW5kIHBhc3MgdXAgdG8gaXJsYXAKKyAqIHNldHVwIGZvciBuZXh0IHJlY2VpdmUKKyAqLworc3RhdGljIHZvaWQgZmlyX2VvZihzdHJ1Y3Qgc3Rpcl9jYiAqc3RpcikKK3sKKwlpb2J1ZmZfdCAqcnhfYnVmZiA9ICZzdGlyLT5yeF9idWZmOworCWludCBsZW4gPSByeF9idWZmLT5sZW4gLSA0OworCXN0cnVjdCBza19idWZmICpza2IsICpuc2tiOworCV9fdTMyIGZjczsKKworCWlmICh1bmxpa2VseShsZW4gPD0gMCkpIHsKKwkJcHJfZGVidWcoIiVzOiBzaG9ydCBmcmFtZSBsZW4gJWRcbiIsCisJCQkgc3Rpci0+bmV0ZGV2LT5uYW1lLCBsZW4pOworCisJCSsrc3Rpci0+c3RhdHMucnhfZXJyb3JzOworCQkrK3N0aXItPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CisJCXJldHVybjsKKwl9CisKKwlmY3MgPSB+KGNyYzMyX2xlKH4wLCByeF9idWZmLT5kYXRhLCBsZW4pKTsKKwlpZiAoZmNzICE9IGxlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoKHUzMiAqKShyeF9idWZmLT5kYXRhK2xlbikpKSkgeworCQlwcl9kZWJ1ZygiY3JjIGVycm9yIGNhbGMgMHgleCBsZW4gJWRcbiIsIGZjcywgbGVuKTsKKwkJc3Rpci0+c3RhdHMucnhfZXJyb3JzKys7CisJCXN0aXItPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIGZyYW1lIGlzIHNob3J0IHRoZW4ganVzdCBjb3B5IGl0ICovCisJaWYgKGxlbiA8IElSREFfUlhfQ09QWV9USFJFU0hPTEQpIHsKKwkJbnNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSk7CisJCWlmICh1bmxpa2VseSghbnNrYikpIHsKKwkJCSsrc3Rpci0+c3RhdHMucnhfZHJvcHBlZDsKKwkJCXJldHVybjsKKwkJfQorCQlza2JfcmVzZXJ2ZShuc2tiLCAxKTsKKwkJc2tiID0gbnNrYjsKKwkJbWVtY3B5KG5za2ItPmRhdGEsIHJ4X2J1ZmYtPmRhdGEsIGxlbik7CisJfSBlbHNlIHsKKwkJbnNrYiA9IGRldl9hbGxvY19za2IocnhfYnVmZi0+dHJ1ZXNpemUpOworCQlpZiAodW5saWtlbHkoIW5za2IpKSB7CisJCQkrK3N0aXItPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQlyZXR1cm47CisJCX0KKwkJc2tiX3Jlc2VydmUobnNrYiwgMSk7CisJCXNrYiA9IHJ4X2J1ZmYtPnNrYjsKKwkJcnhfYnVmZi0+c2tiID0gbnNrYjsKKwkJcnhfYnVmZi0+aGVhZCA9IG5za2ItPmRhdGE7CisJfQorCisJc2tiX3B1dChza2IsIGxlbik7CisKKwlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwlza2ItPmRldiA9IHN0aXItPm5ldGRldjsKKworCW5ldGlmX3J4KHNrYik7CisKKwlzdGlyLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc3Rpci0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJcnhfYnVmZi0+ZGF0YSA9IHJ4X2J1ZmYtPmhlYWQ7CisJcnhfYnVmZi0+bGVuID0gMDsKK30KKworLyogVW53cmFwIEZJUiBzdHVmZmVkIGRhdGEgYW5kIGJ1bXAgaXQgdG8gSXJMQVAgKi8KK3N0YXRpYyB2b2lkIHN0aXJfZmlyX2NoYXJzKHN0cnVjdCBzdGlyX2NiICpzdGlyLAorCQkJICAgIGNvbnN0IF9fdTggKmJ5dGVzLCBpbnQgbGVuKQoreworCWlvYnVmZl90ICpyeF9idWZmID0gJnN0aXItPnJ4X2J1ZmY7CisJaW50CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJX191OAlieXRlID0gYnl0ZXNbaV07CisKKwkJc3dpdGNoKHJ4X2J1ZmYtPnN0YXRlKSB7CisJCWNhc2UgT1VUU0lERV9GUkFNRToKKwkJCS8qIGlnbm9yZSBnYXJiYWdlIHRpbGwgc3RhcnQgb2YgZnJhbWUgKi8KKwkJCWlmICh1bmxpa2VseShieXRlICE9IEZJUl9FT0YpKQorCQkJCWNvbnRpbnVlOworCQkJLyogTm93IHJlY2VpdmluZyBmcmFtZSAqLworCQkJcnhfYnVmZi0+c3RhdGUgPSBCRUdJTl9GUkFNRTsKKworCQkJLyogVGltZSB0byBpbml0aWFsaXplIHJlY2VpdmUgYnVmZmVyICovCisJCQlyeF9idWZmLT5kYXRhID0gcnhfYnVmZi0+aGVhZDsKKwkJCXJ4X2J1ZmYtPmxlbiA9IDA7CisJCQljb250aW51ZTsKKworCQljYXNlIExJTktfRVNDQVBFOgorCQkJaWYgKGJ5dGUgPT0gRklSX0VPRikgeworCQkJCXByX2RlYnVnKCIlczogZ290IEVPRiBhZnRlciBlc2NhcGVcbiIsCisJCQkJCSBzdGlyLT5uZXRkZXYtPm5hbWUpOworCQkJCWdvdG8gZnJhbWVfZXJyb3I7CisJCQl9CisJCQlyeF9idWZmLT5zdGF0ZSA9IElOU0lERV9GUkFNRTsKKwkJCWJ5dGUgXj0gSVJEQV9UUkFOUzsKKwkJCWJyZWFrOworCisJCWNhc2UgQkVHSU5fRlJBTUU6CisJCQkvKiBpZ25vcmUgbXVsdGlwbGUgQk9GL0VPRiAqLworCQkJaWYgKGJ5dGUgPT0gRklSX0VPRikKKwkJCQljb250aW51ZTsKKwkJCXJ4X2J1ZmYtPnN0YXRlID0gSU5TSURFX0ZSQU1FOworCQkJcnhfYnVmZi0+aW5fZnJhbWUgPSBUUlVFOworCisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBJTlNJREVfRlJBTUU6CisJCQlzd2l0Y2goYnl0ZSkgeworCQkJY2FzZSBGSVJfQ0U6CisJCQkJcnhfYnVmZi0+c3RhdGUgPSBMSU5LX0VTQ0FQRTsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgRklSX1hCT0Y6CisJCQkJLyogMHg3ZiBpcyBub3QgdXNlZCBpbiB0aGlzIGZyYW1pbmcgKi8KKwkJCQlwcl9kZWJ1ZygiJXM6IGdvdCBYQk9GIHdpdGhvdXQgZXNjYXBlXG4iLAorCQkJCQkgc3Rpci0+bmV0ZGV2LT5uYW1lKTsKKwkJCQlnb3RvIGZyYW1lX2Vycm9yOworCQkJY2FzZSBGSVJfRU9GOgorCQkJCXJ4X2J1ZmYtPnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwkJCQlyeF9idWZmLT5pbl9mcmFtZSA9IEZBTFNFOworCQkJCWZpcl9lb2Yoc3Rpcik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCS8qIGFkZCBieXRlIHRvIHJ4IGJ1ZmZlciAqLworCQlpZiAodW5saWtlbHkocnhfYnVmZi0+bGVuID49IHJ4X2J1ZmYtPnRydWVzaXplKSkgeworCQkJcHJfZGVidWcoIiVzOiBmaXIgZnJhbWUgZXhjZWVkcyAlZFxuIiwKKwkJCQkgc3Rpci0+bmV0ZGV2LT5uYW1lLCByeF9idWZmLT50cnVlc2l6ZSk7CisJCQkrK3N0aXItPnN0YXRzLnJ4X292ZXJfZXJyb3JzOworCQkJZ290byBlcnJvcl9yZWNvdmVyeTsKKwkJfQorCisJCXJ4X2J1ZmYtPmRhdGFbcnhfYnVmZi0+bGVuKytdID0gYnl0ZTsKKwkJY29udGludWU7CisKKwlmcmFtZV9lcnJvcjoKKwkJKytzdGlyLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnM7CisKKwllcnJvcl9yZWNvdmVyeToKKwkJKytzdGlyLT5zdGF0cy5yeF9lcnJvcnM7CisJCXJ4X2J1ZmYtPnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwkJcnhfYnVmZi0+aW5fZnJhbWUgPSBGQUxTRTsKKwl9Cit9CisKKy8qIFVud3JhcCBTSVIgc3R1ZmZlZCBkYXRhIGFuZCBidW1wIGl0IHVwIHRvIElyTEFQICovCitzdGF0aWMgdm9pZCBzdGlyX3Npcl9jaGFycyhzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciwKKwkJCSAgICBjb25zdCBfX3U4ICpieXRlcywgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJYXN5bmNfdW53cmFwX2NoYXIoc3Rpci0+bmV0ZGV2LCAmc3Rpci0+c3RhdHMsCisJCQkJICAmc3Rpci0+cnhfYnVmZiwgYnl0ZXNbaV0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW53cmFwX2NoYXJzKHN0cnVjdCBzdGlyX2NiICpzdGlyLAorCQkJCWNvbnN0IF9fdTggKmJ5dGVzLCBpbnQgbGVuZ3RoKQoreworCWlmIChpc2ZpcihzdGlyLT5zcGVlZCkpCisJCXN0aXJfZmlyX2NoYXJzKHN0aXIsIGJ5dGVzLCBsZW5ndGgpOworCWVsc2UKKwkJc3Rpcl9zaXJfY2hhcnMoc3RpciwgYnl0ZXMsIGxlbmd0aCk7Cit9CisKKy8qIE1vZGUgcGFyYW1ldGVycyBmb3IgZWFjaCBzcGVlZCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdW5zaWduZWQgc3BlZWQ7CisJX191OCBwZGNsazsKK30gc3Rpcl9tb2Rlc1tdID0geworICAgICAgICB7IDI0MDAsICAgIFBEQ0xLXzI0MDAgfSwKKyAgICAgICAgeyA5NjAwLCAgICBQRENMS185NjAwIH0sCisgICAgICAgIHsgMTkyMDAsICAgUERDTEtfMTkyMDAgfSwKKyAgICAgICAgeyAzODQwMCwgICBQRENMS18zODQwMCB9LAorICAgICAgICB7IDU3NjAwLCAgIFBEQ0xLXzU3NjAwIH0sCisgICAgICAgIHsgMTE1MjAwLCAgUERDTEtfMTE1MjAwIH0sCisgICAgICAgIHsgNDAwMDAwMCwgUERDTEtfNDAwMDAwMCB9LAorfTsKKworCisvKgorICogU2V0dXAgY2hpcCBmb3Igc3BlZWQuCisgKiAgQ2FsbGVkIGF0IHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZSB0aGUgY2hpcAorICogIGFuZCBvbiBzcGVlZCBjaGFuZ2VzLgorICoKKyAqIE5vdGU6IFdyaXRlIG11bHRpcGxlIHJlZ2lzdGVycyBkb2Vzbid0IGFwcGVhciB0byB3b3JrCisgKi8KK3N0YXRpYyBpbnQgY2hhbmdlX3NwZWVkKHN0cnVjdCBzdGlyX2NiICpzdGlyLCB1bnNpZ25lZCBzcGVlZCkKK3sKKwlpbnQgaSwgZXJyOworCV9fdTggbW9kZTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0aXJfbW9kZXMpOyArK2kpIHsKKwkJaWYgKHNwZWVkID09IHN0aXJfbW9kZXNbaV0uc3BlZWQpCisJCQlnb3RvIGZvdW5kOworCX0KKworCXdhcm4oIiVzOiBpbnZhbGlkIHNwZWVkICVkIiwgc3Rpci0+bmV0ZGV2LT5uYW1lLCBzcGVlZCk7CisJcmV0dXJuIC1FSU5WQUw7CisKKyBmb3VuZDoKKwlwcl9kZWJ1Zygic3BlZWQgY2hhbmdlIGZyb20gJWQgdG8gJWRcbiIsIHN0aXItPnNwZWVkLCBzcGVlZCk7CisKKwkvKiBSZXNldCBtb2R1bGF0b3IgKi8KKwllcnIgPSB3cml0ZV9yZWcoc3RpciwgUkVHX0NUUkwxLCBDVFJMMV9TUkVTRVQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogVW5kb2N1bWVudGVkIG1hZ2ljIHRvIHR3ZWFrIHRoZSBEUExMICovCisJZXJyID0gd3JpdGVfcmVnKHN0aXIsIFJFR19EUExMLCAweDE1KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCS8qIFNldCBjbG9jayAqLworCWVyciA9IHdyaXRlX3JlZyhzdGlyLCBSRUdfUERDTEssIHN0aXJfbW9kZXNbaV0ucGRjbGspOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJbW9kZSA9IE1PREVfTlJFU0VUIHwgTU9ERV9GQVNUUlg7CisJaWYgKGlzZmlyKHNwZWVkKSkKKwkJbW9kZSB8PSBNT0RFX0ZJUiB8IE1PREVfRkZSU1RFTjsKKwllbHNlCisJCW1vZGUgfD0gTU9ERV9TSVI7CisKKwlpZiAoc3BlZWQgPT0gMjQwMCkKKwkJbW9kZSB8PSBNT0RFXzI0MDA7CisKKwllcnIgPSB3cml0ZV9yZWcoc3RpciwgUkVHX01PREUsIG1vZGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogVGhpcyByZXNldHMgVEVNSUMgc3R5bGUgdHJhbnNjZWl2ZXIgaWYgYW55LiAqLworCWVyciA9IHdyaXRlX3JlZyhzdGlyLCBSRUdfQ1RSTDEsCisJCQlDVFJMMV9TRE1PREUgfCAodHhfcG93ZXIgJiAzKSA8PCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IHdyaXRlX3JlZyhzdGlyLCBSRUdfQ1RSTDEsICh0eF9wb3dlciAmIDMpIDw8IDEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogUmVzZXQgc2Vuc2l0aXZpdHkgKi8KKwllcnIgPSB3cml0ZV9yZWcoc3RpciwgUkVHX0NUUkwyLCAocnhfc2Vuc2l0aXZpdHkgJiA3KSA8PCA1KTsKKyBvdXQ6CisJc3Rpci0+c3BlZWQgPSBzcGVlZDsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQ2FsbGVkIGZyb20gbmV0L2NvcmUgd2hlbiBuZXcgZnJhbWUgaXMgYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW50IHN0aXJfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJLyogdGhlIElSREEgd3JhcHBpbmcgcm91dGluZXMgZG9uJ3QgZGVhbCB3aXRoIG5vbiBsaW5lYXIgc2tiICovCisJU0tCX0xJTkVBUl9BU1NFUlQoc2tiKTsKKworCXNrYiA9IHhjaGcoJnN0aXItPnR4X3BlbmRpbmcsIHNrYik7CisJd2FrZV91cCgmc3Rpci0+dGhyX3dhaXQpOworCQorCS8qIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bmxlc3Mgc3RvcC93YWtldXAgcHJvYmxlbSAqLworCWlmICh1bmxpa2VseShza2IpKSB7CisJCVdBUk5fT04oMSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdhaXQgZm9yIHRoZSB0cmFuc21pdCBGSUZPIHRvIGhhdmUgc3BhY2UgZm9yIG5leHQgZGF0YQorICoKKyAqIElmIHNwYWNlIDwgMCB0aGVuIHdhaXQgdGlsbCBGSUZPIGNvbXBsZXRlbHkgZHJhaW5zLgorICogRllJOiBjYW4gdGFrZSB1cCB0byAxMyBzZWNvbmRzIGF0IDI0MDBiYXVkLgorICovCitzdGF0aWMgaW50IGZpZm9fdHh3YWl0KHN0cnVjdCBzdGlyX2NiICpzdGlyLCBpbnQgc3BhY2UpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGNvdW50LCBzdGF0dXM7CisKKwkvKiBSZWFkIEZJRk8gc3RhdHVzIGFuZCBjb3VudCAqLworCWZvcig7OykgeworCQllcnIgPSByZWFkX3JlZyhzdGlyLCBSRUdfRklGT0NUTCwgc3Rpci0+Zmlmb19zdGF0dXMsIAorCQkJCSAgIEZJRk9fUkVHU19TSVpFKTsKKwkJaWYgKHVubGlrZWx5KGVyciAhPSBGSUZPX1JFR1NfU0laRSkpIHsKKwkJCXdhcm4oIiVzOiBGSUZPIHJlZ2lzdGVyIHJlYWQgZXJyb3I6ICVkIiwgCisJCQkgICAgIHN0aXItPm5ldGRldi0+bmFtZSwgZXJyKTsKKworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCXN0YXR1cyA9IHN0aXItPmZpZm9fc3RhdHVzWzBdOworCQljb3VudCA9ICh1bnNpZ25lZCkoc3Rpci0+Zmlmb19zdGF0dXNbMl0gJiAweDFmKSA8PCA4IAorCQkJfCBzdGlyLT5maWZvX3N0YXR1c1sxXTsKKworCQlwcl9kZWJ1ZygiZmlmbyBzdGF0dXMgMHglbHggY291bnQgJWx1XG4iLCBzdGF0dXMsIGNvdW50KTsKKworCQkvKiBlcnJvciB3aGVuIHJlY2VpdmUvdHJhbnNtaXQgZmlmbyBnZXRzIGNvbmZ1c2VkICovCisJCWlmIChzdGF0dXMgJiBGSUZPQ1RMX1JYRVJSKSB7CisJCQlzdGlyLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJc3Rpci0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBGSUZPQ1RMX1RYRVJSKSB7CisJCQlzdGlyLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJc3Rpci0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGlzIGZpZm8gcmVjZWl2aW5nIGFscmVhZHksIG9yIGVtcHR5ICovCisJCWlmICghKHN0YXR1cyAmIEZJRk9DVExfRElSKQorCQkgICAgfHwgKHN0YXR1cyAmIEZJRk9DVExfRU1QVFkpKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKworCQkvKiBzaHV0dGluZyBkb3duPyAqLworCQlpZiAoIW5ldGlmX3J1bm5pbmcoc3Rpci0+bmV0ZGV2KQorCQkgICAgfHwgIW5ldGlmX2RldmljZV9wcmVzZW50KHN0aXItPm5ldGRldikpCisJCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCQkvKiBvbmx5IHdhaXRpbmcgZm9yIHNvbWUgc3BhY2UgKi8KKwkJaWYgKHNwYWNlID49IDAgJiYgU1RJUl9GSUZPX1NJWkUgLSA0ID4gc3BhY2UgKyBjb3VudCkKKwkJCXJldHVybiAwOworCisJCS8qIGVzdGltYXRlIHRyYW5zZmVyIHRpbWUgZm9yIHJlbWFpbmluZyBjaGFycyAqLworCQltc2xlZXAoKGNvdW50ICogODAwMCkgLyBzdGlyLT5zcGVlZCk7CisJfQorCQkJCisJZXJyID0gd3JpdGVfcmVnKHN0aXIsIFJFR19GSUZPQ1RMLCBGSUZPQ1RMX0NMUik7CisJaWYgKGVycikgCisJCXJldHVybiBlcnI7CisJZXJyID0gd3JpdGVfcmVnKHN0aXIsIFJFR19GSUZPQ1RMLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKworLyogV2FpdCBmb3IgdHVybmFyb3VuZCBkZWxheSBiZWZvcmUgc3RhcnRpbmcgdHJhbnNtaXQuICAqLworc3RhdGljIHZvaWQgdHVybmFyb3VuZF9kZWxheShjb25zdCBzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciwgbG9uZyB1cykKK3sKKwlsb25nIHRpY2tzOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCWlmICh1cyA8PSAwKQorCQlyZXR1cm47CisKKwlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJaWYgKG5vdy50dl9zZWMgLSBzdGlyLT5yeF90aW1lLnR2X3NlYyA+IDApCisJCXVzIC09IFVTRUNfUEVSX1NFQzsKKwl1cyAtPSBub3cudHZfdXNlYyAtIHN0aXItPnJ4X3RpbWUudHZfdXNlYzsKKwlpZiAodXMgPCAxMCkKKwkJcmV0dXJuOworCisJdGlja3MgPSB1cyAvICgxMDAwMDAwIC8gSFopOworCWlmICh0aWNrcyA+IDApIHsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSArIHRpY2tzKTsKKwl9IGVsc2UKKwkJdWRlbGF5KHVzKTsKK30KKworLyoKKyAqIFN0YXJ0IHJlY2VpdmVyIGJ5IHN1Ym1pdHRpbmcgYSByZXF1ZXN0IHRvIHRoZSByZWNlaXZlIHBpcGUuCisgKiBJZiBub3RoaW5nIGlzIGF2YWlsYWJsZSBpdCB3aWxsIHJldHVybiBhZnRlciByeF9pbnRlcnZhbC4KKyAqLworc3RhdGljIGludCByZWNlaXZlX3N0YXJ0KHN0cnVjdCBzdGlyX2NiICpzdGlyKQoreworCS8qIHJlc2V0IHN0YXRlICovCisJc3Rpci0+cmVjZWl2aW5nID0gMTsKKworCXN0aXItPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlzdGlyLT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKworCXN0aXItPnJ4X3VyYi0+c3RhdHVzID0gMDsKKwlyZXR1cm4gdXNiX3N1Ym1pdF91cmIoc3Rpci0+cnhfdXJiLCBHRlBfS0VSTkVMKTsKK30KKworLyogU3RvcCBhbGwgcGVuZGluZyByZWNlaXZlIFVyYidzICovCitzdGF0aWMgdm9pZCByZWNlaXZlX3N0b3Aoc3RydWN0IHN0aXJfY2IgKnN0aXIpCit7CisJc3Rpci0+cmVjZWl2aW5nID0gMDsKKwl1c2Jfa2lsbF91cmIoc3Rpci0+cnhfdXJiKTsKKworCWlmIChzdGlyLT5yeF9idWZmLmluX2ZyYW1lKSAKKwkJc3Rpci0+c3RhdHMuY29sbGlzaW9ucysrOworfQorLyoKKyAqIFdyYXAgZGF0YSBpbiBzb2NrZXQgYnVmZmVyIGFuZCBzZW5kIGl0LgorICovCitzdGF0aWMgdm9pZCBzdGlyX3NlbmQoc3RydWN0IHN0aXJfY2IgKnN0aXIsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgd3JhcGxlbjsKKwlpbnQgZmlyc3RfZnJhbWUgPSAwOworCisJLyogaWYgcmVjZWl2aW5nLCBuZWVkIHRvIHR1cm5hcm91bmQgKi8KKwlpZiAoc3Rpci0+cmVjZWl2aW5nKSB7CisJCXJlY2VpdmVfc3RvcChzdGlyKTsKKwkJdHVybmFyb3VuZF9kZWxheShzdGlyLCBpcmRhX2dldF9tdHQoc2tiKSk7CisJCWZpcnN0X2ZyYW1lID0gMTsKKwl9CisKKwlpZiAoaXNmaXIoc3Rpci0+c3BlZWQpKQorCQl3cmFwbGVuID0gd3JhcF9maXJfc2tiKHNrYiwgc3Rpci0+aW9fYnVmKTsKKwllbHNlCisJCXdyYXBsZW4gPSB3cmFwX3Npcl9za2Ioc2tiLCBzdGlyLT5pb19idWYpOworCQkKKwkvKiBjaGVjayBmb3Igc3BhY2UgYXZhaWxhYmxlIGluIGZpZm8gKi8KKwlpZiAoIWZpcnN0X2ZyYW1lKQorCQlmaWZvX3R4d2FpdChzdGlyLCB3cmFwbGVuKTsKKworCXN0aXItPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlzdGlyLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlzdGlyLT5uZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlwcl9kZWJ1Zygic2VuZCAlZCAoJWQpXG4iLCBza2ItPmxlbiwgd3JhcGxlbik7CisKKwlpZiAodXNiX2J1bGtfbXNnKHN0aXItPnVzYmRldiwgdXNiX3NuZGJ1bGtwaXBlKHN0aXItPnVzYmRldiwgMSksCisJCQkgc3Rpci0+aW9fYnVmLCB3cmFwbGVuLAorCQkJIE5VTEwsIFRSQU5TTUlUX1RJTUVPVVQpKQorCQlzdGlyLT5zdGF0cy50eF9lcnJvcnMrKzsKK30KKworLyoKKyAqIFRyYW5zbWl0IHN0YXRlIG1hY2hpbmUgdGhyZWFkCisgKi8KK3N0YXRpYyBpbnQgc3Rpcl90cmFuc21pdF90aHJlYWQodm9pZCAqYXJnKQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gYXJnOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzdGlyLT5uZXRkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWRhZW1vbml6ZSgiJXMiLCBkZXYtPm5hbWUpOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKworCXdoaWxlIChuZXRpZl9ydW5uaW5nKGRldikKKwkgICAgICAgJiYgbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KQorCSAgICAgICAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJeworI2lmZGVmIENPTkZJR19QTQorCQkvKiBpZiBzdXNwZW5kaW5nLCB0aGVuIHBvd2VyIG9mZiBhbmQgd2FpdCAqLworCQlpZiAodW5saWtlbHkoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpKSB7CisJCQlpZiAoc3Rpci0+cmVjZWl2aW5nKQorCQkJCXJlY2VpdmVfc3RvcChzdGlyKTsKKwkJCWVsc2UKKwkJCQlmaWZvX3R4d2FpdChzdGlyLCAtMSk7CisKKwkJCXdyaXRlX3JlZyhzdGlyLCBSRUdfQ1RSTDEsIENUUkwxX1RYUFdEfENUUkwxX1JYUFdEKTsKKworCQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisKKwkJCWlmIChjaGFuZ2Vfc3BlZWQoc3Rpciwgc3Rpci0+c3BlZWQpKQorCQkJCWJyZWFrOworCQl9CisjZW5kaWYKKworCQkvKiBpZiBzb21ldGhpbmcgdG8gc2VuZD8gKi8KKwkJc2tiID0geGNoZygmc3Rpci0+dHhfcGVuZGluZywgTlVMTCk7CisJCWlmIChza2IpIHsKKwkJCXVuc2lnbmVkIG5ld19zcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCQkJaWYgKHNrYi0+bGVuID4gMCkKKwkJCQlzdGlyX3NlbmQoc3Rpciwgc2tiKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCQkJaWYgKChuZXdfc3BlZWQgIT0gLTEpICYmIChzdGlyLT5zcGVlZCAhPSBuZXdfc3BlZWQpKSB7CisJCQkJaWYgKGZpZm9fdHh3YWl0KHN0aXIsIC0xKSB8fAorCQkJCSAgICBjaGFuZ2Vfc3BlZWQoc3RpciwgbmV3X3NwZWVkKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIG5vdGhpbmcgdG8gc2VuZD8gc3RhcnQgcmVjZWl2aW5nICovCisJCWlmICghc3Rpci0+cmVjZWl2aW5nIAorCQkgICAgJiYgaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShkZXYpKSB7CisJCQkvKiBXYWl0IG90aGVyd2lzZSBjaGlwIGdldHMgY29uZnVzZWQuICovCisJCQlpZiAoZmlmb190eHdhaXQoc3RpciwgLTEpKQorCQkJCWJyZWFrOworCisJCQlpZiAodW5saWtlbHkocmVjZWl2ZV9zdGFydChzdGlyKSkpIHsKKwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCQlpbmZvKCIlczogcmVjZWl2ZSB1c2Igc3VibWl0IGZhaWxlZCIsCisJCQkJCSAgICAgc3Rpci0+bmV0ZGV2LT5uYW1lKTsKKwkJCQlzdGlyLT5yZWNlaXZpbmcgPSAwOworCQkJCW1zbGVlcCgxMCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBzbGVlcCBpZiBub3RoaW5nIHRvIHNlbmQgKi8KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHN0aXItPnRocl93YWl0LCBzdGlyLT50eF9wZW5kaW5nKTsKKwl9CisKKwljb21wbGV0ZV9hbmRfZXhpdCAoJnN0aXItPnRocl9leGl0ZWQsIDApOworfQorCisKKy8qCisgKiBVU0IgYnVsayByZWNlaXZlIGNvbXBsZXRpb24gY2FsbGJhY2suCisgKiBXYWtlcyB1cCBldmVyeSBtcyAodXNiIHJvdW5kIHRyaXApIHdpdGggd3JhcHBlZCAKKyAqIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIHN0aXJfcmN2X2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gdXJiLT5jb250ZXh0OworCWludCBlcnI7CisKKwkvKiBpbiBwcm9jZXNzIG9mIHN0b3BwaW5nLCBqdXN0IGRyb3AgZGF0YSAqLworCWlmICghbmV0aWZfcnVubmluZyhzdGlyLT5uZXRkZXYpKQorCQlyZXR1cm47CisKKwkvKiB1bmxpbmssIHNodXRkb3duLCB1bnBsdWcsIG90aGVyIG5hc3RpZXMgKi8KKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgCisJCXJldHVybjsKKworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7CisJCXByX2RlYnVnKCJyZWNlaXZlICVkXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl1bndyYXBfY2hhcnMoc3RpciwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQkgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQorCQlzdGlyLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlkb19nZXR0aW1lb2ZkYXkoJnN0aXItPnJ4X3RpbWUpOworCX0KKworCS8qIGtlcm5lbCB0aHJlYWQgaXMgc3RvcHBpbmcgcmVjZWl2ZXIgZG9uJ3QgcmVzdWJtaXQgKi8KKwlpZiAoIXN0aXItPnJlY2VpdmluZykKKwkJcmV0dXJuOworCisJLyogcmVzdWJtaXQgZXhpc3RpbmcgdXJiICovCisJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKworCS8qIGluIGNhc2Ugb2YgZXJyb3IsIHRoZSBrZXJuZWwgdGhyZWFkIHdpbGwgcmVzdGFydCB1cyAqLworCWlmIChlcnIpIHsKKwkJd2FybigiJXM6IHVzYiByZWNlaXZlIHN1Ym1pdCBlcnJvcjogJWQiLAorCQkJc3Rpci0+bmV0ZGV2LT5uYW1lLCBlcnIpOworCQlzdGlyLT5yZWNlaXZpbmcgPSAwOworCQl3YWtlX3VwKCZzdGlyLT50aHJfd2FpdCk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gc3Rpcl9uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIE5ldHdvcmsgZGV2aWNlIGlzIHRha2VuIHVwLiBVc3VhbGx5IHRoaXMgaXMgZG9uZSBieSAiaWZjb25maWcgaXJkYTAgdXAiCisgKi8KK3N0YXRpYyBpbnQgc3Rpcl9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgZXJyOworCWNoYXIgaHduYW1lWzE2XTsKKworCWVyciA9IHVzYl9jbGVhcl9oYWx0KHN0aXItPnVzYmRldiwgdXNiX3NuZGJ1bGtwaXBlKHN0aXItPnVzYmRldiwgMSkpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDE7CisJZXJyID0gdXNiX2NsZWFyX2hhbHQoc3Rpci0+dXNiZGV2LCB1c2JfcmN2YnVsa3BpcGUoc3Rpci0+dXNiZGV2LCAyKSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0MTsKKworCWVyciA9IGNoYW5nZV9zcGVlZChzdGlyLCA5NjAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQxOworCisJZXJyID0gLUVOT01FTTsKKworCS8qIEluaXRpYWxpemUgZm9yIFNJUi9GSVIgdG8gY29weSBkYXRhIGRpcmVjdGx5IGludG8gc2tiLiAgKi8KKwlzdGlyLT5yZWNlaXZpbmcgPSAwOworCXN0aXItPnJ4X2J1ZmYudHJ1ZXNpemUgPSBJUkRBX1NLQl9NQVhfTVRVOworCXN0aXItPnJ4X2J1ZmYuc2tiID0gZGV2X2FsbG9jX3NrYihJUkRBX1NLQl9NQVhfTVRVKTsKKwlpZiAoIXN0aXItPnJ4X2J1ZmYuc2tiKSAKKwkJZ290byBlcnJfb3V0MTsKKworCXNrYl9yZXNlcnZlKHN0aXItPnJ4X2J1ZmYuc2tiLCAxKTsKKwlzdGlyLT5yeF9idWZmLmhlYWQgPSBzdGlyLT5yeF9idWZmLnNrYi0+ZGF0YTsKKwlkb19nZXR0aW1lb2ZkYXkoJnN0aXItPnJ4X3RpbWUpOworCisJc3Rpci0+cnhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0aXItPnJ4X3VyYikgCisJCWdvdG8gZXJyX291dDI7CisKKwlzdGlyLT5pb19idWYgPSBrbWFsbG9jKFNUSVJfRklGT19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0aXItPmlvX2J1ZikKKwkJZ290byBlcnJfb3V0MzsKKworCXVzYl9maWxsX2J1bGtfdXJiKHN0aXItPnJ4X3VyYiwgc3Rpci0+dXNiZGV2LAorCQkJICB1c2JfcmN2YnVsa3BpcGUoc3Rpci0+dXNiZGV2LCAyKSwKKwkJCSAgc3Rpci0+aW9fYnVmLCBTVElSX0ZJRk9fU0laRSwKKwkJCSAgc3Rpcl9yY3ZfaXJxLCBzdGlyKTsKKworCXN0aXItPmZpZm9fc3RhdHVzID0ga21hbGxvYyhGSUZPX1JFR1NfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGlyLT5maWZvX3N0YXR1cykgCisJCWdvdG8gZXJyX291dDQ7CisJCQorCS8qCisJICogTm93IHRoYXQgZXZlcnl0aGluZyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgcHJvcGVybHksCisJICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UgdG8gdGFrZSBjYXJlIG9mIHVzLi4uCisJICogTm90ZSA6IHdpbGwgc2VuZCBpbW1lZGlhdGVseSBhIHNwZWVkIGNoYW5nZS4uLgorCSAqLworCXNwcmludGYoaHduYW1lLCAidXNiIyVkIiwgc3Rpci0+dXNiZGV2LT5kZXZudW0pOworCXN0aXItPmlybGFwID0gaXJsYXBfb3BlbihuZXRkZXYsICZzdGlyLT5xb3MsIGh3bmFtZSk7CisJaWYgKCFzdGlyLT5pcmxhcCkgeworCQllcnIoInN0aXI0MjAwOiBpcmxhcF9vcGVuIGZhaWxlZCIpOworCQlnb3RvIGVycl9vdXQ1OworCX0KKworCS8qKiBTdGFydCBrZXJuZWwgdGhyZWFkIGZvciB0cmFuc21pdC4gICovCisJc3Rpci0+dGhyX3BpZCA9IGtlcm5lbF90aHJlYWQoc3Rpcl90cmFuc21pdF90aHJlYWQsIHN0aXIsCisJCQkJICAgICAgQ0xPTkVfRlN8Q0xPTkVfRklMRVMpOworCWlmIChzdGlyLT50aHJfcGlkIDwgMCkgeworCQllcnIgPSBzdGlyLT50aHJfcGlkOworCQllcnIoInN0aXI0MjAwOiB1bmFibGUgdG8gc3RhcnQga2VybmVsIHRocmVhZCIpOworCQlnb3RvIGVycl9vdXQ2OworCX0KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisKKwlyZXR1cm4gMDsKKworIGVycl9vdXQ2OgorCWlybGFwX2Nsb3NlKHN0aXItPmlybGFwKTsKKyBlcnJfb3V0NToKKwlrZnJlZShzdGlyLT5maWZvX3N0YXR1cyk7CisgZXJyX291dDQ6CisJa2ZyZWUoc3Rpci0+aW9fYnVmKTsKKyBlcnJfb3V0MzoKKwl1c2JfZnJlZV91cmIoc3Rpci0+cnhfdXJiKTsKKyBlcnJfb3V0MjoKKwlrZnJlZV9za2Ioc3Rpci0+cnhfYnVmZi5za2IpOworIGVycl9vdXQxOgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzdGlyX25ldF9jbG9zZSAoc3RpcikKKyAqCisgKiAgICBOZXR3b3JrIGRldmljZSBpcyB0YWtlbiBkb3duLiBVc3VhbGx5IHRoaXMgaXMgZG9uZSBieQorICogICAgImlmY29uZmlnIGlyZGEwIGRvd24iCisgKi8KK3N0YXRpYyBpbnQgc3Rpcl9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwkvKiBTdG9wIHRyYW5zbWl0IHByb2Nlc3NpbmcgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkvKiBLaWxsIHRyYW5zbWl0IHRocmVhZCAqLworCWtpbGxfcHJvYyhzdGlyLT50aHJfcGlkLCBTSUdURVJNLCAxKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzdGlyLT50aHJfZXhpdGVkKTsKKwlrZnJlZShzdGlyLT5maWZvX3N0YXR1cyk7CisKKwkvKiBNb3AgdXAgcmVjZWl2ZSB1cmIncyAqLworCXVzYl9raWxsX3VyYihzdGlyLT5yeF91cmIpOworCQorCWtmcmVlKHN0aXItPmlvX2J1Zik7CisJdXNiX2ZyZWVfdXJiKHN0aXItPnJ4X3VyYik7CisJa2ZyZWVfc2tiKHN0aXItPnJ4X2J1ZmYuc2tiKTsKKworCS8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworCWlmIChzdGlyLT5pcmxhcCkKKwkJaXJsYXBfY2xvc2Uoc3Rpci0+aXJsYXApOworCisJc3Rpci0+aXJsYXAgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJT0NUTHMgOiBFeHRyYSBvdXQtb2YtYmFuZCBuZXR3b3JrIGNvbW1hbmRzLi4uCisgKi8KK3N0YXRpYyBpbnQgc3Rpcl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaWZfaXJkYV9yZXEgKmlycSA9IChzdHJ1Y3QgaWZfaXJkYV9yZXEgKikgcnE7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOiAvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJLyogQ2hlY2sgaWYgdGhlIGRldmljZSBpcyBzdGlsbCB0aGVyZSAqLworCQlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoc3Rpci0+bmV0ZGV2KSkKKwkJCXJldCA9IGNoYW5nZV9zcGVlZChzdGlyLCBpcnEtPmlmcl9iYXVkcmF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU01FRElBQlVTWTogLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQkvKiBDaGVjayBpZiB0aGUgSXJEQSBzdGFjayBpcyBzdGlsbCB0aGVyZSAqLworCQlpZiAobmV0aWZfcnVubmluZyhzdGlyLT5uZXRkZXYpKQorCQkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc3Rpci0+bmV0ZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHUkVDRUlWSU5HOgorCQkvKiBPbmx5IGFwcHJveGltYXRlbHkgdHJ1ZSAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSBzdGlyLT5yZWNlaXZpbmc7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEdldCBkZXZpY2Ugc3RhdHMgKGZvciAvcHJvYy9uZXQvZGV2IGFuZCBpZmNvbmZpZykKKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGlyX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuICZzdGlyLT5zdGF0czsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gZm9yIGVhY2ggbmV3IGRldmljZQorICogaW4gdGhlIHN5c3RlbS4gV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIG91cnMsIGFuZCBpbgorICogdGhpcyBjYXNlIHN0YXJ0IGhhbmRsaW5nIGl0LgorICogTm90ZSA6IGl0IG1pZ2h0IGJlIHdvcnRoIHByb3RlY3RpbmcgdGhpcyBmdW5jdGlvbiBieSBhIGdsb2JhbAorICogc3BpbmxvY2suLi4gT3Igbm90LCBiZWNhdXNlIG1heWJlIFVTQiBhbHJlYWR5IGRlYWwgd2l0aCB0aGF0Li4uCisgKi8KK3N0YXRpYyBpbnQgc3Rpcl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OworCWludCByZXQgPSAtRU5PTUVNOworCisJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgY29udGFpbmVyLiAqLworCW5ldCA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKCpzdGlyKSk7CisJaWYoIW5ldCkKKwkJZ290byBlcnJfb3V0MTsKKworCVNFVF9NT0RVTEVfT1dORVIobmV0KTsKKwlTRVRfTkVUREVWX0RFVihuZXQsICZpbnRmLT5kZXYpOworCXN0aXIgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0aXItPm5ldGRldiA9IG5ldDsKKwlzdGlyLT51c2JkZXYgPSBkZXY7CisKKwlyZXQgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbihkZXYpOworCWlmIChyZXQgIT0gMCkgeworCQllcnIoInN0aXI0MjAwOiB1c2IgcmVzZXQgY29uZmlndXJhdGlvbiBmYWlsZWQiKTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJTaWdtYVRlbCBTVElyNDIwMCBJUkRBL1VTQiBmb3VuZCBhdCBhZGRyZXNzICVkLCAiCisJCSJWZW5kb3I6ICV4LCBQcm9kdWN0OiAleFxuIiwKKwkgICAgICAgZGV2LT5kZXZudW0sIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJICAgICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKKworCS8qIEluaXRpYWxpemUgUW9TIGZvciB0aGlzIGRldmljZSAqLworCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnN0aXItPnFvcyk7CisKKwkvKiBUaGF0J3MgdGhlIFJ4IGNhcGFiaWxpdHkuICovCisJc3Rpci0+cW9zLmJhdWRfcmF0ZS5iaXRzICAgICAgICY9IElSXzI0MDAgfCBJUl85NjAwIHwgSVJfMTkyMDAgfAorCQkJCQkgSVJfMzg0MDAgfCBJUl81NzYwMCB8IElSXzExNTIwMCB8CisJCQkJCSAoSVJfNDAwMDAwMCA8PCA4KTsKKwlzdGlyLT5xb3MubWluX3R1cm5fdGltZS5iaXRzICAgJj0gcW9zX210dF9iaXRzOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnN0aXItPnFvcyk7CisKKwlpbml0X2NvbXBsZXRpb24gKCZzdGlyLT50aHJfZXhpdGVkKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkICgmc3Rpci0+dGhyX3dhaXQpOworCisJLyogT3ZlcnJpZGUgdGhlIG5ldHdvcmsgZnVuY3Rpb25zIHdlIG5lZWQgdG8gdXNlICovCisJbmV0LT5oYXJkX3N0YXJ0X3htaXQgPSBzdGlyX2hhcmRfeG1pdDsKKwluZXQtPm9wZW4gICAgICAgICAgICA9IHN0aXJfbmV0X29wZW47CisJbmV0LT5zdG9wICAgICAgICAgICAgPSBzdGlyX25ldF9jbG9zZTsKKwluZXQtPmdldF9zdGF0cwkgICAgID0gc3Rpcl9uZXRfZ2V0X3N0YXRzOworCW5ldC0+ZG9faW9jdGwgICAgICAgID0gc3Rpcl9uZXRfaW9jdGw7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmV0KTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZXJyX291dDI7CisKKwlpbmZvKCJJckRBOiBSZWdpc3RlcmVkIFNpZ21hVGVsIGRldmljZSAlcyIsIG5ldC0+bmFtZSk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHN0aXIpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQyOgorCWZyZWVfbmV0ZGV2KG5ldCk7CitlcnJfb3V0MToKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhlIGN1cnJlbnQgZGV2aWNlIGlzIHJlbW92ZWQsIHRoZSBVU0IgbGF5ZXIgdGVsbCB1cyB0byBzaHV0IGl0IGRvd24uLi4KKyAqLworc3RhdGljIHZvaWQgc3Rpcl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCWlmICghc3RpcikKKwkJcmV0dXJuOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoc3Rpci0+bmV0ZGV2KTsKKwlmcmVlX25ldGRldihzdGlyLT5uZXRkZXYpOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorLyogUG93ZXIgbWFuYWdlbWVudCBzdXNwZW5kLCBzbyBwb3dlciBvZmYgdGhlIHRyYW5zbWl0dGVyL3JlY2VpdmVyICovCitzdGF0aWMgaW50IHN0aXJfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goc3Rpci0+bmV0ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogQ29taW5nIG91dCBvZiBzdXNwZW5kLCBzbyByZXNldCBoYXJkd2FyZSAqLworc3RhdGljIGludCBzdGlyX3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKHN0aXItPm5ldGRldik7CisKKwkvKiByZWNlaXZlciByZXN0YXJ0ZWQgd2hlbiBzZW5kIHRocmVhZCB3YWtlcyB1cCAqLworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiBVU0IgZGV2aWNlIGNhbGxiYWNrcworICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgaXJkYV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJzdGlyNDIwMCIsCisJLnByb2JlCQk9IHN0aXJfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSBzdGlyX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZG9uZ2xlcywKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHN0aXJfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHN0aXJfcmVzdW1lLAorI2VuZGlmCit9OworCisvKgorICogTW9kdWxlIGluc2VydGlvbgorICovCitzdGF0aWMgaW50IF9faW5pdCBzdGlyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZpcmRhX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChzdGlyX2luaXQpOworCisvKgorICogTW9kdWxlIHJlbW92YWwKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHN0aXJfY2xlYW51cCh2b2lkKQoreworCS8qIERlcmVnaXN0ZXIgdGhlIGRyaXZlciBhbmQgcmVtb3ZlIGFsbCBwZW5kaW5nIGluc3RhbmNlcyAqLworCXVzYl9kZXJlZ2lzdGVyKCZpcmRhX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChzdGlyX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS90ZWtyYW0tc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Rla3JhbS1zaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ2YmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS90ZWtyYW0tc2lyLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgdGVrcmFtLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMworICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIFRla3JhbSBJck1hdGUgSVItMjEwQiBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFdlZCBPY3QgMjEgMjA6MDI6MzUgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgU3VuIE9jdCAyNyAyMjowMjozOCAyMDAyCisgKiBNb2RpZmllZCBieTogICBNYXJ0aW4gRGllaGwgPG1hZEBtZGllaGwuZGU+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSwKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgTWFydGluIERpZWhsLAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCitzdGF0aWMgaW50IHRla3JhbV9kZWxheSA9IDE1MDsJCS8qIGRlZmF1bHQgaXMgMTUwIG1zICovCittb2R1bGVfcGFyYW0odGVrcmFtX2RlbGF5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0ZWtyYW1fZGVsYXksICJ0ZWtyYW0gZG9uZ2xlIHdyaXRlIGNvbXBsZXRlIGRlbGF5Iik7CisKK3N0YXRpYyBpbnQgdGVrcmFtX29wZW4oc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IHRla3JhbV9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqKTsKK3N0YXRpYyBpbnQgdGVrcmFtX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqLCB1bnNpZ25lZCk7CitzdGF0aWMgaW50IHRla3JhbV9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqKTsKKworI2RlZmluZSBURUtSQU1fMTE1MjAwIDB4MDAKKyNkZWZpbmUgVEVLUkFNXzU3NjAwICAweDAxCisjZGVmaW5lIFRFS1JBTV8zODQwMCAgMHgwMgorI2RlZmluZSBURUtSQU1fMTkyMDAgIDB4MDMKKyNkZWZpbmUgVEVLUkFNXzk2MDAgICAweDA0CisKKyNkZWZpbmUgVEVLUkFNX1BXICAgICAweDEwIC8qIFB1bHNlIHNlbGVjdCBiaXQgKi8KKworc3RhdGljIHN0cnVjdCBkb25nbGVfZHJpdmVyIHRla3JhbSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIlRla3JhbSBJUi0yMTBCIiwKKwkudHlwZQkJPSBJUkRBX1RFS1JBTV9ET05HTEUsCisJLm9wZW4JCT0gdGVrcmFtX29wZW4sCisJLmNsb3NlCQk9IHRla3JhbV9jbG9zZSwKKwkucmVzZXQJCT0gdGVrcmFtX3Jlc2V0LAorCS5zZXRfc3BlZWQJPSB0ZWtyYW1fY2hhbmdlX3NwZWVkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGVrcmFtX3Npcl9pbml0KHZvaWQpCit7CisJaWYgKHRla3JhbV9kZWxheSA8IDEgIHx8ICB0ZWtyYW1fZGVsYXkgPiA1MDApCisJCXRla3JhbV9kZWxheSA9IDIwMDsKKwlJUkRBX0RFQlVHKDEsICIlcyAtIHVzaW5nICVkIG1zIGRlbGF5XG4iLAorCQl0ZWtyYW0uZHJpdmVyX25hbWUsIHRla3JhbV9kZWxheSk7CisJcmV0dXJuIGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZ0ZWtyYW0pOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGVrcmFtX3Npcl9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV91bnJlZ2lzdGVyX2RvbmdsZSgmdGVrcmFtKTsKK30KKworc3RhdGljIGludCB0ZWtyYW1fb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXN0cnVjdCBxb3NfaW5mbyAqcW9zID0gJmRldi0+cW9zOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDE7IC8qIE5lZWRzIGF0IGxlYXN0IDEwIG1zICovCQorCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKKworCS8qIGlyZGEgdGhyZWFkIHdhaXRzIDUwIG1zZWMgZm9yIHBvd2VyIHNldHRsaW5nICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWtyYW1fY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRla3JhbV9jaGFuZ2Vfc3BlZWQgKGRldiwgc3RhdGUsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBUZWtyYW0gSVJNYXRlIDIxMCB0eXBlIGRvbmdsZS4gV2FybmluZywgdGhpcyAKKyAqICAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhCisgKgorICogICAgQWxnb3JpdGhtCisgKiAgICAxLiBjbGVhciBEVFIgCisgKiAgICAyLiBzZXQgUlRTLCBhbmQgd2FpdCBhdCBsZWFzdCA3IHVzCisgKiAgICAzLiBzZW5kIENvbnRyb2wgQnl0ZSB0byB0aGUgSVItMjEwIHRocm91Z2ggVFhEIHRvIHNldCBuZXcgYmF1ZCByYXRlCisgKiAgICAgICB3YWl0IHVudGlsIHRoZSBzdG9wIGJpdCBvZiBDb250cm9sIEJ5dGUgaXMgc2VudCAoZm9yIDk2MDAgYmF1ZCByYXRlLCAKKyAqICAgICAgIGl0IHRha2VzIGFib3V0IDEwMCBtc2VjKQorICoKKyAqCVtvb3BzLCB3aHkgMTAwIG1zZWM/IHNlbmRpbmcgMSBieXRlICgxMCBiaXRzKSB0YWtlcyAxLjA1IG1zZWMKKyAqCSAtIGlzIHRoaXMgcHJvYmFibHkgdG8gY29tcGVuc2F0ZSBmb3IgZGVsYXlzIGluIHR0eSBsYXllcj9dCisgKgorICogICAgNS4gY2xlYXIgUlRTIChyZXR1cm4gdG8gTk9STUFMIE9wZXJhdGlvbikKKyAqICAgIDYuIHdhaXQgYXQgbGVhc3QgNTAgdXMsIG5ldyBzZXR0aW5nIChiYXVkIHJhdGUsIGV0YykgdGFrZXMgZWZmZWN0IGhlcmUgCisgKiAgICAgICBhZnRlcgorICovCisKKyNkZWZpbmUgVEVLUkFNX1NUQVRFX1dBSVRfU1BFRUQJKFNJUkRFVl9TVEFURV9ET05HTEVfU1BFRUQgKyAxKQorCitzdGF0aWMgaW50IHRla3JhbV9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJdW5zaWduZWQgc3RhdGUgPSBkZXYtPmZzbS5zdWJzdGF0ZTsKKwl1bnNpZ25lZCBkZWxheSA9IDA7CisJdTggYnl0ZTsKKwlzdGF0aWMgaW50IHJldCA9IDA7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXN3aXRjaChzdGF0ZSkgeworCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRDoKKworCQlzd2l0Y2ggKHNwZWVkKSB7CisJCWRlZmF1bHQ6CisJCQlzcGVlZCA9IDk2MDA7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJLyogZmFsbCB0aHJ1ICovCisJCWNhc2UgOTYwMDoKKwkJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzk2MDA7CisJCQlicmVhazsKKwkJY2FzZSAxOTIwMDoKKwkJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzE5MjAwOworCQkJYnJlYWs7CisJCWNhc2UgMzg0MDA6CisJCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV8zODQwMDsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwOgorCQkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fNTc2MDA7CisJCQlicmVhazsKKwkJY2FzZSAxMTUyMDA6CisJCQlieXRlID0gVEVLUkFNXzExNTIwMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogU2V0IERUUiwgQ2xlYXIgUlRTICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIEZBTFNFKTsKKwkKKwkJLyogV2FpdCBhdCBsZWFzdCA3dXMgKi8KKwkJdWRlbGF5KDE0KTsKKworCQkvKiBXcml0ZSBjb250cm9sIGJ5dGUgKi8KKwkJc2lyZGV2X3Jhd193cml0ZShkZXYsICZieXRlLCAxKTsKKwkJCisJCWRldi0+c3BlZWQgPSBzcGVlZDsKKworCQlzdGF0ZSA9IFRFS1JBTV9TVEFURV9XQUlUX1NQRUVEOworCQlkZWxheSA9IHRla3JhbV9kZWxheTsKKwkJYnJlYWs7CisKKwljYXNlIFRFS1JBTV9TVEFURV9XQUlUX1NQRUVEOgorCQkvKiBTZXQgRFRSLCBTZXQgUlRTICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCQl1ZGVsYXkoNTApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzIC0gdW5kZWZpbmVkIHN0YXRlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJZGV2LT5mc20uc3Vic3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gKGRlbGF5ID4gMCkgPyBkZWxheSA6IHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRla3JhbV9yZXNldCAoZHJpdmVyKQorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIHRla3JhbSBkb25nbGUuIFdhcm5pbmcsIHRoaXMgZnVuY3Rpb24gCisgKiAgICAgIG11c3QgYmUgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhISAKKyAqCisgKiAgICAgIEFsZ29yaXRobToKKyAqICAgIAkgIDAuIENsZWFyIFJUUyBhbmQgRFRSLCBhbmQgd2FpdCA1MCBtcyAocG93ZXIgb2ZmIHRoZSBJUi0yMTAgKQorICogICAgICAgIDEuIGNsZWFyIFJUUyAKKyAqICAgICAgICAyLiBzZXQgRFRSLCBhbmQgd2FpdCBhdCBsZWFzdCAxIG1zIAorICogICAgICAgIDMuIGNsZWFyIERUUiB0byBTUEFDRSBzdGF0ZSwgd2FpdCBhdCBsZWFzdCA1MCB1cyBmb3IgZnVydGhlciAKKyAqICAgICAgICAgb3BlcmF0aW9uCisgKi8KKworc3RhdGljIGludCB0ZWtyYW1fcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogQ2xlYXIgRFRSLCBTZXQgUlRTICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIFRSVUUpOyAKKworCS8qIFNob3VsZCBzbGVlcCAxIG1zICovCisJbXNsZWVwKDEpOworCisJLyogU2V0IERUUiwgU2V0IFJUUyAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCQorCS8qIFdhaXQgYXQgbGVhc3QgNTAgdXMgKi8KKwl1ZGVsYXkoNzUpOworCisJZGV2LT5zcGVlZCA9IDk2MDA7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUZWtyYW0gSXJNYXRlIElSLTIxMEIgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0wIik7IC8qIElSREFfVEVLUkFNX0RPTkdMRSAqLworCQkKK21vZHVsZV9pbml0KHRla3JhbV9zaXJfaW5pdCk7Cittb2R1bGVfZXhpdCh0ZWtyYW1fc2lyX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS90ZWtyYW0uYyBiL2RyaXZlcnMvbmV0L2lyZGEvdGVrcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2MjU4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdGVrcmFtLmMKQEAgLTAsMCArMSwyODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgdGVrcmFtLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMgorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIFRla3JhbSBJck1hdGUgSVItMjEwQiBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFdlZCBPY3QgMjEgMjA6MDI6MzUgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgRnJpIERlYyAxNyAwOToxMzowOSAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworc3RhdGljIHZvaWQgdGVrcmFtX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKTsKK3N0YXRpYyB2b2lkIHRla3JhbV9jbG9zZShkb25nbGVfdCAqc2VsZik7CitzdGF0aWMgaW50ICB0ZWtyYW1fY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworc3RhdGljIGludCAgdGVrcmFtX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworCisjZGVmaW5lIFRFS1JBTV8xMTUyMDAgMHgwMAorI2RlZmluZSBURUtSQU1fNTc2MDAgIDB4MDEKKyNkZWZpbmUgVEVLUkFNXzM4NDAwICAweDAyCisjZGVmaW5lIFRFS1JBTV8xOTIwMCAgMHgwMworI2RlZmluZSBURUtSQU1fOTYwMCAgIDB4MDQKKworI2RlZmluZSBURUtSQU1fUFcgICAgIDB4MTAgLyogUHVsc2Ugc2VsZWN0IGJpdCAqLworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9yZWcgZG9uZ2xlID0geworCS50eXBlID0gSVJEQV9URUtSQU1fRE9OR0xFLAorCS5vcGVuICA9IHRla3JhbV9vcGVuLAorCS5jbG9zZSA9IHRla3JhbV9jbG9zZSwKKwkucmVzZXQgPSB0ZWtyYW1fcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IHRla3JhbV9jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0ZWtyYW1faW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZWtyYW1fY2xlYW51cCh2b2lkKQoreworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCB0ZWtyYW1fb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsgLyogTmVlZHMgYXQgbGVhc3QgMTAgbXMgKi8JCisJaXJkYV9xb3NfYml0c190b192YWx1ZShxb3MpOworfQorCitzdGF0aWMgdm9pZCB0ZWtyYW1fY2xvc2UoZG9uZ2xlX3QgKnNlbGYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworCisJaWYgKHNlbGYtPnJlc2V0X3Rhc2spCisJCWlyZGFfdGFza19kZWxldGUoc2VsZi0+cmVzZXRfdGFzayk7CisJaWYgKHNlbGYtPnNwZWVkX3Rhc2spCisJCWlyZGFfdGFza19kZWxldGUoc2VsZi0+c3BlZWRfdGFzayk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB0ZWtyYW1fY2hhbmdlX3NwZWVkIChkZXYsIHN0YXRlLCBzcGVlZCkKKyAqCisgKiAgICBTZXQgdGhlIHNwZWVkIGZvciB0aGUgVGVrcmFtIElSTWF0ZSAyMTAgdHlwZSBkb25nbGUuIFdhcm5pbmcsIHRoaXMgCisgKiAgICBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgcHJvY2VzcyBjb250ZXh0IQorICoKKyAqICAgIEFsZ29yaXRobQorICogICAgMS4gY2xlYXIgRFRSIAorICogICAgMi4gc2V0IFJUUywgYW5kIHdhaXQgYXQgbGVhc3QgNyB1cworICogICAgMy4gc2VuZCBDb250cm9sIEJ5dGUgdG8gdGhlIElSLTIxMCB0aHJvdWdoIFRYRCB0byBzZXQgbmV3IGJhdWQgcmF0ZQorICogICAgICAgd2FpdCB1bnRpbCB0aGUgc3RvcCBiaXQgb2YgQ29udHJvbCBCeXRlIGlzIHNlbnQgKGZvciA5NjAwIGJhdWQgcmF0ZSwgCisgKiAgICAgICBpdCB0YWtlcyBhYm91dCAxMDAgbXNlYykKKyAqICAgIDUuIGNsZWFyIFJUUyAocmV0dXJuIHRvIE5PUk1BTCBPcGVyYXRpb24pCisgKiAgICA2LiB3YWl0IGF0IGxlYXN0IDUwIHVzLCBuZXcgc2V0dGluZyAoYmF1ZCByYXRlLCBldGMpIHRha2VzIGVmZmVjdCBoZXJlIAorICogICAgICAgYWZ0ZXIKKyAqLworc3RhdGljIGludCB0ZWtyYW1fY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworCV9fdTggYnl0ZTsKKwlpbnQgcmV0ID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKHRhc2sgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlpZiAoc2VsZi0+c3BlZWRfdGFzayAmJiBzZWxmLT5zcGVlZF90YXNrICE9IHRhc2spIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYnVzeSFcbiIsIF9fRlVOQ1RJT05fXyApOworCQlyZXR1cm4gbXNlY3NfdG9famlmZmllcygxMCk7CisJfSBlbHNlCisJCXNlbGYtPnNwZWVkX3Rhc2sgPSB0YXNrOworCisJc3dpdGNoIChzcGVlZCkgeworCWRlZmF1bHQ6CisJY2FzZSA5NjAwOgorCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV85NjAwOworCQlicmVhazsKKwljYXNlIDE5MjAwOgorCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV8xOTIwMDsKKwkJYnJlYWs7CisJY2FzZSAzODQwMDoKKwkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fMzg0MDA7CisJCWJyZWFrOworCWNhc2UgNTc2MDA6CisJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzU3NjAwOworCQlicmVhazsKKwljYXNlIDExNTIwMDoKKwkJYnl0ZSA9IFRFS1JBTV8xMTUyMDA7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorCWNhc2UgSVJEQV9UQVNLX0NISUxEX0lOSVQ6CQkKKwkJLyogCisJCSAqIE5lZWQgdG8gcmVzZXQgdGhlIGRvbmdsZSBhbmQgZ28gdG8gOTYwMCBicHMgYmVmb3JlCisgICAgICAgICAgICAgICAgICogcHJvZ3JhbW1pbmcgCisJCSAqLworCQlpZiAoaXJkYV90YXNrX2V4ZWN1dGUoc2VsZiwgdGVrcmFtX3Jlc2V0LCBOVUxMLCB0YXNrLCAKKwkJCQkgICAgICAodm9pZCAqKSBzcGVlZCkpCisJCXsKKwkJCS8qIERvbmdsZSBuZWVkIG1vcmUgdGltZSB0byByZXNldCAqLworCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX1dBSVQpOworCisJCQkvKiBHaXZlIHJlc2V0IDEgc2VjIHRvIGZpbmlzaCAqLworCQkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxMDAwKTsKKwkJfSBlbHNlCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfRE9ORSk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX0NISUxEX1dBSVQ6CisJCUlSREFfV0FSTklORygiJXMoKSwgcmVzZXR0aW5nIGRvbmdsZSB0aW1lZCBvdXQhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfRE9ORToKKwkJLyogU2V0IERUUiwgQ2xlYXIgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOworCQorCQkvKiBXYWl0IGF0IGxlYXN0IDd1cyAqLworCQl1ZGVsYXkoMTQpOworCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZSAqLworCQlzZWxmLT53cml0ZShzZWxmLT5kZXYsICZieXRlLCAxKTsKKwkJCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUKTsKKworCQkvKiBXYWl0IGF0IGxlYXN0IDEwMCBtcyAqLworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDE1MCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CisJCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRla3JhbV9yZXNldCAoZHJpdmVyKQorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIHRla3JhbSBkb25nbGUuIFdhcm5pbmcsIHRoaXMgZnVuY3Rpb24gCisgKiAgICAgIG11c3QgYmUgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhISAKKyAqCisgKiAgICAgIEFsZ29yaXRobToKKyAqICAgIAkgIDAuIENsZWFyIFJUUyBhbmQgRFRSLCBhbmQgd2FpdCA1MCBtcyAocG93ZXIgb2ZmIHRoZSBJUi0yMTAgKQorICogICAgICAgIDEuIGNsZWFyIFJUUyAKKyAqICAgICAgICAyLiBzZXQgRFRSLCBhbmQgd2FpdCBhdCBsZWFzdCAxIG1zIAorICogICAgICAgIDMuIGNsZWFyIERUUiB0byBTUEFDRSBzdGF0ZSwgd2FpdCBhdCBsZWFzdCA1MCB1cyBmb3IgZnVydGhlciAKKyAqICAgICAgICAgb3BlcmF0aW9uCisgKi8KK2ludCB0ZWtyYW1fcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQodGFzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlmIChzZWxmLT5yZXNldF90YXNrICYmIHNlbGYtPnJlc2V0X3Rhc2sgIT0gdGFzaykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBidXN5IVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwl9IGVsc2UKKwkJc2VsZi0+cmVzZXRfdGFzayA9IHRhc2s7CisJCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCS8vc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQxKTsKKworCQkvKiBTbGVlcCA1MCBtcyAqLworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDUwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDE6CisJCS8qIENsZWFyIERUUiwgU2V0IFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsgCisKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQyKTsKKwkJCisJCS8qIFNob3VsZCBzbGVlcCAxIG1zICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMSk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQyOgorCQkvKiBTZXQgRFRSLCBTZXQgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisJCisJCS8qIFdhaXQgYXQgbGVhc3QgNTAgdXMgKi8KKwkJdWRlbGF5KDc1KTsKKworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsJCQorCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJfQorCXJldHVybiByZXQ7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGVrcmFtIElyTWF0ZSBJUi0yMTBCIGRvbmdsZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtMCIpOyAvKiBJUkRBX1RFS1JBTV9ET05HTEUgKi8KKwkJCisvKgorICogRnVuY3Rpb24gaW5pdF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBUZWtyYW0gbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdCh0ZWtyYW1faW5pdCk7CisKKy8qCisgKiBGdW5jdGlvbiBjbGVhbnVwX21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBDbGVhbnVwIFRla3JhbSBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KHRla3JhbV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFmYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jCkBAIC0wLDAgKzEsMTY3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRmlsZW5hbWU6ICAgICAgdmlhLWlyY2MuYworIFZlcnNpb246ICAgICAgIDEuMCAKKyBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBWSUEgVlQ4MjMxL1ZUODIzMyBJckRBIGNoaXBzZXRzCisgQXV0aG9yOiAgICAgICAgVklBIFRlY2hub2xvZ2llcyxpbmMKKyBEYXRlICA6CTA4LzA2LzIwMDMKKworQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KK1NlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCitGMDEgT2N0LzAyLzAyOiBNb2RpZnkgY29kZSBmb3IgVjAuMTEobW92ZSBvdXQgYmFjayB0byBiYWNrIHRyYW5zZmVyKQorRjAyIE9jdC8yOC8wMjogQWRkIFNCIGRldmljZSBJRCBmb3IgMzE0NyBhbmQgMzE3Ny4KKyBDb21tZW50IDoKKyAgICAgICBqdWwvMDkvMjAwMiA6IG9ubHkgaW1wbGVtZW50IHR3byBraW5kIG9mIGRvbmdsZSBjdXJyZW50bHkuCisgICAgICAgT2N0LzAyLzIwMDIgOiB3b3JrIG9uIFZUODIzMSBhbmQgVlQ4MjMzIC4KKyAgICAgICBBdWcvMDYvMjAwMyA6IGNoYW5nZSBkcml2ZXIgZm9ybWF0IHRvIHBjaSBkcml2ZXIgLgorCisyMDA0LTAyLTE2OiA8c2RhQGJkaXQuZGU+CistIFJlbW92ZWQgdW5uZWVkZWQgJ2xlZ2FjeScgcGNpIHN0dWZmLgorLSBNYWtlIHN1cmUgU0lSIG1vZGUgaXMgc2V0IChod19pbml0KCkpIGJlZm9yZSBjYWxsaW5nIG1vZGUtZGVwZW5kYW50IHN0dWZmLgorLSBPbiBzcGVlZCBjaGFuZ2UgZnJvbSBjb3JlLCBkb24ndCBzZW5kIFNJUiBmcmFtZSB3aXRoIG5ldyBzcGVlZC4gCisgIFVzZSBjdXJyZW50IHNwZWVkIGFuZCBjaGFuZ2Ugc3BlZWRzIGxhdGVyLgorLSBNYWtlIG1vZHVsZS1wYXJhbSBkb25nbGVfaWQgYWN0dWFsbHkgd29yay4KKy0gTmV3IGRvbmdsZV9pZCAxNyAoMHgxMSk6IFRERlM0NTAwLiBTaW5nbGUtZW5kZWQgU0lSIG9ubHkuIAorICBUZXN0ZWQgd2l0aCBob21lLWdyb3duIFBDQiBvbiBFUElBIGJvYXJkcy4KKy0gQ29kZSBjbGVhbnVwLgorICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bGludXgvcG0uaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2luY2x1ZGUgInZpYS1pcmNjLmgiCisKKyNkZWZpbmUgVklBX01PRFVMRV9OQU1FICJ2aWEtaXJjYyIKKyNkZWZpbmUgQ0hJUF9JT19FWFRFTlQgMHg0MAorCitzdGF0aWMgY2hhciAqZHJpdmVyX25hbWUgPSBWSUFfTU9EVUxFX05BTUU7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IHFvc19tdHRfYml0cyA9IDB4MDc7CS8qIDEgbXMgb3IgbW9yZSAqLworc3RhdGljIGludCBkb25nbGVfaWQgPSAwOwkvKiBkZWZhdWx0OiBwcm9iZSAqLworCisvKiBXZSBjYW4ndCBndWVzcyB0aGUgdHlwZSBvZiBjb25uZWN0ZWQgZG9uZ2xlLCB1c2VyICptdXN0KiBzdXBwbHkgaXQuICovCittb2R1bGVfcGFyYW0oZG9uZ2xlX2lkLCBpbnQsIDApOworCisvKiBGSVhNRSA6IHdlIHNob3VsZCBub3QgbmVlZCB0aGlzLCBiZWNhdXNlIGluc3RhbmNlcyBzaG91bGQgYmUgYXV0b21hdGljYWxseQorICogbWFuYWdlZCBieSB0aGUgUENJIGxheWVyLiBFc3BlY2lhbGx5IHRoYXQgd2Ugc2VlbSB0byBvbmx5IGJlIHVzaW5nIHRoZQorICogZmlyc3QgZW50cnkuIEplYW4gSUkgKi8KKy8qIE1heCA0IGluc3RhbmNlcyBmb3Igbm93ICovCitzdGF0aWMgc3RydWN0IHZpYV9pcmNjX2NiICpkZXZfc2VsZltdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisKKy8qIFNvbWUgcHJvdG90eXBlcyAqLworc3RhdGljIGludCB2aWFfaXJjY19vcGVuKGludCBpLCBjaGlwaW9fdCAqIGluZm8sIHVuc2lnbmVkIGludCBpZCk7CitzdGF0aWMgaW50IHZpYV9pcmNjX2Nsb3NlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwKKwkJCQkJIGludCBpb2Jhc2UpOworc3RhdGljIGludCB2aWFfaXJjY19oYXJkX3htaXRfc2lyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfaGFyZF94bWl0X2ZpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB2aWFfaHdfaW5pdChzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgdmlhX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgX191MzIgYmF1ZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgdmlhX2lyY2NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHZpYV9pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCB2aWFfaXJjY19yZWFkX2RvbmdsZV9pZChpbnQgaW9iYXNlKTsKKworc3RhdGljIGludCB2aWFfaXJjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2aWFfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwKKwkJCSAgICAgIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2aWFfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCQkgICAgICAgKmRldik7CitzdGF0aWMgdm9pZCB2aWFfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkKGludCBpb2Jhc2UsIGludCBzcGVlZCwKKwkJCQkJIGludCBkb25nbGVfaWQpOworc3RhdGljIGludCBSeFRpbWVySGFuZGxlcihzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpOworc3RhdGljIHZvaWQgaHdyZXNldChzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCB2aWFfaXJjY19kbWFfeG1pdChzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYsIHUxNiBpb2Jhc2UpOworc3RhdGljIGludCB1cGxvYWRfcnhkYXRhKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7CitzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdmlhX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworLyogRklYTUUgOiBTaG91bGQgdXNlIHVkZWxheSgpIGluc3RlYWQsIGV2ZW4gaWYgd2UgYXJlIHg4NiBvbmx5IC0gSmVhbiBJSSAqLworc3RhdGljIHZvaWQgaW9kZWxheShpbnQgdWRlbGF5KQoreworCXU4IGRhdGE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdWRlbGF5OyBpKyspIHsKKwkJZGF0YSA9IGluYigweDgwKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2aWFfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9WSUEsIDB4ODIzMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwwLDAsMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9WSUEsIDB4MzEwOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwwLDAsMSB9LAorCXsgUENJX1ZFTkRPUl9JRF9WSUEsIDB4MzA3NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwwLDAsMiB9LAorCXsgUENJX1ZFTkRPUl9JRF9WSUEsIDB4MzE0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwwLDAsMyB9LAorCXsgUENJX1ZFTkRPUl9JRF9WSUEsIDB4MzE3NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwwLDAsNCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksdmlhX3BjaV90YmwpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2aWFfZHJpdmVyID0geworCS5uYW1lCQk9IFZJQV9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSB2aWFfcGNpX3RibCwKKwkucHJvYmUJCT0gdmlhX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodmlhX3JlbW92ZV9vbmUpLAorfTsKKworCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfaW5pdCAoKQorICoKKyAqICAgIEluaXRpYWxpemUgY2hpcC4gSnVzdCBmaW5kIG91dCBjaGlwIHR5cGUgYW5kIHJlc291cmNlLgorICovCitzdGF0aWMgaW50IF9faW5pdCB2aWFfaXJjY19pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXJjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdmlhX2RyaXZlcik7CisJaWYgKHJjIDwgMCkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpOiBlcnJvciByYyA9ICVkLCByZXR1cm5pbmcgIC1FTk9ERVYuLi5cbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHJjKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmM7CisgICAgICAgIHU4IHRlbXAsb2xkUENJXzQwLG9sZFBDSV80NCxiVG1wLGJUbXAxOworCXUxNiBDaGlwc2V0LEZpckRSUTEsRmlyRFJRMCxGaXJJUlEsRmlySU9CYXNlOworCWNoaXBpb190IGluZm87CisKKwlJUkRBX0RFQlVHKDIsICIlcygpOiBEZXZpY2UgSUQ9KDBYJVgpXG4iLCBfX0ZVTkNUSU9OX18sIGlkLT5kZXZpY2UpOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZSAocGNpZGV2KTsKKwlpZiAocmMpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKTogZXJyb3IgcmMgPSAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8vIFNvdXRoIEJyaWRnZSBleGlzdAorICAgICAgICBpZiAoIFJlYWRMUENSZWcoMHgyMCkgIT0gMHgzQyApCisJCUNoaXBzZXQ9MHgzMDk2OworCWVsc2UKKwkJQ2hpcHNldD0weDMwNzY7CisKKwlpZiAoQ2hpcHNldD09MHgzMDc2KSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCk6IENoaXBzZXQgPSAzMDc2XG4iLCBfX0ZVTkNUSU9OX18pOworCisJCVdyaXRlTFBDUmVnKDcsMHgwYyApOworCQl0ZW1wPVJlYWRMUENSZWcoMHgzMCk7Ly9jaGVjayBpZiBCSU9TIEVuYWJsZSBGaXIKKwkJaWYoKHRlbXAmMHgwMSk9PTEpIHsgICAvLyBCSU9TIGNsb3NlIG9yIG5vIEZJUgorCQkJV3JpdGVMUENSZWcoMHgxZCwgMHg4MiApOworCQkJV3JpdGVMUENSZWcoMHgyMywweDE4KTsKKwkJCXRlbXA9UmVhZExQQ1JlZygweEYwKTsKKwkJCWlmKCh0ZW1wJjB4MDEpPT0wKSB7CisJCQkJdGVtcD0oUmVhZExQQ1JlZygweDc0KSYweDAzKTsgICAgLy9ETUEKKwkJCQlGaXJEUlEwPXRlbXAgKyA0OworCQkJCXRlbXA9KFJlYWRMUENSZWcoMHg3NCkmMHgwQykgPj4gMjsKKwkJCQlGaXJEUlExPXRlbXAgKyA0OworCQkJfSBlbHNlIHsKKwkJCQl0ZW1wPShSZWFkTFBDUmVnKDB4NzQpJjB4MEMpID4+IDI7ICAgIC8vRE1BCisJCQkJRmlyRFJRMD10ZW1wICsgNDsKKwkJCQlGaXJEUlExPUZpckRSUTA7CisJCQl9CisJCQlGaXJJUlE9KFJlYWRMUENSZWcoMHg3MCkmMHgwZik7CQkvL0lSUQorCQkJRmlySU9CYXNlPVJlYWRMUENSZWcoMHg2MCApIDw8IDg7CS8vSU8gU3BhY2UgOmhpZ2ggYnl0ZQorCQkJRmlySU9CYXNlPUZpcklPQmFzZXwgUmVhZExQQ1JlZygweDYxKSA7CS8vbG93IGJ5dGUKKwkJCUZpcklPQmFzZT1GaXJJT0Jhc2UgIDsKKwkJCWluZm8uZmlyX2Jhc2U9RmlySU9CYXNlOworCQkJaW5mby5pcnE9RmlySVJROworCQkJaW5mby5kbWE9RmlyRFJRMTsKKwkJCWluZm8uZG1hMj1GaXJEUlEwOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NDAsJmJUbXApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaWRldiwweDQwLCgoYlRtcCB8IDB4MDgpICYgMHhmZSkpOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NDIsJmJUbXApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaWRldiwweDQyLChiVG1wIHwgMHhmMCkpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaWRldiwweDVhLDB4YzApOworCQkJV3JpdGVMUENSZWcoMHgyOCwgMHg3MCApOworCQkJaWYgKHZpYV9pcmNjX29wZW4oMCwgJmluZm8sMHgzMDc2KSA9PSAwKQorCQkJCXJjPTA7CisJCX0gZWxzZQorCQkJcmMgPSAtRU5PREVWOyAvL0lSIG5vdCB0dXJuIG9uCSAKKwl9IGVsc2UgeyAvL05vdCBWVDEyMTEKKwkJSVJEQV9ERUJVRygyLCAiJXMoKTogQ2hpcHNldCA9IDMwOTZcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NjcsJmJUbXApOy8vY2hlY2sgaWYgQklPUyBFbmFibGUgRmlyCisJCWlmKChiVG1wJjB4MDEpPT0xKSB7ICAvLyBCSU9TIGVuYWJsZSBGSVIKKwkJCS8vRW5hYmxlIERvdWJsZSBETUEgY2xvY2sKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwweDQyLCZvbGRQQ0lfNDApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaWRldiwweDQyLG9sZFBDSV80MCB8IDB4ODApOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NDAsJm9sZFBDSV80MCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpZGV2LDB4NDAsb2xkUENJXzQwICYgMHhmNyk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NCwmb2xkUENJXzQ0KTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lkZXYsMHg0NCwweDRlKTsKKyAgLy8tLS0tLS0tLS0tIHJlYWQgY29uZmlndXJhdGlvbiBmcm9tIEZ1bmN0aW9uMCBvZiBzb3V0aCBicmlkZ2UKKwkJCWlmKChiVG1wJjB4MDIpPT0wKSB7CisJCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NDQsJmJUbXAxKTsgLy9ETUEKKwkJCQlGaXJEUlEwID0gKGJUbXAxICYgMHgzMCkgPj4gNDsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NCwmYlRtcDEpOworCQkJCUZpckRSUTEgPSAoYlRtcDEgJiAweGMwKSA+PiA2OworCQkJfSBlbHNlICB7CisJCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NDQsJmJUbXAxKTsgICAgLy9ETUEKKwkJCQlGaXJEUlEwID0gKGJUbXAxICYgMHgzMCkgPj4gNCA7CisJCQkJRmlyRFJRMT0wOworCQkJfQorCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NDcsJmJUbXAxKTsgIC8vSVJRCisJCQlGaXJJUlEgPSBiVG1wMSAmIDB4MGY7CisKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwweDY5LCZiVG1wKTsKKwkJCUZpcklPQmFzZSA9IGJUbXAgPDwgODsvL2hpZ2h0IGJ5dGUKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwweDY4LCZiVG1wKTsKKwkJCUZpcklPQmFzZSA9IChGaXJJT0Jhc2UgfCBiVG1wICkgJiAweGZmZjA7CisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJaW5mby5maXJfYmFzZT1GaXJJT0Jhc2U7CisJCQlpbmZvLmlycT1GaXJJUlE7CisJCQlpbmZvLmRtYT1GaXJEUlExOworCQkJaW5mby5kbWEyPUZpckRSUTA7CisJCQlpZiAodmlhX2lyY2Nfb3BlbigwLCAmaW5mbywweDMwOTYpID09IDApCisJCQkJcmM9MDsKKwkJfSBlbHNlCisJCQlyYyA9IC1FTk9ERVY7IC8vSVIgbm90IHR1cm4gb24gISEhISEKKwl9Ly9Ob3QgVlQxMjExCisKKwlJUkRBX0RFQlVHKDIsICIlcygpOiBFbmQgLSByYyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19jbGVhbiAoKQorICoKKyAqICAgIENsb3NlIGFsbCBjb25maWd1cmVkIGNoaXBzCisgKgorICovCitzdGF0aWMgdm9pZCB2aWFfaXJjY19jbGVhbih2b2lkKQoreworCWludCBpOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWZvciAoaT0wOyBpIDwgNDsgaSsrKSB7CisJCWlmIChkZXZfc2VsZltpXSkKKwkJCXZpYV9pcmNjX2Nsb3NlKGRldl9zZWxmW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2aWFfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIEZJWE1FIDogVGhpcyBpcyB1Z2x5LiBXZSBzaG91bGQgdXNlIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwkgKiB0byBnZXQgb3VyIGRyaXZlciBpbnN0YW5jZSBhbmQgY2FsbCBkaXJlY3RseSB2aWFfaXJjY19jbG9zZSgpLgorCSAqIFNlZSB2bHNpX2lyIGZvciBkZXRhaWxzLi4uCisJICogSmVhbiBJSSAqLworCXZpYV9pcmNjX2NsZWFuKCk7CisKKwkvKiBGSVhNRSA6IFRoaXMgc2hvdWxkIGJlIGluIHZpYV9pcmNjX2Nsb3NlKCksIGJlY2F1c2UgaGVyZSB3ZSBtYXkKKwkgKiB0aGVvcml0aWNhbGx5IGRpc2FibGUgc3RpbGwgY29uZmlndXJlZCBkZXZpY2VzIDotKCAtIEplYW4gSUkgKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2aWFfaXJjY19jbGVhbnVwKHZvaWQpCit7CisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIEZJWE1FIDogVGhpcyBzaG91bGQgYmUgcmVkdW5kYW50LCBhcyBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoKQorCSAqIHNob3VsZCBjYWxsIHZpYV9yZW1vdmVfb25lKCkgb24gZWFjaCBkZXZpY2UuCisJICogSmVhbiBJSSAqLworCXZpYV9pcmNjX2NsZWFuKCk7CisKKwkvKiBDbGVhbnVwIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGRyaXZlciAqLworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnZpYV9kcml2ZXIpOyAKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX29wZW4gKGlvYmFzZSwgaXJxKQorICoKKyAqICAgIE9wZW4gZHJpdmVyIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgX19kZXZpbml0IGludCB2aWFfaXJjY19vcGVuKGludCBpLCBjaGlwaW9fdCAqIGluZm8sIHVuc2lnbmVkIGludCBpZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZjsKKwlpbnQgZXJyOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIEFsbG9jYXRlIG5ldyBpbnN0YW5jZSBvZiB0aGUgZHJpdmVyICovCisJZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2Yoc3RydWN0IHZpYV9pcmNjX2NiKSk7CisJaWYgKGRldiA9PSBOVUxMKSAKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZWxmID0gZGV2LT5wcml2OworCXNlbGYtPm5ldGRldiA9IGRldjsKKwlzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CisKKwkvKiBGSVhNRSA6IFdlIHNob3VsZCBzdG9yZSBvdXIgZHJpdmVyIGluc3RhbmNlIGluIHRoZSBQQ0kgbGF5ZXIsCisJICogdXNpbmcgcGNpX3NldF9kcnZkYXRhKCksIG5vdCBpbiB0aGlzIGFycmF5LgorCSAqIFNlZSB2bHNpX2lyIGZvciBkZXRhaWxzLi4uIC0gSmVhbiBJSSAqLworCS8qIEZJWE1FIDogJ2knIGlzIGFsd2F5cyAwIChzZWUgdmlhX2luaXRfb25lKCkpIDotKCAtIEplYW4gSUkgKi8KKwkvKiBOZWVkIHRvIHN0b3JlIHNlbGYgc29tZXdoZXJlICovCisJZGV2X3NlbGZbaV0gPSBzZWxmOworCXNlbGYtPmluZGV4ID0gaTsKKwkvKiBJbml0aWFsaXplIFJlc291cmNlICovCisJc2VsZi0+aW8uY2ZnX2Jhc2UgPSBpbmZvLT5jZmdfYmFzZTsKKwlzZWxmLT5pby5maXJfYmFzZSA9IGluZm8tPmZpcl9iYXNlOworCXNlbGYtPmlvLmlycSA9IGluZm8tPmlycTsKKwlzZWxmLT5pby5maXJfZXh0ID0gQ0hJUF9JT19FWFRFTlQ7CisJc2VsZi0+aW8uZG1hID0gaW5mby0+ZG1hOworCXNlbGYtPmlvLmRtYTIgPSBpbmZvLT5kbWEyOworCXNlbGYtPmlvLmZpZm9fc2l6ZSA9IDMyOworCXNlbGYtPmNoaXBfaWQgPSBpZDsKKwlzZWxmLT5zdF9maWZvLmxlbiA9IDA7CisJc2VsZi0+UnhEYXRhUmVhZHkgPSAwOworCisJLyogUmVzZXJ2ZSB0aGUgaW9wb3J0cyB0aGF0IHdlIG5lZWQgKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0LCBkcml2ZXJfbmFtZSkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgY2FuJ3QgZ2V0IGlvYmFzZSBvZiAweCUwM3hcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLmZpcl9iYXNlKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0MTsKKwl9CisJCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zKTsKKworCS8qIENoZWNrIGlmIHVzZXIgaGFzIHN1cHBsaWVkIHRoZSBkb25nbGUgaWQgb3Igbm90ICovCisJaWYgKCFkb25nbGVfaWQpCisJCWRvbmdsZV9pZCA9IHZpYV9pcmNjX3JlYWRfZG9uZ2xlX2lkKHNlbGYtPmlvLmZpcl9iYXNlKTsKKwlzZWxmLT5pby5kb25nbGVfaWQgPSBkb25nbGVfaWQ7CisKKwkvKiBUaGUgb25seSB2YWx1ZSB3ZSBtdXN0IG92ZXJyaWRlIGl0IHRoZSBiYXVkcmF0ZSAqLworCS8qIE1heGltdW0gc3BlZWRzIGFuZCBjYXBhYmlsaXRpZXMgYXJlIGRvbmdsZS1kZXBlbmRhbnQuICovCisJc3dpdGNoKCBzZWxmLT5pby5kb25nbGVfaWQgKXsKKwljYXNlIDB4MGQ6CisJCXNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyA9CisJCSAgICBJUl85NjAwIHwgSVJfMTkyMDAgfCBJUl8zODQwMCB8IElSXzU3NjAwIHwgSVJfMTE1MjAwIHwKKwkJICAgIElSXzU3NjAwMCB8IElSXzExNTIwMDAgfCAoSVJfNDAwMDAwMCA8PCA4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0KKwkJICAgIElSXzk2MDAgfCBJUl8xOTIwMCB8IElSXzM4NDAwIHwgSVJfNTc2MDAgfCBJUl8xMTUyMDA7CisJCWJyZWFrOworCX0KKworCS8qIEZvbGxvd2luZyB3YXMgdXNlZCBmb3IgdGVzdGluZzoKKwkgKgorCSAqICAgc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfOTYwMDsKKwkgKgorCSAqIElzIGlzIG5vIGdvb2QsIGFzIGl0IHByb2hpYml0cyAoZXJyb3ItcHJvbmUpIHNwZWVkLWNoYW5nZXMuCisJICovCisKKwlzZWxmLT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gcW9zX210dF9iaXRzOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnNlbGYtPnFvcyk7CisKKwkvKiBNYXggRE1BIGJ1ZmZlciBzaXplIG5lZWRlZCA9IChkYXRhX3NpemUgKyA2KSAqICh3aW5kb3dfc2l6ZSkgKyA2OyAqLworCXNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgPSAxNDM4NCArIDIwNDg7CisJc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSA9IDE0Mzg0ICsgMjA0ODsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBpZiBuZWVkZWQgKi8KKwlzZWxmLT5yeF9idWZmLmhlYWQgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgICAmc2VsZi0+cnhfYnVmZl9kbWEsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT5yeF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQyOworCX0KKwltZW1zZXQoc2VsZi0+cnhfYnVmZi5oZWFkLCAwLCBzZWxmLT5yeF9idWZmLnRydWVzaXplKTsKKworCXNlbGYtPnR4X2J1ZmYuaGVhZCA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJCSAgICZzZWxmLT50eF9idWZmX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDM7CisJfQorCW1lbXNldChzZWxmLT50eF9idWZmLmhlYWQsIDAsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOworCisJc2VsZi0+cnhfYnVmZi5pbl9mcmFtZSA9IEZBTFNFOworCXNlbGYtPnJ4X2J1ZmYuc3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CisKKwkvKiBSZXNldCBUeCBxdWV1ZSBpbmZvICovCisJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCisJLyogS2VlcCB0cmFjayBvZiBtb2R1bGUgdXNhZ2UgKi8KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBPdmVycmlkZSB0aGUgbmV0d29yayBmdW5jdGlvbnMgd2UgbmVlZCB0byB1c2UgKi8KKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHZpYV9pcmNjX2hhcmRfeG1pdF9zaXI7CisJZGV2LT5vcGVuID0gdmlhX2lyY2NfbmV0X29wZW47CisJZGV2LT5zdG9wID0gdmlhX2lyY2NfbmV0X2Nsb3NlOworCWRldi0+ZG9faW9jdGwgPSB2aWFfaXJjY19uZXRfaW9jdGw7CisJZGV2LT5nZXRfc3RhdHMgPSB2aWFfaXJjY19uZXRfZ2V0X3N0YXRzOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0NDsKKworCUlSREFfTUVTU0FHRSgiSXJEQTogUmVnaXN0ZXJlZCBkZXZpY2UgJXMgKHZpYS1pcmNjKVxuIiwgZGV2LT5uYW1lKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGhhcmR3YXJlLi4KKwkqLworCXNlbGYtPmlvLnNwZWVkID0gOTYwMDsKKwl2aWFfaHdfaW5pdChzZWxmKTsKKwlyZXR1cm4gMDsKKyBlcnJfb3V0NDoKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKyBlcnJfb3V0MzoKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKyBlcnJfb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCk7CisgZXJyX291dDE6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlkZXZfc2VsZltpXSA9IE5VTEw7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIENsb3NlIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIGludCB2aWFfaXJjY19jbG9zZShzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlSZXNldENoaXAoaW9iYXNlLCA1KTsJLy9oYXJkd2FyZSByZXNldC4KKwkvKiBSZW1vdmUgbmV0ZGV2aWNlICovCisJdW5yZWdpc3Rlcl9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKworCS8qIFJlbGVhc2UgdGhlIFBPUlQgdGhhdCB0aGlzIGRyaXZlciBpcyB1c2luZyAqLworCUlSREFfREVCVUcoMiwgIiVzKCksIFJlbGVhc2luZyBSZWdpb24gJTAzeFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBzZWxmLT5pby5maXJfYmFzZSk7CisJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQpOworCWlmIChzZWxmLT50eF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkKQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CisJZGV2X3NlbGZbc2VsZi0+aW5kZXhdID0gTlVMTDsKKworCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9od19pbml0KHNlbGYpCisgKgorICogICAgUmV0dXJucyBub24tbmVnYXRpdmUgb24gc3VjY2Vzcy4KKyAqCisgKiBGb3JtZXJseSB2aWFfaXJjY19zZXR1cCAKKyAqLworc3RhdGljIHZvaWQgdmlhX2h3X2luaXQoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlTZXRNYXhSeFBhY2tldFNpemUoaW9iYXNlLCAweDBmZmYpOwkvL3NldCB0byBtYXg6NDA5NQorCS8vIEZJRk8gSW5pdAorCUVuUlhGSUZPUmVhZHlJbnQoaW9iYXNlLCBPRkYpOworCUVuUlhGSUZPSGFsZkxldmVsSW50KGlvYmFzZSwgT0ZGKTsKKwlFblRYRklGT0hhbGZMZXZlbEludChpb2Jhc2UsIE9GRik7CisJRW5UWEZJRk9VbmRlcnJ1bkVPTUludChpb2Jhc2UsIE9OKTsKKwlFblRYRklGT1JlYWR5SW50KGlvYmFzZSwgT0ZGKTsKKwlJbnZlcnRUWChpb2Jhc2UsIE9GRik7CisJSW52ZXJ0UlgoaW9iYXNlLCBPRkYpOworCisJaWYgKFJlYWRMUENSZWcoMHgyMCkgPT0gMHgzYykKKwkJV3JpdGVMUENSZWcoMHhGMCwgMCk7CS8vIGZvciBWVDEyMTEKKwkvKiBJbnQgSW5pdCAqLworCUVuUlhTcGVjSW50KGlvYmFzZSwgT04pOworCisJLyogVGhlIGZvbGxvd2luZyBpcyBiYXNpY2FsbHkgaHdyZXNldCAqLworCS8qIElmIHRoaXMgaXMgdGhlIGNhc2UsIHdoeSBub3QganVzdCBjYWxsIGh3cmVzZXQoKSA/IEplYW4gSUkgKi8KKwlSZXNldENoaXAoaW9iYXNlLCA1KTsKKwlFbmFibGVETUEoaW9iYXNlLCBPRkYpOworCUVuYWJsZVRYKGlvYmFzZSwgT0ZGKTsKKwlFbmFibGVSWChpb2Jhc2UsIE9GRik7CisJRW5SWERNQShpb2Jhc2UsIE9GRik7CisJRW5UWERNQShpb2Jhc2UsIE9GRik7CisJUlhTdGFydChpb2Jhc2UsIE9GRik7CisJVFhTdGFydChpb2Jhc2UsIE9GRik7CisJSW5pdENhcmQoaW9iYXNlKTsKKwlDb21tb25Jbml0KGlvYmFzZSk7CisJU0lSRmlsdGVyKGlvYmFzZSwgT04pOworCVNldFNJUihpb2Jhc2UsIE9OKTsKKwlDUkMxNihpb2Jhc2UsIE9OKTsKKwlFblRYQ1JDKGlvYmFzZSwgMCk7CisJV3JpdGVSZWcoaW9iYXNlLCBJX1NUX0NUXzAsIDB4MDApOworCVNldEJhdWRSYXRlKGlvYmFzZSwgOTYwMCk7CisJU2V0UHVsc2VXaWR0aChpb2Jhc2UsIDEyKTsKKwlTZXRTZW5kUHJlYW1ibGVDb3VudChpb2Jhc2UsIDApOworCisJc2VsZi0+aW8uc3BlZWQgPSA5NjAwOworCXNlbGYtPnN0X2ZpZm8ubGVuID0gMDsKKworCXZpYV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoaW9iYXNlLCBzZWxmLT5pby5zcGVlZCwKKwkJCQkgICAgIHNlbGYtPmlvLmRvbmdsZV9pZCk7CisKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHg4MCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19yZWFkX2RvbmdsZV9pZCAodm9pZCkKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfcmVhZF9kb25nbGVfaWQoaW50IGlvYmFzZSkKK3sKKwlpbnQgZG9uZ2xlX2lkID0gOTsJLyogRGVmYXVsdCB0byBJQk0gKi8KKworCUlSREFfRVJST1IoInZpYS1pcmNjOiBkb25nbGUgcHJvYmluZyBub3Qgc3VwcG9ydGVkLCBwbGVhc2Ugc3BlY2lmeSBkb25nbGVfaWQgbW9kdWxlIHBhcmFtZXRlci5cbiIpOworCXJldHVybiBkb25nbGVfaWQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkIChpb2Jhc2UsIHNwZWVkLCBkb25nbGVfaWQpCisgKiAgICBDaGFuZ2Ugc3BlZWQgb2YgdGhlIGF0dGFjaCBkb25nbGUKKyAqICAgIG9ubHkgaW1wbGVtZW50IHR3byB0eXBlIG9mIGRvbmdsZSBjdXJyZW50bHkuCisgKi8KK3N0YXRpYyB2b2lkIHZpYV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoaW50IGlvYmFzZSwgaW50IHNwZWVkLAorCQkJCQkgaW50IGRvbmdsZV9pZCkKK3sKKwl1OCBtb2RlID0gMDsKKworCS8qIHNwZWVkIGlzIHVudXNlZCwgYXMgd2UgdXNlIElzU0lST24oKS9Jc01JUk9uKCkgKi8KKwlzcGVlZCA9IHNwZWVkOworCisJSVJEQV9ERUJVRygxLCAiJXMoKTogY2hhbmdlX2RvbmdsZV9zcGVlZCB0byAlZCBmb3IgMHgleCwgJWRcbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgc3BlZWQsIGlvYmFzZSwgZG9uZ2xlX2lkKTsKKworCXN3aXRjaCAoZG9uZ2xlX2lkKSB7CisKKwkJLyogTm90ZTogVGhlIGRvbmdsZV9pZCdzIGxpc3RlZCBoZXJlIGFyZSBkZXJpdmVkIGZyb20KKwkJICogbnNjLWlyY2MuYyAqLyAKKworCWNhc2UgMHgwODoJCS8qIEhQIEhTREwtMjMwMCwgSFAgSFNETC0zNjAwL0hTREwtMzYxMCAqLworCQlVc2VPbmVSWChpb2Jhc2UsIE9OKTsJLy8gdXNlIG9uZSBSWCBwaW4gICBSWDEsUlgyCisJCUludmVydFRYKGlvYmFzZSwgT0ZGKTsKKwkJSW52ZXJ0UlgoaW9iYXNlLCBPRkYpOworCisJCUVuUlgyKGlvYmFzZSwgT04pOwkvL3NpciB0byByeDIKKwkJRW5HUElPdG9SWDIoaW9iYXNlLCBPRkYpOworCisJCWlmIChJc1NJUk9uKGlvYmFzZSkpIHsJLy9zaXIKKwkJCS8vIE1vZGUgc2VsZWN0IE9mZgorCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPTik7CisJCQl1ZGVsYXkoMTAwMCk7CisJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9GRik7CisJCX0gZWxzZSB7CisJCQlpZiAoSXNNSVJPbihpb2Jhc2UpKSB7CS8vbWlyCisJCQkJLy8gTW9kZSBzZWxlY3QgT24KKwkJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9GRik7CisJCQkJdWRlbGF5KDIwKTsKKwkJCX0gZWxzZSB7CS8vIGZpcgorCQkJCWlmIChJc0ZJUk9uKGlvYmFzZSkpIHsJLy9maXIKKwkJCQkJLy8gTW9kZSBzZWxlY3QgT24KKwkJCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPRkYpOworCQkJCQl1ZGVsYXkoMjApOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgwOToJCS8qIElCTTMxVDExMDAgb3IgVGVtaWMgVEZEUzYwMDAvVEZEUzY1MDAgKi8KKwkJVXNlT25lUlgoaW9iYXNlLCBPTik7CS8vdXNlIE9ORSBSWC4uLi5SWDEKKwkJSW52ZXJ0VFgoaW9iYXNlLCBPRkYpOworCQlJbnZlcnRSWChpb2Jhc2UsIE9GRik7CS8vIGludmVydCBSWCBwaW4KKworCQlFblJYMihpb2Jhc2UsIE9OKTsKKwkJRW5HUElPdG9SWDIoaW9iYXNlLCBPRkYpOworCQlpZiAoSXNTSVJPbihpb2Jhc2UpKSB7CS8vc2lyCisJCQkvLyBNb2RlIHNlbGVjdCBPbgorCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPTik7CisJCQl1ZGVsYXkoMjApOworCQkJLy8gTW9kZSBzZWxlY3QgT2ZmCisJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9GRik7CisJCX0KKwkJaWYgKElzTUlST24oaW9iYXNlKSkgewkvL21pcgorCQkJLy8gTW9kZSBzZWxlY3QgT24KKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJCXVkZWxheSgyMCk7CisJCQkvLyBNb2RlIHNlbGVjdCBPZmYKKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT04pOworCQl9IGVsc2UgewkvLyBmaXIKKwkJCWlmIChJc0ZJUk9uKGlvYmFzZSkpIHsJLy9maXIKKwkJCQkvLyBNb2RlIHNlbGVjdCBPbgorCQkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJCQkvLyBUWCBPbgorCQkJCVdyaXRlVFgoaW9iYXNlLCBPTik7CisJCQkJdWRlbGF5KDIwKTsKKwkJCQkvLyBNb2RlIHNlbGVjdCBPRkYKKwkJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9OKTsKKwkJCQl1ZGVsYXkoMjApOworCQkJCS8vIFRYIE9mZgorCQkJCVdyaXRlVFgoaW9iYXNlLCBPRkYpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSAweDBkOgorCQlVc2VPbmVSWChpb2Jhc2UsIE9GRik7CS8vIHVzZSB0d28gUlggcGluICAgUlgxLFJYMgorCQlJbnZlcnRUWChpb2Jhc2UsIE9GRik7CisJCUludmVydFJYKGlvYmFzZSwgT0ZGKTsKKwkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPRkYpOworCQlpZiAoSXNTSVJPbihpb2Jhc2UpKSB7CS8vc2lyCisJCQlFbkdQSU90b1JYMihpb2Jhc2UsIE9GRik7CisJCQlXcml0ZUdJTyhpb2Jhc2UsIE9GRik7CisJCQlFblJYMihpb2Jhc2UsIE9GRik7CS8vc2lyIHRvIHJ4MgorCQl9IGVsc2UgewkvLyBmaXIgbWlyCisJCQlFbkdQSU90b1JYMihpb2Jhc2UsIE9GRik7CisJCQlXcml0ZUdJTyhpb2Jhc2UsIE9GRik7CisJCQlFblJYMihpb2Jhc2UsIE9GRik7CS8vZmlyIHRvIHJ4CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDB4MTE6CQkvKiBUZW1pYyBURkRTNDUwMCAqLworCisJCUlSREFfREVCVUcoMiwgIiVzOiBUZW1pYyBURkRTNDUwMDogT25lIFJYIHBpbiwgVFggbm9ybWFsLCBSWCBpbnZlcnRlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJVXNlT25lUlgoaW9iYXNlLCBPTik7CS8vdXNlIE9ORSBSWC4uLi5SWDEKKwkJSW52ZXJ0VFgoaW9iYXNlLCBPRkYpOworCQlJbnZlcnRSWChpb2Jhc2UsIE9OKTsJLy8gaW52ZXJ0IFJYIHBpbgorCQorCQlFblJYMihpb2Jhc2UsIE9OKTsJLy9zaXIgdG8gcngyCisJCUVuR1BJT3RvUlgyKGlvYmFzZSwgT0ZGKTsKKworCQlpZiggSXNTSVJPbihpb2Jhc2UpICl7CS8vc2lyCisKKwkJCS8vIE1vZGUgc2VsZWN0IE9uCisJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9OKTsKKwkJCXVkZWxheSgyMCk7CisJCQkvLyBNb2RlIHNlbGVjdCBPZmYKKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKworCQl9IGVsc2V7CisJCQlJUkRBX0RFQlVHKDAsICIlczogV2FybmluZzogVEZEUzQ1MDAgbm90IHJ1bm5pbmcgaW4gU0lSIG1vZGUgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgwZmY6CQkvKiBWaXNoYXkgKi8KKwkJaWYgKElzU0lST24oaW9iYXNlKSkKKwkJCW1vZGUgPSAwOworCQllbHNlIGlmIChJc01JUk9uKGlvYmFzZSkpCisJCQltb2RlID0gMTsKKwkJZWxzZSBpZiAoSXNGSVJPbihpb2Jhc2UpKQorCQkJbW9kZSA9IDI7CisJCWVsc2UgaWYgKElzVkZJUk9uKGlvYmFzZSkpCisJCQltb2RlID0gNTsJLy9WRklSLTE2CisJCVNJX1NldE1vZGUoaW9iYXNlLCBtb2RlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlczogRXJyb3I6IGRvbmdsZV9pZCAlZCB1bnN1cHBvcnRlZCAhXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfaWQpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2NoYW5nZV9zcGVlZCAoc2VsZiwgYmF1ZCkKKyAqCisgKiAgICBDaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHZpYV9pcmNjX2NoYW5nZV9zcGVlZChzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYsIF9fdTMyIHNwZWVkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzZWxmLT5uZXRkZXY7CisJdTE2IGlvYmFzZTsKKwl1OCB2YWx1ZSA9IDAsIGJUbXA7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkvKiBVcGRhdGUgYWNjb3VudGluZyBmb3IgbmV3IHNwZWVkICovCisJc2VsZi0+aW8uc3BlZWQgPSBzcGVlZDsKKwlJUkRBX0RFQlVHKDEsICIlczogY2hhbmdlX3NwZWVkIHRvICVkIGJwcy5cbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQpOworCisJV3JpdGVSZWcoaW9iYXNlLCBJX1NUX0NUXzAsIDB4MCk7CisKKwkvKiBDb250cm9sbGVyIG1vZGUgc2VsbGVjdGlvbiAqLworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIDI0MDA6CisJY2FzZSA5NjAwOgorCWNhc2UgMTkyMDA6CisJY2FzZSAzODQwMDoKKwljYXNlIDU3NjAwOgorCWNhc2UgMTE1MjAwOgorCQl2YWx1ZSA9ICgxMTUyMDAvc3BlZWQpLTE7CisJCVNldFNJUihpb2Jhc2UsIE9OKTsKKwkJQ1JDMTYoaW9iYXNlLCBPTik7CisJCWJyZWFrOworCWNhc2UgNTc2MDAwOgorCQkvKiBGSVhNRTogdGhpcyBjYW4ndCBiZSByaWdodCwgYXMgaXQncyB0aGUgc2FtZSBhcyAxMTUyMDAsCisJCSAqIGFuZCA1NzYwMDAgaXMgTUlSLCBub3QgU0lSLiAqLworCQl2YWx1ZSA9IDA7CisJCVNldFNJUihpb2Jhc2UsIE9OKTsKKwkJQ1JDMTYoaW9iYXNlLCBPTik7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwMDoKKwkJdmFsdWUgPSAwOworCQlTZXRNSVIoaW9iYXNlLCBPTik7CisJCS8qIEZJWE1FOiBDUkMgPz8/ICovCisJCWJyZWFrOworCWNhc2UgNDAwMDAwMDoKKwkJdmFsdWUgPSAwOworCQlTZXRGSVIoaW9iYXNlLCBPTik7CisJCVNldFB1bHNlV2lkdGgoaW9iYXNlLCAwKTsKKwkJU2V0U2VuZFByZWFtYmxlQ291bnQoaW9iYXNlLCAxNCk7CisJCUNSQzE2KGlvYmFzZSwgT0ZGKTsKKwkJRW5UWENSQyhpb2Jhc2UsIE9OKTsKKwkJYnJlYWs7CisJY2FzZSAxNjAwMDAwMDoKKwkJdmFsdWUgPSAwOworCQlTZXRWRklSKGlvYmFzZSwgT04pOworCQkvKiBGSVhNRTogQ1JDID8/PyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWx1ZSA9IDA7CisJCWJyZWFrOworCX0KKworCS8qIFNldCBiYXVkcmF0ZSB0byAweDE5WzIuLjddICovCisJYlRtcCA9IChSZWFkUmVnKGlvYmFzZSwgSV9DRl9IXzEpICYgMHgwMyk7CisJYlRtcCB8PSB2YWx1ZSA8PCAyOworCVdyaXRlUmVnKGlvYmFzZSwgSV9DRl9IXzEsIGJUbXApOworCisJLyogU29tZSBkb25nbGVzIG1heSBuZWVkIHRvIGJlIGluZm9ybWVkIGFib3V0IHNwZWVkIGNoYW5nZXMuICovCisJdmlhX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChpb2Jhc2UsIHNwZWVkLCBzZWxmLT5pby5kb25nbGVfaWQpOworCisJLyogU2V0IEZJRk8gc2l6ZSB0byA2NCAqLworCVNldEZJRk8oaW9iYXNlLCA2NCk7CisKKwkvKiBFbmFibGUgSVIgKi8KKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHg4MCk7CisKKwkvLyBFblRYRklGT0hhbGZMZXZlbEludChpb2Jhc2UsT04pOworCisJLyogRW5hYmxlIHNvbWUgaW50ZXJydXB0cyBzbyB3ZSBjYW4gcmVjZWl2ZSBmcmFtZXMgKi8KKwkvL0VuQWxsSW50KGlvYmFzZSxPTik7CisKKwlpZiAoSXNTSVJPbihpb2Jhc2UpKSB7CisJCVNJUkZpbHRlcihpb2Jhc2UsIE9OKTsKKwkJU0lSUmVjdkFueShpb2Jhc2UsIE9OKTsKKwl9IGVsc2UgeworCQlTSVJGaWx0ZXIoaW9iYXNlLCBPRkYpOworCQlTSVJSZWN2QW55KGlvYmFzZSwgT0ZGKTsKKwl9CisKKwlpZiAoc3BlZWQgPiAxMTUyMDApIHsKKwkJLyogSW5zdGFsbCBGSVIgeG1pdCBoYW5kbGVyICovCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdmlhX2lyY2NfaGFyZF94bWl0X2ZpcjsKKwkJdmlhX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisJfSBlbHNlIHsKKwkJLyogSW5zdGFsbCBTSVIgeG1pdCBoYW5kbGVyICovCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdmlhX2lyY2NfaGFyZF94bWl0X3NpcjsKKwl9CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfaGFyZF94bWl0IChza2IsIGRldikKKyAqCisgKiAgICBUcmFuc21pdCB0aGUgZnJhbWUhCisgKgorICovCitzdGF0aWMgaW50IHZpYV9pcmNjX2hhcmRfeG1pdF9zaXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IGlvYmFzZTsKKwlfX3UzMiBzcGVlZDsKKworCXNlbGYgPSAoc3RydWN0IHZpYV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUgKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJdmlhX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJfQorCUluaXRDYXJkKGlvYmFzZSk7CisJQ29tbW9uSW5pdChpb2Jhc2UpOworCVNJUkZpbHRlcihpb2Jhc2UsIE9OKTsKKwlTZXRTSVIoaW9iYXNlLCBPTik7CisJQ1JDMTYoaW9iYXNlLCBPTik7CisJRW5UWENSQyhpb2Jhc2UsIDApOworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDAwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCXNlbGYtPnR4X2J1ZmYubGVuID0KKwkgICAgYXN5bmNfd3JhcF9za2Ioc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsCisJCQkgICBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKworCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOworCS8qIFNlbmQgdGhpcyBmcmFtZSB3aXRoIG9sZCBzcGVlZCAqLworCVNldEJhdWRSYXRlKGlvYmFzZSwgc2VsZi0+aW8uc3BlZWQpOworCVNldFB1bHNlV2lkdGgoaW9iYXNlLCAxMik7CisJU2V0U2VuZFByZWFtYmxlQ291bnQoaW9iYXNlLCAwKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHg4MCk7CisKKwlFbmFibGVUWChpb2Jhc2UsIE9OKTsKKwlFbmFibGVSWChpb2Jhc2UsIE9GRik7CisKKwlSZXNldENoaXAoaW9iYXNlLCAwKTsKKwlSZXNldENoaXAoaW9iYXNlLCAxKTsKKwlSZXNldENoaXAoaW9iYXNlLCAyKTsKKwlSZXNldENoaXAoaW9iYXNlLCAzKTsKKwlSZXNldENoaXAoaW9iYXNlLCA0KTsKKworCUVuQWxsSW50KGlvYmFzZSwgT04pOworCUVuVFhETUEoaW9iYXNlLCBPTik7CisJRW5SWERNQShpb2Jhc2UsIE9GRik7CisKKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIHNlbGYtPnR4X2J1ZmZfZG1hLCBzZWxmLT50eF9idWZmLmxlbiwKKwkJICAgICAgIERNQV9UWF9NT0RFKTsKKworCVNldFNlbmRCeXRlKGlvYmFzZSwgc2VsZi0+dHhfYnVmZi5sZW4pOworCVJYU3RhcnQoaW9iYXNlLCBPRkYpOworCVRYU3RhcnQoaW9iYXNlLCBPTik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpYV9pcmNjX2hhcmRfeG1pdF9maXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmOworCXUxNiBpb2Jhc2U7CisJX191MzIgc3BlZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNlbGYgPSAoc3RydWN0IHZpYV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCWlmIChzZWxmLT5zdF9maWZvLmxlbikKKwkJcmV0dXJuIDA7CisJaWYgKHNlbGYtPmNoaXBfaWQgPT0gMHgzMDc2KQorCQlpb2RlbGF5KDE1MDApOworCWVsc2UKKwkJdWRlbGF5KDE1MDApOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCWlmICghc2tiLT5sZW4pIHsKKwkJCXZpYV9pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzcGVlZCk7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCA9IHNlbGYtPnR4X2ZpZm8udGFpbDsKKwlzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0ubGVuID0gc2tiLT5sZW47CisKKwlzZWxmLT50eF9maWZvLnRhaWwgKz0gc2tiLT5sZW47CisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJbWVtY3B5KHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCwgc2tiLT5kYXRhLAorCSAgICAgICBza2ItPmxlbik7CisJc2VsZi0+dHhfZmlmby5sZW4rKzsKKwlzZWxmLT50eF9maWZvLmZyZWUrKzsKKy8vRjAxICAgaWYgKHNlbGYtPnR4X2ZpZm8ubGVuID09IDEpIHsKKwl2aWFfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UpOworLy9GMDEgICB9CisvL0YwMSAgIGlmIChzZWxmLT50eF9maWZvLmZyZWUgPCAoTUFYX1RYX1dJTkRPVyAtMSApKSBuZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV94bWl0KHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgdTE2IGlvYmFzZSkKK3sKKwlFblRYRE1BKGlvYmFzZSwgT0ZGKTsKKwlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19YTUlUOworCUVuUGh5cyhpb2Jhc2UsIE9OKTsKKwlFbmFibGVUWChpb2Jhc2UsIE9OKTsKKwlFbmFibGVSWChpb2Jhc2UsIE9GRik7CisJUmVzZXRDaGlwKGlvYmFzZSwgMCk7CisJUmVzZXRDaGlwKGlvYmFzZSwgMSk7CisJUmVzZXRDaGlwKGlvYmFzZSwgMik7CisJUmVzZXRDaGlwKGlvYmFzZSwgMyk7CisJUmVzZXRDaGlwKGlvYmFzZSwgNCk7CisJRW5BbGxJbnQoaW9iYXNlLCBPTik7CisJRW5UWERNQShpb2Jhc2UsIE9OKTsKKwlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsCisJCSAgICAgICAoKHU4ICopc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0uc3RhcnQgLQorCQkJc2VsZi0+dHhfYnVmZi5oZWFkKSArIHNlbGYtPnR4X2J1ZmZfZG1hLAorCQkgICAgICAgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0ubGVuLCBETUFfVFhfTU9ERSk7CisJSVJEQV9ERUJVRygxLCAiJXM6IHR4X2ZpZm8ucHRyPSV4LGxlbj0leCx0eF9maWZvLmxlbj0leC4uXG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPnR4X2ZpZm8ucHRyLAorCQkgICBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4sCisJCSAgIHNlbGYtPnR4X2ZpZm8ubGVuKTsKKworCVNldFNlbmRCeXRlKGlvYmFzZSwgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0ubGVuKTsKKwlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlUWFN0YXJ0KGlvYmFzZSwgT04pOworCXJldHVybiAwOworCit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19kbWFfeG1pdF9jb21wbGV0ZSAoc2VsZikKKyAqCisgKiAgICBUaGUgdHJhbnNmZXIgb2YgYSBmcmFtZSBpbiBmaW5pc2hlZC4gVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgY2FsbGVkIAorICogICAgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyCisgKgorICovCitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCWludCByZXQgPSBUUlVFOworCXU4IFR4X3N0YXR1czsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkvKiBEaXNhYmxlIERNQSAqLworLy8gICAgICBEaXNhYmxlRG1hQ2hhbm5lbChzZWxmLT5pby5kbWEpOworCS8qIENoZWNrIGZvciB1bmRlcnJydW4hICovCisJLyogQ2xlYXIgYml0LCBieSB3cml0aW5nIDEgaW50byBpdCAqLworCVR4X3N0YXR1cyA9IEdldFRYU3RhdHVzKGlvYmFzZSk7CisJaWYgKFR4X3N0YXR1cyAmIDB4MDgpIHsKKwkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCWh3cmVzZXQoc2VsZik7CisvLyBob3cgdG8gY2xlYXIgdW5kZXJycnVuID8KKwl9IGVsc2UgeworCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCVJlc2V0Q2hpcChpb2Jhc2UsIDMpOworCQlSZXNldENoaXAoaW9iYXNlLCA0KTsKKwl9CisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJaWYgKHNlbGYtPm5ld19zcGVlZCkgeworCQl2aWFfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsKKwkJc2VsZi0+bmV3X3NwZWVkID0gMDsKKwl9CisKKwkvKiBGaW5pc2hlZCB3aXRoIHRoaXMgZnJhbWUsIHNvIHByZXBhcmUgZm9yIG5leHQgKi8KKwlpZiAoSXNGSVJPbihpb2Jhc2UpKSB7CisJCWlmIChzZWxmLT50eF9maWZvLmxlbikgeworCQkJc2VsZi0+dHhfZmlmby5sZW4tLTsKKwkJCXNlbGYtPnR4X2ZpZm8ucHRyKys7CisJCX0KKwl9CisJSVJEQV9ERUJVRygxLAorCQkgICAiJXM6IHR4X2ZpZm8ubGVuPSV4ICx0eF9maWZvLnB0cj0leCx0eF9maWZvLmZyZWU9JXguLi5cbiIsCisJCSAgIF9fRlVOQ1RJT05fXywKKwkJICAgc2VsZi0+dHhfZmlmby5sZW4sIHNlbGYtPnR4X2ZpZm8ucHRyLCBzZWxmLT50eF9maWZvLmZyZWUpOworLyogRjAxX1MKKwkvLyBBbnkgZnJhbWVzIHRvIGJlIHNlbnQgYmFjay10by1iYWNrPyAKKwlpZiAoc2VsZi0+dHhfZmlmby5sZW4pIHsKKwkJLy8gTm90IGZpbmlzaGVkIHlldCEgCisJICAJdmlhX2lyY2NfZG1hX3htaXQoc2VsZiwgaW9iYXNlKTsKKwkJcmV0ID0gRkFMU0U7CisJfSBlbHNlIHsgCitGMDFfRSovCisJLy8gUmVzZXQgVHggRklGTyBpbmZvIAorCXNlbGYtPnR4X2ZpZm8ubGVuID0gc2VsZi0+dHhfZmlmby5wdHIgPSBzZWxmLT50eF9maWZvLmZyZWUgPSAwOworCXNlbGYtPnR4X2ZpZm8udGFpbCA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKy8vRjAxICAgfQorCisJLy8gTWFrZSBzdXJlIHdlIGhhdmUgcm9vbSBmb3IgbW9yZSBmcmFtZXMgCisvL0YwMSAgIGlmIChzZWxmLT50eF9maWZvLmZyZWUgPCAoTUFYX1RYX1dJTkRPVyAtMSApKSB7CisJLy8gTm90IGJ1c3kgdHJhbnNtaXR0aW5nIGFueW1vcmUgCisJLy8gVGVsbCB0aGUgbmV0d29yayBsYXllciwgdGhhdCB3ZSBjYW4gYWNjZXB0IG1vcmUgZnJhbWVzIAorCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKy8vRjAxICAgfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19kbWFfcmVjZWl2ZSAoc2VsZikKKyAqCisgKiAgICBTZXQgY29uZmlndXJhdGlvbiBmb3IgcmVjZWl2ZSBhIGZyYW1lLgorICoKKyAqLworc3RhdGljIGludCB2aWFfaXJjY19kbWFfcmVjZWl2ZShzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNlbGYtPnR4X2ZpZm8ubGVuID0gc2VsZi0+dHhfZmlmby5wdHIgPSBzZWxmLT50eF9maWZvLmZyZWUgPSAwOworCXNlbGYtPnR4X2ZpZm8udGFpbCA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwlzZWxmLT5SeERhdGFSZWFkeSA9IDA7CisJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fUkVDVjsKKwlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CisJc2VsZi0+c3RfZmlmby5sZW4gPSBzZWxmLT5zdF9maWZvLnBlbmRpbmdfYnl0ZXMgPSAwOworCXNlbGYtPnN0X2ZpZm8udGFpbCA9IHNlbGYtPnN0X2ZpZm8uaGVhZCA9IDA7CisKKwlFblBoeXMoaW9iYXNlLCBPTik7CisJRW5hYmxlVFgoaW9iYXNlLCBPRkYpOworCUVuYWJsZVJYKGlvYmFzZSwgT04pOworCisJUmVzZXRDaGlwKGlvYmFzZSwgMCk7CisJUmVzZXRDaGlwKGlvYmFzZSwgMSk7CisJUmVzZXRDaGlwKGlvYmFzZSwgMik7CisJUmVzZXRDaGlwKGlvYmFzZSwgMyk7CisJUmVzZXRDaGlwKGlvYmFzZSwgNCk7CisKKwlFbkFsbEludChpb2Jhc2UsIE9OKTsKKwlFblRYRE1BKGlvYmFzZSwgT0ZGKTsKKwlFblJYRE1BKGlvYmFzZSwgT04pOworCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYTIsIHNlbGYtPnJ4X2J1ZmZfZG1hLAorCQkgIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsIERNQV9SWF9NT0RFKTsKKwlUWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlSWFN0YXJ0KGlvYmFzZSwgT04pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZSAoc2VsZikKKyAqCisgKiAgICBDb250cm9sbGVyIEZpbmlzaGVkIHdpdGggcmVjZWl2aW5nIGZyYW1lcywKKyAqICAgIGFuZCB0aGlzIHJvdXRpbmUgaXMgY2FsbCBieSBJU1IKKyAqICAgIAorICovCitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwKKwkJCQkJIGludCBpb2Jhc2UpCit7CisJc3RydWN0IHN0X2ZpZm8gKnN0X2ZpZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuLCBpOworCXU4IHN0YXR1cyA9IDA7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlzdF9maWZvID0gJnNlbGYtPnN0X2ZpZm87CisKKwlpZiAoc2VsZi0+aW8uc3BlZWQgPCA0MDAwMDAwKSB7CS8vU3BlZWQgYmVsb3cgRklSCisJCWxlbiA9IEdldFJlY3ZCeXRlKGlvYmFzZSwgc2VsZik7CisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSk7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiBGQUxTRTsKKwkJLy8gTWFrZSBzdXJlIElQIGhlYWRlciBnZXRzIGFsaWduZWQgCisJCXNrYl9yZXNlcnZlKHNrYiwgMSk7CisJCXNrYl9wdXQoc2tiLCBsZW4gLSAyKTsKKwkJaWYgKHNlbGYtPmNoaXBfaWQgPT0gMHgzMDc2KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMjsgaSsrKQorCQkJCXNrYi0+ZGF0YVtpXSA9IHNlbGYtPnJ4X2J1ZmYuZGF0YVtpICogMl07CisJCX0gZWxzZSB7CisJCQlpZiAoc2VsZi0+Y2hpcF9pZCA9PSAweDMwOTYpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMjsgaSsrKQorCQkJCQlza2ItPmRhdGFbaV0gPQorCQkJCQkgICAgc2VsZi0+cnhfYnVmZi5kYXRhW2ldOworCQkJfQorCQl9CisJCS8vIE1vdmUgdG8gbmV4dCBmcmFtZSAKKwkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJbmV0aWZfcngoc2tiKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJZWxzZSB7CQkJLy9GSVIgbW9kZQorCQlsZW4gPSBHZXRSZWN2Qnl0ZShpb2Jhc2UsIHNlbGYpOworCQlpZiAobGVuID09IDApCisJCQlyZXR1cm4gVFJVRTsJLy9pbnRlcnJ1cHQgb25seSwgZGF0YSBtYXliZSBtb3ZlIGJ5IFJ4VCAgCisJCWlmICgoKGxlbiAtIDQpIDwgMikgfHwgKChsZW4gLSA0KSA+IDIwNDgpKSB7CisJCQlJUkRBX0RFQlVHKDEsICIlcygpOiBUcm91YmxlOmxlbj0leCxDdXJDb3VudD0leCxMYXN0Q291bnQ9JXguLlxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIGxlbiwgUnhDdXJDb3VudChpb2Jhc2UsIHNlbGYpLAorCQkJCSAgIHNlbGYtPlJ4TGFzdENvdW50KTsKKwkJCWh3cmVzZXQoc2VsZik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJSVJEQV9ERUJVRygyLCAiJXMoKTogZmlmby5sZW49JXgsbGVuPSV4LEN1ckNvdW50PSV4Li5cbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sCisJCQkgICBzdF9maWZvLT5sZW4sIGxlbiAtIDQsIFJ4Q3VyQ291bnQoaW9iYXNlLCBzZWxmKSk7CisKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5zdGF0dXMgPSBzdGF0dXM7CisJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+dGFpbF0ubGVuID0gbGVuOworCQlzdF9maWZvLT5wZW5kaW5nX2J5dGVzICs9IGxlbjsKKwkJc3RfZmlmby0+dGFpbCsrOworCQlzdF9maWZvLT5sZW4rKzsKKwkJaWYgKHN0X2ZpZm8tPnRhaWwgPiBNQVhfUlhfV0lORE9XKQorCQkJc3RfZmlmby0+dGFpbCA9IDA7CisJCXNlbGYtPlJ4RGF0YVJlYWR5ID0gMDsKKworCQkvLyBJdCBtYXliZSBoYXZlIE1BWF9SWF9XSU5ET1cgcGFja2FnZSByZWNlaXZlIGJ5CisJCS8vIHJlY2VpdmVfY29tcGxldGUgYmVmb3JlIFRpbWVyIElSUQorLyogRjAxX1MKKyAgICAgICAgICBpZiAoc3RfZmlmby0+bGVuIDwgKE1BWF9SWF9XSU5ET1crMiApKSB7IAorCQkgIFJYU3RhcnQoaW9iYXNlLE9OKTsKKwkgIAkgIFNldFRpbWVyKGlvYmFzZSw0KTsKKwkgIH0KKwkgIGVsc2UJICB7IAorRjAxX0UgKi8KKwkJRW5hYmxlUlgoaW9iYXNlLCBPRkYpOworCQlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwkJUlhTdGFydChpb2Jhc2UsIE9GRik7CisvL0YwMV9TCisJCS8vIFB1dCB0aGlzIGVudHJ5IGJhY2sgaW4gZmlmbyAKKwkJaWYgKHN0X2ZpZm8tPmhlYWQgPiBNQVhfUlhfV0lORE9XKQorCQkJc3RfZmlmby0+aGVhZCA9IDA7CisJCXN0YXR1cyA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzOworCQlsZW4gPSBzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLmxlbjsKKwkJc3RfZmlmby0+aGVhZCsrOworCQlzdF9maWZvLT5sZW4tLTsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDEgLSA0KTsKKwkJLyoKKwkJICogaWYgZnJhbWUgc2l6ZSxkYXRhIHB0cixvciBza2IgcHRyIGFyZSB3cm9uZyAsdGhlIGdldCBuZXh0CisJCSAqIGVudHJ5LgorCQkgKi8KKwkJaWYgKChza2IgPT0gTlVMTCkgfHwgKHNrYi0+ZGF0YSA9PSBOVUxMKQorCQkgICAgfHwgKHNlbGYtPnJ4X2J1ZmYuZGF0YSA9PSBOVUxMKSB8fCAobGVuIDwgNikpIHsKKwkJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCXJldHVybiBUUlVFOworCQl9CisJCXNrYl9yZXNlcnZlKHNrYiwgMSk7CisJCXNrYl9wdXQoc2tiLCBsZW4gLSA0KTsKKworCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbiAtIDQpOworCQlJUkRBX0RFQlVHKDIsICIlcygpOiBsZW49JXgucnhfYnVmZj0lcFxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgbGVuIC0gNCwgc2VsZi0+cnhfYnVmZi5kYXRhKTsKKworCQkvLyBNb3ZlIHRvIG5leHQgZnJhbWUgCisJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJCW5ldGlmX3J4KHNrYik7CisKKy8vRjAxX0UKKwl9CQkJLy9GSVIKKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorICogaWYgZnJhbWUgaXMgcmVjZWl2ZWQgLCBidXQgbm8gSU5UICx0aGVuIHVzZSB0aGlzIHJvdXRpbmUgdG8gdXBsb2FkIGZyYW1lLgorICovCitzdGF0aWMgaW50IHVwbG9hZF9yeGRhdGEoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGxlbjsKKwlzdHJ1Y3Qgc3RfZmlmbyAqc3RfZmlmbzsKKwlzdF9maWZvID0gJnNlbGYtPnN0X2ZpZm87CisKKwlsZW4gPSBHZXRSZWN2Qnl0ZShpb2Jhc2UsIHNlbGYpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKTogbGVuPSV4XG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDEpOworCWlmICgoc2tiID09IE5VTEwpIHx8ICgobGVuIC0gNCkgPCAyKSkgeworCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybiBGQUxTRTsKKwl9CisJc2tiX3Jlc2VydmUoc2tiLCAxKTsKKwlza2JfcHV0KHNrYiwgbGVuIC0gNCArIDEpOworCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuIC0gNCArIDEpOworCXN0X2ZpZm8tPnRhaWwrKzsKKwlzdF9maWZvLT5sZW4rKzsKKwlpZiAoc3RfZmlmby0+dGFpbCA+IE1BWF9SWF9XSU5ET1cpCisJCXN0X2ZpZm8tPnRhaWwgPSAwOworCS8vIE1vdmUgdG8gbmV4dCBmcmFtZSAKKwlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOworCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwluZXRpZl9yeChza2IpOworCWlmIChzdF9maWZvLT5sZW4gPCAoTUFYX1JYX1dJTkRPVyArIDIpKSB7CisJCVJYU3RhcnQoaW9iYXNlLCBPTik7CisJfSBlbHNlIHsKKwkJRW5hYmxlUlgoaW9iYXNlLCBPRkYpOworCQlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwkJUlhTdGFydChpb2Jhc2UsIE9GRik7CisJfQorCXJldHVybiBUUlVFOworfQorCisvKgorICogSW1wbGVtZW50IGJhY2sgdG8gYmFjayByZWNlaXZlICwgdXNlIHRoaXMgcm91dGluZSB0byB1cGxvYWQgZGF0YS4KKyAqLworCitzdGF0aWMgaW50IFJ4VGltZXJIYW5kbGVyKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSkKK3sKKwlzdHJ1Y3Qgc3RfZmlmbyAqc3RfZmlmbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBsZW47CisJdTggc3RhdHVzOworCisJc3RfZmlmbyA9ICZzZWxmLT5zdF9maWZvOworCisJaWYgKENrUnhSZWN2KGlvYmFzZSwgc2VsZikpIHsKKwkJLy8gaWYgc3RpbGwgcmVjZWl2aW5nICx0aGVuIHJldHVybiAsZG9uJ3QgdXBsb2FkIGZyYW1lIAorCQlzZWxmLT5SZXRyeUNvdW50ID0gMDsKKwkJU2V0VGltZXIoaW9iYXNlLCAyMCk7CisJCXNlbGYtPlJ4RGF0YVJlYWR5Kys7CisJCXJldHVybiBGQUxTRTsKKwl9IGVsc2UKKwkJc2VsZi0+UmV0cnlDb3VudCsrOworCisJaWYgKChzZWxmLT5SZXRyeUNvdW50ID49IDEpIHx8CisJICAgICgoc3RfZmlmby0+cGVuZGluZ19ieXRlcyArIDIwNDgpID4gc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSkKKwkgICAgfHwgKHN0X2ZpZm8tPmxlbiA+PSAoTUFYX1JYX1dJTkRPVykpKSB7CisJCXdoaWxlIChzdF9maWZvLT5sZW4gPiAwKSB7CS8vdXBsb2FkIGZyYW1lCisJCQkvLyBQdXQgdGhpcyBlbnRyeSBiYWNrIGluIGZpZm8gCisJCQlpZiAoc3RfZmlmby0+aGVhZCA+IE1BWF9SWF9XSU5ET1cpCisJCQkJc3RfZmlmby0+aGVhZCA9IDA7CisJCQlzdGF0dXMgPSBzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLnN0YXR1czsKKwkJCWxlbiA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuOworCQkJc3RfZmlmby0+aGVhZCsrOworCQkJc3RfZmlmby0+bGVuLS07CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSAtIDQpOworCQkJLyoKKwkJCSAqIGlmIGZyYW1lIHNpemUsIGRhdGEgcHRyLCBvciBza2IgcHRyIGFyZSB3cm9uZywKKwkJCSAqIHRoZW4gZ2V0IG5leHQgZW50cnkuCisJCQkgKi8KKwkJCWlmICgoc2tiID09IE5VTEwpIHx8IChza2ItPmRhdGEgPT0gTlVMTCkKKwkJCSAgICB8fCAoc2VsZi0+cnhfYnVmZi5kYXRhID09IE5VTEwpIHx8IChsZW4gPCA2KSkgeworCQkJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMSk7CisJCQlza2JfcHV0KHNrYiwgbGVuIC0gNCk7CisJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbiAtIDQpOworCisJCQlJUkRBX0RFQlVHKDIsICIlcygpOiBsZW49JXguaGVhZD0leFxuIiwgX19GVU5DVElPTl9fLAorCQkJCSAgIGxlbiAtIDQsIHN0X2ZpZm8tPmhlYWQpOworCisJCQkvLyBNb3ZlIHRvIG5leHQgZnJhbWUgCisJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOworCQkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CisJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJCQluZXRpZl9yeChza2IpOworCQl9CQkvL3doaWxlCisJCXNlbGYtPlJldHJ5Q291bnQgPSAwOworCisJCUlSREFfREVCVUcoMiwKKwkJCSAgICIlcygpOiBFbmQgb2YgdXBsb2FkIEhvc3RTdGF0dXM9JXgsUnhTdGF0dXM9JXhcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sCisJCQkgICBHZXRIb3N0U3RhdHVzKGlvYmFzZSksIEdldFJYU3RhdHVzKGlvYmFzZSkpOworCisJCS8qCisJCSAqIGlmIGZyYW1lIGlzIHJlY2VpdmUgY29tcGxldGUgYXQgdGhpcyByb3V0aW5lICx0aGVuIHVwbG9hZAorCQkgKiBmcmFtZS4KKwkJICovCisJCWlmICgoR2V0UlhTdGF0dXMoaW9iYXNlKSAmIDB4MTApCisJCSAgICAmJiAoUnhDdXJDb3VudChpb2Jhc2UsIHNlbGYpICE9IHNlbGYtPlJ4TGFzdENvdW50KSkgeworCQkJdXBsb2FkX3J4ZGF0YShzZWxmLCBpb2Jhc2UpOworCQkJaWYgKGlyZGFfZGV2aWNlX3R4cXVldWVfZW1wdHkoc2VsZi0+bmV0ZGV2KSkKKwkJCQl2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwkJfQorCX0JCQkvLyB0aW1lciBkZXRlY3QgY29tcGxldGUKKwllbHNlCisJCVNldFRpbWVyKGlvYmFzZSwgNCk7CisJcmV0dXJuIFRSVUU7CisKK30KKworCisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19pbnRlcnJ1cHQgKGlycSwgZGV2X2lkLCByZWdzKQorICoKKyAqICAgIEFuIGludGVycnVwdCBmcm9tIHRoZSBjaGlwIGhhcyBhcnJpdmVkLiBUaW1lIHRvIGRvIHNvbWUgd29yaworICoKKyAqLworc3RhdGljIGlycXJldHVybl90IHZpYV9pcmNjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmOworCWludCBpb2Jhc2U7CisJdTggaUhvc3RJbnRUeXBlLCBpUnhJbnRUeXBlLCBpVHhJbnRUeXBlOworCisJaWYgKCFkZXYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGRyaXZlcl9uYW1lLAorCQkJICAgICBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCXNlbGYgPSAoc3RydWN0IHZpYV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlzcGluX2xvY2soJnNlbGYtPmxvY2spOworCWlIb3N0SW50VHlwZSA9IEdldEhvc3RTdGF0dXMoaW9iYXNlKTsKKworCUlSREFfREVCVUcoNCwgIiVzKCk6IGlIb3N0SW50VHlwZSAlMDJ4OiAgJXMgJXMgJXMgICUwMnhcbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgaUhvc3RJbnRUeXBlLAorCQkgICAoaUhvc3RJbnRUeXBlICYgMHg0MCkgPyAiVGltZXIiIDogIiIsCisJCSAgIChpSG9zdEludFR5cGUgJiAweDIwKSA/ICJUeCIgOiAiIiwKKwkJICAgKGlIb3N0SW50VHlwZSAmIDB4MTApID8gIlJ4IiA6ICIiLAorCQkgICAoaUhvc3RJbnRUeXBlICYgMHgwZSkgPj4gMSk7CisKKwlpZiAoKGlIb3N0SW50VHlwZSAmIDB4NDApICE9IDApIHsJLy9UaW1lciBFdmVudAorCQlzZWxmLT5FdmVudEZsYWcuVGltZU91dCsrOworCQlDbGVhclRpbWVySW50KGlvYmFzZSwgMSk7CisJCWlmIChzZWxmLT5pby5kaXJlY3Rpb24gPT0gSU9fWE1JVCkgeworCQkJdmlhX2lyY2NfZG1hX3htaXQoc2VsZiwgaW9iYXNlKTsKKwkJfQorCQlpZiAoc2VsZi0+aW8uZGlyZWN0aW9uID09IElPX1JFQ1YpIHsKKwkJCS8qCisJCQkgKiBmcmFtZSByZWFkeSBob2xkIHRvbyBsb25nLCBtdXN0IHJlc2V0LgorCQkJICovCisJCQlpZiAoc2VsZi0+UnhEYXRhUmVhZHkgPiAzMCkgeworCQkJCWh3cmVzZXQoc2VsZik7CisJCQkJaWYgKGlyZGFfZGV2aWNlX3R4cXVldWVfZW1wdHkoc2VsZi0+bmV0ZGV2KSkgeworCQkJCQl2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwkJCQl9CisJCQl9IGVsc2UgewkvLyBjYWxsIHRoaXMgdG8gdXBsb2FkIGZyYW1lLgorCQkJCVJ4VGltZXJIYW5kbGVyKHNlbGYsIGlvYmFzZSk7CisJCQl9CisJCX0JCS8vUkVDVgorCX0JCQkvL1RpbWVyIEV2ZW50CisJaWYgKChpSG9zdEludFR5cGUgJiAweDIwKSAhPSAwKSB7CS8vVHggRXZlbnQKKwkJaVR4SW50VHlwZSA9IEdldFRYU3RhdHVzKGlvYmFzZSk7CisKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKTogaVR4SW50VHlwZSAlMDJ4OiAgJXMgJXMgJXMgJXNcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGlUeEludFR5cGUsCisJCQkgICAoaVR4SW50VHlwZSAmIDB4MDgpID8gIkZJRk8gdW5kZXJyLiIgOiAiIiwKKwkJCSAgIChpVHhJbnRUeXBlICYgMHgwNCkgPyAiRU9NIiA6ICIiLAorCQkJICAgKGlUeEludFR5cGUgJiAweDAyKSA/ICJGSUZPIHJlYWR5IiA6ICIiLAorCQkJICAgKGlUeEludFR5cGUgJiAweDAxKSA/ICJFYXJseSBFT00iIDogIiIpOworCisJCWlmIChpVHhJbnRUeXBlICYgMHg0KSB7CisJCQlzZWxmLT5FdmVudEZsYWcuRU9NZXNzYWdlKys7CS8vIHJlYWQgYW5kIHdpbGwgYXV0byBjbGVhbgorCQkJaWYgKHZpYV9pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHNlbGYpKSB7CisJCQkJaWYgKGlyZGFfZGV2aWNlX3R4cXVldWVfZW1wdHkKKwkJCQkgICAgKHNlbGYtPm5ldGRldikpIHsKKwkJCQkJdmlhX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzZWxmLT5FdmVudEZsYWcuVW5rbm93bisrOworCQkJfQorCQl9CQkvL0VPUAorCX0JCQkvL1R4IEV2ZW50CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJaWYgKChpSG9zdEludFR5cGUgJiAweDEwKSAhPSAwKSB7CS8vUnggRXZlbnQKKwkJLyogQ2hlY2sgaWYgRE1BIGhhcyBmaW5pc2hlZCAqLworCQlpUnhJbnRUeXBlID0gR2V0UlhTdGF0dXMoaW9iYXNlKTsKKworCQlJUkRBX0RFQlVHKDQsICIlcygpOiBpUnhJbnRUeXBlICUwMng6ICAlcyAlcyAlcyAlcyAlcyAlcyAlc1xuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgaVJ4SW50VHlwZSwKKwkJCSAgIChpUnhJbnRUeXBlICYgMHg4MCkgPyAiUEhZIGVyci4iCTogIiIsCisJCQkgICAoaVJ4SW50VHlwZSAmIDB4NDApID8gIkNSQyBlcnIiCTogIiIsCisJCQkgICAoaVJ4SW50VHlwZSAmIDB4MjApID8gIkZJRk8gb3ZlcnIuIgk6ICIiLAorCQkJICAgKGlSeEludFR5cGUgJiAweDEwKSA/ICJFT0YiCQk6ICIiLAorCQkJICAgKGlSeEludFR5cGUgJiAweDA4KSA/ICJSeERhdGEiCTogIiIsCisJCQkgICAoaVJ4SW50VHlwZSAmIDB4MDIpID8gIlJ4TWF4TGVuIgk6ICIiLAorCQkJICAgKGlSeEludFR5cGUgJiAweDAxKSA/ICJTSVIgYmFkIgk6ICIiKTsKKwkJaWYgKCFpUnhJbnRUeXBlKQorCQkJSVJEQV9ERUJVRygzLCAiJXMoKTogUnhJUlEgPTBcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaWYgKGlSeEludFR5cGUgJiAweDEwKSB7CisJCQlpZiAodmlhX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZiwgaW9iYXNlKSkgeworLy9GMDEgICAgICAgaWYoIShJc0ZJUk9uKGlvYmFzZSkpKSAgdmlhX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisJCQkJdmlhX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisJCQl9CisJCX0JCS8vIE5vIEVSUiAgICAgCisJCWVsc2UgewkJLy9FUlIKKwkJCUlSREFfREVCVUcoNCwgIiVzKCk6IFJ4SVJRIEVSUjppUnhJbnRUeXBlPSV4LEhvc3RJbnRUeXBlPSV4LEN1ckNvdW50PSV4LFJ4TGFzdENvdW50PSV4X19fX19cbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBpUnhJbnRUeXBlLCBpSG9zdEludFR5cGUsCisJCQkJICAgUnhDdXJDb3VudChpb2Jhc2UsIHNlbGYpLAorCQkJCSAgIHNlbGYtPlJ4TGFzdENvdW50KTsKKworCQkJaWYgKGlSeEludFR5cGUgJiAweDIwKSB7CS8vRklGTyBPdmVyUnVuIEVSUgorCQkJCVJlc2V0Q2hpcChpb2Jhc2UsIDApOworCQkJCVJlc2V0Q2hpcChpb2Jhc2UsIDEpOworCQkJfSBlbHNlIHsJLy9QSFksQ1JDIEVSUgorCisJCQkJaWYgKGlSeEludFR5cGUgIT0gMHgwOCkKKwkJCQkJaHdyZXNldChzZWxmKTsJLy9GMDEKKwkJCX0KKwkJCXZpYV9pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCQl9CQkvL0VSUgorCisJfQkJCS8vUnggRXZlbnQKKwlzcGluX3VubG9jaygmc2VsZi0+bG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoaUhvc3RJbnRUeXBlKTsKK30KKworc3RhdGljIHZvaWQgaHdyZXNldChzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlSZXNldENoaXAoaW9iYXNlLCA1KTsKKwlFbmFibGVETUEoaW9iYXNlLCBPRkYpOworCUVuYWJsZVRYKGlvYmFzZSwgT0ZGKTsKKwlFbmFibGVSWChpb2Jhc2UsIE9GRik7CisJRW5SWERNQShpb2Jhc2UsIE9GRik7CisJRW5UWERNQShpb2Jhc2UsIE9GRik7CisJUlhTdGFydChpb2Jhc2UsIE9GRik7CisJVFhTdGFydChpb2Jhc2UsIE9GRik7CisJSW5pdENhcmQoaW9iYXNlKTsKKwlDb21tb25Jbml0KGlvYmFzZSk7CisJU0lSRmlsdGVyKGlvYmFzZSwgT04pOworCVNldFNJUihpb2Jhc2UsIE9OKTsKKwlDUkMxNihpb2Jhc2UsIE9OKTsKKwlFblRYQ1JDKGlvYmFzZSwgMCk7CisJV3JpdGVSZWcoaW9iYXNlLCBJX1NUX0NUXzAsIDB4MDApOworCVNldEJhdWRSYXRlKGlvYmFzZSwgOTYwMCk7CisJU2V0UHVsc2VXaWR0aChpb2Jhc2UsIDEyKTsKKwlTZXRTZW5kUHJlYW1ibGVDb3VudChpb2Jhc2UsIDApOworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDgwKTsKKworCS8qIFJlc3RvcmUgc3BlZWQuICovCisJdmlhX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPmlvLnNwZWVkKTsKKworCXNlbGYtPnN0X2ZpZm8ubGVuID0gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2lzX3JlY2VpdmluZyAoc2VsZikKKyAqCisgKiAgICBSZXR1cm4gVFJVRSBpcyB3ZSBhcmUgY3VycmVudGx5IHJlY2VpdmluZyBhIGZyYW1lCisgKgorICovCitzdGF0aWMgaW50IHZpYV9pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IHN0YXR1cyA9IEZBTFNFOworCWludCBpb2Jhc2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiBGQUxTRTspOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJaWYgKENrUnhSZWN2KGlvYmFzZSwgc2VsZikpCisJCXN0YXR1cyA9IFRSVUU7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpOiBzdGF0dXM9JXguLi4uXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIFN0YXJ0IHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwljaGFyIGh3bmFtZVszMl07CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IHZpYV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzID0gMDsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJaWYgKHJlcXVlc3RfaXJxKHNlbGYtPmlvLmlycSwgdmlhX2lyY2NfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcywgdW5hYmxlIHRvIGFsbG9jYXRlIGlycT0lZFxuIiwgZHJpdmVyX25hbWUsCisJCQkgICAgIHNlbGYtPmlvLmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkvKgorCSAqIEFsd2F5cyBhbGxvY2F0ZSB0aGUgRE1BIGNoYW5uZWwgYWZ0ZXIgdGhlIElSUSwgYW5kIGNsZWFuIHVwIG9uIAorCSAqIGZhaWx1cmUuCisJICovCisJaWYgKHJlcXVlc3RfZG1hKHNlbGYtPmlvLmRtYSwgZGV2LT5uYW1lKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzLCB1bmFibGUgdG8gYWxsb2NhdGUgZG1hPSVkXG4iLCBkcml2ZXJfbmFtZSwKKwkJCSAgICAgc2VsZi0+aW8uZG1hKTsKKwkJZnJlZV9pcnEoc2VsZi0+aW8uaXJxLCBzZWxmKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWlmIChzZWxmLT5pby5kbWEyICE9IHNlbGYtPmlvLmRtYSkgeworCQlpZiAocmVxdWVzdF9kbWEoc2VsZi0+aW8uZG1hMiwgZGV2LT5uYW1lKSkgeworCQkJSVJEQV9XQVJOSU5HKCIlcywgdW5hYmxlIHRvIGFsbG9jYXRlIGRtYTI9JWRcbiIsCisJCQkJICAgICBkcml2ZXJfbmFtZSwgc2VsZi0+aW8uZG1hMik7CisJCQlmcmVlX2lycShzZWxmLT5pby5pcnEsIHNlbGYpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisKKworCS8qIHR1cm4gb24gaW50ZXJydXB0cyAqLworCUVuQWxsSW50KGlvYmFzZSwgT04pOworCUVuSW50ZXJuYWxMb29wKGlvYmFzZSwgT0ZGKTsKKwlFbkV4dGVybmFsTG9vcChpb2Jhc2UsIE9GRik7CisKKwkvKiAqLworCXZpYV9pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCisJLyogUmVhZHkgdG8gcGxheSEgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyogCisJICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UsIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlCisJICogaW5pdGlhbGl6ZWQgcHJvcGVybHkgCisJICovCisJc3ByaW50Zihod25hbWUsICJWSUEgQCAweCV4IiwgaW9iYXNlKTsKKwlzZWxmLT5pcmxhcCA9IGlybGFwX29wZW4oZGV2LCAmc2VsZi0+cW9zLCBod25hbWUpOworCisJc2VsZi0+UnhMYXN0Q291bnQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19uZXRfY2xvc2UgKGRldikKKyAqCisgKiAgICBTdG9wIHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmOworCWludCBpb2Jhc2U7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IHZpYV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwkvKiBTdG9wIGRldmljZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoc2VsZi0+aXJsYXApCisJCWlybGFwX2Nsb3NlKHNlbGYtPmlybGFwKTsKKwlzZWxmLT5pcmxhcCA9IE5VTEw7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJRW5UWERNQShpb2Jhc2UsIE9GRik7CisJRW5SWERNQShpb2Jhc2UsIE9GRik7CisJRGlzYWJsZURtYUNoYW5uZWwoc2VsZi0+aW8uZG1hKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCUVuQWxsSW50KGlvYmFzZSwgT0ZGKTsKKwlmcmVlX2lycShzZWxmLT5pby5pcnEsIGRldik7CisJZnJlZV9kbWEoc2VsZi0+aW8uZG1hKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfbmV0X2lvY3RsIChkZXYsIHJxLCBjbWQpCisgKgorICogICAgUHJvY2VzcyBJT0NUTCBjb21tYW5kcyBmb3IgdGhpcyBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsCisJCQkgICAgICBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlzZWxmID0gZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9ERUJVRygxLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLAorCQkgICBjbWQpOworCS8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0JBTkRXSURUSDoJLyogU2V0IGJhbmR3aWR0aCAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXZpYV9pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBpcnEtPmlmcl9iYXVkcmF0ZSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNRURJQUJVU1k6CS8qIFNldCBtZWRpYSBidXN5ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJZ290byBvdXQ7CisJCX0KKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc2VsZi0+bmV0ZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DR1JFQ0VJVklORzoJLyogQ2hlY2sgaWYgd2UgYXJlIHJlY2VpdmluZyByaWdodCBub3cgKi8KKwkJaXJxLT5pZnJfcmVjZWl2aW5nID0gdmlhX2lyY2NfaXNfcmVjZWl2aW5nKHNlbGYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisgICAgICBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdmlhX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZQorCQkJCQkJICAgICAgICpkZXYpCit7CisJc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmID0gKHN0cnVjdCB2aWFfaXJjY19jYiAqKSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnNlbGYtPnN0YXRzOworfQorCitNT0RVTEVfQVVUSE9SKCJWSUEgVGVjaG5vbG9naWVzLGluYyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWSUEgSXJEQSBEZXZpY2UgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHZpYV9pcmNjX2luaXQpOworbW9kdWxlX2V4aXQodmlhX2lyY2NfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0YjFiMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaApAQCAtMCwwICsxLDg1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICB2aWEtaXJjYy5oCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIFZJQSBWVDgyMzEvVlQ4MjMzIElyREEgY2hpcHNldHMKKyAqIEF1dGhvcjogICAgICAgIFZJQSBUZWNobm9sb2dpZXMsIGluYworICogRGF0ZSAgOgkgIDA4LzA2LzIwMDMKKworQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorQU5ZIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KK1NlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisgKiBDb21tZW50OgorICoganVsLzA4LzIwMDIgOiBSeCBidWZmZXIgbGVuZ3RoIHNob3VsZCB1c2UgUnggcmluZyBwdHIuCQorICogT2N0LzI4LzIwMDIgOiBBZGQgU0IgaWQgZm9yIDMxNDcgYW5kIDMxNzcuCQorICoganVsLzA5LzIwMDIgOiBvbmx5IGltcGxlbWVudCB0d28ga2luZCBvZiBkb25nbGUgY3VycmVudGx5LgorICogT2N0LzAyLzIwMDIgOiB3b3JrIG9uIFZUODIzMSBhbmQgVlQ4MjMzIC4KKyAqIEF1Zy8wNi8yMDAzIDogY2hhbmdlIGRyaXZlciBmb3JtYXQgdG8gcGNpIGRyaXZlciAuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIHZpYV9JUkNDX0gKKyNkZWZpbmUgdmlhX0lSQ0NfSAorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBNQVhfVFhfV0lORE9XIDcKKyNkZWZpbmUgTUFYX1JYX1dJTkRPVyA3CisKK3N0cnVjdCBzdF9maWZvX2VudHJ5IHsKKwlpbnQgc3RhdHVzOworCWludCBsZW47Cit9OworCitzdHJ1Y3Qgc3RfZmlmbyB7CisJc3RydWN0IHN0X2ZpZm9fZW50cnkgZW50cmllc1tNQVhfUlhfV0lORE9XICsgMl07CisJaW50IHBlbmRpbmdfYnl0ZXM7CisJaW50IGhlYWQ7CisJaW50IHRhaWw7CisJaW50IGxlbjsKK307CisKK3N0cnVjdCBmcmFtZV9jYiB7CisJdm9pZCAqc3RhcnQ7CQkvKiBTdGFydCBvZiBmcmFtZSBpbiBETUEgbWVtICovCisJaW50IGxlbjsJCS8qIExlbmdodCBvZiBmcmFtZSBpbiBETUEgbWVtICovCit9OworCitzdHJ1Y3QgdHhfZmlmbyB7CisJc3RydWN0IGZyYW1lX2NiIHF1ZXVlW01BWF9UWF9XSU5ET1cgKyAyXTsJLyogSW5mbyBhYm91dCBmcmFtZXMgaW4gcXVldWUgKi8KKwlpbnQgcHRyOwkJLyogQ3VycmVudGx5IGJlaW5nIHNlbnQgKi8KKwlpbnQgbGVuOwkJLyogTGVuZ2h0IG9mIHF1ZXVlICovCisJaW50IGZyZWU7CQkvKiBOZXh0IGZyZWUgc2xvdCAqLworCXZvaWQgKnRhaWw7CQkvKiBOZXh0IGZyZWUgc3RhcnQgaW4gRE1BIG1lbSAqLworfTsKKworCitzdHJ1Y3QgZXZlbnRmbGFnCQkvLyBmb3Iga2VlcGluZyB0cmFjayBvZiBJbnRlcnJ1cHQgRXZlbnRzCit7CisJLy8tLS0tLS0tLXR4IHBhcnQKKwl1bnNpZ25lZCBjaGFyIFR4RklGT1VuZGVyUnVuOworCXVuc2lnbmVkIGNoYXIgRU9NZXNzYWdlOworCXVuc2lnbmVkIGNoYXIgVHhGSUZPUmVhZHk7CisJdW5zaWduZWQgY2hhciBFYXJseUVPTTsKKwkvLy0tLS0tLS0tcnggcGFydAorCXVuc2lnbmVkIGNoYXIgUEhZRXJyOworCXVuc2lnbmVkIGNoYXIgQ1JDRXJyOworCXVuc2lnbmVkIGNoYXIgUnhGSUZPT3ZlclJ1bjsKKwl1bnNpZ25lZCBjaGFyIEVPUGFja2V0OworCXVuc2lnbmVkIGNoYXIgUnhBdmFpbDsKKwl1bnNpZ25lZCBjaGFyIFRvb0xhcmdlUGFja2V0OworCXVuc2lnbmVkIGNoYXIgU0lSQmFkOworCS8vLS0tLS0tLS11bmtub3duCisJdW5zaWduZWQgY2hhciBVbmtub3duOworCS8vLS0tLS0tLS0tLQorCXVuc2lnbmVkIGNoYXIgVGltZU91dDsKKwl1bnNpZ25lZCBjaGFyIFJ4RE1BVEM7CisJdW5zaWduZWQgY2hhciBUeERNQVRDOworfTsKKworLyogUHJpdmF0ZSBkYXRhIGZvciBlYWNoIGluc3RhbmNlICovCitzdHJ1Y3QgdmlhX2lyY2NfY2IgeworCXN0cnVjdCBzdF9maWZvIHN0X2ZpZm87CS8qIEluZm8gYWJvdXQgcmVjZWl2ZWQgZnJhbWVzICovCisJc3RydWN0IHR4X2ZpZm8gdHhfZmlmbzsJLyogSW5mbyBhYm91dCBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCXN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7CS8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KKwlzdHJ1Y3QgcW9zX2luZm8gcW9zOwkvKiBRb1MgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGRldmljZSAqLworCisJY2hpcGlvX3QgaW87CQkvKiBJckRBIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKwlpb2J1ZmZfdCB0eF9idWZmOwkvKiBUcmFuc21pdCBidWZmZXIgKi8KKwlpb2J1ZmZfdCByeF9idWZmOwkvKiBSZWNlaXZlIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgdHhfYnVmZl9kbWE7CisJZG1hX2FkZHJfdCByeF9idWZmX2RtYTsKKworCV9fdTggaWVyOwkJLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCisJc3RydWN0IHRpbWV2YWwgc3RhbXA7CisJc3RydWN0IHRpbWV2YWwgbm93OworCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBGb3Igc2VyaWFsaXppbmcgb3BlcmF0aW9ucyAqLworCisJX191MzIgZmxhZ3M7CQkvKiBJbnRlcmZhY2UgZmxhZ3MgKi8KKwlfX3UzMiBuZXdfc3BlZWQ7CisJaW50IGluZGV4OwkJLyogSW5zdGFuY2UgaW5kZXggKi8KKworCXN0cnVjdCBldmVudGZsYWcgRXZlbnRGbGFnOworCXN0cnVjdCBwbV9kZXYgKmRldjsKKwl1bnNpZ25lZCBpbnQgY2hpcF9pZDsJLyogdG8gcmVtZW1iZXIgY2hpcCBpZCAqLworCXVuc2lnbmVkIGludCBSZXRyeUNvdW50OworCXVuc2lnbmVkIGludCBSeERhdGFSZWFkeTsKKwl1bnNpZ25lZCBpbnQgUnhMYXN0Q291bnQ7Cit9OworCisKKy8vLS0tLS0tLS0tST1JbmZyYXJlZCwgIEg9SG9zdCwgTT1NaXNjLCBUPVR4LCBSPVJ4LCBTVD1TdGF0dXMsCisvLyAgICAgICAgIENGPUNvbmZpZywgQ1Q9Q29udHJvbCwgTD1Mb3csIEg9SGlnaCwgQz1Db3VudAorI2RlZmluZSAgSV9DRl9MXzAgIAkJMHgxMAorI2RlZmluZSAgSV9DRl9IXzAJCTB4MTEKKyNkZWZpbmUgIElfU0lSX0JPRgkJMHgxMgorI2RlZmluZSAgSV9TSVJfRU9GCQkweDEzCisjZGVmaW5lICBJX1NUX0NUXzAJCTB4MTUKKyNkZWZpbmUgIElfU1RfTF8xCQkweDE2CisjZGVmaW5lICBJX1NUX0hfMQkJMHgxNworI2RlZmluZSAgSV9DRl9MXzEJCTB4MTgKKyNkZWZpbmUgIElfQ0ZfSF8xCQkweDE5CisjZGVmaW5lICBJX0NGX0xfMgkJMHgxYQorI2RlZmluZSAgSV9DRl9IXzIJCTB4MWIKKyNkZWZpbmUgIElfQ0ZfMwkJMHgxZQorI2RlZmluZSAgSF9DVAkJCTB4MjAKKyNkZWZpbmUgIEhfU1QJCQkweDIxCisjZGVmaW5lICBNX0NUCQkJMHgyMgorI2RlZmluZSAgVFhfQ1RfMQkJMHgyMworI2RlZmluZSAgVFhfQ1RfMgkJMHgyNAorI2RlZmluZSAgVFhfU1QJCQkweDI1CisjZGVmaW5lICBSWF9DVAkJCTB4MjYKKyNkZWZpbmUgIFJYX1NUCQkJMHgyNworI2RlZmluZSAgUkVTRVQJCQkweDI4CisjZGVmaW5lICBQX0FERFIJCTB4MjkKKyNkZWZpbmUgIFJYX0NfTAkJMHgyYQorI2RlZmluZSAgUlhfQ19ICQkweDJiCisjZGVmaW5lICBSWF9QX0wJCTB4MmMKKyNkZWZpbmUgIFJYX1BfSAkJMHgyZAorI2RlZmluZSAgVFhfQ19MCQkweDJlCisjZGVmaW5lICBUWF9DX0gJCTB4MmYKKyNkZWZpbmUgIFRJTUVSICAgICAgICAgCTB4MzIKKyNkZWZpbmUgIElfQ0ZfNCAgICAgICAgIAkweDMzCisjZGVmaW5lICBJX1RfQ19MCQkweDM0CisjZGVmaW5lICBJX1RfQ19ICQkweDM1CisjZGVmaW5lICBWRVJTSU9OCQkweDNmCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgU3RhcnRBZGRyIAkweDEwCS8vIHRoZSBmaXJzdCByZWdpc3RlciBhZGRyZXNzCisjZGVmaW5lIEVuZEFkZHIgCTB4M2YJLy8gdGhlIGxhc3QgcmVnaXN0ZXIgYWRkcmVzcworI2RlZmluZSBHZXRCaXQodmFsLGJpdCkgIHZhbCA9ICh1bnNpZ25lZCBjaGFyKSAoKHZhbD4+Yml0KSAmIDB4MSkKKwkJCS8vIFJldHVybnMgdGhlIGJpdAorI2RlZmluZSBTZXRCaXQodmFsLGJpdCkgIHZhbD0gKHVuc2lnbmVkIGNoYXIgKSAodmFsIHwgKDB4MSA8PCBiaXQpKQorCQkJLy8gU2V0cyBiaXQgdG8gMQorI2RlZmluZSBSZXNldEJpdCh2YWwsYml0KSB2YWw9ICh1bnNpZ25lZCBjaGFyICkgKHZhbCAmIH4oMHgxIDw8IGJpdCkpCisJCQkvLyBTZXRzIGJpdCB0byAwCisKKyNkZWZpbmUgT0ZGICAgMAorI2RlZmluZSBPTiAgIDEKKyNkZWZpbmUgRE1BX1RYX01PREUgICAweDA4CisjZGVmaW5lIERNQV9SWF9NT0RFICAgMHgwNAorCisjZGVmaW5lIERNQTEgICAwCisjZGVmaW5lIERNQTIgICAweGMwCisjZGVmaW5lIE1BU0sxICAgRE1BMSsweDBhCisjZGVmaW5lIE1BU0syICAgRE1BMisweDE0CisKKyNkZWZpbmUgQ2xrX2JpdCAweDQwCisjZGVmaW5lIFR4X2JpdCAweDAxCisjZGVmaW5lIFJkX1ZhbGlkIDB4MDgKKyNkZWZpbmUgUnhCaXQgMHgwOAorCitzdGF0aWMgdm9pZCBEaXNhYmxlRG1hQ2hhbm5lbCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlzd2l0Y2ggKGNoYW5uZWwpIHsJLy8gOCBCaXQgRE1BIGNoYW5uZWxzIERNQUMxCisJY2FzZSAwOgorCQlvdXRiKDQsIE1BU0sxKTsJLy9tYXNrIGNoYW5uZWwgMAorCQlicmVhazsKKwljYXNlIDE6CisJCW91dGIoNSwgTUFTSzEpOwkvL01hc2sgY2hhbm5lbCAxCisJCWJyZWFrOworCWNhc2UgMjoKKwkJb3V0Yig2LCBNQVNLMSk7CS8vTWFzayBjaGFubmVsIDIKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlvdXRiKDcsIE1BU0sxKTsJLy9NYXNrIGNoYW5uZWwgMworCQlicmVhazsKKwljYXNlIDU6CisJCW91dGIoNSwgTUFTSzIpOwkvL01hc2sgY2hhbm5lbCA1CisJCWJyZWFrOworCWNhc2UgNjoKKwkJb3V0Yig2LCBNQVNLMik7CS8vTWFzayBjaGFubmVsIDYKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlvdXRiKDcsIE1BU0syKTsJLy9NYXNrIGNoYW5uZWwgNworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9OwkJCS8vU3dpdGNoCit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFJlYWRMUENSZWcoaW50IGlSZWdOdW0pCit7CisJdW5zaWduZWQgY2hhciBpVmFsOworCisJb3V0YigweDg3LCAweDJlKTsKKwlvdXRiKDB4ODcsIDB4MmUpOworCW91dGIoaVJlZ051bSwgMHgyZSk7CisJaVZhbCA9IGluYigweDJmKTsKKwlvdXRiKDB4YWEsIDB4MmUpOworCisJcmV0dXJuIGlWYWw7Cit9CisKK3N0YXRpYyB2b2lkIFdyaXRlTFBDUmVnKGludCBpUmVnTnVtLCB1bnNpZ25lZCBjaGFyIGlWYWwpCit7CisKKwlvdXRiKDB4ODcsIDB4MmUpOworCW91dGIoMHg4NywgMHgyZSk7CisJb3V0YihpUmVnTnVtLCAweDJlKTsKKwlvdXRiKGlWYWwsIDB4MmYpOworCW91dGIoMHhBQSwgMHgyZSk7Cit9CisKK3N0YXRpYyBfX3U4IFJlYWRSZWcodW5zaWduZWQgaW50IEJhc2VBZGRyLCBpbnQgaVJlZ051bSkKK3sKKwlyZXR1cm4gKChfX3U4KSBpbmIoQmFzZUFkZHIgKyBpUmVnTnVtKSk7Cit9CisKK3N0YXRpYyB2b2lkIFdyaXRlUmVnKHVuc2lnbmVkIGludCBCYXNlQWRkciwgaW50IGlSZWdOdW0sIHVuc2lnbmVkIGNoYXIgaVZhbCkKK3sKKwlvdXRiKGlWYWwsIEJhc2VBZGRyICsgaVJlZ051bSk7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVSZWdCaXQodW5zaWduZWQgaW50IEJhc2VBZGRyLCB1bnNpZ25lZCBjaGFyIFJlZ051bSwKKwkJdW5zaWduZWQgY2hhciBCaXRQb3MsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJX191OCBSdGVtcCwgV3RlbXA7CisKKwlpZiAoQml0UG9zID4gNykgeworCQlyZXR1cm4gLTE7CisJfQorCWlmICgoUmVnTnVtIDwgU3RhcnRBZGRyKSB8fCAoUmVnTnVtID4gRW5kQWRkcikpCisJCXJldHVybiAtMTsKKwlSdGVtcCA9IFJlYWRSZWcoQmFzZUFkZHIsIFJlZ051bSk7CisJaWYgKHZhbHVlID09IDApCisJCVd0ZW1wID0gUmVzZXRCaXQoUnRlbXAsIEJpdFBvcyk7CisJZWxzZSB7CisJCWlmICh2YWx1ZSA9PSAxKQorCQkJV3RlbXAgPSBTZXRCaXQoUnRlbXAsIEJpdFBvcyk7CisJCWVsc2UKKwkJCXJldHVybiAtMTsKKwl9CisJV3JpdGVSZWcoQmFzZUFkZHIsIFJlZ051bSwgV3RlbXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgX191OCBDaGVja1JlZ0JpdCh1bnNpZ25lZCBpbnQgQmFzZUFkZHIsIHVuc2lnbmVkIGNoYXIgUmVnTnVtLAorCQkgdW5zaWduZWQgY2hhciBCaXRQb3MpCit7CisJX191OCB0ZW1wOworCisJaWYgKEJpdFBvcyA+IDcpCisJCXJldHVybiAweGZmOworCWlmICgoUmVnTnVtIDwgU3RhcnRBZGRyKSB8fCAoUmVnTnVtID4gRW5kQWRkcikpIHsKKy8vICAgICBwcmludGYoIndoYXQgaXMgdGhlIHJlZ2lzdGVyICV4IVxuIixSZWdOdW0pOworCX0KKwl0ZW1wID0gUmVhZFJlZyhCYXNlQWRkciwgUmVnTnVtKTsKKwlyZXR1cm4gR2V0Qml0KHRlbXAsIEJpdFBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIFNldE1heFJ4UGFja2V0U2l6ZShfX3UxNiBpb2Jhc2UsIF9fdTE2IHNpemUpCit7CisJX191MTYgbG93LCBoaWdoOworCWlmICgoc2l6ZSAmIDB4ZTAwMCkgPT0gMCkgeworCQlsb3cgPSBzaXplICYgMHgwMGZmOworCQloaWdoID0gKHNpemUgJiAweDFmMDApID4+IDg7CisJCVdyaXRlUmVnKGlvYmFzZSwgSV9DRl9MXzIsIGxvdyk7CisJCVdyaXRlUmVnKGlvYmFzZSwgSV9DRl9IXzIsIGhpZ2gpOworCisJfQorCit9CisKKy8vZm9yIGJvdGggUnggYW5kIFR4CisKK3N0YXRpYyB2b2lkIFNldEZJRk8oX191MTYgaW9iYXNlLCBfX3UxNiB2YWx1ZSkKK3sKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAxMjg6CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgMCwgMCk7CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgNywgMSk7CisJCWJyZWFrOworCWNhc2UgNjQ6CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgMCwgMCk7CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgNywgMCk7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgMCwgMSk7CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgNywgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgMCwgMCk7CisJCVdyaXRlUmVnQml0KGlvYmFzZSwgMHgxMSwgNywgMCk7CisJfQorCit9CisKKyNkZWZpbmUgQ1JDMTYoQmFzZUFkZHIsdmFsKSAgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDcsdmFsKQkvLzAgZm9yIDMyIENSQworLyoKKyNkZWZpbmUgU2V0VkZJUihCYXNlQWRkcix2YWwpICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfSF8wLDUsdmFsKQorI2RlZmluZSBTZXRGSVIoQmFzZUFkZHIsdmFsKSAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsNix2YWwpCisjZGVmaW5lIFNldE1JUihCYXNlQWRkcix2YWwpICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0xfMCw1LHZhbCkKKyNkZWZpbmUgU2V0U0lSKEJhc2VBZGRyLHZhbCkgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDQsdmFsKQorKi8KKyNkZWZpbmUgU0lSRmlsdGVyKEJhc2VBZGRyLHZhbCkgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDMsdmFsKQorI2RlZmluZSBGaWx0ZXIoQmFzZUFkZHIsdmFsKSAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsMix2YWwpCisjZGVmaW5lIEludmVydFRYKEJhc2VBZGRyLHZhbCkgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0xfMCwxLHZhbCkKKyNkZWZpbmUgSW52ZXJ0UlgoQmFzZUFkZHIsdmFsKSAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDAsdmFsKQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqSV9DRl9IXzAKKyNkZWZpbmUgRW5hYmxlVFgoQmFzZUFkZHIsdmFsKSAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfSF8wLDQsdmFsKQorI2RlZmluZSBFbmFibGVSWChCYXNlQWRkcix2YWwpICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9IXzAsMyx2YWwpCisjZGVmaW5lIEVuYWJsZURNQShCYXNlQWRkcix2YWwpICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0hfMCwyLHZhbCkKKyNkZWZpbmUgU0lSUmVjdkFueShCYXNlQWRkcix2YWwpICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfSF8wLDEsdmFsKQorI2RlZmluZSBEaWFibGVUcmFucyhCYXNlQWRkcix2YWwpICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9IXzAsMCx2YWwpCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKklfU0lSX0JPRixJX1NJUl9FT0YKKyNkZWZpbmUgU2V0U0lSQk9GKEJhc2VBZGRyLHZhbCkgICAgIFdyaXRlUmVnKEJhc2VBZGRyLElfU0lSX0JPRix2YWwpCisjZGVmaW5lIFNldFNJUkVPRihCYXNlQWRkcix2YWwpICAgICBXcml0ZVJlZyhCYXNlQWRkcixJX1NJUl9FT0YsdmFsKQorI2RlZmluZSBHZXRTSVJCT0YoQmFzZUFkZHIpICAgICAgICBSZWFkUmVnKEJhc2VBZGRyLElfU0lSX0JPRikKKyNkZWZpbmUgR2V0U0lSRU9GKEJhc2VBZGRyKSAgICAgICAgUmVhZFJlZyhCYXNlQWRkcixJX1NJUl9FT0YpCisvLyoqKioqKioqKioqKioqKioqKipJX1NUX0NUXzAKKyNkZWZpbmUgRW5QaHlzKEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX1NUX0NUXzAsNyx2YWwpCisjZGVmaW5lIElzTW9kZUVycm9yKEJhc2VBZGRyKSBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1NUX0NUXzAsNikJLy9STworI2RlZmluZSBJc1ZGSVJPbihCYXNlQWRkcikgICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLDB4MTQsMCkJLy9STyBmb3IgVlQxMjExIG9ubHkKKyNkZWZpbmUgSXNGSVJPbihCYXNlQWRkcikgICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCw1KQkvL1JPCisjZGVmaW5lIElzTUlST24oQmFzZUFkZHIpICAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1NUX0NUXzAsNCkJLy9STworI2RlZmluZSBJc1NJUk9uKEJhc2VBZGRyKSAgICAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsSV9TVF9DVF8wLDMpCS8vUk8KKyNkZWZpbmUgSXNFbmFibGVUWChCYXNlQWRkcikgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCwyKQkvL1JPCisjZGVmaW5lIElzRW5hYmxlUlgoQmFzZUFkZHIpICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1NUX0NUXzAsMSkJLy9STworI2RlZmluZSBJczE2Q1JDKEJhc2VBZGRyKSAgICAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsSV9TVF9DVF8wLDApCS8vUk8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqSV9DRl8zCisjZGVmaW5lIERpc2FibGVBZGphY2VudFB1bHNlV2lkdGgoQmFzZUFkZHIsdmFsKSBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzMsNSx2YWwpCS8vMSBkaXNhYmxlCisjZGVmaW5lIERpc2FibGVQdWxzZVdpZHRoQWRqdXN0KEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzMsNCx2YWwpCS8vMSBkaXNhYmxlCisjZGVmaW5lIFVzZU9uZVJYKEJhc2VBZGRyLHZhbCkgICAgICAgICAgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzMsMSx2YWwpCS8vMCB1c2UgdHdvIFJYCisjZGVmaW5lIFNsb3dJUlJYTG93QWN0aXZlKEJhc2VBZGRyLHZhbCkgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzMsMCx2YWwpCS8vMCBzaG93IFJYIGhpZ2g9MSBpbiBTSVIKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqSF9DVAorI2RlZmluZSBFbkFsbEludChCYXNlQWRkcix2YWwpICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSF9DVCw3LHZhbCkKKyNkZWZpbmUgVFhTdGFydChCYXNlQWRkcix2YWwpICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLEhfQ1QsNix2YWwpCisjZGVmaW5lIFJYU3RhcnQoQmFzZUFkZHIsdmFsKSAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixIX0NULDUsdmFsKQorI2RlZmluZSBDbGVhclJYSW50KEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixIX0NULDQsdmFsKQkvLyAxIGNsZWFyCisvLyoqKioqKioqKioqKioqKioqSF9TVAorI2RlZmluZSBJc1JYSW50KEJhc2VBZGRyKSAgICAgICAgICAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsSF9TVCw0KQorI2RlZmluZSBHZXRJbnRJbmRlbnRpZnkoQmFzZUFkZHIpICAgKChSZWFkUmVnKEJhc2VBZGRyLEhfU1QpJjB4ZjEpID4+MSkKKyNkZWZpbmUgSXNIb3N0QnVzeShCYXNlQWRkcikgICAgICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLEhfU1QsMCkKKyNkZWZpbmUgR2V0SG9zdFN0YXR1cyhCYXNlQWRkcikgICAgIFJlYWRSZWcoQmFzZUFkZHIsSF9TVCkJLy9STworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKk1fQ1QKKyNkZWZpbmUgRW5UWERNQShCYXNlQWRkcix2YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsTV9DVCw3LHZhbCkKKyNkZWZpbmUgRW5SWERNQShCYXNlQWRkcix2YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsTV9DVCw2LHZhbCkKKyNkZWZpbmUgU3dhcERNQShCYXNlQWRkcix2YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsTV9DVCw1LHZhbCkKKyNkZWZpbmUgRW5JbnRlcm5hbExvb3AoQmFzZUFkZHIsdmFsKSAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsTV9DVCw0LHZhbCkKKyNkZWZpbmUgRW5FeHRlcm5hbExvb3AoQmFzZUFkZHIsdmFsKSAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsTV9DVCwzLHZhbCkKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKipUWF9DVF8xCisjZGVmaW5lIEVuVFhGSUZPSGFsZkxldmVsSW50KEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8xLDQsdmFsKQkvL2hhbGYgZW1wdHkgaW50ICgxIGhhbGYpCisjZGVmaW5lIEVuVFhGSUZPVW5kZXJydW5FT01JbnQoQmFzZUFkZHIsdmFsKSBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8xLDUsdmFsKQorI2RlZmluZSBFblRYRklGT1JlYWR5SW50KEJhc2VBZGRyLHZhbCkgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsVFhfQ1RfMSw2LHZhbCkJLy9pbnQgd2hlbiByZWFjaCBpdCB0aHJlc2hvbGQgKHNldHRpbmcgYnkgYml0IDQpCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqVFhfQ1RfMgorI2RlZmluZSBGb3JjZVVuZGVycnVuKEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8yLDcsdmFsKQkvLyBmb3JjZSBhbiB1bmRlcnJ1biBpbnQKKyNkZWZpbmUgRW5UWENSQyhCYXNlQWRkcix2YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsVFhfQ1RfMiw2LHZhbCkJLy8xIGZvciBGSVIsTUlSLi4uMCAobm90IFNJUikKKyNkZWZpbmUgRm9yY2VCQURDUkMoQmFzZUFkZHIsdmFsKSAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsVFhfQ1RfMiw1LHZhbCkJLy9mb3JjZSBhbiBiYWQgQ1JDCisjZGVmaW5lIFNlbmRTSVAoQmFzZUFkZHIsdmFsKSAgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLFRYX0NUXzIsNCx2YWwpCS8vc2VuZCBpbmRpY2F0aW9uIHB1bHNlIGZvciBwcmV2ZW50IFNJUiBkaXN0dXJiCisjZGVmaW5lIENsZWFyRW5UWChCYXNlQWRkcix2YWwpICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLFRYX0NUXzIsMyx2YWwpCS8vIG9wcG9zaXRlIHRvIEVuVFgKKy8vKioqKioqKioqKioqKioqKipUWF9TVAorI2RlZmluZSBHZXRUWFN0YXR1cyhCYXNlQWRkcikgCVJlYWRSZWcoQmFzZUFkZHIsVFhfU1QpCS8vUk8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKipSWF9DVAorI2RlZmluZSBFblJYU3BlY0ludChCYXNlQWRkcix2YWwpICAgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixSWF9DVCwwLHZhbCkKKyNkZWZpbmUgRW5SWEZJRk9SZWFkeUludChCYXNlQWRkcix2YWwpICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsUlhfQ1QsMSx2YWwpCS8vZW5hYmxlIGludCB3aGVuIHJlYWNoIGl0IHRocmVzaG9sZCAoc2V0dGluZyBieSBiaXQgNykKKyNkZWZpbmUgRW5SWEZJRk9IYWxmTGV2ZWxJbnQoQmFzZUFkZHIsdmFsKSAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsUlhfQ1QsNyx2YWwpCS8vZW5hYmxlIGludCB3aGVuICgxKSBoYWxmIGZ1bGwuLi5vciAoMCkganVzdCBub3QgZnVsbAorLy8qKioqKioqKioqKioqKioqKlJYX1NUCisjZGVmaW5lIEdldFJYU3RhdHVzKEJhc2VBZGRyKSAJUmVhZFJlZyhCYXNlQWRkcixSWF9TVCkJLy9STworLy8qKioqKioqKioqKioqKioqKioqKioqKlBfQUREUgorI2RlZmluZSBTZXRQYWNrZXRBZGRyKEJhc2VBZGRyLGFkZHIpICAgICAgICBXcml0ZVJlZyhCYXNlQWRkcixQX0FERFIsYWRkcikKKy8vKioqKioqKioqKioqKioqKioqKioqKipJX0NGXzQKKyNkZWZpbmUgRW5HUElPdG9SWDIoQmFzZUFkZHIsdmFsKQlXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzQsNyx2YWwpCisjZGVmaW5lIEVuVGltZXJJbnQoQmFzZUFkZHIsdmFsKQkJV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl80LDEsdmFsKQorI2RlZmluZSBDbGVhclRpbWVySW50KEJhc2VBZGRyLHZhbCkJV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl80LDAsdmFsKQorLy8qKioqKioqKioqKioqKioqKioqKioqKklfVF9DX0wKKyNkZWZpbmUgV3JpdGVHSU8oQmFzZUFkZHIsdmFsKQkgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9UX0NfTCw3LHZhbCkKKyNkZWZpbmUgUmVhZEdJTyhCYXNlQWRkcikJCSAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1RfQ19MLDcpCisjZGVmaW5lIFJlYWRSWChCYXNlQWRkcikJCSAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1RfQ19MLDMpCS8vUk8KKyNkZWZpbmUgV3JpdGVUWChCYXNlQWRkcix2YWwpCQlXcml0ZVJlZ0JpdChCYXNlQWRkcixJX1RfQ19MLDAsdmFsKQorLy8qKioqKioqKioqKioqKioqKioqKioqKklfVF9DX0gKKyNkZWZpbmUgRW5SWDIoQmFzZUFkZHIsdmFsKQkJICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfVF9DX0gsNyx2YWwpCisjZGVmaW5lIFJlYWRSWDIoQmFzZUFkZHIpICAgICAgICAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1RfQ19ILDcpCisvLyoqKioqKioqKioqKioqKioqKioqKipWZXJzaW9uCisjZGVmaW5lIEdldEZJUlZlcnNpb24oQmFzZUFkZHIpCQlSZWFkUmVnKEJhc2VBZGRyLFZFUlNJT04pCisKKworc3RhdGljIHZvaWQgU2V0VGltZXIoX191MTYgaW9iYXNlLCBfX3U4IGNvdW50KQoreworCUVuVGltZXJJbnQoaW9iYXNlLCBPRkYpOworCVdyaXRlUmVnKGlvYmFzZSwgVElNRVIsIGNvdW50KTsKKwlFblRpbWVySW50KGlvYmFzZSwgT04pOworfQorCisKK3N0YXRpYyB2b2lkIFNldFNlbmRCeXRlKF9fdTE2IGlvYmFzZSwgX191MzIgY291bnQpCit7CisJX191MzIgbG93LCBoaWdoOworCisJaWYgKChjb3VudCAmIDB4ZjAwMCkgPT0gMCkgeworCQlsb3cgPSBjb3VudCAmIDB4MDBmZjsKKwkJaGlnaCA9IChjb3VudCAmIDB4MGYwMCkgPj4gODsKKwkJV3JpdGVSZWcoaW9iYXNlLCBUWF9DX0wsIGxvdyk7CisJCVdyaXRlUmVnKGlvYmFzZSwgVFhfQ19ILCBoaWdoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIFJlc2V0Q2hpcChfX3UxNiBpb2Jhc2UsIF9fdTggdHlwZSkKK3sKKwlfX3U4IHZhbHVlOworCisJdmFsdWUgPSAodHlwZSArIDIpIDw8IDQ7CisJV3JpdGVSZWcoaW9iYXNlLCBSRVNFVCwgdHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgQ2tSeFJlY3YoX191MTYgaW9iYXNlLCBzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpCit7CisJX191OCBsb3csIGhpZ2g7CisJX191MTYgd1RtcCA9IDAsIHdUbXAxID0gMCwgd1RtcF9uZXcgPSAwOworCisJbG93ID0gUmVhZFJlZyhpb2Jhc2UsIFJYX0NfTCk7CisJaGlnaCA9IFJlYWRSZWcoaW9iYXNlLCBSWF9DX0gpOworCXdUbXAxID0gaGlnaDsKKwl3VG1wID0gKHdUbXAxIDw8IDgpIHwgbG93OworCXVkZWxheSgxMCk7CisJbG93ID0gUmVhZFJlZyhpb2Jhc2UsIFJYX0NfTCk7CisJaGlnaCA9IFJlYWRSZWcoaW9iYXNlLCBSWF9DX0gpOworCXdUbXAxID0gaGlnaDsKKwl3VG1wX25ldyA9ICh3VG1wMSA8PCA4KSB8IGxvdzsKKwlpZiAod1RtcF9uZXcgIT0gd1RtcCkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgX191MTYgUnhDdXJDb3VudChfX3UxNiBpb2Jhc2UsIHN0cnVjdCB2aWFfaXJjY19jYiAqIHNlbGYpCit7CisJX191OCBsb3csIGhpZ2g7CisJX191MTYgd1RtcCA9IDAsIHdUbXAxID0gMDsKKworCWxvdyA9IFJlYWRSZWcoaW9iYXNlLCBSWF9QX0wpOworCWhpZ2ggPSBSZWFkUmVnKGlvYmFzZSwgUlhfUF9IKTsKKwl3VG1wMSA9IGhpZ2g7CisJd1RtcCA9ICh3VG1wMSA8PCA4KSB8IGxvdzsKKwlyZXR1cm4gd1RtcDsKK30KKworLyogVGhpcyBSb3V0aW5lIGNhbiBvbmx5IHVzZSBpbiByZWNldmllX2NvbXBsZXRlCisgKiBmb3IgaXQgd2lsbCB1cGRhdGUgbGFzdCBjb3VudC4KKyAqLworCitzdGF0aWMgX191MTYgR2V0UmVjdkJ5dGUoX191MTYgaW9iYXNlLCBzdHJ1Y3QgdmlhX2lyY2NfY2IgKiBzZWxmKQoreworCV9fdTggbG93LCBoaWdoOworCV9fdTE2IHdUbXAsIHdUbXAxLCByZXQ7CisKKwlsb3cgPSBSZWFkUmVnKGlvYmFzZSwgUlhfUF9MKTsKKwloaWdoID0gUmVhZFJlZyhpb2Jhc2UsIFJYX1BfSCk7CisJd1RtcDEgPSBoaWdoOworCXdUbXAgPSAod1RtcDEgPDwgOCkgfCBsb3c7CisKKworCWlmICh3VG1wID49IHNlbGYtPlJ4TGFzdENvdW50KQorCQlyZXQgPSB3VG1wIC0gc2VsZi0+UnhMYXN0Q291bnQ7CisJZWxzZQorCQlyZXQgPSAoMHg4MDAwIC0gc2VsZi0+UnhMYXN0Q291bnQpICsgd1RtcDsKKwlzZWxmLT5SeExhc3RDb3VudCA9IHdUbXA7CisKKy8qIFJYX1AgaXMgbW9yZSBhY3R1YWxseSB0aGUgUlhfQworIGxvdz1SZWFkUmVnKGlvYmFzZSxSWF9DX0wpOworIGhpZ2g9UmVhZFJlZyhpb2Jhc2UsUlhfQ19IKTsKKworIGlmKCEoaGlnaCYweGUwMDApKSB7CisJIHRlbXA9KGhpZ2g8PDgpK2xvdzsKKwkgcmV0dXJuIHRlbXA7CisgfQorIGVsc2UgcmV0dXJuIDA7CisqLworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIFNkZWxheShfX3UxNiBzY2FsZSkKK3sKKwlfX3U4IGJUbXA7CisJaW50IGksIGo7CisKKwlmb3IgKGogPSAwOyBqIDwgc2NhbGU7IGorKykgeworCQlmb3IgKGkgPSAwOyBpIDwgMHgyMDsgaSsrKSB7CisJCQliVG1wID0gaW5iKDB4ZWIpOworCQkJb3V0YihiVG1wLCAweGViKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgVGRlbGF5KF9fdTE2IHNjYWxlKQoreworCV9fdTggYlRtcDsKKwlpbnQgaSwgajsKKworCWZvciAoaiA9IDA7IGogPCBzY2FsZTsgaisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCAweDUwOyBpKyspIHsKKwkJCWJUbXAgPSBpbmIoMHhlYik7CisJCQlvdXRiKGJUbXAsIDB4ZWIpOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIEFjdENsayhfX3UxNiBpb2Jhc2UsIF9fdTggdmFsdWUpCit7CisJX191OCBiVG1wOworCWJUbXAgPSBSZWFkUmVnKGlvYmFzZSwgMHgzNCk7CisJaWYgKHZhbHVlKQorCQlXcml0ZVJlZyhpb2Jhc2UsIDB4MzQsIGJUbXAgfCBDbGtfYml0KTsKKwllbHNlCisJCVdyaXRlUmVnKGlvYmFzZSwgMHgzNCwgYlRtcCAmIH5DbGtfYml0KTsKK30KKworc3RhdGljIHZvaWQgQ2xrVHgoX191MTYgaW9iYXNlLCBfX3U4IENsaywgX191OCBUeCkKK3sKKwlfX3U4IGJUbXA7CisKKwliVG1wID0gUmVhZFJlZyhpb2Jhc2UsIDB4MzQpOworCWlmIChDbGsgPT0gMCkKKwkJYlRtcCAmPSB+Q2xrX2JpdDsKKwllbHNlIHsKKwkJaWYgKENsayA9PSAxKQorCQkJYlRtcCB8PSBDbGtfYml0OworCX0KKwlXcml0ZVJlZyhpb2Jhc2UsIDB4MzQsIGJUbXApOworCVNkZWxheSgxKTsKKwlpZiAoVHggPT0gMCkKKwkJYlRtcCAmPSB+VHhfYml0OworCWVsc2UgeworCQlpZiAoVHggPT0gMSkKKwkJCWJUbXAgfD0gVHhfYml0OworCX0KKwlXcml0ZVJlZyhpb2Jhc2UsIDB4MzQsIGJUbXApOworfQorCitzdGF0aWMgdm9pZCBXcl9CeXRlKF9fdTE2IGlvYmFzZSwgX191OCBkYXRhKQoreworCV9fdTggYkRhdGEgPSBkYXRhOworLy8gICAgICBfX3U4IGJ0bXA7CisJaW50IGk7CisKKwlDbGtUeChpb2Jhc2UsIDAsIDEpOworCisJVGRlbGF5KDIpOworCUFjdENsayhpb2Jhc2UsIDEpOworCVRkZWxheSgxKTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsJLy9MRE4KKworCQlpZiAoKGJEYXRhID4+IGkpICYgMHgwMSkgeworCQkJQ2xrVHgoaW9iYXNlLCAwLCAxKTsJLy9iaXQgZGF0YSA9IDE7CisJCX0gZWxzZSB7CisJCQlDbGtUeChpb2Jhc2UsIDAsIDApOwkvL2JpdCBkYXRhID0gMTsKKwkJfQorCQlUZGVsYXkoMik7CisJCVNkZWxheSgxKTsKKwkJQWN0Q2xrKGlvYmFzZSwgMSk7CS8vY2xrIGhpCisJCVRkZWxheSgxKTsKKwl9Cit9CisKK3N0YXRpYyBfX3U4IFJkX0luZHgoX191MTYgaW9iYXNlLCBfX3U4IGFkZHIsIF9fdTggaW5kZXgpCit7CisJX191OCBkYXRhID0gMCwgYlRtcCwgZGF0YV9iaXQ7CisJaW50IGk7CisKKwliVG1wID0gYWRkciB8IChpbmRleCA8PCAxKSB8IDA7CisJQ2xrVHgoaW9iYXNlLCAwLCAwKTsKKwlUZGVsYXkoMik7CisJQWN0Q2xrKGlvYmFzZSwgMSk7CisJdWRlbGF5KDEpOworCVdyX0J5dGUoaW9iYXNlLCBiVG1wKTsKKwlTZGVsYXkoMSk7CisJQ2xrVHgoaW9iYXNlLCAwLCAwKTsKKwlUZGVsYXkoMik7CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCVRkZWxheSgxKTsKKwkJQWN0Q2xrKGlvYmFzZSwgMCk7CisJCVRkZWxheSgxKTsKKwkJQ2xrVHgoaW9iYXNlLCAwLCAxKTsKKwkJVGRlbGF5KDEpOworCQliVG1wID0gUmVhZFJlZyhpb2Jhc2UsIDB4MzQpOworCQlpZiAoIShiVG1wICYgUmRfVmFsaWQpKQorCQkJYnJlYWs7CisJfQorCWlmICghKGJUbXAgJiBSZF9WYWxpZCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCQlUZGVsYXkoMSk7CisJCQlBY3RDbGsoaW9iYXNlLCAwKTsKKwkJCWJUbXAgPSBSZWFkUmVnKGlvYmFzZSwgMHgzNCk7CisJCQlkYXRhX2JpdCA9IDEgPDwgaTsKKwkJCWlmIChiVG1wICYgUnhCaXQpCisJCQkJZGF0YSB8PSBkYXRhX2JpdDsKKwkJCWVsc2UKKwkJCQlkYXRhICY9IH5kYXRhX2JpdDsKKwkJCVRkZWxheSgyKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCUFjdENsayhpb2Jhc2UsIDEpOworCQkJVGRlbGF5KDEpOworCQkJQWN0Q2xrKGlvYmFzZSwgMCk7CisJCQlUZGVsYXkoMik7CisJCX0KKwkJYlRtcCA9IFJlYWRSZWcoaW9iYXNlLCAweDM0KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDE7IGkrKykgeworCQlBY3RDbGsoaW9iYXNlLCAxKTsKKwkJVGRlbGF5KDEpOworCQlBY3RDbGsoaW9iYXNlLCAwKTsKKwkJVGRlbGF5KDIpOworCX0KKwlDbGtUeChpb2Jhc2UsIDAsIDApOworCVRkZWxheSgxKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCUFjdENsayhpb2Jhc2UsIDEpOworCQlUZGVsYXkoMSk7CisJCUFjdENsayhpb2Jhc2UsIDApOworCQlUZGVsYXkoMik7CisJfQorCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCBXcl9JbmR4KF9fdTE2IGlvYmFzZSwgX191OCBhZGRyLCBfX3U4IGluZGV4LCBfX3U4IGRhdGEpCit7CisJaW50IGk7CisJX191OCBiVG1wOworCisJQ2xrVHgoaW9iYXNlLCAwLCAwKTsKKwl1ZGVsYXkoMik7CisJQWN0Q2xrKGlvYmFzZSwgMSk7CisJdWRlbGF5KDEpOworCWJUbXAgPSBhZGRyIHwgKGluZGV4IDw8IDEpIHwgMTsKKwlXcl9CeXRlKGlvYmFzZSwgYlRtcCk7CisJV3JfQnl0ZShpb2Jhc2UsIGRhdGEpOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJQ2xrVHgoaW9iYXNlLCAwLCAwKTsKKwkJVGRlbGF5KDIpOworCQlBY3RDbGsoaW9iYXNlLCAxKTsKKwkJVGRlbGF5KDEpOworCX0KKwlBY3RDbGsoaW9iYXNlLCAwKTsKK30KKworc3RhdGljIHZvaWQgUmVzZXREb25nbGUoX191MTYgaW9iYXNlKQoreworCWludCBpOworCUNsa1R4KGlvYmFzZSwgMCwgMCk7CisJVGRlbGF5KDEpOworCWZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSB7CisJCUFjdENsayhpb2Jhc2UsIDEpOworCQlUZGVsYXkoMSk7CisJCUFjdENsayhpb2Jhc2UsIDApOworCQlUZGVsYXkoMSk7CisJfQorCUFjdENsayhpb2Jhc2UsIDApOworfQorCitzdGF0aWMgdm9pZCBTZXRTSVRtb2RlKF9fdTE2IGlvYmFzZSkKK3sKKworCV9fdTggYlRtcDsKKworCWJUbXAgPSBSZWFkTFBDUmVnKDB4MjgpOworCVdyaXRlTFBDUmVnKDB4MjgsIGJUbXAgfCAweDEwKTsJLy9zZWxlY3QgSVRNT0ZGCisJYlRtcCA9IFJlYWRSZWcoaW9iYXNlLCAweDM1KTsKKwlXcml0ZVJlZyhpb2Jhc2UsIDB4MzUsIGJUbXAgfCAweDQwKTsJLy8gRHJpdmVyIElUTU9GRgorCVdyaXRlUmVnKGlvYmFzZSwgMHgyOCwgYlRtcCB8IDB4ODApOwkvLyBlbmFibGUgQWxsIGludGVycnVwdAorfQorCitzdGF0aWMgdm9pZCBTSV9TZXRNb2RlKF9fdTE2IGlvYmFzZSwgaW50IG1vZGUpCit7CisJLy9fX3UzMiBkVG1wOworCV9fdTggYlRtcDsKKworCVdyaXRlTFBDUmVnKDB4MjgsIDB4NzApOwkvLyBTL1cgUmVzZXQKKwlTZXRTSVRtb2RlKGlvYmFzZSk7CisJUmVzZXREb25nbGUoaW9iYXNlKTsKKwl1ZGVsYXkoMTApOworCVdyX0luZHgoaW9iYXNlLCAweDQwLCAweDAsIDB4MTcpOwkvL1JYICxBUEVOIGVuYWJsZSxOb3JtYWwgcG93ZXIKKwlXcl9JbmR4KGlvYmFzZSwgMHg0MCwgMHgxLCBtb2RlKTsJLy9TZXQgTW9kZQorCVdyX0luZHgoaW9iYXNlLCAweDQwLCAweDIsIDB4ZmYpOwkvL1NldCBwb3dlciB0byBGSVIgVkZJUiA+IDFtCisJYlRtcCA9IFJkX0luZHgoaW9iYXNlLCAweDQwLCAxKTsKK30KKworc3RhdGljIHZvaWQgSW5pdENhcmQoX191MTYgaW9iYXNlKQoreworCVJlc2V0Q2hpcChpb2Jhc2UsIDUpOworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDAwKTsJLy8gb3BlbiBDSElQIG9uCisJU2V0U0lSQk9GKGlvYmFzZSwgMHhjMCk7CS8vIGhhcmR3YXJlIGRlZmF1bHQgdmFsdWUKKwlTZXRTSVJFT0YoaW9iYXNlLCAweGMxKTsKK30KKworc3RhdGljIHZvaWQgQ29tbW9uSW5pdChfX3UxNiBpb2Jhc2UpCit7CisvLyAgRW5UWENSQyhpb2Jhc2UsMCk7CisJU3dhcERNQShpb2Jhc2UsIE9GRik7CisJU2V0TWF4UnhQYWNrZXRTaXplKGlvYmFzZSwgMHgwZmZmKTsJLy9zZXQgdG8gbWF4OjQwOTUKKwlFblJYRklGT1JlYWR5SW50KGlvYmFzZSwgT0ZGKTsKKwlFblJYRklGT0hhbGZMZXZlbEludChpb2Jhc2UsIE9GRik7CisJRW5UWEZJRk9IYWxmTGV2ZWxJbnQoaW9iYXNlLCBPRkYpOworCUVuVFhGSUZPVW5kZXJydW5FT01JbnQoaW9iYXNlLCBPTik7CisvLyAgRW5UWEZJRk9SZWFkeUludChpb2Jhc2UsT04pOworCUludmVydFRYKGlvYmFzZSwgT0ZGKTsKKwlJbnZlcnRSWChpb2Jhc2UsIE9GRik7CisvLyAgV3JpdGVMUENSZWcoMHhGMCwwKTsgLy8oaWYgVlQxMjExIHRoZW4gZG8gdGhpcykKKwlpZiAoSXNTSVJPbihpb2Jhc2UpKSB7CisJCVNJUkZpbHRlcihpb2Jhc2UsIE9OKTsKKwkJU0lSUmVjdkFueShpb2Jhc2UsIE9OKTsKKwl9IGVsc2UgeworCQlTSVJGaWx0ZXIoaW9iYXNlLCBPRkYpOworCQlTSVJSZWN2QW55KGlvYmFzZSwgT0ZGKTsKKwl9CisJRW5SWFNwZWNJbnQoaW9iYXNlLCBPTik7CisJV3JpdGVSZWcoaW9iYXNlLCBJX1NUX0NUXzAsIDB4ODApOworCUVuYWJsZURNQShpb2Jhc2UsIE9OKTsKK30KKworc3RhdGljIHZvaWQgU2V0QmF1ZFJhdGUoX191MTYgaW9iYXNlLCBfX3UzMiByYXRlKQoreworCV9fdTggdmFsdWUgPSAxMSwgdGVtcDsKKworCWlmIChJc1NJUk9uKGlvYmFzZSkpIHsKKwkJc3dpdGNoIChyYXRlKSB7CisJCWNhc2UgKF9fdTMyKSAoMjQwMEwpOgorCQkJdmFsdWUgPSA0NzsKKwkJCWJyZWFrOworCQljYXNlIChfX3UzMikgKDk2MDBMKToKKwkJCXZhbHVlID0gMTE7CisJCQlicmVhazsKKwkJY2FzZSAoX191MzIpICgxOTIwMEwpOgorCQkJdmFsdWUgPSA1OworCQkJYnJlYWs7CisJCWNhc2UgKF9fdTMyKSAoMzg0MDBMKToKKwkJCXZhbHVlID0gMjsKKwkJCWJyZWFrOworCQljYXNlIChfX3UzMikgKDU3NjAwTCk6CisJCQl2YWx1ZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAoX191MzIpICgxMTUyMDBMKToKKwkJCXZhbHVlID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX07CisJfSBlbHNlIGlmIChJc01JUk9uKGlvYmFzZSkpIHsKKwkJdmFsdWUgPSAwOwkvLyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZml4ZWQgaW4gMS4xNTJNCisJfSBlbHNlIGlmIChJc0ZJUk9uKGlvYmFzZSkpIHsKKwkJdmFsdWUgPSAwOwkvLyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZml4ZWQgaW4gNE0KKwl9CisJdGVtcCA9IChSZWFkUmVnKGlvYmFzZSwgSV9DRl9IXzEpICYgMHgwMyk7CisJdGVtcCB8PSB2YWx1ZSA8PCAyOworCVdyaXRlUmVnKGlvYmFzZSwgSV9DRl9IXzEsIHRlbXApOworfQorCitzdGF0aWMgdm9pZCBTZXRQdWxzZVdpZHRoKF9fdTE2IGlvYmFzZSwgX191OCB3aWR0aCkKK3sKKwlfX3U4IHRlbXAsIHRlbXAxLCB0ZW1wMjsKKworCXRlbXAgPSAoUmVhZFJlZyhpb2Jhc2UsIElfQ0ZfTF8xKSAmIDB4MWYpOworCXRlbXAxID0gKFJlYWRSZWcoaW9iYXNlLCBJX0NGX0hfMSkgJiAweGZjKTsKKwl0ZW1wMiA9ICh3aWR0aCAmIDB4MDcpIDw8IDU7CisJdGVtcCB8PSB0ZW1wMjsKKwl0ZW1wMiA9ICh3aWR0aCAmIDB4MTgpID4+IDM7CisJdGVtcDEgfD0gdGVtcDI7CisJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0xfMSwgdGVtcCk7CisJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0hfMSwgdGVtcDEpOworfQorCitzdGF0aWMgdm9pZCBTZXRTZW5kUHJlYW1ibGVDb3VudChfX3UxNiBpb2Jhc2UsIF9fdTggY291bnQpCit7CisJX191OCB0ZW1wOworCisJdGVtcCA9IFJlYWRSZWcoaW9iYXNlLCBJX0NGX0xfMSkgJiAweGUwOworCXRlbXAgfD0gY291bnQ7CisJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0xfMSwgdGVtcCk7CisKK30KKworc3RhdGljIHZvaWQgU2V0VkZJUihfX3UxNiBCYXNlQWRkciwgX191OCB2YWwpCit7CisJX191OCB0bXA7CisKKwl0bXAgPSBSZWFkUmVnKEJhc2VBZGRyLCBJX0NGX0xfMCk7CisJV3JpdGVSZWcoQmFzZUFkZHIsIElfQ0ZfTF8wLCB0bXAgJiAweDhmKTsKKwlXcml0ZVJlZ0JpdChCYXNlQWRkciwgSV9DRl9IXzAsIDUsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIFNldEZJUihfX3UxNiBCYXNlQWRkciwgX191OCB2YWwpCit7CisJX191OCB0bXA7CisKKwlXcml0ZVJlZ0JpdChCYXNlQWRkciwgSV9DRl9IXzAsIDUsIDApOworCXRtcCA9IFJlYWRSZWcoQmFzZUFkZHIsIElfQ0ZfTF8wKTsKKwlXcml0ZVJlZyhCYXNlQWRkciwgSV9DRl9MXzAsIHRtcCAmIDB4OGYpOworCVdyaXRlUmVnQml0KEJhc2VBZGRyLCBJX0NGX0xfMCwgNiwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgU2V0TUlSKF9fdTE2IEJhc2VBZGRyLCBfX3U4IHZhbCkKK3sKKwlfX3U4IHRtcDsKKworCVdyaXRlUmVnQml0KEJhc2VBZGRyLCBJX0NGX0hfMCwgNSwgMCk7CisJdG1wID0gUmVhZFJlZyhCYXNlQWRkciwgSV9DRl9MXzApOworCVdyaXRlUmVnKEJhc2VBZGRyLCBJX0NGX0xfMCwgdG1wICYgMHg4Zik7CisJV3JpdGVSZWdCaXQoQmFzZUFkZHIsIElfQ0ZfTF8wLCA1LCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBTZXRTSVIoX191MTYgQmFzZUFkZHIsIF9fdTggdmFsKQoreworCV9fdTggdG1wOworCisJV3JpdGVSZWdCaXQoQmFzZUFkZHIsIElfQ0ZfSF8wLCA1LCAwKTsKKwl0bXAgPSBSZWFkUmVnKEJhc2VBZGRyLCBJX0NGX0xfMCk7CisJV3JpdGVSZWcoQmFzZUFkZHIsIElfQ0ZfTF8wLCB0bXAgJiAweDhmKTsKKwlXcml0ZVJlZ0JpdChCYXNlQWRkciwgSV9DRl9MXzAsIDQsIHZhbCk7Cit9CisKKyNlbmRpZgkJCQkvKiB2aWFfSVJDQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmFkODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYwpAQCAtMCwwICsxLDE5MTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgl2bHNpX2lyLmM6CVZMU0k4MkMxNDcgUENJIElyREEgY29udHJvbGxlciBkcml2ZXIgZm9yIExpbnV4CisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgTWFydGluIERpZWhsCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKgl0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICoJTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyAKKyNkZWZpbmUgRFJJVkVSX05BTUUgCQkidmxzaV9pciIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSJ2MC41IgorI2RlZmluZSBEUklWRVJfREVTQ1JJUFRJT04JIklyREEgU0lSL01JUi9GSVIgZHJpdmVyIGZvciBWTFNJIDgyQzE0NyIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIk1hcnRpbiBEaWVobCA8aW5mb0BtZGllaGwuZGU+IgorCitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0NSSVBUSU9OKTsKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9jcmMuaD4KKworI2luY2x1ZGUgInZsc2lfaXIuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgLyogY29uc3QgKi8gY2hhciBkcml2ZXJuYW1lW10gPSBEUklWRVJfTkFNRTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZsc2lfaXJkYV90YWJsZSBbXSA9IHsKKwl7CisJCS5jbGFzcyA9ICAgICAgICBQQ0lfQ0xBU1NfV0lSRUxFU1NfSVJEQSA8PCA4LAorCQkuY2xhc3NfbWFzayA9CVBDSV9DTEFTU19TVUJDTEFTU19NQVNLIDw8IDgsIAorCQkudmVuZG9yID0gICAgICAgUENJX1ZFTkRPUl9JRF9WTFNJLAorCQkuZGV2aWNlID0gICAgICAgUENJX0RFVklDRV9JRF9WTFNJXzgyQzE0NywKKwkJLnN1YnZlbmRvciA9IAlQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0JUENJX0FOWV9JRCwKKwl9LAorCXsgLyogYWxsIHplcm9lcyAqLyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdmxzaV9pcmRhX3RhYmxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgljbGtzcmM6IHdoaWNoIGNsb2NrIHNvdXJjZSB0byBiZSB1c2VkCisgKgkJMDogYXV0byAtIHRyeSBQTEwsIGZhbGxiYWNrIHRvIDQwTUh6IFhDTEsKKyAqCQkxOiBvbi1jaGlwIDQ4TUh6IFBMTAorICoJCTI6IGV4dGVybmFsIDQ4TUh6IFhDTEsKKyAqCQkzOiBleHRlcm5hbCA0ME1IeiBYQ0xLIChIUCBPQi04MDApCisgKi8KKworc3RhdGljIGludCBjbGtzcmMgPSAwOwkJCS8qIGRlZmF1bHQgaXMgMChhdXRvKSAqLworbW9kdWxlX3BhcmFtKGNsa3NyYywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY2xrc3JjLCAiY2xvY2sgaW5wdXQgc291cmNlIHNlbGVjdGlvbiIpOworCisvKglyaW5nc2l6ZTogc2l6ZSBvZiB0aGUgdHggYW5kIHJ4IGRlc2NyaXB0b3IgcmluZ3MKKyAqCQlpbmRlcGVuZGVudCBmb3IgdHggYW5kIHJ4CisgKgkJc3BlY2lmeSBhcyByaW5nc2l6ZT10eFsscnhdCisgKgkJYWxsb3dlZCB2YWx1ZXM6IDQsIDgsIDE2LCAzMiwgNjQKKyAqCQlEdWUgdG8gdGhlIElyREEgMS54IG1heC4gYWxsb3dlZCB3aW5kb3cgc2l6ZT03LAorICoJCXRoZXJlIHNob3VsZCBiZSBubyBnYWluIHdoZW4gdXNpbmcgcmluZ3MgbGFyZ2VyIHRoYW4gOAorICovCisKK3N0YXRpYyBpbnQgcmluZ3NpemVbXSA9IHs4LDh9OwkJLyogZGVmYXVsdCBpcyB0eD04IC8gcng9OCAqLworbW9kdWxlX3BhcmFtX2FycmF5KHJpbmdzaXplLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhyaW5nc2l6ZSwgIlRYLCBSWCByaW5nIGRlc2NyaXB0b3Igc2l6ZSIpOworCisvKglzaXJwdWxzZTogdHVuaW5nIG9mIHRoZSBTSVIgcHVsc2Ugd2lkdGggd2l0aGluIElyUEhZIDEuMyBsaW1pdHMKKyAqCQkwOiB2ZXJ5IHNob3J0LCAxLjV1cyAoZXhjZXB0aW9uOiA2dXMgYXQgMi40IGtiYXVkKQorICoJCTE6IG5vbWluYWwgMy8xNiBiaXR0aW1lIHdpZHRoCisgKglub3RlOiBJckRBIGNvbXBsaWFudCBwZWVyIGRldmljZXMgc2hvdWxkIGJlIGhhcHB5IHJlZ2FyZGxlc3MKKyAqCQl3aGljaCBvbmUgaXMgdXNlZC4gUHJpbWFyeSBnb2FsIGlzIHRvIHNhdmUgc29tZSBwb3dlcgorICoJCW9uIHRoZSBzZW5kZXIncyBzaWRlIC0gYXQgOS42a2JhdWQgZm9yIGV4YW1wbGUgdGhlIHNob3J0CisgKgkJcHVsc2Ugd2lkdGggc2F2ZXMgbW9yZSB0aGFuIDkwJSBvZiB0aGUgdHJhbnNtaXR0ZWQgSVIgcG93ZXIuCisgKi8KKworc3RhdGljIGludCBzaXJwdWxzZSA9IDE7CQkvKiBkZWZhdWx0IGlzIDMvMTYgYml0dGltZSAqLworbW9kdWxlX3BhcmFtKHNpcnB1bHNlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzaXJwdWxzZSwgIlNJUiBwdWxzZSB3aWR0aCB0dW5pbmciKTsKKworLyoJcW9zX210dF9iaXRzOiBlbmNvZGVkIG1pbi10dXJuLXRpbWUgdmFsdWUgd2UgcmVxdWlyZSB0aGUgcGVlciBkZXZpY2UKKyAqCQkgdG8gdXNlIGJlZm9yZSB0cmFuc21pdHRpbmcgdG8gdXMuICJUeXBlIDEiIChwZXItc3RhdGlvbikKKyAqCQkgYml0ZmllbGQgYWNjb3JkaW5nIHRvIElyTEFQIGRlZmluaXRpb24gKHNlY3Rpb24gNi42LjgpCisgKgkJIERvbid0IGtub3cgd2hpY2ggdHJhbnNjZWl2ZXIgaXMgdXNlZCBieSBteSBPQjgwMCAtIHRoZQorICoJCSBwcmV0dHkgY29tbW9uIEhQIEhETFMtMTEwMCByZXF1aXJlcyAxIG1zZWMgLSBzbyBsZXRzIHVzZSB0aGlzLgorICovCisKK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMHgwNzsJCS8qIGRlZmF1bHQgaXMgMSBtcyBvciBtb3JlICovCittb2R1bGVfcGFyYW0ocW9zX210dF9iaXRzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhxb3NfbXR0X2JpdHMsICJJckxBUCBiaXRmaWVsZCByZXByZXNlbnRpbmcgbWluLXR1cm4tdGltZSIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHZsc2lfcmVnX2RlYnVnKHVuc2lnbmVkIGlvYmFzZSwgY29uc3QgY2hhciAqcykKK3sKKwlpbnQJaTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogIiwgcyk7CisJZm9yIChpID0gMDsgaSA8IDB4MjA7IGkrKykKKwkJcHJpbnRrKCIlMDJ4IiwgKHVuc2lnbmVkKWluYigoaW9iYXNlK2kpKSk7CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCB2bHNpX3JpbmdfZGVidWcoc3RydWN0IHZsc2lfcmluZyAqcikKK3sKKwlzdHJ1Y3QgcmluZ19kZXNjciAqcmQ7CisJdW5zaWduZWQgaTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlcyAtIHJpbmcgJXAgLyBzaXplICV1IC8gbWFzayAweCUwNHggLyBsZW4gJXUgLyBkaXIgJWQgLyBodyAlcFxuIiwKKwkJX19GVU5DVElPTl9fLCByLCByLT5zaXplLCByLT5tYXNrLCByLT5sZW4sIHItPmRpciwgci0+cmRbMF0uaHcpOworCXByaW50ayhLRVJOX0RFQlVHICIlcyAtIGhlYWQgPSAlZCAvIHRhaWwgPSAlZFxuIiwgX19GVU5DVElPTl9fLAorCQlhdG9taWNfcmVhZCgmci0+aGVhZCkgJiByLT5tYXNrLCBhdG9taWNfcmVhZCgmci0+dGFpbCkgJiByLT5tYXNrKTsKKwlmb3IgKGkgPSAwOyBpIDwgci0+c2l6ZTsgaSsrKSB7CisJCXJkID0gJnItPnJkW2ldOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgLSByaW5nIGRlc2NyICV1OiAiLCBfX0ZVTkNUSU9OX18sIGkpOworCQlwcmludGsoInNrYj0lcCBkYXRhPSVwIGh3PSVwXG4iLCByZC0+c2tiLCByZC0+YnVmLCByZC0+aHcpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgLSBodzogc3RhdHVzPSUwMnggY291bnQ9JXUgYWRkcj0weCUwOHhcbiIsCisJCQlfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCkgcmRfZ2V0X3N0YXR1cyhyZCksCisJCQkodW5zaWduZWQpIHJkX2dldF9jb3VudChyZCksICh1bnNpZ25lZCkgcmRfZ2V0X2FkZHIocmQpKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogbmVlZGVkIHJlZ2FyZGxlc3Mgb2YgQ09ORklHX1BST0NfRlMgKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnZsc2lfcHJvY19yb290ID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKK3N0YXRpYyB2b2lkIHZsc2lfcHJvY19wZGV2KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1bnNpZ25lZCBpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJdW5zaWduZWQgaTsKKworCXNlcV9wcmludGYoc2VxLCAiXG4lcyAodmlkL2RpZDogJTA0eC8lMDR4KVxuIiwKKwkJICAgUENJREVWX05BTUUocGRldiksIChpbnQpcGRldi0+dmVuZG9yLCAoaW50KXBkZXYtPmRldmljZSk7CisJc2VxX3ByaW50ZihzZXEsICJwY2ktcG93ZXItc3RhdGU6ICV1XG4iLCAodW5zaWduZWQpIHBkZXYtPmN1cnJlbnRfc3RhdGUpOworCXNlcV9wcmludGYoc2VxLCAicmVzb3VyY2VzOiBpcnE9JXUgLyBpbz0weCUwNHggLyBkbWFfbWFzaz0weCUwMTZMeFxuIiwKKwkJICAgcGRldi0+aXJxLCAodW5zaWduZWQpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCAodW5zaWduZWQgbG9uZyBsb25nKXBkZXYtPmRtYV9tYXNrKTsKKwlzZXFfcHJpbnRmKHNlcSwgImh3IHJlZ2lzdGVyczogIik7CisJZm9yIChpID0gMDsgaSA8IDB4MjA7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIlMDJ4IiwgKHVuc2lnbmVkKWluYigoaW9iYXNlK2kpKSk7CisJc2VxX3ByaW50ZihzZXEsICJcbiIpOworfQorCQkKK3N0YXRpYyB2b2lkIHZsc2lfcHJvY19uZGV2KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXU4IGJ5dGU7CisJdTE2IHdvcmQ7CisJdW5zaWduZWQgZGVsdGExLCBkZWx0YTI7CisJc3RydWN0IHRpbWV2YWwgbm93OworCXVuc2lnbmVkIGlvYmFzZSA9IG5kZXYtPmJhc2VfYWRkcjsKKworCXNlcV9wcmludGYoc2VxLCAiXG4lcyBsaW5rIHN0YXRlOiAlcyAvICVzIC8gJXMgLyAlc1xuIiwgbmRldi0+bmFtZSwKKwkJbmV0aWZfZGV2aWNlX3ByZXNlbnQobmRldikgPyAiYXR0YWNoZWQiIDogImRldGFjaGVkIiwgCisJCW5ldGlmX3J1bm5pbmcobmRldikgPyAicnVubmluZyIgOiAibm90IHJ1bm5pbmciLAorCQluZXRpZl9jYXJyaWVyX29rKG5kZXYpID8gImNhcnJpZXIgb2siIDogIm5vIGNhcnJpZXIiLAorCQluZXRpZl9xdWV1ZV9zdG9wcGVkKG5kZXYpID8gInF1ZXVlIHN0b3BwZWQiIDogInF1ZXVlIHJ1bm5pbmciKTsKKworCWlmICghbmV0aWZfcnVubmluZyhuZGV2KSkKKwkJcmV0dXJuOworCisJc2VxX3ByaW50ZihzZXEsICJcbmh3LXN0YXRlOlxuIik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaWRldi0+cGRldiwgVkxTSV9QQ0lfSVJNSVNDLCAmYnl0ZSk7CisJc2VxX3ByaW50ZihzZXEsICJJUk1JU0M6JXMlcyVzIHVhcnQlcyIsCisJCShieXRlJklSTUlTQ19JUlJBSUwpID8gIiBpcnJhaWwiIDogIiIsCisJCShieXRlJklSTUlTQ19JUlBEKSA/ICIgaXJwZCIgOiAiIiwKKwkJKGJ5dGUmSVJNSVNDX1VBUlRUU1QpID8gIiB1YXJ0dGVzdCIgOiAiIiwKKwkJKGJ5dGUmSVJNSVNDX1VBUlRFTikgPyAiQCIgOiAiIGRpc2FibGVkXG4iKTsKKwlpZiAoYnl0ZSZJUk1JU0NfVUFSVEVOKSB7CisJCXNlcV9wcmludGYoc2VxLCAiMHglc1xuIiwKKwkJCShieXRlJjIpID8gKChieXRlJjEpID8gIjNlOCIgOiAiMmU4IikKKwkJCQkgOiAoKGJ5dGUmMSkgPyAiM2Y4IiA6ICIyZjgiKSk7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGlkZXYtPnBkZXYsIFZMU0lfUENJX0NMS0NUTCwgJmJ5dGUpOworCXNlcV9wcmludGYoc2VxLCAiQ0xLQ1RMOiBQTEwgJXMlcyVzIC8gY2xvY2sgJXMgLyB3YWtldXAgJXNcbiIsCisJCShieXRlJkNMS0NUTF9QRF9JTlYpID8gInBvd2VyZWQiIDogImRvd24iLAorCQkoYnl0ZSZDTEtDVExfTE9DSykgPyAiIGxvY2tlZCIgOiAiIiwKKwkJKGJ5dGUmQ0xLQ1RMX0VYVENMSykgPyAoKGJ5dGUmQ0xLQ1RMX1hDS1NFTCk/IiAvIDQwIE1IeiBYQ0xLIjoiIC8gNDggTUh6IFhDTEsiKSA6ICIiLAorCQkoYnl0ZSZDTEtDVExfQ0xLU1RQKSA/ICJzdG9wcGVkIiA6ICJydW5uaW5nIiwKKwkJKGJ5dGUmQ0xLQ1RMX1dBS0UpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaWRldi0+cGRldiwgVkxTSV9QQ0lfTVNUUlBBR0UsICZieXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1TVFJQQUdFOiAweCUwMnhcbiIsICh1bnNpZ25lZClieXRlKTsKKworCWJ5dGUgPSBpbmIoaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7CisJc2VxX3ByaW50ZihzZXEsICJJUklOVFI6JXMlcyVzJXMlcyVzJXMlc1xuIiwKKwkJKGJ5dGUmSVJJTlRSX0FDVEVOKSA/ICIgQUNURU4iIDogIiIsCisJCShieXRlJklSSU5UUl9SUEtURU4pID8gIiBSUEtURU4iIDogIiIsCisJCShieXRlJklSSU5UUl9UUEtURU4pID8gIiBUUEtURU4iIDogIiIsCisJCShieXRlJklSSU5UUl9PRV9FTikgPyAiIE9FX0VOIiA6ICIiLAorCQkoYnl0ZSZJUklOVFJfQUNUSVZJVFkpID8gIiBBQ1RJVklUWSIgOiAiIiwKKwkJKGJ5dGUmSVJJTlRSX1JQS1RJTlQpID8gIiBSUEtUSU5UIiA6ICIiLAorCQkoYnl0ZSZJUklOVFJfVFBLVElOVCkgPyAiIFRQS1RJTlQiIDogIiIsCisJCShieXRlJklSSU5UUl9PRV9JTlQpID8gIiBPRV9JTlQiIDogIiIpOworCXdvcmQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX1JJTkdQVFIpOworCXNlcV9wcmludGYoc2VxLCAiUklOR1BUUjogcng9JXUgLyB0eD0ldVxuIiwgUklOR1BUUl9HRVRfUlgod29yZCksIFJJTkdQVFJfR0VUX1RYKHdvcmQpKTsKKwl3b3JkID0gaW53KGlvYmFzZStWTFNJX1BJT19SSU5HQkFTRSk7CisJc2VxX3ByaW50ZihzZXEsICJSSU5HQkFTRTogYnVzbWFwPTB4JTA4eFxuIiwKKwkJKCh1bnNpZ25lZCl3b3JkIDw8IDEwKXwoTVNUUlBBR0VfVkFMVUU8PDI0KSk7CisJd29yZCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fUklOR1NJWkUpOworCXNlcV9wcmludGYoc2VxLCAiUklOR1NJWkU6IHJ4PSV1IC8gdHg9JXVcbiIsIFJJTkdTSVpFX1RPX1JYU0laRSh3b3JkKSwKKwkJUklOR1NJWkVfVE9fVFhTSVpFKHdvcmQpKTsKKworCXdvcmQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKwlzZXFfcHJpbnRmKHNlcSwgIklSQ0ZHOiVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkod29yZCZJUkNGR19MT09QKSA/ICIgTE9PUCIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfRU5UWCkgPyAiIEVOVFgiIDogIiIsCisJCSh3b3JkJklSQ0ZHX0VOUlgpID8gIiBFTlJYIiA6ICIiLAorCQkod29yZCZJUkNGR19NU1RSKSA/ICIgTVNUUiIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfUlhBTlkpID8gIiBSWEFOWSIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfQ1JDMTYpID8gIiBDUkMxNiIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfRklSKSA/ICIgRklSIiA6ICIiLAorCQkod29yZCZJUkNGR19NSVIpID8gIiBNSVIiIDogIiIsCisJCSh3b3JkJklSQ0ZHX1NJUikgPyAiIFNJUiIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfU0lSRklMVCkgPyAiIFNJUkZJTFQiIDogIiIsCisJCSh3b3JkJklSQ0ZHX1NJUlRFU1QpID8gIiBTSVJURVNUIiA6ICIiLAorCQkod29yZCZJUkNGR19UWFBPTCkgPyAiIFRYUE9MIiA6ICIiLAorCQkod29yZCZJUkNGR19SWFBPTCkgPyAiIFJYUE9MIiA6ICIiKTsKKwl3b3JkID0gaW53KGlvYmFzZStWTFNJX1BJT19JUkVOQUJMRSk7CisJc2VxX3ByaW50ZihzZXEsICJJUkVOQUJMRTolcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkod29yZCZJUkVOQUJMRV9QSFlBTkRDTE9DSykgPyAiIFBIWUFORENMT0NLIiA6ICIiLAorCQkod29yZCZJUkVOQUJMRV9DRkdFUikgPyAiIENGR0VSUiIgOiAiIiwKKwkJKHdvcmQmSVJFTkFCTEVfRklSX09OKSA/ICIgRklSX09OIiA6ICIiLAorCQkod29yZCZJUkVOQUJMRV9NSVJfT04pID8gIiBNSVJfT04iIDogIiIsCisJCSh3b3JkJklSRU5BQkxFX1NJUl9PTikgPyAiIFNJUl9PTiIgOiAiIiwKKwkJKHdvcmQmSVJFTkFCTEVfRU5UWFNUKSA/ICIgRU5UWFNUIiA6ICIiLAorCQkod29yZCZJUkVOQUJMRV9FTlJYU1QpID8gIiBFTlJYU1QiIDogIiIsCisJCSh3b3JkJklSRU5BQkxFX0NSQzE2X09OKSA/ICIgQ1JDMTZfT04iIDogIiIpOworCXdvcmQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX1BIWUNUTCk7CisJc2VxX3ByaW50ZihzZXEsICJQSFlDVEw6IGJhdWQtZGl2aXNvcj0ldSAvIHB1bHNld2lkdGg9JXUgLyBwcmVhbWJsZT0ldVxuIiwKKwkJKHVuc2lnbmVkKVBIWUNUTF9UT19CQVVEKHdvcmQpLAorCQkodW5zaWduZWQpUEhZQ1RMX1RPX1BMU1dJRCh3b3JkKSwKKwkJKHVuc2lnbmVkKVBIWUNUTF9UT19QUkVBTUIod29yZCkpOworCXdvcmQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX05QSFlDVEwpOworCXNlcV9wcmludGYoc2VxLCAiTlBIWUNUTDogYmF1ZC1kaXZpc29yPSV1IC8gcHVsc2V3aWR0aD0ldSAvIHByZWFtYmxlPSV1XG4iLAorCQkodW5zaWduZWQpUEhZQ1RMX1RPX0JBVUQod29yZCksCisJCSh1bnNpZ25lZClQSFlDVExfVE9fUExTV0lEKHdvcmQpLAorCQkodW5zaWduZWQpUEhZQ1RMX1RPX1BSRUFNQih3b3JkKSk7CisJd29yZCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fTUFYUEtUKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1BWFBLVDogbWF4LiByeCBwYWNrZXQgc2l6ZSA9ICV1XG4iLCB3b3JkKTsKKwl3b3JkID0gaW53KGlvYmFzZStWTFNJX1BJT19SQ1ZCQ05UKSAmIFJDVkJDTlRfTUFTSzsKKwlzZXFfcHJpbnRmKHNlcSwgIlJDVkJDTlQ6IHJ4LWZpZm8gZmlsbGluZyBsZXZlbCA9ICV1XG4iLCB3b3JkKTsKKworCXNlcV9wcmludGYoc2VxLCAiXG5zdy1zdGF0ZTpcbiIpOworCXNlcV9wcmludGYoc2VxLCAiSXJQSFkgc2V0dXA6ICVkIGJhdWQgLSAlcyBlbmNvZGluZ1xuIiwgaWRldi0+YmF1ZCwgCisJCShpZGV2LT5tb2RlPT1JRkZfU0lSKT8iU0lSIjooKGlkZXYtPm1vZGU9PUlGRl9NSVIpPyJNSVIiOiJGSVIiKSk7CisJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCWlmIChub3cudHZfdXNlYyA+PSBpZGV2LT5sYXN0X3J4LnR2X3VzZWMpIHsKKwkJZGVsdGEyID0gbm93LnR2X3VzZWMgLSBpZGV2LT5sYXN0X3J4LnR2X3VzZWM7CisJCWRlbHRhMSA9IDA7CisJfQorCWVsc2UgeworCQlkZWx0YTIgPSAxMDAwMDAwICsgbm93LnR2X3VzZWMgLSBpZGV2LT5sYXN0X3J4LnR2X3VzZWM7CisJCWRlbHRhMSA9IDE7CisJfQorCXNlcV9wcmludGYoc2VxLCAibGFzdCByeDogJWx1LiUwNnUgc2VjXG4iLAorCQlub3cudHZfc2VjIC0gaWRldi0+bGFzdF9yeC50dl9zZWMgLSBkZWx0YTEsIGRlbHRhMik7CQorCisJc2VxX3ByaW50ZihzZXEsICJSWDogcGFja2V0cz0lbHUgLyBieXRlcz0lbHUgLyBlcnJvcnM9JWx1IC8gZHJvcHBlZD0lbHUiLAorCQlpZGV2LT5zdGF0cy5yeF9wYWNrZXRzLCBpZGV2LT5zdGF0cy5yeF9ieXRlcywgaWRldi0+c3RhdHMucnhfZXJyb3JzLAorCQlpZGV2LT5zdGF0cy5yeF9kcm9wcGVkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAvIG92ZXJydW49JWx1IC8gbGVuZ3RoPSVsdSAvIGZyYW1lPSVsdSAvIGNyYz0lbHVcbiIsCisJCWlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzLCBpZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzLAorCQlpZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMsIGlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMpOworCXNlcV9wcmludGYoc2VxLCAiVFg6IHBhY2tldHM9JWx1IC8gYnl0ZXM9JWx1IC8gZXJyb3JzPSVsdSAvIGRyb3BwZWQ9JWx1IC8gZmlmbz0lbHVcbiIsCisJCWlkZXYtPnN0YXRzLnR4X3BhY2tldHMsIGlkZXYtPnN0YXRzLnR4X2J5dGVzLCBpZGV2LT5zdGF0cy50eF9lcnJvcnMsCisJCWlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQsIGlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKTsKKworfQorCQkKK3N0YXRpYyB2b2lkIHZsc2lfcHJvY19yaW5nKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgdmxzaV9yaW5nICpyKQoreworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwl1bnNpZ25lZCBpLCBqOworCWludCBoLCB0OworCisJc2VxX3ByaW50ZihzZXEsICJzaXplICV1IC8gbWFzayAweCUwNHggLyBsZW4gJXUgLyBkaXIgJWQgLyBodyAlcFxuIiwKKwkJci0+c2l6ZSwgci0+bWFzaywgci0+bGVuLCByLT5kaXIsIHItPnJkWzBdLmh3KTsKKwloID0gYXRvbWljX3JlYWQoJnItPmhlYWQpICYgci0+bWFzazsKKwl0ID0gYXRvbWljX3JlYWQoJnItPnRhaWwpICYgci0+bWFzazsKKwlzZXFfcHJpbnRmKHNlcSwgImhlYWQgPSAlZCAvIHRhaWwgPSAlZCAiLCBoLCB0KTsKKwlpZiAoaCA9PSB0KQorCQlzZXFfcHJpbnRmKHNlcSwgIihlbXB0eSlcbiIpOworCWVsc2UgeworCQlpZiAoKCh0KzEpJnItPm1hc2spID09IGgpCisJCQlzZXFfcHJpbnRmKHNlcSwgIihmdWxsKVxuIik7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiKGxldmVsID0gJWQpXG4iLCAoKHVuc2lnbmVkKSh0LWgpICYgci0+bWFzaykpOyAKKwkJcmQgPSAmci0+cmRbaF07CisJCWogPSAodW5zaWduZWQpIHJkX2dldF9jb3VudChyZCk7CisJCXNlcV9wcmludGYoc2VxLCAiY3VycmVudDogcmQgPSAlZCAvIHN0YXR1cyA9ICUwMnggLyBsZW4gPSAldVxuIiwKKwkJCQloLCAodW5zaWduZWQpcmRfZ2V0X3N0YXR1cyhyZCksIGopOworCQlpZiAoaiA+IDApIHsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgZGF0YToiKTsKKwkJCWlmIChqID4gMjApCisJCQkJaiA9IDIwOworCQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiAlMDJ4IiwgKHVuc2lnbmVkKSgodW5zaWduZWQgY2hhciAqKXJkLT5idWYpW2ldKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgci0+c2l6ZTsgaSsrKSB7CisJCXJkID0gJnItPnJkW2ldOworCQlzZXFfcHJpbnRmKHNlcSwgIj4gcmluZyBkZXNjciAldTogIiwgaSk7CisJCXNlcV9wcmludGYoc2VxLCAic2tiPSVwIGRhdGE9JXAgaHc9JXBcbiIsIHJkLT5za2IsIHJkLT5idWYsIHJkLT5odyk7CisJCXNlcV9wcmludGYoc2VxLCAiICBodzogc3RhdHVzPSUwMnggY291bnQ9JXUgYnVzYWRkcj0weCUwOHhcbiIsCisJCQkodW5zaWduZWQpIHJkX2dldF9zdGF0dXMocmQpLAorCQkJKHVuc2lnbmVkKSByZF9nZXRfY291bnQocmQpLCAodW5zaWduZWQpIHJkX2dldF9hZGRyKHJkKSk7CisJfQorfQorCitzdGF0aWMgaW50IHZsc2lfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBzZXEtPnByaXZhdGU7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2VxX3ByaW50ZihzZXEsICJcbiVzICVzXG5cbiIsIERSSVZFUl9OQU1FLCBEUklWRVJfVkVSU0lPTik7CisJc2VxX3ByaW50ZihzZXEsICJjbGtzcmM6ICVzXG4iLCAKKwkJKGNsa3NyYz49MikgPyAoKGNsa3NyYz09Myk/IjQwTUh6IFhDTEsiOiI0OE1IeiBYQ0xLIikKKwkJCSAgICA6ICgoY2xrc3JjPT0xKT8iNDhNSHogUExMIjoiYXV0b2RldGVjdCIpKTsKKwlzZXFfcHJpbnRmKHNlcSwgInJpbmdzaXplOiB0eD0lZCAvIHJ4PSVkXG4iLAorCQlyaW5nc2l6ZVswXSwgcmluZ3NpemVbMV0pOworCXNlcV9wcmludGYoc2VxLCAic2lycHVsc2U6ICVzXG4iLCAoc2lycHVsc2UpPyIzLzE2IGJpdHRpbWUiOiJzaG9ydCIpOworCXNlcV9wcmludGYoc2VxLCAicW9zX210dF9iaXRzOiAweCUwMnhcbiIsICh1bnNpZ25lZClxb3NfbXR0X2JpdHMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaWRldi0+cGRldiAhPSBOVUxMKSB7CisJCXZsc2lfcHJvY19wZGV2KHNlcSwgaWRldi0+cGRldik7CisKKwkJaWYgKGlkZXYtPnBkZXYtPmN1cnJlbnRfc3RhdGUgPT0gMCkKKwkJCXZsc2lfcHJvY19uZGV2KHNlcSwgbmRldik7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiXG5QQ0kgY29udHJvbGxlciBkb3duIC0gcmVzdW1lX29rID0gJWRcbiIsCisJCQkJaWRldi0+cmVzdW1lX29rKTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcobmRldikgJiYgaWRldi0+cnhfcmluZyAmJiBpZGV2LT50eF9yaW5nKSB7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlxuLS0tLS0tLS0tIFJYIHJpbmcgLS0tLS0tLS0tLS1cblxuIik7CisJCQl2bHNpX3Byb2NfcmluZyhzZXEsIGlkZXYtPnJ4X3JpbmcpOworCQkJc2VxX3ByaW50ZihzZXEsICJcbi0tLS0tLS0tLSBUWCByaW5nIC0tLS0tLS0tLS0tXG5cbiIpOworCQkJdmxzaV9wcm9jX3Jpbmcoc2VxLCBpZGV2LT50eF9yaW5nKTsKKwkJfQorCX0KKwlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRldi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgdmxzaV9zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZsc2lfcHJvY19mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IHZsc2lfc2VxX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworI2RlZmluZSBWTFNJX1BST0NfRk9QUwkJKCZ2bHNpX3Byb2NfZm9wcykKKworI2Vsc2UJLyogQ09ORklHX1BST0NfRlMgKi8KKyNkZWZpbmUgVkxTSV9QUk9DX0ZPUFMJCU5VTEwKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgdmxzaV9yaW5nICp2bHNpX2FsbG9jX3Jpbmcoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByaW5nX2Rlc2NyX2h3ICpod21hcCwKKwkJCQkJCXVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGxlbiwgaW50IGRpcikKK3sKKwlzdHJ1Y3QgdmxzaV9yaW5nICpyOworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwl1bnNpZ25lZAlpLCBqOworCWRtYV9hZGRyX3QJYnVzYWRkcjsKKworCWlmICghc2l6ZSAgfHwgICgoc2l6ZS0xKSZzaXplKSE9MCkJLyogbXVzdCBiZSA+MCBhbmQgcG93ZXIgb2YgMiAqLworCQlyZXR1cm4gTlVMTDsKKworCXIgPSBrbWFsbG9jKHNpemVvZigqcikgKyBzaXplICogc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2NyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7CisKKwlyLT5wZGV2ID0gcGRldjsKKwlyLT5kaXIgPSBkaXI7CisJci0+bGVuID0gbGVuOworCXItPnJkID0gKHN0cnVjdCByaW5nX2Rlc2NyICopKHIrMSk7CisJci0+bWFzayA9IHNpemUgLSAxOworCXItPnNpemUgPSBzaXplOworCWF0b21pY19zZXQoJnItPmhlYWQsIDApOworCWF0b21pY19zZXQoJnItPnRhaWwsIDApOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlyZCA9IHItPnJkICsgaTsKKwkJbWVtc2V0KHJkLCAwLCBzaXplb2YoKnJkKSk7CisJCXJkLT5odyA9IGh3bWFwICsgaTsKKwkJcmQtPmJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMfEdGUF9ETUEpOworCQlpZiAocmQtPmJ1ZiA9PSBOVUxMCisJCSAgICB8fCAgIShidXNhZGRyID0gcGNpX21hcF9zaW5nbGUocGRldiwgcmQtPmJ1ZiwgbGVuLCBkaXIpKSkgeworCQkJaWYgKHJkLT5idWYpIHsKKwkJCQlJUkRBX0VSUk9SKCIlczogZmFpbGVkIHRvIGNyZWF0ZSBQQ0ktTUFQIGZvciAlcCIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXywgcmQtPmJ1Zik7CisJCQkJa2ZyZWUocmQtPmJ1Zik7CisJCQkJcmQtPmJ1ZiA9IE5VTEw7CisJCQl9CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJcmQgPSByLT5yZCArIGo7CisJCQkJYnVzYWRkciA9IHJkX2dldF9hZGRyKHJkKTsKKwkJCQlyZF9zZXRfYWRkcl9zdGF0dXMocmQsIDAsIDApOworCQkJCWlmIChidXNhZGRyKQorCQkJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIGJ1c2FkZHIsIGxlbiwgZGlyKTsKKwkJCQlrZnJlZShyZC0+YnVmKTsKKwkJCQlyZC0+YnVmID0gTlVMTDsKKwkJCX0KKwkJCWtmcmVlKHIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmRfc2V0X2FkZHJfc3RhdHVzKHJkLCBidXNhZGRyLCAwKTsKKwkJLyogaW5pdGlhbGx5LCB0aGUgZG1hIGJ1ZmZlciBpcyBvd25lZCBieSB0aGUgQ1BVICovCisJCXJkLT5za2IgPSBOVUxMOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCB2bHNpX2ZyZWVfcmluZyhzdHJ1Y3QgdmxzaV9yaW5nICpyKQoreworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwl1bnNpZ25lZAlpOworCWRtYV9hZGRyX3QJYnVzYWRkcjsKKworCWZvciAoaSA9IDA7IGkgPCByLT5zaXplOyBpKyspIHsKKwkJcmQgPSByLT5yZCArIGk7CisJCWlmIChyZC0+c2tiKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkocmQtPnNrYik7CisJCWJ1c2FkZHIgPSByZF9nZXRfYWRkcihyZCk7CisJCXJkX3NldF9hZGRyX3N0YXR1cyhyZCwgMCwgMCk7CisJCWlmIChidXNhZGRyKQorCQkJcGNpX3VubWFwX3NpbmdsZShyLT5wZGV2LCBidXNhZGRyLCByLT5sZW4sIHItPmRpcik7CisJCWlmIChyZC0+YnVmKQorCQkJa2ZyZWUocmQtPmJ1Zik7CisJfQorCWtmcmVlKHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZsc2lfY3JlYXRlX2h3aWYodmxzaV9pcmRhX2Rldl90ICppZGV2KQoreworCWNoYXIgCQkJKnJpbmdhcmVhOworCXN0cnVjdCByaW5nX2Rlc2NyX2h3CSpod21hcDsKKworCWlkZXYtPnZpcnRhZGRyID0gTlVMTDsKKwlpZGV2LT5idXNhZGRyID0gMDsKKworCXJpbmdhcmVhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaWRldi0+cGRldiwgSFdfUklOR19BUkVBX1NJWkUsICZpZGV2LT5idXNhZGRyKTsKKwlpZiAoIXJpbmdhcmVhKSB7CisJCUlSREFfRVJST1IoIiVzOiBpbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBkZXNjcmlwdG9yIHJpbmdzXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXQ7CisJfQorCW1lbXNldChyaW5nYXJlYSwgMCwgSFdfUklOR19BUkVBX1NJWkUpOworCisJaHdtYXAgPSAoc3RydWN0IHJpbmdfZGVzY3JfaHcgKilyaW5nYXJlYTsKKwlpZGV2LT5yeF9yaW5nID0gdmxzaV9hbGxvY19yaW5nKGlkZXYtPnBkZXYsIGh3bWFwLCByaW5nc2l6ZVsxXSwKKwkJCQkJWEZFUl9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlpZiAoaWRldi0+cnhfcmluZyA9PSBOVUxMKQorCQlnb3RvIG91dF91bm1hcDsKKworCWh3bWFwICs9IE1BWF9SSU5HX0RFU0NSOworCWlkZXYtPnR4X3JpbmcgPSB2bHNpX2FsbG9jX3JpbmcoaWRldi0+cGRldiwgaHdtYXAsIHJpbmdzaXplWzBdLAorCQkJCQlYRkVSX0JVRl9TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZiAoaWRldi0+dHhfcmluZyA9PSBOVUxMKQorCQlnb3RvIG91dF9mcmVlX3J4OworCisJaWRldi0+dmlydGFkZHIgPSByaW5nYXJlYTsKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfcng6CisJdmxzaV9mcmVlX3JpbmcoaWRldi0+cnhfcmluZyk7CitvdXRfdW5tYXA6CisJaWRldi0+cnhfcmluZyA9IGlkZXYtPnR4X3JpbmcgPSBOVUxMOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoaWRldi0+cGRldiwgSFdfUklOR19BUkVBX1NJWkUsIHJpbmdhcmVhLCBpZGV2LT5idXNhZGRyKTsKKwlpZGV2LT5idXNhZGRyID0gMDsKK291dDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCB2bHNpX2Rlc3Ryb3lfaHdpZih2bHNpX2lyZGFfZGV2X3QgKmlkZXYpCit7CisJdmxzaV9mcmVlX3JpbmcoaWRldi0+cnhfcmluZyk7CisJdmxzaV9mcmVlX3JpbmcoaWRldi0+dHhfcmluZyk7CisJaWRldi0+cnhfcmluZyA9IGlkZXYtPnR4X3JpbmcgPSBOVUxMOworCisJaWYgKGlkZXYtPmJ1c2FkZHIpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaWRldi0+cGRldixIV19SSU5HX0FSRUFfU0laRSxpZGV2LT52aXJ0YWRkcixpZGV2LT5idXNhZGRyKTsKKworCWlkZXYtPnZpcnRhZGRyID0gTlVMTDsKKwlpZGV2LT5idXNhZGRyID0gMDsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdmxzaV9wcm9jZXNzX3J4KHN0cnVjdCB2bHNpX3JpbmcgKnIsIHN0cnVjdCByaW5nX2Rlc2NyICpyZCkKK3sKKwl1MTYJCXN0YXR1czsKKwlpbnQJCWNyY2xlbiwgbGVuID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCWludAkJcmV0ID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXBjaV9nZXRfZHJ2ZGF0YShyLT5wZGV2KTsKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHItPnBkZXYsIHJkX2dldF9hZGRyKHJkKSwgci0+bGVuLCByLT5kaXIpOworCS8qIGRtYSBidWZmZXIgbm93IG93bmVkIGJ5IHRoZSBDUFUgKi8KKwlzdGF0dXMgPSByZF9nZXRfc3RhdHVzKHJkKTsKKwlpZiAoc3RhdHVzICYgUkRfUlhfRVJST1IpIHsKKwkJaWYgKHN0YXR1cyAmIFJEX1JYX09WRVIpICAKKwkJCXJldCB8PSBWTFNJX1JYX09WRVI7CisJCWlmIChzdGF0dXMgJiBSRF9SWF9MRU5HVEgpICAKKwkJCXJldCB8PSBWTFNJX1JYX0xFTkdUSDsKKwkJaWYgKHN0YXR1cyAmIFJEX1JYX1BIWUVSUikgIAorCQkJcmV0IHw9IFZMU0lfUlhfRlJBTUU7CisJCWlmIChzdGF0dXMgJiBSRF9SWF9DUkNFUlIpICAKKwkJCXJldCB8PSBWTFNJX1JYX0NSQzsKKwkJZ290byBkb25lOworCX0KKworCWxlbiA9IHJkX2dldF9jb3VudChyZCk7CisJY3JjbGVuID0gKGlkZXYtPm1vZGU9PUlGRl9GSVIpID8gc2l6ZW9mKHUzMikgOiBzaXplb2YodTE2KTsKKwlsZW4gLT0gY3JjbGVuOwkJLyogcmVtb3ZlIHRyYWlsaW5nIENSQyAqLworCWlmIChsZW4gPD0gMCkgeworCQlJUkRBX0RFQlVHKDAsICIlczogc3RyYW5nZSBmcmFtZSAobGVuPSVkKVxuIiwgX19GVU5DVElPTl9fLCBsZW4pOworCQlyZXQgfD0gVkxTSV9SWF9EUk9QOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGlkZXYtPm1vZGUgPT0gSUZGX1NJUikgewkvKiBodyBjaGVja3MgQ1JDIGluIE1JUiwgRklSIG1vZGUgKi8KKworCQkvKiByZC0+YnVmIGlzIGEgc3RyZWFtaW5nIFBDSV9ETUFfRlJPTURFVklDRSBtYXAuIERvaW5nIHRoZQorCQkgKiBlbmRpYW4tYWRqdXN0bWVudCB0aGVyZSBqdXN0IGluIHBsYWNlIHdpbGwgZGlydHkgYSBjYWNoZSBsaW5lCisJCSAqIHdoaWNoIGJlbG9uZ3MgdG8gdGhlIG1hcCBhbmQgdGh1cyB3ZSBtdXN0IGJlIHN1cmUgaXQgd2lsbAorCQkgKiBnZXQgZmx1c2hlZCBiZWZvcmUgZ2l2aW5nIHRoZSBidWZmZXIgYmFjayB0byBoYXJkd2FyZS4KKwkJICogdmxzaV9maWxsX3J4KCkgd2lsbCBkbyB0aGlzIGFueXdheSAtIGJ1dCBoZXJlIHdlIHJlbHkgb24uCisJCSAqLworCQlsZTE2X3RvX2NwdXMocmQtPmJ1ZitsZW4pOworCQlpZiAoaXJkYV9jYWxjX2NyYzE2KElOSVRfRkNTLHJkLT5idWYsbGVuK2NyY2xlbikgIT0gR09PRF9GQ1MpIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzOiBjcmMgZXJyb3JcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXQgfD0gVkxTSV9SWF9DUkM7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlpZiAoIXJkLT5za2IpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogcnggcGFja2V0IGxvc3RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldCB8PSBWTFNJX1JYX0RST1A7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlza2IgPSByZC0+c2tiOworCXJkLT5za2IgPSBOVUxMOworCXNrYi0+ZGV2ID0gbmRldjsKKwltZW1jcHkoc2tiX3B1dChza2IsbGVuKSwgcmQtPmJ1ZiwgbGVuKTsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQluZXRpZl9yeChza2IpOworCWVsc2UKKwkJbmV0aWZfcnhfbmkoc2tiKTsKKwluZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworZG9uZToKKwlyZF9zZXRfc3RhdHVzKHJkLCAwKTsKKwlyZF9zZXRfY291bnQocmQsIDApOworCS8qIGJ1ZmZlciBzdGlsbCBvd25lZCBieSBDUFUgKi8KKworCXJldHVybiAocmV0KSA/IC1yZXQgOiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIHZsc2lfZmlsbF9yeChzdHJ1Y3QgdmxzaV9yaW5nICpyKQoreworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKworCWZvciAocmQgPSByaW5nX2xhc3Qocik7IHJkICE9IE5VTEw7IHJkID0gcmluZ19wdXQocikpIHsKKwkJaWYgKHJkX2lzX2FjdGl2ZShyZCkpIHsKKwkJCUlSREFfV0FSTklORygiJXM6IGRyaXZlciBidWc6IHJ4IGRlc2NyIHJhY2Ugd2l0aCBod1xuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQl2bHNpX3JpbmdfZGVidWcocik7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXJkLT5za2IpIHsKKwkJCXJkLT5za2IgPSBkZXZfYWxsb2Nfc2tiKElSTEFQX1NLQl9BTExPQ1NJWkUpOworCQkJaWYgKHJkLT5za2IpIHsKKwkJCQlza2JfcmVzZXJ2ZShyZC0+c2tiLDEpOworCQkJCXJkLT5za2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJCQl9CisJCQllbHNlCisJCQkJYnJlYWs7CS8qIHByb2JhYmx5IG5vdCB3b3J0aCBsb2dnaW5nPyAqLworCQl9CisJCS8qIGdpdmUgZG1hIGJ1ZmZlciBiYWNrIHRvIGJ1c21hc3RlciAqLworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoci0+cGRldiwgcmRfZ2V0X2FkZHIocmQpLCByLT5sZW4sIHItPmRpcik7CisJCXJkX2FjdGl2YXRlKHJkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZsc2lfcnhfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisJc3RydWN0IHZsc2lfcmluZyAqciA9IGlkZXYtPnJ4X3Jpbmc7CisJc3RydWN0IHJpbmdfZGVzY3IgKnJkOworCWludCByZXQ7CisKKwlmb3IgKHJkID0gcmluZ19maXJzdChyKTsgcmQgIT0gTlVMTDsgcmQgPSByaW5nX2dldChyKSkgeworCisJCWlmIChyZF9pc19hY3RpdmUocmQpKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gdmxzaV9wcm9jZXNzX3J4KHIsIHJkKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gLXJldDsKKwkJCWlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfRFJPUCkgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWlmIChyZXQgJiBWTFNJX1JYX09WRVIpICAKKwkJCQlpZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfTEVOR1RIKSAgCisJCQkJaWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfRlJBTUUpICAKKwkJCQlpZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChyZXQgJiBWTFNJX1JYX0NSQykgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJfQorCQllbHNlIGlmIChyZXQgPiAwKSB7CisJCQlpZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlpZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByZXQ7CisJCX0KKwl9CisKKwlkb19nZXR0aW1lb2ZkYXkoJmlkZXYtPmxhc3RfcngpOyAvKiByZW1lbWJlciAibm93IiBmb3IgbGF0ZXIgbXR0IGRlbGF5ICovCisKKwl2bHNpX2ZpbGxfcngocik7CisKKwlpZiAocmluZ19maXJzdChyKSA9PSBOVUxMKSB7CisJCS8qIHdlIGFyZSBpbiBiaWcgdHJvdWJsZSwgaWYgdGhpcyBzaG91bGQgZXZlciBoYXBwZW4gKi8KKwkJSVJEQV9FUlJPUigiJXM6IHJ4IHJpbmcgZXhoYXVzdGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJdmxzaV9yaW5nX2RlYnVnKHIpOworCX0KKwllbHNlCisJCW91dHcoMCwgbmRldi0+YmFzZV9hZGRyK1ZMU0lfUElPX1BST01QVCk7Cit9CisKKy8qIGNhbGxlciBtdXN0IGhhdmUgc3RvcHBlZCB0aGUgY29udHJvbGxlciBmcm9tIGJ1c21hc3RlcmluZyAqLworCitzdGF0aWMgdm9pZCB2bHNpX3VuYXJtX3J4KHZsc2lfaXJkYV9kZXZfdCAqaWRldikKK3sKKwlzdHJ1Y3QgdmxzaV9yaW5nICpyID0gaWRldi0+cnhfcmluZzsKKwlzdHJ1Y3QgcmluZ19kZXNjciAqcmQ7CisJaW50IHJldDsKKworCWZvciAocmQgPSByaW5nX2ZpcnN0KHIpOyByZCAhPSBOVUxMOyByZCA9IHJpbmdfZ2V0KHIpKSB7CisKKwkJcmV0ID0gMDsKKwkJaWYgKHJkX2lzX2FjdGl2ZShyZCkpIHsKKwkJCXJkX3NldF9zdGF0dXMocmQsIDApOworCQkJaWYgKHJkX2dldF9jb3VudChyZCkpIHsKKwkJCQlJUkRBX0RFQlVHKDAsICIlcyAtIGRyb3BwaW5nIHJ4IHBhY2tldFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlyZXQgPSAtVkxTSV9SWF9EUk9QOworCQkJfQorCQkJcmRfc2V0X2NvdW50KHJkLCAwKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShyLT5wZGV2LCByZF9nZXRfYWRkcihyZCksIHItPmxlbiwgci0+ZGlyKTsKKwkJCWlmIChyZC0+c2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkocmQtPnNrYik7CisJCQkJcmQtPnNrYiA9IE5VTEw7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJcmV0ID0gdmxzaV9wcm9jZXNzX3J4KHIsIHJkKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gLXJldDsKKwkJCWlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfRFJPUCkgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWlmIChyZXQgJiBWTFNJX1JYX09WRVIpICAKKwkJCQlpZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfTEVOR1RIKSAgCisJCQkJaWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfRlJBTUUpICAKKwkJCQlpZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChyZXQgJiBWTFNJX1JYX0NSQykgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJfQorCQllbHNlIGlmIChyZXQgPiAwKSB7CisJCQlpZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlpZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByZXQ7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB2bHNpX3Byb2Nlc3NfdHgoc3RydWN0IHZsc2lfcmluZyAqciwgc3RydWN0IHJpbmdfZGVzY3IgKnJkKQoreworCXUxNgkJc3RhdHVzOworCWludAkJbGVuOworCWludAkJcmV0OworCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHItPnBkZXYsIHJkX2dldF9hZGRyKHJkKSwgci0+bGVuLCByLT5kaXIpOworCS8qIGRtYSBidWZmZXIgbm93IG93bmVkIGJ5IHRoZSBDUFUgKi8KKwlzdGF0dXMgPSByZF9nZXRfc3RhdHVzKHJkKTsKKwlpZiAoc3RhdHVzICYgUkRfVFhfVU5EUk4pCisJCXJldCA9IFZMU0lfVFhfRklGTzsKKwllbHNlCisJCXJldCA9IDA7CisJcmRfc2V0X3N0YXR1cyhyZCwgMCk7CisKKwlpZiAocmQtPnNrYikgeworCQlsZW4gPSByZC0+c2tiLT5sZW47CisJCWRldl9rZnJlZV9za2JfYW55KHJkLT5za2IpOworCQlyZC0+c2tiID0gTlVMTDsKKwl9CisJZWxzZQkvKiB0eC1za2IgYWxyZWFkeSBmcmVlZD8gLSBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCWxlbiA9IHJkX2dldF9jb3VudChyZCk7CQkvKiBpbmNvcnJlY3QgZm9yIFNJUiEgKGR1ZSB0byB3cmFwcGluZykgKi8KKworCXJkX3NldF9jb3VudChyZCwgMCk7CisJLyogZG1hIGJ1ZmZlciBzdGlsbCBvd25lZCBieSB0aGUgQ1BVICovCisKKwlyZXR1cm4gKHJldCkgPyAtcmV0IDogbGVuOworfQorCitzdGF0aWMgaW50IHZsc2lfc2V0X2JhdWQodmxzaV9pcmRhX2Rldl90ICppZGV2LCB1bnNpZ25lZCBpb2Jhc2UpCit7CisJdTE2IG5waHljdGw7CisJdTE2IGNvbmZpZzsKKwl1bnNpZ25lZCBtb2RlOworCWludAlyZXQ7CisJaW50CWJhdWRyYXRlOworCWludAlmaWZvY250OworCisJYmF1ZHJhdGUgPSBpZGV2LT5uZXdfYmF1ZDsKKwlJUkRBX0RFQlVHKDIsICIlczogJWQgLT4gJWRcbiIsIF9fRlVOQ1RJT05fXywgaWRldi0+YmF1ZCwgaWRldi0+bmV3X2JhdWQpOworCWlmIChiYXVkcmF0ZSA9PSA0MDAwMDAwKSB7CisJCW1vZGUgPSBJRkZfRklSOworCQljb25maWcgPSBJUkNGR19GSVI7CisJCW5waHljdGwgPSBQSFlDVExfRklSOworCX0KKwllbHNlIGlmIChiYXVkcmF0ZSA9PSAxMTUyMDAwKSB7CisJCW1vZGUgPSBJRkZfTUlSOworCQljb25maWcgPSBJUkNGR19NSVIgfCBJUkNGR19DUkMxNjsKKwkJbnBoeWN0bCA9IFBIWUNUTF9NSVIoY2xrc3JjPT0zKTsKKwl9CisJZWxzZSB7CisJCW1vZGUgPSBJRkZfU0lSOworCQljb25maWcgPSBJUkNGR19TSVIgfCBJUkNGR19TSVJGSUxUICB8IElSQ0ZHX1JYQU5ZOworCQlzd2l0Y2goYmF1ZHJhdGUpIHsKKwkJCWRlZmF1bHQ6CisJCQkJSVJEQV9XQVJOSU5HKCIlczogdW5kZWZpbmVkIGJhdWRyYXRlICVkIC0gZmFsbGJhY2sgdG8gOTYwMCFcbiIsCisJCQkJCSAgICAgX19GVU5DVElPTl9fLCBiYXVkcmF0ZSk7CisJCQkJYmF1ZHJhdGUgPSA5NjAwOworCQkJCS8qIGZhbGx0aHJ1ICovCisJCQljYXNlIDI0MDA6CisJCQljYXNlIDk2MDA6CisJCQljYXNlIDE5MjAwOgorCQkJY2FzZSAzODQwMDoKKwkJCWNhc2UgNTc2MDA6CisJCQljYXNlIDExNTIwMDoKKwkJCQlucGh5Y3RsID0gUEhZQ1RMX1NJUihiYXVkcmF0ZSxzaXJwdWxzZSxjbGtzcmM9PTMpOworCQkJCWJyZWFrOworCQl9CisJfQorCWNvbmZpZyB8PSBJUkNGR19NU1RSIHwgSVJDRkdfRU5SWDsKKworCWZpZm9jbnQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX1JDVkJDTlQpICYgUkNWQkNOVF9NQVNLOworCWlmIChmaWZvY250ICE9IDApIHsKKwkJSVJEQV9ERUJVRygwLCAiJXM6IHJ4IGZpZm8gbm90IGVtcHR5KCVkKVxuIiwgX19GVU5DVElPTl9fLCBmaWZvY250KTsKKwl9CisKKwlvdXR3KDAsIGlvYmFzZStWTFNJX1BJT19JUkVOQUJMRSk7CisJb3V0dyhjb25maWcsIGlvYmFzZStWTFNJX1BJT19JUkNGRyk7CisJb3V0dyhucGh5Y3RsLCBpb2Jhc2UrVkxTSV9QSU9fTlBIWUNUTCk7CisJd21iKCk7CisJb3V0dyhJUkVOQUJMRV9QSFlBTkRDTE9DSywgaW9iYXNlK1ZMU0lfUElPX0lSRU5BQkxFKTsKKwltYigpOworCisJdWRlbGF5KDEpOwkvKiBjaGlwIGFwcGxpZXMgSVJDRkcgb24gbmV4dCByaXNpbmcgZWRnZSBvZiBpdHMgOE1IeiBjbG9jayAqLworCisJLyogcmVhZCBiYWNrIHNldHRpbmdzIGZvciB2YWxpZGF0aW9uICovCisKKwljb25maWcgPSBpbncoaW9iYXNlK1ZMU0lfUElPX0lSRU5BQkxFKSAmIElSRU5BQkxFX01BU0s7CisKKwlpZiAobW9kZSA9PSBJRkZfRklSKQorCQljb25maWcgXj0gSVJFTkFCTEVfRklSX09OOworCWVsc2UgaWYgKG1vZGUgPT0gSUZGX01JUikKKwkJY29uZmlnIF49IChJUkVOQUJMRV9NSVJfT058SVJFTkFCTEVfQ1JDMTZfT04pOworCWVsc2UKKwkJY29uZmlnIF49IElSRU5BQkxFX1NJUl9PTjsKKworCWlmIChjb25maWcgIT0gKElSRU5BQkxFX1BIWUFORENMT0NLfElSRU5BQkxFX0VOUlhTVCkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogZmFpbGVkIHRvIHNldCAlcyBtb2RlIVxuIiwgX19GVU5DVElPTl9fLAorCQkJKG1vZGU9PUlGRl9TSVIpPyJTSVIiOigobW9kZT09SUZGX01JUik/Ik1JUiI6IkZJUiIpKTsKKwkJcmV0ID0gLTE7CisJfQorCWVsc2UgeworCQlpZiAoaW53KGlvYmFzZStWTFNJX1BJT19QSFlDVEwpICE9IG5waHljdGwpIHsKKwkJCUlSREFfV0FSTklORygiJXM6IGZhaWxlZCB0byBhcHBseSBiYXVkcmF0ZSAlZFxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXywgYmF1ZHJhdGUpOworCQkJcmV0ID0gLTE7CisJCX0KKwkJZWxzZSB7CisJCQlpZGV2LT5tb2RlID0gbW9kZTsKKwkJCWlkZXYtPmJhdWQgPSBiYXVkcmF0ZTsKKwkJCWlkZXYtPm5ld19iYXVkID0gMDsKKwkJCXJldCA9IDA7CisJCX0KKwl9CisKKwlpZiAocmV0KQorCQl2bHNpX3JlZ19kZWJ1Zyhpb2Jhc2UsX19GVU5DVElPTl9fKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwlzdHJ1Y3QgdmxzaV9yaW5nCSpyID0gaWRldi0+dHhfcmluZzsKKwlzdHJ1Y3QgcmluZ19kZXNjciAqcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpb2Jhc2UgPSBuZGV2LT5iYXNlX2FkZHI7CisJdTggc3RhdHVzOworCXUxNiBjb25maWc7CisJaW50IG10dDsKKwlpbnQgbGVuLCBzcGVlZDsKKwlzdHJ1Y3QgdGltZXZhbCAgbm93LCByZWFkeTsKKwljaGFyICptc2cgPSBOVUxMOworCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc3BlZWQgIT0gLTEgICYmICBzcGVlZCAhPSBpZGV2LT5iYXVkKSB7CisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCWlkZXYtPm5ld19iYXVkID0gc3BlZWQ7CisJCXN0YXR1cyA9IFJEX1RYX0NMUkVOVFg7ICAvKiBzdG9wIHR4LXJpbmcgYWZ0ZXIgdGhpcyBmcmFtZSAqLworCX0KKwllbHNlCisJCXN0YXR1cyA9IDA7CisKKwlpZiAoc2tiLT5sZW4gPT0gMCkgeworCQkvKiBoYW5kbGUgemVybyBwYWNrZXRzIC0gc2hvdWxkIGJlIHNwZWVkIGNoYW5nZSAqLworCQlpZiAoc3RhdHVzID09IDApIHsKKwkJCW1zZyA9ICJib2d1cyB6ZXJvLWxlbmd0aCBwYWNrZXQiOworCQkJZ290byBkcm9wX3VubG9jazsKKwkJfQorCisJCS8qIGR1ZSB0byB0aGUgY29tcGxldGVseSBhc3luY2ggdHggb3BlcmF0aW9uIHdlIG1pZ2h0IGhhdmUKKwkJICogSXJMQVAgcmFjaW5nIHdpdGggdGhlIGhhcmR3YXJlIGhlcmUsIGYuZS4gaWYgdGhlIGNvbnRyb2xsZXIKKwkJICogaXMganVzdCBzZW5kaW5nIHRoZSBsYXN0IHBhY2tldCB3aXRoIGN1cnJlbnQgc3BlZWQgd2hpbGUKKwkJICogdGhlIExBUCBpcyBhbHJlYWR5IHN3aXRjaGluZyB0aGUgc3BlZWQgdXNpbmcgc3luY2hyb25vdXMKKwkJICogbGVuPTAgcGFja2V0LiBJbW1lZGlhdGUgZXhlY3V0aW9uIHdvdWxkIGxlYWQgdG8gaHcgbG9ja3VwCisJCSAqIHJlcXVpcmluZyBhIHBvd2VyY3ljbGUgdG8gcmVzZXQuIEdvb2QgY2FuZGlkYXRlIHRvIHRyaWdnZXIKKwkJICogdGhpcyBpcyB0aGUgZmluYWwgVUE6UlNQIHBhY2tldCBhZnRlciByZWNlaXZpbmcgYSBESVNDOkNNRAorCQkgKiB3aGVuIGdldHRpbmcgdGhlIExBUCBkb3duLgorCQkgKiBOb3RlIHRoYXQgd2UgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgdGhlIHF1ZXVlX3N0b3AgYXBwcm9hY2gKKwkJICogYmVjYXVzZSB0aGUgZmluYWwgVUE6UlNQIGFycml2ZXMgX3dpdGhvdXRfIHJlcXVlc3QgdG8gYXBwbHkKKwkJICogbmV3LXNwZWVkLWFmdGVyLXRoaXMtcGFja2V0IC0gaGVuY2UgdGhlIGRyaXZlciBkb2Vzbid0IGtub3cKKwkJICogdGhpcyB3YXMgdGhlIGxhc3QgcGFja2V0IGFuZCBkb2Vzbid0IHN0b3AgdGhlIHF1ZXVlLiBTbyB0aGUKKwkJICogZm9yY2VkIHN3aXRjaCB0byBkZWZhdWx0IHNwZWVkIGZyb20gTEFQIGdldHMgdGhyb3VnaCBhcyBmYXN0CisJCSAqIGFzIG9ubHkgc29tZSAxMCB1c2VjIGxhdGVyIHdoaWxlIHRoZSBVQTpSU1AgaXMgc3RpbGwgcHJvY2Vzc2VkCisJCSAqIGJ5IHRoZSBoYXJkd2FyZSBhbmQgd2Ugd291bGQgZ2V0IHNjcmV3ZWQuCisJCSAqLworCisJCWlmIChyaW5nX2ZpcnN0KGlkZXYtPnR4X3JpbmcpID09IE5VTEwpIHsKKwkJCS8qIG5vIHJhY2UgLSB0eC1yaW5nIGFscmVhZHkgZW1wdHkgKi8KKwkJCXZsc2lfc2V0X2JhdWQoaWRldiwgaW9iYXNlKTsKKwkJCW5ldGlmX3dha2VfcXVldWUobmRldik7CisJCX0KKwkJZWxzZQorCQkJOworCQkJLyoga2VlcCB0aGUgc3BlZWQgY2hhbmdlIHBlbmRpbmcgbGlrZSBpdCB3b3VsZAorCQkJICogZm9yIGFueSBsZW4+MCBwYWNrZXQuIHR4IGNvbXBsZXRpb24gaW50ZXJydXB0CisJCQkgKiB3aWxsIGFwcGx5IGl0IHdoZW4gdGhlIHR4IHJpbmcgYmVjb21lcyBlbXB0eS4KKwkJCSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGV2LT5sb2NrLCBmbGFncyk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAwOworCX0KKworCS8qIHNhbml0eSBjaGVja3MgLSBzaW1wbHkgZHJvcCB0aGUgcGFja2V0ICovCisKKwlyZCA9IHJpbmdfbGFzdChyKTsKKwlpZiAoIXJkKSB7CisJCW1zZyA9ICJyaW5nIGZ1bGwsIGJ1dCBxdWV1ZSB3YXNuJ3Qgc3RvcHBlZCI7CisJCWdvdG8gZHJvcF91bmxvY2s7CisJfQorCisJaWYgKHJkX2lzX2FjdGl2ZShyZCkpIHsKKwkJbXNnID0gImVudHJ5IHN0aWxsIG93bmVkIGJ5IGh3IjsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CisKKwlpZiAoIXJkLT5idWYpIHsKKwkJbXNnID0gInR4IHJpbmcgZW50cnkgd2l0aG91dCBwY2kgYnVmZmVyIjsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CisKKwlpZiAocmQtPnNrYikgeworCQltc2cgPSAicmluZyBlbnRyeSB3aXRoIG9sZCBza2Igc3RpbGwgYXR0YWNoZWQiOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCS8qIG5vIG5lZWQgZm9yIHNlcmlhbGl6YXRpb24gb3IgaW50ZXJydXB0IGRpc2FibGUgZHVyaW5nIG10dCAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZXYtPmxvY2ssIGZsYWdzKTsKKworCWlmICgobXR0ID0gaXJkYV9nZXRfbXR0KHNrYikpID4gMCkgeworCQorCQlyZWFkeS50dl91c2VjID0gaWRldi0+bGFzdF9yeC50dl91c2VjICsgbXR0OworCQlyZWFkeS50dl9zZWMgPSBpZGV2LT5sYXN0X3J4LnR2X3NlYzsKKwkJaWYgKHJlYWR5LnR2X3VzZWMgPj0gMTAwMDAwMCkgeworCQkJcmVhZHkudHZfdXNlYyAtPSAxMDAwMDAwOworCQkJcmVhZHkudHZfc2VjKys7CQkvKiBJckxBUCAxLjE6IG10dCBhbHdheXMgPCAxIHNlYyAqLworCQl9CisJCWZvcig7OykgeworCQkJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCQkJaWYgKG5vdy50dl9zZWMgPiByZWFkeS50dl9zZWMKKwkJCSAgICB8fCAgKG5vdy50dl9zZWM9PXJlYWR5LnR2X3NlYyAmJiBub3cudHZfdXNlYz49cmVhZHkudHZfdXNlYykpCisJCQkgICAgCWJyZWFrOworCQkJdWRlbGF5KDEwMCk7CisJCQkvKiBtdXN0IG5vdCBzbGVlcCBoZXJlIC0gd2UgYXJlIGNhbGxlZCB1bmRlciB4bWl0X2xvY2shICovCisJCX0KKwl9CisKKwkvKiB0eCBidWZmZXIgYWxyZWFkeSBvd25lZCBieSBDUFUgZHVlIHRvIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSgpCisJICogYWZ0ZXIgc3Vic2VxdWVudCB0eC1jb21wbGV0aW9uCisJICovCisKKwlpZiAoaWRldi0+bW9kZSA9PSBJRkZfU0lSKSB7CisJCXN0YXR1cyB8PSBSRF9UWF9ESVNDUkM7CQkvKiBubyBody1jcmMgY3JlYXRpb24gKi8KKwkJbGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCByZC0+YnVmLCByLT5sZW4pOworCisJCS8qIFNvbWUgcmFyZSB3b3JzdCBjYXNlIHNpdHVhdGlvbiBpbiBTSVIgbW9kZSBtaWdodCBsZWFkIHRvCisJCSAqIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cuIFRoZSB3cmFwcGVyIGRldGVjdHMgdGhpcywgcmV0dXJucworCQkgKiB3aXRoIGEgc2hvcnRlbmVkIGZyYW1lICh3aXRob3V0IEZDUy9FT0YpIGJ1dCBkb2Vzbid0IHByb3ZpZGUKKwkJICogYW55IGVycm9yIGluZGljYXRpb24gYWJvdXQgdGhlIGludmFsaWQgcGFja2V0IHdoaWNoIHdlIGFyZQorCQkgKiBnb2luZyB0byB0cmFuc21pdC4KKwkJICogVGhlcmVmb3JlIHdlIGxvZyBpZiB0aGUgYnVmZmVyIGdvdCBmaWxsZWQgdG8gdGhlIHBvaW50LCB3aGVyZSB0aGUKKwkJICogd3JhcHBlciB3b3VsZCBhYm9ydCwgaS5lLiB3aGVuIHRoZXJlIGFyZSBsZXNzIHRoYW4gNSBieXRlcyBsZWZ0IHRvCisJCSAqIGFsbG93IGFwcGVuZGluZyB0aGUgRkNTL0VPRi4KKwkJICovCisKKwkJaWYgKGxlbiA+PSByLT5sZW4tNSkKKwkJCSBJUkRBX1dBUk5JTkcoIiVzOiBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgd2l0aCBTSVIgd3JhcHBpbmchXG4iLAorCQkJCSAgICAgIF9fRlVOQ1RJT05fXyk7CisJfQorCWVsc2UgeworCQkvKiBodyBkZWFscyB3aXRoIE1JUi9GSVIgbW9kZSB3cmFwcGluZyAqLworCQlzdGF0dXMgfD0gUkRfVFhfUFVMU0U7CQkvKiBzZW5kIDIgdXMgaGlnaHNwZWVkIGluZGljYXRpb24gcHVsc2UgKi8KKwkJbGVuID0gc2tiLT5sZW47CisJCWlmIChsZW4gPiByLT5sZW4pIHsKKwkJCW1zZyA9ICJmcmFtZSBleGNlZWRzIHR4IGJ1ZmZlciBsZW5ndGgiOworCQkJZ290byBkcm9wOworCQl9CisJCWVsc2UKKwkJCW1lbWNweShyZC0+YnVmLCBza2ItPmRhdGEsIGxlbik7CisJfQorCisJcmQtPnNrYiA9IHNrYjsJCQkvKiByZW1lbWJlciBza2IgZm9yIHR4LWNvbXBsZXRlIHN0YXRzICovCisKKwlyZF9zZXRfY291bnQocmQsIGxlbik7CisJcmRfc2V0X3N0YXR1cyhyZCwgc3RhdHVzKTsJLyogbm90IHlldCBhY3RpdmUhICovCisKKwkvKiBnaXZlIGRtYSBidWZmZXIgYmFjayB0byBidXNtYXN0ZXItaHcgKGZsdXNoIGNhY2hlcyB0byBtYWtlCisJICogQ1BVLWRyaXZlbiBjaGFuZ2VzIHZpc2libGUgZnJvbSB0aGUgcGNpIGJ1cykuCisJICovCisKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoci0+cGRldiwgcmRfZ2V0X2FkZHIocmQpLCByLT5sZW4sIHItPmRpcik7CisKKy8qCVN3aXRjaGluZyB0byBUWCBtb2RlIGhlcmUgcmFjZXMgd2l0aCB0aGUgY29udHJvbGxlcgorICoJd2hpY2ggbWF5IHN0b3AgVFggYXQgYW55IHRpbWUgd2hlbiBmZXRjaGluZyBhbiBpbmFjdGl2ZSBkZXNjcmlwdG9yCisgKglvciBvbmUgd2l0aCBDTFJfRU5UWCBzZXQuIFNvIHdlIHN3aXRjaCBvbiBUWCBvbmx5LCBpZiBUWCB3YXMgbm90IHJ1bm5pbmcKKyAqCV9hZnRlcl8gdGhlIG5ldyBkZXNjcmlwdG9yIHdhcyBhY3RpdmF0ZWQgb24gdGhlIHJpbmcuIFRoaXMgZW5zdXJlcworICoJd2Ugd2lsbCBlaXRoZXIgZmluZCBUWCBhbHJlYWR5IHN0b3BwZWQgb3Igd2UgY2FuIGJlIHN1cmUsIHRoZXJlCisgKgl3aWxsIGJlIGEgVFgtY29tcGxldGUgaW50ZXJydXB0IGV2ZW4gaWYgdGhlIGNoaXAgc3RvcHBlZCBkb2luZworICoJVFgganVzdCBhZnRlciB3ZSBmb3VuZCBpdCBzdGlsbCBydW5uaW5nLiBUaGUgSVNSIHdpbGwgdGhlbiBmaW5kCisgKgl0aGUgbm9uLWVtcHR5IHJpbmcgYW5kIHJlc3RhcnQgVFggcHJvY2Vzc2luZy4gVGhlIGVuY2xvc2luZworICoJc3BpbmxvY2sgcHJvdmlkZXMgdGhlIGNvcnJlY3Qgc2VyaWFsaXphdGlvbiB0byBwcmV2ZW50IHJhY2Ugd2l0aCBpc3IuCisgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGV2LT5sb2NrLGZsYWdzKTsKKworCXJkX2FjdGl2YXRlKHJkKTsKKworCWlmICghKGludyhpb2Jhc2UrVkxTSV9QSU9fSVJFTkFCTEUpICYgSVJFTkFCTEVfRU5UWFNUKSkgeworCQlpbnQgZmlmb2NudDsKKworCQlmaWZvY250ID0gaW53KG5kZXYtPmJhc2VfYWRkcitWTFNJX1BJT19SQ1ZCQ05UKSAmIFJDVkJDTlRfTUFTSzsKKwkJaWYgKGZpZm9jbnQgIT0gMCkgeworCQkJSVJEQV9ERUJVRygwLCAiJXM6IHJ4IGZpZm8gbm90IGVtcHR5KCVkKVxuIiwgX19GVU5DVElPTl9fLCBmaWZvY250KTsKKwkJfQorCisJCWNvbmZpZyA9IGludyhpb2Jhc2UrVkxTSV9QSU9fSVJDRkcpOworCQltYigpOworCQlvdXR3KGNvbmZpZyB8IElSQ0ZHX0VOVFgsIGlvYmFzZStWTFNJX1BJT19JUkNGRyk7CisJCXdtYigpOworCQlvdXR3KDAsIGlvYmFzZStWTFNJX1BJT19QUk9NUFQpOworCX0KKwluZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlpZiAocmluZ19wdXQocikgPT0gTlVMTCkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCQlJUkRBX0RFQlVHKDMsICIlczogdHggcmluZyBmdWxsIC0gcXVldWUgc3RvcHBlZFxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRldi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7CisKK2Ryb3BfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZXYtPmxvY2ssIGZsYWdzKTsKK2Ryb3A6CisJSVJEQV9XQVJOSU5HKCIlczogZHJvcHBpbmcgcGFja2V0IC0gJXNcbiIsIF9fRlVOQ1RJT05fXywgbXNnKTsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCWlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkvKiBEb24ndCBldmVuIHRoaW5rIGFib3V0IHJldHVybmluZyBORVRfWE1JVF9EUk9QICg9MSkgaGVyZSEKKwkgKiBJbiBmYWN0IGFueSByZXR2YWwhPTAgY2F1c2VzIHRoZSBwYWNrZXQgc2NoZWR1bGVyIHRvIHJlcXVldWUgdGhlCisJICogcGFja2V0IGZvciBsYXRlciByZXRyeSBvZiB0cmFuc21pc3Npb24gLSB3aGljaCBpc24ndCBleGFjdGx5CisJICogd2hhdCB3ZSB3YW50IGFmdGVyIHdlJ3ZlIGp1c3QgY2FsbGVkIGRldl9rZnJlZV9za2JfYW55IDstKQorCSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bHNpX3R4X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXN0cnVjdCB2bHNpX3JpbmcJKnIgPSBpZGV2LT50eF9yaW5nOworCXN0cnVjdCByaW5nX2Rlc2NyCSpyZDsKKwl1bnNpZ25lZAlpb2Jhc2U7CisJaW50CXJldDsKKwl1MTYJY29uZmlnOworCisJZm9yIChyZCA9IHJpbmdfZmlyc3Qocik7IHJkICE9IE5VTEw7IHJkID0gcmluZ19nZXQocikpIHsKKworCQlpZiAocmRfaXNfYWN0aXZlKHJkKSkKKwkJCWJyZWFrOworCisJCXJldCA9IHZsc2lfcHJvY2Vzc190eChyLCByZCk7CisKKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldCA9IC1yZXQ7CisJCQlpZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChyZXQgJiBWTFNJX1RYX0RST1ApCisJCQkJaWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJaWYgKHJldCAmIFZMU0lfVFhfRklGTykKKwkJCQlpZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQl9CisJCWVsc2UgaWYgKHJldCA+IDApeworCQkJaWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJaWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gcmV0OworCQl9CisJfQorCisJaW9iYXNlID0gbmRldi0+YmFzZV9hZGRyOworCisJaWYgKGlkZXYtPm5ld19iYXVkICAmJiAgcmQgPT0gTlVMTCkJLyogdHggcmluZyBlbXB0eSBhbmQgc3BlZWQgY2hhbmdlIHBlbmRpbmcgKi8KKwkJdmxzaV9zZXRfYmF1ZChpZGV2LCBpb2Jhc2UpOworCisJY29uZmlnID0gaW53KGlvYmFzZStWTFNJX1BJT19JUkNGRyk7CisJaWYgKHJkID09IE5VTEwpCQkJLyogdHggcmluZyBlbXB0eTogcmUtZW5hYmxlIHJ4ICovCisJCW91dHcoKGNvbmZpZyAmIH5JUkNGR19FTlRYKSB8IElSQ0ZHX0VOUlgsIGlvYmFzZStWTFNJX1BJT19JUkNGRyk7CisKKwllbHNlIGlmICghKGludyhpb2Jhc2UrVkxTSV9QSU9fSVJFTkFCTEUpICYgSVJFTkFCTEVfRU5UWFNUKSkgeworCQlpbnQgZmlmb2NudDsKKworCQlmaWZvY250ID0gaW53KGlvYmFzZStWTFNJX1BJT19SQ1ZCQ05UKSAmIFJDVkJDTlRfTUFTSzsKKwkJaWYgKGZpZm9jbnQgIT0gMCkgeworCQkJSVJEQV9ERUJVRygwLCAiJXM6IHJ4IGZpZm8gbm90IGVtcHR5KCVkKVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGZpZm9jbnQpOworCQl9CisJCW91dHcoY29uZmlnIHwgSVJDRkdfRU5UWCwgaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKwl9CisKKwlvdXR3KDAsIGlvYmFzZStWTFNJX1BJT19QUk9NUFQpOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQobmRldikgICYmICAhaWRldi0+bmV3X2JhdWQpIHsKKwkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKwkJSVJEQV9ERUJVRygzLCAiJXM6IHF1ZXVlIGF3b2tlblxuIiwgX19GVU5DVElPTl9fKTsKKwl9Cit9CisKKy8qIGNhbGxlciBtdXN0IGhhdmUgc3RvcHBlZCB0aGUgY29udHJvbGxlciBmcm9tIGJ1c21hc3RlcmluZyAqLworCitzdGF0aWMgdm9pZCB2bHNpX3VuYXJtX3R4KHZsc2lfaXJkYV9kZXZfdCAqaWRldikKK3sKKwlzdHJ1Y3QgdmxzaV9yaW5nICpyID0gaWRldi0+dHhfcmluZzsKKwlzdHJ1Y3QgcmluZ19kZXNjciAqcmQ7CisJaW50IHJldDsKKworCWZvciAocmQgPSByaW5nX2ZpcnN0KHIpOyByZCAhPSBOVUxMOyByZCA9IHJpbmdfZ2V0KHIpKSB7CisKKwkJcmV0ID0gMDsKKwkJaWYgKHJkX2lzX2FjdGl2ZShyZCkpIHsKKwkJCXJkX3NldF9zdGF0dXMocmQsIDApOworCQkJcmRfc2V0X2NvdW50KHJkLCAwKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShyLT5wZGV2LCByZF9nZXRfYWRkcihyZCksIHItPmxlbiwgci0+ZGlyKTsKKwkJCWlmIChyZC0+c2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkocmQtPnNrYik7CisJCQkJcmQtPnNrYiA9IE5VTEw7CisJCQl9CisJCQlJUkRBX0RFQlVHKDAsICIlcyAtIGRyb3BwaW5nIHR4IHBhY2tldFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldCA9IC1WTFNJX1RYX0RST1A7CisJCX0KKwkJZWxzZQorCQkJcmV0ID0gdmxzaV9wcm9jZXNzX3R4KHIsIHJkKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gLXJldDsKKwkJCWlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfVFhfRFJPUCkKKwkJCQlpZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQlpZiAocmV0ICYgVkxTSV9UWF9GSUZPKQorCQkJCWlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCX0KKwkJZWxzZSBpZiAocmV0ID4gMCl7CisJCQlpZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZGV2LT5zdGF0cy50eF9ieXRlcyArPSByZXQ7CisJCX0KKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHZsc2lfc3RhcnRfY2xvY2soc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTgJY2xrY3RsLCBsb2NrOworCWludAlpLCBjb3VudDsKKworCWlmIChjbGtzcmMgPCAyKSB7IC8qIGF1dG8gb3IgUExMOiB0cnkgUExMICovCisJCWNsa2N0bCA9IENMS0NUTF9QRF9JTlYgfCBDTEtDVExfQ0xLU1RQOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfQ0xLQ1RMLCBjbGtjdGwpOworCisJCS8qIHByb2NlZHVyZSB0byBkZXRlY3QgUExMIGxvY2sgc3luY2hyb25pc2F0aW9uOgorCQkgKiBhZnRlciAwLjUgbXNlYyBpbml0aWFsIGRlbGF5IHdlIGV4cGVjdCB0byBmaW5kIDMgUExMIGxvY2sKKwkJICogaW5kaWNhdGlvbnMgd2l0aGluIDEwIG1zZWMgZm9yIHN1Y2Nlc3NmdWwgUExMIGRldGVjdGlvbi4KKwkJICovCisJCXVkZWxheSg1MDApOworCQljb3VudCA9IDA7CisJCWZvciAoaSA9IDUwMDsgaSA8PSAxMDAwMDsgaSArPSA1MCkgeyAvKiBtYXggMTAgbXNlYyAqLworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfQ0xLQ1RMLCAmbG9jayk7CisJCQlpZiAobG9jayZDTEtDVExfTE9DSykgeworCQkJCWlmICgrK2NvdW50ID49IDMpCisJCQkJCWJyZWFrOworCQkJfQorCQkJdWRlbGF5KDUwKTsKKwkJfQorCQlpZiAoY291bnQgPCAzKSB7CisJCQlpZiAoY2xrc3JjID09IDEpIHsgLyogZXhwbGljaXRseSBhc2tlZCBmb3IgUExMIGhlbmNlIGJhaWwgb3V0ICovCisJCQkJSVJEQV9FUlJPUigiJXM6IG5vIFBMTCBvciBmYWlsZWQgdG8gbG9jayFcbiIsCisJCQkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCQkJY2xrY3RsID0gQ0xLQ1RMX0NMS1NUUDsKKwkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfQ0xLQ1RMLCBjbGtjdGwpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWVsc2UJCQkvKiB3YXM6IGNsa3NyYz0wKGF1dG8pICovCisJCQkJY2xrc3JjID0gMzsJLyogZmFsbGJhY2sgdG8gNDBNSHogWENMSyAoT0I4MDApICovCisKKwkJCUlSREFfREVCVUcoMCwgIiVzOiBQTEwgbm90IGxvY2tlZCwgZmFsbGJhY2sgdG8gY2xrc3JjPSVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgY2xrc3JjKTsKKwkJfQorCQllbHNlCisJCQljbGtzcmMgPSAxOwkvKiBnb3Qgc3VjY2Vzc2Z1bCBQTEwgbG9jayAqLworCX0KKworCWlmIChjbGtzcmMgIT0gMSkgeworCQkvKiB3ZSBnZXQgaGVyZSBpZiBlaXRoZXIgbm8gUExMIGRldGVjdGVkIGluIGF1dG8tbW9kZSBvcgorCQkgICBhbiBleHRlcm5hbCBjbG9jayBzb3VyY2Ugd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkICovCisKKwkJY2xrY3RsID0gQ0xLQ1RMX0VYVENMSyB8IENMS0NUTF9DTEtTVFA7CisJCWlmIChjbGtzcmMgPT0gMykKKwkJCWNsa2N0bCB8PSBDTEtDVExfWENLU0VMOwkKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFZMU0lfUENJX0NMS0NUTCwgY2xrY3RsKTsKKworCQkvKiBubyB3YXkgdG8gdGVzdCBmb3Igd29ya2luZyBYQ0xLICovCisJfQorCWVsc2UKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfQ0xLQ1RMLCAmY2xrY3RsKTsKKworCS8qIG9rLCBub3cgZ29pbmcgdG8gY29ubmVjdCB0aGUgY2hpcCB3aXRoIHRoZSBjbG9jayBzb3VyY2UgKi8KKworCWNsa2N0bCAmPSB+Q0xLQ1RMX0NMS1NUUDsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfQ0xLQ1RMLCBjbGtjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZsc2lfc3RvcF9jbG9jayhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1OAljbGtjdGw7CisKKwkvKiBkaXNjb25uZWN0IGNoaXAgZnJvbSBjbG9jayBzb3VyY2UgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsICZjbGtjdGwpOworCWNsa2N0bCB8PSBDTEtDVExfQ0xLU1RQOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsIGNsa2N0bCk7CisKKwkvKiBkaXNhYmxlIGFsbCBjbG9jayBzb3VyY2VzICovCisJY2xrY3RsICY9IH4oQ0xLQ1RMX0VYVENMSyB8IENMS0NUTF9QRF9JTlYpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsIGNsa2N0bCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogd3JpdGluZyBhbGwtemVybyB0byB0aGUgVkxTSSBQQ0kgSU8gcmVnaXN0ZXIgYXJlYSBzZWVtcyB0byBwcmV2ZW50CisgKiBzb21lIG9jY2FzaW9uYWwgc2l0dWF0aW9ucyB3aGVyZSB0aGUgaGFyZHdhcmUgZmFpbHMgKHN5bXB0b21zIGFyZSAKKyAqIHdoYXQgYXBwZWFycyBhcyBzdGFsbGVkIHR4L3J4IHN0YXRlIG1hY2hpbmVzLCBpLmUuIGV2ZXJ5dGhpbmcgb2sgZm9yCisgKiByZWNlaXZlIG9yIHRyYW5zbWl0IGJ1dCBodyBtYWtlcyBubyBwcm9ncmVzcyBvciBpcyB1bmFibGUgdG8gYWNjZXNzCisgKiB0aGUgYnVzIG1lbW9yeSBsb2NhdGlvbnMpLgorICogQmVzdCBwbGFjZSB0byBjYWxsIHRoaXMgaXMgaW1tZWRpYXRlbHkgYWZ0ZXIvYmVmb3JlIHRoZSBpbnRlcm5hbCBjbG9jaworICogZ2V0cyBzdGFydGVkL3N0b3BwZWQuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHZsc2lfY2xlYXJfcmVncyh1bnNpZ25lZCBpb2Jhc2UpCit7CisJdW5zaWduZWQJaTsKKwljb25zdCB1bnNpZ25lZAljaGlwX2lvX2V4dGVudCA9IDMyOworCisJZm9yIChpID0gMDsgaSA8IGNoaXBfaW9fZXh0ZW50OyBpICs9IHNpemVvZih1MTYpKQorCQlvdXR3KDAsIGlvYmFzZSArIGkpOworfQorCitzdGF0aWMgaW50IHZsc2lfaW5pdF9jaGlwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisJdW5zaWduZWQJaW9iYXNlOworCXUxNiBwdHI7CisKKwkvKiBzdGFydCB0aGUgY2xvY2sgYW5kIGNsZWFuIHRoZSByZWdpc3RlcnMgKi8KKworCWlmICh2bHNpX3N0YXJ0X2Nsb2NrKHBkZXYpKSB7CisJCUlSREFfRVJST1IoIiVzOiBubyB2YWxpZCBjbG9jayBzb3VyY2VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisJaW9iYXNlID0gbmRldi0+YmFzZV9hZGRyOworCXZsc2lfY2xlYXJfcmVncyhpb2Jhc2UpOworCisJb3V0YihJUklOVFJfSU5UX01BU0ssIGlvYmFzZStWTFNJX1BJT19JUklOVFIpOyAvKiB3L2MgcGVuZGluZyBJUlEsIGRpc2FibGUgYWxsIElOVCAqLworCisJb3V0dygwLCBpb2Jhc2UrVkxTSV9QSU9fSVJFTkFCTEUpOwkvKiBkaXNhYmxlIElyUEhZLWludGVyZmFjZSAqLworCisJLyogZGlzYWJsZSBldmVyeXRoaW5nLCBwYXJ0aWN1bGFybHkgSVJDRkdfTVNUUiAtIChhbHNvIHJlc2V0dGluZyB0aGUgUklOR19QVFIpICovCisKKwlvdXR3KDAsIGlvYmFzZStWTFNJX1BJT19JUkNGRyk7CisJd21iKCk7CisKKwlvdXR3KE1BWF9QQUNLRVRfTEVOR1RILCBpb2Jhc2UrVkxTSV9QSU9fTUFYUEtUKTsgIC8qIG1heCBwb3NzaWJsZSB2YWx1ZT0weDBmZmYgKi8KKworCW91dHcoQlVTX1RPX1JJTkdCQVNFKGlkZXYtPmJ1c2FkZHIpLCBpb2Jhc2UrVkxTSV9QSU9fUklOR0JBU0UpOworCisJb3V0dyhUWF9SWF9UT19SSU5HU0laRShpZGV2LT50eF9yaW5nLT5zaXplLCBpZGV2LT5yeF9yaW5nLT5zaXplKSwKKwkJaW9iYXNlK1ZMU0lfUElPX1JJTkdTSVpFKTsJCisKKwlwdHIgPSBpbncoaW9iYXNlK1ZMU0lfUElPX1JJTkdQVFIpOworCWF0b21pY19zZXQoJmlkZXYtPnJ4X3JpbmctPmhlYWQsIFJJTkdQVFJfR0VUX1JYKHB0cikpOworCWF0b21pY19zZXQoJmlkZXYtPnJ4X3JpbmctPnRhaWwsIFJJTkdQVFJfR0VUX1JYKHB0cikpOworCWF0b21pY19zZXQoJmlkZXYtPnR4X3JpbmctPmhlYWQsIFJJTkdQVFJfR0VUX1RYKHB0cikpOworCWF0b21pY19zZXQoJmlkZXYtPnR4X3JpbmctPnRhaWwsIFJJTkdQVFJfR0VUX1RYKHB0cikpOworCisJdmxzaV9zZXRfYmF1ZChpZGV2LCBpb2Jhc2UpOwkvKiBpZGV2LT5uZXdfYmF1ZCB1c2VkIGFzIHByb3ZpZGVkIGJ5IGNhbGxlciAqLworCisJb3V0YihJUklOVFJfSU5UX01BU0ssIGlvYmFzZStWTFNJX1BJT19JUklOVFIpOwkvKiBqdXN0IGluIGNhc2UgLSB3L2MgcGVuZGluZyBJUlEncyAqLworCXdtYigpOworCisJLyogRE8gTk9UIEJMSU5ETFkgRU5BQkxFIElSSU5UUl9BQ1RFTiEKKwkgKiBiYXNpY2FsbHkgZXZlcnkgcmVjZWl2ZWQgcHVsc2UgZmlyZXMgYW4gQUNUSVZJVFktSU5UCisJICogbGVhZGluZyB0byA+PjEwMDAgSU5UJ3MgcGVyIHNlY29uZCBpbnN0ZWFkIG9mIGZldyAxMAorCSAqLworCisJb3V0YihJUklOVFJfUlBLVEVOfElSSU5UUl9UUEtURU4sIGlvYmFzZStWTFNJX1BJT19JUklOVFIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9zdGFydF9odyh2bHNpX2lyZGFfZGV2X3QgKmlkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpZGV2LT5wZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGlvYmFzZSA9IG5kZXYtPmJhc2VfYWRkcjsKKwl1OCBieXRlOworCisJLyogd2UgZG9uJ3QgdXNlIHRoZSBsZWdhY3kgVUFSVCwgZGlzYWJsZSBpdHMgYWRkcmVzcyBkZWNvZGluZyAqLworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfSVJNSVNDLCAmYnl0ZSk7CisJYnl0ZSAmPSB+KElSTUlTQ19VQVJURU4gfCBJUk1JU0NfVUFSVFRTVCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFZMU0lfUENJX0lSTUlTQywgYnl0ZSk7CisKKwkvKiBlbmFibGUgUENJIGJ1c21hc3RlciBhY2Nlc3MgdG8gb3VyIDE2TUIgcGFnZSAqLworCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFZMU0lfUENJX01TVFJQQUdFLCBNU1RSUEFHRV9WQUxVRSk7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAodmxzaV9pbml0X2NoaXAocGRldikgPCAwKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXZsc2lfZmlsbF9yeChpZGV2LT5yeF9yaW5nKTsKKworCWRvX2dldHRpbWVvZmRheSgmaWRldi0+bGFzdF9yeCk7CS8qIGZpcnN0IG10dCBtYXkgc3RhcnQgZnJvbSBub3cgb24gKi8KKworCW91dHcoMCwgaW9iYXNlK1ZMU0lfUElPX1BST01QVCk7CS8qIGtpY2sgaHcgc3RhdGUgbWFjaGluZSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9zdG9wX2h3KHZsc2lfaXJkYV9kZXZfdCAqaWRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGlkZXYtPnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW9iYXNlID0gbmRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRldi0+bG9jayxmbGFncyk7CisJb3V0dygwLCBpb2Jhc2UrVkxTSV9QSU9fSVJFTkFCTEUpOworCW91dHcoMCwgaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsJCQkvKiBkaXNhYmxlIGV2ZXJ5dGhpbmcgKi8KKworCS8qIGRpc2FibGUgYW5kIHcvYyBpcnFzICovCisJb3V0YigwLCBpb2Jhc2UrVkxTSV9QSU9fSVJJTlRSKTsKKwl3bWIoKTsKKwlvdXRiKElSSU5UUl9JTlRfTUFTSywgaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRldi0+bG9jayxmbGFncyk7CisKKwl2bHNpX3VuYXJtX3R4KGlkZXYpOworCXZsc2lfdW5hcm1fcngoaWRldik7CisKKwl2bHNpX2NsZWFyX3JlZ3MoaW9iYXNlKTsKKwl2bHNpX3N0b3BfY2xvY2socGRldik7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB2bHNpX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCisJcmV0dXJuICZpZGV2LT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgdmxzaV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisKKworCXZsc2lfcmVnX2RlYnVnKG5kZXYtPmJhc2VfYWRkciwgX19GVU5DVElPTl9fKTsKKwl2bHNpX3JpbmdfZGVidWcoaWRldi0+dHhfcmluZyk7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKworCXZsc2lfc3RvcF9odyhpZGV2KTsKKworCS8qIG5vdyBzaW1wbHkgcmVzdGFydCB0aGUgd2hvbGUgdGhpbmcgKi8KKworCWlmICghaWRldi0+bmV3X2JhdWQpCisJCWlkZXYtPm5ld19iYXVkID0gaWRldi0+YmF1ZDsJCS8qIGtlZXAgY3VycmVudCBiYXVkcmF0ZSAqLworCisJaWYgKHZsc2lfc3RhcnRfaHcoaWRldikpCisJCUlSREFfRVJST1IoIiVzOiBmYWlsZWQgdG8gcmVzdGFydCBodyAtICVzKCVzKSB1bnVzYWJsZSFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIFBDSURFVl9OQU1FKGlkZXYtPnBkZXYpLCBuZGV2LT5uYW1lKTsKKwllbHNlCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworfQorCitzdGF0aWMgaW50IHZsc2lfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaWZfaXJkYV9yZXEgKmlycSA9IChzdHJ1Y3QgaWZfaXJkYV9yZXEgKikgcnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgZmlmb2NudDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0lPQ1NCQU5EV0lEVEg6CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCQlyZXQgPSAtRVBFUk07CisJCQkJYnJlYWs7CisJCQl9CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRldi0+bG9jaywgZmxhZ3MpOworCQkJaWRldi0+bmV3X2JhdWQgPSBpcnEtPmlmcl9iYXVkcmF0ZTsKKwkJCS8qIHdoZW4gY2FsbGVkIGZyb20gdXNlcmxhbmQgdGhlcmUgbWlnaHQgYmUgYSBtaW5vciByYWNlIHdpbmRvdyBoZXJlCisJCQkgKiBpZiB0aGUgc3RhY2sgdHJpZXMgdG8gY2hhbmdlIHNwZWVkIGNvbmN1cnJlbnRseSAtIHdoaWNoIHdvdWxkIGJlCisJCQkgKiBwcmV0dHkgc3RyYW5nZSBhbnl3YXkgd2l0aCB0aGUgdXNlcmxhbmQgaGF2aW5nIGZ1bGwgY29udHJvbC4uLgorCQkJICovCisJCQl2bHNpX3NldF9iYXVkKGlkZXYsIG5kZXYtPmJhc2VfYWRkcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGV2LT5sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DU01FRElBQlVTWToKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJCXJldCA9IC1FUEVSTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KG5kZXYsIFRSVUUpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0dSRUNFSVZJTkc6CisJCQkvKiB0aGUgYmVzdCB3ZSBjYW4gZG86IGNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBieXRlcyBpbiByeCBmaWZvLgorCQkJICogVGhlIHRydXN0YWJsZSB3aW5kb3cgKGluIGNhc2Ugc29tZSBkYXRhIGFycml2ZXMganVzdCBhZnRlcndhcmRzKQorCQkJICogbWF5IGJlIGFzIHNob3J0IGFzIDF1c2VjIG9yIHNvIGF0IDRNYnBzLgorCQkJICovCisJCQlmaWZvY250ID0gaW53KG5kZXYtPmJhc2VfYWRkcitWTFNJX1BJT19SQ1ZCQ05UKSAmIFJDVkJDTlRfTUFTSzsKKwkJCWlycS0+aWZyX3JlY2VpdmluZyA9IChmaWZvY250IT0wKSA/IDEgOiAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUkRBX1dBUk5JTkcoIiVzOiBub3RzdXBwIC0gY21kPSUwNHhcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18sIGNtZCk7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CQorCQorCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlycXJldHVybl90IHZsc2lfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfaW5zdGFuY2U7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwl1bnNpZ25lZAlpb2Jhc2U7CisJdTgJCWlyaW50cjsKKwlpbnQgCQlib2d1c2NvdW50ID0gNTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJaGFuZGxlZCA9IDA7CisKKwlpb2Jhc2UgPSBuZGV2LT5iYXNlX2FkZHI7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZXYtPmxvY2ssZmxhZ3MpOworCWRvIHsKKwkJaXJpbnRyID0gaW5iKGlvYmFzZStWTFNJX1BJT19JUklOVFIpOworCQltYigpOworCQlvdXRiKGlyaW50ciwgaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7CS8qIGFja25vd2xlZGdlIGFzYXAgKi8KKworCQlpZiAoIShpcmludHImPUlSSU5UUl9JTlRfTUFTSykpCQkvKiBub3Qgb3VyIElOVCAtIHByb2JhYmx5IHNoYXJlZCAqLworCQkJYnJlYWs7CisKKwkJaGFuZGxlZCA9IDE7CisKKwkJaWYgKHVubGlrZWx5KCEoaXJpbnRyICYgfklSSU5UUl9BQ1RJVklUWSkpKQorCQkJYnJlYWs7CQkJCS8qIG5vdGhpbmcgdG9kbyBpZiBvbmx5IGFjdGl2aXR5ICovCisKKwkJaWYgKGlyaW50ciZJUklOVFJfUlBLVElOVCkKKwkJCXZsc2lfcnhfaW50ZXJydXB0KG5kZXYpOworCisJCWlmIChpcmludHImSVJJTlRSX1RQS1RJTlQpCisJCQl2bHNpX3R4X2ludGVycnVwdChuZGV2KTsKKworCX0gd2hpbGUgKC0tYm9ndXNjb3VudCA+IDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZXYtPmxvY2ssZmxhZ3MpOworCisJaWYgKGJvZ3VzY291bnQgPD0gMCkKKwkJSVJEQV9NRVNTQUdFKCIlczogdG9vIG11Y2ggd29yayBpbiBpbnRlcnJ1cHQhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdmxzaV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisJaW50CWVyciA9IC1FQUdBSU47CisJY2hhcglod25hbWVbMzJdOworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMoaWRldi0+cGRldiwgZHJpdmVybmFtZSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogaW8gcmVzb3VyY2UgYnVzeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnJvdXQ7CisJfQorCW5kZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChpZGV2LT5wZGV2LDApOworCW5kZXYtPmlycSA9IGlkZXYtPnBkZXYtPmlycTsKKworCS8qIHVuZGVyIHNvbWUgcmFyZSBvY2Nhc2lvbnMgdGhlIGNoaXAgYXBwYXJlbnRseSBjb21lcyB1cCB3aXRoCisJICogSVJRJ3MgcGVuZGluZy4gV2UgYmV0dGVyIHcvYyBwZW5kaW5nIElSUSBhbmQgZGlzYWJsZSB0aGVtIGFsbAorCSAqLworCisJb3V0YihJUklOVFJfSU5UX01BU0ssIG5kZXYtPmJhc2VfYWRkcitWTFNJX1BJT19JUklOVFIpOworCisJaWYgKHJlcXVlc3RfaXJxKG5kZXYtPmlycSwgdmxzaV9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJZHJpdmVybmFtZSwgbmRldikpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogY291bGRuJ3QgZ2V0IElSUTogJWRcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgbmRldi0+aXJxKTsKKwkJZ290byBlcnJvdXRfaW87CisJfQorCisJaWYgKChlcnIgPSB2bHNpX2NyZWF0ZV9od2lmKGlkZXYpKSAhPSAwKQorCQlnb3RvIGVycm91dF9pcnE7CisKKwlzcHJpbnRmKGh3bmFtZSwgIlZMU0ktRklSIEAgMHglMDR4IiwgKHVuc2lnbmVkKW5kZXYtPmJhc2VfYWRkcik7CisJaWRldi0+aXJsYXAgPSBpcmxhcF9vcGVuKG5kZXYsJmlkZXYtPnFvcyxod25hbWUpOworCWlmICghaWRldi0+aXJsYXApCisJCWdvdG8gZXJyb3V0X2ZyZWVfcmluZzsKKworCWRvX2dldHRpbWVvZmRheSgmaWRldi0+bGFzdF9yeCk7ICAvKiBmaXJzdCBtdHQgbWF5IHN0YXJ0IGZyb20gbm93IG9uICovCisKKwlpZGV2LT5uZXdfYmF1ZCA9IDk2MDA7CQkvKiBzdGFydCB3aXRoIElyUEhZIHVzaW5nIDk2MDAoU0lSKSBtb2RlICovCisKKwlpZiAoKGVyciA9IHZsc2lfc3RhcnRfaHcoaWRldikpICE9IDApCisJCWdvdG8gZXJyb3V0X2Nsb3NlX2lybGFwOworCisJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CisKKwlJUkRBX01FU1NBR0UoIiVzOiBkZXZpY2UgJXMgb3BlcmF0aW9uYWxcbiIsIF9fRlVOQ1RJT05fXywgbmRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3V0X2Nsb3NlX2lybGFwOgorCWlybGFwX2Nsb3NlKGlkZXYtPmlybGFwKTsKK2Vycm91dF9mcmVlX3Jpbmc6CisJdmxzaV9kZXN0cm95X2h3aWYoaWRldik7CitlcnJvdXRfaXJxOgorCWZyZWVfaXJxKG5kZXYtPmlycSxuZGV2KTsKK2Vycm91dF9pbzoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGlkZXYtPnBkZXYpOworZXJyb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKworCWlmIChpZGV2LT5pcmxhcCkKKwkJaXJsYXBfY2xvc2UoaWRldi0+aXJsYXApOworCWlkZXYtPmlybGFwID0gTlVMTDsKKworCXZsc2lfc3RvcF9odyhpZGV2KTsKKworCXZsc2lfZGVzdHJveV9od2lmKGlkZXYpOworCisJZnJlZV9pcnEobmRldi0+aXJxLG5kZXYpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhpZGV2LT5wZGV2KTsKKworCUlSREFfTUVTU0FHRSgiJXM6IGRldmljZSAlcyBzdG9wcGVkXG4iLCBfX0ZVTkNUSU9OX18sIG5kZXYtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9pcmRhX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGlkZXYtPnBkZXY7CisKKwlTRVRfTU9EVUxFX09XTkVSKG5kZXYpOworCisJbmRldi0+aXJxID0gcGRldi0+aXJxOworCW5kZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDApOworCisJLyogUENJIGJ1c21hc3RlcmluZworCSAqIHNlZSBpbmNsdWRlIGZpbGUgZm9yIGRldGFpbHMgd2h5IHdlIG5lZWQgdGhlc2UgMiBtYXNrcywgaW4gdGhpcyBvcmRlciEKKwkgKi8KKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsRE1BX01BU0tfVVNFRF9CWV9IVykKKwkgICAgfHwgcGNpX3NldF9kbWFfbWFzayhwZGV2LERNQV9NQVNLX01TVFJQQUdFKSkgeworCQlJUkRBX0VSUk9SKCIlczogYWJvcnRpbmcgZHVlIHRvIFBDSSBCTS1ETUEgYWRkcmVzcyBsaW1pdGF0aW9uc1xuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJmlkZXYtPnFvcyk7CisKKwkvKiB0aGUgVkxTSTgyQzE0NyBkb2VzIG5vdCBzdXBwb3J0IDU3NjAwMCEgKi8KKworCWlkZXYtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzI0MDAgfCBJUl85NjAwCisJCXwgSVJfMTkyMDAgfCBJUl8zODQwMCB8IElSXzU3NjAwIHwgSVJfMTE1MjAwCisJCXwgSVJfMTE1MjAwMCB8IChJUl80MDAwMDAwIDw8IDgpOworCisJaWRldi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJmlkZXYtPnFvcyk7CisKKwkvKiBjdXJyZW50bHkgbm8gcHVibGljIG1lZGlhIGRlZmluaXRpb25zIGZvciBJckRBICovCisKKwluZGV2LT5mbGFncyB8PSBJRkZfUE9SVFNFTCB8IElGRl9BVVRPTUVESUE7CisJbmRldi0+aWZfcG9ydCA9IElGX1BPUlRfVU5LTk9XTjsKKyAKKwluZGV2LT5vcGVuCSAgICAgID0gdmxzaV9vcGVuOworCW5kZXYtPnN0b3AJICAgICAgPSB2bHNpX2Nsb3NlOworCW5kZXYtPmdldF9zdGF0cwkgICAgICA9IHZsc2lfZ2V0X3N0YXRzOworCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHZsc2lfaGFyZF9zdGFydF94bWl0OworCW5kZXYtPmRvX2lvY3RsCSAgICAgID0gdmxzaV9pb2N0bDsKKwluZGV2LT50eF90aW1lb3V0ICAgICAgPSB2bHNpX3R4X3RpbWVvdXQ7CisJbmRldi0+d2F0Y2hkb2dfdGltZW8gID0gNTAwKkhaLzEwMDA7CS8qIG1heC4gYWxsb3dlZCB0dXJuIHRpbWUgZm9yIElyTEFQICovCisKKwlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdAordmxzaV9pcmRhX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UJKm5kZXY7CisJdmxzaV9pcmRhX2Rldl90CQkqaWRldjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJZ290byBvdXQ7CisJZWxzZQorCQlwZGV2LT5jdXJyZW50X3N0YXRlID0gMDsgLyogaHcgbXVzdCBiZSBydW5uaW5nIG5vdyAqLworCisJSVJEQV9NRVNTQUdFKCIlczogSXJEQSBQQ0kgY29udHJvbGxlciAlcyBkZXRlY3RlZFxuIiwKKwkJICAgICBkcml2ZXJuYW1lLCBQQ0lERVZfTkFNRShwZGV2KSk7CisKKwlpZiAoICFwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwwKQorCSAgICAgfHwgIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwwKSAmIElPUkVTT1VSQ0VfSU8pICkgeworCQlJUkRBX0VSUk9SKCIlczogYmFyIDAgaW52YWxpZCIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2Rpc2FibGU7CisJfQorCisJbmRldiA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKCppZGV2KSk7CisJaWYgKG5kZXY9PU5VTEwpIHsKKwkJSVJEQV9FUlJPUigiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbWVtb3J5LlxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2Rpc2FibGU7CisJfQorCisJaWRldiA9IG5kZXYtPnByaXY7CisKKwlzcGluX2xvY2tfaW5pdCgmaWRldi0+bG9jayk7CisJaW5pdF9NVVRFWCgmaWRldi0+c2VtKTsKKwlkb3duKCZpZGV2LT5zZW0pOworCWlkZXYtPnBkZXYgPSBwZGV2OworCisJaWYgKHZsc2lfaXJkYV9pbml0KG5kZXYpIDwgMCkKKwkJZ290byBvdXRfZnJlZWRldjsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYobmRldikgPCAwKSB7CisJCUlSREFfRVJST1IoIiVzOiByZWdpc3Rlcl9uZXRkZXYgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9mcmVlZGV2OworCX0KKworCWlmICh2bHNpX3Byb2Nfcm9vdCAhPSBOVUxMKSB7CisJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworCisJCWVudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5kZXYtPm5hbWUsIFNfSUZSRUd8U19JUlVHTywgdmxzaV9wcm9jX3Jvb3QpOworCQlpZiAoIWVudCkgeworCQkJSVJEQV9XQVJOSU5HKCIlczogZmFpbGVkIHRvIGNyZWF0ZSBwcm9jIGVudHJ5XG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJfSBlbHNlIHsKKwkJCWVudC0+ZGF0YSA9IG5kZXY7CisJCQllbnQtPnByb2NfZm9wcyA9IFZMU0lfUFJPQ19GT1BTOworCQkJZW50LT5zaXplID0gMDsKKwkJfQorCQlpZGV2LT5wcm9jX2VudHJ5ID0gZW50OworCX0KKwlJUkRBX01FU1NBR0UoIiVzOiByZWdpc3RlcmVkIGRldmljZSAlc1xuIiwgZHJpdmVybmFtZSwgbmRldi0+bmFtZSk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbmRldik7CisJdXAoJmlkZXYtPnNlbSk7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVkZXY6CisJdXAoJmlkZXYtPnNlbSk7CisJZnJlZV9uZXRkZXYobmRldik7CitvdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitvdXQ6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdmxzaV9pcmRhX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXY7CisKKwlpZiAoIW5kZXYpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGxvc3QgbmV0ZGV2aWNlP1xuIiwgZHJpdmVybmFtZSk7CisJCXJldHVybjsKKwl9CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKworCWlkZXYgPSBuZGV2LT5wcml2OworCWRvd24oJmlkZXYtPnNlbSk7CisJaWYgKGlkZXYtPnByb2NfZW50cnkpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkobmRldi0+bmFtZSwgdmxzaV9wcm9jX3Jvb3QpOworCQlpZGV2LT5wcm9jX2VudHJ5ID0gTlVMTDsKKwl9CisJdXAoJmlkZXYtPnNlbSk7CisKKwlmcmVlX25ldGRldihuZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCUlSREFfTUVTU0FHRSgiJXM6ICVzIHJlbW92ZWRcbiIsIGRyaXZlcm5hbWUsIFBDSURFVl9OQU1FKHBkZXYpKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCisvKiBUaGUgQ29udHJvbGxlciBkb2Vzbid0IHByb3ZpZGUgUENJIFBNIGNhcGFiaWxpdGllcyBhcyBkZWZpbmVkIGJ5IFBDSSBzcGVjcy4KKyAqIFNvbWUgb2YgdGhlIExpbnV4IFBDSS1QTSBjb2RlIGhvd2V2ZXIgZGVwZW5kcyBvbiB0aGlzLCBmb3IgZXhhbXBsZSBpbgorICogcGNpX3NldF9wb3dlcl9zdGF0ZSgpLiBTbyB3ZSBoYXZlIHRvIHRha2UgY2FyZSB0byBwZXJmb3JtIHRoZSByZXF1aXJlZAorICogb3BlcmF0aW9ucyBvbiBvdXIgb3duIChwYXJ0aWN1bGFybHkgcmVmbGVjdGluZyB0aGUgcGRldi0+Y3VycmVudF9zdGF0ZSkKKyAqIG90aGVyd2lzZSB3ZSBtaWdodCBnZXQgY2hlYXRlZCBieSBwY2ktcG0uCisgKi8KKworCitzdGF0aWMgaW50IHZsc2lfaXJkYV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2OworCisJaWYgKHN0YXRlIDwgMSB8fCBzdGF0ZSA+IDMgKSB7CisJCUlSREFfRVJST1IoIiVzIC0gJXM6IGludmFsaWQgcG0gc3RhdGUgcmVxdWVzdDogJXVcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIFBDSURFVl9OQU1FKHBkZXYpLCBzdGF0ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIW5kZXYpIHsKKwkJSVJEQV9FUlJPUigiJXMgLSAlczogbm8gbmV0ZGV2aWNlIFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgUENJREVWX05BTUUocGRldikpOworCQlyZXR1cm4gMDsKKwl9CisJaWRldiA9IG5kZXYtPnByaXY7CQorCWRvd24oJmlkZXYtPnNlbSk7CisJaWYgKHBkZXYtPmN1cnJlbnRfc3RhdGUgIT0gMCkgewkJCS8qIGFscmVhZHkgc3VzcGVuZGVkICovCisJCWlmIChzdGF0ZSA+IHBkZXYtPmN1cnJlbnRfc3RhdGUpIHsJLyogc2ltcGx5IGdvIGRlZXBlciAqLworCQkJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LHN0YXRlKTsKKwkJCXBkZXYtPmN1cnJlbnRfc3RhdGUgPSBzdGF0ZTsKKwkJfQorCQllbHNlCisJCQlJUkRBX0VSUk9SKCIlcyAtICVzOiBpbnZhbGlkIHN1c3BlbmQgcmVxdWVzdCAldSAtPiAldVxuIiwgX19GVU5DVElPTl9fLCBQQ0lERVZfTkFNRShwZGV2KSwgcGRldi0+Y3VycmVudF9zdGF0ZSwgc3RhdGUpOworCQl1cCgmaWRldi0+c2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChuZGV2KTsKKwkJdmxzaV9zdG9wX2h3KGlkZXYpOworCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwkJaWYgKCFpZGV2LT5uZXdfYmF1ZCkKKwkJCS8qIHJlbWVtYmVyIHNwZWVkIHNldHRpbmdzIHRvIHJlc3RvcmUgb24gcmVzdW1lICovCisJCQlpZGV2LT5uZXdfYmF1ZCA9IGlkZXYtPmJhdWQ7CisJfQorCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LHN0YXRlKTsKKwlwZGV2LT5jdXJyZW50X3N0YXRlID0gc3RhdGU7CisJaWRldi0+cmVzdW1lX29rID0gMTsKKwl1cCgmaWRldi0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bHNpX2lyZGFfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXZsc2lfaXJkYV9kZXZfdAkqaWRldjsKKworCWlmICghbmRldikgeworCQlJUkRBX0VSUk9SKCIlcyAtICVzOiBubyBuZXRkZXZpY2UgXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBQQ0lERVZfTkFNRShwZGV2KSk7CisJCXJldHVybiAwOworCX0KKwlpZGV2ID0gbmRldi0+cHJpdjsJCisJZG93bigmaWRldi0+c2VtKTsKKwlpZiAocGRldi0+Y3VycmVudF9zdGF0ZSA9PSAwKSB7CisJCXVwKCZpZGV2LT5zZW0pOworCQlJUkRBX1dBUk5JTkcoIiVzIC0gJXM6IGFscmVhZHkgcmVzdW1lZFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBQQ0lERVZfTkFNRShwZGV2KSk7CisJCXJldHVybiAwOworCX0KKwkKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBkZXYtPmN1cnJlbnRfc3RhdGUgPSAwOworCisJaWYgKCFpZGV2LT5yZXN1bWVfb2spIHsKKwkJLyogc2hvdWxkIGJlIG9ic29sZXRlIG5vdyAtIGJ1dCB1c2VkIHRvIGhhcHBlbiBkdWUgdG86CisJCSAqIC0gcGNpIGxheWVyIGluaXRpYWxseSBzZXR0aW5nIHBkZXYtPmN1cnJlbnRfc3RhdGUgPSA0ICh1bmtub3duKQorCQkgKiAtIHBjaSBsYXllciBkaWQgbm90IHdhbGsgdGhlIHNhdmVfc3RhdGUtdHJlZSAobWlnaHQgYmUgQVBNIHByb2JsZW0pCisJCSAqICAgc28gd2UgY291bGQgbm90IHJlZnVzZSB0byBzdXNwZW5kIGZyb20gdW5kZWZpbmVkIHN0YXRlCisJCSAqIC0gdmxzaV9pcmRhX3N1c3BlbmQgZGV0ZWN0ZWQgaW52YWxpZCBzdGF0ZSBhbmQgcmVmdXNlZCB0byBzYXZlCisJCSAqICAgY29uZmlndXJhdGlvbiBmb3IgcmVzdW1lIC0gYnV0IHdhcyB0b28gbGF0ZSB0byBzdG9wIHN1c3BlbmRpbmcKKwkJICogLSB2bHNpX2lyZGFfcmVzdW1lIGdvdCBzY3Jld2VkIHdoZW4gdHJ5aW5nIHRvIHJlc3VtZSBmcm9tIGdhcmJhZ2UKKwkJICoKKwkJICogbm93IHdlIGV4cGxpY2l0bHkgc2V0IHBkZXYtPmN1cnJlbnRfc3RhdGUgPSAwIGFmdGVyIGVuYWJsaW5nIHRoZQorCQkgKiBkZXZpY2UgYW5kIGluZGVwZW5kZW50bHkgcmVzdW1lX29rIHNob3VsZCBjYXRjaCBhbnkgZ2FyYmFnZSBjb25maWcuCisJCSAqLworCQlJUkRBX1dBUk5JTkcoIiVzIC0gaG0sIG5vdGhpbmcgdG8gcmVzdW1lP1xuIiwgX19GVU5DVElPTl9fKTsKKwkJdXAoJmlkZXYtPnNlbSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7CisJCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCQl2bHNpX3N0YXJ0X2h3KGlkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5kZXYpOworCX0KKwlpZGV2LT5yZXN1bWVfb2sgPSAwOworCXVwKCZpZGV2LT5zZW0pOworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2bHNpX2lyZGFfZHJpdmVyID0geworCS5uYW1lCQk9IGRyaXZlcm5hbWUsCisJLmlkX3RhYmxlCT0gdmxzaV9pcmRhX3RhYmxlLAorCS5wcm9iZQkJPSB2bHNpX2lyZGFfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh2bHNpX2lyZGFfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHZsc2lfaXJkYV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdmxzaV9pcmRhX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworI2RlZmluZSBQUk9DX0RJUiAoImRyaXZlci8iIERSSVZFUl9OQU1FKQorCitzdGF0aWMgaW50IF9faW5pdCB2bHNpX21vZF9pbml0KHZvaWQpCit7CisJaW50CWksIHJldDsKKworCWlmIChjbGtzcmMgPCAwICB8fCAgY2xrc3JjID4gMykgeworCQlJUkRBX0VSUk9SKCIlczogaW52YWxpZCBjbGtzcmM9JWRcbiIsIGRyaXZlcm5hbWUsIGNsa3NyYyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXN3aXRjaChyaW5nc2l6ZVtpXSkgeworCQkJY2FzZSA0OgorCQkJY2FzZSA4OgorCQkJY2FzZSAxNjoKKwkJCWNhc2UgMzI6CisJCQljYXNlIDY0OgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlJUkRBX1dBUk5JTkcoIiVzOiBpbnZhbGlkICVzIHJpbmdzaXplICVkLCB1c2luZyBkZWZhdWx0PTgiLCBkcml2ZXJuYW1lLCAoaSk/InJ4IjoidHgiLCByaW5nc2l6ZVtpXSk7CisJCQkJcmluZ3NpemVbaV0gPSA4OworCQkJCWJyZWFrOworCQl9CisJfSAKKworCXNpcnB1bHNlID0gISFzaXJwdWxzZTsKKworCS8qIGNyZWF0ZV9wcm9jX2VudHJ5IHJldHVybnMgTlVMTCBpZiAhQ09ORklHX1BST0NfRlMuCisJICogRmFpbHVyZSB0byBjcmVhdGUgdGhlIHByb2NmcyBlbnRyeSBpcyBoYW5kbGVkIGxpa2UgcnVubmluZworCSAqIHdpdGhvdXQgcHJvY2ZzIC0gaXQncyBub3QgcmVxdWlyZWQgZm9yIHRoZSBkcml2ZXIgdG8gd29yay4KKwkgKi8KKwl2bHNpX3Byb2Nfcm9vdCA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRElSLCBTX0lGRElSLCBOVUxMKTsKKwlpZiAodmxzaV9wcm9jX3Jvb3QpIHsKKwkJLyogcHJvdGVjdCByZWdpc3RlcmVkIHByb2NkaXIgYWdhaW5zdCBtb2R1bGUgcmVtb3ZhbC4KKwkJICogQmVjYXVzZSB3ZSBhcmUgaW4gdGhlIG1vZHVsZSBpbml0IHBhdGggdGhlcmUncyBubyByYWNlCisJCSAqIHdpbmRvdyBhZnRlciBjcmVhdGVfcHJvY19lbnRyeSAoYW5kIG5vIGJhcnJpZXIgbmVlZGVkKS4KKwkJICovCisJCXZsc2lfcHJvY19yb290LT5vd25lciA9IFRISVNfTU9EVUxFOworCX0KKworCXJldCA9IHBjaV9tb2R1bGVfaW5pdCgmdmxzaV9pcmRhX2RyaXZlcik7CisKKwlpZiAocmV0ICYmIHZsc2lfcHJvY19yb290KQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0RJUiwgTlVMTCk7CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdmxzaV9tb2RfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmxzaV9pcmRhX2RyaXZlcik7CisJaWYgKHZsc2lfcHJvY19yb290KQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0RJUiwgTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KHZsc2lfbW9kX2luaXQpOworbW9kdWxlX2V4aXQodmxzaV9tb2RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDY5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuaApAQCAtMCwwICsxLDc5OCBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJdmxzaV9pci5oOglWTFNJODJDMTQ3IFBDSSBJckRBIGNvbnRyb2xsZXIgZHJpdmVyIGZvciBMaW51eAorICoKKyAqCVZlcnNpb246CTAuNQorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMS0yMDAzIE1hcnRpbiBEaWVobAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICoJdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqCU1BIDAyMTExLTEzMDcgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIElSREFfVkxTSV9GSVJfSAorI2RlZmluZSBJUkRBX1ZMU0lfRklSX0gKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY29tcGF0aWJpbGl0eSBzdHVmZgorICovCisKKy8qIGRlZmluaXRpb25zIG5vdCBwcmVzZW50IGluIHBjaV9pZHMuaCAqLworCisjaWZuZGVmIFBDSV9DTEFTU19XSVJFTEVTU19JUkRBCisjZGVmaW5lIFBDSV9DTEFTU19XSVJFTEVTU19JUkRBCQkweDBkMDAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9DTEFTU19TVUJDTEFTU19NQVNLCisjZGVmaW5lIFBDSV9DTEFTU19TVUJDTEFTU19NQVNLCQkweGZmZmYKKyNlbmRpZgorCisvKiBpbiByZWNlbnQgMi41IGludGVycnVwdCBoYW5kbGVycyBoYXZlIG5vbi12b2lkIHJldHVybiB2YWx1ZSAqLworI2lmbmRlZiBJUlFfUkVUVkFMCit0eXBlZGVmIHZvaWQgaXJxcmV0dXJuX3Q7CisjZGVmaW5lIElSUV9OT05FCisjZGVmaW5lIElSUV9IQU5ETEVECisjZGVmaW5lIElSUV9SRVRWQUwoeCkKKyNlbmRpZgorCisvKiBzb21lIHN0dWZmIG5lZWQgdG8gY2hlY2sga2VybmVsdmVyc2lvbi4gTm90IGFsbCAyLjUgc3R1ZmYgd2FzIHByZXNlbnQKKyAqIGluIGVhcmx5IDIuNS54IC0gdGhlIHRlc3QgaXMgbWVyZWx5IHRvIHNlcGFyYXRlIDIuNCBmcm9tIDIuNQorICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisKKy8qIFBERSgpIGludHJvZHVjZWQgaW4gMi41LjQgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworI2RlZmluZSBQREUoaW5vZGUpICgoaW5vZGUpLT51LmdlbmVyaWNfaXApCisjZW5kaWYKKworLyogaXJkYSBjcmMxNiBjYWxjdWxhdGlvbiBleHBvcnRlZCBpbiAyLjUuNDIgKi8KKyNkZWZpbmUgaXJkYV9jYWxjX2NyYzE2KGZjcyxidWYsbGVuKQkoR09PRF9GQ1MpCisKKy8qIHdlIHVzZSB0aGlzIGZvciB1bmlmaWVkIHBjaSBkZXZpY2UgbmFtZSBhY2Nlc3MgKi8KKyNkZWZpbmUgUENJREVWX05BTUUocGRldikJKChwZGV2KS0+bmFtZSkKKworI2Vsc2UgLyogMi41IG9yIGxhdGVyICovCisKKy8qIHJlY2VudCAyLjUvMi42IHN0b3JlcyBwY2kgZGV2aWNlIG5hbWVzIGF0IHZhcnlpbmcgcGxhY2VzIDstKSAqLworI2lmZGVmIENPTkZJR19QQ0lfTkFNRVMKKy8qIGh1bWFuIHJlYWRhYmxlIG5hbWUgKi8KKyNkZWZpbmUgUENJREVWX05BTUUocGRldikJKChwZGV2KS0+cHJldHR5X25hbWUpCisjZWxzZQorLyogd2hhdGV2ZXIgd2UgZ2V0IGZyb20gdGhlIGFzc29jaWF0ZWQgc3RydWN0IGRldmljZSAtIGJ1czpzbG90OmRldi5mbiBpZCAqLworI2RlZmluZSBQQ0lERVZfTkFNRShwZGV2KQkocGNpX25hbWUocGRldikpCisjZW5kaWYKKworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogbm9uLXN0YW5kYXJkIFBDSSByZWdpc3RlcnMgKi8KKworZW51bSB2bHNpX3BjaV9yZWdzIHsKKwlWTFNJX1BDSV9DTEtDVEwJCT0gMHg0MCwJCS8qIGNoaXAgY2xvY2sgaW5wdXQgY29udHJvbCAqLworCVZMU0lfUENJX01TVFJQQUdFCT0gMHg0MSwJCS8qIGFkZHIgWzMxOjI0XSBmb3IgYWxsIGJ1c21hc3RlciBjeWNsZXMgKi8KKwlWTFNJX1BDSV9JUk1JU0MJCT0gMHg0MgkJLyogbWFpbmx5IGxlZ2FjeSBVQVJUIHJlbGF0ZWQgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BDSV9DTEtDVEw6IENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKHU4LCBydykgKi8KKworLyogVGhyZWUgcG9zc2libGUgY2xvY2sgc291cmNlczogZWl0aGVyIG9uLWNoaXAgNDhNSHogUExMIG9yCisgKiBleHRlcm5hbCBjbG9jayBhcHBsaWVkIHRvIEVYVENMSyBwaW4uIEV4dGVybmFsIGNsb2NrIG1heQorICogYmUgZWl0aGVyIDQ4TUh6IG9yIDQwTUh6LCB3aGljaCBpcyBpbmRpY2F0ZWQgYnkgWENLU0VMLgorICogQ0xLU1RQIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHNlbGVjdGVkIGNsb2NrIHNvdXJjZSBnZXRzCisgKiBjb25uZWN0ZWQgdG8gdGhlIElyREEgYmxvY2suCisgKgorICogT24gbXkgSFAgT0ItODAwIHRoZSBCSU9TIHNldHMgZXh0ZXJuYWwgNDBNSHogY2xvY2sgYXMgc291cmNlCisgKiB3aGVuIElyREEgZW5hYmxlZCBhbmQgSSd2ZSBuZXZlciBkZXRlY3RlZCBhbnkgUExMIGxvY2sgc3VjY2Vzcy4KKyAqIEFwcGFyZW50bHkgdGhlIDE0LjMuLi5NSHogT1NDIGlucHV0IHJlcXVpcmVkIGZvciB0aGUgUExMIHRvIHdvcmsKKyAqIGlzIG5vdCBjb25uZWN0ZWQgYW5kIHRoZSA0ME1IeiBFWFRDTEsgaXMgcHJvdmlkZWQgZXh0ZXJuYWxseS4KKyAqIEF0IGxlYXN0IHRoaXMgaXMgd2hhdCBtYWtlcyB0aGUgZHJpdmVyIHdvcmtpbmcgZm9yIG1lLgorICovCisKK2VudW0gdmxzaV9wY2lfY2xrY3RsIHsKKworCS8qIFBMTCBjb250cm9sICovCisKKwlDTEtDVExfUERfSU5WCQk9IDB4MDQsCQkvKiBQRCM6IGludmVydGVkIHBvd2VyIGRvd24gc2lnbmFsLAorCQkJCQkJICogaS5lLiBQTEwgaXMgcG93ZXJlZCwgaWYgUERfSU5WIHNldCAqLworCUNMS0NUTF9MT0NLCQk9IDB4NDAsCQkvKiAocm8pIHNldCwgaWYgUExMIGlzIGxvY2tlZCAqLworCisJLyogY2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworCisJQ0xLQ1RMX0VYVENMSwkJPSAweDIwLAkJLyogc2V0IHRvIHNlbGVjdCBleHRlcm5hbCBjbG9jayBpbnB1dCwgbm90IFBMTCAqLworCUNMS0NUTF9YQ0tTRUwJCT0gMHgxMCwJCS8qIHNldCB0byBpbmRpY2F0ZSBFWFRDTEsgaXMgNDBNSHosIG5vdCA0OE1IeiAqLworCisJLyogSXJEQSBibG9jayBjb250cm9sICovCisKKwlDTEtDVExfQ0xLU1RQCQk9IDB4ODAsCQkvKiBzZXQgdG8gZGlzY29ubmVjdCBmcm9tIHNlbGVjdGVkIGNsb2NrIHNvdXJjZSAqLworCUNMS0NUTF9XQUtFCQk9IDB4MDgJCS8qIHNldCB0byBlbmFibGUgd2FrZXVwIGZlYXR1cmU6IHdoZW5ldmVyIElSIGFjdGl2aXR5CisJCQkJCQkgKiBpcyBkZXRlY3RlZCwgUERfSU5WIGdldHMgc2V0KD8pIGFuZCBDTEtTVFAgY2xlYXJlZCAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUENJX01TVFJQQUdFOiBNYXN0ZXIgUGFnZSBSZWdpc3RlciAodTgsIHJ3KSBhbmQgYnVzbWFzdGVyaW5nIHN0dWZmICovCisKKyNkZWZpbmUgRE1BX01BU0tfVVNFRF9CWV9IVwkweGZmZmZmZmZmCisjZGVmaW5lIERNQV9NQVNLX01TVFJQQUdFCTB4MDBmZmZmZmYKKyNkZWZpbmUgTVNUUlBBR0VfVkFMVUUJCShETUFfTUFTS19NU1RSUEFHRSA+PiAyNCkKKworCS8qIFBDSSBidXNtYXN0ZXJpbmcgaXMgc29tZXdoYXQgc3BlY2lhbCBmb3IgdGhpcyBndXkgLSBpbiBzaG9ydDoKKwkgKgorCSAqIFdlIHNlbGVjdCB0byBvcGVyYXRlIHVzaW5nIGZpeGVkIE1TVFJQQUdFPTAsIHVzZSBJU0EgRE1BCisJICogYWRkcmVzcyByZXN0cmljdGlvbnMgdG8gbWFrZSB0aGUgUENJIEJNIGFwaSBhd2FyZSBvZiB0aGlzLAorCSAqIGJ1dCBlbnN1cmUgdGhlIGhhcmR3YXJlIGlzIGRlYWxpbmcgd2l0aCByZWFsIDMyYml0IGFjY2Vzcy4KKwkgKgorCSAqIEluIGRldGFpbDoKKwkgKiBUaGUgY2hpcCBleGVjdXRlcyBub3JtYWwgMzJiaXQgYnVzbWFzdGVyIGN5Y2xlcywgaS5lLgorCSAqIGRyaXZlcyBhbGwgMzIgYWRkcmVzcyBsaW5lcy4gVGhlc2UgYWRkcmVzc2VzIGhvd2V2ZXIgYXJlCisJICogY29tcG9zZWQgb2YgWzA6MjNdIHRha2VuIGZyb20gdmFyaW91cyBidXNhZGRyLXBvaW50ZXJzCisJICogYW5kIFsyNDozMV0gdGFrZW4gZnJvbSB0aGUgTVNUUlBBR0UgcmVnaXN0ZXIgaW4gdGhlIFZMU0k4MkMxNDcKKwkgKiBjb25maWcgc3BhY2UuIFRoZXJlZm9yZSBfYWxsXyBidXNtYXN0ZXJpbmcgbXVzdCBiZQorCSAqIHRhcmdldGVkIHRvL2Zyb20gb25lIHNpbmdsZSAxNk1CIChidXNhZGRyLSkgc3VwZXJwYWdlIQorCSAqIFRoZSBwb2ludCBpcyB0byBtYWtlIHN1cmUgYWxsIHRoZSBhbGxvY2F0aW9ucyBmb3IgbWVtb3J5CisJICogbG9jYXRpb25zIHdpdGggYnVzbWFzdGVyIGFjY2VzcyAocmluZyBkZXNjcmlwdG9ycywgYnVmZmVycykKKwkgKiBhcmUgaW5kZWVkIGJ1cy1tYXBwYWJsZSB0byB0aGUgc2FtZSAxNk1CIHJhbmdlIChmb3IgeDg2IHRoaXMKKwkgKiBtZWFucyB0aGV5IG11c3QgcmVzaWRlIGluIHRoZSBzYW1lIDE2TUIgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MKKwkgKiByYW5nZSkuIFRoZSBvbmx5IGNvbnN0cmFpbnQgd2UgaGF2ZSB3aGljaCBzdXBwb3J0cyAic2V2ZXJhbCBvYmplY3RzCisJICogbWFwcGFibGUgdG8gY29tbW9uIDE2TUIgcmFuZ2UiIHBhcmFkaWdtYSwgaXMgdGhlIG9sZCBJU0EgRE1BCisJICogcmVzdHJpY3Rpb24gdG8gdGhlIGZpcnN0IDE2TUIgb2YgcGh5c2ljYWwgYWRkcmVzcyByYW5nZS4KKwkgKiBIZW5jZSB0aGUgYXBwcm9hY2ggaGVyZSBpcyB0byBlbmFibGUgUENJIGJ1c21hc3RlciBzdXBwb3J0IHVzaW5nCisJICogdGhlIGNvcnJlY3QgMzJiaXQgZG1hLW1hc2sgdXNlZCBieSB0aGUgY2hpcC4gQWZ0ZXJ3YXJkcyB0aGUgZGV2aWNlJ3MKKwkgKiBkbWEtbWFzayBnZXRzIHJlc3RyaWN0ZWQgdG8gMjRiaXQsIHdoaWNoIG11c3QgYmUgaG9ub3VyZWQgc29tZWhvdyBieQorCSAqIGFsbCBhbGxvY2F0aW9ucyBmb3IgbWVtb3J5IGFyZWFzIHRvIGJlIGV4cG9zZWQgdG8gdGhlIGNoaXAgLi4uCisJICoKKwkgKiBOb3RlOgorCSAqIERvbid0IGJlIHN1cnByaXNlZCB0byBnZXQgIlNldHRpbmcgbGF0ZW5jeSB0aW1lci4uLiIgbWVzc2FnZXMgZXZlcnkKKwkgKiB0aW1lIHdoZW4gUENJIGJ1c21hc3RlcmluZyBpcyBlbmFibGVkIGZvciB0aGUgY2hpcC4KKwkgKiBUaGUgY2hpcCBoYXMgaXRzIFBDSSBsYXRlbmN5IHRpbWVyIFJPIGZpeGVkIGF0IDAgLSB3aGljaCBpcyBub3QgYQorCSAqIHByb2JsZW0gaGVyZSwgYmVjYXVzZSBpdCBpcyBuZXZlciByZXF1ZXN0aW5nIF9idXJzdF8gdHJhbnNhY3Rpb25zLgorCSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QQ0lJUk1JU0M6IElSIE1pc2NlbGxhbmVvdXMgUmVnaXN0ZXIgKHU4LCBydykgKi8KKworLyogbGVnYWN5IFVBUlQgZW11bGF0aW9uIC0gbm90IHVzZWQgYnkgdGhpcyBkcml2ZXIgLSB3b3VsZCByZXF1aXJlOgorICogKHNlZSBiZWxvdyBmb3Igc29tZSByZWdpc3Rlci12YWx1ZSBkZWZpbml0aW9ucykKKyAqCisgKgktIElSTUlTQ19VQVJURU4gbXVzdCBiZSBzZXQgdG8gZW5hYmxlIFVBUlQgYWRkcmVzcyBkZWNvZGluZworICoJLSBJUk1JU0NfVUFSVFNFTCBjb25maWd1cmVkCisgKgktIElSQ0ZHX01BU1RFUiBtdXN0IGJlIGNsZWFyZWQKKyAqCS0gSVJDRkdfU0lSIG11c3QgYmUgc2V0CisgKgktIElSRU5BQkxFX1BIWUFORENMT0NLIG11c3QgYmUgYXNzZXJ0ZWQgMC0+MSAoYW5kIGhlbmNlIElSRU5BQkxFX1NJUl9PTikKKyAqLworCitlbnVtIHZsc2lfcGNpX2lybWlzYyB7CisKKwkvKiBJUiB0cmFuc2NlaXZlciBjb250cm9sICovCisKKwlJUk1JU0NfSVJSQUlMCQk9IDB4NDAsCQkvKiAocm8/KSBJUiByYWlsIHBvd2VyIGluZGljYXRpb24gKGFuZCBjb250cm9sPykKKwkJCQkJCSAqIDA9My4zViAvIDE9NVYuIFByb2JhYmx5IHNldCBkdXJpbmcgcG93ZXItb24/CisJCQkJCQkgKiB1bmNsZWFyIC0gbm90IHRvdWNoZWQgYnkgZHJpdmVyICovCisJSVJNSVNDX0lSUEQJCT0gMHgwOCwJCS8qIHRyYW5zY2VpdmVyIHBvd2VyIGRvd24sIGlmIHNldCAqLworCisJLyogbGVnYWN5IFVBUlQgY29udHJvbCAqLworCisJSVJNSVNDX1VBUlRUU1QJCT0gMHg4MCwJCS8qIFVBUlQgdGVzdCBtb2RlIC0gImFsd2F5cyB3cml0ZSAwIiAqLworCUlSTUlTQ19VQVJURU4JCT0gMHgwNCwJCS8qIGVuYWJsZSBVQVJUIGFkZHJlc3MgZGVjb2RpbmcgKi8KKworCS8qIGJpdHMgWzE6MF0gSVJNSVNDX1VBUlRTRUwgdG8gc2VsZWN0IGxlZ2FjeSBVQVJUIGFkZHJlc3MgKi8KKworCUlSTUlTQ19VQVJUU0VMXzNmOAk9IDB4MDAsCisJSVJNSVNDX1VBUlRTRUxfMmY4CT0gMHgwMSwKKwlJUk1JU0NfVUFSVFNFTF8zZTgJPSAweDAyLAorCUlSTUlTQ19VQVJUU0VMXzJlOAk9IDB4MDMKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogcmVnaXN0ZXJzIG1hcHBlZCB0byAzMiBieXRlIFBDSSBJTyBzcGFjZSAqLworCisvKiBub3RlOiBiZXR0ZXIgYWNjZXNzIGFsbCByZWdpc3RlcnMgYXQgdGhlIGluZGljYXRlZCB1OC91MTYgc2l6ZQorICoJIGFsdGhvdWdoIHNvbWUgb2YgdGhlbSBjb250YWluIG9ubHkgMSBieXRlIG9mIGluZm9ybWF0aW9uLgorICoJIHNvbWUgb2YgdGhlbSAocGFydGljYWx1YXJseSBQUk9NUFQgYW5kIElSQ0ZHKSBpZ25vcmUKKyAqCSBhY2Nlc3Mgd2hlbiB1c2luZyB0aGUgd3JvbmcgYWRkcmVzc2luZyBtb2RlIQorICovCisKK2VudW0gdmxzaV9waW9fcmVncyB7CisJVkxTSV9QSU9fSVJJTlRSCQk9IDB4MDAsCQkvKiBpbnRlcnJ1cHQgZW5hYmxlL3JlcXVlc3QgKHU4LCBydykgKi8KKwlWTFNJX1BJT19SSU5HUFRSCT0gMHgwMiwJCS8qIHJ4L3R4IHJpbmcgcG9pbnRlciAodTE2LCBybykgKi8KKwlWTFNJX1BJT19SSU5HQkFTRQk9IDB4MDQsCQkvKiBbMjM6MTBdIG9mIHJpbmcgYWRkcmVzcyAodTE2LCBydykgKi8KKwlWTFNJX1BJT19SSU5HU0laRQk9IDB4MDYsCQkvKiByeC90eCByaW5nIHNpemUgKHUxNiwgcncpICovCisJVkxTSV9QSU9fUFJPTVBUCQk9IDB4MDgsIAkvKiB0cmlnZ2VycyByaW5nIHByb2Nlc3NpbmcgKHUxNiwgd28pICovCisJLyogMHgwYS0weDBmOiByZXNlcnZlZCAvIGR1cGxpY2F0ZWQgVUFSVCByZWdzICovCisJVkxTSV9QSU9fSVJDRkcJCT0gMHgxMCwJCS8qIGNvbmZpZ3VyYXRpb24gc2VsZWN0ICh1MTYsIHJ3KSAqLworCVZMU0lfUElPX1NJUkZMQUcJPSAweDEyLAkJLyogQk9GL0VPRiBmb3IgZmlsdGVyZWQgU0lSICh1MTYsIHJvKSAqLworCVZMU0lfUElPX0lSRU5BQkxFCT0gMHgxNCwJCS8qIGVuYWJsZSBhbmQgc3RhdHVzIHJlZ2lzdGVyICh1MTYsIHJ3L3JvKSAqLworCVZMU0lfUElPX1BIWUNUTAkJPSAweDE2LAkJLyogcGh5c2ljYWwgbGF5ZXIgY3VycmVudCBzdGF0dXMgKHUxNiwgcm8pICovCisJVkxTSV9QSU9fTlBIWUNUTAk9IDB4MTgsCQkvKiBuZXh0IHBoeXNpY2FsIGxheWVyIHNlbGVjdCAodTE2LCBydykgKi8KKwlWTFNJX1BJT19NQVhQS1QJCT0gMHgxYSwJCS8qIFsxMTowXSBtYXggbGVuIGZvciBwYWNrZXQgcmVjZWl2ZSAodTE2LCBydykgKi8KKwlWTFNJX1BJT19SQ1ZCQ05UCT0gMHgxYwkJLyogY3VycmVudCByZWNlaXZlLUZJRk8gYnl0ZSBjb3VudCAodTE2LCBybykgKi8KKwkvKiAweDFlLTB4MWY6IHJlc2VydmVkIC8gZHVwbGljYXRlZCBVQVJUIHJlZ3MgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19JUklOVFI6IEludGVycnVwdCBSZWdpc3RlciAodTgsIHJ3KSAqLworCisvKiBlbmFibGUtYml0czoKKyAqCQkxID0gZW5hYmxlIC8gMCA9IGRpc2FibGUKKyAqIGludGVycnVwdCBjb25kaXRpb24gYml0czoKKyAqIAkJc2V0IGFjY29yZGluZyB0byBjb3JyZXNwb25kaW5nIGludGVycnVwdCBzb3VyY2UKKyAqCQkocmVnYXJkbGVzcyBvZiB0aGUgc3RhdGUgb2YgdGhlIGVuYWJsZSBiaXRzKQorICoJCWVuYWJsZSBiaXQgc3RhdHVzIGluZGljYXRlcyB3aGV0aGVyIGludGVycnVwdCBnZXRzIHJhaXNlZAorICoJCXdyaXRlLXRvLWNsZWFyCisgKiBub3RlOiBSUEtUSU5UIGFuZCBUUEtUSU5UIGJlaGF2ZSBkaWZmZXJlbnQgaW4gbGVnYWN5IFVBUlQgbW9kZSAod2hpY2ggd2UgZG9uJ3QgdXNlIDotKQorICovCisKK2VudW0gdmxzaV9waW9faXJpbnRyIHsKKwlJUklOVFJfQUNURU4JPSAweDgwLAkvKiBhY3Rpdml0eSBpbnRlcnJ1cHQgZW5hYmxlICovCisJSVJJTlRSX0FDVElWSVRZCT0gMHg0MCwJLyogYWN0aXZpdHkgbW9uaXRvciAodHJhZmZpYyBkZXRlY3RlZCkgKi8KKwlJUklOVFJfUlBLVEVOCT0gMHgyMCwJLyogcmVjZWl2ZSBwYWNrZXQgaW50ZXJydXB0IGVuYWJsZSovCisJSVJJTlRSX1JQS1RJTlQJPSAweDEwLAkvKiByeC1wYWNrZXQgdHJhbnNmZXJlZCBmcm9tIGZpZm8gdG8gbWVtb3J5IGZpbmlzaGVkICovCisJSVJJTlRSX1RQS1RFTgk9IDB4MDgsCS8qIHRyYW5zbWl0IHBhY2tldCBpbnRlcnJ1cHQgZW5hYmxlICovCisJSVJJTlRSX1RQS1RJTlQJPSAweDA0LAkvKiBsYXN0IGJpdCBvZiB0eC1wYWNrZXQrY3JjIHNoaWZ0ZWQgdG8gaXItcHVsc2VyICovCisJSVJJTlRSX09FX0VOCT0gMHgwMiwJLyogVUFSVCByeCBmaWZvIG92ZXJydW4gZXJyb3IgaW50ZXJydXB0IGVuYWJsZSAqLworCUlSSU5UUl9PRV9JTlQJPSAweDAxCS8qIFVBUlQgcnggZmlmbyBvdmVycnVuIGVycm9yIChyZWFkIExTUiB0byBjbGVhcikgKi8KK307CisKKy8qIHdlIHVzZSB0aGlzIG1hc2sgdG8gY2hlY2sgd2hldGhlciB0aGUgKHNoYXJlZCBQQ0kpIGludGVycnVwdCBpcyBvdXJzICovCisKKyNkZWZpbmUgSVJJTlRSX0lOVF9NQVNLCQkoSVJJTlRSX0FDVElWSVRZfElSSU5UUl9SUEtUSU5UfElSSU5UUl9UUEtUSU5UKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fUklOR1BUUjogUmluZyBQb2ludGVyIFJlYWQtQmFjayBSZWdpc3RlciAodTE2LCBybykgKi8KKworLyogX2JvdGhfIHJpbmcgcG9pbnRlcnMgYXJlIGluZGljZXMgcmVsYXRpdmUgdG8gdGhlIF9lbnRpcmVfIHJ4LHR4LXJpbmchCisgKiBpLmUuIHRoZSByZWZlcmVuY2VkIGRlc2NyaXB0b3IgaXMgbG9jYXRlZAorICogYXQgUklOR0JBU0UgKyBQVFIgKiBzaXplb2YoZGVzY3IpIGZvciByeCBhbmQgdHgKKyAqIHRoZXJlZm9yZSwgdGhlIHR4LXBvaW50ZXIgaGFzIG9mZnNldCBNQVhfUklOR19ERVNDUgorICovCisKKyNkZWZpbmUgTUFYX1JJTkdfREVTQ1IJCTY0CS8qIHR4LCByeCByaW5ncyBtYXkgY29udGFpbiB1cCB0byA2NCBkZXNjciBlYWNoICovCisKKyNkZWZpbmUgUklOR1BUUl9SWF9NQVNLCQkoTUFYX1JJTkdfREVTQ1ItMSkKKyNkZWZpbmUgUklOR1BUUl9UWF9NQVNLCQkoKE1BWF9SSU5HX0RFU0NSLTEpPDw4KQorCisjZGVmaW5lIFJJTkdQVFJfR0VUX1JYKHApCSgocCkmUklOR1BUUl9SWF9NQVNLKQorI2RlZmluZSBSSU5HUFRSX0dFVF9UWChwKQkoKChwKSZSSU5HUFRSX1RYX01BU0spPj44KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fUklOR0JBU0U6IFJpbmcgUG9pbnRlciBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKHUxNiwgcm8pICovCisKKy8qIENvbnRhaW5zIFsyMzoxMF0gcGFydCBvZiB0aGUgcmluZyBiYXNlIChidXMtKSBhZGRyZXNzCisgKiB3aGljaCBtdXN0IGJlIDFrLWFsaW5nZWQuIFszMToyNF0gaXMgdGFrZW4gZnJvbQorICogVkxTSV9QQ0lfTVNUUlBBR0UgYWJvdmUuCisgKiBUaGUgY29udHJvbGxlciBpbml0aWF0ZXMgbm9uLWJ1cnN0IFBDSSBCTSBjeWNsZXMgdG8KKyAqIGZldGNoIGFuZCB1cGRhdGUgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSByaW5nLgorICogT25jZSBmZXRjaGVkLCB0aGUgZGVzY3JpcHRvciByZW1haW5zIGNhY2hlZCBvbmNoaXAKKyAqIHVudGlsIGl0IGdldHMgY2xvc2VkIGFuZCB1cGRhdGVkIGR1ZSB0byB0aGUgcmluZworICogcHJvY2Vzc2luZyBzdGF0ZSBtYWNoaW5lLgorICogVGhlIGVudGlyZSByaW5nIGFyZWEgaXMgc3BsaXQgaW4gcnggYW5kIHR4IGFyZWFzIHdpdGggZWFjaAorICogYXJlYSBjb25zaXN0aW5nIG9mIDY0IGRlc2NyaXB0b3JzIG9mIDggYnl0ZXMgZWFjaC4KKyAqIFRoZSByeCh0eCkgcmluZyBpcyBsb2NhdGVkIGF0IHJpbmdiYXNlKzAgKHJpbmdiYXNlKzY0KjgpLgorICovCisKKyNkZWZpbmUgQlVTX1RPX1JJTkdCQVNFKHApCSgoKHApPj4xMCkmMHgzZmZmKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fUklOR1NJWkU6IFJpbmcgU2l6ZSBSZWdpc3RlciAodTE2LCBydykgKi8KKworLyogYml0IG1hc2sgdG8gaW5kaWNhdGUgdGhlIHJpbmcgc2l6ZSB0byBiZSB1c2VkIGZvciByeCBhbmQgdHguCisgKiAJcG9zc2libGUgdmFsdWVzCQllbmNvZGVkIGJpdHMKKyAqCQkgNAkJICAgMDAwMAorICoJCSA4CQkgICAwMDAxCisgKgkJMTYJCSAgIDAwMTEKKyAqCQkzMgkJICAgMDExMQorICoJCTY0CQkgICAxMTExCisgKiBsb2NhdGVkIGF0IFsxNToxMl0gZm9yIHR4IGFuZCBbMTE6OF0gZm9yIHJ4IChbNzowXSB1bnVzZWQpCisgKgorICogbm90ZTogcHJvYmFibHkgYSBnb29kIGlkZWEgdG8gaGF2ZSBJUkNGR19NU1RSIGNsZWFyZWQgd2hlbiB3cml0aW5nCisgKgkgdGhpcyBzbyB0aGUgc3RhdGUgbWFjaGluZXMgYXJlIHN0b3BwZWQgYW5kIHRoZSBSSU5HUFRSIGlzIHJlc2V0IQorICovCisKKyNkZWZpbmUgU0laRV9UT19CSVRTKG51bSkJCSgoKChudW0pLTEpPj4yKSYweDBmKQorI2RlZmluZSBUWF9SWF9UT19SSU5HU0laRSh0eCxyeCkJKChTSVpFX1RPX0JJVFModHgpPDwxMil8KFNJWkVfVE9fQklUUyhyeCk8PDgpKQorI2RlZmluZSBSSU5HU0laRV9UT19SWFNJWkUocnMpCQkoKCgocnMpJjB4MGYwMCk+PjYpKzQpCisjZGVmaW5lIFJJTkdTSVpFX1RPX1RYU0laRShycykJCSgoKChycykmMHhmMDAwKT4+MTApKzQpCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUElPX1BST01QVDogUmluZyBQcm9tcHRpbmcgUmVnaXN0ZXIgKHUxNiwgd3JpdGUtdG8tc3RhcnQpICovCisKKy8qIHdyaXRpbmcgYW55IHZhbHVlIGtpY2tzIHRoZSByaW5nIHByb2Nlc3Npbmcgc3RhdGUgbWFjaGluZXMKKyAqIGZvciBib3RoIHR4LCByeCByaW5ncyBhcyBmb2xsb3dzOgorICogCS0gYWN0aXZlIHJpbmdzIChjdXJyZW50bHkgb3duaW5nIGFuIGFjdGl2ZSBkZXNjcmlwdG9yKQorICoJICBpZ25vcmUgdGhlIHByb21wdCBhbmQgY29udGludWUKKyAqCS0gaWRsZSByaW5ncyBmZXRjaCB0aGUgbmV4dCBkZXNjciBmcm9tIHRoZSByaW5nIGFuZCBzdGFydAorICoJICB0aGVpciBwcm9jZXNzaW5nCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUElPX0lSQ0ZHOiBJUiBDb25maWcgUmVnaXN0ZXIgKHUxNiwgcncpICovCisKKy8qIG5vdGVzOgorICoJLSBub3QgbW9yZSB0aGFuIG9uZSBTSVIvTUlSL0ZJUiBiaXQgbXVzdCBiZSBzZXQgYXQgYW55IHRpbWUKKyAqCS0gU0lSLCBNSVIsIEZJUiBhbmQgQ1JDMTYgc2VsZWN0IHRoZSBjb25maWd1cmF0aW9uIHdoaWNoIHdpbGwKKyAqCSAgYmUgYXBwbGllZCBvbiBuZXh0IDAtPjEgdHJhbnNpdGlvbiBvZiBJUkVOQUJMRV9QSFlBTkRDTE9DSyAoc2VlIGJlbG93KS4KKyAqCS0gYmVzaWRlcyBhbGxvd2luZyB0aGUgUENJIGludGVyZmFjZSB0byBleGVjdXRlIGJ1c21hc3RlciBjeWNsZXMKKyAqCSAgYW5kIHRoZXJlZm9yZSB0aGUgcmluZyBTTSB0byBvcGVyYXRlLCB0aGUgTVNUUiBiaXQgaGFzIHNpZGUtZWZmZWN0czoKKyAqCSAgd2hlbiBNU1RSIGlzIGNsZWFyZWQsIHRoZSBSSU5HUFRSJ3MgZ2V0IHJlc2V0IGFuZCB0aGUgbGVnYWN5IFVBUlQgbW9kZQorICoJICAoaW4gY29udHJhc3QgdG8gYnVzbWFzdGVyIGFjY2VzcyBtb2RlKSBnZXRzIGVuYWJsZWQuCisgKgktIGNsZWFyaW5nIEVOUlggb3Igc2V0dGluZyBFTlRYIHdoaWxlIGRhdGEgaXMgcmVjZWl2ZWQgbWF5IHN0YWxsIHRoZQorICoJICByZWNlaXZlIGZpZm8gdW50aWwgRU5SWCByZWVuYWJsZWQgX2FuZF8gYW5vdGhlciBwYWNrZXQgYXJyaXZlcworICoJLSBTSVJGSUxUIG1lYW5zIHRoZSBjaGlwIHBlcmZvcm1zIHRoZSByZXF1aXJlZCB1bndyYXBwaW5nIG9mIGhhcmR3YXJlCisgKgkgIGhlYWRlcnMgKFhCT0YncywgQk9GL0VPRikgYW5kIHVuLWVzY2FwaW5nIGluIHRoZSBfcmVjZWl2ZV8gZGlyZWN0aW9uLgorICoJICBPbmx5IHRoZSByZXN1bHRpbmcgSXJMQVAgcGF5bG9hZCBpcyBjb3BpZWQgdG8gdGhlIHJlY2VpdmUgYnVmZmVycyAtCisgKgkgIGJ1dCB3aXRoIHRoZSAxNmJpdCBGQ1Mgc3RpbGwgZW5jbHVkZWQuIFF1ZXN0aW9uIHJlbWFpbnMsIHdoZXRoZXIgaXQKKyAqCSAgd2FzIGFscmVhZHkgY2hlY2tlZCBvciB3ZSBzaG91bGQgZG8gaXQgYmVmb3JlIHBhc3NpbmcgdGhlIHBhY2tldCB0byBJckxBUD8KKyAqLworCitlbnVtIHZsc2lfcGlvX2lyY2ZnIHsKKwlJUkNGR19MT09QCT0gMHg0MDAwLAkvKiBlbmFibGUgbG9vcGJhY2sgdGVzdCBtb2RlICovCisJSVJDRkdfRU5UWAk9IDB4MTAwMCwJLyogdHJhbnNtaXQgZW5hYmxlICovCisJSVJDRkdfRU5SWAk9IDB4MDgwMCwJLyogcmVjZWl2ZSBlbmFibGUgKi8KKwlJUkNGR19NU1RSCT0gMHgwNDAwLAkvKiBtYXN0ZXIgZW5hYmxlICovCisJSVJDRkdfUlhBTlkJPSAweDAyMDAsCS8qIHJlY2VpdmUgYW55IHBhY2tldCAqLworCUlSQ0ZHX0NSQzE2CT0gMHgwMDgwLAkvKiAxNmJpdCAobm90IDMyYml0KSBDUkMgc2VsZWN0IGZvciBNSVIvRklSICovCisJSVJDRkdfRklSCT0gMHgwMDQwLAkvKiBGSVIgNFBQTSBlbmNvZGluZyBtb2RlIGVuYWJsZSAqLworCUlSQ0ZHX01JUgk9IDB4MDAyMCwJLyogTUlSIEhETEMgZW5jb2RpbmcgbW9kZSBlbmFibGUgKi8KKwlJUkNGR19TSVIJPSAweDAwMTAsCS8qIFNJUiBlbmNvZGluZyBtb2RlIGVuYWJsZSAqLworCUlSQ0ZHX1NJUkZJTFQJPSAweDAwMDgsCS8qIGVuYWJsZSBTSVIgZGVjb2RlIGZpbHRlciAocmVjZWl2ZXIgdW53cmFwcGluZykgKi8KKwlJUkNGR19TSVJURVNUCT0gMHgwMDA0LAkvKiBhbGxvdyBTSVIgZGVjb2RlIGZpbHRlciB3aGVuIG5vdCBpbiBTSVIgbW9kZSAqLworCUlSQ0ZHX1RYUE9MCT0gMHgwMDAyLAkvKiBpbnZlcnQgdHggcG9sYXJpdHkgd2hlbiBzZXQgKi8KKwlJUkNGR19SWFBPTAk9IDB4MDAwMQkvKiBpbnZlcnQgcnggcG9sYXJpdHkgd2hlbiBzZXQgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19TSVJGTEFHOiBTSVIgRmxhZyBSZWdpc3RlciAodTE2LCBybykgKi8KKworLyogcmVnaXN0ZXIgY29udGFpbnMgaGFyZGNvZGVkIEJPRj0weGMwIGF0IFs3OjBdIGFuZCBFT0Y9MHhjMSBhdCBbMTU6OF0KKyAqIHdoaWNoIGlzIHVzZWQgZm9yIHVud3JhcHBpbmcgcmVjZWl2ZWQgZnJhbWVzIGluIFNJUiBkZWNvZGUtZmlsdGVyIG1vZGUKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fSVJFTkFCTEU6IElSIEVuYWJsZSBSZWdpc3RlciAodTE2LCBydy9ybykgKi8KKworLyogbm90ZXM6CisgKgktIElSRU4gYWN0cyBhcyBnYXRlIGZvciBsYXRjaGluZyB0aGUgY29uZmlndXJlZCBJUiBtb2RlIGluZm9ybWF0aW9uCisgKgkgIGZyb20gSVJDRkcgYW5kIElSUEhZQ1RMIHdoZW4gSVJFTj1yZXNldCBhbmQgYXBwbHlpbmcgdGhlbSB3aGVuCisgKgkgIElSRU4gZ2V0cyBzZXQgYWZ0ZXJ3YXJkcy4KKyAqCS0gRU5UWFNUIHJlZmxlY3RzIElSQ0ZHX0VOVFgKKyAqCS0gRU5SWFNUID0gSVJDRkdfRU5SWCAmJiAoIUlSQ0ZHX0VOVFggfHwgSVJDRkdfTE9PUCkKKyAqLworCitlbnVtIHZsc2lfcGlvX2lyZW5hYmxlIHsKKwlJUkVOQUJMRV9QSFlBTkRDTE9DSwk9IDB4ODAwMCwgIC8qIGVuYWJsZSBJUiBwaHkgYW5kIGdhdGUgdGhlIG1vZGUgY29uZmlnIChydykgKi8KKwlJUkVOQUJMRV9DRkdFUgkJPSAweDQwMDAsICAvKiBtb2RlIGNvbmZpZ3VyYXRpb24gZXJyb3IgKHJvKSAqLworCUlSRU5BQkxFX0ZJUl9PTgkJPSAweDIwMDAsICAvKiBGSVIgb24gc3RhdHVzIChybykgKi8KKwlJUkVOQUJMRV9NSVJfT04JCT0gMHgxMDAwLCAgLyogTUlSIG9uIHN0YXR1cyAocm8pICovCisJSVJFTkFCTEVfU0lSX09OCQk9IDB4MDgwMCwgIC8qIFNJUiBvbiBzdGF0dXMgKHJvKSAqLworCUlSRU5BQkxFX0VOVFhTVAkJPSAweDA0MDAsICAvKiB0cmFuc21pdCBlbmFibGUgc3RhdHVzIChybykgKi8KKwlJUkVOQUJMRV9FTlJYU1QJCT0gMHgwMjAwLCAgLyogUmVjZWl2ZSBlbmFibGUgc3RhdHVzIChybykgKi8KKwlJUkVOQUJMRV9DUkMxNl9PTgk9IDB4MDEwMCAgIC8qIDE2Yml0IChub3QgMzJiaXQpIENSQyBlbmFibGVkIHN0YXR1cyAocm8pICovCit9OworCisjZGVmaW5lCSAgSVJFTkFCTEVfTUFTSwkgICAgMHhmZjAwICAvKiBSZWFkIG1hc2sgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUElPX1BIWUNUTDogSVIgUGh5c2ljYWwgTGF5ZXIgQ3VycmVudCBDb250cm9sIFJlZ2lzdGVyICh1MTYsIHJvKSAqLworCisvKiByZWFkLWJhY2sgb2YgdGhlIGN1cnJlbnRseSBhcHBsaWVkIHBoeXNpY2FsIGxheWVyIHN0YXR1cy4KKyAqIGFwcGxpZWQgZnJvbSBWTFNJX1BJT19OUEhZQ1RMIGF0IHJpc2luZyBlZGdlIG9mIElSRU5BQkxFX1BIWUFORENMT0NLCisgKiBjb250ZW50cyBpZGVudGljYWwgdG8gVkxTSV9QSU9fTlBIWUNUTCAoc2VlIGJlbG93KQorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19OUEhZQ1RMOiBJUiBQaHlzaWNhbCBMYXllciBOZXh0IENvbnRyb2wgUmVnaXN0ZXIgKHUxNiwgcncpICovCisKKy8qIGxhdGNoZWQgZHVyaW5nIElSRU5BQkxFX1BIWUFORENMT0NLPTAgYW5kIGFwcGxpZWQgYXQgMC0xIHRyYW5zaXRpb24KKyAqCisgKiBjb25zaXN0cyBvZiBCQVVEWzE1OjEwXSwgUExTV0lEWzk6NV0gYW5kIFBSRUFNQls0OjBdIGJpdHMgZGVmaW5lZCBhcyBmb2xsb3dzOgorICoKKyAqIFNJUi1tb2RlOglCQVVEID0gKDExNS4ya0h6IC8gYmF1ZHJhdGUpIC0gMQorICoJCVBMU1dJRCA9IChwdWxzZXRpbWUgKiBmcmVxIC8gKEJBVUQrMSkpIC0gMQorICoJCQl3aGVyZSBwdWxzZXRpbWUgaXMgdGhlIHJlcXVlc3RlZCBJclBIWSBwdWxzZSB3aWR0aAorICoJCQlhbmQgZnJlcSBpcyA4KDE2KU1IeiBmb3IgNDAoNDgpTUh6IHByaW1hcnkgaW5wdXQgY2xvY2sKKyAqCQlQUkVBTUI6IGRvbid0IGNhcmUgZm9yIFNJUgorICoKKyAqCQlUaGUgbm9taW5hbCBTSVIgcHVsc2Ugd2lkdGggaXMgMy8xNiBiaXQgdGltZSBzbyB3ZSBoYXZlIFBMU1dJRD0xMgorICoJCWZpeGVkIGZvciBhbGwgU0lSIHNwZWVkcyBhdCA0ME1IeiBpbnB1dCBjbG9jayAoUExTV0lEPTI0IGF0IDQ4TUh6KS4KKyAqCQlJclBIWSBhbHNvIGFsbG93cyBzaG9ydGVyIHB1bHNlcyBkb3duIHRvIHRoZSBub21pbmFsIHB1bHNlIGR1cmF0aW9uCisgKgkJYXQgMTE1LjJrYmF1ZCAobWludXMgc29tZSB0b2xlcmFuY2UpIHdoaWNoIGlzIDEuNDEgdXNlYy4KKyAqCQlVc2luZyB0aGUgZXhwcmVzc2lvbiBQTFNXSUQgPSAxMi8oQkFVRCsxKS0xIChtdWx0aXBsaWVkIGJ5IHR3byBmb3IgNDhNSHopCisgKgkJd2UgZ2V0IHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgUExTV0lEIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIFZMU0kKKyAqCQlzcGVjaWZpY2F0aW9uLCB3aGljaCBwcm92aWRlcyAxLjUgdXNlYyBwdWxzZSB3aWR0aCBmb3IgYWxsIHNwZWVkcyAoZXhjZXB0CisgKgkJZm9yIDIuNGtiYXVkIGdldHRpbmcgNnVzZWMpLiBUaGlzIGlzIGZpbmUgd2l0aCBJclBIWSB2MS4zIHNwZWNzIGFuZAorICoJCXJlZHVjZXMgdGhlIHRyYW5zY2VpdmVyIHBvd2VyIHdoaWNoIGRyYWlucyB0aGUgYmF0dGVyeS4gQXQgOS42a2JhdWQgZm9yCisgKgkJZXhhbXBsZSB0aGlzIGFtb3VudHMgdG8gbW9yZSB0aGFuIDkwJSBiYXR0ZXJ5IHBvd2VyIHNhdmluZyEKKyAqCisgKiBNSVItbW9kZToJQkFVRCA9IDAKKyAqCQlQTFNXSUQgPSA5KDEwKSBmb3IgNDAoNDgpIE1IeiBpbnB1dCBjbG9jaworICoJCQl0byBnZXQgbm9taW5hbCBNSVIgcHVsc2Ugd2lkdGgKKyAqCQlQUkVBTUIgPSAxCisgKgorICogRklSLW1vZGU6CUJBVUQgPSAwCisgKgkJUExTV0lEOiBkb24ndCBjYXJlCisgKgkJUFJFQU1CID0gMTUKKyAqLworCisjZGVmaW5lIFBIWUNUTF9CQVVEX1NISUZUCTEwCisjZGVmaW5lIFBIWUNUTF9CQVVEX01BU0sJMHhmYzAwCisjZGVmaW5lIFBIWUNUTF9QTFNXSURfU0hJRlQJNQorI2RlZmluZSBQSFlDVExfUExTV0lEX01BU0sJMHgwM2UwCisjZGVmaW5lIFBIWUNUTF9QUkVBTUJfU0hJRlQJMAorI2RlZmluZSBQSFlDVExfUFJFQU1CX01BU0sJMHgwMDFmCisKKyNkZWZpbmUgUEhZQ1RMX1RPX0JBVUQoYndwKQkoKChid3ApJlBIWUNUTF9CQVVEX01BU0spPj5QSFlDVExfQkFVRF9TSElGVCkKKyNkZWZpbmUgUEhZQ1RMX1RPX1BMU1dJRChid3ApCSgoKGJ3cCkmUEhZQ1RMX1BMU1dJRF9NQVNLKT4+UEhZQ1RMX1BMU1dJRF9TSElGVCkKKyNkZWZpbmUgUEhZQ1RMX1RPX1BSRUFNQihid3ApCSgoKGJ3cCkmUEhZQ1RMX1BSRUFNQl9NQVNLKT4+UEhZQ1RMX1BSRUFNQl9TSElGVCkKKworI2RlZmluZSBCV1BfVE9fUEhZQ1RMKGIsdyxwKQkoKCgoYik8PFBIWUNUTF9CQVVEX1NISUZUKSZQSFlDVExfQkFVRF9NQVNLKSBcCisJCQkJIHwgKCgodyk8PFBIWUNUTF9QTFNXSURfU0hJRlQpJlBIWUNUTF9QTFNXSURfTUFTSykgXAorCQkJCSB8ICgoKHApPDxQSFlDVExfUFJFQU1CX1NISUZUKSZQSFlDVExfUFJFQU1CX01BU0spKQorCisjZGVmaW5lIEJBVURfQklUUyhicikJCSgoMTE1MjAwLyhicikpLTEpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK2NhbGNfd2lkdGhfYml0cyh1bnNpZ25lZCBiYXVkcmF0ZSwgdW5zaWduZWQgd2lkdGhzZWxlY3QsIHVuc2lnbmVkIGNsb2Nrc2VsZWN0KQoreworCXVuc2lnbmVkCXRtcDsKKworCWlmICh3aWR0aHNlbGVjdCkJLyogbm9taW5hbCAzLzE2IHB1bHMgd2lkdGggKi8KKwkJcmV0dXJuIChjbG9ja3NlbGVjdCkgPyAxMiA6IDI0OworCisJdG1wID0gKChjbG9ja3NlbGVjdCkgPyAxMiA6IDI0KSAvIChCQVVEX0JJVFMoYmF1ZHJhdGUpKzEpOworCisJLyogaW50ZXJtZWRpYXRlIHJlc3VsdCBvZiBpbnRlZ2VyIGRpdmlzaW9uIG5lZWRlZCBoZXJlICovCisKKwlyZXR1cm4gKHRtcD4wKSA/ICh0bXAtMSkgOiAwOworfQorCisjZGVmaW5lIFBIWUNUTF9TSVIoYnIsd3MsY3MpCUJXUF9UT19QSFlDVEwoQkFVRF9CSVRTKGJyKSxjYWxjX3dpZHRoX2JpdHMoKGJyKSwod3MpLChjcykpLDApCisjZGVmaW5lIFBIWUNUTF9NSVIoY3MpCQlCV1BfVE9fUEhZQ1RMKDAsKChjcyk/OToxMCksMSkKKyNkZWZpbmUgUEhZQ1RMX0ZJUgkJQldQX1RPX1BIWUNUTCgwLDAsMTUpCisKKy8qIHF1aXRlIHVnbHksIEkga25vdy4gQnV0IGltcGxlbWVudGluZyB0aGVzZSBjYWxjdWxhdGlvbnMgaGVyZSBhdm9pZHMKKyAqIGhhdmluZyBtYWdpYyBudW1iZXJzIGluIHRoZSBjb2RlIGFuZCBhbGxvd3Mgc29tZSBwbGF5aW5nIHdpdGggcHVsc2V3aWR0aHMKKyAqIHdpdGhvdXQgcmlzayB0byB2aW9sYXRlIHRoZSBzdGFuZGFyZHMuCisgKiBGV0lXLCBoZXJlIGlzIHRoZSB0YWJsZSBmb3IgcmVmZXJlbmNlOgorICoKKyAqIGJhdWRyYXRlCUJBVUQJbWluLVBMU1dJRAlub20tUExTV0lECVBSRUFNQgorICogICAgIDI0MDAJICA0NwkgICAwKDApCQkgICAxMigyNCkJICAgMAorICogICAgIDk2MDAJICAxMQkgICAwKDApCQkgICAxMigyNCkJICAgMAorICogICAgMTkyMDAJICAgNQkgICAxKDIpCQkgICAxMigyNCkJICAgMAorICogICAgMzg0MDAJICAgMgkgICAzKDYpCSAgICAgICAgICAgMTIoMjQpCSAgIDAKKyAqICAgIDU3NjAwCSAgIDEJICAgNSgxMCkJICAgMTIoMjQpCSAgIDAKKyAqICAgMTE1MjAwCSAgIDAJICAxMSgyMikJICAgMTIoMjQpCSAgIDAKKyAqCU1JUgkgICAwCSAgICAtCQkgICAgOSgxMCkJICAgMQorICoJRklSCSAgIDAgICAgICAgIC0gICAgICAgICAgICAgICAwCQkgIDE1CisgKgorICogbm90ZTogeCh5KSBtZWFucyB4LXZhbHVlIGZvciA0ME1IeiAvIHktdmFsdWUgZm9yIDQ4TUh6IHByaW1hcnkgaW5wdXQgY2xvY2sKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiBWTFNJX1BJT19NQVhQS1Q6IE1heGltdW0gUGFja2V0IExlbmd0aCByZWdpc3RlciAodTE2LCBydykgKi8KKworLyogbWF4aW11bSBhY2NlcHRhYmxlIGxlbmd0aCBmb3IgcmVjZWl2ZWQgcGFja2V0cyAqLworCisvKiBodyBpbXBvc2VkIGxpbWl0YXRpb24gLSByZWdpc3RlciB1c2VzIG9ubHkgWzExOjBdICovCisjZGVmaW5lIE1BWF9QQUNLRVRfTEVOR1RICTB4MGZmZgorCisvKiBJckxBUCBJLWZpZWxkIChhcHBhcmVudGx5IG5vdCBkZWZpbmVkIGVsc2V3aGVyZSkgKi8KKyNkZWZpbmUgSVJEQV9NVFUJCTIwNDgKKworLyogY29tcGxldGUgcGFja2V0IGNvbnNpc3RzIG9mIEEoMSkrQygxKStJKDw9SVJEQV9NVFUpICovCisjZGVmaW5lIElSTEFQX1NLQl9BTExPQ1NJWkUJKDErMStJUkRBX01UVSkKKworLyogdGhlIGJ1ZmZlcnMgd2UgdXNlIHRvIGV4Y2hhbmdlIGZyYW1lcyB3aXRoIHRoZSBoYXJkd2FyZSBuZWVkIHRvIGJlCisgKiBsYXJnZXIgdGhhbiBJUkxBUF9TS0JfQUxMT0NTSVpFIGJlY2F1c2Ugd2UgbWF5IGhhdmUgdXAgdG8gNCBieXRlcyBGQ1MKKyAqIGFwcGVuZGVkIGFuZCwgaW4gU0lSIG1vZGUsIGEgbG90IG9mIGZyYW1lIHdyYXBwaW5nIGJ5dGVzLiBUaGUgd29yc3QKKyAqIGNhc2UgYXBwZWFycyB0byBiZSBhIFNJUiBwYWNrZXQgd2l0aCBJLXNpemU9PUlSREFfTVRVIGFuZCBhbGwgYnl0ZXMKKyAqIHJlcXVpcmluZyB0byBiZSBlc2NhcGVkIHRvIHByb3ZpZGUgdHJhbnNwYXJlbmN5LiBGdXJ0aGVybW9yZSwgdGhlIHBlZXIKKyAqIG1pZ2h0IGFzayBmb3IgcXVpdGUgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBYQk9GczoKKyAqCXVwIHRvIDExNSs0OCBYQk9GUwkJIDE2MworICoJcmVndWxhciBCT0YJCQkgICAxCisgKglBLWZpZWxkCQkJCSAgIDEKKyAqCUMtZmllbGQJCQkJICAgMQorICoJSS1maWVsZCwgSVJEQV9NVFUsIGFsbCBlc2NhcGVkCTQwOTYKKyAqCUZDUyAoMTYgYml0IGF0IFNJUiwgZXNjYXBlZCkJICAgNAorICoJRU9GCQkJCSAgIDEKKyAqIEFGQUlDUyBub3RoaW5nIGluIElyTEFQIGd1YXJhbnRlZXMgQS9DIGZpZWxkIG5vdCB0byBuZWVkIGVzY2FwaW5nCisgKiAoZi5lLiAweGMwLzB4YzEgLSBpLmUuIEJPRi9FT0YgLSBhcmUgbGVnYWwgdmFsdWVzIHRoZXJlKSBzbyBpbiB0aGUKKyAqIHdvcnN0IGNhc2Ugd2UgaGF2ZSA0MjY5IGJ5dGVzIHRvdGFsIGZyYW1lIHNpemUuCisgKiBIb3dldmVyLCB0aGUgVkxTSSB1c2VzIDEyIGJpdHMgb25seSBmb3IgYWxsIGJ1ZmZlciBsZW5ndGggdmFsdWVzLAorICogd2hpY2ggbGltaXRzIHRoZSBtYXhpbXVtIHVzZWFibGUgYnVmZmVyIHNpemUgPD0gNDA5NS4KKyAqIE5vdGUgdGhpcyBpcyBub3QgYSBsaW1pdGF0aW9uIGluIHRoZSByZWNlaXZlIGNhc2UgYmVjYXVzZSB3ZSB1c2UKKyAqIHRoZSBTSVIgZmlsdGVyaW5nIG1vZGUgd2hlcmUgdGhlIGh3IHVud3JhcHMgdGhlIGZyYW1lIGFuZCBvbmx5IHRoZQorICogYmFyZSBwYWNrZXQrZmNzIGlzIHN0b3JlZCBpbnRvIHRoZSBidWZmZXIgLSBpbiBjb250cmFzdCB0byB0aGUgU0lSCisgKiB0eCBjYXNlIHdoZXJlIHdlIGhhdmUgdG8gcGFzcyBmcmFtZS13cmFwcGVkIHBhY2tldHMgdG8gdGhlIGh3LgorICogSWYgdGhpcyB3b3VsZCBldmVyIGJlY29tZSBhbiBpc3N1ZSBpbiByZWFsIGxpZmUsIHRoZSBvbmx5IHdvcmthcm91bmQKKyAqIEkgc2VlIHdvdWxkIGJlIHVzaW5nIHRoZSBsZWdhY3kgVUFSVCBlbXVsYXRpb24gaW4gU0lSIG1vZGUuCisgKi8KKworI2RlZmluZSBYRkVSX0JVRl9TSVpFCQlNQVhfUEFDS0VUX0xFTkdUSAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fUkNWQkNOVDogUmVjZWl2ZSBCeXRlIENvdW50IFJlZ2lzdGVyICh1MTYsIHJvKSAqLworCisvKiByZWNlaXZlIHBhY2tldCBjb3VudGVyIGdldHMgaW5jcmVtZW50ZWQgb24gZXZlcnkgbm9uLWZpbHRlcmVkCisgKiBieXRlIHdoaWNoIHdhcyBwdXQgaW4gdGhlIHJlY2VpdmUgZmlmbyBhbmQgcmVzZXQgZm9yIGVhY2gKKyAqIG5ldyBwYWNrZXQuIFVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgd2UgYXJlIGp1c3QgaW4gdGhlIG1pZGRsZQorICogb2YgcmVjZWl2aW5nCisgKi8KKworLyogYmV0dGVyIGFwcGx5IHRoZSBbMTE6MF0gbWFzayB3aGVuIHJlYWRpbmcsIGFzIHNvbWUgZG9jcyBzYXkgdGhlCisgKiByZXNlcnZlZCBbMTU6MTJdIHdvdWxkIHJldHVybiAxIHdoZW4gcmVhZGluZyAtIHdoaWNoIGlzIHdyb25nIEFGQUlDUworICovCisjZGVmaW5lIFJDVkJDTlRfTUFTSwkweDBmZmYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGVzY3JpcHRvcnMgZm9yIHJ4L3R4IHJpbmcKKyAqCisgKiBhY2Nlc3NlZCBieSBoYXJkd2FyZSAtIGRvbid0IGNoYW5nZSEKKyAqCisgKiB0aGUgZGVzY3JpcHRvciBpcyBvd25lZCBieSBoYXJkd2FyZSwgd2hlbiB0aGUgQUNUSVZFIHN0YXR1cyBiaXQKKyAqIGlzIHNldCBhbmQgbm90aGluZyAoYmVzaWRlcyByZWFkaW5nIHN0YXR1cyB0byB0ZXN0IHRoZSBiaXQpCisgKiBzaGFsbCBiZSBkb25lLiBUaGUgYml0IGdldHMgY2xlYXJlZCBieSBodywgd2hlbiB0aGUgZGVzY3JpcHRvcgorICogZ2V0cyBjbG9zZWQuIFByZW1hdHVyZSByZWFwaW5nIG9mIGRlc2NyaXB0b3JzIG93bmVkIGJlIHRoZSBjaGlwCisgKiBjYW4gYmUgYWNoaWV2ZWQgYnkgZGlzYWJsaW5nIElSQ0ZHX01TVFIKKyAqCisgKiBBdHRlbnRpb246IFdyaXRpbmcgYWRkciBvdmVyd3JpdGVzIHN0YXR1cyEKKyAqCisgKiAjIyMgRklYTUU6IGRlcGVuZHMgb24gZW5kaWFuZXNzIChidXQgdGhlcmUgYWluJ3Qgbm8gbm9uLWk1ODYgb2I4MDAgOy0pCisgKi8KKworc3RydWN0IHJpbmdfZGVzY3JfaHcgeworCXZvbGF0aWxlIHUxNglyZF9jb3VudDsJLyogdHgvcnggY291bnQgWzExOjBdICovCisJdTE2CQlyZXNlcnZlZDsKKwl1bmlvbiB7CisJCXUzMglhZGRyOwkJLyogWzIzOjBdIG9mIHRoZSBidWZmZXIncyBidXNhZGRyZXNzICovCisJCXN0cnVjdCB7CisJCQl1OAkJYWRkcl9yZXNbM107CisJCQl2b2xhdGlsZSB1OAlzdGF0dXM7CQkvKiBkZXNjcmlwdG9yIHN0YXR1cyAqLworCQl9IHJkX3MgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisJfSByZF91IF9fYXR0cmlidXRlKChwYWNrZWQpKTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIHJkX2FkZHIJCXJkX3UuYWRkcgorI2RlZmluZSByZF9zdGF0dXMJcmRfdS5yZF9zLnN0YXR1cworCisvKiByaW5nIGRlc2NyaXB0b3Igc3RhdHVzIGJpdHMgKi8KKworI2RlZmluZSBSRF9BQ1RJVkUJCTB4ODAJLyogZGVzY3JpcHRvciBvd25lZCBieSBodyAoYm90aCBUWCxSWCkgKi8KKworLyogVFggcmluZyBkZXNjcmlwdG9yIHN0YXR1cyAqLworCisjZGVmaW5lCVJEX1RYX0RJU0NSQwkJMHg0MAkvKiBkbyBub3Qgc2VuZCBDUkMgKGZvciBTSVIpICovCisjZGVmaW5lCVJEX1RYX0JBRENSQwkJMHgyMAkvKiBmb3JjZSBhIGJhZCBDUkMgKi8KKyNkZWZpbmUJUkRfVFhfUFVMU0UJCTB4MTAJLyogc2VuZCBpbmRpY2F0aW9uIHB1bHNlIGFmdGVyIHRoaXMgZnJhbWUgKE1JUi9GSVIpICovCisjZGVmaW5lCVJEX1RYX0ZSQ0VVTkQJCTB4MDgJLyogZm9yY2UgdW5kZXJydW4gKi8KKyNkZWZpbmUJUkRfVFhfQ0xSRU5UWAkJMHgwNAkvKiBjbGVhciBFTlRYIGFmdGVyIHRoaXMgZnJhbWUgKi8KKyNkZWZpbmUJUkRfVFhfVU5EUk4JCTB4MDEJLyogVFggZmlmbyB1bmRlcnJ1biAocHJvYmFibHkgUENJIHByb2JsZW0pICovCisKKy8qIFJYIHJpbmcgZGVzY3JpcHRvciBzdGF0dXMgKi8KKworI2RlZmluZSBSRF9SWF9QSFlFUlIJCTB4NDAJLyogcGh5c2ljYWwgZW5jb2RpbmcgZXJyb3IgKi8KKyNkZWZpbmUgUkRfUlhfQ1JDRVJSCQkweDIwCS8qIENSQyBlcnJvciAoTUlSL0ZJUikgKi8KKyNkZWZpbmUgUkRfUlhfTEVOR1RICQkweDEwCS8qIGZyYW1lIGV4Y2VlZHMgYnVmZmVyIGxlbmd0aCAqLworI2RlZmluZSBSRF9SWF9PVkVSCQkweDA4CS8qIFJYIGZpZm8gb3ZlcnJ1biAocHJvYmFibHkgUENJIHByb2JsZW0pICovCisjZGVmaW5lIFJEX1JYX1NJUkJBRAkJMHgwNAkvKiBFT0YgbWlzc2luZzogQk9GIGZvbGxvd3MgQk9GIChTSVIsIGZpbHRlcmVkKSAqLworCisjZGVmaW5lIFJEX1JYX0VSUk9SCQkweDdjCS8qIGFueSBlcnJvciBpbiByZWNlaXZlZCBmcmFtZSAqLworCisvKiB0aGUgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIDIgZGVzY3JpcHRvciByaW5ncyAqLworI2RlZmluZSBIV19SSU5HX0FSRUFfU0laRQkoMiAqIE1BWF9SSU5HX0RFU0NSICogc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2NyX2h3KSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3ctcmluZyBkZXNjcmlwdG9ycyBjb25zaXN0cyBvZiBhIGJ1cy1tYXBwZWQgdHJhbnNmZXIgYnVmZmVyIHdpdGgKKyAqIGFzc29jaWF0ZWQgc2tiIGFuZCBhIHBvaW50ZXIgdG8gdGhlIGh3IGVudHJ5IGRlc2NyaXB0b3IKKyAqLworCitzdHJ1Y3QgcmluZ19kZXNjciB7CisJc3RydWN0IHJpbmdfZGVzY3JfaHcJKmh3OworCXN0cnVjdCBza19idWZmCQkqc2tiOworCXZvaWQJCQkqYnVmOworfTsKKworLyogd3JhcHBlcnMgZm9yIG9wZXJhdGlvbnMgb24gaHctZXhwb3NlZCByaW5nIGRlc2NyaXB0b3JzCisgKiBhY2Nlc3MgdG8gdGhlIGh3LXBhcnQgb2YgdGhlIGRlc2NyaXB0b3JzIG11c3QgdXNlIHRoZXNlLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHJkX2lzX2FjdGl2ZShzdHJ1Y3QgcmluZ19kZXNjciAqcmQpCit7CisJcmV0dXJuICgocmQtPmh3LT5yZF9zdGF0dXMgJiBSRF9BQ1RJVkUpICE9IDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmRfYWN0aXZhdGUoc3RydWN0IHJpbmdfZGVzY3IgKnJkKQoreworCXJkLT5ody0+cmRfc3RhdHVzIHw9IFJEX0FDVElWRTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJkX3NldF9zdGF0dXMoc3RydWN0IHJpbmdfZGVzY3IgKnJkLCB1OCBzKQoreworCXJkLT5ody0+cmRfc3RhdHVzID0gczsJIC8qIG1heSBwYXNzIG93bmVyc2hpcCB0byB0aGUgaGFyZHdhcmUgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJkX3NldF9hZGRyX3N0YXR1cyhzdHJ1Y3QgcmluZ19kZXNjciAqcmQsIGRtYV9hZGRyX3QgYSwgdTggcykKK3sKKwkvKiBvcmRlciBpcyBpbXBvcnRhbnQgZm9yIHR3byByZWFzb25zOgorCSAqICAtIG92ZXJsYXllZDogd3JpdGluZyBhZGRyIG92ZXJ3cml0ZXMgc3RhdHVzCisJICogIC0gd2Ugd2FudCB0byB3cml0ZSBzdGF0dXMgbGFzdCBzbyB3ZSBoYXZlIHZhbGlkIGFkZHJlc3MgaW4KKwkgKiAgICBjYXNlIHN0YXR1cyBoYXMgUkRfQUNUSVZFIHNldAorCSAqLworCisJaWYgKChhICYgfkRNQV9NQVNLX01TVFJQQUdFKT4+MjQgIT0gTVNUUlBBR0VfVkFMVUUpIHsKKwkJSVJEQV9FUlJPUigiJXM6IHBjaSBidXNhZGRyIGluY29uc2lzdGVuY3khXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkdW1wX3N0YWNrKCk7CisJCXJldHVybjsKKwl9CisKKwlhICY9IERNQV9NQVNLX01TVFJQQUdFOyAgLyogY2xlYXIgaGlnaGJ5dGUgdG8gbWFrZSBzdXJlIHdlIHdvbid0IHdyaXRlCisJCQkJICAqIHRvIHN0YXR1cyAtIGp1c3QgaW4gY2FzZSBNU1RSUEFHRV9WQUxVRSE9MAorCQkJCSAgKi8KKwlyZC0+aHctPnJkX2FkZHIgPSBjcHVfdG9fbGUzMihhKTsKKwl3bWIoKTsKKwlyZF9zZXRfc3RhdHVzKHJkLCBzKTsJIC8qIG1heSBwYXNzIG93bmVyc2hpcCB0byB0aGUgaGFyZHdhcmUgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJkX3NldF9jb3VudChzdHJ1Y3QgcmluZ19kZXNjciAqcmQsIHUxNiBjKQoreworCXJkLT5ody0+cmRfY291bnQgPSBjcHVfdG9fbGUxNihjKTsKK30KKworc3RhdGljIGlubGluZSB1OCByZF9nZXRfc3RhdHVzKHN0cnVjdCByaW5nX2Rlc2NyICpyZCkKK3sKKwlyZXR1cm4gcmQtPmh3LT5yZF9zdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCByZF9nZXRfYWRkcihzdHJ1Y3QgcmluZ19kZXNjciAqcmQpCit7CisJZG1hX2FkZHJfdAlhOworCisJYSA9IGxlMzJfdG9fY3B1KHJkLT5ody0+cmRfYWRkcik7CisJcmV0dXJuIChhICYgRE1BX01BU0tfTVNUUlBBR0UpIHwgKE1TVFJQQUdFX1ZBTFVFIDw8IDI0KTsKK30KKworc3RhdGljIGlubGluZSB1MTYgcmRfZ2V0X2NvdW50KHN0cnVjdCByaW5nX2Rlc2NyICpyZCkKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUocmQtPmh3LT5yZF9jb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHN3IGRlc2NyaXB0b3IgcmluZ3MgZm9yIHJ4LCB0eDoKKyAqCisgKiBvcGVyYXRpb25zIGZvbGxvdyBwcm9kdWNlci1jb25zdW1lciBwYXJhZGlnbSwgd2l0aCB0aGUgaHcKKyAqIGluIHRoZSBtaWRkbGUgZG9pbmcgdGhlIHByb2Nlc3NpbmcuCisgKiByaW5nIHNpemUgbXVzdCBiZSBwb3dlciBvZiB0d28uCisgKgorICogcHJvZHVjZXIgYWR2YW5jZXMgci0+dGFpbCBhZnRlciBpbnNlcnRpbmcgZm9yIHByb2Nlc3NpbmcKKyAqIGNvbnN1bWVyIGFkdmFuY2VzIHItPmhlYWQgYWZ0ZXIgcmVtb3ZpbmcgcHJvY2Vzc2VkIHJkCisgKiByaW5nIGlzIGVtcHR5IGlmIGhlYWQ9PXRhaWwgLyBmdWxsIGlmICh0YWlsKzEpPT1oZWFkCisgKi8KKworc3RydWN0IHZsc2lfcmluZyB7CisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCWludAkJCWRpcjsKKwl1bnNpZ25lZAkJbGVuOworCXVuc2lnbmVkCQlzaXplOworCXVuc2lnbmVkCQltYXNrOworCWF0b21pY190CQloZWFkLCB0YWlsOworCXN0cnVjdCByaW5nX2Rlc2NyCSpyZDsKK307CisKKy8qIHJpbmcgcHJvY2Vzc2luZyBoZWxwZXJzICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJpbmdfZGVzY3IgKnJpbmdfbGFzdChzdHJ1Y3QgdmxzaV9yaW5nICpyKQoreworCWludCB0OworCisJdCA9IGF0b21pY19yZWFkKCZyLT50YWlsKSAmIHItPm1hc2s7CisJcmV0dXJuICgoKHQrMSkgJiByLT5tYXNrKSA9PSAoYXRvbWljX3JlYWQoJnItPmhlYWQpICYgci0+bWFzaykpID8gTlVMTCA6ICZyLT5yZFt0XTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmluZ19kZXNjciAqcmluZ19wdXQoc3RydWN0IHZsc2lfcmluZyAqcikKK3sKKwlhdG9taWNfaW5jKCZyLT50YWlsKTsKKwlyZXR1cm4gcmluZ19sYXN0KHIpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCByaW5nX2Rlc2NyICpyaW5nX2ZpcnN0KHN0cnVjdCB2bHNpX3JpbmcgKnIpCit7CisJaW50IGg7CisKKwloID0gYXRvbWljX3JlYWQoJnItPmhlYWQpICYgci0+bWFzazsKKwlyZXR1cm4gKGggPT0gKGF0b21pY19yZWFkKCZyLT50YWlsKSAmIHItPm1hc2spKSA/IE5VTEwgOiAmci0+cmRbaF07Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJpbmdfZGVzY3IgKnJpbmdfZ2V0KHN0cnVjdCB2bHNpX3JpbmcgKnIpCit7CisJYXRvbWljX2luYygmci0+aGVhZCk7CisJcmV0dXJuIHJpbmdfZmlyc3Qocik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIG91ciBwcml2YXRlIGNvbXBvdW5kIFZMU0ktUENJLUlSREEgZGV2aWNlIGluZm9ybWF0aW9uICovCisKK3R5cGVkZWYgc3RydWN0IHZsc2lfaXJkYV9kZXYgeworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKworCXN0cnVjdCBpcmxhcF9jYgkJKmlybGFwOworCisJc3RydWN0IHFvc19pbmZvCQlxb3M7CisKKwl1bnNpZ25lZAkJbW9kZTsKKwlpbnQJCQliYXVkLCBuZXdfYmF1ZDsKKworCWRtYV9hZGRyX3QJCWJ1c2FkZHI7CisJdm9pZAkJCSp2aXJ0YWRkcjsKKwlzdHJ1Y3QgdmxzaV9yaW5nCSp0eF9yaW5nLCAqcnhfcmluZzsKKworCXN0cnVjdCB0aW1ldmFsCQlsYXN0X3J4OworCisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsKKworCXU4CQkJcmVzdW1lX29rOwkKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2NfZW50cnk7CisKK30gdmxzaV9pcmRhX2Rldl90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHRoZSByZW1hcHBlZCBlcnJvciBmbGFncyB3ZSB1c2UgZm9yIHJldHVybmluZyBmcm9tIGZyYW1lCisgKiBwb3N0LXByb2Nlc3NpbmcgaW4gdmxzaV9wcm9jZXNzX3R4L3J4KCkgYWZ0ZXIgaXQgd2FzIGNvbXBsZXRlZAorICogYnkgdGhlIGhhcmR3YXJlLiBUaGVzZSBmdW5jdGlvbnMgZWl0aGVyIHJldHVybiB0aGUgPj0wIG51bWJlcgorICogb2YgdHJhbnNmZXJlZCBieXRlcyBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgdGhlIG5lZ2F0aXZlICgtKQorICogb2YgdGhlIG9yJ2VkIGVycm9yIGZsYWdzLgorICovCisKKyNkZWZpbmUgVkxTSV9UWF9EUk9QCQkweDAwMDEKKyNkZWZpbmUgVkxTSV9UWF9GSUZPCQkweDAwMDIKKworI2RlZmluZSBWTFNJX1JYX0RST1AJCTB4MDEwMAorI2RlZmluZSBWTFNJX1JYX09WRVIJCTB4MDIwMAorI2RlZmluZSBWTFNJX1JYX0xFTkdUSCAgCTB4MDQwMAorI2RlZmluZSBWTFNJX1JYX0ZSQU1FCQkweDA4MDAKKyNkZWZpbmUgVkxTSV9SWF9DUkMJCTB4MTAwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvKiBJUkRBX1ZMU0lfRklSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZi5oIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDc2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmLmgKQEAgLTAsMCArMSw1MyBAQAorI2lmbmRlZiBXODM5NzdBRl9ICisjZGVmaW5lIFc4Mzk3N0FGX0gKKworI2RlZmluZSBXOTc3X0VGSU9fQkFTRSAweDM3MAorI2RlZmluZSBXOTc3X0VGSU8yX0JBU0UgMHgzZjAKKyNkZWZpbmUgVzk3N19ERVZJQ0VfSVIgMHgwNgorCisKKy8qCisgKiBFbnRlciBleHRlbmRlZCBmdW5jdGlvbiBtb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3OTc3X2VmbV9lbnRlcih1bnNpZ25lZCBpbnQgZWZpbykKK3sKKyAgICAgICAgb3V0YigweDg3LCBlZmlvKTsKKyAgICAgICAgb3V0YigweDg3LCBlZmlvKTsKK30KKworLyoKKyAqIFNlbGVjdCBhIGRldmljZSB0byBjb25maWd1cmUgCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHc5Nzdfc2VsZWN0X2RldmljZShfX3U4IGRldm51bSwgdW5zaWduZWQgaW50IGVmaW8pCit7CisJb3V0YigweDA3LCBlZmlvKTsKKwlvdXRiKGRldm51bSwgZWZpbysxKTsKK30gCisKKy8qIAorICogV3JpdGUgYSBieXRlIHRvIGEgcmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHc5Nzdfd3JpdGVfcmVnKF9fdTggcmVnLCBfX3U4IHZhbHVlLCB1bnNpZ25lZCBpbnQgZWZpbykKK3sKKwlvdXRiKHJlZywgZWZpbyk7CisJb3V0Yih2YWx1ZSwgZWZpbysxKTsKK30KKworLyoKKyAqIHJlYWQgYSBieXRlIGZyb20gYSByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIF9fdTggdzk3N19yZWFkX3JlZyhfX3U4IHJlZywgdW5zaWduZWQgaW50IGVmaW8pCit7CisJb3V0YihyZWcsIGVmaW8pOworCXJldHVybiBpbmIoZWZpbysxKTsKK30KKworLyoKKyAqIEV4aXQgZXh0ZW5kZWQgZnVuY3Rpb24gbW9kZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdzk3N19lZm1fZXhpdCh1bnNpZ25lZCBpbnQgZWZpbykKK3sKKwlvdXRiKDB4QUEsIGVmaW8pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhNjVjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYwpAQCAtMCwwICsxLDEzNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgdzgzOTc3YWZfaXIuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBGSVIgZHJpdmVyIGZvciB0aGUgV2luYm9uZCBXODM5NzdBRiBTdXBlciBJL08gY2hpcAorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgUGF1bCBWYW5kZXJTcGVrCisgKiBDcmVhdGVkIGF0OiAgICBXZWQgTm92ICA0IDExOjQ2OjE2IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBKYW4gMjggMTI6MTA6NTkgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFJlYmVsLmNvbQorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgUGF1bCBWYW5kZXJTcGVrIG5vciBSZWJlbC5jb20gYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlCisgKiAgICAgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJBUy1JUyIKKyAqICAgICBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICogICAgIElmIHlvdSBmaW5kIGJ1Z3MgaW4gdGhpcyBmaWxlLCBpdHMgdmVyeSBsaWtlbHkgdGhhdCB0aGUgc2FtZSBidWcKKyAqICAgICB3aWxsIGFsc28gYmUgaW4gcGM4NzEwOC5jIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbnMgYXJlIHF1aXRlCisgKiAgICAgc2ltaWxhci4KKyAqCisgKiAgICAgTm90aWNlIHRoYXQgYWxsIGZ1bmN0aW9ucyB0aGF0IG5lZWRzIHRvIGFjY2VzcyB0aGUgY2hpcCBpbiBfYW55XworICogICAgIHdheSwgbXVzdCBzYXZlIEJTUiByZWdpc3RlciBvbiBlbnRyeSwgYW5kIHJlc3RvcmUgaXQgb24gZXhpdC4gCisgKiAgICAgSXQgaXMgX3ZlcnlfIGltcG9ydGFudCB0byBmb2xsb3cgdGhpcyBwb2xpY3khCisgKgorICogICAgICAgICBfX3U4IGJhbms7CisgKiAgICAgCisgKiAgICAgICAgIGJhbmsgPSBpbmIoIGlvYmFzZStCU1IpOworICogIAorICogICAgICAgICBkb195b3VyX3N0dWZmX2hlcmUoKTsKKyAqCisgKiAgICAgICAgIG91dGIoIGJhbmssIGlvYmFzZStCU1IpOworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKyNpbmNsdWRlICJ3ODM5NzdhZi5oIgorI2luY2x1ZGUgInc4Mzk3N2FmX2lyLmgiCisKKyNpZmRlZiAgQ09ORklHX0FSQ0hfTkVUV0lOREVSICAgICAgICAgICAgLyogQWRqdXN0IHRvIE5ldFdpbmRlciBkaWZmZXJlbmNlcyAqLworI3VuZGVmICBDT05GSUdfTkVUV0lOREVSX1RYX0RNQV9QUk9CTEVNUyAvKiBOb3QgbmVlZGVkICovCisjZGVmaW5lIENPTkZJR19ORVRXSU5ERVJfUlhfRE1BX1BST0JMRU1TIC8qIE11c3QgaGF2ZSB0aGlzIG9uZSEgKi8KKyNlbmRpZgorI3VuZGVmICBDT05GSUdfVVNFX0lOVEVSTkFMX1RJTUVSICAvKiBKdXN0IGNhbm5vdCBtYWtlIHRoYXQgdGltZXIgd29yayAqLworI2RlZmluZSBDT05GSUdfVVNFX1c5NzdfUE5QICAgICAgICAvKiBDdXJyZW50bHkgbmVlZGVkICovCisjZGVmaW5lIFBJT19NQVhfU1BFRUQgICAgICAgMTE1MjAwIAorCitzdGF0aWMgY2hhciAqZHJpdmVyX25hbWUgPSAidzgzOTc3YWZfaXIiOworc3RhdGljIGludCAgcW9zX210dF9iaXRzID0gMHgwNzsgICAvKiAxIG1zIG9yIG1vcmUgKi8KKworI2RlZmluZSBDSElQX0lPX0VYVEVOVCA4CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW9bXSA9IHsgMHgxODAsIH4wLCB+MCwgfjAgfTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ORVRXSU5ERVIgICAgICAgICAgICAgLyogQWRqdXN0IHRvIE5ldFdpbmRlciBkaWZmZXJlbmNlcyAqLworc3RhdGljIHVuc2lnbmVkIGludCBpcnFbXSA9IHsgNiwgMCwgMCwgMCB9OworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJxW10gPSB7IDExLCAwLCAwLCAwIH07CisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZG1hW10gPSB7IDEsIDAsIDAsIDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZWZiYXNlW10gPSB7IFc5NzdfRUZJT19CQVNFLCBXOTc3X0VGSU8yX0JBU0UgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZWZpbyA9IFc5NzdfRUZJT19CQVNFOworCitzdGF0aWMgc3RydWN0IHc4Mzk3N2FmX2lyICpkZXZfc2VsZltdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKKworLyogU29tZSBwcm90b3R5cGVzICovCitzdGF0aWMgaW50ICB3ODM5NzdhZl9vcGVuKGludCBpLCB1bnNpZ25lZCBpbnQgaW9iYXNlLCB1bnNpZ25lZCBpbnQgaXJxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRtYSk7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9jbG9zZShzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYpOworc3RhdGljIGludCAgdzgzOTc3YWZfcHJvYmUoaW50IGlvYmFzZSwgaW50IGlycSwgaW50IGRtYSk7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9kbWFfcmVjZWl2ZShzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYpOyAKK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZik7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9waW9fd3JpdGUoaW50IGlvYmFzZSwgX191OCAqYnVmLCBpbnQgbGVuLCBpbnQgZmlmb19zaXplKTsKK3N0YXRpYyB2b2lkIHc4Mzk3N2FmX2RtYV93cml0ZShzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYsIGludCBpb2Jhc2UpOworc3RhdGljIHZvaWQgdzgzOTc3YWZfY2hhbmdlX3NwZWVkKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZiwgX191MzIgc3BlZWQpOworc3RhdGljIGludCAgdzgzOTc3YWZfaXNfcmVjZWl2aW5nKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZik7CisKK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgdzgzOTc3YWZfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgdzgzOTc3YWZfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3ODM5NzdhZl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfaW5pdCAoKQorICoKKyAqICAgIEluaXRpYWxpemUgY2hpcC4gSnVzdCB0cnkgdG8gZmluZCBvdXQgaG93IG1hbnkgY2hpcHMgd2UgYXJlIGRlYWxpbmcgd2l0aAorICogICAgYW5kIHdoZXJlIHRoZXkgYXJlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHc4Mzk3N2FmX2luaXQodm9pZCkKK3sKKyAgICAgICAgaW50IGk7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWZvciAoaT0wOyAoaW9baV0gPCAyMDAwKSAmJiAoaSA8IDQpOyBpKyspIHsgCisJCWlmICh3ODM5NzdhZl9vcGVuKGksIGlvW2ldLCBpcnFbaV0sIGRtYVtpXSkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX2NsZWFudXAgKCkKKyAqCisgKiAgICBDbG9zZSBhbGwgY29uZmlndXJlZCBjaGlwcworICoKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHc4Mzk3N2FmX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworICAgICAgICBJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWZvciAoaT0wOyBpIDwgNDsgaSsrKSB7CisJCWlmIChkZXZfc2VsZltpXSkKKwkJCXc4Mzk3N2FmX2Nsb3NlKGRldl9zZWxmW2ldKTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9vcGVuIChpb2Jhc2UsIGlycSkKKyAqCisgKiAgICBPcGVuIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworaW50IHc4Mzk3N2FmX29wZW4oaW50IGksIHVuc2lnbmVkIGludCBpb2Jhc2UsIHVuc2lnbmVkIGludCBpcnEsIAorCQkgIHVuc2lnbmVkIGludCBkbWEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICAgICAgc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmOworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIExvY2sgdGhlIHBvcnQgdGhhdCB3ZSBuZWVkICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIENISVBfSU9fRVhURU5ULCBkcml2ZXJfbmFtZSkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgY2FuJ3QgZ2V0IGlvYmFzZSBvZiAweCUwM3hcbiIsCisJCSAgICAgIF9fRlVOQ1RJT05fXyAsIGlvYmFzZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICh3ODM5NzdhZl9wcm9iZShpb2Jhc2UsIGlycSwgZG1hKSA9PSAtMSkgeworCQllcnIgPSAtMTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKgorCSAqICBBbGxvY2F0ZSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGRyaXZlcgorCSAqLworCWRldiA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKHN0cnVjdCB3ODM5NzdhZl9pcikpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoIEtFUk5fRVJSICJJckRBOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCSJJckRBIGNvbnRyb2wgYmxvY2shXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXNlbGYgPSBkZXYtPnByaXY7CisJc3Bpbl9sb2NrX2luaXQoJnNlbGYtPmxvY2spOworICAgCisKKwkvKiBJbml0aWFsaXplIElPICovCisJc2VsZi0+aW8uZmlyX2Jhc2UgICA9IGlvYmFzZTsKKyAgICAgICAgc2VsZi0+aW8uaXJxICAgICAgID0gaXJxOworICAgICAgICBzZWxmLT5pby5maXJfZXh0ICAgPSBDSElQX0lPX0VYVEVOVDsKKyAgICAgICAgc2VsZi0+aW8uZG1hICAgICAgID0gZG1hOworICAgICAgICBzZWxmLT5pby5maWZvX3NpemUgPSAzMjsKKworCS8qIEluaXRpYWxpemUgUW9TIGZvciB0aGlzIGRldmljZSAqLworCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnNlbGYtPnFvcyk7CisJCisJLyogVGhlIG9ubHkgdmFsdWUgd2UgbXVzdCBvdmVycmlkZSBpdCB0aGUgYmF1ZHJhdGUgKi8KKworCS8qIEZJWE1FOiBUaGUgSFAgSERMUy0xMTAwIGRvZXMgbm90IHN1cHBvcnQgMTE1MjAwMCEgKi8KKwlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfAorCQlJUl8xMTUyMDB8SVJfNTc2MDAwfElSXzExNTIwMDB8KElSXzQwMDAwMDAgPDwgOCk7CisKKwkvKiBUaGUgSFAgSERMUy0xMTAwIG5lZWRzIDEgbXMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjcyAqLworCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSBxb3NfbXR0X2JpdHM7CisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmc2VsZi0+cW9zKTsKKwkKKwkvKiBNYXggRE1BIGJ1ZmZlciBzaXplIG5lZWRlZCA9IChkYXRhX3NpemUgKyA2KSAqICh3aW5kb3dfc2l6ZSkgKyA2OyAqLworCXNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgPSAxNDM4NDsgCisJc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSA9IDQwMDA7CisJCisJLyogQWxsb2NhdGUgbWVtb3J5IGlmIG5lZWRlZCAqLworCXNlbGYtPnJ4X2J1ZmYuaGVhZCA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgICZzZWxmLT5yeF9idWZmX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlbGYtPnJ4X2J1ZmYuaGVhZCA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDE7CisJfQorCisJbWVtc2V0KHNlbGYtPnJ4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSk7CisJCisJc2VsZi0+dHhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnR4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisJbWVtc2V0KHNlbGYtPnR4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisKKwlzZWxmLT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJc2VsZi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKwlzZWxmLT5uZXRkZXYgPSBkZXY7CisKKwkvKiBLZWVwIHRyYWNrIG9mIG1vZHVsZSB1c2FnZSAqLworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIE92ZXJyaWRlIHRoZSBuZXR3b3JrIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIHVzZSAqLworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdzgzOTc3YWZfaGFyZF94bWl0OworCWRldi0+b3BlbiAgICAgICAgICAgID0gdzgzOTc3YWZfbmV0X29wZW47CisJZGV2LT5zdG9wICAgICAgICAgICAgPSB3ODM5NzdhZl9uZXRfY2xvc2U7CisJZGV2LT5kb19pb2N0bCAgICAgICAgPSB3ODM5NzdhZl9uZXRfaW9jdGw7CisJZGV2LT5nZXRfc3RhdHMJICAgICA9IHc4Mzk3N2FmX25ldF9nZXRfc3RhdHM7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCUlSREFfRVJST1IoIiVzKCksIHJlZ2lzdGVyX25ldGRldmljZSgpIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXJyX291dDM7CisJfQorCUlSREFfTUVTU0FHRSgiSXJEQTogUmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsIGRldi0+bmFtZSk7CisKKwkvKiBOZWVkIHRvIHN0b3JlIHNlbGYgc29tZXdoZXJlICovCisJZGV2X3NlbGZbaV0gPSBzZWxmOworCQorCXJldHVybiAwOworZXJyX291dDM6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCSAgc2VsZi0+dHhfYnVmZi5oZWFkLCBzZWxmLT50eF9idWZmX2RtYSk7CitlcnJfb3V0MjoJCisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CitlcnJfb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIENISVBfSU9fRVhURU5UKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfY2xvc2UgKHNlbGYpCisgKgorICogICAgQ2xvc2UgZHJpdmVyIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgaW50IHc4Mzk3N2FmX2Nsb3NlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKyAgICAgICAgaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKyNpZmRlZiBDT05GSUdfVVNFX1c5NzdfUE5QCisJLyogZW50ZXIgUG5QIGNvbmZpZ3VyYXRpb24gbW9kZSAqLworCXc5NzdfZWZtX2VudGVyKGVmaW8pOworCisJdzk3N19zZWxlY3RfZGV2aWNlKFc5NzdfREVWSUNFX0lSLCBlZmlvKTsKKworCS8qIERlYWN0aXZhdGUgZGV2aWNlICovCisJdzk3N193cml0ZV9yZWcoMHgzMCwgMHgwMCwgZWZpbyk7CisKKwl3OTc3X2VmbV9leGl0KGVmaW8pOworI2VuZGlmIC8qIENPTkZJR19VU0VfVzk3N19QTlAgKi8KKworCS8qIFJlbW92ZSBuZXRkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCisJLyogUmVsZWFzZSB0aGUgUE9SVCB0aGF0IHRoaXMgZHJpdmVyIGlzIHVzaW5nICovCisJSVJEQV9ERUJVRygwICwgIiVzKCksIFJlbGVhc2luZyBSZWdpb24gJTAzeFxuIiwgCisJICAgICAgX19GVU5DVElPTl9fICwgc2VsZi0+aW8uZmlyX2Jhc2UpOworCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKworCWlmIChzZWxmLT50eF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKwkKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkKQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CisKKwlmcmVlX25ldGRldihzZWxmLT5uZXRkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB3ODM5NzdhZl9wcm9iZSggaW50IGlvYmFzZSwgaW50IGlycSwgaW50IGRtYSkKK3sKKyAgCWludCB2ZXJzaW9uOworCWludCBpOworICAJCisgCWZvciAoaT0wOyBpIDwgMjsgaSsrKSB7CisgCQlJUkRBX0RFQlVHKCAwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisjaWZkZWYgQ09ORklHX1VTRV9XOTc3X1BOUAorIAkJLyogRW50ZXIgUG5QIGNvbmZpZ3VyYXRpb24gbW9kZSAqLworCQl3OTc3X2VmbV9lbnRlcihlZmJhc2VbaV0pOworICAKKyAJCXc5Nzdfc2VsZWN0X2RldmljZShXOTc3X0RFVklDRV9JUiwgZWZiYXNlW2ldKTsKKyAgCisgCQkvKiBDb25maWd1cmUgUG5QIHBvcnQsIElSUSwgYW5kIERNQSBjaGFubmVsICovCisgCQl3OTc3X3dyaXRlX3JlZygweDYwLCAoaW9iYXNlID4+IDgpICYgMHhmZiwgZWZiYXNlW2ldKTsKKyAJCXc5Nzdfd3JpdGVfcmVnKDB4NjEsIChpb2Jhc2UpICYgMHhmZiwgZWZiYXNlW2ldKTsKKyAgCisgCQl3OTc3X3dyaXRlX3JlZygweDcwLCBpcnEsIGVmYmFzZVtpXSk7CisjaWZkZWYgQ09ORklHX0FSQ0hfTkVUV0lOREVSCisJCS8qIE5ldHdpbmRlciB1c2VzIDEgaGlnaGVyIHRoYW4gTGludXggKi8KKyAJCXc5Nzdfd3JpdGVfcmVnKDB4NzQsIGRtYSsxLCBlZmJhc2VbaV0pOworI2Vsc2UKKyAJCXc5Nzdfd3JpdGVfcmVnKDB4NzQsIGRtYSwgZWZiYXNlW2ldKTsgICAKKyNlbmRpZiAvKkNPTkZJR19BUkNIX05FVFdJTkRFUiAqLworIAkJdzk3N193cml0ZV9yZWcoMHg3NSwgMHgwNCwgZWZiYXNlW2ldKTsgIC8qIERpc2FibGUgVHggRE1BICovCisgIAkKKyAJCS8qIFNldCBhcHBlbmQgaGFyZHdhcmUgQ1JDLCBlbmFibGUgSVIgYmFuayBzZWxlY3Rpb24gKi8JCisgCQl3OTc3X3dyaXRlX3JlZygweGYwLCBBUEVEQ1JDfEVOQk5LU0VMLCBlZmJhc2VbaV0pOworICAKKyAJCS8qIEFjdGl2YXRlIGRldmljZSAqLworIAkJdzk3N193cml0ZV9yZWcoMHgzMCwgMHgwMSwgZWZiYXNlW2ldKTsKKyAgCisgCQl3OTc3X2VmbV9leGl0KGVmYmFzZVtpXSk7CisjZW5kaWYgLyogQ09ORklHX1VTRV9XOTc3X1BOUCAqLworICAJCS8qIERpc2FibGUgQWR2YW5jZWQgbW9kZSAqLworICAJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMik7CisgIAkJb3V0Yihpb2Jhc2UrMiwgMHgwMCk7ICAKKyAKKyAJCS8qIFR1cm4gb24gVUFSVCAoZ2xvYmFsKSBpbnRlcnJ1cHRzICovCisgCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworICAJCW91dGIoSENSX0VOX0lSUSwgaW9iYXNlK0hDUik7CisgIAkKKyAgCQkvKiBTd2l0Y2ggdG8gYWR2YW5jZWQgbW9kZSAqLworICAJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMik7CisgIAkJb3V0YihpbmIoaW9iYXNlK0FEQ1IxKSB8IEFEQ1IxX0FEVl9TTCwgaW9iYXNlK0FEQ1IxKTsKKyAgCisgIAkJLyogU2V0IGRlZmF1bHQgSVItbW9kZSAqLworICAJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisgIAkJb3V0YihIQ1JfU0lSLCBpb2Jhc2UrSENSKTsKKyAgCisgIAkJLyogUmVhZCB0aGUgQWR2YW5jZWQgSVIgSUQgKi8KKyAgCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDMpOworICAJCXZlcnNpb24gPSBpbmIoaW9iYXNlK0FVSUQpOworICAJCisgIAkJLyogU2hvdWxkIGJlIDB4MT8gKi8KKyAgCQlpZiAoMHgxMCA9PSAodmVyc2lvbiAmIDB4ZjApKSB7CisgCQkJZWZpbyA9IGVmYmFzZVtpXTsKKyAKKyAJCQkvKiBTZXQgRklGTyBzaXplIHRvIDMyICovCisgCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQyKTsKKyAJCQlvdXRiKEFEQ1IyX1JYRlMzMnxBRENSMl9UWEZTMzIsIGlvYmFzZStBRENSMik7CQorIAkKKyAJCQkvKiBTZXQgRklGTyB0aHJlc2hvbGQgdG8gVFgxNywgUlgxNiAqLworIAkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CQorIAkJCW91dGIoVUZSX1JYVEx8VUZSX1RYVEx8VUZSX1RYRl9SU1R8VUZSX1JYRl9SU1R8CisJCQkgICAgIFVGUl9FTl9GSUZPLGlvYmFzZStVRlIpOworIAorIAkJCS8qIFJlY2VpdmVyIGZyYW1lIGxlbmd0aCAqLworIAkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUNCk7CisJCQlvdXRiKDIwNDggJiAweGZmLCBpb2Jhc2UrNik7CisJCQlvdXRiKCgyMDQ4ID4+IDgpICYgMHgxZiwgaW9iYXNlKzcpOworCisJCQkvKiAKKwkJCSAqIEluaXQgSFAgSFNETC0xMTAwIHRyYW5zY2VpdmVyLiAKKwkJCSAqIAorCQkJICogU2V0IElSWF9NU0wgc2luY2Ugd2UgaGF2ZSAyICogcmVjZWl2ZSBwYXRocyBJUlJYLCAKKwkJCSAqIGFuZCBJUlJYSC4gQ2xlYXIgSVJTTDBEIHNpbmNlIHdlIHdhbnQgSVJTTDAgKiB0byAKKwkJCSAqIGJlIGEgaW5wdXQgcGluIHVzZWQgZm9yIElSUlhIIAorCQkJICoKKwkJCSAqICAgSVJSWCAgcGluIDM3IGNvbm5lY3RlZCB0byByZWNlaXZlciAKKwkJCSAqICAgSVJUWCAgcGluIDM4IGNvbm5lY3RlZCB0byB0cmFuc21pdHRlcgorCQkJICogICBGSVJSWCBwaW4gMzkgY29ubmVjdGVkIHRvIHJlY2VpdmVyICAgICAgKElSU0wwKSAKKwkJCSAqICAgQ0lSUlggcGluIDQwIGNvbm5lY3RlZCB0byBwaW4gMzcKKwkJCSAqLworCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQ3KTsKKwkJCW91dGIoMHg0MCwgaW9iYXNlKzcpOworCQkJCisJCQlJUkRBX01FU1NBR0UoIlc4Mzk3N0FGIChJUikgZHJpdmVyIGxvYWRlZC4gIgorCQkJCSAgICAgIlZlcnNpb246IDB4JTAyeFxuIiwgdmVyc2lvbik7CisJCQkKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJLyogVHJ5IG5leHQgZXh0ZW50ZWQgZnVuY3Rpb24gcmVnaXN0ZXIgYWRkcmVzcyAqLworCQkJSVJEQV9ERUJVRyggMCwgIiVzKCksIFdyb25nIGNoaXAgdmVyc2lvbiIsIF9fRlVOQ1RJT05fXyApOworCQl9CisgIAl9ICAgCQorCXJldHVybiAtMTsKK30KKwordm9pZCB3ODM5NzdhZl9jaGFuZ2Vfc3BlZWQoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmLCBfX3UzMiBzcGVlZCkKK3sKKwlpbnQgaXJfbW9kZSA9IEhDUl9TSVI7CisJaW50IGlvYmFzZTsgCisJX191OCBzZXQ7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCS8qIFVwZGF0ZSBhY2NvdW50aW5nIGZvciBuZXcgc3BlZWQgKi8KKwlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoMCwgaW9iYXNlK0lDUik7CisKKwkvKiBTZWxlY3QgU2V0IDIgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDIpOworCW91dGIoMHgwMCwgaW9iYXNlK0FCSEwpOworCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgOTYwMDogICBvdXRiKDB4MGMsIGlvYmFzZStBQkxMKTsgYnJlYWs7CisJY2FzZSAxOTIwMDogIG91dGIoMHgwNiwgaW9iYXNlK0FCTEwpOyBicmVhazsKKwljYXNlIDM4NDAwOiAgb3V0YigweDAzLCBpb2Jhc2UrQUJMTCk7IGJyZWFrOworCWNhc2UgNTc2MDA6ICBvdXRiKDB4MDIsIGlvYmFzZStBQkxMKTsgYnJlYWs7CisJY2FzZSAxMTUyMDA6IG91dGIoMHgwMSwgaW9iYXNlK0FCTEwpOyBicmVhazsKKwljYXNlIDU3NjAwMDoKKwkJaXJfbW9kZSA9IEhDUl9NSVJfNTc2OworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDU3NjAwMFxuIiwgX19GVU5DVElPTl9fICk7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwMDoKKwkJaXJfbW9kZSA9IEhDUl9NSVJfMTE1MjsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaGFuZGxpbmcgYmF1ZCBvZiAxMTUyMDAwXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJY2FzZSA0MDAwMDAwOgorCQlpcl9tb2RlID0gSENSX0ZJUjsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaGFuZGxpbmcgYmF1ZCBvZiA0MDAwMDAwXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaXJfbW9kZSA9IEhDUl9GSVI7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHVua25vd24gYmF1ZCByYXRlIG9mICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBzcGVlZCk7CisJCWJyZWFrOworCX0KKworCS8qIFNldCBzcGVlZCBtb2RlICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlvdXRiKGlyX21vZGUsIGlvYmFzZStIQ1IpOworCisJLyogc2V0IEZJRk8gc2l6ZSB0byAzMiAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMik7CisJb3V0YihBRENSMl9SWEZTMzJ8QURDUjJfVFhGUzMyLCBpb2Jhc2UrQURDUjIpOwkKKwkKKwkvKiBzZXQgRklGTyB0aHJlc2hvbGQgdG8gVFgxNywgUlgxNiAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisJb3V0YigweDAwLCBpb2Jhc2UrVUZSKTsgICAgICAgIC8qIFJlc2V0ICovCisJb3V0YihVRlJfRU5fRklGTywgaW9iYXNlK1VGUik7IC8qIEZpcnN0IHdlIG11c3QgZW5hYmxlIEZJRk8gKi8KKwlvdXRiKDB4YTcsIGlvYmFzZStVRlIpOworCisJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQkKKwkvKiBFbmFibGUgc29tZSBpbnRlcnJ1cHRzIHNvIHdlIGNhbiByZWNlaXZlIGZyYW1lcyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisJaWYgKHNwZWVkID4gUElPX01BWF9TUEVFRCkgeworCQlvdXRiKElDUl9FRlNGSSwgaW9iYXNlK0lDUik7CisJCXc4Mzk3N2FmX2RtYV9yZWNlaXZlKHNlbGYpOworCX0gZWxzZQorCQlvdXRiKElDUl9FUkJSSSwgaW9iYXNlK0lDUik7CisgICAgCQorCS8qIFJlc3RvcmUgU1NSICovCisJb3V0YihzZXQsIGlvYmFzZStTU1IpOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfaGFyZF94bWl0IChza2IsIGRldikKKyAqCisgKiAgICBTZXRzIHVwIGEgRE1BIHRyYW5zZmVyIHRvIHNlbmQgdGhlIGN1cnJlbnQgZnJhbWUuCisgKgorICovCitpbnQgdzgzOTc3YWZfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmOworCV9fczMyIHNwZWVkOworCWludCBpb2Jhc2U7CisJX191OCBzZXQ7CisJaW50IG10dDsKKwkKKwlzZWxmID0gKHN0cnVjdCB3ODM5NzdhZl9pciAqKSBkZXYtPnByaXY7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCUlSREFfREVCVUcoNCwgIiVzKCVsZCksIHNrYi0+bGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCBqaWZmaWVzLCAKKwkJICAgKGludCkgc2tiLT5sZW4pOworCQorCS8qIExvY2sgdHJhbnNtaXQgYnVmZmVyICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lICovCisJCWlmICghc2tiLT5sZW4pIHsKKwkJCXc4Mzk3N2FmX2NoYW5nZV9zcGVlZChzZWxmLCBzcGVlZCk7IAorCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwl9CisKKwkvKiBTYXZlIGN1cnJlbnQgc2V0ICovCisJc2V0ID0gaW5iKGlvYmFzZStTU1IpOworCQorCS8qIERlY2lkZSBpZiB3ZSBzaG91bGQgdXNlIFBJTyBvciBETUEgdHJhbnNmZXIgKi8KKwlpZiAoc2VsZi0+aW8uc3BlZWQgPiBQSU9fTUFYX1NQRUVEKSB7CisJCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwkJbWVtY3B5KHNlbGYtPnR4X2J1ZmYuZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXNlbGYtPnR4X2J1ZmYubGVuID0gc2tiLT5sZW47CisJCQorCQltdHQgPSBpcmRhX2dldF9tdHQoc2tiKTsKKyNpZmRlZiBDT05GSUdfVVNFX0lOVEVSTkFMX1RJTUVSCisJICAgICAgICBpZiAobXR0ID4gNTApIHsKKwkJCS8qIEFkanVzdCBmb3IgdGltZXIgcmVzb2x1dGlvbiAqLworCQkJbXR0IC89IDEwMDArMTsKKworCQkJLyogU2V0dXAgdGltZXIgKi8KKwkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUNCk7CisJCQlvdXRiKG10dCAmIDB4ZmYsIGlvYmFzZStUTVJMKTsKKwkJCW91dGIoKG10dCA+PiA4KSAmIDB4MGYsIGlvYmFzZStUTVJIKTsKKwkJCQorCQkJLyogU3RhcnQgdGltZXIgKi8KKwkJCW91dGIoSVJfTVNMX0VOX1RNUiwgaW9iYXNlK0lSX01TTCk7CisJCQlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19YTUlUOworCQkJCisJCQkvKiBFbmFibGUgdGltZXIgaW50ZXJydXB0ICovCisJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCQkJb3V0YihJQ1JfRVRNUkksIGlvYmFzZStJQ1IpOworCQl9IGVsc2UgeworI2VuZGlmCisJCQlJUkRBX0RFQlVHKDQsICIlcyglbGQpLCBtdHQ9JWRcbiIsIF9fRlVOQ1RJT05fXyAsIGppZmZpZXMsIG10dCk7CisJCQlpZiAobXR0KQorCQkJCXVkZWxheShtdHQpOworCisJCQkvKiBFbmFibGUgRE1BIGludGVycnVwdCAqLworCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwkgCQlvdXRiKElDUl9FRE1BSSwgaW9iYXNlK0lDUik7CisJICAgICAJCXc4Mzk3N2FmX2RtYV93cml0ZShzZWxmLCBpb2Jhc2UpOworI2lmZGVmIENPTkZJR19VU0VfSU5URVJOQUxfVElNRVIKKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKwkJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCQlzZWxmLT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLCAKKwkJCQkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOworCQkKKwkJLyogQWRkIGludGVycnVwdCBvbiB0eCBsb3cgbGV2ZWwgKHdpbGwgZmlyZSBpbW1lZGlhdGVseSkgKi8KKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwkJb3V0YihJQ1JfRVRYVEhJLCBpb2Jhc2UrSUNSKTsKKwl9CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJLyogUmVzdG9yZSBzZXQgcmVnaXN0ZXIgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX2RtYV93cml0ZSAoc2VsZiwgaW9iYXNlKQorICoKKyAqICAgIFNlbmQgZnJhbWUgdXNpbmcgRE1BCisgKgorICovCitzdGF0aWMgdm9pZCB3ODM5NzdhZl9kbWFfd3JpdGUoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmLCBpbnQgaW9iYXNlKQoreworCV9fdTggc2V0OworI2lmZGVmIENPTkZJR19ORVRXSU5ERVJfVFhfRE1BX1BST0JMRU1TCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX3U4IGhjcjsKKyNlbmRpZgorICAgICAgICBJUkRBX0RFQlVHKDQsICIlcygpLCBsZW49JWRcbiIsIF9fRlVOQ1RJT05fXyAsIHNlbGYtPnR4X2J1ZmYubGVuKTsKKworCS8qIFNhdmUgY3VycmVudCBzZXQgKi8KKwlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisKKwkvKiBEaXNhYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisJb3V0YihpbmIoaW9iYXNlK0hDUikgJiB+SENSX0VOX0RNQSwgaW9iYXNlK0hDUik7CisKKwkvKiBDaG9vc2UgdHJhbnNtaXQgRE1BIGNoYW5uZWwgICovIAorCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMik7CisJb3V0YihBRENSMV9EX0NIU1d8LypBRENSMV9ETUFfRnwqL0FEQ1IxX0FEVl9TTCwgaW9iYXNlK0FEQ1IxKTsKKyNpZmRlZiBDT05GSUdfTkVUV0lOREVSX1RYX0RNQV9QUk9CTEVNUworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwlkaXNhYmxlX2RtYShzZWxmLT5pby5kbWEpOworCWNsZWFyX2RtYV9mZihzZWxmLT5pby5kbWEpOworCXNldF9kbWFfbW9kZShzZWxmLT5pby5kbWEsIERNQV9NT0RFX1JFQUQpOworCXNldF9kbWFfYWRkcihzZWxmLT5pby5kbWEsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKwlzZXRfZG1hX2NvdW50KHNlbGYtPmlvLmRtYSwgc2VsZi0+dHhfYnVmZi5sZW4pOworI2Vsc2UKKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIHNlbGYtPnR4X2J1ZmZfZG1hLCBzZWxmLT50eF9idWZmLmxlbiwKKwkJICAgICAgIERNQV9NT0RFX1dSSVRFKTsJCisjZW5kaWYKKwlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19YTUlUOworCQorCS8qIEVuYWJsZSBETUEgKi8KKyAJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKyNpZmRlZiBDT05GSUdfTkVUV0lOREVSX1RYX0RNQV9QUk9CTEVNUworCWhjciA9IGluYihpb2Jhc2UrSENSKTsKKwlvdXRiKGhjciB8IEhDUl9FTl9ETUEsIGlvYmFzZStIQ1IpOworCWVuYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisjZWxzZQkKKwlvdXRiKGluYihpb2Jhc2UrSENSKSB8IEhDUl9FTl9ETUEgfCBIQ1JfVFhfV1QsIGlvYmFzZStIQ1IpOworI2VuZGlmCisKKwkvKiBSZXN0b3JlIHNldCByZWdpc3RlciAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX3Bpb193cml0ZSAoaW9iYXNlLCBidWYsIGxlbiwgZmlmb19zaXplKQorICoKKyAqICAgIAorICoKKyAqLworc3RhdGljIGludCB3ODM5NzdhZl9waW9fd3JpdGUoaW50IGlvYmFzZSwgX191OCAqYnVmLCBpbnQgbGVuLCBpbnQgZmlmb19zaXplKQoreworCWludCBhY3R1YWwgPSAwOworCV9fdTggc2V0OworCQorCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCWlmICghKGluYl9wKGlvYmFzZStVU1IpICYgVVNSX1RTUkUpKSB7CisJCUlSREFfREVCVUcoNCwKKwkJCSAgICIlcygpLCB3YXJuaW5nLCBGSUZPIG5vdCBlbXB0eSB5ZXQhXG4iLCBfX0ZVTkNUSU9OX18gICk7CisKKwkJZmlmb19zaXplIC09IDE3OworCQlJUkRBX0RFQlVHKDQsICIlcygpLCAlZCBieXRlcyBsZWZ0IGluIHR4IGZpZm9cbiIsIAorCQkJICAgX19GVU5DVElPTl9fICwgZmlmb19zaXplKTsKKwl9CisKKwkvKiBGaWxsIEZJRk8gd2l0aCBjdXJyZW50IGZyYW1lICovCisJd2hpbGUgKChmaWZvX3NpemUtLSA+IDApICYmIChhY3R1YWwgPCBsZW4pKSB7CisJCS8qIFRyYW5zbWl0IG5leHQgYnl0ZSAqLworCQlvdXRiKGJ1ZlthY3R1YWwrK10sIGlvYmFzZStUQlIpOworCX0KKyAgICAgICAgCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZmlmb19zaXplICVkIDsgJWQgc2VudCBvZiAlZFxuIiwgCisJCSAgIF9fRlVOQ1RJT05fXyAsIGZpZm9fc2l6ZSwgYWN0dWFsLCBsZW4pOworCisJLyogUmVzdG9yZSBiYW5rICovCisJb3V0YihzZXQsIGlvYmFzZStTU1IpOworCisJcmV0dXJuIGFjdHVhbDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX2RtYV94bWl0X2NvbXBsZXRlIChzZWxmKQorICoKKyAqICAgIFRoZSB0cmFuc2ZlciBvZiBhIGZyYW1lIGluIGZpbmlzaGVkLiBTbyBkbyB0aGUgbmVjZXNzYXJ5IHRoaW5ncworICoKKyAqICAgIAorICovCitzdGF0aWMgdm9pZCB3ODM5NzdhZl9kbWFfeG1pdF9jb21wbGV0ZShzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKwlfX3U4IHNldDsKKworCUlSREFfREVCVUcoNCwgIiVzKCVsZClcbiIsIF9fRlVOQ1RJT05fXyAsIGppZmZpZXMpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogU2F2ZSBjdXJyZW50IHNldCAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKworCS8qIERpc2FibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlvdXRiKGluYihpb2Jhc2UrSENSKSAmIH5IQ1JfRU5fRE1BLCBpb2Jhc2UrSENSKTsKKwkKKwkvKiBDaGVjayBmb3IgdW5kZXJycnVuISAqLworCWlmIChpbmIoaW9iYXNlK0FVRFIpICYgQVVEUl9VTkRSKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIFRyYW5zbWl0IHVuZGVycnVuIVxuIiwgX19GVU5DVElPTl9fICk7CisJCQorCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2VsZi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKworCQkvKiBDbGVhciBiaXQsIGJ5IHdyaXRpbmcgMSB0byBpdCAqLworCQlvdXRiKEFVRFJfVU5EUiwgaW9iYXNlK0FVRFIpOworCX0gZWxzZQorCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisKKwkKKwlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CisJCXc4Mzk3N2FmX2NoYW5nZV9zcGVlZChzZWxmLCBzZWxmLT5uZXdfc3BlZWQpOworCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCX0KKworCS8qIFVubG9jayB0eF9idWZmIGFuZCByZXF1ZXN0IGFub3RoZXIgZnJhbWUgKi8KKwkvKiBUZWxsIHRoZSBuZXR3b3JrIGxheWVyLCB0aGF0IHdlIHdhbnQgbW9yZSBmcmFtZXMgKi8KKwluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJCisJLyogUmVzdG9yZSBzZXQgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9kbWFfcmVjZWl2ZSAoc2VsZikKKyAqCisgKiAgICBHZXQgcmVhZHkgZm9yIHJlY2VpdmluZyBhIGZyYW1lLiBUaGUgZGV2aWNlIHdpbGwgaW5pdGlhdGUgYSBETUEKKyAqICAgIGlmIGl0IHN0YXJ0cyB0byByZWNlaXZlIGEgZnJhbWUuCisgKgorICovCitpbnQgdzgzOTc3YWZfZG1hX3JlY2VpdmUoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmKSAKK3sKKwlpbnQgaW9iYXNlOworCV9fdTggc2V0OworI2lmZGVmIENPTkZJR19ORVRXSU5ERVJfUlhfRE1BX1BST0JMRU1TCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX3U4IGhjcjsKKyNlbmRpZgorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlpb2Jhc2U9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogU2F2ZSBjdXJyZW50IHNldCAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKworCS8qIERpc2FibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlvdXRiKGluYihpb2Jhc2UrSENSKSAmIH5IQ1JfRU5fRE1BLCBpb2Jhc2UrSENSKTsKKworCS8qIENob29zZSBETUEgUngsIERNQSBGYWlybmVzcywgYW5kIEFkdmFuY2VkIG1vZGUgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDIpOworCW91dGIoKGluYihpb2Jhc2UrQURDUjEpICYgfkFEQ1IxX0RfQ0hTVykvKnxBRENSMV9ETUFfRiovfEFEQ1IxX0FEVl9TTCwKKwkgICAgIGlvYmFzZStBRENSMSk7CisKKwlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19SRUNWOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKworI2lmZGVmIENPTkZJR19ORVRXSU5ERVJfUlhfRE1BX1BST0JMRU1TCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWRpc2FibGVfZG1hKHNlbGYtPmlvLmRtYSk7CisJY2xlYXJfZG1hX2ZmKHNlbGYtPmlvLmRtYSk7CisJc2V0X2RtYV9tb2RlKHNlbGYtPmlvLmRtYSwgRE1BX01PREVfUkVBRCk7CisJc2V0X2RtYV9hZGRyKHNlbGYtPmlvLmRtYSwgc2VsZi0+cnhfYnVmZl9kbWEpOworCXNldF9kbWFfY291bnQoc2VsZi0+aW8uZG1hLCBzZWxmLT5yeF9idWZmLnRydWVzaXplKTsKKyNlbHNlCisJaXJkYV9zZXR1cF9kbWEoc2VsZi0+aW8uZG1hLCBzZWxmLT5yeF9idWZmX2RtYSwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJICAgICAgIERNQV9NT0RFX1JFQUQpOworI2VuZGlmCisJLyogCisJICogUmVzZXQgUnggRklGTy4gVGhpcyB3aWxsIGFsc28gZmx1c2ggdGhlIFNUX0ZJRk8sIGl0J3MgdmVyeSAKKwkgKiBpbXBvcnRhbnQgdGhhdCB3ZSBkb24ndCByZXNldCB0aGUgVHggRklGTyBzaW5jZSBpdCBtaWdodCBub3QKKwkgKiBiZSBmaW5pc2hlZCB0cmFuc21pdHRpbmcgeWV0CisJICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlvdXRiKFVGUl9SWFRMfFVGUl9UWFRMfFVGUl9SWEZfUlNUfFVGUl9FTl9GSUZPLCBpb2Jhc2UrVUZSKTsKKwlzZWxmLT5zdF9maWZvLmxlbiA9IHNlbGYtPnN0X2ZpZm8udGFpbCA9IHNlbGYtPnN0X2ZpZm8uaGVhZCA9IDA7CisJCisJLyogRW5hYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisjaWZkZWYgQ09ORklHX05FVFdJTkRFUl9SWF9ETUFfUFJPQkxFTVMKKwloY3IgPSBpbmIoaW9iYXNlK0hDUik7CisJb3V0YihoY3IgfCBIQ1JfRU5fRE1BLCBpb2Jhc2UrSENSKTsKKwllbmFibGVfZG1hKHNlbGYtPmlvLmRtYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworI2Vsc2UJCisJb3V0YihpbmIoaW9iYXNlK0hDUikgfCBIQ1JfRU5fRE1BLCBpb2Jhc2UrSENSKTsKKyNlbmRpZgorCS8qIFJlc3RvcmUgc2V0ICovCisJb3V0YihzZXQsIGlvYmFzZStTU1IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9yZWNlaXZlX2NvbXBsZXRlIChzZWxmKQorICoKKyAqICAgIEZpbmlzaGVkIHdpdGggcmVjZWl2aW5nIGEgZnJhbWUKKyAqCisgKi8KK2ludCB3ODM5NzdhZl9kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc3RfZmlmbyAqc3RfZmlmbzsKKwlpbnQgbGVuOworCWludCBpb2Jhc2U7CisJX191OCBzZXQ7CisJX191OCBzdGF0dXM7CisKKwlJUkRBX0RFQlVHKDQsICIlc1xuIiwgX19GVU5DVElPTl9fICk7CisKKwlzdF9maWZvID0gJnNlbGYtPnN0X2ZpZm87CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCS8qIFNhdmUgY3VycmVudCBzZXQgKi8KKwlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBSZWFkIHN0YXR1cyBGSUZPICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQ1KTsKKwl3aGlsZSAoKHN0YXR1cyA9IGluYihpb2Jhc2UrRlNfRk8pKSAmIEZTX0ZPX0ZTRkRSKSB7CisJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+dGFpbF0uc3RhdHVzID0gc3RhdHVzOworCQkKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5sZW4gID0gaW5iKGlvYmFzZStSRkxGTCk7CisJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+dGFpbF0ubGVuIHw9IGluYihpb2Jhc2UrUkZMRkgpIDw8IDg7CisJCQorCQlzdF9maWZvLT50YWlsKys7CisJCXN0X2ZpZm8tPmxlbisrOworCX0KKwkKKwl3aGlsZSAoc3RfZmlmby0+bGVuKSB7CisJCS8qIEdldCBmaXJzdCBlbnRyeSAqLworCQlzdGF0dXMgPSBzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLnN0YXR1czsKKwkJbGVuICAgID0gc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5sZW47CisJCXN0X2ZpZm8tPmhlYWQrKzsKKwkJc3RfZmlmby0+bGVuLS07CisKKwkJLyogQ2hlY2sgZm9yIGVycm9ycyAqLworCQlpZiAoc3RhdHVzICYgRlNfRk9fRVJSX01TSykgeworCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX0xTVF9GUikgeworCQkJCS8qIEFkZCBudW1iZXIgb2YgbG9zdCBmcmFtZXMgdG8gc3RhdHMgKi8KKwkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMgKz0gbGVuOwkKKwkJCX0gZWxzZSB7CisJCQkJLyogU2tpcCBmcmFtZSAqLworCQkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQorCQkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJCQkJCisJCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX01YX0xFWCkKKwkJCQkJc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQorCQkJCWlmIChzdGF0dXMgJiBGU19GT19QSFlfRVJSKSAKKwkJCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJCisJCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX0NSQ19FUlIpIAorCQkJCQlzZWxmLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQl9CisJCQkvKiBUaGUgZXJyb3JzIGJlbG93IGNhbiBiZSByZXBvcnRlZCBpbiBib3RoIGNhc2VzICovCisJCQlpZiAoc3RhdHVzICYgRlNfRk9fUlhfT1YpCisJCQkJc2VsZi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQorCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX0ZTRl9PVikKKwkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCisJCX0gZWxzZSB7CisJCQkvKiBDaGVjayBpZiB3ZSBoYXZlIHRyYW5zZmVycmVkIGFsbCBkYXRhIHRvIG1lbW9yeSAqLworCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwkJCWlmIChpbmIoaW9iYXNlK1VTUikgJiBVU1JfUkRSKSB7CisjaWZkZWYgQ09ORklHX1VTRV9JTlRFUk5BTF9USU1FUgorCQkJCS8qIFB1dCB0aGlzIGVudHJ5IGJhY2sgaW4gZmlmbyAqLworCQkJCXN0X2ZpZm8tPmhlYWQtLTsKKwkJCQlzdF9maWZvLT5sZW4rKzsKKwkJCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLnN0YXR1cyA9IHN0YXR1czsKKwkJCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLmxlbiA9IGxlbjsKKwkJCQkKKwkJCQkvKiBSZXN0b3JlIHNldCByZWdpc3RlciAqLworCQkJCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKwkJCQorCQkJCXJldHVybiBGQUxTRTsgCS8qIEknbGwgYmUgYmFjayEgKi8KKyNlbHNlCisJCQkJdWRlbGF5KDgwKTsgLyogU2hvdWxkIGJlIGVub3VnaCE/ICovCisjZW5kaWYKKwkJCX0KKwkJCQkJCQorCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4rMSk7CisJCQlpZiAoc2tiID09IE5VTEwpICB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAiJXMoKSwgbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIGZyYW1lLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkvKiBSZXN0b3JlIHNldCByZWdpc3RlciAqLworCQkJCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCQorCQkJLyogIEFsaWduIHRvIDIwIGJ5dGVzICovCisJCQlza2JfcmVzZXJ2ZShza2IsIDEpOyAKKwkJCQorCQkJLyogQ29weSBmcmFtZSB3aXRob3V0IENSQyAqLworCQkJaWYgKHNlbGYtPmlvLnNwZWVkIDwgNDAwMDAwMCkgeworCQkJCXNrYl9wdXQoc2tiLCBsZW4tMik7CisJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4tMik7CisJCQl9IGVsc2UgeworCQkJCXNrYl9wdXQoc2tiLCBsZW4tNCk7CisJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4tNCk7CisJCQl9CisKKwkJCS8qIE1vdmUgdG8gbmV4dCBmcmFtZSAqLworCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQorCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CisJCQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCXNlbGYtPm5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCX0KKwl9CisJLyogUmVzdG9yZSBzZXQgcmVnaXN0ZXIgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHBjODcxMDhfcGlvX3JlY2VpdmUgKHNlbGYpCisgKgorICogICAgUmVjZWl2ZSBhbGwgZGF0YSBpbiByZWNlaXZlciBGSUZPCisgKgorICovCitzdGF0aWMgdm9pZCB3ODM5NzdhZl9waW9fcmVjZWl2ZShzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYpIAoreworCV9fdTggYnl0ZSA9IDB4MDA7CisJaW50IGlvYmFzZTsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwkvKiAgUmVjZWl2ZSBhbGwgY2hhcmFjdGVycyBpbiBSeCBGSUZPICovCisJZG8geworCQlieXRlID0gaW5iKGlvYmFzZStSQlIpOworCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsIAorCQkJCSAgYnl0ZSk7CisJfSB3aGlsZSAoaW5iKGlvYmFzZStVU1IpICYgVVNSX1JEUik7IC8qIERhdGEgYXZhaWxhYmxlICovCQorfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfc2lyX2ludGVycnVwdCAoc2VsZiwgZWlyKQorICoKKyAqICAgIEhhbmRsZSBTSVIgaW50ZXJydXB0CisgKgorICovCitzdGF0aWMgX191OCB3ODM5NzdhZl9zaXJfaW50ZXJydXB0KHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZiwgaW50IGlzcikKK3sKKwlpbnQgYWN0dWFsOworCV9fdTggbmV3X2ljciA9IDA7CisJX191OCBzZXQ7CisJaW50IGlvYmFzZTsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGlzcj0lI3hcbiIsIF9fRlVOQ1RJT05fXyAsIGlzcik7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJLyogVHJhbnNtaXQgRklGTyBsb3cgb24gZGF0YSAqLworCWlmIChpc3IgJiBJU1JfVFhUSF9JKSB7CisJCS8qIFdyaXRlIGRhdGEgbGVmdCBpbiB0cmFuc21pdCBidWZmZXIgKi8KKwkJYWN0dWFsID0gdzgzOTc3YWZfcGlvX3dyaXRlKHNlbGYtPmlvLmZpcl9iYXNlLCAKKwkJCQkJICAgIHNlbGYtPnR4X2J1ZmYuZGF0YSwgCisJCQkJCSAgICBzZWxmLT50eF9idWZmLmxlbiwgCisJCQkJCSAgICBzZWxmLT5pby5maWZvX3NpemUpOworCisJCXNlbGYtPnR4X2J1ZmYuZGF0YSArPSBhY3R1YWw7CisJCXNlbGYtPnR4X2J1ZmYubGVuICAtPSBhY3R1YWw7CisJCQorCQlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19YTUlUOworCisJCS8qIENoZWNrIGlmIGZpbmlzaGVkICovCisJCWlmIChzZWxmLT50eF9idWZmLmxlbiA+IDApIHsKKwkJCW5ld19pY3IgfD0gSUNSX0VUWFRISTsKKwkJfSBlbHNlIHsKKwkJCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKwkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisJCQlvdXRiKEFVRFJfU0ZFTkQsIGlvYmFzZStBVURSKTsKKwkJCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsgCisKKwkJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCQkJLyogRmVlZCBtZSBtb3JlIHBhY2tldHMgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkJCW5ld19pY3IgfD0gSUNSX0VUQlJFSTsKKwkJfQorCX0KKwkvKiBDaGVjayBpZiB0cmFuc21pc3Npb24gaGFzIGNvbXBsZXRlZCAqLworCWlmIChpc3IgJiBJU1JfVFhFTVBfSSkgewkJCisJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZD8gKi8KKwkJaWYgKHNlbGYtPm5ld19zcGVlZCkgeworCQkJSVJEQV9ERUJVRygyLAorCQkJCSAgICIlcygpLCBDaGFuZ2luZyBzcGVlZCFcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJdzgzOTc3YWZfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPm5ld19zcGVlZCk7CisJCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCQl9CisKKwkJLyogVHVybiBhcm91bmQgYW5kIGdldCByZWFkeSB0byByZWNlaXZlIHNvbWUgZGF0YSAqLworCQlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19SRUNWOworCQluZXdfaWNyIHw9IElDUl9FUkJSSTsKKwl9CisKKwkvKiBSeCBGSUZPIHRocmVzaG9sZCBvciB0aW1lb3V0ICovCisJaWYgKGlzciAmIElTUl9SWFRIX0kpIHsKKwkJdzgzOTc3YWZfcGlvX3JlY2VpdmUoc2VsZik7CisKKwkJLyogS2VlcCByZWNlaXZpbmcgKi8KKwkJbmV3X2ljciB8PSBJQ1JfRVJCUkk7CisJfQorCXJldHVybiBuZXdfaWNyOworfQorCisvKgorICogRnVuY3Rpb24gcGM4NzEwOF9maXJfaW50ZXJydXB0IChzZWxmLCBlaXIpCisgKgorICogICAgSGFuZGxlIE1JUi9GSVIgaW50ZXJydXB0CisgKgorICovCitzdGF0aWMgX191OCB3ODM5NzdhZl9maXJfaW50ZXJydXB0KHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZiwgaW50IGlzcikKK3sKKwlfX3U4IG5ld19pY3IgPSAwOworCV9fdTggc2V0OworCWludCBpb2Jhc2U7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisJCisJLyogRW5kIG9mIGZyYW1lIGRldGVjdGVkIGluIEZJRk8gKi8KKwlpZiAoaXNyICYgKElTUl9GRU5EX0l8SVNSX0ZTRl9JKSkgeworCQlpZiAodzgzOTc3YWZfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZikpIHsKKwkJCQorCQkJLyogV2FpdCBmb3IgbmV4dCBzdGF0dXMgRklGTyBpbnRlcnJ1cHQgKi8KKwkJCW5ld19pY3IgfD0gSUNSX0VGU0ZJOworCQl9IGVsc2UgeworCQkJLyogRE1BIG5vdCBmaW5pc2hlZCB5ZXQgKi8KKworCQkJLyogU2V0IHRpbWVyIHZhbHVlLCByZXNvbHV0aW9uIDEgbXMgKi8KKwkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUNCk7CisJCQlvdXRiKDB4MDEsIGlvYmFzZStUTVJMKTsgLyogMSBtcyAqLworCQkJb3V0YigweDAwLCBpb2Jhc2UrVE1SSCk7CisKKwkJCS8qIFN0YXJ0IHRpbWVyICovCisJCQlvdXRiKElSX01TTF9FTl9UTVIsIGlvYmFzZStJUl9NU0wpOworCisJCQluZXdfaWNyIHw9IElDUl9FVE1SSTsKKwkJfQorCX0KKwkvKiBUaW1lciBmaW5pc2hlZCAqLworCWlmIChpc3IgJiBJU1JfVE1SX0kpIHsKKwkJLyogRGlzYWJsZSB0aW1lciAqLworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDQpOworCQlvdXRiKDAsIGlvYmFzZStJUl9NU0wpOworCisJCS8qIENsZWFyIHRpbWVyIGV2ZW50ICovCisJCS8qIHN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7ICovCisvKiAJCW91dGIoQVNDUl9DVEUsIGlvYmFzZStBU0NSKTsgKi8KKworCQkvKiBDaGVjayBpZiB0aGlzIGlzIGEgVFggdGltZXIgaW50ZXJydXB0ICovCisJCWlmIChzZWxmLT5pby5kaXJlY3Rpb24gPT0gSU9fWE1JVCkgeworCQkJdzgzOTc3YWZfZG1hX3dyaXRlKHNlbGYsIGlvYmFzZSk7CisKKwkJCW5ld19pY3IgfD0gSUNSX0VETUFJOworCQl9IGVsc2UgeworCQkJLyogQ2hlY2sgaWYgRE1BIGhhcyBub3cgZmluaXNoZWQgKi8KKwkJCXc4Mzk3N2FmX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHNlbGYpOworCisJCQluZXdfaWNyIHw9IElDUl9FRlNGSTsKKwkJfQorCX0JCisJLyogRmluaXNoZWQgd2l0aCBETUEgKi8KKwlpZiAoaXNyICYgSVNSX0RNQV9JKSB7CisJCXc4Mzk3N2FmX2RtYV94bWl0X2NvbXBsZXRlKHNlbGYpOworCisJCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBtb3JlIGZyYW1lcyB0byBiZSB0cmFuc21pdHRlZCAqLworCQkvKiBpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShzZWxmKSkgeyAqLworCQkKKwkJLyogUHJlcGFyZSBmb3IgcmVjZWl2ZSAKKwkJICogCisJCSAqICoqIE5ldHdpbmRlciBUeCBETUEgbGlrZXMgdGhhdCB3ZSBkbyB0aGlzIGFueXdheSAqKgorCQkgKi8KKwkJdzgzOTc3YWZfZG1hX3JlY2VpdmUoc2VsZik7CisJCW5ld19pY3IgPSBJQ1JfRUZTRkk7CisJICAgICAgIC8qIH0gKi8KKwl9CisJCisJLyogUmVzdG9yZSBzZXQgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisKKwlyZXR1cm4gbmV3X2ljcjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgQW4gaW50ZXJydXB0IGZyb20gdGhlIGNoaXAgaGFzIGFycml2ZWQuIFRpbWUgdG8gZG8gc29tZSB3b3JrCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdzgzOTc3YWZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmOworCV9fdTggc2V0LCBpY3IsIGlzcjsKKwlpbnQgaW9iYXNlOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCAKKwkJCWRyaXZlcl9uYW1lLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCXNlbGYgPSAoc3RydWN0IHc4Mzk3N2FmX2lyICopIGRldi0+cHJpdjsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwkKKwlpY3IgPSBpbmIoaW9iYXNlK0lDUik7IAorCWlzciA9IGluYihpb2Jhc2UrSVNSKSAmIGljcjsgLyogTWFzayBvdXQgdGhlIGludGVyZXN0aW5nIG9uZXMgKi8gCisKKwlvdXRiKDAsIGlvYmFzZStJQ1IpOyAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwkKKwlpZiAoaXNyKSB7CisJCS8qIERpc3BhdGNoIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBzcGVlZCAqLworCQlpZiAoc2VsZi0+aW8uc3BlZWQgPiBQSU9fTUFYX1NQRUVEICkKKwkJCWljciA9IHc4Mzk3N2FmX2Zpcl9pbnRlcnJ1cHQoc2VsZiwgaXNyKTsKKwkJZWxzZQorCQkJaWNyID0gdzgzOTc3YWZfc2lyX2ludGVycnVwdChzZWxmLCBpc3IpOworCX0KKworCW91dGIoaWNyLCBpb2Jhc2UrSUNSKTsgICAgLyogUmVzdG9yZSAobmV3KSBpbnRlcnJ1cHRzICovCisJb3V0YihzZXQsIGlvYmFzZStTU1IpOyAgICAvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlyZXR1cm4gSVJRX1JFVFZBTChpc3IpOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfaXNfcmVjZWl2aW5nIChzZWxmKQorICoKKyAqICAgIFJldHVybiBUUlVFIGlzIHdlIGFyZSBjdXJyZW50bHkgcmVjZWl2aW5nIGEgZnJhbWUKKyAqCisgKi8KK3N0YXRpYyBpbnQgdzgzOTc3YWZfaXNfcmVjZWl2aW5nKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZikKK3sKKwlpbnQgc3RhdHVzID0gRkFMU0U7CisJaW50IGlvYmFzZTsKKwlfX3U4IHNldDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIEZBTFNFOyk7CisKKwlpZiAoc2VsZi0+aW8uc3BlZWQgPiAxMTUyMDApIHsKKwkJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkJLyogQ2hlY2sgaWYgcnggRklGTyBpcyBub3QgZW1wdHkgKi8KKwkJc2V0ID0gaW5iKGlvYmFzZStTU1IpOworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDIpOworCQlpZiAoKGluYihpb2Jhc2UrUlhGRFRIKSAmIDB4M2YpICE9IDApIHsKKwkJCS8qIFdlIGFyZSByZWNlaXZpbmcgc29tZXRoaW5nICovCisJCQlzdGF0dXMgPSAgVFJVRTsKKwkJfQorCQlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisJfSBlbHNlIAorCQlzdGF0dXMgPSAoc2VsZi0+cnhfYnVmZi5zdGF0ZSAhPSBPVVRTSURFX0ZSQU1FKTsKKwkKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfbmV0X29wZW4gKGRldikKKyAqCisgKiAgICBTdGFydCB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IHc4Mzk3N2FmX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmOworCWludCBpb2Jhc2U7CisJY2hhciBod25hbWVbMzJdOworCV9fdTggc2V0OworCQorCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCQorCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlzZWxmID0gKHN0cnVjdCB3ODM5NzdhZl9pciAqKSBkZXYtPnByaXY7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJaWYgKHJlcXVlc3RfaXJxKHNlbGYtPmlvLmlycSwgdzgzOTc3YWZfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIAorCQkJKHZvaWQgKikgZGV2KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJLyoKKwkgKiBBbHdheXMgYWxsb2NhdGUgdGhlIERNQSBjaGFubmVsIGFmdGVyIHRoZSBJUlEsCisJICogYW5kIGNsZWFuIHVwIG9uIGZhaWx1cmUuCisJICovCisJaWYgKHJlcXVlc3RfZG1hKHNlbGYtPmlvLmRtYSwgZGV2LT5uYW1lKSkgeworCQlmcmVlX2lycShzZWxmLT5pby5pcnEsIHNlbGYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJCQorCS8qIFNhdmUgY3VycmVudCBzZXQgKi8KKwlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisKKyAJLyogRW5hYmxlIHNvbWUgaW50ZXJydXB0cyBzbyB3ZSBjYW4gcmVjZWl2ZSBmcmFtZXMgYWdhaW4gKi8KKyAJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKyAJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKSB7CisgCQlvdXRiKElDUl9FRlNGSSwgaW9iYXNlK0lDUik7CisgCQl3ODM5NzdhZl9kbWFfcmVjZWl2ZShzZWxmKTsKKyAJfSBlbHNlCisgCQlvdXRiKElDUl9FUkJSSSwgaW9iYXNlK0lDUik7CisKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisKKwkvKiBSZWFkeSB0byBwbGF5ISAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCisJLyogR2l2ZSBzZWxmIGEgaGFyZHdhcmUgbmFtZSAqLworCXNwcmludGYoaHduYW1lLCAidzgzOTc3YWYgQCAweCUwM3giLCBzZWxmLT5pby5maXJfYmFzZSk7CisKKwkvKiAKKwkgKiBPcGVuIG5ldyBJckxBUCBsYXllciBpbnN0YW5jZSwgbm93IHRoYXQgZXZlcnl0aGluZyBzaG91bGQgYmUKKwkgKiBpbml0aWFsaXplZCBwcm9wZXJseSAKKwkgKi8KKwlzZWxmLT5pcmxhcCA9IGlybGFwX29wZW4oZGV2LCAmc2VsZi0+cW9zLCBod25hbWUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9uZXRfY2xvc2UgKGRldikKKyAqCisgKiAgICBTdG9wIHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgdzgzOTc3YWZfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmOworCWludCBpb2Jhc2U7CisJX191OCBzZXQ7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwkKKwlzZWxmID0gKHN0cnVjdCB3ODM5NzdhZl9pciAqKSBkZXYtPnByaXY7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogU3RvcCBkZXZpY2UgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogU3RvcCBhbmQgcmVtb3ZlIGluc3RhbmNlIG9mIElyTEFQICovCisJaWYgKHNlbGYtPmlybGFwKQorCQlpcmxhcF9jbG9zZShzZWxmLT5pcmxhcCk7CisJc2VsZi0+aXJsYXAgPSBOVUxMOworCisJZGlzYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKKworCS8qIFNhdmUgY3VycmVudCBzZXQgKi8KKwlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisJCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlvdXRiKDAsIGlvYmFzZStJQ1IpOyAKKworCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgZGV2KTsKKwlmcmVlX2RtYShzZWxmLT5pby5kbWEpOworCisJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJb3V0YihzZXQsIGlvYmFzZStTU1IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9uZXRfaW9jdGwgKGRldiwgcnEsIGNtZCkKKyAqCisgKiAgICBQcm9jZXNzIElPQ1RMIGNvbW1hbmRzIGZvciB0aGlzIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB3ODM5NzdhZl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaWZfaXJkYV9yZXEgKmlycSA9IChzdHJ1Y3QgaWZfaXJkYV9yZXEgKikgcnE7CisJc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlzZWxmID0gZGV2LT5wcml2OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksICVzLCAoY21kPTB4JVgpXG4iLCBfX0ZVTkNUSU9OX18gLCBkZXYtPm5hbWUsIGNtZCk7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0JBTkRXSURUSDogLyogU2V0IGJhbmR3aWR0aCAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXc4Mzk3N2FmX2NoYW5nZV9zcGVlZChzZWxmLCBpcnEtPmlmcl9iYXVkcmF0ZSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNRURJQUJVU1k6IC8qIFNldCBtZWRpYSBidXN5ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJZ290byBvdXQ7CisJCX0KKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koc2VsZi0+bmV0ZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DR1JFQ0VJVklORzogLyogQ2hlY2sgaWYgd2UgYXJlIHJlY2VpdmluZyByaWdodCBub3cgKi8KKwkJaXJxLT5pZnJfcmVjZWl2aW5nID0gdzgzOTc3YWZfaXNfcmVjZWl2aW5nKHNlbGYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdzgzOTc3YWZfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZiA9IChzdHJ1Y3QgdzgzOTc3YWZfaXIgKikgZGV2LT5wcml2OworCQorCXJldHVybiAmc2VsZi0+c3RhdHM7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCBXODM5NzdBRiBJckRBIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCittb2R1bGVfcGFyYW0ocW9zX210dF9iaXRzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhxb3NfbXR0X2JpdHMsICJNaW1pbXVtIFR1cm4gVGltZSIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkJhc2UgSS9PIGFkZHJlc3NlcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIGxpbmVzIik7CisKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICAKKyAqCisgKi8KK21vZHVsZV9pbml0KHc4Mzk3N2FmX2luaXQpOworCisvKgorICogRnVuY3Rpb24gY2xlYW51cF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgCisgKgorICovCittb2R1bGVfZXhpdCh3ODM5NzdhZl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc2NjFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5oCkBAIC0wLDAgKzEsMTk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIHc4Mzk3N2FmX2lyLmgKKyAqIFZlcnNpb246ICAgICAgIAorICogRGVzY3JpcHRpb246ICAgCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBQYXVsIFZhbmRlclNwZWsKKyAqIENyZWF0ZWQgYXQ6ICAgIFRodSBOb3YgMTkgMTM6NTU6MzQgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgVHVlIEphbiAxMSAxMzowODoxOSAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFc4Mzk3N0FGX0lSX0gKKyNkZWZpbmUgVzgzOTc3QUZfSVJfSAorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogRmxhZ3MgZm9yIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgQ1JGMCAqLworI2RlZmluZSBFTkJOS1NFTAkweDAxCisjZGVmaW5lIEFQRURDUkMJCTB4MDIKKyNkZWZpbmUgVFhXNEMgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgUlhXNEMgICAgICAgICAgIDB4MDgKKworLyogQmFuayAwICovCisjZGVmaW5lIFJCUiAgICAgICAgICAgICAweDAwIC8qIFJlY2VpdmVyIGJ1ZmZlciByZWdpc3RlciAqLworI2RlZmluZSBUQlIgICAgICAgICAgICAgMHgwMCAvKiBUcmFuc21pdHRlciBidWZmZXIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBJQ1IJCTB4MDEgLyogSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUNSX0VSQlJJICAgICAgIDB4MDEgLyogUmVjZWl2ZXIgYnVmZmVyIHJlZ2lzdGVyIGludGVycnVwdCAqLworI2RlZmluZSBJQ1JfRVRCUkVJICAgICAgMHgwMiAvKiBUcmFuc2VpdmVyIGVtcHR5IGludGVycnVwdCAqLworI2RlZmluZSBJQ1JfRVVTUkkJMHgwNC8vKiBJUiBzdGF0dXMgaW50ZXJydXB0ICovCisjZGVmaW5lIElDUl9FSFNSSSAgICAgICAweDA0CisjZGVmaW5lIElDUl9FVFhVUkkgICAgICAweDA0IC8qIFR4IHVuZGVycnVuICovCisjZGVmaW5lIElDUl9FRE1BSQkweDEwIC8qIERNQSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUNSX0VUWFRISSAgICAgIDB4MjAgLyogVHJhbnNtaXR0ZXIgdGhyZXNob2xkIGludGVycnVwdCAqLworI2RlZmluZSBJQ1JfRUZTRkkgICAgICAgMHg0MCAvKiBGcmFtZSBzdGF0dXMgRklGTyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUNSX0VUTVJJICAgICAgIDB4ODAgLyogVGltZXIgaW50ZXJydXB0ICovCisKKyNkZWZpbmUgVUZSCQkweDAyIC8qIEZJRk8gY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBVRlJfRU5fRklGTyAgICAgMHgwMSAvKiBFbmFibGUgRklGTydzICovCisjZGVmaW5lIFVGUl9SWEZfUlNUICAgICAweDAyIC8qIFJlc2V0IFJ4IEZJRk8gKi8KKyNkZWZpbmUgVUZSX1RYRl9SU1QgICAgIDB4MDQgLyogUmVzZXQgVHggRklGTyAqLworI2RlZmluZSBVRlJfUlhUTAkweDgwIC8qIFJ4IEZJRk8gdGhyZXNob2xkIChzZXQgdG8gMTYpICovCisjZGVmaW5lIFVGUl9UWFRMCTB4MjAgLyogVHggRklGTyB0aHJlc2hvbGQgKHNldCB0byAxNykgKi8KKworI2RlZmluZSBJU1IJCTB4MDIgLyogSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBJU1JfUlhUSF9JCTB4MDEgLyogUmVjZWl2ZSB0aHJlc2hvbGQgaW50ZXJydXB0ICovCisjZGVmaW5lIElTUl9UWEVNUF9JICAgICAweDAyIC8qIFRyYW5zbWl0dGVyIGVtcHR5IGludGVycnVwdCAqLworI2RlZmluZSBJU1JfRkVORF9JCTB4MDQKKyNkZWZpbmUgSVNSX0RNQV9JCTB4MTAKKyNkZWZpbmUgSVNSX1RYVEhfSQkweDIwIC8qIFRyYW5zbWl0dGVyIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVNSX0ZTRl9JICAgICAgIDB4NDAKKyNkZWZpbmUgSVNSX1RNUl9JICAgICAgIDB4ODAgLyogVGltZXIgaW50ZXJydXB0ICovCisKKyNkZWZpbmUgVUNSICAgICAgICAgICAgIDB4MDMgLyogVWFydCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFVDUl9ETFM4ICAgICAgICAweDAzIC8qIDhOMSAqLworCisjZGVmaW5lIFNTUiAJICAgICAgICAweDAzIC8qIFNldHMgc2VsZWN0IHJlZ2lzdGVyICovCisjZGVmaW5lIFNFVDAgCSAgICAgICAgVUNSX0RMUzggICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBrZWVwIDhOMSAqLworI2RlZmluZSBTRVQxCSAgICAgICAgKDB4ODB8VUNSX0RMUzgpIC8qIE1ha2Ugc3VyZSB3ZSBrZWVwIDhOMSAqLworI2RlZmluZSBTRVQyCSAgICAgICAgMHhFMAorI2RlZmluZSBTRVQzCSAgICAgICAgMHhFNAorI2RlZmluZSBTRVQ0CSAgICAgICAgMHhFOAorI2RlZmluZSBTRVQ1CSAgICAgICAgMHhFQworI2RlZmluZSBTRVQ2CSAgICAgICAgMHhGMAorI2RlZmluZSBTRVQ3CSAgICAgICAgMHhGNAorCisjZGVmaW5lIEhDUgkJMHgwNAorI2RlZmluZSBIQ1JfTU9ERV9NQVNLCX4oMHhEMCkKKyNkZWZpbmUgSENSX1NJUiAgICAgICAgIDB4NjAKKyNkZWZpbmUgSENSX01JUl81NzYgIAkweDIwCQorI2RlZmluZSBIQ1JfTUlSXzExNTIJMHg4MAorI2RlZmluZSBIQ1JfRklSCQkweEEwCisjZGVmaW5lIEhDUl9FTl9ETUEJMHgwNAorI2RlZmluZSBIQ1JfRU5fSVJRCTB4MDgKKyNkZWZpbmUgSENSX1RYX1dUCTB4MDgKKworI2RlZmluZSBVU1IgICAgICAgICAgICAgMHgwNSAvKiBJUiBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVVNSX1JEUiAgICAgICAgIDB4MDEgLyogUmVjZWl2ZSBkYXRhIHJlYWR5ICovCisjZGVmaW5lIFVTUl9UU1JFICAgICAgICAweDQwIC8qIFRyYW5zbWl0dGVyIGVtcHR5PyAqLworCisjZGVmaW5lIEFVRFIgICAgICAgICAgICAweDA3CisjZGVmaW5lIEFVRFJfU0ZFTkQgICAgICAweDA4IC8qIFNldCBhIGZyYW1lIGVuZCAqLworI2RlZmluZSBBVURSX1JYQlNZICAgICAgMHgyMCAvKiBSeCBidXN5ICovCisjZGVmaW5lIEFVRFJfVU5EUiAgICAgICAweDQwIC8qIFRyYW5zZWl2ZXIgdW5kZXJydW4gKi8KKworLyogU2V0IDIgKi8KKyNkZWZpbmUgQUJMTCAgICAgICAgICAgIDB4MDAgLyogQWR2YW5jZWQgYmF1ZCByYXRlIGRpdmlzb3IgbGF0Y2ggKGxvdyBieXRlKSAqLworI2RlZmluZSBBQkhMICAgICAgICAgICAgMHgwMSAvKiBBZHZhbmNlZCBiYXVkIHJhdGUgZGl2aXNvciBsYXRjaCAoaGlnaCBieXRlKSAqLworCisjZGVmaW5lIEFEQ1IxCQkweDAyCisjZGVmaW5lIEFEQ1IxX0FEVl9TTAkweDAxCQorI2RlZmluZSBBRENSMV9EX0NIU1cJMHgwOAkvKiB0aGUgc3BlY3MgYXJlIHdyb25nLiBpdHMgYml0IDMsIG5vdCA0ICovCisjZGVmaW5lIEFEQ1IxX0RNQV9GCTB4MDIKKworI2RlZmluZSBBRENSMgkJMHgwNAorI2RlZmluZSBBRENSMl9UWEZTMzIJMHgwMQorI2RlZmluZSBBRENSMl9SWEZTMzIJMHgwNAorCisjZGVmaW5lIFJYRkRUSCAgICAgICAgICAweDA3CisKKy8qIFNldCAzICovCisjZGVmaW5lIEFVSUQJCTB4MDAKKworLyogU2V0IDQgKi8KKyNkZWZpbmUgVE1STCAgICAgICAgICAgIDB4MDAgLyogVGltZXIgdmFsdWUgcmVnaXN0ZXIgKGxvdyBieXRlKSAqLworI2RlZmluZSBUTVJIICAgICAgICAgICAgMHgwMSAvKiBUaW1lciB2YWx1ZSByZWdpc3RlciAoaGlnaCBieXRlKSAqLworCisjZGVmaW5lIElSX01TTCAgICAgICAgICAweDAyIC8qIEluZnJhcmVkIG1vZGUgc2VsZWN0ICovCisjZGVmaW5lIElSX01TTF9FTl9UTVIgICAweDAxIC8qIEVuYWJsZSB0aW1lciAqLworCisjZGVmaW5lIFRGUkxMCQkweDA0IC8qIFRyYW5zbWl0dGVyIGZyYW1lIGxlbmd0aCAobG93IGJ5dGUpICovCisjZGVmaW5lIFRGUkxICQkweDA1IC8qIFRyYW5zbWl0dGVyIGZyYW1lIGxlbmd0aCAoaGlnaCBieXRlKSAqLworI2RlZmluZSBSRlJMTAkJMHgwNiAvKiBSZWNlaXZlciBmcmFtZSBsZW5ndGggKGxvdyBieXRlKSAqLworI2RlZmluZSBSRlJMSAkJMHgwNyAvKiBSZWNlaXZlciBmcmFtZSBsZW5ndGggKGhpZ2ggYnl0ZSkgKi8KKworLyogU2V0IDUgKi8KKworI2RlZmluZSBGU19GTyAgICAgICAgICAgMHgwNSAvKiBGcmFtZSBzdGF0dXMgRklGTyAqLworI2RlZmluZSBGU19GT19GU0ZEUiAgICAgMHg4MCAvKiBGcmFtZSBzdGF0dXMgRklGTyBkYXRhIHJlYWR5ICovCisjZGVmaW5lIEZTX0ZPX0xTVF9GUiAgICAweDQwIC8qIEZyYW1lIGxvc3QgKi8KKyNkZWZpbmUgRlNfRk9fTVhfTEVYICAgIDB4MTAgLyogTWF4IGZyYW1lIGxlbiBleGNlZWRlZCAqLworI2RlZmluZSBGU19GT19QSFlfRVJSICAgMHgwOCAvKiBQaHlzaWNhbCBsYXllciBlcnJvciAqLworI2RlZmluZSBGU19GT19DUkNfRVJSICAgMHgwNCAKKyNkZWZpbmUgRlNfRk9fUlhfT1YgICAgIDB4MDIgLyogUmVjZWl2ZSBvdmVycnVuICovCisjZGVmaW5lIEZTX0ZPX0ZTRl9PViAgICAweDAxIC8qIEZyYW1lIHN0YXR1cyBGSUZPIG92ZXJydW4gKi8KKyNkZWZpbmUgRlNfRk9fRVJSX01TSyAgIDB4NWYgLyogRXJyb3IgbWFzayAqLworCisjZGVmaW5lIFJGTEZMICAgICAgICAgICAweDA2CisjZGVmaW5lIFJGTEZIICAgICAgICAgICAweDA3CisKKy8qIFNldCA2ICovCisjZGVmaW5lIElSX0NGRzIJCTB4MDAKKyNkZWZpbmUgSVJfQ0ZHMl9ESVNfQ1JDCTB4MDIKKworLyogU2V0IDcgKi8KKyNkZWZpbmUgSVJNX0NSCQkweDA3IC8qIEluZnJhcmVkIG1vZHVsZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIElSTV9DUl9JUlhfTVNMCTB4NDAKKyNkZWZpbmUgSVJNX0NSX0FGX01OVCAgIDB4ODAgLyogQXV0b21hdGljIGZvcm1hdCAqLworCisvKiBGb3Igc3RvcmluZyBlbnRyaWVzIGluIHRoZSBzdGF0dXMgRklGTyAqLworc3RydWN0IHN0X2ZpZm9fZW50cnkgeworCWludCBzdGF0dXM7CisJaW50IGxlbjsKK307CisKK3N0cnVjdCBzdF9maWZvIHsKKwlzdHJ1Y3Qgc3RfZmlmb19lbnRyeSBlbnRyaWVzWzEwXTsKKwlpbnQgaGVhZDsKKwlpbnQgdGFpbDsKKwlpbnQgbGVuOworfTsKKworLyogUHJpdmF0ZSBkYXRhIGZvciBlYWNoIGluc3RhbmNlICovCitzdHJ1Y3QgdzgzOTc3YWZfaXIgeworCXN0cnVjdCBzdF9maWZvIHN0X2ZpZm87CisKKwlpbnQgdHhfYnVmZl9vZmZzZXRzWzEwXTsgLyogT2Zmc2V0cyBiZXR3ZWVuIGZyYW1lcyBpbiB0eF9idWZmICovCisJaW50IHR4X2xlbjsgICAgICAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyBpbiB0eF9idWZmICovCisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJCisJc3RydWN0IGlybGFwX2NiICAgICppcmxhcDsgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCXN0cnVjdCBxb3NfaW5mbyAgICAgcW9zOyAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCisJCisJY2hpcGlvX3QgaW87ICAgICAgICAgICAgICAgLyogSXJEQSBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCisJaW9idWZmX3QgdHhfYnVmZjsgICAgICAgICAgLyogVHJhbnNtaXQgYnVmZmVyICovCisJaW9idWZmX3QgcnhfYnVmZjsgICAgICAgICAgLyogUmVjZWl2ZSBidWZmZXIgKi8KKwlkbWFfYWRkcl90IHR4X2J1ZmZfZG1hOworCWRtYV9hZGRyX3QgcnhfYnVmZl9kbWE7CisKKwkvKiBOb3RlIDogY3VycmVudGx5IGxvY2tpbmcgaXMgKnZlcnkqIGluY29tcGxldGUsIGJ1dCB0aGlzCisJICogd2lsbCBnZXQgeW91IHN0YXJ0ZWQuIENoZWNrIGluIG5zYy1pcmNjLmMgZm9yIGEgcHJvcGVyCisJICogbG9ja2luZyBzdHJhdGVneS4gLSBKZWFuIElJICovCisJc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgLyogRm9yIHNlcmlhbGl6aW5nIG9wZXJhdGlvbnMgKi8KKwkKKwlfX3UzMiBuZXdfc3BlZWQ7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX2JhbmsoIGludCBpb2Jhc2UsIGludCBzZXQpCit7CisJb3V0YihzZXQsIGlvYmFzZStTU1IpOworfQorCisjZW5kaWYK